@happyvertical/smrt-users 0.40.70 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +6 -0
- package/dist/chunks/{TerminalAuthService-C1PVcd6q.js → TerminalAuthService-BfX2Ujqe.js} +664 -643
- package/dist/chunks/TerminalAuthService-BfX2Ujqe.js.map +1 -0
- package/dist/collections/CliAuthRequestCollection.d.ts +10 -1
- package/dist/collections/CliAuthRequestCollection.d.ts.map +1 -1
- package/dist/collections/MagicLinkTokenCollection.d.ts +10 -1
- package/dist/collections/MagicLinkTokenCollection.d.ts.map +1 -1
- package/dist/collections/SessionCollection.d.ts +10 -2
- package/dist/collections/SessionCollection.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +149 -101
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +390 -205
- package/dist/models/CliAuthRequest.d.ts +18 -3
- package/dist/models/CliAuthRequest.d.ts.map +1 -1
- package/dist/models/MagicLinkToken.d.ts +6 -1
- package/dist/models/MagicLinkToken.d.ts.map +1 -1
- package/dist/models/Session.d.ts +3 -0
- package/dist/models/Session.d.ts.map +1 -1
- package/dist/models/User.d.ts +7 -1
- package/dist/models/User.d.ts.map +1 -1
- package/dist/retention.d.ts +47 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +22 -5
- package/dist/sveltekit.js +1 -1
- package/package.json +9 -9
- package/dist/chunks/TerminalAuthService-C1PVcd6q.js.map +0 -1
|
@@ -12,8 +12,17 @@ export declare class UsersCliAuthRequestCollection extends SmrtCollection<UsersC
|
|
|
12
12
|
findByDeviceCodeHash(deviceCodeHash: string): Promise<UsersCliAuthRequest | null>;
|
|
13
13
|
/**
|
|
14
14
|
* Delete expired pending requests (cleanup job).
|
|
15
|
+
*
|
|
16
|
+
* Scheduled by the framework retention sweep (#2375); `expiresAt` carries an
|
|
17
|
+
* index for this predicate.
|
|
18
|
+
*
|
|
19
|
+
* @param options.dryRun - Count the requests the predicate selects without
|
|
20
|
+
* deleting them.
|
|
21
|
+
* @returns Number of requests deleted (or, under `dryRun`, matched)
|
|
15
22
|
*/
|
|
16
|
-
deleteExpired(
|
|
23
|
+
deleteExpired(options?: {
|
|
24
|
+
dryRun?: boolean;
|
|
25
|
+
}): Promise<number>;
|
|
17
26
|
}
|
|
18
27
|
export { UsersCliAuthRequestCollection as CliAuthRequestCollection };
|
|
19
28
|
//# sourceMappingURL=CliAuthRequestCollection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CliAuthRequestCollection.d.ts","sourceRoot":"","sources":["../../src/collections/CliAuthRequestCollection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,qBAAa,6BAA8B,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACpF,MAAM,CAAC,QAAQ,CAAC,UAAU,6BAAuB;IAEjD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAQ3E;;OAEG;IACG,oBAAoB,CACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAQtC
|
|
1
|
+
{"version":3,"file":"CliAuthRequestCollection.d.ts","sourceRoot":"","sources":["../../src/collections/CliAuthRequestCollection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,qBAAa,6BAA8B,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACpF,MAAM,CAAC,QAAQ,CAAC,UAAU,6BAAuB;IAEjD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAQ3E;;OAEG;IACG,oBAAoB,CACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAQtC;;;;;;;;;OASG;IACG,aAAa,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAwBzE;AAED,OAAO,EAAE,6BAA6B,IAAI,wBAAwB,EAAE,CAAC"}
|
|
@@ -19,8 +19,17 @@ export declare class UsersMagicLinkTokenCollection extends SmrtCollection<UsersM
|
|
|
19
19
|
markUsed(nonce: string): Promise<boolean>;
|
|
20
20
|
/**
|
|
21
21
|
* Delete expired tokens (cleanup job)
|
|
22
|
+
*
|
|
23
|
+
* Scheduled by the framework retention sweep (#2375); `expiresAt` carries an
|
|
24
|
+
* index for this predicate.
|
|
25
|
+
*
|
|
26
|
+
* @param options.dryRun - Count the tokens the predicate selects without
|
|
27
|
+
* deleting them.
|
|
28
|
+
* @returns Number of tokens deleted (or, under `dryRun`, matched)
|
|
22
29
|
*/
|
|
23
|
-
deleteExpired(
|
|
30
|
+
deleteExpired(options?: {
|
|
31
|
+
dryRun?: boolean;
|
|
32
|
+
}): Promise<number>;
|
|
24
33
|
}
|
|
25
34
|
export { UsersMagicLinkTokenCollection as MagicLinkTokenCollection };
|
|
26
35
|
//# sourceMappingURL=MagicLinkTokenCollection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MagicLinkTokenCollection.d.ts","sourceRoot":"","sources":["../../src/collections/MagicLinkTokenCollection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACpF,MAAM,CAAC,QAAQ,CAAC,UAAU,6BAAuB;IAEjD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAMrE;;;;;;OAMG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB/C
|
|
1
|
+
{"version":3,"file":"MagicLinkTokenCollection.d.ts","sourceRoot":"","sources":["../../src/collections/MagicLinkTokenCollection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACpF,MAAM,CAAC,QAAQ,CAAC,UAAU,6BAAuB;IAEjD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAMrE;;;;;;OAMG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB/C;;;;;;;;;OASG;IACG,aAAa,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAwBzE;AAED,OAAO,EAAE,6BAA6B,IAAI,wBAAwB,EAAE,CAAC"}
|
|
@@ -53,9 +53,17 @@ export declare class SessionCollection extends SmrtCollection<Session> {
|
|
|
53
53
|
revokeSession(sessionId: string): Promise<boolean>;
|
|
54
54
|
/**
|
|
55
55
|
* Delete expired sessions (cleanup job)
|
|
56
|
-
*
|
|
56
|
+
*
|
|
57
|
+
* Scheduled by the framework retention sweep (#2375); `expires_at` carries
|
|
58
|
+
* an index for this predicate.
|
|
59
|
+
*
|
|
60
|
+
* @param options.dryRun - Count the sessions the predicate selects without
|
|
61
|
+
* deleting them.
|
|
62
|
+
* @returns Number of sessions deleted (or, under `dryRun`, matched)
|
|
57
63
|
*/
|
|
58
|
-
deleteExpired(
|
|
64
|
+
deleteExpired(options?: {
|
|
65
|
+
dryRun?: boolean;
|
|
66
|
+
}): Promise<number>;
|
|
59
67
|
/**
|
|
60
68
|
* Count active sessions for a user
|
|
61
69
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionCollection.d.ts","sourceRoot":"","sources":["../../src/collections/SessionCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAGL,OAAO,EACR,MAAM,sBAAsB,CAAC;AAG9B;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,OAAO,CAAC;IAC5D,MAAM,CAAC,QAAQ,CAAC,UAAU,iBAAW;IAErC;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBpE;;;OAGG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA8BlE;;OAEG;IACG,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,OAAe,EAC1B,GAAG,GAAE,MAA4B,GAChC,OAAO,CAAC,OAAO,CAAC;IAYnB;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAapD;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAczD;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBzD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASxD
|
|
1
|
+
{"version":3,"file":"SessionCollection.d.ts","sourceRoot":"","sources":["../../src/collections/SessionCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAGL,OAAO,EACR,MAAM,sBAAsB,CAAC;AAG9B;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,OAAO,CAAC;IAC5D,MAAM,CAAC,QAAQ,CAAC,UAAU,iBAAW;IAErC;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBpE;;;OAGG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA8BlE;;OAEG;IACG,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,OAAe,EAC1B,GAAG,GAAE,MAA4B,GAChC,OAAO,CAAC,OAAO,CAAC;IAYnB;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAapD;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAczD;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBzD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASxD;;;;;;;;;OASG;IACG,aAAa,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BxE;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKxD;;;;;;;;OAQG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,OAAO,CAAC;IASnB;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,OAAO,CAAC;IASnB;;OAEG;IACG,cAAc,CAAC,CAAC,EACpB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CAM1B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { AccessRequestCollection, CliAuthRequestCollection, type CreateChildTenantOptions, type CreateSessionOptions, DEFAULT_ROLE_PERMISSION_PATTERNS, type GetOrCreateFromOidcOptions, GroupCollection, GroupMemberCollection, GroupRoleCollection, MagicLinkTokenCollection, MembershipCollection, MembershipOverrideCollection, type NormalizedOidcClaims, type OidcClaims, type OidcIdentityResult, type OidcProfileOwnerAuthorization, type OidcProfileOwnerAuthorizer, type OidcProfileOwnerAuthorizerContext, type OidcProfileResolver, type OidcProfileResolverContext, OidcProvisioningError, type OidcProvisioningErrorCode, PermissionCollection, RoleCollection, RolePermissionCollection, type RolePermissionPatternMatrix, type SeedRolePermissionsOptions, type SeedRolePermissionsResult, type SeedSystemRolesOptions, SessionCollection, TenantCollection, TenantHierarchyError, TenantIntegrationCollection, TenantPermissionOverrideCollection, type TenantPermissionOverrideResult, UserCollection, UsersCliAuthRequestCollection, UsersMagicLinkTokenCollection, } from './collections/index.js';
|
|
2
2
|
export { type BackfillUserEmailKeysResult, backfillUserEmailKeys, type DuplicateUserEmailKey, UserEmailKeyBackfillError, type UserEmailKeyBackfillErrorCode, } from './migrations/backfillUserEmailKeys.js';
|
|
3
3
|
export { AccessRequest, type AccessRequestOptions, CliAuthRequest, type CliAuthRequestStatus, DEFAULT_SESSION_TTL, DEFAULT_TOKEN_EXPIRY_SECONDS, Group, GroupMember, GroupRole, generateSessionId, MAX_TENANT_HIERARCHY_DEPTH, MagicLinkToken, Membership, MembershipOverride, Permission, Role, RolePermission, Session, Tenant, TenantIntegration, type TenantIntegrationCheckSummary, type TenantIntegrationOptions, type TenantIntegrationProvider, type TenantIntegrationStatus, TenantPermissionOverride, User, UsersCliAuthRequest, UsersMagicLinkToken, } from './models/index.js';
|
|
4
|
+
export { CLI_AUTH_RETENTION_TASK, MAGIC_LINK_RETENTION_TASK, registerUserRetentionTasks, SESSIONS_RETENTION_TASK, USER_RETENTION_TASKS, unregisterUserRetentionTasks, } from './retention.js';
|
|
4
5
|
export { ACCESS_REQUEST_CAPABILITIES, type AccessRequestAuthorizationContext, type AccessRequestAuthorizer, type AccessRequestCapability, AccessRequestError, type AccessRequestErrorCode, type AccessRequestEvent, type AccessRequestEventHandler, type AccessRequestEventType, AccessRequestService, type AccessRequestServiceOptions, type ApproveAccessRequestOptions, type ApproveCliAuthRequestInput, applyPostgresPermissionPolicies, assertOperationPermission, type CancelAccessRequestOptions, type CliAuthStartResult, type CliAuthTokenResult, type CreateAccessRequestInput, type CreateAuthorizationUrlOptions, checkOperationPermission, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS, DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS, DEFAULT_CLI_SESSION_TTL_SECONDS, type DeclineAccessRequestOptions, decodeOidcTransaction, deriveOperationPermissionCollectionName, deriveOperationPermissionSlug, type EnsureTenantResult, encodeOidcTransaction, type GeneratePostgresPermissionSqlResult, type GraduateAccessRequestOptions, type GraduateAccessRequestResult, type GraduateExistingTenantOption, type GraduateNewTenantOption, type GraduateTenantOption, generatePostgresPermissionSql, getCurrentSessionPermissionContext, getRequestScopedDatabase, getUsersOidcConfig, hasOperationPermission, type ListAccessRequestsFilter, MagicLinkError, type MagicLinkResult, MagicLinkService, type MagicLinkServiceOptions, type MagicLinkVerifyResult, MobileAuthError, type MobileAuthErrorCode, MobileAuthService, type MobileAuthServiceOptions, type MobileBootstrapContext, type MobileLoginContext, type MobileLogoutResult, type MobileRequestMeta, type MobileResolvedUser, type MobileTenantContext, normalizeOperationPermissionAction, type OidcCallbackResult, OidcLoginError, type OidcLoginResult, OidcLoginService, type OidcLoginServiceOptions, type OidcProviderConfig, type OidcProviderKind, type OidcProviderMetadata, type OidcProviderResolution, type OidcProviderResolutionOptions, type OidcTokenEndpointAuthMethod, type OidcTokenSet, type OidcTransaction, type OperationPermissionAllowReason, type OperationPermissionCollectionInput, type OperationPermissionDecision, type OperationPermissionDenyReason, OperationPermissionError, type OperationPermissionOptions, type PermissionCatalog, PermissionCatalogService, type PermissionCatalogSource, type PermissionCatalogSyncResult, type PermissionDefinition, type PermissionResolutionOptions, type PermissionResolutionResult, PermissionResolver, type PostgresPermissionAction, type PostgresPermissionBinding, type PostgresPermissionPolicyReportItem, type PostgresPermissionPolicyTarget, type PrincipalPermissionRuntimeOptions, type ResolvedOidcProviderConfig, readMobileBearerToken, registerPermissionDefinitions, resolveOidcProviderConfig, type SessionContext, type SessionPermissionRuntimeContext, type SessionPermissionRuntimeOptions, SessionService, type SessionServiceOptions, type SwitchTenantResult, syncPermissionCatalog, type TenantPermissionInheritanceResult, TenantService, type TenantWithOwnershipResult, TerminalAuthError, TerminalAuthRateLimitError, TerminalAuthService, type TerminalAuthServiceOptions, type UsersConfig, type UsersOidcConfig, validateMobileRedirectUri, withPrincipalPermissionContext, withSessionPermissionContext, } from './services/index.js';
|
|
5
6
|
export { AccessRequestStatus, DEFAULT_ROLE_SLUGS, DEFAULT_ROLES, DEFAULT_TENANT_POLICY, type DefaultRoleSlug, MembershipStatus, OverrideEffect, SessionStatus, TenantPermissionEffect, type TenantPolicy, type TenantPolicyMode, TenantStatus, UserStatus, } from './types/index.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAKH,OAAO,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { $ as
|
|
2
|
-
import { ObjectRegistry, SmrtCollection, SmrtObject, field, findManifestEntryByQualifiedName, isUniqueViolationError, smrt } from "@happyvertical/smrt-core";
|
|
1
|
+
import { $ as MembershipCollection, A as UserEmailKeyBackfillError, B as PermissionCatalogService, C as decodeOidcTransaction, Ct as UserStatus, E as resolveOidcProviderConfig, F as TenantHierarchyError, G as syncPermissionCatalog, H as deriveOperationPermissionSlug, I as MAX_TENANT_HIERARCHY_DEPTH, J as Role, K as RolePermission, L as Tenant, M as TenantPermissionOverrideCollection, N as TenantPermissionOverride, O as OidcProvisioningError, P as TenantCollection, Q as MembershipOverride, R as DEFAULT_ROLE_PERMISSION_PATTERNS, S as OidcLoginService, St as TenantStatus, T as getUsersOidcConfig, Tt as UsersCliAuthRequest, U as normalizeOperationPermissionAction, V as deriveOperationPermissionCollectionName, W as registerPermissionDefinitions, X as Permission, Y as PermissionCollection, Z as MembershipOverrideCollection, _ as readMobileBearerToken, _t as DEFAULT_TENANT_POLICY, a as TerminalAuthRateLimitError, at as GroupCollection, b as PermissionResolver, bt as SessionStatus, c as assertOperationPermission, ct as isValidEmail, d as getCurrentSessionPermissionContext, dt as DEFAULT_SESSION_TTL, et as Membership, f as getRequestScopedDatabase, ft as Session, g as MobileAuthService, gt as DEFAULT_ROLE_SLUGS, h as MobileAuthError, ht as DEFAULT_ROLES, i as TerminalAuthError, it as GroupMember, j as backfillUserEmailKeys, k as UserCollection, l as checkOperationPermission, lt as normalizeEmail, m as withSessionPermissionContext, mt as AccessRequestStatus, n as DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS, nt as GroupRole, o as TerminalAuthService, ot as Group, p as withPrincipalPermissionContext, pt as generateSessionId, q as RoleCollection, r as DEFAULT_CLI_SESSION_TTL_SECONDS, rt as GroupMemberCollection, s as OperationPermissionError, st as User, t as DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS, tt as GroupRoleCollection, u as hasOperationPermission, ut as SessionCollection, v as validateMobileRedirectUri, vt as MembershipStatus, w as encodeOidcTransaction, wt as UsersCliAuthRequestCollection, x as OidcLoginError, xt as TenantPermissionEffect, y as SessionService, yt as OverrideEffect, z as RolePermissionCollection } from "./chunks/TerminalAuthService-BfX2Ujqe.js";
|
|
2
|
+
import { ObjectRegistry, SmrtCollection, SmrtObject, field, findManifestEntryByQualifiedName, isUniqueViolationError, registerRetentionTask, smrt, unregisterRetentionTask } from "@happyvertical/smrt-core";
|
|
3
3
|
import { TenantScoped, tenantId } from "@happyvertical/smrt-tenancy";
|
|
4
4
|
import { createLogger } from "@happyvertical/logger";
|
|
5
5
|
import { createHash } from "node:crypto";
|
|
6
|
-
//#region src/models/
|
|
6
|
+
//#region src/models/MagicLinkToken.ts
|
|
7
7
|
var __defProp$2 = Object.defineProperty;
|
|
8
8
|
var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
|
|
9
9
|
var __decorateClass$2 = (decorators, target, key, kind) => {
|
|
@@ -12,6 +12,134 @@ var __decorateClass$2 = (decorators, target, key, kind) => {
|
|
|
12
12
|
if (kind && result) __defProp$2(target, key, result);
|
|
13
13
|
return result;
|
|
14
14
|
};
|
|
15
|
+
var DEFAULT_TOKEN_EXPIRY_SECONDS = 600;
|
|
16
|
+
var UsersMagicLinkToken = class extends SmrtObject {
|
|
17
|
+
nonce = "";
|
|
18
|
+
/** Email address this token was generated for */
|
|
19
|
+
email = "";
|
|
20
|
+
/** Whether this token has been used */
|
|
21
|
+
used = false;
|
|
22
|
+
expiresAt = new Date(Date.now() + 600 * 1e3);
|
|
23
|
+
constructor(options = {}) {
|
|
24
|
+
super(options);
|
|
25
|
+
if (options.nonce !== void 0) this.nonce = options.nonce;
|
|
26
|
+
if (options.email !== void 0) this.email = options.email;
|
|
27
|
+
if (options.used !== void 0) this.used = options.used;
|
|
28
|
+
if (options.expiresAt !== void 0) this.expiresAt = options.expiresAt instanceof Date ? options.expiresAt : new Date(options.expiresAt);
|
|
29
|
+
}
|
|
30
|
+
/** Check if the token has expired */
|
|
31
|
+
isExpired() {
|
|
32
|
+
return /* @__PURE__ */ new Date() > this.expiresAt;
|
|
33
|
+
}
|
|
34
|
+
/** Check if the token is still valid (unused and not expired) */
|
|
35
|
+
isValid() {
|
|
36
|
+
return !this.used && !this.isExpired();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
__decorateClass$2([field({
|
|
40
|
+
required: true,
|
|
41
|
+
unique: true
|
|
42
|
+
})], UsersMagicLinkToken.prototype, "nonce", 2);
|
|
43
|
+
__decorateClass$2([field({
|
|
44
|
+
type: "datetime",
|
|
45
|
+
indexed: true
|
|
46
|
+
})], UsersMagicLinkToken.prototype, "expiresAt", 2);
|
|
47
|
+
UsersMagicLinkToken = __decorateClass$2([smrt({
|
|
48
|
+
tableName: "users_magic_link_tokens",
|
|
49
|
+
api: { include: [] },
|
|
50
|
+
mcp: { include: [] },
|
|
51
|
+
cli: true
|
|
52
|
+
})], UsersMagicLinkToken);
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region src/collections/MagicLinkTokenCollection.ts
|
|
55
|
+
var UsersMagicLinkTokenCollection = class extends SmrtCollection {
|
|
56
|
+
static _itemClass = UsersMagicLinkToken;
|
|
57
|
+
/**
|
|
58
|
+
* Find a token by its nonce
|
|
59
|
+
*/
|
|
60
|
+
async findByNonce(nonce) {
|
|
61
|
+
return this.findOne({ where: { nonce } });
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Atomically mark a token as used (single-use enforcement).
|
|
65
|
+
*
|
|
66
|
+
* Returns true if the nonce was successfully claimed (transitioned from
|
|
67
|
+
* unused to used). Returns false if the nonce was already used, expired,
|
|
68
|
+
* or doesn't exist — preventing race conditions in concurrent verify() calls.
|
|
69
|
+
*/
|
|
70
|
+
async markUsed(nonce) {
|
|
71
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
72
|
+
const { rowCount } = await this.db.query(`UPDATE ${this.tableName}
|
|
73
|
+
SET used = ?, updated_at = ?
|
|
74
|
+
WHERE nonce = ? AND used = ? AND expires_at > ?`, true, now, nonce, false, now);
|
|
75
|
+
return rowCount > 0;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Delete expired tokens (cleanup job)
|
|
79
|
+
*
|
|
80
|
+
* Scheduled by the framework retention sweep (#2375); `expiresAt` carries an
|
|
81
|
+
* index for this predicate.
|
|
82
|
+
*
|
|
83
|
+
* @param options.dryRun - Count the tokens the predicate selects without
|
|
84
|
+
* deleting them.
|
|
85
|
+
* @returns Number of tokens deleted (or, under `dryRun`, matched)
|
|
86
|
+
*/
|
|
87
|
+
async deleteExpired(options = {}) {
|
|
88
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
89
|
+
const predicate = "expires_at < ?";
|
|
90
|
+
const counted = await this.db.query(`SELECT COUNT(*) AS total FROM ${this.tableName} WHERE ${predicate}`, now);
|
|
91
|
+
const total = Number(counted.rows?.[0]?.total ?? 0);
|
|
92
|
+
if (!Number.isFinite(total) || total <= 0) return 0;
|
|
93
|
+
if (!options.dryRun) await this.db.query(`DELETE FROM ${this.tableName} WHERE ${predicate}`, now);
|
|
94
|
+
return total;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
//#endregion
|
|
98
|
+
//#region src/retention.ts
|
|
99
|
+
var SESSIONS_RETENTION_TASK = "users-sessions";
|
|
100
|
+
var MAGIC_LINK_RETENTION_TASK = "users-magic-link-tokens";
|
|
101
|
+
var CLI_AUTH_RETENTION_TASK = "users-cli-auth-requests";
|
|
102
|
+
var USER_RETENTION_TASKS = [
|
|
103
|
+
SESSIONS_RETENTION_TASK,
|
|
104
|
+
MAGIC_LINK_RETENTION_TASK,
|
|
105
|
+
CLI_AUTH_RETENTION_TASK
|
|
106
|
+
];
|
|
107
|
+
function registerUserRetentionTasks() {
|
|
108
|
+
registerRetentionTask({
|
|
109
|
+
name: SESSIONS_RETENTION_TASK,
|
|
110
|
+
description: "Delete expired and revoked sessions",
|
|
111
|
+
run: async (db, context) => {
|
|
112
|
+
return (await SessionCollection.create({ db })).deleteExpired({ dryRun: context.dryRun });
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
registerRetentionTask({
|
|
116
|
+
name: MAGIC_LINK_RETENTION_TASK,
|
|
117
|
+
description: "Delete expired magic-link tokens",
|
|
118
|
+
run: async (db, context) => {
|
|
119
|
+
return (await UsersMagicLinkTokenCollection.create({ db })).deleteExpired({ dryRun: context.dryRun });
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
registerRetentionTask({
|
|
123
|
+
name: CLI_AUTH_RETENTION_TASK,
|
|
124
|
+
description: "Delete expired pending CLI auth requests",
|
|
125
|
+
run: async (db, context) => {
|
|
126
|
+
return (await UsersCliAuthRequestCollection.create({ db })).deleteExpired({ dryRun: context.dryRun });
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function unregisterUserRetentionTasks() {
|
|
131
|
+
for (const name of USER_RETENTION_TASKS) unregisterRetentionTask(name);
|
|
132
|
+
}
|
|
133
|
+
//#endregion
|
|
134
|
+
//#region src/models/AccessRequest.ts
|
|
135
|
+
var __defProp$1 = Object.defineProperty;
|
|
136
|
+
var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
|
|
137
|
+
var __decorateClass$1 = (decorators, target, key, kind) => {
|
|
138
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
|
|
139
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
140
|
+
if (kind && result) __defProp$1(target, key, result);
|
|
141
|
+
return result;
|
|
142
|
+
};
|
|
15
143
|
var AccessRequest = class extends SmrtObject {
|
|
16
144
|
email = "";
|
|
17
145
|
name = null;
|
|
@@ -94,24 +222,24 @@ var AccessRequest = class extends SmrtObject {
|
|
|
94
222
|
return this.status === AccessRequestStatus.DECLINED || this.status === AccessRequestStatus.GRADUATED || this.status === AccessRequestStatus.CANCELED;
|
|
95
223
|
}
|
|
96
224
|
};
|
|
97
|
-
__decorateClass$
|
|
225
|
+
__decorateClass$1([field({
|
|
98
226
|
required: true,
|
|
99
227
|
indexed: true
|
|
100
228
|
})], AccessRequest.prototype, "email", 2);
|
|
101
|
-
__decorateClass$
|
|
102
|
-
__decorateClass$
|
|
229
|
+
__decorateClass$1([field({ nullable: true })], AccessRequest.prototype, "name", 2);
|
|
230
|
+
__decorateClass$1([field({
|
|
103
231
|
type: "text",
|
|
104
232
|
indexed: true
|
|
105
233
|
})], AccessRequest.prototype, "status", 2);
|
|
106
|
-
__decorateClass$
|
|
107
|
-
__decorateClass$
|
|
108
|
-
__decorateClass$
|
|
109
|
-
__decorateClass$
|
|
110
|
-
__decorateClass$
|
|
111
|
-
__decorateClass$
|
|
112
|
-
__decorateClass$
|
|
113
|
-
__decorateClass$
|
|
114
|
-
AccessRequest = __decorateClass$
|
|
234
|
+
__decorateClass$1([field({ indexed: true })], AccessRequest.prototype, "source", 2);
|
|
235
|
+
__decorateClass$1([field()], AccessRequest.prototype, "requestContext", 2);
|
|
236
|
+
__decorateClass$1([field({ nullable: true })], AccessRequest.prototype, "note", 2);
|
|
237
|
+
__decorateClass$1([field()], AccessRequest.prototype, "requestedAt", 2);
|
|
238
|
+
__decorateClass$1([field({ nullable: true })], AccessRequest.prototype, "decidedAt", 2);
|
|
239
|
+
__decorateClass$1([field({ nullable: true })], AccessRequest.prototype, "decidedBy", 2);
|
|
240
|
+
__decorateClass$1([field({ nullable: true })], AccessRequest.prototype, "resultingUserId", 2);
|
|
241
|
+
__decorateClass$1([field({ nullable: true })], AccessRequest.prototype, "tenantHint", 2);
|
|
242
|
+
AccessRequest = __decorateClass$1([smrt({
|
|
115
243
|
tableName: "access_requests",
|
|
116
244
|
conflictColumns: ["id"],
|
|
117
245
|
api: { include: [] },
|
|
@@ -164,89 +292,6 @@ var AccessRequestCollection = class extends SmrtCollection {
|
|
|
164
292
|
}
|
|
165
293
|
};
|
|
166
294
|
//#endregion
|
|
167
|
-
//#region src/models/MagicLinkToken.ts
|
|
168
|
-
var __defProp$1 = Object.defineProperty;
|
|
169
|
-
var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
|
|
170
|
-
var __decorateClass$1 = (decorators, target, key, kind) => {
|
|
171
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
|
|
172
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
173
|
-
if (kind && result) __defProp$1(target, key, result);
|
|
174
|
-
return result;
|
|
175
|
-
};
|
|
176
|
-
var DEFAULT_TOKEN_EXPIRY_SECONDS = 600;
|
|
177
|
-
var UsersMagicLinkToken = class extends SmrtObject {
|
|
178
|
-
nonce = "";
|
|
179
|
-
/** Email address this token was generated for */
|
|
180
|
-
email = "";
|
|
181
|
-
/** Whether this token has been used */
|
|
182
|
-
used = false;
|
|
183
|
-
/** When this token expires */
|
|
184
|
-
expiresAt = new Date(Date.now() + 600 * 1e3);
|
|
185
|
-
constructor(options = {}) {
|
|
186
|
-
super(options);
|
|
187
|
-
if (options.nonce !== void 0) this.nonce = options.nonce;
|
|
188
|
-
if (options.email !== void 0) this.email = options.email;
|
|
189
|
-
if (options.used !== void 0) this.used = options.used;
|
|
190
|
-
if (options.expiresAt !== void 0) this.expiresAt = options.expiresAt instanceof Date ? options.expiresAt : new Date(options.expiresAt);
|
|
191
|
-
}
|
|
192
|
-
/** Check if the token has expired */
|
|
193
|
-
isExpired() {
|
|
194
|
-
return /* @__PURE__ */ new Date() > this.expiresAt;
|
|
195
|
-
}
|
|
196
|
-
/** Check if the token is still valid (unused and not expired) */
|
|
197
|
-
isValid() {
|
|
198
|
-
return !this.used && !this.isExpired();
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
__decorateClass$1([field({
|
|
202
|
-
required: true,
|
|
203
|
-
unique: true
|
|
204
|
-
})], UsersMagicLinkToken.prototype, "nonce", 2);
|
|
205
|
-
UsersMagicLinkToken = __decorateClass$1([smrt({
|
|
206
|
-
tableName: "users_magic_link_tokens",
|
|
207
|
-
api: { include: [] },
|
|
208
|
-
mcp: { include: [] },
|
|
209
|
-
cli: true
|
|
210
|
-
})], UsersMagicLinkToken);
|
|
211
|
-
//#endregion
|
|
212
|
-
//#region src/collections/MagicLinkTokenCollection.ts
|
|
213
|
-
var UsersMagicLinkTokenCollection = class extends SmrtCollection {
|
|
214
|
-
static _itemClass = UsersMagicLinkToken;
|
|
215
|
-
/**
|
|
216
|
-
* Find a token by its nonce
|
|
217
|
-
*/
|
|
218
|
-
async findByNonce(nonce) {
|
|
219
|
-
return this.findOne({ where: { nonce } });
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Atomically mark a token as used (single-use enforcement).
|
|
223
|
-
*
|
|
224
|
-
* Returns true if the nonce was successfully claimed (transitioned from
|
|
225
|
-
* unused to used). Returns false if the nonce was already used, expired,
|
|
226
|
-
* or doesn't exist — preventing race conditions in concurrent verify() calls.
|
|
227
|
-
*/
|
|
228
|
-
async markUsed(nonce) {
|
|
229
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
230
|
-
const { rowCount } = await this.db.query(`UPDATE ${this.tableName}
|
|
231
|
-
SET used = ?, updated_at = ?
|
|
232
|
-
WHERE nonce = ? AND used = ? AND expires_at > ?`, true, now, nonce, false, now);
|
|
233
|
-
return rowCount > 0;
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Delete expired tokens (cleanup job)
|
|
237
|
-
*/
|
|
238
|
-
async deleteExpired() {
|
|
239
|
-
const now = /* @__PURE__ */ new Date();
|
|
240
|
-
const tokens = await this.list({ where: { "expiresAt <": now.toISOString() } });
|
|
241
|
-
let count = 0;
|
|
242
|
-
for (const token of tokens) {
|
|
243
|
-
await token.delete();
|
|
244
|
-
count++;
|
|
245
|
-
}
|
|
246
|
-
return count;
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
//#endregion
|
|
250
295
|
//#region src/models/TenantIntegration.ts
|
|
251
296
|
var __defProp = Object.defineProperty;
|
|
252
297
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -908,7 +953,7 @@ var MagicLinkService = class MagicLinkService {
|
|
|
908
953
|
* The caller is responsible for emailing the token to the user.
|
|
909
954
|
*/
|
|
910
955
|
async generate(email) {
|
|
911
|
-
const { SignJWT } = await import("./chunks/TerminalAuthService-
|
|
956
|
+
const { SignJWT } = await import("./chunks/TerminalAuthService-BfX2Ujqe.js").then((n) => n.D);
|
|
912
957
|
const key = await this.getSigningKey();
|
|
913
958
|
const nonce = crypto.randomUUID();
|
|
914
959
|
const normalizedEmail = normalizeEmail(email);
|
|
@@ -937,7 +982,7 @@ var MagicLinkService = class MagicLinkService {
|
|
|
937
982
|
* @throws {MagicLinkError} If the token is invalid, expired, or already used
|
|
938
983
|
*/
|
|
939
984
|
async verify(token) {
|
|
940
|
-
const { jwtVerify, errors } = await import("./chunks/TerminalAuthService-
|
|
985
|
+
const { jwtVerify, errors } = await import("./chunks/TerminalAuthService-BfX2Ujqe.js").then((n) => n.D);
|
|
941
986
|
const key = await this.getSigningKey();
|
|
942
987
|
let payload;
|
|
943
988
|
try {
|
|
@@ -1410,6 +1455,9 @@ var TenantService = class TenantService {
|
|
|
1410
1455
|
}
|
|
1411
1456
|
};
|
|
1412
1457
|
//#endregion
|
|
1413
|
-
|
|
1458
|
+
//#region src/index.ts
|
|
1459
|
+
registerUserRetentionTasks();
|
|
1460
|
+
//#endregion
|
|
1461
|
+
export { ACCESS_REQUEST_CAPABILITIES, AccessRequest, AccessRequestCollection, AccessRequestError, AccessRequestService, AccessRequestStatus, CLI_AUTH_RETENTION_TASK, UsersCliAuthRequest as CliAuthRequest, UsersCliAuthRequest, UsersCliAuthRequestCollection as CliAuthRequestCollection, UsersCliAuthRequestCollection, DEFAULT_CLI_AUTH_POLL_INTERVAL_SECONDS, DEFAULT_CLI_AUTH_REQUEST_TTL_SECONDS, DEFAULT_CLI_SESSION_TTL_SECONDS, DEFAULT_ROLES, DEFAULT_ROLE_PERMISSION_PATTERNS, DEFAULT_ROLE_SLUGS, DEFAULT_SESSION_TTL, DEFAULT_TENANT_POLICY, DEFAULT_TOKEN_EXPIRY_SECONDS, Group, GroupCollection, GroupMember, GroupMemberCollection, GroupRole, GroupRoleCollection, MAGIC_LINK_RETENTION_TASK, MAX_TENANT_HIERARCHY_DEPTH, MagicLinkError, MagicLinkService, UsersMagicLinkToken as MagicLinkToken, UsersMagicLinkToken, UsersMagicLinkTokenCollection as MagicLinkTokenCollection, UsersMagicLinkTokenCollection, Membership, MembershipCollection, MembershipOverride, MembershipOverrideCollection, MembershipStatus, MobileAuthError, MobileAuthService, OidcLoginError, OidcLoginService, OidcProvisioningError, OperationPermissionError, OverrideEffect, Permission, PermissionCatalogService, PermissionCollection, PermissionResolver, Role, RoleCollection, RolePermission, RolePermissionCollection, SESSIONS_RETENTION_TASK, Session, SessionCollection, SessionService, SessionStatus, Tenant, TenantCollection, TenantHierarchyError, TenantIntegration, TenantIntegrationCollection, TenantPermissionEffect, TenantPermissionOverride, TenantPermissionOverrideCollection, TenantService, TenantStatus, TerminalAuthError, TerminalAuthRateLimitError, TerminalAuthService, USER_RETENTION_TASKS, User, UserCollection, UserEmailKeyBackfillError, UserStatus, applyPostgresPermissionPolicies, assertOperationPermission, backfillUserEmailKeys, checkOperationPermission, decodeOidcTransaction, deriveOperationPermissionCollectionName, deriveOperationPermissionSlug, encodeOidcTransaction, generatePostgresPermissionSql, generateSessionId, getCurrentSessionPermissionContext, getRequestScopedDatabase, getUsersOidcConfig, hasOperationPermission, normalizeOperationPermissionAction, readMobileBearerToken, registerPermissionDefinitions, registerUserRetentionTasks, resolveOidcProviderConfig, syncPermissionCatalog, unregisterUserRetentionTasks, validateMobileRedirectUri, withPrincipalPermissionContext, withSessionPermissionContext };
|
|
1414
1462
|
|
|
1415
1463
|
//# sourceMappingURL=index.js.map
|