@happyvertical/smrt-users 0.54.1 → 0.54.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/AGENTS.md +16 -0
  2. package/README.md +129 -3
  3. package/dist/chunks/{TerminalAuthService-kxt3fqNP.js → TerminalAuthService-B2cazTEg.js} +833 -155
  4. package/dist/chunks/TerminalAuthService-B2cazTEg.js.map +1 -0
  5. package/dist/collections/PasswordCredentialCollection.d.ts +53 -0
  6. package/dist/collections/PasswordCredentialCollection.d.ts.map +1 -0
  7. package/dist/collections/SessionCollection.d.ts +7 -2
  8. package/dist/collections/SessionCollection.d.ts.map +1 -1
  9. package/dist/collections/index.d.ts +1 -0
  10. package/dist/collections/index.d.ts.map +1 -1
  11. package/dist/index.d.ts +3 -3
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +4 -4
  14. package/dist/index.js.map +1 -1
  15. package/dist/manifest.json +422 -1
  16. package/dist/models/PasswordCredential.d.ts +36 -0
  17. package/dist/models/PasswordCredential.d.ts.map +1 -0
  18. package/dist/models/index.d.ts +1 -0
  19. package/dist/models/index.d.ts.map +1 -1
  20. package/dist/services/DeviceCredentialService.d.ts.map +1 -1
  21. package/dist/services/PasswordCredentialService.d.ts +302 -0
  22. package/dist/services/PasswordCredentialService.d.ts.map +1 -0
  23. package/dist/services/SessionService.d.ts +3 -1
  24. package/dist/services/SessionService.d.ts.map +1 -1
  25. package/dist/services/credential-hash.d.ts +76 -0
  26. package/dist/services/credential-hash.d.ts.map +1 -0
  27. package/dist/services/index.d.ts +1 -0
  28. package/dist/services/index.d.ts.map +1 -1
  29. package/dist/smrt-knowledge.json +208 -8
  30. package/dist/sveltekit/index.d.ts +1 -0
  31. package/dist/sveltekit/index.d.ts.map +1 -1
  32. package/dist/sveltekit/password-handlers.d.ts +91 -0
  33. package/dist/sveltekit/password-handlers.d.ts.map +1 -0
  34. package/dist/sveltekit.js +237 -68
  35. package/dist/sveltekit.js.map +1 -1
  36. package/package.json +10 -10
  37. package/dist/chunks/TerminalAuthService-kxt3fqNP.js.map +0 -1
@@ -9,27 +9,27 @@ import { BackfillTracker } from "@happyvertical/smrt-core/migrations";
9
9
  import { coordinateOidcProvisioning, createOidcProvisioningPerson, insertOidcProvisioningIdentity, isOidcProvisioningRaceConflict, saveOidcRaceArbiter } from "@happyvertical/smrt-profiles/internal/oidc-provisioning";
10
10
  import { AsyncLocalStorage } from "node:async_hooks";
11
11
  //#region \0rolldown/runtime.js
