@tula-tech/contract 0.1.1 → 0.3.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/dist/index.js CHANGED
@@ -2,17 +2,47 @@ import {
2
2
  ACTIVITY_TYPES2,
3
3
  EVENT_SCHEMA_VERSION2,
4
4
  EVENT_TARGET_TYPES2
5
- } from "./shared/chunk-7yqzghgm.js";
5
+ } from "./shared/chunk-bsea97tx.js";
6
6
  import {
7
7
  COMMON_PASSWORDS2,
8
8
  DEFAULT_SPECIAL_CHARS2,
9
9
  normalizePassword2,
10
10
  evaluatePassword2
11
11
  } from "./shared/chunk-sc6qg3d2.js";
12
+ import {
13
+ MAX_PERMISSIONS_PER_ROLE2,
14
+ MAX_CUSTOM_ROLES2,
15
+ MAX_PERMISSION_KEY_LENGTH2,
16
+ ROLE_KEY_PATTERN2,
17
+ PERMISSION_KEY_PATTERN2,
18
+ SYSTEM_PERMISSIONS2,
19
+ MEMBERSHIPS_MANAGE_PERMISSION2,
20
+ DOMAINS_MANAGE_PERMISSION2,
21
+ INVITATIONS_MANAGE_PERMISSION2,
22
+ ORGANIZATION_MANAGE_PERMISSION2,
23
+ ORGANIZATION_DELETE_PERMISSION2,
24
+ MEMBERSHIPS_READ_PERMISSION2,
25
+ SSO_MANAGE_PERMISSION2,
26
+ BUILT_IN_ROLES2,
27
+ isSystemPermission2,
28
+ isBuiltInRoleKey2,
29
+ rolePermissionRefusal2,
30
+ normalizePermissions2,
31
+ organizationRoleWeakenings2
32
+ } from "./shared/chunk-yzgakhtb.js";
12
33
  import {
13
34
  CUSTOM_CLAIMS_CLAIM2,
35
+ ORGANIZATION_ID_CLAIM2,
36
+ SSO_CONNECTION_CLAIM2,
37
+ ORGANIZATION_ROLE_CLAIM2,
38
+ ORGANIZATION_PERMISSIONS_CLAIM2,
14
39
  RESERVED_CLAIM_NAMES2,
15
40
  MAX_CUSTOM_CLAIMS_BYTES2,
41
+ MAX_ORGANIZATION_CLAIMS_BYTES2,
42
+ MAX_ORGANIZATION_PERMISSIONS_CLAIM2,
43
+ organizationClaimsBytes2,
44
+ readOrganizationClaims2,
45
+ hasOrganizationAccess2,
16
46
  MAX_JWT_TEMPLATES2,
17
47
  MAX_JWT_TEMPLATE_CLAIMS2,
18
48
  MAX_CUSTOM_CLAIM_KEY_LENGTH2,
@@ -22,7 +52,7 @@ import {
22
52
  customClaimsBytes2,
23
53
  checkCustomClaims2,
24
54
  readCustomClaims2
25
- } from "./shared/chunk-4rb5jsfz.js";
55
+ } from "./shared/chunk-fkx6fc8e.js";
26
56
  import {
27
57
  DPOP_HEADER2,
28
58
  DPOP_NONCE_HEADER2,
@@ -67,12 +97,29 @@ import {
67
97
  bindsCodeWithPkce2,
68
98
  CUSTOM_SCHEME_REDIRECT_REFUSALS2,
69
99
  customSchemeRedirectRefusal2
70
- } from "./shared/chunk-r202nxfw.js";
100
+ } from "./shared/chunk-n1jdq72m.js";
71
101
  import {
72
102
  ERROR_DEFINITIONS2,
73
103
  ERROR_CODES2,
74
104
  errorDefinition2
75
- } from "./shared/chunk-cce3bhet.js";
105
+ } from "./shared/chunk-5r2ka03q.js";
106
+ import {
107
+ MAX_DOMAIN_LENGTH2,
108
+ MAX_DOMAIN_LABEL_LENGTH2,
109
+ MIN_DOMAIN_LENGTH2,
110
+ MAX_DOMAINS_PER_ORGANIZATION2,
111
+ DOMAIN_VERIFICATION_LIFETIME_DAYS2,
112
+ DOMAIN_REMINDER_DAYS2,
113
+ DOMAIN_REVERIFICATION_GRACE_DAYS2,
114
+ ORGANIZATION_DOMAIN_STATUSES2,
115
+ ORGANIZATION_DOMAIN_MODES2,
116
+ DOMAIN_PATTERN2,
117
+ PUBLIC_EMAIL_DOMAINS2,
118
+ PUBLIC_EMAIL_BRANDS2,
119
+ isPublicEmailDomain2,
120
+ domainRefusal2,
121
+ domainOfAddress2
122
+ } from "./shared/chunk-cdg41bxh.js";
76
123
  import {
77
124
  environmentIssuer2,
78
125
  jwksUrl2
@@ -91,10 +138,12 @@ import {
91
138
  ENVIRONMENT_HEADER2,
92
139
  DASHBOARD_SESSION_COOKIE2,
93
140
  EMAIL_LINK_TOKEN_PARAM2,
141
+ ORGANIZATION_INVITATION_TOKEN_PARAM2,
94
142
  EMAIL_LINK_ATTEMPT_PARAM2,
95
143
  OAUTH_TICKET_PARAM2,
96
- OAUTH_ERROR_PARAM2
97
- } from "./shared/chunk-q309e9bk.js";
144
+ OAUTH_ERROR_PARAM2,
145
+ SETUP_LINK_HEADER2
146
+ } from "./shared/chunk-4hytq4je.js";
98
147
  import {
99
148
  THEME_TOKENS2,
100
149
  DEFAULT_THEME2,
@@ -102,7 +151,7 @@ import {
102
151
  isValidThemeValue2,
103
152
  themeToCssVariables2,
104
153
  contrastRatio2
105
- } from "./shared/chunk-pcn6ax54.js";
154
+ } from "./shared/chunk-g0ddvjqg.js";
106
155
  import {
107
156
  WEBHOOK_ID_HEADER2,
108
157
  WEBHOOK_TIMESTAMP_HEADER2,
@@ -231,6 +280,57 @@ var CreateUserRequestSchema = z2.object({
231
280
  lastName: z2.string().trim().max(100).optional(),
232
281
  emailVerified: z2.boolean().optional()
233
282
  }).meta({ ref: "CreateUserRequest" });
283
+ var MAX_IMPORT_ROWS = 500;
284
+ var MAX_IMPORT_METADATA_BYTES = 4096;
285
+ var MAX_IMPORT_PASSWORD_PARAMS = 16;
286
+ var ImportPasswordSchema = z2.object({
287
+ algorithm: z2.string().max(64),
288
+ hash: z2.string().max(1024),
289
+ params: z2.record(z2.string().max(64), z2.union([z2.string().max(1024), z2.number()])).refine((params) => Object.keys(params).length <= MAX_IMPORT_PASSWORD_PARAMS, {
290
+ message: `at most ${MAX_IMPORT_PASSWORD_PARAMS} params`
291
+ }).optional()
292
+ }).meta({ ref: "ImportPassword" });
293
+ var ImportUserRowSchema = z2.object({
294
+ email: z2.string().max(320),
295
+ emailVerified: z2.boolean(),
296
+ name: z2.string().trim().max(200).optional(),
297
+ metadata: z2.record(z2.string().max(128), z2.unknown()).optional(),
298
+ externalId: z2.string().trim().min(1).max(256).optional(),
299
+ password: ImportPasswordSchema.optional()
300
+ }).meta({ ref: "ImportUserRow" });
301
+ var FirebaseScryptParamsSchema = z2.object({
302
+ signerKey: z2.string().max(512),
303
+ saltSeparator: z2.string().max(256),
304
+ rounds: z2.number().int(),
305
+ memCost: z2.number().int()
306
+ }).meta({ ref: "FirebaseScryptParams" });
307
+ var ImportUsersRequestSchema = z2.object({
308
+ users: z2.array(ImportUserRowSchema).min(1).max(MAX_IMPORT_ROWS),
309
+ firebaseScrypt: FirebaseScryptParamsSchema.optional()
310
+ }).meta({ ref: "ImportUsersRequest" });
311
+ var ImportSkipReasonSchema = z2.enum(["email_exists", "repeated_in_batch"]).meta({ ref: "ImportSkipReason" });
312
+ var ImportRowResultSchema = z2.discriminatedUnion("status", [
313
+ z2.object({ index: z2.number().int().min(0), status: z2.literal("created"), id: z2.uuid() }),
314
+ z2.object({
315
+ index: z2.number().int().min(0),
316
+ status: z2.literal("skipped"),
317
+ reason: ImportSkipReasonSchema,
318
+ id: z2.uuid().optional(),
319
+ sameExternalId: z2.boolean().optional()
320
+ }),
321
+ z2.object({
322
+ index: z2.number().int().min(0),
323
+ status: z2.literal("refused"),
324
+ code: z2.string(),
325
+ message: z2.string()
326
+ })
327
+ ]).meta({ ref: "ImportRowResult" });
328
+ var ImportUsersResultSchema = z2.object({
329
+ results: z2.array(ImportRowResultSchema),
330
+ created: z2.number().int().min(0),
331
+ skipped: z2.number().int().min(0),
332
+ refused: z2.number().int().min(0)
333
+ }).meta({ ref: "ImportUsersResult" });
234
334
  var SetPasswordRequestSchema = z2.object({ password: z2.string().max(1024) }).meta({ ref: "SetPasswordRequest" });
235
335
  var ChangePasswordRequestSchema = z2.object({
236
336
  currentPassword: z2.string().max(1024),
@@ -252,7 +352,15 @@ var SetUserEmailRequestSchema = z2.strictObject({ email: z2.string().max(320) })
252
352
 
253
353
  // src/audit.ts
254
354
  var ActivityTypeSchema = z3.enum(ACTIVITY_TYPES2).meta({ ref: "ActivityType" });
255
- var AUDIT_ACTOR_TYPES = ["user", "admin", "system", "agent", "instance_admin"];
355
+ var AUDIT_ACTOR_TYPES = [
356
+ "user",
357
+ "admin",
358
+ "system",
359
+ "agent",
360
+ "instance_admin",
361
+ "directory",
362
+ "setup_link"
363
+ ];
256
364
  var INSTANCE_ACTIVITY_TYPES = [
257
365
  "instance.signed_in",
258
366
  "instance.sign_in_failed",
@@ -273,6 +381,15 @@ var AUDIT_TARGET_TYPES = [
273
381
  "webhook_endpoint",
274
382
  "hook",
275
383
  "native_app",
384
+ "sso_connection",
385
+ "scim_token",
386
+ "scim_group",
387
+ "setup_link",
388
+ "organization",
389
+ "organization_membership",
390
+ "organization_role",
391
+ "organization_domain",
392
+ "organization_invitation",
276
393
  "proposal"
277
394
  ];
278
395
  var AuditLogSchema = z3.object({
@@ -288,6 +405,17 @@ var AuditLogSchema = z3.object({
288
405
  metadata: z3.record(z3.string(), z3.unknown()),
289
406
  occurredAt: z3.iso.datetime()
290
407
  }).meta({ ref: "AuditLog" });
408
+ var AUDIT_EXPORT_FORMATS = ["ndjson", "csv"];
409
+ var MAX_AUDIT_EXPORT_ROWS = 1e5;
410
+ var CURSOR_PATTERN = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z)~([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/;
411
+ var AuditExportCursorSchema = z3.string().regex(CURSOR_PATTERN);
412
+ function auditExportCursor(entry) {
413
+ return `${entry.occurredAt}~${entry.id}`;
414
+ }
415
+ function parseAuditExportCursor(cursor) {
416
+ const match = CURSOR_PATTERN.exec(cursor);
417
+ return match ? { occurredAt: match[1], id: match[2] } : null;
418
+ }
291
419
  var AuditLogListSchema = z3.object({ meta: PaginationMetaSchema, data: z3.array(AuditLogSchema) }).meta({ ref: "AuditLogList" });
292
420
  // src/duration.ts
293
421
  import { z as z4 } from "zod";
@@ -346,28 +474,154 @@ var EmailTemplatesSchema = z5.strictObject(shape).superRefine((templates, contex
346
474
  }).meta({ ref: "EmailTemplates" });
347
475
  var EmailSettingsSchema = z5.strictObject({ templates: EmailTemplatesSchema.default({}) }).meta({ ref: "EmailSettings" });
348
476
  // src/environment-settings.ts
349
- import { z as z11 } from "zod";
477
+ import { z as z12 } from "zod";
350
478
 
351
- // src/password-policy.ts
479
+ // src/organization.ts
352
480
  import { z as z6 } from "zod";
481
+ var MIN_ORGANIZATION_SLUG_LENGTH = 2;
482
+ var MAX_ORGANIZATION_SLUG_LENGTH = 48;
483
+ var MAX_ORGANIZATION_NAME_LENGTH = 100;
484
+ var ORGANIZATION_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
485
+ var RoleKeySchema = z6.string().regex(ROLE_KEY_PATTERN2, "a role key is lower-case letters, digits and underscores").meta({ ref: "OrganizationRoleKey" });
486
+ var PermissionKeySchema = z6.string().max(MAX_PERMISSION_KEY_LENGTH2).regex(PERMISSION_KEY_PATTERN2, "a permission key is org:<feature>:<action>").meta({ ref: "PermissionKey" });
487
+ var RolePermissionsSchema = z6.array(z6.string()).max(MAX_PERMISSIONS_PER_ROLE2).superRefine((permissions, context) => {
488
+ const seen = new Set;
489
+ permissions.forEach((key, index) => {
490
+ const refusal = rolePermissionRefusal2(key);
491
+ if (refusal === "grammar") {
492
+ context.addIssue({
493
+ code: "custom",
494
+ path: [index],
495
+ message: "a permission key is org:<feature>:<action>"
496
+ });
497
+ } else if (refusal === "reserved") {
498
+ context.addIssue({
499
+ code: "custom",
500
+ path: [index],
501
+ message: "the feature sys is reserved: only the system permissions Tula defines are allowed"
502
+ });
503
+ }
504
+ if (seen.has(key)) {
505
+ context.addIssue({ code: "custom", path: [index], message: "a permission is listed once" });
506
+ }
507
+ seen.add(key);
508
+ });
509
+ }).meta({ ref: "OrganizationRolePermissions" });
510
+ var OrganizationSlugSchema = z6.string().min(MIN_ORGANIZATION_SLUG_LENGTH).max(MAX_ORGANIZATION_SLUG_LENGTH).regex(ORGANIZATION_SLUG_PATTERN, "a slug is lower-case letters and digits joined by hyphens").meta({ ref: "OrganizationSlug" });
511
+ var OrganizationName = z6.string().trim().min(1).max(MAX_ORGANIZATION_NAME_LENGTH).refine((name) => !Array.from(name).some((char) => isControl(char.codePointAt(0) ?? 0)), {
512
+ message: "must not contain control characters"
513
+ });
514
+ function isControl(code) {
515
+ return code <= 31 || code >= 127 && code <= 159;
516
+ }
517
+ var OrganizationSchema = z6.object({
518
+ id: z6.string(),
519
+ name: z6.string(),
520
+ slug: z6.string(),
521
+ createdBy: z6.string().nullable(),
522
+ createdAt: z6.iso.datetime(),
523
+ updatedAt: z6.iso.datetime()
524
+ }).meta({ ref: "Organization" });
525
+ var OrganizationListSchema = z6.object({ meta: PaginationMetaSchema, data: z6.array(OrganizationSchema) }).meta({ ref: "OrganizationList" });
526
+ var CreateOrganizationRequestSchema = z6.strictObject({ name: OrganizationName, slug: OrganizationSlugSchema }).meta({ ref: "CreateOrganizationRequest" });
527
+ var UpdateOrganizationRequestSchema = z6.strictObject({ name: OrganizationName.optional(), slug: OrganizationSlugSchema.optional() }).refine((body) => body.name !== undefined || body.slug !== undefined, {
528
+ message: "send a name, a slug or both"
529
+ }).meta({ ref: "UpdateOrganizationRequest" });
530
+ var OrganizationPageQuerySchema = z6.object({
531
+ page: z6.coerce.number().int().min(1).max(1e6).default(1),
532
+ size: z6.coerce.number().int().min(1).max(MAX_PAGE_SIZE).default(DEFAULT_PAGE_SIZE)
533
+ }).meta({ ref: "OrganizationPageQuery" });
534
+ var OrganizationSearchQuerySchema = OrganizationPageQuerySchema.extend({
535
+ q: z6.string().trim().max(100).optional()
536
+ }).meta({ ref: "OrganizationSearchQuery" });
537
+ var OrganizationMembershipSchema = z6.object({
538
+ id: z6.string(),
539
+ organizationId: z6.string(),
540
+ userId: z6.string(),
541
+ role: z6.string(),
542
+ createdAt: z6.iso.datetime(),
543
+ updatedAt: z6.iso.datetime()
544
+ }).meta({ ref: "OrganizationMembership" });
545
+ var OrganizationMembershipListSchema = z6.object({ meta: PaginationMetaSchema, data: z6.array(OrganizationMembershipSchema) }).meta({ ref: "OrganizationMembershipList" });
546
+ var AddOrganizationMemberRequestSchema = z6.strictObject({ userId: z6.uuid(), role: RoleKeySchema }).meta({ ref: "AddOrganizationMemberRequest" });
547
+ var UpdateOrganizationMemberRequestSchema = z6.strictObject({ role: RoleKeySchema }).meta({ ref: "UpdateOrganizationMemberRequest" });
548
+ var UserOrganizationSchema = z6.object({
549
+ id: z6.string(),
550
+ name: z6.string(),
551
+ slug: z6.string(),
552
+ role: z6.string(),
553
+ permissions: z6.array(z6.string()),
554
+ createdAt: z6.iso.datetime()
555
+ }).meta({ ref: "UserOrganization" });
556
+ var UserOrganizationListSchema = z6.object({
557
+ activeOrganizationId: z6.string().nullable(),
558
+ meta: PaginationMetaSchema,
559
+ data: z6.array(UserOrganizationSchema)
560
+ }).meta({ ref: "UserOrganizationList" });
561
+ var SetActiveOrganizationRequestSchema = z6.strictObject({ organizationId: z6.uuid().nullable() }).meta({ ref: "SetActiveOrganizationRequest" });
562
+ var ActiveOrganizationSchema = z6.object({
563
+ sessionId: z6.string(),
564
+ organizationId: z6.string().nullable(),
565
+ accessToken: z6.string().optional(),
566
+ accessTokenExpiresAt: z6.iso.datetime().optional()
567
+ }).meta({ ref: "ActiveOrganization" });
568
+ var OrganizationMemberSchema = z6.object({
569
+ userId: z6.string(),
570
+ name: z6.string().nullable(),
571
+ email: z6.string().nullable(),
572
+ role: z6.string(),
573
+ createdAt: z6.iso.datetime()
574
+ }).meta({ ref: "OrganizationMember" });
575
+ var OrganizationMemberListSchema = z6.object({ meta: PaginationMetaSchema, data: z6.array(OrganizationMemberSchema) }).meta({ ref: "OrganizationMemberList" });
576
+ var AssignableRoleSchema = z6.object({ key: z6.string(), name: z6.string() }).meta({ ref: "AssignableRole" });
577
+ var AssignableRoleListSchema = z6.object({ data: z6.array(AssignableRoleSchema) }).meta({ ref: "AssignableRoleList" });
578
+ var UserMembershipSchema = z6.object({
579
+ organizationId: z6.string(),
580
+ name: z6.string(),
581
+ slug: z6.string(),
582
+ role: z6.string(),
583
+ joinedAt: z6.iso.datetime()
584
+ }).meta({ ref: "UserMembership" });
585
+ var UserMembershipListSchema = z6.object({ meta: PaginationMetaSchema, data: z6.array(UserMembershipSchema) }).meta({ ref: "UserMembershipList" });
586
+ var ORGANIZATION_FIELDS = ["name", "slug"];
587
+ var RoleNameSchema = OrganizationName;
588
+ var OrganizationRoleSchema = z6.object({
589
+ id: z6.string(),
590
+ key: z6.string(),
591
+ name: z6.string(),
592
+ permissions: z6.array(z6.string()),
593
+ builtIn: z6.boolean(),
594
+ version: z6.number().int().min(1),
595
+ createdAt: z6.iso.datetime(),
596
+ updatedAt: z6.iso.datetime()
597
+ }).meta({ ref: "OrganizationRole" });
598
+ var OrganizationRoleListSchema = z6.object({ data: z6.array(OrganizationRoleSchema) }).meta({ ref: "OrganizationRoleList" });
599
+ var CreateOrganizationRoleRequestSchema = z6.strictObject({ key: RoleKeySchema, name: RoleNameSchema, permissions: RolePermissionsSchema }).meta({ ref: "CreateOrganizationRoleRequest" });
600
+ var UpdateOrganizationRoleRequestSchema = z6.strictObject({ name: RoleNameSchema.optional(), permissions: RolePermissionsSchema.optional() }).refine((body) => body.name !== undefined || body.permissions !== undefined, {
601
+ message: "send a name, permissions or both"
602
+ }).meta({ ref: "UpdateOrganizationRoleRequest" });
603
+ var ORGANIZATION_ROLE_FIELDS = ["name", "permissions"];
604
+
605
+ // src/password-policy.ts
606
+ import { z as z7 } from "zod";
353
607
  var MAX_PASSWORD_HISTORY = 24;
354
- var PasswordPolicySchema = z6.object({
355
- preset: z6.enum(["recommended", "strict", "legacy", "custom"]),
356
- minLength: z6.number().int().min(1).max(256),
357
- maxLength: z6.number().int().min(8).max(1024),
358
- requireLowercase: z6.boolean(),
359
- requireUppercase: z6.boolean(),
360
- requireNumber: z6.boolean(),
361
- requireSpecial: z6.boolean(),
362
- minCharacterClasses: z6.number().int().min(0).max(4),
363
- specialChars: z6.string().min(1),
364
- disallowUserInfo: z6.boolean(),
365
- disallowCommon: z6.boolean(),
366
- breachCheck: z6.enum(["off", "warn", "block"]),
367
- maxRepeatedChars: z6.number().int().min(1).nullable(),
368
- blockSequences: z6.boolean(),
369
- history: z6.number().int().min(0).max(MAX_PASSWORD_HISTORY),
370
- expiryDays: z6.number().int().min(1).nullable()
608
+ var PasswordPolicySchema = z7.object({
609
+ preset: z7.enum(["recommended", "strict", "legacy", "custom"]),
610
+ minLength: z7.number().int().min(1).max(256),
611
+ maxLength: z7.number().int().min(8).max(1024),
612
+ requireLowercase: z7.boolean(),
613
+ requireUppercase: z7.boolean(),
614
+ requireNumber: z7.boolean(),
615
+ requireSpecial: z7.boolean(),
616
+ minCharacterClasses: z7.number().int().min(0).max(4),
617
+ specialChars: z7.string().min(1),
618
+ disallowUserInfo: z7.boolean(),
619
+ disallowCommon: z7.boolean(),
620
+ breachCheck: z7.enum(["off", "warn", "block"]),
621
+ maxRepeatedChars: z7.number().int().min(1).nullable(),
622
+ blockSequences: z7.boolean(),
623
+ history: z7.number().int().min(0).max(MAX_PASSWORD_HISTORY),
624
+ expiryDays: z7.number().int().min(1).nullable()
371
625
  }).refine((p) => p.maxLength >= p.minLength, {
372
626
  message: "maxLength must be at least minLength",
373
627
  path: ["maxLength"]
@@ -726,35 +980,35 @@ function phoneNumberPrefix(phoneNumber) {
726
980
  }
727
981
 
728
982
  // src/session-profile.ts
729
- import { z as z9 } from "zod";
983
+ import { z as z10 } from "zod";
730
984
 
731
985
  // src/jwt-template.ts
732
- import { z as z8 } from "zod";
986
+ import { z as z9 } from "zod";
733
987
 
734
988
  // src/session.ts
735
- import { z as z7 } from "zod";
989
+ import { z as z8 } from "zod";
736
990
  var REFRESH_TOKEN_PREFIX = "tula_rt_";
737
- var SessionClientSchema = z7.enum(["web", "ios", "android", "server"]).meta({ ref: "SessionClient" });
738
- var SessionSchema = z7.object({
739
- id: z7.string(),
991
+ var SessionClientSchema = z8.enum(["web", "ios", "android", "server"]).meta({ ref: "SessionClient" });
992
+ var SessionSchema = z8.object({
993
+ id: z8.string(),
740
994
  client: SessionClientSchema,
741
- userAgent: z7.string().nullable(),
742
- ipAddress: z7.string().nullable(),
743
- createdAt: z7.iso.datetime(),
744
- lastActiveAt: z7.iso.datetime(),
745
- expiresAt: z7.iso.datetime(),
746
- current: z7.boolean(),
747
- deviceBound: z7.boolean()
995
+ userAgent: z8.string().nullable(),
996
+ ipAddress: z8.string().nullable(),
997
+ createdAt: z8.iso.datetime(),
998
+ lastActiveAt: z8.iso.datetime(),
999
+ expiresAt: z8.iso.datetime(),
1000
+ current: z8.boolean(),
1001
+ deviceBound: z8.boolean()
748
1002
  }).meta({ ref: "Session" });
749
1003
  var AdminSessionSchema = SessionSchema.extend({
750
- userId: z7.string(),
751
- active: z7.boolean()
1004
+ userId: z8.string(),
1005
+ active: z8.boolean()
752
1006
  }).meta({ ref: "AdminSession" });
753
- var SessionListSchema = z7.object({ data: z7.array(SessionSchema) }).meta({ ref: "SessionList" });
754
- var RefreshTokenRequestSchema = z7.object({ refreshToken: z7.string().max(512).optional() }).meta({ ref: "RefreshTokenRequest" });
1007
+ var SessionListSchema = z8.object({ data: z8.array(SessionSchema) }).meta({ ref: "SessionList" });
1008
+ var RefreshTokenRequestSchema = z8.object({ refreshToken: z8.string().max(512).optional() }).meta({ ref: "RefreshTokenRequest" });
755
1009
  var MAX_VERIFIED_TOKEN_LENGTH = 4096;
756
- var VerifySessionRequestSchema = z7.object({ token: z7.string().min(1).max(MAX_VERIFIED_TOKEN_LENGTH) }).meta({ ref: "VerifySessionRequest" });
757
- var RevokedSessionsSchema = z7.object({ revoked: z7.number().int().min(0) }).meta({ ref: "RevokedSessions" });
1010
+ var VerifySessionRequestSchema = z8.object({ token: z8.string().min(1).max(MAX_VERIFIED_TOKEN_LENGTH) }).meta({ ref: "VerifySessionRequest" });
1011
+ var RevokedSessionsSchema = z8.object({ revoked: z8.number().int().min(0) }).meta({ ref: "RevokedSessions" });
758
1012
 
759
1013
  // src/jwt-template.ts
760
1014
  var JWT_TEMPLATE_SOURCES = [
@@ -764,7 +1018,7 @@ var JWT_TEMPLATE_SOURCES = [
764
1018
  "session.client",
765
1019
  "session.created_at"
766
1020
  ];
767
- var JwtTemplateSourceSchema = z8.enum(JWT_TEMPLATE_SOURCES).meta({ ref: "JwtTemplateSource" });
1021
+ var JwtTemplateSourceSchema = z9.enum(JWT_TEMPLATE_SOURCES).meta({ ref: "JwtTemplateSource" });
768
1022
  var MAX_EMAIL_LENGTH = 320;
769
1023
  var MAX_EMAIL_CLAIM_BYTES = 2 * MAX_EMAIL_LENGTH + 2;
770
1024
  var MAX_BOOLEAN_BYTES = 5;
@@ -778,14 +1032,14 @@ var SOURCE_MAX_BYTES = {
778
1032
  "session.created_at": MAX_TIME_BYTES
779
1033
  };
780
1034
  var UNPRINTABLE = /[\p{Cc}\p{Zl}\p{Zp}]/u;
781
- var Constant = z8.union([
782
- z8.string().max(MAX_CUSTOM_CLAIM_CONSTANT_LENGTH2).refine((value) => !UNPRINTABLE.test(value), {
1035
+ var Constant = z9.union([
1036
+ z9.string().max(MAX_CUSTOM_CLAIM_CONSTANT_LENGTH2).refine((value) => !UNPRINTABLE.test(value), {
783
1037
  message: "must not contain control characters or line breaks"
784
1038
  }),
785
- z8.number(),
786
- z8.boolean()
1039
+ z9.number(),
1040
+ z9.boolean()
787
1041
  ]);
788
- var JwtTemplateClaimSchema = z8.union([z8.strictObject({ from: JwtTemplateSourceSchema }), z8.strictObject({ value: Constant })]).meta({ ref: "JwtTemplateClaim" });
1042
+ var JwtTemplateClaimSchema = z9.union([z9.strictObject({ from: JwtTemplateSourceSchema }), z9.strictObject({ value: Constant })]).meta({ ref: "JwtTemplateClaim" });
789
1043
  var CLAIM_KEY_RULE = `a claim key is ASCII letters, digits and underscores, not starting with a digit, at most ${MAX_CUSTOM_CLAIM_KEY_LENGTH2} characters, and not a reserved claim name`;
790
1044
  function keyBytes(key) {
791
1045
  return customClaimsBytes2({ [key]: 0 }) - 3;
@@ -803,7 +1057,7 @@ function jwtTemplateMaxBytes(template) {
803
1057
  return claims.reduce((bytes, [key, claim]) => bytes + keyBytes(key) + valueMaxBytes(claim), 2 + separators);
804
1058
  }
805
1059
  var fields = {
806
- claims: z8.record(z8.string().refine(isCustomClaimKey2, { message: CLAIM_KEY_RULE }), JwtTemplateClaimSchema).default({})
1060
+ claims: z9.record(z9.string().refine(isCustomClaimKey2, { message: CLAIM_KEY_RULE }), JwtTemplateClaimSchema).default({})
807
1061
  };
808
1062
  function fewEnough(template) {
809
1063
  return Object.keys(template.claims).length <= MAX_JWT_TEMPLATE_CLAIMS2;
@@ -811,7 +1065,7 @@ function fewEnough(template) {
811
1065
  function smallEnough(template) {
812
1066
  return jwtTemplateMaxBytes(template) <= MAX_CUSTOM_CLAIMS_BYTES2;
813
1067
  }
814
- var JwtTemplateSchema = z8.strictObject(fields).refine(fewEnough, {
1068
+ var JwtTemplateSchema = z9.strictObject(fields).refine(fewEnough, {
815
1069
  message: `at most ${MAX_JWT_TEMPLATE_CLAIMS2} claims`,
816
1070
  path: ["claims"]
817
1071
  }).refine(smallEnough, {
@@ -845,7 +1099,7 @@ function jwtTemplateOfProfile(settings, profile) {
845
1099
  }
846
1100
 
847
1101
  // src/session-profile.ts
848
- var SessionTypeSchema = z9.enum(["hybrid", "stateful"]).meta({ ref: "SessionType" });
1102
+ var SessionTypeSchema = z10.enum(["hybrid", "stateful"]).meta({ ref: "SessionType" });
849
1103
  var MIN_ACCESS_TOKEN_TTL = "30s";
850
1104
  var MAX_ACCESS_TOKEN_TTL = "15m";
851
1105
  var MIN_IDLE_TIMEOUT = "1m";
@@ -858,7 +1112,7 @@ var DEFAULT_STEP_UP_AFTER = "10m";
858
1112
  var MAX_CUSTOM_SESSION_PROFILES = 10;
859
1113
  var MAX_SESSION_PROFILE_NAME_LENGTH = 32;
860
1114
  var MAX_SESSIONS_PER_USER = 100;
861
- var DeviceBindingPolicySchema = z9.enum(["none", "optional", "required"]).meta({ ref: "DeviceBindingPolicy" });
1115
+ var DeviceBindingPolicySchema = z10.enum(["none", "optional", "required"]).meta({ ref: "DeviceBindingPolicy" });
862
1116
  var BUILT_IN_SESSION_PROFILES = ["web", "mobile"];
863
1117
  function defaultDeviceBinding(name) {
864
1118
  return name === "web" ? "none" : "optional";
@@ -867,7 +1121,7 @@ var PROFILE_NAME = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
867
1121
  function isSessionProfileName(name) {
868
1122
  return typeof name === "string" && name.length <= MAX_SESSION_PROFILE_NAME_LENGTH && PROFILE_NAME.test(name);
869
1123
  }
870
- var SessionProfileNameSchema = z9.string().max(MAX_SESSION_PROFILE_NAME_LENGTH).regex(PROFILE_NAME).meta({ ref: "SessionProfileName" });
1124
+ var SessionProfileNameSchema = z10.string().max(MAX_SESSION_PROFILE_NAME_LENGTH).regex(PROFILE_NAME).meta({ ref: "SessionProfileName" });
871
1125
  function ms(value) {
872
1126
  return DurationSchema.safeParse(value).success ? durationToMs(value) : Number.NaN;
873
1127
  }
@@ -885,7 +1139,7 @@ var profileFields = {
885
1139
  idleTimeout: bounded(MIN_IDLE_TIMEOUT, MAX_SESSION_TIMEOUT).default("7d"),
886
1140
  absoluteTimeout: bounded(MIN_IDLE_TIMEOUT, MAX_SESSION_TIMEOUT).nullable().default("30d"),
887
1141
  stepUpAfter: bounded(MIN_STEP_UP_AFTER, MAX_STEP_UP_AFTER).nullable().default(null),
888
- clientSelectable: z9.boolean().default(false),
1142
+ clientSelectable: z10.boolean().default(false),
889
1143
  jwtTemplate: SessionProfileNameSchema.nullable().default(null),
890
1144
  deviceBinding: DeviceBindingPolicySchema.default("optional")
891
1145
  };
@@ -910,13 +1164,13 @@ var accessWithinIdle = {
910
1164
  function accessFits(profile) {
911
1165
  return !(ms(profile.accessTokenTtl) > ms(profile.idleTimeout));
912
1166
  }
913
- var SessionProfileSchema = z9.strictObject({ ...profileFields, refresh: z9.strictObject(refreshFields).prefault({}) }).refine(idleFits, idleWithinAbsolute).refine(accessFits, accessWithinIdle).meta({ ref: "SessionProfile" });
914
- var WebSessionProfileSchema = z9.strictObject({ ...webProfileFields, refresh: z9.strictObject(refreshFields).prefault({}) }).refine(idleFits, idleWithinAbsolute).refine(accessFits, accessWithinIdle).meta({ ref: "WebSessionProfile" });
915
- var StoredProfile = z9.object({ ...profileFields, refresh: z9.object(refreshFields).prefault({}) }).refine(idleFits, idleWithinAbsolute);
916
- var StoredWebProfile = z9.object({ ...webProfileFields, refresh: z9.object(refreshFields).prefault({}) }).refine(idleFits, idleWithinAbsolute);
1167
+ var SessionProfileSchema = z10.strictObject({ ...profileFields, refresh: z10.strictObject(refreshFields).prefault({}) }).refine(idleFits, idleWithinAbsolute).refine(accessFits, accessWithinIdle).meta({ ref: "SessionProfile" });
1168
+ var WebSessionProfileSchema = z10.strictObject({ ...webProfileFields, refresh: z10.strictObject(refreshFields).prefault({}) }).refine(idleFits, idleWithinAbsolute).refine(accessFits, accessWithinIdle).meta({ ref: "WebSessionProfile" });
1169
+ var StoredProfile = z10.object({ ...profileFields, refresh: z10.object(refreshFields).prefault({}) }).refine(idleFits, idleWithinAbsolute);
1170
+ var StoredWebProfile = z10.object({ ...webProfileFields, refresh: z10.object(refreshFields).prefault({}) }).refine(idleFits, idleWithinAbsolute);
917
1171
  var DEFAULT_WEB_SESSION_PROFILE = WebSessionProfileSchema.parse({});
918
1172
  var DEFAULT_MOBILE_SESSION_PROFILE = SessionProfileSchema.parse({});
919
- var SessionLimitActionSchema = z9.enum(["end_oldest", "refuse_newest"]).meta({ ref: "SessionLimitAction" });
1173
+ var SessionLimitActionSchema = z10.enum(["end_oldest", "refuse_newest"]).meta({ ref: "SessionLimitAction" });
920
1174
  function isBuiltIn(name) {
921
1175
  return BUILT_IN_SESSION_PROFILES.includes(name);
922
1176
  }
@@ -929,7 +1183,7 @@ var PROFILE_SCHEMAS = {
929
1183
  };
930
1184
  function profilesOf(kind) {
931
1185
  const { web, other } = PROFILE_SCHEMAS[kind];
932
- return z9.object({ web: web.prefault({}), mobile: other.prefault({}) }).catchall(other).refine((profiles) => customNames(profiles).every(isSessionProfileName), {
1186
+ return z10.object({ web: web.prefault({}), mobile: other.prefault({}) }).catchall(other).refine((profiles) => customNames(profiles).every(isSessionProfileName), {
933
1187
  message: `a profile name is lowercase letters, digits and single hyphens, starting with a letter, at most ${MAX_SESSION_PROFILE_NAME_LENGTH} characters`
934
1188
  }).refine((profiles) => customNames(profiles).length <= MAX_CUSTOM_SESSION_PROFILES, {
935
1189
  message: `at most ${MAX_CUSTOM_SESSION_PROFILES} profiles besides web and mobile`
@@ -939,10 +1193,10 @@ function profilesOf(kind) {
939
1193
  });
940
1194
  }
941
1195
  var TEMPLATE_NAME_RULE = `a template name is lowercase letters, digits and single hyphens, starting with a letter, at most ${MAX_SESSION_PROFILE_NAME_LENGTH} characters`;
942
- var JwtTemplates = z9.record(z9.string().refine(isSessionProfileName, { message: TEMPLATE_NAME_RULE }), JwtTemplateSchema).refine((templates) => Object.keys(templates).length <= MAX_JWT_TEMPLATES2, {
1196
+ var JwtTemplates = z10.record(z10.string().refine(isSessionProfileName, { message: TEMPLATE_NAME_RULE }), JwtTemplateSchema).refine((templates) => Object.keys(templates).length <= MAX_JWT_TEMPLATES2, {
943
1197
  message: `at most ${MAX_JWT_TEMPLATES2} templates`
944
1198
  }).default({});
945
- var StoredJwtTemplates = z9.unknown().optional().transform((stored) => {
1199
+ var StoredJwtTemplates = z10.unknown().optional().transform((stored) => {
946
1200
  const templates = {};
947
1201
  if (typeof stored !== "object" || stored === null || Array.isArray(stored)) {
948
1202
  return templates;
@@ -968,15 +1222,15 @@ function templatesExist(settings, context) {
968
1222
  }
969
1223
  }
970
1224
  var limitFields = {
971
- maxPerUser: z9.number().int().min(1).max(MAX_SESSIONS_PER_USER).nullable().default(null),
1225
+ maxPerUser: z10.number().int().min(1).max(MAX_SESSIONS_PER_USER).nullable().default(null),
972
1226
  onLimit: SessionLimitActionSchema.default("end_oldest")
973
1227
  };
974
- var SessionSettingsSchema = z9.strictObject({
1228
+ var SessionSettingsSchema = z10.strictObject({
975
1229
  profiles: profilesOf("strict").prefault({}),
976
1230
  ...limitFields,
977
1231
  jwtTemplates: JwtTemplates
978
1232
  }).superRefine(templatesExist).meta({ ref: "SessionSettings" });
979
- var StoredSessionSettingsSchema = z9.object({
1233
+ var StoredSessionSettingsSchema = z10.object({
980
1234
  profiles: profilesOf("stored").prefault({}),
981
1235
  ...limitFields,
982
1236
  jwtTemplates: StoredJwtTemplates
@@ -1165,10 +1419,10 @@ function smsSegments(text) {
1165
1419
  }
1166
1420
 
1167
1421
  // src/sms-template-schema.ts
1168
- import { z as z10 } from "zod";
1169
- var SmsTemplateSchema = z10.strictObject({ text: z10.string().max(MAX_SMS_TEMPLATE_LENGTH) }).meta({ ref: "SmsTemplate" });
1422
+ import { z as z11 } from "zod";
1423
+ var SmsTemplateSchema = z11.strictObject({ text: z11.string().max(MAX_SMS_TEMPLATE_LENGTH) }).meta({ ref: "SmsTemplate" });
1170
1424
  var shape2 = Object.fromEntries(SMS_TEMPLATE_KINDS.map((kind) => [kind, SmsTemplateSchema.optional()]));
1171
- var SmsTemplatesSchema = z10.strictObject(shape2).superRefine((templates, context) => {
1425
+ var SmsTemplatesSchema = z11.strictObject(shape2).superRefine((templates, context) => {
1172
1426
  for (const kind of SMS_TEMPLATE_KINDS) {
1173
1427
  const template = templates[kind];
1174
1428
  if (template === undefined) {
@@ -1193,7 +1447,7 @@ var MIN_PASSWORD_MIN_LENGTH = 8;
1193
1447
  var MAX_AUDIT_RETENTION_DAYS = 3650;
1194
1448
  var UNPRINTABLE3 = /[\p{Cc}\p{Zl}\p{Zp}]/u;
1195
1449
  var LABEL = "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?";
1196
- var HOST = `(?:${LABEL}(?:\\.${LABEL})*|\\[[0-9a-f:.]{2,45}\\])`;
1450
+ var HOST = `(?:${LABEL}(?:\\.${LABEL})*|\\[(?!.*:::)(?:[0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}\\])`;
1197
1451
  var PORT = "(?::([1-9][0-9]{0,4}))?";
1198
1452
  var HTTPS_ORIGIN = new RegExp(`^https://${HOST}${PORT}$`);
1199
1453
  var LOOPBACK_ORIGIN = new RegExp(`^http://(?:localhost|127\\.0\\.0\\.1|\\[::1\\])${PORT}$`);
@@ -1209,24 +1463,24 @@ function isWebOrigin(value) {
1209
1463
  function distinct(values) {
1210
1464
  return new Set(values).size === values.length;
1211
1465
  }
1212
- var WebOriginSchema = z11.string().max(255).refine(isWebOrigin, {
1466
+ var WebOriginSchema = z12.string().max(255).refine(isWebOrigin, {
1213
1467
  message: "must be an origin such as https://app.example.com (lowercase, no path, no wildcard; http only for localhost)"
1214
1468
  }).meta({ ref: "WebOrigin" });
1215
- var RedirectUrlSchema = z11.string().max(2048).refine(isRedirectUrl2, {
1469
+ var RedirectUrlSchema = z12.string().max(2048).refine(isRedirectUrl2, {
1216
1470
  message: "must be an absolute https URL (http only for localhost) with no credentials, fragment or wildcard, or a custom scheme with a full stop such as com.example.app:/oauth (no query, no fragment)"
1217
1471
  }).meta({ ref: "RedirectUrl" });
1218
- var App = z11.object({
1219
- name: z11.string().trim().min(1).max(MAX_APP_NAME_LENGTH).refine((name) => !UNPRINTABLE3.test(name), {
1472
+ var App = z12.object({
1473
+ name: z12.string().trim().min(1).max(MAX_APP_NAME_LENGTH).refine((name) => !UNPRINTABLE3.test(name), {
1220
1474
  message: "must not contain control characters or line breaks"
1221
1475
  }).default(DEFAULT_APP_NAME),
1222
- supportEmail: z11.email().max(254).nullable().default(null)
1476
+ supportEmail: z12.email().max(254).nullable().default(null)
1223
1477
  });
1224
1478
  var AppInput = App.strict().refine((app) => !hasHiddenCharacter2(app.name), {
1225
1479
  path: ["name"],
1226
1480
  message: "must not contain text-direction controls, private-use or unassigned characters, or half a surrogate pair"
1227
1481
  });
1228
- var PasswordMethod = z11.object({ enabled: z11.boolean().default(true) });
1229
- var OptionalMethod = z11.object({ enabled: z11.boolean().default(false) });
1482
+ var PasswordMethod = z12.object({ enabled: z12.boolean().default(true) });
1483
+ var OptionalMethod = z12.object({ enabled: z12.boolean().default(false) });
1230
1484
  var SIGN_IN_METHODS_WITHOUT_SIGN_UP = ["smsCode"];
1231
1485
  var AT_LEAST_ONE_SIGN_IN_METHOD = "at least one sign-in method must stay enabled";
1232
1486
  function hasEnabledSignInMethod(settings) {
@@ -1239,8 +1493,8 @@ var linkNeedsCode = {
1239
1493
  function linkHasCode(methods) {
1240
1494
  return !methods.emailLink.enabled || methods.emailCode.enabled;
1241
1495
  }
1242
- var SignUpPasswordModeSchema = z11.enum(["required", "optional"]).meta({ ref: "SignUpPasswordMode" });
1243
- var SignUp = z11.object({
1496
+ var SignUpPasswordModeSchema = z12.enum(["required", "optional"]).meta({ ref: "SignUpPasswordMode" });
1497
+ var SignUp = z12.object({
1244
1498
  password: SignUpPasswordModeSchema.default("required")
1245
1499
  });
1246
1500
  var passwordlessNeedsCode = {
@@ -1250,31 +1504,44 @@ var passwordlessNeedsCode = {
1250
1504
  function passwordlessHasCode(settings) {
1251
1505
  return settings.signUp.password === "required" || settings.signIn.methods.emailCode.enabled;
1252
1506
  }
1253
- var AllowedOrigins = z11.array(WebOriginSchema).max(MAX_ALLOWED_ORIGINS).refine(distinct, { message: "must not list an origin twice" });
1254
- var Urls = z11.object({
1507
+ var AllowedOrigins = z12.array(WebOriginSchema).max(MAX_ALLOWED_ORIGINS).refine(distinct, { message: "must not list an origin twice" });
1508
+ var Urls = z12.object({
1255
1509
  allowedOrigins: AllowedOrigins.default([]),
1256
- allowedRedirectUrls: z11.array(RedirectUrlSchema).max(MAX_ALLOWED_REDIRECT_URLS).refine(distinct, { message: "must not list a URL twice" }).default([])
1510
+ allowedRedirectUrls: z12.array(RedirectUrlSchema).max(MAX_ALLOWED_REDIRECT_URLS).refine(distinct, { message: "must not list a URL twice" }).default([])
1257
1511
  });
1258
- var Audit = z11.object({
1259
- retentionDays: z11.number().int().min(1).max(MAX_AUDIT_RETENTION_DAYS).nullable().default(null)
1512
+ var Audit = z12.object({
1513
+ retentionDays: z12.number().int().min(1).max(MAX_AUDIT_RETENTION_DAYS).nullable().default(null)
1260
1514
  });
1261
- var Agents = z11.object({
1262
- proposalsInProduction: z11.boolean().default(false),
1263
- testSignIn: z11.boolean().nullable().default(null)
1515
+ var Agents = z12.object({
1516
+ proposalsInProduction: z12.boolean().default(false),
1517
+ testSignIn: z12.boolean().nullable().default(null)
1264
1518
  });
1265
- var Notifications = z11.object({
1266
- passwordChanged: z11.boolean().default(true),
1267
- newSignIn: z11.boolean().default(true),
1268
- mfaChanged: z11.boolean().default(true),
1269
- identityChanged: z11.boolean().default(true)
1519
+ var Sso = z12.object({
1520
+ enabled: z12.boolean().default(false)
1270
1521
  });
1271
- var MfaPolicySchema = z11.enum(["off", "optional", "required"]).meta({ ref: "MfaPolicy" });
1272
- var Mfa = z11.object({
1522
+ var DEFAULT_MAX_ORGANIZATIONS_CREATED_PER_USER = 5;
1523
+ var MAX_ORGANIZATIONS_CREATED_PER_USER = 1000;
1524
+ var Organizations = z12.object({
1525
+ enabled: z12.boolean().default(false),
1526
+ allowUserCreated: z12.boolean().default(false),
1527
+ maxCreatedPerUser: z12.number().int().min(1).max(MAX_ORGANIZATIONS_CREATED_PER_USER).nullable().default(DEFAULT_MAX_ORGANIZATIONS_CREATED_PER_USER),
1528
+ creatorRole: RoleKeySchema.default("admin"),
1529
+ defaultRole: RoleKeySchema.default("member"),
1530
+ personalAccount: z12.boolean().default(true)
1531
+ });
1532
+ var Notifications = z12.object({
1533
+ passwordChanged: z12.boolean().default(true),
1534
+ newSignIn: z12.boolean().default(true),
1535
+ mfaChanged: z12.boolean().default(true),
1536
+ identityChanged: z12.boolean().default(true)
1537
+ });
1538
+ var MfaPolicySchema = z12.enum(["off", "optional", "required"]).meta({ ref: "MfaPolicy" });
1539
+ var Mfa = z12.object({
1273
1540
  policy: MfaPolicySchema.default("optional"),
1274
- smsCode: z11.object({ enabled: z11.boolean().default(false) }).prefault({})
1541
+ smsCode: z12.object({ enabled: z12.boolean().default(false) }).prefault({})
1275
1542
  });
1276
1543
  var MfaInput = Mfa.extend({
1277
- smsCode: z11.strictObject({ enabled: z11.boolean().default(false) }).prefault({})
1544
+ smsCode: z12.strictObject({ enabled: z12.boolean().default(false) }).prefault({})
1278
1545
  }).strict();
1279
1546
  var RP_ID = new RegExp(`^(?:localhost|${LABEL}(?:\\.${LABEL})+)$`);
1280
1547
  function isRelyingPartyId(value) {
@@ -1289,8 +1556,8 @@ function originMatchesRelyingParty(origin, rpId) {
1289
1556
  }
1290
1557
  return host === rpId || host.endsWith(`.${rpId}`);
1291
1558
  }
1292
- var Passkeys = z11.object({
1293
- rpId: z11.string().refine(isRelyingPartyId, {
1559
+ var Passkeys = z12.object({
1560
+ rpId: z12.string().refine(isRelyingPartyId, {
1294
1561
  message: "must be a domain such as example.com, or localhost (no scheme, port or path)"
1295
1562
  }).nullable().default(null)
1296
1563
  });
@@ -1301,20 +1568,20 @@ var passkeyNeedsRpId = {
1301
1568
  function passkeyHasRpId(settings) {
1302
1569
  return !settings.signIn.methods.passkey.enabled || settings.passkeys.rpId !== null;
1303
1570
  }
1304
- var SmsCountrySchema = z11.string().refine(isSmsCountry, {
1571
+ var SmsCountrySchema = z12.string().refine(isSmsCountry, {
1305
1572
  message: "must be an ISO 3166-1 alpha-2 country code in upper case, such as DE"
1306
1573
  }).meta({ ref: "SmsCountry" });
1307
- var SmsCountries = z11.array(SmsCountrySchema).max(SMS_COUNTRIES.length).refine(distinct, { message: "must not list a country twice" });
1308
- var Sms = z11.object({
1309
- enabled: z11.boolean().default(false),
1574
+ var SmsCountries = z12.array(SmsCountrySchema).max(SMS_COUNTRIES.length).refine(distinct, { message: "must not list a country twice" });
1575
+ var Sms = z12.object({
1576
+ enabled: z12.boolean().default(false),
1310
1577
  allowedCountries: SmsCountries.default([]),
1311
- dailyMessageLimit: z11.number().int().min(1).max(MAX_SMS_DAILY_MESSAGE_LIMIT).default(DEFAULT_SMS_DAILY_MESSAGE_LIMIT),
1578
+ dailyMessageLimit: z12.number().int().min(1).max(MAX_SMS_DAILY_MESSAGE_LIMIT).default(DEFAULT_SMS_DAILY_MESSAGE_LIMIT),
1312
1579
  templates: SmsTemplatesSchema.default({})
1313
1580
  });
1314
1581
  var password = PasswordPolicySchema.default(PASSWORD_POLICY_PRESETS.recommended);
1315
- var version = z11.literal(1).default(1);
1316
- var SignIn = z11.strictObject({
1317
- methods: z11.strictObject({
1582
+ var version = z12.literal(1).default(1);
1583
+ var SignIn = z12.strictObject({
1584
+ methods: z12.strictObject({
1318
1585
  password: PasswordMethod.strict().prefault({}),
1319
1586
  emailCode: OptionalMethod.strict().prefault({}),
1320
1587
  emailLink: OptionalMethod.strict().prefault({}),
@@ -1326,7 +1593,7 @@ var minLengthFloor = {
1326
1593
  message: `must be at least ${MIN_PASSWORD_MIN_LENGTH}`,
1327
1594
  path: ["password", "minLength"]
1328
1595
  };
1329
- var EnvironmentSettingsSchema = z11.strictObject({
1596
+ var EnvironmentSettingsSchema = z12.strictObject({
1330
1597
  version,
1331
1598
  app: App.strict().prefault({}),
1332
1599
  password,
@@ -1335,6 +1602,8 @@ var EnvironmentSettingsSchema = z11.strictObject({
1335
1602
  urls: Urls.strict().prefault({}),
1336
1603
  audit: Audit.strict().prefault({}),
1337
1604
  agents: Agents.strict().prefault({}),
1605
+ organizations: Organizations.strict().prefault({}),
1606
+ sso: Sso.strict().prefault({}),
1338
1607
  notifications: Notifications.strict().prefault({}),
1339
1608
  mfa: MfaInput.prefault({}),
1340
1609
  passkeys: Passkeys.strict().prefault({}),
@@ -1342,18 +1611,20 @@ var EnvironmentSettingsSchema = z11.strictObject({
1342
1611
  sms: Sms.strict().prefault({}),
1343
1612
  emails: EmailSettingsSchema.prefault({})
1344
1613
  }).refine((settings) => settings.password.minLength >= MIN_PASSWORD_MIN_LENGTH, minLengthFloor).refine(passwordlessHasCode, passwordlessNeedsCode).refine(passkeyHasRpId, passkeyNeedsRpId).meta({ ref: "EnvironmentSettings" });
1345
- var EnvironmentSettingsInputSchema = z11.strictObject({
1614
+ var EnvironmentSettingsInputSchema = z12.strictObject({
1346
1615
  version,
1347
1616
  app: AppInput.prefault({}),
1348
1617
  password: PasswordPolicySchema.optional(),
1349
1618
  signIn: SignIn,
1350
1619
  signUp: SignUp.strict().prefault({}),
1351
- urls: z11.strictObject({
1620
+ urls: z12.strictObject({
1352
1621
  allowedOrigins: AllowedOrigins.optional(),
1353
1622
  allowedRedirectUrls: Urls.shape.allowedRedirectUrls
1354
1623
  }).prefault({}),
1355
1624
  audit: Audit.strict().prefault({}),
1356
1625
  agents: Agents.strict().prefault({}),
1626
+ organizations: Organizations.strict().prefault({}),
1627
+ sso: Sso.strict().prefault({}),
1357
1628
  notifications: Notifications.strict().prefault({}),
1358
1629
  mfa: MfaInput.prefault({}),
1359
1630
  passkeys: Passkeys.strict().prefault({}),
@@ -1361,12 +1632,12 @@ var EnvironmentSettingsInputSchema = z11.strictObject({
1361
1632
  sms: Sms.strict().prefault({}),
1362
1633
  emails: EmailSettingsSchema.prefault({})
1363
1634
  }).refine((settings) => settings.password === undefined || settings.password.minLength >= MIN_PASSWORD_MIN_LENGTH, minLengthFloor).refine(passwordlessHasCode, passwordlessNeedsCode).refine(passkeyHasRpId, passkeyNeedsRpId).meta({ ref: "EnvironmentSettingsInput" });
1364
- var Stored = z11.object({
1635
+ var Stored = z12.object({
1365
1636
  version,
1366
1637
  app: App.prefault({}),
1367
1638
  password,
1368
- signIn: z11.object({
1369
- methods: z11.object({
1639
+ signIn: z12.object({
1640
+ methods: z12.object({
1370
1641
  password: PasswordMethod.prefault({}),
1371
1642
  emailCode: OptionalMethod.prefault({}),
1372
1643
  emailLink: OptionalMethod.prefault({}),
@@ -1378,6 +1649,8 @@ var Stored = z11.object({
1378
1649
  urls: Urls.prefault({}),
1379
1650
  audit: Audit.prefault({}),
1380
1651
  agents: Agents.prefault({}),
1652
+ organizations: Organizations.prefault({}),
1653
+ sso: Sso.prefault({}),
1381
1654
  notifications: Notifications.prefault({}),
1382
1655
  mfa: Mfa.prefault({}),
1383
1656
  passkeys: Passkeys.prefault({}),
@@ -1457,40 +1730,45 @@ function parseStoredEnvironmentSettings(stored) {
1457
1730
  }
1458
1731
  var CONFIG_TOOL_PATTERN = /^[a-z0-9][a-z0-9._-]{0,31}$/;
1459
1732
  var CONFIG_HASH_PATTERN = /^sha256:[0-9a-f]{64}$/;
1460
- var SettingsManagedBySchema = z11.object({
1461
- tool: z11.string().regex(CONFIG_TOOL_PATTERN),
1462
- configHash: z11.string().regex(CONFIG_HASH_PATTERN),
1463
- at: z11.iso.datetime(),
1464
- revision: z11.number().int().min(1),
1465
- drifted: z11.boolean()
1733
+ var SettingsManagedBySchema = z12.object({
1734
+ tool: z12.string().regex(CONFIG_TOOL_PATTERN),
1735
+ configHash: z12.string().regex(CONFIG_HASH_PATTERN),
1736
+ at: z12.iso.datetime(),
1737
+ revision: z12.number().int().min(1),
1738
+ drifted: z12.boolean()
1466
1739
  }).meta({ ref: "SettingsManagedBy" });
1467
- var ClientConfigSchema = z11.object({
1468
- app: z11.object({ name: z11.string(), supportEmail: z11.string().nullable() }),
1469
- signIn: z11.object({
1470
- methods: z11.array(z11.string()),
1471
- oauth: z11.array(z11.string()).optional()
1740
+ var ClientConfigSchema = z12.object({
1741
+ app: z12.object({ name: z12.string(), supportEmail: z12.string().nullable() }),
1742
+ signIn: z12.object({
1743
+ methods: z12.array(z12.string()),
1744
+ oauth: z12.array(z12.string()).optional()
1472
1745
  }),
1473
- signUp: z11.object({ password: SignUpPasswordModeSchema }).optional(),
1746
+ signUp: z12.object({ password: SignUpPasswordModeSchema }).optional(),
1474
1747
  password: PasswordPolicySchema,
1475
- mfa: z11.object({ policy: MfaPolicySchema, smsCode: z11.boolean().optional() }).optional(),
1476
- phone: z11.object({ enabled: z11.boolean() }).optional()
1748
+ mfa: z12.object({ policy: MfaPolicySchema, smsCode: z12.boolean().optional() }).optional(),
1749
+ phone: z12.object({ enabled: z12.boolean() }).optional(),
1750
+ organizations: z12.object({
1751
+ enabled: z12.boolean(),
1752
+ allowUserCreated: z12.boolean(),
1753
+ personalAccount: z12.boolean()
1754
+ }).optional()
1477
1755
  }).meta({ ref: "ClientConfig" });
1478
1756
  // src/errors.ts
1479
- import { z as z12 } from "zod";
1480
- var ErrorCodeSchema = z12.enum(ERROR_CODES2).meta({ ref: "ErrorCode" });
1481
- var ErrorParamsSchema = z12.record(z12.string(), z12.union([z12.string(), z12.number(), z12.boolean()])).meta({ ref: "ErrorParams" });
1482
- var FieldErrorSchema = z12.object({
1483
- field: z12.string(),
1757
+ import { z as z13 } from "zod";
1758
+ var ErrorCodeSchema = z13.enum(ERROR_CODES2).meta({ ref: "ErrorCode" });
1759
+ var ErrorParamsSchema = z13.record(z13.string(), z13.union([z13.string(), z13.number(), z13.boolean()])).meta({ ref: "ErrorParams" });
1760
+ var FieldErrorSchema = z13.object({
1761
+ field: z13.string(),
1484
1762
  code: ErrorCodeSchema,
1485
- message: z12.string(),
1763
+ message: z13.string(),
1486
1764
  params: ErrorParamsSchema.optional()
1487
1765
  }).meta({ ref: "FieldError" });
1488
- var ErrorEnvelopeSchema = z12.object({
1489
- status: z12.number().int(),
1766
+ var ErrorEnvelopeSchema = z13.object({
1767
+ status: z13.number().int(),
1490
1768
  code: ErrorCodeSchema,
1491
- detail: z12.string(),
1769
+ detail: z13.string(),
1492
1770
  params: ErrorParamsSchema.optional(),
1493
- errors: z12.array(FieldErrorSchema).optional()
1771
+ errors: z13.array(FieldErrorSchema).optional()
1494
1772
  }).meta({ ref: "ErrorEnvelope" });
1495
1773
  // src/event-fixtures.ts
1496
1774
  var USER = "0199c2f4-7a10-7c3e-9b1a-5d2e8f4a6c01";
@@ -1502,7 +1780,14 @@ var SIGNING_KEY = "0199c2f4-7a15-7d88-86f7-9a4b5e1d2c06";
1502
1780
  var WEBHOOK_ENDPOINT = "0199c2f4-7a18-7abb-99ca-cd7e8b4a5f09";
1503
1781
  var HOOK = "0199c2f4-7a19-7bcc-8adb-de8f9c5b6a10";
1504
1782
  var NATIVE_APP = "0199c2f4-7a1a-7cdd-9bec-ef9a0d6c7b11";
1783
+ var SSO_CONNECTION = "0199c2f4-7a1a-7cdd-9bec-ef9a0d6c7b9c";
1784
+ var SCIM_TOKEN = "0199c2f4-7a1b-7cde-8cfd-f0ab1e7d8cad";
1505
1785
  var PROPOSAL = "0199c2f4-7a1b-7dee-8cfd-f0ab1e7d8c12";
1786
+ var ORGANIZATION = "0199c2f4-7a1d-7f00-8e1f-12cd3a9f0e14";
1787
+ var MEMBERSHIP = "0199c2f4-7a1e-7011-9f2a-23de4b0a1f15";
1788
+ var ORGANIZATION_ROLE = "0199c2f4-7a1f-7122-8a3b-34ef5c1b2a16";
1789
+ var ORGANIZATION_DOMAIN = "0199c2f4-7a21-7344-8c5d-56a17e3d4c18";
1790
+ var INVITATION = "0199c2f4-7a20-7233-9b4c-45f06d2c3b17";
1506
1791
  var AGENT = "0199c2f4-7a1c-7eff-9d0e-01bc2f8e9d13";
1507
1792
  var schemaVersion = EVENT_SCHEMA_VERSION2;
1508
1793
  var occurredAt = "2026-10-08T09:30:00.000Z";
@@ -1517,6 +1802,18 @@ var aboutEnvironment = { type: "environment", id: ENVIRONMENT };
1517
1802
  var aboutWebhookEndpoint = { type: "webhook_endpoint", id: WEBHOOK_ENDPOINT };
1518
1803
  var aboutHook = { type: "hook", id: HOOK };
1519
1804
  var aboutNativeApp = { type: "native_app", id: NATIVE_APP };
1805
+ var aboutSsoConnection = { type: "sso_connection", id: SSO_CONNECTION };
1806
+ var SETUP_LINK = "0199c2f4-7a1b-7cde-8cfd-f0ab1e7d8cae";
1807
+ var aboutSetupLink = { type: "setup_link", id: SETUP_LINK };
1808
+ var SCIM_GROUP = "0199c2f4-7a1b-7cde-8cfd-f0ab1e7d8caf";
1809
+ var aboutScimGroup = { type: "scim_group", id: SCIM_GROUP };
1810
+ var aboutScimToken = { type: "scim_token", id: SCIM_TOKEN };
1811
+ var directory = { type: "directory", id: SCIM_TOKEN };
1812
+ var aboutOrganization = { type: "organization", id: ORGANIZATION };
1813
+ var aboutMembership = { type: "organization_membership", id: MEMBERSHIP };
1814
+ var aboutRole = { type: "organization_role", id: ORGANIZATION_ROLE };
1815
+ var aboutDomain = { type: "organization_domain", id: ORGANIZATION_DOMAIN };
1816
+ var aboutInvitation = { type: "organization_invitation", id: INVITATION };
1520
1817
  var aboutProposal = { type: "proposal", id: PROPOSAL };
1521
1818
  var proposed = { operation: "ban_user", targetType: "user", targetId: USER };
1522
1819
  function eventId(n) {
@@ -1538,6 +1835,15 @@ var EVENT_FIXTURES = {
1538
1835
  test: true
1539
1836
  }
1540
1837
  },
1838
+ "user.imported": {
1839
+ id: eventId(114),
1840
+ type: "user.imported",
1841
+ schemaVersion,
1842
+ occurredAt,
1843
+ actor: admin,
1844
+ target: aboutUser,
1845
+ data: { emailVerified: true, passwordless: false, passwordAlgorithm: "bcrypt" }
1846
+ },
1541
1847
  "user.email_verified": {
1542
1848
  id: eventId(2),
1543
1849
  type: "user.email_verified",
@@ -1628,6 +1934,15 @@ var EVENT_FIXTURES = {
1628
1934
  target: aboutUser,
1629
1935
  data: { provider: "google", method: "auto" }
1630
1936
  },
1937
+ "user.sso_linked": {
1938
+ id: eventId(122),
1939
+ type: "user.sso_linked",
1940
+ schemaVersion,
1941
+ occurredAt,
1942
+ actor: user,
1943
+ target: aboutUser,
1944
+ data: { connectionId: "0190a1b2-0000-7000-8000-0000000000c1", method: "email" }
1945
+ },
1631
1946
  "user.identity_unlinked": {
1632
1947
  id: eventId(12),
1633
1948
  type: "user.identity_unlinked",
@@ -1950,6 +2265,279 @@ var EVENT_FIXTURES = {
1950
2265
  target: aboutNativeApp,
1951
2266
  data: { platform: "android" }
1952
2267
  },
2268
+ "sso_connection.created": {
2269
+ id: eventId(119),
2270
+ type: "sso_connection.created",
2271
+ schemaVersion,
2272
+ occurredAt,
2273
+ actor: admin,
2274
+ target: aboutSsoConnection,
2275
+ data: { protocol: "oidc", status: "draft", domains: 1 }
2276
+ },
2277
+ "sso_connection.updated": {
2278
+ id: eventId(120),
2279
+ type: "sso_connection.updated",
2280
+ schemaVersion,
2281
+ occurredAt,
2282
+ actor: admin,
2283
+ target: aboutSsoConnection,
2284
+ data: { protocol: "oidc", changed: ["status"], status: "disabled", weakened: true }
2285
+ },
2286
+ "scim_token.created": {
2287
+ id: eventId(1431),
2288
+ type: "scim_token.created",
2289
+ schemaVersion,
2290
+ occurredAt,
2291
+ actor: admin,
2292
+ target: aboutScimToken,
2293
+ data: { organizationId: ORGANIZATION }
2294
+ },
2295
+ "scim_token.revoked": {
2296
+ id: eventId(1432),
2297
+ type: "scim_token.revoked",
2298
+ schemaVersion,
2299
+ occurredAt,
2300
+ actor: admin,
2301
+ target: aboutScimToken,
2302
+ data: { organizationId: ORGANIZATION }
2303
+ },
2304
+ "setup_link.created": {
2305
+ id: eventId(1440),
2306
+ type: "setup_link.created",
2307
+ schemaVersion,
2308
+ occurredAt,
2309
+ actor: admin,
2310
+ target: aboutSetupLink,
2311
+ data: { organizationId: ORGANIZATION }
2312
+ },
2313
+ "setup_link.revoked": {
2314
+ id: eventId(1441),
2315
+ type: "setup_link.revoked",
2316
+ schemaVersion,
2317
+ occurredAt,
2318
+ actor: admin,
2319
+ target: aboutSetupLink,
2320
+ data: { organizationId: ORGANIZATION }
2321
+ },
2322
+ "user.scim_provisioned": {
2323
+ id: eventId(1433),
2324
+ type: "user.scim_provisioned",
2325
+ schemaVersion,
2326
+ occurredAt,
2327
+ actor: directory,
2328
+ target: aboutUser,
2329
+ data: { organizationId: ORGANIZATION, method: "created" }
2330
+ },
2331
+ "user.scim_updated": {
2332
+ id: eventId(1434),
2333
+ type: "user.scim_updated",
2334
+ schemaVersion,
2335
+ occurredAt,
2336
+ actor: directory,
2337
+ target: aboutUser,
2338
+ data: { organizationId: ORGANIZATION, changed: ["name"] }
2339
+ },
2340
+ "scim_group.created": {
2341
+ id: eventId(1435),
2342
+ type: "scim_group.created",
2343
+ schemaVersion,
2344
+ occurredAt,
2345
+ actor: directory,
2346
+ target: aboutScimGroup,
2347
+ data: { organizationId: ORGANIZATION }
2348
+ },
2349
+ "scim_group.updated": {
2350
+ id: eventId(1436),
2351
+ type: "scim_group.updated",
2352
+ schemaVersion,
2353
+ occurredAt,
2354
+ actor: directory,
2355
+ target: aboutScimGroup,
2356
+ data: { organizationId: ORGANIZATION, changed: ["members"] }
2357
+ },
2358
+ "scim_group.deleted": {
2359
+ id: eventId(1437),
2360
+ type: "scim_group.deleted",
2361
+ schemaVersion,
2362
+ occurredAt,
2363
+ actor: directory,
2364
+ target: aboutScimGroup,
2365
+ data: { organizationId: ORGANIZATION }
2366
+ },
2367
+ "sso_connection.deleted": {
2368
+ id: eventId(121),
2369
+ type: "sso_connection.deleted",
2370
+ schemaVersion,
2371
+ occurredAt,
2372
+ actor: admin,
2373
+ target: aboutSsoConnection,
2374
+ data: { protocol: "oidc" }
2375
+ },
2376
+ "organization.created": {
2377
+ id: eventId(46),
2378
+ type: "organization.created",
2379
+ schemaVersion,
2380
+ occurredAt,
2381
+ actor: admin,
2382
+ target: aboutOrganization,
2383
+ data: {}
2384
+ },
2385
+ "organization.updated": {
2386
+ id: eventId(47),
2387
+ type: "organization.updated",
2388
+ schemaVersion,
2389
+ occurredAt,
2390
+ actor: admin,
2391
+ target: aboutOrganization,
2392
+ data: { changed: ["name", "slug"] }
2393
+ },
2394
+ "organization.deleted": {
2395
+ id: eventId(48),
2396
+ type: "organization.deleted",
2397
+ schemaVersion,
2398
+ occurredAt,
2399
+ actor: admin,
2400
+ target: aboutOrganization,
2401
+ data: { memberships: 3 }
2402
+ },
2403
+ "organization_membership.added": {
2404
+ id: eventId(49),
2405
+ type: "organization_membership.added",
2406
+ schemaVersion,
2407
+ occurredAt,
2408
+ actor: admin,
2409
+ target: aboutMembership,
2410
+ data: { organizationId: ORGANIZATION, userId: USER, role: "member", via: "domain_auto_join" }
2411
+ },
2412
+ "organization_membership.role_changed": {
2413
+ id: eventId(50),
2414
+ type: "organization_membership.role_changed",
2415
+ schemaVersion,
2416
+ occurredAt,
2417
+ actor: admin,
2418
+ target: aboutMembership,
2419
+ data: { organizationId: ORGANIZATION, userId: USER, role: "admin", previousRole: "member" }
2420
+ },
2421
+ "organization_membership.removed": {
2422
+ id: eventId(51),
2423
+ type: "organization_membership.removed",
2424
+ schemaVersion,
2425
+ occurredAt,
2426
+ actor: admin,
2427
+ target: aboutMembership,
2428
+ data: { organizationId: ORGANIZATION, userId: USER, role: "member" }
2429
+ },
2430
+ "organization_role.created": {
2431
+ id: eventId(52),
2432
+ type: "organization_role.created",
2433
+ schemaVersion,
2434
+ occurredAt,
2435
+ actor: admin,
2436
+ target: aboutRole,
2437
+ data: { role: "billing_manager", permissions: 2 }
2438
+ },
2439
+ "organization_role.updated": {
2440
+ id: eventId(53),
2441
+ type: "organization_role.updated",
2442
+ schemaVersion,
2443
+ occurredAt,
2444
+ actor: admin,
2445
+ target: aboutRole,
2446
+ data: { role: "billing_manager", changed: ["permissions"], permissions: 3, weakened: true }
2447
+ },
2448
+ "organization_role.deleted": {
2449
+ id: eventId(54),
2450
+ type: "organization_role.deleted",
2451
+ schemaVersion,
2452
+ occurredAt,
2453
+ actor: admin,
2454
+ target: aboutRole,
2455
+ data: { role: "billing_manager" }
2456
+ },
2457
+ "organization_domain.claimed": {
2458
+ id: eventId(115),
2459
+ type: "organization_domain.claimed",
2460
+ schemaVersion,
2461
+ occurredAt,
2462
+ actor: user,
2463
+ target: aboutDomain,
2464
+ data: { organizationId: ORGANIZATION, domain: "acme.com", mode: "suggest" }
2465
+ },
2466
+ "organization_domain.verified": {
2467
+ id: eventId(116),
2468
+ type: "organization_domain.verified",
2469
+ schemaVersion,
2470
+ occurredAt,
2471
+ actor: user,
2472
+ target: aboutDomain,
2473
+ data: {
2474
+ organizationId: ORGANIZATION,
2475
+ domain: "acme.com",
2476
+ mode: "auto_join",
2477
+ reverified: true,
2478
+ weakened: true
2479
+ }
2480
+ },
2481
+ "organization_domain.updated": {
2482
+ id: eventId(117),
2483
+ type: "organization_domain.updated",
2484
+ schemaVersion,
2485
+ occurredAt,
2486
+ actor: admin,
2487
+ target: aboutDomain,
2488
+ data: {
2489
+ organizationId: ORGANIZATION,
2490
+ domain: "acme.com",
2491
+ mode: "auto_join",
2492
+ previousMode: "suggest",
2493
+ weakened: true
2494
+ }
2495
+ },
2496
+ "organization_domain.removed": {
2497
+ id: eventId(118),
2498
+ type: "organization_domain.removed",
2499
+ schemaVersion,
2500
+ occurredAt,
2501
+ actor: admin,
2502
+ target: aboutDomain,
2503
+ data: { organizationId: ORGANIZATION, domain: "acme.com" }
2504
+ },
2505
+ "organization_invitation.created": {
2506
+ id: eventId(55),
2507
+ type: "organization_invitation.created",
2508
+ schemaVersion,
2509
+ occurredAt,
2510
+ actor: admin,
2511
+ target: aboutInvitation,
2512
+ data: { organizationId: ORGANIZATION, role: "member" }
2513
+ },
2514
+ "organization_invitation.accepted": {
2515
+ id: eventId(56),
2516
+ type: "organization_invitation.accepted",
2517
+ schemaVersion,
2518
+ occurredAt,
2519
+ actor: user,
2520
+ target: aboutInvitation,
2521
+ data: { organizationId: ORGANIZATION, role: "member", userId: USER }
2522
+ },
2523
+ "organization_invitation.declined": {
2524
+ id: eventId(57),
2525
+ type: "organization_invitation.declined",
2526
+ schemaVersion,
2527
+ occurredAt,
2528
+ actor: user,
2529
+ target: aboutInvitation,
2530
+ data: { organizationId: ORGANIZATION, role: "member", userId: USER }
2531
+ },
2532
+ "organization_invitation.revoked": {
2533
+ id: eventId(58),
2534
+ type: "organization_invitation.revoked",
2535
+ schemaVersion,
2536
+ occurredAt,
2537
+ actor: admin,
2538
+ target: aboutInvitation,
2539
+ data: { organizationId: ORGANIZATION, role: "member" }
2540
+ },
1953
2541
  "session.refresh_proof_refused": {
1954
2542
  id: eventId(39),
1955
2543
  type: "session.refresh_proof_refused",
@@ -1977,6 +2565,15 @@ var EVENT_FIXTURES = {
1977
2565
  target: aboutProposal,
1978
2566
  data: { ...proposed, proposedBy: AGENT }
1979
2567
  },
2568
+ "proposal.rejected": {
2569
+ id: eventId(1442),
2570
+ type: "proposal.rejected",
2571
+ schemaVersion,
2572
+ occurredAt,
2573
+ actor: admin,
2574
+ target: aboutProposal,
2575
+ data: { ...proposed, proposedBy: AGENT }
2576
+ },
1980
2577
  "proposal.executed": {
1981
2578
  id: eventId(42),
1982
2579
  type: "proposal.executed",
@@ -1995,6 +2592,27 @@ var EVENT_FIXTURES = {
1995
2592
  target: aboutProposal,
1996
2593
  data: { ...proposed, approvedBy: admin, reason: "target_not_found" }
1997
2594
  },
2595
+ "audit.exported": {
2596
+ id: eventId(46),
2597
+ type: "audit.exported",
2598
+ schemaVersion,
2599
+ occurredAt,
2600
+ actor: admin,
2601
+ target: aboutEnvironment,
2602
+ data: {
2603
+ phase: "finished",
2604
+ format: "ndjson",
2605
+ rowCount: 1200,
2606
+ resumed: false,
2607
+ action: "user.banned",
2608
+ actorId: USER,
2609
+ actorType: "user",
2610
+ targetId: USER,
2611
+ organizationId: ORGANIZATION,
2612
+ from: "2026-10-01T00:00:00.000Z",
2613
+ to: occurredAt
2614
+ }
2615
+ },
1998
2616
  "sign_in_test.started": {
1999
2617
  id: eventId(44),
2000
2618
  type: "sign_in_test.started",
@@ -2015,19 +2633,19 @@ var EVENT_FIXTURES = {
2015
2633
  }
2016
2634
  };
2017
2635
  // src/events.ts
2018
- import { z as z20 } from "zod";
2636
+ import { z as z21 } from "zod";
2019
2637
 
2020
2638
  // src/hook.ts
2021
- import { z as z16 } from "zod";
2639
+ import { z as z17 } from "zod";
2022
2640
 
2023
2641
  // src/oauth.ts
2024
- import { z as z14 } from "zod";
2642
+ import { z as z15 } from "zod";
2025
2643
 
2026
2644
  // src/flow.ts
2027
- import { z as z13 } from "zod";
2028
- var SecondFactorMethodSchema = z13.enum(["totp", "passkey", "backup_code", "sms_code"]).meta({ ref: "SecondFactorMethod" });
2029
- var PreparedSecondFactorMethodSchema = z13.enum(["sms_code"]).meta({ ref: "PreparedSecondFactorMethod" });
2030
- var FirstFactorStrategySchema = z13.enum([
2645
+ import { z as z14 } from "zod";
2646
+ var SecondFactorMethodSchema = z14.enum(["totp", "passkey", "backup_code", "sms_code"]).meta({ ref: "SecondFactorMethod" });
2647
+ var PreparedSecondFactorMethodSchema = z14.enum(["sms_code"]).meta({ ref: "PreparedSecondFactorMethod" });
2648
+ var FirstFactorStrategySchema = z14.enum([
2031
2649
  "password",
2032
2650
  "email_code",
2033
2651
  "email_link",
@@ -2040,107 +2658,108 @@ var FirstFactorStrategySchema = z13.enum([
2040
2658
  "oauth_discord",
2041
2659
  "oauth_linkedin",
2042
2660
  "oauth_x",
2043
- "oauth_facebook"
2661
+ "oauth_facebook",
2662
+ "sso"
2044
2663
  ]).meta({ ref: "FirstFactorStrategy" });
2045
- var FactorEnrolmentMethodSchema = z13.enum(["totp"]).meta({ ref: "FactorEnrolmentMethod" });
2046
- var EmailVerificationStrategySchema = z13.enum(["email_code", "email_link"]).meta({ ref: "EmailVerificationStrategy" });
2047
- var PreparedFirstFactorStrategySchema = z13.enum(["email_code", "email_link", "sms_code"]).meta({ ref: "PreparedFirstFactorStrategy" });
2048
- var NewPasswordReasonSchema = z13.enum(["expired"]).meta({ ref: "NewPasswordReason" });
2049
- var FlowStepSchema = z13.discriminatedUnion("status", [
2050
- z13.object({ status: z13.literal("needs_identifier") }),
2051
- z13.object({ status: z13.literal("needs_password") }),
2052
- z13.object({
2053
- status: z13.literal("needs_first_factor"),
2054
- strategies: z13.array(FirstFactorStrategySchema).min(1),
2055
- prepared: z13.object({ strategy: PreparedFirstFactorStrategySchema, destination: z13.string() }).optional()
2664
+ var FactorEnrolmentMethodSchema = z14.enum(["totp"]).meta({ ref: "FactorEnrolmentMethod" });
2665
+ var EmailVerificationStrategySchema = z14.enum(["email_code", "email_link"]).meta({ ref: "EmailVerificationStrategy" });
2666
+ var PreparedFirstFactorStrategySchema = z14.enum(["email_code", "email_link", "sms_code"]).meta({ ref: "PreparedFirstFactorStrategy" });
2667
+ var NewPasswordReasonSchema = z14.enum(["expired"]).meta({ ref: "NewPasswordReason" });
2668
+ var FlowStepSchema = z14.discriminatedUnion("status", [
2669
+ z14.object({ status: z14.literal("needs_identifier") }),
2670
+ z14.object({ status: z14.literal("needs_password") }),
2671
+ z14.object({
2672
+ status: z14.literal("needs_first_factor"),
2673
+ strategies: z14.array(FirstFactorStrategySchema).min(1),
2674
+ prepared: z14.object({ strategy: PreparedFirstFactorStrategySchema, destination: z14.string() }).optional()
2056
2675
  }),
2057
- z13.object({
2058
- status: z13.literal("needs_email_verification"),
2059
- destination: z13.string(),
2060
- strategies: z13.array(EmailVerificationStrategySchema).min(1)
2676
+ z14.object({
2677
+ status: z14.literal("needs_email_verification"),
2678
+ destination: z14.string(),
2679
+ strategies: z14.array(EmailVerificationStrategySchema).min(1)
2061
2680
  }),
2062
- z13.object({
2063
- status: z13.literal("needs_new_password"),
2064
- destination: z13.string(),
2065
- strategies: z13.array(EmailVerificationStrategySchema),
2681
+ z14.object({
2682
+ status: z14.literal("needs_new_password"),
2683
+ destination: z14.string(),
2684
+ strategies: z14.array(EmailVerificationStrategySchema),
2066
2685
  reason: NewPasswordReasonSchema.optional()
2067
2686
  }).refine((step) => step.reason === undefined === step.strategies.length > 0, {
2068
2687
  message: "strategies is empty exactly when a reason is given",
2069
2688
  path: ["strategies"]
2070
2689
  }),
2071
- z13.object({
2072
- status: z13.literal("needs_second_factor"),
2073
- options: z13.array(SecondFactorMethodSchema).min(1),
2074
- prepared: z13.object({ method: PreparedSecondFactorMethodSchema, destination: z13.string() }).optional()
2690
+ z14.object({
2691
+ status: z14.literal("needs_second_factor"),
2692
+ options: z14.array(SecondFactorMethodSchema).min(1),
2693
+ prepared: z14.object({ method: PreparedSecondFactorMethodSchema, destination: z14.string() }).optional()
2075
2694
  }),
2076
- z13.object({
2077
- status: z13.literal("needs_factor_enrolment"),
2078
- methods: z13.array(FactorEnrolmentMethodSchema).min(1)
2695
+ z14.object({
2696
+ status: z14.literal("needs_factor_enrolment"),
2697
+ methods: z14.array(FactorEnrolmentMethodSchema).min(1)
2079
2698
  }),
2080
- z13.object({
2081
- status: z13.literal("complete"),
2082
- userId: z13.string(),
2083
- sessionId: z13.string()
2699
+ z14.object({
2700
+ status: z14.literal("complete"),
2701
+ userId: z14.string(),
2702
+ sessionId: z14.string()
2084
2703
  })
2085
2704
  ]).meta({ ref: "FlowStep" });
2086
- var FlowKindSchema = z13.enum(["sign_in", "sign_up", "password_reset"]).meta({ ref: "FlowKind" });
2087
- var SessionTokensSchema = z13.object({
2088
- sessionId: z13.string(),
2089
- accessToken: z13.string().optional(),
2090
- accessTokenExpiresAt: z13.iso.datetime().optional(),
2091
- refreshToken: z13.string().optional()
2705
+ var FlowKindSchema = z14.enum(["sign_in", "sign_up", "password_reset"]).meta({ ref: "FlowKind" });
2706
+ var SessionTokensSchema = z14.object({
2707
+ sessionId: z14.string(),
2708
+ accessToken: z14.string().optional(),
2709
+ accessTokenExpiresAt: z14.iso.datetime().optional(),
2710
+ refreshToken: z14.string().optional()
2092
2711
  }).meta({ ref: "SessionTokens" });
2093
- var FlowAttemptSchema = z13.object({
2094
- id: z13.string(),
2712
+ var FlowAttemptSchema = z14.object({
2713
+ id: z14.string(),
2095
2714
  kind: FlowKindSchema,
2096
- expiresAt: z13.iso.datetime(),
2715
+ expiresAt: z14.iso.datetime(),
2097
2716
  step: FlowStepSchema,
2098
- attemptSecret: z13.string().optional(),
2099
- linkBinding: z13.string().optional(),
2717
+ attemptSecret: z14.string().optional(),
2718
+ linkBinding: z14.string().optional(),
2100
2719
  session: SessionTokensSchema.optional(),
2101
- backupCodes: z13.array(z13.string()).optional(),
2102
- backupCodesRemaining: z13.number().int().min(0).optional()
2720
+ backupCodes: z14.array(z14.string()).optional(),
2721
+ backupCodesRemaining: z14.number().int().min(0).optional()
2103
2722
  }).meta({ ref: "FlowAttempt" });
2104
- var SignUpRequestSchema = z13.object({
2105
- email: z13.string().max(320),
2106
- password: z13.string().max(1024).optional(),
2107
- firstName: z13.string().trim().max(100).optional(),
2108
- lastName: z13.string().trim().max(100).optional()
2723
+ var SignUpRequestSchema = z14.object({
2724
+ email: z14.string().max(320),
2725
+ password: z14.string().max(1024).optional(),
2726
+ firstName: z14.string().trim().max(100).optional(),
2727
+ lastName: z14.string().trim().max(100).optional()
2109
2728
  }).meta({ ref: "SignUpRequest" });
2110
- var SignInStartRequestSchema = z13.object({ identifier: z13.string().max(320) }).meta({ ref: "SignInStartRequest" });
2111
- var PasswordAttemptRequestSchema = z13.object({ password: z13.string().max(1024) }).meta({ ref: "PasswordAttemptRequest" });
2729
+ var SignInStartRequestSchema = z14.object({ identifier: z14.string().max(320) }).meta({ ref: "SignInStartRequest" });
2730
+ var PasswordAttemptRequestSchema = z14.object({ password: z14.string().max(1024) }).meta({ ref: "PasswordAttemptRequest" });
2112
2731
  var MAX_LINK_FIELD_LENGTH = 2048;
2113
- var FirstFactorPrepareRequestSchema = z13.object({
2732
+ var FirstFactorPrepareRequestSchema = z14.object({
2114
2733
  strategy: PreparedFirstFactorStrategySchema,
2115
- redirectUrl: z13.string().max(MAX_LINK_FIELD_LENGTH).optional()
2734
+ redirectUrl: z14.string().max(MAX_LINK_FIELD_LENGTH).optional()
2116
2735
  }).meta({ ref: "FirstFactorPrepareRequest" });
2117
- var FirstFactorAttemptRequestSchema = z13.discriminatedUnion("strategy", [
2118
- z13.object({ strategy: z13.literal("email_code"), code: z13.string().regex(/^\d{6}$/) }),
2119
- z13.object({ strategy: z13.literal("email_link") }),
2120
- z13.object({ strategy: z13.literal("sms_code"), code: z13.string().regex(/^\d{6}$/) })
2736
+ var FirstFactorAttemptRequestSchema = z14.discriminatedUnion("strategy", [
2737
+ z14.object({ strategy: z14.literal("email_code"), code: z14.string().regex(/^\d{6}$/) }),
2738
+ z14.object({ strategy: z14.literal("email_link") }),
2739
+ z14.object({ strategy: z14.literal("sms_code"), code: z14.string().regex(/^\d{6}$/) })
2121
2740
  ]).meta({ ref: "FirstFactorAttemptRequest" });
2122
- var EmailLinkRequestSchema = z13.object({
2123
- token: z13.string().min(1).max(MAX_LINK_FIELD_LENGTH),
2124
- attemptId: z13.uuid(),
2125
- binding: z13.string().max(MAX_LINK_FIELD_LENGTH).optional()
2741
+ var EmailLinkRequestSchema = z14.object({
2742
+ token: z14.string().min(1).max(MAX_LINK_FIELD_LENGTH),
2743
+ attemptId: z14.uuid(),
2744
+ binding: z14.string().max(MAX_LINK_FIELD_LENGTH).optional()
2126
2745
  }).meta({ ref: "EmailLinkRequest" });
2127
- var EmailLinkResultSchema = z13.object({ status: z13.literal("verified") }).meta({ ref: "EmailLinkResult" });
2128
- var VerifyEmailRequestSchema = z13.object({ code: z13.string().regex(/^\d{6}$/) }).meta({ ref: "VerifyEmailRequest" });
2746
+ var EmailLinkResultSchema = z14.object({ status: z14.literal("verified") }).meta({ ref: "EmailLinkResult" });
2747
+ var VerifyEmailRequestSchema = z14.object({ code: z14.string().regex(/^\d{6}$/) }).meta({ ref: "VerifyEmailRequest" });
2129
2748
  var MAX_BACKUP_CODE_INPUT_LENGTH = 64;
2130
- var SecondFactorRequestSchema = z13.discriminatedUnion("method", [
2131
- z13.object({ method: z13.literal("totp"), code: z13.string().regex(/^\d{6}$/) }),
2132
- z13.object({ method: z13.literal("sms_code"), code: z13.string().regex(/^\d{6}$/) }),
2133
- z13.object({
2134
- method: z13.literal("backup_code"),
2135
- code: z13.string().min(1).max(MAX_BACKUP_CODE_INPUT_LENGTH)
2749
+ var SecondFactorRequestSchema = z14.discriminatedUnion("method", [
2750
+ z14.object({ method: z14.literal("totp"), code: z14.string().regex(/^\d{6}$/) }),
2751
+ z14.object({ method: z14.literal("sms_code"), code: z14.string().regex(/^\d{6}$/) }),
2752
+ z14.object({
2753
+ method: z14.literal("backup_code"),
2754
+ code: z14.string().min(1).max(MAX_BACKUP_CODE_INPUT_LENGTH)
2136
2755
  }),
2137
- z13.object({ method: z13.literal("passkey"), credential: PasskeyAssertionCredentialSchema })
2756
+ z14.object({ method: z14.literal("passkey"), credential: PasskeyAssertionCredentialSchema })
2138
2757
  ]).meta({ ref: "SecondFactorRequest" });
2139
- var SecondFactorPrepareRequestSchema = z13.object({ method: PreparedSecondFactorMethodSchema }).meta({ ref: "SecondFactorPrepareRequest" });
2140
- var PasskeySignInStartSchema = z13.object({ attempt: FlowAttemptSchema, options: PasskeyRequestOptionsSchema }).meta({ ref: "PasskeySignInStart" });
2141
- var PasswordResetStartRequestSchema = z13.object({ email: z13.string().max(320) }).meta({ ref: "PasswordResetStartRequest" });
2142
- var PasswordResetRequestSchema = z13.object({ code: z13.string().regex(/^\d{6}$/), password: z13.string().max(1024) }).meta({ ref: "PasswordResetRequest" });
2143
- var NewPasswordRequestSchema = z13.object({ password: z13.string().max(1024) }).meta({ ref: "NewPasswordRequest" });
2758
+ var SecondFactorPrepareRequestSchema = z14.object({ method: PreparedSecondFactorMethodSchema }).meta({ ref: "SecondFactorPrepareRequest" });
2759
+ var PasskeySignInStartSchema = z14.object({ attempt: FlowAttemptSchema, options: PasskeyRequestOptionsSchema }).meta({ ref: "PasskeySignInStart" });
2760
+ var PasswordResetStartRequestSchema = z14.object({ email: z14.string().max(320) }).meta({ ref: "PasswordResetStartRequest" });
2761
+ var PasswordResetRequestSchema = z14.object({ code: z14.string().regex(/^\d{6}$/), password: z14.string().max(1024) }).meta({ ref: "PasswordResetRequest" });
2762
+ var NewPasswordRequestSchema = z14.object({ password: z14.string().max(1024) }).meta({ ref: "NewPasswordRequest" });
2144
2763
 
2145
2764
  // src/oauth.ts
2146
2765
  var OAUTH_PROVIDERS = [
@@ -2153,7 +2772,7 @@ var OAUTH_PROVIDERS = [
2153
2772
  "x",
2154
2773
  "facebook"
2155
2774
  ];
2156
- var OAuthProviderSchema = z14.enum(OAUTH_PROVIDERS).meta({ ref: "OAuthProvider" });
2775
+ var OAuthProviderSchema = z15.enum(OAUTH_PROVIDERS).meta({ ref: "OAuthProvider" });
2157
2776
  var OAUTH_PROVIDERS_WITHOUT_ADDRESS = [
2158
2777
  "x",
2159
2778
  "facebook"
@@ -2163,7 +2782,7 @@ function givesNoAddress(provider) {
2163
2782
  }
2164
2783
  var MICROSOFT_TENANT_ALIASES = ["common", "organizations", "consumers"];
2165
2784
  var GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
2166
- var MicrosoftTenantSchema = z14.string().trim().toLowerCase().refine((value) => MICROSOFT_TENANT_ALIASES.includes(value) || GUID.test(value), { message: "must be common, organizations, consumers or a tenant id (a GUID)" }).meta({ ref: "MicrosoftTenant" });
2785
+ var MicrosoftTenantSchema = z15.string().trim().toLowerCase().refine((value) => MICROSOFT_TENANT_ALIASES.includes(value) || GUID.test(value), { message: "must be common, organizations, consumers or a tenant id (a GUID)" }).meta({ ref: "MicrosoftTenant" });
2167
2786
  var ID_TOKEN_PROVIDERS = [
2168
2787
  "google",
2169
2788
  "apple"
@@ -2175,23 +2794,23 @@ var ID_TOKEN_CLIENT_KINDS = {
2175
2794
  function takesAdditionalClientIds(provider) {
2176
2795
  return provider === "google";
2177
2796
  }
2178
- var IdTokenProviderSchema = z14.enum(ID_TOKEN_PROVIDERS).meta({ ref: "IdTokenProvider" });
2797
+ var IdTokenProviderSchema = z15.enum(ID_TOKEN_PROVIDERS).meta({ ref: "IdTokenProvider" });
2179
2798
  var MAX_ADDITIONAL_CLIENT_IDS = 8;
2180
2799
  var GOOGLE_CLIENT_ID = /^[0-9]{1,32}(-[0-9a-z]{1,64})?\.apps\.googleusercontent\.com$/;
2181
2800
  function isGoogleClientId(value) {
2182
2801
  return value.length <= 128 && GOOGLE_CLIENT_ID.test(value);
2183
2802
  }
2184
- var AdditionalClientIdsSchema = z14.array(z14.string().refine(isGoogleClientId, {
2803
+ var AdditionalClientIdsSchema = z15.array(z15.string().refine(isGoogleClientId, {
2185
2804
  message: "must be a Google OAuth client id (…apps.googleusercontent.com)"
2186
2805
  })).max(MAX_ADDITIONAL_CLIENT_IDS).refine((ids) => new Set(ids).size === ids.length, { message: "must not repeat a client id" }).meta({ ref: "AdditionalClientIds" });
2187
2806
  function ownClientIdAmong(clientId, additionalClientIds) {
2188
2807
  return additionalClientIds.indexOf(clientId);
2189
2808
  }
2190
2809
  var DEPENDENT_ACCOUNTS_SCAN_LIMIT = 1000;
2191
- var OAuthProviderDependentsSchema = z14.object({
2810
+ var OAuthProviderDependentsSchema = z15.object({
2192
2811
  provider: OAuthProviderSchema,
2193
- accounts: z14.number().int().min(0).max(DEPENDENT_ACCOUNTS_SCAN_LIMIT),
2194
- more: z14.boolean()
2812
+ accounts: z15.number().int().min(0).max(DEPENDENT_ACCOUNTS_SCAN_LIMIT),
2813
+ more: z15.boolean()
2195
2814
  }).meta({ ref: "OAuthProviderDependents" });
2196
2815
  function oauthProviderWeakenings(before, after) {
2197
2816
  const weakened = [];
@@ -2207,55 +2826,55 @@ function oauthProviderWeakenings(before, after) {
2207
2826
  }
2208
2827
  var MAX_ID_TOKEN_LENGTH = 8192;
2209
2828
  var MAX_ID_TOKEN_NAME_LENGTH = 100;
2210
- var IdTokenStartRequestSchema = z14.strictObject({ provider: IdTokenProviderSchema }).meta({ ref: "IdTokenStartRequest" });
2211
- var IdTokenStartSchema = z14.object({ attempt: FlowAttemptSchema, nonce: z14.string() }).meta({ ref: "IdTokenStart" });
2212
- var IdTokenExchangeRequestSchema = z14.strictObject({
2213
- idToken: z14.string().min(1).max(MAX_ID_TOKEN_LENGTH),
2214
- givenName: z14.string().max(MAX_ID_TOKEN_NAME_LENGTH).optional(),
2215
- familyName: z14.string().max(MAX_ID_TOKEN_NAME_LENGTH).optional()
2829
+ var IdTokenStartRequestSchema = z15.strictObject({ provider: IdTokenProviderSchema }).meta({ ref: "IdTokenStartRequest" });
2830
+ var IdTokenStartSchema = z15.object({ attempt: FlowAttemptSchema, nonce: z15.string() }).meta({ ref: "IdTokenStart" });
2831
+ var IdTokenExchangeRequestSchema = z15.strictObject({
2832
+ idToken: z15.string().min(1).max(MAX_ID_TOKEN_LENGTH),
2833
+ givenName: z15.string().max(MAX_ID_TOKEN_NAME_LENGTH).optional(),
2834
+ familyName: z15.string().max(MAX_ID_TOKEN_NAME_LENGTH).optional()
2216
2835
  }).meta({ ref: "IdTokenExchangeRequest" });
2217
2836
  var MAX_OAUTH_FIELD_LENGTH = 2048;
2218
- var OAuthStartRequestSchema = z14.object({
2837
+ var OAuthStartRequestSchema = z15.object({
2219
2838
  provider: OAuthProviderSchema,
2220
- redirectUrl: z14.string().max(MAX_OAUTH_FIELD_LENGTH)
2839
+ redirectUrl: z15.string().max(MAX_OAUTH_FIELD_LENGTH)
2221
2840
  }).meta({ ref: "OAuthStartRequest" });
2222
- var OAuthStartSchema = z14.object({
2841
+ var OAuthStartSchema = z15.object({
2223
2842
  attempt: FlowAttemptSchema,
2224
- authorizationUrl: z14.url(),
2225
- binding: z14.string()
2843
+ authorizationUrl: z15.url(),
2844
+ binding: z15.string()
2226
2845
  }).meta({ ref: "OAuthStart" });
2227
- var OAuthExchangeRequestSchema = z14.object({
2228
- ticket: z14.string().min(1).max(MAX_OAUTH_FIELD_LENGTH),
2229
- attemptId: z14.uuid(),
2230
- binding: z14.string().max(MAX_OAUTH_FIELD_LENGTH).optional()
2846
+ var OAuthExchangeRequestSchema = z15.object({
2847
+ ticket: z15.string().min(1).max(MAX_OAUTH_FIELD_LENGTH),
2848
+ attemptId: z15.uuid(),
2849
+ binding: z15.string().max(MAX_OAUTH_FIELD_LENGTH).optional()
2231
2850
  }).meta({ ref: "OAuthExchangeRequest" });
2232
- var IdentitySchema = z14.object({
2233
- id: z14.string(),
2234
- provider: z14.string(),
2235
- createdAt: z14.iso.datetime()
2851
+ var IdentitySchema = z15.object({
2852
+ id: z15.string(),
2853
+ provider: z15.string(),
2854
+ createdAt: z15.iso.datetime()
2236
2855
  }).meta({ ref: "Identity" });
2237
- var IdentityListSchema = z14.object({ data: z14.array(IdentitySchema) }).meta({ ref: "IdentityList" });
2238
- var IdentityLinkStartSchema = z14.object({
2239
- attemptId: z14.string(),
2240
- expiresAt: z14.iso.datetime(),
2241
- authorizationUrl: z14.url(),
2242
- binding: z14.string()
2856
+ var IdentityListSchema = z15.object({ data: z15.array(IdentitySchema) }).meta({ ref: "IdentityList" });
2857
+ var IdentityLinkStartSchema = z15.object({
2858
+ attemptId: z15.string(),
2859
+ expiresAt: z15.iso.datetime(),
2860
+ authorizationUrl: z15.url(),
2861
+ binding: z15.string()
2243
2862
  }).meta({ ref: "IdentityLinkStart" });
2244
- var OAuthProviderSettingsSchema = z14.object({
2863
+ var OAuthProviderSettingsSchema = z15.object({
2245
2864
  provider: OAuthProviderSchema,
2246
- configured: z14.boolean(),
2247
- enabled: z14.boolean(),
2248
- clientId: z14.string().nullable(),
2249
- teamId: z14.string().nullable(),
2250
- keyId: z14.string().nullable(),
2251
- tenant: z14.string().nullable(),
2252
- additionalClientIds: z14.array(z14.string()).default([]),
2253
- callbackUrl: z14.url(),
2254
- updatedAt: z14.iso.datetime().nullable()
2865
+ configured: z15.boolean(),
2866
+ enabled: z15.boolean(),
2867
+ clientId: z15.string().nullable(),
2868
+ teamId: z15.string().nullable(),
2869
+ keyId: z15.string().nullable(),
2870
+ tenant: z15.string().nullable(),
2871
+ additionalClientIds: z15.array(z15.string()).default([]),
2872
+ callbackUrl: z15.url(),
2873
+ updatedAt: z15.iso.datetime().nullable()
2255
2874
  }).meta({ ref: "OAuthProviderSettings" });
2256
- var OAuthProviderSettingsListSchema = z14.object({ data: z14.array(OAuthProviderSettingsSchema) }).meta({ ref: "OAuthProviderSettingsList" });
2257
- var credential = (max) => z14.string().trim().min(1).max(max);
2258
- var OAuthProviderUpdateSchema = z14.strictObject({
2875
+ var OAuthProviderSettingsListSchema = z15.object({ data: z15.array(OAuthProviderSettingsSchema) }).meta({ ref: "OAuthProviderSettingsList" });
2876
+ var credential = (max) => z15.string().trim().min(1).max(max);
2877
+ var OAuthProviderUpdateSchema = z15.strictObject({
2259
2878
  clientId: credential(512),
2260
2879
  clientSecret: credential(2048).optional(),
2261
2880
  teamId: credential(64).optional(),
@@ -2263,51 +2882,51 @@ var OAuthProviderUpdateSchema = z14.strictObject({
2263
2882
  privateKey: credential(8192).optional(),
2264
2883
  tenant: MicrosoftTenantSchema.optional(),
2265
2884
  additionalClientIds: AdditionalClientIdsSchema.optional(),
2266
- enabled: z14.boolean().default(true)
2885
+ enabled: z15.boolean().default(true)
2267
2886
  }).meta({ ref: "OAuthProviderUpdate" });
2268
2887
 
2269
2888
  // src/webhook.ts
2270
- import { z as z15 } from "zod";
2889
+ import { z as z16 } from "zod";
2271
2890
  var MAX_WEBHOOK_URL_LENGTH = 2048;
2272
2891
  var MAX_WEBHOOK_ENDPOINTS = 10;
2273
- var url = () => z15.string().min(1).max(MAX_WEBHOOK_URL_LENGTH).regex(/^[^\s\u0000-\u001f\u007f]+$/, "Must not contain spaces or control characters.");
2274
- var eventTypes = () => z15.array(z15.enum(ACTIVITY_TYPES2)).min(1).max(ACTIVITY_TYPES2.length).refine((types) => new Set(types).size === types.length, {
2892
+ var url = () => z16.string().min(1).max(MAX_WEBHOOK_URL_LENGTH).regex(/^[^\s\u0000-\u001f\u007f]+$/, "Must not contain spaces or control characters.");
2893
+ var eventTypes = () => z16.array(z16.enum(ACTIVITY_TYPES2)).min(1).max(ACTIVITY_TYPES2.length).refine((types) => new Set(types).size === types.length, {
2275
2894
  message: "An event type is listed more than once."
2276
2895
  });
2277
- var WebhookEndpointSchema = z15.object({
2278
- id: z15.uuid(),
2279
- url: z15.string(),
2280
- eventTypes: z15.array(z15.string()),
2281
- enabled: z15.boolean(),
2282
- disabledReason: z15.string().nullable(),
2283
- failingSince: z15.iso.datetime().nullable(),
2284
- lastFailedAt: z15.iso.datetime().nullable(),
2285
- rotationOverlapEndsAt: z15.iso.datetime().nullable(),
2286
- createdAt: z15.iso.datetime(),
2287
- updatedAt: z15.iso.datetime()
2896
+ var WebhookEndpointSchema = z16.object({
2897
+ id: z16.uuid(),
2898
+ url: z16.string(),
2899
+ eventTypes: z16.array(z16.string()),
2900
+ enabled: z16.boolean(),
2901
+ disabledReason: z16.string().nullable(),
2902
+ failingSince: z16.iso.datetime().nullable(),
2903
+ lastFailedAt: z16.iso.datetime().nullable(),
2904
+ rotationOverlapEndsAt: z16.iso.datetime().nullable(),
2905
+ createdAt: z16.iso.datetime(),
2906
+ updatedAt: z16.iso.datetime()
2288
2907
  }).meta({ ref: "WebhookEndpoint" });
2289
2908
  var CreatedWebhookEndpointSchema = WebhookEndpointSchema.extend({
2290
- secret: z15.string().describe("The signing secret. Store it now: it is shown only once.")
2909
+ secret: z16.string().describe("The signing secret. Store it now: it is shown only once.")
2291
2910
  }).meta({ ref: "CreatedWebhookEndpoint" });
2292
2911
  var RotatedWebhookSecretSchema = WebhookEndpointSchema.extend({
2293
- secret: z15.string().describe("The new signing secret. Store it now: it is shown only once."),
2294
- rotationOverlapEndsAt: z15.iso.datetime().describe("When the previous secret stops signing. Until then deliveries carry both signatures.")
2912
+ secret: z16.string().describe("The new signing secret. Store it now: it is shown only once."),
2913
+ rotationOverlapEndsAt: z16.iso.datetime().describe("When the previous secret stops signing. Until then deliveries carry both signatures.")
2295
2914
  }).meta({ ref: "RotatedWebhookSecret" });
2296
2915
  var WEBHOOK_ROTATION_REFUSALS = [
2297
2916
  "rotation_in_progress",
2298
2917
  "no_rotation_in_progress",
2299
2918
  "secret_unreadable"
2300
2919
  ];
2301
- var WebhookEndpointListSchema = z15.object({ data: z15.array(WebhookEndpointSchema) }).meta({ ref: "WebhookEndpointList" });
2302
- var CreateWebhookEndpointRequestSchema = z15.strictObject({
2920
+ var WebhookEndpointListSchema = z16.object({ data: z16.array(WebhookEndpointSchema) }).meta({ ref: "WebhookEndpointList" });
2921
+ var CreateWebhookEndpointRequestSchema = z16.strictObject({
2303
2922
  url: url(),
2304
2923
  eventTypes: eventTypes(),
2305
- enabled: z15.boolean().default(true)
2924
+ enabled: z16.boolean().default(true)
2306
2925
  }).meta({ ref: "CreateWebhookEndpointRequest" });
2307
- var UpdateWebhookEndpointRequestSchema = z15.strictObject({
2926
+ var UpdateWebhookEndpointRequestSchema = z16.strictObject({
2308
2927
  url: url().optional(),
2309
2928
  eventTypes: eventTypes().optional(),
2310
- enabled: z15.boolean().optional()
2929
+ enabled: z16.boolean().optional()
2311
2930
  }).refine((update) => Object.values(update).some((value) => value !== undefined), {
2312
2931
  message: "Name at least one field to change."
2313
2932
  }).meta({ ref: "UpdateWebhookEndpointRequest" });
@@ -2318,44 +2937,44 @@ var WEBHOOK_REDELIVER_REFUSALS = [
2318
2937
  "attempt_limit"
2319
2938
  ];
2320
2939
  var WEBHOOK_DELIVERY_STATES = ["pending", "delivered", "failed"];
2321
- var WebhookDeliveryAttemptSchema = z15.object({
2322
- attempt: z15.number().int().min(1),
2323
- attemptedAt: z15.iso.datetime(),
2324
- statusCode: z15.number().int().nullable(),
2325
- durationMs: z15.number().int().min(0),
2326
- failureReason: z15.string().nullable()
2940
+ var WebhookDeliveryAttemptSchema = z16.object({
2941
+ attempt: z16.number().int().min(1),
2942
+ attemptedAt: z16.iso.datetime(),
2943
+ statusCode: z16.number().int().nullable(),
2944
+ durationMs: z16.number().int().min(0),
2945
+ failureReason: z16.string().nullable()
2327
2946
  }).meta({ ref: "WebhookDeliveryAttempt" });
2328
- var WebhookDeliverySchema = z15.object({
2329
- id: z15.uuid(),
2330
- endpointId: z15.uuid(),
2331
- eventId: z15.uuid().nullable(),
2332
- eventType: z15.string(),
2333
- test: z15.boolean(),
2334
- state: z15.string(),
2335
- attemptCount: z15.number().int().min(0),
2336
- nextAttemptAt: z15.iso.datetime().nullable(),
2337
- lastAttemptAt: z15.iso.datetime().nullable(),
2338
- statusCode: z15.number().int().nullable(),
2339
- failureReason: z15.string().nullable(),
2340
- completedAt: z15.iso.datetime().nullable(),
2341
- createdAt: z15.iso.datetime()
2947
+ var WebhookDeliverySchema = z16.object({
2948
+ id: z16.uuid(),
2949
+ endpointId: z16.uuid(),
2950
+ eventId: z16.uuid().nullable(),
2951
+ eventType: z16.string(),
2952
+ test: z16.boolean(),
2953
+ state: z16.string(),
2954
+ attemptCount: z16.number().int().min(0),
2955
+ nextAttemptAt: z16.iso.datetime().nullable(),
2956
+ lastAttemptAt: z16.iso.datetime().nullable(),
2957
+ statusCode: z16.number().int().nullable(),
2958
+ failureReason: z16.string().nullable(),
2959
+ completedAt: z16.iso.datetime().nullable(),
2960
+ createdAt: z16.iso.datetime()
2342
2961
  }).meta({ ref: "WebhookDelivery" });
2343
2962
  var WebhookDeliveryDetailSchema = WebhookDeliverySchema.extend({
2344
- attempts: z15.array(WebhookDeliveryAttemptSchema)
2963
+ attempts: z16.array(WebhookDeliveryAttemptSchema)
2345
2964
  }).meta({ ref: "WebhookDeliveryDetail" });
2346
- var WebhookDeliveryListSchema = z15.object({ meta: PaginationMetaSchema, data: z15.array(WebhookDeliverySchema) }).meta({ ref: "WebhookDeliveryList" });
2347
- var SendTestWebhookRequestSchema = z15.strictObject({ eventType: z15.enum(ACTIVITY_TYPES2) }).meta({ ref: "SendTestWebhookRequest" });
2348
- var WebhookSendResultSchema = z15.object({
2349
- deliveryId: z15.uuid(),
2350
- outcome: z15.enum(["delivered", "failed"]),
2351
- statusCode: z15.number().int().nullable(),
2352
- durationMs: z15.number().int().min(0),
2353
- failureReason: z15.string().nullable()
2965
+ var WebhookDeliveryListSchema = z16.object({ meta: PaginationMetaSchema, data: z16.array(WebhookDeliverySchema) }).meta({ ref: "WebhookDeliveryList" });
2966
+ var SendTestWebhookRequestSchema = z16.strictObject({ eventType: z16.enum(ACTIVITY_TYPES2) }).meta({ ref: "SendTestWebhookRequest" });
2967
+ var WebhookSendResultSchema = z16.object({
2968
+ deliveryId: z16.uuid(),
2969
+ outcome: z16.enum(["delivered", "failed"]),
2970
+ statusCode: z16.number().int().nullable(),
2971
+ durationMs: z16.number().int().min(0),
2972
+ failureReason: z16.string().nullable()
2354
2973
  }).meta({ ref: "WebhookSendResult" });
2355
2974
 
2356
2975
  // src/hook.ts
2357
2976
  var HOOK_POINTS = ["before_sign_up", "before_session", "before_token"];
2358
- var HookPointSchema = z16.enum(HOOK_POINTS).meta({ ref: "HookPoint" });
2977
+ var HookPointSchema = z17.enum(HOOK_POINTS).meta({ ref: "HookPoint" });
2359
2978
  var HOOK_QUESTION_TYPES = {
2360
2979
  before_sign_up: "hook.before_sign_up",
2361
2980
  before_session: "hook.before_session",
@@ -2397,78 +3016,79 @@ function hookLastCallFailed(lastOutcome) {
2397
3016
  var HOOK_FIELDS = ["url", "enabled", "deadlineMs", "failureMode"];
2398
3017
  var HOOK_MAX_DENIAL_CODE_LENGTH = 64;
2399
3018
  var HOOK_DENIAL_CODE_PATTERN = /^[a-z0-9_]{1,64}$/;
2400
- var url2 = () => z16.string().min(1).max(MAX_WEBHOOK_URL_LENGTH).regex(/^[^\s\u0000-\u001f\u007f]+$/, "Must not contain spaces or control characters.");
2401
- var deadlineMs = () => z16.number().int().min(HOOK_MIN_DEADLINE_MS).max(HOOK_MAX_DEADLINE_MS);
2402
- var HookRecentOutcomesSchema = z16.object({
2403
- since: z16.iso.datetime(),
2404
- allowed: z16.number().int().min(0),
2405
- denied: z16.number().int().min(0),
2406
- failed: z16.number().int().min(0),
2407
- timedOut: z16.number().int().min(0),
2408
- lastCallAt: z16.iso.datetime().nullable(),
2409
- lastOutcome: z16.string().nullable()
3019
+ var url2 = () => z17.string().min(1).max(MAX_WEBHOOK_URL_LENGTH).regex(/^[^\s\u0000-\u001f\u007f]+$/, "Must not contain spaces or control characters.");
3020
+ var deadlineMs = () => z17.number().int().min(HOOK_MIN_DEADLINE_MS).max(HOOK_MAX_DEADLINE_MS);
3021
+ var HookRecentOutcomesSchema = z17.object({
3022
+ since: z17.iso.datetime(),
3023
+ allowed: z17.number().int().min(0),
3024
+ denied: z17.number().int().min(0),
3025
+ failed: z17.number().int().min(0),
3026
+ timedOut: z17.number().int().min(0),
3027
+ lastCallAt: z17.iso.datetime().nullable(),
3028
+ lastOutcome: z17.string().nullable()
2410
3029
  }).meta({ ref: "HookRecentOutcomes" });
2411
- var HookSchema = z16.object({
2412
- id: z16.uuid(),
2413
- point: z16.string(),
2414
- url: z16.string(),
2415
- enabled: z16.boolean(),
2416
- deadlineMs: z16.number().int(),
2417
- failureMode: z16.string(),
2418
- lastFailedAt: z16.iso.datetime().nullable(),
2419
- lastFailureReason: z16.string().nullable(),
3030
+ var HookSchema = z17.object({
3031
+ id: z17.uuid(),
3032
+ point: z17.string(),
3033
+ url: z17.string(),
3034
+ enabled: z17.boolean(),
3035
+ deadlineMs: z17.number().int(),
3036
+ failureMode: z17.string(),
3037
+ lastFailedAt: z17.iso.datetime().nullable(),
3038
+ lastFailureReason: z17.string().nullable(),
2420
3039
  recentOutcomes: HookRecentOutcomesSchema,
2421
- createdAt: z16.iso.datetime(),
2422
- updatedAt: z16.iso.datetime()
3040
+ createdAt: z17.iso.datetime(),
3041
+ updatedAt: z17.iso.datetime()
2423
3042
  }).meta({ ref: "Hook" });
2424
3043
  var CreatedHookSchema = HookSchema.extend({
2425
- secret: z16.string().describe("The signing secret. Store it now: it is shown only once.")
3044
+ secret: z17.string().describe("The signing secret. Store it now: it is shown only once.")
2426
3045
  }).meta({ ref: "CreatedHook" });
2427
- var HookListSchema = z16.object({ data: z16.array(HookSchema) }).meta({ ref: "HookList" });
2428
- var CreateHookRequestSchema = z16.strictObject({
2429
- point: z16.enum(HOOK_POINTS),
3046
+ var HookListSchema = z17.object({ data: z17.array(HookSchema) }).meta({ ref: "HookList" });
3047
+ var CreateHookRequestSchema = z17.strictObject({
3048
+ point: z17.enum(HOOK_POINTS),
2430
3049
  url: url2(),
2431
- enabled: z16.boolean().default(true),
3050
+ enabled: z17.boolean().default(true),
2432
3051
  deadlineMs: deadlineMs().default(HOOK_DEFAULT_DEADLINE_MS),
2433
- failureMode: z16.enum(HOOK_FAILURE_MODES).default("deny")
3052
+ failureMode: z17.enum(HOOK_FAILURE_MODES).default("deny")
2434
3053
  }).meta({ ref: "CreateHookRequest" });
2435
- var UpdateHookRequestSchema = z16.strictObject({
3054
+ var UpdateHookRequestSchema = z17.strictObject({
2436
3055
  url: url2().optional(),
2437
- enabled: z16.boolean().optional(),
3056
+ enabled: z17.boolean().optional(),
2438
3057
  deadlineMs: deadlineMs().optional(),
2439
- failureMode: z16.enum(HOOK_FAILURE_MODES).optional()
3058
+ failureMode: z17.enum(HOOK_FAILURE_MODES).optional()
2440
3059
  }).refine((update) => Object.values(update).some((value) => value !== undefined), {
2441
3060
  message: "Name at least one field to change."
2442
3061
  }).meta({ ref: "UpdateHookRequest" });
2443
3062
  var HOOK_SIGN_UP_METHODS = [
2444
3063
  "password",
2445
3064
  "passwordless",
2446
- ...OAUTH_PROVIDERS.map((provider) => `oauth_${provider}`)
3065
+ ...OAUTH_PROVIDERS.map((provider) => `oauth_${provider}`),
3066
+ "sso"
2447
3067
  ];
2448
- var HookBeforeSignUpDataSchema = z16.strictObject({
2449
- email: z16.string().min(3).max(320).nullable(),
2450
- method: z16.enum(HOOK_SIGN_UP_METHODS),
3068
+ var HookBeforeSignUpDataSchema = z17.strictObject({
3069
+ email: z17.string().min(3).max(320).nullable(),
3070
+ method: z17.enum(HOOK_SIGN_UP_METHODS),
2451
3071
  client: SessionClientSchema,
2452
- ipAddress: z16.string().max(64).nullable()
3072
+ ipAddress: z17.string().max(64).nullable()
2453
3073
  }).meta({
2454
3074
  ref: "HookBeforeSignUpData",
2455
3075
  description: "What a hook is told about a sign-up before the account is created."
2456
3076
  });
2457
- var id = () => z16.uuid();
2458
- var profile = () => z16.string().min(1).max(32);
2459
- var amr = () => z16.array(z16.string().regex(/^[a-z][a-z0-9_]{0,31}$/)).max(16);
2460
- var HookBeforeSessionDataSchema = z16.strictObject({
3077
+ var id = () => z17.uuid();
3078
+ var profile = () => z17.string().min(1).max(32);
3079
+ var amr = () => z17.array(z17.string().regex(/^[a-z][a-z0-9_]{0,31}$/)).max(16);
3080
+ var HookBeforeSessionDataSchema = z17.strictObject({
2461
3081
  userId: id(),
2462
3082
  client: SessionClientSchema,
2463
3083
  profile: profile(),
2464
3084
  amr: amr(),
2465
- signUp: z16.boolean(),
2466
- ipAddress: z16.string().max(64).nullable()
3085
+ signUp: z17.boolean(),
3086
+ ipAddress: z17.string().max(64).nullable()
2467
3087
  }).meta({
2468
3088
  ref: "HookBeforeSessionData",
2469
3089
  description: "What a hook is told about a sign-in before its session is created."
2470
3090
  });
2471
- var HookBeforeTokenDataSchema = z16.strictObject({
3091
+ var HookBeforeTokenDataSchema = z17.strictObject({
2472
3092
  userId: id(),
2473
3093
  sessionId: id(),
2474
3094
  client: SessionClientSchema,
@@ -2479,11 +3099,11 @@ var HookBeforeTokenDataSchema = z16.strictObject({
2479
3099
  description: "What a hook is told about a session before its token is issued."
2480
3100
  });
2481
3101
  function question(point, data, meta) {
2482
- return z16.strictObject({
2483
- id: z16.uuid(),
2484
- type: z16.literal(HOOK_QUESTION_TYPES[point]),
2485
- schemaVersion: z16.literal(HOOK_SCHEMA_VERSION),
2486
- occurredAt: z16.iso.datetime(),
3102
+ return z17.strictObject({
3103
+ id: z17.uuid(),
3104
+ type: z17.literal(HOOK_QUESTION_TYPES[point]),
3105
+ schemaVersion: z17.literal(HOOK_SCHEMA_VERSION),
3106
+ occurredAt: z17.iso.datetime(),
2487
3107
  data
2488
3108
  }).meta(meta);
2489
3109
  }
@@ -2501,7 +3121,7 @@ var HOOK_QUESTION_SCHEMAS = {
2501
3121
  description: "What the server posts, signed, to the hook registered for `before_token`, when a session is created and each time its user proves a factor again. The answer is the claims the session’s tokens carry until the next question. Not an event."
2502
3122
  })
2503
3123
  };
2504
- var HookQuestionSchema = z16.discriminatedUnion("type", [
3124
+ var HookQuestionSchema = z17.discriminatedUnion("type", [
2505
3125
  HOOK_QUESTION_SCHEMAS.before_sign_up,
2506
3126
  HOOK_QUESTION_SCHEMAS.before_session,
2507
3127
  HOOK_QUESTION_SCHEMAS.before_token
@@ -2547,15 +3167,15 @@ var HOOK_QUESTION_FIXTURES = {
2547
3167
  }
2548
3168
  }
2549
3169
  };
2550
- var HookAnswerSchema = z16.discriminatedUnion("decision", [
2551
- z16.strictObject({ decision: z16.literal("allow") }),
2552
- z16.strictObject({
2553
- decision: z16.literal("deny"),
2554
- code: z16.string().regex(HOOK_DENIAL_CODE_PATTERN).optional()
3170
+ var HookAnswerSchema = z17.discriminatedUnion("decision", [
3171
+ z17.strictObject({ decision: z17.literal("allow") }),
3172
+ z17.strictObject({
3173
+ decision: z17.literal("deny"),
3174
+ code: z17.string().regex(HOOK_DENIAL_CODE_PATTERN).optional()
2555
3175
  })
2556
3176
  ]).meta({ ref: "HookAnswer" });
2557
- var HookClaimsAnswerSchema = z16.strictObject({
2558
- claims: z16.record(z16.string(), z16.union([z16.string(), z16.number(), z16.boolean()])).refine((claims) => ("claims" in checkCustomClaims2(claims)), {
3177
+ var HookClaimsAnswerSchema = z17.strictObject({
3178
+ claims: z17.record(z17.string(), z17.union([z17.string(), z17.number(), z17.boolean()])).refine((claims) => ("claims" in checkCustomClaims2(claims)), {
2559
3179
  message: `Every key must be a custom claim key that is not reserved, every value one string, number or boolean, and the whole at most ${MAX_CUSTOM_CLAIMS_BYTES2} bytes as JSON.`
2560
3180
  })
2561
3181
  }).meta({ ref: "HookClaimsAnswer" });
@@ -2589,7 +3209,7 @@ function hookWeakenings(was, is) {
2589
3209
  }
2590
3210
 
2591
3211
  // src/native-app.ts
2592
- import { z as z17 } from "zod";
3212
+ import { z as z18 } from "zod";
2593
3213
  var NATIVE_APP_PLATFORMS = ["ios", "android"];
2594
3214
  var MAX_NATIVE_APPS = 20;
2595
3215
  var MAX_CERT_FINGERPRINTS = 10;
@@ -2637,47 +3257,47 @@ function androidApkKeyHashOrigin(fingerprint) {
2637
3257
  const base64url = base64.replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
2638
3258
  return `${ANDROID_APK_KEY_HASH_PREFIX}${base64url}`;
2639
3259
  }
2640
- var teamId = () => z17.string().regex(APPLE_TEAM_ID_PATTERN, "Must be the ten upper-case letters and digits of an Apple team.");
2641
- var bundleId = () => z17.string().max(MAX_BUNDLE_ID_LENGTH).regex(BUNDLE_ID_PATTERN, "Must be a bundle id such as com.example.app: letters, digits and hyphens in segments joined by periods.");
2642
- var packageName = () => z17.string().max(MAX_PACKAGE_NAME_LENGTH).regex(PACKAGE_NAME_PATTERN, "Must be a package name such as com.example.app: two or more segments joined by periods, each starting with a letter.");
2643
- var fingerprints = () => z17.array(z17.string().max(95).regex(CERT_FINGERPRINT_INPUT_PATTERN, "Must be a SHA-256 fingerprint: 32 bytes as hex, with or without colons.")).min(1).max(MAX_CERT_FINGERPRINTS).refine((list) => normalizeCertFingerprints(list).length === list.length, {
3260
+ var teamId = () => z18.string().regex(APPLE_TEAM_ID_PATTERN, "Must be the ten upper-case letters and digits of an Apple team.");
3261
+ var bundleId = () => z18.string().max(MAX_BUNDLE_ID_LENGTH).regex(BUNDLE_ID_PATTERN, "Must be a bundle id such as com.example.app: letters, digits and hyphens in segments joined by periods.");
3262
+ var packageName = () => z18.string().max(MAX_PACKAGE_NAME_LENGTH).regex(PACKAGE_NAME_PATTERN, "Must be a package name such as com.example.app: two or more segments joined by periods, each starting with a letter.");
3263
+ var fingerprints = () => z18.array(z18.string().max(95).regex(CERT_FINGERPRINT_INPUT_PATTERN, "Must be a SHA-256 fingerprint: 32 bytes as hex, with or without colons.")).min(1).max(MAX_CERT_FINGERPRINTS).refine((list) => normalizeCertFingerprints(list).length === list.length, {
2644
3264
  message: "Name each fingerprint once."
2645
3265
  });
2646
- var appLinkPaths = () => z17.array(z17.string().max(MAX_APP_LINK_PATH_LENGTH).refine(isAppLinkPath, {
3266
+ var appLinkPaths = () => z18.array(z18.string().max(MAX_APP_LINK_PATH_LENGTH).refine(isAppLinkPath, {
2647
3267
  message: "Must be one exact path such as /oauth/callback: letters, digits and . _ ~ - in segments after a slash, with no wildcard, query or trailing slash."
2648
3268
  })).max(MAX_APP_LINK_PATHS).refine((list) => new Set(list).size === list.length, { message: "Name each path once." });
2649
3269
  var NATIVE_APP_FIELDS = ["teamId", "sha256CertFingerprints", "appLinkPaths"];
2650
- var stamps = { id: z17.uuid(), createdAt: z17.iso.datetime(), updatedAt: z17.iso.datetime() };
2651
- var IosAppSchema = z17.object({
3270
+ var stamps = { id: z18.uuid(), createdAt: z18.iso.datetime(), updatedAt: z18.iso.datetime() };
3271
+ var IosAppSchema = z18.object({
2652
3272
  ...stamps,
2653
- platform: z17.literal("ios"),
2654
- teamId: z17.string(),
2655
- bundleId: z17.string(),
2656
- appLinkPaths: z17.array(z17.string())
3273
+ platform: z18.literal("ios"),
3274
+ teamId: z18.string(),
3275
+ bundleId: z18.string(),
3276
+ appLinkPaths: z18.array(z18.string())
2657
3277
  }).meta({ ref: "IosApp" });
2658
- var AndroidAppSchema = z17.object({
3278
+ var AndroidAppSchema = z18.object({
2659
3279
  ...stamps,
2660
- platform: z17.literal("android"),
2661
- packageName: z17.string(),
2662
- sha256CertFingerprints: z17.array(z17.string()),
2663
- appLinkPaths: z17.array(z17.string())
3280
+ platform: z18.literal("android"),
3281
+ packageName: z18.string(),
3282
+ sha256CertFingerprints: z18.array(z18.string()),
3283
+ appLinkPaths: z18.array(z18.string())
2664
3284
  }).meta({ ref: "AndroidApp" });
2665
- var NativeAppSchema = z17.discriminatedUnion("platform", [IosAppSchema, AndroidAppSchema]).meta({ ref: "NativeApp" });
2666
- var NativeAppListSchema = z17.object({ data: z17.array(NativeAppSchema) }).meta({ ref: "NativeAppList" });
2667
- var IosAppIdentitySchema = z17.strictObject({
2668
- platform: z17.literal("ios"),
3285
+ var NativeAppSchema = z18.discriminatedUnion("platform", [IosAppSchema, AndroidAppSchema]).meta({ ref: "NativeApp" });
3286
+ var NativeAppListSchema = z18.object({ data: z18.array(NativeAppSchema) }).meta({ ref: "NativeAppList" });
3287
+ var IosAppIdentitySchema = z18.strictObject({
3288
+ platform: z18.literal("ios"),
2669
3289
  teamId: teamId(),
2670
3290
  bundleId: bundleId(),
2671
3291
  appLinkPaths: appLinkPaths().optional()
2672
3292
  }).meta({ ref: "IosAppIdentity" });
2673
- var AndroidAppIdentitySchema = z17.strictObject({
2674
- platform: z17.literal("android"),
3293
+ var AndroidAppIdentitySchema = z18.strictObject({
3294
+ platform: z18.literal("android"),
2675
3295
  packageName: packageName(),
2676
3296
  sha256CertFingerprints: fingerprints(),
2677
3297
  appLinkPaths: appLinkPaths().optional()
2678
3298
  }).meta({ ref: "AndroidAppIdentity" });
2679
- var CreateNativeAppRequestSchema = z17.discriminatedUnion("platform", [IosAppIdentitySchema, AndroidAppIdentitySchema]).meta({ ref: "CreateNativeAppRequest" });
2680
- var UpdateNativeAppRequestSchema = z17.strictObject({
3299
+ var CreateNativeAppRequestSchema = z18.discriminatedUnion("platform", [IosAppIdentitySchema, AndroidAppIdentitySchema]).meta({ ref: "CreateNativeAppRequest" });
3300
+ var UpdateNativeAppRequestSchema = z18.strictObject({
2681
3301
  teamId: teamId().optional(),
2682
3302
  sha256CertFingerprints: fingerprints().optional(),
2683
3303
  appLinkPaths: appLinkPaths().optional()
@@ -2686,23 +3306,23 @@ var UpdateNativeAppRequestSchema = z17.strictObject({
2686
3306
  }).meta({ ref: "UpdateNativeAppRequest" });
2687
3307
  var ASSET_LINKS_RELATIONS = ["delegate_permission/common.get_login_creds"];
2688
3308
  var ASSET_LINKS_APP_LINK_RELATION = "delegate_permission/common.handle_all_urls";
2689
- var AppleAppSiteAssociationSchema = z17.strictObject({
2690
- webcredentials: z17.strictObject({
2691
- apps: z17.array(z17.string()).min(1)
3309
+ var AppleAppSiteAssociationSchema = z18.strictObject({
3310
+ webcredentials: z18.strictObject({
3311
+ apps: z18.array(z18.string()).min(1)
2692
3312
  }).optional(),
2693
- applinks: z17.strictObject({
2694
- details: z17.array(z17.strictObject({
2695
- appIDs: z17.array(z17.string()).length(1),
2696
- components: z17.array(z17.strictObject({ "/": z17.string() })).min(1)
3313
+ applinks: z18.strictObject({
3314
+ details: z18.array(z18.strictObject({
3315
+ appIDs: z18.array(z18.string()).length(1),
3316
+ components: z18.array(z18.strictObject({ "/": z18.string() })).min(1)
2697
3317
  })).min(1)
2698
3318
  }).optional()
2699
3319
  }).meta({ ref: "AppleAppSiteAssociation" });
2700
- var AssetLinksSchema = z17.array(z17.strictObject({
2701
- relation: z17.array(z17.string()).min(1),
2702
- target: z17.strictObject({
2703
- namespace: z17.literal("android_app"),
2704
- package_name: z17.string(),
2705
- sha256_cert_fingerprints: z17.array(z17.string()).min(1)
3320
+ var AssetLinksSchema = z18.array(z18.strictObject({
3321
+ relation: z18.array(z18.string()).min(1),
3322
+ target: z18.strictObject({
3323
+ namespace: z18.literal("android_app"),
3324
+ package_name: z18.string(),
3325
+ sha256_cert_fingerprints: z18.array(z18.string()).min(1)
2706
3326
  })
2707
3327
  })).meta({ ref: "AssetLinks" });
2708
3328
  function nativeAppIdentifier(app) {
@@ -2759,7 +3379,7 @@ function nativeAppWeakenings(was, is) {
2759
3379
  }
2760
3380
 
2761
3381
  // src/proposal.ts
2762
- import { z as z18 } from "zod";
3382
+ import { z as z19 } from "zod";
2763
3383
  var PROPOSAL_OPERATIONS = [
2764
3384
  "ban_user",
2765
3385
  "unban_user",
@@ -2773,7 +3393,14 @@ var PROPOSAL_OPERATION_TARGETS = {
2773
3393
  end_session: "session",
2774
3394
  disable_oauth_provider: "oauth_provider"
2775
3395
  };
2776
- var PROPOSAL_STATUSES = ["pending", "expired", "approved", "executed", "failed"];
3396
+ var PROPOSAL_STATUSES = [
3397
+ "pending",
3398
+ "expired",
3399
+ "approved",
3400
+ "executed",
3401
+ "failed",
3402
+ "rejected"
3403
+ ];
2777
3404
  var PROPOSAL_FAILURE_REASONS = [
2778
3405
  "target_not_found",
2779
3406
  "error",
@@ -2790,25 +3417,25 @@ var PROPOSAL_APPROVAL_REFUSALS = [
2790
3417
  ];
2791
3418
  var PROPOSAL_CREATION_REFUSALS = ["production_environment"];
2792
3419
  var PROPOSAL_APPROVER_TYPES = ["admin", "instance_admin"];
2793
- var ProposalOperationSchema = z18.enum(PROPOSAL_OPERATIONS).meta({ ref: "ProposalOperation" });
2794
- var ProposalStatusSchema = z18.enum(PROPOSAL_STATUSES).meta({ ref: "ProposalStatus" });
3420
+ var ProposalOperationSchema = z19.enum(PROPOSAL_OPERATIONS).meta({ ref: "ProposalOperation" });
3421
+ var ProposalStatusSchema = z19.enum(PROPOSAL_STATUSES).meta({ ref: "ProposalStatus" });
2795
3422
  function isProposalTargetId(type, id) {
2796
3423
  const providers = OAUTH_PROVIDERS;
2797
3424
  if (type === "oauth_provider") {
2798
3425
  return providers.includes(id);
2799
3426
  }
2800
- return id === id.toLowerCase() && z18.uuid().safeParse(id).success;
3427
+ return id === id.toLowerCase() && z19.uuid().safeParse(id).success;
2801
3428
  }
2802
- var ProposalTargetSchema = z18.strictObject({
2803
- type: z18.enum(PROPOSAL_TARGET_TYPES),
2804
- id: z18.union([z18.uuid(), z18.enum(OAUTH_PROVIDERS)])
3429
+ var ProposalTargetSchema = z19.strictObject({
3430
+ type: z19.enum(PROPOSAL_TARGET_TYPES),
3431
+ id: z19.union([z19.uuid(), z19.enum(OAUTH_PROVIDERS)])
2805
3432
  }).refine((target) => isProposalTargetId(target.type, target.id), {
2806
3433
  path: ["id"],
2807
3434
  message: "must name a target of that type"
2808
3435
  }).meta({ ref: "ProposalTarget" });
2809
- var ProposalApproverSchema = z18.object({
2810
- type: z18.enum(PROPOSAL_APPROVER_TYPES),
2811
- id: z18.string().min(1).max(128).nullable()
3436
+ var ProposalApproverSchema = z19.object({
3437
+ type: z19.enum(PROPOSAL_APPROVER_TYPES),
3438
+ id: z19.string().min(1).max(128).nullable()
2812
3439
  }).meta({ ref: "ProposalApprover" });
2813
3440
  function targetIsOfOperation(request) {
2814
3441
  return PROPOSAL_OPERATION_TARGETS[request.operation] === request.target.type;
@@ -2817,24 +3444,24 @@ var TARGET_OF_OPERATION = {
2817
3444
  path: ["target", "type"],
2818
3445
  message: "must be the kind of target the operation acts on"
2819
3446
  };
2820
- var CreateProposalRequestSchema = z18.strictObject({ operation: ProposalOperationSchema, target: ProposalTargetSchema }).refine(targetIsOfOperation, TARGET_OF_OPERATION).meta({ ref: "CreateProposalRequest" });
2821
- var ApproveProposalRequestSchema = z18.strictObject({ operation: ProposalOperationSchema, target: ProposalTargetSchema }).refine(targetIsOfOperation, TARGET_OF_OPERATION).meta({ ref: "ApproveProposalRequest" });
2822
- var ProposalSchema = z18.object({
2823
- id: z18.uuid(),
3447
+ var CreateProposalRequestSchema = z19.strictObject({ operation: ProposalOperationSchema, target: ProposalTargetSchema }).refine(targetIsOfOperation, TARGET_OF_OPERATION).meta({ ref: "CreateProposalRequest" });
3448
+ var ApproveProposalRequestSchema = z19.strictObject({ operation: ProposalOperationSchema, target: ProposalTargetSchema }).refine(targetIsOfOperation, TARGET_OF_OPERATION).meta({ ref: "ApproveProposalRequest" });
3449
+ var ProposalSchema = z19.object({
3450
+ id: z19.uuid(),
2824
3451
  operation: ProposalOperationSchema,
2825
3452
  target: ProposalTargetSchema,
2826
- summary: z18.string(),
3453
+ summary: z19.string(),
2827
3454
  status: ProposalStatusSchema,
2828
- proposedBy: z18.object({ type: z18.literal("agent"), id: z18.uuid() }),
2829
- createdAt: z18.iso.datetime(),
2830
- expiresAt: z18.iso.datetime(),
3455
+ proposedBy: z19.object({ type: z19.literal("agent"), id: z19.uuid() }),
3456
+ createdAt: z19.iso.datetime(),
3457
+ expiresAt: z19.iso.datetime(),
2831
3458
  approvedBy: ProposalApproverSchema.nullable(),
2832
- approvedAt: z18.iso.datetime().nullable(),
2833
- failureReason: z18.enum(PROPOSAL_FAILURE_REASONS).nullable(),
2834
- expiryReason: z18.enum(PROPOSAL_EXPIRY_REASONS).nullable(),
2835
- changed: z18.boolean().optional()
3459
+ approvedAt: z19.iso.datetime().nullable(),
3460
+ failureReason: z19.enum(PROPOSAL_FAILURE_REASONS).nullable(),
3461
+ expiryReason: z19.enum(PROPOSAL_EXPIRY_REASONS).nullable(),
3462
+ changed: z19.boolean().optional()
2836
3463
  }).meta({ ref: "Proposal" });
2837
- var ProposalListSchema = z18.object({ data: z18.array(ProposalSchema) }).meta({ ref: "ProposalList" });
3464
+ var ProposalListSchema = z19.object({ data: z19.array(ProposalSchema) }).meta({ ref: "ProposalList" });
2838
3465
  var SUMMARIES = {
2839
3466
  ban_user: (id) => `Ban the user ${id}: every session of theirs ends now, and they cannot sign in until an administrator lifts the ban.`,
2840
3467
  unban_user: (id) => `Lift the ban on the user ${id}: they can sign in again. The sessions that ended when they were banned stay ended.`,
@@ -2848,6 +3475,29 @@ function proposalSummary(operation, target) {
2848
3475
  return SUMMARIES[operation](target.id);
2849
3476
  }
2850
3477
 
3478
+ // src/sso.ts
3479
+ var SSO_CONNECTION_STATUSES = ["draft", "active", "disabled"];
3480
+ var SSO_PROTOCOLS = ["oidc", "saml"];
3481
+ var SSO_CONNECTION_FIELDS = [
3482
+ "name",
3483
+ "issuer",
3484
+ "clientId",
3485
+ "clientSecret",
3486
+ "saml",
3487
+ "defaultRole",
3488
+ "enforced",
3489
+ "breakGlassRole",
3490
+ "trustIdpMfa",
3491
+ "domains",
3492
+ "status",
3493
+ "attributeMapping",
3494
+ "groupRoles",
3495
+ "test"
3496
+ ];
3497
+ var MAX_SSO_CONNECTION_DOMAINS = 20;
3498
+ var MAX_SAML_CERTIFICATES = 2;
3499
+ var MAX_SSO_GROUP_ROLES = 100;
3500
+
2851
3501
  // src/test-address.ts
2852
3502
  var TEST_ADDRESS_DOMAIN = "test.tula.invalid";
2853
3503
  var TEST_ADDRESS_LOCAL_PREFIX = "tula-test-";
@@ -2892,12 +3542,13 @@ function testSignInAllowed(setting, kind) {
2892
3542
  }
2893
3543
 
2894
3544
  // src/tokens.ts
2895
- import { z as z19 } from "zod";
3545
+ import { z as z20 } from "zod";
2896
3546
  var ACCESS_TOKEN_VERSION = 1;
2897
3547
  var ACCESS_TOKEN_ALGORITHM = "EdDSA";
2898
3548
  var PUBLISHABLE_KEY_PREFIX = "tula_pk_";
2899
3549
  var SECRET_KEY_PREFIX = "tula_sk_";
2900
3550
  var AGENT_KEY_PREFIX = "tula_ak_";
3551
+ var SCIM_TOKEN_PREFIX = "tula_scim_";
2901
3552
  var AUTHENTICATION_METHODS = [
2902
3553
  "pwd",
2903
3554
  "email",
@@ -2910,36 +3561,42 @@ var AUTHENTICATION_METHODS = [
2910
3561
  "user"
2911
3562
  ];
2912
3563
  var STEP_UP_MAX_AGE_SECONDS = 600;
2913
- var AccessTokenClaimsSchema = z19.object({
2914
- iss: z19.string(),
2915
- sub: z19.string(),
2916
- aud: z19.string(),
2917
- sid: z19.string(),
2918
- pid: z19.string(),
2919
- eid: z19.string(),
2920
- iat: z19.number().int(),
2921
- exp: z19.number().int(),
2922
- v: z19.literal(ACCESS_TOKEN_VERSION),
2923
- auth_time: z19.number().int().optional(),
2924
- amr: z19.array(z19.string()).optional(),
2925
- sp: z19.string().optional(),
2926
- cnf: z19.object({ jkt: z19.string() }).optional(),
2927
- [CUSTOM_CLAIMS_CLAIM2]: z19.record(z19.string(), z19.union([z19.string(), z19.number(), z19.boolean()])).optional()
3564
+ var AccessTokenClaimsSchema = z20.object({
3565
+ iss: z20.string(),
3566
+ sub: z20.string(),
3567
+ aud: z20.string(),
3568
+ sid: z20.string(),
3569
+ pid: z20.string(),
3570
+ eid: z20.string(),
3571
+ iat: z20.number().int(),
3572
+ exp: z20.number().int(),
3573
+ v: z20.literal(ACCESS_TOKEN_VERSION),
3574
+ auth_time: z20.number().int().optional(),
3575
+ amr: z20.array(z20.string()).optional(),
3576
+ sp: z20.string().optional(),
3577
+ cnf: z20.object({ jkt: z20.string() }).optional(),
3578
+ [ORGANIZATION_ID_CLAIM2]: z20.string().optional(),
3579
+ [SSO_CONNECTION_CLAIM2]: z20.string().optional(),
3580
+ [ORGANIZATION_ROLE_CLAIM2]: z20.string().optional(),
3581
+ [ORGANIZATION_PERMISSIONS_CLAIM2]: z20.array(z20.string()).optional(),
3582
+ [CUSTOM_CLAIMS_CLAIM2]: z20.record(z20.string(), z20.union([z20.string(), z20.number(), z20.boolean()])).optional()
2928
3583
  }).meta({ ref: "AccessTokenClaims" });
2929
- var JwkSchema = z19.object({
2930
- kty: z19.literal("OKP"),
2931
- crv: z19.literal("Ed25519"),
2932
- x: z19.string(),
2933
- kid: z19.string(),
2934
- alg: z19.literal(ACCESS_TOKEN_ALGORITHM),
2935
- use: z19.literal("sig")
3584
+ var JwkSchema = z20.object({
3585
+ kty: z20.literal("OKP"),
3586
+ crv: z20.literal("Ed25519"),
3587
+ x: z20.string(),
3588
+ kid: z20.string(),
3589
+ alg: z20.literal(ACCESS_TOKEN_ALGORITHM),
3590
+ use: z20.literal("sig")
2936
3591
  }).meta({ ref: "Jwk" });
2937
- var JwksSchema = z19.object({ keys: z19.array(JwkSchema) }).meta({ ref: "Jwks" });
3592
+ var JwksSchema = z20.object({ keys: z20.array(JwkSchema) }).meta({ ref: "Jwks" });
3593
+ var SETUP_LINK_TOKEN_PREFIX = "tula_setup_";
2938
3594
 
2939
3595
  // src/events.ts
2940
- var id2 = () => z20.uuid();
3596
+ var id2 = () => z21.uuid();
3597
+ var DomainName = z21.string().max(MAX_DOMAIN_LENGTH2).regex(DOMAIN_PATTERN2);
2941
3598
  function data(name, description, shape) {
2942
- return z20.object(shape).meta({ ref: `${name}EventData`, description });
3599
+ return z21.object(shape).meta({ ref: `${name}EventData`, description });
2943
3600
  }
2944
3601
  function proposalIsWhole(change) {
2945
3602
  return change.proposalId === undefined === (change.approvedBy === undefined);
@@ -2955,11 +3612,11 @@ function passkeyRemovalIsWhole(removal) {
2955
3612
  return removal.method === "user" ? named && !outcome : outcome && !named;
2956
3613
  }
2957
3614
  var provider = OAuthProviderSchema;
2958
- var dependentAccounts = z20.number().int().min(0).max(DEPENDENT_ACCOUNTS_SCAN_LIMIT);
3615
+ var dependentAccounts = z21.number().int().min(0).max(DEPENDENT_ACCOUNTS_SCAN_LIMIT);
2959
3616
  var proposed2 = {
2960
- operation: z20.enum(PROPOSAL_OPERATIONS),
2961
- targetType: z20.enum(PROPOSAL_TARGET_TYPES),
2962
- targetId: z20.union([id2(), provider])
3617
+ operation: z21.enum(PROPOSAL_OPERATIONS),
3618
+ targetType: z21.enum(PROPOSAL_TARGET_TYPES),
3619
+ targetId: z21.union([id2(), provider])
2963
3620
  };
2964
3621
  var WEBHOOK_ENDPOINT_FIELDS = ["url", "eventTypes", "enabled"];
2965
3622
  var WEBHOOK_DISABLED_REASONS = ["failing", "gone"];
@@ -2967,7 +3624,7 @@ var MAX_CHANGED_SETTINGS = 256;
2967
3624
  var MAX_SETTING_NAME_LENGTH = 128;
2968
3625
  var EVENT_DATA_SCHEMAS = {
2969
3626
  "user.created": data("UserCreated", "A user account was created.", {
2970
- method: z20.enum([
3627
+ method: z21.enum([
2971
3628
  "admin",
2972
3629
  "sign_up",
2973
3630
  "oauth_google",
@@ -2977,55 +3634,66 @@ var EVENT_DATA_SCHEMAS = {
2977
3634
  "oauth_discord",
2978
3635
  "oauth_linkedin",
2979
3636
  "oauth_x",
2980
- "oauth_facebook"
3637
+ "oauth_facebook",
3638
+ "sso",
3639
+ "scim"
2981
3640
  ]),
2982
- emailVerified: z20.boolean(),
2983
- passwordless: z20.boolean().optional(),
2984
- hookBypassed: z20.boolean().optional(),
2985
- test: z20.boolean().optional()
3641
+ emailVerified: z21.boolean(),
3642
+ passwordless: z21.boolean().optional(),
3643
+ hookBypassed: z21.boolean().optional(),
3644
+ test: z21.boolean().optional()
3645
+ }),
3646
+ "user.imported": data("UserImported", "A user account was created by an import.", {
3647
+ emailVerified: z21.boolean(),
3648
+ passwordless: z21.boolean().optional(),
3649
+ passwordAlgorithm: z21.enum(["bcrypt", "argon2id", "argon2i", "pbkdf2_sha256", "firebase_scrypt"]).optional()
2986
3650
  }),
2987
3651
  "user.email_verified": data("UserEmailVerified", "A user proved their email address.", {}),
2988
- "user.banned": z20.object({
3652
+ "user.banned": z21.object({
2989
3653
  proposalId: id2().optional(),
2990
3654
  approvedBy: ProposalApproverSchema.optional()
2991
3655
  }).refine(proposalIsWhole, PROPOSAL_IS_WHOLE).meta({
2992
3656
  ref: "UserBannedEventData",
2993
3657
  description: "A user was banned; their sessions end. With `proposalId` and `approvedBy` (both or neither) when the ban carried out an agent’s proposal a human approved."
2994
3658
  }),
2995
- "user.unbanned": z20.object(carriedOut()).refine(proposalIsWhole, PROPOSAL_IS_WHOLE).meta({
3659
+ "user.unbanned": z21.object(carriedOut()).refine(proposalIsWhole, PROPOSAL_IS_WHOLE).meta({
2996
3660
  ref: "UserUnbannedEventData",
2997
3661
  description: "A user’s ban was lifted. With `proposalId` and `approvedBy` (both or neither) when that carried out an agent’s proposal a human approved."
2998
3662
  }),
2999
3663
  "user.deleted": data("UserDeleted", "A user account was deleted.", {}),
3000
3664
  "user.password_changed": data("UserPasswordChanged", "A user’s password was set, replaced or removed.", {
3001
- method: z20.enum(["admin_reset", "self", "reset", "email_verification"]),
3002
- created: z20.boolean().optional(),
3003
- removed: z20.boolean().optional()
3665
+ method: z21.enum(["admin_reset", "self", "reset", "email_verification"]),
3666
+ created: z21.boolean().optional(),
3667
+ removed: z21.boolean().optional()
3004
3668
  }),
3005
3669
  "user.mfa_enabled": data("UserMfaEnabled", "A user turned two-step verification on.", {
3006
- method: z20.enum(["totp"])
3670
+ method: z21.enum(["totp"])
3007
3671
  }),
3008
3672
  "user.mfa_disabled": data("UserMfaDisabled", "A user’s two-step verification was removed.", {
3009
- method: z20.enum(["self", "admin_reset", "enrolment_incomplete"])
3673
+ method: z21.enum(["self", "admin_reset", "enrolment_incomplete"])
3010
3674
  }),
3011
3675
  "user.backup_codes_regenerated": data("UserBackupCodesRegenerated", "A user replaced their backup codes; the earlier set no longer works.", {}),
3012
3676
  "user.backup_code_used": data("UserBackupCodeUsed", "A user proved their second factor with a backup code.", {}),
3013
3677
  "user.identity_linked": data("UserIdentityLinked", "A provider account was connected to a user.", {
3014
3678
  provider,
3015
- method: z20.enum(["auto", "profile"])
3679
+ method: z21.enum(["auto", "profile"])
3680
+ }),
3681
+ "user.sso_linked": data("UserSsoLinked", "An account was given its identity at a single sign-on connection (ADR 0067).", {
3682
+ connectionId: id2(),
3683
+ method: z21.enum(["email", "provisioned"])
3016
3684
  }),
3017
3685
  "user.identity_unlinked": data("UserIdentityUnlinked", "A provider account was disconnected from a user.", { provider }),
3018
3686
  "user.passkey_added": data("UserPasskeyAdded", "A user registered a passkey.", {
3019
3687
  passkeyId: id2(),
3020
- synced: z20.boolean()
3688
+ synced: z21.boolean()
3021
3689
  }),
3022
3690
  "user.passkey_renamed": data("UserPasskeyRenamed", "A user renamed a passkey.", {
3023
3691
  passkeyId: id2()
3024
3692
  }),
3025
- "user.passkey_removed": z20.object({
3026
- method: z20.enum(["user", "admin_reset"]),
3693
+ "user.passkey_removed": z21.object({
3694
+ method: z21.enum(["user", "admin_reset"]),
3027
3695
  passkeyId: id2().optional(),
3028
- canStillSignIn: z20.boolean().optional()
3696
+ canStillSignIn: z21.boolean().optional()
3029
3697
  }).refine(passkeyRemovalIsWhole, {
3030
3698
  message: "`passkeyId` goes with `user`, `canStillSignIn` with `admin_reset`"
3031
3699
  }).meta({
@@ -3034,25 +3702,25 @@ var EVENT_DATA_SCHEMAS = {
3034
3702
  }),
3035
3703
  "user.passkey_counter_regressed": data("UserPasskeyCounterRegressed", "A passkey’s signature counter did not grow: it may have been cloned. The sign-in was refused.", { passkeyId: id2() }),
3036
3704
  "user.email_added": data("UserEmailAdded", "An email address was stored on a user who had none. The address is not in the event.", {
3037
- method: z20.enum(["self", "admin"]),
3038
- verified: z20.boolean()
3705
+ method: z21.enum(["self", "admin"]),
3706
+ verified: z21.boolean()
3039
3707
  }),
3040
3708
  "user.phone_number_added": data("UserPhoneNumberAdded", "A user verified a phone number, which is now the account’s (replacing an earlier one).", {}),
3041
3709
  "user.phone_number_removed": data("UserPhoneNumberRemoved", "A user took the phone number off their account.", {}),
3042
3710
  "user.sms_factor_enabled": data("UserSmsFactorEnabled", "A user made a code texted to their phone number their second factor.", {}),
3043
3711
  "user.sms_factor_removed": data("UserSmsFactorRemoved", "A texted code is no longer a user’s second factor.", {
3044
- method: z20.enum(["self", "admin_reset", "phone_number_removed", "phone_number_changed"])
3712
+ method: z21.enum(["self", "admin_reset", "phone_number_removed", "phone_number_changed"])
3045
3713
  }),
3046
3714
  "session.created": data("SessionCreated", "A user signed in.", {
3047
3715
  userId: id2(),
3048
3716
  client: SessionClientSchema,
3049
- hookBypassed: z20.boolean().optional(),
3050
- claimsHookBypassed: z20.boolean().optional(),
3051
- deviceBound: z20.boolean().optional()
3717
+ hookBypassed: z21.boolean().optional(),
3718
+ claimsHookBypassed: z21.boolean().optional(),
3719
+ deviceBound: z21.boolean().optional()
3052
3720
  }),
3053
- "session.revoked": z20.object({
3721
+ "session.revoked": z21.object({
3054
3722
  userId: id2(),
3055
- reason: z20.enum([
3723
+ reason: z21.enum([
3056
3724
  "sign_out",
3057
3725
  "revoked_by_user",
3058
3726
  "revoked_by_admin",
@@ -3066,32 +3734,32 @@ var EVENT_DATA_SCHEMAS = {
3066
3734
  ref: "SessionRevokedEventData",
3067
3735
  description: "A session was ended before it expired. With `proposalId` and `approvedBy` (both or neither) when ending it carried out an agent’s proposal a human approved."
3068
3736
  }),
3069
- "session.reuse_detected": data("SessionReuseDetected", "A rotated refresh token was presented again: the session was ended as possibly stolen.", { userId: id2(), reason: z20.literal("reuse_detected") }),
3737
+ "session.reuse_detected": data("SessionReuseDetected", "A rotated refresh token was presented again: the session was ended as possibly stolen.", { userId: id2(), reason: z21.literal("reuse_detected") }),
3070
3738
  "session.stepped_up": data("SessionSteppedUp", "A signed-in user proved a factor again for a session.", {
3071
3739
  userId: id2(),
3072
- methods: z20.array(z20.enum(AUTHENTICATION_METHODS)).max(AUTHENTICATION_METHODS.length),
3073
- claimsHookBypassed: z20.boolean().optional()
3740
+ methods: z21.array(z21.enum(AUTHENTICATION_METHODS)).max(AUTHENTICATION_METHODS.length),
3741
+ claimsHookBypassed: z21.boolean().optional()
3074
3742
  }),
3075
3743
  "session.refresh_proof_refused": data("SessionRefreshProofRefused", "A refresh of a device-bound session came without a valid proof of its key. The session was not ended and no token was rotated.", {
3076
3744
  userId: id2(),
3077
- reason: z20.enum(["missing", "invalid", "wrong_key", "replayed"]),
3078
- suppressedInPreviousMinute: z20.number().int().min(0)
3745
+ reason: z21.enum(["missing", "invalid", "wrong_key", "replayed"]),
3746
+ suppressedInPreviousMinute: z21.number().int().min(0)
3079
3747
  }),
3080
3748
  "api_key.created": data("ApiKeyCreated", "An API key was created.", {
3081
- kind: z20.enum(["publishable", "secret", "agent"])
3749
+ kind: z21.enum(["publishable", "secret", "agent"])
3082
3750
  }),
3083
3751
  "api_key.revoked": data("ApiKeyRevoked", "An API key was revoked.", {}),
3084
3752
  "signing_key.rotated": data("SigningKeyRotated", "An environment’s access-token signing keys were rotated. The target is the new active key.", { retiredKeyId: id2(), nextKeyId: id2() }),
3085
3753
  "environment.settings_updated": data("EnvironmentSettingsUpdated", "An environment’s settings were replaced.", {
3086
- revision: z20.number().int().positive(),
3087
- changed: z20.array(z20.string().max(MAX_SETTING_NAME_LENGTH).regex(/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)*$/)).max(MAX_CHANGED_SETTINGS),
3088
- weakened: z20.boolean().optional(),
3089
- managedBy: z20.string().regex(CONFIG_TOOL_PATTERN).nullable().optional(),
3090
- outsideConfig: z20.boolean().optional()
3754
+ revision: z21.number().int().positive(),
3755
+ changed: z21.array(z21.string().max(MAX_SETTING_NAME_LENGTH).regex(/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)*$/)).max(MAX_CHANGED_SETTINGS),
3756
+ weakened: z21.boolean().optional(),
3757
+ managedBy: z21.string().regex(CONFIG_TOOL_PATTERN).nullable().optional(),
3758
+ outsideConfig: z21.boolean().optional()
3091
3759
  }),
3092
- "oauth_provider.updated": z20.object({
3760
+ "oauth_provider.updated": z21.object({
3093
3761
  provider,
3094
- changed: z20.array(z20.enum([
3762
+ changed: z21.array(z21.enum([
3095
3763
  "clientId",
3096
3764
  "secret",
3097
3765
  "teamId",
@@ -3100,11 +3768,11 @@ var EVENT_DATA_SCHEMAS = {
3100
3768
  "additionalClientIds",
3101
3769
  "enabled"
3102
3770
  ])).max(7),
3103
- created: z20.boolean().optional(),
3104
- additionalClientIdCount: z20.number().int().min(0).max(MAX_ADDITIONAL_CLIENT_IDS).optional(),
3105
- weakened: z20.boolean().optional(),
3771
+ created: z21.boolean().optional(),
3772
+ additionalClientIdCount: z21.number().int().min(0).max(MAX_ADDITIONAL_CLIENT_IDS).optional(),
3773
+ weakened: z21.boolean().optional(),
3106
3774
  dependentAccounts: dependentAccounts.optional(),
3107
- dependentAccountsIncomplete: z20.boolean().optional(),
3775
+ dependentAccountsIncomplete: z21.boolean().optional(),
3108
3776
  ...carriedOut()
3109
3777
  }).refine(proposalIsWhole, PROPOSAL_IS_WHOLE).meta({
3110
3778
  ref: "OAuthProviderUpdatedEventData",
@@ -3112,132 +3780,306 @@ var EVENT_DATA_SCHEMAS = {
3112
3780
  }),
3113
3781
  "oauth_provider.deleted": data("OAuthProviderDeleted", "An OAuth provider’s credentials were removed.", {
3114
3782
  provider,
3115
- weakened: z20.boolean().optional(),
3783
+ weakened: z21.boolean().optional(),
3116
3784
  dependentAccounts: dependentAccounts.optional(),
3117
- dependentAccountsIncomplete: z20.boolean().optional()
3785
+ dependentAccountsIncomplete: z21.boolean().optional()
3118
3786
  }),
3119
3787
  "webhook_endpoint.created": data("WebhookEndpointCreated", "A webhook endpoint was registered. Its address and signing secret are not in the event.", {
3120
- eventTypes: z20.number().int().min(1).max(ACTIVITY_TYPES2.length),
3121
- enabled: z20.boolean()
3788
+ eventTypes: z21.number().int().min(1).max(ACTIVITY_TYPES2.length),
3789
+ enabled: z21.boolean()
3122
3790
  }),
3123
3791
  "webhook_endpoint.updated": data("WebhookEndpointUpdated", "A webhook endpoint was changed.", {
3124
- changed: z20.array(z20.enum(WEBHOOK_ENDPOINT_FIELDS)).min(1).max(WEBHOOK_ENDPOINT_FIELDS.length)
3792
+ changed: z21.array(z21.enum(WEBHOOK_ENDPOINT_FIELDS)).min(1).max(WEBHOOK_ENDPOINT_FIELDS.length)
3125
3793
  }),
3126
3794
  "webhook_endpoint.deleted": data("WebhookEndpointDeleted", "A webhook endpoint was removed; nothing more is delivered to it.", {}),
3127
3795
  "webhook_endpoint.disabled": data("WebhookEndpointDisabled", "The server switched a webhook endpoint off: its deliveries kept failing, or it answered 410 Gone. Nothing is delivered to it until it is switched on again.", {
3128
- reason: z20.enum(WEBHOOK_DISABLED_REASONS)
3796
+ reason: z21.enum(WEBHOOK_DISABLED_REASONS)
3129
3797
  }),
3130
3798
  "webhook_endpoint.secret_rotated": data("WebhookEndpointSecretRotated", "A webhook endpoint’s signing secret was replaced. Deliveries carry a signature for the new secret and one for the previous secret until the time given; after it, for the new one only. Neither secret, nor any part of one, is in the event.", {
3131
- rotationOverlapEndsAt: z20.iso.datetime()
3799
+ rotationOverlapEndsAt: z21.iso.datetime()
3132
3800
  }),
3133
3801
  "webhook_endpoint.previous_secret_revoked": data("WebhookEndpointPreviousSecretRevoked", "An administrator ended the overlap of a secret rotation early: the endpoint’s previous signing secret stopped signing at once and was deleted. Deliveries carry a signature for the current secret only.", {}),
3134
3802
  "hook.created": data("HookCreated", "A hook was registered. Its address and signing secret are not in the event.", {
3135
- point: z20.enum(HOOK_POINTS),
3136
- enabled: z20.boolean(),
3137
- failureMode: z20.enum(HOOK_FAILURE_MODES),
3138
- weakened: z20.boolean().optional()
3803
+ point: z21.enum(HOOK_POINTS),
3804
+ enabled: z21.boolean(),
3805
+ failureMode: z21.enum(HOOK_FAILURE_MODES),
3806
+ weakened: z21.boolean().optional()
3139
3807
  }),
3140
3808
  "hook.updated": data("HookUpdated", "A hook was changed.", {
3141
- point: z20.enum(HOOK_POINTS),
3142
- changed: z20.array(z20.enum(HOOK_FIELDS)).min(1).max(HOOK_FIELDS.length),
3143
- weakened: z20.boolean().optional()
3809
+ point: z21.enum(HOOK_POINTS),
3810
+ changed: z21.array(z21.enum(HOOK_FIELDS)).min(1).max(HOOK_FIELDS.length),
3811
+ weakened: z21.boolean().optional()
3144
3812
  }),
3145
3813
  "hook.deleted": data("HookDeleted", "A hook was removed; it is not asked any more.", {
3146
- point: z20.enum(HOOK_POINTS),
3147
- weakened: z20.boolean().optional()
3814
+ point: z21.enum(HOOK_POINTS),
3815
+ weakened: z21.boolean().optional()
3148
3816
  }),
3149
3817
  "native_app.created": data("NativeAppCreated", "A native app was registered: the association files served for the environment name it from now on. Its bundle id or package name, its team and its fingerprints are not in the event.", {
3150
- platform: z20.enum(NATIVE_APP_PLATFORMS),
3151
- fingerprints: z20.number().int().min(0).max(MAX_CERT_FINGERPRINTS),
3152
- appLinkPaths: z20.number().int().min(0).max(MAX_APP_LINK_PATHS).optional(),
3153
- weakened: z20.boolean().optional()
3818
+ platform: z21.enum(NATIVE_APP_PLATFORMS),
3819
+ fingerprints: z21.number().int().min(0).max(MAX_CERT_FINGERPRINTS),
3820
+ appLinkPaths: z21.number().int().min(0).max(MAX_APP_LINK_PATHS).optional(),
3821
+ weakened: z21.boolean().optional()
3154
3822
  }),
3155
3823
  "native_app.updated": data("NativeAppUpdated", "A registered native app was changed.", {
3156
- platform: z20.enum(NATIVE_APP_PLATFORMS),
3157
- changed: z20.array(z20.enum(NATIVE_APP_FIELDS)).min(1).max(NATIVE_APP_FIELDS.length),
3158
- fingerprints: z20.number().int().min(0).max(MAX_CERT_FINGERPRINTS),
3159
- appLinkPaths: z20.number().int().min(0).max(MAX_APP_LINK_PATHS).optional(),
3160
- weakened: z20.boolean().optional()
3824
+ platform: z21.enum(NATIVE_APP_PLATFORMS),
3825
+ changed: z21.array(z21.enum(NATIVE_APP_FIELDS)).min(1).max(NATIVE_APP_FIELDS.length),
3826
+ fingerprints: z21.number().int().min(0).max(MAX_CERT_FINGERPRINTS),
3827
+ appLinkPaths: z21.number().int().min(0).max(MAX_APP_LINK_PATHS).optional(),
3828
+ weakened: z21.boolean().optional()
3829
+ }),
3830
+ "native_app.deleted": data("NativeAppDeleted", "A registered native app was removed: the association files no longer name it.", { platform: z21.enum(NATIVE_APP_PLATFORMS) }),
3831
+ "sso_connection.created": data("SsoConnectionCreated", "A single sign-on connection was created for an organization. Its issuer, client and domains are not in the event.", {
3832
+ protocol: z21.enum(SSO_PROTOCOLS),
3833
+ status: z21.enum(SSO_CONNECTION_STATUSES),
3834
+ domains: z21.number().int().min(0).max(MAX_SSO_CONNECTION_DOMAINS)
3835
+ }),
3836
+ "sso_connection.updated": data("SsoConnectionUpdated", "A single sign-on connection was changed.", {
3837
+ protocol: z21.enum(SSO_PROTOCOLS),
3838
+ changed: z21.array(z21.enum(SSO_CONNECTION_FIELDS)).min(1).max(SSO_CONNECTION_FIELDS.length),
3839
+ status: z21.enum(SSO_CONNECTION_STATUSES),
3840
+ weakened: z21.boolean().optional()
3841
+ }),
3842
+ "sso_connection.deleted": data("SsoConnectionDeleted", "A single sign-on connection was removed.", { protocol: z21.enum(SSO_PROTOCOLS) }),
3843
+ "scim_token.created": data("ScimTokenCreated", "A SCIM token was created for an organization's directory. The token is not in the event.", { organizationId: id2() }),
3844
+ "scim_token.revoked": data("ScimTokenRevoked", "A SCIM token was revoked: the directory it belonged to can no longer provision with it.", { organizationId: id2() }),
3845
+ "setup_link.created": data("SetupLinkCreated", "A setup link was created for an organization (ADR 0067). The token is not in the event.", { organizationId: id2() }),
3846
+ "setup_link.revoked": data("SetupLinkRevoked", "A setup link was revoked: the portal it opened refuses it from the next request.", { organizationId: id2() }),
3847
+ "user.scim_provisioned": data("UserScimProvisioned", "An organization's directory created an account or took over an existing one (ADR 0067).", {
3848
+ organizationId: id2(),
3849
+ method: z21.enum(["created", "linked"])
3850
+ }),
3851
+ "user.scim_updated": data("UserScimUpdated", "An organization's directory changed a user it manages (ADR 0067). Which fields (name, email), never a value.", { organizationId: id2(), changed: z21.array(z21.enum(["name", "email"])) }),
3852
+ "scim_group.created": data("ScimGroupCreated", "An organization's directory pushed a new group. The group's name is not in the event.", { organizationId: id2() }),
3853
+ "scim_group.updated": data("ScimGroupUpdated", "A group of an organization's directory changed. Which fields, never their values.", {
3854
+ organizationId: id2(),
3855
+ changed: z21.array(z21.enum(["displayName", "externalId", "members"]))
3856
+ }),
3857
+ "scim_group.deleted": data("ScimGroupDeleted", "A group of an organization's directory was removed.", { organizationId: id2() }),
3858
+ "organization.created": data("OrganizationCreated", "An organization was created. Its name and slug are not in the event: read the organization by its id.", {}),
3859
+ "organization.updated": data("OrganizationUpdated", "An organization was renamed or its slug changed.", {
3860
+ changed: z21.array(z21.enum(ORGANIZATION_FIELDS)).min(1).max(ORGANIZATION_FIELDS.length)
3161
3861
  }),
3162
- "native_app.deleted": data("NativeAppDeleted", "A registered native app was removed: the association files no longer name it.", { platform: z20.enum(NATIVE_APP_PLATFORMS) }),
3862
+ "organization.deleted": data("OrganizationDeleted", "An organization was deleted, and its memberships with it. No `organization_membership.removed` event is recorded for them.", {
3863
+ memberships: z21.number().int().min(0)
3864
+ }),
3865
+ "organization_membership.added": data("OrganizationMembershipAdded", "A user became a member of an organization. The target is the membership. `via` is present when it was not an administrator or an invitation that added them: `domain_auto_join` (they signed up with a verified address on a domain set to auto-join) or `domain_suggestion` (they joined an organization their verified address was suggested).", {
3866
+ organizationId: id2(),
3867
+ userId: id2(),
3868
+ role: RoleKeySchema,
3869
+ via: z21.enum(["domain_auto_join", "domain_suggestion"]).optional()
3870
+ }),
3871
+ "organization_membership.role_changed": data("OrganizationMembershipRoleChanged", "A member was given another role. The session of that member carries the new role from its next refresh.", { organizationId: id2(), userId: id2(), role: RoleKeySchema, previousRole: RoleKeySchema }),
3872
+ "organization_membership.removed": data("OrganizationMembershipRemoved", "A member was removed from an organization. The session of that user leaves the organization at its next refresh; the account stays.", { organizationId: id2(), userId: id2(), role: RoleKeySchema }),
3873
+ "organization_role.created": data("OrganizationRoleCreated", "A custom role was defined. No member holds it yet. Read the role by its key for its name and permissions.", { role: RoleKeySchema, permissions: z21.number().int().min(0).max(MAX_PERMISSIONS_PER_ROLE2) }),
3874
+ "organization_role.updated": data("OrganizationRoleUpdated", "A custom role was renamed or its permissions were replaced. Members who hold it carry the new permissions from their next refresh. `weakened` is present, and true, when the role gained a permission.", {
3875
+ role: RoleKeySchema,
3876
+ changed: z21.array(z21.enum(ORGANIZATION_ROLE_FIELDS)).min(1).max(ORGANIZATION_ROLE_FIELDS.length),
3877
+ permissions: z21.number().int().min(0).max(MAX_PERMISSIONS_PER_ROLE2),
3878
+ weakened: z21.literal(true).optional()
3879
+ }),
3880
+ "organization_role.deleted": data("OrganizationRoleDeleted", "A custom role was deleted. No member held it.", { role: RoleKeySchema }),
3881
+ "organization_domain.claimed": data("OrganizationDomainClaimed", "A code was emailed to an address on a domain an organization wants to claim (the first time, or again). Nothing is granted until the code is entered.", { organizationId: id2(), domain: DomainName, mode: z21.enum(ORGANIZATION_DOMAIN_MODES2) }),
3882
+ "organization_domain.verified": data("OrganizationDomainVerified", "An organization verified a domain: users who sign up with a verified address on it are suggested the organization or joined to it, by `mode`, until the verification lapses. `reverified` is present, and true, when the domain was already verified (proven again before or after it lapsed). `weakened` is present, and true, for `auto_join`.", {
3883
+ organizationId: id2(),
3884
+ domain: DomainName,
3885
+ mode: z21.enum(ORGANIZATION_DOMAIN_MODES2),
3886
+ reverified: z21.literal(true).optional(),
3887
+ weakened: z21.literal(true).optional()
3888
+ }),
3889
+ "organization_domain.updated": data("OrganizationDomainUpdated", "What a domain does was changed. `weakened` is present, and true, when the domain now auto-joins.", {
3890
+ organizationId: id2(),
3891
+ domain: DomainName,
3892
+ mode: z21.enum(ORGANIZATION_DOMAIN_MODES2),
3893
+ previousMode: z21.enum(ORGANIZATION_DOMAIN_MODES2),
3894
+ weakened: z21.literal(true).optional()
3895
+ }),
3896
+ "organization_domain.removed": data("OrganizationDomainRemoved", "A domain was removed, verified or not. No future sign-up joins or is suggested the organization because of it; members who joined stay.", { organizationId: id2(), domain: DomainName }),
3897
+ "organization_invitation.created": data("OrganizationInvitationCreated", "Someone was invited to an organization. The target is the invitation; the invited address is not in the event: read the invitation by its id.", { organizationId: id2(), role: RoleKeySchema }),
3898
+ "organization_invitation.accepted": data("OrganizationInvitationAccepted", "An invitation was accepted by the user it was for, who became a member in the same transaction (an `organization_membership.added` event follows it). The actor is that user.", { organizationId: id2(), role: RoleKeySchema, userId: id2() }),
3899
+ "organization_invitation.declined": data("OrganizationInvitationDeclined", "An invitation was declined by the user it was for. The actor is that user.", { organizationId: id2(), role: RoleKeySchema, userId: id2() }),
3900
+ "organization_invitation.revoked": data("OrganizationInvitationRevoked", "A pending invitation was withdrawn: its link no longer works.", { organizationId: id2(), role: RoleKeySchema }),
3163
3901
  "proposal.created": data("ProposalCreated", "An agent asked for a change as a proposal. Nothing has changed: a human has to approve it.", proposed2),
3164
3902
  "proposal.approved": data("ProposalApproved", "A human approved an agent’s proposal. The actor is the human; the operation follows.", {
3165
3903
  ...proposed2,
3166
3904
  proposedBy: id2()
3167
3905
  }),
3906
+ "proposal.rejected": data("ProposalRejected", "A human rejected an agent’s proposal. The actor is the human; nothing was carried out.", {
3907
+ ...proposed2,
3908
+ proposedBy: id2()
3909
+ }),
3168
3910
  "proposal.executed": data("ProposalExecuted", "An approved proposal’s operation was carried out. The actor is the agent that asked.", {
3169
3911
  ...proposed2,
3170
3912
  approvedBy: ProposalApproverSchema,
3171
- changed: z20.boolean().optional()
3913
+ changed: z21.boolean().optional()
3172
3914
  }),
3173
3915
  "proposal.failed": data("ProposalFailed", "An approved proposal’s operation was not carried out. The proposal is spent all the same.", {
3174
3916
  ...proposed2,
3175
3917
  approvedBy: ProposalApproverSchema,
3176
- reason: z20.enum(PROPOSAL_FAILURE_REASONS)
3918
+ reason: z21.enum(PROPOSAL_FAILURE_REASONS)
3919
+ }),
3920
+ "audit.exported": data("AuditExported", "An environment’s audit log was exported. The filters are those of the request; `rowCount` is how many entries were written (a stream that ended early counts what it wrote); `resumed` is true when the request continued an earlier export.", {
3921
+ phase: z21.enum(["started", "finished"]).optional(),
3922
+ format: z21.enum(AUDIT_EXPORT_FORMATS),
3923
+ rowCount: z21.number().int().min(0),
3924
+ resumed: z21.boolean(),
3925
+ action: z21.enum(ACTIVITY_TYPES2).optional(),
3926
+ actorId: id2().optional(),
3927
+ actorType: z21.enum(AUDIT_ACTOR_TYPES).optional(),
3928
+ targetId: id2().optional(),
3929
+ organizationId: id2().optional(),
3930
+ from: z21.iso.datetime({ offset: true }).optional(),
3931
+ to: z21.iso.datetime({ offset: true }).optional()
3177
3932
  }),
3178
3933
  "sign_in_test.started": data("SignInTestStarted", "A sign-in test began: the server is about to sign a throwaway user up and in through the environment’s flow, and delete it.", {}),
3179
3934
  "sign_in_test.finished": data("SignInTestFinished", "A sign-in test ended. `userId` is the throwaway user it made (absent when no account was made); `cleanup` says whether that user was deleted.", {
3180
- outcome: z20.enum(SIGN_IN_TEST_OUTCOMES),
3181
- cleanup: z20.enum(SIGN_IN_TEST_CLEANUPS),
3935
+ outcome: z21.enum(SIGN_IN_TEST_OUTCOMES),
3936
+ cleanup: z21.enum(SIGN_IN_TEST_CLEANUPS),
3182
3937
  userId: id2().optional()
3183
3938
  })
3184
3939
  };
3185
- var EventActorSchema = z20.object({ type: z20.enum(AUDIT_ACTOR_TYPES), id: z20.string().min(1).max(128).nullable() }).meta({ ref: "EventActor" });
3940
+ var EventActorSchema = z21.object({ type: z21.enum(AUDIT_ACTOR_TYPES), id: z21.string().min(1).max(128).nullable() }).meta({ ref: "EventActor" });
3186
3941
  function envelope(type) {
3187
3942
  const details = EVENT_DATA_SCHEMAS[type];
3188
- const { ref, description } = z20.globalRegistry.get(details) ?? {};
3189
- return z20.object({
3943
+ const { ref, description } = z21.globalRegistry.get(details) ?? {};
3944
+ return z21.object({
3190
3945
  id: id2(),
3191
- type: z20.literal(type),
3192
- schemaVersion: z20.literal(EVENT_SCHEMA_VERSION2),
3193
- occurredAt: z20.iso.datetime(),
3946
+ type: z21.literal(type),
3947
+ schemaVersion: z21.literal(EVENT_SCHEMA_VERSION2),
3948
+ occurredAt: z21.iso.datetime(),
3194
3949
  actor: EventActorSchema,
3195
- target: z20.object({ type: z20.literal(EVENT_TARGET_TYPES2[type]), id: id2() }),
3950
+ target: z21.object({ type: z21.literal(EVENT_TARGET_TYPES2[type]), id: id2() }),
3196
3951
  data: details,
3197
- test: z20.literal(true).optional()
3952
+ test: z21.literal(true).optional()
3198
3953
  }).meta({ ref: String(ref).replace(/Data$/, ""), description });
3199
3954
  }
3200
3955
  var envelopes = ACTIVITY_TYPES2.map((type) => [type, envelope(type)]);
3201
3956
  var EVENT_SCHEMAS = Object.fromEntries(envelopes);
3202
- var TulaEventSchema = z20.discriminatedUnion("type", envelopes.map(([, schema]) => schema)).meta({ ref: "TulaEvent" });
3957
+ var TulaEventSchema = z21.discriminatedUnion("type", envelopes.map(([, schema]) => schema)).meta({ ref: "TulaEvent" });
3203
3958
  // src/mfa.ts
3204
- import { z as z21 } from "zod";
3959
+ import { z as z22 } from "zod";
3205
3960
  var TOTP_DIGITS = 6;
3206
3961
  var TOTP_PERIOD_SECONDS = 30;
3207
3962
  var BACKUP_CODE_COUNT = 10;
3208
- var FactorsSchema = z21.object({
3209
- totp: z21.object({ enabled: z21.boolean(), confirmedAt: z21.iso.datetime().nullable() }),
3210
- backupCodes: z21.object({ remaining: z21.number().int().min(0) }),
3211
- sms: z21.object({
3212
- enabled: z21.boolean(),
3213
- enabledAt: z21.iso.datetime().nullable(),
3214
- inUse: z21.boolean(),
3215
- available: z21.boolean()
3963
+ var FactorsSchema = z22.object({
3964
+ totp: z22.object({ enabled: z22.boolean(), confirmedAt: z22.iso.datetime().nullable() }),
3965
+ backupCodes: z22.object({ remaining: z22.number().int().min(0) }),
3966
+ sms: z22.object({
3967
+ enabled: z22.boolean(),
3968
+ enabledAt: z22.iso.datetime().nullable(),
3969
+ inUse: z22.boolean(),
3970
+ available: z22.boolean()
3216
3971
  }).optional()
3217
3972
  }).meta({ ref: "Factors" });
3218
- var SmsFactorCodeSchema = z21.object({
3219
- method: z21.literal("sms_code"),
3220
- destination: z21.string(),
3221
- expiresAt: z21.iso.datetime()
3973
+ var SmsFactorCodeSchema = z22.object({
3974
+ method: z22.literal("sms_code"),
3975
+ destination: z22.string(),
3976
+ expiresAt: z22.iso.datetime()
3222
3977
  }).meta({ ref: "SmsFactorCode" });
3223
- var SmsFactorConfirmRequestSchema = z21.object({ code: z21.string().regex(/^\d{6}$/) }).meta({ ref: "SmsFactorConfirmRequest" });
3224
- var TotpEnrolmentSchema = z21.object({ secret: z21.string(), uri: z21.string() }).meta({ ref: "TotpEnrolment" });
3225
- var TotpConfirmRequestSchema = z21.object({ code: z21.string().regex(/^\d{6}$/) }).meta({ ref: "TotpConfirmRequest" });
3226
- var BackupCodesSchema = z21.object({ codes: z21.array(z21.string()) }).meta({ ref: "BackupCodes" });
3227
- var StepUpMethodSchema = z21.enum(["password", "totp", "backup_code", "email_code", "passkey", "sms_code"]).meta({ ref: "StepUpMethod" });
3228
- var StepUpRequestSchema = z21.discriminatedUnion("method", [
3229
- z21.object({ method: z21.literal("password"), password: z21.string().max(1024) }),
3230
- z21.object({ method: z21.literal("totp"), code: z21.string().regex(/^\d{6}$/) }),
3231
- z21.object({ method: z21.literal("backup_code"), code: z21.string().min(1).max(64) }),
3232
- z21.object({ method: z21.literal("email_code"), code: z21.string().regex(/^\d{6}$/) }),
3233
- z21.object({ method: z21.literal("passkey"), credential: PasskeyAssertionCredentialSchema }),
3234
- z21.object({ method: z21.literal("sms_code"), code: z21.string().regex(/^\d{6}$/) })
3978
+ var SmsFactorConfirmRequestSchema = z22.object({ code: z22.string().regex(/^\d{6}$/) }).meta({ ref: "SmsFactorConfirmRequest" });
3979
+ var TotpEnrolmentSchema = z22.object({ secret: z22.string(), uri: z22.string() }).meta({ ref: "TotpEnrolment" });
3980
+ var TotpConfirmRequestSchema = z22.object({ code: z22.string().regex(/^\d{6}$/) }).meta({ ref: "TotpConfirmRequest" });
3981
+ var BackupCodesSchema = z22.object({ codes: z22.array(z22.string()) }).meta({ ref: "BackupCodes" });
3982
+ var StepUpMethodSchema = z22.enum(["password", "totp", "backup_code", "email_code", "passkey", "sms_code"]).meta({ ref: "StepUpMethod" });
3983
+ var StepUpRequestSchema = z22.discriminatedUnion("method", [
3984
+ z22.object({ method: z22.literal("password"), password: z22.string().max(1024) }),
3985
+ z22.object({ method: z22.literal("totp"), code: z22.string().regex(/^\d{6}$/) }),
3986
+ z22.object({ method: z22.literal("backup_code"), code: z22.string().min(1).max(64) }),
3987
+ z22.object({ method: z22.literal("email_code"), code: z22.string().regex(/^\d{6}$/) }),
3988
+ z22.object({ method: z22.literal("passkey"), credential: PasskeyAssertionCredentialSchema }),
3989
+ z22.object({ method: z22.literal("sms_code"), code: z22.string().regex(/^\d{6}$/) })
3235
3990
  ]).meta({ ref: "StepUpRequest" });
3236
- var StepUpEmailCodeSchema = z21.object({
3237
- method: z21.literal("email_code"),
3238
- destination: z21.string(),
3239
- expiresAt: z21.iso.datetime()
3991
+ var StepUpEmailCodeSchema = z22.object({
3992
+ method: z22.literal("email_code"),
3993
+ destination: z22.string(),
3994
+ expiresAt: z22.iso.datetime()
3240
3995
  }).meta({ ref: "StepUpEmailCode" });
3996
+ // src/organization-domain.ts
3997
+ import { z as z23 } from "zod";
3998
+ var OrganizationDomainNameSchema = z23.string().max(2 * MAX_DOMAIN_LENGTH2).superRefine((domain, context) => {
3999
+ const refusal = domainRefusal2(domain);
4000
+ if (refusal === "grammar") {
4001
+ context.addIssue({
4002
+ code: "custom",
4003
+ message: "a domain is lower-case ASCII letters, digits and hyphens in labels joined by full stops (write an internationalised name in punycode)"
4004
+ });
4005
+ } else if (refusal === "length") {
4006
+ context.addIssue({
4007
+ code: "custom",
4008
+ message: "a domain is at most 253 characters, and each label at most 63"
4009
+ });
4010
+ }
4011
+ }).meta({ ref: "OrganizationDomainName" });
4012
+ var OrganizationDomainModeSchema = z23.enum(ORGANIZATION_DOMAIN_MODES2).meta({ ref: "OrganizationDomainMode" });
4013
+ var OrganizationDomainStatusSchema = z23.enum(ORGANIZATION_DOMAIN_STATUSES2).meta({ ref: "OrganizationDomainStatus" });
4014
+ var OrganizationDomainSchema = z23.object({
4015
+ id: z23.string(),
4016
+ domain: z23.string(),
4017
+ mode: OrganizationDomainModeSchema,
4018
+ status: OrganizationDomainStatusSchema,
4019
+ verifiedAt: z23.iso.datetime().nullable(),
4020
+ expiresAt: z23.iso.datetime().nullable(),
4021
+ codeExpiresAt: z23.iso.datetime().nullable(),
4022
+ createdAt: z23.iso.datetime(),
4023
+ updatedAt: z23.iso.datetime()
4024
+ }).meta({ ref: "OrganizationDomain" });
4025
+ var OrganizationDomainListSchema = z23.object({ data: z23.array(OrganizationDomainSchema) }).meta({ ref: "OrganizationDomainList" });
4026
+ var StartOrganizationDomainRequestSchema = z23.strictObject({
4027
+ domain: OrganizationDomainNameSchema,
4028
+ email: z23.string().max(320),
4029
+ mode: OrganizationDomainModeSchema
4030
+ }).meta({ ref: "StartOrganizationDomainRequest" });
4031
+ var VerifyOrganizationDomainRequestSchema = z23.strictObject({ code: z23.string().regex(/^\d{6}$/) }).meta({ ref: "VerifyOrganizationDomainRequest" });
4032
+ var UpdateOrganizationDomainRequestSchema = z23.strictObject({ mode: OrganizationDomainModeSchema }).meta({ ref: "UpdateOrganizationDomainRequest" });
4033
+ var OrganizationSuggestionSchema = z23.object({ id: z23.string(), name: z23.string(), slug: z23.string() }).meta({ ref: "OrganizationSuggestion" });
4034
+ var OrganizationSuggestionListSchema = z23.object({ data: z23.array(OrganizationSuggestionSchema) }).meta({ ref: "OrganizationSuggestionList" });
4035
+ // src/organization-invitation.ts
4036
+ import { z as z24 } from "zod";
4037
+ var INVITATION_EXPIRY_DAYS = 7;
4038
+ var MAX_LINK_FIELD_LENGTH2 = 2048;
4039
+ var INVITATION_STATUSES = [
4040
+ "pending",
4041
+ "accepted",
4042
+ "declined",
4043
+ "revoked",
4044
+ "expired"
4045
+ ];
4046
+ var OrganizationInvitationSchema = z24.object({
4047
+ id: z24.string(),
4048
+ organizationId: z24.string(),
4049
+ email: z24.string(),
4050
+ role: z24.string(),
4051
+ status: z24.enum(INVITATION_STATUSES),
4052
+ invitedBy: z24.string().nullable(),
4053
+ expiresAt: z24.iso.datetime(),
4054
+ createdAt: z24.iso.datetime()
4055
+ }).meta({ ref: "OrganizationInvitation" });
4056
+ var OrganizationInvitationListSchema = z24.object({ meta: PaginationMetaSchema, data: z24.array(OrganizationInvitationSchema) }).meta({ ref: "OrganizationInvitationList" });
4057
+ var OrganizationInvitationQuerySchema = z24.object({
4058
+ page: z24.coerce.number().int().min(1).max(1e6).default(1),
4059
+ size: z24.coerce.number().int().min(1).max(MAX_PAGE_SIZE).default(DEFAULT_PAGE_SIZE),
4060
+ status: z24.enum(INVITATION_STATUSES).default("pending")
4061
+ }).meta({ ref: "OrganizationInvitationQuery" });
4062
+ var CreateOrganizationInvitationRequestSchema = z24.strictObject({
4063
+ email: z24.string().max(320),
4064
+ role: RoleKeySchema,
4065
+ redirectUrl: z24.string().max(MAX_LINK_FIELD_LENGTH2)
4066
+ }).meta({ ref: "CreateOrganizationInvitationRequest" });
4067
+ var InvitationTokenRequestSchema = z24.strictObject({ token: z24.string().min(1).max(MAX_LINK_FIELD_LENGTH2) }).meta({ ref: "InvitationTokenRequest" });
4068
+ var InvitationPreviewSchema = z24.object({
4069
+ organizationName: z24.string(),
4070
+ role: z24.string(),
4071
+ email: z24.string(),
4072
+ expiresAt: z24.iso.datetime()
4073
+ }).meta({ ref: "InvitationPreview" });
4074
+ var AcceptedInvitationSchema = UserOrganizationSchema.meta({ ref: "AcceptedInvitation" });
4075
+ var MyOrganizationInvitationSchema = z24.object({
4076
+ id: z24.string(),
4077
+ organizationName: z24.string(),
4078
+ role: z24.string(),
4079
+ expiresAt: z24.iso.datetime()
4080
+ }).meta({ ref: "MyOrganizationInvitation" });
4081
+ var MyOrganizationInvitationListSchema = z24.object({ meta: PaginationMetaSchema, data: z24.array(MyOrganizationInvitationSchema) }).meta({ ref: "MyOrganizationInvitationList" });
4082
+ var MyOrganizationInvitationQuerySchema = OrganizationPageQuerySchema;
3241
4083
  // src/settings-weakening.ts
3242
4084
  var SWITCHED_RULES = [
3243
4085
  "requireLowercase",
@@ -3382,6 +4224,20 @@ function redirectWeakenings(before, after) {
3382
4224
  const had = new Set(before.allowedRedirectUrls);
3383
4225
  return after.allowedRedirectUrls.some((url) => !had.has(url) && isCustomSchemeRedirectUrl2(url)) ? ["urls.allowedRedirectUrls"] : [];
3384
4226
  }
4227
+ function organizationWeakenings(before, after) {
4228
+ const paths = [];
4229
+ if (before.enabled && !after.enabled) {
4230
+ paths.push("organizations.enabled");
4231
+ }
4232
+ if (!before.allowUserCreated && after.allowUserCreated) {
4233
+ paths.push("organizations.allowUserCreated");
4234
+ }
4235
+ const cap = (value) => value ?? Number.POSITIVE_INFINITY;
4236
+ if (cap(after.maxCreatedPerUser) > cap(before.maxCreatedPerUser)) {
4237
+ paths.push("organizations.maxCreatedPerUser");
4238
+ }
4239
+ return paths;
4240
+ }
3385
4241
  function settingsWeakenings(before, after) {
3386
4242
  const paths = passwordWeakenings(before.password, after.password);
3387
4243
  if (shorterRetention(before.audit.retentionDays, after.audit.retentionDays)) {
@@ -3413,44 +4269,327 @@ function settingsWeakenings(before, after) {
3413
4269
  if (isAllowed === true && wasAllowed !== true || isAllowed === null && wasAllowed === false) {
3414
4270
  paths.push("agents.testSignIn");
3415
4271
  }
4272
+ paths.push(...organizationWeakenings(before.organizations, after.organizations));
3416
4273
  return paths;
3417
4274
  }
3418
4275
  // src/sign-in-test.ts
3419
- import * as z22 from "zod";
3420
- var SignInTestStepResultSchema = z22.strictObject({
3421
- step: z22.enum(SIGN_IN_TEST_STEPS),
3422
- outcome: z22.enum(SIGN_IN_TEST_STEP_OUTCOMES),
3423
- durationMs: z22.number().int().min(0),
4276
+ import * as z25 from "zod";
4277
+ var SignInTestStepResultSchema = z25.strictObject({
4278
+ step: z25.enum(SIGN_IN_TEST_STEPS),
4279
+ outcome: z25.enum(SIGN_IN_TEST_STEP_OUTCOMES),
4280
+ durationMs: z25.number().int().min(0),
3424
4281
  code: ErrorCodeSchema.optional(),
3425
- reason: z22.enum(SIGN_IN_TEST_REASONS).optional()
4282
+ reason: z25.enum(SIGN_IN_TEST_REASONS).optional()
3426
4283
  }).meta({ ref: "SignInTestStepResult" });
3427
- var SignInTestReportSchema = z22.strictObject({
3428
- outcome: z22.enum(SIGN_IN_TEST_OUTCOMES),
3429
- steps: z22.array(SignInTestStepResultSchema).length(SIGN_IN_TEST_STEPS.length),
3430
- userId: z22.uuid().nullable(),
3431
- cleanup: z22.enum(SIGN_IN_TEST_CLEANUPS)
4284
+ var SignInTestReportSchema = z25.strictObject({
4285
+ outcome: z25.enum(SIGN_IN_TEST_OUTCOMES),
4286
+ steps: z25.array(SignInTestStepResultSchema).length(SIGN_IN_TEST_STEPS.length),
4287
+ userId: z25.uuid().nullable(),
4288
+ cleanup: z25.enum(SIGN_IN_TEST_CLEANUPS)
3432
4289
  }).meta({ ref: "SignInTestReport" });
3433
4290
  // src/sms.ts
3434
- import { z as z23 } from "zod";
4291
+ import { z as z26 } from "zod";
3435
4292
  var SMS_USAGE_MAX_DAYS = 30;
3436
4293
  var SMS_USAGE_DEFAULT_DAYS = 7;
3437
4294
  var SMS_USAGE_MAX_PREFIXES = 100;
3438
- var count = z23.number().int().min(0);
3439
- var SmsPrefixUsageSchema = z23.object({
3440
- prefix: z23.string().regex(new RegExp(`^\\+[0-9]{1,${SMS_PREFIX_MAX_DIGITS}}$`)),
4295
+ var count = z26.number().int().min(0);
4296
+ var SmsPrefixUsageSchema = z26.object({
4297
+ prefix: z26.string().regex(new RegExp(`^\\+[0-9]{1,${SMS_PREFIX_MAX_DIGITS}}$`)),
3441
4298
  sent: count,
3442
4299
  used: count,
3443
4300
  unused: count
3444
4301
  }).meta({ ref: "SmsPrefixUsage" });
3445
- var SmsUsageSchema = z23.object({
3446
- since: z23.iso.date(),
3447
- days: z23.number().int().min(1).max(SMS_USAGE_MAX_DAYS),
4302
+ var SmsUsageSchema = z26.object({
4303
+ since: z26.iso.date(),
4304
+ days: z26.number().int().min(1).max(SMS_USAGE_MAX_DAYS),
3448
4305
  sent: count,
3449
4306
  used: count,
3450
4307
  unused: count,
3451
- prefixes: z23.array(SmsPrefixUsageSchema).max(SMS_USAGE_MAX_PREFIXES),
3452
- truncated: z23.boolean()
4308
+ prefixes: z26.array(SmsPrefixUsageSchema).max(SMS_USAGE_MAX_PREFIXES),
4309
+ truncated: z26.boolean()
3453
4310
  }).meta({ ref: "SmsUsage" });
4311
+ // src/sso-attributes.ts
4312
+ var SSO_IDP_PRESETS = [
4313
+ "okta",
4314
+ "entra",
4315
+ "google_workspace",
4316
+ "jumpcloud",
4317
+ "onelogin",
4318
+ "ping",
4319
+ "generic"
4320
+ ];
4321
+ var CLAIM = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims";
4322
+ var MS_GROUPS = "http://schemas.microsoft.com/ws/2008/06/identity/claims/groups";
4323
+ var OIDC_STANDARD = { email: ["email"], firstName: ["given_name"], lastName: ["family_name"] };
4324
+ var SSO_ATTRIBUTE_DEFAULTS = {
4325
+ saml: {
4326
+ okta: {
4327
+ email: ["email"],
4328
+ firstName: ["firstName"],
4329
+ lastName: ["lastName"],
4330
+ groups: ["groups"]
4331
+ },
4332
+ entra: {
4333
+ email: [`${CLAIM}/emailaddress`],
4334
+ firstName: [`${CLAIM}/givenname`],
4335
+ lastName: [`${CLAIM}/surname`],
4336
+ groups: [MS_GROUPS]
4337
+ },
4338
+ google_workspace: {
4339
+ email: ["email"],
4340
+ firstName: ["firstName"],
4341
+ lastName: ["lastName"],
4342
+ groups: ["groups"]
4343
+ },
4344
+ jumpcloud: {
4345
+ email: ["email"],
4346
+ firstName: ["firstname"],
4347
+ lastName: ["lastname"],
4348
+ groups: ["memberOf"]
4349
+ },
4350
+ onelogin: {
4351
+ email: ["User.email"],
4352
+ firstName: ["User.FirstName"],
4353
+ lastName: ["User.LastName"],
4354
+ groups: ["memberOf"]
4355
+ },
4356
+ ping: { email: ["mail"], firstName: ["givenName"], lastName: ["sn"], groups: ["memberOf"] },
4357
+ generic: {
4358
+ email: ["email", "mail", `${CLAIM}/emailaddress`, "urn:oid:0.9.2342.19200300.100.1.3"],
4359
+ firstName: ["givenName", "firstName", `${CLAIM}/givenname`],
4360
+ lastName: ["sn", "surname", "lastName", `${CLAIM}/surname`],
4361
+ groups: ["groups", "memberOf", MS_GROUPS]
4362
+ }
4363
+ },
4364
+ oidc: {
4365
+ okta: { ...OIDC_STANDARD, groups: ["groups"] },
4366
+ entra: { ...OIDC_STANDARD, groups: ["groups"] },
4367
+ google_workspace: { ...OIDC_STANDARD, groups: ["groups"] },
4368
+ jumpcloud: { ...OIDC_STANDARD, groups: ["groups"] },
4369
+ onelogin: { ...OIDC_STANDARD, groups: ["groups"] },
4370
+ ping: { ...OIDC_STANDARD, groups: ["memberOf"] },
4371
+ generic: { ...OIDC_STANDARD, groups: ["groups"] }
4372
+ }
4373
+ };
4374
+ function effectiveAttributeNames(protocol, mapping) {
4375
+ const base = SSO_ATTRIBUTE_DEFAULTS[protocol][mapping?.idp ?? "generic"];
4376
+ return {
4377
+ email: mapping?.email ? [mapping.email] : base.email,
4378
+ firstName: mapping?.firstName ? [mapping.firstName] : base.firstName,
4379
+ lastName: mapping?.lastName ? [mapping.lastName] : base.lastName,
4380
+ groups: mapping?.groups ? [mapping.groups] : base.groups
4381
+ };
4382
+ }
4383
+ // src/sso-connection.ts
4384
+ import { z as z27 } from "zod";
4385
+ var Domains = z27.array(OrganizationDomainNameSchema).max(MAX_SSO_CONNECTION_DOMAINS);
4386
+ var IssuerSchema = z27.url({ protocol: /^https?$/ }).max(2048);
4387
+ var SamlSettingsInputSchema = z27.strictObject({
4388
+ metadataXml: z27.string().min(1).max(512 * 1024).optional(),
4389
+ metadataUrl: z27.url({ protocol: /^https?$/ }).max(2048).optional(),
4390
+ idpEntityId: z27.string().min(1).max(1024).optional(),
4391
+ ssoUrl: z27.url({ protocol: /^https?$/ }).max(2048).optional(),
4392
+ certificates: z27.array(z27.string().min(1).max(16 * 1024)).min(1).max(MAX_SAML_CERTIFICATES).optional()
4393
+ }).meta({ ref: "SamlSettingsInput" });
4394
+ var SsoAttributeMappingSchema = z27.strictObject({
4395
+ idp: z27.enum(SSO_IDP_PRESETS).optional(),
4396
+ email: z27.string().trim().min(1).max(512).optional(),
4397
+ firstName: z27.string().trim().min(1).max(512).optional(),
4398
+ lastName: z27.string().trim().min(1).max(512).optional(),
4399
+ groups: z27.string().trim().min(1).max(512).optional()
4400
+ }).meta({ ref: "SsoAttributeMapping" });
4401
+ var SsoGroupRolesSchema = z27.strictObject({
4402
+ mappings: z27.array(z27.strictObject({ group: z27.string().min(1).max(256), role: RoleKeySchema })).max(MAX_SSO_GROUP_ROLES)
4403
+ }).meta({ ref: "SsoGroupRoles" });
4404
+ var SetupGroupRolesSchema = z27.strictObject({
4405
+ mappings: z27.array(z27.strictObject({
4406
+ group: z27.string().min(1).max(256),
4407
+ role: RoleKeySchema,
4408
+ locked: z27.boolean()
4409
+ }))
4410
+ }).meta({ ref: "SetupGroupRoles" });
4411
+ var CreateSsoConnectionRequestSchema = z27.strictObject({
4412
+ organizationId: z27.uuid(),
4413
+ protocol: z27.enum(SSO_PROTOCOLS).default("oidc"),
4414
+ name: z27.string().trim().min(1).max(100),
4415
+ issuer: IssuerSchema.optional(),
4416
+ clientId: z27.string().min(1).max(512).optional(),
4417
+ clientSecret: z27.string().min(1).max(4096).optional(),
4418
+ saml: SamlSettingsInputSchema.optional(),
4419
+ attributeMapping: SsoAttributeMappingSchema.optional(),
4420
+ defaultRole: RoleKeySchema.default("member"),
4421
+ domains: Domains.default([])
4422
+ }).meta({ ref: "CreateSsoConnectionRequest" });
4423
+ var CreateMySsoConnectionRequestSchema = CreateSsoConnectionRequestSchema.omit({
4424
+ organizationId: true
4425
+ }).meta({ ref: "CreateMySsoConnectionRequest" });
4426
+ var UpdateSsoConnectionRequestSchema = z27.strictObject({
4427
+ name: z27.string().trim().min(1).max(100),
4428
+ issuer: IssuerSchema,
4429
+ clientId: z27.string().min(1).max(512),
4430
+ clientSecret: z27.string().min(1).max(4096),
4431
+ saml: SamlSettingsInputSchema,
4432
+ attributeMapping: SsoAttributeMappingSchema,
4433
+ defaultRole: RoleKeySchema,
4434
+ enforced: z27.boolean(),
4435
+ breakGlassRole: RoleKeySchema.nullable(),
4436
+ trustIdpMfa: z27.boolean(),
4437
+ domains: Domains,
4438
+ status: z27.enum(SSO_CONNECTION_STATUSES)
4439
+ }).partial().meta({ ref: "UpdateSsoConnectionRequest" });
4440
+ var SamlConnectionViewSchema = z27.object({
4441
+ idpEntityId: z27.string(),
4442
+ ssoUrl: z27.string(),
4443
+ metadataUrl: z27.string().nullable(),
4444
+ certificates: z27.array(z27.object({ fingerprint: z27.string(), notAfter: z27.iso.datetime(), expired: z27.boolean() })),
4445
+ spEntityId: z27.string(),
4446
+ acsUrl: z27.string(),
4447
+ spMetadataUrl: z27.string()
4448
+ }).meta({ ref: "SamlConnection" });
4449
+ var SsoConnectionSchema = z27.object({
4450
+ id: z27.uuid(),
4451
+ organizationId: z27.uuid(),
4452
+ protocol: z27.enum(SSO_PROTOCOLS),
4453
+ name: z27.string(),
4454
+ status: z27.enum(SSO_CONNECTION_STATUSES),
4455
+ issuer: z27.string(),
4456
+ clientId: z27.string(),
4457
+ clientSecretSet: z27.boolean(),
4458
+ saml: SamlConnectionViewSchema.nullable(),
4459
+ redirectUri: z27.string().nullable(),
4460
+ attributeMapping: SsoAttributeMappingSchema.nullable(),
4461
+ defaultRole: z27.string(),
4462
+ enforced: z27.boolean(),
4463
+ breakGlassRole: z27.string().nullable(),
4464
+ trustIdpMfa: z27.boolean(),
4465
+ domains: z27.array(z27.string()),
4466
+ tested: z27.boolean(),
4467
+ createdAt: z27.iso.datetime(),
4468
+ updatedAt: z27.iso.datetime()
4469
+ }).meta({ ref: "SsoConnection" });
4470
+ var SsoConnectionListSchema = z27.object({ connections: z27.array(SsoConnectionSchema) }).meta({ ref: "SsoConnectionList" });
4471
+ var SsoConnectionListQuerySchema = z27.object({ organizationId: z27.uuid().optional() });
4472
+ function ssoWeakenings(current, fields) {
4473
+ const changes = fields;
4474
+ const found = [];
4475
+ const content = Object.keys(changes).filter((key) => changes[key] !== undefined && !["name", "status", "enforced", "breakGlassRole", "trustIdpMfa"].includes(key));
4476
+ if (changes.status === "active") {
4477
+ found.push("activate");
4478
+ }
4479
+ if (current.status === "active" && content.length > 0) {
4480
+ found.push("active_content");
4481
+ }
4482
+ if (changes.enforced === false && current.enforced) {
4483
+ found.push("enforcement_off");
4484
+ }
4485
+ if (changes.trustIdpMfa === true && !current.trustIdpMfa) {
4486
+ found.push("trust_idp_mfa");
4487
+ }
4488
+ if (typeof changes.breakGlassRole === "string" && changes.breakGlassRole !== current.breakGlassRole) {
4489
+ found.push("break_glass_role");
4490
+ }
4491
+ return found;
4492
+ }
4493
+ var SsoStartRequestSchema = z27.object({ redirectUrl: z27.string().max(2048) }).meta({ ref: "SsoStartRequest" });
4494
+ // src/sso-setup-link.ts
4495
+ import { z as z28 } from "zod";
4496
+ var DEFAULT_SETUP_LINK_DAYS = 7;
4497
+ var MAX_SETUP_LINK_DAYS = 30;
4498
+ var IssuerSchema2 = z28.url({ protocol: /^https?$/ }).max(2048);
4499
+ var SetupLinkSchema = z28.object({
4500
+ id: z28.uuid(),
4501
+ organizationId: z28.uuid(),
4502
+ name: z28.string(),
4503
+ prefix: z28.string().describe("The start of the token, to tell links apart in a list."),
4504
+ expiresAt: z28.iso.datetime(),
4505
+ revokedAt: z28.iso.datetime().nullable(),
4506
+ lastUsedAt: z28.iso.datetime().nullable(),
4507
+ createdAt: z28.iso.datetime()
4508
+ }).meta({ ref: "SetupLink" });
4509
+ var CreatedSetupLinkSchema = SetupLinkSchema.extend({
4510
+ token: z28.string().describe("The setup token. Shown once; only its hash is stored."),
4511
+ url: z28.string().describe("The address to send to the IT administrator. The token is in its fragment.")
4512
+ }).meta({ ref: "CreatedSetupLink" });
4513
+ var SetupLinkListSchema = z28.object({ links: z28.array(SetupLinkSchema) }).meta({ ref: "SetupLinkList" });
4514
+ var CreateSetupLinkRequestSchema = z28.strictObject({
4515
+ organizationId: z28.uuid(),
4516
+ name: z28.string().trim().min(1).max(100).default("SSO setup"),
4517
+ expiresInDays: z28.number().int().min(1).max(MAX_SETUP_LINK_DAYS).default(DEFAULT_SETUP_LINK_DAYS)
4518
+ }).meta({ ref: "CreateSetupLinkRequest" });
4519
+ var CreateMySetupLinkRequestSchema = CreateSetupLinkRequestSchema.omit({
4520
+ organizationId: true
4521
+ }).meta({ ref: "CreateMySetupLinkRequest" });
4522
+ var SetupConnectionCreateSchema = z28.strictObject({
4523
+ protocol: z28.enum(SSO_PROTOCOLS).default("oidc"),
4524
+ name: z28.string().trim().min(1).max(100),
4525
+ issuer: IssuerSchema2.optional(),
4526
+ clientId: z28.string().min(1).max(512).optional(),
4527
+ clientSecret: z28.string().min(1).max(4096).optional(),
4528
+ saml: SamlSettingsInputSchema.optional(),
4529
+ attributeMapping: SsoAttributeMappingSchema.optional(),
4530
+ domains: z28.array(OrganizationDomainNameSchema).max(20).default([])
4531
+ }).meta({ ref: "SetupConnectionCreate" });
4532
+ var SetupConnectionUpdateSchema = z28.strictObject({
4533
+ name: z28.string().trim().min(1).max(100),
4534
+ issuer: IssuerSchema2,
4535
+ clientId: z28.string().min(1).max(512),
4536
+ clientSecret: z28.string().min(1).max(4096),
4537
+ saml: SamlSettingsInputSchema,
4538
+ attributeMapping: SsoAttributeMappingSchema,
4539
+ domains: z28.array(OrganizationDomainNameSchema).max(20),
4540
+ status: z28.literal("active")
4541
+ }).partial().meta({ ref: "SetupConnectionUpdate" });
4542
+ var SetupScimTokenCreateSchema = z28.strictObject({ name: z28.string().trim().min(1).max(100) }).meta({ ref: "SetupScimTokenCreate" });
4543
+ var SetupPortalSchema = z28.object({
4544
+ organization: z28.object({ id: z28.uuid(), name: z28.string() }),
4545
+ domains: z28.array(z28.string()).describe("The organization’s verified domains."),
4546
+ expiresAt: z28.iso.datetime(),
4547
+ connections: z28.array(SsoConnectionSchema)
4548
+ }).meta({ ref: "SetupPortal" });
4549
+ // src/sso-test.ts
4550
+ import { z as z29 } from "zod";
4551
+ var SSO_TEST_REASONS = {
4552
+ wrong_audience: "The response was meant for a different audience. Set the identity provider’s audience (SP entity id) or client id to the values shown for this connection.",
4553
+ wrong_issuer: "The response came from a different issuer than the one saved. Check the identity provider’s entity id or issuer.",
4554
+ wrong_recipient: "The response was addressed to another address than this connection’s assertion consumer service URL. Copy the ACS URL shown here into the identity provider.",
4555
+ unsigned_assertion: "The assertion was not signed. Turn on assertion signing in the identity provider.",
4556
+ signature_invalid: "The signature did not match the saved certificate. Upload the certificate the identity provider currently signs with.",
4557
+ signature_algorithm: "The response was signed with an algorithm that is not accepted. Use RSA with SHA-256.",
4558
+ certificate_not_trusted: "The response was signed with a key that is not one of the saved certificates.",
4559
+ certificate_expired: "The saved signing certificate has expired. Upload the identity provider’s new certificate.",
4560
+ assertion_expired: "The response had already expired. Check that the identity provider’s clock is right and that you finish the sign-in promptly.",
4561
+ clock_skew: "The response is not valid yet. The identity provider’s clock is ahead of this server’s; correct it.",
4562
+ response_not_to_this_request: "The response did not answer this test’s sign-in request (it was started at the identity provider, or is for another request).",
4563
+ replayed: "This response was already used once.",
4564
+ idp_refused: "The identity provider reported that the sign-in failed.",
4565
+ encrypted_assertion: "The assertion was encrypted, which is not supported. Turn off assertion encryption.",
4566
+ malformed_response: "The response could not be read or did not have the shape required (one signed assertion with a subject and conditions).",
4567
+ discovery_failed: "The identity provider’s configuration could not be read, or names an address that is not https.",
4568
+ token_exchange_failed: "The identity provider did not accept the code. Check the client id and the client secret.",
4569
+ no_id_token: "The identity provider’s answer held no ID token.",
4570
+ id_token_invalid: "The ID token could not be verified.",
4571
+ email_missing: "The identity provider sent no email address for the person.",
4572
+ email_outside_domains: "The email address is not on one of the connection’s verified domains, so it would be refused."
4573
+ };
4574
+ var REASON_CODES = Object.keys(SSO_TEST_REASONS);
4575
+ var SsoTestStartRequestSchema = z29.object({ redirectUrl: z29.string().max(2048) }).meta({ ref: "SsoTestStartRequest" });
4576
+ var AdminSsoTestStartRequestSchema = z29.object({ redirectUrl: z29.string().max(2048).optional() }).meta({ ref: "AdminSsoTestStartRequest" });
4577
+ var SsoTestStartSchema = z29.object({ testId: z29.uuid(), authorizationUrl: z29.string() }).meta({ ref: "SsoTestStart" });
4578
+ var SsoTestResultSchema = z29.object({
4579
+ testId: z29.uuid(),
4580
+ status: z29.enum(["pending", "passed", "failed"]),
4581
+ reason: z29.enum(REASON_CODES).nullable(),
4582
+ message: z29.string().nullable(),
4583
+ attributes: z29.array(z29.object({ name: z29.string(), values: z29.array(z29.string()) })),
4584
+ groups: z29.array(z29.string()),
4585
+ mapped: z29.object({
4586
+ email: z29.string().nullable(),
4587
+ givenName: z29.string().nullable(),
4588
+ familyName: z29.string().nullable(),
4589
+ emailOnVerifiedDomain: z29.boolean()
4590
+ }).nullable()
4591
+ }).meta({ ref: "SsoTestResult" });
4592
+ var SsoTestIdParamSchema = z29.object({ id: z29.uuid(), testId: z29.uuid() });
3454
4593
  export {
3455
4594
  ACCESS_TOKEN_ALGORITHM,
3456
4595
  ACCESS_TOKEN_VERSION,
@@ -3463,20 +4602,29 @@ export {
3463
4602
  ASSET_LINKS_RELATIONS,
3464
4603
  AT_LEAST_ONE_SIGN_IN_METHOD,
3465
4604
  AUDIT_ACTOR_TYPES,
4605
+ AUDIT_EXPORT_FORMATS,
3466
4606
  AUDIT_TARGET_TYPES,
3467
4607
  AUTHENTICATION_METHODS,
4608
+ AcceptedInvitationSchema,
3468
4609
  AccessTokenClaimsSchema,
4610
+ ActiveOrganizationSchema,
3469
4611
  ActivityTypeSchema,
4612
+ AddOrganizationMemberRequestSchema,
3470
4613
  AdditionalClientIdsSchema,
3471
4614
  AdminSessionSchema,
4615
+ AdminSsoTestStartRequestSchema,
3472
4616
  AndroidAppIdentitySchema,
3473
4617
  AndroidAppSchema,
3474
4618
  AppleAppSiteAssociationSchema,
3475
4619
  ApproveProposalRequestSchema,
3476
4620
  AssetLinksSchema,
4621
+ AssignableRoleListSchema,
4622
+ AssignableRoleSchema,
4623
+ AuditExportCursorSchema,
3477
4624
  AuditLogListSchema,
3478
4625
  AuditLogSchema,
3479
4626
  BACKUP_CODE_COUNT,
4627
+ BUILT_IN_ROLES2 as BUILT_IN_ROLES,
3480
4628
  BUILT_IN_SESSION_PROFILES,
3481
4629
  BUNDLE_ID_PATTERN,
3482
4630
  BackupCodesSchema,
@@ -3495,11 +4643,19 @@ export {
3495
4643
  ChangePasswordRequestSchema,
3496
4644
  ClientConfigSchema,
3497
4645
  CreateHookRequestSchema,
4646
+ CreateMySetupLinkRequestSchema,
4647
+ CreateMySsoConnectionRequestSchema,
3498
4648
  CreateNativeAppRequestSchema,
4649
+ CreateOrganizationInvitationRequestSchema,
4650
+ CreateOrganizationRequestSchema,
4651
+ CreateOrganizationRoleRequestSchema,
3499
4652
  CreateProposalRequestSchema,
4653
+ CreateSetupLinkRequestSchema,
4654
+ CreateSsoConnectionRequestSchema,
3500
4655
  CreateUserRequestSchema,
3501
4656
  CreateWebhookEndpointRequestSchema,
3502
4657
  CreatedHookSchema,
4658
+ CreatedSetupLinkSchema,
3503
4659
  CreatedWebhookEndpointSchema,
3504
4660
  CurrentUserSchema,
3505
4661
  DASHBOARD_HEADER2 as DASHBOARD_HEADER,
@@ -3507,14 +4663,21 @@ export {
3507
4663
  DASHBOARD_SESSION_COOKIE2 as DASHBOARD_SESSION_COOKIE,
3508
4664
  DEFAULT_APP_NAME,
3509
4665
  DEFAULT_ENVIRONMENT_SETTINGS,
4666
+ DEFAULT_MAX_ORGANIZATIONS_CREATED_PER_USER,
3510
4667
  DEFAULT_MOBILE_SESSION_PROFILE,
3511
4668
  DEFAULT_PAGE_SIZE,
4669
+ DEFAULT_SETUP_LINK_DAYS,
3512
4670
  DEFAULT_SMS_DAILY_MESSAGE_LIMIT,
3513
4671
  DEFAULT_SPECIAL_CHARS2 as DEFAULT_SPECIAL_CHARS,
3514
4672
  DEFAULT_STEP_UP_AFTER,
3515
4673
  DEFAULT_THEME2 as DEFAULT_THEME,
3516
4674
  DEFAULT_WEB_SESSION_PROFILE,
3517
4675
  DEPENDENT_ACCOUNTS_SCAN_LIMIT,
4676
+ DOMAINS_MANAGE_PERMISSION2 as DOMAINS_MANAGE_PERMISSION,
4677
+ DOMAIN_PATTERN2 as DOMAIN_PATTERN,
4678
+ DOMAIN_REMINDER_DAYS2 as DOMAIN_REMINDER_DAYS,
4679
+ DOMAIN_REVERIFICATION_GRACE_DAYS2 as DOMAIN_REVERIFICATION_GRACE_DAYS,
4680
+ DOMAIN_VERIFICATION_LIFETIME_DAYS2 as DOMAIN_VERIFICATION_LIFETIME_DAYS,
3518
4681
  DPOP_ALGORITHMS2 as DPOP_ALGORITHMS,
3519
4682
  DPOP_HEADER2 as DPOP_HEADER,
3520
4683
  DPOP_NONCE_HEADER2 as DPOP_NONCE_HEADER,
@@ -3555,6 +4718,7 @@ export {
3555
4718
  FactorEnrolmentMethodSchema,
3556
4719
  FactorsSchema,
3557
4720
  FieldErrorSchema,
4721
+ FirebaseScryptParamsSchema,
3558
4722
  FirstFactorAttemptRequestSchema,
3559
4723
  FirstFactorPrepareRequestSchema,
3560
4724
  FirstFactorStrategySchema,
@@ -3592,6 +4756,9 @@ export {
3592
4756
  ID_TOKEN_PROVIDERS,
3593
4757
  INSTANCE_ACTIVITY_TYPES,
3594
4758
  INSTANCE_AUDIT_TARGET_TYPES,
4759
+ INVITATIONS_MANAGE_PERMISSION2 as INVITATIONS_MANAGE_PERMISSION,
4760
+ INVITATION_EXPIRY_DAYS,
4761
+ INVITATION_STATUSES,
3595
4762
  IdTokenExchangeRequestSchema,
3596
4763
  IdTokenProviderSchema,
3597
4764
  IdTokenStartRequestSchema,
@@ -3599,7 +4766,15 @@ export {
3599
4766
  IdentityLinkStartSchema,
3600
4767
  IdentityListSchema,
3601
4768
  IdentitySchema,
4769
+ ImportPasswordSchema,
4770
+ ImportRowResultSchema,
4771
+ ImportSkipReasonSchema,
4772
+ ImportUserRowSchema,
4773
+ ImportUsersRequestSchema,
4774
+ ImportUsersResultSchema,
3602
4775
  InstanceActivityTypeSchema,
4776
+ InvitationPreviewSchema,
4777
+ InvitationTokenRequestSchema,
3603
4778
  IosAppIdentitySchema,
3604
4779
  IosAppSchema,
3605
4780
  JWT_TEMPLATE_SOURCES,
@@ -3615,6 +4790,7 @@ export {
3615
4790
  MAX_APP_LINK_PATHS,
3616
4791
  MAX_APP_LINK_PATH_LENGTH,
3617
4792
  MAX_APP_NAME_LENGTH,
4793
+ MAX_AUDIT_EXPORT_ROWS,
3618
4794
  MAX_AUDIT_RETENTION_DAYS,
3619
4795
  MAX_BUNDLE_ID_LENGTH,
3620
4796
  MAX_CERT_FINGERPRINTS,
@@ -3622,7 +4798,11 @@ export {
3622
4798
  MAX_CUSTOM_CLAIMS_BYTES2 as MAX_CUSTOM_CLAIMS_BYTES,
3623
4799
  MAX_CUSTOM_CLAIM_CONSTANT_LENGTH2 as MAX_CUSTOM_CLAIM_CONSTANT_LENGTH,
3624
4800
  MAX_CUSTOM_CLAIM_KEY_LENGTH2 as MAX_CUSTOM_CLAIM_KEY_LENGTH,
4801
+ MAX_CUSTOM_ROLES2 as MAX_CUSTOM_ROLES,
3625
4802
  MAX_CUSTOM_SESSION_PROFILES,
4803
+ MAX_DOMAINS_PER_ORGANIZATION2 as MAX_DOMAINS_PER_ORGANIZATION,
4804
+ MAX_DOMAIN_LABEL_LENGTH2 as MAX_DOMAIN_LABEL_LENGTH,
4805
+ MAX_DOMAIN_LENGTH2 as MAX_DOMAIN_LENGTH,
3626
4806
  MAX_DPOP_PROOF_LENGTH2 as MAX_DPOP_PROOF_LENGTH,
3627
4807
  MAX_DURATION_MS,
3628
4808
  MAX_EMAIL_BODY_LENGTH2 as MAX_EMAIL_BODY_LENGTH,
@@ -3631,35 +4811,56 @@ export {
3631
4811
  MAX_EMAIL_TEMPLATES_BYTES2 as MAX_EMAIL_TEMPLATES_BYTES,
3632
4812
  MAX_ID_TOKEN_LENGTH,
3633
4813
  MAX_ID_TOKEN_NAME_LENGTH,
4814
+ MAX_IMPORT_METADATA_BYTES,
4815
+ MAX_IMPORT_PASSWORD_PARAMS,
4816
+ MAX_IMPORT_ROWS,
3634
4817
  MAX_JWT_TEMPLATES2 as MAX_JWT_TEMPLATES,
3635
4818
  MAX_JWT_TEMPLATE_CLAIMS2 as MAX_JWT_TEMPLATE_CLAIMS,
3636
4819
  MAX_NATIVE_APPS,
4820
+ MAX_ORGANIZATIONS_CREATED_PER_USER,
4821
+ MAX_ORGANIZATION_CLAIMS_BYTES2 as MAX_ORGANIZATION_CLAIMS_BYTES,
4822
+ MAX_ORGANIZATION_NAME_LENGTH,
4823
+ MAX_ORGANIZATION_PERMISSIONS_CLAIM2 as MAX_ORGANIZATION_PERMISSIONS_CLAIM,
4824
+ MAX_ORGANIZATION_SLUG_LENGTH,
3637
4825
  MAX_PACKAGE_NAME_LENGTH,
3638
4826
  MAX_PAGE_SIZE,
3639
4827
  MAX_PASSKEYS_PER_USER,
3640
4828
  MAX_PASSKEY_NAME_LENGTH,
3641
4829
  MAX_PASSWORD_HISTORY,
4830
+ MAX_PERMISSIONS_PER_ROLE2 as MAX_PERMISSIONS_PER_ROLE,
4831
+ MAX_PERMISSION_KEY_LENGTH2 as MAX_PERMISSION_KEY_LENGTH,
3642
4832
  MAX_PHONE_NUMBER_DIGITS,
3643
4833
  MAX_REUSE_GRACE_PERIOD,
4834
+ MAX_SAML_CERTIFICATES,
3644
4835
  MAX_SESSIONS_PER_USER,
3645
4836
  MAX_SESSION_PROFILE_NAME_LENGTH,
3646
4837
  MAX_SESSION_TIMEOUT,
3647
4838
  MAX_SETTING_NAME_LENGTH,
4839
+ MAX_SETUP_LINK_DAYS,
3648
4840
  MAX_SMS_DAILY_MESSAGE_LIMIT,
3649
4841
  MAX_SMS_TEMPLATE_LENGTH,
4842
+ MAX_SSO_CONNECTION_DOMAINS,
4843
+ MAX_SSO_GROUP_ROLES,
3650
4844
  MAX_STEP_UP_AFTER,
3651
4845
  MAX_VERIFIED_TOKEN_LENGTH,
3652
4846
  MAX_WEBHOOK_ENDPOINTS,
3653
4847
  MAX_WEBHOOK_URL_LENGTH,
4848
+ MEMBERSHIPS_MANAGE_PERMISSION2 as MEMBERSHIPS_MANAGE_PERMISSION,
4849
+ MEMBERSHIPS_READ_PERMISSION2 as MEMBERSHIPS_READ_PERMISSION,
3654
4850
  MICROSOFT_TENANT_ALIASES,
3655
4851
  MIN_ACCESS_TOKEN_TTL,
4852
+ MIN_DOMAIN_LENGTH2 as MIN_DOMAIN_LENGTH,
3656
4853
  MIN_IDLE_TIMEOUT,
4854
+ MIN_ORGANIZATION_SLUG_LENGTH,
3657
4855
  MIN_PASSWORD_MIN_LENGTH,
3658
4856
  MIN_PHONE_NUMBER_DIGITS,
3659
4857
  MIN_REUSE_GRACE_PERIOD,
3660
4858
  MIN_STEP_UP_AFTER,
3661
4859
  MfaPolicySchema,
3662
4860
  MicrosoftTenantSchema,
4861
+ MyOrganizationInvitationListSchema,
4862
+ MyOrganizationInvitationQuerySchema,
4863
+ MyOrganizationInvitationSchema,
3663
4864
  NATIVE_APP_FIELDS,
3664
4865
  NATIVE_APP_PLATFORMS,
3665
4866
  NativeAppListSchema,
@@ -3680,10 +4881,43 @@ export {
3680
4881
  OAuthProviderUpdateSchema,
3681
4882
  OAuthStartRequestSchema,
3682
4883
  OAuthStartSchema,
4884
+ ORGANIZATION_DELETE_PERMISSION2 as ORGANIZATION_DELETE_PERMISSION,
4885
+ ORGANIZATION_DOMAIN_MODES2 as ORGANIZATION_DOMAIN_MODES,
4886
+ ORGANIZATION_DOMAIN_STATUSES2 as ORGANIZATION_DOMAIN_STATUSES,
4887
+ ORGANIZATION_FIELDS,
4888
+ ORGANIZATION_ID_CLAIM2 as ORGANIZATION_ID_CLAIM,
4889
+ ORGANIZATION_INVITATION_TOKEN_PARAM2 as ORGANIZATION_INVITATION_TOKEN_PARAM,
4890
+ ORGANIZATION_MANAGE_PERMISSION2 as ORGANIZATION_MANAGE_PERMISSION,
4891
+ ORGANIZATION_PERMISSIONS_CLAIM2 as ORGANIZATION_PERMISSIONS_CLAIM,
4892
+ ORGANIZATION_ROLE_CLAIM2 as ORGANIZATION_ROLE_CLAIM,
4893
+ ORGANIZATION_ROLE_FIELDS,
4894
+ ORGANIZATION_SLUG_PATTERN,
4895
+ OrganizationDomainListSchema,
4896
+ OrganizationDomainModeSchema,
4897
+ OrganizationDomainNameSchema,
4898
+ OrganizationDomainSchema,
4899
+ OrganizationDomainStatusSchema,
4900
+ OrganizationInvitationListSchema,
4901
+ OrganizationInvitationQuerySchema,
4902
+ OrganizationInvitationSchema,
4903
+ OrganizationListSchema,
4904
+ OrganizationMemberListSchema,
4905
+ OrganizationMemberSchema,
4906
+ OrganizationMembershipListSchema,
4907
+ OrganizationMembershipSchema,
4908
+ OrganizationPageQuerySchema,
4909
+ OrganizationRoleListSchema,
4910
+ OrganizationRoleSchema,
4911
+ OrganizationSchema,
4912
+ OrganizationSearchQuerySchema,
4913
+ OrganizationSlugSchema,
4914
+ OrganizationSuggestionListSchema,
4915
+ OrganizationSuggestionSchema,
3683
4916
  PACKAGE_NAME_PATTERN,
3684
4917
  PASSKEY_ALGORITHMS,
3685
4918
  PASSKEY_CHALLENGE_TTL_MS,
3686
4919
  PASSWORD_POLICY_PRESETS,
4920
+ PERMISSION_KEY_PATTERN2 as PERMISSION_KEY_PATTERN,
3687
4921
  PROPOSAL_APPROVAL_REFUSALS,
3688
4922
  PROPOSAL_APPROVER_TYPES,
3689
4923
  PROPOSAL_CREATION_REFUSALS,
@@ -3693,6 +4927,8 @@ export {
3693
4927
  PROPOSAL_OPERATION_TARGETS,
3694
4928
  PROPOSAL_STATUSES,
3695
4929
  PROPOSAL_TARGET_TYPES,
4930
+ PUBLIC_EMAIL_BRANDS2 as PUBLIC_EMAIL_BRANDS,
4931
+ PUBLIC_EMAIL_DOMAINS2 as PUBLIC_EMAIL_DOMAINS,
3696
4932
  PUBLISHABLE_KEY_HEADER2 as PUBLISHABLE_KEY_HEADER,
3697
4933
  PUBLISHABLE_KEY_PREFIX,
3698
4934
  PaginationMetaSchema,
@@ -3710,6 +4946,7 @@ export {
3710
4946
  PasswordPolicySchema,
3711
4947
  PasswordResetRequestSchema,
3712
4948
  PasswordResetStartRequestSchema,
4949
+ PermissionKeySchema,
3713
4950
  PhoneCodeSentSchema,
3714
4951
  PhoneNumberRequestSchema,
3715
4952
  PhoneNumberVerifyRequestSchema,
@@ -3725,12 +4962,19 @@ export {
3725
4962
  REDIRECT_SCHEME_FAMILIES_NEVER_CUSTOM2 as REDIRECT_SCHEME_FAMILIES_NEVER_CUSTOM,
3726
4963
  REFRESH_TOKEN_PREFIX,
3727
4964
  RESERVED_CLAIM_NAMES2 as RESERVED_CLAIM_NAMES,
4965
+ ROLE_KEY_PATTERN2 as ROLE_KEY_PATTERN,
3728
4966
  RedirectUrlSchema,
3729
4967
  RefreshTokenRequestSchema,
3730
4968
  RevokedSessionsSchema,
4969
+ RoleKeySchema,
4970
+ RoleNameSchema,
4971
+ RolePermissionsSchema,
3731
4972
  RotatedWebhookSecretSchema,
4973
+ SCIM_TOKEN_PREFIX,
3732
4974
  SECRET_KEY_PREFIX,
3733
4975
  SESSION_PROFILE_HEADER2 as SESSION_PROFILE_HEADER,
4976
+ SETUP_LINK_HEADER2 as SETUP_LINK_HEADER,
4977
+ SETUP_LINK_TOKEN_PREFIX,
3734
4978
  SIGN_IN_METHODS_WITHOUT_SIGN_UP,
3735
4979
  SIGN_IN_TEST_CLEANUPS,
3736
4980
  SIGN_IN_TEST_OUTCOMES,
@@ -3748,7 +4992,18 @@ export {
3748
4992
  SMS_USAGE_DEFAULT_DAYS,
3749
4993
  SMS_USAGE_MAX_DAYS,
3750
4994
  SMS_USAGE_MAX_PREFIXES,
4995
+ SSO_ATTRIBUTE_DEFAULTS,
4996
+ SSO_CONNECTION_CLAIM2 as SSO_CONNECTION_CLAIM,
4997
+ SSO_CONNECTION_FIELDS,
4998
+ SSO_CONNECTION_STATUSES,
4999
+ SSO_IDP_PRESETS,
5000
+ SSO_MANAGE_PERMISSION2 as SSO_MANAGE_PERMISSION,
5001
+ SSO_PROTOCOLS,
5002
+ SSO_TEST_REASONS,
3751
5003
  STEP_UP_MAX_AGE_SECONDS,
5004
+ SYSTEM_PERMISSIONS2 as SYSTEM_PERMISSIONS,
5005
+ SamlConnectionViewSchema,
5006
+ SamlSettingsInputSchema,
3752
5007
  SecondFactorMethodSchema,
3753
5008
  SecondFactorPrepareRequestSchema,
3754
5009
  SecondFactorRequestSchema,
@@ -3762,9 +5017,17 @@ export {
3762
5017
  SessionSettingsSchema,
3763
5018
  SessionTokensSchema,
3764
5019
  SessionTypeSchema,
5020
+ SetActiveOrganizationRequestSchema,
3765
5021
  SetPasswordRequestSchema,
3766
5022
  SetUserEmailRequestSchema,
3767
5023
  SettingsManagedBySchema,
5024
+ SetupConnectionCreateSchema,
5025
+ SetupConnectionUpdateSchema,
5026
+ SetupGroupRolesSchema,
5027
+ SetupLinkListSchema,
5028
+ SetupLinkSchema,
5029
+ SetupPortalSchema,
5030
+ SetupScimTokenCreateSchema,
3768
5031
  SignInStartRequestSchema,
3769
5032
  SignInTestReportSchema,
3770
5033
  SignInTestStepResultSchema,
@@ -3777,6 +5040,17 @@ export {
3777
5040
  SmsTemplateSchema,
3778
5041
  SmsTemplatesSchema,
3779
5042
  SmsUsageSchema,
5043
+ SsoAttributeMappingSchema,
5044
+ SsoConnectionListQuerySchema,
5045
+ SsoConnectionListSchema,
5046
+ SsoConnectionSchema,
5047
+ SsoGroupRolesSchema,
5048
+ SsoStartRequestSchema,
5049
+ SsoTestIdParamSchema,
5050
+ SsoTestResultSchema,
5051
+ SsoTestStartRequestSchema,
5052
+ SsoTestStartSchema,
5053
+ StartOrganizationDomainRequestSchema,
3780
5054
  StepUpEmailCodeSchema,
3781
5055
  StepUpMethodSchema,
3782
5056
  StepUpRequestSchema,
@@ -3791,12 +5065,22 @@ export {
3791
5065
  TulaEventSchema,
3792
5066
  UpdateHookRequestSchema,
3793
5067
  UpdateNativeAppRequestSchema,
5068
+ UpdateOrganizationDomainRequestSchema,
5069
+ UpdateOrganizationMemberRequestSchema,
5070
+ UpdateOrganizationRequestSchema,
5071
+ UpdateOrganizationRoleRequestSchema,
5072
+ UpdateSsoConnectionRequestSchema,
3794
5073
  UpdateWebhookEndpointRequestSchema,
3795
5074
  UserAuthenticationSchema,
3796
5075
  UserListSchema,
5076
+ UserMembershipListSchema,
5077
+ UserMembershipSchema,
5078
+ UserOrganizationListSchema,
5079
+ UserOrganizationSchema,
3797
5080
  UserSchema,
3798
5081
  UserSortSchema,
3799
5082
  VerifyEmailRequestSchema,
5083
+ VerifyOrganizationDomainRequestSchema,
3800
5084
  VerifySessionRequestSchema,
3801
5085
  WEBHOOK_DELIVERY_STATES,
3802
5086
  WEBHOOK_DISABLED_REASONS,
@@ -3821,6 +5105,7 @@ export {
3821
5105
  androidApkKeyHashOrigin,
3822
5106
  appleAppSiteAssociation,
3823
5107
  assetLinks,
5108
+ auditExportCursor,
3824
5109
  bindsCodeWithPkce2 as bindsCodeWithPkce,
3825
5110
  builtInSessionProfile,
3826
5111
  checkCustomClaims2 as checkCustomClaims,
@@ -3830,7 +5115,10 @@ export {
3830
5115
  customSchemeRedirectRefusal2 as customSchemeRedirectRefusal,
3831
5116
  darkCssVariable2 as darkCssVariable,
3832
5117
  defaultDeviceBinding,
5118
+ domainOfAddress2 as domainOfAddress,
5119
+ domainRefusal2 as domainRefusal,
3833
5120
  durationToMs,
5121
+ effectiveAttributeNames,
3834
5122
  emailTemplateParagraphs2 as emailTemplateParagraphs,
3835
5123
  emailTemplateProblems2 as emailTemplateProblems,
3836
5124
  emailTemplatesBytes2 as emailTemplatesBytes,
@@ -3844,10 +5132,12 @@ export {
3844
5132
  hasForbiddenRedirectCharacter2 as hasForbiddenRedirectCharacter,
3845
5133
  hasHiddenCharacter2 as hasHiddenCharacter,
3846
5134
  hasInvisibleCharacter2 as hasInvisibleCharacter,
5135
+ hasOrganizationAccess2 as hasOrganizationAccess,
3847
5136
  hookFailureOutcome,
3848
5137
  hookLastCallFailed,
3849
5138
  hookWeakenings,
3850
5139
  isAppLinkPath,
5140
+ isBuiltInRoleKey2 as isBuiltInRoleKey,
3851
5141
  isCustomClaimKey2 as isCustomClaimKey,
3852
5142
  isCustomClaimValue2 as isCustomClaimValue,
3853
5143
  isCustomSchemeRedirectUrl2 as isCustomSchemeRedirectUrl,
@@ -3857,11 +5147,13 @@ export {
3857
5147
  isKeyThumbprint2 as isKeyThumbprint,
3858
5148
  isPhoneNumberAllowed,
3859
5149
  isProposalTargetId,
5150
+ isPublicEmailDomain2 as isPublicEmailDomain,
3860
5151
  isRedirectUrl2 as isRedirectUrl,
3861
5152
  isRelyingPartyId,
3862
5153
  isSessionProfileName,
3863
5154
  isSmsCountry,
3864
5155
  isSmsTemplateKind,
5156
+ isSystemPermission2 as isSystemPermission,
3865
5157
  isTestAddress,
3866
5158
  isValidThemeValue2 as isValidThemeValue,
3867
5159
  jwkThumbprint2 as jwkThumbprint,
@@ -3875,9 +5167,13 @@ export {
3875
5167
  normalizeCertFingerprint,
3876
5168
  normalizeCertFingerprints,
3877
5169
  normalizePassword2 as normalizePassword,
5170
+ normalizePermissions2 as normalizePermissions,
3878
5171
  oauthProviderWeakenings,
5172
+ organizationClaimsBytes2 as organizationClaimsBytes,
5173
+ organizationRoleWeakenings2 as organizationRoleWeakenings,
3879
5174
  originMatchesRelyingParty,
3880
5175
  ownClientIdAmong,
5176
+ parseAuditExportCursor,
3881
5177
  parseEmailTemplate2 as parseEmailTemplate,
3882
5178
  parsePhoneNumber,
3883
5179
  parseStoredEnvironmentSettings,
@@ -3887,6 +5183,7 @@ export {
3887
5183
  proposalSummary,
3888
5184
  readCustomClaims2 as readCustomClaims,
3889
5185
  readHookClaimsAnswer,
5186
+ readOrganizationClaims2 as readOrganizationClaims,
3890
5187
  readStoredEmailTemplates2 as readStoredEmailTemplates,
3891
5188
  readStoredEnvironmentSettings,
3892
5189
  readStoredJwtTemplate,
@@ -3894,12 +5191,14 @@ export {
3894
5191
  readsAsLink2 as readsAsLink,
3895
5192
  redirectUrlKind2 as redirectUrlKind,
3896
5193
  resolveSessionProfile,
5194
+ rolePermissionRefusal2 as rolePermissionRefusal,
3897
5195
  settingsWeakenings,
3898
5196
  signWebhook2 as signWebhook,
3899
5197
  smsCostLimits,
3900
5198
  smsPrefixCountries,
3901
5199
  smsSegments,
3902
5200
  smsTemplateProblems,
5201
+ ssoWeakenings,
3903
5202
  stepUpWindowSeconds,
3904
5203
  takesAdditionalClientIds,
3905
5204
  testAddress,