@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.
- package/AGENTS.md +8 -0
- package/README.md +129 -0
- package/agents/permissions.md +14 -0
- package/dist/chunks/{TerminalAuthService-C8zxBkNB.js → TerminalAuthService-BQjH5_bB.js} +366 -135
- package/dist/chunks/TerminalAuthService-BQjH5_bB.js.map +1 -0
- package/dist/collections/GroupMemberCollection.d.ts +6 -2
- package/dist/collections/GroupMemberCollection.d.ts.map +1 -1
- package/dist/collections/MembershipOverrideCollection.d.ts +9 -2
- package/dist/collections/MembershipOverrideCollection.d.ts.map +1 -1
- package/dist/collections/TenantPermissionOverrideCollection.d.ts +8 -2
- package/dist/collections/TenantPermissionOverrideCollection.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -29
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +75 -45
- package/dist/migrations/deduplicateAuthorityPairs.d.ts +27 -0
- package/dist/migrations/deduplicateAuthorityPairs.d.ts.map +1 -0
- package/dist/migrations/deduplicateRolePermissions.d.ts +3 -10
- package/dist/migrations/deduplicateRolePermissions.d.ts.map +1 -1
- package/dist/migrations/natural-key-dedup.d.ts +32 -0
- package/dist/migrations/natural-key-dedup.d.ts.map +1 -0
- package/dist/models/GroupMember.d.ts.map +1 -1
- package/dist/models/LoginAuditEvent.d.ts +5 -0
- package/dist/models/LoginAuditEvent.d.ts.map +1 -1
- package/dist/models/MembershipOverride.d.ts.map +1 -1
- package/dist/models/Session.d.ts +9 -0
- package/dist/models/Session.d.ts.map +1 -1
- package/dist/models/TenantPermissionOverride.d.ts.map +1 -1
- package/dist/services/LoginAttemptLimiter.d.ts +62 -11
- package/dist/services/LoginAttemptLimiter.d.ts.map +1 -1
- package/dist/services/PasswordCredentialService.d.ts +83 -1
- package/dist/services/PasswordCredentialService.d.ts.map +1 -1
- package/dist/services/PermissionCatalogService.d.ts.map +1 -1
- package/dist/services/index.d.ts +2 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/smrt-knowledge.json +16 -9
- package/dist/sveltekit/password-handlers.d.ts +7 -0
- package/dist/sveltekit/password-handlers.d.ts.map +1 -1
- package/dist/sveltekit.js +13 -1
- package/dist/sveltekit.js.map +1 -1
- package/package.json +13 -13
- 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", {
|
|
1405
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
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", {
|
|
1736
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
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
|
|
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
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
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))
|
|
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)
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
|
|
2812
|
-
|
|
2813
|
-
|
|
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", {
|
|
3734
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4556
|
-
|
|
4557
|
-
this.
|
|
4558
|
-
|
|
4559
|
-
|
|
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
|
-
|
|
4563
|
-
this.
|
|
4564
|
-
|
|
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
|
-
/**
|
|
4586
|
-
|
|
4587
|
-
|
|
4588
|
-
|
|
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
|
-
|
|
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:
|
|
4616
|
-
windowMs:
|
|
4617
|
-
streakResetMs:
|
|
4618
|
-
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:
|
|
4661
|
-
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 {
|
|
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-
|
|
8951
|
+
//# sourceMappingURL=TerminalAuthService-BQjH5_bB.js.map
|