@happyvertical/smrt-cli 0.57.21 → 0.57.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/{AuditLogCollection-BBbvr8Qc-CJCVzKBc.js → AuditLogCollection-BBbvr8Qc-DiMAJc6W.js} +1 -1
  2. package/dist/{OidcIdentity-MVVO3MfG-D2fUnsjt.js → OidcIdentity-MVVO3MfG-CLLiCrGO.js} +2 -2
  3. package/dist/{OidcIdentityCollection-s4mp3n62-kAVz4RAR.js → OidcIdentityCollection-s4mp3n62-BV-D9wLS.js} +1 -1
  4. package/dist/{PasswordCredentialService-DezdsV_v-DMTgLmKB.js → PasswordCredentialService-DA2Y6H2X-BBLs29CR.js} +22 -16
  5. package/dist/{ProfileAssetCollection-BuVAdOiv-7S6c5Ln3.js → ProfileAssetCollection-BuVAdOiv-BEeph2o4.js} +3 -3
  6. package/dist/{ProfileCollection-CMS9dFc0-BGOvskRu.js → ProfileCollection-CMS9dFc0-DMCN5Efo.js} +17 -17
  7. package/dist/{ProfileLinkCollection-ChK9iEBp-BM_l2aZZ.js → ProfileLinkCollection-ChK9iEBp-Ck1WYre2.js} +2 -2
  8. package/dist/{ProfileMetadataCollection-CAgJyjze-sk_e5jOO.js → ProfileMetadataCollection-CAgJyjze-B8B63Fvr.js} +1 -1
  9. package/dist/{ProfileMetafieldCollection-19ae6Lpf-BVD-UrAR.js → ProfileMetafieldCollection-19ae6Lpf-ZIBVWwZq.js} +1 -1
  10. package/dist/{ProfileRelationshipCollection-BFSlTQ7J-8kXURMOu.js → ProfileRelationshipCollection-BFSlTQ7J-DoRY1f9D.js} +1 -1
  11. package/dist/{ProfileTypeCollection-B7m698Bl-CCEgAhU0.js → ProfileTypeCollection-B7m698Bl-crQS75QW.js} +2 -2
  12. package/dist/{commands-BRjWwRvc.js → commands-BCIc--c1.js} +3 -3
  13. package/dist/dist-BSFx5qhx.js +1854 -0
  14. package/dist/{dist-B6CrkUe2.js → dist-BbJQEYoI.js} +2 -2
  15. package/dist/{dist-D5WaTGZB.js → dist-Ca0wyJbX.js} +3 -3
  16. package/dist/{dist-CwvZVtpi.js → dist-Dwoj-o5d.js} +5 -5
  17. package/dist/index.js +11 -11
  18. package/dist/{oidcProvisioningPrimitives-Dl9qIcYS-Dy3fJ6K2.js → oidcProvisioningPrimitives-Dl9qIcYS-D_iRIlQl.js} +3 -3
  19. package/dist/{operator-CF_Rjww3.js → operator-DddNuSKd.js} +2 -2
  20. package/dist/{resolveIdentity-CR5p_g7K-B_JHToWT.js → resolveIdentity-CR5p_g7K-DTq2GgJU.js} +14 -14
  21. package/package.json +10 -10
  22. package/dist/dist-CCQzDrbB.js +0 -1849