12
- var __defProp$16 = Object.defineProperty;
12
+ var __defProp$17 = Object.defineProperty;
13
13
  var __exportAll = (all, no_symbols) => {
14
14
  let target = {};
15
- for (var name in all) __defProp$16(target, name, {
15
+ for (var name in all) __defProp$17(target, name, {
16
16
  get: all[name],
17
17
  enumerable: true
18
18
  });
19
- if (!no_symbols) __defProp$16(target, Symbol.toStringTag, { value: "Module" });
19
+ if (!no_symbols) __defProp$17(target, Symbol.toStringTag, { value: "Module" });
20
20
  return target;
21
21
  };
22
22
  //#endregion
23
23
  //#region src/__smrt-register__.ts
24
- ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":0,\"packageName\":\"@happyvertical/smrt-users\",\"packageVersion\":\"0.54.1\",\"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 \\\"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_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"access_requests_email_idx\",\"columns\":[\"email\"]},{\"name\":\"access_requests_status_idx\",\"columns\":[\"status\"]},{\"name\":\"access_requests_source_idx\",\"columns\":[\"source\"]},{\"name\":\"access_requests_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"f396996f\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersCliAuthApproveLimitCollection\":{\"name\":\"userscliauthapprovelimitcollection\",\"className\":\"UsersCliAuthApproveLimitCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersCliAuthApproveLimitCollection\",\"collection\":\"userscliauthapprovelimits\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/CliAuthApproveLimitCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"reserveAttempt\":{\"name\":\"reserveAttempt\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"object\",\"optional\":false,\"memberTypes\":[\"number\",\"string\"]}],\"returnType\":\"Promise<CliAuthApproveReservation>\",\"isStatic\":false,\"isPublic\":true},\"releaseAttempt\":{\"name\":\"releaseAttempt\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"windowStartedAt\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_approve_limits\",\"api\":false,\"mcp\":false,\"cli\":false},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersCliAuthApproveLimit\",\"exportName\":\"UsersCliAuthApproveLimitCollection\",\"collectionExportName\":\"UsersCliAuthApproveLimitCollectionCollection\",\"schema\":{\"tableName\":\"users_cli_auth_approve_limits\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_cli_auth_approve_limits\\\" (\\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 UNIQUE,\\n \\\"attempt_count\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"window_started_at\\\" TIMESTAMP 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\"},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"attempt_count\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"window_started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_approve_limits_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_cli_auth_approve_limits_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"c45c02de\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"approvePendingRequest\":{\"name\":\"approvePendingRequest\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"ApprovePendingCliAuthRequestInput\",\"optional\":false}],\"returnType\":\"Promise<ApprovedCliAuthRequestSnapshot | null>\",\"isStatic\":false,\"isPublic\":true},\"consumeApprovedSession\":{\"name\":\"consumeApprovedSession\",\"async\":true,\"parameters\":[{\"name\":\"deviceCodeHash\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string | null>\",\"isStatic\":false,\"isPublic\":true},\"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\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"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 \\\"user_code\\\" TEXT NOT NULL UNIQUE,\\n \\\"device_code_hash\\\" TEXT NOT NULL UNIQUE,\\n \\\"status\\\" TEXT,\\n \\\"user_id\\\" UUID,\\n \\\"tenant_id\\\" UUID,\\n \\\"session_id\\\" UUID,\\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\":true,\"unique\":true},\"device_code_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"session_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"sessions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"approved_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_requests_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"users_cli_auth_requests_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"users_cli_auth_requests_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"users_cli_auth_requests_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"users_cli_auth_requests_session_id_idx\",\"columns\":[\"session_id\"]}],\"version\":\"713ae04c\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":\"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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"}},\"indexes\":[{\"name\":\"groups_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"groups_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"1824c19b\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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_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,\"foreignKey\":{\"table\":\"groups\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"group_members_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"group_members_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"group_members_group_id_idx\",\"columns\":[\"group_id\"]},{\"name\":\"group_members_user_id_idx\",\"columns\":[\"user_id\"]}],\"version\":\"ed4d1187\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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_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,\"foreignKey\":{\"table\":\"groups\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"group_roles_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"group_roles_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"group_roles_group_id_idx\",\"columns\":[\"group_id\"]},{\"name\":\"group_roles_role_id_idx\",\"columns\":[\"role_id\"]}],\"version\":\"b1e35f93\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersLoginAttemptCollection\":{\"name\":\"usersloginattemptcollection\",\"className\":\"UsersLoginAttemptCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersLoginAttemptCollection\",\"collection\":\"usersloginattempts\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/LoginAttemptCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"reserveAttempt\":{\"name\":\"reserveAttempt\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"ReserveLoginAttemptInput\",\"optional\":false}],\"returnType\":\"Promise<LoginAttemptReservation>\",\"isStatic\":false,\"isPublic\":true},\"recordFailure\":{\"name\":\"recordFailure\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"RecordLoginFailureInput\",\"optional\":false}],\"returnType\":\"Promise<RecordedLoginFailure>\",\"isStatic\":false,\"isPublic\":true},\"releaseAttempt\":{\"name\":\"releaseAttempt\",\"async\":true,\"parameters\":[{\"name\":\"limiterKey\",\"type\":\"string\",\"optional\":false},{\"name\":\"windowStartedAt\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"deleteIdle\":{\"name\":\"deleteIdle\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_login_attempts\",\"api\":false,\"mcp\":false,\"cli\":false},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersLoginAttempt\",\"exportName\":\"UsersLoginAttemptCollection\",\"collectionExportName\":\"UsersLoginAttemptCollectionCollection\",\"schema\":{\"tableName\":\"users_login_attempts\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_login_attempts\\\" (\\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 \\\"limiter_key\\\" TEXT NOT NULL UNIQUE,\\n \\\"scope\\\" TEXT NOT NULL,\\n \\\"attempt_count\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"window_started_at\\\" TIMESTAMP NOT NULL,\\n \\\"failure_streak\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"locked_until\\\" TIMESTAMP,\\n \\\"last_failed_at\\\" TIMESTAMP,\\n \\\"retain_until\\\" TIMESTAMP 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\"},\"limiter_key\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true},\"scope\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"attempt_count\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"window_started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"failure_streak\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"locked_until\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_failed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"retain_until\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"users_login_attempts_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_login_attempts_locked_until_idx\",\"columns\":[\"locked_until\"]},{\"name\":\"users_login_attempts_retain_until_idx\",\"columns\":[\"retain_until\"]},{\"name\":\"users_login_attempts_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"89dfe336\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersLoginAuditEventCollection\":{\"name\":\"usersloginauditeventcollection\",\"className\":\"UsersLoginAuditEventCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersLoginAuditEventCollection\",\"collection\":\"usersloginauditevents\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/LoginAuditEventCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"deleteOlderThan\":{\"name\":\"deleteOlderThan\",\"async\":true,\"parameters\":[{\"name\":\"maxAgeMs\",\"type\":\"number\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_login_audit_events\",\"api\":false,\"mcp\":false,\"cli\":false},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersLoginAuditEvent\",\"exportName\":\"UsersLoginAuditEventCollection\",\"collectionExportName\":\"UsersLoginAuditEventCollectionCollection\",\"schema\":{\"tableName\":\"users_login_audit_events\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_login_audit_events\\\" (\\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 \\\"kind\\\" TEXT NOT NULL,\\n \\\"outcome\\\" TEXT NOT NULL,\\n \\\"subject_key_hash\\\" TEXT,\\n \\\"source_key_hash\\\" TEXT,\\n \\\"retry_after_seconds\\\" INTEGER,\\n \\\"occurred_at\\\" TIMESTAMP NOT NULL,\\n \\\"metadata\\\" 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\"},\"kind\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"outcome\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"subject_key_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"source_key_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"retry_after_seconds\":{\"type\":\"INTEGER\",\"notNull\":false,\"unique\":false},\"occurred_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"metadata\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_login_audit_events_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_login_audit_events_subject_key_hash_idx\",\"columns\":[\"subject_key_hash\"]},{\"name\":\"users_login_audit_events_source_key_hash_idx\",\"columns\":[\"source_key_hash\"]},{\"name\":\"users_login_audit_events_occurred_at_idx\",\"columns\":[\"occurred_at\"]},{\"name\":\"users_login_audit_events_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"485105a9\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"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 \\\"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_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_magic_link_tokens_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"users_magic_link_tokens_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"537853d3\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":\"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,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"memberships_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"memberships_tenant_id_user_id_idx\",\"columns\":[\"tenant_id\",\"user_id\"]},{\"name\":\"memberships_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"memberships_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"memberships_role_id_idx\",\"columns\":[\"role_id\"]}],\"version\":\"ebfd11e0\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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_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,\"foreignKey\":{\"table\":\"memberships\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"membership_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"membership_overrides_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"membership_overrides_membership_id_idx\",\"columns\":[\"membership_id\"]},{\"name\":\"membership_overrides_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"25fe9da8\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"memberTypes\":[\"string\"]}],\"returnType\":\"Promise<Permission>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Permission\",\"exportName\":\"PermissionCollection\",\"collectionExportName\":\"PermissionCollectionCollection\",\"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_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"permissions_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"4c81b2af\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersPinCredentialCollection\":{\"name\":\"userspincredentialcollection\",\"className\":\"UsersPinCredentialCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersPinCredentialCollection\",\"collection\":\"userspincredentials\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/PinCredentialCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByUserId\":{\"name\":\"findByUserId\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<UsersPinCredential | null>\",\"isStatic\":false,\"isPublic\":true},\"upsertForUser\":{\"name\":\"upsertForUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"write\",\"type\":\"PinCredentialWrite\",\"optional\":false}],\"returnType\":\"Promise<UsersPinCredential>\",\"isStatic\":false,\"isPublic\":true},\"deleteByUserId\":{\"name\":\"deleteByUserId\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_pin_credentials\",\"api\":false,\"mcp\":false,\"cli\":false},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersPinCredential\",\"exportName\":\"UsersPinCredentialCollection\",\"collectionExportName\":\"UsersPinCredentialCollectionCollection\",\"schema\":{\"tableName\":\"users_pin_credentials\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_pin_credentials\\\" (\\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 UNIQUE,\\n \\\"pin_hash\\\" TEXT NOT NULL,\\n \\\"version\\\" INTEGER NOT NULL DEFAULT 1,\\n \\\"must_reset\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"rotated_at\\\" TIMESTAMP,\\n \\\"rotated_by\\\" 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\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"pin_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"version\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":1},\"must_reset\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"rotated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"rotated_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_pin_credentials_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_pin_credentials_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"0e2fa003\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:ResourceGrantCollection\":{\"name\":\"resourcegrantcollection\",\"className\":\"ResourceGrantCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:ResourceGrantCollection\",\"collection\":\"resourcegrants\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/ResourceGrantCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findExact\":{\"name\":\"findExact\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"resourceType\",\"type\":\"string\",\"optional\":false},{\"name\":\"resourceId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permission\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<ResourceGrant[]>\",\"isStatic\":false,\"isPublic\":true},\"findChildren\":{\"name\":\"findChildren\",\"async\":true,\"parameters\":[{\"name\":\"parentGrantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<ResourceGrant[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"ResourceGrant\",\"exportName\":\"ResourceGrantCollection\",\"collectionExportName\":\"ResourceGrantCollectionCollection\",\"schema\":{\"tableName\":\"resource_grants\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"resource_grants\\\" (\\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 \\\"user_id\\\" UUID NOT NULL,\\n \\\"resource_type\\\" TEXT,\\n \\\"resource_id\\\" TEXT,\\n \\\"permission\\\" TEXT,\\n \\\"effect\\\" TEXT,\\n \\\"can_delegate\\\" BOOLEAN DEFAULT FALSE,\\n \\\"parent_grant_id\\\" UUID,\\n \\\"revoked_at\\\" 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\":\"tenantId\",\"notNull\":true,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"resource_type\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"resource_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"permission\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"can_delegate\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false},\"parent_grant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"resource_grants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"revoked_at\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"resource_grants_slug_context_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"resource_grants_lookup_idx\",\"columns\":[\"tenant_id\",\"user_id\"]},{\"name\":\"resource_grants_tenant_id_created_at_idx\",\"columns\":[\"tenant_id\",\"created_at\"]},{\"name\":\"resource_grants_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"resource_grants_parent_grant_id_idx\",\"columns\":[\"parent_grant_id\"]}],\"version\":\"52e03776\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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},\"findSystemRoleBySlug\":{\"name\":\"findSystemRoleBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false}],\"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\":\"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 \\\"inherits_to_descendants\\\" 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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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},\"inherits_to_descendants\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false}},\"indexes\":[{\"name\":\"roles_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"roles_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"47369d9d\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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},\"seedDefaultRolePersonalizationPermissions\":{\"name\":\"seedDefaultRolePersonalizationPermissions\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"Omit<SeedRolePermissionsOptions, 'prune'>\",\"optional\":true}],\"returnType\":\"Promise<SeedRolePermissionsResult>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"RolePermission\",\"exportName\":\"RolePermissionCollection\",\"collectionExportName\":\"RolePermissionCollectionCollection\",\"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,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"role_permissions_role_id_permission_id_idx\",\"columns\":[\"role_id\",\"permission_id\"],\"unique\":true},{\"name\":\"role_permissions_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"role_permissions_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"role_permissions_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"4dfed3ac\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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},\"findChildren\":{\"name\":\"findChildren\",\"async\":true,\"parameters\":[{\"name\":\"parentSessionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Session[]>\",\"isStatic\":false,\"isPublic\":true},\"revokeChildren\":{\"name\":\"revokeChildren\",\"async\":true,\"parameters\":[{\"name\":\"parentSessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"string\"]}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"revokeUserSessionsByAuthMethod\":{\"name\":\"revokeUserSessionsByAuthMethod\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"authMethod\",\"type\":\"SessionAuthMethod\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"string\"]}],\"returnType\":\"Promise<number>\",\"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\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"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,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"null\"}]}],\"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\":\"unknown\",\"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\":\"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 \\\"auth_method\\\" TEXT,\\n \\\"parent_session_id\\\" UUID\\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,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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\":{}},\"auth_method\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"parent_session_id\":{\"type\":\"UUID\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"sessions_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"sessions_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"sessions_parent_session_id_idx\",\"columns\":[\"parent_session_id\"]},{\"name\":\"sessions_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"sessions_user_id_idx\",\"columns\":[\"user_id\"]}],\"version\":\"b4260a0f\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"null\"}]}],\"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\":\"any\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Tenant\",\"exportName\":\"TenantCollection\",\"collectionExportName\":\"TenantCollectionCollection\",\"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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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_slug_context_meta_type_idx\",\"columns\":[\"slug\",\"context\",\"_meta_type\"],\"unique\":true},{\"name\":\"tenants_meta_type_idx\",\"columns\":[\"_meta_type\"]},{\"name\":\"tenants_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"tenants_parent_tenant_id_idx\",\"columns\":[\"parent_tenant_id\"]}],\"version\":\"934f7025\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:TenantIntegrationCollection\":{\"name\":\"tenantintegrationcollection\",\"className\":\"TenantIntegrationCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantIntegrationCollection\",\"collection\":\"tenantintegrations\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/TenantIntegrationCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"listForTenant\":{\"name\":\"listForTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantIntegration[]>\",\"isStatic\":false,\"isPublic\":true},\"findFor\":{\"name\":\"findFor\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"provider\",\"type\":\"TenantIntegrationProvider\",\"optional\":false}],\"returnType\":\"Promise<TenantIntegration | null>\",\"isStatic\":false,\"isPublic\":true},\"findOrInit\":{\"name\":\"findOrInit\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"provider\",\"type\":\"TenantIntegrationProvider\",\"optional\":false}],\"returnType\":\"Promise<TenantIntegration>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"tenant_integrations\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"TenantIntegration\",\"exportName\":\"TenantIntegrationCollection\",\"collectionExportName\":\"TenantIntegrationCollectionCollection\",\"schema\":{\"tableName\":\"tenant_integrations\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_integrations\\\" (\\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 \\\"provider\\\" TEXT DEFAULT 'aws',\\n \\\"external_ids\\\" TEXT,\\n \\\"status\\\" TEXT DEFAULT 'unprovisioned',\\n \\\"last_checked_at\\\" TIMESTAMP,\\n \\\"last_check_summary\\\" TEXT,\\n \\\"last_error\\\" 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\":\"tenantId\",\"notNull\":true,\"unique\":false},\"provider\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"aws\"},\"external_ids\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"unprovisioned\"},\"last_checked_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_check_summary\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_error\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_integrations_tenant_id_provider_idx\",\"columns\":[\"tenant_id\",\"provider\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"tenant_integrations_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"tenant_integrations_tenant_id_created_at_idx\",\"columns\":[\"tenant_id\",\"created_at\"]}],\"version\":\"3ed31966\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"memberTypes\":[\"string\",\"TenantPermissionEffect\"]}],\"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_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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_permission_overrides_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"tenant_permission_overrides_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"tenant_permission_overrides_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"95b78bdd\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"memberTypes\":[\"UserStatus\"]}],\"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\":\"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 UNIQUE,\\n \\\"email\\\" TEXT DEFAULT '',\\n \\\"email_key\\\" TEXT UNIQUE,\\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\":true},\"email\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"email_key\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":true},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_login_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_email_idx\",\"columns\":[\"email\"]},{\"name\":\"users_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"38fd1677\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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, unknown>\",\"isStatic\":false,\"isPublic\":true},\"setRequestContext\":{\"name\":\"setRequestContext\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string, unknown>\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getTenantHint\":{\"name\":\"getTenantHint\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string, unknown> | null\",\"isStatic\":false,\"isPublic\":true},\"setTenantHint\":{\"name\":\"setTenantHint\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string, unknown> | null\",\"optional\":false,\"unionBranches\":[{\"type\":\"Record<string, unknown>\"},{\"type\":\"null\"}]}],\"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_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"access_requests_email_idx\",\"columns\":[\"email\"]},{\"name\":\"access_requests_status_idx\",\"columns\":[\"status\"]},{\"name\":\"access_requests_source_idx\",\"columns\":[\"source\"]},{\"name\":\"access_requests_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"f396996f\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersCliAuthApproveLimit\":{\"name\":\"userscliauthapprovelimit\",\"className\":\"UsersCliAuthApproveLimit\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersCliAuthApproveLimit\",\"collection\":\"userscliauthapprovelimits\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/CliAuthApproveLimit.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true,\"unique\":true}},\"attemptCount\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}},\"windowStartedAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_approve_limits\",\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"UsersCliAuthApproveLimit\",\"collectionExportName\":\"UsersCliAuthApproveLimitCollection\",\"validationRules\":[{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"attemptCount\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"windowStartedAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"}],\"schema\":{\"tableName\":\"users_cli_auth_approve_limits\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_cli_auth_approve_limits\\\" (\\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 UNIQUE,\\n \\\"attempt_count\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"window_started_at\\\" TIMESTAMP 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\"},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"attempt_count\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"window_started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_approve_limits_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_cli_auth_approve_limits_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"c45c02de\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":true,\"_meta\":{\"required\":true,\"unique\":true}},\"deviceCodeHash\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true,\"unique\":true}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"userId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"User\",\"_meta\":{\"nullable\":true}},\"tenantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Tenant\",\"_meta\":{\"nullable\":true}},\"sessionId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Session\",\"_meta\":{\"nullable\":true}},\"expiresAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"indexed\":true}},\"approvedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_requests\",\"sensitive\":true,\"api\":{\"include\":[]},\"cli\":{\"include\":[]},\"mcp\":{\"include\":[]},\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"extends\":\"SmrtObject\",\"exportName\":\"UsersCliAuthRequest\",\"collectionExportName\":\"UsersCliAuthRequestCollection\",\"validationRules\":[{\"field\":\"userCode\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"deviceCodeHash\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"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 NOT NULL UNIQUE,\\n \\\"device_code_hash\\\" TEXT NOT NULL UNIQUE,\\n \\\"status\\\" TEXT,\\n \\\"user_id\\\" UUID,\\n \\\"tenant_id\\\" UUID,\\n \\\"session_id\\\" UUID,\\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\":true,\"unique\":true},\"device_code_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"session_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"sessions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"approved_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_requests_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"users_cli_auth_requests_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"users_cli_auth_requests_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"users_cli_auth_requests_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"users_cli_auth_requests_session_id_idx\",\"columns\":[\"session_id\"]}],\"version\":\"713ae04c\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"}},\"indexes\":[{\"name\":\"groups_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"groups_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"1824c19b\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"foreignKey\":{\"table\":\"groups\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"group_members_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"group_members_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"group_members_group_id_idx\",\"columns\":[\"group_id\"]},{\"name\":\"group_members_user_id_idx\",\"columns\":[\"user_id\"]}],\"version\":\"ed4d1187\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"foreignKey\":{\"table\":\"groups\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"group_roles_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"group_roles_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"group_roles_group_id_idx\",\"columns\":[\"group_id\"]},{\"name\":\"group_roles_role_id_idx\",\"columns\":[\"role_id\"]}],\"version\":\"b1e35f93\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersLoginAttempt\":{\"name\":\"usersloginattempt\",\"className\":\"UsersLoginAttempt\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersLoginAttempt\",\"collection\":\"usersloginattempts\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/LoginAttempt.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"limiterKey\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true,\"unique\":true}},\"scope\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"attemptCount\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}},\"windowStartedAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}},\"failureStreak\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}},\"lockedUntil\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true,\"indexed\":true}},\"lastFailedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"retainUntil\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true,\"indexed\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_login_attempts\",\"sensitive\":true,\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"UsersLoginAttempt\",\"collectionExportName\":\"UsersLoginAttemptCollection\",\"validationRules\":[{\"field\":\"limiterKey\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"scope\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"attemptCount\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"windowStartedAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"},{\"field\":\"failureStreak\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"retainUntil\",\"rule\":\"required\",\"fieldType\":\"datetime\"}],\"schema\":{\"tableName\":\"users_login_attempts\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_login_attempts\\\" (\\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 \\\"limiter_key\\\" TEXT NOT NULL UNIQUE,\\n \\\"scope\\\" TEXT NOT NULL,\\n \\\"attempt_count\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"window_started_at\\\" TIMESTAMP NOT NULL,\\n \\\"failure_streak\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"locked_until\\\" TIMESTAMP,\\n \\\"last_failed_at\\\" TIMESTAMP,\\n \\\"retain_until\\\" TIMESTAMP 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\"},\"limiter_key\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true},\"scope\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"attempt_count\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"window_started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"failure_streak\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"locked_until\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_failed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"retain_until\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"users_login_attempts_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_login_attempts_locked_until_idx\",\"columns\":[\"locked_until\"]},{\"name\":\"users_login_attempts_retain_until_idx\",\"columns\":[\"retain_until\"]},{\"name\":\"users_login_attempts_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"89dfe336\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersLoginAuditEvent\":{\"name\":\"usersloginauditevent\",\"className\":\"UsersLoginAuditEvent\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersLoginAuditEvent\",\"collection\":\"usersloginauditevents\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/LoginAuditEvent.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"kind\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"outcome\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"subjectKeyHash\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true,\"indexed\":true}},\"sourceKeyHash\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true,\"indexed\":true}},\"retryAfterSeconds\":{\"type\":\"integer\",\"required\":false,\"_meta\":{\"nullable\":true}},\"occurredAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true,\"indexed\":true}},\"metadata\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"getMetadata\":{\"name\":\"getMetadata\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string, unknown>\",\"isStatic\":false,\"isPublic\":true},\"setMetadata\":{\"name\":\"setMetadata\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string, unknown>\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_login_audit_events\",\"sensitive\":true,\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"UsersLoginAuditEvent\",\"collectionExportName\":\"UsersLoginAuditEventCollection\",\"validationRules\":[{\"field\":\"kind\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"outcome\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"occurredAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"}],\"schema\":{\"tableName\":\"users_login_audit_events\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_login_audit_events\\\" (\\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 \\\"kind\\\" TEXT NOT NULL,\\n \\\"outcome\\\" TEXT NOT NULL,\\n \\\"subject_key_hash\\\" TEXT,\\n \\\"source_key_hash\\\" TEXT,\\n \\\"retry_after_seconds\\\" INTEGER,\\n \\\"occurred_at\\\" TIMESTAMP NOT NULL,\\n \\\"metadata\\\" 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\"},\"kind\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"outcome\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"subject_key_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"source_key_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"retry_after_seconds\":{\"type\":\"INTEGER\",\"notNull\":false,\"unique\":false},\"occurred_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"metadata\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_login_audit_events_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_login_audit_events_subject_key_hash_idx\",\"columns\":[\"subject_key_hash\"]},{\"name\":\"users_login_audit_events_source_key_hash_idx\",\"columns\":[\"source_key_hash\"]},{\"name\":\"users_login_audit_events_occurred_at_idx\",\"columns\":[\"occurred_at\"]},{\"name\":\"users_login_audit_events_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"485105a9\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"_meta\":{\"indexed\":true}}},\"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\",\"sensitive\":true,\"api\":{\"include\":[]},\"mcp\":{\"include\":[]},\"cli\":{\"skipApiCheck\":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_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_magic_link_tokens_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"users_magic_link_tokens_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"537853d3\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"skipApiCheck\":true},\"indexes\":[{\"name\":\"memberships_tenant_id_user_id_idx\",\"columns\":[\"tenantId\",\"userId\"]}],\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"memberships_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"memberships_tenant_id_user_id_idx\",\"columns\":[\"tenant_id\",\"user_id\"]},{\"name\":\"memberships_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"memberships_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"memberships_role_id_idx\",\"columns\":[\"role_id\"]}],\"version\":\"ebfd11e0\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"skipApiCheck\":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,\"foreignKey\":{\"table\":\"memberships\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"membership_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"membership_overrides_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"membership_overrides_membership_id_idx\",\"columns\":[\"membership_id\"]},{\"name\":\"membership_overrides_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"25fe9da8\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"skipApiCheck\":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_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"permissions_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"4c81b2af\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersPinCredential\":{\"name\":\"userspincredential\",\"className\":\"UsersPinCredential\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersPinCredential\",\"collection\":\"userspincredentials\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/PinCredential.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true,\"unique\":true}},\"pinHash\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true,\"sensitive\":true},\"sensitive\":true},\"version\":{\"type\":\"integer\",\"required\":true,\"default\":1,\"_meta\":{\"required\":true,\"default\":1}},\"mustReset\":{\"type\":\"boolean\",\"required\":true,\"default\":false,\"_meta\":{\"required\":true,\"default\":false}},\"rotatedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"rotatedBy\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_pin_credentials\",\"sensitive\":true,\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"UsersPinCredential\",\"collectionExportName\":\"UsersPinCredentialCollection\",\"validationRules\":[{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"pinHash\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"version\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"mustReset\",\"rule\":\"required\",\"fieldType\":\"boolean\"}],\"schema\":{\"tableName\":\"users_pin_credentials\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_pin_credentials\\\" (\\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 UNIQUE,\\n \\\"pin_hash\\\" TEXT NOT NULL,\\n \\\"version\\\" INTEGER NOT NULL DEFAULT 1,\\n \\\"must_reset\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"rotated_at\\\" TIMESTAMP,\\n \\\"rotated_by\\\" 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\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"pin_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"version\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":1},\"must_reset\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"rotated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"rotated_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_pin_credentials_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_pin_credentials_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"0e2fa003\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:ResourceGrant\":{\"name\":\"resourcegrant\",\"className\":\"ResourceGrant\",\"qualifiedName\":\"@happyvertical/smrt-users:ResourceGrant\",\"collection\":\"resourcegrants\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/ResourceGrant.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Tenant\",\"_meta\":{\"required\":true,\"sqlType\":\"UUID\",\"__tenancy\":{\"isTenantIdField\":true,\"mode\":\"required\",\"field\":\"tenantId\",\"autoFilter\":true,\"autoPopulate\":true,\"allowSuperAdminBypass\":false}}},\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true}},\"resourceType\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"resourceId\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"permission\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"effect\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"canDelegate\":{\"type\":\"boolean\",\"required\":false,\"default\":false},\"parentGrantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"ResourceGrant\"},\"revokedAt\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"isActive\":{\"name\":\"isActive\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tenantScoped\":true,\"api\":{\"include\":[]},\"mcp\":{\"include\":[]},\"cli\":{\"skipApiCheck\":true},\"indexes\":[{\"name\":\"resource_grants_lookup_idx\",\"columns\":[\"tenantId\",\"userId\"]}],\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"extends\":\"SmrtObject\",\"exportName\":\"ResourceGrant\",\"collectionExportName\":\"ResourceGrantCollection\",\"validationRules\":[{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"resource_grants\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"resource_grants\\\" (\\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 \\\"user_id\\\" UUID NOT NULL,\\n \\\"resource_type\\\" TEXT,\\n \\\"resource_id\\\" TEXT,\\n \\\"permission\\\" TEXT,\\n \\\"effect\\\" TEXT,\\n \\\"can_delegate\\\" BOOLEAN DEFAULT FALSE,\\n \\\"parent_grant_id\\\" UUID,\\n \\\"revoked_at\\\" 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\":\"tenantId\",\"notNull\":true,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"resource_type\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"resource_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"permission\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"can_delegate\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false},\"parent_grant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"resource_grants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"revoked_at\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"resource_grants_slug_context_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"resource_grants_lookup_idx\",\"columns\":[\"tenant_id\",\"user_id\"]},{\"name\":\"resource_grants_tenant_id_created_at_idx\",\"columns\":[\"tenant_id\",\"created_at\"]},{\"name\":\"resource_grants_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"resource_grants_parent_grant_id_idx\",\"columns\":[\"parent_grant_id\"]}],\"version\":\"52e03776\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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},\"inheritsToDescendants\":{\"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\":{\"skipApiCheck\":true},\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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 \\\"inherits_to_descendants\\\" 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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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},\"inherits_to_descendants\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false}},\"indexes\":[{\"name\":\"roles_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"roles_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"47369d9d\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"onDelete\":\"NO ACTION\"}},\"permissionId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Permission\",\"_meta\":{\"required\":true,\"onDelete\":\"NO ACTION\"}}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true,\"conflictColumns\":[\"role_id\",\"permission_id\"]},\"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,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"role_permissions_role_id_permission_id_idx\",\"columns\":[\"role_id\",\"permission_id\"],\"unique\":true},{\"name\":\"role_permissions_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"role_permissions_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"role_permissions_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"4dfed3ac\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"_meta\":{\"indexed\":true}},\"userAgent\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"ipAddress\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"lastAccessedAt\":{\"type\":\"datetime\",\"required\":false},\"data\":{\"type\":\"json\",\"required\":false,\"default\":{}},\"authMethod\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"parentSessionId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"sqlType\":\"UUID\",\"nullable\":true,\"indexed\":true,\"sensitive\":true},\"sensitive\":true}},\"methods\":{\"isLayered\":{\"name\":\"isLayered\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"getAbsoluteExpiry\":{\"name\":\"getAbsoluteExpiry\",\"async\":false,\"parameters\":[],\"returnType\":\"Date | null\",\"isStatic\":false,\"isPublic\":true},\"getIdleSeconds\":{\"name\":\"getIdleSeconds\",\"async\":false,\"parameters\":[],\"returnType\":\"number | null\",\"isStatic\":false,\"isPublic\":true},\"getPermissionCeiling\":{\"name\":\"getPermissionCeiling\",\"async\":false,\"parameters\":[],\"returnType\":\"string[] | null\",\"isStatic\":false,\"isPublic\":true},\"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},\"recordActivity\":{\"name\":\"recordActivity\",\"async\":true,\"parameters\":[{\"name\":\"extendTtl\",\"type\":\"any\",\"optional\":true},{\"name\":\"ttlSeconds\",\"type\":\"number\",\"optional\":true}],\"returnType\":\"Promise<boolean>\",\"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,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"null\"}]}],\"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\":\"unknown\",\"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\":{\"sensitive\":true,\"api\":{\"include\":[\"get\",\"delete\"]},\"mcp\":{\"include\":[]},\"cli\":{\"skipApiCheck\":true},\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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 \\\"auth_method\\\" TEXT,\\n \\\"parent_session_id\\\" UUID\\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,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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\":{}},\"auth_method\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"parent_session_id\":{\"type\":\"UUID\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"sessions_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"sessions_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"sessions_parent_session_id_idx\",\"columns\":[\"parent_session_id\"]},{\"name\":\"sessions_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"sessions_user_id_idx\",\"columns\":[\"user_id\"]}],\"version\":\"b4260a0f\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"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},\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"SmrtSaveOptions\",\"optional\":true}],\"returnType\":\"Promise<this>\",\"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\":{\"skipApiCheck\":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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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_slug_context_meta_type_idx\",\"columns\":[\"slug\",\"context\",\"_meta_type\"],\"unique\":true},{\"name\":\"tenants_meta_type_idx\",\"columns\":[\"_meta_type\"]},{\"name\":\"tenants_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"tenants_parent_tenant_id_idx\",\"columns\":[\"parent_tenant_id\"]}],\"version\":\"934f7025\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:TenantIntegration\":{\"name\":\"tenantintegration\",\"className\":\"TenantIntegration\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantIntegration\",\"collection\":\"tenantintegrations\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/TenantIntegration.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"sqlType\":\"UUID\",\"__tenancy\":{\"isTenantIdField\":true,\"autoFilter\":true,\"required\":true,\"autoPopulate\":true,\"nullable\":false,\"mode\":\"required\",\"field\":\"tenantId\",\"allowSuperAdminBypass\":false}}},\"provider\":{\"type\":\"text\",\"required\":false,\"default\":\"aws\"},\"externalIds\":{\"type\":\"text\",\"required\":false},\"status\":{\"type\":\"text\",\"required\":false,\"default\":\"unprovisioned\"},\"lastCheckedAt\":{\"type\":\"datetime\",\"required\":false},\"lastCheckSummary\":{\"type\":\"text\",\"required\":false},\"lastError\":{\"type\":\"text\",\"required\":false}},\"methods\":{\"initialize\":{\"name\":\"initialize\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<this>\",\"isStatic\":false,\"isPublic\":true},\"getExternalIds\":{\"name\":\"getExternalIds\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string, string>\",\"isStatic\":false,\"isPublic\":true},\"setExternalIds\":{\"name\":\"setExternalIds\",\"async\":false,\"parameters\":[{\"name\":\"externalIds\",\"type\":\"Record<string, string> | string\",\"optional\":false,\"unionBranches\":[{\"type\":\"Record<string, string>\"},{\"type\":\"string\"}]}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getExternalId\":{\"name\":\"getExternalId\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"string | undefined\",\"isStatic\":false,\"isPublic\":true},\"setExternalId\":{\"name\":\"setExternalId\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"value\",\"type\":\"string | undefined\",\"optional\":false,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"undefined\"}]}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getLastCheckSummary\":{\"name\":\"getLastCheckSummary\",\"async\":false,\"parameters\":[],\"returnType\":\"TenantIntegrationCheckSummary[]\",\"isStatic\":false,\"isPublic\":true},\"setLastCheckSummary\":{\"name\":\"setLastCheckSummary\",\"async\":false,\"parameters\":[{\"name\":\"summary\",\"type\":\"TenantIntegrationCheckSummary[] | string\",\"optional\":false,\"unionBranches\":[{\"type\":\"TenantIntegrationCheckSummary[]\"},{\"type\":\"string\"}]}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"recordDoctorRun\":{\"name\":\"recordDoctorRun\",\"async\":false,\"parameters\":[{\"name\":\"outcome\",\"type\":\"object\",\"optional\":false,\"memberTypes\":[\"TenantIntegrationStatus\",\"TenantIntegrationCheckSummary[]\",\"string | null\"]}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"tenant_integrations\",\"conflictColumns\":[\"tenant_id\",\"provider\"],\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":{\"skipApiCheck\":true},\"tenantScoped\":{\"mode\":\"required\"}},\"extends\":\"SmrtObject\",\"exportName\":\"TenantIntegration\",\"collectionExportName\":\"TenantIntegrationCollection\",\"validationRules\":[],\"schema\":{\"tableName\":\"tenant_integrations\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_integrations\\\" (\\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 \\\"provider\\\" TEXT DEFAULT 'aws',\\n \\\"external_ids\\\" TEXT,\\n \\\"status\\\" TEXT DEFAULT 'unprovisioned',\\n \\\"last_checked_at\\\" TIMESTAMP,\\n \\\"last_check_summary\\\" TEXT,\\n \\\"last_error\\\" 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\":\"tenantId\",\"notNull\":true,\"unique\":false},\"provider\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"aws\"},\"external_ids\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"unprovisioned\"},\"last_checked_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_check_summary\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_error\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_integrations_tenant_id_provider_idx\",\"columns\":[\"tenant_id\",\"provider\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"tenant_integrations_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"tenant_integrations_tenant_id_created_at_idx\",\"columns\":[\"tenant_id\",\"created_at\"]}],\"version\":\"3ed31966\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"skipApiCheck\":true},\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_permission_overrides_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"tenant_permission_overrides_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"tenant_permission_overrides_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"95b78bdd\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\",\"_meta\":{\"unique\":true}},\"email\":{\"type\":\"text\",\"required\":false,\"default\":\"\",\"_meta\":{\"indexed\":true}},\"emailKey\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true,\"unique\":true,\"readonly\":true},\"readonly\":true},\"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},\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<this>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":{\"skipApiCheck\":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 UNIQUE,\\n \\\"email\\\" TEXT DEFAULT '',\\n \\\"email_key\\\" TEXT UNIQUE,\\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\":true},\"email\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"email_key\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":true},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_login_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_email_idx\",\"columns\":[\"email\"]},{\"name\":\"users_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"38fd1677\"},\"importPath\":\"@happyvertical/smrt-users\"}},\"moduleType\":\"smrt\",\"smrtDependencies\":[\"@happyvertical/smrt-core\",\"@happyvertical/smrt-mobile-contract\",\"@happyvertical/smrt-profiles\",\"@happyvertical/smrt-tenancy\"]}"));
24
+ ObjectRegistry.registerPackageManifest(JSON.parse("{\"version\":\"1.0.0\",\"timestamp\":0,\"packageName\":\"@happyvertical/smrt-users\",\"packageVersion\":\"0.54.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 \\\"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_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"access_requests_email_idx\",\"columns\":[\"email\"]},{\"name\":\"access_requests_status_idx\",\"columns\":[\"status\"]},{\"name\":\"access_requests_source_idx\",\"columns\":[\"source\"]},{\"name\":\"access_requests_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"f396996f\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersCliAuthApproveLimitCollection\":{\"name\":\"userscliauthapprovelimitcollection\",\"className\":\"UsersCliAuthApproveLimitCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersCliAuthApproveLimitCollection\",\"collection\":\"userscliauthapprovelimits\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/CliAuthApproveLimitCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"reserveAttempt\":{\"name\":\"reserveAttempt\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"object\",\"optional\":false,\"memberTypes\":[\"number\",\"string\"]}],\"returnType\":\"Promise<CliAuthApproveReservation>\",\"isStatic\":false,\"isPublic\":true},\"releaseAttempt\":{\"name\":\"releaseAttempt\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"windowStartedAt\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_approve_limits\",\"api\":false,\"mcp\":false,\"cli\":false},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersCliAuthApproveLimit\",\"exportName\":\"UsersCliAuthApproveLimitCollection\",\"collectionExportName\":\"UsersCliAuthApproveLimitCollectionCollection\",\"schema\":{\"tableName\":\"users_cli_auth_approve_limits\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_cli_auth_approve_limits\\\" (\\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 UNIQUE,\\n \\\"attempt_count\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"window_started_at\\\" TIMESTAMP 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\"},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"attempt_count\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"window_started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_approve_limits_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_cli_auth_approve_limits_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"c45c02de\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"approvePendingRequest\":{\"name\":\"approvePendingRequest\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"ApprovePendingCliAuthRequestInput\",\"optional\":false}],\"returnType\":\"Promise<ApprovedCliAuthRequestSnapshot | null>\",\"isStatic\":false,\"isPublic\":true},\"consumeApprovedSession\":{\"name\":\"consumeApprovedSession\",\"async\":true,\"parameters\":[{\"name\":\"deviceCodeHash\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<string | null>\",\"isStatic\":false,\"isPublic\":true},\"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\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"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 \\\"user_code\\\" TEXT NOT NULL UNIQUE,\\n \\\"device_code_hash\\\" TEXT NOT NULL UNIQUE,\\n \\\"status\\\" TEXT,\\n \\\"user_id\\\" UUID,\\n \\\"tenant_id\\\" UUID,\\n \\\"session_id\\\" UUID,\\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\":true,\"unique\":true},\"device_code_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"session_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"sessions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"approved_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_requests_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"users_cli_auth_requests_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"users_cli_auth_requests_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"users_cli_auth_requests_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"users_cli_auth_requests_session_id_idx\",\"columns\":[\"session_id\"]}],\"version\":\"713ae04c\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":\"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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"}},\"indexes\":[{\"name\":\"groups_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"groups_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"1824c19b\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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_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,\"foreignKey\":{\"table\":\"groups\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"group_members_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"group_members_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"group_members_group_id_idx\",\"columns\":[\"group_id\"]},{\"name\":\"group_members_user_id_idx\",\"columns\":[\"user_id\"]}],\"version\":\"ed4d1187\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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_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,\"foreignKey\":{\"table\":\"groups\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"group_roles_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"group_roles_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"group_roles_group_id_idx\",\"columns\":[\"group_id\"]},{\"name\":\"group_roles_role_id_idx\",\"columns\":[\"role_id\"]}],\"version\":\"b1e35f93\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersLoginAttemptCollection\":{\"name\":\"usersloginattemptcollection\",\"className\":\"UsersLoginAttemptCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersLoginAttemptCollection\",\"collection\":\"usersloginattempts\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/LoginAttemptCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"reserveAttempt\":{\"name\":\"reserveAttempt\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"ReserveLoginAttemptInput\",\"optional\":false}],\"returnType\":\"Promise<LoginAttemptReservation>\",\"isStatic\":false,\"isPublic\":true},\"recordFailure\":{\"name\":\"recordFailure\",\"async\":true,\"parameters\":[{\"name\":\"input\",\"type\":\"RecordLoginFailureInput\",\"optional\":false}],\"returnType\":\"Promise<RecordedLoginFailure>\",\"isStatic\":false,\"isPublic\":true},\"releaseAttempt\":{\"name\":\"releaseAttempt\",\"async\":true,\"parameters\":[{\"name\":\"limiterKey\",\"type\":\"string\",\"optional\":false},{\"name\":\"windowStartedAt\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"returnType\":\"Promise<void>\",\"isStatic\":false,\"isPublic\":true},\"deleteIdle\":{\"name\":\"deleteIdle\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_login_attempts\",\"api\":false,\"mcp\":false,\"cli\":false},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersLoginAttempt\",\"exportName\":\"UsersLoginAttemptCollection\",\"collectionExportName\":\"UsersLoginAttemptCollectionCollection\",\"schema\":{\"tableName\":\"users_login_attempts\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_login_attempts\\\" (\\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 \\\"limiter_key\\\" TEXT NOT NULL UNIQUE,\\n \\\"scope\\\" TEXT NOT NULL,\\n \\\"attempt_count\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"window_started_at\\\" TIMESTAMP NOT NULL,\\n \\\"failure_streak\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"locked_until\\\" TIMESTAMP,\\n \\\"last_failed_at\\\" TIMESTAMP,\\n \\\"retain_until\\\" TIMESTAMP 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\"},\"limiter_key\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true},\"scope\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"attempt_count\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"window_started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"failure_streak\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"locked_until\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_failed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"retain_until\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"users_login_attempts_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_login_attempts_locked_until_idx\",\"columns\":[\"locked_until\"]},{\"name\":\"users_login_attempts_retain_until_idx\",\"columns\":[\"retain_until\"]},{\"name\":\"users_login_attempts_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"89dfe336\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersLoginAuditEventCollection\":{\"name\":\"usersloginauditeventcollection\",\"className\":\"UsersLoginAuditEventCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersLoginAuditEventCollection\",\"collection\":\"usersloginauditevents\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/LoginAuditEventCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"deleteOlderThan\":{\"name\":\"deleteOlderThan\",\"async\":true,\"parameters\":[{\"name\":\"maxAgeMs\",\"type\":\"number\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_login_audit_events\",\"api\":false,\"mcp\":false,\"cli\":false},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersLoginAuditEvent\",\"exportName\":\"UsersLoginAuditEventCollection\",\"collectionExportName\":\"UsersLoginAuditEventCollectionCollection\",\"schema\":{\"tableName\":\"users_login_audit_events\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_login_audit_events\\\" (\\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 \\\"kind\\\" TEXT NOT NULL,\\n \\\"outcome\\\" TEXT NOT NULL,\\n \\\"subject_key_hash\\\" TEXT,\\n \\\"source_key_hash\\\" TEXT,\\n \\\"retry_after_seconds\\\" INTEGER,\\n \\\"occurred_at\\\" TIMESTAMP NOT NULL,\\n \\\"metadata\\\" 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\"},\"kind\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"outcome\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"subject_key_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"source_key_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"retry_after_seconds\":{\"type\":\"INTEGER\",\"notNull\":false,\"unique\":false},\"occurred_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"metadata\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_login_audit_events_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_login_audit_events_subject_key_hash_idx\",\"columns\":[\"subject_key_hash\"]},{\"name\":\"users_login_audit_events_source_key_hash_idx\",\"columns\":[\"source_key_hash\"]},{\"name\":\"users_login_audit_events_occurred_at_idx\",\"columns\":[\"occurred_at\"]},{\"name\":\"users_login_audit_events_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"485105a9\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"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 \\\"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_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_magic_link_tokens_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"users_magic_link_tokens_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"537853d3\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":\"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,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"memberships_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"memberships_tenant_id_user_id_idx\",\"columns\":[\"tenant_id\",\"user_id\"]},{\"name\":\"memberships_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"memberships_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"memberships_role_id_idx\",\"columns\":[\"role_id\"]}],\"version\":\"ebfd11e0\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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_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,\"foreignKey\":{\"table\":\"memberships\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"membership_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"membership_overrides_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"membership_overrides_membership_id_idx\",\"columns\":[\"membership_id\"]},{\"name\":\"membership_overrides_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"25fe9da8\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersPasswordCredentialCollection\":{\"name\":\"userspasswordcredentialcollection\",\"className\":\"UsersPasswordCredentialCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersPasswordCredentialCollection\",\"collection\":\"userspasswordcredentials\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/PasswordCredentialCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByUserId\":{\"name\":\"findByUserId\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<UsersPasswordCredential | null>\",\"isStatic\":false,\"isPublic\":true},\"insertIfAbsent\":{\"name\":\"insertIfAbsent\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"write\",\"type\":\"PasswordCredentialWrite\",\"optional\":false}],\"returnType\":\"Promise<UsersPasswordCredential | null>\",\"isStatic\":false,\"isPublic\":true},\"upsertForUser\":{\"name\":\"upsertForUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"write\",\"type\":\"PasswordCredentialWrite\",\"optional\":false}],\"returnType\":\"Promise<UsersPasswordCredential>\",\"isStatic\":false,\"isPublic\":true},\"replaceIfCurrent\":{\"name\":\"replaceIfCurrent\",\"async\":true,\"parameters\":[{\"name\":\"expected\",\"type\":\"UsersPasswordCredential\",\"optional\":false},{\"name\":\"write\",\"type\":\"Omit<PasswordCredentialWrite, 'mustChange'>\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"deleteIfCurrent\":{\"name\":\"deleteIfCurrent\",\"async\":true,\"parameters\":[{\"name\":\"expected\",\"type\":\"UsersPasswordCredential\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"replaceHashIfUnchanged\":{\"name\":\"replaceHashIfUnchanged\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"expectedHash\",\"type\":\"string\",\"optional\":false},{\"name\":\"upgradedHash\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true},\"deleteByUserId\":{\"name\":\"deleteByUserId\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_password_credentials\",\"api\":false,\"mcp\":false,\"cli\":false},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersPasswordCredential\",\"exportName\":\"UsersPasswordCredentialCollection\",\"collectionExportName\":\"UsersPasswordCredentialCollectionCollection\",\"schema\":{\"tableName\":\"users_password_credentials\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_password_credentials\\\" (\\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 UNIQUE,\\n \\\"password_hash\\\" TEXT NOT NULL,\\n \\\"version\\\" INTEGER NOT NULL DEFAULT 1,\\n \\\"must_change\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"rotated_at\\\" TIMESTAMP,\\n \\\"rotated_by\\\" 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\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"password_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"version\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":1},\"must_change\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"rotated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"rotated_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_password_credentials_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_password_credentials_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"9a828f77\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"memberTypes\":[\"string\"]}],\"returnType\":\"Promise<Permission>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Permission\",\"exportName\":\"PermissionCollection\",\"collectionExportName\":\"PermissionCollectionCollection\",\"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_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"permissions_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"4c81b2af\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersPinCredentialCollection\":{\"name\":\"userspincredentialcollection\",\"className\":\"UsersPinCredentialCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersPinCredentialCollection\",\"collection\":\"userspincredentials\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/PinCredentialCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findByUserId\":{\"name\":\"findByUserId\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<UsersPinCredential | null>\",\"isStatic\":false,\"isPublic\":true},\"upsertForUser\":{\"name\":\"upsertForUser\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"write\",\"type\":\"PinCredentialWrite\",\"optional\":false}],\"returnType\":\"Promise<UsersPinCredential>\",\"isStatic\":false,\"isPublic\":true},\"deleteByUserId\":{\"name\":\"deleteByUserId\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<boolean>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_pin_credentials\",\"api\":false,\"mcp\":false,\"cli\":false},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"UsersPinCredential\",\"exportName\":\"UsersPinCredentialCollection\",\"collectionExportName\":\"UsersPinCredentialCollectionCollection\",\"schema\":{\"tableName\":\"users_pin_credentials\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_pin_credentials\\\" (\\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 UNIQUE,\\n \\\"pin_hash\\\" TEXT NOT NULL,\\n \\\"version\\\" INTEGER NOT NULL DEFAULT 1,\\n \\\"must_reset\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"rotated_at\\\" TIMESTAMP,\\n \\\"rotated_by\\\" 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\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"pin_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"version\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":1},\"must_reset\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"rotated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"rotated_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_pin_credentials_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_pin_credentials_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"0e2fa003\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:ResourceGrantCollection\":{\"name\":\"resourcegrantcollection\",\"className\":\"ResourceGrantCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:ResourceGrantCollection\",\"collection\":\"resourcegrants\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/ResourceGrantCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"findExact\":{\"name\":\"findExact\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"resourceType\",\"type\":\"string\",\"optional\":false},{\"name\":\"resourceId\",\"type\":\"string\",\"optional\":false},{\"name\":\"permission\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<ResourceGrant[]>\",\"isStatic\":false,\"isPublic\":true},\"findChildren\":{\"name\":\"findChildren\",\"async\":true,\"parameters\":[{\"name\":\"parentGrantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<ResourceGrant[]>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"ResourceGrant\",\"exportName\":\"ResourceGrantCollection\",\"collectionExportName\":\"ResourceGrantCollectionCollection\",\"schema\":{\"tableName\":\"resource_grants\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"resource_grants\\\" (\\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 \\\"user_id\\\" UUID NOT NULL,\\n \\\"resource_type\\\" TEXT,\\n \\\"resource_id\\\" TEXT,\\n \\\"permission\\\" TEXT,\\n \\\"effect\\\" TEXT,\\n \\\"can_delegate\\\" BOOLEAN DEFAULT FALSE,\\n \\\"parent_grant_id\\\" UUID,\\n \\\"revoked_at\\\" 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\":\"tenantId\",\"notNull\":true,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"resource_type\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"resource_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"permission\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"can_delegate\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false},\"parent_grant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"resource_grants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"revoked_at\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"resource_grants_slug_context_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"resource_grants_lookup_idx\",\"columns\":[\"tenant_id\",\"user_id\"]},{\"name\":\"resource_grants_tenant_id_created_at_idx\",\"columns\":[\"tenant_id\",\"created_at\"]},{\"name\":\"resource_grants_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"resource_grants_parent_grant_id_idx\",\"columns\":[\"parent_grant_id\"]}],\"version\":\"52e03776\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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},\"findSystemRoleBySlug\":{\"name\":\"findSystemRoleBySlug\",\"async\":true,\"parameters\":[{\"name\":\"slug\",\"type\":\"string\",\"optional\":false}],\"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\":\"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 \\\"inherits_to_descendants\\\" 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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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},\"inherits_to_descendants\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false}},\"indexes\":[{\"name\":\"roles_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"roles_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"47369d9d\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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},\"seedDefaultRolePersonalizationPermissions\":{\"name\":\"seedDefaultRolePersonalizationPermissions\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"Omit<SeedRolePermissionsOptions, 'prune'>\",\"optional\":true}],\"returnType\":\"Promise<SeedRolePermissionsResult>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"RolePermission\",\"exportName\":\"RolePermissionCollection\",\"collectionExportName\":\"RolePermissionCollectionCollection\",\"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,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"role_permissions_role_id_permission_id_idx\",\"columns\":[\"role_id\",\"permission_id\"],\"unique\":true},{\"name\":\"role_permissions_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"role_permissions_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"role_permissions_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"4dfed3ac\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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},\"findChildren\":{\"name\":\"findChildren\",\"async\":true,\"parameters\":[{\"name\":\"parentSessionId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<Session[]>\",\"isStatic\":false,\"isPublic\":true},\"revokeChildren\":{\"name\":\"revokeChildren\",\"async\":true,\"parameters\":[{\"name\":\"parentSessionId\",\"type\":\"string\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"string\"]}],\"returnType\":\"Promise<number>\",\"isStatic\":false,\"isPublic\":true},\"revokeUserSessionsByAuthMethod\":{\"name\":\"revokeUserSessionsByAuthMethod\",\"async\":true,\"parameters\":[{\"name\":\"userId\",\"type\":\"string\",\"optional\":false},{\"name\":\"authMethod\",\"type\":\"SessionAuthMethod\",\"optional\":false},{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"string\"]}],\"returnType\":\"Promise<number>\",\"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},{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"string\"]}],\"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\":[{\"name\":\"options\",\"type\":\"object\",\"optional\":true,\"memberTypes\":[\"boolean\"]}],\"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,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"null\"}]}],\"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\":\"unknown\",\"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\":\"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 \\\"auth_method\\\" TEXT,\\n \\\"parent_session_id\\\" UUID\\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,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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\":{}},\"auth_method\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"parent_session_id\":{\"type\":\"UUID\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"sessions_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"sessions_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"sessions_parent_session_id_idx\",\"columns\":[\"parent_session_id\"]},{\"name\":\"sessions_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"sessions_user_id_idx\",\"columns\":[\"user_id\"]}],\"version\":\"b4260a0f\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"null\"}]}],\"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\":\"any\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"Tenant\",\"exportName\":\"TenantCollection\",\"collectionExportName\":\"TenantCollectionCollection\",\"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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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_slug_context_meta_type_idx\",\"columns\":[\"slug\",\"context\",\"_meta_type\"],\"unique\":true},{\"name\":\"tenants_meta_type_idx\",\"columns\":[\"_meta_type\"]},{\"name\":\"tenants_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"tenants_parent_tenant_id_idx\",\"columns\":[\"parent_tenant_id\"]}],\"version\":\"934f7025\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:TenantIntegrationCollection\":{\"name\":\"tenantintegrationcollection\",\"className\":\"TenantIntegrationCollection\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantIntegrationCollection\",\"collection\":\"tenantintegrations\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/collections/TenantIntegrationCollection.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{},\"methods\":{\"listForTenant\":{\"name\":\"listForTenant\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"Promise<TenantIntegration[]>\",\"isStatic\":false,\"isPublic\":true},\"findFor\":{\"name\":\"findFor\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"provider\",\"type\":\"TenantIntegrationProvider\",\"optional\":false}],\"returnType\":\"Promise<TenantIntegration | null>\",\"isStatic\":false,\"isPublic\":true},\"findOrInit\":{\"name\":\"findOrInit\",\"async\":true,\"parameters\":[{\"name\":\"tenantId\",\"type\":\"string\",\"optional\":false},{\"name\":\"provider\",\"type\":\"TenantIntegrationProvider\",\"optional\":false}],\"returnType\":\"Promise<TenantIntegration>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"tenant_integrations\"},\"extends\":\"SmrtCollection\",\"extendsTypeArg\":\"TenantIntegration\",\"exportName\":\"TenantIntegrationCollection\",\"collectionExportName\":\"TenantIntegrationCollectionCollection\",\"schema\":{\"tableName\":\"tenant_integrations\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_integrations\\\" (\\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 \\\"provider\\\" TEXT DEFAULT 'aws',\\n \\\"external_ids\\\" TEXT,\\n \\\"status\\\" TEXT DEFAULT 'unprovisioned',\\n \\\"last_checked_at\\\" TIMESTAMP,\\n \\\"last_check_summary\\\" TEXT,\\n \\\"last_error\\\" 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\":\"tenantId\",\"notNull\":true,\"unique\":false},\"provider\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"aws\"},\"external_ids\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"unprovisioned\"},\"last_checked_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_check_summary\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_error\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_integrations_tenant_id_provider_idx\",\"columns\":[\"tenant_id\",\"provider\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"tenant_integrations_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"tenant_integrations_tenant_id_created_at_idx\",\"columns\":[\"tenant_id\",\"created_at\"]}],\"version\":\"3ed31966\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"memberTypes\":[\"string\",\"TenantPermissionEffect\"]}],\"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_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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_permission_overrides_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"tenant_permission_overrides_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"tenant_permission_overrides_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"95b78bdd\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"memberTypes\":[\"UserStatus\"]}],\"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\":\"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 UNIQUE,\\n \\\"email\\\" TEXT DEFAULT '',\\n \\\"email_key\\\" TEXT UNIQUE,\\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\":true},\"email\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"email_key\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":true},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_login_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_email_idx\",\"columns\":[\"email\"]},{\"name\":\"users_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"38fd1677\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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, unknown>\",\"isStatic\":false,\"isPublic\":true},\"setRequestContext\":{\"name\":\"setRequestContext\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string, unknown>\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getTenantHint\":{\"name\":\"getTenantHint\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string, unknown> | null\",\"isStatic\":false,\"isPublic\":true},\"setTenantHint\":{\"name\":\"setTenantHint\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string, unknown> | null\",\"optional\":false,\"unionBranches\":[{\"type\":\"Record<string, unknown>\"},{\"type\":\"null\"}]}],\"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_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"access_requests_email_idx\",\"columns\":[\"email\"]},{\"name\":\"access_requests_status_idx\",\"columns\":[\"status\"]},{\"name\":\"access_requests_source_idx\",\"columns\":[\"source\"]},{\"name\":\"access_requests_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"f396996f\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersCliAuthApproveLimit\":{\"name\":\"userscliauthapprovelimit\",\"className\":\"UsersCliAuthApproveLimit\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersCliAuthApproveLimit\",\"collection\":\"userscliauthapprovelimits\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/CliAuthApproveLimit.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true,\"unique\":true}},\"attemptCount\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}},\"windowStartedAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_approve_limits\",\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"UsersCliAuthApproveLimit\",\"collectionExportName\":\"UsersCliAuthApproveLimitCollection\",\"validationRules\":[{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"attemptCount\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"windowStartedAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"}],\"schema\":{\"tableName\":\"users_cli_auth_approve_limits\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_cli_auth_approve_limits\\\" (\\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 UNIQUE,\\n \\\"attempt_count\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"window_started_at\\\" TIMESTAMP 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\"},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"attempt_count\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"window_started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_approve_limits_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_cli_auth_approve_limits_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"c45c02de\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":true,\"_meta\":{\"required\":true,\"unique\":true}},\"deviceCodeHash\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true,\"unique\":true}},\"status\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"userId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"User\",\"_meta\":{\"nullable\":true}},\"tenantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Tenant\",\"_meta\":{\"nullable\":true}},\"sessionId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"Session\",\"_meta\":{\"nullable\":true}},\"expiresAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"indexed\":true}},\"approvedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_cli_auth_requests\",\"sensitive\":true,\"api\":{\"include\":[]},\"cli\":{\"include\":[]},\"mcp\":{\"include\":[]},\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"extends\":\"SmrtObject\",\"exportName\":\"UsersCliAuthRequest\",\"collectionExportName\":\"UsersCliAuthRequestCollection\",\"validationRules\":[{\"field\":\"userCode\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"deviceCodeHash\",\"rule\":\"required\",\"fieldType\":\"text\"}],\"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 NOT NULL UNIQUE,\\n \\\"device_code_hash\\\" TEXT NOT NULL UNIQUE,\\n \\\"status\\\" TEXT,\\n \\\"user_id\\\" UUID,\\n \\\"tenant_id\\\" UUID,\\n \\\"session_id\\\" UUID,\\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\":true,\"unique\":true},\"device_code_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"session_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"sessions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"expires_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"approved_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_cli_auth_requests_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"users_cli_auth_requests_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"users_cli_auth_requests_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"users_cli_auth_requests_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"users_cli_auth_requests_session_id_idx\",\"columns\":[\"session_id\"]}],\"version\":\"713ae04c\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"name\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"description\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"}},\"indexes\":[{\"name\":\"groups_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"groups_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"1824c19b\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"foreignKey\":{\"table\":\"groups\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"group_members_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"group_members_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"group_members_group_id_idx\",\"columns\":[\"group_id\"]},{\"name\":\"group_members_user_id_idx\",\"columns\":[\"user_id\"]}],\"version\":\"ed4d1187\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"foreignKey\":{\"table\":\"groups\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"group_roles_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"group_roles_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"group_roles_group_id_idx\",\"columns\":[\"group_id\"]},{\"name\":\"group_roles_role_id_idx\",\"columns\":[\"role_id\"]}],\"version\":\"b1e35f93\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersLoginAttempt\":{\"name\":\"usersloginattempt\",\"className\":\"UsersLoginAttempt\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersLoginAttempt\",\"collection\":\"usersloginattempts\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/LoginAttempt.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"limiterKey\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true,\"unique\":true}},\"scope\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"attemptCount\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}},\"windowStartedAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true}},\"failureStreak\":{\"type\":\"integer\",\"required\":true,\"default\":0,\"_meta\":{\"required\":true,\"default\":0}},\"lockedUntil\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true,\"indexed\":true}},\"lastFailedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"retainUntil\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true,\"indexed\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_login_attempts\",\"sensitive\":true,\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"UsersLoginAttempt\",\"collectionExportName\":\"UsersLoginAttemptCollection\",\"validationRules\":[{\"field\":\"limiterKey\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"scope\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"attemptCount\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"windowStartedAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"},{\"field\":\"failureStreak\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"retainUntil\",\"rule\":\"required\",\"fieldType\":\"datetime\"}],\"schema\":{\"tableName\":\"users_login_attempts\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_login_attempts\\\" (\\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 \\\"limiter_key\\\" TEXT NOT NULL UNIQUE,\\n \\\"scope\\\" TEXT NOT NULL,\\n \\\"attempt_count\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"window_started_at\\\" TIMESTAMP NOT NULL,\\n \\\"failure_streak\\\" INTEGER NOT NULL DEFAULT 0,\\n \\\"locked_until\\\" TIMESTAMP,\\n \\\"last_failed_at\\\" TIMESTAMP,\\n \\\"retain_until\\\" TIMESTAMP 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\"},\"limiter_key\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":true},\"scope\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"attempt_count\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"window_started_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"failure_streak\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":0},\"locked_until\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_failed_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"retain_until\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false}},\"indexes\":[{\"name\":\"users_login_attempts_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_login_attempts_locked_until_idx\",\"columns\":[\"locked_until\"]},{\"name\":\"users_login_attempts_retain_until_idx\",\"columns\":[\"retain_until\"]},{\"name\":\"users_login_attempts_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"89dfe336\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersLoginAuditEvent\":{\"name\":\"usersloginauditevent\",\"className\":\"UsersLoginAuditEvent\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersLoginAuditEvent\",\"collection\":\"usersloginauditevents\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/LoginAuditEvent.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"kind\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"outcome\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true}},\"subjectKeyHash\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true,\"indexed\":true}},\"sourceKeyHash\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true,\"indexed\":true}},\"retryAfterSeconds\":{\"type\":\"integer\",\"required\":false,\"_meta\":{\"nullable\":true}},\"occurredAt\":{\"type\":\"datetime\",\"required\":true,\"_meta\":{\"required\":true,\"indexed\":true}},\"metadata\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"getMetadata\":{\"name\":\"getMetadata\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string, unknown>\",\"isStatic\":false,\"isPublic\":true},\"setMetadata\":{\"name\":\"setMetadata\",\"async\":false,\"parameters\":[{\"name\":\"value\",\"type\":\"Record<string, unknown>\",\"optional\":false}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"users_login_audit_events\",\"sensitive\":true,\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"UsersLoginAuditEvent\",\"collectionExportName\":\"UsersLoginAuditEventCollection\",\"validationRules\":[{\"field\":\"kind\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"outcome\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"occurredAt\",\"rule\":\"required\",\"fieldType\":\"datetime\"}],\"schema\":{\"tableName\":\"users_login_audit_events\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_login_audit_events\\\" (\\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 \\\"kind\\\" TEXT NOT NULL,\\n \\\"outcome\\\" TEXT NOT NULL,\\n \\\"subject_key_hash\\\" TEXT,\\n \\\"source_key_hash\\\" TEXT,\\n \\\"retry_after_seconds\\\" INTEGER,\\n \\\"occurred_at\\\" TIMESTAMP NOT NULL,\\n \\\"metadata\\\" 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\"},\"kind\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"outcome\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"subject_key_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"source_key_hash\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"retry_after_seconds\":{\"type\":\"INTEGER\",\"notNull\":false,\"unique\":false},\"occurred_at\":{\"type\":\"TIMESTAMP\",\"notNull\":true,\"unique\":false},\"metadata\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_login_audit_events_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_login_audit_events_subject_key_hash_idx\",\"columns\":[\"subject_key_hash\"]},{\"name\":\"users_login_audit_events_source_key_hash_idx\",\"columns\":[\"source_key_hash\"]},{\"name\":\"users_login_audit_events_occurred_at_idx\",\"columns\":[\"occurred_at\"]},{\"name\":\"users_login_audit_events_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"485105a9\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"_meta\":{\"indexed\":true}}},\"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\",\"sensitive\":true,\"api\":{\"include\":[]},\"mcp\":{\"include\":[]},\"cli\":{\"skipApiCheck\":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_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_magic_link_tokens_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"users_magic_link_tokens_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"537853d3\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"skipApiCheck\":true},\"indexes\":[{\"name\":\"memberships_tenant_id_user_id_idx\",\"columns\":[\"tenantId\",\"userId\"]}],\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"role_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"memberships_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"memberships_tenant_id_user_id_idx\",\"columns\":[\"tenant_id\",\"user_id\"]},{\"name\":\"memberships_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"memberships_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"memberships_role_id_idx\",\"columns\":[\"role_id\"]}],\"version\":\"ebfd11e0\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"skipApiCheck\":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,\"foreignKey\":{\"table\":\"memberships\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"membership_overrides_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"membership_overrides_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"membership_overrides_membership_id_idx\",\"columns\":[\"membership_id\"]},{\"name\":\"membership_overrides_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"25fe9da8\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersPasswordCredential\":{\"name\":\"userspasswordcredential\",\"className\":\"UsersPasswordCredential\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersPasswordCredential\",\"collection\":\"userspasswordcredentials\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/PasswordCredential.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true,\"unique\":true}},\"passwordHash\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true,\"sensitive\":true},\"sensitive\":true},\"version\":{\"type\":\"integer\",\"required\":true,\"default\":1,\"_meta\":{\"required\":true,\"default\":1}},\"mustChange\":{\"type\":\"boolean\",\"required\":true,\"default\":false,\"_meta\":{\"required\":true,\"default\":false}},\"rotatedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"rotatedBy\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_password_credentials\",\"sensitive\":true,\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"UsersPasswordCredential\",\"collectionExportName\":\"UsersPasswordCredentialCollection\",\"validationRules\":[{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"passwordHash\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"version\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"mustChange\",\"rule\":\"required\",\"fieldType\":\"boolean\"}],\"schema\":{\"tableName\":\"users_password_credentials\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_password_credentials\\\" (\\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 UNIQUE,\\n \\\"password_hash\\\" TEXT NOT NULL,\\n \\\"version\\\" INTEGER NOT NULL DEFAULT 1,\\n \\\"must_change\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"rotated_at\\\" TIMESTAMP,\\n \\\"rotated_by\\\" 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\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"password_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"version\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":1},\"must_change\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"rotated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"rotated_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_password_credentials_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_password_credentials_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"9a828f77\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"skipApiCheck\":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_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"permissions_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"4c81b2af\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:UsersPinCredential\":{\"name\":\"userspincredential\",\"className\":\"UsersPinCredential\",\"qualifiedName\":\"@happyvertical/smrt-users:UsersPinCredential\",\"collection\":\"userspincredentials\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/PinCredential.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true,\"unique\":true}},\"pinHash\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"required\":true,\"sensitive\":true},\"sensitive\":true},\"version\":{\"type\":\"integer\",\"required\":true,\"default\":1,\"_meta\":{\"required\":true,\"default\":1}},\"mustReset\":{\"type\":\"boolean\",\"required\":true,\"default\":false,\"_meta\":{\"required\":true,\"default\":false}},\"rotatedAt\":{\"type\":\"datetime\",\"required\":false,\"_meta\":{\"nullable\":true}},\"rotatedBy\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}}},\"methods\":{},\"decoratorConfig\":{\"tableName\":\"users_pin_credentials\",\"sensitive\":true,\"api\":false,\"cli\":false,\"mcp\":false},\"extends\":\"SmrtObject\",\"exportName\":\"UsersPinCredential\",\"collectionExportName\":\"UsersPinCredentialCollection\",\"validationRules\":[{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"},{\"field\":\"pinHash\",\"rule\":\"required\",\"fieldType\":\"text\"},{\"field\":\"version\",\"rule\":\"required\",\"fieldType\":\"integer\"},{\"field\":\"mustReset\",\"rule\":\"required\",\"fieldType\":\"boolean\"}],\"schema\":{\"tableName\":\"users_pin_credentials\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"users_pin_credentials\\\" (\\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 UNIQUE,\\n \\\"pin_hash\\\" TEXT NOT NULL,\\n \\\"version\\\" INTEGER NOT NULL DEFAULT 1,\\n \\\"must_reset\\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\\"rotated_at\\\" TIMESTAMP,\\n \\\"rotated_by\\\" 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\":true,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"pin_hash\":{\"type\":\"TEXT\",\"notNull\":true,\"unique\":false},\"version\":{\"type\":\"INTEGER\",\"notNull\":true,\"unique\":false,\"default\":1},\"must_reset\":{\"type\":\"BOOLEAN\",\"notNull\":true,\"unique\":false,\"default\":false},\"rotated_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"rotated_by\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_pin_credentials_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_pin_credentials_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"0e2fa003\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:ResourceGrant\":{\"name\":\"resourcegrant\",\"className\":\"ResourceGrant\",\"qualifiedName\":\"@happyvertical/smrt-users:ResourceGrant\",\"collection\":\"resourcegrants\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/ResourceGrant.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Tenant\",\"_meta\":{\"required\":true,\"sqlType\":\"UUID\",\"__tenancy\":{\"isTenantIdField\":true,\"mode\":\"required\",\"field\":\"tenantId\",\"autoFilter\":true,\"autoPopulate\":true,\"allowSuperAdminBypass\":false}}},\"userId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"User\",\"_meta\":{\"required\":true}},\"resourceType\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"resourceId\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"permission\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"effect\":{\"type\":\"text\",\"required\":false,\"_meta\":{}},\"canDelegate\":{\"type\":\"boolean\",\"required\":false,\"default\":false},\"parentGrantId\":{\"type\":\"foreignKey\",\"required\":false,\"related\":\"ResourceGrant\"},\"revokedAt\":{\"type\":\"text\",\"required\":false,\"_meta\":{}}},\"methods\":{\"isActive\":{\"name\":\"isActive\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tenantScoped\":true,\"api\":{\"include\":[]},\"mcp\":{\"include\":[]},\"cli\":{\"skipApiCheck\":true},\"indexes\":[{\"name\":\"resource_grants_lookup_idx\",\"columns\":[\"tenantId\",\"userId\"]}],\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"extends\":\"SmrtObject\",\"exportName\":\"ResourceGrant\",\"collectionExportName\":\"ResourceGrantCollection\",\"validationRules\":[{\"field\":\"userId\",\"rule\":\"required\",\"fieldType\":\"foreignKey\"}],\"schema\":{\"tableName\":\"resource_grants\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"resource_grants\\\" (\\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 \\\"user_id\\\" UUID NOT NULL,\\n \\\"resource_type\\\" TEXT,\\n \\\"resource_id\\\" TEXT,\\n \\\"permission\\\" TEXT,\\n \\\"effect\\\" TEXT,\\n \\\"can_delegate\\\" BOOLEAN DEFAULT FALSE,\\n \\\"parent_grant_id\\\" UUID,\\n \\\"revoked_at\\\" 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\":\"tenantId\",\"notNull\":true,\"unique\":false},\"user_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"resource_type\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"resource_id\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"permission\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"can_delegate\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false},\"parent_grant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"resource_grants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"revoked_at\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"resource_grants_slug_context_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"resource_grants_lookup_idx\",\"columns\":[\"tenant_id\",\"user_id\"]},{\"name\":\"resource_grants_tenant_id_created_at_idx\",\"columns\":[\"tenant_id\",\"created_at\"]},{\"name\":\"resource_grants_user_id_idx\",\"columns\":[\"user_id\"]},{\"name\":\"resource_grants_parent_grant_id_idx\",\"columns\":[\"parent_grant_id\"]}],\"version\":\"52e03776\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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},\"inheritsToDescendants\":{\"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\":{\"skipApiCheck\":true},\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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 \\\"inherits_to_descendants\\\" 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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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},\"inherits_to_descendants\":{\"type\":\"BOOLEAN\",\"notNull\":false,\"unique\":false,\"default\":false}},\"indexes\":[{\"name\":\"roles_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"roles_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"47369d9d\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"onDelete\":\"NO ACTION\"}},\"permissionId\":{\"type\":\"foreignKey\",\"required\":true,\"related\":\"Permission\",\"_meta\":{\"required\":true,\"onDelete\":\"NO ACTION\"}}},\"methods\":{},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":true,\"conflictColumns\":[\"role_id\",\"permission_id\"]},\"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,\"foreignKey\":{\"table\":\"roles\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}}},\"indexes\":[{\"name\":\"role_permissions_role_id_permission_id_idx\",\"columns\":[\"role_id\",\"permission_id\"],\"unique\":true},{\"name\":\"role_permissions_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"role_permissions_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"role_permissions_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"4dfed3ac\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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,\"_meta\":{\"indexed\":true}},\"userAgent\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"ipAddress\":{\"type\":\"text\",\"required\":false,\"default\":\"\"},\"lastAccessedAt\":{\"type\":\"datetime\",\"required\":false},\"data\":{\"type\":\"json\",\"required\":false,\"default\":{}},\"authMethod\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true}},\"parentSessionId\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"sqlType\":\"UUID\",\"nullable\":true,\"indexed\":true,\"sensitive\":true},\"sensitive\":true}},\"methods\":{\"isLayered\":{\"name\":\"isLayered\",\"async\":false,\"parameters\":[],\"returnType\":\"boolean\",\"isStatic\":false,\"isPublic\":true},\"getAbsoluteExpiry\":{\"name\":\"getAbsoluteExpiry\",\"async\":false,\"parameters\":[],\"returnType\":\"Date | null\",\"isStatic\":false,\"isPublic\":true},\"getIdleSeconds\":{\"name\":\"getIdleSeconds\",\"async\":false,\"parameters\":[],\"returnType\":\"number | null\",\"isStatic\":false,\"isPublic\":true},\"getPermissionCeiling\":{\"name\":\"getPermissionCeiling\",\"async\":false,\"parameters\":[],\"returnType\":\"string[] | null\",\"isStatic\":false,\"isPublic\":true},\"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},\"recordActivity\":{\"name\":\"recordActivity\",\"async\":true,\"parameters\":[{\"name\":\"extendTtl\",\"type\":\"any\",\"optional\":true},{\"name\":\"ttlSeconds\",\"type\":\"number\",\"optional\":true}],\"returnType\":\"Promise<boolean>\",\"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,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"null\"}]}],\"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\":\"unknown\",\"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\":{\"sensitive\":true,\"api\":{\"include\":[\"get\",\"delete\"]},\"mcp\":{\"include\":[]},\"cli\":{\"skipApiCheck\":true},\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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 \\\"auth_method\\\" TEXT,\\n \\\"parent_session_id\\\" UUID\\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,\"foreignKey\":{\"table\":\"users\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"tenant_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":false,\"unique\":false,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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\":{}},\"auth_method\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"parent_session_id\":{\"type\":\"UUID\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"sessions_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"sessions_expires_at_idx\",\"columns\":[\"expires_at\"]},{\"name\":\"sessions_parent_session_id_idx\",\"columns\":[\"parent_session_id\"]},{\"name\":\"sessions_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"sessions_user_id_idx\",\"columns\":[\"user_id\"]}],\"version\":\"b4260a0f\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"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},\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[{\"name\":\"options\",\"type\":\"SmrtSaveOptions\",\"optional\":true}],\"returnType\":\"Promise<this>\",\"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\":{\"skipApiCheck\":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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"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_slug_context_meta_type_idx\",\"columns\":[\"slug\",\"context\",\"_meta_type\"],\"unique\":true},{\"name\":\"tenants_meta_type_idx\",\"columns\":[\"_meta_type\"]},{\"name\":\"tenants_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"tenants_parent_tenant_id_idx\",\"columns\":[\"parent_tenant_id\"]}],\"version\":\"934f7025\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@happyvertical/smrt-users:TenantIntegration\":{\"name\":\"tenantintegration\",\"className\":\"TenantIntegration\",\"qualifiedName\":\"@happyvertical/smrt-users:TenantIntegration\",\"collection\":\"tenantintegrations\",\"filePath\":\"/home/runner/work/smrt/smrt/packages/users/src/models/TenantIntegration.ts\",\"packageName\":\"@happyvertical/smrt-users\",\"fields\":{\"tenantId\":{\"type\":\"text\",\"required\":true,\"_meta\":{\"sqlType\":\"UUID\",\"__tenancy\":{\"isTenantIdField\":true,\"autoFilter\":true,\"required\":true,\"autoPopulate\":true,\"nullable\":false,\"mode\":\"required\",\"field\":\"tenantId\",\"allowSuperAdminBypass\":false}}},\"provider\":{\"type\":\"text\",\"required\":false,\"default\":\"aws\"},\"externalIds\":{\"type\":\"text\",\"required\":false},\"status\":{\"type\":\"text\",\"required\":false,\"default\":\"unprovisioned\"},\"lastCheckedAt\":{\"type\":\"datetime\",\"required\":false},\"lastCheckSummary\":{\"type\":\"text\",\"required\":false},\"lastError\":{\"type\":\"text\",\"required\":false}},\"methods\":{\"initialize\":{\"name\":\"initialize\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<this>\",\"isStatic\":false,\"isPublic\":true},\"getExternalIds\":{\"name\":\"getExternalIds\",\"async\":false,\"parameters\":[],\"returnType\":\"Record<string, string>\",\"isStatic\":false,\"isPublic\":true},\"setExternalIds\":{\"name\":\"setExternalIds\",\"async\":false,\"parameters\":[{\"name\":\"externalIds\",\"type\":\"Record<string, string> | string\",\"optional\":false,\"unionBranches\":[{\"type\":\"Record<string, string>\"},{\"type\":\"string\"}]}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getExternalId\":{\"name\":\"getExternalId\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false}],\"returnType\":\"string | undefined\",\"isStatic\":false,\"isPublic\":true},\"setExternalId\":{\"name\":\"setExternalId\",\"async\":false,\"parameters\":[{\"name\":\"key\",\"type\":\"string\",\"optional\":false},{\"name\":\"value\",\"type\":\"string | undefined\",\"optional\":false,\"unionBranches\":[{\"type\":\"string\"},{\"type\":\"undefined\"}]}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"getLastCheckSummary\":{\"name\":\"getLastCheckSummary\",\"async\":false,\"parameters\":[],\"returnType\":\"TenantIntegrationCheckSummary[]\",\"isStatic\":false,\"isPublic\":true},\"setLastCheckSummary\":{\"name\":\"setLastCheckSummary\",\"async\":false,\"parameters\":[{\"name\":\"summary\",\"type\":\"TenantIntegrationCheckSummary[] | string\",\"optional\":false,\"unionBranches\":[{\"type\":\"TenantIntegrationCheckSummary[]\"},{\"type\":\"string\"}]}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true},\"recordDoctorRun\":{\"name\":\"recordDoctorRun\",\"async\":false,\"parameters\":[{\"name\":\"outcome\",\"type\":\"object\",\"optional\":false,\"memberTypes\":[\"TenantIntegrationStatus\",\"TenantIntegrationCheckSummary[]\",\"string | null\"]}],\"returnType\":\"void\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"tableName\":\"tenant_integrations\",\"conflictColumns\":[\"tenant_id\",\"provider\"],\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":{\"skipApiCheck\":true},\"tenantScoped\":{\"mode\":\"required\"}},\"extends\":\"SmrtObject\",\"exportName\":\"TenantIntegration\",\"collectionExportName\":\"TenantIntegrationCollection\",\"validationRules\":[],\"schema\":{\"tableName\":\"tenant_integrations\",\"ddl\":\"CREATE TABLE IF NOT EXISTS \\\"tenant_integrations\\\" (\\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 \\\"provider\\\" TEXT DEFAULT 'aws',\\n \\\"external_ids\\\" TEXT,\\n \\\"status\\\" TEXT DEFAULT 'unprovisioned',\\n \\\"last_checked_at\\\" TIMESTAMP,\\n \\\"last_check_summary\\\" TEXT,\\n \\\"last_error\\\" 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\":\"tenantId\",\"notNull\":true,\"unique\":false},\"provider\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"aws\"},\"external_ids\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"unprovisioned\"},\"last_checked_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false},\"last_check_summary\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_error\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_integrations_tenant_id_provider_idx\",\"columns\":[\"tenant_id\",\"provider\"],\"unique\":true,\"nullsNotDistinct\":true},{\"name\":\"tenant_integrations_slug_context_idx\",\"columns\":[\"slug\",\"context\"]},{\"name\":\"tenant_integrations_tenant_id_created_at_idx\",\"columns\":[\"tenant_id\",\"created_at\"]}],\"version\":\"3ed31966\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\":{\"skipApiCheck\":true},\"conflictColumns\":[\"tenant_id\",\"slug\",\"context\"]},\"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,\"foreignKey\":{\"table\":\"tenants\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"permission_id\":{\"type\":\"UUID\",\"referenceKind\":\"foreignKey\",\"notNull\":true,\"unique\":false,\"foreignKey\":{\"table\":\"permissions\",\"column\":\"id\",\"onDelete\":\"NO ACTION\",\"onUpdate\":\"CASCADE\"}},\"effect\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"tenant_permission_overrides_tenant_id_slug_idx\",\"columns\":[\"tenant_id\",\"slug\",\"context\"],\"unique\":true},{\"name\":\"tenant_permission_overrides_created_at_idx\",\"columns\":[\"created_at\"]},{\"name\":\"tenant_permission_overrides_permission_id_idx\",\"columns\":[\"permission_id\"]}],\"version\":\"95b78bdd\"},\"importPath\":\"@happyvertical/smrt-users\"},\"@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\",\"_meta\":{\"unique\":true}},\"email\":{\"type\":\"text\",\"required\":false,\"default\":\"\",\"_meta\":{\"indexed\":true}},\"emailKey\":{\"type\":\"text\",\"required\":false,\"_meta\":{\"nullable\":true,\"unique\":true,\"readonly\":true},\"readonly\":true},\"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},\"save\":{\"name\":\"save\",\"async\":true,\"parameters\":[],\"returnType\":\"Promise<this>\",\"isStatic\":false,\"isPublic\":true}},\"decoratorConfig\":{\"api\":{\"include\":[\"list\",\"get\"]},\"mcp\":{\"include\":[\"list\",\"get\"]},\"cli\":{\"skipApiCheck\":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 UNIQUE,\\n \\\"email\\\" TEXT DEFAULT '',\\n \\\"email_key\\\" TEXT UNIQUE,\\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\":true},\"email\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false,\"default\":\"\"},\"email_key\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":true},\"status\":{\"type\":\"TEXT\",\"notNull\":false,\"unique\":false},\"last_login_at\":{\"type\":\"TIMESTAMP\",\"notNull\":false,\"unique\":false}},\"indexes\":[{\"name\":\"users_slug_context_idx\",\"columns\":[\"slug\",\"context\"],\"unique\":true},{\"name\":\"users_email_idx\",\"columns\":[\"email\"]},{\"name\":\"users_created_at_idx\",\"columns\":[\"created_at\"]}],\"version\":\"38fd1677\"},\"importPath\":\"@happyvertical/smrt-users\"}},\"moduleType\":\"smrt\",\"smrtDependencies\":[\"@happyvertical/smrt-core\",\"@happyvertical/smrt-mobile-contract\",\"@happyvertical/smrt-profiles\",\"@happyvertical/smrt-tenancy\"]}"));
25
25
  //#endregion
