@happyvertical/smrt-users 0.55.23 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/AGENTS.md +8 -0
  2. package/README.md +129 -0
  3. package/agents/permissions.md +14 -0
  4. package/dist/chunks/{TerminalAuthService-C8zxBkNB.js → TerminalAuthService-BQjH5_bB.js} +366 -135
  5. package/dist/chunks/TerminalAuthService-BQjH5_bB.js.map +1 -0
  6. package/dist/collections/GroupMemberCollection.d.ts +6 -2
  7. package/dist/collections/GroupMemberCollection.d.ts.map +1 -1
  8. package/dist/collections/MembershipOverrideCollection.d.ts +9 -2
  9. package/dist/collections/MembershipOverrideCollection.d.ts.map +1 -1
  10. package/dist/collections/TenantPermissionOverrideCollection.d.ts +8 -2
  11. package/dist/collections/TenantPermissionOverrideCollection.d.ts.map +1 -1
  12. package/dist/index.d.ts +2 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +84 -29
  15. package/dist/index.js.map +1 -1
  16. package/dist/manifest.json +75 -45
  17. package/dist/migrations/deduplicateAuthorityPairs.d.ts +27 -0
  18. package/dist/migrations/deduplicateAuthorityPairs.d.ts.map +1 -0
  19. package/dist/migrations/deduplicateRolePermissions.d.ts +3 -10
  20. package/dist/migrations/deduplicateRolePermissions.d.ts.map +1 -1
  21. package/dist/migrations/natural-key-dedup.d.ts +32 -0
  22. package/dist/migrations/natural-key-dedup.d.ts.map +1 -0
  23. package/dist/models/GroupMember.d.ts.map +1 -1
  24. package/dist/models/LoginAuditEvent.d.ts +5 -0
  25. package/dist/models/LoginAuditEvent.d.ts.map +1 -1
  26. package/dist/models/MembershipOverride.d.ts.map +1 -1
  27. package/dist/models/Session.d.ts +9 -0
  28. package/dist/models/Session.d.ts.map +1 -1
  29. package/dist/models/TenantPermissionOverride.d.ts.map +1 -1
  30. package/dist/services/LoginAttemptLimiter.d.ts +62 -11
  31. package/dist/services/LoginAttemptLimiter.d.ts.map +1 -1
  32. package/dist/services/PasswordCredentialService.d.ts +83 -1
  33. package/dist/services/PasswordCredentialService.d.ts.map +1 -1
  34. package/dist/services/PermissionCatalogService.d.ts.map +1 -1
  35. package/dist/services/index.d.ts +2 -2
  36. package/dist/services/index.d.ts.map +1 -1
  37. package/dist/smrt-knowledge.json +16 -9
  38. package/dist/sveltekit/password-handlers.d.ts +7 -0
  39. package/dist/sveltekit/password-handlers.d.ts.map +1 -1
  40. package/dist/sveltekit.js +13 -1
  41. package/dist/sveltekit.js.map +1 -1
  42. package/package.json +13 -13
  43. package/dist/chunks/TerminalAuthService-C8zxBkNB.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { a as MembershipStatus, c as TenantPermissionEffect, l as TenantStatus, n as DEFAULT_ROLES, o as OverrideEffect, r as DEFAULT_ROLE_SLUGS, s as SessionStatus, u as UserStatus } from "./types-DFqeph0R.js";
2
- import { IN_LIST_CHUNK_SIZE, ObjectRegistry, SmrtCollection, SmrtObject, bumpChangeFeed, chunkArray, crossPackageRef, field, findManifestEntryByQualifiedName, foreignKey, isEmbeddedDatabase, isPostgresDatabase, isUniqueViolationError, smrt, withEmbeddedWriteTransaction } from "@happyvertical/smrt-core";
2
+ import { IN_LIST_CHUNK_SIZE, ObjectRegistry, SmrtCollection, SmrtObject, bumpChangeFeed, chunkArray, crossPackageRef, field, findManifestEntryByQualifiedName, foreignKey, isEmbeddedDatabase, isPostgresDatabase, isUniqueViolationError, resolveOperationPermissionAlias, smrt, withEmbeddedWriteTransaction } from "@happyvertical/smrt-core";
3
3
  import { AmbiguousOidcIdentityError, OidcIdentity, OidcIdentityCollection, normalizeIdentityEmail } from "@happyvertical/smrt-profiles";
4
4
  import { createHash, randomBytes, randomUUID, scrypt, timingSafeEqual } from "node:crypto";
5
5
  import { getPackageConfig } from "@happyvertical/smrt-config";
