@happyvertical/smrt-users 0.38.2 → 0.38.4

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 (31) hide show
  1. package/AGENTS.md +22 -0
  2. package/dist/chunks/{TerminalAuthService-BLxjzcQj.js → TerminalAuthService-DXaxydM6.js} +732 -87
  3. package/dist/chunks/TerminalAuthService-DXaxydM6.js.map +1 -0
  4. package/dist/collections/RoleCollection.d.ts +6 -1
  5. package/dist/collections/RoleCollection.d.ts.map +1 -1
  6. package/dist/collections/RolePermissionCollection.d.ts +35 -0
  7. package/dist/collections/RolePermissionCollection.d.ts.map +1 -1
  8. package/dist/collections/index.d.ts +2 -2
  9. package/dist/collections/index.d.ts.map +1 -1
  10. package/dist/index.d.ts +2 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +101 -436
  13. package/dist/index.js.map +1 -1
  14. package/dist/manifest.json +35 -4
  15. package/dist/models/Permission.d.ts +7 -4
  16. package/dist/models/Permission.d.ts.map +1 -1
  17. package/dist/services/MagicLinkService.d.ts.map +1 -1
  18. package/dist/services/OperationPermissionService.d.ts +45 -0
  19. package/dist/services/OperationPermissionService.d.ts.map +1 -0
  20. package/dist/services/PermissionCatalogService.d.ts +12 -0
  21. package/dist/services/PermissionCatalogService.d.ts.map +1 -1
  22. package/dist/services/PermissionResolver.d.ts.map +1 -1
  23. package/dist/services/SessionService.d.ts.map +1 -1
  24. package/dist/services/TenantService.d.ts.map +1 -1
  25. package/dist/services/TerminalAuthService.d.ts.map +1 -1
  26. package/dist/services/index.d.ts +2 -1
  27. package/dist/services/index.d.ts.map +1 -1
  28. package/dist/smrt-knowledge.json +9 -8
  29. package/dist/sveltekit.js +1 -1
  30. package/package.json +11 -11
  31. package/dist/chunks/TerminalAuthService-BLxjzcQj.js.map +0 -1
@@ -1,22 +1,22 @@
1
- import { ObjectRegistry, SmrtCollection, SmrtObject, crossPackageRef, field, foreignKey, smrt } from "@happyvertical/smrt-core";
1
+ import { ObjectRegistry, SmrtCollection, SmrtObject, crossPackageRef, field, findManifestEntryByQualifiedName, foreignKey, smrt } from "@happyvertical/smrt-core";
2
2
  import { AccessRequestStatus, MembershipStatus, OverrideEffect, SessionStatus, TenantPermissionEffect, TenantStatus, UserStatus } from "@happyvertical/smrt-types";
3
3
  import { getPackageConfig } from "@happyvertical/smrt-config";
4
- import { createHash, randomBytes } from "node:crypto";
5
4
  import { AsyncLocalStorage } from "node:async_hooks";
5
+ import { createHash, randomBytes } from "node:crypto";
6
6
  //#region \0rolldown/runtime.js