@@ -1,1849 +0,0 @@
1
- import { i as tenantId, r as TenantScoped } from "./dist-B6CrkUe2.js";
2
- import { $ as applyTenantHierarchyUpdates, I as SESSION_DATA_KEYS, J as UsersLoginAttemptCollection, R as SessionCollection, X as UsersLoginAuditEventCollection, et as assertTenantTableName, ft as planTenantHierarchy, gt as AccessRequestStatus, lt as normalizeEmail, pt as recordTenantHierarchyChanges } from "./PasswordCredentialService-DezdsV_v-DMTgLmKB.js";
3
- import { ObjectRegistry, SmrtCollection, SmrtObject, crossPackageRef, field, foreignKey, registerRetentionTask, smrt } from "@happyvertical/smrt-core";
4
- import { randomUUID } from "node:crypto";
5
- import { createLogger } from "@happyvertical/logger";
6
- import "@happyvertical/smrt-config";
7
- import "@happyvertical/smrt-core/migrations";
8
- import { AsyncLocalStorage } from "node:async_hooks";
9
- import { setTimeout } from "node:timers/promises";
10
- import "@happyvertical/sql";
11
- //#region ../users/dist/chunks/TerminalAuthService-D7SIRyUk.js
12
- ObjectRegistry.registerPackageManifest(JSON.parse(`{"version":"1.0.0","timestamp":0,"packageName":"@happyvertical/smrt-users","packageVersion":"0.57.21","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","api":{"include":[]},"mcp":{"include":[]},"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","api":{"include":[]},"mcp":{"include":[]},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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","api":{"include":[]},"mcp":{"include":[]},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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","api":{"include":[]},"mcp":{"include":[]},"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","api":{"include":[]},"mcp":{"include":[]},"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","api":{"include":[]},"mcp":{"include":[]},"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","api":{"include":[]},"mcp":{"include":[]},"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","api":{"include":[]},"mcp":{"include":[]},"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","api":{"include":[]},"mcp":{"include":[]},"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:UsersPasskeyChallengeCollection":{"name":"userspasskeychallengecollection","className":"UsersPasskeyChallengeCollection","qualifiedName":"@happyvertical/smrt-users:UsersPasskeyChallengeCollection","collection":"userspasskeychallenges","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/PasskeyChallengeCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"consume":{"name":"consume","async":true,"parameters":[{"name":"challengeHash","type":"string","optional":false},{"name":"purpose","type":"PasskeyChallengePurpose","optional":false},{"name":"expiresAt","type":"Date","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_passkey_challenges","api":false,"mcp":false,"cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersPasskeyChallenge","exportName":"UsersPasskeyChallengeCollection","collectionExportName":"UsersPasskeyChallengeCollectionCollection","schema":{"tableName":"users_passkey_challenges","ddl":"CREATE TABLE IF NOT EXISTS \\"users_passkey_challenges\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"context\\" TEXT NOT NULL DEFAULT '',\\n \\"created_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"updated_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"challenge_hash\\" TEXT NOT NULL UNIQUE,\\n \\"purpose\\" TEXT NOT NULL,\\n \\"expires_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"},"challenge_hash":{"type":"TEXT","notNull":true,"unique":true},"purpose":{"type":"TEXT","notNull":true,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":true,"unique":false}},"indexes":[{"name":"users_passkey_challenges_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_passkey_challenges_expires_at_idx","columns":["expires_at"]},{"name":"users_passkey_challenges_created_at_idx","columns":["created_at"]}],"version":"895dcef7"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersPasskeyCredentialCollection":{"name":"userspasskeycredentialcollection","className":"UsersPasskeyCredentialCollection","qualifiedName":"@happyvertical/smrt-users:UsersPasskeyCredentialCollection","collection":"userspasskeycredentials","filePath":"/home/runner/work/smrt/smrt/packages/users/src/collections/PasskeyCredentialCollection.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{"findByCredentialId":{"name":"findByCredentialId","async":true,"parameters":[{"name":"credentialId","type":"string","optional":false}],"returnType":"Promise<UsersPasskeyCredential | null>","isStatic":false,"isPublic":true},"listByUserId":{"name":"listByUserId","async":true,"parameters":[{"name":"userId","type":"string","optional":false}],"returnType":"Promise<UsersPasskeyCredential[]>","isStatic":false,"isPublic":true},"countByUserId":{"name":"countByUserId","async":true,"parameters":[{"name":"userId","type":"string","optional":false}],"returnType":"Promise<number>","isStatic":false,"isPublic":true},"findOwned":{"name":"findOwned","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"userId","type":"string","optional":false}],"returnType":"Promise<UsersPasskeyCredential | null>","isStatic":false,"isPublic":true},"insertIfAbsent":{"name":"insertIfAbsent","async":true,"parameters":[{"name":"write","type":"PasskeyCredentialWrite","optional":false}],"returnType":"Promise<UsersPasskeyCredential | null>","isStatic":false,"isPublic":true},"recordUseIfCurrent":{"name":"recordUseIfCurrent","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"userId","type":"string","optional":false},{"name":"expectedSignCount","type":"number","optional":false},{"name":"newSignCount","type":"number","optional":false},{"name":"backedUp","type":"boolean","optional":false},{"name":"now","type":"Date","optional":true}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true},"renameOwned":{"name":"renameOwned","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"userId","type":"string","optional":false},{"name":"name","type":"string","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true},"deleteOwned":{"name":"deleteOwned","async":true,"parameters":[{"name":"id","type":"string","optional":false},{"name":"userId","type":"string","optional":false}],"returnType":"Promise<boolean>","isStatic":false,"isPublic":true},"deleteAllForUser":{"name":"deleteAllForUser","async":true,"parameters":[{"name":"userId","type":"string","optional":false}],"returnType":"Promise<number>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_passkey_credentials","api":false,"mcp":false,"cli":false},"extends":"SmrtCollection","extendsTypeArg":"UsersPasskeyCredential","exportName":"UsersPasskeyCredentialCollection","collectionExportName":"UsersPasskeyCredentialCollectionCollection","schema":{"tableName":"users_passkey_credentials","ddl":"CREATE TABLE IF NOT EXISTS \\"users_passkey_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,\\n \\"credential_id\\" TEXT NOT NULL UNIQUE,\\n \\"public_key\\" TEXT NOT NULL,\\n \\"sign_count\\" INTEGER NOT NULL DEFAULT 0,\\n \\"transports\\" TEXT,\\n \\"name\\" TEXT NOT NULL,\\n \\"aaguid\\" TEXT,\\n \\"backed_up\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\"device_type\\" TEXT,\\n \\"last_used_at\\" TIMESTAMP,\\n \\"created_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":false,"foreignKey":{"table":"users","column":"id","onDelete":"NO ACTION","onUpdate":"CASCADE"}},"credential_id":{"type":"TEXT","notNull":true,"unique":true},"public_key":{"type":"TEXT","notNull":true,"unique":false},"sign_count":{"type":"INTEGER","notNull":true,"unique":false,"default":0},"transports":{"type":"TEXT","notNull":false,"unique":false},"name":{"type":"TEXT","notNull":true,"unique":false},"aaguid":{"type":"TEXT","notNull":false,"unique":false},"backed_up":{"type":"BOOLEAN","notNull":true,"unique":false,"default":false},"device_type":{"type":"TEXT","notNull":false,"unique":false},"last_used_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"created_by":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"users_passkey_credentials_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_passkey_credentials_created_at_idx","columns":["created_at"]},{"name":"users_passkey_credentials_user_id_idx","columns":["user_id"]}],"version":"4483d2e2"},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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":{"api":{"include":[]},"mcp":{"include":[]},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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":{"api":{"include":["get","delete"]},"mcp":{"include":[]},"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},"getAncestorIds":{"name":"getAncestorIds","async":true,"parameters":[{"name":"tenantId","type":"string","optional":false}],"returnType":"Promise<string[]>","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},"getDescendantIds":{"name":"getDescendantIds","async":true,"parameters":[{"name":"tenantId","type":"string","optional":false}],"returnType":"Promise<string[]>","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},"requireChildOf":{"name":"requireChildOf","async":true,"parameters":[{"name":"parentId","type":"string","optional":false},{"name":"childId","type":"string","optional":false}],"returnType":"Promise<void>","isStatic":false,"isPublic":true},"withTenantCatalogReadScope":{"name":"withTenantCatalogReadScope","async":true,"parameters":[{"name":"options","type":"TenantReadScopeOptions","optional":false},{"name":"callback","type":"Function","optional":false}],"returnType":"Promise<T>","isStatic":false,"isPublic":true},"withTenantHierarchyContext":{"name":"withTenantHierarchyContext","async":true,"parameters":[{"name":"rootTenantId","type":"string","optional":false},{"name":"options","type":"TenantReadScopeOptions","optional":false},{"name":"callback","type":"Function","optional":false}],"returnType":"Promise<T>","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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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","api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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":{"api":{"include":["list","get"]},"mcp":{"include":["list","get"]},"cli":{"include":["list","get"]}},"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 \\"username\\" TEXT,\\n \\"username_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},"username":{"type":"TEXT","notNull":false,"unique":false},"username_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_username_idx","columns":["username"]},{"name":"users_created_at_idx","columns":["created_at"]}],"version":"3ee8f0f4"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:MemberClass":{"name":"memberclass","className":"MemberClass","qualifiedName":"@happyvertical/smrt-users:MemberClass","collection":"memberclasses","description":"A tenant-configured legal class; it has no authority or entitlement effect.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.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}}},"key":{"type":"text","required":false,"_meta":{}},"name":{"type":"text","required":false},"description":{"type":"text","required":false},"policyMetadata":{"type":"json","required":false,"_meta":{"nullable":true}}},"methods":{},"decoratorConfig":{"tableName":"member_classes","sensitive":true,"indexes":[{"name":"member_classes_tenant_key_uq","columns":["tenantId","key"],"unique":true}],"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tenantScoped":{"mode":"required"},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"MemberClass","collectionExportName":"MemberClassCollection","displayLabelField":"name","validationRules":[],"schema":{"tableName":"member_classes","ddl":"CREATE TABLE IF NOT EXISTS \\"member_classes\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"key\\" TEXT,\\n \\"name\\" TEXT,\\n \\"description\\" TEXT,\\n \\"policy_metadata\\" JSON\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"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},"key":{"type":"TEXT","notNull":false,"unique":false},"name":{"type":"TEXT","notNull":false,"unique":false},"description":{"type":"TEXT","notNull":false,"unique":false},"policy_metadata":{"type":"JSON","notNull":false,"unique":false}},"indexes":[{"name":"member_classes_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"member_classes_tenant_key_uq","columns":["tenant_id","key"],"unique":true},{"name":"member_classes_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"0fa7a152"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:LegalMember":{"name":"legalmember","className":"LegalMember","qualifiedName":"@happyvertical/smrt-users:LegalMember","collection":"legalmembers","description":"The legal register entry, deliberately separate from RBAC Membership.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.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}}},"memberClassId":{"type":"foreignKey","required":false,"related":"MemberClass","_meta":{"onDelete":"RESTRICT"}},"kind":{"type":"text","required":false,"_meta":{},"enum":["individual","organisation"]},"displayName":{"type":"text","required":false},"userId":{"type":"foreignKey","required":false,"related":"User","_meta":{"nullable":true,"onDelete":"RESTRICT"}},"profileId":{"type":"crossPackageRef","required":false,"related":"@happyvertical/smrt-profiles:Profile","_meta":{"nullable":true,"onDelete":"RESTRICT"}},"externalPartyRef":{"type":"text","required":false,"_meta":{"nullable":true}},"joinedOn":{"type":"text","required":false,"_meta":{}},"leftOn":{"type":"text","required":false,"_meta":{"nullable":true}},"status":{"type":"text","required":false,"_meta":{},"enum":["active","suspended","resigned","ceased"]}},"methods":{},"decoratorConfig":{"tableName":"legal_members","sensitive":true,"indexes":[{"name":"legal_members_tenant_class_status_idx","columns":["tenantId","memberClassId","status"]},{"name":"legal_members_tenant_user_idx","columns":["tenantId","userId"]}],"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tenantScoped":{"mode":"required"},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"LegalMember","collectionExportName":"LegalMemberCollection","validationRules":[],"schema":{"tableName":"legal_members","ddl":"CREATE TABLE IF NOT EXISTS \\"legal_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 \\"tenant_id\\" UUID NOT NULL,\\n \\"member_class_id\\" UUID,\\n \\"kind\\" TEXT,\\n \\"display_name\\" TEXT,\\n \\"user_id\\" UUID,\\n \\"profile_id\\" UUID,\\n \\"external_party_ref\\" TEXT,\\n \\"joined_on\\" TEXT,\\n \\"left_on\\" TEXT,\\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"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":true,"unique":false},"member_class_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"member_classes","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"kind":{"type":"TEXT","notNull":false,"unique":false},"display_name":{"type":"TEXT","notNull":false,"unique":false},"user_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"users","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"profile_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false,"unique":false},"external_party_ref":{"type":"TEXT","notNull":false,"unique":false},"joined_on":{"type":"TEXT","notNull":false,"unique":false},"left_on":{"type":"TEXT","notNull":false,"unique":false},"status":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"legal_members_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"legal_members_tenant_class_status_idx","columns":["tenant_id","member_class_id","status"]},{"name":"legal_members_tenant_user_idx","columns":["tenant_id","user_id"]},{"name":"legal_members_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"legal_members_member_class_id_idx","columns":["member_class_id"]},{"name":"legal_members_user_id_idx","columns":["user_id"]},{"name":"legal_members_profile_id_idx","columns":["profile_id"]}],"version":"b05fd9f3"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:LegalMemberStatusHistory":{"name":"legalmemberstatushistory","className":"LegalMemberStatusHistory","qualifiedName":"@happyvertical/smrt-users:LegalMemberStatusHistory","collection":"legalmemberstatushistories","description":"Append-only effective history; current status never erases it.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.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}}},"memberId":{"type":"foreignKey","required":false,"related":"LegalMember","_meta":{"onDelete":"RESTRICT"}},"status":{"type":"text","required":false,"_meta":{},"enum":["active","suspended","resigned","ceased"]},"effectiveOn":{"type":"text","required":false,"_meta":{}},"sequence":{"type":"integer","required":false,"_meta":{}},"reason":{"type":"text","required":false},"actorRef":{"type":"text","required":false,"_meta":{"nullable":true}}},"methods":{"save":{"name":"save","async":true,"parameters":[],"returnType":"Promise<this>","isStatic":false,"isPublic":true},"delete":{"name":"delete","async":true,"parameters":[],"returnType":"Promise<void>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"legal_member_status_history","sensitive":true,"indexes":[{"name":"legal_member_status_history_member_on_idx","columns":["tenantId","memberId","effectiveOn"]}],"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tenantScoped":{"mode":"required"},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"LegalMemberStatusHistory","collectionExportName":"LegalMemberStatusHistoryCollection","validationRules":[],"schema":{"tableName":"legal_member_status_history","ddl":"CREATE TABLE IF NOT EXISTS \\"legal_member_status_history\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"member_id\\" UUID,\\n \\"status\\" TEXT,\\n \\"effective_on\\" TEXT,\\n \\"sequence\\" INTEGER,\\n \\"reason\\" TEXT,\\n \\"actor_ref\\" 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},"member_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_members","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"status":{"type":"TEXT","notNull":false,"unique":false},"effective_on":{"type":"TEXT","notNull":false,"unique":false},"sequence":{"type":"INTEGER","notNull":false,"unique":false},"reason":{"type":"TEXT","notNull":false,"unique":false},"actor_ref":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"legal_member_status_history_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"legal_member_status_history_member_on_idx","columns":["tenant_id","member_id","effective_on"]},{"name":"legal_member_status_history_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"legal_member_status_history_member_id_idx","columns":["member_id"]}],"version":"3885f61f"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:LegalMemberReference":{"name":"legalmemberreference","className":"LegalMemberReference","qualifiedName":"@happyvertical/smrt-users:LegalMemberReference","collection":"legalmemberreferences","description":"A link to authoritative share/dues/subscription/agreement/ledger evidence.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.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}}},"memberId":{"type":"foreignKey","required":false,"related":"LegalMember","_meta":{"onDelete":"RESTRICT"}},"kind":{"type":"text","required":false,"_meta":{},"enum":["share","dues","subscription","agreement","ledger"]},"sourceType":{"type":"text","required":false},"sourceId":{"type":"text","required":false},"authoritative":{"type":"boolean","required":false,"_meta":{}},"effectiveFrom":{"type":"text","required":false,"_meta":{}},"effectiveTo":{"type":"text","required":false,"_meta":{"nullable":true}},"revokesId":{"type":"foreignKey","required":false,"related":"LegalMemberReference","_meta":{"nullable":true,"onDelete":"RESTRICT"}}},"methods":{"save":{"name":"save","async":true,"parameters":[],"returnType":"Promise<this>","isStatic":false,"isPublic":true},"delete":{"name":"delete","async":true,"parameters":[],"returnType":"Promise<void>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"legal_member_references","sensitive":true,"indexes":[{"name":"legal_member_references_member_kind_idx","columns":["tenantId","memberId","kind"]}],"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tenantScoped":{"mode":"required"},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"LegalMemberReference","collectionExportName":"LegalMemberReferenceCollection","validationRules":[],"schema":{"tableName":"legal_member_references","ddl":"CREATE TABLE IF NOT EXISTS \\"legal_member_references\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"member_id\\" UUID,\\n \\"kind\\" TEXT,\\n \\"source_type\\" TEXT,\\n \\"source_id\\" TEXT,\\n \\"authoritative\\" BOOLEAN,\\n \\"effective_from\\" TEXT,\\n \\"effective_to\\" TEXT,\\n \\"revokes_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"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":true,"unique":false},"member_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_members","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"kind":{"type":"TEXT","notNull":false,"unique":false},"source_type":{"type":"TEXT","notNull":false,"unique":false},"source_id":{"type":"TEXT","notNull":false,"unique":false},"authoritative":{"type":"BOOLEAN","notNull":false,"unique":false},"effective_from":{"type":"TEXT","notNull":false,"unique":false},"effective_to":{"type":"TEXT","notNull":false,"unique":false},"revokes_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_member_references","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}}},"indexes":[{"name":"legal_member_references_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"legal_member_references_member_kind_idx","columns":["tenant_id","member_id","kind"]},{"name":"legal_member_references_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"legal_member_references_member_id_idx","columns":["member_id"]},{"name":"legal_member_references_revokes_id_idx","columns":["revokes_id"]}],"version":"30237bd4"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:MemberOfficerAppointment":{"name":"memberofficerappointment","className":"MemberOfficerAppointment","qualifiedName":"@happyvertical/smrt-users:MemberOfficerAppointment","collection":"memberofficerappointments","description":"A dated register of board/officer appointments; it does not implement elections.","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.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}}},"memberId":{"type":"foreignKey","required":false,"related":"LegalMember","_meta":{"onDelete":"RESTRICT"}},"role":{"type":"text","required":false,"_meta":{}},"effectiveFrom":{"type":"text","required":false,"_meta":{}},"effectiveTo":{"type":"text","required":false,"_meta":{"nullable":true}},"authority":{"type":"json","required":false,"_meta":{"nullable":true}}},"methods":{},"decoratorConfig":{"tableName":"member_officer_appointments","sensitive":true,"indexes":[{"name":"member_officer_appointments_member_term_idx","columns":["tenantId","memberId","effectiveFrom"]}],"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tenantScoped":{"mode":"required"},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"MemberOfficerAppointment","collectionExportName":"MemberOfficerAppointmentCollection","validationRules":[],"schema":{"tableName":"member_officer_appointments","ddl":"CREATE TABLE IF NOT EXISTS \\"member_officer_appointments\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"member_id\\" UUID,\\n \\"role\\" TEXT,\\n \\"effective_from\\" TEXT,\\n \\"effective_to\\" TEXT,\\n \\"authority\\" JSON\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"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},"member_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_members","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"role":{"type":"TEXT","notNull":false,"unique":false},"effective_from":{"type":"TEXT","notNull":false,"unique":false},"effective_to":{"type":"TEXT","notNull":false,"unique":false},"authority":{"type":"JSON","notNull":false,"unique":false}},"indexes":[{"name":"member_officer_appointments_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"member_officer_appointments_member_term_idx","columns":["tenant_id","member_id","effective_from"]},{"name":"member_officer_appointments_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"member_officer_appointments_member_id_idx","columns":["member_id"]}],"version":"eed54759"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:MemberEligibilitySnapshot":{"name":"membereligibilitysnapshot","className":"MemberEligibilitySnapshot","qualifiedName":"@happyvertical/smrt-users:MemberEligibilitySnapshot","collection":"membereligibilitysnapshots","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.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}}},"memberId":{"type":"foreignKey","required":false,"related":"LegalMember","_meta":{"onDelete":"RESTRICT"}},"recordDate":{"type":"text","required":false,"_meta":{}},"eligible":{"type":"boolean","required":false,"_meta":{}},"reason":{"type":"text","required":false},"evidence":{"type":"json","required":false,"_meta":{"nullable":true}}},"methods":{"save":{"name":"save","async":true,"parameters":[],"returnType":"Promise<this>","isStatic":false,"isPublic":true},"delete":{"name":"delete","async":true,"parameters":[],"returnType":"Promise<void>","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"member_eligibility_snapshots","sensitive":true,"indexes":[{"name":"member_eligibility_snapshots_tenant_date_idx","columns":["tenantId","recordDate"]}],"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tenantScoped":{"mode":"required"},"conflictColumns":["tenant_id","slug","context"]},"extends":"SmrtObject","exportName":"MemberEligibilitySnapshot","collectionExportName":"MemberEligibilitySnapshotCollection","validationRules":[],"schema":{"tableName":"member_eligibility_snapshots","ddl":"CREATE TABLE IF NOT EXISTS \\"member_eligibility_snapshots\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"member_id\\" UUID,\\n \\"record_date\\" TEXT,\\n \\"eligible\\" BOOLEAN,\\n \\"reason\\" TEXT,\\n \\"evidence\\" JSON\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"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},"member_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_members","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"record_date":{"type":"TEXT","notNull":false,"unique":false},"eligible":{"type":"BOOLEAN","notNull":false,"unique":false},"reason":{"type":"TEXT","notNull":false,"unique":false},"evidence":{"type":"JSON","notNull":false,"unique":false}},"indexes":[{"name":"member_eligibility_snapshots_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"member_eligibility_snapshots_tenant_date_idx","columns":["tenant_id","record_date"]},{"name":"member_eligibility_snapshots_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"member_eligibility_snapshots_member_id_idx","columns":["member_id"]}],"version":"f3899c14"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:MemberClassCollection":{"name":"memberclasscollection","className":"MemberClassCollection","qualifiedName":"@happyvertical/smrt-users:MemberClassCollection","collection":"memberclasses","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{},"decoratorConfig":{"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tableName":"member_classes"},"extends":"SmrtCollection","extendsTypeArg":"MemberClass","exportName":"MemberClassCollection","collectionExportName":"MemberClassCollectionCollection","schema":{"tableName":"member_classes","ddl":"CREATE TABLE IF NOT EXISTS \\"member_classes\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"key\\" TEXT,\\n \\"name\\" TEXT,\\n \\"description\\" TEXT,\\n \\"policy_metadata\\" JSON\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"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},"key":{"type":"TEXT","notNull":false,"unique":false},"name":{"type":"TEXT","notNull":false,"unique":false},"description":{"type":"TEXT","notNull":false,"unique":false},"policy_metadata":{"type":"JSON","notNull":false,"unique":false}},"indexes":[{"name":"member_classes_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"member_classes_tenant_key_uq","columns":["tenant_id","key"],"unique":true},{"name":"member_classes_tenant_id_created_at_idx","columns":["tenant_id","created_at"]}],"version":"0fa7a152"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:LegalMemberCollection":{"name":"legalmembercollection","className":"LegalMemberCollection","qualifiedName":"@happyvertical/smrt-users:LegalMemberCollection","collection":"legalmembers","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{},"decoratorConfig":{"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tableName":"legal_members"},"extends":"SmrtCollection","extendsTypeArg":"LegalMember","exportName":"LegalMemberCollection","collectionExportName":"LegalMemberCollectionCollection","schema":{"tableName":"legal_members","ddl":"CREATE TABLE IF NOT EXISTS \\"legal_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 \\"tenant_id\\" UUID NOT NULL,\\n \\"member_class_id\\" UUID,\\n \\"kind\\" TEXT,\\n \\"display_name\\" TEXT,\\n \\"user_id\\" UUID,\\n \\"profile_id\\" UUID,\\n \\"external_party_ref\\" TEXT,\\n \\"joined_on\\" TEXT,\\n \\"left_on\\" TEXT,\\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"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":true,"unique":false},"member_class_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"member_classes","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"kind":{"type":"TEXT","notNull":false,"unique":false},"display_name":{"type":"TEXT","notNull":false,"unique":false},"user_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"users","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"profile_id":{"type":"UUID","referenceKind":"crossPackageRef","notNull":false,"unique":false},"external_party_ref":{"type":"TEXT","notNull":false,"unique":false},"joined_on":{"type":"TEXT","notNull":false,"unique":false},"left_on":{"type":"TEXT","notNull":false,"unique":false},"status":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"legal_members_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"legal_members_tenant_class_status_idx","columns":["tenant_id","member_class_id","status"]},{"name":"legal_members_tenant_user_idx","columns":["tenant_id","user_id"]},{"name":"legal_members_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"legal_members_member_class_id_idx","columns":["member_class_id"]},{"name":"legal_members_user_id_idx","columns":["user_id"]},{"name":"legal_members_profile_id_idx","columns":["profile_id"]}],"version":"b05fd9f3"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:LegalMemberStatusHistoryCollection":{"name":"legalmemberstatushistorycollection","className":"LegalMemberStatusHistoryCollection","qualifiedName":"@happyvertical/smrt-users:LegalMemberStatusHistoryCollection","collection":"legalmemberstatushistories","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{},"decoratorConfig":{"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tableName":"legal_member_status_history"},"extends":"SmrtCollection","extendsTypeArg":"LegalMemberStatusHistory","exportName":"LegalMemberStatusHistoryCollection","collectionExportName":"LegalMemberStatusHistoryCollectionCollection","schema":{"tableName":"legal_member_status_history","ddl":"CREATE TABLE IF NOT EXISTS \\"legal_member_status_history\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"member_id\\" UUID,\\n \\"status\\" TEXT,\\n \\"effective_on\\" TEXT,\\n \\"sequence\\" INTEGER,\\n \\"reason\\" TEXT,\\n \\"actor_ref\\" 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},"member_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_members","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"status":{"type":"TEXT","notNull":false,"unique":false},"effective_on":{"type":"TEXT","notNull":false,"unique":false},"sequence":{"type":"INTEGER","notNull":false,"unique":false},"reason":{"type":"TEXT","notNull":false,"unique":false},"actor_ref":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"legal_member_status_history_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"legal_member_status_history_member_on_idx","columns":["tenant_id","member_id","effective_on"]},{"name":"legal_member_status_history_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"legal_member_status_history_member_id_idx","columns":["member_id"]}],"version":"3885f61f"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:LegalMemberReferenceCollection":{"name":"legalmemberreferencecollection","className":"LegalMemberReferenceCollection","qualifiedName":"@happyvertical/smrt-users:LegalMemberReferenceCollection","collection":"legalmemberreferences","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{},"decoratorConfig":{"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tableName":"legal_member_references"},"extends":"SmrtCollection","extendsTypeArg":"LegalMemberReference","exportName":"LegalMemberReferenceCollection","collectionExportName":"LegalMemberReferenceCollectionCollection","schema":{"tableName":"legal_member_references","ddl":"CREATE TABLE IF NOT EXISTS \\"legal_member_references\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"member_id\\" UUID,\\n \\"kind\\" TEXT,\\n \\"source_type\\" TEXT,\\n \\"source_id\\" TEXT,\\n \\"authoritative\\" BOOLEAN,\\n \\"effective_from\\" TEXT,\\n \\"effective_to\\" TEXT,\\n \\"revokes_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"},"tenant_id":{"type":"UUID","referenceKind":"tenantId","notNull":true,"unique":false},"member_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_members","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"kind":{"type":"TEXT","notNull":false,"unique":false},"source_type":{"type":"TEXT","notNull":false,"unique":false},"source_id":{"type":"TEXT","notNull":false,"unique":false},"authoritative":{"type":"BOOLEAN","notNull":false,"unique":false},"effective_from":{"type":"TEXT","notNull":false,"unique":false},"effective_to":{"type":"TEXT","notNull":false,"unique":false},"revokes_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_member_references","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}}},"indexes":[{"name":"legal_member_references_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"legal_member_references_member_kind_idx","columns":["tenant_id","member_id","kind"]},{"name":"legal_member_references_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"legal_member_references_member_id_idx","columns":["member_id"]},{"name":"legal_member_references_revokes_id_idx","columns":["revokes_id"]}],"version":"30237bd4"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:MemberOfficerAppointmentCollection":{"name":"memberofficerappointmentcollection","className":"MemberOfficerAppointmentCollection","qualifiedName":"@happyvertical/smrt-users:MemberOfficerAppointmentCollection","collection":"memberofficerappointments","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{},"decoratorConfig":{"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tableName":"member_officer_appointments"},"extends":"SmrtCollection","extendsTypeArg":"MemberOfficerAppointment","exportName":"MemberOfficerAppointmentCollection","collectionExportName":"MemberOfficerAppointmentCollectionCollection","schema":{"tableName":"member_officer_appointments","ddl":"CREATE TABLE IF NOT EXISTS \\"member_officer_appointments\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"member_id\\" UUID,\\n \\"role\\" TEXT,\\n \\"effective_from\\" TEXT,\\n \\"effective_to\\" TEXT,\\n \\"authority\\" JSON\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"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},"member_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_members","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"role":{"type":"TEXT","notNull":false,"unique":false},"effective_from":{"type":"TEXT","notNull":false,"unique":false},"effective_to":{"type":"TEXT","notNull":false,"unique":false},"authority":{"type":"JSON","notNull":false,"unique":false}},"indexes":[{"name":"member_officer_appointments_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"member_officer_appointments_member_term_idx","columns":["tenant_id","member_id","effective_from"]},{"name":"member_officer_appointments_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"member_officer_appointments_member_id_idx","columns":["member_id"]}],"version":"eed54759"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:MemberEligibilitySnapshotCollection":{"name":"membereligibilitysnapshotcollection","className":"MemberEligibilitySnapshotCollection","qualifiedName":"@happyvertical/smrt-users:MemberEligibilitySnapshotCollection","collection":"membereligibilitysnapshots","filePath":"/home/runner/work/smrt/smrt/packages/users/src/member-register/models.ts","packageName":"@happyvertical/smrt-users","fields":{},"methods":{},"decoratorConfig":{"api":{"include":[]},"mcp":{"include":[]},"cli":false,"tableName":"member_eligibility_snapshots"},"extends":"SmrtCollection","extendsTypeArg":"MemberEligibilitySnapshot","exportName":"MemberEligibilitySnapshotCollection","collectionExportName":"MemberEligibilitySnapshotCollectionCollection","schema":{"tableName":"member_eligibility_snapshots","ddl":"CREATE TABLE IF NOT EXISTS \\"member_eligibility_snapshots\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"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 \\"member_id\\" UUID,\\n \\"record_date\\" TEXT,\\n \\"eligible\\" BOOLEAN,\\n \\"reason\\" TEXT,\\n \\"evidence\\" JSON\\n);","columns":{"id":{"type":"UUID","primaryKey":true,"referenceKind":"id","notNull":true},"slug":{"type":"TEXT","notNull":true},"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},"member_id":{"type":"UUID","referenceKind":"foreignKey","notNull":false,"unique":false,"foreignKey":{"table":"legal_members","column":"id","onDelete":"RESTRICT","onUpdate":"CASCADE"}},"record_date":{"type":"TEXT","notNull":false,"unique":false},"eligible":{"type":"BOOLEAN","notNull":false,"unique":false},"reason":{"type":"TEXT","notNull":false,"unique":false},"evidence":{"type":"JSON","notNull":false,"unique":false}},"indexes":[{"name":"member_eligibility_snapshots_slug_context_idx","columns":["tenant_id","slug","context"],"unique":true},{"name":"member_eligibility_snapshots_tenant_date_idx","columns":["tenant_id","record_date"]},{"name":"member_eligibility_snapshots_tenant_id_created_at_idx","columns":["tenant_id","created_at"]},{"name":"member_eligibility_snapshots_member_id_idx","columns":["member_id"]}],"version":"f3899c14"},"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:UsersPasskeyChallenge":{"name":"userspasskeychallenge","className":"UsersPasskeyChallenge","qualifiedName":"@happyvertical/smrt-users:UsersPasskeyChallenge","collection":"userspasskeychallenges","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/PasskeyChallenge.ts","packageName":"@happyvertical/smrt-users","fields":{"challengeHash":{"type":"text","required":true,"_meta":{"required":true,"unique":true}},"purpose":{"type":"text","required":true,"_meta":{"required":true},"enum":["authentication","registration"]},"expiresAt":{"type":"datetime","required":true,"_meta":{"required":true,"indexed":true}}},"methods":{},"decoratorConfig":{"tableName":"users_passkey_challenges","sensitive":true,"api":false,"cli":false,"mcp":false},"extends":"SmrtObject","exportName":"UsersPasskeyChallenge","collectionExportName":"UsersPasskeyChallengeCollection","validationRules":[{"field":"challengeHash","rule":"required","fieldType":"text"},{"field":"purpose","rule":"required","fieldType":"text"},{"field":"expiresAt","rule":"required","fieldType":"datetime"}],"schema":{"tableName":"users_passkey_challenges","ddl":"CREATE TABLE IF NOT EXISTS \\"users_passkey_challenges\\" (\\n \\"id\\" UUID PRIMARY KEY NOT NULL,\\n \\"slug\\" TEXT NOT NULL,\\n \\"context\\" TEXT NOT NULL DEFAULT '',\\n \\"created_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"updated_at\\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\\n \\"challenge_hash\\" TEXT NOT NULL UNIQUE,\\n \\"purpose\\" TEXT NOT NULL,\\n \\"expires_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"},"challenge_hash":{"type":"TEXT","notNull":true,"unique":true},"purpose":{"type":"TEXT","notNull":true,"unique":false},"expires_at":{"type":"TIMESTAMP","notNull":true,"unique":false}},"indexes":[{"name":"users_passkey_challenges_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_passkey_challenges_expires_at_idx","columns":["expires_at"]},{"name":"users_passkey_challenges_created_at_idx","columns":["created_at"]}],"version":"895dcef7"},"importPath":"@happyvertical/smrt-users"},"@happyvertical/smrt-users:UsersPasskeyCredential":{"name":"userspasskeycredential","className":"UsersPasskeyCredential","qualifiedName":"@happyvertical/smrt-users:UsersPasskeyCredential","collection":"userspasskeycredentials","filePath":"/home/runner/work/smrt/smrt/packages/users/src/models/PasskeyCredential.ts","packageName":"@happyvertical/smrt-users","fields":{"userId":{"type":"foreignKey","required":true,"related":"User","_meta":{"required":true}},"credentialId":{"type":"text","required":true,"_meta":{"required":true,"unique":true,"sensitive":true},"sensitive":true},"publicKey":{"type":"text","required":true,"_meta":{"required":true,"sensitive":true},"sensitive":true},"signCount":{"type":"integer","required":true,"default":0,"_meta":{"required":true,"default":0}},"transports":{"type":"text","required":false,"_meta":{"nullable":true}},"name":{"type":"text","required":true,"_meta":{"required":true}},"aaguid":{"type":"text","required":false,"_meta":{"nullable":true}},"backedUp":{"type":"boolean","required":true,"default":false,"_meta":{"required":true,"default":false}},"deviceType":{"type":"text","required":false,"_meta":{"nullable":true},"enum":["singleDevice","multiDevice"]},"lastUsedAt":{"type":"datetime","required":false,"_meta":{"nullable":true}},"createdBy":{"type":"text","required":false,"_meta":{"nullable":true}}},"methods":{"getTransports":{"name":"getTransports","async":false,"parameters":[],"returnType":"string[]","isStatic":false,"isPublic":true},"setTransports":{"name":"setTransports","async":false,"parameters":[{"name":"value","type":"any","optional":false,"typeUnresolved":true}],"returnType":"void","isStatic":false,"isPublic":true}},"decoratorConfig":{"tableName":"users_passkey_credentials","sensitive":true,"api":false,"cli":false,"mcp":false},"extends":"SmrtObject","exportName":"UsersPasskeyCredential","collectionExportName":"UsersPasskeyCredentialCollection","displayLabelField":"name","validationRules":[{"field":"userId","rule":"required","fieldType":"foreignKey"},{"field":"credentialId","rule":"required","fieldType":"text"},{"field":"publicKey","rule":"required","fieldType":"text"},{"field":"signCount","rule":"required","fieldType":"integer"},{"field":"name","rule":"required","fieldType":"text"},{"field":"backedUp","rule":"required","fieldType":"boolean"}],"schema":{"tableName":"users_passkey_credentials","ddl":"CREATE TABLE IF NOT EXISTS \\"users_passkey_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,\\n \\"credential_id\\" TEXT NOT NULL UNIQUE,\\n \\"public_key\\" TEXT NOT NULL,\\n \\"sign_count\\" INTEGER NOT NULL DEFAULT 0,\\n \\"transports\\" TEXT,\\n \\"name\\" TEXT NOT NULL,\\n \\"aaguid\\" TEXT,\\n \\"backed_up\\" BOOLEAN NOT NULL DEFAULT FALSE,\\n \\"device_type\\" TEXT,\\n \\"last_used_at\\" TIMESTAMP,\\n \\"created_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":false,"foreignKey":{"table":"users","column":"id","onDelete":"NO ACTION","onUpdate":"CASCADE"}},"credential_id":{"type":"TEXT","notNull":true,"unique":true},"public_key":{"type":"TEXT","notNull":true,"unique":false},"sign_count":{"type":"INTEGER","notNull":true,"unique":false,"default":0},"transports":{"type":"TEXT","notNull":false,"unique":false},"name":{"type":"TEXT","notNull":true,"unique":false},"aaguid":{"type":"TEXT","notNull":false,"unique":false},"backed_up":{"type":"BOOLEAN","notNull":true,"unique":false,"default":false},"device_type":{"type":"TEXT","notNull":false,"unique":false},"last_used_at":{"type":"TIMESTAMP","notNull":false,"unique":false},"created_by":{"type":"TEXT","notNull":false,"unique":false}},"indexes":[{"name":"users_passkey_credentials_slug_context_idx","columns":["slug","context"],"unique":true},{"name":"users_passkey_credentials_created_at_idx","columns":["created_at"]},{"name":"users_passkey_credentials_user_id_idx","columns":["user_id"]}],"version":"4483d2e2"},"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},"getAuthenticatedAt":{"name":"getAuthenticatedAt","async":false,"parameters":[],"returnType":"Date | 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},"username":{"type":"text","required":false,"description":"Optional username used to sign in; lowercase and globally unique.","_meta":{"description":"Optional username used to sign in; lowercase and globally unique.","nullable":true,"indexed":true}},"usernameKey":{"type":"text","required":false,"description":"The standardized username used to recognize this account; maintained automatically.","_meta":{"description":"The standardized username 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 \\"username\\" TEXT,\\n \\"username_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},"username":{"type":"TEXT","notNull":false,"unique":false},"username_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_username_idx","columns":["username"]},{"name":"users_created_at_idx","columns":["created_at"]}],"version":"3ee8f0f4"},"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}`));
13
- var __defProp$3$1 = Object.defineProperty;
14
- var __getOwnPropDesc$3$1 = Object.getOwnPropertyDescriptor;
15
- var __defNormalProp$3$1 = (obj, key, value) => key in obj ? __defProp$3$1(obj, key, {
16
- enumerable: true,
17
- configurable: true,
18
- writable: true,
19
- value
20
- }) : obj[key] = value;
21
- var __decorateClass$3$1 = (decorators, target, key, kind) => {
22
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$3$1(target, key) : target;
23
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
24
- if (kind && result) __defProp$3$1(target, key, result);
25
- return result;
26
- };
27
- var __publicField$3$1 = (obj, key, value) => __defNormalProp$3$1(obj, typeof key !== "symbol" ? key + "" : key, value);
28
- var UsersCliAuthRequest = class extends SmrtObject {
29
- userCode = "";
30
- deviceCodeHash = "";
31
- status = "pending";
32
- userId = null;
33
- tenantId = null;
34
- sessionId = null;
35
- expiresAt = /* @__PURE__ */ new Date();
36
- approvedAt = null;
37
- };
38
- __publicField$3$1(UsersCliAuthRequest, "__smrtPackage__", "@happyvertical/smrt-users");
39
- __decorateClass$3$1([field({
40
- type: "text",
41
- required: true,
42
- unique: true
43
- })], UsersCliAuthRequest.prototype, "userCode", 2);
44
- __decorateClass$3$1([field({
45
- type: "text",
46
- required: true,
47
- unique: true
48
- })], UsersCliAuthRequest.prototype, "deviceCodeHash", 2);
49
- __decorateClass$3$1([field({ type: "text" })], UsersCliAuthRequest.prototype, "status", 2);
50
- __decorateClass$3$1([foreignKey("User", { nullable: true })], UsersCliAuthRequest.prototype, "userId", 2);
51
- __decorateClass$3$1([foreignKey("Tenant", { nullable: true })], UsersCliAuthRequest.prototype, "tenantId", 2);
52
- __decorateClass$3$1([foreignKey("Session", { nullable: true })], UsersCliAuthRequest.prototype, "sessionId", 2);
53
- __decorateClass$3$1([field({
54
- type: "datetime",
55
- indexed: true
56
- })], UsersCliAuthRequest.prototype, "expiresAt", 2);
57
- __decorateClass$3$1([field({
58
- type: "datetime",
59
- nullable: true
60
- })], UsersCliAuthRequest.prototype, "approvedAt", 2);
61
- UsersCliAuthRequest = __decorateClass$3$1([smrt({
62
- tableName: "users_cli_auth_requests",
63
- sensitive: true,
64
- api: { include: [] },
65
- cli: false,
66
- mcp: { include: [] }
67
- })], UsersCliAuthRequest);
68
- var CliAuthApprovalLostError = class extends Error {};
69
- var UsersCliAuthRequestCollection = class extends SmrtCollection {
70
- static _itemClass = UsersCliAuthRequest;
71
- /**
72
- * Atomically approve one pending request and mint its bearer session.
73
- *
74
- * The session is created inside the same transaction as the conditional
75
- * pending-to-approved transition. If another approver wins, or persisting
76
- * the approval fails, throwing rolls the losing session back with the
77
- * request write so no usable orphan credential can remain.
78
- */
79
- async approvePendingRequest(input) {
80
- const transaction = this.db.transaction?.bind(this.db);
81
- if (!transaction) throw new Error("Terminal approval requires database transaction support.");
82
- try {
83
- return await transaction(async (tx) => {
84
- const createdSessionId = (await (await SessionCollection.create({ db: tx })).createSession({
85
- authMethod: "terminal",
86
- data: {
87
- approvedBy: input.approvedBy,
88
- kind: "terminal"
89
- },
90
- ipAddress: input.ipAddress,
91
- tenantId: input.tenantId,
92
- ttl: input.sessionTtlSeconds,
93
- userAgent: input.userAgent,
94
- userId: input.userId
95
- })).id;
96
- if (!createdSessionId) throw new Error("Terminal approval failed to mint a session.");
97
- const approvedAt = /* @__PURE__ */ new Date();
98
- const now = approvedAt.toISOString();
99
- const approved = await tx.query(`UPDATE ${this.tableName}
100
- SET approved_at = ?, session_id = ?, status = 'approved',
101
- tenant_id = ?, user_id = ?, updated_at = ?
102
- WHERE user_code = ? AND status = 'pending' AND expires_at > ?
103
- RETURNING id`, now, createdSessionId, input.tenantId, input.userId, now, input.userCode.trim().toUpperCase(), now);
104
- if (approved.rows?.length !== 1) throw new CliAuthApprovalLostError();
105
- const id = approved.rows[0]?.id;
106
- if (typeof id !== "string") throw new Error("Terminal approval did not return its request id.");
107
- return {
108
- approvedAt,
109
- id,
110
- sessionId: createdSessionId,
111
- tenantId: input.tenantId,
112
- userId: input.userId
113
- };
114
- });
115
- } catch (error) {
116
- if (error instanceof CliAuthApprovalLostError) return null;
117
- throw error;
118
- }
119
- }
120
- /**
121
- * Atomically consume the bearer session attached to an approved request.
122
- *
123
- * The conditional update is the arbiter: concurrent exchangers may observe
124
- * the same candidate, but only one can change `approved` to `consumed` while
125
- * matching the same session id. The winning transaction returns the token
126
- * from its locked candidate and clears it from durable storage.
127
- */
128
- async consumeApprovedSession(deviceCodeHash) {
129
- const transaction = this.db.transaction?.bind(this.db);
130
- if (!transaction) throw new Error("Terminal device exchange requires database transaction support.");
131
- return transaction(async (tx) => {
132
- const candidate = (await tx.query(`SELECT id, session_id FROM ${this.tableName}
133
- WHERE device_code_hash = ? AND status = 'approved' AND session_id IS NOT NULL
134
- LIMIT 1`, deviceCodeHash)).rows?.[0];
135
- const id = typeof candidate?.id === "string" ? candidate.id : null;
136
- const sessionId = typeof candidate?.session_id === "string" ? candidate.session_id : null;
137
- if (!id || !sessionId) return null;
138
- return (await tx.query(`UPDATE ${this.tableName}
139
- SET status = 'consumed', session_id = NULL, updated_at = ?
140
- WHERE id = ? AND status = 'approved' AND session_id = ?
141
- RETURNING id`, (/* @__PURE__ */ new Date()).toISOString(), id, sessionId)).rows?.length === 1 ? sessionId : null;
142
- });
143
- }
144
- /**
145
- * Look up a pending or completed request by the short user code shown in the CLI.
146
- */
147
- async findByUserCode(userCode) {
148
- const [request] = await this.list({
149
- limit: 1,
150
- where: { userCode: userCode.trim().toUpperCase() }
151
- });
152
- return request ?? null;
153
- }
154
- /**
155
- * Look up a request by the hash of its device code (the CLI's polling key).
156
- */
157
- async findByDeviceCodeHash(deviceCodeHash) {
158
- const [request] = await this.list({
159
- limit: 1,
160
- where: { deviceCodeHash }
161
- });
162
- return request ?? null;
163
- }
164
- /**
165
- * Delete expired pending, lazily-expired, or already-consumed requests.
166
- *
167
- * Scheduled by the framework retention sweep (#2375); `expiresAt` carries an
168
- * index for this predicate.
169
- *
170
- * @param options.dryRun - Count the requests the predicate selects without
171
- * deleting them.
172
- * @returns Number of requests deleted (or, under `dryRun`, matched)
173
- */
174
- async deleteExpired(options = {}) {
175
- const now = (/* @__PURE__ */ new Date()).toISOString();
176
- const predicate = "status IN ('pending', 'expired', 'consumed') AND expires_at < ?";
177
- const counted = await this.db.query(`SELECT COUNT(*) AS total FROM ${this.tableName} WHERE ${predicate}`, now);
178
- const total = Number(counted.rows?.[0]?.total ?? 0);
179
- if (!Number.isFinite(total) || total <= 0) return 0;
180
- if (!options.dryRun) await this.db.query(`DELETE FROM ${this.tableName} WHERE ${predicate}`, now);
181
- return total;
182
- }
183
- };
184
- var __defProp$2$1 = Object.defineProperty;
185
- var __getOwnPropDesc$2$1 = Object.getOwnPropertyDescriptor;
186
- var __defNormalProp$2$1 = (obj, key, value) => key in obj ? __defProp$2$1(obj, key, {
187
- enumerable: true,
188
- configurable: true,
189
- writable: true,
190
- value
191
- }) : obj[key] = value;
192
- var __decorateClass$2$1 = (decorators, target, key, kind) => {
193
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2$1(target, key) : target;
194
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
195
- if (kind && result) __defProp$2$1(target, key, result);
196
- return result;
197
- };
198
- var __publicField$2$1 = (obj, key, value) => __defNormalProp$2$1(obj, typeof key !== "symbol" ? key + "" : key, value);
199
- var UsersPasskeyChallenge = class extends SmrtObject {
200
- challengeHash = "";
201
- purpose = "authentication";
202
- expiresAt = /* @__PURE__ */ new Date();
203
- };
204
- __publicField$2$1(UsersPasskeyChallenge, "__smrtPackage__", "@happyvertical/smrt-users");
205
- __decorateClass$2$1([field({
206
- type: "text",
207
- required: true,
208
- unique: true
209
- })], UsersPasskeyChallenge.prototype, "challengeHash", 2);
210
- __decorateClass$2$1([field({
211
- type: "text",
212
- required: true
213
- })], UsersPasskeyChallenge.prototype, "purpose", 2);
214
- __decorateClass$2$1([field({
215
- type: "datetime",
216
- required: true,
217
- indexed: true
218
- })], UsersPasskeyChallenge.prototype, "expiresAt", 2);
219
- UsersPasskeyChallenge = __decorateClass$2$1([smrt({
220
- tableName: "users_passkey_challenges",
221
- sensitive: true,
222
- api: false,
223
- cli: false,
224
- mcp: false
225
- })], UsersPasskeyChallenge);
226
- var UsersPasskeyChallengeCollection = class extends SmrtCollection {
227
- static _itemClass = UsersPasskeyChallenge;
228
- /**
229
- * Consume a challenge: insert its hash. Returns false, writing nothing,
230
- * when the hash was already consumed — a replay. One
231
- * `INSERT … ON CONFLICT DO NOTHING` against the unique `challenge_hash`
232
- * decides between concurrent consumers, so of any number of simultaneous
233
- * uses exactly one gets true. A constraint error is deliberately never the
234
- * arbiter: a failed statement on a shared connection can be reported to the
235
- * wrong caller, and a database failure must not read as "consumed" or
236
- * "fresh".
237
- */
238
- async consume(challengeHash, purpose, expiresAt) {
239
- const id = randomUUID();
240
- const now = (/* @__PURE__ */ new Date()).toISOString();
241
- const { rowCount } = await this.db.query(`INSERT INTO ${this.tableName} (
242
- id, slug, context, challenge_hash, purpose, expires_at,
243
- created_at, updated_at
244
- ) VALUES (?, ?, '', ?, ?, ?, ?, ?)
245
- ON CONFLICT (challenge_hash) DO NOTHING`, id, id, challengeHash, purpose, expiresAt.toISOString(), now, now);
246
- return rowCount > 0;
247
- }
248
- /**
249
- * Delete consumed challenges whose ceremonies can no longer verify ANYWHERE.
250
- * A row is kept for {@link PASSKEY_CHALLENGE_TTL_CEILING_SECONDS} past its
251
- * `expires_at`: another process whose clock runs behind this one's could
252
- * still accept the signed ceremony after this one's clock says it expired,
253
- * and deleting the row inside that window would reopen replay. One
254
- * statement (see `UsersMagicLinkTokenCollection.deleteExpired`);
255
- * `expiresAt` carries an index for this predicate.
256
- *
257
- * @param options.dryRun - Count the rows the predicate selects without
258
- * deleting them.
259
- */
260
- async deleteExpired(options = {}) {
261
- const horizon = (/* @__PURE__ */ new Date(Date.now() - 600 * 1e3)).toISOString();
262
- const predicate = "expires_at < ?";
263
- const counted = await this.db.query(`SELECT COUNT(*) AS total FROM ${this.tableName} WHERE ${predicate}`, horizon);
264
- const total = Number(counted.rows?.[0]?.total ?? 0);
265
- if (!Number.isFinite(total) || total <= 0) return 0;
266
- if (!options.dryRun) await this.db.query(`DELETE FROM ${this.tableName} WHERE ${predicate}`, horizon);
267
- return total;
268
- }
269
- };
270
- var __defProp$1$1 = Object.defineProperty;
271
- var __getOwnPropDesc$1$1 = Object.getOwnPropertyDescriptor;
272
- var __defNormalProp$1$1 = (obj, key, value) => key in obj ? __defProp$1$1(obj, key, {
273
- enumerable: true,
274
- configurable: true,
275
- writable: true,
276
- value
277
- }) : obj[key] = value;
278
- var __decorateClass$1$1 = (decorators, target, key, kind) => {
279
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1$1(target, key) : target;
280
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
281
- if (kind && result) __defProp$1$1(target, key, result);
282
- return result;
283
- };
284
- var __publicField$1$1 = (obj, key, value) => __defNormalProp$1$1(obj, typeof key !== "symbol" ? key + "" : key, value);
285
- var KNOWN_TRANSPORTS = /* @__PURE__ */ new Set([
286
- "ble",
287
- "cable",
288
- "hybrid",
289
- "internal",
290
- "nfc",
291
- "smart-card",
292
- "usb"
293
- ]);
294
- function knownPasskeyTransports(values) {
295
- return (values ?? []).filter((value) => typeof value === "string" && KNOWN_TRANSPORTS.has(value));
296
- }
297
- var UsersPasskeyCredential = class extends SmrtObject {
298
- userId = "";
299
- credentialId = "";
300
- publicKey = "";
301
- signCount = 0;
302
- transports = null;
303
- name = "";
304
- aaguid = null;
305
- backedUp = false;
306
- deviceType = null;
307
- lastUsedAt = null;
308
- createdBy = null;
309
- /** Transport hints, guarded: malformed or unknown entries are dropped. */
310
- getTransports() {
311
- if (!this.transports) return [];
312
- try {
313
- const parsed = JSON.parse(this.transports);
314
- return Array.isArray(parsed) ? knownPasskeyTransports(parsed) : [];
315
- } catch {
316
- return [];
317
- }
318
- }
319
- setTransports(value) {
320
- const known = knownPasskeyTransports(value);
321
- this.transports = known.length > 0 ? JSON.stringify(known) : null;
322
- }
323
- };
324
- __publicField$1$1(UsersPasskeyCredential, "__smrtPackage__", "@happyvertical/smrt-users");
325
- __decorateClass$1$1([foreignKey("User", { required: true })], UsersPasskeyCredential.prototype, "userId", 2);
326
- __decorateClass$1$1([field({
327
- type: "text",
328
- required: true,
329
- unique: true,
330
- sensitive: true
331
- })], UsersPasskeyCredential.prototype, "credentialId", 2);
332
- __decorateClass$1$1([field({
333
- type: "text",
334
- required: true,
335
- sensitive: true
336
- })], UsersPasskeyCredential.prototype, "publicKey", 2);
337
- __decorateClass$1$1([field({
338
- type: "integer",
339
- required: true,
340
- default: 0
341
- })], UsersPasskeyCredential.prototype, "signCount", 2);
342
- __decorateClass$1$1([field({
343
- type: "text",
344
- nullable: true
345
- })], UsersPasskeyCredential.prototype, "transports", 2);
346
- __decorateClass$1$1([field({
347
- type: "text",
348
- required: true
349
- })], UsersPasskeyCredential.prototype, "name", 2);
350
- __decorateClass$1$1([field({
351
- type: "text",
352
- nullable: true
353
- })], UsersPasskeyCredential.prototype, "aaguid", 2);
354
- __decorateClass$1$1([field({
355
- type: "boolean",
356
- required: true,
357
- default: false
358
- })], UsersPasskeyCredential.prototype, "backedUp", 2);
359
- __decorateClass$1$1([field({
360
- type: "text",
361
- nullable: true
362
- })], UsersPasskeyCredential.prototype, "deviceType", 2);
363
- __decorateClass$1$1([field({
364
- type: "datetime",
365
- nullable: true
366
- })], UsersPasskeyCredential.prototype, "lastUsedAt", 2);
367
- __decorateClass$1$1([field({
368
- type: "text",
369
- nullable: true
370
- })], UsersPasskeyCredential.prototype, "createdBy", 2);
371
- UsersPasskeyCredential = __decorateClass$1$1([smrt({
372
- tableName: "users_passkey_credentials",
373
- sensitive: true,
374
- api: false,
375
- cli: false,
376
- mcp: false
377
- })], UsersPasskeyCredential);
378
- var __defProp$7 = Object.defineProperty;
379
- var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
380
- var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, {
381
- enumerable: true,
382
- configurable: true,
383
- writable: true,
384
- value
385
- }) : obj[key] = value;
386
- var __decorateClass$7 = (decorators, target, key, kind) => {
387
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
388
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
389
- if (kind && result) __defProp$7(target, key, result);
390
- return result;
391
- };
392
- var __publicField$7 = (obj, key, value) => __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
393
- var UsersPinCredential = class extends SmrtObject {
394
- userId = "";
395
- pinHash = "";
396
- version = 1;
397
- mustReset = false;
398
- rotatedAt = null;
399
- rotatedBy = null;
400
- };
401
- __publicField$7(UsersPinCredential, "__smrtPackage__", "@happyvertical/smrt-users");
402
- __decorateClass$7([foreignKey("User", {
403
- required: true,
404
- unique: true
405
- })], UsersPinCredential.prototype, "userId", 2);
406
- __decorateClass$7([field({
407
- type: "text",
408
- required: true,
409
- sensitive: true
410
- })], UsersPinCredential.prototype, "pinHash", 2);
411
- __decorateClass$7([field({
412
- type: "integer",
413
- required: true,
414
- default: 1
415
- })], UsersPinCredential.prototype, "version", 2);
416
- __decorateClass$7([field({
417
- type: "boolean",
418
- required: true,
419
- default: false
420
- })], UsersPinCredential.prototype, "mustReset", 2);
421
- __decorateClass$7([field({
422
- type: "datetime",
423
- nullable: true
424
- })], UsersPinCredential.prototype, "rotatedAt", 2);
425
- __decorateClass$7([field({
426
- type: "text",
427
- nullable: true
428
- })], UsersPinCredential.prototype, "rotatedBy", 2);
429
- UsersPinCredential = __decorateClass$7([smrt({
430
- tableName: "users_pin_credentials",
431
- sensitive: true,
432
- api: false,
433
- cli: false,
434
- mcp: false
435
- })], UsersPinCredential);
436
- createLogger({ level: "info" });
437
- new TextEncoder();
438
- new TextDecoder();
439
- new TextDecoder("utf-8", { fatal: !0 });
440
- function table(entries) {
441
- const out = { __proto__: null };
442
- for (const alg in entries) out[alg] = {
443
- ...entries[alg],
444
- alg
445
- };
446
- return out;
447
- }
448
- var sig = [["verify"], ["sign"]];
449
- function hmac(bits) {
450
- const subtle = {
451
- name: "HMAC",
452
- hash: `SHA-${bits}`
453
- };
454
- return {
455
- kty: ["oct"],
456
- secret: !0,
457
- subtle,
458
- signing: subtle,
459
- usages: sig
460
- };
461
- }
462
- function rsa(bits, saltLength) {
463
- const subtle = {
464
- name: saltLength ? "RSA-PSS" : "RSASSA-PKCS1-v1_5",
465
- hash: `SHA-${bits}`
466
- };
467
- return {
468
- kty: ["RSA"],
469
- subtle,
470
- signing: saltLength ? {
471
- ...subtle,
472
- saltLength
473
- } : subtle,
474
- usages: sig,
475
- minRsaBits: 2048
476
- };
477
- }
478
- function ecdsa(crv, bits) {
479
- return {
480
- kty: ["EC"],
481
- crv,
482
- subtle: {
483
- name: "ECDSA",
484
- namedCurve: crv
485
- },
486
- signing: {
487
- name: "ECDSA",
488
- hash: `SHA-${bits}`
489
- },
490
- usages: sig
491
- };
492
- }
493
- function eddsa() {
494
- const subtle = { name: "Ed25519" };
495
- return {
496
- kty: ["OKP"],
497
- crv: "Ed25519",
498
- subtle,
499
- signing: subtle,
500
- usages: sig
501
- };
502
- }
503
- function mldsa(bits) {
504
- const subtle = { name: `ML-DSA-${bits}` };
505
- return {
506
- kty: ["AKP"],
507
- subtle,
508
- signing: subtle,
509
- usages: sig
510
- };
511
- }
512
- table({
513
- HS256: hmac(256),
514
- HS384: hmac(384),
515
- HS512: hmac(512),
516
- RS256: rsa(256),
517
- RS384: rsa(384),
518
- RS512: rsa(512),
519
- PS256: rsa(256, 32),
520
- PS384: rsa(384, 48),
521
- PS512: rsa(512, 64),
522
- ES256: ecdsa("P-256", 256),
523
- ES384: ecdsa("P-384", 384),
524
- ES512: ecdsa("P-521", 512),
525
- EdDSA: eddsa(),
526
- Ed25519: eddsa(),
527
- "ML-DSA-44": mldsa(44),
528
- "ML-DSA-65": mldsa(65),
529
- "ML-DSA-87": mldsa(87)
530
- });
531
- typeof navigator > "u" || navigator.userAgent?.startsWith?.("Mozilla/5.0 ");
532
- var PERMISSION_STORAGE_KEY = /* @__PURE__ */ Symbol.for("smrt:session-permission-context-storage");
533
- function resolvePermissionContextStorage() {
534
- const root = globalThis;
535
- root[PERMISSION_STORAGE_KEY] ??= new AsyncLocalStorage();
536
- return root[PERMISSION_STORAGE_KEY];
537
- }
538
- var requestPermissionContextStorage = resolvePermissionContextStorage();
539
- function getCurrentSessionPermissionContext() {
540
- return requestPermissionContextStorage.getStore();
541
- }
542
- function getRequestScopedDatabase() {
543
- return getCurrentSessionPermissionContext()?.database;
544
- }
545
- globalThis.__smrtGetRequestPermissionContext ??= getCurrentSessionPermissionContext;
546
- globalThis.__smrtGetRequestScopedDatabase ??= getRequestScopedDatabase;
547
- createLogger({ level: "info" });
548
- SESSION_DATA_KEYS.passkeyCredentialId;
549
- Object.freeze([
550
- "password",
551
- "passkey",
552
- "oidc",
553
- "magic-link"
554
- ]);
555
- new TextEncoder();
556
- new TextDecoder();
557
- var day = 3600 * 24;
558
- day * 7;
559
- day * 365.25;
560
- //#endregion
561
- //#region ../users/dist/index.js
562
- var __defProp$6 = Object.defineProperty;
563
- var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
564
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, {
565
- enumerable: true,
566
- configurable: true,
567
- writable: true,
568
- value
569
- }) : obj[key] = value;
570
- var __decorateClass$6 = (decorators, target, key, kind) => {
571
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
572
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
573
- if (kind && result) __defProp$6(target, key, result);
574
- return result;
575
- };
576
- var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
577
- var MemberClass = class extends SmrtObject {
578
- tenantId = "";
579
- key = "";
580
- name = "";
581
- description = "";
582
- policyMetadata = null;
583
- };
584
- __publicField$6(MemberClass, "__smrtPackage__", "@happyvertical/smrt-users");
585
- __decorateClass$6([tenantId()], MemberClass.prototype, "tenantId", 2);
586
- __decorateClass$6([field({ type: "text" })], MemberClass.prototype, "key", 2);
587
- __decorateClass$6([field({
588
- type: "json",
589
- nullable: true
590
- })], MemberClass.prototype, "policyMetadata", 2);
591
- MemberClass = __decorateClass$6([TenantScoped({ mode: "required" }), smrt({
592
- tableName: "member_classes",
593
- sensitive: true,
594
- indexes: [{
595
- name: "member_classes_tenant_key_uq",
596
- columns: ["tenantId", "key"],
597
- unique: true
598
- }],
599
- api: { include: [] },
600
- mcp: { include: [] },
601
- cli: false
602
- })], MemberClass);
603
- var LegalMember = class extends SmrtObject {
604
- tenantId = "";
605
- memberClassId = "";
606
- kind = "individual";
607
- displayName = "";
608
- userId = null;
609
- profileId = null;
610
- externalPartyRef = null;
611
- joinedOn = "";
612
- leftOn = null;
613
- status = "active";
614
- };
615
- __publicField$6(LegalMember, "__smrtPackage__", "@happyvertical/smrt-users");
616
- __decorateClass$6([tenantId()], LegalMember.prototype, "tenantId", 2);
617
- __decorateClass$6([foreignKey("MemberClass", { onDelete: "RESTRICT" })], LegalMember.prototype, "memberClassId", 2);
618
- __decorateClass$6([field({ type: "text" })], LegalMember.prototype, "kind", 2);
619
- __decorateClass$6([foreignKey("User", {
620
- nullable: true,
621
- onDelete: "RESTRICT"
622
- })], LegalMember.prototype, "userId", 2);
623
- __decorateClass$6([crossPackageRef("@happyvertical/smrt-profiles:Profile", {
624
- nullable: true,
625
- onDelete: "RESTRICT"
626
- })], LegalMember.prototype, "profileId", 2);
627
- __decorateClass$6([field({
628
- type: "text",
629
- nullable: true
630
- })], LegalMember.prototype, "externalPartyRef", 2);
631
- __decorateClass$6([field({ type: "text" })], LegalMember.prototype, "joinedOn", 2);
632
- __decorateClass$6([field({
633
- type: "text",
634
- nullable: true
635
- })], LegalMember.prototype, "leftOn", 2);
636
- __decorateClass$6([field({ type: "text" })], LegalMember.prototype, "status", 2);
637
- LegalMember = __decorateClass$6([TenantScoped({ mode: "required" }), smrt({
638
- tableName: "legal_members",
639
- sensitive: true,
640
- indexes: [{
641
- name: "legal_members_tenant_class_status_idx",
642
- columns: [
643
- "tenantId",
644
- "memberClassId",
645
- "status"
646
- ]
647
- }, {
648
- name: "legal_members_tenant_user_idx",
649
- columns: ["tenantId", "userId"]
650
- }],
651
- api: { include: [] },
652
- mcp: { include: [] },
653
- cli: false
654
- })], LegalMember);
655
- var LegalMemberStatusHistory = class extends SmrtObject {
656
- tenantId = "";
657
- memberId = "";
658
- status = "active";
659
- effectiveOn = "";
660
- sequence = 0;
661
- reason = "";
662
- actorRef = null;
663
- /** History is corrected by appending another effective entry, never rewriting it. */
664
- async save() {
665
- if (this.id && await this.db.get(this.tableName, { id: this.id })) throw new Error("Legal member status history is append-only.");
666
- this.requireInsertOnSave();
667
- return super.save();
668
- }
669
- async delete() {
670
- throw new Error("Legal member status history cannot be deleted.");
671
- }
672
- };
673
- __publicField$6(LegalMemberStatusHistory, "__smrtPackage__", "@happyvertical/smrt-users");
674
- __decorateClass$6([tenantId()], LegalMemberStatusHistory.prototype, "tenantId", 2);
675
- __decorateClass$6([foreignKey("LegalMember", { onDelete: "RESTRICT" })], LegalMemberStatusHistory.prototype, "memberId", 2);
676
- __decorateClass$6([field({ type: "text" })], LegalMemberStatusHistory.prototype, "status", 2);
677
- __decorateClass$6([field({ type: "text" })], LegalMemberStatusHistory.prototype, "effectiveOn", 2);
678
- __decorateClass$6([field({ type: "integer" })], LegalMemberStatusHistory.prototype, "sequence", 2);
679
- __decorateClass$6([field({
680
- type: "text",
681
- nullable: true
682
- })], LegalMemberStatusHistory.prototype, "actorRef", 2);
683
- LegalMemberStatusHistory = __decorateClass$6([TenantScoped({ mode: "required" }), smrt({
684
- tableName: "legal_member_status_history",
685
- sensitive: true,
686
- indexes: [{
687
- name: "legal_member_status_history_member_on_idx",
688
- columns: [
689
- "tenantId",
690
- "memberId",
691
- "effectiveOn"
692
- ]
693
- }],
694
- api: { include: [] },
695
- mcp: { include: [] },
696
- cli: false
697
- })], LegalMemberStatusHistory);
698
- var LegalMemberReference = class extends SmrtObject {
699
- tenantId = "";
700
- memberId = "";
701
- kind = "share";
702
- /** Qualified external model name or host namespace, e.g. @happyvertical/smrt-ledgers:JournalEntry. */
703
- sourceType = "";
704
- sourceId = "";
705
- authoritative = false;
706
- effectiveFrom = "";
707
- effectiveTo = null;
708
- revokesId = null;
709
- async save() {
710
- if (this.id && await this.db.get(this.tableName, { id: this.id })) throw new Error("Legal member references are append-only.");
711
- this.requireInsertOnSave();
712
- return super.save();
713
- }
714
- async delete() {
715
- throw new Error("Legal member references cannot be deleted.");
716
- }
717
- };
718
- __publicField$6(LegalMemberReference, "__smrtPackage__", "@happyvertical/smrt-users");
719
- __decorateClass$6([tenantId()], LegalMemberReference.prototype, "tenantId", 2);
720
- __decorateClass$6([foreignKey("LegalMember", { onDelete: "RESTRICT" })], LegalMemberReference.prototype, "memberId", 2);
721
- __decorateClass$6([field({ type: "text" })], LegalMemberReference.prototype, "kind", 2);
722
- __decorateClass$6([field({ type: "boolean" })], LegalMemberReference.prototype, "authoritative", 2);
723
- __decorateClass$6([field({ type: "text" })], LegalMemberReference.prototype, "effectiveFrom", 2);
724
- __decorateClass$6([field({
725
- type: "text",
726
- nullable: true
727
- })], LegalMemberReference.prototype, "effectiveTo", 2);
728
- __decorateClass$6([foreignKey("LegalMemberReference", {
729
- nullable: true,
730
- onDelete: "RESTRICT"
731
- })], LegalMemberReference.prototype, "revokesId", 2);
732
- LegalMemberReference = __decorateClass$6([TenantScoped({ mode: "required" }), smrt({
733
- tableName: "legal_member_references",
734
- sensitive: true,
735
- indexes: [{
736
- name: "legal_member_references_member_kind_idx",
737
- columns: [
738
- "tenantId",
739
- "memberId",
740
- "kind"
741
- ]
742
- }],
743
- api: { include: [] },
744
- mcp: { include: [] },
745
- cli: false
746
- })], LegalMemberReference);
747
- var MemberOfficerAppointment = class extends SmrtObject {
748
- tenantId = "";
749
- memberId = "";
750
- role = "";
751
- effectiveFrom = "";
752
- effectiveTo = null;
753
- authority = null;
754
- };
755
- __publicField$6(MemberOfficerAppointment, "__smrtPackage__", "@happyvertical/smrt-users");
756
- __decorateClass$6([tenantId()], MemberOfficerAppointment.prototype, "tenantId", 2);
757
- __decorateClass$6([foreignKey("LegalMember", { onDelete: "RESTRICT" })], MemberOfficerAppointment.prototype, "memberId", 2);
758
- __decorateClass$6([field({ type: "text" })], MemberOfficerAppointment.prototype, "role", 2);
759
- __decorateClass$6([field({ type: "text" })], MemberOfficerAppointment.prototype, "effectiveFrom", 2);
760
- __decorateClass$6([field({
761
- type: "text",
762
- nullable: true
763
- })], MemberOfficerAppointment.prototype, "effectiveTo", 2);
764
- __decorateClass$6([field({
765
- type: "json",
766
- nullable: true
767
- })], MemberOfficerAppointment.prototype, "authority", 2);
768
- MemberOfficerAppointment = __decorateClass$6([TenantScoped({ mode: "required" }), smrt({
769
- tableName: "member_officer_appointments",
770
- sensitive: true,
771
- indexes: [{
772
- name: "member_officer_appointments_member_term_idx",
773
- columns: [
774
- "tenantId",
775
- "memberId",
776
- "effectiveFrom"
777
- ]
778
- }],
779
- api: { include: [] },
780
- mcp: { include: [] },
781
- cli: false
782
- })], MemberOfficerAppointment);
783
- var MemberEligibilitySnapshot = class extends SmrtObject {
784
- tenantId = "";
785
- memberId = "";
786
- recordDate = "";
787
- eligible = false;
788
- reason = "";
789
- evidence = null;
790
- /** Record-date evidence is immutable; a later request creates a new snapshot. */
791
- async save() {
792
- if (this.id && await this.db.get(this.tableName, { id: this.id })) throw new Error("Member eligibility snapshots are immutable.");
793
- this.requireInsertOnSave();
794
- return super.save();
795
- }
796
- async delete() {
797
- throw new Error("Member eligibility snapshots cannot be deleted.");
798
- }
799
- };
800
- __publicField$6(MemberEligibilitySnapshot, "__smrtPackage__", "@happyvertical/smrt-users");
801
- __decorateClass$6([tenantId()], MemberEligibilitySnapshot.prototype, "tenantId", 2);
802
- __decorateClass$6([foreignKey("LegalMember", { onDelete: "RESTRICT" })], MemberEligibilitySnapshot.prototype, "memberId", 2);
803
- __decorateClass$6([field({ type: "text" })], MemberEligibilitySnapshot.prototype, "recordDate", 2);
804
- __decorateClass$6([field({ type: "boolean" })], MemberEligibilitySnapshot.prototype, "eligible", 2);
805
- __decorateClass$6([field({
806
- type: "json",
807
- nullable: true
808
- })], MemberEligibilitySnapshot.prototype, "evidence", 2);
809
- MemberEligibilitySnapshot = __decorateClass$6([TenantScoped({ mode: "required" }), smrt({
810
- tableName: "member_eligibility_snapshots",
811
- sensitive: true,
812
- indexes: [{
813
- name: "member_eligibility_snapshots_tenant_date_idx",
814
- columns: ["tenantId", "recordDate"]
815
- }],
816
- api: { include: [] },
817
- mcp: { include: [] },
818
- cli: false
819
- })], MemberEligibilitySnapshot);
820
- var MemberClassCollection = class extends SmrtCollection {};
821
- __publicField$6(MemberClassCollection, "__smrtPackage__", "@happyvertical/smrt-users");
822
- __publicField$6(MemberClassCollection, "_itemClass", MemberClass);
823
- MemberClassCollection = __decorateClass$6([smrt({
824
- api: { include: [] },
825
- mcp: { include: [] },
826
- cli: false
827
- })], MemberClassCollection);
828
- var LegalMemberCollection = class extends SmrtCollection {};
829
- __publicField$6(LegalMemberCollection, "__smrtPackage__", "@happyvertical/smrt-users");
830
- __publicField$6(LegalMemberCollection, "_itemClass", LegalMember);
831
- LegalMemberCollection = __decorateClass$6([smrt({
832
- api: { include: [] },
833
- mcp: { include: [] },
834
- cli: false
835
- })], LegalMemberCollection);
836
- var LegalMemberStatusHistoryCollection = class extends SmrtCollection {};
837
- __publicField$6(LegalMemberStatusHistoryCollection, "__smrtPackage__", "@happyvertical/smrt-users");
838
- __publicField$6(LegalMemberStatusHistoryCollection, "_itemClass", LegalMemberStatusHistory);
839
- LegalMemberStatusHistoryCollection = __decorateClass$6([smrt({
840
- api: { include: [] },
841
- mcp: { include: [] },
842
- cli: false
843
- })], LegalMemberStatusHistoryCollection);
844
- var LegalMemberReferenceCollection = class extends SmrtCollection {};
845
- __publicField$6(LegalMemberReferenceCollection, "__smrtPackage__", "@happyvertical/smrt-users");
846
- __publicField$6(LegalMemberReferenceCollection, "_itemClass", LegalMemberReference);
847
- LegalMemberReferenceCollection = __decorateClass$6([smrt({
848
- api: { include: [] },
849
- mcp: { include: [] },
850
- cli: false
851
- })], LegalMemberReferenceCollection);
852
- var MemberOfficerAppointmentCollection = class extends SmrtCollection {};
853
- __publicField$6(MemberOfficerAppointmentCollection, "__smrtPackage__", "@happyvertical/smrt-users");
854
- __publicField$6(MemberOfficerAppointmentCollection, "_itemClass", MemberOfficerAppointment);
855
- MemberOfficerAppointmentCollection = __decorateClass$6([smrt({
856
- api: { include: [] },
857
- mcp: { include: [] },
858
- cli: false
859
- })], MemberOfficerAppointmentCollection);
860
- var MemberEligibilitySnapshotCollection = class extends SmrtCollection {};
861
- __publicField$6(MemberEligibilitySnapshotCollection, "__smrtPackage__", "@happyvertical/smrt-users");
862
- __publicField$6(MemberEligibilitySnapshotCollection, "_itemClass", MemberEligibilitySnapshot);
863
- MemberEligibilitySnapshotCollection = __decorateClass$6([smrt({
864
- api: { include: [] },
865
- mcp: { include: [] },
866
- cli: false
867
- })], MemberEligibilitySnapshotCollection);
868
- var __defProp$5 = Object.defineProperty;
869
- var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
870
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, {
871
- enumerable: true,
872
- configurable: true,
873
- writable: true,
874
- value
875
- }) : obj[key] = value;
876
- var __decorateClass$5 = (decorators, target, key, kind) => {
877
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$5(target, key) : target;
878
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
879
- if (kind && result) __defProp$5(target, key, result);
880
- return result;
881
- };
882
- var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
883
- var ResourceGrant = class extends SmrtObject {
884
- tenantId;
885
- userId;
886
- resourceType = "";
887
- resourceId = "";
888
- permission = "";
889
- effect = "grant";
890
- canDelegate = false;
891
- parentGrantId;
892
- revokedAt;
893
- constructor(options = {}) {
894
- super(options);
895
- if (options.tenantId !== void 0) this.tenantId = options.tenantId;
896
- if (options.userId !== void 0) this.userId = options.userId;
897
- if (options.resourceType !== void 0) this.resourceType = options.resourceType;
898
- if (options.resourceId !== void 0) this.resourceId = options.resourceId;
899
- if (options.permission !== void 0) this.permission = options.permission;
900
- if (options.effect !== void 0) this.effect = options.effect;
901
- if (options.canDelegate !== void 0) this.canDelegate = options.canDelegate;
902
- if (options.parentGrantId !== void 0) this.parentGrantId = options.parentGrantId;
903
- if (options.revokedAt !== void 0) this.revokedAt = options.revokedAt;
904
- }
905
- isActive() {
906
- return !this.revokedAt;
907
- }
908
- };
909
- __publicField$5(ResourceGrant, "__smrtPackage__", "@happyvertical/smrt-users");
910
- __decorateClass$5([foreignKey("Tenant", { required: true })], ResourceGrant.prototype, "tenantId", 2);
911
- __decorateClass$5([field({ description: "The person receiving this record-specific access rule." }), foreignKey("User", { required: true })], ResourceGrant.prototype, "userId", 2);
912
- __decorateClass$5([field({
913
- description: "The kind of record this access rule applies to.",
914
- type: "text"
915
- })], ResourceGrant.prototype, "resourceType", 2);
916
- __decorateClass$5([field({
917
- description: "The specific record covered by this access rule.",
918
- type: "text"
919
- })], ResourceGrant.prototype, "resourceId", 2);
920
- __decorateClass$5([field({
921
- description: "The action this rule allows or denies for the record.",
922
- type: "text"
923
- })], ResourceGrant.prototype, "permission", 2);
924
- __decorateClass$5([field({
925
- description: "Whether this rule grants access or denies it. Denies take precedence.",
926
- type: "text"
927
- })], ResourceGrant.prototype, "effect", 2);
928
- __decorateClass$5([field({ description: "Whether the recipient may pass this grant on to another person." })], ResourceGrant.prototype, "canDelegate", 2);
929
- __decorateClass$5([field({ description: "The earlier grant from which this access was delegated." }), foreignKey("ResourceGrant")], ResourceGrant.prototype, "parentGrantId", 2);
930
- __decorateClass$5([field({
931
- description: "When this access rule was revoked, if it has ended.",
932
- type: "text"
933
- })], ResourceGrant.prototype, "revokedAt", 2);
934
- ResourceGrant = __decorateClass$5([smrt({
935
- tenantScoped: true,
936
- api: { include: [] },
937
- mcp: { include: [] },
938
- cli: false,
939
- indexes: [{
940
- name: "resource_grants_lookup_idx",
941
- columns: ["tenantId", "userId"]
942
- }]
943
- })], ResourceGrant);
944
- var __defProp$4 = Object.defineProperty;
945
- var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
946
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, {
947
- enumerable: true,
948
- configurable: true,
949
- writable: true,
950
- value
951
- }) : obj[key] = value;
952
- var __decorateClass$4 = (decorators, target, key, kind) => {
953
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$4(target, key) : target;
954
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
955
- if (kind && result) __defProp$4(target, key, result);
956
- return result;
957
- };
958
- var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
959
- var UsersMagicLinkToken = class extends SmrtObject {
960
- nonce = "";
961
- /** Email address this token was generated for */
962
- email = "";
963
- /** Whether this token has been used */
964
- used = false;
965
- expiresAt = new Date(Date.now() + 600 * 1e3);
966
- constructor(options = {}) {
967
- super(options);
968
- if (options.nonce !== void 0) this.nonce = options.nonce;
969
- if (options.email !== void 0) this.email = options.email;
970
- if (options.used !== void 0) this.used = options.used;
971
- if (options.expiresAt !== void 0) this.expiresAt = options.expiresAt instanceof Date ? options.expiresAt : new Date(options.expiresAt);
972
- }
973
- /** Check if the token has expired */
974
- isExpired() {
975
- return /* @__PURE__ */ new Date() > this.expiresAt;
976
- }
977
- /** Check if the token is still valid (unused and not expired) */
978
- isValid() {
979
- return !this.used && !this.isExpired();
980
- }
981
- };
982
- __publicField$4(UsersMagicLinkToken, "__smrtPackage__", "@happyvertical/smrt-users");
983
- __decorateClass$4([field({
984
- required: true,
985
- unique: true
986
- })], UsersMagicLinkToken.prototype, "nonce", 2);
987
- __decorateClass$4([field({
988
- type: "datetime",
989
- indexed: true
990
- })], UsersMagicLinkToken.prototype, "expiresAt", 2);
991
- UsersMagicLinkToken = __decorateClass$4([smrt({
992
- tableName: "users_magic_link_tokens",
993
- sensitive: true,
994
- api: { include: [] },
995
- mcp: { include: [] },
996
- cli: false
997
- })], UsersMagicLinkToken);
998
- var UsersMagicLinkTokenCollection = class extends SmrtCollection {
999
- static _itemClass = UsersMagicLinkToken;
1000
- /**
1001
- * Find a token by its nonce
1002
- */
1003
- async findByNonce(nonce) {
1004
- return this.findOne({ where: { nonce } });
1005
- }
1006
- /**
1007
- * Atomically mark a token as used (single-use enforcement).
1008
- *
1009
- * Returns true if the nonce was successfully claimed (transitioned from
1010
- * unused to used). Returns false if the nonce was already used, expired,
1011
- * or doesn't exist — preventing race conditions in concurrent verify() calls.
1012
- */
1013
- async markUsed(nonce) {
1014
- const now = (/* @__PURE__ */ new Date()).toISOString();
1015
- const { rowCount } = await this.db.query(`UPDATE ${this.tableName}
1016
- SET used = ?, updated_at = ?
1017
- WHERE nonce = ? AND used = ? AND expires_at > ?`, true, now, nonce, false, now);
1018
- return rowCount > 0;
1019
- }
1020
- /**
1021
- * Delete expired tokens (cleanup job)
1022
- *
1023
- * Scheduled by the framework retention sweep (#2375); `expiresAt` carries an
1024
- * index for this predicate.
1025
- *
1026
- * @param options.dryRun - Count the tokens the predicate selects without
1027
- * deleting them.
1028
- * @returns Number of tokens deleted (or, under `dryRun`, matched)
1029
- */
1030
- async deleteExpired(options = {}) {
1031
- const now = (/* @__PURE__ */ new Date()).toISOString();
1032
- const predicate = "expires_at < ?";
1033
- const counted = await this.db.query(`SELECT COUNT(*) AS total FROM ${this.tableName} WHERE ${predicate}`, now);
1034
- const total = Number(counted.rows?.[0]?.total ?? 0);
1035
- if (!Number.isFinite(total) || total <= 0) return 0;
1036
- if (!options.dryRun) await this.db.query(`DELETE FROM ${this.tableName} WHERE ${predicate}`, now);
1037
- return total;
1038
- }
1039
- };
1040
- var __defProp$3 = Object.defineProperty;
1041
- var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor;
1042
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, {
1043
- enumerable: true,
1044
- configurable: true,
1045
- writable: true,
1046
- value
1047
- }) : obj[key] = value;
1048
- var __decorateClass$3 = (decorators, target, key, kind) => {
1049
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$3(target, key) : target;
1050
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1051
- if (kind && result) __defProp$3(target, key, result);
1052
- return result;
1053
- };
1054
- var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
1055
- function stringArray(value) {
1056
- if (Array.isArray(value) && value.every((item) => typeof item === "string")) return [...value];
1057
- if (typeof value !== "string") return [];
1058
- try {
1059
- const parsed = JSON.parse(value);
1060
- return Array.isArray(parsed) && parsed.every((item) => typeof item === "string") ? parsed : [];
1061
- } catch {
1062
- return [];
1063
- }
1064
- }
1065
- function tokenClaims(value) {
1066
- if (value && typeof value === "object" && !Array.isArray(value)) return Object.fromEntries(Object.entries(value).filter(([, item]) => typeof item === "string" || typeof item === "number" || typeof item === "boolean"));
1067
- if (typeof value !== "string") return {};
1068
- try {
1069
- return tokenClaims(JSON.parse(value));
1070
- } catch {
1071
- return {};
1072
- }
1073
- }
1074
- var UsersOAuthClient = class extends SmrtObject {
1075
- clientId = "";
1076
- redirectUris = "[]";
1077
- allowedScopes = "[]";
1078
- tokenEndpointAuthMethod = "none";
1079
- secretHash = null;
1080
- allowedResources = "null";
1081
- createdAt = /* @__PURE__ */ new Date();
1082
- getRedirectUris() {
1083
- return stringArray(this.redirectUris);
1084
- }
1085
- getAllowedScopes() {
1086
- return stringArray(this.allowedScopes);
1087
- }
1088
- getAllowedResources() {
1089
- return this.allowedResources === "null" ? void 0 : stringArray(this.allowedResources);
1090
- }
1091
- };
1092
- __publicField$3(UsersOAuthClient, "__smrtPackage__", "@happyvertical/smrt-users");
1093
- __decorateClass$3([field({
1094
- type: "text",
1095
- required: true,
1096
- unique: true
1097
- })], UsersOAuthClient.prototype, "clientId", 2);
1098
- __decorateClass$3([field({
1099
- nullable: true,
1100
- sensitive: true
1101
- })], UsersOAuthClient.prototype, "secretHash", 2);
1102
- __decorateClass$3([field({ type: "datetime" })], UsersOAuthClient.prototype, "createdAt", 2);
1103
- UsersOAuthClient = __decorateClass$3([smrt({
1104
- tableName: "users_oauth_clients",
1105
- sensitive: true,
1106
- api: { include: [] },
1107
- mcp: { include: [] },
1108
- cli: false
1109
- })], UsersOAuthClient);
1110
- var UsersOAuthAuthorizationCode = class extends SmrtObject {
1111
- authorizationId = null;
1112
- codeHash = "";
1113
- clientId = "";
1114
- subject = "";
1115
- tenantId = null;
1116
- claims = "{}";
1117
- redirectUri = "";
1118
- scopes = "[]";
1119
- resource = null;
1120
- codeChallenge = "";
1121
- expiresAt = /* @__PURE__ */ new Date();
1122
- consumedAt = null;
1123
- getScopes() {
1124
- return stringArray(this.scopes);
1125
- }
1126
- getClaims() {
1127
- return tokenClaims(this.claims);
1128
- }
1129
- };
1130
- __publicField$3(UsersOAuthAuthorizationCode, "__smrtPackage__", "@happyvertical/smrt-users");
1131
- __decorateClass$3([field({
1132
- nullable: true,
1133
- indexed: true
1134
- })], UsersOAuthAuthorizationCode.prototype, "authorizationId", 2);
1135
- __decorateClass$3([field({
1136
- type: "text",
1137
- required: true,
1138
- unique: true,
1139
- sensitive: true
1140
- })], UsersOAuthAuthorizationCode.prototype, "codeHash", 2);
1141
- __decorateClass$3([field({
1142
- type: "text",
1143
- indexed: true
1144
- })], UsersOAuthAuthorizationCode.prototype, "clientId", 2);
1145
- __decorateClass$3([field({
1146
- type: "text",
1147
- indexed: true
1148
- })], UsersOAuthAuthorizationCode.prototype, "subject", 2);
1149
- __decorateClass$3([field({
1150
- nullable: true,
1151
- indexed: true
1152
- })], UsersOAuthAuthorizationCode.prototype, "tenantId", 2);
1153
- __decorateClass$3([field({ nullable: true })], UsersOAuthAuthorizationCode.prototype, "resource", 2);
1154
- __decorateClass$3([field({
1155
- type: "datetime",
1156
- indexed: true
1157
- })], UsersOAuthAuthorizationCode.prototype, "expiresAt", 2);
1158
- __decorateClass$3([field({
1159
- type: "datetime",
1160
- nullable: true
1161
- })], UsersOAuthAuthorizationCode.prototype, "consumedAt", 2);
1162
- UsersOAuthAuthorizationCode = __decorateClass$3([smrt({
1163
- tableName: "users_oauth_authorization_codes",
1164
- sensitive: true,
1165
- api: { include: [] },
1166
- mcp: { include: [] },
1167
- cli: false
1168
- })], UsersOAuthAuthorizationCode);
1169
- var UsersOAuthRefreshGrant = class extends SmrtObject {
1170
- authorizationId = null;
1171
- tokenHash = "";
1172
- familyId = "";
1173
- clientId = "";
1174
- subject = "";
1175
- tenantId = null;
1176
- claims = "{}";
1177
- scopes = "[]";
1178
- resource = null;
1179
- expiresAt = /* @__PURE__ */ new Date();
1180
- consumedAt = null;
1181
- revokedAt = null;
1182
- getScopes() {
1183
- return stringArray(this.scopes);
1184
- }
1185
- getClaims() {
1186
- return tokenClaims(this.claims);
1187
- }
1188
- };
1189
- __publicField$3(UsersOAuthRefreshGrant, "__smrtPackage__", "@happyvertical/smrt-users");
1190
- __decorateClass$3([field({
1191
- nullable: true,
1192
- indexed: true
1193
- })], UsersOAuthRefreshGrant.prototype, "authorizationId", 2);
1194
- __decorateClass$3([field({
1195
- type: "text",
1196
- required: true,
1197
- unique: true,
1198
- sensitive: true
1199
- })], UsersOAuthRefreshGrant.prototype, "tokenHash", 2);
1200
- __decorateClass$3([field({
1201
- type: "text",
1202
- indexed: true
1203
- })], UsersOAuthRefreshGrant.prototype, "familyId", 2);
1204
- __decorateClass$3([field({
1205
- type: "text",
1206
- indexed: true
1207
- })], UsersOAuthRefreshGrant.prototype, "clientId", 2);
1208
- __decorateClass$3([field({
1209
- type: "text",
1210
- indexed: true
1211
- })], UsersOAuthRefreshGrant.prototype, "subject", 2);
1212
- __decorateClass$3([field({
1213
- nullable: true,
1214
- indexed: true
1215
- })], UsersOAuthRefreshGrant.prototype, "tenantId", 2);
1216
- __decorateClass$3([field({ nullable: true })], UsersOAuthRefreshGrant.prototype, "resource", 2);
1217
- __decorateClass$3([field({
1218
- type: "datetime",
1219
- indexed: true
1220
- })], UsersOAuthRefreshGrant.prototype, "expiresAt", 2);
1221
- __decorateClass$3([field({
1222
- type: "datetime",
1223
- nullable: true
1224
- })], UsersOAuthRefreshGrant.prototype, "consumedAt", 2);
1225
- __decorateClass$3([field({
1226
- type: "datetime",
1227
- nullable: true,
1228
- indexed: true
1229
- })], UsersOAuthRefreshGrant.prototype, "revokedAt", 2);
1230
- UsersOAuthRefreshGrant = __decorateClass$3([smrt({
1231
- tableName: "users_oauth_refresh_grants",
1232
- sensitive: true,
1233
- api: { include: [] },
1234
- mcp: { include: [] },
1235
- cli: false
1236
- })], UsersOAuthRefreshGrant);
1237
- var UsersOAuthAccessTokenRevocation = class extends SmrtObject {
1238
- jti = "";
1239
- expiresAt = /* @__PURE__ */ new Date();
1240
- };
1241
- __publicField$3(UsersOAuthAccessTokenRevocation, "__smrtPackage__", "@happyvertical/smrt-users");
1242
- __decorateClass$3([field({
1243
- type: "text",
1244
- required: true,
1245
- unique: true,
1246
- sensitive: true
1247
- })], UsersOAuthAccessTokenRevocation.prototype, "jti", 2);
1248
- __decorateClass$3([field({
1249
- type: "datetime",
1250
- indexed: true
1251
- })], UsersOAuthAccessTokenRevocation.prototype, "expiresAt", 2);
1252
- UsersOAuthAccessTokenRevocation = __decorateClass$3([smrt({
1253
- tableName: "users_oauth_access_token_revocations",
1254
- sensitive: true,
1255
- api: { include: [] },
1256
- mcp: { include: [] },
1257
- cli: false
1258
- })], UsersOAuthAccessTokenRevocation);
1259
- var UsersOAuthAuthorization = class extends SmrtObject {
1260
- subject = "";
1261
- sessionId = "";
1262
- clientId = "";
1263
- tenantId = null;
1264
- scopes = "[]";
1265
- permissionCeiling = "[]";
1266
- resource = null;
1267
- revokedAt = null;
1268
- getPermissionCeiling() {
1269
- return stringArray(this.permissionCeiling);
1270
- }
1271
- getScopes() {
1272
- return stringArray(this.scopes);
1273
- }
1274
- };
1275
- __publicField$3(UsersOAuthAuthorization, "__smrtPackage__", "@happyvertical/smrt-users");
1276
- __decorateClass$3([field({
1277
- type: "text",
1278
- indexed: true
1279
- })], UsersOAuthAuthorization.prototype, "subject", 2);
1280
- __decorateClass$3([field({
1281
- type: "text",
1282
- sensitive: true
1283
- })], UsersOAuthAuthorization.prototype, "sessionId", 2);
1284
- __decorateClass$3([field({
1285
- type: "text",
1286
- indexed: true
1287
- })], UsersOAuthAuthorization.prototype, "clientId", 2);
1288
- __decorateClass$3([field({ nullable: true })], UsersOAuthAuthorization.prototype, "tenantId", 2);
1289
- __decorateClass$3([field({ nullable: true })], UsersOAuthAuthorization.prototype, "resource", 2);
1290
- __decorateClass$3([field({
1291
- type: "datetime",
1292
- nullable: true
1293
- })], UsersOAuthAuthorization.prototype, "revokedAt", 2);
1294
- UsersOAuthAuthorization = __decorateClass$3([smrt({
1295
- tableName: "users_oauth_authorizations",
1296
- sensitive: true,
1297
- api: { include: [] },
1298
- mcp: { include: [] },
1299
- cli: false
1300
- })], UsersOAuthAuthorization);
1301
- var UsersOAuthRefreshFamily = class extends SmrtObject {
1302
- authorizationId = null;
1303
- revokedAt = null;
1304
- };
1305
- __publicField$3(UsersOAuthRefreshFamily, "__smrtPackage__", "@happyvertical/smrt-users");
1306
- __decorateClass$3([field({
1307
- nullable: true,
1308
- indexed: true
1309
- })], UsersOAuthRefreshFamily.prototype, "authorizationId", 2);
1310
- __decorateClass$3([field({
1311
- type: "datetime",
1312
- nullable: true
1313
- })], UsersOAuthRefreshFamily.prototype, "revokedAt", 2);
1314
- UsersOAuthRefreshFamily = __decorateClass$3([smrt({
1315
- tableName: "users_oauth_refresh_families",
1316
- sensitive: true,
1317
- api: { include: [] },
1318
- mcp: { include: [] },
1319
- cli: false
1320
- })], UsersOAuthRefreshFamily);
1321
- var UsersOAuthAuthorizationCodeCollection = class extends SmrtCollection {
1322
- static _itemClass = UsersOAuthAuthorizationCode;
1323
- async consume(id, codeHash, clientId, redirectUri, resource, now) {
1324
- return (await this.db.query(`UPDATE ${this.tableName} SET consumed_at = ?, updated_at = ? WHERE id = ? AND code_hash = ? AND client_id = ? AND redirect_uri = ? AND ${resource === null ? "resource IS NULL" : "resource = ?"} AND consumed_at IS NULL AND expires_at > ?`, now.toISOString(), now.toISOString(), id, codeHash, clientId, redirectUri, ...resource === null ? [] : [resource], now.toISOString())).rowCount === 1;
1325
- }
1326
- };
1327
- var UsersOAuthRefreshGrantCollection = class extends SmrtCollection {
1328
- static _itemClass = UsersOAuthRefreshGrant;
1329
- async consume(id, tokenHash, clientId, resource, now) {
1330
- return (await this.db.query(`UPDATE ${this.tableName} SET consumed_at = ?, updated_at = ? WHERE id = ? AND token_hash = ? AND client_id = ? AND ${resource === null ? "resource IS NULL" : "resource = ?"} AND consumed_at IS NULL AND revoked_at IS NULL AND expires_at > ?`, now.toISOString(), now.toISOString(), id, tokenHash, clientId, ...resource === null ? [] : [resource], now.toISOString())).rowCount === 1;
1331
- }
1332
- async revokeFamily(familyId, now) {
1333
- await this.db.query(`UPDATE ${this.tableName} SET revoked_at = ?, updated_at = ? WHERE family_id = ? AND revoked_at IS NULL`, now.toISOString(), now.toISOString(), familyId);
1334
- }
1335
- };
1336
- var UsersOAuthAccessTokenRevocationCollection = class extends SmrtCollection {
1337
- static _itemClass = UsersOAuthAccessTokenRevocation;
1338
- async findByJti(jti) {
1339
- const result = await this.db.query(`SELECT id FROM ${this.tableName} WHERE jti = ?`, jti);
1340
- return result.rows[0] ? this.get(String(result.rows[0].id)) : null;
1341
- }
1342
- };
1343
- var UsersOAuthRefreshFamilyCollection = class extends SmrtCollection {
1344
- static _itemClass = UsersOAuthRefreshFamily;
1345
- async lock(id, now) {
1346
- return (await this.db.query(`UPDATE ${this.tableName} SET updated_at = ? WHERE id = ?`, now.toISOString(), id)).rowCount === 1;
1347
- }
1348
- async revoke(id, now) {
1349
- await this.db.query(`UPDATE ${this.tableName} SET revoked_at = ?, updated_at = ? WHERE id = ?`, now.toISOString(), now.toISOString(), id);
1350
- }
1351
- };
1352
- async function withOAuthTransaction(db, action) {
1353
- if (!db.transaction) throw new Error("OAuth persistence requires transaction support.");
1354
- for (let attempt = 0;; attempt++) try {
1355
- return await db.transaction(action);
1356
- } catch (error) {
1357
- let current = error;
1358
- let retryable = false;
1359
- let invalidated = false;
1360
- for (let depth = 0; depth < 4 && current && typeof current === "object"; depth++) {
1361
- const failure = current;
1362
- if ([
1363
- "SQLITE_BUSY",
1364
- "SQLITE_BUSY_SNAPSHOT",
1365
- "40001",
1366
- "40P01"
1367
- ].includes(String(failure.code))) retryable = true;
1368
- invalidated ||= failure.connectionInvalidated === true;
1369
- current = failure.cause;
1370
- }
1371
- if (attempt >= 6 || !retryable || invalidated) throw error;
1372
- await setTimeout(5 * 2 ** attempt);
1373
- }
1374
- }
1375
- var OAUTH_REFRESH_REPLAY_RETENTION_MS = 720 * 60 * 60 * 1e3;
1376
- async function pruneOAuthCredentials(db, options = {}) {
1377
- const now = options.now ?? /* @__PURE__ */ new Date();
1378
- const cutoff = (/* @__PURE__ */ new Date(now.getTime() - OAUTH_REFRESH_REPLAY_RETENTION_MS)).toISOString();
1379
- const codes = await UsersOAuthAuthorizationCodeCollection.create({ db });
1380
- const revocations = await UsersOAuthAccessTokenRevocationCollection.create({ db });
1381
- const grants = await UsersOAuthRefreshGrantCollection.create({ db });
1382
- const families = await UsersOAuthRefreshFamilyCollection.create({ db });
1383
- let total = 0;
1384
- for (const table of [codes.tableName, revocations.tableName]) {
1385
- const prune = async (tx) => {
1386
- if (!options.dryRun) return (await tx.query(`DELETE FROM ${table} WHERE expires_at < ? RETURNING id`, now.toISOString())).rows.length;
1387
- const counted = await tx.query(`SELECT COUNT(*) AS total FROM ${table} WHERE expires_at < ?`, now.toISOString());
1388
- return Number(counted.rows[0]?.total ?? 0);
1389
- };
1390
- total += options.dryRun ? await prune(db) : await withOAuthTransaction(db, prune);
1391
- }
1392
- const candidates = await db.query(`SELECT id FROM ${families.tableName} f WHERE EXISTS (SELECT 1 FROM ${grants.tableName} g WHERE g.family_id = CAST(f.id AS TEXT) AND g.expires_at < ?) OR NOT EXISTS (SELECT 1 FROM ${grants.tableName} g WHERE g.family_id = CAST(f.id AS TEXT)) ORDER BY id`, cutoff);
1393
- for (const candidate of candidates.rows) {
1394
- const id = String(candidate.id);
1395
- const prune = async (tx) => {
1396
- if (!options.dryRun) {
1397
- if ((await tx.query(`UPDATE ${families.tableName} SET updated_at = ? WHERE id = ?`, now.toISOString(), id)).rowCount !== 1) return 0;
1398
- }
1399
- const counted = await tx.query(`SELECT COUNT(*) AS total FROM ${grants.tableName} WHERE family_id = ? AND expires_at < ?`, id, cutoff);
1400
- const retained = await tx.query(`SELECT COUNT(*) AS total FROM ${grants.tableName} WHERE family_id = ? AND expires_at >= ?`, id, cutoff);
1401
- const empty = Number(retained.rows[0]?.total ?? 0) === 0;
1402
- if (!options.dryRun) {
1403
- await tx.query(`DELETE FROM ${grants.tableName} WHERE family_id = ? AND expires_at < ?`, id, cutoff);
1404
- if (empty) await tx.query(`DELETE FROM ${families.tableName} WHERE id = ?`, id);
1405
- }
1406
- return Number(counted.rows[0]?.total ?? 0) + Number(empty);
1407
- };
1408
- total += options.dryRun ? await prune(db) : await withOAuthTransaction(db, prune);
1409
- }
1410
- return total;
1411
- }
1412
- var SESSIONS_RETENTION_TASK = "users-sessions";
1413
- var MAGIC_LINK_RETENTION_TASK = "users-magic-link-tokens";
1414
- var CLI_AUTH_RETENTION_TASK = "users-cli-auth-requests";
1415
- var LOGIN_ATTEMPTS_RETENTION_TASK = "users-login-attempts";
1416
- var LOGIN_AUDIT_RETENTION_TASK = "users-login-audit-events";
1417
- var PASSKEY_CHALLENGES_RETENTION_TASK = "users-passkey-challenges";
1418
- var OAUTH_CREDENTIALS_RETENTION_TASK = "users-oauth-credentials";
1419
- function registerUserRetentionTasks() {
1420
- registerRetentionTask({
1421
- name: OAUTH_CREDENTIALS_RETENTION_TASK,
1422
- description: "Delete expired OAuth credentials after their replay window",
1423
- run: (db, context) => pruneOAuthCredentials(db, {
1424
- dryRun: context.dryRun,
1425
- now: context.now
1426
- })
1427
- });
1428
- registerRetentionTask({
1429
- name: SESSIONS_RETENTION_TASK,
1430
- description: "Delete expired and revoked sessions",
1431
- run: async (db, context) => {
1432
- return (await SessionCollection.create({ db })).deleteExpired({ dryRun: context.dryRun });
1433
- }
1434
- });
1435
- registerRetentionTask({
1436
- name: MAGIC_LINK_RETENTION_TASK,
1437
- description: "Delete expired magic-link tokens",
1438
- run: async (db, context) => {
1439
- return (await UsersMagicLinkTokenCollection.create({ db })).deleteExpired({ dryRun: context.dryRun });
1440
- }
1441
- });
1442
- registerRetentionTask({
1443
- name: CLI_AUTH_RETENTION_TASK,
1444
- description: "Delete expired pending, lazily-expired, and consumed CLI auth requests",
1445
- run: async (db, context) => {
1446
- return (await UsersCliAuthRequestCollection.create({ db })).deleteExpired({ dryRun: context.dryRun });
1447
- }
1448
- });
1449
- registerRetentionTask({
1450
- name: LOGIN_ATTEMPTS_RETENTION_TASK,
1451
- description: "Delete idle login-attempt limiter rows",
1452
- run: async (db, context) => {
1453
- return (await UsersLoginAttemptCollection.create({ db })).deleteIdle({ dryRun: context.dryRun });
1454
- }
1455
- });
1456
- registerRetentionTask({
1457
- name: PASSKEY_CHALLENGES_RETENTION_TASK,
1458
- description: "Delete consumed passkey challenges past their expiry",
1459
- run: async (db, context) => {
1460
- return (await UsersPasskeyChallengeCollection.create({ db })).deleteExpired({ dryRun: context.dryRun });
1461
- }
1462
- });
1463
- registerRetentionTask({
1464
- name: LOGIN_AUDIT_RETENTION_TASK,
1465
- description: `Delete login audit events older than 90 days`,
1466
- run: async (db, context) => {
1467
- return (await UsersLoginAuditEventCollection.create({ db })).deleteOlderThan(2160 * 60 * 60 * 1e3, { dryRun: context.dryRun });
1468
- }
1469
- });
1470
- }
1471
- var __defProp$2 = Object.defineProperty;
1472
- var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
1473
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, {
1474
- enumerable: true,
1475
- configurable: true,
1476
- writable: true,
1477
- value
1478
- }) : obj[key] = value;
1479
- var __decorateClass$2 = (decorators, target, key, kind) => {
1480
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2(target, key) : target;
1481
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1482
- if (kind && result) __defProp$2(target, key, result);
1483
- return result;
1484
- };
1485
- var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
1486
- var AccessRequest = class extends SmrtObject {
1487
- email = "";
1488
- name = null;
1489
- status = AccessRequestStatus.REQUESTED;
1490
- source = "";
1491
- requestContext = "{}";
1492
- note = null;
1493
- requestedAt = /* @__PURE__ */ new Date();
1494
- decidedAt = null;
1495
- decidedBy = null;
1496
- resultingUserId = null;
1497
- tenantHint = null;
1498
- constructor(options = {}) {
1499
- super(options);
1500
- if (options.email !== void 0) this.email = normalizeEmail(options.email);
1501
- if (options.name !== void 0) this.name = options.name;
1502
- if (options.status !== void 0) this.status = options.status;
1503
- if (options.source !== void 0) this.source = options.source;
1504
- if (options.requestContext !== void 0) this.requestContext = options.requestContext;
1505
- if (options.note !== void 0) this.note = options.note;
1506
- if (options.requestedAt !== void 0) this.requestedAt = options.requestedAt;
1507
- if (options.decidedAt !== void 0) this.decidedAt = options.decidedAt;
1508
- if (options.decidedBy !== void 0) this.decidedBy = options.decidedBy;
1509
- if (options.resultingUserId !== void 0) this.resultingUserId = options.resultingUserId;
1510
- if (options.tenantHint !== void 0) this.tenantHint = options.tenantHint;
1511
- }
1512
- /**
1513
- * Parse {@link requestContext} into an object. Returns `{}` on missing or
1514
- * malformed JSON (graceful — never throws).
1515
- */
1516
- getRequestContext() {
1517
- try {
1518
- const parsed = JSON.parse(this.requestContext);
1519
- return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
1520
- } catch {
1521
- return {};
1522
- }
1523
- }
1524
- /**
1525
- * Serialize and store {@link requestContext} from an object.
1526
- */
1527
- setRequestContext(value) {
1528
- this.requestContext = JSON.stringify(value ?? {});
1529
- }
1530
- /**
1531
- * Parse {@link tenantHint} into an object, or `null` when unset / malformed.
1532
- */
1533
- getTenantHint() {
1534
- if (!this.tenantHint) return null;
1535
- try {
1536
- const parsed = JSON.parse(this.tenantHint);
1537
- return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
1538
- } catch {
1539
- return null;
1540
- }
1541
- }
1542
- /**
1543
- * Serialize and store {@link tenantHint} from an object (or clear with null).
1544
- */
1545
- setTenantHint(value) {
1546
- this.tenantHint = value ? JSON.stringify(value) : null;
1547
- }
1548
- /**
1549
- * Whether the request is still open (awaiting a decision).
1550
- */
1551
- isOpen() {
1552
- return this.status === AccessRequestStatus.REQUESTED;
1553
- }
1554
- /**
1555
- * Whether the request has been approved (and not yet graduated).
1556
- */
1557
- isApproved() {
1558
- return this.status === AccessRequestStatus.APPROVED;
1559
- }
1560
- /**
1561
- * Whether the request reached a terminal state (declined, graduated, or
1562
- * canceled) and can no longer transition.
1563
- */
1564
- isTerminal() {
1565
- return this.status === AccessRequestStatus.DECLINED || this.status === AccessRequestStatus.GRADUATED || this.status === AccessRequestStatus.CANCELED;
1566
- }
1567
- };
1568
- __publicField$2(AccessRequest, "__smrtPackage__", "@happyvertical/smrt-users");
1569
- __decorateClass$2([field({
1570
- required: true,
1571
- indexed: true
1572
- })], AccessRequest.prototype, "email", 2);
1573
- __decorateClass$2([field({ nullable: true })], AccessRequest.prototype, "name", 2);
1574
- __decorateClass$2([field({
1575
- type: "text",
1576
- indexed: true
1577
- })], AccessRequest.prototype, "status", 2);
1578
- __decorateClass$2([field({ indexed: true })], AccessRequest.prototype, "source", 2);
1579
- __decorateClass$2([field()], AccessRequest.prototype, "requestContext", 2);
1580
- __decorateClass$2([field({ nullable: true })], AccessRequest.prototype, "note", 2);
1581
- __decorateClass$2([field()], AccessRequest.prototype, "requestedAt", 2);
1582
- __decorateClass$2([field({ nullable: true })], AccessRequest.prototype, "decidedAt", 2);
1583
- __decorateClass$2([field({ nullable: true })], AccessRequest.prototype, "decidedBy", 2);
1584
- __decorateClass$2([field({ nullable: true })], AccessRequest.prototype, "resultingUserId", 2);
1585
- __decorateClass$2([field({ nullable: true })], AccessRequest.prototype, "tenantHint", 2);
1586
- AccessRequest = __decorateClass$2([smrt({
1587
- tableName: "access_requests",
1588
- conflictColumns: ["id"],
1589
- api: { include: [] },
1590
- mcp: { include: [] },
1591
- cli: false
1592
- })], AccessRequest);
1593
- var __defProp$1 = Object.defineProperty;
1594
- var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
1595
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, {
1596
- enumerable: true,
1597
- configurable: true,
1598
- writable: true,
1599
- value
1600
- }) : obj[key] = value;
1601
- var __decorateClass$1 = (decorators, target, key, kind) => {
1602
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
1603
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1604
- if (kind && result) __defProp$1(target, key, result);
1605
- return result;
1606
- };
1607
- var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
1608
- var UsersCliAuthApproveLimit = class extends SmrtObject {
1609
- userId = "";
1610
- attemptCount = 0;
1611
- windowStartedAt = /* @__PURE__ */ new Date();
1612
- };
1613
- __publicField$1(UsersCliAuthApproveLimit, "__smrtPackage__", "@happyvertical/smrt-users");
1614
- __decorateClass$1([foreignKey("User", {
1615
- required: true,
1616
- unique: true
1617
- })], UsersCliAuthApproveLimit.prototype, "userId", 2);
1618
- __decorateClass$1([field({
1619
- type: "integer",
1620
- required: true,
1621
- default: 0
1622
- })], UsersCliAuthApproveLimit.prototype, "attemptCount", 2);
1623
- __decorateClass$1([field({
1624
- type: "datetime",
1625
- required: true
1626
- })], UsersCliAuthApproveLimit.prototype, "windowStartedAt", 2);
1627
- UsersCliAuthApproveLimit = __decorateClass$1([smrt({
1628
- tableName: "users_cli_auth_approve_limits",
1629
- api: false,
1630
- cli: false,
1631
- mcp: false
1632
- })], UsersCliAuthApproveLimit);
1633
- var __defProp = Object.defineProperty;
1634
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
1635
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
1636
- enumerable: true,
1637
- configurable: true,
1638
- writable: true,
1639
- value
1640
- }) : obj[key] = value;
1641
- var __decorateClass = (decorators, target, key, kind) => {
1642
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
1643
- for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1644
- if (kind && result) __defProp(target, key, result);
1645
- return result;
1646
- };
1647
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1648
- function parseExternalIds(raw) {
1649
- if (!raw) return {};
1650
- if (typeof raw === "object" && !Array.isArray(raw)) return Object.fromEntries(Object.entries(raw).filter(([, value]) => typeof value === "string"));
1651
- if (typeof raw !== "string") return {};
1652
- try {
1653
- const parsed = JSON.parse(raw);
1654
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return {};
1655
- return Object.fromEntries(Object.entries(parsed).filter(([, value]) => typeof value === "string"));
1656
- } catch {
1657
- return {};
1658
- }
1659
- }
1660
- function stringifyExternalIds(externalIds) {
1661
- for (const [key, value] of Object.entries(externalIds)) if (typeof value !== "string") throw new TypeError(`TenantIntegration external id '${key}' must be a string`);
1662
- return JSON.stringify(externalIds);
1663
- }
1664
- function parseCheckSummary(raw) {
1665
- if (!raw) return [];
1666
- if (Array.isArray(raw)) return normalizeCheckSummary(raw);
1667
- if (typeof raw !== "string") return [];
1668
- try {
1669
- const parsed = JSON.parse(raw);
1670
- return Array.isArray(parsed) ? normalizeCheckSummary(parsed) : [];
1671
- } catch {
1672
- return [];
1673
- }
1674
- }
1675
- function normalizeCheckSummary(raw) {
1676
- return raw.filter((entry) => !!entry && typeof entry === "object" && !Array.isArray(entry)).map((entry) => ({
1677
- name: typeof entry.name === "string" ? entry.name : "",
1678
- ok: entry.ok === true,
1679
- ...typeof entry.message === "string" ? { message: entry.message } : {}
1680
- })).filter((entry) => entry.name.length > 0);
1681
- }
1682
- function stringifyCheckSummary(summary) {
1683
- return JSON.stringify(summary);
1684
- }
1685
- var TenantIntegration = class extends SmrtObject {
1686
- tenantId = "";
1687
- /**
1688
- * Provider identifier, such as `aws`, `matomo`, `glitchtip`, or an
1689
- * app-defined provider string.
1690
- */
1691
- provider = "aws";
1692
- /**
1693
- * Provider-side identifiers. Shape depends on the provider. This must not
1694
- * contain provider credentials or secret material.
1695
- */
1696
- externalIds = "{}";
1697
- /**
1698
- * Current provisioning/health status.
1699
- */
1700
- status = "unprovisioned";
1701
- /**
1702
- * UTC timestamp of the most recent doctor/provisioning check.
1703
- */
1704
- lastCheckedAt = null;
1705
- /**
1706
- * Per-check pass/fail summary from the most recent doctor run.
1707
- */
1708
- lastCheckSummary = "[]";
1709
- /**
1710
- * Most recent error message when `status === 'failed'`, or null otherwise.
1711
- */
1712
- lastError = null;
1713
- constructor(options = {}) {
1714
- super(options);
1715
- if (options.tenantId !== void 0) this.tenantId = options.tenantId;
1716
- if (options.provider !== void 0) this.provider = options.provider;
1717
- if (options.externalIds !== void 0) this.setExternalIds(options.externalIds);
1718
- if (options.status !== void 0) this.status = options.status;
1719
- if (options.lastCheckedAt !== void 0) this.lastCheckedAt = options.lastCheckedAt;
1720
- if (options.lastCheckSummary !== void 0) this.setLastCheckSummary(options.lastCheckSummary);
1721
- if (options.lastError !== void 0) this.lastError = options.lastError;
1722
- }
1723
- async initialize() {
1724
- await super.initialize();
1725
- this.normalizeJsonFields();
1726
- return this;
1727
- }
1728
- normalizeJsonFields() {
1729
- const fields = this;
1730
- if (fields.externalIds == null) this.externalIds = "{}";
1731
- else if (typeof fields.externalIds !== "string") this.setExternalIds(fields.externalIds);
1732
- if (fields.lastCheckSummary == null) this.lastCheckSummary = "[]";
1733
- else if (typeof fields.lastCheckSummary !== "string") this.setLastCheckSummary(fields.lastCheckSummary);
1734
- }
1735
- getExternalIds() {
1736
- return parseExternalIds(this.externalIds);
1737
- }
1738
- setExternalIds(externalIds) {
1739
- this.externalIds = typeof externalIds === "string" ? externalIds : stringifyExternalIds(externalIds);
1740
- }
1741
- getExternalId(key) {
1742
- const value = this.getExternalIds()[key];
1743
- return typeof value === "string" && value.length > 0 ? value : void 0;
1744
- }
1745
- setExternalId(key, value) {
1746
- const externalIds = this.getExternalIds();
1747
- if (value === void 0) delete externalIds[key];
1748
- else externalIds[key] = value;
1749
- this.setExternalIds(externalIds);
1750
- }
1751
- getLastCheckSummary() {
1752
- return parseCheckSummary(this.lastCheckSummary);
1753
- }
1754
- setLastCheckSummary(summary) {
1755
- this.lastCheckSummary = typeof summary === "string" ? summary : stringifyCheckSummary(summary);
1756
- }
1757
- recordDoctorRun(outcome) {
1758
- this.status = outcome.status;
1759
- this.setLastCheckSummary(outcome.summary);
1760
- this.lastCheckedAt = /* @__PURE__ */ new Date();
1761
- this.lastError = outcome.error ?? null;
1762
- }
1763
- };
1764
- __publicField(TenantIntegration, "__smrtPackage__", "@happyvertical/smrt-users");
1765
- __decorateClass([tenantId()], TenantIntegration.prototype, "tenantId", 2);
1766
- TenantIntegration = __decorateClass([TenantScoped({ mode: "required" }), smrt({
1767
- tableName: "tenant_integrations",
1768
- conflictColumns: ["tenant_id", "provider"],
1769
- api: { include: ["list", "get"] },
1770
- mcp: { include: ["list", "get"] },
1771
- cli: { include: ["list", "get"] }
1772
- })], TenantIntegration);
1773
- var effectIs = (value) => `CAST(effect AS TEXT) IN ('${value}', '"${value}"')`;
1774
- `${effectIs("deny")}`, `${effectIs("deny")}${effectIs("grant")}`;
1775
- var TenantHierarchyMaterializationError = class extends Error {
1776
- constructor(problems) {
1777
- super(`Cannot materialize the tenant hierarchy: ${problems.length} tenant(s) have a broken parent chain. ` + problems.map((problem) => problem.message).join(" "));
1778
- this.problems = problems;
1779
- this.name = "TenantHierarchyMaterializationError";
1780
- }
1781
- problems;
1782
- };
1783
- function toRow(row) {
1784
- const id = row.id === null || row.id === void 0 ? "" : String(row.id);
1785
- if (!id) throw new Error("Tenant hierarchy backfill found a row without an id.");
1786
- const parent = row.parent_tenant_id === null || row.parent_tenant_id === void 0 ? null : String(row.parent_tenant_id);
1787
- const level = row.hierarchy_level === null || row.hierarchy_level === void 0 ? null : Number(row.hierarchy_level);
1788
- return {
1789
- id,
1790
- parentTenantId: parent === "" ? null : parent,
1791
- hierarchyPath: row.hierarchy_path === null || row.hierarchy_path === void 0 ? null : String(row.hierarchy_path),
1792
- hierarchyLevel: Number.isFinite(level) ? level : null
1793
- };
1794
- }
1795
- async function planFrom(db, table) {
1796
- const { rows } = await db.query(`SELECT id, parent_tenant_id, hierarchy_path, hierarchy_level FROM ${table} ORDER BY id`);
1797
- return planTenantHierarchy(rows.map(toRow));
1798
- }
1799
- async function materializeTenantHierarchy(db, options = {}) {
1800
- const table = assertTenantTableName(options.tableName ?? "tenants");
1801
- if (options.dryRun) return {
1802
- ...await planFrom(db, table),
1803
- applied: false
1804
- };
1805
- const run = async (handle) => {
1806
- const plan = await planFrom(handle, table);
1807
- if (plan.problems.length > 0) throw new TenantHierarchyMaterializationError(plan.problems);
1808
- await applyTenantHierarchyUpdates(handle, table, plan.changes);
1809
- return {
1810
- ...plan,
1811
- applied: true
1812
- };
1813
- };
1814
- if (!db.transaction) throw new Error("Tenant hierarchy materialization requires a database with transaction(); no changes were made.");
1815
- const result = await db.transaction((tx) => run(tx));
1816
- if (result.changes.length > 0) await recordTenantHierarchyChanges(db, table);
1817
- return result;
1818
- }
1819
- new Set([
1820
- "users.email_key",
1821
- "users.username_key",
1822
- "users.status",
1823
- "memberships.user_id",
1824
- "memberships.tenant_id",
1825
- "memberships.role_id",
1826
- "memberships.status",
1827
- "sessions.id",
1828
- "sessions.user_id",
1829
- "sessions.tenant_id",
1830
- "sessions.status",
1831
- "sessions.expires_at",
1832
- "sessions.auth_method",
1833
- "sessions.parent_session_id",
1834
- "users_password_credentials.user_id",
1835
- "users_password_credentials.password_hash",
1836
- "users_password_credentials.version",
1837
- "users_password_credentials.must_change",
1838
- "users_password_credentials.rotated_at",
1839
- "users_password_credentials.rotated_by",
1840
- "users_login_attempts.id",
1841
- "users_login_audit_events.id"
1842
- ].map((column) => column.split(".")[0]));
1843
- createLogger({ level: "info" });
1844
- AccessRequestStatus.REQUESTED;
1845
- AccessRequestStatus.REQUESTED, AccessRequestStatus.APPROVED;
1846
- AccessRequestStatus.REQUESTED, AccessRequestStatus.APPROVED;
1847
- registerUserRetentionTasks();
1848
- //#endregion
1849
- export { TenantHierarchyMaterializationError, materializeTenantHierarchy };