@@ -21,7 +21,7 @@ var __exportAll = (all, no_symbols) => {
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.55.23","objects":{"@happyvertical/smrt-users:AccessRequestCollection":{"name":"accessrequestcollection","className":"AccessRequestCollection","qualifiedName":"@happyvertical/smrt-users:AccessRequestCollection","collection":"accessrequests","description":"Collection for managing AccessRequest objects.","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","cli":false},"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","cli":false},"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","description":"Collection for managing Group objects","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","description":"Collection for managing GroupMember objects","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","description":"Collection for managing GroupRole objects","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","description":"Collection for managing smrt-users magic link token records","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","cli":false},"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","description":"Collection for managing Membership objects","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","description":"Collection for managing MembershipOverride objects","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:UsersOAuthClientCollection":{"name":"usersoauthclientcollection","className":"UsersOAuthClientCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthClientCollection","collection":"usersoauthclients","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"findByClientId":{"name":"findByClientId","async":false,"parameters":[{"name":"clientId","type":"string","optional":false}],"returnType":"Promise<UsersOAuthClient | null>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_clients","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthClient","exportName":"UsersOAuthClientCollection","collectionExportName":"UsersOAuthClientCollectionCollection","schema":{"tableName":"users_oauth_clients","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_clients\\" (\\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 \\"client_id\\" TEXT NOT NULL UNIQUE,\\n \\"redirect_uris\\" TEXT,\\n \\"allowed_scopes\\" TEXT,\\n \\"token_endpoint_auth_method\\" TEXT DEFAULT 'none',\\n \\"secret_hash\\" TEXT,\\n \\"allowed_resources\\" 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"},"client_id":{"type":"TEXT","notNull":true,"unique":true},"redirect_uris":{"type":"TEXT","notNull":false,"unique":false},"allowed_scopes":{"type":"TEXT","notNull":false,"unique":false},"token_endpoint_auth_method":{"type":"TEXT","notNull":false,"unique":false,"default":"none"},"secret_hash":{"type":"TEXT","notNull":false,"unique":false},"allowed_resources":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_clients_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_clients_created_at_idx","columns":["created_at"]}],"version":"0ecda18c"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAuthorizationCodeCollection":{"name":"usersoauthauthorizationcodecollection","className":"UsersOAuthAuthorizationCodeCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAuthorizationCodeCollection","collection":"usersoauthauthorizationcodes","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"consume":{"name":"consume","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"codeHash","type":"string","optional":false},{"name":"clientId","type":"string","optional":false},{"name":"redirectUri","type":"string","optional":false},{"name":"resource","type":"string | null","optional":false,"unionBranches":[{"type":"string"},{"type":"null"}]},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_authorization_codes","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthAuthorizationCode","exportName":"UsersOAuthAuthorizationCodeCollection","collectionExportName":"UsersOAuthAuthorizationCodeCollectionCollection","schema":{"tableName":"users_oauth_authorization_codes","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_authorization_codes\\" (\\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 \\"authorization_id\\" TEXT,\\n \\"code_hash\\" TEXT NOT NULL UNIQUE,\\n \\"client_id\\" TEXT,\\n \\"subject\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"claims\\" TEXT,\\n \\"redirect_uri\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"code_challenge\\" TEXT,\\n \\"expires_at\\" TIMESTAMP,\\n \\"consumed_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"code_hash":{"type":"TEXT","notNull":true,"unique":true},"client_id":{"type":"TEXT","notNull":false,"unique":false},"subject":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"claims":{"type":"TEXT","notNull":false,"unique":false},"redirect_uri":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"code_challenge":{"type":"TEXT","notNull":false,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"consumed_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_authorization_codes_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_authorization_codes_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_authorization_codes_client_id_idx","columns":["client_id"]},{"name":"users_oauth_authorization_codes_subject_idx","columns":["subject"]},{"name":"users_oauth_authorization_codes_tenant_id_idx","columns":["tenant_id"]},{"name":"users_oauth_authorization_codes_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_authorization_codes_created_at_idx","columns":["created_at"]}],"version":"f5c5d615"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthRefreshGrantCollection":{"name":"usersoauthrefreshgrantcollection","className":"UsersOAuthRefreshGrantCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthRefreshGrantCollection","collection":"usersoauthrefreshgrants","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"consume":{"name":"consume","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"tokenHash","type":"string","optional":false},{"name":"clientId","type":"string","optional":false},{"name":"resource","type":"string | null","optional":false,"unionBranches":[{"type":"string"},{"type":"null"}]},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true},"revokeFamily":{"name":"revokeFamily","async":true,"parameters":[{"name":"familyId","type":"string","optional":false},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<void>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_refresh_grants","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthRefreshGrant","exportName":"UsersOAuthRefreshGrantCollection","collectionExportName":"UsersOAuthRefreshGrantCollectionCollection","schema":{"tableName":"users_oauth_refresh_grants","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_refresh_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 \\"authorization_id\\" TEXT,\\n \\"token_hash\\" TEXT NOT NULL UNIQUE,\\n \\"family_id\\" TEXT,\\n \\"client_id\\" TEXT,\\n \\"subject\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"claims\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"expires_at\\" TIMESTAMP,\\n \\"consumed_at\\" TIMESTAMP,\\n \\"revoked_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"token_hash":{"type":"TEXT","notNull":true,"unique":true},"family_id":{"type":"TEXT","notNull":false,"unique":false},"client_id":{"type":"TEXT","notNull":false,"unique":false},"subject":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"claims":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"consumed_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_refresh_grants_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_refresh_grants_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_refresh_grants_family_id_idx","columns":["family_id"]},{"name":"users_oauth_refresh_grants_client_id_idx","columns":["client_id"]},{"name":"users_oauth_refresh_grants_subject_idx","columns":["subject"]},{"name":"users_oauth_refresh_grants_tenant_id_idx","columns":["tenant_id"]},{"name":"users_oauth_refresh_grants_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_refresh_grants_revoked_at_idx","columns":["revoked_at"]},{"name":"users_oauth_refresh_grants_created_at_idx","columns":["created_at"]}],"version":"d332998e"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAccessTokenRevocationCollection":{"name":"usersoauthaccesstokenrevocationcollection","className":"UsersOAuthAccessTokenRevocationCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAccessTokenRevocationCollection","collection":"usersoauthaccesstokenrevocations","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"findByJti":{"name":"findByJti","async":true,"parameters":[{"name":"jti","type":"string","optional":false}],"returnType":"Promise<UsersOAuthAccessTokenRevocation | null>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_access_token_revocations","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthAccessTokenRevocation","exportName":"UsersOAuthAccessTokenRevocationCollection","collectionExportName":"UsersOAuthAccessTokenRevocationCollectionCollection","schema":{"tableName":"users_oauth_access_token_revocations","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_access_token_revocations\\" (\\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 \\"jti\\" TEXT NOT NULL UNIQUE,\\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"},"jti":{"type":"TEXT","notNull":true,"unique":true},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_access_token_revocations_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_access_token_revocations_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_access_token_revocations_created_at_idx","columns":["created_at"]}],"version":"79147089"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAuthorizationCollection":{"name":"usersoauthauthorizationcollection","className":"UsersOAuthAuthorizationCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAuthorizationCollection","collection":"usersoauthauthorizations","description":"Consent storage is intentionally inaccessible through generated surfaces.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{},"decoratorConfig":{"tableName":"users_oauth_authorizations","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthAuthorization","exportName":"UsersOAuthAuthorizationCollection","collectionExportName":"UsersOAuthAuthorizationCollectionCollection","schema":{"tableName":"users_oauth_authorizations","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_authorizations\\" (\\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 \\"subject\\" TEXT,\\n \\"session_id\\" TEXT,\\n \\"client_id\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"permission_ceiling\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"revoked_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"},"subject":{"type":"TEXT","notNull":false,"unique":false},"session_id":{"type":"TEXT","notNull":false,"unique":false},"client_id":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"permission_ceiling":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_authorizations_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_authorizations_subject_idx","columns":["subject"]},{"name":"users_oauth_authorizations_client_id_idx","columns":["client_id"]},{"name":"users_oauth_authorizations_created_at_idx","columns":["created_at"]}],"version":"291f8816"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthRefreshFamilyCollection":{"name":"usersoauthrefreshfamilycollection","className":"UsersOAuthRefreshFamilyCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthRefreshFamilyCollection","collection":"usersoauthrefreshfamilies","description":"Family rows exist for the entire lifetime of every descendant refresh token.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"lock":{"name":"lock","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true},"revoke":{"name":"revoke","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<void>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_refresh_families","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthRefreshFamily","exportName":"UsersOAuthRefreshFamilyCollection","collectionExportName":"UsersOAuthRefreshFamilyCollectionCollection","schema":{"tableName":"users_oauth_refresh_families","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_refresh_families\\" (\\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 \\"authorization_id\\" TEXT,\\n \\"revoked_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_refresh_families_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_refresh_families_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_refresh_families_created_at_idx","columns":["created_at"]}],"version":"37392f31"},"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","description":"Collection for managing Permission objects","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":{"cli":false},"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","description":"Collection for managing Role objects","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","description":"Collection for managing RolePermission objects","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","description":"Collection for managing Session objects","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":{"cli":false},"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","description":"Collection for managing Tenant objects with hierarchical support.","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","description":"Collection for managing TenantPermissionOverride objects.","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","description":"Collection for managing User objects","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","description":"A prospective user's request for access, captured before they become a User.","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":false},"extends":"SmrtObject","exportName":"AccessRequest","collectionExportName":"AccessRequestCollection","displayLabelField":"name","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","description":"Private database arbiter shared by every terminal-auth process.","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":{},"enum":["pending","approved","consumed","expired"]},"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":false,"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","description":"Group represents a team or department within a tenant.","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":{"include":["list","get"]},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"Group","collectionExportName":"GroupCollection","displayLabelField":"name","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","description":"GroupMember is a join table linking Users to Groups.","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":{"include":["list","get"]}},"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","description":"GroupRole is a join table linking Groups to Roles.","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":{"include":["list","get"]}},"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","description":"Private database arbiter shared by every process that authenticates.","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},"enum":["subject","source"]},"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},"enum":["denied","failed","succeeded","locked","managed"]},"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":false},"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","description":"Membership represents a user's membership in a tenant with an assigned role.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/Membership.ts","packageName":"@happyvertical/smrt-users","fields":{"userId":{"type":"foreignKey","required":true,"related":"User","description":"The person who belongs to this organization.","_meta":{"description":"The person who belongs to this organization.","required":true}},"tenantId":{"type":"foreignKey","required":true,"related":"Tenant","_meta":{"required":true}},"roleId":{"type":"foreignKey","required":true,"related":"Role","description":"The role that determines this member's permissions.","_meta":{"description":"The role that determines this member's permissions.","required":true}},"status":{"type":"text","required":false,"description":"Whether this membership is active, pending, or inactive.","_meta":{"description":"Whether this membership is active, pending, or inactive."}}},"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":{"include":["list","get"]},"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","description":"MembershipOverride allows granting or denying specific permissions to a user beyond what their role and groups provide.","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":{"include":["list","get"]}},"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:UsersOAuthClient":{"name":"usersoauthclient","className":"UsersOAuthClient","qualifiedName":"@happyvertical/smrt-users:UsersOAuthClient","collection":"usersoauthclients","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"clientId":{"type":"text","required":true,"_meta":{"required":true,"unique":true}},"redirectUris":{"type":"text","required":false},"allowedScopes":{"type":"text","required":false},"tokenEndpointAuthMethod":{"type":"text","required":false,"default":"none","enum":["none","client_secret_post"]},"secretHash":{"type":"text","required":false,"_meta":{"nullable":true,"sensitive":true},"sensitive":true},"allowedResources":{"type":"text","required":false},"createdAt":{"type":"datetime","required":false,"_meta":{}}},"methods":{"getRedirectUris":{"name":"getRedirectUris","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getAllowedScopes":{"name":"getAllowedScopes","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getAllowedResources":{"name":"getAllowedResources","async":false,"parameters":[],"returnType":"string[] | undefined","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_clients","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false},"extends":"SmrtObject","exportName":"UsersOAuthClient","collectionExportName":"UsersOAuthClientCollection","validationRules":[{"field":"clientId","rule":"required","fieldType":"text"}],"schema":{"tableName":"users_oauth_clients","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_clients\\" (\\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 \\"client_id\\" TEXT NOT NULL UNIQUE,\\n \\"redirect_uris\\" TEXT,\\n \\"allowed_scopes\\" TEXT,\\n \\"token_endpoint_auth_method\\" TEXT DEFAULT 'none',\\n \\"secret_hash\\" TEXT,\\n \\"allowed_resources\\" 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"},"client_id":{"type":"TEXT","notNull":true,"unique":true},"redirect_uris":{"type":"TEXT","notNull":false,"unique":false},"allowed_scopes":{"type":"TEXT","notNull":false,"unique":false},"token_endpoint_auth_method":{"type":"TEXT","notNull":false,"unique":false,"default":"none"},"secret_hash":{"type":"TEXT","notNull":false,"unique":false},"allowed_resources":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_clients_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_clients_created_at_idx","columns":["created_at"]}],"version":"0ecda18c"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAuthorizationCode":{"name":"usersoauthauthorizationcode","className":"UsersOAuthAuthorizationCode","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAuthorizationCode","collection":"usersoauthauthorizationcodes","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"authorizationId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"codeHash":{"type":"text","required":true,"_meta":{"required":true,"unique":true,"sensitive":true},"sensitive":true},"clientId":{"type":"text","required":false,"_meta":{"indexed":true}},"subject":{"type":"text","required":false,"_meta":{"indexed":true}},"tenantId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"claims":{"type":"text","required":false},"redirectUri":{"type":"text","required":false},"scopes":{"type":"text","required":false},"resource":{"type":"text","required":false,"_meta":{"nullable":true}},"codeChallenge":{"type":"text","required":false},"expiresAt":{"type":"datetime","required":false,"_meta":{"indexed":true}},"consumedAt":{"type":"datetime","required":false,"_meta":{"nullable":true}}},"methods":{"getScopes":{"name":"getScopes","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getClaims":{"name":"getClaims","async":false,"parameters":[],"returnType":"OAuthTokenClaims","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_authorization_codes","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false,"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"UsersOAuthAuthorizationCode","collectionExportName":"UsersOAuthAuthorizationCodeCollection","validationRules":[{"field":"codeHash","rule":"required","fieldType":"text"}],"schema":{"tableName":"users_oauth_authorization_codes","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_authorization_codes\\" (\\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 \\"authorization_id\\" TEXT,\\n \\"code_hash\\" TEXT NOT NULL UNIQUE,\\n \\"client_id\\" TEXT,\\n \\"subject\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"claims\\" TEXT,\\n \\"redirect_uri\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"code_challenge\\" TEXT,\\n \\"expires_at\\" TIMESTAMP,\\n \\"consumed_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"code_hash":{"type":"TEXT","notNull":true,"unique":true},"client_id":{"type":"TEXT","notNull":false,"unique":false},"subject":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"claims":{"type":"TEXT","notNull":false,"unique":false},"redirect_uri":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"code_challenge":{"type":"TEXT","notNull":false,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"consumed_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_authorization_codes_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_authorization_codes_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_authorization_codes_client_id_idx","columns":["client_id"]},{"name":"users_oauth_authorization_codes_subject_idx","columns":["subject"]},{"name":"users_oauth_authorization_codes_tenant_id_idx","columns":["tenant_id"]},{"name":"users_oauth_authorization_codes_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_authorization_codes_created_at_idx","columns":["created_at"]}],"version":"f5c5d615"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthRefreshGrant":{"name":"usersoauthrefreshgrant","className":"UsersOAuthRefreshGrant","qualifiedName":"@happyvertical/smrt-users:UsersOAuthRefreshGrant","collection":"usersoauthrefreshgrants","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"authorizationId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"tokenHash":{"type":"text","required":true,"_meta":{"required":true,"unique":true,"sensitive":true},"sensitive":true},"familyId":{"type":"text","required":false,"_meta":{"indexed":true}},"clientId":{"type":"text","required":false,"_meta":{"indexed":true}},"subject":{"type":"text","required":false,"_meta":{"indexed":true}},"tenantId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"claims":{"type":"text","required":false},"scopes":{"type":"text","required":false},"resource":{"type":"text","required":false,"_meta":{"nullable":true}},"expiresAt":{"type":"datetime","required":false,"_meta":{"indexed":true}},"consumedAt":{"type":"datetime","required":false,"_meta":{"nullable":true}},"revokedAt":{"type":"datetime","required":false,"_meta":{"nullable":true,"indexed":true}}},"methods":{"getScopes":{"name":"getScopes","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getClaims":{"name":"getClaims","async":false,"parameters":[],"returnType":"OAuthTokenClaims","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_refresh_grants","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false,"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"UsersOAuthRefreshGrant","collectionExportName":"UsersOAuthRefreshGrantCollection","validationRules":[{"field":"tokenHash","rule":"required","fieldType":"text"}],"schema":{"tableName":"users_oauth_refresh_grants","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_refresh_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 \\"authorization_id\\" TEXT,\\n \\"token_hash\\" TEXT NOT NULL UNIQUE,\\n \\"family_id\\" TEXT,\\n \\"client_id\\" TEXT,\\n \\"subject\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"claims\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"expires_at\\" TIMESTAMP,\\n \\"consumed_at\\" TIMESTAMP,\\n \\"revoked_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"token_hash":{"type":"TEXT","notNull":true,"unique":true},"family_id":{"type":"TEXT","notNull":false,"unique":false},"client_id":{"type":"TEXT","notNull":false,"unique":false},"subject":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"claims":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"consumed_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_refresh_grants_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_refresh_grants_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_refresh_grants_family_id_idx","columns":["family_id"]},{"name":"users_oauth_refresh_grants_client_id_idx","columns":["client_id"]},{"name":"users_oauth_refresh_grants_subject_idx","columns":["subject"]},{"name":"users_oauth_refresh_grants_tenant_id_idx","columns":["tenant_id"]},{"name":"users_oauth_refresh_grants_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_refresh_grants_revoked_at_idx","columns":["revoked_at"]},{"name":"users_oauth_refresh_grants_created_at_idx","columns":["created_at"]}],"version":"d332998e"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAccessTokenRevocation":{"name":"usersoauthaccesstokenrevocation","className":"UsersOAuthAccessTokenRevocation","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAccessTokenRevocation","collection":"usersoauthaccesstokenrevocations","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"jti":{"type":"text","required":true,"_meta":{"required":true,"unique":true,"sensitive":true},"sensitive":true},"expiresAt":{"type":"datetime","required":false,"_meta":{"indexed":true}}},"methods":{},"decoratorConfig":{"tableName":"users_oauth_access_token_revocations","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false},"extends":"SmrtObject","exportName":"UsersOAuthAccessTokenRevocation","collectionExportName":"UsersOAuthAccessTokenRevocationCollection","validationRules":[{"field":"jti","rule":"required","fieldType":"text"}],"schema":{"tableName":"users_oauth_access_token_revocations","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_access_token_revocations\\" (\\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 \\"jti\\" TEXT NOT NULL UNIQUE,\\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"},"jti":{"type":"TEXT","notNull":true,"unique":true},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_access_token_revocations_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_access_token_revocations_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_access_token_revocations_created_at_idx","columns":["created_at"]}],"version":"79147089"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAuthorization":{"name":"usersoauthauthorization","className":"UsersOAuthAuthorization","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAuthorization","collection":"usersoauthauthorizations","description":"A consent decision bound to a server-side session; never exposes its bearer.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"subject":{"type":"text","required":false,"_meta":{"indexed":true}},"sessionId":{"type":"text","required":false,"_meta":{"sensitive":true},"sensitive":true},"clientId":{"type":"text","required":false,"_meta":{"indexed":true}},"tenantId":{"type":"text","required":false,"_meta":{"nullable":true}},"scopes":{"type":"text","required":false},"permissionCeiling":{"type":"text","required":false},"resource":{"type":"text","required":false,"_meta":{"nullable":true}},"revokedAt":{"type":"datetime","required":false,"_meta":{"nullable":true}}},"methods":{"getPermissionCeiling":{"name":"getPermissionCeiling","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getScopes":{"name":"getScopes","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_authorizations","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false,"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"UsersOAuthAuthorization","collectionExportName":"UsersOAuthAuthorizationCollection","schema":{"tableName":"users_oauth_authorizations","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_authorizations\\" (\\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 \\"subject\\" TEXT,\\n \\"session_id\\" TEXT,\\n \\"client_id\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"permission_ceiling\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"revoked_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"},"subject":{"type":"TEXT","notNull":false,"unique":false},"session_id":{"type":"TEXT","notNull":false,"unique":false},"client_id":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"permission_ceiling":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_authorizations_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_authorizations_subject_idx","columns":["subject"]},{"name":"users_oauth_authorizations_client_id_idx","columns":["client_id"]},{"name":"users_oauth_authorizations_created_at_idx","columns":["created_at"]}],"version":"291f8816"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthRefreshFamily":{"name":"usersoauthrefreshfamily","className":"UsersOAuthRefreshFamily","qualifiedName":"@happyvertical/smrt-users:UsersOAuthRefreshFamily","collection":"usersoauthrefreshfamilies","description":"Stable lock row: rotation and revocation always serialize on this family.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"authorizationId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"revokedAt":{"type":"datetime","required":false,"_meta":{"nullable":true}}},"methods":{},"decoratorConfig":{"tableName":"users_oauth_refresh_families","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false},"extends":"SmrtObject","exportName":"UsersOAuthRefreshFamily","collectionExportName":"UsersOAuthRefreshFamilyCollection","schema":{"tableName":"users_oauth_refresh_families","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_refresh_families\\" (\\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 \\"authorization_id\\" TEXT,\\n \\"revoked_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_refresh_families_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_refresh_families_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_refresh_families_created_at_idx","columns":["created_at"]}],"version":"37392f31"},"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","description":"Permission represents a named capability in the system.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/Permission.ts","packageName":"@happyvertical/smrt-users","fields":{"name":{"type":"text","required":false,"default":"","description":"The name of an action people can be allowed to perform.","_meta":{"description":"The name of an action people can be allowed to perform."}},"description":{"type":"text","required":false,"default":"","description":"What this permission allows someone to do.","_meta":{"description":"What this permission allows someone to do."}},"category":{"type":"text","required":false,"default":"","description":"The area of the application this permission belongs to.","_meta":{"description":"The area of the application this permission belongs to."}}},"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":{"include":["list","get"]}},"extends":"SmrtObject","exportName":"Permission","collectionExportName":"PermissionCollection","displayLabelField":"name","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","description":"An exact tenant/resource/user/permission decision. This deliberately does not replace tenant RBAC: ResourceGrantResolver only allows after the normal operation guard has allowed the same permission.","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","description":"The person receiving this record-specific access rule.","_meta":{"description":"The person receiving this record-specific access rule.","required":true}},"resourceType":{"type":"text","required":false,"description":"The kind of record this access rule applies to.","_meta":{"description":"The kind of record this access rule applies to."}},"resourceId":{"type":"text","required":false,"description":"The specific record covered by this access rule.","_meta":{"description":"The specific record covered by this access rule."}},"permission":{"type":"text","required":false,"description":"The action this rule allows or denies for the record.","_meta":{"description":"The action this rule allows or denies for the record."}},"effect":{"type":"text","required":false,"description":"Whether this rule grants access or denies it. Denies take precedence.","_meta":{"description":"Whether this rule grants access or denies it. Denies take precedence."},"enum":["grant","deny"]},"canDelegate":{"type":"boolean","required":false,"default":false,"description":"Whether the recipient may pass this grant on to another person.","_meta":{"description":"Whether the recipient may pass this grant on to another person."}},"parentGrantId":{"type":"foreignKey","required":false,"related":"ResourceGrant","description":"The earlier grant from which this access was delegated.","_meta":{"description":"The earlier grant from which this access was delegated."}},"revokedAt":{"type":"text","required":false,"description":"When this access rule was revoked, if it has ended.","_meta":{"description":"When this access rule was revoked, if it has ended."}}},"methods":{"isActive":{"name":"isActive","async":false,"parameters":[],"returnType":"boolean","isStatic":false,"isPublic":true}},"decoratorConfig":{"tenantScoped":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false,"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","description":"Role represents a permission template that can be assigned to users.","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":"The name of this set of permissions.","_meta":{"description":"The name of this set of permissions."}},"description":{"type":"text","required":false,"default":"","description":"What this role allows and who should receive it.","_meta":{"description":"What this role allows and who should receive it."}},"isSystem":{"type":"boolean","required":false,"default":false,"description":"Whether this is a built-in role protected from deletion.","_meta":{"description":"Whether this is a built-in role protected from deletion."}},"inheritsToDescendants":{"type":"boolean","required":false,"default":false,"description":"Whether this role can give members access to organizations below theirs.","_meta":{"description":"Whether this role can give members access to organizations below theirs."}}},"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":{"include":["list","get"]},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"Role","collectionExportName":"RoleCollection","displayLabelField":"name","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","description":"RolePermission is a join table linking Roles to Permissions.","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":{"include":["list","get"]},"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","description":"Session represents an authenticated user session.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/Session.ts","packageName":"@happyvertical/smrt-users","fields":{"userId":{"type":"foreignKey","required":false,"related":"User","description":"The person signed in through this session.","_meta":{"description":"The person signed in through this session."}},"tenantId":{"type":"foreignKey","required":false,"related":"Tenant","_meta":{"nullable":true}},"status":{"type":"text","required":false,"description":"Whether this sign-in session is active or has ended.","_meta":{"description":"Whether this sign-in session is active or has ended."}},"expiresAt":{"type":"datetime","required":false,"description":"When this session expires unless renewed within its allowed limits.","_meta":{"description":"When this session expires unless renewed within its allowed limits.","indexed":true}},"userAgent":{"type":"text","required":false,"default":"","description":"The browser or device reported when this session was created.","_meta":{"description":"The browser or device reported when this session was created."}},"ipAddress":{"type":"text","required":false,"default":"","description":"The network address reported for this session.","_meta":{"description":"The network address reported for this session."}},"lastAccessedAt":{"type":"datetime","required":false,"description":"When this session was last used.","_meta":{"description":"When this session was last used."}},"data":{"type":"json","required":false,"default":{},"description":"Additional session details maintained by your application.","_meta":{"description":"Additional session details maintained by your application."}},"authMethod":{"type":"text","required":false,"description":"The sign-in method used to establish this session.","_meta":{"description":"The sign-in method used to establish this session.","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":false,"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","description":"Tenant represents an organizational boundary in the multi-tenant system.","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":{"include":["list","get"]}},"extends":"SmrtObject","exportName":"Tenant","collectionExportName":"TenantCollection","displayLabelField":"name","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","enum":["unprovisioned","provisioning","active","drifted","failed"]},"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":{"include":["list","get"]},"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","description":"TenantPermissionOverride allows setting explicit permission values at the tenant level.","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":{"include":["list","get"]},"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","description":"User represents an authenticated identity in the system.","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","description":"The personal profile linked to this account.","_meta":{"description":"The personal profile linked to this account.","unique":true}},"email":{"type":"text","required":false,"default":"","description":"The email address used for this account.","_meta":{"description":"The email address used for this account.","indexed":true}},"emailKey":{"type":"text","required":false,"description":"The standardized email address used to recognize this account; maintained automatically.","_meta":{"description":"The standardized email address used to recognize this account; maintained automatically.","nullable":true,"unique":true,"readonly":true},"readonly":true},"status":{"type":"text","required":false,"description":"Whether this account is active, inactive, pending, or suspended.","_meta":{"description":"Whether this account is active, inactive, pending, or suspended."}},"lastLoginAt":{"type":"datetime","required":false,"description":"When this person most recently signed in.","_meta":{"description":"When this person most recently signed in."}}},"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":{"include":["list","get"]}},"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","recipes":[{"id":"users.roles-and-permissions","className":"UsersRolesAndPermissionsRecipe","label":"Roles and permissions","summary":"Manage tenant roles, memberships, permissions, and controlled sharing.","synonyms":["access control","rbac","sharing"],"models":["@happyvertical/smrt-users:Role","@happyvertical/smrt-users:Permission","@happyvertical/smrt-users:Membership","@happyvertical/smrt-users:ResourceGrant"],"nav":[{"label":"Roles","model":"@happyvertical/smrt-users:Role","icon":"users","description":"Define tenant permission bundles.","noun":"role"},{"label":"Permissions","model":"@happyvertical/smrt-users:Permission","icon":"settings","description":"Review operations available to roles.","noun":"permission"}],"requires":[],"group":{"id":"account-access","label":"Account access","summary":"Sign in and manage account sessions."},"section":{"id":"access-control","label":"Access control","icon":"users","description":"Manage tenant roles, permissions, and reviewed sharing."},"options":{"@happyvertical/smrt-users:ResourceGrant":{"exposure":{"api":false,"mcp":false,"cli":false}}},"help":{"markdown":"## Overview\\n\\nRoles and permissions control access to your organization. Denies take precedence, and role changes should be reviewed before they are applied.\\n\\n## Tasks\\n\\n- Ask an authorized administrator to create a role and assign only the permissions required for its work.\\n- Add a member to the correct organization through your approved membership settings and assign a role through {field:Membership.roleId}.\\n- Use a resource grant only when a record needs a reviewed exception to its ordinary role rules.\\n","fieldRefs":["Membership.roleId"]},"demo":{"mode":"server","reasons":["Needs a server because its package does not build for a browser: node:crypto/async_hooks; core migrations; and its package depends on @happyvertical/smrt-profiles, @happyvertical/smrt-tenancy, which do not build for a browser (#3617, #3624, #3626)."]}},{"id":"users.sign-in","className":"UsersSignInRecipe","label":"Sign in","summary":"Access an account through an application-authorized sign-in flow.","synonyms":["log in","authentication","single sign-on"],"models":["@happyvertical/smrt-users:User","@happyvertical/smrt-users:Session"],"nav":[{"label":"Security sessions","model":"@happyvertical/smrt-users:Session","icon":"settings","description":"Review active sessions and sign out unrecognized devices.","noun":"security session"}],"requires":[],"group":{"id":"account-access","label":"Account access","summary":"Sign in and manage account sessions."},"section":{"id":"account-security","label":"Account security","icon":"settings","description":"Review account access and active sessions."},"options":{"@happyvertical/smrt-users:Session":{"exposure":{"api":false,"mcp":false,"cli":false}}},"help":{"markdown":"## Overview\\n\\nUse your organization\u2019s approved sign-in method. Review your signed-in devices on your account security page.\\n\\n## Tasks\\n\\n- Review active sign-in sessions from your account security page and end sessions you no longer recognize.\\n- Ask an administrator for recovery help if you lose access to every available credential.\\n","fieldRefs":[]},"surfaces":[{"kind":"settings-panel","export":"@happyvertical/smrt-users/svelte#AccountSecurityPanel","label":"Account security"}],"providers":[{"id":"oidc","kind":"oauth","options":["oidc"],"required":false}],"demo":{"mode":"server","reasons":["Needs a server because its package does not build for a browser: node:crypto/async_hooks; core migrations; and its package depends on @happyvertical/smrt-profiles, @happyvertical/smrt-tenancy, which do not build for a browser (#3617, #3624, #3626)."]}}],"smrtDependencies":["@happyvertical/smrt-core","@happyvertical/smrt-mobile-contract","@happyvertical/smrt-profiles","@happyvertical/smrt-tenancy"],"browser":{"status":"server-only","issues":["#3617","#3624","#3626"],"reason":"node:crypto/async_hooks; core migrations","via":["@happyvertical/smrt-profiles","@happyvertical/smrt-tenancy"]},"stampsConstructors":true}`));
24
+ ObjectRegistry.registerPackageManifest(JSON.parse(`{"version":"1.0.0","timestamp":0,"packageName":"@happyvertical/smrt-users","packageVersion":"0.56.0","objects":{"@happyvertical/smrt-users:AccessRequestCollection":{"name":"accessrequestcollection","className":"AccessRequestCollection","qualifiedName":"@happyvertical/smrt-users:AccessRequestCollection","collection":"accessrequests","description":"Collection for managing AccessRequest objects.","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","cli":false},"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","cli":false},"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","description":"Collection for managing Group objects","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","description":"Collection for managing GroupMember objects","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_group_id_user_id_idx","columns":["group_id","user_id"],"unique":true},{"name":"group_members_slug_context_idx","columns":["slug","context"]},{"name":"group_members_created_at_idx","columns":["created_at"]},{"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","description":"Collection for managing GroupRole objects","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","description":"Collection for managing smrt-users magic link token records","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","cli":false},"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","description":"Collection for managing Membership objects","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","description":"Collection for managing MembershipOverride objects","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_membership_id_permission_id_idx","columns":["membership_id","permission_id"],"unique":true},{"name":"membership_overrides_slug_context_idx","columns":["slug","context"]},{"name":"membership_overrides_created_at_idx","columns":["created_at"]},{"name":"membership_overrides_permission_id_idx","columns":["permission_id"]}],"version":"25fe9da8"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthClientCollection":{"name":"usersoauthclientcollection","className":"UsersOAuthClientCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthClientCollection","collection":"usersoauthclients","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"findByClientId":{"name":"findByClientId","async":false,"parameters":[{"name":"clientId","type":"string","optional":false}],"returnType":"Promise<UsersOAuthClient | null>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_clients","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthClient","exportName":"UsersOAuthClientCollection","collectionExportName":"UsersOAuthClientCollectionCollection","schema":{"tableName":"users_oauth_clients","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_clients\\" (\\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 \\"client_id\\" TEXT NOT NULL UNIQUE,\\n \\"redirect_uris\\" TEXT,\\n \\"allowed_scopes\\" TEXT,\\n \\"token_endpoint_auth_method\\" TEXT DEFAULT 'none',\\n \\"secret_hash\\" TEXT,\\n \\"allowed_resources\\" 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"},"client_id":{"type":"TEXT","notNull":true,"unique":true},"redirect_uris":{"type":"TEXT","notNull":false,"unique":false},"allowed_scopes":{"type":"TEXT","notNull":false,"unique":false},"token_endpoint_auth_method":{"type":"TEXT","notNull":false,"unique":false,"default":"none"},"secret_hash":{"type":"TEXT","notNull":false,"unique":false},"allowed_resources":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_clients_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_clients_created_at_idx","columns":["created_at"]}],"version":"0ecda18c"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAuthorizationCodeCollection":{"name":"usersoauthauthorizationcodecollection","className":"UsersOAuthAuthorizationCodeCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAuthorizationCodeCollection","collection":"usersoauthauthorizationcodes","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"consume":{"name":"consume","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"codeHash","type":"string","optional":false},{"name":"clientId","type":"string","optional":false},{"name":"redirectUri","type":"string","optional":false},{"name":"resource","type":"string | null","optional":false,"unionBranches":[{"type":"string"},{"type":"null"}]},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_authorization_codes","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthAuthorizationCode","exportName":"UsersOAuthAuthorizationCodeCollection","collectionExportName":"UsersOAuthAuthorizationCodeCollectionCollection","schema":{"tableName":"users_oauth_authorization_codes","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_authorization_codes\\" (\\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 \\"authorization_id\\" TEXT,\\n \\"code_hash\\" TEXT NOT NULL UNIQUE,\\n \\"client_id\\" TEXT,\\n \\"subject\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"claims\\" TEXT,\\n \\"redirect_uri\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"code_challenge\\" TEXT,\\n \\"expires_at\\" TIMESTAMP,\\n \\"consumed_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"code_hash":{"type":"TEXT","notNull":true,"unique":true},"client_id":{"type":"TEXT","notNull":false,"unique":false},"subject":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"claims":{"type":"TEXT","notNull":false,"unique":false},"redirect_uri":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"code_challenge":{"type":"TEXT","notNull":false,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"consumed_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_authorization_codes_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_authorization_codes_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_authorization_codes_client_id_idx","columns":["client_id"]},{"name":"users_oauth_authorization_codes_subject_idx","columns":["subject"]},{"name":"users_oauth_authorization_codes_tenant_id_idx","columns":["tenant_id"]},{"name":"users_oauth_authorization_codes_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_authorization_codes_created_at_idx","columns":["created_at"]}],"version":"f5c5d615"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthRefreshGrantCollection":{"name":"usersoauthrefreshgrantcollection","className":"UsersOAuthRefreshGrantCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthRefreshGrantCollection","collection":"usersoauthrefreshgrants","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"consume":{"name":"consume","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"tokenHash","type":"string","optional":false},{"name":"clientId","type":"string","optional":false},{"name":"resource","type":"string | null","optional":false,"unionBranches":[{"type":"string"},{"type":"null"}]},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true},"revokeFamily":{"name":"revokeFamily","async":true,"parameters":[{"name":"familyId","type":"string","optional":false},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<void>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_refresh_grants","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthRefreshGrant","exportName":"UsersOAuthRefreshGrantCollection","collectionExportName":"UsersOAuthRefreshGrantCollectionCollection","schema":{"tableName":"users_oauth_refresh_grants","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_refresh_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 \\"authorization_id\\" TEXT,\\n \\"token_hash\\" TEXT NOT NULL UNIQUE,\\n \\"family_id\\" TEXT,\\n \\"client_id\\" TEXT,\\n \\"subject\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"claims\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"expires_at\\" TIMESTAMP,\\n \\"consumed_at\\" TIMESTAMP,\\n \\"revoked_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"token_hash":{"type":"TEXT","notNull":true,"unique":true},"family_id":{"type":"TEXT","notNull":false,"unique":false},"client_id":{"type":"TEXT","notNull":false,"unique":false},"subject":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"claims":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"consumed_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_refresh_grants_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_refresh_grants_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_refresh_grants_family_id_idx","columns":["family_id"]},{"name":"users_oauth_refresh_grants_client_id_idx","columns":["client_id"]},{"name":"users_oauth_refresh_grants_subject_idx","columns":["subject"]},{"name":"users_oauth_refresh_grants_tenant_id_idx","columns":["tenant_id"]},{"name":"users_oauth_refresh_grants_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_refresh_grants_revoked_at_idx","columns":["revoked_at"]},{"name":"users_oauth_refresh_grants_created_at_idx","columns":["created_at"]}],"version":"d332998e"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAccessTokenRevocationCollection":{"name":"usersoauthaccesstokenrevocationcollection","className":"UsersOAuthAccessTokenRevocationCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAccessTokenRevocationCollection","collection":"usersoauthaccesstokenrevocations","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"findByJti":{"name":"findByJti","async":true,"parameters":[{"name":"jti","type":"string","optional":false}],"returnType":"Promise<UsersOAuthAccessTokenRevocation | null>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_access_token_revocations","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthAccessTokenRevocation","exportName":"UsersOAuthAccessTokenRevocationCollection","collectionExportName":"UsersOAuthAccessTokenRevocationCollectionCollection","schema":{"tableName":"users_oauth_access_token_revocations","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_access_token_revocations\\" (\\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 \\"jti\\" TEXT NOT NULL UNIQUE,\\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"},"jti":{"type":"TEXT","notNull":true,"unique":true},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_access_token_revocations_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_access_token_revocations_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_access_token_revocations_created_at_idx","columns":["created_at"]}],"version":"79147089"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAuthorizationCollection":{"name":"usersoauthauthorizationcollection","className":"UsersOAuthAuthorizationCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAuthorizationCollection","collection":"usersoauthauthorizations","description":"Consent storage is intentionally inaccessible through generated surfaces.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{},"decoratorConfig":{"tableName":"users_oauth_authorizations","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthAuthorization","exportName":"UsersOAuthAuthorizationCollection","collectionExportName":"UsersOAuthAuthorizationCollectionCollection","schema":{"tableName":"users_oauth_authorizations","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_authorizations\\" (\\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 \\"subject\\" TEXT,\\n \\"session_id\\" TEXT,\\n \\"client_id\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"permission_ceiling\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"revoked_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"},"subject":{"type":"TEXT","notNull":false,"unique":false},"session_id":{"type":"TEXT","notNull":false,"unique":false},"client_id":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"permission_ceiling":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_authorizations_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_authorizations_subject_idx","columns":["subject"]},{"name":"users_oauth_authorizations_client_id_idx","columns":["client_id"]},{"name":"users_oauth_authorizations_created_at_idx","columns":["created_at"]}],"version":"291f8816"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthRefreshFamilyCollection":{"name":"usersoauthrefreshfamilycollection","className":"UsersOAuthRefreshFamilyCollection","qualifiedName":"@happyvertical/smrt-users:UsersOAuthRefreshFamilyCollection","collection":"usersoauthrefreshfamilies","description":"Family rows exist for the entire lifetime of every descendant refresh token.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/OAuthAuthorizationCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"lock":{"name":"lock","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true},"revoke":{"name":"revoke","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"now","type":"Date","optional":false}],"returnType":"Promise<void>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_refresh_families","cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersOAuthRefreshFamily","exportName":"UsersOAuthRefreshFamilyCollection","collectionExportName":"UsersOAuthRefreshFamilyCollectionCollection","schema":{"tableName":"users_oauth_refresh_families","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_refresh_families\\" (\\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 \\"authorization_id\\" TEXT,\\n \\"revoked_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_refresh_families_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_refresh_families_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_refresh_families_created_at_idx","columns":["created_at"]}],"version":"37392f31"},"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","description":"Collection for managing Permission objects","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":{"cli":false},"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","description":"Collection for managing Role objects","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","description":"Collection for managing RolePermission objects","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","description":"Collection for managing Session objects","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":{"cli":false},"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","description":"Collection for managing Tenant objects with hierarchical support.","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","description":"Collection for managing TenantPermissionOverride objects.","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_permission_id_idx","columns":["tenant_id","permission_id"],"unique":true},{"name":"tenant_permission_overrides_slug_context_idx","columns":["slug","context"]},{"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","description":"Collection for managing User objects","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","description":"A prospective user's request for access, captured before they become a User.","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":false},"extends":"SmrtObject","exportName":"AccessRequest","collectionExportName":"AccessRequestCollection","displayLabelField":"name","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","description":"Private database arbiter shared by every terminal-auth process.","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":{},"enum":["pending","approved","consumed","expired"]},"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":false,"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","description":"Group represents a team or department within a tenant.","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":{"include":["list","get"]},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"Group","collectionExportName":"GroupCollection","displayLabelField":"name","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","description":"GroupMember is a join table linking Users to Groups.","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,"onDelete":"NO ACTION"}},"userId":{"type":"foreignKey","required":true,"related":"User","_meta":{"required":true,"onDelete":"NO ACTION"}}},"methods":{},"decoratorConfig":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]},"conflictColumns":["group_id","user_id"]},"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_group_id_user_id_idx","columns":["group_id","user_id"],"unique":true},{"name":"group_members_slug_context_idx","columns":["slug","context"]},{"name":"group_members_created_at_idx","columns":["created_at"]},{"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","description":"GroupRole is a join table linking Groups to Roles.","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":{"include":["list","get"]}},"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","description":"Private database arbiter shared by every process that authenticates.","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},"enum":["subject","source"]},"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},"enum":["denied","failed","succeeded","locked","source-locked","managed"]},"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":false},"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","description":"Membership represents a user's membership in a tenant with an assigned role.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/Membership.ts","packageName":"@happyvertical/smrt-users","fields":{"userId":{"type":"foreignKey","required":true,"related":"User","description":"The person who belongs to this organization.","_meta":{"description":"The person who belongs to this organization.","required":true}},"tenantId":{"type":"foreignKey","required":true,"related":"Tenant","_meta":{"required":true}},"roleId":{"type":"foreignKey","required":true,"related":"Role","description":"The role that determines this member's permissions.","_meta":{"description":"The role that determines this member's permissions.","required":true}},"status":{"type":"text","required":false,"description":"Whether this membership is active, pending, or inactive.","_meta":{"description":"Whether this membership is active, pending, or inactive."}}},"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":{"include":["list","get"]},"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","description":"MembershipOverride allows granting or denying specific permissions to a user beyond what their role and groups provide.","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,"onDelete":"NO ACTION"}},"permissionId":{"type":"foreignKey","required":true,"related":"Permission","_meta":{"required":true,"onDelete":"NO ACTION"}},"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":{"include":["list","get"]},"conflictColumns":["membership_id","permission_id"]},"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_membership_id_permission_id_idx","columns":["membership_id","permission_id"],"unique":true},{"name":"membership_overrides_slug_context_idx","columns":["slug","context"]},{"name":"membership_overrides_created_at_idx","columns":["created_at"]},{"name":"membership_overrides_permission_id_idx","columns":["permission_id"]}],"version":"25fe9da8"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthClient":{"name":"usersoauthclient","className":"UsersOAuthClient","qualifiedName":"@happyvertical/smrt-users:UsersOAuthClient","collection":"usersoauthclients","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"clientId":{"type":"text","required":true,"_meta":{"required":true,"unique":true}},"redirectUris":{"type":"text","required":false},"allowedScopes":{"type":"text","required":false},"tokenEndpointAuthMethod":{"type":"text","required":false,"default":"none","enum":["none","client_secret_post"]},"secretHash":{"type":"text","required":false,"_meta":{"nullable":true,"sensitive":true},"sensitive":true},"allowedResources":{"type":"text","required":false},"createdAt":{"type":"datetime","required":false,"_meta":{}}},"methods":{"getRedirectUris":{"name":"getRedirectUris","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getAllowedScopes":{"name":"getAllowedScopes","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getAllowedResources":{"name":"getAllowedResources","async":false,"parameters":[],"returnType":"string[] | undefined","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_clients","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false},"extends":"SmrtObject","exportName":"UsersOAuthClient","collectionExportName":"UsersOAuthClientCollection","validationRules":[{"field":"clientId","rule":"required","fieldType":"text"}],"schema":{"tableName":"users_oauth_clients","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_clients\\" (\\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 \\"client_id\\" TEXT NOT NULL UNIQUE,\\n \\"redirect_uris\\" TEXT,\\n \\"allowed_scopes\\" TEXT,\\n \\"token_endpoint_auth_method\\" TEXT DEFAULT 'none',\\n \\"secret_hash\\" TEXT,\\n \\"allowed_resources\\" 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"},"client_id":{"type":"TEXT","notNull":true,"unique":true},"redirect_uris":{"type":"TEXT","notNull":false,"unique":false},"allowed_scopes":{"type":"TEXT","notNull":false,"unique":false},"token_endpoint_auth_method":{"type":"TEXT","notNull":false,"unique":false,"default":"none"},"secret_hash":{"type":"TEXT","notNull":false,"unique":false},"allowed_resources":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_clients_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_clients_created_at_idx","columns":["created_at"]}],"version":"0ecda18c"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAuthorizationCode":{"name":"usersoauthauthorizationcode","className":"UsersOAuthAuthorizationCode","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAuthorizationCode","collection":"usersoauthauthorizationcodes","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"authorizationId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"codeHash":{"type":"text","required":true,"_meta":{"required":true,"unique":true,"sensitive":true},"sensitive":true},"clientId":{"type":"text","required":false,"_meta":{"indexed":true}},"subject":{"type":"text","required":false,"_meta":{"indexed":true}},"tenantId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"claims":{"type":"text","required":false},"redirectUri":{"type":"text","required":false},"scopes":{"type":"text","required":false},"resource":{"type":"text","required":false,"_meta":{"nullable":true}},"codeChallenge":{"type":"text","required":false},"expiresAt":{"type":"datetime","required":false,"_meta":{"indexed":true}},"consumedAt":{"type":"datetime","required":false,"_meta":{"nullable":true}}},"methods":{"getScopes":{"name":"getScopes","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getClaims":{"name":"getClaims","async":false,"parameters":[],"returnType":"OAuthTokenClaims","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_authorization_codes","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false,"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"UsersOAuthAuthorizationCode","collectionExportName":"UsersOAuthAuthorizationCodeCollection","validationRules":[{"field":"codeHash","rule":"required","fieldType":"text"}],"schema":{"tableName":"users_oauth_authorization_codes","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_authorization_codes\\" (\\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 \\"authorization_id\\" TEXT,\\n \\"code_hash\\" TEXT NOT NULL UNIQUE,\\n \\"client_id\\" TEXT,\\n \\"subject\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"claims\\" TEXT,\\n \\"redirect_uri\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"code_challenge\\" TEXT,\\n \\"expires_at\\" TIMESTAMP,\\n \\"consumed_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"code_hash":{"type":"TEXT","notNull":true,"unique":true},"client_id":{"type":"TEXT","notNull":false,"unique":false},"subject":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"claims":{"type":"TEXT","notNull":false,"unique":false},"redirect_uri":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"code_challenge":{"type":"TEXT","notNull":false,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"consumed_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_authorization_codes_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_authorization_codes_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_authorization_codes_client_id_idx","columns":["client_id"]},{"name":"users_oauth_authorization_codes_subject_idx","columns":["subject"]},{"name":"users_oauth_authorization_codes_tenant_id_idx","columns":["tenant_id"]},{"name":"users_oauth_authorization_codes_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_authorization_codes_created_at_idx","columns":["created_at"]}],"version":"f5c5d615"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthRefreshGrant":{"name":"usersoauthrefreshgrant","className":"UsersOAuthRefreshGrant","qualifiedName":"@happyvertical/smrt-users:UsersOAuthRefreshGrant","collection":"usersoauthrefreshgrants","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"authorizationId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"tokenHash":{"type":"text","required":true,"_meta":{"required":true,"unique":true,"sensitive":true},"sensitive":true},"familyId":{"type":"text","required":false,"_meta":{"indexed":true}},"clientId":{"type":"text","required":false,"_meta":{"indexed":true}},"subject":{"type":"text","required":false,"_meta":{"indexed":true}},"tenantId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"claims":{"type":"text","required":false},"scopes":{"type":"text","required":false},"resource":{"type":"text","required":false,"_meta":{"nullable":true}},"expiresAt":{"type":"datetime","required":false,"_meta":{"indexed":true}},"consumedAt":{"type":"datetime","required":false,"_meta":{"nullable":true}},"revokedAt":{"type":"datetime","required":false,"_meta":{"nullable":true,"indexed":true}}},"methods":{"getScopes":{"name":"getScopes","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getClaims":{"name":"getClaims","async":false,"parameters":[],"returnType":"OAuthTokenClaims","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_refresh_grants","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false,"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"UsersOAuthRefreshGrant","collectionExportName":"UsersOAuthRefreshGrantCollection","validationRules":[{"field":"tokenHash","rule":"required","fieldType":"text"}],"schema":{"tableName":"users_oauth_refresh_grants","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_refresh_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 \\"authorization_id\\" TEXT,\\n \\"token_hash\\" TEXT NOT NULL UNIQUE,\\n \\"family_id\\" TEXT,\\n \\"client_id\\" TEXT,\\n \\"subject\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"claims\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"expires_at\\" TIMESTAMP,\\n \\"consumed_at\\" TIMESTAMP,\\n \\"revoked_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"token_hash":{"type":"TEXT","notNull":true,"unique":true},"family_id":{"type":"TEXT","notNull":false,"unique":false},"client_id":{"type":"TEXT","notNull":false,"unique":false},"subject":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"claims":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"consumed_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_refresh_grants_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_refresh_grants_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_refresh_grants_family_id_idx","columns":["family_id"]},{"name":"users_oauth_refresh_grants_client_id_idx","columns":["client_id"]},{"name":"users_oauth_refresh_grants_subject_idx","columns":["subject"]},{"name":"users_oauth_refresh_grants_tenant_id_idx","columns":["tenant_id"]},{"name":"users_oauth_refresh_grants_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_refresh_grants_revoked_at_idx","columns":["revoked_at"]},{"name":"users_oauth_refresh_grants_created_at_idx","columns":["created_at"]}],"version":"d332998e"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAccessTokenRevocation":{"name":"usersoauthaccesstokenrevocation","className":"UsersOAuthAccessTokenRevocation","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAccessTokenRevocation","collection":"usersoauthaccesstokenrevocations","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"jti":{"type":"text","required":true,"_meta":{"required":true,"unique":true,"sensitive":true},"sensitive":true},"expiresAt":{"type":"datetime","required":false,"_meta":{"indexed":true}}},"methods":{},"decoratorConfig":{"tableName":"users_oauth_access_token_revocations","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false},"extends":"SmrtObject","exportName":"UsersOAuthAccessTokenRevocation","collectionExportName":"UsersOAuthAccessTokenRevocationCollection","validationRules":[{"field":"jti","rule":"required","fieldType":"text"}],"schema":{"tableName":"users_oauth_access_token_revocations","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_access_token_revocations\\" (\\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 \\"jti\\" TEXT NOT NULL UNIQUE,\\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"},"jti":{"type":"TEXT","notNull":true,"unique":true},"expires_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_access_token_revocations_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_access_token_revocations_expires_at_idx","columns":["expires_at"]},{"name":"users_oauth_access_token_revocations_created_at_idx","columns":["created_at"]}],"version":"79147089"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthAuthorization":{"name":"usersoauthauthorization","className":"UsersOAuthAuthorization","qualifiedName":"@happyvertical/smrt-users:UsersOAuthAuthorization","collection":"usersoauthauthorizations","description":"A consent decision bound to a server-side session; never exposes its bearer.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"subject":{"type":"text","required":false,"_meta":{"indexed":true}},"sessionId":{"type":"text","required":false,"_meta":{"sensitive":true},"sensitive":true},"clientId":{"type":"text","required":false,"_meta":{"indexed":true}},"tenantId":{"type":"text","required":false,"_meta":{"nullable":true}},"scopes":{"type":"text","required":false},"permissionCeiling":{"type":"text","required":false},"resource":{"type":"text","required":false,"_meta":{"nullable":true}},"revokedAt":{"type":"datetime","required":false,"_meta":{"nullable":true}}},"methods":{"getPermissionCeiling":{"name":"getPermissionCeiling","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"getScopes":{"name":"getScopes","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_oauth_authorizations","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false,"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"UsersOAuthAuthorization","collectionExportName":"UsersOAuthAuthorizationCollection","schema":{"tableName":"users_oauth_authorizations","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_authorizations\\" (\\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 \\"subject\\" TEXT,\\n \\"session_id\\" TEXT,\\n \\"client_id\\" TEXT,\\n \\"tenant_id\\" TEXT,\\n \\"scopes\\" TEXT,\\n \\"permission_ceiling\\" TEXT,\\n \\"resource\\" TEXT,\\n \\"revoked_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"},"subject":{"type":"TEXT","notNull":false,"unique":false},"session_id":{"type":"TEXT","notNull":false,"unique":false},"client_id":{"type":"TEXT","notNull":false,"unique":false},"tenant_id":{"type":"TEXT","notNull":false,"unique":false},"scopes":{"type":"TEXT","notNull":false,"unique":false},"permission_ceiling":{"type":"TEXT","notNull":false,"unique":false},"resource":{"type":"TEXT","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_authorizations_tenant_id_slug_idx","columns":["tenant_id","slug","context"],"unique":true,"nullsNotDistinct":true},{"name":"users_oauth_authorizations_subject_idx","columns":["subject"]},{"name":"users_oauth_authorizations_client_id_idx","columns":["client_id"]},{"name":"users_oauth_authorizations_created_at_idx","columns":["created_at"]}],"version":"291f8816"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersOAuthRefreshFamily":{"name":"usersoauthrefreshfamily","className":"UsersOAuthRefreshFamily","qualifiedName":"@happyvertical/smrt-users:UsersOAuthRefreshFamily","collection":"usersoauthrefreshfamilies","description":"Stable lock row: rotation and revocation always serialize on this family.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/OAuthAuthorization.ts","packageName":"@happyvertical/smrt-users","fields":{"authorizationId":{"type":"text","required":false,"_meta":{"nullable":true,"indexed":true}},"revokedAt":{"type":"datetime","required":false,"_meta":{"nullable":true}}},"methods":{},"decoratorConfig":{"tableName":"users_oauth_refresh_families","sensitive":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false},"extends":"SmrtObject","exportName":"UsersOAuthRefreshFamily","collectionExportName":"UsersOAuthRefreshFamilyCollection","schema":{"tableName":"users_oauth_refresh_families","ddl":"CREATE TABLE IF NOT EXISTS \\"users_oauth_refresh_families\\" (\\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 \\"authorization_id\\" TEXT,\\n \\"revoked_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"},"authorization_id":{"type":"TEXT","notNull":false,"unique":false},"revoked_at":{"type":"TIMESTAMP","notNull":false,"unique":false}},"indexes":[{"name":"users_oauth_refresh_families_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_oauth_refresh_families_authorization_id_idx","columns":["authorization_id"]},{"name":"users_oauth_refresh_families_created_at_idx","columns":["created_at"]}],"version":"37392f31"},"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","description":"Permission represents a named capability in the system.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/Permission.ts","packageName":"@happyvertical/smrt-users","fields":{"name":{"type":"text","required":false,"default":"","description":"The name of an action people can be allowed to perform.","_meta":{"description":"The name of an action people can be allowed to perform."}},"description":{"type":"text","required":false,"default":"","description":"What this permission allows someone to do.","_meta":{"description":"What this permission allows someone to do."}},"category":{"type":"text","required":false,"default":"","description":"The area of the application this permission belongs to.","_meta":{"description":"The area of the application this permission belongs to."}}},"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":{"include":["list","get"]}},"extends":"SmrtObject","exportName":"Permission","collectionExportName":"PermissionCollection","displayLabelField":"name","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","description":"An exact tenant/resource/user/permission decision. This deliberately does not replace tenant RBAC: ResourceGrantResolver only allows after the normal operation guard has allowed the same permission.","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","description":"The person receiving this record-specific access rule.","_meta":{"description":"The person receiving this record-specific access rule.","required":true}},"resourceType":{"type":"text","required":false,"description":"The kind of record this access rule applies to.","_meta":{"description":"The kind of record this access rule applies to."}},"resourceId":{"type":"text","required":false,"description":"The specific record covered by this access rule.","_meta":{"description":"The specific record covered by this access rule."}},"permission":{"type":"text","required":false,"description":"The action this rule allows or denies for the record.","_meta":{"description":"The action this rule allows or denies for the record."}},"effect":{"type":"text","required":false,"description":"Whether this rule grants access or denies it. Denies take precedence.","_meta":{"description":"Whether this rule grants access or denies it. Denies take precedence."},"enum":["grant","deny"]},"canDelegate":{"type":"boolean","required":false,"default":false,"description":"Whether the recipient may pass this grant on to another person.","_meta":{"description":"Whether the recipient may pass this grant on to another person."}},"parentGrantId":{"type":"foreignKey","required":false,"related":"ResourceGrant","description":"The earlier grant from which this access was delegated.","_meta":{"description":"The earlier grant from which this access was delegated."}},"revokedAt":{"type":"text","required":false,"description":"When this access rule was revoked, if it has ended.","_meta":{"description":"When this access rule was revoked, if it has ended."}}},"methods":{"isActive":{"name":"isActive","async":false,"parameters":[],"returnType":"boolean","isStatic":false,"isPublic":true}},"decoratorConfig":{"tenantScoped":true,"api":{"include":[]},"mcp":{"include":[]},"cli":false,"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","description":"Role represents a permission template that can be assigned to users.","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":"The name of this set of permissions.","_meta":{"description":"The name of this set of permissions."}},"description":{"type":"text","required":false,"default":"","description":"What this role allows and who should receive it.","_meta":{"description":"What this role allows and who should receive it."}},"isSystem":{"type":"boolean","required":false,"default":false,"description":"Whether this is a built-in role protected from deletion.","_meta":{"description":"Whether this is a built-in role protected from deletion."}},"inheritsToDescendants":{"type":"boolean","required":false,"default":false,"description":"Whether this role can give members access to organizations below theirs.","_meta":{"description":"Whether this role can give members access to organizations below theirs."}}},"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":{"include":["list","get"]},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"Role","collectionExportName":"RoleCollection","displayLabelField":"name","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","description":"RolePermission is a join table linking Roles to Permissions.","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":{"include":["list","get"]},"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","description":"Session represents an authenticated user session.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/Session.ts","packageName":"@happyvertical/smrt-users","fields":{"userId":{"type":"foreignKey","required":false,"related":"User","description":"The person signed in through this session.","_meta":{"description":"The person signed in through this session."}},"tenantId":{"type":"foreignKey","required":false,"related":"Tenant","_meta":{"nullable":true}},"status":{"type":"text","required":false,"description":"Whether this sign-in session is active or has ended.","_meta":{"description":"Whether this sign-in session is active or has ended."}},"expiresAt":{"type":"datetime","required":false,"description":"When this session expires unless renewed within its allowed limits.","_meta":{"description":"When this session expires unless renewed within its allowed limits.","indexed":true}},"userAgent":{"type":"text","required":false,"default":"","description":"The browser or device reported when this session was created.","_meta":{"description":"The browser or device reported when this session was created."}},"ipAddress":{"type":"text","required":false,"default":"","description":"The network address reported for this session.","_meta":{"description":"The network address reported for this session."}},"lastAccessedAt":{"type":"datetime","required":false,"description":"When this session was last used.","_meta":{"description":"When this session was last used."}},"data":{"type":"json","required":false,"default":{},"description":"Additional session details maintained by your application.","_meta":{"description":"Additional session details maintained by your application."}},"authMethod":{"type":"text","required":false,"description":"The sign-in method used to establish this session.","_meta":{"description":"The sign-in method used to establish this session.","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":false,"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","description":"Tenant represents an organizational boundary in the multi-tenant system.","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":{"include":["list","get"]}},"extends":"SmrtObject","exportName":"Tenant","collectionExportName":"TenantCollection","displayLabelField":"name","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","enum":["unprovisioned","provisioning","active","drifted","failed"]},"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":{"include":["list","get"]},"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","description":"TenantPermissionOverride allows setting explicit permission values at the tenant level.","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,"onDelete":"NO ACTION"}},"permissionId":{"type":"foreignKey","required":true,"related":"Permission","_meta":{"required":true,"onDelete":"NO ACTION"}},"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":{"include":["list","get"]},"conflictColumns":["tenant_id","permission_id"]},"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_permission_id_idx","columns":["tenant_id","permission_id"],"unique":true},{"name":"tenant_permission_overrides_slug_context_idx","columns":["slug","context"]},{"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","description":"User represents an authenticated identity in the system.","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","description":"The personal profile linked to this account.","_meta":{"description":"The personal profile linked to this account.","unique":true}},"email":{"type":"text","required":false,"default":"","description":"The email address used for this account.","_meta":{"description":"The email address used for this account.","indexed":true}},"emailKey":{"type":"text","required":false,"description":"The standardized email address used to recognize this account; maintained automatically.","_meta":{"description":"The standardized email address used to recognize this account; maintained automatically.","nullable":true,"unique":true,"readonly":true},"readonly":true},"status":{"type":"text","required":false,"description":"Whether this account is active, inactive, pending, or suspended.","_meta":{"description":"Whether this account is active, inactive, pending, or suspended."}},"lastLoginAt":{"type":"datetime","required":false,"description":"When this person most recently signed in.","_meta":{"description":"When this person most recently signed in."}}},"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":{"include":["list","get"]}},"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","recipes":[{"id":"users.roles-and-permissions","className":"UsersRolesAndPermissionsRecipe","label":"Roles and permissions","summary":"Manage tenant roles, memberships, permissions, and controlled sharing.","synonyms":["access control","rbac","sharing"],"models":["@happyvertical/smrt-users:Role","@happyvertical/smrt-users:Permission","@happyvertical/smrt-users:Membership","@happyvertical/smrt-users:ResourceGrant"],"nav":[{"label":"Roles","model":"@happyvertical/smrt-users:Role","icon":"users","description":"Define tenant permission bundles.","noun":"role"},{"label":"Permissions","model":"@happyvertical/smrt-users:Permission","icon":"settings","description":"Review operations available to roles.","noun":"permission"}],"requires":[],"group":{"id":"account-access","label":"Account access","summary":"Sign in and manage account sessions."},"section":{"id":"access-control","label":"Access control","icon":"users","description":"Manage tenant roles, permissions, and reviewed sharing."},"options":{"@happyvertical/smrt-users:ResourceGrant":{"exposure":{"api":false,"mcp":false,"cli":false}}},"help":{"markdown":"## Overview\\n\\nRoles and permissions control access to your organization. Denies take precedence, and role changes should be reviewed before they are applied.\\n\\n## Tasks\\n\\n- Ask an authorized administrator to create a role and assign only the permissions required for its work.\\n- Add a member to the correct organization through your approved membership settings and assign a role through {field:Membership.roleId}.\\n- Use a resource grant only when a record needs a reviewed exception to its ordinary role rules.\\n","fieldRefs":["Membership.roleId"]},"demo":{"mode":"server","reasons":["Needs a server because its package does not build for a browser: node:crypto/async_hooks; core migrations; and its package depends on @happyvertical/smrt-profiles, @happyvertical/smrt-tenancy, which do not build for a browser (#3617, #3624, #3626)."]}},{"id":"users.sign-in","className":"UsersSignInRecipe","label":"Sign in","summary":"Access an account through an application-authorized sign-in flow.","synonyms":["log in","authentication","single sign-on"],"models":["@happyvertical/smrt-users:User","@happyvertical/smrt-users:Session"],"nav":[{"label":"Security sessions","model":"@happyvertical/smrt-users:Session","icon":"settings","description":"Review active sessions and sign out unrecognized devices.","noun":"security session"}],"requires":[],"group":{"id":"account-access","label":"Account access","summary":"Sign in and manage account sessions."},"section":{"id":"account-security","label":"Account security","icon":"settings","description":"Review account access and active sessions."},"options":{"@happyvertical/smrt-users:Session":{"exposure":{"api":false,"mcp":false,"cli":false}}},"help":{"markdown":"## Overview\\n\\nUse your organization\u2019s approved sign-in method. Review your signed-in devices on your account security page.\\n\\n## Tasks\\n\\n- Review active sign-in sessions from your account security page and end sessions you no longer recognize.\\n- Ask an administrator for recovery help if you lose access to every available credential.\\n","fieldRefs":[]},"surfaces":[{"kind":"settings-panel","export":"@happyvertical/smrt-users/svelte#AccountSecurityPanel","label":"Account security"}],"providers":[{"id":"oidc","kind":"oauth","options":["oidc"],"required":false}],"demo":{"mode":"server","reasons":["Needs a server because its package does not build for a browser: node:crypto/async_hooks; core migrations; and its package depends on @happyvertical/smrt-profiles, @happyvertical/smrt-tenancy, which do not build for a browser (#3617, #3624, #3626)."]}}],"smrtDependencies":["@happyvertical/smrt-core","@happyvertical/smrt-mobile-contract","@happyvertical/smrt-profiles","@happyvertical/smrt-tenancy"],"browser":{"status":"server-only","issues":["#3617","#3624","#3626"],"reason":"node:crypto/async_hooks; core migrations","via":["@happyvertical/smrt-profiles","@happyvertical/smrt-tenancy"]},"stampsConstructors":true}`));
25
25
  //#endregion