7
- var __defProp$12 = Object.defineProperty;
7
+ var __defProp$13 = Object.defineProperty;
8
8
  var __exportAll = (all, no_symbols) => {
9
9
  let target = {};
10
- for (var name in all) __defProp$12(target, name, {
10
+ for (var name in all) __defProp$13(target, name, {
11
11
  get: all[name],
12
12
  enumerable: true
13
13
  });
14
- if (!no_symbols) __defProp$12(target, Symbol.toStringTag, { value: "Module" });
14
+ if (!no_symbols) __defProp$13(target, Symbol.toStringTag, { value: "Module" });
15
15
  return target;
16
16
  };
17
17
  //#endregion
18
18
  //#region src/__smrt-register__.ts
19
- ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":1783125126988,\"packageName\":\"@happyvertical/smrt-users\",\"packageVersion\":\"0.38.2\",\"objects\":{\"@happyvertical/smrt-users:AccessRequestCollection\":{\"name\":\"accessrequestcollection\",\"className\":\"AccessRequestCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:AccessRequestCollection\",\"collection\":\"accessrequests\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/AccessRequestCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByEmail\":{\"name\":\"findByEmail\",\"async\":true,\"parameters\":[{\"name\":\"email\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<AccessRequest[]>\",\"isStatic\":false,\"isPublic\":true},\"findOpenByEmail\":{\"name\":\"findOpenByEmail\",\"async\":true,\"parameters\":[{\"name\":\"email\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<AccessRequest | null>\",\"isStatic\":false,\"isPublic\":true},\"findByStatus\":{\"name\":\"findByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"AccessRequestStatus\",\"optional\":false}],\"returnType\":\"Promise<AccessRequest[]>\",\"isStatic\":false,\"isPublic\":true},\"findOpen\":{\"name\":\"findOpen\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<AccessRequest[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"access_requests\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"AccessRequest\",\"exportName\":\"AccessRequestCollection\",\"collectionExportName\":\"AccessRequestCollectionCollection\",\"schema\":{\"tableName\":\"access_requests\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"access_requests\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"access_requests_id_idx\",\"columns\":[\"id\"]},{\"name\":\"access_requests_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"c7691cc2\"}},\"@happyvertical/smrt-users:UsersCliAuthRequestCollection\":{\"name\":\"userscliauthrequestcollection\",\"className\":\"UsersCliAuthRequestCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersCliAuthRequestCollection\",\"collection\":\"userscliauthrequests\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/CliAuthRequestCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByUserCode\":{\"name\":\"findByUserCode\",\"async\":true,\"parameters\":[{\"name\":\"userCode\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<UsersCliAuthRequest | null>\",\"isStatic\":false,\"isPublic\":true},\"findByDeviceCodeHash\":{\"name\":\"findByDeviceCodeHash\",\"async\":true,\"parameters\":[{\"name\":\"deviceCodeHash\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<UsersCliAuthRequest | null>\",\"isStatic\":false,\"isPublic\":true},\"deleteExpired\":{\"name\":\"deleteExpired\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_requests\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersCliAuthRequest\",\"exportName\":\"UsersCliAuthRequestCollection\",\"collectionExportName\":\"UsersCliAuthRequestCollectionCollection\",\"schema\":{\"tableName\":\"users_cli_auth_requests\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_cli_auth_requests\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"users_cli_auth_requests_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_cli_auth_requests_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"0e072f3a\"}},\"@happyvertical/smrt-users:GroupCollection\":{\"name\":\"groupcollection\",\"className\":\"GroupCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupCollection\",\"collection\":\"groups\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/GroupCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByTenant\":{\"name\":\"findByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Group[]>\",\"isStatic\":false,\"isPublic\":true},\"findBySlug\":{\"name\":\"findBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Group | null>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Group\",\"exportName\":\"GroupCollection\",\"collectionExportName\":\"GroupCollectionCollection\",\"schema\":{\"tableName\":\"group_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"group_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"10e23765\"}},\"@happyvertical/smrt-users:GroupMemberCollection\":{\"name\":\"groupmembercollection\",\"className\":\"GroupMemberCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupMemberCollection\",\"collection\":\"groupmembers\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/GroupMemberCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByGroup\":{\"name\":\"findByGroup\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupMember[]>\",\"isStatic\":false,\"isPublic\":true},\"findByUser\":{\"name\":\"findByUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupMember[]>\",\"isStatic\":false,\"isPublic\":true},\"isMember\":{\"name\":\"isMember\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"addMember\":{\"name\":\"addMember\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupMember>\",\"isStatic\":false,\"isPublic\":true},\"removeMember\":{\"name\":\"removeMember\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"getGroupIds\":{\"name\":\"getGroupIds\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getGroupIdsForTenant\":{\"name\":\"getGroupIdsForTenant\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getUserIds\":{\"name\":\"getUserIds\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"GroupMember\",\"exportName\":\"GroupMemberCollection\",\"collectionExportName\":\"GroupMemberCollectionCollection\",\"schema\":{\"tableName\":\"group_member_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_member_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"group_member_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_member_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"f61e9ad6\"}},\"@happyvertical/smrt-users:GroupRoleCollection\":{\"name\":\"grouprolecollection\",\"className\":\"GroupRoleCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupRoleCollection\",\"collection\":\"grouproles\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/GroupRoleCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByGroup\":{\"name\":\"findByGroup\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupRole[]>\",\"isStatic\":false,\"isPublic\":true},\"findByRole\":{\"name\":\"findByRole\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupRole[]>\",\"isStatic\":false,\"isPublic\":true},\"hasRole\":{\"name\":\"hasRole\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"addRole\":{\"name\":\"addRole\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupRole>\",\"isStatic\":false,\"isPublic\":true},\"removeRole\":{\"name\":\"removeRole\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"getRoleIds\":{\"name\":\"getRoleIds\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"GroupRole\",\"exportName\":\"GroupRoleCollection\",\"collectionExportName\":\"GroupRoleCollectionCollection\",\"schema\":{\"tableName\":\"group_role_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_role_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"group_role_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_role_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"33fdaf49\"}},\"@happyvertical/smrt-users:UsersMagicLinkTokenCollection\":{\"name\":\"usersmagiclinktokencollection\",\"className\":\"UsersMagicLinkTokenCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersMagicLinkTokenCollection\",\"collection\":\"usersmagiclinktokens\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/MagicLinkTokenCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByNonce\":{\"name\":\"findByNonce\",\"async\":true,\"parameters\":[{\"name\":\"nonce\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<UsersMagicLinkToken | null>\",\"isStatic\":false,\"isPublic\":true},\"markUsed\":{\"name\":\"markUsed\",\"async\":true,\"parameters\":[{\"name\":\"nonce\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"deleteExpired\":{\"name\":\"deleteExpired\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_magic_link_tokens\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersMagicLinkToken\",\"exportName\":\"UsersMagicLinkTokenCollection\",\"collectionExportName\":\"UsersMagicLinkTokenCollectionCollection\",\"schema\":{\"tableName\":\"users_magic_link_tokens\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_magic_link_tokens\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"users_magic_link_tokens_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_magic_link_tokens_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"a8c021f9\"}},\"@happyvertical/smrt-users:MembershipCollection\":{\"name\":\"membershipcollection\",\"className\":\"MembershipCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:MembershipCollection\",\"collection\":\"memberships\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/MembershipCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByUser\":{\"name\":\"findByUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findActiveByUser\":{\"name\":\"findActiveByUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findByTenant\":{\"name\":\"findByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findActiveByTenant\":{\"name\":\"findActiveByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findByUserAndTenant\":{\"name\":\"findByUserAndTenant\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership | null>\",\"isStatic\":false,\"isPublic\":true},\"findByRole\":{\"name\":\"findByRole\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findByStatus\":{\"name\":\"findByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"MembershipStatus\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Membership\",\"exportName\":\"MembershipCollection\",\"collectionExportName\":\"MembershipCollectionCollection\",\"schema\":{\"tableName\":\"membership_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"membership_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"membership_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"membership_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"8a2577ba\"}},\"@happyvertical/smrt-users:MembershipOverrideCollection\":{\"name\":\"membershipoverridecollection\",\"className\":\"MembershipOverrideCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:MembershipOverrideCollection\",\"collection\":\"membershipoverrides\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/MembershipOverrideCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByMembership\":{\"name\":\"findByMembership\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findGrants\":{\"name\":\"findGrants\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findDenies\":{\"name\":\"findDenies\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"getGrantedPermissionIds\":{\"name\":\"getGrantedPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getDeniedPermissionIds\":{\"name\":\"getDeniedPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"setOverride\":{\"name\":\"setOverride\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"effect\",\"type\":\"OverrideEffect\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride>\",\"isStatic\":false,\"isPublic\":true},\"removeOverride\":{\"name\":\"removeOverride\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"grantPermission\":{\"name\":\"grantPermission\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride>\",\"isStatic\":false,\"isPublic\":true},\"denyPermission\":{\"name\":\"denyPermission\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"MembershipOverride\",\"exportName\":\"MembershipOverrideCollection\",\"collectionExportName\":\"MembershipOverrideCollectionCollection\",\"schema\":{\"tableName\":\"membership_override_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"membership_override_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"membership_override_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"membership_override_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"43ccd4cb\"}},\"@happyvertical/smrt-users:PermissionCollection\":{\"name\":\"permissioncollection\",\"className\":\"PermissionCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:PermissionCollection\",\"collection\":\"permissions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/PermissionCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByCategory\":{\"name\":\"findByCategory\",\"async\":true,\"parameters\":[{\"name\":\"category\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Permission[]>\",\"isStatic\":false,\"isPublic\":true},\"findBySlug\":{\"name\":\"findBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Permission | null>\",\"isStatic\":false,\"isPublic\":true},\"findByIds\":{\"name\":\"findByIds\",\"async\":true,\"parameters\":[{\"name\":\"ids\",\"type\":\"string[]\",\"optional\":false}],\"returnType\":\"Promise<Map<string, Permission>>\",\"isStatic\":false,\"isPublic\":true},\"getCategories\":{\"name\":\"getCategories\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"findOrCreate\":{\"name\":\"findOrCreate\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false},{\"name\":\"defaults\",\"type\":\"Partial<object>\",\"optional\":true}],\"returnType\":\"Promise<Permission>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Permission\",\"exportName\":\"PermissionCollection\",\"collectionExportName\":\"PermissionCollectionCollection\",\"schema\":{\"tableName\":\"permission_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"permission_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"permission_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"permission_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"fc443bec\"}},\"@happyvertical/smrt-users:RoleCollection\":{\"name\":\"rolecollection\",\"className\":\"RoleCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:RoleCollection\",\"collection\":\"roles\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/RoleCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findSystemRoles\":{\"name\":\"findSystemRoles\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<Role[]>\",\"isStatic\":false,\"isPublic\":true},\"findByTenant\":{\"name\":\"findByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Role[]>\",\"isStatic\":false,\"isPublic\":true},\"findTenantRoles\":{\"name\":\"findTenantRoles\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Role[]>\",\"isStatic\":false,\"isPublic\":true},\"findBySlug\":{\"name\":\"findBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":true}],\"returnType\":\"Promise<Role | null>\",\"isStatic\":false,\"isPublic\":true},\"seedSystemRoles\":{\"name\":\"seedSystemRoles\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<Role[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Role\",\"exportName\":\"RoleCollection\",\"collectionExportName\":\"RoleCollectionCollection\",\"schema\":{\"tableName\":\"role_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"role_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"role_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"role_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"b6b325e0\"}},\"@happyvertical/smrt-users:RolePermissionCollection\":{\"name\":\"rolepermissioncollection\",\"className\":\"RolePermissionCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:RolePermissionCollection\",\"collection\":\"rolepermissions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/RolePermissionCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByRole\":{\"name\":\"findByRole\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<RolePermission[]>\",\"isStatic\":false,\"isPublic\":true},\"findByPermission\":{\"name\":\"findByPermission\",\"async\":true,\"parameters\":[{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<RolePermission[]>\",\"isStatic\":false,\"isPublic\":true},\"hasPermission\":{\"name\":\"hasPermission\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"addPermission\":{\"name\":\"addPermission\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<RolePermission>\",\"isStatic\":false,\"isPublic\":true},\"removePermission\":{\"name\":\"removePermission\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"getPermissionIds\":{\"name\":\"getPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"RolePermission\",\"exportName\":\"RolePermissionCollection\",\"collectionExportName\":\"RolePermissionCollectionCollection\",\"schema\":{\"tableName\":\"role_permission_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"role_permission_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"role_permission_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"role_permission_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"b4ec602b\"}},\"@happyvertical/smrt-users:SessionCollection\":{\"name\":\"sessioncollection\",\"className\":\"SessionCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:SessionCollection\",\"collection\":\"sessions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/SessionCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"createSession\":{\"name\":\"createSession\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"CreateSessionOptions\",\"optional\":false}],\"returnType\":\"Promise<Session>\",\"isStatic\":false,\"isPublic\":true},\"findValidSession\":{\"name\":\"findValidSession\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Session | null>\",\"isStatic\":false,\"isPublic\":true},\"touch\":{\"name\":\"touch\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"extendTtl\",\"type\":\"boolean\",\"optional\":true},{\"name\":\"ttl\",\"type\":\"number\",\"optional\":true}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"findByUser\":{\"name\":\"findByUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Session[]>\",\"isStatic\":false,\"isPublic\":true},\"deleteUserSessions\":{\"name\":\"deleteUserSessions\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"revokeUserSessions\":{\"name\":\"revokeUserSessions\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"revokeSession\":{\"name\":\"revokeSession\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"deleteExpired\":{\"name\":\"deleteExpired\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"countUserSessions\":{\"name\":\"countUserSessions\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"setSessionTenant\":{\"name\":\"setSessionTenant\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string | null\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"setSessionData\":{\"name\":\"setSessionData\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"value\",\"type\":\"any\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"getSessionData\":{\"name\":\"getSessionData\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"key\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<T | undefined>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Session\",\"exportName\":\"SessionCollection\",\"collectionExportName\":\"SessionCollectionCollection\",\"schema\":{\"tableName\":\"session_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"session_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"session_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"session_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"ec13164c\"}},\"@happyvertical/smrt-users:TenantCollection\":{\"name\":\"tenantcollection\",\"className\":\"TenantCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantCollection\",\"collection\":\"tenants\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/TenantCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByStatus\":{\"name\":\"findByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"TenantStatus\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"findActive\":{\"name\":\"findActive\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"findBySlug\":{\"name\":\"findBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant | null>\",\"isStatic\":false,\"isPublic\":true},\"findRoots\":{\"name\":\"findRoots\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"findChildren\":{\"name\":\"findChildren\",\"async\":true,\"parameters\":[{\"name\":\"parentTenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"findParent\":{\"name\":\"findParent\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant | null>\",\"isStatic\":false,\"isPublic\":true},\"getAncestors\":{\"name\":\"getAncestors\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"getAncestorsFromRoot\":{\"name\":\"getAncestorsFromRoot\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"getDescendants\":{\"name\":\"getDescendants\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"getSiblings\":{\"name\":\"getSiblings\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"isAncestorOf\":{\"name\":\"isAncestorOf\",\"async\":true,\"parameters\":[{\"name\":\"potentialAncestorId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"isDescendantOf\":{\"name\":\"isDescendantOf\",\"async\":true,\"parameters\":[{\"name\":\"potentialDescendantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"createChild\":{\"name\":\"createChild\",\"async\":true,\"parameters\":[{\"name\":\"parentTenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"CreateChildTenantOptions\",\"optional\":false}],\"returnType\":\"Promise<Tenant>\",\"isStatic\":false,\"isPublic\":true},\"moveToParent\":{\"name\":\"moveToParent\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"newParentId\",\"type\":\"string | null\",\"optional\":false}],\"returnType\":\"Promise<Tenant>\",\"isStatic\":false,\"isPublic\":true},\"makeRoot\":{\"name\":\"makeRoot\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant>\",\"isStatic\":false,\"isPublic\":true},\"validateHierarchy\":{\"name\":\"validateHierarchy\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getTree\":{\"name\":\"getTree\",\"async\":true,\"parameters\":[{\"name\":\"rootTenantId\",\"type\":\"string\",\"optional\":true}],\"returnType\":\"Promise<Array>\",\"isStatic\":false,\"isPublic\":true},\"create\":{\"name\":\"create\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"SmrtCreateInput<Tenant>\",\"optional\":false}],\"returnType\":\"Promise<Tenant>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Tenant\",\"exportName\":\"TenantCollection\",\"collectionExportName\":\"TenantCollectionCollection\",\"schema\":{\"tableName\":\"tenant_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"tenant_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"tenant_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"bcfa1eef\"}},\"@happyvertical/smrt-users:TenantPermissionOverrideCollection\":{\"name\":\"tenantpermissionoverridecollection\",\"className\":\"TenantPermissionOverrideCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantPermissionOverrideCollection\",\"collection\":\"tenantpermissionoverrides\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/TenantPermissionOverrideCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByTenant\":{\"name\":\"findByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findGrants\":{\"name\":\"findGrants\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findDenies\":{\"name\":\"findDenies\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findInherits\":{\"name\":\"findInherits\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"getGrantedPermissionIds\":{\"name\":\"getGrantedPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getDeniedPermissionIds\":{\"name\":\"getDeniedPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getOverridesByEffect\":{\"name\":\"getOverridesByEffect\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverrideResult>\",\"isStatic\":false,\"isPublic\":true},\"getOverridesByEffectBatch\":{\"name\":\"getOverridesByEffectBatch\",\"async\":true,\"parameters\":[{\"name\":\"tenantIds\",\"type\":\"string[]\",\"optional\":false}],\"returnType\":\"Promise<Map<string, TenantPermissionOverrideResult>>\",\"isStatic\":false,\"isPublic\":true},\"setOverride\":{\"name\":\"setOverride\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"effect\",\"type\":\"TenantPermissionEffect\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride>\",\"isStatic\":false,\"isPublic\":true},\"removeOverride\":{\"name\":\"removeOverride\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"removeAllOverrides\":{\"name\":\"removeAllOverrides\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"grantPermission\":{\"name\":\"grantPermission\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride>\",\"isStatic\":false,\"isPublic\":true},\"denyPermission\":{\"name\":\"denyPermission\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride>\",\"isStatic\":false,\"isPublic\":true},\"inheritPermission\":{\"name\":\"inheritPermission\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride>\",\"isStatic\":false,\"isPublic\":true},\"bulkSetOverrides\":{\"name\":\"bulkSetOverrides\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"overrides\",\"type\":\"Array<object>\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"copyOverrides\":{\"name\":\"copyOverrides\",\"async\":true,\"parameters\":[{\"name\":\"fromTenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"toTenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"TenantPermissionOverride\",\"exportName\":\"TenantPermissionOverrideCollection\",\"collectionExportName\":\"TenantPermissionOverrideCollectionCollection\",\"schema\":{\"tableName\":\"tenant_permission_override_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_permission_override_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"tenant_permission_override_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"tenant_permission_override_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"e6b5a0b6\"}},\"@happyvertical/smrt-users:UserCollection\":{\"name\":\"usercollection\",\"className\":\"UserCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UserCollection\",\"collection\":\"users\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/UserCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByEmail\":{\"name\":\"findByEmail\",\"async\":true,\"parameters\":[{\"name\":\"email\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<User | null>\",\"isStatic\":false,\"isPublic\":true},\"findByProfile\":{\"name\":\"findByProfile\",\"async\":true,\"parameters\":[{\"name\":\"profileId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<User | null>\",\"isStatic\":false,\"isPublic\":true},\"findByStatus\":{\"name\":\"findByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"UserStatus\",\"optional\":false}],\"returnType\":\"Promise<User[]>\",\"isStatic\":false,\"isPublic\":true},\"findActive\":{\"name\":\"findActive\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<User[]>\",\"isStatic\":false,\"isPublic\":true},\"findPending\":{\"name\":\"findPending\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<User[]>\",\"isStatic\":false,\"isPublic\":true},\"getOrCreateForProfile\":{\"name\":\"getOrCreateForProfile\",\"async\":true,\"parameters\":[{\"name\":\"profileId\",\"type\":\"string\",\"optional\":false},{\"name\":\"email\",\"type\":\"string\",\"optional\":false},{\"name\":\"defaults\",\"type\":\"Partial<object>\",\"optional\":true}],\"returnType\":\"Promise<User>\",\"isStatic\":false,\"isPublic\":true},\"getOrCreateFromOidc\":{\"name\":\"getOrCreateFromOidc\",\"async\":true,\"parameters\":[{\"name\":\"claims\",\"type\":\"OidcClaims\",\"optional\":false},{\"name\":\"provider\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"GetOrCreateFromOidcOptions\",\"optional\":true}],\"returnType\":\"Promise<OidcIdentityResult>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"User\",\"exportName\":\"UserCollection\",\"collectionExportName\":\"UserCollectionCollection\",\"schema\":{\"tableName\":\"user_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"user_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"user_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"user_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"539fdcc8\"}},\"@happyvertical/smrt-users:AccessRequest\":{\"name\":\"accessrequest\",\"className\":\"AccessRequest\",\"qualifiedName\":\"@happyvertical/smrt-users:AccessRequest\",\"collection\":\"accessrequests\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/AccessRequest.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"email\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true,\"indexed\":true}},\"name\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"indexed\":true}},\"source\":{\"type\":\"text\",\"required\":false,\"default\":\"\",\"_meta\":{\"indexed\":true}},\"requestContext\":{\"type\":\"text\",\"required\":false,\"default\":\"{}\"},\"note\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"requestedAt\":{\"type\":\"datetime\",\"required\":false},\"decidedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"decidedBy\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"resultingUserId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"tenantHint\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{\"getRequestContext\":{\"name\":\"getRequestContext\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string>\",\"isStatic\":false,\"isPublic\":true},\"setRequestContext\":{\"name\":\"setRequestContext\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string>\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getTenantHint\":{\"name\":\"getTenantHint\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string> | null\",\"isStatic\":false,\"isPublic\":true},\"setTenantHint\":{\"name\":\"setTenantHint\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string> | null\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"isOpen\":{\"name\":\"isOpen\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isApproved\":{\"name\":\"isApproved\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isTerminal\":{\"name\":\"isTerminal\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"access_requests\",\"conflictColumns\":[\"id\"],\"api\":{\"include\":[]},\"mcp\":{\"include\":[]},\"cli\":{\"include\":[]}},\"extends\":\"SmrtObject\",\"exportName\":\"AccessRequest\",\"collectionExportName\":\"AccessRequestCollection\",\"validationRules\":[{\"field\":\"email\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"schema\":{\"tableName\":\"access_requests\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"access_requests\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"email\\\" TEXT NOT NULL DEFAULT '',\\n \\\"name\\\" TEXT,\\n \\\"status\\\" TEXT,\\n \\\"source\\\" TEXT DEFAULT '',\\n \\\"request_context\\\" TEXT DEFAULT '{}',\\n \\\"note\\\" TEXT,\\n \\\"requested_at\\\" TIMESTAMP,\\n \\\"decided_at\\\" TIMESTAMP,\\n \\\"decided_by\\\" TEXT,\\n \\\"resulting_user_id\\\" TEXT,\\n \\\"tenant_hint\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"email\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"source\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"request_context\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"{}\"},\"note\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"requested_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"decided_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"decided_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"resulting_user_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"tenant_hint\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"access_requests_id_idx\",\"columns\":[\"id\"]},{\"name\":\"access_requests_id_idx\",\"columns\":[\"id\"],\"unique\":true},{\"name\":\"access_requests_email_idx\",\"columns\":[\"email\"]},{\"name\":\"access_requests_status_idx\",\"columns\":[\"status\"]},{\"name\":\"access_requests_source_idx\",\"columns\":[\"source\"]}],\"version\":\"f396996f\"}},\"@happyvertical/smrt-users:UsersCliAuthRequest\":{\"name\":\"userscliauthrequest\",\"className\":\"UsersCliAuthRequest\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersCliAuthRequest\",\"collection\":\"userscliauthrequests\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/CliAuthRequest.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userCode\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"deviceCodeHash\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"userId\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"tenantId\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"sessionId\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"expiresAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{}},\"approvedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_requests\",\"api\":{\"include\":[]},\"cli\":{\"include\":[]},\"mcp\":{\"include\":[]}},\"extends\":\"SmrtObject\",\"exportName\":\"UsersCliAuthRequest\",\"collectionExportName\":\"UsersCliAuthRequestCollection\",\"schema\":{\"tableName\":\"users_cli_auth_requests\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_cli_auth_requests\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"user_code\\\" TEXT,\\n \\\"device_code_hash\\\" TEXT,\\n \\\"status\\\" TEXT,\\n \\\"user_id\\\" TEXT,\\n \\\"tenant_id\\\" TEXT,\\n \\\"session_id\\\" TEXT,\\n \\\"expires_at\\\" TIMESTAMP,\\n \\\"approved_at\\\" TIMESTAMP\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"user_code\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"device_code_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"user_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"tenant_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"session_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"approved_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_requests_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_cli_auth_requests_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"d994ea55\"}},\"@happyvertical/smrt-users:Group\":{\"name\":\"group\",\"className\":\"Group\",\"qualifiedName\":\"@happyvertical/smrt-users:Group\",\"collection\":\"groups\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Group.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Tenant\",\"_meta\":{\"required\":true}},\"name\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"description\":{\"type\":\"text\",\"required\":false,\"default\":\"\"}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Group\",\"collectionExportName\":\"GroupCollection\",\"validationRules\":[{\"field\":\"tenantId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"groups\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"groups\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID NOT NULL,\\n \\\"name\\\" TEXT DEFAULT '',\\n \\\"description\\\" TEXT DEFAULT ''\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"}},\"indexes\":[{\"name\":\"groups_id_idx\",\"columns\":[\"id\"]},{\"name\":\"groups_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"5a6913b2\"}},\"@happyvertical/smrt-users:GroupMember\":{\"name\":\"groupmember\",\"className\":\"GroupMember\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupMember\",\"collection\":\"groupmembers\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/GroupMember.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"groupId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Group\",\"_meta\":{\"required\":true}},\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true}}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"GroupMember\",\"collectionExportName\":\"GroupMemberCollection\",\"validationRules\":[{\"field\":\"groupId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"group_members\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_members\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"group_id\\\" UUID NOT NULL,\\n \\\"user_id\\\" UUID NOT NULL\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"group_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"group_members_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_members_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"77f49385\"}},\"@happyvertical/smrt-users:GroupRole\":{\"name\":\"grouprole\",\"className\":\"GroupRole\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupRole\",\"collection\":\"grouproles\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/GroupRole.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"groupId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Group\",\"_meta\":{\"required\":true}},\"roleId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Role\",\"_meta\":{\"required\":true}}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"GroupRole\",\"collectionExportName\":\"GroupRoleCollection\",\"validationRules\":[{\"field\":\"groupId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"roleId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"group_roles\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_roles\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"group_id\\\" UUID NOT NULL,\\n \\\"role_id\\\" UUID NOT NULL\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"group_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"group_roles_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_roles_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"75d06c96\"}},\"@happyvertical/smrt-users:UsersMagicLinkToken\":{\"name\":\"usersmagiclinktoken\",\"className\":\"UsersMagicLinkToken\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersMagicLinkToken\",\"collection\":\"usersmagiclinktokens\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/MagicLinkToken.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"nonce\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true,\"unique\":true}},\"email\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"used\":{\"type\":\"boolean\",\"required\":false,\"default\":false},\"expiresAt\":{\"type\":\"datetime\",\"required\":false}},\"methods\":{\"isExpired\":{\"name\":\"isExpired\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isValid\":{\"name\":\"isValid\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_magic_link_tokens\",\"api\":{\"include\":[]},\"mcp\":{\"include\":[]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"UsersMagicLinkToken\",\"collectionExportName\":\"UsersMagicLinkTokenCollection\",\"validationRules\":[{\"field\":\"nonce\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"schema\":{\"tableName\":\"users_magic_link_tokens\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_magic_link_tokens\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"nonce\\\" TEXT NOT NULL UNIQUE DEFAULT '',\\n \\\"email\\\" TEXT DEFAULT '',\\n \\\"used\\\" BOOLEAN DEFAULT FALSE,\\n \\\"expires_at\\\" TIMESTAMP\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"nonce\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true,\"default\":\"\"},\"email\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"used\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_magic_link_tokens_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_magic_link_tokens_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"537853d3\"}},\"@happyvertical/smrt-users:Membership\":{\"name\":\"membership\",\"className\":\"Membership\",\"qualifiedName\":\"@happyvertical/smrt-users:Membership\",\"collection\":\"memberships\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Membership.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true}},\"tenantId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Tenant\",\"_meta\":{\"required\":true}},\"roleId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Role\",\"_meta\":{\"required\":true}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"isActive\":{\"name\":\"isActive\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isPending\":{\"name\":\"isPending\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Membership\",\"collectionExportName\":\"MembershipCollection\",\"validationRules\":[{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"tenantId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"roleId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"memberships\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"memberships\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"user_id\\\" UUID NOT NULL,\\n \\\"tenant_id\\\" UUID NOT NULL,\\n \\\"role_id\\\" UUID NOT NULL,\\n \\\"status\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"memberships_id_idx\",\"columns\":[\"id\"]},{\"name\":\"memberships_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"23fdb25d\"}},\"@happyvertical/smrt-users:MembershipOverride\":{\"name\":\"membershipoverride\",\"className\":\"MembershipOverride\",\"qualifiedName\":\"@happyvertical/smrt-users:MembershipOverride\",\"collection\":\"membershipoverrides\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/MembershipOverride.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"membershipId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Membership\",\"_meta\":{\"required\":true}},\"permissionId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Permission\",\"_meta\":{\"required\":true}},\"effect\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"isGrant\":{\"name\":\"isGrant\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isDeny\":{\"name\":\"isDeny\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"MembershipOverride\",\"collectionExportName\":\"MembershipOverrideCollection\",\"validationRules\":[{\"field\":\"membershipId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"permissionId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"membership_overrides\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"membership_overrides\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"membership_id\\\" UUID NOT NULL,\\n \\\"permission_id\\\" UUID NOT NULL,\\n \\\"effect\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"membership_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"membership_overrides_id_idx\",\"columns\":[\"id\"]},{\"name\":\"membership_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"ab60f8f9\"}},\"@happyvertical/smrt-users:Permission\":{\"name\":\"permission\",\"className\":\"Permission\",\"qualifiedName\":\"@happyvertical/smrt-users:Permission\",\"collection\":\"permissions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Permission.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"name\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"description\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"category\":{\"type\":\"text\",\"required\":false,\"default\":\"\"}},\"methods\":{\"parseSlug\":{\"name\":\"parseSlug\",\"async\":false,\"parameters\":[],\"returnType\":\"ParsedPermissionSlug\",\"isStatic\":false,\"isPublic\":true},\"getResource\":{\"name\":\"getResource\",\"async\":false,\"parameters\":[],\"returnType\":\"string\",\"isStatic\":false,\"isPublic\":true},\"getAction\":{\"name\":\"getAction\",\"async\":false,\"parameters\":[],\"returnType\":\"string\",\"isStatic\":false,\"isPublic\":true},\"isValidSlug\":{\"name\":\"isValidSlug\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Permission\",\"collectionExportName\":\"PermissionCollection\",\"schema\":{\"tableName\":\"permissions\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"permissions\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"name\\\" TEXT DEFAULT '',\\n \\\"description\\\" TEXT DEFAULT '',\\n \\\"category\\\" TEXT DEFAULT ''\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"category\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"}},\"indexes\":[{\"name\":\"permissions_id_idx\",\"columns\":[\"id\"]},{\"name\":\"permissions_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"4c81b2af\"}},\"@happyvertical/smrt-users:Role\":{\"name\":\"role\",\"className\":\"Role\",\"qualifiedName\":\"@happyvertical/smrt-users:Role\",\"collection\":\"roles\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Role.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Tenant\",\"_meta\":{\"nullable\":true}},\"name\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"description\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"isSystem\":{\"type\":\"boolean\",\"required\":false,\"default\":false}},\"methods\":{\"isSystemRole\":{\"name\":\"isSystemRole\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isTenantRole\":{\"name\":\"isTenantRole\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"canDelete\":{\"name\":\"canDelete\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"delete\":{\"name\":\"delete\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Role\",\"collectionExportName\":\"RoleCollection\",\"schema\":{\"tableName\":\"roles\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"roles\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID,\\n \\\"name\\\" TEXT DEFAULT '',\\n \\\"description\\\" TEXT DEFAULT '',\\n \\\"is_system\\\" BOOLEAN DEFAULT FALSE\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"is_system\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false}},\"indexes\":[{\"name\":\"roles_id_idx\",\"columns\":[\"id\"]},{\"name\":\"roles_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"7f823f30\"}},\"@happyvertical/smrt-users:RolePermission\":{\"name\":\"rolepermission\",\"className\":\"RolePermission\",\"qualifiedName\":\"@happyvertical/smrt-users:RolePermission\",\"collection\":\"rolepermissions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/RolePermission.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"roleId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Role\",\"_meta\":{\"required\":true}},\"permissionId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Permission\",\"_meta\":{\"required\":true}}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"RolePermission\",\"collectionExportName\":\"RolePermissionCollection\",\"validationRules\":[{\"field\":\"roleId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"permissionId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"role_permissions\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"role_permissions\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"role_id\\\" UUID NOT NULL,\\n \\\"permission_id\\\" UUID NOT NULL\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"role_permissions_id_idx\",\"columns\":[\"id\"]},{\"name\":\"role_permissions_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"453cc12c\"}},\"@happyvertical/smrt-users:Session\":{\"name\":\"session\",\"className\":\"Session\",\"qualifiedName\":\"@happyvertical/smrt-users:Session\",\"collection\":\"sessions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Session.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"User\"},\"tenantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Tenant\",\"_meta\":{\"nullable\":true}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"expiresAt\":{\"type\":\"datetime\",\"required\":false},\"userAgent\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"ipAddress\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"lastAccessedAt\":{\"type\":\"datetime\",\"required\":false},\"data\":{\"type\":\"json\",\"required\":false,\"default\":{}}},\"methods\":{\"isValid\":{\"name\":\"isValid\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isExpired\":{\"name\":\"isExpired\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isRevoked\":{\"name\":\"isRevoked\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"touch\":{\"name\":\"touch\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"extend\":{\"name\":\"extend\",\"async\":false,\"parameters\":[{\"name\":\"ttlSeconds\",\"type\":\"number\",\"optional\":true}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"revoke\":{\"name\":\"revoke\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"setTenant\":{\"name\":\"setTenant\",\"async\":false,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string | null\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getData\":{\"name\":\"getData\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"T | undefined\",\"isStatic\":false,\"isPublic\":true},\"setData\":{\"name\":\"setData\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"value\",\"type\":\"any\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"removeData\":{\"name\":\"removeData\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"get\",\"delete\"]},\"mcp\":{\"include\":[]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Session\",\"collectionExportName\":\"SessionCollection\",\"schema\":{\"tableName\":\"sessions\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"sessions\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"user_id\\\" UUID,\\n \\\"tenant_id\\\" UUID,\\n \\\"status\\\" TEXT,\\n \\\"expires_at\\\" TIMESTAMP,\\n \\\"user_agent\\\" TEXT DEFAULT '',\\n \\\"ip_address\\\" TEXT DEFAULT '',\\n \\\"last_accessed_at\\\" TIMESTAMP,\\n \\\"data\\\" JSON DEFAULT '{}'\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"user_agent\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"ip_address\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"last_accessed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"data\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false,\"default\":{}}},\"indexes\":[{\"name\":\"sessions_id_idx\",\"columns\":[\"id\"]},{\"name\":\"sessions_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"692d8b0f\"}},\"@happyvertical/smrt-users:Tenant\":{\"name\":\"tenant\",\"className\":\"Tenant\",\"qualifiedName\":\"@happyvertical/smrt-users:Tenant\",\"collection\":\"tenants\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Tenant.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"created_at\":{\"type\":\"datetime\",\"required\":false},\"updated_at\":{\"type\":\"datetime\",\"required\":false},\"name\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"description\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"parentTenantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Tenant\",\"_meta\":{\"nullable\":true}},\"hierarchyLevel\":{\"type\":\"integer\",\"required\":false,\"default\":0},\"hierarchyPath\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"cascadePermissions\":{\"type\":\"boolean\",\"required\":false,\"default\":true},\"inheritPermissions\":{\"type\":\"boolean\",\"required\":false,\"default\":true}},\"methods\":{\"getAiUsageSnapshot\":{\"name\":\"getAiUsageSnapshot\",\"async\":false,\"parameters\":[],\"returnType\":\"AiUsageSnapshot | undefined\",\"isStatic\":false,\"isPublic\":true},\"resetAiUsage\":{\"name\":\"resetAiUsage\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"listAiUsage\":{\"name\":\"listAiUsage\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"AiUsageListOptions\",\"optional\":true}],\"returnType\":\"Promise<SmrtAiUsageRecord[]>\",\"isStatic\":false,\"isPublic\":true},\"summarizeAiUsage\":{\"name\":\"summarizeAiUsage\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"AiUsageSummaryOptions\",\"optional\":true}],\"returnType\":\"Promise<Record<string, AiUsageStats>>\",\"isStatic\":false,\"isPublic\":true},\"destroy\":{\"name\":\"destroy\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"markAsPersisted\":{\"name\":\"markAsPersisted\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"requireInsertOnSave\":{\"name\":\"requireInsertOnSave\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"initialize\":{\"name\":\"initialize\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"loadDataFromDb\":{\"name\":\"loadDataFromDb\",\"async\":true,\"parameters\":[{\"name\":\"data\",\"type\":\"Record<string>\",\"optional\":false}],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"getFields\":{\"name\":\"getFields\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<any>\",\"isStatic\":false,\"isPublic\":true},\"toJSON\":{\"name\":\"toJSON\",\"async\":false,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"toPlainObject\":{\"name\":\"toPlainObject\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string>\",\"isStatic\":false,\"isPublic\":true},\"toPublicJSON\":{\"name\":\"toPublicJSON\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string>\",\"isStatic\":false,\"isPublic\":true},\"getId\":{\"name\":\"getId\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"getSlug\":{\"name\":\"getSlug\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"getSavedId\":{\"name\":\"getSavedId\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"isSaved\":{\"name\":\"isSaved\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"classifyConstraintError\":{\"name\":\"classifyConstraintError\",\"async\":false,\"parameters\":[{\"name\":\"message\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"'unique' | 'not_null' | null\",\"isStatic\":true,\"isPublic\":true},\"loadFromId\":{\"name\":\"loadFromId\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"loadFromSlug\":{\"name\":\"loadFromSlug\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"is\":{\"name\":\"is\",\"async\":true,\"parameters\":[{\"name\":\"criteria\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"AiOperationOptions\",\"optional\":true}],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"do\":{\"name\":\"do\",\"async\":true,\"parameters\":[{\"name\":\"instructions\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"AiOperationOptions\",\"optional\":true}],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"describe\":{\"name\":\"describe\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"AiOperationOptions\",\"optional\":true}],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"delete\":{\"name\":\"delete\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"isRelatedLoaded\":{\"name\":\"isRelatedLoaded\",\"async\":false,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"_setLoadedRelationship\":{\"name\":\"_setLoadedRelationship\",\"async\":false,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"value\",\"type\":\"any\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"loadRelated\":{\"name\":\"loadRelated\",\"async\":true,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"opts\",\"type\":\"LoadRelatedOptions\",\"optional\":true}],\"returnType\":\"Promise<any>\",\"isStatic\":false,\"isPublic\":true},\"loadRelatedMany\":{\"name\":\"loadRelatedMany\",\"async\":true,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"opts\",\"type\":\"LoadRelatedOptions\",\"optional\":true}],\"returnType\":\"Promise<any[]>\",\"isStatic\":false,\"isPublic\":true},\"getRelated\":{\"name\":\"getRelated\",\"async\":true,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"opts\",\"type\":\"LoadRelatedOptions\",\"optional\":true}],\"returnType\":\"Promise<any>\",\"isStatic\":false,\"isPublic\":true},\"getAvailableTools\":{\"name\":\"getAvailableTools\",\"async\":false,\"parameters\":[],\"returnType\":\"AITool[]\",\"isStatic\":false,\"isPublic\":true},\"executeToolCall\":{\"name\":\"executeToolCall\",\"async\":true,\"parameters\":[{\"name\":\"toolCall\",\"type\":\"ToolCall\",\"optional\":false}],\"returnType\":\"Promise<ToolCallResult>\",\"isStatic\":false,\"isPublic\":true},\"remember\":{\"name\":\"remember\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"recall\":{\"name\":\"recall\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"recallAll\":{\"name\":\"recallAll\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true}],\"returnType\":\"Promise<Map<string>>\",\"isStatic\":false,\"isPublic\":true},\"forget\":{\"name\":\"forget\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"forgetScope\":{\"name\":\"forgetScope\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"generateEmbeddings\":{\"name\":\"generateEmbeddings\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"GenerateEmbeddingsOptions\",\"optional\":true}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"getEmbedding\":{\"name\":\"getEmbedding\",\"async\":true,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"model\",\"type\":\"string\",\"optional\":true}],\"returnType\":\"Promise<number[] | null>\",\"isStatic\":false,\"isPublic\":true},\"hasStaleEmbeddings\":{\"name\":\"hasStaleEmbeddings\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"clearEmbeddings\":{\"name\":\"clearEmbeddings\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"isActive\":{\"name\":\"isActive\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isSuspended\":{\"name\":\"isSuspended\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isRoot\":{\"name\":\"isRoot\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"canCascadeToChildren\":{\"name\":\"canCascadeToChildren\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"acceptsInheritance\":{\"name\":\"acceptsInheritance\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"getAncestorIds\":{\"name\":\"getAncestorIds\",\"async\":false,\"parameters\":[],\"returnType\":\"string[]\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableStrategy\":\"sti\",\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Tenant\",\"collectionExportName\":\"TenantCollection\",\"schema\":{\"tableName\":\"tenants\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenants\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"_meta_type\\\" TEXT NOT NULL,\\n \\\"_meta_data\\\" JSON,\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"name\\\" TEXT DEFAULT '',\\n \\\"status\\\" TEXT,\\n \\\"description\\\" TEXT DEFAULT '',\\n \\\"parent_tenant_id\\\" UUID,\\n \\\"hierarchy_level\\\" INTEGER DEFAULT 0,\\n \\\"hierarchy_path\\\" TEXT DEFAULT '',\\n \\\"cascade_permissions\\\" BOOLEAN DEFAULT TRUE,\\n \\\"inherit_permissions\\\" BOOLEAN DEFAULT TRUE\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"_meta_type\":{\"type\":\"TEXT\",\"notNull\":true},\"_meta_data\":{\"type\":\"JSON\",\"notNull\":false},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"default\":\"\"},\"status\":{\"type\":\"TEXT\",\"notNull\":false},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"default\":\"\"},\"parent_tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false},\"hierarchy_level\":{\"type\":\"INTEGER\",\"notNull\":false,\"default\":0},\"hierarchy_path\":{\"type\":\"TEXT\",\"notNull\":false,\"default\":\"\"},\"cascade_permissions\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"default\":true},\"inherit_permissions\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"default\":true}},\"indexes\":[{\"name\":\"tenants_id_idx\",\"columns\":[\"id\"]},{\"name\":\"tenants_slug_context_meta_type_idx\",\"columns\":[\"slug\",\"context\",\"_meta_type\"],\"unique\":true},{\"name\":\"tenants_meta_type_idx\",\"columns\":[\"_meta_type\"]}],\"version\":\"35dbdaec\"}},\"@happyvertical/smrt-users:TenantPermissionOverride\":{\"name\":\"tenantpermissionoverride\",\"className\":\"TenantPermissionOverride\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantPermissionOverride\",\"collection\":\"tenantpermissionoverrides\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/TenantPermissionOverride.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Tenant\",\"_meta\":{\"required\":true}},\"permissionId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Permission\",\"_meta\":{\"required\":true}},\"effect\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"isInherit\":{\"name\":\"isInherit\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isGrant\":{\"name\":\"isGrant\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isDeny\":{\"name\":\"isDeny\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"hasExplicitEffect\":{\"name\":\"hasExplicitEffect\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"TenantPermissionOverride\",\"collectionExportName\":\"TenantPermissionOverrideCollection\",\"validationRules\":[{\"field\":\"tenantId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"permissionId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"tenant_permission_overrides\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_permission_overrides\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID NOT NULL,\\n \\\"permission_id\\\" UUID NOT NULL,\\n \\\"effect\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_permission_overrides_id_idx\",\"columns\":[\"id\"]},{\"name\":\"tenant_permission_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"f3bec965\"}},\"@happyvertical/smrt-users:User\":{\"name\":\"user\",\"className\":\"User\",\"qualifiedName\":\"@happyvertical/smrt-users:User\",\"collection\":\"users\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/User.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"profileId\":{\"type\":\"crossPackageRef\",\"required\":false,\"related\":\"@happyvertical/smrt-profiles:Profile\"},\"email\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"lastLoginAt\":{\"type\":\"datetime\",\"required\":false}},\"methods\":{\"hasValidEmail\":{\"name\":\"hasValidEmail\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isActive\":{\"name\":\"isActive\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isSuspended\":{\"name\":\"isSuspended\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isPending\":{\"name\":\"isPending\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"recordLogin\":{\"name\":\"recordLogin\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"User\",\"collectionExportName\":\"UserCollection\",\"schema\":{\"tableName\":\"users\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"profile_id\\\" UUID,\\n \\\"email\\\" TEXT DEFAULT '',\\n \\\"status\\\" TEXT,\\n \\\"last_login_at\\\" TIMESTAMP\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"profile_id\":{\"type\":\"UUID\",\"referenceKind\":\"crossPackageRef\",\"notNull\":false,\"unique\":false},\"email\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_login_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"dda929da\"}}},\"moduleType\":\"smrt\",\"smrtDependencies\":[\"@happyvertical/smrt-core\",\"@happyvertical/smrt-profiles\",\"@happyvertical/smrt-tenancy\"]}"));
19
+ ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":1783263097129,\"packageName\":\"@happyvertical/smrt-users\",\"packageVersion\":\"0.38.4\",\"objects\":{\"@happyvertical/smrt-users:AccessRequestCollection\":{\"name\":\"accessrequestcollection\",\"className\":\"AccessRequestCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:AccessRequestCollection\",\"collection\":\"accessrequests\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/AccessRequestCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByEmail\":{\"name\":\"findByEmail\",\"async\":true,\"parameters\":[{\"name\":\"email\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<AccessRequest[]>\",\"isStatic\":false,\"isPublic\":true},\"findOpenByEmail\":{\"name\":\"findOpenByEmail\",\"async\":true,\"parameters\":[{\"name\":\"email\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<AccessRequest | null>\",\"isStatic\":false,\"isPublic\":true},\"findByStatus\":{\"name\":\"findByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"AccessRequestStatus\",\"optional\":false}],\"returnType\":\"Promise<AccessRequest[]>\",\"isStatic\":false,\"isPublic\":true},\"findOpen\":{\"name\":\"findOpen\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<AccessRequest[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"access_requests\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"AccessRequest\",\"exportName\":\"AccessRequestCollection\",\"collectionExportName\":\"AccessRequestCollectionCollection\",\"schema\":{\"tableName\":\"access_requests\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"access_requests\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"access_requests_id_idx\",\"columns\":[\"id\"]},{\"name\":\"access_requests_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"c7691cc2\"}},\"@happyvertical/smrt-users:UsersCliAuthRequestCollection\":{\"name\":\"userscliauthrequestcollection\",\"className\":\"UsersCliAuthRequestCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersCliAuthRequestCollection\",\"collection\":\"userscliauthrequests\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/CliAuthRequestCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByUserCode\":{\"name\":\"findByUserCode\",\"async\":true,\"parameters\":[{\"name\":\"userCode\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<UsersCliAuthRequest | null>\",\"isStatic\":false,\"isPublic\":true},\"findByDeviceCodeHash\":{\"name\":\"findByDeviceCodeHash\",\"async\":true,\"parameters\":[{\"name\":\"deviceCodeHash\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<UsersCliAuthRequest | null>\",\"isStatic\":false,\"isPublic\":true},\"deleteExpired\":{\"name\":\"deleteExpired\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_requests\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersCliAuthRequest\",\"exportName\":\"UsersCliAuthRequestCollection\",\"collectionExportName\":\"UsersCliAuthRequestCollectionCollection\",\"schema\":{\"tableName\":\"users_cli_auth_requests\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_cli_auth_requests\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"users_cli_auth_requests_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_cli_auth_requests_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"0e072f3a\"}},\"@happyvertical/smrt-users:GroupCollection\":{\"name\":\"groupcollection\",\"className\":\"GroupCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupCollection\",\"collection\":\"groups\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/GroupCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByTenant\":{\"name\":\"findByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Group[]>\",\"isStatic\":false,\"isPublic\":true},\"findBySlug\":{\"name\":\"findBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Group | null>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Group\",\"exportName\":\"GroupCollection\",\"collectionExportName\":\"GroupCollectionCollection\",\"schema\":{\"tableName\":\"group_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"group_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"10e23765\"}},\"@happyvertical/smrt-users:GroupMemberCollection\":{\"name\":\"groupmembercollection\",\"className\":\"GroupMemberCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupMemberCollection\",\"collection\":\"groupmembers\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/GroupMemberCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByGroup\":{\"name\":\"findByGroup\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupMember[]>\",\"isStatic\":false,\"isPublic\":true},\"findByUser\":{\"name\":\"findByUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupMember[]>\",\"isStatic\":false,\"isPublic\":true},\"isMember\":{\"name\":\"isMember\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"addMember\":{\"name\":\"addMember\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupMember>\",\"isStatic\":false,\"isPublic\":true},\"removeMember\":{\"name\":\"removeMember\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"getGroupIds\":{\"name\":\"getGroupIds\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getGroupIdsForTenant\":{\"name\":\"getGroupIdsForTenant\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getUserIds\":{\"name\":\"getUserIds\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"GroupMember\",\"exportName\":\"GroupMemberCollection\",\"collectionExportName\":\"GroupMemberCollectionCollection\",\"schema\":{\"tableName\":\"group_member_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_member_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"group_member_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_member_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"f61e9ad6\"}},\"@happyvertical/smrt-users:GroupRoleCollection\":{\"name\":\"grouprolecollection\",\"className\":\"GroupRoleCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupRoleCollection\",\"collection\":\"grouproles\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/GroupRoleCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByGroup\":{\"name\":\"findByGroup\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupRole[]>\",\"isStatic\":false,\"isPublic\":true},\"findByRole\":{\"name\":\"findByRole\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupRole[]>\",\"isStatic\":false,\"isPublic\":true},\"hasRole\":{\"name\":\"hasRole\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"addRole\":{\"name\":\"addRole\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<GroupRole>\",\"isStatic\":false,\"isPublic\":true},\"removeRole\":{\"name\":\"removeRole\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false},{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"getRoleIds\":{\"name\":\"getRoleIds\",\"async\":true,\"parameters\":[{\"name\":\"groupId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"GroupRole\",\"exportName\":\"GroupRoleCollection\",\"collectionExportName\":\"GroupRoleCollectionCollection\",\"schema\":{\"tableName\":\"group_role_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_role_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"group_role_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_role_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"33fdaf49\"}},\"@happyvertical/smrt-users:UsersMagicLinkTokenCollection\":{\"name\":\"usersmagiclinktokencollection\",\"className\":\"UsersMagicLinkTokenCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersMagicLinkTokenCollection\",\"collection\":\"usersmagiclinktokens\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/MagicLinkTokenCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByNonce\":{\"name\":\"findByNonce\",\"async\":true,\"parameters\":[{\"name\":\"nonce\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<UsersMagicLinkToken | null>\",\"isStatic\":false,\"isPublic\":true},\"markUsed\":{\"name\":\"markUsed\",\"async\":true,\"parameters\":[{\"name\":\"nonce\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"deleteExpired\":{\"name\":\"deleteExpired\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_magic_link_tokens\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersMagicLinkToken\",\"exportName\":\"UsersMagicLinkTokenCollection\",\"collectionExportName\":\"UsersMagicLinkTokenCollectionCollection\",\"schema\":{\"tableName\":\"users_magic_link_tokens\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_magic_link_tokens\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"users_magic_link_tokens_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_magic_link_tokens_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"a8c021f9\"}},\"@happyvertical/smrt-users:MembershipCollection\":{\"name\":\"membershipcollection\",\"className\":\"MembershipCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:MembershipCollection\",\"collection\":\"memberships\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/MembershipCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByUser\":{\"name\":\"findByUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findActiveByUser\":{\"name\":\"findActiveByUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findByTenant\":{\"name\":\"findByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findActiveByTenant\":{\"name\":\"findActiveByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findByUserAndTenant\":{\"name\":\"findByUserAndTenant\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership | null>\",\"isStatic\":false,\"isPublic\":true},\"findByRole\":{\"name\":\"findByRole\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true},\"findByStatus\":{\"name\":\"findByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"MembershipStatus\",\"optional\":false}],\"returnType\":\"Promise<Membership[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Membership\",\"exportName\":\"MembershipCollection\",\"collectionExportName\":\"MembershipCollectionCollection\",\"schema\":{\"tableName\":\"membership_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"membership_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"membership_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"membership_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"8a2577ba\"}},\"@happyvertical/smrt-users:MembershipOverrideCollection\":{\"name\":\"membershipoverridecollection\",\"className\":\"MembershipOverrideCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:MembershipOverrideCollection\",\"collection\":\"membershipoverrides\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/MembershipOverrideCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByMembership\":{\"name\":\"findByMembership\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findGrants\":{\"name\":\"findGrants\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findDenies\":{\"name\":\"findDenies\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"getGrantedPermissionIds\":{\"name\":\"getGrantedPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getDeniedPermissionIds\":{\"name\":\"getDeniedPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"setOverride\":{\"name\":\"setOverride\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"effect\",\"type\":\"OverrideEffect\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride>\",\"isStatic\":false,\"isPublic\":true},\"removeOverride\":{\"name\":\"removeOverride\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"grantPermission\":{\"name\":\"grantPermission\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride>\",\"isStatic\":false,\"isPublic\":true},\"denyPermission\":{\"name\":\"denyPermission\",\"async\":true,\"parameters\":[{\"name\":\"membershipId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<MembershipOverride>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"MembershipOverride\",\"exportName\":\"MembershipOverrideCollection\",\"collectionExportName\":\"MembershipOverrideCollectionCollection\",\"schema\":{\"tableName\":\"membership_override_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"membership_override_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"membership_override_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"membership_override_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"43ccd4cb\"}},\"@happyvertical/smrt-users:PermissionCollection\":{\"name\":\"permissioncollection\",\"className\":\"PermissionCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:PermissionCollection\",\"collection\":\"permissions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/PermissionCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByCategory\":{\"name\":\"findByCategory\",\"async\":true,\"parameters\":[{\"name\":\"category\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Permission[]>\",\"isStatic\":false,\"isPublic\":true},\"findBySlug\":{\"name\":\"findBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Permission | null>\",\"isStatic\":false,\"isPublic\":true},\"findByIds\":{\"name\":\"findByIds\",\"async\":true,\"parameters\":[{\"name\":\"ids\",\"type\":\"string[]\",\"optional\":false}],\"returnType\":\"Promise<Map<string, Permission>>\",\"isStatic\":false,\"isPublic\":true},\"getCategories\":{\"name\":\"getCategories\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"findOrCreate\":{\"name\":\"findOrCreate\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false},{\"name\":\"defaults\",\"type\":\"Partial<object>\",\"optional\":true}],\"returnType\":\"Promise<Permission>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Permission\",\"exportName\":\"PermissionCollection\",\"collectionExportName\":\"PermissionCollectionCollection\",\"schema\":{\"tableName\":\"permission_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"permission_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"permission_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"permission_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"fc443bec\"}},\"@happyvertical/smrt-users:RoleCollection\":{\"name\":\"rolecollection\",\"className\":\"RoleCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:RoleCollection\",\"collection\":\"roles\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/RoleCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findSystemRoles\":{\"name\":\"findSystemRoles\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<Role[]>\",\"isStatic\":false,\"isPublic\":true},\"findByTenant\":{\"name\":\"findByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Role[]>\",\"isStatic\":false,\"isPublic\":true},\"findTenantRoles\":{\"name\":\"findTenantRoles\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Role[]>\",\"isStatic\":false,\"isPublic\":true},\"findBySlug\":{\"name\":\"findBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":true}],\"returnType\":\"Promise<Role | null>\",\"isStatic\":false,\"isPublic\":true},\"seedSystemRoles\":{\"name\":\"seedSystemRoles\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"SeedSystemRolesOptions\",\"optional\":true}],\"returnType\":\"Promise<Role[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Role\",\"exportName\":\"RoleCollection\",\"collectionExportName\":\"RoleCollectionCollection\",\"schema\":{\"tableName\":\"role_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"role_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"role_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"role_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"b6b325e0\"}},\"@happyvertical/smrt-users:RolePermissionCollection\":{\"name\":\"rolepermissioncollection\",\"className\":\"RolePermissionCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:RolePermissionCollection\",\"collection\":\"rolepermissions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/RolePermissionCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByRole\":{\"name\":\"findByRole\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<RolePermission[]>\",\"isStatic\":false,\"isPublic\":true},\"findByPermission\":{\"name\":\"findByPermission\",\"async\":true,\"parameters\":[{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<RolePermission[]>\",\"isStatic\":false,\"isPublic\":true},\"hasPermission\":{\"name\":\"hasPermission\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"addPermission\":{\"name\":\"addPermission\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<RolePermission>\",\"isStatic\":false,\"isPublic\":true},\"removePermission\":{\"name\":\"removePermission\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"getPermissionIds\":{\"name\":\"getPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"roleId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"seedRolePermissions\":{\"name\":\"seedRolePermissions\",\"async\":true,\"parameters\":[{\"name\":\"matrix\",\"type\":\"RolePermissionPatternMatrix\",\"optional\":true},{\"name\":\"options\",\"type\":\"SeedRolePermissionsOptions\",\"optional\":true}],\"returnType\":\"Promise<SeedRolePermissionsResult>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"RolePermission\",\"exportName\":\"RolePermissionCollection\",\"collectionExportName\":\"RolePermissionCollectionCollection\",\"schema\":{\"tableName\":\"role_permission_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"role_permission_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"role_permission_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"role_permission_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"b4ec602b\"}},\"@happyvertical/smrt-users:SessionCollection\":{\"name\":\"sessioncollection\",\"className\":\"SessionCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:SessionCollection\",\"collection\":\"sessions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/SessionCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"createSession\":{\"name\":\"createSession\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"CreateSessionOptions\",\"optional\":false}],\"returnType\":\"Promise<Session>\",\"isStatic\":false,\"isPublic\":true},\"findValidSession\":{\"name\":\"findValidSession\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Session | null>\",\"isStatic\":false,\"isPublic\":true},\"touch\":{\"name\":\"touch\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"extendTtl\",\"type\":\"boolean\",\"optional\":true},{\"name\":\"ttl\",\"type\":\"number\",\"optional\":true}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"findByUser\":{\"name\":\"findByUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Session[]>\",\"isStatic\":false,\"isPublic\":true},\"deleteUserSessions\":{\"name\":\"deleteUserSessions\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"revokeUserSessions\":{\"name\":\"revokeUserSessions\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"revokeSession\":{\"name\":\"revokeSession\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"deleteExpired\":{\"name\":\"deleteExpired\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"countUserSessions\":{\"name\":\"countUserSessions\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"setSessionTenant\":{\"name\":\"setSessionTenant\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string | null\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"setSessionData\":{\"name\":\"setSessionData\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"value\",\"type\":\"any\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"getSessionData\":{\"name\":\"getSessionData\",\"async\":true,\"parameters\":[{\"name\":\"sessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"key\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<T | undefined>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Session\",\"exportName\":\"SessionCollection\",\"collectionExportName\":\"SessionCollectionCollection\",\"schema\":{\"tableName\":\"session_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"session_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"session_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"session_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"ec13164c\"}},\"@happyvertical/smrt-users:TenantCollection\":{\"name\":\"tenantcollection\",\"className\":\"TenantCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantCollection\",\"collection\":\"tenants\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/TenantCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByStatus\":{\"name\":\"findByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"TenantStatus\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"findActive\":{\"name\":\"findActive\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"findBySlug\":{\"name\":\"findBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant | null>\",\"isStatic\":false,\"isPublic\":true},\"findRoots\":{\"name\":\"findRoots\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"findChildren\":{\"name\":\"findChildren\",\"async\":true,\"parameters\":[{\"name\":\"parentTenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"findParent\":{\"name\":\"findParent\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant | null>\",\"isStatic\":false,\"isPublic\":true},\"getAncestors\":{\"name\":\"getAncestors\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"getAncestorsFromRoot\":{\"name\":\"getAncestorsFromRoot\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"getDescendants\":{\"name\":\"getDescendants\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"getSiblings\":{\"name\":\"getSiblings\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant[]>\",\"isStatic\":false,\"isPublic\":true},\"isAncestorOf\":{\"name\":\"isAncestorOf\",\"async\":true,\"parameters\":[{\"name\":\"potentialAncestorId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"isDescendantOf\":{\"name\":\"isDescendantOf\",\"async\":true,\"parameters\":[{\"name\":\"potentialDescendantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"createChild\":{\"name\":\"createChild\",\"async\":true,\"parameters\":[{\"name\":\"parentTenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"CreateChildTenantOptions\",\"optional\":false}],\"returnType\":\"Promise<Tenant>\",\"isStatic\":false,\"isPublic\":true},\"moveToParent\":{\"name\":\"moveToParent\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"newParentId\",\"type\":\"string | null\",\"optional\":false}],\"returnType\":\"Promise<Tenant>\",\"isStatic\":false,\"isPublic\":true},\"makeRoot\":{\"name\":\"makeRoot\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Tenant>\",\"isStatic\":false,\"isPublic\":true},\"validateHierarchy\":{\"name\":\"validateHierarchy\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getTree\":{\"name\":\"getTree\",\"async\":true,\"parameters\":[{\"name\":\"rootTenantId\",\"type\":\"string\",\"optional\":true}],\"returnType\":\"Promise<Array>\",\"isStatic\":false,\"isPublic\":true},\"create\":{\"name\":\"create\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"SmrtCreateInput<Tenant>\",\"optional\":false}],\"returnType\":\"Promise<Tenant>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Tenant\",\"exportName\":\"TenantCollection\",\"collectionExportName\":\"TenantCollectionCollection\",\"schema\":{\"tableName\":\"tenant_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"tenant_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"tenant_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"bcfa1eef\"}},\"@happyvertical/smrt-users:TenantPermissionOverrideCollection\":{\"name\":\"tenantpermissionoverridecollection\",\"className\":\"TenantPermissionOverrideCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantPermissionOverrideCollection\",\"collection\":\"tenantpermissionoverrides\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/TenantPermissionOverrideCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByTenant\":{\"name\":\"findByTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findGrants\":{\"name\":\"findGrants\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findDenies\":{\"name\":\"findDenies\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"findInherits\":{\"name\":\"findInherits\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"getGrantedPermissionIds\":{\"name\":\"getGrantedPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getDeniedPermissionIds\":{\"name\":\"getDeniedPermissionIds\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string[]>\",\"isStatic\":false,\"isPublic\":true},\"getOverridesByEffect\":{\"name\":\"getOverridesByEffect\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverrideResult>\",\"isStatic\":false,\"isPublic\":true},\"getOverridesByEffectBatch\":{\"name\":\"getOverridesByEffectBatch\",\"async\":true,\"parameters\":[{\"name\":\"tenantIds\",\"type\":\"string[]\",\"optional\":false}],\"returnType\":\"Promise<Map<string, TenantPermissionOverrideResult>>\",\"isStatic\":false,\"isPublic\":true},\"setOverride\":{\"name\":\"setOverride\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"effect\",\"type\":\"TenantPermissionEffect\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride>\",\"isStatic\":false,\"isPublic\":true},\"removeOverride\":{\"name\":\"removeOverride\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"removeAllOverrides\":{\"name\":\"removeAllOverrides\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"grantPermission\":{\"name\":\"grantPermission\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride>\",\"isStatic\":false,\"isPublic\":true},\"denyPermission\":{\"name\":\"denyPermission\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride>\",\"isStatic\":false,\"isPublic\":true},\"inheritPermission\":{\"name\":\"inheritPermission\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permissionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride>\",\"isStatic\":false,\"isPublic\":true},\"bulkSetOverrides\":{\"name\":\"bulkSetOverrides\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"overrides\",\"type\":\"Array<object>\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true},\"copyOverrides\":{\"name\":\"copyOverrides\",\"async\":true,\"parameters\":[{\"name\":\"fromTenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"toTenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantPermissionOverride[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"TenantPermissionOverride\",\"exportName\":\"TenantPermissionOverrideCollection\",\"collectionExportName\":\"TenantPermissionOverrideCollectionCollection\",\"schema\":{\"tableName\":\"tenant_permission_override_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_permission_override_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"tenant_permission_override_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"tenant_permission_override_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"e6b5a0b6\"}},\"@happyvertical/smrt-users:UserCollection\":{\"name\":\"usercollection\",\"className\":\"UserCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UserCollection\",\"collection\":\"users\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/collections/UserCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByEmail\":{\"name\":\"findByEmail\",\"async\":true,\"parameters\":[{\"name\":\"email\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<User | null>\",\"isStatic\":false,\"isPublic\":true},\"findByProfile\":{\"name\":\"findByProfile\",\"async\":true,\"parameters\":[{\"name\":\"profileId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<User | null>\",\"isStatic\":false,\"isPublic\":true},\"findByStatus\":{\"name\":\"findByStatus\",\"async\":true,\"parameters\":[{\"name\":\"status\",\"type\":\"UserStatus\",\"optional\":false}],\"returnType\":\"Promise<User[]>\",\"isStatic\":false,\"isPublic\":true},\"findActive\":{\"name\":\"findActive\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<User[]>\",\"isStatic\":false,\"isPublic\":true},\"findPending\":{\"name\":\"findPending\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<User[]>\",\"isStatic\":false,\"isPublic\":true},\"getOrCreateForProfile\":{\"name\":\"getOrCreateForProfile\",\"async\":true,\"parameters\":[{\"name\":\"profileId\",\"type\":\"string\",\"optional\":false},{\"name\":\"email\",\"type\":\"string\",\"optional\":false},{\"name\":\"defaults\",\"type\":\"Partial<object>\",\"optional\":true}],\"returnType\":\"Promise<User>\",\"isStatic\":false,\"isPublic\":true},\"getOrCreateFromOidc\":{\"name\":\"getOrCreateFromOidc\",\"async\":true,\"parameters\":[{\"name\":\"claims\",\"type\":\"OidcClaims\",\"optional\":false},{\"name\":\"provider\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"GetOrCreateFromOidcOptions\",\"optional\":true}],\"returnType\":\"Promise<OidcIdentityResult>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"User\",\"exportName\":\"UserCollection\",\"collectionExportName\":\"UserCollectionCollection\",\"schema\":{\"tableName\":\"user_collections\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"user_collections\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"}},\"indexes\":[{\"name\":\"user_collections_id_idx\",\"columns\":[\"id\"]},{\"name\":\"user_collections_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"539fdcc8\"}},\"@happyvertical/smrt-users:AccessRequest\":{\"name\":\"accessrequest\",\"className\":\"AccessRequest\",\"qualifiedName\":\"@happyvertical/smrt-users:AccessRequest\",\"collection\":\"accessrequests\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/AccessRequest.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"email\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true,\"indexed\":true}},\"name\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"indexed\":true}},\"source\":{\"type\":\"text\",\"required\":false,\"default\":\"\",\"_meta\":{\"indexed\":true}},\"requestContext\":{\"type\":\"text\",\"required\":false,\"default\":\"{}\"},\"note\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"requestedAt\":{\"type\":\"datetime\",\"required\":false},\"decidedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"decidedBy\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"resultingUserId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"tenantHint\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{\"getRequestContext\":{\"name\":\"getRequestContext\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string>\",\"isStatic\":false,\"isPublic\":true},\"setRequestContext\":{\"name\":\"setRequestContext\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string>\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getTenantHint\":{\"name\":\"getTenantHint\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string> | null\",\"isStatic\":false,\"isPublic\":true},\"setTenantHint\":{\"name\":\"setTenantHint\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string> | null\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"isOpen\":{\"name\":\"isOpen\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isApproved\":{\"name\":\"isApproved\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isTerminal\":{\"name\":\"isTerminal\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"access_requests\",\"conflictColumns\":[\"id\"],\"api\":{\"include\":[]},\"mcp\":{\"include\":[]},\"cli\":{\"include\":[]}},\"extends\":\"SmrtObject\",\"exportName\":\"AccessRequest\",\"collectionExportName\":\"AccessRequestCollection\",\"validationRules\":[{\"field\":\"email\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"schema\":{\"tableName\":\"access_requests\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"access_requests\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"email\\\" TEXT NOT NULL DEFAULT '',\\n \\\"name\\\" TEXT,\\n \\\"status\\\" TEXT,\\n \\\"source\\\" TEXT DEFAULT '',\\n \\\"request_context\\\" TEXT DEFAULT '{}',\\n \\\"note\\\" TEXT,\\n \\\"requested_at\\\" TIMESTAMP,\\n \\\"decided_at\\\" TIMESTAMP,\\n \\\"decided_by\\\" TEXT,\\n \\\"resulting_user_id\\\" TEXT,\\n \\\"tenant_hint\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"email\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false,\"default\":\"\"},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"source\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"request_context\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"{}\"},\"note\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"requested_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"decided_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"decided_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"resulting_user_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"tenant_hint\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"access_requests_id_idx\",\"columns\":[\"id\"]},{\"name\":\"access_requests_id_idx\",\"columns\":[\"id\"],\"unique\":true},{\"name\":\"access_requests_email_idx\",\"columns\":[\"email\"]},{\"name\":\"access_requests_status_idx\",\"columns\":[\"status\"]},{\"name\":\"access_requests_source_idx\",\"columns\":[\"source\"]}],\"version\":\"f396996f\"}},\"@happyvertical/smrt-users:UsersCliAuthRequest\":{\"name\":\"userscliauthrequest\",\"className\":\"UsersCliAuthRequest\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersCliAuthRequest\",\"collection\":\"userscliauthrequests\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/CliAuthRequest.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userCode\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"deviceCodeHash\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"userId\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"tenantId\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"sessionId\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"expiresAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{}},\"approvedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_requests\",\"api\":{\"include\":[]},\"cli\":{\"include\":[]},\"mcp\":{\"include\":[]}},\"extends\":\"SmrtObject\",\"exportName\":\"UsersCliAuthRequest\",\"collectionExportName\":\"UsersCliAuthRequestCollection\",\"schema\":{\"tableName\":\"users_cli_auth_requests\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_cli_auth_requests\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"user_code\\\" TEXT,\\n \\\"device_code_hash\\\" TEXT,\\n \\\"status\\\" TEXT,\\n \\\"user_id\\\" TEXT,\\n \\\"tenant_id\\\" TEXT,\\n \\\"session_id\\\" TEXT,\\n \\\"expires_at\\\" TIMESTAMP,\\n \\\"approved_at\\\" TIMESTAMP\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"user_code\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"device_code_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"user_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"tenant_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"session_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"approved_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_requests_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_cli_auth_requests_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"d994ea55\"}},\"@happyvertical/smrt-users:Group\":{\"name\":\"group\",\"className\":\"Group\",\"qualifiedName\":\"@happyvertical/smrt-users:Group\",\"collection\":\"groups\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Group.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Tenant\",\"_meta\":{\"required\":true}},\"name\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"description\":{\"type\":\"text\",\"required\":false,\"default\":\"\"}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Group\",\"collectionExportName\":\"GroupCollection\",\"validationRules\":[{\"field\":\"tenantId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"groups\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"groups\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID NOT NULL,\\n \\\"name\\\" TEXT DEFAULT '',\\n \\\"description\\\" TEXT DEFAULT ''\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"}},\"indexes\":[{\"name\":\"groups_id_idx\",\"columns\":[\"id\"]},{\"name\":\"groups_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"5a6913b2\"}},\"@happyvertical/smrt-users:GroupMember\":{\"name\":\"groupmember\",\"className\":\"GroupMember\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupMember\",\"collection\":\"groupmembers\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/GroupMember.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"groupId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Group\",\"_meta\":{\"required\":true}},\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true}}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"GroupMember\",\"collectionExportName\":\"GroupMemberCollection\",\"validationRules\":[{\"field\":\"groupId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"group_members\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_members\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"group_id\\\" UUID NOT NULL,\\n \\\"user_id\\\" UUID NOT NULL\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"group_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"group_members_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_members_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"77f49385\"}},\"@happyvertical/smrt-users:GroupRole\":{\"name\":\"grouprole\",\"className\":\"GroupRole\",\"qualifiedName\":\"@happyvertical/smrt-users:GroupRole\",\"collection\":\"grouproles\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/GroupRole.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"groupId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Group\",\"_meta\":{\"required\":true}},\"roleId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Role\",\"_meta\":{\"required\":true}}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"GroupRole\",\"collectionExportName\":\"GroupRoleCollection\",\"validationRules\":[{\"field\":\"groupId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"roleId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"group_roles\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"group_roles\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"group_id\\\" UUID NOT NULL,\\n \\\"role_id\\\" UUID NOT NULL\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"group_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"group_roles_id_idx\",\"columns\":[\"id\"]},{\"name\":\"group_roles_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"75d06c96\"}},\"@happyvertical/smrt-users:UsersMagicLinkToken\":{\"name\":\"usersmagiclinktoken\",\"className\":\"UsersMagicLinkToken\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersMagicLinkToken\",\"collection\":\"usersmagiclinktokens\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/MagicLinkToken.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"nonce\":{\"type\":\"text\",\"required\":true,\"default\":\"\",\"_meta\":{\"required\":true,\"unique\":true}},\"email\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"used\":{\"type\":\"boolean\",\"required\":false,\"default\":false},\"expiresAt\":{\"type\":\"datetime\",\"required\":false}},\"methods\":{\"isExpired\":{\"name\":\"isExpired\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isValid\":{\"name\":\"isValid\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_magic_link_tokens\",\"api\":{\"include\":[]},\"mcp\":{\"include\":[]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"UsersMagicLinkToken\",\"collectionExportName\":\"UsersMagicLinkTokenCollection\",\"validationRules\":[{\"field\":\"nonce\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"schema\":{\"tableName\":\"users_magic_link_tokens\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_magic_link_tokens\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"nonce\\\" TEXT NOT NULL UNIQUE DEFAULT '',\\n \\\"email\\\" TEXT DEFAULT '',\\n \\\"used\\\" BOOLEAN DEFAULT FALSE,\\n \\\"expires_at\\\" TIMESTAMP\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"nonce\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true,\"default\":\"\"},\"email\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"used\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_magic_link_tokens_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_magic_link_tokens_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"537853d3\"}},\"@happyvertical/smrt-users:Membership\":{\"name\":\"membership\",\"className\":\"Membership\",\"qualifiedName\":\"@happyvertical/smrt-users:Membership\",\"collection\":\"memberships\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Membership.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true}},\"tenantId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Tenant\",\"_meta\":{\"required\":true}},\"roleId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Role\",\"_meta\":{\"required\":true}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"isActive\":{\"name\":\"isActive\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isPending\":{\"name\":\"isPending\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Membership\",\"collectionExportName\":\"MembershipCollection\",\"validationRules\":[{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"tenantId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"roleId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"memberships\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"memberships\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"user_id\\\" UUID NOT NULL,\\n \\\"tenant_id\\\" UUID NOT NULL,\\n \\\"role_id\\\" UUID NOT NULL,\\n \\\"status\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"memberships_id_idx\",\"columns\":[\"id\"]},{\"name\":\"memberships_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"23fdb25d\"}},\"@happyvertical/smrt-users:MembershipOverride\":{\"name\":\"membershipoverride\",\"className\":\"MembershipOverride\",\"qualifiedName\":\"@happyvertical/smrt-users:MembershipOverride\",\"collection\":\"membershipoverrides\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/MembershipOverride.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"membershipId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Membership\",\"_meta\":{\"required\":true}},\"permissionId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Permission\",\"_meta\":{\"required\":true}},\"effect\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"isGrant\":{\"name\":\"isGrant\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isDeny\":{\"name\":\"isDeny\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"MembershipOverride\",\"collectionExportName\":\"MembershipOverrideCollection\",\"validationRules\":[{\"field\":\"membershipId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"permissionId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"membership_overrides\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"membership_overrides\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"membership_id\\\" UUID NOT NULL,\\n \\\"permission_id\\\" UUID NOT NULL,\\n \\\"effect\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"membership_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"membership_overrides_id_idx\",\"columns\":[\"id\"]},{\"name\":\"membership_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"ab60f8f9\"}},\"@happyvertical/smrt-users:Permission\":{\"name\":\"permission\",\"className\":\"Permission\",\"qualifiedName\":\"@happyvertical/smrt-users:Permission\",\"collection\":\"permissions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Permission.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"name\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"description\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"category\":{\"type\":\"text\",\"required\":false,\"default\":\"\"}},\"methods\":{\"parseSlug\":{\"name\":\"parseSlug\",\"async\":false,\"parameters\":[],\"returnType\":\"ParsedPermissionSlug\",\"isStatic\":false,\"isPublic\":true},\"getResource\":{\"name\":\"getResource\",\"async\":false,\"parameters\":[],\"returnType\":\"string\",\"isStatic\":false,\"isPublic\":true},\"getAction\":{\"name\":\"getAction\",\"async\":false,\"parameters\":[],\"returnType\":\"string\",\"isStatic\":false,\"isPublic\":true},\"isValidSlug\":{\"name\":\"isValidSlug\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Permission\",\"collectionExportName\":\"PermissionCollection\",\"schema\":{\"tableName\":\"permissions\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"permissions\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"name\\\" TEXT DEFAULT '',\\n \\\"description\\\" TEXT DEFAULT '',\\n \\\"category\\\" TEXT DEFAULT ''\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"category\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"}},\"indexes\":[{\"name\":\"permissions_id_idx\",\"columns\":[\"id\"]},{\"name\":\"permissions_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"4c81b2af\"}},\"@happyvertical/smrt-users:Role\":{\"name\":\"role\",\"className\":\"Role\",\"qualifiedName\":\"@happyvertical/smrt-users:Role\",\"collection\":\"roles\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Role.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Tenant\",\"_meta\":{\"nullable\":true}},\"name\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"description\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"isSystem\":{\"type\":\"boolean\",\"required\":false,\"default\":false}},\"methods\":{\"isSystemRole\":{\"name\":\"isSystemRole\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isTenantRole\":{\"name\":\"isTenantRole\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"canDelete\":{\"name\":\"canDelete\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"delete\":{\"name\":\"delete\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Role\",\"collectionExportName\":\"RoleCollection\",\"schema\":{\"tableName\":\"roles\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"roles\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID,\\n \\\"name\\\" TEXT DEFAULT '',\\n \\\"description\\\" TEXT DEFAULT '',\\n \\\"is_system\\\" BOOLEAN DEFAULT FALSE\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"is_system\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false}},\"indexes\":[{\"name\":\"roles_id_idx\",\"columns\":[\"id\"]},{\"name\":\"roles_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"7f823f30\"}},\"@happyvertical/smrt-users:RolePermission\":{\"name\":\"rolepermission\",\"className\":\"RolePermission\",\"qualifiedName\":\"@happyvertical/smrt-users:RolePermission\",\"collection\":\"rolepermissions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/RolePermission.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"roleId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Role\",\"_meta\":{\"required\":true}},\"permissionId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Permission\",\"_meta\":{\"required\":true}}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"RolePermission\",\"collectionExportName\":\"RolePermissionCollection\",\"validationRules\":[{\"field\":\"roleId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"permissionId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"role_permissions\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"role_permissions\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"role_id\\\" UUID NOT NULL,\\n \\\"permission_id\\\" UUID NOT NULL\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"role_permissions_id_idx\",\"columns\":[\"id\"]},{\"name\":\"role_permissions_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"453cc12c\"}},\"@happyvertical/smrt-users:Session\":{\"name\":\"session\",\"className\":\"Session\",\"qualifiedName\":\"@happyvertical/smrt-users:Session\",\"collection\":\"sessions\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Session.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"User\"},\"tenantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Tenant\",\"_meta\":{\"nullable\":true}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"expiresAt\":{\"type\":\"datetime\",\"required\":false},\"userAgent\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"ipAddress\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"lastAccessedAt\":{\"type\":\"datetime\",\"required\":false},\"data\":{\"type\":\"json\",\"required\":false,\"default\":{}}},\"methods\":{\"isValid\":{\"name\":\"isValid\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isExpired\":{\"name\":\"isExpired\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isRevoked\":{\"name\":\"isRevoked\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"touch\":{\"name\":\"touch\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"extend\":{\"name\":\"extend\",\"async\":false,\"parameters\":[{\"name\":\"ttlSeconds\",\"type\":\"number\",\"optional\":true}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"revoke\":{\"name\":\"revoke\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"setTenant\":{\"name\":\"setTenant\",\"async\":false,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string | null\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getData\":{\"name\":\"getData\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"T | undefined\",\"isStatic\":false,\"isPublic\":true},\"setData\":{\"name\":\"setData\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"value\",\"type\":\"any\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"removeData\":{\"name\":\"removeData\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"get\",\"delete\"]},\"mcp\":{\"include\":[]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Session\",\"collectionExportName\":\"SessionCollection\",\"schema\":{\"tableName\":\"sessions\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"sessions\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"user_id\\\" UUID,\\n \\\"tenant_id\\\" UUID,\\n \\\"status\\\" TEXT,\\n \\\"expires_at\\\" TIMESTAMP,\\n \\\"user_agent\\\" TEXT DEFAULT '',\\n \\\"ip_address\\\" TEXT DEFAULT '',\\n \\\"last_accessed_at\\\" TIMESTAMP,\\n \\\"data\\\" JSON DEFAULT '{}'\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"user_agent\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"ip_address\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"last_accessed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"data\":{\"type\":\"JSON\",\"notNull\":false,\"unique\":false,\"default\":{}}},\"indexes\":[{\"name\":\"sessions_id_idx\",\"columns\":[\"id\"]},{\"name\":\"sessions_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"692d8b0f\"}},\"@happyvertical/smrt-users:Tenant\":{\"name\":\"tenant\",\"className\":\"Tenant\",\"qualifiedName\":\"@happyvertical/smrt-users:Tenant\",\"collection\":\"tenants\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/Tenant.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"created_at\":{\"type\":\"datetime\",\"required\":false},\"updated_at\":{\"type\":\"datetime\",\"required\":false},\"name\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"description\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"parentTenantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Tenant\",\"_meta\":{\"nullable\":true}},\"hierarchyLevel\":{\"type\":\"integer\",\"required\":false,\"default\":0},\"hierarchyPath\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"cascadePermissions\":{\"type\":\"boolean\",\"required\":false,\"default\":true},\"inheritPermissions\":{\"type\":\"boolean\",\"required\":false,\"default\":true}},\"methods\":{\"getAiUsageSnapshot\":{\"name\":\"getAiUsageSnapshot\",\"async\":false,\"parameters\":[],\"returnType\":\"AiUsageSnapshot | undefined\",\"isStatic\":false,\"isPublic\":true},\"resetAiUsage\":{\"name\":\"resetAiUsage\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"listAiUsage\":{\"name\":\"listAiUsage\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"AiUsageListOptions\",\"optional\":true}],\"returnType\":\"Promise<SmrtAiUsageRecord[]>\",\"isStatic\":false,\"isPublic\":true},\"summarizeAiUsage\":{\"name\":\"summarizeAiUsage\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"AiUsageSummaryOptions\",\"optional\":true}],\"returnType\":\"Promise<Record<string, AiUsageStats>>\",\"isStatic\":false,\"isPublic\":true},\"destroy\":{\"name\":\"destroy\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"markAsPersisted\":{\"name\":\"markAsPersisted\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"requireInsertOnSave\":{\"name\":\"requireInsertOnSave\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"initialize\":{\"name\":\"initialize\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"loadDataFromDb\":{\"name\":\"loadDataFromDb\",\"async\":true,\"parameters\":[{\"name\":\"data\",\"type\":\"Record<string>\",\"optional\":false}],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"getFields\":{\"name\":\"getFields\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<any>\",\"isStatic\":false,\"isPublic\":true},\"toJSON\":{\"name\":\"toJSON\",\"async\":false,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"toPlainObject\":{\"name\":\"toPlainObject\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string>\",\"isStatic\":false,\"isPublic\":true},\"toPublicJSON\":{\"name\":\"toPublicJSON\",\"async\":false,\"parameters\":[{\"name\":\"options\",\"type\":\"PublicJsonOptions\",\"optional\":true}],\"returnType\":\"Record<string>\",\"isStatic\":false,\"isPublic\":true},\"getId\":{\"name\":\"getId\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"getSlug\":{\"name\":\"getSlug\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"getSavedId\":{\"name\":\"getSavedId\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"isSaved\":{\"name\":\"isSaved\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"classifyConstraintError\":{\"name\":\"classifyConstraintError\",\"async\":false,\"parameters\":[{\"name\":\"message\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"'unique' | 'not_null' | null\",\"isStatic\":true,\"isPublic\":true},\"loadFromId\":{\"name\":\"loadFromId\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"loadFromSlug\":{\"name\":\"loadFromSlug\",\"async\":true,\"parameters\":[],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"is\":{\"name\":\"is\",\"async\":true,\"parameters\":[{\"name\":\"criteria\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"AiOperationOptions\",\"optional\":true}],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"do\":{\"name\":\"do\",\"async\":true,\"parameters\":[{\"name\":\"instructions\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"AiOperationOptions\",\"optional\":true}],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"describe\":{\"name\":\"describe\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"AiOperationOptions\",\"optional\":true}],\"returnType\":\"any\",\"isStatic\":false,\"isPublic\":true},\"delete\":{\"name\":\"delete\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"isRelatedLoaded\":{\"name\":\"isRelatedLoaded\",\"async\":false,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"_setLoadedRelationship\":{\"name\":\"_setLoadedRelationship\",\"async\":false,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"value\",\"type\":\"any\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"loadRelated\":{\"name\":\"loadRelated\",\"async\":true,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"opts\",\"type\":\"LoadRelatedOptions\",\"optional\":true}],\"returnType\":\"Promise<any>\",\"isStatic\":false,\"isPublic\":true},\"loadRelatedMany\":{\"name\":\"loadRelatedMany\",\"async\":true,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"opts\",\"type\":\"LoadRelatedOptions\",\"optional\":true}],\"returnType\":\"Promise<any[]>\",\"isStatic\":false,\"isPublic\":true},\"getRelated\":{\"name\":\"getRelated\",\"async\":true,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"opts\",\"type\":\"LoadRelatedOptions\",\"optional\":true}],\"returnType\":\"Promise<any>\",\"isStatic\":false,\"isPublic\":true},\"getAvailableTools\":{\"name\":\"getAvailableTools\",\"async\":false,\"parameters\":[],\"returnType\":\"AITool[]\",\"isStatic\":false,\"isPublic\":true},\"executeToolCall\":{\"name\":\"executeToolCall\",\"async\":true,\"parameters\":[{\"name\":\"toolCall\",\"type\":\"ToolCall\",\"optional\":false}],\"returnType\":\"Promise<ToolCallResult>\",\"isStatic\":false,\"isPublic\":true},\"remember\":{\"name\":\"remember\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"recall\":{\"name\":\"recall\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise\",\"isStatic\":false,\"isPublic\":true},\"recallAll\":{\"name\":\"recallAll\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true}],\"returnType\":\"Promise<Map<string>>\",\"isStatic\":false,\"isPublic\":true},\"forget\":{\"name\":\"forget\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"forgetScope\":{\"name\":\"forgetScope\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":false}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"generateEmbeddings\":{\"name\":\"generateEmbeddings\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"GenerateEmbeddingsOptions\",\"optional\":true}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"getEmbedding\":{\"name\":\"getEmbedding\",\"async\":true,\"parameters\":[{\"name\":\"fieldName\",\"type\":\"string\",\"optional\":false},{\"name\":\"model\",\"type\":\"string\",\"optional\":true}],\"returnType\":\"Promise<number[] | null>\",\"isStatic\":false,\"isPublic\":true},\"hasStaleEmbeddings\":{\"name\":\"hasStaleEmbeddings\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"clearEmbeddings\":{\"name\":\"clearEmbeddings\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"isActive\":{\"name\":\"isActive\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isSuspended\":{\"name\":\"isSuspended\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isRoot\":{\"name\":\"isRoot\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"canCascadeToChildren\":{\"name\":\"canCascadeToChildren\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"acceptsInheritance\":{\"name\":\"acceptsInheritance\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"getAncestorIds\":{\"name\":\"getAncestorIds\",\"async\":false,\"parameters\":[],\"returnType\":\"string[]\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableStrategy\":\"sti\",\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"Tenant\",\"collectionExportName\":\"TenantCollection\",\"schema\":{\"tableName\":\"tenants\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenants\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"_meta_type\\\" TEXT NOT NULL,\\n \\\"_meta_data\\\" JSON,\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"name\\\" TEXT DEFAULT '',\\n \\\"status\\\" TEXT,\\n \\\"description\\\" TEXT DEFAULT '',\\n \\\"parent_tenant_id\\\" UUID,\\n \\\"hierarchy_level\\\" INTEGER DEFAULT 0,\\n \\\"hierarchy_path\\\" TEXT DEFAULT '',\\n \\\"cascade_permissions\\\" BOOLEAN DEFAULT TRUE,\\n \\\"inherit_permissions\\\" BOOLEAN DEFAULT TRUE\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"_meta_type\":{\"type\":\"TEXT\",\"notNull\":true},\"_meta_data\":{\"type\":\"JSON\",\"notNull\":false},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"default\":\"\"},\"status\":{\"type\":\"TEXT\",\"notNull\":false},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"default\":\"\"},\"parent_tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false},\"hierarchy_level\":{\"type\":\"INTEGER\",\"notNull\":false,\"default\":0},\"hierarchy_path\":{\"type\":\"TEXT\",\"notNull\":false,\"default\":\"\"},\"cascade_permissions\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"default\":true},\"inherit_permissions\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"default\":true}},\"indexes\":[{\"name\":\"tenants_id_idx\",\"columns\":[\"id\"]},{\"name\":\"tenants_slug_context_meta_type_idx\",\"columns\":[\"slug\",\"context\",\"_meta_type\"],\"unique\":true},{\"name\":\"tenants_meta_type_idx\",\"columns\":[\"_meta_type\"]}],\"version\":\"35dbdaec\"}},\"@happyvertical/smrt-users:TenantPermissionOverride\":{\"name\":\"tenantpermissionoverride\",\"className\":\"TenantPermissionOverride\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantPermissionOverride\",\"collection\":\"tenantpermissionoverrides\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/TenantPermissionOverride.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Tenant\",\"_meta\":{\"required\":true}},\"permissionId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Permission\",\"_meta\":{\"required\":true}},\"effect\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"isInherit\":{\"name\":\"isInherit\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isGrant\":{\"name\":\"isGrant\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isDeny\":{\"name\":\"isDeny\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"hasExplicitEffect\":{\"name\":\"hasExplicitEffect\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"TenantPermissionOverride\",\"collectionExportName\":\"TenantPermissionOverrideCollection\",\"validationRules\":[{\"field\":\"tenantId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"permissionId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"tenant_permission_overrides\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_permission_overrides\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"tenant_id\\\" UUID NOT NULL,\\n \\\"permission_id\\\" UUID NOT NULL,\\n \\\"effect\\\" TEXT\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_permission_overrides_id_idx\",\"columns\":[\"id\"]},{\"name\":\"tenant_permission_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"f3bec965\"}},\"@happyvertical/smrt-users:User\":{\"name\":\"user\",\"className\":\"User\",\"qualifiedName\":\"@happyvertical/smrt-users:User\",\"collection\":\"users\",\"filePath\":\"/home/runner/_work/smrt/smrt/packages/users/src/models/User.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"profileId\":{\"type\":\"crossPackageRef\",\"required\":false,\"related\":\"@happyvertical/smrt-profiles:Profile\"},\"email\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"lastLoginAt\":{\"type\":\"datetime\",\"required\":false}},\"methods\":{\"hasValidEmail\":{\"name\":\"hasValidEmail\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isActive\":{\"name\":\"isActive\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isSuspended\":{\"name\":\"isSuspended\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"isPending\":{\"name\":\"isPending\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"recordLogin\":{\"name\":\"recordLogin\",\"async\":false,\"parameters\":[],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true},\"extends\":\"SmrtObject\",\"exportName\":\"User\",\"collectionExportName\":\"UserCollection\",\"schema\":{\"tableName\":\"users\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users\\\" (\\n \\\"id\\\" UUID PRIMARY KEY NOT NULL,\\n \\\"slug\\\" TEXT NOT NULL,\\n \\\"context\\\" TEXT NOT NULL DEFAULT '',\\n \\\"created_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"updated_at\\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\\"profile_id\\\" UUID,\\n \\\"email\\\" TEXT DEFAULT '',\\n \\\"status\\\" TEXT,\\n \\\"last_login_at\\\" TIMESTAMP\\n);\",\"columns\":{\"id\":{\"type\":\"UUID\",\"primaryKey\":true,\"referenceKind\":\"id\",\"notNull\":true},\"slug\":{\"type\":\"TEXT\",\"notNull\":true},\"context\":{\"type\":\"TEXT\",\"notNull\":true,\"default\":\"\"},\"created_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"updated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"default\":\"current_timestamp\"},\"profile_id\":{\"type\":\"UUID\",\"referenceKind\":\"crossPackageRef\",\"notNull\":false,\"unique\":false},\"email\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_login_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_id_idx\",\"columns\":[\"id\"]},{\"name\":\"users_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true}],\"version\":\"dda929da\"}}},\"moduleType\":\"smrt\",\"smrtDependencies\":[\"@happyvertical/smrt-core\",\"@happyvertical/smrt-profiles\",\"@happyvertical/smrt-tenancy\"]}"));
20
20
  //#endregion