26
26
  //#region src/models/CliAuthRequest.ts
27
- var __defProp$15 = Object.defineProperty;
28
- var __getOwnPropDesc$15 = Object.getOwnPropertyDescriptor;
29
- var __decorateClass$15 = (decorators, target, key, kind) => {
30
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$15(target, key) : target;
27
+ var __defProp$16 = Object.defineProperty;
28
+ var __getOwnPropDesc$16 = Object.getOwnPropertyDescriptor;
29
+ var __decorateClass$16 = (decorators, target, key, kind) => {
30
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$16(target, key) : target;
31
31
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
32
- if (kind && result) __defProp$15(target, key, result);
32
+ if (kind && result) __defProp$16(target, key, result);
33
33
  return result;
34
34
  };
35
35
  var UsersCliAuthRequest = class extends SmrtObject {
@@ -42,29 +42,29 @@ var UsersCliAuthRequest = class extends SmrtObject {
42
42
  expiresAt = /* @__PURE__ */ new Date();
43
43
  approvedAt = null;
44
44
  };
45
- __decorateClass$15([field({
45
+ __decorateClass$16([field({
46
46
  type: "text",
47
47
  required: true,
48
48
  unique: true
49
49
  })], UsersCliAuthRequest.prototype, "userCode", 2);
50
- __decorateClass$15([field({
50
+ __decorateClass$16([field({
51
51
  type: "text",
52
52
  required: true,
53
53
  unique: true
54
54
  })], UsersCliAuthRequest.prototype, "deviceCodeHash", 2);
55
- __decorateClass$15([field({ type: "text" })], UsersCliAuthRequest.prototype, "status", 2);
56
- __decorateClass$15([foreignKey("User", { nullable: true })], UsersCliAuthRequest.prototype, "userId", 2);
57
- __decorateClass$15([foreignKey("Tenant", { nullable: true })], UsersCliAuthRequest.prototype, "tenantId", 2);
58
- __decorateClass$15([foreignKey("Session", { nullable: true })], UsersCliAuthRequest.prototype, "sessionId", 2);
59
- __decorateClass$15([field({
55
+ __decorateClass$16([field({ type: "text" })], UsersCliAuthRequest.prototype, "status", 2);
56
+ __decorateClass$16([foreignKey("User", { nullable: true })], UsersCliAuthRequest.prototype, "userId", 2);
57
+ __decorateClass$16([foreignKey("Tenant", { nullable: true })], UsersCliAuthRequest.prototype, "tenantId", 2);
58
+ __decorateClass$16([foreignKey("Session", { nullable: true })], UsersCliAuthRequest.prototype, "sessionId", 2);
59
+ __decorateClass$16([field({
60
60
  type: "datetime",
61
61
  indexed: true
62
62
  })], UsersCliAuthRequest.prototype, "expiresAt", 2);
63
- __decorateClass$15([field({
63
+ __decorateClass$16([field({
64
64
  type: "datetime",
65
65
  nullable: true
66
66
  })], UsersCliAuthRequest.prototype, "approvedAt", 2);
67
- UsersCliAuthRequest = __decorateClass$15([smrt({
67
+ UsersCliAuthRequest = __decorateClass$16([smrt({
68
68
  tableName: "users_cli_auth_requests",
69
69
  sensitive: true,
70
70
  api: { include: [] },
@@ -73,12 +73,12 @@ UsersCliAuthRequest = __decorateClass$15([smrt({
73
73
  })], UsersCliAuthRequest);
74
74
  //#endregion
75
75
  //#region src/models/Session.ts
76
- var __defProp$14 = Object.defineProperty;
77
- var __getOwnPropDesc$14 = Object.getOwnPropertyDescriptor;
78
- var __decorateClass$14 = (decorators, target, key, kind) => {
79
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$14(target, key) : target;
76
+ var __defProp$15 = Object.defineProperty;
77
+ var __getOwnPropDesc$15 = Object.getOwnPropertyDescriptor;
78
+ var __decorateClass$15 = (decorators, target, key, kind) => {
79
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$15(target, key) : target;
80
80
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
81
- if (kind && result) __defProp$14(target, key, result);
81
+ if (kind && result) __defProp$15(target, key, result);
82
82
  return result;
83
83
  };
84
84
  var DEFAULT_SESSION_TTL = 10080 * 60;
@@ -257,24 +257,24 @@ var Session = class extends SmrtObject {
257
257
  delete this.data[key];
258
258
  }
259
259
  };
260
- __decorateClass$14([foreignKey("User")], Session.prototype, "userId", 2);
261
- __decorateClass$14([foreignKey("Tenant", { nullable: true })], Session.prototype, "tenantId", 2);
262
- __decorateClass$14([field({ type: "text" })], Session.prototype, "status", 2);
263
- __decorateClass$14([field({
260
+ __decorateClass$15([foreignKey("User")], Session.prototype, "userId", 2);
261
+ __decorateClass$15([foreignKey("Tenant", { nullable: true })], Session.prototype, "tenantId", 2);
262
+ __decorateClass$15([field({ type: "text" })], Session.prototype, "status", 2);
263
+ __decorateClass$15([field({
264
264
  type: "datetime",
265
265
  indexed: true
266
266
  })], Session.prototype, "expiresAt", 2);
267
- __decorateClass$14([field({
267
+ __decorateClass$15([field({
268
268
  type: "text",
269
269
  nullable: true
270
270
  })], Session.prototype, "authMethod", 2);
271
- __decorateClass$14([field({
271
+ __decorateClass$15([field({
272
272
  sqlType: "UUID",
273
273
  nullable: true,
274
274
  indexed: true,
275
275
  sensitive: true
276
276
  })], Session.prototype, "parentSessionId", 2);
277
- Session = __decorateClass$14([smrt({
277
+ Session = __decorateClass$15([smrt({
278
278
  sensitive: true,
279
279
  api: { include: ["get", "delete"] },
280
280
  mcp: { include: [] },
@@ -424,15 +424,18 @@ var SessionCollection = class extends SmrtCollection {
424
424
  return count;
425
425
  }
426
426
  /**
427
- * Revoke all sessions for a user (soft delete)
427
+ * Revoke all sessions for a user (soft delete), optionally sparing one —
428
+ * the session a person changes their password from (#3274). Ids come from
429
+ * the unbounded raw read, so caller list bounds can never leave a session
430
+ * of the user un-revoked.
428
431
  */
429
- async revokeUserSessions(userId) {
430
- const sessions = await this.list({ where: {
431
- userId,
432
- status: SessionStatus.ACTIVE
433
- } });
432
+ async revokeUserSessions(userId, options = {}) {
433
+ const sessionIds = await this.activeSessionIds("user_id", userId);
434
434
  let count = 0;
435
- for (const session of sessions) if (session.id && await this.revokeWithRetry(session.id)) count++;
435
+ for (const sessionId of sessionIds) {
436
+ if (sessionId === options.exceptSessionId) continue;
437
+ if (await this.revokeWithRetry(sessionId)) count++;
438
+ }
436
439
  return count;
437
440
  }
438
441
  /**
@@ -621,12 +624,12 @@ var UsersCliAuthRequestCollection = class extends SmrtCollection {
621
624
  };
622
625
  //#endregion
623
626
  //#region src/models/LoginAttempt.ts
624
- var __defProp$13 = Object.defineProperty;
625
- var __getOwnPropDesc$13 = Object.getOwnPropertyDescriptor;
626
- var __decorateClass$13 = (decorators, target, key, kind) => {
627
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$13(target, key) : target;
627
+ var __defProp$14 = Object.defineProperty;
628
+ var __getOwnPropDesc$14 = Object.getOwnPropertyDescriptor;
629
+ var __decorateClass$14 = (decorators, target, key, kind) => {
630
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$14(target, key) : target;
628
631
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
629
- if (kind && result) __defProp$13(target, key, result);
632
+ if (kind && result) __defProp$14(target, key, result);
630
633
  return result;
631
634
  };
632
635
  var UsersLoginAttempt = class extends SmrtObject {
@@ -639,44 +642,44 @@ var UsersLoginAttempt = class extends SmrtObject {
639
642
  lastFailedAt = null;
640
643
  retainUntil = /* @__PURE__ */ new Date();
641
644
  };
642
- __decorateClass$13([field({
645
+ __decorateClass$14([field({
643
646
  type: "text",
644
647
  required: true,
645
648
  unique: true
646
649
  })], UsersLoginAttempt.prototype, "limiterKey", 2);
647
- __decorateClass$13([field({
650
+ __decorateClass$14([field({
648
651
  type: "text",
649
652
  required: true
650
653
  })], UsersLoginAttempt.prototype, "scope", 2);
651
- __decorateClass$13([field({
654
+ __decorateClass$14([field({
652
655
  type: "integer",
653
656
  required: true,
654
657
  default: 0
655
658
  })], UsersLoginAttempt.prototype, "attemptCount", 2);
656
- __decorateClass$13([field({
659
+ __decorateClass$14([field({
657
660
  type: "datetime",
658
661
  required: true
659
662
  })], UsersLoginAttempt.prototype, "windowStartedAt", 2);
660
- __decorateClass$13([field({
663
+ __decorateClass$14([field({
661
664
  type: "integer",
662
665
  required: true,
663
666
  default: 0
664
667
  })], UsersLoginAttempt.prototype, "failureStreak", 2);
665
- __decorateClass$13([field({
668
+ __decorateClass$14([field({
666
669
  type: "datetime",
667
670
  nullable: true,
668
671
  indexed: true
669
672
  })], UsersLoginAttempt.prototype, "lockedUntil", 2);
670
- __decorateClass$13([field({
673
+ __decorateClass$14([field({
671
674
  type: "datetime",
672
675
  nullable: true
673
676
  })], UsersLoginAttempt.prototype, "lastFailedAt", 2);
674
- __decorateClass$13([field({
677
+ __decorateClass$14([field({
675
678
  type: "datetime",
676
679
  required: true,
677
680
  indexed: true
678
681
  })], UsersLoginAttempt.prototype, "retainUntil", 2);
679
- UsersLoginAttempt = __decorateClass$13([smrt({
682
+ UsersLoginAttempt = __decorateClass$14([smrt({
680
683
  tableName: "users_login_attempts",
681
684
  sensitive: true,
682
685
  api: false,
@@ -884,12 +887,12 @@ var UsersLoginAttemptCollection = class extends SmrtCollection {
884
887
  };
885
888
  //#endregion
886
889
  //#region src/models/LoginAuditEvent.ts
887
- var __defProp$12 = Object.defineProperty;
888
- var __getOwnPropDesc$12 = Object.getOwnPropertyDescriptor;
889
- var __decorateClass$12 = (decorators, target, key, kind) => {
890
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$12(target, key) : target;
890
+ var __defProp$13 = Object.defineProperty;
891
+ var __getOwnPropDesc$13 = Object.getOwnPropertyDescriptor;
892
+ var __decorateClass$13 = (decorators, target, key, kind) => {
893
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$13(target, key) : target;
891
894
  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$12(target, key, result);
895
+ if (kind && result) __defProp$13(target, key, result);
893
896
  return result;
894
897
  };
895
898
  var UsersLoginAuditEvent = class extends SmrtObject {
@@ -912,35 +915,35 @@ var UsersLoginAuditEvent = class extends SmrtObject {
912
915
  this.metadata = JSON.stringify(value ?? {});
913
916
  }
914
917
  };
915
- __decorateClass$12([field({
918
+ __decorateClass$13([field({
916
919
  type: "text",
917
920
  required: true
918
921
  })], UsersLoginAuditEvent.prototype, "kind", 2);
919
- __decorateClass$12([field({
922
+ __decorateClass$13([field({
920
923
  type: "text",
921
924
  required: true
922
925
  })], UsersLoginAuditEvent.prototype, "outcome", 2);
923
- __decorateClass$12([field({
926
+ __decorateClass$13([field({
924
927
  type: "text",
925
928
  nullable: true,
926
929
  indexed: true
927
930
  })], UsersLoginAuditEvent.prototype, "subjectKeyHash", 2);
928
- __decorateClass$12([field({
931
+ __decorateClass$13([field({
929
932
  type: "text",
930
933
  nullable: true,
931
934
  indexed: true
932
935
  })], UsersLoginAuditEvent.prototype, "sourceKeyHash", 2);
933
- __decorateClass$12([field({
936
+ __decorateClass$13([field({
934
937
  type: "integer",
935
938
  nullable: true
936
939
  })], UsersLoginAuditEvent.prototype, "retryAfterSeconds", 2);
937
- __decorateClass$12([field({
940
+ __decorateClass$13([field({
938
941
  type: "datetime",
939
942
  required: true,
940
943
  indexed: true
941
944
  })], UsersLoginAuditEvent.prototype, "occurredAt", 2);
942
- __decorateClass$12([field({ type: "text" })], UsersLoginAuditEvent.prototype, "metadata", 2);
943
- UsersLoginAuditEvent = __decorateClass$12([smrt({
945
+ __decorateClass$13([field({ type: "text" })], UsersLoginAuditEvent.prototype, "metadata", 2);
946
+ UsersLoginAuditEvent = __decorateClass$13([smrt({
944
947
  tableName: "users_login_audit_events",
945
948
  sensitive: true,
946
949
  api: false,
@@ -966,12 +969,12 @@ var UsersLoginAuditEventCollection = class extends SmrtCollection {
966
969
  };
967
970
  //#endregion
968
971
  //#region src/models/User.ts
969
- var __defProp$11 = Object.defineProperty;
970
- var __getOwnPropDesc$11 = Object.getOwnPropertyDescriptor;
971
- var __decorateClass$11 = (decorators, target, key, kind) => {
972
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$11(target, key) : target;
972
+ var __defProp$12 = Object.defineProperty;
973
+ var __getOwnPropDesc$12 = Object.getOwnPropertyDescriptor;
974
+ var __decorateClass$12 = (decorators, target, key, kind) => {
975
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$12(target, key) : target;
973
976
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
974
- if (kind && result) __defProp$11(target, key, result);
977
+ if (kind && result) __defProp$12(target, key, result);
975
978
  return result;
976
979
  };
977
980
  var EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -1037,28 +1040,28 @@ var User = class extends SmrtObject {
1037
1040
  return super.save();
1038
1041
  }
1039
1042
  };
1040
- __decorateClass$11([crossPackageRef("@happyvertical/smrt-profiles:Profile", { unique: true })], User.prototype, "profileId", 2);
1041
- __decorateClass$11([field({ indexed: true })], User.prototype, "email", 2);
1042
- __decorateClass$11([field({
1043
+ __decorateClass$12([crossPackageRef("@happyvertical/smrt-profiles:Profile", { unique: true })], User.prototype, "profileId", 2);
1044
+ __decorateClass$12([field({ indexed: true })], User.prototype, "email", 2);
1045
+ __decorateClass$12([field({
1043
1046
  type: "text",
1044
1047
  nullable: true,
1045
1048
  unique: true,
1046
1049
  readonly: true
1047
1050
  })], User.prototype, "emailKey", 2);
1048
- __decorateClass$11([field({ type: "text" })], User.prototype, "status", 2);
1049
- User = __decorateClass$11([smrt({
1051
+ __decorateClass$12([field({ type: "text" })], User.prototype, "status", 2);
1052
+ User = __decorateClass$12([smrt({
1050
1053
  api: { include: ["list", "get"] },
1051
1054
  mcp: { include: ["list", "get"] },
1052
1055
  cli: { skipApiCheck: true }
1053
1056
  })], User);
1054
1057
  //#endregion
1055
1058
  //#region src/models/Group.ts
1056
- var __defProp$10 = Object.defineProperty;
1057
- var __getOwnPropDesc$10 = Object.getOwnPropertyDescriptor;
1058
- var __decorateClass$10 = (decorators, target, key, kind) => {
1059
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$10(target, key) : target;
1059
+ var __defProp$11 = Object.defineProperty;
1060
+ var __getOwnPropDesc$11 = Object.getOwnPropertyDescriptor;
1061
+ var __decorateClass$11 = (decorators, target, key, kind) => {
1062
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$11(target, key) : target;
1060
1063
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1061
- if (kind && result) __defProp$10(target, key, result);
1064
+ if (kind && result) __defProp$11(target, key, result);
1062
1065
  return result;
1063
1066
  };
1064
1067
  var Group = class extends SmrtObject {
@@ -1078,8 +1081,8 @@ var Group = class extends SmrtObject {
1078
1081
  if (options.description !== void 0) this.description = options.description;
1079
1082
  }
1080
1083
  };
1081
- __decorateClass$10([foreignKey("Tenant", { required: true })], Group.prototype, "tenantId", 2);
1082
- Group = __decorateClass$10([smrt({
1084
+ __decorateClass$11([foreignKey("Tenant", { required: true })], Group.prototype, "tenantId", 2);
1085
+ Group = __decorateClass$11([smrt({
1083
1086
  api: { include: ["list", "get"] },
1084
1087
  mcp: { include: ["list", "get"] },
1085
1088
  cli: true
@@ -1113,12 +1116,12 @@ var GroupCollection = class extends SmrtCollection {
1113
1116
  };
1114
1117
  //#endregion
1115
1118
  //#region src/models/GroupMember.ts
1116
- var __defProp$9 = Object.defineProperty;
1117
- var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
1118
- var __decorateClass$9 = (decorators, target, key, kind) => {
1119
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
1119
+ var __defProp$10 = Object.defineProperty;
1120
+ var __getOwnPropDesc$10 = Object.getOwnPropertyDescriptor;
1121
+ var __decorateClass$10 = (decorators, target, key, kind) => {
1122
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$10(target, key) : target;
1120
1123
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1121
- if (kind && result) __defProp$9(target, key, result);
1124
+ if (kind && result) __defProp$10(target, key, result);
1122
1125
  return result;
1123
1126
  };
1124
1127
  var GroupMember = class extends SmrtObject {
@@ -1130,9 +1133,9 @@ var GroupMember = class extends SmrtObject {
1130
1133
  if (options.userId !== void 0) this.userId = options.userId;
1131
1134
  }
1132
1135
  };
1133
- __decorateClass$9([foreignKey("Group", { required: true })], GroupMember.prototype, "groupId", 2);
1134
- __decorateClass$9([foreignKey("User", { required: true })], GroupMember.prototype, "userId", 2);
1135
- GroupMember = __decorateClass$9([smrt({
1136
+ __decorateClass$10([foreignKey("Group", { required: true })], GroupMember.prototype, "groupId", 2);
1137
+ __decorateClass$10([foreignKey("User", { required: true })], GroupMember.prototype, "userId", 2);
1138
+ GroupMember = __decorateClass$10([smrt({
1136
1139
  api: { include: ["list", "get"] },
1137
1140
  mcp: { include: ["list", "get"] },
1138
1141
  cli: true
@@ -1241,12 +1244,12 @@ var GroupMemberCollection = class extends SmrtCollection {
1241
1244
  };
1242
1245
  //#endregion
1243
1246
  //#region src/models/GroupRole.ts
1244
- var __defProp$8 = Object.defineProperty;
1245
- var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
1246
- var __decorateClass$8 = (decorators, target, key, kind) => {
1247
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
1247
+ var __defProp$9 = Object.defineProperty;
1248
+ var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
1249
+ var __decorateClass$9 = (decorators, target, key, kind) => {
1250
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
1248
1251
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1249
- if (kind && result) __defProp$8(target, key, result);
1252
+ if (kind && result) __defProp$9(target, key, result);
1250
1253
  return result;
1251
1254
  };
1252
1255
  var GroupRole = class extends SmrtObject {
@@ -1258,9 +1261,9 @@ var GroupRole = class extends SmrtObject {
1258
1261
  if (options.roleId !== void 0) this.roleId = options.roleId;
1259
1262
  }
1260
1263
  };
1261
- __decorateClass$8([foreignKey("Group", { required: true })], GroupRole.prototype, "groupId", 2);
1262
- __decorateClass$8([foreignKey("Role", { required: true })], GroupRole.prototype, "roleId", 2);
1263
- GroupRole = __decorateClass$8([smrt({
1264
+ __decorateClass$9([foreignKey("Group", { required: true })], GroupRole.prototype, "groupId", 2);
1265
+ __decorateClass$9([foreignKey("Role", { required: true })], GroupRole.prototype, "roleId", 2);
1266
+ GroupRole = __decorateClass$9([smrt({
1264
1267
  api: { include: ["list", "get"] },
1265
1268
  mcp: { include: ["list", "get"] },
1266
1269
  cli: true
@@ -1336,12 +1339,12 @@ var GroupRoleCollection = class extends SmrtCollection {
1336
1339
  };
1337
1340
  //#endregion
1338
1341
  //#region src/models/Membership.ts
1339
- var __defProp$7 = Object.defineProperty;
1340
- var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
1341
- var __decorateClass$7 = (decorators, target, key, kind) => {
1342
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
1342
+ var __defProp$8 = Object.defineProperty;
1343
+ var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
1344
+ var __decorateClass$8 = (decorators, target, key, kind) => {
1345
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
1343
1346
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1344
- if (kind && result) __defProp$7(target, key, result);
1347
+ if (kind && result) __defProp$8(target, key, result);
1345
1348
  return result;
1346
1349
  };
1347
1350
  var Membership = class extends SmrtObject {
@@ -1369,11 +1372,11 @@ var Membership = class extends SmrtObject {
1369
1372
  return this.status === MembershipStatus.PENDING;
1370
1373
  }
1371
1374
  };
1372
- __decorateClass$7([foreignKey("User", { required: true })], Membership.prototype, "userId", 2);
1373
- __decorateClass$7([foreignKey("Tenant", { required: true })], Membership.prototype, "tenantId", 2);
1374
- __decorateClass$7([foreignKey("Role", { required: true })], Membership.prototype, "roleId", 2);
1375
- __decorateClass$7([field({ type: "text" })], Membership.prototype, "status", 2);
1376
- Membership = __decorateClass$7([smrt({
1375
+ __decorateClass$8([foreignKey("User", { required: true })], Membership.prototype, "userId", 2);
1376
+ __decorateClass$8([foreignKey("Tenant", { required: true })], Membership.prototype, "tenantId", 2);
1377
+ __decorateClass$8([foreignKey("Role", { required: true })], Membership.prototype, "roleId", 2);
1378
+ __decorateClass$8([field({ type: "text" })], Membership.prototype, "status", 2);
1379
+ Membership = __decorateClass$8([smrt({
1377
1380
  api: { include: ["list", "get"] },
1378
1381
  mcp: { include: ["list", "get"] },
1379
1382
  cli: { skipApiCheck: true },
@@ -1462,12 +1465,12 @@ var MembershipCollection = class extends SmrtCollection {
1462
1465
  };
1463
1466
  //#endregion
1464
1467
  //#region src/models/MembershipOverride.ts
1465
- var __defProp$6 = Object.defineProperty;
1466
- var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
1467
- var __decorateClass$6 = (decorators, target, key, kind) => {
1468
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
1468
+ var __defProp$7 = Object.defineProperty;
1469
+ var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
1470
+ var __decorateClass$7 = (decorators, target, key, kind) => {
1471
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
1469
1472
  for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1470
- if (kind && result) __defProp$6(target, key, result);
1473
+ if (kind && result) __defProp$7(target, key, result);
1471
1474
  return result;
1472
1475
  };
1473
1476
  var MembershipOverride = class extends SmrtObject {
@@ -1493,10 +1496,10 @@ var MembershipOverride = class extends SmrtObject {
1493
1496
  return this.effect === OverrideEffect.DENY;
1494
1497
  }
1495
1498
  };
1496
- __decorateClass$6([foreignKey("Membership", { required: true })], MembershipOverride.prototype, "membershipId", 2);
1497
- __decorateClass$6([foreignKey("Permission", { required: true })], MembershipOverride.prototype, "permissionId", 2);
1498
- __decorateClass$6([field({ type: "text" })], MembershipOverride.prototype, "effect", 2);
1499
- MembershipOverride = __decorateClass$6([smrt({
1499
+ __decorateClass$7([foreignKey("Membership", { required: true })], MembershipOverride.prototype, "membershipId", 2);
1500
+ __decorateClass$7([foreignKey("Permission", { required: true })], MembershipOverride.prototype, "permissionId", 2);
1501
+ __decorateClass$7([field({ type: "text" })], MembershipOverride.prototype, "effect", 2);
1502
+ MembershipOverride = __decorateClass$7([smrt({
1500
1503
  api: { include: ["list", "get"] },
1501
1504
  mcp: { include: ["list", "get"] },
1502
1505
  cli: { skipApiCheck: true }
@@ -1597,6 +1600,163 @@ var MembershipOverrideCollection = class extends SmrtCollection {
1597
1600
  }
1598
1601
  };
1599
1602
  //#endregion
1603
+ //#region src/models/PasswordCredential.ts
1604
+ var __defProp$6 = Object.defineProperty;
1605
+ var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
1606
+ var __decorateClass$6 = (decorators, target, key, kind) => {
1607
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
1608
+ for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1609
+ if (kind && result) __defProp$6(target, key, result);
1610
+ return result;
1611
+ };
1612
+ var UsersPasswordCredential = class extends SmrtObject {
1613
+ userId = "";
1614
+ passwordHash = "";
1615
+ version = 1;
1616
+ mustChange = false;
1617
+ rotatedAt = null;
1618
+ rotatedBy = null;
1619
+ };
1620
+ __decorateClass$6([foreignKey("User", {
1621
+ required: true,
1622
+ unique: true
1623
+ })], UsersPasswordCredential.prototype, "userId", 2);
1624
+ __decorateClass$6([field({
1625
+ type: "text",
1626
+ required: true,
1627
+ sensitive: true
1628
+ })], UsersPasswordCredential.prototype, "passwordHash", 2);
1629
+ __decorateClass$6([field({
1630
+ type: "integer",
1631
+ required: true,
1632
+ default: 1
1633
+ })], UsersPasswordCredential.prototype, "version", 2);
1634
+ __decorateClass$6([field({
1635
+ type: "boolean",
1636
+ required: true,
1637
+ default: false
1638
+ })], UsersPasswordCredential.prototype, "mustChange", 2);
1639
+ __decorateClass$6([field({
1640
+ type: "datetime",
1641
+ nullable: true
1642
+ })], UsersPasswordCredential.prototype, "rotatedAt", 2);
1643
+ __decorateClass$6([field({
1644
+ type: "text",
1645
+ nullable: true
1646
+ })], UsersPasswordCredential.prototype, "rotatedBy", 2);
1647
+ UsersPasswordCredential = __decorateClass$6([smrt({
1648
+ tableName: "users_password_credentials",
1649
+ sensitive: true,
1650
+ api: false,
1651
+ cli: false,
1652
+ mcp: false
1653
+ })], UsersPasswordCredential);
1654
+ //#endregion
1655
+ //#region src/collections/PasswordCredentialCollection.ts
1656
+ var UsersPasswordCredentialCollection = class extends SmrtCollection {
1657
+ static _itemClass = UsersPasswordCredential;
1658
+ async findByUserId(userId) {
1659
+ const [credential] = await this.list({
1660
+ limit: 1,
1661
+ where: { userId }
1662
+ });
1663
+ return credential ?? null;
1664
+ }
1665
+ /**
1666
+ * Insert the first credential row for `userId`. Returns null, writing
1667
+ * nothing, when one already exists or a concurrent insert won (the unique
1668
+ * `user_id` decides): a first password never replaces another.
1669
+ */
1670
+ async insertIfAbsent(userId, write) {
1671
+ if (await this.findByUserId(userId)) return null;
1672
+ try {
1673
+ return await this.create({
1674
+ userId,
1675
+ passwordHash: write.passwordHash,
1676
+ mustChange: write.mustChange,
1677
+ rotatedAt: write.rotatedAt,
1678
+ rotatedBy: write.rotatedBy,
1679
+ version: 1,
1680
+ _insertOnly: true
1681
+ });
1682
+ } catch (error) {
1683
+ if (await this.findByUserId(userId)) return null;
1684
+ throw error;
1685
+ }
1686
+ }
1687
+ /**
1688
+ * Create or replace the one credential row for `userId`, bumping `version`
1689
+ * on replace — the administrative write, where the last writer wins.
1690
+ * Losing a concurrent first insert is retried once as a replace.
1691
+ */
1692
+ async upsertForUser(userId, write) {
1693
+ for (let attempt = 0; attempt < 2; attempt++) {
1694
+ const existing = await this.findByUserId(userId);
1695
+ if (!existing) {
1696
+ const created = await this.insertIfAbsent(userId, write);
1697
+ if (created) return created;
1698
+ continue;
1699
+ }
1700
+ existing.passwordHash = write.passwordHash;
1701
+ existing.mustChange = write.mustChange;
1702
+ existing.rotatedAt = write.rotatedAt;
1703
+ existing.rotatedBy = write.rotatedBy;
1704
+ existing.version = (existing.version ?? 0) + 1;
1705
+ try {
1706
+ await existing.save();
1707
+ return existing;
1708
+ } catch (error) {
1709
+ if (attempt === 0) continue;
1710
+ throw error;
1711
+ }
1712
+ }
1713
+ throw new Error("Unable to persist password credential.");
1714
+ }
1715
+ /**
1716
+ * Replace the password only if the row is still exactly `expected` — the
1717
+ * credential whose current password the person just proved. One guarded
1718
+ * statement, so a reset (or any other write) that landed after the proof
1719
+ * is never overwritten with a password chosen under the old one. Clears
1720
+ * `mustChange` and bumps `version`. Returns false when the row had moved on.
1721
+ */
1722
+ async replaceIfCurrent(expected, write) {
1723
+ await this.db.query(`UPDATE ${this.tableName}
1724
+ SET password_hash = ?, must_change = FALSE, version = version + 1,
1725
+ rotated_at = ?, rotated_by = ?, updated_at = ?
1726
+ WHERE id = ? AND password_hash = ?`, write.passwordHash, write.rotatedAt.toISOString(), write.rotatedBy, (/* @__PURE__ */ new Date()).toISOString(), expected.id, expected.passwordHash);
1727
+ return (await this.findByUserId(expected.userId))?.passwordHash === write.passwordHash;
1728
+ }
1729
+ /**
1730
+ * Delete the row only if it is still exactly `expected` (see
1731
+ * {@link replaceIfCurrent}). Returns false when it had moved on.
1732
+ */
1733
+ async deleteIfCurrent(expected) {
1734
+ await this.db.query(`DELETE FROM ${this.tableName} WHERE id = ? AND password_hash = ?`, expected.id, expected.passwordHash);
1735
+ const current = await this.findByUserId(expected.userId);
1736
+ return current === null || current.id !== expected.id;
1737
+ }
1738
+ /**
1739
+ * Swap the stored hash for a stronger encoding of the SAME password — the
1740
+ * parameter upgrade after a successful sign-in — only if the row still
1741
+ * holds `expectedHash`. One guarded statement, so a reset or change that
1742
+ * landed in between is never overwritten with the old password. Leaves
1743
+ * `version`, `mustChange`, and `rotatedAt` alone: this is not a rotation.
1744
+ * Returns false when the row had moved on.
1745
+ */
1746
+ async replaceHashIfUnchanged(userId, expectedHash, upgradedHash) {
1747
+ await this.db.query(`UPDATE ${this.tableName}
1748
+ SET password_hash = ?, updated_at = ?
1749
+ WHERE user_id = ? AND password_hash = ?`, upgradedHash, (/* @__PURE__ */ new Date()).toISOString(), userId, expectedHash);
1750
+ return (await this.findByUserId(userId))?.passwordHash === upgradedHash;
1751
+ }
1752
+ async deleteByUserId(userId) {
1753
+ const existing = await this.findByUserId(userId);
1754
+ if (!existing) return false;
1755
+ await existing.delete();
1756
+ return true;
1757
+ }
1758
+ };
1759
+ //#endregion
1600
1760
  //#region src/models/Permission.ts
1601
1761
  var __defProp$5 = Object.defineProperty;
1602
1762
  var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
@@ -4108,6 +4268,88 @@ function withoutListBounds(options) {
4108
4268
  maxListLimit: void 0
4109
4269
  };
4110
4270
  }
4271
+ var MAX_N = 2 ** 20;
4272
+ var MAX_R = 32;
4273
+ var MAX_P = 16;
4274
+ function isValidScryptParams(params) {
4275
+ const { N, r, p } = params;
4276
+ return Number.isSafeInteger(N) && Number.isSafeInteger(r) && Number.isSafeInteger(p) && N >= 2 && N <= MAX_N && (N & N - 1) === 0 && r >= 1 && r <= MAX_R && p >= 1 && p <= MAX_P;
4277
+ }
4278
+ function derive(secret, pepper, params, salt) {
4279
+ return new Promise((resolve, reject) => {
4280
+ scrypt(`${pepper}\0${secret}`, salt, 32, {
4281
+ N: params.N,
4282
+ r: params.r,
4283
+ p: params.p,
4284
+ maxmem: 128 * params.r * (params.N + params.p + 2) * 2
4285
+ }, (error, key) => error ? reject(error) : resolve(key));
4286
+ });
4287
+ }
4288
+ async function hashSecret(secret, pepper, params, salt = randomBytes(16)) {
4289
+ const derived = await derive(secret, pepper, params, salt);
4290
+ return `scrypt$${params.N}$${params.r}$${params.p}$${salt.toString("base64")}$${derived.toString("base64")}`;
4291
+ }
4292
+ function parseScryptHash(encoded) {
4293
+ if (typeof encoded !== "string") return null;
4294
+ const [scheme, N, r, p, saltB64, hashB64, ...rest] = encoded.split("$");
4295
+ if (scheme !== "scrypt" || !saltB64 || !hashB64 || rest.length > 0) return null;
4296
+ const params = {
4297
+ N: Number(N),
4298
+ r: Number(r),
4299
+ p: Number(p)
4300
+ };
4301
+ if (!isValidScryptParams(params)) return null;
4302
+ const hash = Buffer.from(hashB64, "base64");
4303
+ if (hash.length !== 32) return null;
4304
+ return {
4305
+ params,
4306
+ salt: Buffer.from(saltB64, "base64"),
4307
+ hash
4308
+ };
4309
+ }
4310
+ async function verifySecretHash(secret, pepper, encoded) {
4311
+ const parsed = parseScryptHash(encoded);
4312
+ if (!parsed) return false;
4313
+ const candidate = await derive(secret, pepper, parsed.params, parsed.salt);
4314
+ return candidate.length === parsed.hash.length && timingSafeEqual(candidate, parsed.hash);
4315
+ }
4316
+ function scryptPaddingParams(encoded, policy) {
4317
+ const parsed = parseScryptHash(encoded);
4318
+ let deficit = scryptCost(policy) - (parsed ? scryptCost(parsed.params) : 0);
4319
+ const padding = [];
4320
+ const lane = policy.N * policy.r;
4321
+ const lanes = Math.floor(deficit / lane);
4322
+ if (lanes >= 1) {
4323
+ padding.push({
4324
+ N: policy.N,
4325
+ r: policy.r,
4326
+ p: lanes
4327
+ });
4328
+ deficit -= lanes * lane;
4329
+ }
4330
+ for (let step = 0; step < 6 && deficit >= lane / 64; step++) {
4331
+ const N = 2 ** Math.floor(Math.log2(deficit / policy.r));
4332
+ if (N < 2) break;
4333
+ padding.push({
4334
+ N,
4335
+ r: policy.r,
4336
+ p: 1
4337
+ });
4338
+ deficit -= N * policy.r;
4339
+ }
4340
+ return padding;
4341
+ }
4342
+ async function padScryptWork(encoded, policy) {
4343
+ for (const params of scryptPaddingParams(encoded, policy)) await derive("", "", params, randomBytes(16));
4344
+ }
4345
+ function scryptCost(params) {
4346
+ return params.N * params.r * params.p;
4347
+ }
4348
+ function scryptHashNeedsUpgrade(encoded, policy) {
4349
+ const parsed = parseScryptHash(encoded);
4350
+ if (!parsed) return true;
4351
+ return parsed.params.N < policy.N || parsed.params.r < policy.r || parsed.params.p < policy.p;
4352
+ }
4111
4353
  //#endregion
4112
4354
  //#region src/services/LoginAttemptLimiter.ts
4113
4355
  var DEFAULT_LOGIN_MAX_ATTEMPTS = 5;
@@ -5048,8 +5290,8 @@ var SessionService = class SessionService {
5048
5290
  /**
5049
5291
  * Destroy all sessions for a user (logout from all devices)
5050
5292
  */
5051
- async destroyAllUserSessions(userId) {
5052
- return this.sessionCollection.revokeUserSessions(userId);
5293
+ async destroyAllUserSessions(userId, options = {}) {
5294
+ return this.sessionCollection.revokeUserSessions(userId, options);
5053
5295
  }
5054
5296
  /**
5055
5297
  * Switch tenant context for a session.
@@ -5208,42 +5450,14 @@ var DeviceCredentialPolicyError = class extends Error {
5208
5450
  this.name = "DeviceCredentialPolicyError";
5209
5451
  }
5210
5452
  };
5211
- var UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
5212
- var DEFAULT_SCRYPT = {
5453
+ var UUID_PATTERN$1 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
5454
+ var DEFAULT_SCRYPT$1 = {
5213
5455
  N: 2 ** 15,
5214
5456
  r: 8,
5215
5457
  p: 1
5216
5458
  };
5217
- var HASH_BYTES = 32;
5218
- async function hashPin(pin, pepper, params, salt = randomBytes(16)) {
5219
- const derived = await new Promise((resolve, reject) => {
5220
- scrypt(`${pepper}\0${pin}`, salt, HASH_BYTES, {
5221
- N: params.N,
5222
- r: params.r,
5223
- p: params.p,
5224
- maxmem: 128 * params.N * params.r * 2
5225
- }, (error, key) => error ? reject(error) : resolve(key));
5226
- });
5227
- return `scrypt$${params.N}$${params.r}$${params.p}$${salt.toString("base64")}$${derived.toString("base64")}`;
5228
- }
5229
- async function verifyPinHash(pin, pepper, encoded) {
5230
- const [scheme, N, r, p, saltB64, hashB64] = encoded.split("$");
5231
- if (scheme !== "scrypt" || !saltB64 || !hashB64) return false;
5232
- const params = {
5233
- N: Number(N),
5234
- r: Number(r),
5235
- p: Number(p)
5236
- };
5237
- if (![
5238
- params.N,
5239
- params.r,
5240
- params.p
5241
- ].every(Number.isFinite)) return false;
5242
- const expected = Buffer.from(hashB64, "base64");
5243
- const candidate = await hashPin(pin, pepper, params, Buffer.from(saltB64, "base64"));
5244
- const actual = Buffer.from(candidate.split("$")[5] ?? "", "base64");
5245
- return actual.length === expected.length && timingSafeEqual(actual, expected);
5246
- }
5459
+ var hashPin = hashSecret;
5460
+ var verifyPinHash = verifySecretHash;
5247
5461
  function isTrivialPin(pin) {
5248
5462
  if (/^(\d)\1+$/u.test(pin)) return true;
5249
5463
  let ascending = true;
@@ -5269,7 +5483,7 @@ var PinVerifier = class {
5269
5483
  return input.userId;
5270
5484
  }
5271
5485
  async verify(input) {
5272
- const credential = UUID_PATTERN.test(input.userId) ? await this.credentials.findByUserId(input.userId) : null;
5486
+ const credential = UUID_PATTERN$1.test(input.userId) ? await this.credentials.findByUserId(input.userId) : null;
5273
5487
  const encoded = credential?.pinHash || this.dummyHash;
5274
5488
  if (!await verifyPinHash(input.pin, this.pepper, encoded) || !credential) return null;
5275
5489
  const { userId, pinHash } = credential;
@@ -5315,7 +5529,7 @@ var DeviceCredentialService = class DeviceCredentialService {
5315
5529
  rejectTrivial: options.pin?.rejectTrivial ?? true,
5316
5530
  pepper: options.pin?.pepper ?? "",
5317
5531
  scrypt: {
5318
- ...DEFAULT_SCRYPT,
5532
+ ...DEFAULT_SCRYPT$1,
5319
5533
  ...options.pin?.scrypt
5320
5534
  }
5321
5535
  };
@@ -5609,7 +5823,7 @@ var DeviceCredentialService = class DeviceCredentialService {
5609
5823
  async assertCanManage(actor, targetUserId) {
5610
5824
  if (actor.authMethod === "pin" || actor.parent) throw new DeviceCredentialForbiddenError();
5611
5825
  if (!actor.permissions.includes(this.managePermission)) throw new DeviceCredentialForbiddenError();
5612
- const active = actor.tenantId && UUID_PATTERN.test(targetUserId) ? (await withSystemContext(() => this.memberships.findByUser(targetUserId))).filter((membership) => membership.isActive()) : [];
5826
+ const active = actor.tenantId && UUID_PATTERN$1.test(targetUserId) ? (await withSystemContext(() => this.memberships.findByUser(targetUserId))).filter((membership) => membership.isActive()) : [];
5613
5827
  if (active.length === 0 || active.some((membership) => membership.tenantId !== actor.tenantId)) throw new DeviceCredentialForbiddenError();
5614
5828
  }
5615
5829
  assertPinPolicy(pin) {
@@ -7613,6 +7827,470 @@ async function assertOperationPermission(options) {
7613
7827
  throw new OperationPermissionError(decision);
7614
7828
  }
7615
7829
  //#endregion
7830
+ //#region src/services/PasswordCredentialService.ts
7831
+ var PASSWORD_LOGIN_KIND = "password";
7832
+ var DEFAULT_PASSWORD_MANAGE_PERMISSION = "users.password.manage";
7833
+ var DEFAULT_PASSWORD_MIN_LENGTH = 10;
7834
+ var DEFAULT_PASSWORD_MAX_LENGTH = 256;
7835
+ var PASSWORD_MAX_LENGTH_CEILING = 1024;
7836
+ var MAX_IDENTIFIER_LENGTH = 320;
7837
+ var DEFAULT_PASSWORD_DENYLIST = Object.freeze([
7838
+ "1234567890",
7839
+ "0123456789",
7840
+ "12345678910",
7841
+ "1111111111",
7842
+ "0000000000",
7843
+ "qwertyuiop",
7844
+ "password12",
7845
+ "password123",
7846
+ "password1234",
7847
+ "passw0rd123",
7848
+ "iloveyou123",
7849
+ "letmein123",
7850
+ "welcome123",
7851
+ "abc1234567",
7852
+ "abcdefghij",
7853
+ "qwerty1234",
7854
+ "qwerty12345",
7855
+ "1q2w3e4r5t",
7856
+ "1qaz2wsx3edc",
7857
+ "zaq12wsxcde",
7858
+ "changeme123",
7859
+ "administrator",
7860
+ "trustno1234"
7861
+ ]);
7862
+ var PASSWORD_PERMISSION_DEFINITIONS = [{
7863
+ slug: DEFAULT_PASSWORD_MANAGE_PERMISSION,
7864
+ category: "users",
7865
+ name: "Manage passwords",
7866
+ description: "Set, reset, or clear another person's password"
7867
+ }];
7868
+ var passwordPermissionsRegistered = false;
7869
+ function ensurePasswordPermissionsRegistered() {
7870
+ if (passwordPermissionsRegistered) return;
7871
+ passwordPermissionsRegistered = true;
7872
+ registerPermissionDefinitions(PASSWORD_PERMISSION_DEFINITIONS);
7873
+ }
7874
+ var PasswordCredentialError = class extends InvalidCredentialsError {
7875
+ constructor(message = "Invalid credentials.") {
7876
+ super(message);
7877
+ this.name = "PasswordCredentialError";
7878
+ }
7879
+ };
7880
+ var PasswordCredentialForbiddenError = class extends Error {
7881
+ constructor(message = "Not permitted to manage this password.") {
7882
+ super(message);
7883
+ this.name = "PasswordCredentialForbiddenError";
7884
+ }
7885
+ };
7886
+ var PasswordPolicyError = class extends Error {
7887
+ constructor(message) {
7888
+ super(message);
7889
+ this.name = "PasswordPolicyError";
7890
+ }
7891
+ };
7892
+ var UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
7893
+ var DEFAULT_SCRYPT = {
7894
+ N: 2 ** 15,
7895
+ r: 8,
7896
+ p: 1
7897
+ };
7898
+ function normalizePassword(password) {
7899
+ return password.normalize("NFKC");
7900
+ }
7901
+ function codePointLength(value) {
7902
+ let length = 0;
7903
+ for (const _ of value) length++;
7904
+ return length;
7905
+ }
7906
+ var PasswordCredentialService = class PasswordCredentialService {
7907
+ options;
7908
+ sessionTtl;
7909
+ managePermission;
7910
+ policy;
7911
+ sessionService;
7912
+ memberships;
7913
+ users;
7914
+ credentials;
7915
+ limiter;
7916
+ dummyHash;
7917
+ constructor(options) {
7918
+ this.options = options;
7919
+ ensurePasswordPermissionsRegistered();
7920
+ this.sessionTtl = options.sessionTtl ?? 604800;
7921
+ if (!(Number.isFinite(this.sessionTtl) && this.sessionTtl > 0)) throw new Error("PasswordCredentialService sessionTtl must be a positive number.");
7922
+ this.managePermission = options.managePermission ?? "users.password.manage";
7923
+ const configured = options.password ?? {};
7924
+ const minLength = configured.minLength ?? 10;
7925
+ const maxLength = configured.maxLength ?? 256;
7926
+ if (!Number.isSafeInteger(minLength) || !Number.isSafeInteger(maxLength) || minLength < 1 || maxLength < minLength || maxLength > 1024) throw new Error(`PasswordCredentialService password length bounds must satisfy 1 <= minLength <= maxLength <= ${PASSWORD_MAX_LENGTH_CEILING}.`);
7927
+ const scrypt = {
7928
+ ...DEFAULT_SCRYPT,
7929
+ ...configured.scrypt
7930
+ };
7931
+ if (!isValidScryptParams(scrypt)) throw new Error("PasswordCredentialService password.scrypt must be valid scrypt parameters (N a power of two up to 2^20, r <= 32, p <= 16).");
7932
+ const denylist = /* @__PURE__ */ new Set();
7933
+ for (const entry of [...DEFAULT_PASSWORD_DENYLIST, ...configured.denylist ?? []]) if (typeof entry === "string" && entry) denylist.add(normalizePassword(entry).toLowerCase());
7934
+ this.policy = {
7935
+ minLength,
7936
+ maxLength,
7937
+ denylist,
7938
+ reject: configured.reject,
7939
+ pepper: configured.pepper ?? "",
7940
+ scrypt
7941
+ };
7942
+ }
7943
+ static async create(options) {
7944
+ const service = new PasswordCredentialService(options);
7945
+ await service.initialize();
7946
+ return service;
7947
+ }
7948
+ async initialize() {
7949
+ this.sessionService = await SessionService.create({
7950
+ ...this.options,
7951
+ defaultTTL: this.sessionTtl
7952
+ });
7953
+ this.memberships = await MembershipCollection.create(withoutListBounds(this.options));
7954
+ this.users = await UserCollection.create(this.options);
7955
+ this.credentials = await UsersPasswordCredentialCollection.create(this.options);
7956
+ this.limiter = this.options.loginLimiter ?? await LoginAttemptLimiter.create({
7957
+ ...this.options,
7958
+ ...this.options.limiter
7959
+ });
7960
+ this.dummyHash = await hashSecret(randomBytes(16).toString("hex"), this.policy.pepper, this.policy.scrypt);
7961
+ }
7962
+ /** The limiter in use (shared or private). */
7963
+ get loginLimiter() {
7964
+ return this.limiter;
7965
+ }
7966
+ /**
7967
+ * Verify an email and password and mint a session. Throws
7968
+ * {@link PasswordCredentialError} for every refusal that is not a rate
7969
+ * limit and {@link LoginRateLimitError} when the budget is exhausted.
7970
+ */
7971
+ async signIn(input) {
7972
+ const identifier = typeof input.identifier === "string" ? input.identifier : "";
7973
+ const emailKey = identifier.length <= MAX_IDENTIFIER_LENGTH ? normalizeEmail(identifier) : "";
7974
+ const password = typeof input.password === "string" ? input.password : "";
7975
+ const source = input.ipAddress?.trim() || null;
7976
+ if (!emailKey && !source) throw new PasswordCredentialError();
7977
+ const tenantId = input.tenantId || null;
7978
+ const lease = await this.limiter.reserve({
7979
+ kind: PASSWORD_LOGIN_KIND,
7980
+ subject: emailKey || null,
7981
+ source,
7982
+ metadata: { tenantId }
7983
+ });
7984
+ if (!lease.allowed) throw new LoginRateLimitError(lease);
7985
+ let credentialFailed = false;
7986
+ let mintedSessionId = null;
7987
+ try {
7988
+ if (!emailKey || !password) {
7989
+ credentialFailed = true;
7990
+ throw new PasswordCredentialError();
7991
+ }
7992
+ const candidate = normalizePassword(password);
7993
+ const tooLong = codePointLength(candidate) > this.policy.maxLength;
7994
+ const user = tooLong ? null : await this.findUserByEmailKey(emailKey);
7995
+ const credential = user?.id && UUID_PATTERN.test(user.id) ? await this.credentials.findByUserId(user.id) : null;
7996
+ if (!(tooLong ? false : await this.verifyEqualWork(candidate, credential?.passwordHash)) || !credential || !user?.id) {
7997
+ credentialFailed = true;
7998
+ throw new PasswordCredentialError();
7999
+ }
8000
+ if (!user.isActive()) {
8001
+ credentialFailed = true;
8002
+ throw new PasswordCredentialError();
8003
+ }
8004
+ const userId = user.id;
8005
+ if (tenantId) {
8006
+ if (!(await this.memberships.findByUserAndTenant(userId, tenantId))?.isActive()) {
8007
+ credentialFailed = true;
8008
+ throw new PasswordCredentialError();
8009
+ }
8010
+ }
8011
+ const mustChange = credential.mustChange === true;
8012
+ const now = Date.now();
8013
+ const sessionId = await this.sessionService.createSession(userId, tenantId ?? void 0, {
8014
+ ttl: this.sessionTtl,
8015
+ ipAddress: input.ipAddress,
8016
+ userAgent: input.userAgent,
8017
+ authMethod: PASSWORD_LOGIN_KIND,
8018
+ ...mustChange && { data: { [SESSION_DATA_KEYS.permissionCeiling]: [] } }
8019
+ });
8020
+ mintedSessionId = sessionId;
8021
+ const current = await this.credentials.findByUserId(userId);
8022
+ if (!(current !== null && (current.passwordHash === credential.passwordHash || current.id === credential.id && current.version === credential.version && await verifySecretHash(candidate, this.policy.pepper, current.passwordHash)))) {
8023
+ credentialFailed = true;
8024
+ throw new PasswordCredentialError();
8025
+ }
8026
+ await this.upgradeHashIfNeeded(userId, candidate, credential);
8027
+ const previous = input.replaceSessionId?.trim();
8028
+ if (previous && previous !== sessionId) await this.sessionService.destroySession(previous).catch(() => void 0);
8029
+ await lease.succeed();
8030
+ return {
8031
+ sessionId,
8032
+ userId,
8033
+ tenantId,
8034
+ authMethod: PASSWORD_LOGIN_KIND,
8035
+ expiresAt: new Date(now + this.sessionTtl * 1e3).toISOString(),
8036
+ mustChange
8037
+ };
8038
+ } catch (error) {
8039
+ if (credentialFailed) await lease.fail().catch(() => void 0);
8040
+ else await lease.release().catch(() => void 0);
8041
+ if (mintedSessionId) await this.sessionService.destroySession(mintedSessionId).catch(() => void 0);
8042
+ throw error;
8043
+ }
8044
+ }
8045
+ /**
8046
+ * Set a password where the person has none: the person themself from any
8047
+ * first-class session, or an administrator holding `managePermission` for
8048
+ * someone else (which, if a password already exists, replaces it and ends
8049
+ * every session of theirs like {@link resetPassword} without the
8050
+ * must-change flag). A person who already has one uses
8051
+ * {@link changePassword}.
8052
+ */
8053
+ async setPassword(input) {
8054
+ this.assertNotLayered(input.actor);
8055
+ const self = input.actor.user.id === input.userId;
8056
+ if (!self) await this.assertCanManage(input.actor, input.userId);
8057
+ const user = await this.requireUser(input.userId);
8058
+ const existing = await this.credentials.findByUserId(input.userId);
8059
+ if (self && existing) throw new PasswordCredentialForbiddenError();
8060
+ const password = await this.assertPolicy(input.password, user);
8061
+ const write = {
8062
+ passwordHash: await this.hashPassword(password),
8063
+ mustChange: false,
8064
+ rotatedAt: /* @__PURE__ */ new Date(),
8065
+ rotatedBy: self ? "self" : input.actor.user.id ?? "admin"
8066
+ };
8067
+ let revokedSessions = 0;
8068
+ if (self) {
8069
+ if (!await this.credentials.insertIfAbsent(input.userId, write)) throw new PasswordCredentialForbiddenError();
8070
+ } else if (existing || !await this.credentials.insertIfAbsent(input.userId, write)) {
8071
+ revokedSessions += await this.sessionService.destroyAllUserSessions(input.userId);
8072
+ await this.credentials.upsertForUser(input.userId, write);
8073
+ revokedSessions += await this.sessionService.destroyAllUserSessions(input.userId);
8074
+ }
8075
+ await this.recordManagement(input.userId, input.ipAddress, {
8076
+ action: "set",
8077
+ self,
8078
+ ...self ? {} : { actorId: input.actor.user.id },
8079
+ revokedSessions
8080
+ });
8081
+ return { revokedSessions };
8082
+ }
8083
+ /**
8084
+ * The person changes their own password, proving the current one. Every
8085
+ * other session of theirs ends — the reason to change may be that it
8086
+ * leaked — and so does this one when it is the restricted session a reset
8087
+ * password signed in to.
8088
+ */
8089
+ async changePassword(input) {
8090
+ this.assertNotLayered(input.actor);
8091
+ const userId = input.actor.user.id;
8092
+ if (!userId) throw new PasswordCredentialForbiddenError();
8093
+ const user = await this.requireUser(userId);
8094
+ const existing = await this.verifyCurrent(user, input.currentPassword, input.ipAddress, "change-password");
8095
+ const password = await this.assertPolicy(input.newPassword, user);
8096
+ const passwordHash = await this.hashPassword(password);
8097
+ const endedCurrentSession = existing.mustChange;
8098
+ const endOthers = () => this.sessionService.destroyAllUserSessions(userId, { exceptSessionId: endedCurrentSession ? void 0 : input.actor.sessionId });
8099
+ let revokedSessions = await endOthers();
8100
+ if (!await this.credentials.replaceIfCurrent(existing, {
8101
+ passwordHash,
8102
+ rotatedAt: /* @__PURE__ */ new Date(),
8103
+ rotatedBy: "self"
8104
+ })) throw new PasswordCredentialError();
8105
+ revokedSessions += await endOthers();
8106
+ await this.recordManagement(userId, input.ipAddress, {
8107
+ action: "change",
8108
+ self: true,
8109
+ revokedSessions
8110
+ });
8111
+ return {
8112
+ revokedSessions,
8113
+ endedCurrentSession
8114
+ };
8115
+ }
8116
+ /**
8117
+ * Administrative reset: replace someone else's password and end every
8118
+ * session they hold. `mustChange` (default true) makes the next sign-in a
8119
+ * restricted session that can only change the password.
8120
+ */
8121
+ async resetPassword(input) {
8122
+ this.assertNotLayered(input.actor);
8123
+ if (input.actor.user.id === input.userId) throw new PasswordCredentialForbiddenError();
8124
+ await this.assertCanManage(input.actor, input.userId);
8125
+ const user = await this.requireUser(input.userId);
8126
+ const password = await this.assertPolicy(input.password, user);
8127
+ const mustChange = input.mustChange ?? true;
8128
+ const write = {
8129
+ passwordHash: await this.hashPassword(password),
8130
+ mustChange,
8131
+ rotatedAt: /* @__PURE__ */ new Date(),
8132
+ rotatedBy: input.actor.user.id ?? "admin"
8133
+ };
8134
+ let revokedSessions = await this.sessionService.destroyAllUserSessions(input.userId);
8135
+ await this.credentials.upsertForUser(input.userId, write);
8136
+ revokedSessions += await this.sessionService.destroyAllUserSessions(input.userId);
8137
+ await this.recordManagement(input.userId, input.ipAddress, {
8138
+ action: "reset",
8139
+ actorId: input.actor.user.id,
8140
+ mustChange,
8141
+ revokedSessions
8142
+ });
8143
+ return { revokedSessions };
8144
+ }
8145
+ /**
8146
+ * Remove a person's password and end their password sessions. An
8147
+ * administrator holding `managePermission`, or the person proving the
8148
+ * current password (not from a must-change session).
8149
+ */
8150
+ async clearPassword(input) {
8151
+ this.assertNotLayered(input.actor);
8152
+ const self = input.actor.user.id === input.userId;
8153
+ let proven = null;
8154
+ if (self) {
8155
+ const user = await this.requireUser(input.userId);
8156
+ proven = await this.verifyCurrent(user, input.currentPassword ?? "", input.ipAddress, "clear-password");
8157
+ if (proven.mustChange) throw new PasswordCredentialForbiddenError();
8158
+ } else await this.assertCanManage(input.actor, input.userId);
8159
+ const endPasswordSessions = () => this.sessionService.destroyUserSessionsByAuthMethod(input.userId, PASSWORD_LOGIN_KIND);
8160
+ let revokedSessions = await endPasswordSessions();
8161
+ if (proven) {
8162
+ if (!await this.credentials.deleteIfCurrent(proven)) throw new PasswordCredentialError();
8163
+ } else await this.credentials.deleteByUserId(input.userId);
8164
+ revokedSessions += await endPasswordSessions();
8165
+ await this.recordManagement(input.userId, input.ipAddress, {
8166
+ action: "clear",
8167
+ self,
8168
+ ...self ? {} : { actorId: input.actor.user.id },
8169
+ revokedSessions
8170
+ });
8171
+ return { revokedSessions };
8172
+ }
8173
+ /** Whether the person has a password (for admin UIs; never for sign-in responses). */
8174
+ async hasPassword(userId) {
8175
+ if (!UUID_PATTERN.test(userId)) return false;
8176
+ return await this.credentials.findByUserId(userId) !== null;
8177
+ }
8178
+ /**
8179
+ * Check a candidate against the policy without storing it — for a form
8180
+ * that wants to say "too short" before submitting. Throws
8181
+ * {@link PasswordPolicyError}.
8182
+ */
8183
+ async validatePassword(password, userId) {
8184
+ await this.assertPolicy(password, await this.requireUser(userId));
8185
+ }
8186
+ async findUserByEmailKey(emailKey) {
8187
+ const [user] = await this.users.list({
8188
+ where: { emailKey },
8189
+ limit: 1
8190
+ });
8191
+ return user ?? null;
8192
+ }
8193
+ async requireUser(userId) {
8194
+ const user = UUID_PATTERN.test(userId) ? await this.users.get(userId) : null;
8195
+ if (!user) throw new PasswordCredentialForbiddenError();
8196
+ return user;
8197
+ }
8198
+ /**
8199
+ * Prove the current password for a self-service change or clear, through
8200
+ * the limiter on the same subject key as sign-in, so these paths cannot be
8201
+ * used to guess outside the sign-in budget.
8202
+ */
8203
+ async verifyCurrent(user, currentPassword, ipAddress, purpose) {
8204
+ if (typeof currentPassword !== "string" || !currentPassword) throw new PasswordCredentialError();
8205
+ const lease = await this.limiter.reserve({
8206
+ kind: PASSWORD_LOGIN_KIND,
8207
+ subject: user.emailKey || user.id,
8208
+ source: ipAddress,
8209
+ metadata: { purpose }
8210
+ });
8211
+ if (!lease.allowed) throw new LoginRateLimitError(lease);
8212
+ try {
8213
+ const existing = await this.credentials.findByUserId(user.id);
8214
+ const candidate = normalizePassword(currentPassword);
8215
+ if (!(codePointLength(candidate) > this.policy.maxLength ? false : await this.verifyEqualWork(candidate, existing?.passwordHash)) || !existing) {
8216
+ await lease.fail().catch(() => void 0);
8217
+ throw new PasswordCredentialError();
8218
+ }
8219
+ await lease.succeed().catch(() => void 0);
8220
+ return existing;
8221
+ } catch (error) {
8222
+ if (!(error instanceof PasswordCredentialError)) await lease.release().catch(() => void 0);
8223
+ throw error;
8224
+ }
8225
+ }
8226
+ assertNotLayered(actor) {
8227
+ if (actor.parent || actor.authMethod === "pin") throw new PasswordCredentialForbiddenError();
8228
+ }
8229
+ async assertCanManage(actor, targetUserId) {
8230
+ if (!actor.permissions.includes(this.managePermission)) throw new PasswordCredentialForbiddenError();
8231
+ const active = actor.tenantId && UUID_PATTERN.test(targetUserId) ? (await withSystemContext(() => this.memberships.findByUser(targetUserId))).filter((membership) => membership.isActive()) : [];
8232
+ if (active.length === 0 || active.some((membership) => membership.tenantId !== actor.tenantId)) throw new PasswordCredentialForbiddenError();
8233
+ }
8234
+ /** Returns the normalized password to hash, or throws {@link PasswordPolicyError}. */
8235
+ async assertPolicy(password, user) {
8236
+ if (typeof password !== "string" || !password) throw new PasswordPolicyError("Enter a password.");
8237
+ const normalized = normalizePassword(password);
8238
+ const length = codePointLength(normalized);
8239
+ if (length < this.policy.minLength) throw new PasswordPolicyError(`Password must be at least ${this.policy.minLength} characters.`);
8240
+ if (length > this.policy.maxLength) throw new PasswordPolicyError(`Password must be at most ${this.policy.maxLength} characters.`);
8241
+ const folded = normalized.toLowerCase();
8242
+ if (this.policy.denylist.has(folded)) throw new PasswordPolicyError("That password is too common. Choose another.");
8243
+ const email = user.emailKey || normalizeEmail(user.email) || null;
8244
+ if (email && (folded === email || folded === email.split("@")[0])) throw new PasswordPolicyError("Password must not be your email address.");
8245
+ if (this.policy.reject) {
8246
+ const refusal = await this.policy.reject(normalized, {
8247
+ userId: user.id,
8248
+ email
8249
+ });
8250
+ if (refusal) throw new PasswordPolicyError(refusal);
8251
+ }
8252
+ return normalized;
8253
+ }
8254
+ hashPassword(password) {
8255
+ return hashSecret(password, this.policy.pepper, this.policy.scrypt);
8256
+ }
8257
+ /**
8258
+ * Verify against the stored hash, or the dummy hash when there is none,
8259
+ * doing the same scrypt work either way. A stored hash derived under
8260
+ * weaker parameters than the current policy (before its upgrade rehash)
8261
+ * would otherwise verify faster than the dummy does and reveal that the
8262
+ * credential exists, so its verification is padded up to the policy's
8263
+ * cost.
8264
+ */
8265
+ async verifyEqualWork(candidate, encoded) {
8266
+ const stored = encoded || this.dummyHash;
8267
+ const ok = await verifySecretHash(candidate, this.policy.pepper, stored);
8268
+ await padScryptWork(stored, this.policy.scrypt);
8269
+ return ok;
8270
+ }
8271
+ /**
8272
+ * Rehash a just-verified password whose stored parameters are below the
8273
+ * current policy. Best effort: a failure here must never turn a completed
8274
+ * sign-in into an error, and the guarded write never replaces a password
8275
+ * that changed after it was verified.
8276
+ */
8277
+ async upgradeHashIfNeeded(userId, password, credential) {
8278
+ if (!scryptHashNeedsUpgrade(credential.passwordHash, this.policy.scrypt)) return;
8279
+ try {
8280
+ const upgraded = await hashSecret(password, this.policy.pepper, this.policy.scrypt);
8281
+ await this.credentials.replaceHashIfUnchanged(userId, credential.passwordHash, upgraded);
8282
+ } catch {}
8283
+ }
8284
+ async recordManagement(userId, ipAddress, metadata) {
8285
+ await this.limiter.recordManagement({
8286
+ kind: PASSWORD_LOGIN_KIND,
8287
+ subject: userId,
8288
+ source: ipAddress,
8289
+ metadata
8290
+ });
8291
+ }
8292
+ };
8293
+ //#endregion
7616
8294
  //#region src/services/TerminalAuthService.ts
7617
8295
  var DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS = 2;
7618
8296
  var DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS = 600;
@@ -7894,6 +8572,6 @@ var TerminalAuthRateLimitError = class extends TerminalAuthError {
7894
8572
  }
7895
8573
  };
7896
8574
  //#endregion
7897
- export { normalizeAncestorReadPolicy as $, UsersCliAuthRequest as $t, DeviceCredentialForbiddenError as A, MembershipOverrideCollection as At, DEFAULT_LOGIN_LOCKOUT_BASE_SECONDS as B, User as Bt, encodeOidcTransaction as C, RolePermission as Ct, DEFAULT_DEVICE_PERSON_IDLE_SECONDS as D, UsersPinCredential as Dt, webapi_exports as E, UsersPinCredentialCollection as Et, PinVerifier as F, GroupRole as Ft, InvalidCredentialsError as G, UsersLoginAttemptCollection as Gt, DEFAULT_LOGIN_LOCKOUT_MAX_SECONDS as H, normalizeEmail as Ht, ensurePinPermissionsRegistered as I, GroupMemberCollection as It, withoutListBounds as J, SessionCollection as Jt, LoginAttemptLimiter as K, UsersLoginAttempt as Kt, SessionService as L, GroupMember as Lt, DeviceCredentialService as M, MembershipCollection as Mt, PIN_LOGIN_KIND as N, Membership as Nt, DEFAULT_PIN_MANAGE_PERMISSION as O, PermissionCollection as Ot, PIN_PERMISSION_DEFINITIONS as P, GroupRoleCollection as Pt, isAncestorReadableSlug as Q, generateSessionId as Qt, PermissionResolver as R, GroupCollection as Rt, decodeOidcTransaction as S, syncPermissionCatalog as St, resolveOidcProviderConfig as T, Role as Tt, DEFAULT_LOGIN_MAX_ATTEMPTS as U, UsersLoginAuditEventCollection as Ut, DEFAULT_LOGIN_LOCKOUT_FACTOR as V, isValidEmail as Vt, DurableLoginAuditSink as W, UsersLoginAuditEvent as Wt, DEFAULT_ANCESTOR_READ_MAX_DEPTH as X, SESSION_DATA_KEYS as Xt, ANCESTOR_READ_ACTION as Y, DEFAULT_SESSION_TTL as Yt, getConfiguredAncestorReadPolicy as Z, Session as Zt, MobileAuthService as _, PermissionCatalogService as _t, TerminalAuthError as a, TenantPermissionOverrideCollection as at, OidcLoginError as b, normalizeOperationPermissionAction as bt, OperationPermissionError as c, Tenant as ct, hasOperationPermission as d, applyTenantHierarchyUpdates as dt, OidcProvisioningError as et, getCurrentSessionPermissionContext as f, assertTenantTableName as ft, MobileAuthError as g, RolePermissionCollection as gt, withSessionPermissionContext as h, DEFAULT_ROLE_PERMISSION_PATTERNS as ht, TERMINAL_APPROVE_LOGIN_KIND as i, backfillUserEmailKeys as it, DeviceCredentialPolicyError as j, MembershipOverride as jt, DeviceCredentialError as k, Permission as kt, assertOperationPermission as l, MAX_TENANT_HIERARCHY_DEPTH as lt, withPrincipalPermissionContext as m, recordTenantHierarchyChanges as mt, DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS as n, USER_EMAIL_KEY_BACKFILL_NAME as nt, TerminalAuthRateLimitError as o, TenantPermissionOverride as ot, getRequestScopedDatabase as p, planTenantHierarchy as pt, LoginRateLimitError as q, UsersCliAuthRequestCollection as qt, DEFAULT_CLI_SESSION_TTL_SECONDS as r, UserEmailKeyBackfillError as rt, TerminalAuthService as s, TenantCollection as st, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS as t, UserCollection as tt, checkOperationPermission as u, TenantHierarchyError as ut, readMobileBearerToken as v, deriveOperationPermissionCollectionName as vt, getUsersOidcConfig as w, RoleCollection as wt, OidcLoginService as x, registerPermissionDefinitions as xt, validateMobileRedirectUri as y, deriveOperationPermissionSlug as yt, DEFAULT_LOGIN_ATTEMPT_WINDOW_SECONDS as z, Group as zt };
8575
+ export { DEFAULT_LOGIN_LOCKOUT_FACTOR as $, Group as $t, readMobileBearerToken as A, deriveOperationPermissionCollectionName as At, DEFAULT_PIN_MANAGE_PERMISSION as B, PermissionCollection as Bt, hasOperationPermission as C, applyTenantHierarchyUpdates as Ct, withSessionPermissionContext as D, DEFAULT_ROLE_PERMISSION_PATTERNS as Dt, withPrincipalPermissionContext as E, recordTenantHierarchyChanges as Et, encodeOidcTransaction as F, RolePermission as Ft, PIN_LOGIN_KIND as G, MembershipOverride as Gt, DeviceCredentialForbiddenError as H, UsersPasswordCredentialCollection as Ht, getUsersOidcConfig as I, RoleCollection as It, ensurePinPermissionsRegistered as J, GroupRoleCollection as Jt, PIN_PERMISSION_DEFINITIONS as K, MembershipCollection as Kt, resolveOidcProviderConfig as L, Role as Lt, OidcLoginError as M, normalizeOperationPermissionAction as Mt, OidcLoginService as N, registerPermissionDefinitions as Nt, MobileAuthError as O, RolePermissionCollection as Ot, decodeOidcTransaction as P, syncPermissionCatalog as Pt, DEFAULT_LOGIN_LOCKOUT_BASE_SECONDS as Q, GroupCollection as Qt, webapi_exports as R, UsersPinCredentialCollection as Rt, checkOperationPermission as S, TenantHierarchyError as St, getRequestScopedDatabase as T, planTenantHierarchy as Tt, DeviceCredentialPolicyError as U, UsersPasswordCredential as Ut, DeviceCredentialError as V, Permission as Vt, DeviceCredentialService as W, MembershipOverrideCollection as Wt, PermissionResolver as X, GroupMemberCollection as Xt, SessionService as Y, GroupRole as Yt, DEFAULT_LOGIN_ATTEMPT_WINDOW_SECONDS as Z, GroupMember as Zt, PasswordCredentialService as _, TenantPermissionOverrideCollection as _t, TerminalAuthError as a, UsersLoginAttemptCollection as an, LoginRateLimitError as at, OperationPermissionError as b, Tenant as bt, DEFAULT_PASSWORD_DENYLIST as c, SessionCollection as cn, DEFAULT_ANCESTOR_READ_MAX_DEPTH as ct, DEFAULT_PASSWORD_MIN_LENGTH as d, Session as dn, normalizeAncestorReadPolicy as dt, User as en, DEFAULT_LOGIN_LOCKOUT_MAX_SECONDS as et, PASSWORD_LOGIN_KIND as f, generateSessionId as fn, OidcProvisioningError as ft, PasswordCredentialForbiddenError as g, backfillUserEmailKeys as gt, PasswordCredentialError as h, UserEmailKeyBackfillError as ht, TERMINAL_APPROVE_LOGIN_KIND as i, UsersLoginAuditEvent as in, LoginAttemptLimiter as it, validateMobileRedirectUri as j, deriveOperationPermissionSlug as jt, MobileAuthService as k, PermissionCatalogService as kt, DEFAULT_PASSWORD_MANAGE_PERMISSION as l, DEFAULT_SESSION_TTL as ln, getConfiguredAncestorReadPolicy as lt, PASSWORD_PERMISSION_DEFINITIONS as m, USER_EMAIL_KEY_BACKFILL_NAME as mt, DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS as n, normalizeEmail as nn, DurableLoginAuditSink as nt, TerminalAuthRateLimitError as o, UsersLoginAttempt as on, withoutListBounds as ot, PASSWORD_MAX_LENGTH_CEILING as p, UsersCliAuthRequest as pn, UserCollection as pt, PinVerifier as q, Membership as qt, DEFAULT_CLI_SESSION_TTL_SECONDS as r, UsersLoginAuditEventCollection as rn, InvalidCredentialsError as rt, TerminalAuthService as s, UsersCliAuthRequestCollection as sn, ANCESTOR_READ_ACTION as st, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS as t, isValidEmail as tn, DEFAULT_LOGIN_MAX_ATTEMPTS as tt, DEFAULT_PASSWORD_MAX_LENGTH as u, SESSION_DATA_KEYS as un, isAncestorReadableSlug as ut, PasswordPolicyError as v, TenantPermissionOverride as vt, getCurrentSessionPermissionContext as w, assertTenantTableName as wt, assertOperationPermission as x, MAX_TENANT_HIERARCHY_DEPTH as xt, ensurePasswordPermissionsRegistered as y, TenantCollection as yt, DEFAULT_DEVICE_PERSON_IDLE_SECONDS as z, UsersPinCredential as zt };
7898
8576
 
7899
- //# sourceMappingURL=TerminalAuthService-kxt3fqNP.js.map
8577
+ //# sourceMappingURL=TerminalAuthService-B2cazTEg.js.map