26
26
  //#region src/models/Membership.ts
27
27
  var __defProp$16 = Object.defineProperty;
@@ -256,7 +256,16 @@ var SESSION_DATA_KEYS = {
256
256
  /** ISO timestamp after which the session is invalid whatever its activity. */
257
257
  absoluteExpiresAt: "absoluteExpiresAt",
258
258
  /** Sliding idle timeout in seconds, applied on every recorded activity. */
259
- idleSeconds: "idleSeconds"
259
+ idleSeconds: "idleSeconds",
260
+ /**
261
+ * ISO timestamp of the out-of-band proof (a recovery link, an operator-
262
+ * issued code) a host verified before minting this session (#3905). Set
263
+ * only by the host's recovery flow at mint; it is what
264
+ * `PasswordCredentialService.replaceForgottenPassword` measures freshness
265
+ * from, and it survives tenant-switch rotation (unlike the row's
266
+ * `created_at`).
267
+ */
268
+ outOfBandProofAt: "outOfBandProofAt"
260
269
  };
261
270
  function resolveSessionExpiry(ttlSeconds, data) {
262
271
  const next = Date.now() + ttlSeconds * 1e3;
@@ -1401,12 +1410,19 @@ var GroupMember = class extends SmrtObject {
1401
1410
  }
1402
1411
  };