21
21
  //#region src/types/index.ts
22
22
  var DEFAULT_ROLE_SLUGS = {
@@ -54,12 +54,12 @@ var DEFAULT_TENANT_POLICY = {
54
54
  };
55
55
  //#endregion
56
56
  //#region src/models/User.ts
57
- var __defProp$11 = Object.defineProperty;
58
- var __getOwnPropDesc$11 = Object.getOwnPropertyDescriptor;
59
- var __decorateClass$11 = (decorators, target, key, kind) => {
60
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$11(target, key) : target;
57
+ var __defProp$12 = Object.defineProperty;
58
+ var __getOwnPropDesc$12 = Object.getOwnPropertyDescriptor;
59
+ var __decorateClass$12 = (decorators, target, key, kind) => {
60
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$12(target, key) : target;
61
61
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
62
- if (kind && result) __defProp$11(target, key, result);
62
+ if (kind && result) __defProp$12(target, key, result);
63
63
  return result;
64
64
  };
65
65
  var EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -121,21 +121,21 @@ var User = class extends SmrtObject {
121
121
  this.lastLoginAt = /* @__PURE__ */ new Date();
122
122
  }
123
123
  };
124
- __decorateClass$11([crossPackageRef("@happyvertical/smrt-profiles:Profile")], User.prototype, "profileId", 2);
125
- __decorateClass$11([field({ type: "text" })], User.prototype, "status", 2);
126
- User = __decorateClass$11([smrt({
124
+ __decorateClass$12([crossPackageRef("@happyvertical/smrt-profiles:Profile")], User.prototype, "profileId", 2);
125
+ __decorateClass$12([field({ type: "text" })], User.prototype, "status", 2);
126
+ User = __decorateClass$12([smrt({
127
127
  api: { include: ["list", "get"] },
128
128
  mcp: { include: ["list", "get"] },
129
129
  cli: true
130
130
  })], User);
131
131
  //#endregion
132
132
  //#region src/models/CliAuthRequest.ts
133
- var __defProp$10 = Object.defineProperty;
134
- var __getOwnPropDesc$10 = Object.getOwnPropertyDescriptor;
135
- var __decorateClass$10 = (decorators, target, key, kind) => {
136
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$10(target, key) : target;
133
+ var __defProp$11 = Object.defineProperty;
134
+ var __getOwnPropDesc$11 = Object.getOwnPropertyDescriptor;
135
+ var __decorateClass$11 = (decorators, target, key, kind) => {
136
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$11(target, key) : target;
137
137
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
138
- if (kind && result) __defProp$10(target, key, result);
138
+ if (kind && result) __defProp$11(target, key, result);
139
139
  return result;
140
140
  };
141
141
  var UsersCliAuthRequest = class extends SmrtObject {
@@ -148,18 +148,18 @@ var UsersCliAuthRequest = class extends SmrtObject {
148
148
  expiresAt = /* @__PURE__ */ new Date();
149
149
  approvedAt = null;
150
150
  };
151
- __decorateClass$10([field({ type: "text" })], UsersCliAuthRequest.prototype, "userCode", 2);
152
- __decorateClass$10([field({ type: "text" })], UsersCliAuthRequest.prototype, "deviceCodeHash", 2);
153
- __decorateClass$10([field({ type: "text" })], UsersCliAuthRequest.prototype, "status", 2);
154
- __decorateClass$10([field({ type: "text" })], UsersCliAuthRequest.prototype, "userId", 2);
155
- __decorateClass$10([field({ type: "text" })], UsersCliAuthRequest.prototype, "tenantId", 2);
156
- __decorateClass$10([field({ type: "text" })], UsersCliAuthRequest.prototype, "sessionId", 2);
157
- __decorateClass$10([field({ type: "datetime" })], UsersCliAuthRequest.prototype, "expiresAt", 2);
158
- __decorateClass$10([field({
151
+ __decorateClass$11([field({ type: "text" })], UsersCliAuthRequest.prototype, "userCode", 2);
152
+ __decorateClass$11([field({ type: "text" })], UsersCliAuthRequest.prototype, "deviceCodeHash", 2);
153
+ __decorateClass$11([field({ type: "text" })], UsersCliAuthRequest.prototype, "status", 2);
154
+ __decorateClass$11([field({ type: "text" })], UsersCliAuthRequest.prototype, "userId", 2);
155
+ __decorateClass$11([field({ type: "text" })], UsersCliAuthRequest.prototype, "tenantId", 2);
156
+ __decorateClass$11([field({ type: "text" })], UsersCliAuthRequest.prototype, "sessionId", 2);
157
+ __decorateClass$11([field({ type: "datetime" })], UsersCliAuthRequest.prototype, "expiresAt", 2);
158
+ __decorateClass$11([field({
159
159
  type: "datetime",
160
160
  nullable: true
161
161
  })], UsersCliAuthRequest.prototype, "approvedAt", 2);
162
- UsersCliAuthRequest = __decorateClass$10([smrt({
162
+ UsersCliAuthRequest = __decorateClass$11([smrt({
163
163
  tableName: "users_cli_auth_requests",
164
164
  api: { include: [] },
165
165
  cli: { include: [] },
@@ -207,12 +207,12 @@ var UsersCliAuthRequestCollection = class extends SmrtCollection {
207
207
  };
208
208
  //#endregion
209
209
  //#region src/models/Group.ts
210
- var __defProp$9 = Object.defineProperty;
211
- var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
212
- var __decorateClass$9 = (decorators, target, key, kind) => {
213
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
210
+ var __defProp$10 = Object.defineProperty;
211
+ var __getOwnPropDesc$10 = Object.getOwnPropertyDescriptor;
212
+ var __decorateClass$10 = (decorators, target, key, kind) => {
213
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$10(target, key) : target;
214
214
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
215
- if (kind && result) __defProp$9(target, key, result);
215
+ if (kind && result) __defProp$10(target, key, result);
216
216
  return result;
217
217
  };
218
218
  var Group = class extends SmrtObject {
@@ -232,8 +232,8 @@ var Group = class extends SmrtObject {
232
232
  if (options.description !== void 0) this.description = options.description;
233
233
  }
234
234
  };
235
- __decorateClass$9([foreignKey("Tenant", { required: true })], Group.prototype, "tenantId", 2);
236
- Group = __decorateClass$9([smrt({
235
+ __decorateClass$10([foreignKey("Tenant", { required: true })], Group.prototype, "tenantId", 2);
236
+ Group = __decorateClass$10([smrt({
237
237
  api: { include: ["list", "get"] },
238
238
  mcp: { include: ["list", "get"] },
239
239
  cli: true
@@ -267,12 +267,12 @@ var GroupCollection = class extends SmrtCollection {
267
267
  };
268
268
  //#endregion
269
269
  //#region src/models/GroupMember.ts
270
- var __defProp$8 = Object.defineProperty;
271
- var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
272
- var __decorateClass$8 = (decorators, target, key, kind) => {
273
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
270
+ var __defProp$9 = Object.defineProperty;
271
+ var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
272
+ var __decorateClass$9 = (decorators, target, key, kind) => {
273
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
274
274
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
275
- if (kind && result) __defProp$8(target, key, result);
275
+ if (kind && result) __defProp$9(target, key, result);
276
276
  return result;
277
277
  };
278
278
  var GroupMember = class extends SmrtObject {
@@ -284,9 +284,9 @@ var GroupMember = class extends SmrtObject {
284
284
  if (options.userId !== void 0) this.userId = options.userId;
285
285
  }
286
286
  };
287
- __decorateClass$8([foreignKey("Group", { required: true })], GroupMember.prototype, "groupId", 2);
288
- __decorateClass$8([foreignKey("User", { required: true })], GroupMember.prototype, "userId", 2);
289
- GroupMember = __decorateClass$8([smrt({
287
+ __decorateClass$9([foreignKey("Group", { required: true })], GroupMember.prototype, "groupId", 2);
288
+ __decorateClass$9([foreignKey("User", { required: true })], GroupMember.prototype, "userId", 2);
289
+ GroupMember = __decorateClass$9([smrt({
290
290
  api: { include: ["list", "get"] },
291
291
  mcp: { include: ["list", "get"] },
292
292
  cli: true
@@ -395,12 +395,12 @@ var GroupMemberCollection = class extends SmrtCollection {
395
395
  };
396
396
  //#endregion
397
397
  //#region src/models/GroupRole.ts
398
- var __defProp$7 = Object.defineProperty;
399
- var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
400
- var __decorateClass$7 = (decorators, target, key, kind) => {
401
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
398
+ var __defProp$8 = Object.defineProperty;
399
+ var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
400
+ var __decorateClass$8 = (decorators, target, key, kind) => {
401
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
402
402
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
403
- if (kind && result) __defProp$7(target, key, result);
403
+ if (kind && result) __defProp$8(target, key, result);
404
404
  return result;
405
405
  };
406
406
  var GroupRole = class extends SmrtObject {
@@ -412,9 +412,9 @@ var GroupRole = class extends SmrtObject {
412
412
  if (options.roleId !== void 0) this.roleId = options.roleId;
413
413
  }
414
414
  };
415
- __decorateClass$7([foreignKey("Group", { required: true })], GroupRole.prototype, "groupId", 2);
416
- __decorateClass$7([foreignKey("Role", { required: true })], GroupRole.prototype, "roleId", 2);
417
- GroupRole = __decorateClass$7([smrt({
415
+ __decorateClass$8([foreignKey("Group", { required: true })], GroupRole.prototype, "groupId", 2);
416
+ __decorateClass$8([foreignKey("Role", { required: true })], GroupRole.prototype, "roleId", 2);
417
+ GroupRole = __decorateClass$8([smrt({
418
418
  api: { include: ["list", "get"] },
419
419
  mcp: { include: ["list", "get"] },
420
420
  cli: true
@@ -490,12 +490,12 @@ var GroupRoleCollection = class extends SmrtCollection {
490
490
  };
491
491
  //#endregion
492
492
  //#region src/models/Membership.ts
493
- var __defProp$6 = Object.defineProperty;
494
- var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
495
- var __decorateClass$6 = (decorators, target, key, kind) => {
496
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
493
+ var __defProp$7 = Object.defineProperty;
494
+ var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
495
+ var __decorateClass$7 = (decorators, target, key, kind) => {
496
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
497
497
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
498
- if (kind && result) __defProp$6(target, key, result);
498
+ if (kind && result) __defProp$7(target, key, result);
499
499
  return result;
500
500
  };
501
501
  var Membership = class extends SmrtObject {
@@ -523,11 +523,11 @@ var Membership = class extends SmrtObject {
523
523
  return this.status === MembershipStatus.PENDING;
524
524
  }
525
525
  };
526
- __decorateClass$6([foreignKey("User", { required: true })], Membership.prototype, "userId", 2);
527
- __decorateClass$6([foreignKey("Tenant", { required: true })], Membership.prototype, "tenantId", 2);
528
- __decorateClass$6([foreignKey("Role", { required: true })], Membership.prototype, "roleId", 2);
529
- __decorateClass$6([field({ type: "text" })], Membership.prototype, "status", 2);
530
- Membership = __decorateClass$6([smrt({
526
+ __decorateClass$7([foreignKey("User", { required: true })], Membership.prototype, "userId", 2);
527
+ __decorateClass$7([foreignKey("Tenant", { required: true })], Membership.prototype, "tenantId", 2);
528
+ __decorateClass$7([foreignKey("Role", { required: true })], Membership.prototype, "roleId", 2);
529
+ __decorateClass$7([field({ type: "text" })], Membership.prototype, "status", 2);
530
+ Membership = __decorateClass$7([smrt({
531
531
  api: { include: ["list", "get"] },
532
532
  mcp: { include: ["list", "get"] },
533
533
  cli: true
@@ -612,12 +612,12 @@ var MembershipCollection = class extends SmrtCollection {
612
612
  };
613
613
  //#endregion
614
614
  //#region src/models/MembershipOverride.ts
615
- var __defProp$5 = Object.defineProperty;
616
- var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
617
- var __decorateClass$5 = (decorators, target, key, kind) => {
618
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$5(target, key) : target;
615
+ var __defProp$6 = Object.defineProperty;
616
+ var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
617
+ var __decorateClass$6 = (decorators, target, key, kind) => {
618
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
619
619
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
620
- if (kind && result) __defProp$5(target, key, result);
620
+ if (kind && result) __defProp$6(target, key, result);
621
621
  return result;
622
622
  };
623
623
  var MembershipOverride = class extends SmrtObject {
@@ -643,10 +643,10 @@ var MembershipOverride = class extends SmrtObject {
643
643
  return this.effect === OverrideEffect.DENY;
644
644
  }
645
645
  };
646
- __decorateClass$5([foreignKey("Membership", { required: true })], MembershipOverride.prototype, "membershipId", 2);
647
- __decorateClass$5([foreignKey("Permission", { required: true })], MembershipOverride.prototype, "permissionId", 2);
648
- __decorateClass$5([field({ type: "text" })], MembershipOverride.prototype, "effect", 2);
649
- MembershipOverride = __decorateClass$5([smrt({
646
+ __decorateClass$6([foreignKey("Membership", { required: true })], MembershipOverride.prototype, "membershipId", 2);
647
+ __decorateClass$6([foreignKey("Permission", { required: true })], MembershipOverride.prototype, "permissionId", 2);
648
+ __decorateClass$6([field({ type: "text" })], MembershipOverride.prototype, "effect", 2);
649
+ MembershipOverride = __decorateClass$6([smrt({
650
650
  api: { include: ["list", "get"] },
651
651
  mcp: { include: ["list", "get"] },
652
652
  cli: true
@@ -748,19 +748,19 @@ var MembershipOverrideCollection = class extends SmrtCollection {
748
748
  };
749
749
  //#endregion
750
750
  //#region src/models/Permission.ts
751
- var __defProp$4 = Object.defineProperty;
752
- var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
753
- var __decorateClass$4 = (decorators, target, key, kind) => {
754
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$4(target, key) : target;
751
+ var __defProp$5 = Object.defineProperty;
752
+ var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
753
+ var __decorateClass$5 = (decorators, target, key, kind) => {
754
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$5(target, key) : target;
755
755
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
756
- if (kind && result) __defProp$4(target, key, result);
756
+ if (kind && result) __defProp$5(target, key, result);
757
757
  return result;
758
758
  };
759
759
  function parsePermissionSlug(slug) {
760
760
  const parts = slug.split(".");
761
- if (parts.length === 2 && parts[0] && parts[1]) return {
761
+ if (parts.length >= 2 && parts.every(Boolean)) return {
762
762
  resource: parts[0],
763
- action: parts[1],
763
+ action: parts.slice(1).join("."),
764
764
  isValid: true
765
765
  };
766
766
  return {
@@ -819,7 +819,7 @@ var Permission = class extends SmrtObject {
819
819
  return this.parseSlug().isValid;
820
820
  }
821
821
  };
822
- Permission = __decorateClass$4([smrt({
822
+ Permission = __decorateClass$5([smrt({
823
823
  api: { include: ["list", "get"] },
824
824
  mcp: { include: ["list", "get"] },
825
825
  cli: true
@@ -883,6 +883,148 @@ var PermissionCollection = class extends SmrtCollection {
883
883
  }
884
884
  };
885
885
  //#endregion
886
+ //#region src/models/Role.ts
887
+ var __defProp$4 = Object.defineProperty;
888
+ var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
889
+ var __decorateClass$4 = (decorators, target, key, kind) => {
890
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$4(target, key) : target;
891
+ for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
892
+ if (kind && result) __defProp$4(target, key, result);
893
+ return result;
894
+ };
895
+ var Role = class extends SmrtObject {
896
+ tenantId;
897
+ /**
898
+ * Display name for the role
899
+ */
900
+ name = "";
901
+ /**
902
+ * Description of the role
903
+ */
904
+ description = "";
905
+ /**
906
+ * Whether this is a system role (cannot be deleted)
907
+ */
908
+ isSystem = false;
909
+ constructor(options = {}) {
910
+ super(options);
911
+ if (options.tenantId !== void 0) this.tenantId = options.tenantId;
912
+ if (options.name !== void 0) this.name = options.name;
913
+ if (options.description !== void 0) this.description = options.description;
914
+ if (options.isSystem !== void 0) this.isSystem = options.isSystem;
915
+ }
916
+ /**
917
+ * Check if this is a system-wide role
918
+ */
919
+ isSystemRole() {
920
+ return this.tenantId === null || this.tenantId === void 0;
921
+ }
922
+ /**
923
+ * Check if this is a tenant-specific role
924
+ */
925
+ isTenantRole() {
926
+ return this.tenantId !== null && this.tenantId !== void 0;
927
+ }
928
+ /**
929
+ * Check if this role can be deleted.
930
+ * System roles (isSystem = true) cannot be deleted.
931
+ * @returns true if the role can be deleted
932
+ */
933
+ canDelete() {
934
+ return !this.isSystem;
935
+ }
936
+ /**
937
+ * Delete guard - prevents deletion of system roles.
938
+ * Override the delete method to check isSystem flag first.
939
+ */
940
+ async delete() {
941
+ if (this.isSystem) throw new Error(`Cannot delete system role '${this.slug}'. System roles are protected.`);
942
+ return super.delete();
943
+ }
944
+ };
945
+ __decorateClass$4([foreignKey("Tenant", { nullable: true })], Role.prototype, "tenantId", 2);
946
+ Role = __decorateClass$4([smrt({
947
+ api: { include: ["list", "get"] },
948
+ mcp: { include: ["list", "get"] },
949
+ cli: true
950
+ })], Role);
951
+ //#endregion
952
+ //#region src/collections/RoleCollection.ts
953
+ var RoleCollection = class extends SmrtCollection {
954
+ static _itemClass = Role;
955
+ /**
956
+ * Find all system roles (tenantId is null)
957
+ */
958
+ async findSystemRoles() {
959
+ return await this.query(`SELECT * FROM ${this.tableName} WHERE tenant_id IS NULL ORDER BY name ASC`);
960
+ }
961
+ /**
962
+ * Find roles available for a tenant (system + tenant-specific)
963
+ */
964
+ async findByTenant(tenantId) {
965
+ return await this.query(`SELECT * FROM ${this.tableName}
966
+ WHERE tenant_id IS NULL OR tenant_id = ?
967
+ ORDER BY is_system DESC, name ASC`, [tenantId]);
968
+ }
969
+ /**
970
+ * Find tenant-specific roles only
971
+ */
972
+ async findTenantRoles(tenantId) {
973
+ return await this.list({
974
+ where: { tenantId },
975
+ orderBy: "name ASC"
976
+ });
977
+ }
978
+ /**
979
+ * Find role by slug within a tenant context
980
+ */
981
+ async findBySlug(slug, tenantId) {
982
+ if (tenantId) {
983
+ const tenantRoles = await this.list({
984
+ where: {
985
+ slug,
986
+ tenantId
987
+ },
988
+ limit: 1
989
+ });
990
+ if (tenantRoles.length > 0) return tenantRoles[0];
991
+ }
992
+ const systemRoles = await this.query(`SELECT * FROM ${this.tableName} WHERE slug = ? AND tenant_id IS NULL LIMIT 1`, [slug]);
993
+ return systemRoles.length > 0 ? systemRoles[0] : null;
994
+ }
995
+ /**
996
+ * Seed default system roles
997
+ */
998
+ async seedSystemRoles(options = {}) {
999
+ const roles = [];
1000
+ for (const roleDef of DEFAULT_ROLES) {
1001
+ const existing = await this.findBySlug(roleDef.slug);
1002
+ if (existing) {
1003
+ roles.push(existing);
1004
+ continue;
1005
+ }
1006
+ const role = await this.create({
1007
+ slug: roleDef.slug,
1008
+ name: roleDef.name,
1009
+ description: roleDef.description,
1010
+ tenantId: null,
1011
+ isSystem: true
1012
+ });
1013
+ await role.save();
1014
+ roles.push(role);
1015
+ }
1016
+ if (options.seedPermissions) {
1017
+ const { RolePermissionCollection } = await Promise.resolve().then(() => RolePermissionCollection_exports);
1018
+ await (await RolePermissionCollection.create(this.options)).seedRolePermissions(options.permissionMatrix, {
1019
+ prune: options.prune,
1020
+ syncCatalog: options.syncCatalog,
1021
+ tenantId: options.tenantId
1022
+ });
1023
+ }
1024
+ return roles;
1025
+ }
1026
+ };
1027
+ //#endregion
886
1028
  //#region src/models/RolePermission.ts
887
1029
  var __defProp$3 = Object.defineProperty;
888
1030
  var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor;
@@ -909,7 +1051,449 @@ RolePermission = __decorateClass$3([smrt({
909
1051
  cli: true
910
1052
  })], RolePermission);
911
1053
  //#endregion
1054
+ //#region src/services/PermissionCatalogService.ts
1055
+ function getRuntimePermissionRegistrations() {
1056
+ globalThis.__smrtUsersPermissionRegistrations ??= /* @__PURE__ */ new Map();
1057
+ return globalThis.__smrtUsersPermissionRegistrations;
1058
+ }
1059
+ function toSnakeCase(value) {
1060
+ return value.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/[-\s]+/g, "_").toLowerCase();
1061
+ }
1062
+ function pluralize(word) {
1063
+ if (word.endsWith("y") && !/[aeiou]y$/i.test(word)) return `${word.slice(0, -1)}ies`;
1064
+ if (word.endsWith("s") || word.endsWith("x") || word.endsWith("z") || word.endsWith("ch") || word.endsWith("sh")) return `${word}es`;
1065
+ return `${word}s`;
1066
+ }
1067
+ function deriveCollectionName(className) {
1068
+ return pluralize(toSnakeCase(className));
1069
+ }
1070
+ function humanizeResource(resource) {
1071
+ return resource.replace(/[._-]+/g, " ").replace(/\b\w/g, (char) => char.toUpperCase());
1072
+ }
1073
+ function capitalize(value) {
1074
+ return `${value[0]?.toUpperCase() ?? ""}${value.slice(1)}`;
1075
+ }
1076
+ function defaultPermissionName(slug) {
1077
+ const parsed = parsePermissionSlug(slug);
1078
+ if (!parsed.isValid) return humanizeResource(slug);
1079
+ return `${humanizeResource(parsed.action)} ${humanizeResource(parsed.resource)}`;
1080
+ }
1081
+ function defaultPermissionDescription(slug) {
1082
+ const parsed = parsePermissionSlug(slug);
1083
+ if (!parsed.isValid) return `Allows ${slug}`;
1084
+ return `Allows ${humanizeResource(parsed.action).toLowerCase()} access for ${humanizeResource(parsed.resource).toLowerCase()}`;
1085
+ }
1086
+ function normalizeOperationPermissionAction(action) {
1087
+ const trimmed = action.trim();
1088
+ const lower = trimmed.toLowerCase();
1089
+ if (lower === "list" || lower === "get") return "read";
1090
+ if (lower === "read" || lower === "create" || lower === "update" || lower === "delete") return lower;
1091
+ return trimmed;
1092
+ }
1093
+ function isConstructorLike(value) {
1094
+ return typeof value === "function";
1095
+ }
1096
+ function isCollectionLike(value) {
1097
+ return typeof value === "object" && value !== null && typeof value.getItemClass === "function";
1098
+ }
1099
+ function resolveConstructor(value) {
1100
+ if (isConstructorLike(value)) return value;
1101
+ if (isCollectionLike(value)) return value.getItemClass?.();
1102
+ if (typeof value === "object" && value !== null) {
1103
+ const ctor = value.constructor;
1104
+ if (typeof ctor === "function" && ctor.name && ctor.name !== "Object") return ctor;
1105
+ }
1106
+ }
1107
+ function deriveOperationPermissionCollectionName(input) {
1108
+ if (typeof input === "string") {
1109
+ const collection = input.trim();
1110
+ if (!collection) throw new Error("Operation permission collection must not be empty.");
1111
+ return collection;
1112
+ }
1113
+ const ctor = resolveConstructor(input);
1114
+ if (!ctor?.name) throw new Error("Operation permission collection must be a collection slug, model class, model instance, or collection instance.");
1115
+ const registered = ObjectRegistry.getClassByConstructor(ctor) ?? ObjectRegistry.getClass(ctor.name);
1116
+ const configuredCollection = registered?.config?.collection;
1117
+ if (typeof configuredCollection === "string" && configuredCollection) return configuredCollection;
1118
+ if (registered?.collection) return registered.collection;
1119
+ return deriveCollectionName(registered?.name ?? ctor.name);
1120
+ }
1121
+ function deriveOperationPermissionSlug(collection, action) {
1122
+ const collectionName = deriveOperationPermissionCollectionName(collection);
1123
+ const normalizedAction = normalizeOperationPermissionAction(action);
1124
+ if (!normalizedAction) throw new Error("Operation permission action must not be empty.");
1125
+ return `${collectionName}.${normalizedAction}`;
1126
+ }
1127
+ function isCollectionManifestEntry(objectDef) {
1128
+ return objectDef?.extends === "SmrtCollection" || objectDef?.extendsTypeArg !== void 0;
1129
+ }
1130
+ function isMethodEntryTuple(method) {
1131
+ return Array.isArray(method);
1132
+ }
1133
+ function normalizeMethodCandidate(method) {
1134
+ if (isMethodEntryTuple(method)) {
1135
+ const [name, definition] = method;
1136
+ return {
1137
+ ...definition,
1138
+ name: definition.name ?? name
1139
+ };
1140
+ }
1141
+ return method;
1142
+ }
1143
+ function getPublicCustomMethodNames(methodEntries, standardActions) {
1144
+ return Array.from(new Set(methodEntries.flatMap((method) => {
1145
+ const { isPublic, name } = normalizeMethodCandidate(method);
1146
+ if (!name || isPublic !== true || standardActions.includes(name)) return [];
1147
+ return [name];
1148
+ })));
1149
+ }
1150
+ function getCustomMethodExposureNames(config, availableCustomMethods) {
1151
+ if (!config || config === false) return /* @__PURE__ */ new Set();
1152
+ if (config === true || typeof config !== "object") return new Set(availableCustomMethods);
1153
+ const rawInclude = config.include;
1154
+ const include = Array.isArray(rawInclude) ? [...rawInclude] : void 0;
1155
+ const rawExclude = config.exclude;
1156
+ const exclude = Array.isArray(rawExclude) ? [...rawExclude] : [];
1157
+ if (!include) return new Set(availableCustomMethods.filter((methodName) => !exclude.includes(methodName)));
1158
+ const baseMethods = include.filter((methodName) => availableCustomMethods.includes(methodName));
1159
+ return new Set(baseMethods.filter((methodName) => !exclude.includes(methodName)));
1160
+ }
1161
+ function isOperationEnabled(config, action) {
1162
+ if (config === false) return false;
1163
+ if (config && typeof config === "object") {
1164
+ const include = Array.isArray(config.include) ? config.include : void 0;
1165
+ const rawExclude = config.exclude;
1166
+ const exclude = Array.isArray(rawExclude) ? [...rawExclude] : [];
1167
+ if (include && !include.includes(action)) return false;
1168
+ if (exclude.includes(action)) return false;
1169
+ }
1170
+ return true;
1171
+ }
1172
+ function normalizePostgresAction(action) {
1173
+ const normalized = action.toUpperCase();
1174
+ if (normalized === "SELECT" || normalized === "INSERT" || normalized === "UPDATE" || normalized === "DELETE") return normalized;
1175
+ throw new Error(`Unsupported Postgres permission action '${action}'. Expected SELECT, INSERT, UPDATE, or DELETE.`);
1176
+ }
1177
+ function normalizeBinding(binding, fallbackPermission) {
1178
+ return {
1179
+ action: normalizePostgresAction(binding.action),
1180
+ permission: binding.permission || fallbackPermission,
1181
+ schemaName: binding.schemaName,
1182
+ tableName: binding.tableName,
1183
+ tenantField: binding.tenantField
1184
+ };
1185
+ }
1186
+ function mergeStringField(fieldName, existing, incoming, slug) {
1187
+ const existingValue = existing[fieldName];
1188
+ const incomingValue = incoming[fieldName];
1189
+ if (!incomingValue) return;
1190
+ if (!existingValue) {
1191
+ existing[fieldName] = incomingValue;
1192
+ return;
1193
+ }
1194
+ if (existingValue !== incomingValue) throw new Error(`Conflicting permission metadata for '${slug}' field '${fieldName}': '${existingValue}' !== '${incomingValue}'`);
1195
+ }
1196
+ function mergeBindings(existing, incoming) {
1197
+ const existingBindings = existing.postgres?.bindings ?? [];
1198
+ const incomingBindings = incoming.postgres?.bindings ?? [];
1199
+ if (incomingBindings.length === 0) return;
1200
+ const seen = new Set(existingBindings.map((binding) => [
1201
+ binding.permission,
1202
+ binding.action,
1203
+ binding.schemaName ?? "",
1204
+ binding.tableName,
1205
+ binding.tenantField ?? ""
1206
+ ].join("|")));
1207
+ const mergedBindings = [...existingBindings];
1208
+ for (const binding of incomingBindings) {
1209
+ const normalized = normalizeBinding(binding, incoming.slug);
1210
+ const key = [
1211
+ normalized.permission,
1212
+ normalized.action,
1213
+ normalized.schemaName ?? "",
1214
+ normalized.tableName,
1215
+ normalized.tenantField ?? ""
1216
+ ].join("|");
1217
+ if (!seen.has(key)) {
1218
+ seen.add(key);
1219
+ mergedBindings.push(normalized);
1220
+ }
1221
+ }
1222
+ existing.postgres = { bindings: mergedBindings };
1223
+ }
1224
+ function normalizeDefinition(definition, source) {
1225
+ if (!definition.slug || !isValidPermissionSlug(definition.slug.trim())) throw new Error(`Invalid permission slug '${definition.slug}'. Expected 'resource.action[.scope...]'.`);
1226
+ const slug = definition.slug.trim();
1227
+ return {
1228
+ category: definition.category ?? parsePermissionSlug(slug).resource,
1229
+ className: definition.className,
1230
+ collection: definition.collection,
1231
+ description: definition.description ?? defaultPermissionDescription(slug),
1232
+ name: definition.name ?? defaultPermissionName(slug),
1233
+ postgres: definition.postgres?.bindings ? { bindings: definition.postgres.bindings.map((binding) => normalizeBinding(binding, slug)) } : void 0,
1234
+ qualifiedName: definition.qualifiedName,
1235
+ slug,
1236
+ source
1237
+ };
1238
+ }
1239
+ function mergeDefinitionSet(current, incomingDefinitions, source) {
1240
+ for (const rawDefinition of incomingDefinitions) {
1241
+ const definition = normalizeDefinition(rawDefinition, source);
1242
+ const existing = current.get(definition.slug);
1243
+ if (!existing) {
1244
+ current.set(definition.slug, definition);
1245
+ continue;
1246
+ }
1247
+ mergeStringField("category", existing, definition, definition.slug);
1248
+ mergeStringField("className", existing, definition, definition.slug);
1249
+ mergeStringField("collection", existing, definition, definition.slug);
1250
+ mergeStringField("description", existing, definition, definition.slug);
1251
+ mergeStringField("name", existing, definition, definition.slug);
1252
+ mergeStringField("qualifiedName", existing, definition, definition.slug);
1253
+ mergeBindings(existing, definition);
1254
+ }
1255
+ }
1256
+ function registerPermissionDefinitions(definitions) {
1257
+ globalThis.__smrtUsersPermissionRegistrationCounter = (globalThis.__smrtUsersPermissionRegistrationCounter ?? 0) + 1;
1258
+ const registrationId = globalThis.__smrtUsersPermissionRegistrationCounter;
1259
+ getRuntimePermissionRegistrations().set(registrationId, definitions);
1260
+ return () => {
1261
+ getRuntimePermissionRegistrations().delete(registrationId);
1262
+ };
1263
+ }
1264
+ var PermissionCatalogService = class PermissionCatalogService {
1265
+ constructor(options = {}) {
1266
+ this.options = options;
1267
+ }
1268
+ options;
1269
+ getUsersConfig() {
1270
+ return getPackageConfig("users", {});
1271
+ }
1272
+ getRuntimePermissionDefinitions() {
1273
+ return Array.from(getRuntimePermissionRegistrations().values()).flat();
1274
+ }
1275
+ getCustomPermissionDefinitions() {
1276
+ return this.getUsersConfig().permissions?.custom ?? [];
1277
+ }
1278
+ getCatalog() {
1279
+ const manifestPermissions = this.getManifestPermissionDefinitions();
1280
+ const customPermissions = this.getCustomPermissionDefinitions();
1281
+ const runtimePermissions = this.getRuntimePermissionDefinitions();
1282
+ const merged = /* @__PURE__ */ new Map();
1283
+ mergeDefinitionSet(merged, manifestPermissions, "manifest");
1284
+ mergeDefinitionSet(merged, customPermissions, "config");
1285
+ mergeDefinitionSet(merged, runtimePermissions, "runtime");
1286
+ return {
1287
+ customPermissions: customPermissions.map((definition) => normalizeDefinition(definition, "config")),
1288
+ manifestPermissions: manifestPermissions.map((definition) => normalizeDefinition(definition, "manifest")),
1289
+ permissions: Array.from(merged.values()).sort((left, right) => left.slug.localeCompare(right.slug)),
1290
+ runtimePermissions: runtimePermissions.map((definition) => normalizeDefinition(definition, "runtime"))
1291
+ };
1292
+ }
1293
+ deriveOperationPermissionSlug(collection, action) {
1294
+ return deriveOperationPermissionSlug(collection, action);
1295
+ }
1296
+ hasPermissionSlug(slug) {
1297
+ return this.getCatalog().permissions.some((permission) => permission.slug === slug);
1298
+ }
1299
+ async syncPermissionCatalog() {
1300
+ const catalog = this.getCatalog();
1301
+ const permissions = await PermissionCollection.create(this.options);
1302
+ const created = [];
1303
+ const unchanged = [];
1304
+ const updated = [];
1305
+ for (const definition of catalog.permissions) {
1306
+ const existing = await permissions.findBySlug(definition.slug);
1307
+ if (!existing) {
1308
+ await (await permissions.create({
1309
+ category: definition.category ?? parsePermissionSlug(definition.slug).resource,
1310
+ description: definition.description ?? "",
1311
+ name: definition.name ?? definition.slug,
1312
+ slug: definition.slug
1313
+ })).save();
1314
+ created.push(definition.slug);
1315
+ continue;
1316
+ }
1317
+ const nextName = definition.name ?? existing.name;
1318
+ const nextDescription = definition.description ?? existing.description;
1319
+ const nextCategory = definition.category ?? existing.category;
1320
+ if (existing.name === nextName && existing.description === nextDescription && existing.category === nextCategory) {
1321
+ unchanged.push(definition.slug);
1322
+ continue;
1323
+ }
1324
+ existing.name = nextName;
1325
+ existing.description = nextDescription;
1326
+ existing.category = nextCategory;
1327
+ await existing.save();
1328
+ updated.push(definition.slug);
1329
+ }
1330
+ return {
1331
+ catalog,
1332
+ created,
1333
+ unchanged,
1334
+ updated
1335
+ };
1336
+ }
1337
+ getManifestPermissionDefinitions() {
1338
+ const standardActions = [
1339
+ "list",
1340
+ "get",
1341
+ "create",
1342
+ "update",
1343
+ "delete"
1344
+ ];
1345
+ const definitions = /* @__PURE__ */ new Map();
1346
+ for (const metadata of ObjectRegistry.getAllObjectMetadata()) {
1347
+ const registered = ObjectRegistry.getClassByConstructor(metadata.constructor) ?? ObjectRegistry.getClass(metadata.name);
1348
+ const manifestEntry = registered?.qualifiedName ? findManifestEntryByQualifiedName(registered.qualifiedName) : void 0;
1349
+ if (isCollectionManifestEntry(manifestEntry)) continue;
1350
+ const className = metadata.name;
1351
+ const qualifiedName = registered?.qualifiedName;
1352
+ const objectConfig = manifestEntry?.decoratorConfig ?? metadata.config;
1353
+ const rawCollection = objectConfig?.collection;
1354
+ const collection = (typeof rawCollection === "string" && rawCollection.length > 0 ? rawCollection : void 0) ?? manifestEntry?.collection ?? deriveCollectionName(metadata.name);
1355
+ if (isOperationEnabled(objectConfig.api, "list") || isOperationEnabled(objectConfig.api, "get") || isOperationEnabled(objectConfig.cli, "list") || isOperationEnabled(objectConfig.cli, "get") || isOperationEnabled(objectConfig.mcp, "list") || isOperationEnabled(objectConfig.mcp, "get")) definitions.set(`${collection}.read`, {
1356
+ className,
1357
+ collection,
1358
+ qualifiedName,
1359
+ slug: `${collection}.read`
1360
+ });
1361
+ const fieldEntries = manifestEntry?.fields ? Object.entries(manifestEntry.fields) : Array.from((registered?.inheritedFields ?? metadata.fields).entries());
1362
+ for (const [fieldName, fieldDef] of fieldEntries) {
1363
+ const field = fieldDef;
1364
+ const readPermission = typeof field.readPermission === "string" ? field.readPermission : typeof field._meta?.readPermission === "string" ? field._meta.readPermission : void 0;
1365
+ if (!readPermission || definitions.has(readPermission)) continue;
1366
+ definitions.set(readPermission, {
1367
+ className,
1368
+ collection,
1369
+ description: `Allows reading ${fieldName} on ${humanizeResource(collection).toLowerCase()}`,
1370
+ name: `Read ${humanizeResource(fieldName)} on ${humanizeResource(collection)}`,
1371
+ qualifiedName,
1372
+ slug: readPermission
1373
+ });
1374
+ }
1375
+ for (const action of [
1376
+ "create",
1377
+ "update",
1378
+ "delete"
1379
+ ]) {
1380
+ if (!(isOperationEnabled(objectConfig.api, action) || isOperationEnabled(objectConfig.cli, action) || isOperationEnabled(objectConfig.mcp, action))) continue;
1381
+ definitions.set(`${collection}.${action}`, {
1382
+ className,
1383
+ collection,
1384
+ qualifiedName,
1385
+ slug: `${collection}.${action}`
1386
+ });
1387
+ }
1388
+ const publicCustomMethodNames = getPublicCustomMethodNames(manifestEntry?.methods ? Object.values(manifestEntry.methods) : Array.from(metadata.methods.entries()), standardActions);
1389
+ const customApiMethods = /* @__PURE__ */ new Set();
1390
+ const customCliMethods = getCustomMethodExposureNames(objectConfig.cli, publicCustomMethodNames);
1391
+ const customMcpMethods = getCustomMethodExposureNames(objectConfig.mcp, publicCustomMethodNames);
1392
+ for (const methodName of publicCustomMethodNames) if (isOperationEnabled(objectConfig.api, methodName)) customApiMethods.add(methodName);
1393
+ const customMethods = /* @__PURE__ */ new Set([
1394
+ ...customApiMethods,
1395
+ ...customCliMethods,
1396
+ ...customMcpMethods
1397
+ ]);
1398
+ for (const methodName of customMethods) definitions.set(`${collection}.${methodName}`, {
1399
+ className,
1400
+ collection,
1401
+ description: `Allows ${methodName} on ${humanizeResource(collection).toLowerCase()}`,
1402
+ name: `${capitalize(methodName)} ${humanizeResource(collection)}`,
1403
+ qualifiedName,
1404
+ slug: `${collection}.${methodName}`
1405
+ });
1406
+ }
1407
+ return Array.from(definitions.values()).sort((left, right) => left.slug.localeCompare(right.slug));
1408
+ }
1409
+ static create(options = {}) {
1410
+ return new PermissionCatalogService(options);
1411
+ }
1412
+ };
1413
+ async function syncPermissionCatalog(options = {}) {
1414
+ return PermissionCatalogService.create(options).syncPermissionCatalog();
1415
+ }
1416
+ //#endregion
912
1417
  //#region src/collections/RolePermissionCollection.ts
1418
+ var RolePermissionCollection_exports = /* @__PURE__ */ __exportAll({
1419
+ DEFAULT_ROLE_PERMISSION_PATTERNS: () => DEFAULT_ROLE_PERMISSION_PATTERNS,
1420
+ RolePermissionCollection: () => RolePermissionCollection
1421
+ });
1422
+ var DEFAULT_ROLE_PERMISSION_PATTERNS = {
1423
+ [DEFAULT_ROLE_SLUGS.OWNER]: ["*"],
1424
+ [DEFAULT_ROLE_SLUGS.ADMIN]: ["*"],
1425
+ [DEFAULT_ROLE_SLUGS.MEMBER]: [
1426
+ "*.read",
1427
+ "*.list",
1428
+ "*.get",
1429
+ "*.create"
1430
+ ],
1431
+ [DEFAULT_ROLE_SLUGS.VIEWER]: [
1432
+ "*.read",
1433
+ "*.list",
1434
+ "*.get"
1435
+ ]
1436
+ };
1437
+ var DEFAULT_MEMBER_CREATE_DENIED_RESOURCES = /* @__PURE__ */ new Set([
1438
+ "group_members",
1439
+ "groupmembers",
1440
+ "group_roles",
1441
+ "grouproles",
1442
+ "groups",
1443
+ "membership_overrides",
1444
+ "membershipoverrides",
1445
+ "memberships",
1446
+ "permissions",
1447
+ "role_permissions",
1448
+ "rolepermissions",
1449
+ "roles",
1450
+ "sessions",
1451
+ "tenant_permission_overrides",
1452
+ "tenantpermissionoverrides",
1453
+ "tenants",
1454
+ "users",
1455
+ "users_magic_link_tokens",
1456
+ "usersmagiclinktokens"
1457
+ ]);
1458
+ function escapeRegExp(value) {
1459
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1460
+ }
1461
+ function normalizePattern(pattern) {
1462
+ const trimmed = pattern.trim();
1463
+ if (trimmed === "*" || !trimmed.includes(".")) return trimmed;
1464
+ const [resource, action, ...rest] = trimmed.split(".");
1465
+ if (!resource || !action || rest.length > 0) return trimmed;
1466
+ return `${resource}.${normalizeOperationPermissionAction(action)}`;
1467
+ }
1468
+ function matchesPattern(slug, pattern) {
1469
+ if (pattern === "*") return true;
1470
+ return new RegExp(`^${escapeRegExp(pattern).replaceAll("\\*", ".*")}$`).test(slug);
1471
+ }
1472
+ function shouldSeedDefaultRolePermission(roleSlug, permissionSlug) {
1473
+ if (roleSlug !== DEFAULT_ROLE_SLUGS.MEMBER) return true;
1474
+ const [resource, action, ...rest] = permissionSlug.split(".");
1475
+ if (!resource || !action || rest.length > 0) return true;
1476
+ return action !== "create" || !DEFAULT_MEMBER_CREATE_DENIED_RESOURCES.has(resource);
1477
+ }
1478
+ function emptyResult() {
1479
+ return {
1480
+ added: {},
1481
+ matched: {},
1482
+ missingPermissions: {},
1483
+ missingRoles: [],
1484
+ removed: {},
1485
+ unchanged: {},
1486
+ unmatchedPatterns: {}
1487
+ };
1488
+ }
1489
+ function ensureResultSlot(result, roleSlug) {
1490
+ result.added[roleSlug] ??= [];
1491
+ result.matched[roleSlug] ??= [];
1492
+ result.missingPermissions[roleSlug] ??= [];
1493
+ result.removed[roleSlug] ??= [];
1494
+ result.unchanged[roleSlug] ??= [];
1495
+ result.unmatchedPatterns[roleSlug] ??= [];
1496
+ }
913
1497
  var RolePermissionCollection = class extends SmrtCollection {
914
1498
  static _itemClass = RolePermission;
915
1499
  /**
@@ -976,6 +1560,68 @@ var RolePermissionCollection = class extends SmrtCollection {
976
1560
  async getPermissionIds(roleId) {
977
1561
  return (await this.findByRole(roleId)).map((rp) => rp.permissionId);
978
1562
  }
1563
+ /**
1564
+ * Seed role-to-permission mappings from catalog-aware glob patterns.
1565
+ *
1566
+ * Defaults to the system owner/admin/member/viewer matrix. Re-running is
1567
+ * idempotent: existing mappings are reported as `unchanged`, new catalog
1568
+ * slugs are added, and stale mappings are only removed when `prune` is true.
1569
+ */
1570
+ async seedRolePermissions(matrix = DEFAULT_ROLE_PERMISSION_PATTERNS, options = {}) {
1571
+ const result = emptyResult();
1572
+ const catalogService = PermissionCatalogService.create(this.options);
1573
+ const syncResult = options.syncCatalog === false ? void 0 : await catalogService.syncPermissionCatalog();
1574
+ const catalog = options.catalog ?? syncResult?.catalog ?? catalogService.getCatalog();
1575
+ const permissions = await PermissionCollection.create(this.options);
1576
+ const roles = await RoleCollection.create(this.options);
1577
+ const catalogSlugs = catalog.permissions.map((permission) => permission.slug);
1578
+ const permissionIdBySlug = /* @__PURE__ */ new Map();
1579
+ for (const permission of await permissions.list({})) if (typeof permission.id === "string" && typeof permission.slug === "string" && permission.slug.length > 0) permissionIdBySlug.set(permission.slug, permission.id);
1580
+ for (const [roleSlug, rawPatterns] of Object.entries(matrix)) {
1581
+ ensureResultSlot(result, roleSlug);
1582
+ const role = await roles.findBySlug(roleSlug, options.tenantId);
1583
+ if (!role?.id) {
1584
+ result.missingRoles.push(roleSlug);
1585
+ continue;
1586
+ }
1587
+ const patterns = (rawPatterns ?? []).map(normalizePattern);
1588
+ const matchedSlugs = /* @__PURE__ */ new Set();
1589
+ for (const pattern of patterns) {
1590
+ const matches = catalogSlugs.filter((slug) => matchesPattern(slug, pattern));
1591
+ if (matches.length === 0) result.unmatchedPatterns[roleSlug].push(pattern);
1592
+ for (const slug of matches) {
1593
+ if (!shouldSeedDefaultRolePermission(roleSlug, slug)) continue;
1594
+ matchedSlugs.add(slug);
1595
+ }
1596
+ }
1597
+ const sortedMatchedSlugs = Array.from(matchedSlugs).sort();
1598
+ result.matched[roleSlug].push(...sortedMatchedSlugs);
1599
+ const existingPermissionIds = new Set(await this.getPermissionIds(role.id));
1600
+ const targetPermissionIds = /* @__PURE__ */ new Set();
1601
+ for (const slug of sortedMatchedSlugs) {
1602
+ const permissionId = permissionIdBySlug.get(slug);
1603
+ if (!permissionId) {
1604
+ result.missingPermissions[roleSlug].push(slug);
1605
+ continue;
1606
+ }
1607
+ targetPermissionIds.add(permissionId);
1608
+ if (existingPermissionIds.has(permissionId)) {
1609
+ result.unchanged[roleSlug].push(slug);
1610
+ continue;
1611
+ }
1612
+ await this.addPermission(role.id, permissionId);
1613
+ result.added[roleSlug].push(slug);
1614
+ }
1615
+ if (!options.prune) continue;
1616
+ const existingPermissions = await permissions.findByIds(Array.from(existingPermissionIds));
1617
+ for (const permissionId of existingPermissionIds) {
1618
+ if (targetPermissionIds.has(permissionId)) continue;
1619
+ await this.removePermission(role.id, permissionId);
1620
+ result.removed[roleSlug].push(existingPermissions.get(permissionId)?.slug ?? permissionId);
1621
+ }
1622
+ }
1623
+ return result;
1624
+ }
979
1625
  };
980
1626
  //#endregion
981
1627
  //#region src/models/Session.ts
@@ -1425,7 +2071,7 @@ var TenantCollection = class extends SmrtCollection {
1425
2071
  */
1426
2072
  async findParent(tenantId) {
1427
2073
  const tenant = await this.get({ id: tenantId });
1428
- if (!tenant || !tenant.parentTenantId) return null;
2074
+ if (!tenant?.parentTenantId) return null;
1429
2075
  return await this.get({ id: tenant.parentTenantId });
1430
2076
  }
1431
2077
  /**
@@ -1459,7 +2105,7 @@ var TenantCollection = class extends SmrtCollection {
1459
2105
  */
1460
2106
  async getDescendants(tenantId) {
1461
2107
  const tenant = await this.get({ id: tenantId });
1462
- if (!tenant || !tenant.id) return [];
2108
+ if (!tenant?.id) return [];
1463
2109
  const pathPrefix = tenant.hierarchyPath ? `${tenant.hierarchyPath}/${tenant.id}` : tenant.id;
1464
2110
  return (await this.list({ where: { "hierarchyPath like": `${pathPrefix}%` } })).filter((t) => t.hierarchyPath === pathPrefix || t.hierarchyPath?.startsWith(`${pathPrefix}/`));
1465
2111
  }
@@ -1518,7 +2164,7 @@ var TenantCollection = class extends SmrtCollection {
1518
2164
  */
1519
2165
  async moveToParent(tenantId, newParentId) {
1520
2166
  const tenant = await this.get({ id: tenantId });
1521
- if (!tenant || !tenant.id) throw new TenantHierarchyError(`Tenant not found: ${tenantId}`, "INVALID_OPERATION");
2167
+ if (!tenant?.id) throw new TenantHierarchyError(`Tenant not found: ${tenantId}`, "INVALID_OPERATION");
1522
2168
  if (newParentId === tenantId) throw new TenantHierarchyError("Cannot move tenant to itself", "CIRCULAR_REFERENCE");
1523
2169
  if (newParentId) {
1524
2170
  if (await this.isDescendantOf(newParentId, tenantId)) throw new TenantHierarchyError("Cannot move tenant to one of its descendants", "CIRCULAR_REFERENCE");
@@ -3910,7 +4556,7 @@ var PermissionResolver = class PermissionResolver {
3910
4556
  deniedPermissionIds: []
3911
4557
  };
3912
4558
  const membership = options.membership === void 0 ? await this.membershipCollection.findByUserAndTenant(userId, tenantId) : options.membership;
3913
- if (!membership || !membership.isActive()) return result;
4559
+ if (!membership?.isActive()) return result;
3914
4560
  if (membership.userId !== userId || membership.tenantId !== tenantId) return result;
3915
4561
  result.membershipId = membership.id ?? null;
3916
4562
  result.roleId = membership.roleId ?? null;
@@ -4044,7 +4690,7 @@ var SessionService = class SessionService {
4044
4690
  const session = await this.sessionCollection.findValidSession(sessionId);
4045
4691
  if (!session) return null;
4046
4692
  const user = await this.userCollection.get(session.userId);
4047
- if (!user || !user.isActive()) return null;
4693
+ if (!user?.isActive()) return null;
4048
4694
  let permissions = [];
4049
4695
  let membership = null;
4050
4696
  if (session.tenantId) {
@@ -4131,8 +4777,7 @@ var SessionService = class SessionService {
4131
4777
  rotated: false
4132
4778
  };
4133
4779
  }
4134
- const membership = await this.membershipCollection.findByUserAndTenant(session.userId, tenantId);
4135
- if (!membership || !membership.isActive()) return failClosed;
4780
+ if (!(await this.membershipCollection.findByUserAndTenant(session.userId, tenantId))?.isActive()) return failClosed;
4136
4781
  await this.sessionCollection.revokeSession(sessionId);
4137
4782
  const rotated = await this.sessionCollection.createSession({
4138
4783
  userId: session.userId,
@@ -4526,6 +5171,6 @@ var TerminalAuthRateLimitError = class extends TerminalAuthError {
4526
5171
  }
4527
5172
  };
4528
5173
  //#endregion
4529
- export { DEFAULT_ROLE_SLUGS as $, RolePermissionCollection as A, GroupRoleCollection as B, TenantHierarchyError as C, DEFAULT_SESSION_TTL as D, SessionCollection as E, parsePermissionSlug as F, Group as G, GroupMemberCollection as H, MembershipOverrideCollection as I, User as J, UsersCliAuthRequestCollection as K, MembershipOverride as L, PermissionCollection as M, Permission as N, Session as O, isValidPermissionSlug as P, DEFAULT_ROLES as Q, MembershipCollection as R, TenantCollection as S, Tenant as T, GroupMember as U, GroupRole as V, GroupCollection as W, normalizeEmail as X, isValidEmail as Y, AccessRequestStatus as Z, resolveOidcProviderConfig as _, TerminalAuthRateLimitError as a, TenantStatus as at, TenantPermissionOverrideCollection as b, getRequestScopedDatabase as c, PermissionResolver as d, DEFAULT_TENANT_POLICY as et, OidcLoginError as f, getUsersOidcConfig as g, encodeOidcTransaction as h, TerminalAuthError as i, TenantPermissionEffect as it, RolePermission as j, generateSessionId as k, withSessionPermissionContext as l, decodeOidcTransaction as m, DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS as n, OverrideEffect as nt, TerminalAuthService as o, UserStatus as ot, OidcLoginService as p, UsersCliAuthRequest as q, DEFAULT_CLI_SESSION_TTL_SECONDS as r, SessionStatus as rt, getCurrentSessionPermissionContext as s, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS as t, MembershipStatus as tt, SessionService as u, webapi_exports as v, MAX_TENANT_HIERARCHY_DEPTH as w, TenantPermissionOverride as x, UserCollection as y, Membership as z };
5174
+ export { UsersCliAuthRequestCollection as $, DEFAULT_ROLE_PERMISSION_PATTERNS as A, Role as B, TenantHierarchyError as C, DEFAULT_SESSION_TTL as D, SessionCollection as E, normalizeOperationPermissionAction as F, MembershipCollection as G, Permission as H, registerPermissionDefinitions as I, GroupRole as J, Membership as K, syncPermissionCatalog as L, PermissionCatalogService as M, deriveOperationPermissionCollectionName as N, Session as O, deriveOperationPermissionSlug as P, Group as Q, RolePermission as R, TenantCollection as S, Tenant as T, MembershipOverrideCollection as U, PermissionCollection as V, MembershipOverride as W, GroupMember as X, GroupMemberCollection as Y, GroupCollection as Z, resolveOidcProviderConfig as _, TerminalAuthRateLimitError as a, DEFAULT_ROLES as at, TenantPermissionOverrideCollection as b, getRequestScopedDatabase as c, MembershipStatus as ct, PermissionResolver as d, TenantPermissionEffect as dt, UsersCliAuthRequest as et, OidcLoginError as f, TenantStatus as ft, getUsersOidcConfig as g, encodeOidcTransaction as h, TerminalAuthError as i, AccessRequestStatus as it, RolePermissionCollection as j, generateSessionId as k, withSessionPermissionContext as l, OverrideEffect as lt, decodeOidcTransaction as m, DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS as n, isValidEmail as nt, TerminalAuthService as o, DEFAULT_ROLE_SLUGS as ot, OidcLoginService as p, UserStatus as pt, GroupRoleCollection as q, DEFAULT_CLI_SESSION_TTL_SECONDS as r, normalizeEmail as rt, getCurrentSessionPermissionContext as s, DEFAULT_TENANT_POLICY as st, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS as t, User as tt, SessionService as u, SessionStatus as ut, webapi_exports as v, MAX_TENANT_HIERARCHY_DEPTH as w, TenantPermissionOverride as x, UserCollection as y, RoleCollection as z };
4530
5175
 
4531
- //# sourceMappingURL=TerminalAuthService-BLxjzcQj.js.map
5176
+ //# sourceMappingURL=TerminalAuthService-DXaxydM6.js.map