1403
1412
  __publicField$7(GroupMember, "__smrtPackage__", "@happyvertical/smrt-users");
1404
- __decorateClass$7([foreignKey("Group", { required: true })], GroupMember.prototype, "groupId", 2);
1405
- __decorateClass$7([foreignKey("User", { required: true })], GroupMember.prototype, "userId", 2);
1413
+ __decorateClass$7([foreignKey("Group", {
1414
+ required: true,
1415
+ onDelete: "NO ACTION"
1416
+ })], GroupMember.prototype, "groupId", 2);
1417
+ __decorateClass$7([foreignKey("User", {
1418
+ required: true,
1419
+ onDelete: "NO ACTION"
1420
+ })], GroupMember.prototype, "userId", 2);
1406
1421
  GroupMember = __decorateClass$7([smrt({
1407
1422
  api: { include: ["list", "get"] },
1408
1423
  mcp: { include: ["list", "get"] },
1409
- cli: { include: ["list", "get"] }
1424
+ cli: { include: ["list", "get"] },
1425
+ conflictColumns: ["group_id", "user_id"]
1410
1426
  })], GroupMember);
1411
1427
  //#endregion
1412
1428
  //#region src/collections/GroupMemberCollection.ts
@@ -1449,38 +1465,35 @@ var GroupMemberCollection = class extends SmrtCollection {
1449
1465
  })).length > 0;
1450
1466
  }
1451
1467
  /**
1452
- * Add user to a group
1468
+ * Add a user to a group. Idempotent on the `(group_id, user_id)` natural
1469
+ * key (#3375): an existing membership is returned without a write, and
1470
+ * concurrent first adds converge on one row.
1453
1471
  */
1454
1472
  async addMember(groupId, userId) {
1455
- const existing = await this.list({
1473
+ const [existing] = await this.list({
1456
1474
  where: {
1457
1475
  groupId,
1458
1476
  userId
1459
1477
  },
1460
1478
  limit: 1
1461
1479
  });
1462
- if (existing.length > 0) return existing[0];
1463
- const member = await this.create({
1480
+ return existing ?? await this.create({
1464
1481
  groupId,
1465
1482
  userId
1466
1483
  });
1467
- await member.save();
1468
- return member;
1469
1484
  }
1470
1485
  /**
1471
- * Remove user from a group
1486
+ * Remove a user from a group, returning whether they were a member. Every
1487
+ * row for the pair is removed, so a pre-migration duplicate cannot keep the
1488
+ * membership in force.
1472
1489
  */
1473
1490
  async removeMember(groupId, userId) {
1474
- const existing = await this.list({
1475
- where: {
1476
- groupId,
1477
- userId
1478
- },
1479
- limit: 1
1480
- });
1481
- if (existing.length === 0) return false;
1482
- await existing[0].delete();
1483
- return true;
1491
+ const existing = await this.list({ where: {
1492
+ groupId,
1493
+ userId
1494
+ } });
1495
+ for (const member of existing) await member.delete();
1496
+ return existing.length > 0;
1484
1497
  }
1485
1498
  /**
1486
1499
  * Get group IDs for a user
@@ -1732,13 +1745,20 @@ var MembershipOverride = class extends SmrtObject {
1732
1745
  }
1733
1746
  };
1734
1747
  __publicField$5(MembershipOverride, "__smrtPackage__", "@happyvertical/smrt-users");
1735
- __decorateClass$5([foreignKey("Membership", { required: true })], MembershipOverride.prototype, "membershipId", 2);
1736
- __decorateClass$5([foreignKey("Permission", { required: true })], MembershipOverride.prototype, "permissionId", 2);
1748
+ __decorateClass$5([foreignKey("Membership", {
1749
+ required: true,
1750
+ onDelete: "NO ACTION"
1751
+ })], MembershipOverride.prototype, "membershipId", 2);
1752
+ __decorateClass$5([foreignKey("Permission", {
1753
+ required: true,
1754
+ onDelete: "NO ACTION"
1755
+ })], MembershipOverride.prototype, "permissionId", 2);
1737
1756
  __decorateClass$5([field({ type: "text" })], MembershipOverride.prototype, "effect", 2);
1738
1757
  MembershipOverride = __decorateClass$5([smrt({
1739
1758
  api: { include: ["list", "get"] },
1740
1759
  mcp: { include: ["list", "get"] },
1741
- cli: { include: ["list", "get"] }
1760
+ cli: { include: ["list", "get"] },
1761
+ conflictColumns: ["membership_id", "permission_id"]
1742
1762
  })], MembershipOverride);
1743
1763
  //#endregion
1744
1764
  //#region src/collections/MembershipOverrideCollection.ts
@@ -1782,43 +1802,32 @@ var MembershipOverrideCollection = class extends SmrtCollection {
1782
1802
  return (await this.findDenies(membershipId)).map((o) => o.permissionId);
1783
1803
  }
1784
1804
  /**
1785
- * Set an override for a membership
1805
+ * Set an override for a membership.
1806
+ *
1807
+ * An upsert on the `(membership_id, permission_id)` natural key (#3375):
1808
+ * concurrent calls converge on one row, the last write's effect wins, and
1809
+ * an existing override keeps its id.
1786
1810
  */
1787
1811
  async setOverride(membershipId, permissionId, effect) {
1788
- const existing = await this.list({
1789
- where: {
1790
- membershipId,
1791
- permissionId
1792
- },
1793
- limit: 1
1794
- });
1795
- if (existing.length > 0) {
1796
- existing[0].effect = effect;
1797
- await existing[0].save();
1798
- return existing[0];
1799
- }
1800
- const override = await this.create({
1812
+ return await this.create({
1801
1813
  membershipId,
1802
1814
  permissionId,
1803
1815
  effect
1804
1816
  });
1805
- await override.save();
1806
- return override;
1807
1817
  }
1808
1818
  /**
1809
- * Remove an override
1819
+ * Remove the override for a membership/permission pair, returning whether
1820
+ * one existed. Every row for the pair is removed, so a duplicate left by a
1821
+ * deployment that has not yet run `deduplicateAuthorityPairs()` can never
1822
+ * keep the override in force.
1810
1823
  */
1811
1824
  async removeOverride(membershipId, permissionId) {
1812
- const existing = await this.list({
1813
- where: {
1814
- membershipId,
1815
- permissionId
1816
- },
1817
- limit: 1
1818
- });
1819
- if (existing.length === 0) return false;
1820
- await existing[0].delete();
1821
- return true;
1825
+ const existing = await this.list({ where: {
1826
+ membershipId,
1827
+ permissionId
1828
+ } });
1829
+ for (const override of existing) await override.delete();
1830
+ return existing.length > 0;
1822
1831
  }
1823
1832
  /**
1824
1833
  * Grant a permission to a membership
@@ -2405,7 +2414,40 @@ function deriveOperationPermissionCollectionName(input) {
2405
2414
  }
2406
2415
  function deriveOperationPermissionSlug(collection, action) {
2407
2416
  const collectionName = deriveOperationPermissionCollectionName(collection);
2408
- const normalizedAction = normalizeOperationPermissionAction(action);
2417
+ const standard = normalizeOperationPermissionAction(action);
2418
+ if ([
2419
+ "read",
2420
+ "create",
2421
+ "update",
2422
+ "delete"
2423
+ ].includes(standard)) return `${collectionName}.${standard}`;
2424
+ const ctor = typeof collection === "string" ? void 0 : resolveConstructor(collection);
2425
+ const registered = ctor ? ObjectRegistry.getClassByConstructor(ctor) ?? ObjectRegistry.getClass(ctor.name ?? "") : void 0;
2426
+ if (registered) {
2427
+ const normalizedAction2 = normalizeOperationPermissionAction(resolveOperationPermissionAlias(manifestEntryFor(registered)?.decoratorConfig ?? registered.config, action)?.action ?? action);
2428
+ if (!normalizedAction2) throw new Error("Operation permission action must not be empty.");
2429
+ return `${collectionName}.${normalizedAction2}`;
2430
+ }
2431
+ const actions = /* @__PURE__ */ new Set();
2432
+ for (const registered2 of new Set(ObjectRegistry.getAllClasses().values())) {
2433
+ const entry = manifestEntryFor(registered2);
2434
+ const owner = entry && isCollectionClass(registered2, entry) ? resolveCollectionItemRegistration(registered2, entry) : registered2;
2435
+ if (!owner || resolveCatalogCollectionName(owner, manifestEntryFor(owner)) !== collectionName) continue;
2436
+ const alias = resolveOperationPermissionAlias(entry?.decoratorConfig ?? registered2.config, action);
2437
+ if (alias) {
2438
+ actions.add(alias.action);
2439
+ continue;
2440
+ }
2441
+ if (getPublicCustomMethodNames(entry?.methods ? Object.values(entry.methods) : Array.from(registered2.methods.entries()), [
2442
+ "list",
2443
+ "get",
2444
+ "create",
2445
+ "update",
2446
+ "delete"
2447
+ ]).includes(action)) actions.add(action);
2448
+ }
2449
+ if (actions.size > 1) throw new Error("Ambiguous operation permission alias");
2450
+ const normalizedAction = normalizeOperationPermissionAction([...actions][0] ?? action);
2409
2451
  if (!normalizedAction) throw new Error("Operation permission action must not be empty.");
2410
2452
  return `${collectionName}.${normalizedAction}`;
2411
2453
  }
@@ -2485,14 +2527,33 @@ function getCollectionClassActionDefinitions(registered, manifestEntry, standard
2485
2527
  if (isCollectionClass(item, itemEntry)) return [];
2486
2528
  const collection = resolveCatalogCollectionName(item, itemEntry);
2487
2529
  const objectConfig = manifestEntry.decoratorConfig ?? registered.config;
2488
- return getPublicCustomMethodNames(manifestEntry.methods ? Object.values(manifestEntry.methods) : Array.from(registered.methods.entries()), standardActions).filter((methodName) => isOperationEnabled(objectConfig?.api, methodName)).map((methodName) => ({
2489
- className: item.name,
2490
- collection,
2491
- description: `Allows ${methodName} on ${humanizeResource(collection).toLowerCase()}`,
2492
- name: `${capitalize(methodName)} ${humanizeResource(collection)}`,
2493
- qualifiedName: item.qualifiedName,
2494
- slug: `${collection}.${methodName}`
2495
- }));
2530
+ return getPublicCustomMethodNames(manifestEntry.methods ? Object.values(manifestEntry.methods) : Array.from(registered.methods.entries()), standardActions).filter((methodName) => isOperationEnabled(objectConfig?.api, methodName)).map((methodName) => {
2531
+ const alias = resolveOperationPermissionAlias(objectConfig, methodName);
2532
+ const action = alias?.action ?? methodName;
2533
+ const definition = {
2534
+ className: item.name,
2535
+ collection,
2536
+ description: `Allows ${action} on ${humanizeResource(collection).toLowerCase()}`,
2537
+ name: `${capitalize(action)} ${humanizeResource(collection)}`,
2538
+ qualifiedName: item.qualifiedName,
2539
+ slug: `${collection}.${action}`
2540
+ };
2541
+ addAliasDatabaseBindings(definition, alias, item, itemEntry);
2542
+ return definition;
2543
+ });
2544
+ }
2545
+ function addAliasDatabaseBindings(definition, alias, registered, manifestEntry) {
2546
+ if (!alias?.databaseActions?.length) return;
2547
+ const tableName = manifestEntry?.schema?.tableName ?? registered.schema?.tableName ?? registered.config.tableName;
2548
+ if (!tableName) throw new Error("Permission SQL binding requires a table name");
2549
+ mergeBindings(definition, {
2550
+ slug: definition.slug,
2551
+ postgres: { bindings: alias.databaseActions.map((action) => ({
2552
+ action,
2553
+ tableName,
2554
+ ...registered.tenantScopedConfig?.field ? { tenantField: toSnakeCase(registered.tenantScopedConfig.field) } : {}
2555
+ })) }
2556
+ });
2496
2557
  }
2497
2558
  function isCollectionManifestEntry(objectDef) {
2498
2559
  return objectDef?.extends === "SmrtCollection" || objectDef?.extendsTypeArg !== void 0;
@@ -2753,7 +2814,11 @@ var PermissionCatalogService = class PermissionCatalogService {
2753
2814
  seenRegistrations.add(registered);
2754
2815
  const manifestEntry = registered?.qualifiedName ? findManifestEntryByQualifiedName(registered.qualifiedName) : void 0;
2755
2816
  if (isCollectionClass(registered, manifestEntry)) {
2756
- for (const definition of getCollectionClassActionDefinitions(registered, manifestEntry, standardActions)) definitions.set(definition.slug, definition);
2817
+ for (const definition of getCollectionClassActionDefinitions(registered, manifestEntry, standardActions)) {
2818
+ const existing = definitions.get(definition.slug);
2819
+ if (existing) mergeBindings(existing, definition);
2820
+ else definitions.set(definition.slug, definition);
2821
+ }
2757
2822
  continue;
2758
2823
  }
2759
2824
  const className = registered.name;
@@ -2762,6 +2827,7 @@ var PermissionCatalogService = class PermissionCatalogService {
2762
2827
  const collection = resolveCatalogCollectionName(registered, manifestEntry);
2763
2828
  const catalogCliConfig = qualifiedName && USERS_AUTHORITY_CATALOG_MODELS.has(qualifiedName) ? true : objectConfig.cli;
2764
2829
  if (isOperationEnabled(objectConfig.api, "list") || isOperationEnabled(objectConfig.api, "get") || isOperationEnabled(catalogCliConfig, "list") || isOperationEnabled(catalogCliConfig, "get") || isOperationEnabled(objectConfig.mcp, "list") || isOperationEnabled(objectConfig.mcp, "get")) definitions.set(`${collection}.read`, {
2830
+ ...definitions.get(`${collection}.read`),
2765
2831
  className,
2766
2832
  collection,
2767
2833
  qualifiedName,
@@ -2788,6 +2854,7 @@ var PermissionCatalogService = class PermissionCatalogService {
2788
2854
  ]) {
2789
2855
  if (!(isOperationEnabled(objectConfig.api, action) || isOperationEnabled(catalogCliConfig, action) || isOperationEnabled(objectConfig.mcp, action))) continue;
2790
2856
  definitions.set(`${collection}.${action}`, {
2857
+ ...definitions.get(`${collection}.${action}`),
2791
2858
  className,
2792
2859
  collection,
2793
2860
  qualifiedName,
@@ -2804,14 +2871,21 @@ var PermissionCatalogService = class PermissionCatalogService {
2804
2871
  ...customCliMethods,
2805
2872
  ...customMcpMethods
2806
2873
  ]);
2807
- for (const methodName of customMethods) definitions.set(`${collection}.${methodName}`, {
2808
- className,
2809
- collection,
2810
- description: `Allows ${methodName} on ${humanizeResource(collection).toLowerCase()}`,
2811
- name: `${capitalize(methodName)} ${humanizeResource(collection)}`,
2812
- qualifiedName,
2813
- slug: `${collection}.${methodName}`
2814
- });
2874
+ for (const methodName of customMethods) {
2875
+ const alias = resolveOperationPermissionAlias(objectConfig, methodName);
2876
+ const permissionAction = alias?.action ?? methodName;
2877
+ const slug = `${collection}.${permissionAction}`;
2878
+ const definition = definitions.get(slug) ?? {
2879
+ className,
2880
+ collection,
2881
+ qualifiedName,
2882
+ slug,
2883
+ description: `Allows ${permissionAction} on ${humanizeResource(collection).toLowerCase()}`,
2884
+ name: `${capitalize(permissionAction)} ${humanizeResource(collection)}`
2885
+ };
2886
+ addAliasDatabaseBindings(definition, alias, registered, manifestEntry);
2887
+ definitions.set(slug, definition);
2888
+ }
2815
2889
  }
2816
2890
  return Array.from(definitions.values()).sort((left, right) => left.slug.localeCompare(right.slug));
2817
2891
  }
@@ -3730,13 +3804,20 @@ var TenantPermissionOverride = class extends SmrtObject {
3730
3804
  }
3731
3805
  };
3732
3806
  __publicField(TenantPermissionOverride, "__smrtPackage__", "@happyvertical/smrt-users");
3733
- __decorateClass([foreignKey("Tenant", { required: true })], TenantPermissionOverride.prototype, "tenantId", 2);
3734
- __decorateClass([foreignKey("Permission", { required: true })], TenantPermissionOverride.prototype, "permissionId", 2);
3807
+ __decorateClass([foreignKey("Tenant", {
3808
+ required: true,
3809
+ onDelete: "NO ACTION"
3810
+ })], TenantPermissionOverride.prototype, "tenantId", 2);
3811
+ __decorateClass([foreignKey("Permission", {
3812
+ required: true,
3813
+ onDelete: "NO ACTION"
3814
+ })], TenantPermissionOverride.prototype, "permissionId", 2);
3735
3815
  __decorateClass([field({ type: "text" })], TenantPermissionOverride.prototype, "effect", 2);
3736
3816
  TenantPermissionOverride = __decorateClass([smrt({
3737
3817
  api: { include: ["list", "get"] },
3738
3818
  mcp: { include: ["list", "get"] },
3739
- cli: { include: ["list", "get"] }
3819
+ cli: { include: ["list", "get"] },
3820
+ conflictColumns: ["tenant_id", "permission_id"]
3740
3821
  })], TenantPermissionOverride);
3741
3822
  //#endregion
3742
3823
  //#region src/collections/TenantPermissionOverrideCollection.ts
@@ -3847,43 +3928,31 @@ var TenantPermissionOverrideCollection = class extends SmrtCollection {
3847
3928
  return resultMap;
3848
3929
  }
3849
3930
  /**
3850
- * Set an override for a tenant permission
3931
+ * Set an override for a tenant permission.
3932
+ *
3933
+ * An upsert on the `(tenant_id, permission_id)` natural key (#3375):
3934
+ * concurrent calls converge on one row, the last write's effect wins, and
3935
+ * an existing override keeps its id.
3851
3936
  */
3852
3937
  async setOverride(tenantId, permissionId, effect) {
3853
- const existing = await this.list({
3854
- where: {
3855
- tenantId,
3856
- permissionId
3857
- },
3858
- limit: 1
3859
- });
3860
- if (existing.length > 0) {
3861
- existing[0].effect = effect;
3862
- await existing[0].save();
3863
- return existing[0];
3864
- }
3865
- const override = await this.create({
3938
+ return await this.create({
3866
3939
  tenantId,
3867
3940
  permissionId,
3868
3941
  effect
3869
3942
  });
3870
- await override.save();
3871
- return override;
3872
3943
  }
3873
3944
  /**
3874
- * Remove an override (permission will use default behavior)
3945
+ * Remove the override for a tenant/permission pair (the permission then
3946
+ * uses default behavior), returning whether one existed. Every row for the
3947
+ * pair is removed, so a pre-migration duplicate cannot stay in force.
3875
3948
  */
3876
3949
  async removeOverride(tenantId, permissionId) {
3877
- const existing = await this.list({
3878
- where: {
3879
- tenantId,
3880
- permissionId
3881
- },
3882
- limit: 1
3883
- });
3884
- if (existing.length === 0) return false;
3885
- await existing[0].delete();
3886
- return true;
3950
+ const existing = await this.list({ where: {
3951
+ tenantId,
3952
+ permissionId
3953
+ } });
3954
+ for (const override of existing) await override.delete();
3955
+ return existing.length > 0;
3887
3956
  }
3888
3957
  /**
3889
3958
  * Remove all overrides for a tenant
@@ -4500,6 +4569,8 @@ var DEFAULT_LOGIN_ATTEMPT_WINDOW_SECONDS = 300;
4500
4569
  var DEFAULT_LOGIN_LOCKOUT_BASE_SECONDS = 60;
4501
4570
  var DEFAULT_LOGIN_LOCKOUT_FACTOR = 2;
4502
4571
  var DEFAULT_LOGIN_LOCKOUT_MAX_SECONDS = 3600;
4572
+ var DEFAULT_SOURCE_LOCKOUT_AUDIT_SECONDS = 300;
4573
+ var SOURCE_LOCKOUT_AUDIT_MEMORY = 1024;
4503
4574
  var LoginRateLimitError = class extends Error {
4504
4575
  retryAfterSeconds;
4505
4576
  lockedOut;
@@ -4537,31 +4608,54 @@ var DurableLoginAuditSink = class DurableLoginAuditSink {
4537
4608
  await event.save();
4538
4609
  }
4539
4610
  };
4611
+ function resolveBudget(options, budget = {}) {
4612
+ const maxAttempts = Math.max(1, Math.floor(budget.maxFailures ?? options.maxAttempts ?? 5));
4613
+ const windowSeconds = budget.windowSeconds ?? options.windowSeconds ?? 300;
4614
+ if (!(Number.isFinite(maxAttempts) && windowSeconds > 0)) throw new Error("LoginAttemptLimiter budgets need a finite maxFailures and a positive windowSeconds.");
4615
+ const windowMs = windowSeconds * 1e3;
4616
+ const configured = budget.lockout !== void 0 ? budget.lockout : options.lockout;
4617
+ const lockout = configured === false ? null : {
4618
+ baseSeconds: configured?.baseSeconds ?? 60,
4619
+ factor: configured?.factor ?? 2,
4620
+ maxSeconds: configured?.maxSeconds ?? 3600
4621
+ };
4622
+ const lockoutCeilingMs = (lockout?.maxSeconds ?? 0) * 1e3;
4623
+ const streakResetMs = options.streakResetSeconds !== void 0 ? options.streakResetSeconds * 1e3 : Math.max(windowMs, lockoutCeilingMs) * 2;
4624
+ return {
4625
+ maxAttempts,
4626
+ windowMs,
4627
+ lockout,
4628
+ streakResetMs,
4629
+ retainMs: Math.max(windowMs, streakResetMs)
4630
+ };
4631
+ }
4540
4632
  function normalizeKey(scope, raw) {
4541
4633
  const trimmed = raw.trim();
4542
4634
  return scope === "subject" ? trimmed.toLowerCase() : trimmed;
4543
4635
  }
4544
4636
  var LoginAttemptLimiter = class LoginAttemptLimiter {
4545
4637
  options;
4546
- maxAttempts;
4547
- windowMs;
4548
- lockout;
4549
- streakResetMs;
4638
+ budgets;
4550
4639
  sourceStreakDecayMs;
4640
+ sourceLockoutAuditMs;
4641
+ /** Source hash → earliest time its next `source-locked` entry may be reported. */
4642
+ sourceLockoutAudited = /* @__PURE__ */ new Map();
4551
4643
  attempts;
4552
4644
  audit = null;
4553
4645
  constructor(options) {
4554
4646
  this.options = options;
4555
- this.maxAttempts = Math.max(1, Math.floor(options.maxAttempts ?? 5));
4556
- this.windowMs = (options.windowSeconds ?? 300) * 1e3;
4557
- this.lockout = options.lockout === false ? null : {
4558
- baseSeconds: options.lockout?.baseSeconds ?? 60,
4559
- factor: options.lockout?.factor ?? 2,
4560
- maxSeconds: options.lockout?.maxSeconds ?? 3600
4647
+ const subject = resolveBudget(options, options.subject);
4648
+ const source = options.source === false ? null : resolveBudget(options, options.source);
4649
+ this.budgets = {
4650
+ subject,
4651
+ source
4561
4652
  };
4562
- const lockoutCeilingMs = (this.lockout?.maxSeconds ?? 0) * 1e3;
4563
- this.streakResetMs = options.streakResetSeconds !== void 0 ? options.streakResetSeconds * 1e3 : Math.max(this.windowMs, lockoutCeilingMs) * 2;
4564
- this.sourceStreakDecayMs = Math.max(0, options.sourceStreakDecaySeconds !== void 0 ? options.sourceStreakDecaySeconds * 1e3 : this.windowMs * 2);
4653
+ this.sourceStreakDecayMs = Math.max(0, options.sourceStreakDecaySeconds !== void 0 ? options.sourceStreakDecaySeconds * 1e3 : (source ?? subject).windowMs * 2);
4654
+ this.sourceLockoutAuditMs = Math.max(0, (options.sourceLockoutAuditSeconds ?? 300) * 1e3);
4655
+ }
4656
+ /** False when this limiter was configured with `source: false`. */
4657
+ get limitsSource() {
4658
+ return this.budgets.source !== null;
4565
4659
  }
4566
4660
  static async create(options) {
4567
4661
  const limiter = new LoginAttemptLimiter(options);
@@ -4574,20 +4668,23 @@ var LoginAttemptLimiter = class LoginAttemptLimiter {
4574
4668
  else if (this.options.audit) this.audit = this.options.audit;
4575
4669
  else this.audit = await DurableLoginAuditSink.create(this.options);
4576
4670
  }
4577
- /** How long a row this limiter writes must outlive the retention sweep. */
4578
- get retainMs() {
4579
- return Math.max(this.windowMs, this.streakResetMs);
4580
- }
4581
4671
  /** Stable, peppered hash for a key. Exposed so hosts can correlate audit rows. */
4582
4672
  hashKey(scope, raw) {
4583
4673
  return createHash("sha256").update(`${this.options.keyPepper ?? ""}\0${scope}:${normalizeKey(scope, raw)}`).digest("hex");
4584
4674
  }
4585
- /** Lockout length for the n-th consecutive exhausted budget (0-based). */
4586
- lockoutMsFor(exhaustedBudgets) {
4587
- if (!this.lockout) return 0;
4588
- const seconds = Math.min(this.lockout.maxSeconds, this.lockout.baseSeconds * this.lockout.factor ** exhaustedBudgets);
4675
+ /**
4676
+ * Lockout length for the n-th consecutive exhausted budget (0-based) of the
4677
+ * given scope's budget (the subject's by default).
4678
+ */
4679
+ lockoutMsFor(exhaustedBudgets, scope = "subject") {
4680
+ const lockout = this.budgetFor(scope)?.lockout;
4681
+ if (!lockout) return 0;
4682
+ const seconds = Math.min(lockout.maxSeconds, lockout.baseSeconds * lockout.factor ** exhaustedBudgets);
4589
4683
  return Math.max(0, Math.floor(seconds * 1e3));
4590
4684
  }
4685
+ budgetFor(scope) {
4686
+ return scope === "source" ? this.budgets.source : this.budgets.subject;
4687
+ }
4591
4688
  /**
4592
4689
  * Reserve one attempt against every key supplied. Subject is reserved
4593
4690
  * first; if the source then refuses, the subject reservation is handed
@@ -4595,8 +4692,8 @@ var LoginAttemptLimiter = class LoginAttemptLimiter {
4595
4692
  */
4596
4693
  async reserve(input) {
4597
4694
  const subjectHash = input.subject != null && input.subject.trim() !== "" ? this.hashKey("subject", input.subject) : null;
4598
- const sourceHash = input.source != null && input.source.trim() !== "" ? this.hashKey("source", input.source) : null;
4599
- if (!subjectHash && !sourceHash) throw new Error("LoginAttemptLimiter.reserve() needs a subject or a source key.");
4695
+ const sourceHash = this.budgets.source && input.source != null && input.source.trim() !== "" ? this.hashKey("source", input.source) : null;
4696
+ if (!subjectHash && !sourceHash) throw new Error(this.budgets.source ? "LoginAttemptLimiter.reserve() needs a subject or a source key." : "LoginAttemptLimiter.reserve() needs a subject key: the source budget is disabled.");
4600
4697
  const reserved = [];
4601
4698
  const audit = (outcome, extra = {}) => this.report({
4602
4699
  kind: input.kind,
@@ -4608,14 +4705,15 @@ var LoginAttemptLimiter = class LoginAttemptLimiter {
4608
4705
  ...extra
4609
4706
  });
4610
4707
  for (const [scope, hash] of [["subject", subjectHash], ["source", sourceHash]]) {
4611
- if (!hash) continue;
4708
+ const budget = this.budgetFor(scope);
4709
+ if (!hash || !budget) continue;
4612
4710
  const reservation = await this.attempts.reserveAttempt({
4613
4711
  limiterKey: hash,
4614
4712
  scope,
4615
- maxAttempts: this.maxAttempts,
4616
- windowMs: this.windowMs,
4617
- streakResetMs: this.streakResetMs,
4618
- retainMs: this.retainMs
4713
+ maxAttempts: budget.maxAttempts,
4714
+ windowMs: budget.windowMs,
4715
+ streakResetMs: budget.streakResetMs,
4716
+ retainMs: budget.retainMs
4619
4717
  });
4620
4718
  if (reservation.allowed) {
4621
4719
  reserved.push({
@@ -4654,18 +4752,24 @@ var LoginAttemptLimiter = class LoginAttemptLimiter {
4654
4752
  settle();
4655
4753
  let lockedOut = false;
4656
4754
  let retryAfterSeconds = null;
4755
+ let sourceLocked = null;
4657
4756
  for (const key of reserved) {
4757
+ const budget = this.budgetFor(key.scope);
4658
4758
  const outcome = await this.attempts.recordFailure({
4659
4759
  limiterKey: key.hash,
4660
- maxAttempts: this.maxAttempts,
4661
- retainMs: this.retainMs,
4760
+ maxAttempts: budget.maxAttempts,
4761
+ retainMs: budget.retainMs,
4662
4762
  streakDecayMs: key.scope === "source" ? this.sourceStreakDecayMs : 0,
4663
- lockoutMsFor: (n) => this.lockoutMsFor(n)
4763
+ lockoutMsFor: (n) => this.lockoutMsFor(n, key.scope)
4664
4764
  });
4665
4765
  if (outcome.lockedUntil) {
4666
4766
  lockedOut = true;
4667
4767
  const seconds = Math.max(1, Math.ceil((Date.parse(outcome.lockedUntil) - Date.now()) / 1e3));
4668
4768
  retryAfterSeconds = Math.max(retryAfterSeconds ?? 0, seconds);
4769
+ if (key.scope === "source") sourceLocked = {
4770
+ hash: key.hash,
4771
+ seconds
4772
+ };
4669
4773
  }
4670
4774
  }
4671
4775
  await audit(lockedOut ? "locked" : "failed", {
@@ -4675,6 +4779,7 @@ var LoginAttemptLimiter = class LoginAttemptLimiter {
4675
4779
  ...metadata
4676
4780
  }
4677
4781
  });
4782
+ if (sourceLocked) await this.reportSourceLockout(input.kind, sourceLocked.hash, sourceLocked.seconds);
4678
4783
  return {
4679
4784
  lockedOut,
4680
4785
  retryAfterSeconds
@@ -4714,6 +4819,37 @@ var LoginAttemptLimiter = class LoginAttemptLimiter {
4714
4819
  await this.attempts.releaseAttempt(key.hash, key.windowStartedAt, { resetStreak: resetStreak && key.scope === "subject" });
4715
4820
  } catch {}
4716
4821
  }
4822
+ /**
4823
+ * Report that a source lockout started, without the subject or the caller's
4824
+ * metadata, so the entry attributes the outage to the address or device but
4825
+ * never names an attempted account. Rate limited per source, in memory, so
4826
+ * a sustained attack yields a bounded number of entries per instance.
4827
+ */
4828
+ async reportSourceLockout(kind, sourceKeyHash, retryAfterSeconds) {
4829
+ if (!this.audit) return;
4830
+ const now = Date.now();
4831
+ const next = this.sourceLockoutAudited.get(sourceKeyHash);
4832
+ if (next !== void 0 && next > now) return;
4833
+ this.sourceLockoutAudited.delete(sourceKeyHash);
4834
+ if (this.sourceLockoutAudited.size >= SOURCE_LOCKOUT_AUDIT_MEMORY) {
4835
+ for (const [hash, until] of this.sourceLockoutAudited) if (until <= now) this.sourceLockoutAudited.delete(hash);
4836
+ while (this.sourceLockoutAudited.size >= SOURCE_LOCKOUT_AUDIT_MEMORY) {
4837
+ const oldest = this.sourceLockoutAudited.keys().next().value;
4838
+ if (oldest === void 0) break;
4839
+ this.sourceLockoutAudited.delete(oldest);
4840
+ }
4841
+ }
4842
+ this.sourceLockoutAudited.set(sourceKeyHash, now + this.sourceLockoutAuditMs);
4843
+ await this.report({
4844
+ kind,
4845
+ outcome: "source-locked",
4846
+ subjectKeyHash: null,
4847
+ sourceKeyHash,
4848
+ retryAfterSeconds,
4849
+ occurredAt: new Date(now),
4850
+ metadata: { scope: "source" }
4851
+ });
4852
+ }
4717
4853
  async report(entry) {
4718
4854
  if (!this.audit) return;
4719
4855
  try {
@@ -7976,6 +8112,10 @@ var DEFAULT_PASSWORD_MANAGE_PERMISSION = "users.password.manage";
7976
8112
  var DEFAULT_PASSWORD_MIN_LENGTH = 10;
7977
8113
  var DEFAULT_PASSWORD_MAX_LENGTH = 256;
7978
8114
  var PASSWORD_MAX_LENGTH_CEILING = 1024;
8115
+ var DEFAULT_PASSWORD_RECOVERY_MAX_AGE_SECONDS = 600;
8116
+ var PASSWORD_RECOVERY_MAX_AGE_CEILING_SECONDS = 3600;
8117
+ var RECOVERY_CLOCK_SKEW_MS = 30 * 1e3;
8118
+ var NON_RECOVERY_AUTH_METHODS = /* @__PURE__ */ new Set([PASSWORD_LOGIN_KIND, "pin"]);
7979
8119
  var MAX_IDENTIFIER_LENGTH = 320;
7980
8120
  var DEFAULT_PASSWORD_DENYLIST = Object.freeze([
7981
8121
  "1234567890",
@@ -8032,6 +8172,10 @@ var PasswordPolicyError = class extends Error {
8032
8172
  this.name = "PasswordPolicyError";
8033
8173
  }
8034
8174
  };
8175
+ function outOfBandProofSessionData(provenAt = /* @__PURE__ */ new Date()) {
8176
+ if (Number.isNaN(provenAt.getTime())) throw new Error("outOfBandProofSessionData needs a valid date.");
8177
+ return { [SESSION_DATA_KEYS.outOfBandProofAt]: provenAt.toISOString() };
8178
+ }
8035
8179
  var UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
8036
8180
  var DEFAULT_SCRYPT = {
8037
8181
  N: 2 ** 15,
@@ -8051,7 +8195,9 @@ var PasswordCredentialService = class PasswordCredentialService {
8051
8195
  sessionTtl;
8052
8196
  managePermission;
8053
8197
  policy;
8198
+ recovery;
8054
8199
  sessionService;
8200
+ sessionRows;
8055
8201
  memberships;
8056
8202
  users;
8057
8203
  credentials;
@@ -8082,6 +8228,19 @@ var PasswordCredentialService = class PasswordCredentialService {
8082
8228
  pepper: configured.pepper ?? "",
8083
8229
  scrypt
8084
8230
  };
8231
+ this.recovery = options.recovery ? PasswordCredentialService.resolveRecovery(options.recovery) : null;
8232
+ }
8233
+ static resolveRecovery(recovery) {
8234
+ const methods = Array.isArray(recovery.authMethods) ? recovery.authMethods : [];
8235
+ if (methods.length === 0 || methods.some((method) => typeof method !== "string" || !method.trim() || NON_RECOVERY_AUTH_METHODS.has(method))) throw new Error("PasswordCredentialService recovery.authMethods must list the out-of-band session methods (never password or pin).");
8236
+ const maxAgeSeconds = recovery.maxAgeSeconds ?? 600;
8237
+ if (!(Number.isFinite(maxAgeSeconds) && maxAgeSeconds > 0) || maxAgeSeconds > 3600) throw new Error(`PasswordCredentialService recovery.maxAgeSeconds must be positive and at most ${PASSWORD_RECOVERY_MAX_AGE_CEILING_SECONDS}.`);
8238
+ if (recovery.assertProof !== void 0 && typeof recovery.assertProof !== "function") throw new Error("PasswordCredentialService recovery.assertProof must be a function.");
8239
+ return {
8240
+ authMethods: new Set(methods),
8241
+ maxAgeMs: maxAgeSeconds * 1e3,
8242
+ assertProof: recovery.assertProof
8243
+ };
8085
8244
  }
8086
8245
  static async create(options) {
8087
8246
  const service = new PasswordCredentialService(options);
@@ -8095,6 +8254,7 @@ var PasswordCredentialService = class PasswordCredentialService {
8095
8254
  });
8096
8255
  this.memberships = await MembershipCollection.create(withoutListBounds(this.options));
8097
8256
  this.users = await UserCollection.create(this.options);
8257
+ this.sessionRows = await SessionCollection.create(this.options);
8098
8258
  this.credentials = await UsersPasswordCredentialCollection.create(this.options);
8099
8259
  this.limiter = this.options.loginLimiter ?? await LoginAttemptLimiter.create({
8100
8260
  ...this.options,
@@ -8116,7 +8276,7 @@ var PasswordCredentialService = class PasswordCredentialService {
8116
8276
  const emailKey = identifier.length <= MAX_IDENTIFIER_LENGTH ? normalizeEmail(identifier) : "";
8117
8277
  const password = typeof input.password === "string" ? input.password : "";
8118
8278
  const source = input.ipAddress?.trim() || null;
8119
- if (!emailKey && !source) throw new PasswordCredentialError();
8279
+ if (!emailKey && !(source && this.limiter.limitsSource)) throw new PasswordCredentialError();
8120
8280
  const tenantId = input.tenantId || null;
8121
8281
  const lease = await this.limiter.reserve({
8122
8282
  kind: PASSWORD_LOGIN_KIND,
@@ -8313,6 +8473,77 @@ var PasswordCredentialService = class PasswordCredentialService {
8313
8473
  });
8314
8474
  return { revokedSessions };
8315
8475
  }
8476
+ /**
8477
+ * The person replaces a forgotten password from a fresh session the host
8478
+ * minted after verifying an out-of-band proof (#3905); see
8479
+ * {@link PasswordRecoveryOptions} for every condition. Works whether or not
8480
+ * a password exists, clears `mustChange`, and ends EVERY session of the
8481
+ * person before and after the write. The recovery session is consumed by a
8482
+ * conditional update in the same transaction as the guarded credential
8483
+ * write, so of any concurrent uses of one proof exactly one can succeed
8484
+ * (and a failed write leaves the proof unconsumed). Refusals are
8485
+ * {@link PasswordCredentialForbiddenError};
8486
+ * a write that lost a race with another change is
8487
+ * {@link PasswordCredentialError}.
8488
+ */
8489
+ async replaceForgottenPassword(input) {
8490
+ const recovery = this.recovery;
8491
+ if (!recovery) throw new PasswordCredentialForbiddenError();
8492
+ this.assertNotLayered(input.actor);
8493
+ const userId = input.actor.user?.id;
8494
+ if (!userId || !UUID_PATTERN.test(userId)) throw new PasswordCredentialForbiddenError();
8495
+ const session = typeof input.actor.sessionId === "string" && UUID_PATTERN.test(input.actor.sessionId) ? await this.sessionRows.findValidSession(input.actor.sessionId) : null;
8496
+ const now = Date.now();
8497
+ const stamp = session?.getData(SESSION_DATA_KEYS.outOfBandProofAt);
8498
+ const provenAtMs = typeof stamp === "string" ? Date.parse(stamp) : NaN;
8499
+ if (!session || session.userId !== userId || session.parentSessionId || session.getPermissionCeiling() !== null || typeof session.authMethod !== "string" || NON_RECOVERY_AUTH_METHODS.has(session.authMethod) || !recovery.authMethods.has(session.authMethod) || !Number.isFinite(provenAtMs) || provenAtMs > now + RECOVERY_CLOCK_SKEW_MS || now - provenAtMs > recovery.maxAgeMs) throw new PasswordCredentialForbiddenError();
8500
+ const user = await this.requireUser(userId);
8501
+ if (!user.isActive()) throw new PasswordCredentialForbiddenError();
8502
+ const existing = await this.credentials.findByUserId(userId);
8503
+ const provenAt = new Date(provenAtMs);
8504
+ if (recovery.assertProof && await recovery.assertProof({
8505
+ actor: input.actor,
8506
+ provenAt
8507
+ }) !== true) throw new PasswordCredentialForbiddenError();
8508
+ const password = await this.assertPolicy(input.newPassword, user);
8509
+ const passwordHash = await this.hashPassword(password);
8510
+ const recoverySessionId = input.actor.sessionId;
8511
+ let revokedSessions = await this.sessionService.destroyAllUserSessions(userId, { exceptSessionId: recoverySessionId });
8512
+ const write = {
8513
+ passwordHash,
8514
+ mustChange: false,
8515
+ rotatedAt: /* @__PURE__ */ new Date(),
8516
+ rotatedBy: "self-recovery"
8517
+ };
8518
+ const db = this.credentials.db;
8519
+ await withEmbeddedWriteTransaction(db, isEmbeddedDatabase(db), async (tx) => {
8520
+ const sessionTable = this.sessionRows.tableName;
8521
+ const nowIso = (/* @__PURE__ */ new Date()).toISOString();
8522
+ if ((await tx.query(`UPDATE ${sessionTable}
8523
+ SET status = ?, updated_at = ?
8524
+ WHERE id = ? AND user_id = ? AND status = ? AND expires_at > ?
8525
+ RETURNING id`, SessionStatus.REVOKED, nowIso, recoverySessionId, userId, SessionStatus.ACTIVE, nowIso)).rows?.length !== 1) throw new PasswordCredentialForbiddenError();
8526
+ const credentials = await UsersPasswordCredentialCollection.create({
8527
+ ...this.options,
8528
+ db: tx
8529
+ });
8530
+ if (!(existing ? await credentials.replaceIfCurrent(existing, write) : await credentials.insertIfAbsent(userId, write) !== null)) throw new PasswordCredentialError();
8531
+ }, true);
8532
+ revokedSessions += 1;
8533
+ revokedSessions += await this.sessionService.destroyAllUserSessions(userId);
8534
+ await this.recordManagement(userId, input.ipAddress, {
8535
+ action: "recover",
8536
+ self: true,
8537
+ authMethod: session.authMethod,
8538
+ proofAgeSeconds: Math.max(0, Math.round((now - provenAtMs) / 1e3)),
8539
+ replaced: existing !== null,
8540
+ revokedSessions
8541
+ });
8542
+ return {
8543
+ revokedSessions,
8544
+ endedCurrentSession: true
8545
+ };
8546
+ }
8316
8547
  /** Whether the person has a password (for admin UIs; never for sign-in responses). */
8317
8548
  async hasPassword(userId) {
8318
8549
  if (!UUID_PATTERN.test(userId)) return false;
@@ -8715,6 +8946,6 @@ var TerminalAuthRateLimitError = class extends TerminalAuthError {
8715
8946
  }
8716
8947
  };
8717
8948
  //#endregion
8718
- export { DEFAULT_LOGIN_LOCKOUT_FACTOR as $, UsersLoginAttemptCollection as $t, readMobileBearerToken as A, deriveOperationPermissionCollectionName as At, DEFAULT_PIN_MANAGE_PERMISSION as B, UsersPasswordCredentialCollection 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, GroupRoleCollection as Gt, DeviceCredentialForbiddenError as H, MembershipOverrideCollection as Ht, getUsersOidcConfig as I, RoleCollection as It, ensurePinPermissionsRegistered as J, GroupMember as Jt, PIN_PERMISSION_DEFINITIONS as K, GroupRole as Kt, resolveOidcProviderConfig as L, UsersPinCredentialCollection 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, UsersLoginAuditEvent as Qt, webapi_exports as R, UsersPinCredential as Rt, checkOperationPermission as S, TenantHierarchyError as St, getRequestScopedDatabase as T, planTenantHierarchy as Tt, DeviceCredentialPolicyError as U, MembershipOverride as Ut, DeviceCredentialError as V, UsersPasswordCredential as Vt, DeviceCredentialService as W, MembershipCollection as Wt, PermissionResolver as X, Group as Xt, SessionService as Y, GroupCollection as Yt, DEFAULT_LOGIN_ATTEMPT_WINDOW_SECONDS as Z, UsersLoginAuditEventCollection as Zt, PasswordCredentialService as _, TenantPermissionOverrideCollection as _t, TerminalAuthError as a, isValidEmail as an, LoginRateLimitError as at, OperationPermissionError as b, Tenant as bt, DEFAULT_PASSWORD_DENYLIST as c, SESSION_DATA_KEYS as cn, DEFAULT_ANCESTOR_READ_MAX_DEPTH as ct, DEFAULT_PASSWORD_MIN_LENGTH as d, Role as dn, normalizeAncestorReadPolicy as dt, UsersLoginAttempt as en, DEFAULT_LOGIN_LOCKOUT_MAX_SECONDS as et, PASSWORD_LOGIN_KIND as f, Permission as fn, OidcProvisioningError as ft, PasswordCredentialForbiddenError as g, backfillUserEmailKeys as gt, PasswordCredentialError as h, UserEmailKeyBackfillError as ht, TERMINAL_APPROVE_LOGIN_KIND as i, User as in, LoginAttemptLimiter as it, validateMobileRedirectUri as j, deriveOperationPermissionSlug as jt, MobileAuthService as k, PermissionCatalogService as kt, DEFAULT_PASSWORD_MANAGE_PERMISSION as l, Session 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, SessionCollection as nn, DurableLoginAuditSink as nt, TerminalAuthRateLimitError as o, normalizeEmail as on, withoutListBounds as ot, PASSWORD_MAX_LENGTH_CEILING as p, Membership as pn, UserCollection as pt, PinVerifier as q, GroupMemberCollection as qt, DEFAULT_CLI_SESSION_TTL_SECONDS as r, UsersCliAuthRequest as rn, InvalidCredentialsError as rt, TerminalAuthService as s, DEFAULT_SESSION_TTL as sn, ANCESTOR_READ_ACTION as st, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS as t, UsersCliAuthRequestCollection as tn, DEFAULT_LOGIN_MAX_ATTEMPTS as tt, DEFAULT_PASSWORD_MAX_LENGTH as u, generateSessionId 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, PermissionCollection as zt };
8949
+ export { PermissionResolver as $, GroupCollection as $t, withSessionPermissionContext as A, recordTenantHierarchyChanges as At, resolveOidcProviderConfig as B, RoleCollection as Bt, OperationPermissionError as C, TenantCollection as Ct, getCurrentSessionPermissionContext as D, applyTenantHierarchyUpdates as Dt, hasOperationPermission as E, TenantHierarchyError as Et, OidcLoginError as F, deriveOperationPermissionSlug as Ft, DeviceCredentialForbiddenError as G, UsersPasswordCredential as Gt, DEFAULT_DEVICE_PERSON_IDLE_SECONDS as H, UsersPinCredential as Ht, OidcLoginService as I, normalizeOperationPermissionAction as It, PIN_LOGIN_KIND as J, MembershipCollection as Jt, DeviceCredentialPolicyError as K, MembershipOverrideCollection as Kt, decodeOidcTransaction as L, registerPermissionDefinitions as Lt, MobileAuthService as M, RolePermissionCollection as Mt, readMobileBearerToken as N, PermissionCatalogService as Nt, getRequestScopedDatabase as O, assertTenantTableName as Ot, validateMobileRedirectUri as P, deriveOperationPermissionCollectionName as Pt, SessionService as Q, GroupMember as Qt, encodeOidcTransaction as R, syncPermissionCatalog as Rt, outOfBandProofSessionData as S, TenantPermissionOverride as St, checkOperationPermission as T, MAX_TENANT_HIERARCHY_DEPTH as Tt, DEFAULT_PIN_MANAGE_PERMISSION as U, PermissionCollection as Ut, webapi_exports as V, UsersPinCredentialCollection as Vt, DeviceCredentialError as W, UsersPasswordCredentialCollection as Wt, PinVerifier as X, GroupRole as Xt, PIN_PERMISSION_DEFINITIONS as Y, GroupRoleCollection as Yt, ensurePinPermissionsRegistered as Z, GroupMemberCollection as Zt, PasswordCredentialError as _, Membership as _n, UserCollection as _t, TerminalAuthError as a, UsersCliAuthRequestCollection as an, DEFAULT_SOURCE_LOCKOUT_AUDIT_SECONDS as at, PasswordPolicyError as b, backfillUserEmailKeys as bt, DEFAULT_PASSWORD_DENYLIST as c, User as cn, LoginAttemptLimiter as ct, DEFAULT_PASSWORD_MIN_LENGTH as d, DEFAULT_SESSION_TTL as dn, ANCESTOR_READ_ACTION as dt, Group as en, DEFAULT_LOGIN_ATTEMPT_WINDOW_SECONDS as et, DEFAULT_PASSWORD_RECOVERY_MAX_AGE_SECONDS as f, SESSION_DATA_KEYS as fn, DEFAULT_ANCESTOR_READ_MAX_DEPTH as ft, PASSWORD_RECOVERY_MAX_AGE_CEILING_SECONDS as g, Permission as gn, OidcProvisioningError as gt, PASSWORD_PERMISSION_DEFINITIONS as h, Role as hn, normalizeAncestorReadPolicy as ht, TERMINAL_APPROVE_LOGIN_KIND as i, UsersLoginAttempt as in, DEFAULT_LOGIN_MAX_ATTEMPTS as it, MobileAuthError as j, DEFAULT_ROLE_PERMISSION_PATTERNS as jt, withPrincipalPermissionContext as k, planTenantHierarchy as kt, DEFAULT_PASSWORD_MANAGE_PERMISSION as l, isValidEmail as ln, LoginRateLimitError as lt, PASSWORD_MAX_LENGTH_CEILING as m, generateSessionId as mn, isAncestorReadableSlug as mt, DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS as n, UsersLoginAuditEvent as nn, DEFAULT_LOGIN_LOCKOUT_FACTOR as nt, TerminalAuthRateLimitError as o, SessionCollection as on, DurableLoginAuditSink as ot, PASSWORD_LOGIN_KIND as p, Session as pn, getConfiguredAncestorReadPolicy as pt, DeviceCredentialService as q, MembershipOverride as qt, DEFAULT_CLI_SESSION_TTL_SECONDS as r, UsersLoginAttemptCollection as rn, DEFAULT_LOGIN_LOCKOUT_MAX_SECONDS as rt, TerminalAuthService as s, UsersCliAuthRequest as sn, InvalidCredentialsError as st, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS as t, UsersLoginAuditEventCollection as tn, DEFAULT_LOGIN_LOCKOUT_BASE_SECONDS as tt, DEFAULT_PASSWORD_MAX_LENGTH as u, normalizeEmail as un, withoutListBounds as ut, PasswordCredentialForbiddenError as v, USER_EMAIL_KEY_BACKFILL_NAME as vt, assertOperationPermission as w, Tenant as wt, ensurePasswordPermissionsRegistered as x, TenantPermissionOverrideCollection as xt, PasswordCredentialService as y, UserEmailKeyBackfillError as yt, getUsersOidcConfig as z, RolePermission as zt };
8719
8950
 
8720
- //# sourceMappingURL=TerminalAuthService-C8zxBkNB.js.map
8951
+ //# sourceMappingURL=TerminalAuthService-BQjH5_bB.js.map