@marlinjai/mail-contract 0.17.0 → 0.19.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.mjs CHANGED
@@ -151,7 +151,7 @@ var API_VERSION_PREFIX = "/v1";
151
151
  var HEALTH_PATH = "/healthz";
152
152
 
153
153
  // src/workspace.ts
154
- import { z as z11 } from "zod";
154
+ import { z as z12 } from "zod";
155
155
 
156
156
  // src/automations.ts
157
157
  import { z as z10 } from "zod";
@@ -2783,16 +2783,23 @@ var EventListQuery = PageQuery.extend({
2783
2783
  contact_id: Id.optional()
2784
2784
  });
2785
2785
 
2786
+ // src/legal.ts
2787
+ import { z as z11 } from "zod";
2788
+ var LEGAL_TERMS_VERSION = "2026-10-23";
2789
+ var AcceptTerms = z11.literal(LEGAL_TERMS_VERSION, {
2790
+ errorMap: () => ({ message: `must be "${LEGAL_TERMS_VERSION}": accept the current terms of service and processing agreement` })
2791
+ });
2792
+
2786
2793
  // src/workspace.ts
2787
- var CompanyId = z11.string().min(1).max(64);
2794
+ var CompanyId = z12.string().min(1).max(64);
2788
2795
  var ASSET_POLICIES = ["any", "service_only"];
2789
- var AssetPolicy = z11.enum(ASSET_POLICIES);
2796
+ var AssetPolicy = z12.enum(ASSET_POLICIES);
2790
2797
  var MAX_ALLOWED_ASSET_HOSTS = 20;
2791
- var AssetHost = z11.string().trim().toLowerCase().min(1).max(253).regex(/^(?=.{1,253}(?::\d{1,5})?$)[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+(:\d{1,5})?$/, "a host name such as example.com");
2792
- var MergeDefaults = z11.record(MergeFieldName, MergeDefaultValue).refine((m) => Object.keys(m).length <= MAX_MERGE_DEFAULTS, `at most ${MAX_MERGE_DEFAULTS} merge defaults`).refine((m) => !Object.keys(m).some((k) => k in RESERVED_MERGE_FIELDS), {
2798
+ var AssetHost = z12.string().trim().toLowerCase().min(1).max(253).regex(/^(?=.{1,253}(?::\d{1,5})?$)[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+(:\d{1,5})?$/, "a host name such as example.com");
2799
+ var MergeDefaults = z12.record(MergeFieldName, MergeDefaultValue).refine((m) => Object.keys(m).length <= MAX_MERGE_DEFAULTS, `at most ${MAX_MERGE_DEFAULTS} merge defaults`).refine((m) => !Object.keys(m).some((k) => k in RESERVED_MERGE_FIELDS), {
2793
2800
  message: `a reserved merge field (${Object.keys(RESERVED_MERGE_FIELDS).join(", ")}) cannot have a workspace default`
2794
2801
  });
2795
- var WorkspaceSettings = z11.object({
2802
+ var WorkspaceSettings = z12.object({
2796
2803
  /**
2797
2804
  * The workspace's main language (a {@link LocaleTag}, e.g. "de"): the main
2798
2805
  * language of a new template, and of the hosted pages when nothing else
@@ -2805,9 +2812,9 @@ var WorkspaceSettings = z11.object({
2805
2812
  * each; the hosted pages are offered in those of them they support (English,
2806
2813
  * German, French, Italian, Spanish). The service stores canonical casing.
2807
2814
  */
2808
- locales: z11.array(LocaleTag).min(1).max(20).refine((l) => new Set(l.map((t) => t.toLowerCase())).size === l.length, "a language appears twice"),
2815
+ locales: z12.array(LocaleTag).min(1).max(20).refine((l) => new Set(l.map((t) => t.toLowerCase())).size === l.length, "a language appears twice"),
2809
2816
  /** Open and click tracking. Off by default, opt-in per workspace. */
2810
- tracking_enabled: z11.boolean(),
2817
+ tracking_enabled: z12.boolean(),
2811
2818
  /** Where images, stylesheets and fonts in a mail may load from. `any` by default. */
2812
2819
  asset_policy: AssetPolicy,
2813
2820
  /**
@@ -2815,7 +2822,7 @@ var WorkspaceSettings = z11.object({
2815
2822
  * the workspace's website, typically. Empty by default. Ignored under `any`,
2816
2823
  * which allows everything already.
2817
2824
  */
2818
- allowed_asset_hosts: z11.array(AssetHost).max(MAX_ALLOWED_ASSET_HOSTS),
2825
+ allowed_asset_hosts: z12.array(AssetHost).max(MAX_ALLOWED_ASSET_HOSTS),
2819
2826
  /** Merge values every mail of the workspace can use (see `MergeDefaults`). Empty by default. */
2820
2827
  merge_defaults: MergeDefaults,
2821
2828
  /**
@@ -2824,10 +2831,10 @@ var WorkspaceSettings = z11.object({
2824
2831
  */
2825
2832
  default_timezone: TimezoneName.nullable()
2826
2833
  });
2827
- var Workspace = z11.object({
2834
+ var Workspace = z12.object({
2828
2835
  id: Id,
2829
2836
  slug: Slug,
2830
- name: z11.string().min(1).max(120),
2837
+ name: z12.string().min(1).max(120),
2831
2838
  settings: WorkspaceSettings,
2832
2839
  /**
2833
2840
  * The auth-brain company (tenant) the workspace was created for, or null for
@@ -2838,13 +2845,13 @@ var Workspace = z11.object({
2838
2845
  created_at: Timestamp,
2839
2846
  updated_at: Timestamp
2840
2847
  });
2841
- var WorkspaceCreate = z11.object({
2848
+ var WorkspaceCreate = z12.object({
2842
2849
  slug: Slug,
2843
- name: z11.string().min(1).max(120),
2850
+ name: z12.string().min(1).max(120),
2844
2851
  settings: WorkspaceSettings.partial().optional(),
2845
- owner: z11.object({
2852
+ owner: z12.object({
2846
2853
  email: Email,
2847
- name: z11.string().max(200).nullable().optional()
2854
+ name: z12.string().max(200).nullable().optional()
2848
2855
  }),
2849
2856
  /**
2850
2857
  * The auth-brain company the workspace is created in. Required since 0.14.0:
@@ -2853,27 +2860,33 @@ var WorkspaceCreate = z11.object({
2853
2860
  * invitation (`members.syncCompanyRole`). A workspace created before, without
2854
2861
  * one, keeps working and simply has no such inheritance.
2855
2862
  */
2856
- company_id: CompanyId
2863
+ company_id: CompanyId,
2864
+ /**
2865
+ * The person creating the workspace accepts the terms of service and the
2866
+ * processing agreement for its company, of this version (required since
2867
+ * 0.19.0): the workspace processes recipients' data from its first contact.
2868
+ */
2869
+ accept_terms: AcceptTerms
2857
2870
  });
2858
- var WorkspaceUpdate = z11.object({
2859
- name: z11.string().min(1).max(120),
2871
+ var WorkspaceUpdate = z12.object({
2872
+ name: z12.string().min(1).max(120),
2860
2873
  settings: WorkspaceSettings.partial()
2861
2874
  }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
2862
- var WorkspaceMove = z11.object({ company_id: CompanyId });
2875
+ var WorkspaceMove = z12.object({ company_id: CompanyId });
2863
2876
  var MEMBER_ROLES = ["owner", "admin", "editor", "viewer"];
2864
- var MemberRole = z11.enum(MEMBER_ROLES);
2877
+ var MemberRole = z12.enum(MEMBER_ROLES);
2865
2878
  var WorkspaceMembership = Workspace.extend({ role: MemberRole });
2866
2879
  var MEMBER_SOURCES = ["invited", "company"];
2867
- var MemberSource = z11.enum(MEMBER_SOURCES);
2880
+ var MemberSource = z12.enum(MEMBER_SOURCES);
2868
2881
  var COMPANY_GRANT_ROLES = ["owner", "admin"];
2869
- var CompanyGrantRole = z11.enum(COMPANY_GRANT_ROLES);
2882
+ var CompanyGrantRole = z12.enum(COMPANY_GRANT_ROLES);
2870
2883
  var COMPANY_ROLE_MAX_AGE_HOURS = 24;
2871
- var Member = z11.object({
2884
+ var Member = z12.object({
2872
2885
  id: Id,
2873
2886
  /** The person's auth-brain subject. */
2874
- subject: z11.string().min(1).max(255),
2887
+ subject: z12.string().min(1).max(255),
2875
2888
  email: Email,
2876
- name: z11.string().max(200).nullable(),
2889
+ name: z12.string().max(200).nullable(),
2877
2890
  /**
2878
2891
  * The role in force: the higher of the person's own role in the workspace
2879
2892
  * and the one a confirmed company role carries. For a `company` row that is
@@ -2900,48 +2913,48 @@ var Member = z11.object({
2900
2913
  * false is one whose company role has not been confirmed within
2901
2914
  * `COMPANY_ROLE_MAX_AGE_HOURS`; it grants nothing and an admin may remove it.
2902
2915
  */
2903
- inherited: z11.boolean().optional()
2916
+ inherited: z12.boolean().optional()
2904
2917
  });
2905
2918
  var MAX_SYNC_COMPANIES = 100;
2906
- var MemberCompanySync = z11.object({
2919
+ var MemberCompanySync = z12.object({
2907
2920
  email: Email,
2908
- name: z11.string().max(200).nullable().optional(),
2909
- companies: z11.array(z11.object({ company_id: CompanyId, role: CompanyGrantRole })).max(MAX_SYNC_COMPANIES).refine((list2) => new Set(list2.map((c) => c.company_id)).size === list2.length, "each company at most once")
2921
+ name: z12.string().max(200).nullable().optional(),
2922
+ companies: z12.array(z12.object({ company_id: CompanyId, role: CompanyGrantRole })).max(MAX_SYNC_COMPANIES).refine((list2) => new Set(list2.map((c) => c.company_id)).size === list2.length, "each company at most once")
2910
2923
  });
2911
- var MemberCompanySyncResult = z11.object({
2924
+ var MemberCompanySyncResult = z12.object({
2912
2925
  /** Workspaces in which the person now holds a company role they did not hold, or held differently, before this call. */
2913
- granted: z11.array(Id),
2926
+ granted: z12.array(Id),
2914
2927
  /** Workspaces in which a company role was taken away by this call. */
2915
- revoked: z11.array(Id),
2928
+ revoked: z12.array(Id),
2916
2929
  /** Workspaces in which the person's company role was already as stated. */
2917
- unchanged: z11.array(Id)
2930
+ unchanged: z12.array(Id)
2918
2931
  });
2919
- var MemberCreate = z11.object({
2920
- subject: z11.string().min(1).max(255),
2932
+ var MemberCreate = z12.object({
2933
+ subject: z12.string().min(1).max(255),
2921
2934
  email: Email,
2922
- name: z11.string().max(200).nullable().optional(),
2935
+ name: z12.string().max(200).nullable().optional(),
2923
2936
  role: MemberRole
2924
2937
  });
2925
- var MemberUpdate = z11.object({ role: MemberRole });
2938
+ var MemberUpdate = z12.object({ role: MemberRole });
2926
2939
  var API_KEY_SCOPES = ["full", "read", "send"];
2927
- var ApiKeyScope = z11.enum(API_KEY_SCOPES);
2928
- var ApiKey = z11.object({
2940
+ var ApiKeyScope = z12.enum(API_KEY_SCOPES);
2941
+ var ApiKey = z12.object({
2929
2942
  id: Id,
2930
- name: z11.string().min(1).max(120),
2943
+ name: z12.string().min(1).max(120),
2931
2944
  /** The first characters of the key, for recognising it in a list. */
2932
- prefix: z11.string().min(4).max(32),
2945
+ prefix: z12.string().min(4).max(32),
2933
2946
  scope: ApiKeyScope,
2934
2947
  last_used_at: Timestamp.nullable(),
2935
2948
  revoked_at: Timestamp.nullable(),
2936
2949
  created_at: Timestamp
2937
2950
  });
2938
- var ApiKeyCreate = z11.object({
2939
- name: z11.string().min(1).max(120),
2951
+ var ApiKeyCreate = z12.object({
2952
+ name: z12.string().min(1).max(120),
2940
2953
  /** Omitted means `full`. */
2941
2954
  scope: ApiKeyScope.optional()
2942
2955
  });
2943
- var ApiKeyCreated = z11.object({
2944
- key: z11.string().min(20),
2956
+ var ApiKeyCreated = z12.object({
2957
+ key: z12.string().min(20),
2945
2958
  api_key: ApiKey
2946
2959
  });
2947
2960
  var AUDIT_ACTIONS = [
@@ -2965,6 +2978,7 @@ var AUDIT_ACTIONS = [
2965
2978
  "sending_domain.created",
2966
2979
  "sending_domain.updated",
2967
2980
  "sending_domain.checked",
2981
+ "sending_domain.records_written",
2968
2982
  "sending_domain.deleted",
2969
2983
  "topic.created",
2970
2984
  "topic.updated",
@@ -3036,14 +3050,14 @@ var AUDIT_ACTIONS = [
3036
3050
  "automation.run_ended",
3037
3051
  "event.recorded"
3038
3052
  ];
3039
- var AuditAction = z11.enum(AUDIT_ACTIONS);
3053
+ var AuditAction = z12.enum(AUDIT_ACTIONS);
3040
3054
  var TRUSTED_APPS = ["booking"];
3041
- var TrustedApp = z11.enum(TRUSTED_APPS);
3042
- var AuditActor = z11.discriminatedUnion("type", [
3043
- z11.object({
3044
- type: z11.literal("member"),
3055
+ var TrustedApp = z12.enum(TRUSTED_APPS);
3056
+ var AuditActor = z12.discriminatedUnion("type", [
3057
+ z12.object({
3058
+ type: z12.literal("member"),
3045
3059
  member_id: Id,
3046
- subject: z11.string().min(1),
3060
+ subject: z12.string().min(1),
3047
3061
  /**
3048
3062
  * The application the person acted through, when it was not the dashboard:
3049
3063
  * the service set it from the service token the call carried, so it is
@@ -3051,26 +3065,26 @@ var AuditActor = z11.discriminatedUnion("type", [
3051
3065
  */
3052
3066
  app: TrustedApp.optional()
3053
3067
  }),
3054
- z11.object({
3055
- type: z11.literal("api_key"),
3068
+ z12.object({
3069
+ type: z12.literal("api_key"),
3056
3070
  api_key_id: Id,
3057
3071
  /**
3058
3072
  * Who the client's application said it was acting for, from
3059
3073
  * `ON_BEHALF_OF_HEADER`: reported by that application, never verified.
3060
3074
  * Absent when the call carried no label.
3061
3075
  */
3062
- on_behalf_of: z11.string().min(1).max(ON_BEHALF_OF_MAX_LENGTH).optional()
3076
+ on_behalf_of: z12.string().min(1).max(ON_BEHALF_OF_MAX_LENGTH).optional()
3063
3077
  }),
3064
3078
  /** The service itself (the worker, a bounce, the hosted unsubscribe page). */
3065
- z11.object({ type: z11.literal("system"), reason: z11.string().min(1).max(200) })
3079
+ z12.object({ type: z12.literal("system"), reason: z12.string().min(1).max(200) })
3066
3080
  ]);
3067
- var AuditEntry = z11.object({
3081
+ var AuditEntry = z12.object({
3068
3082
  id: Id,
3069
3083
  action: AuditAction,
3070
3084
  actor: AuditActor,
3071
- target_type: z11.string().min(1).max(64),
3085
+ target_type: z12.string().min(1).max(64),
3072
3086
  target_id: Id.nullable(),
3073
- details: z11.record(z11.unknown()),
3087
+ details: z12.record(z12.unknown()),
3074
3088
  created_at: Timestamp
3075
3089
  });
3076
3090
  var AuditQuery = PageQuery.extend({
@@ -3079,12 +3093,12 @@ var AuditQuery = PageQuery.extend({
3079
3093
  });
3080
3094
 
3081
3095
  // src/invites.ts
3082
- import { z as z12 } from "zod";
3096
+ import { z as z13 } from "zod";
3083
3097
  var INVITE_STATUSES = ["pending", "accepted", "revoked", "expired"];
3084
- var InviteStatus = z12.enum(INVITE_STATUSES);
3098
+ var InviteStatus = z13.enum(INVITE_STATUSES);
3085
3099
  var DEFAULT_INVITE_TTL_DAYS = 7;
3086
3100
  var MAX_INVITE_TTL_DAYS = 30;
3087
- var Invite = z12.object({
3101
+ var Invite = z13.object({
3088
3102
  id: Id,
3089
3103
  /** Stored lowercased; only a person signed in with this address can accept. */
3090
3104
  email: Email,
@@ -3092,32 +3106,32 @@ var Invite = z12.object({
3092
3106
  /** Derived from the timestamps below, never stored. */
3093
3107
  status: InviteStatus,
3094
3108
  /** The member who invited, while they are still one (null after they left). */
3095
- invited_by: z12.object({ member_id: Id.nullable(), email: Email.nullable() }),
3109
+ invited_by: z13.object({ member_id: Id.nullable(), email: Email.nullable() }),
3096
3110
  expires_at: Timestamp,
3097
3111
  accepted_at: Timestamp.nullable(),
3098
3112
  revoked_at: Timestamp.nullable(),
3099
3113
  created_at: Timestamp
3100
3114
  });
3101
- var InviteCreate = z12.object({
3115
+ var InviteCreate = z13.object({
3102
3116
  email: Email,
3103
3117
  role: MemberRole,
3104
- expires_in_days: z12.number().int().min(1).max(MAX_INVITE_TTL_DAYS).optional()
3118
+ expires_in_days: z13.number().int().min(1).max(MAX_INVITE_TTL_DAYS).optional()
3105
3119
  });
3106
- var InviteCreated = z12.object({
3120
+ var InviteCreated = z13.object({
3107
3121
  invite: Invite,
3108
- token: z12.string().min(32).max(128)
3122
+ token: z13.string().min(32).max(128)
3109
3123
  });
3110
3124
  var InviteListQuery = PageQuery.extend({
3111
3125
  status: InviteStatus.optional()
3112
3126
  });
3113
- var InviteAccept = z12.object({
3114
- token: z12.string().min(32).max(128),
3127
+ var InviteAccept = z13.object({
3128
+ token: z13.string().min(32).max(128),
3115
3129
  email: Email,
3116
- name: z12.string().max(200).nullable().optional()
3130
+ name: z13.string().max(200).nullable().optional()
3117
3131
  });
3118
- var InviteAccepted = z12.object({
3132
+ var InviteAccepted = z13.object({
3119
3133
  workspace: WorkspaceMembership,
3120
- already_member: z12.boolean()
3134
+ already_member: z13.boolean()
3121
3135
  });
3122
3136
  var INVITE_REFUSAL_REASONS = ["email_mismatch", "inviter_lacks_role", "expired", "revoked", "accepted"];
3123
3137
 
@@ -3747,13 +3761,13 @@ function renameInsertionEverywhere(drafts, from, rawTo) {
3747
3761
  }
3748
3762
 
3749
3763
  // src/providers.ts
3750
- import { z as z13 } from "zod";
3764
+ import { z as z14 } from "zod";
3751
3765
  var PROVIDER_KINDS = ["smtp", "resend"];
3752
- var ProviderKind = z13.enum(PROVIDER_KINDS);
3753
- var ProviderPolicy = z13.object({
3754
- daily_recipient_budget: z13.number().int().min(1).max(1e7),
3755
- min_interval_ms: z13.number().int().min(0).max(36e5),
3756
- max_recipients_per_message: z13.number().int().min(1).max(1e3)
3766
+ var ProviderKind = z14.enum(PROVIDER_KINDS);
3767
+ var ProviderPolicy = z14.object({
3768
+ daily_recipient_budget: z14.number().int().min(1).max(1e7),
3769
+ min_interval_ms: z14.number().int().min(0).max(36e5),
3770
+ max_recipients_per_message: z14.number().int().min(1).max(1e3)
3757
3771
  });
3758
3772
  var ICLOUD_SMTP_POLICY = {
3759
3773
  daily_recipient_budget: 800,
@@ -3761,17 +3775,17 @@ var ICLOUD_SMTP_POLICY = {
3761
3775
  max_recipients_per_message: 1
3762
3776
  };
3763
3777
  var SMTP_SECURITY = ["tls", "starttls"];
3764
- var SmtpConfigBase = z13.object({
3765
- host: z13.string().min(1).max(255),
3766
- port: z13.number().int().min(1).max(65535),
3778
+ var SmtpConfigBase = z14.object({
3779
+ host: z14.string().min(1).max(255),
3780
+ port: z14.number().int().min(1).max(65535),
3767
3781
  /** `tls` connects encrypted (465), `starttls` upgrades (587). Never plaintext. */
3768
- security: z13.enum(SMTP_SECURITY),
3769
- username: z13.string().min(1).max(255)
3782
+ security: z14.enum(SMTP_SECURITY),
3783
+ username: z14.string().min(1).max(255)
3770
3784
  });
3771
- var ResendConfigBase = z13.object({});
3772
- var ProviderRejections = z13.object({
3773
- count: z13.number().int().min(0),
3774
- last_error: z13.string().nullable(),
3785
+ var ResendConfigBase = z14.object({});
3786
+ var ProviderRejections = z14.object({
3787
+ count: z14.number().int().min(0),
3788
+ last_error: z14.string().nullable(),
3775
3789
  last_at: Timestamp.nullable(),
3776
3790
  /**
3777
3791
  * The last time the bounce circuit breaker tripped on one of this provider's
@@ -3781,59 +3795,59 @@ var ProviderRejections = z13.object({
3781
3795
  * run's bounce blocks were undone and the mailing paused. `sample` is the
3782
3796
  * reply that tripped it.
3783
3797
  */
3784
- anomaly: z13.object({
3798
+ anomaly: z14.object({
3785
3799
  at: Timestamp,
3786
3800
  /** `mailing`: one mailing was paused. `provider`: 5 refusals in a row with the same reply across the provider's sends (test sends and one-recipient mailings included) within 24 hours. */
3787
- scope: z13.enum(["mailing", "provider"]),
3801
+ scope: z14.enum(["mailing", "provider"]),
3788
3802
  /**
3789
3803
  * True while the provider-wide breaker is open: no bounce blocks through
3790
3804
  * this provider, test sends refused and mailings not started or resumed
3791
3805
  * (`provider_anomaly`), until an admin clears it (`providers.clearAnomaly`).
3792
3806
  */
3793
- blocking: z13.boolean(),
3807
+ blocking: z14.boolean(),
3794
3808
  mailing_id: Id.nullable(),
3795
- reason: z13.string(),
3796
- sample: z13.string()
3809
+ reason: z14.string(),
3810
+ sample: z14.string()
3797
3811
  }).nullable()
3798
3812
  });
3799
- var ProviderEvents = z13.object({
3800
- status: z13.enum(["active", "needs_secret"]),
3801
- source: z13.enum(["automatic", "manual", "managed"]).nullable(),
3802
- url: z13.string().url(),
3803
- error: z13.string().nullable(),
3813
+ var ProviderEvents = z14.object({
3814
+ status: z14.enum(["active", "needs_secret"]),
3815
+ source: z14.enum(["automatic", "manual", "managed"]).nullable(),
3816
+ url: z14.string().url(),
3817
+ error: z14.string().nullable(),
3804
3818
  /**
3805
3819
  * Events that named an email this provider never sent through the service
3806
3820
  * (another workspace or system sharing the Resend account): counted, never
3807
3821
  * acted on.
3808
3822
  */
3809
- unmatched: z13.number().int().min(0)
3823
+ unmatched: z14.number().int().min(0)
3810
3824
  });
3811
3825
  var RESEND_EVENT_TYPES = ["email.bounced", "email.complained", "email.delivery_delayed"];
3812
- var ResendSigningSecret = z13.string().max(200).regex(/^whsec_[A-Za-z0-9+/]{16,}={0,2}$/, "must be the signing secret Resend shows, starting with whsec_");
3813
- var ProviderEventsSecret = z13.object({ signing_secret: ResendSigningSecret });
3826
+ var ResendSigningSecret = z14.string().max(200).regex(/^whsec_[A-Za-z0-9+/]{16,}={0,2}$/, "must be the signing secret Resend shows, starting with whsec_");
3827
+ var ProviderEventsSecret = z14.object({ signing_secret: ResendSigningSecret });
3814
3828
  var ProviderFields = {
3815
- name: z13.string().min(1).max(120),
3816
- from_name: z13.string().min(1).max(120),
3829
+ name: z14.string().min(1).max(120),
3830
+ from_name: z14.string().min(1).max(120),
3817
3831
  from_email: Email,
3818
3832
  reply_to: Email.nullable(),
3819
3833
  policy: ProviderPolicy
3820
3834
  };
3821
- var Provider = z13.discriminatedUnion("kind", [
3822
- z13.object({
3835
+ var Provider = z14.discriminatedUnion("kind", [
3836
+ z14.object({
3823
3837
  id: Id,
3824
- kind: z13.literal("smtp"),
3838
+ kind: z14.literal("smtp"),
3825
3839
  config: SmtpConfigBase,
3826
- has_secret: z13.boolean(),
3840
+ has_secret: z14.boolean(),
3827
3841
  ...ProviderFields,
3828
3842
  rejections: ProviderRejections,
3829
3843
  created_at: Timestamp,
3830
3844
  updated_at: Timestamp
3831
3845
  }),
3832
- z13.object({
3846
+ z14.object({
3833
3847
  id: Id,
3834
- kind: z13.literal("resend"),
3848
+ kind: z14.literal("resend"),
3835
3849
  config: ResendConfigBase,
3836
- has_secret: z13.boolean(),
3850
+ has_secret: z14.boolean(),
3837
3851
  ...ProviderFields,
3838
3852
  rejections: ProviderRejections,
3839
3853
  events: ProviderEvents,
@@ -3841,31 +3855,31 @@ var Provider = z13.discriminatedUnion("kind", [
3841
3855
  updated_at: Timestamp
3842
3856
  })
3843
3857
  ]);
3844
- var ProviderCreate = z13.discriminatedUnion("kind", [
3845
- z13.object({
3846
- kind: z13.literal("smtp"),
3847
- config: SmtpConfigBase.extend({ password: z13.string().min(1).max(1024) }),
3858
+ var ProviderCreate = z14.discriminatedUnion("kind", [
3859
+ z14.object({
3860
+ kind: z14.literal("smtp"),
3861
+ config: SmtpConfigBase.extend({ password: z14.string().min(1).max(1024) }),
3848
3862
  ...ProviderFields
3849
3863
  }),
3850
- z13.object({
3851
- kind: z13.literal("resend"),
3852
- config: ResendConfigBase.extend({ api_key: z13.string().min(1).max(1024) }),
3864
+ z14.object({
3865
+ kind: z14.literal("resend"),
3866
+ config: ResendConfigBase.extend({ api_key: z14.string().min(1).max(1024) }),
3853
3867
  ...ProviderFields
3854
3868
  })
3855
3869
  ]);
3856
- var ProviderUpdate = z13.discriminatedUnion("kind", [
3857
- z13.object({
3858
- kind: z13.literal("smtp"),
3859
- config: SmtpConfigBase.extend({ password: z13.string().min(1).max(1024).optional() }).partial().optional(),
3870
+ var ProviderUpdate = z14.discriminatedUnion("kind", [
3871
+ z14.object({
3872
+ kind: z14.literal("smtp"),
3873
+ config: SmtpConfigBase.extend({ password: z14.string().min(1).max(1024).optional() }).partial().optional(),
3860
3874
  name: ProviderFields.name.optional(),
3861
3875
  from_name: ProviderFields.from_name.optional(),
3862
3876
  from_email: ProviderFields.from_email.optional(),
3863
3877
  reply_to: ProviderFields.reply_to.optional(),
3864
3878
  policy: ProviderPolicy.partial().optional()
3865
3879
  }),
3866
- z13.object({
3867
- kind: z13.literal("resend"),
3868
- config: ResendConfigBase.extend({ api_key: z13.string().min(1).max(1024).optional() }).optional(),
3880
+ z14.object({
3881
+ kind: z14.literal("resend"),
3882
+ config: ResendConfigBase.extend({ api_key: z14.string().min(1).max(1024).optional() }).optional(),
3869
3883
  name: ProviderFields.name.optional(),
3870
3884
  from_name: ProviderFields.from_name.optional(),
3871
3885
  from_email: ProviderFields.from_email.optional(),
@@ -3873,98 +3887,109 @@ var ProviderUpdate = z13.discriminatedUnion("kind", [
3873
3887
  policy: ProviderPolicy.partial().optional()
3874
3888
  })
3875
3889
  ]);
3876
- var ProviderUsage = z13.object({
3890
+ var ProviderUsage = z14.object({
3877
3891
  provider_id: Id,
3878
- recipients_last_24h: z13.number().int().min(0),
3879
- remaining_budget: z13.number().int().min(0),
3892
+ recipients_last_24h: z14.number().int().min(0),
3893
+ remaining_budget: z14.number().int().min(0),
3880
3894
  /** When enough of the rolling window frees up to send again, if exhausted. */
3881
3895
  next_capacity_at: Timestamp.nullable()
3882
3896
  });
3883
- var ProviderVerifyResult = z13.object({
3884
- ok: z13.boolean(),
3885
- error: z13.string().nullable()
3897
+ var ProviderVerifyResult = z14.object({
3898
+ ok: z14.boolean(),
3899
+ error: z14.string().nullable()
3886
3900
  });
3887
3901
 
3888
3902
  // src/sending-domains.ts
3889
- import { z as z14 } from "zod";
3903
+ import { z as z15 } from "zod";
3890
3904
  var SENDING_DOMAIN_STATUSES = ["pending_dns", "verifying", "verified", "failed", "temporary_failure"];
3891
- var SendingDomainStatus = z14.enum(SENDING_DOMAIN_STATUSES);
3905
+ var SendingDomainStatus = z15.enum(SENDING_DOMAIN_STATUSES);
3892
3906
  var SENDING_DOMAIN_DNS_MODES = ["manual", "managed"];
3893
- var SendingDomainDnsMode = z14.enum(SENDING_DOMAIN_DNS_MODES);
3907
+ var SendingDomainDnsMode = z15.enum(SENDING_DOMAIN_DNS_MODES);
3894
3908
  var SENDING_DOMAIN_REGION = "eu-west-1";
3895
- var SendingDomainName = z14.string().trim().toLowerCase().max(253).regex(
3909
+ var SendingDomainName = z15.string().trim().toLowerCase().max(253).regex(
3896
3910
  /^(?=.{1,253}$)(?!-)[a-z0-9-]{1,63}(?<!-)(\.(?!-)[a-z0-9-]{1,63}(?<!-))*\.[a-z]{2,63}$/,
3897
3911
  "must be a domain such as example.com, without https:// or an @"
3898
3912
  );
3899
- var SendingDomainRecord = z14.object({
3900
- record: z14.string().max(40),
3901
- name: z14.string().max(253),
3902
- type: z14.string().max(10),
3903
- value: z14.string().max(4096),
3904
- ttl: z14.string().max(20),
3905
- status: z14.string().max(40),
3906
- priority: z14.number().int().min(0).max(65535).optional()
3907
- });
3908
- var SendingDomain = z14.object({
3913
+ var SendingDomainRecord = z15.object({
3914
+ record: z15.string().max(40),
3915
+ name: z15.string().max(253),
3916
+ type: z15.string().max(10),
3917
+ value: z15.string().max(4096),
3918
+ ttl: z15.string().max(20),
3919
+ status: z15.string().max(40),
3920
+ priority: z15.number().int().min(0).max(65535).optional()
3921
+ });
3922
+ function sendingDomainRecordFullName(domain, name) {
3923
+ const d = domain.toLowerCase();
3924
+ const n = name.toLowerCase().replace(/\.$/, "");
3925
+ if (n === "@" || n === "") return d;
3926
+ const labels = d.split(".");
3927
+ for (let k = labels.length - 2; k >= 1; k--) {
3928
+ const sub = labels.slice(0, k).join(".");
3929
+ if (n === sub || n.endsWith(`.${sub}`)) return `${n}.${labels.slice(k).join(".")}`;
3930
+ }
3931
+ return `${n}.${d}`;
3932
+ }
3933
+ var SendingDomain = z15.object({
3909
3934
  id: Id,
3910
- domain: z14.string(),
3911
- from_name: z14.string(),
3935
+ domain: z15.string(),
3936
+ from_name: z15.string(),
3912
3937
  from_email: Email,
3913
3938
  reply_to: Email.nullable(),
3914
3939
  status: SendingDomainStatus,
3915
3940
  dns_mode: SendingDomainDnsMode,
3916
- records: z14.array(SendingDomainRecord),
3941
+ records: z15.array(SendingDomainRecord),
3917
3942
  provider_id: Id.nullable(),
3918
3943
  checked_at: Timestamp.nullable(),
3919
3944
  verified_at: Timestamp.nullable(),
3920
- last_error: z14.string().nullable(),
3945
+ last_error: z15.string().nullable(),
3921
3946
  created_at: Timestamp,
3922
3947
  updated_at: Timestamp
3923
3948
  });
3924
3949
  var SenderFields = {
3925
- from_name: z14.string().trim().min(1).max(120),
3950
+ from_name: z15.string().trim().min(1).max(120),
3926
3951
  from_email: Email,
3927
3952
  reply_to: Email.nullable().optional()
3928
3953
  };
3929
3954
  function senderOnDomain(input, ctx) {
3930
3955
  const at = input.from_email.lastIndexOf("@");
3931
3956
  if (at < 0 || input.from_email.slice(at + 1).toLowerCase() !== input.domain) {
3932
- ctx.addIssue({ code: z14.ZodIssueCode.custom, path: ["from_email"], message: `must be an address on ${input.domain}` });
3957
+ ctx.addIssue({ code: z15.ZodIssueCode.custom, path: ["from_email"], message: `must be an address on ${input.domain}` });
3933
3958
  }
3934
3959
  }
3935
- var SendingDomainCreate = z14.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
3936
- var SendingDomainUpdate = z14.object({ from_name: SenderFields.from_name.optional(), from_email: Email.optional(), reply_to: Email.nullable().optional() }).refine((v) => Object.keys(v).length > 0, "nothing to change");
3960
+ var SendingDomainCreate = z15.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
3961
+ var SendingDomainUpdate = z15.object({ from_name: SenderFields.from_name.optional(), from_email: Email.optional(), reply_to: Email.nullable().optional() }).refine((v) => Object.keys(v).length > 0, "nothing to change");
3937
3962
 
3938
3963
  // src/contacts.ts
3939
- import { z as z15 } from "zod";
3940
- var Topic = z15.object({
3964
+ import { z as z16 } from "zod";
3965
+ var Topic = z16.object({
3941
3966
  id: Id,
3942
3967
  slug: Slug,
3943
- name: z15.string().min(1).max(120),
3968
+ name: z16.string().min(1).max(120),
3944
3969
  /** Shown on the hosted preference page. */
3945
- description: z15.string().max(1e3).nullable(),
3970
+ description: z16.string().max(1e3).nullable(),
3946
3971
  /** Translations of `name` and `description` per locale, for the hosted page. */
3947
- translations: z15.record(
3948
- z15.object({ name: z15.string().min(1).max(120), description: z15.string().max(1e3).nullable() })
3972
+ translations: z16.record(
3973
+ z16.object({ name: z16.string().min(1).max(120), description: z16.string().max(1e3).nullable() })
3949
3974
  ),
3950
3975
  created_at: Timestamp,
3951
3976
  updated_at: Timestamp
3952
3977
  });
3953
- var TopicCreate = z15.object({
3978
+ var TopicCreate = z16.object({
3954
3979
  slug: Slug,
3955
- name: z15.string().min(1).max(120),
3956
- description: z15.string().max(1e3).optional(),
3980
+ name: z16.string().min(1).max(120),
3981
+ description: z16.string().max(1e3).optional(),
3957
3982
  translations: Topic.shape.translations.optional()
3958
3983
  });
3959
3984
  var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
3960
- var Contact = z15.object({
3985
+ var Contact = z16.object({
3961
3986
  id: Id,
3962
- external_id: z15.string().min(1).max(255).nullable(),
3987
+ external_id: z16.string().min(1).max(255).nullable(),
3963
3988
  /** Stored lowercased, unique per workspace. */
3964
3989
  email: Email,
3965
- first_name: z15.string().max(200).nullable(),
3966
- last_name: z15.string().max(200).nullable(),
3967
- locale: z15.string().min(2).max(35).nullable(),
3990
+ first_name: z16.string().max(200).nullable(),
3991
+ last_name: z16.string().max(200).nullable(),
3992
+ locale: z16.string().min(2).max(35).nullable(),
3968
3993
  /**
3969
3994
  * The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
3970
3995
  * Every wall clock an automation waits for is read in it, falling back to the
@@ -3972,65 +3997,65 @@ var Contact = z15.object({
3972
3997
  */
3973
3998
  timezone: TimezoneName.nullable(),
3974
3999
  properties: Properties,
3975
- topics: z15.array(Slug),
4000
+ topics: z16.array(Slug),
3976
4001
  /** The slugs of the contact's tags (S4). */
3977
- tags: z15.array(Slug),
4002
+ tags: z16.array(Slug),
3978
4003
  created_at: Timestamp,
3979
4004
  updated_at: Timestamp
3980
4005
  });
3981
- var ContactUpsert = z15.object({
3982
- external_id: z15.string().min(1).max(255).optional(),
4006
+ var ContactUpsert = z16.object({
4007
+ external_id: z16.string().min(1).max(255).optional(),
3983
4008
  email: Email.optional(),
3984
- first_name: z15.string().max(200).nullable().optional(),
3985
- last_name: z15.string().max(200).nullable().optional(),
3986
- locale: z15.string().min(2).max(35).nullable().optional(),
4009
+ first_name: z16.string().max(200).nullable().optional(),
4010
+ last_name: z16.string().max(200).nullable().optional(),
4011
+ locale: z16.string().min(2).max(35).nullable().optional(),
3987
4012
  timezone: TimezoneName.nullable().optional(),
3988
4013
  properties: Properties.optional(),
3989
- topics: z15.array(Slug).max(100).optional()
4014
+ topics: z16.array(Slug).max(100).optional()
3990
4015
  }).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
3991
4016
  message: "external_id or email is required",
3992
4017
  path: ["email"]
3993
4018
  });
3994
- var ContactUpsertResult = z15.object({
4019
+ var ContactUpsertResult = z16.object({
3995
4020
  contact: Contact,
3996
- created: z15.boolean()
4021
+ created: z16.boolean()
3997
4022
  });
3998
4023
  var ContactListQuery = PageQuery.extend({
3999
- email: z15.string().min(1).max(254).optional(),
4000
- external_id: z15.string().min(1).max(255).optional(),
4024
+ email: z16.string().min(1).max(254).optional(),
4025
+ external_id: z16.string().min(1).max(255).optional(),
4001
4026
  topic: Slug.optional()
4002
4027
  });
4003
- var ContactErased = z15.object({
4004
- ok: z15.literal(true),
4005
- erased_messages: z15.number().int().min(0),
4006
- erased_recipients: z15.number().int().min(0),
4007
- suppressions_kept: z15.number().int().min(0)
4028
+ var ContactErased = z16.object({
4029
+ ok: z16.literal(true),
4030
+ erased_messages: z16.number().int().min(0),
4031
+ erased_recipients: z16.number().int().min(0),
4032
+ suppressions_kept: z16.number().int().min(0)
4008
4033
  });
4009
4034
  var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
4010
- var SuppressionReason = z15.enum(SUPPRESSION_REASONS);
4011
- var Suppression = z15.object({
4035
+ var SuppressionReason = z16.enum(SUPPRESSION_REASONS);
4036
+ var Suppression = z16.object({
4012
4037
  id: Id,
4013
4038
  email: Email,
4014
4039
  reason: SuppressionReason,
4015
4040
  topic: Slug.nullable(),
4016
4041
  source_message_id: Id.nullable(),
4017
- note: z15.string().max(1e3).nullable(),
4042
+ note: z16.string().max(1e3).nullable(),
4018
4043
  created_at: Timestamp
4019
4044
  });
4020
- var SuppressionCreate = z15.object({
4045
+ var SuppressionCreate = z16.object({
4021
4046
  email: Email,
4022
- reason: z15.enum(["manual", "unsubscribed"]),
4047
+ reason: z16.enum(["manual", "unsubscribed"]),
4023
4048
  topic: Slug.nullable().optional(),
4024
- note: z15.string().max(1e3).optional()
4049
+ note: z16.string().max(1e3).optional()
4025
4050
  });
4026
4051
  var SuppressionListQuery = PageQuery.extend({
4027
- email: z15.string().min(1).max(254).optional(),
4052
+ email: z16.string().min(1).max(254).optional(),
4028
4053
  reason: SuppressionReason.optional(),
4029
4054
  topic: Slug.optional()
4030
4055
  });
4031
4056
 
4032
4057
  // src/webhooks.ts
4033
- import { z as z16 } from "zod";
4058
+ import { z as z17 } from "zod";
4034
4059
  var WEBHOOK_EVENT_TYPES = [
4035
4060
  "message.sent",
4036
4061
  "message.failed",
@@ -4074,23 +4099,23 @@ var WEBHOOK_EVENT_TYPES = [
4074
4099
  "template.updated",
4075
4100
  "template.deleted"
4076
4101
  ];
4077
- var WebhookEventType = z16.enum(WEBHOOK_EVENT_TYPES);
4078
- var MessageEventBase = z16.object({
4102
+ var WebhookEventType = z17.enum(WEBHOOK_EVENT_TYPES);
4103
+ var MessageEventBase = z17.object({
4079
4104
  message_id: Id,
4080
4105
  mailing_id: Id.nullable(),
4081
4106
  mailing_metadata: MailingMetadata.nullable(),
4082
4107
  recipient_id: Id.nullable(),
4083
4108
  contact_id: Id.nullable(),
4084
- external_id: z16.string().nullable(),
4109
+ external_id: z17.string().nullable(),
4085
4110
  email: Email,
4086
- subject: z16.string(),
4111
+ subject: z17.string(),
4087
4112
  topic: Slug.nullable(),
4088
- provider_message_id: z16.string().nullable(),
4089
- is_test: z16.boolean()
4113
+ provider_message_id: z17.string().nullable(),
4114
+ is_test: z17.boolean()
4090
4115
  });
4091
4116
  var MessageSentData = MessageEventBase.extend({
4092
4117
  /** The final HTML as sent, so the client can archive it beside its own records. */
4093
- html: z16.string(),
4118
+ html: z17.string(),
4094
4119
  sent_at: Timestamp,
4095
4120
  /**
4096
4121
  * The choice each insertion made (see `Message.insertions`); absent or null
@@ -4101,20 +4126,20 @@ var MessageSentData = MessageEventBase.extend({
4101
4126
  insertions: InsertionChoices.nullish()
4102
4127
  });
4103
4128
  var MessageFailedData = MessageEventBase.extend({
4104
- error: z16.string(),
4129
+ error: z17.string(),
4105
4130
  /** False when the provider rejected permanently; the recipient will not be retried. */
4106
- retryable: z16.boolean(),
4131
+ retryable: z17.boolean(),
4107
4132
  failed_at: Timestamp
4108
4133
  });
4109
4134
  var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
4110
- var ContactUnsubscribedData = z16.object({
4135
+ var ContactUnsubscribedData = z17.object({
4111
4136
  contact_id: Id.nullable(),
4112
- external_id: z16.string().nullable(),
4137
+ external_id: z17.string().nullable(),
4113
4138
  email: Email,
4114
4139
  /** The topic unsubscribed from; null means every topic. */
4115
4140
  topic: Slug.nullable(),
4116
4141
  mailing_id: Id.nullable(),
4117
- source: z16.enum(UNSUBSCRIBE_SOURCES),
4142
+ source: z17.enum(UNSUBSCRIBE_SOURCES),
4118
4143
  unsubscribed_at: Timestamp
4119
4144
  });
4120
4145
  var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
@@ -4123,142 +4148,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
4123
4148
  * breaker undid a `bounced` block it judged false (a `contact.bounced` for the
4124
4149
  * same address and mailing went out before); `topic` is null.
4125
4150
  */
4126
- source: z16.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4151
+ source: z17.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4127
4152
  resubscribed_at: Timestamp
4128
4153
  });
4129
- var ContactBouncedData = z16.object({
4154
+ var ContactBouncedData = z17.object({
4130
4155
  contact_id: Id.nullable(),
4131
- external_id: z16.string().nullable(),
4156
+ external_id: z17.string().nullable(),
4132
4157
  email: Email,
4133
4158
  /** `bounced` for a hard bounce, `complained` for a spam complaint. */
4134
- reason: z16.enum(["bounced", "complained"]),
4159
+ reason: z17.enum(["bounced", "complained"]),
4135
4160
  message_id: Id.nullable(),
4136
- diagnostic: z16.string().nullable(),
4161
+ diagnostic: z17.string().nullable(),
4137
4162
  bounced_at: Timestamp
4138
4163
  });
4139
- var MailingFinishedData = z16.object({
4164
+ var MailingFinishedData = z17.object({
4140
4165
  mailing_id: Id,
4141
4166
  mailing_metadata: MailingMetadata,
4142
- status: z16.enum(["sent", "partially_failed", "cancelled"]),
4167
+ status: z17.enum(["sent", "partially_failed", "cancelled"]),
4143
4168
  counts: MailingCounts,
4144
4169
  finished_at: Timestamp
4145
4170
  });
4146
- var ContactSubscribedData = z16.object({
4171
+ var ContactSubscribedData = z17.object({
4147
4172
  contact_id: Id,
4148
- external_id: z16.string().nullable(),
4173
+ external_id: z17.string().nullable(),
4149
4174
  email: Email,
4150
- topics: z16.array(Slug),
4151
- source: z16.enum(["signup_form", "api", "dashboard", "automation"]),
4175
+ topics: z17.array(Slug),
4176
+ source: z17.enum(["signup_form", "api", "dashboard", "automation"]),
4152
4177
  signup_form_id: Id.nullable(),
4153
- signup_form_version: z16.number().int().min(1).nullable(),
4178
+ signup_form_version: z17.number().int().min(1).nullable(),
4154
4179
  subscribed_at: Timestamp
4155
4180
  });
4156
- var ImportFinishedData = z16.object({
4181
+ var ImportFinishedData = z17.object({
4157
4182
  import_id: Id,
4158
- status: z16.enum(["completed", "cancelled", "failed"]),
4183
+ status: z17.enum(["completed", "cancelled", "failed"]),
4159
4184
  result: ImportReport.nullable(),
4160
- error: z16.string().nullable(),
4185
+ error: z17.string().nullable(),
4161
4186
  finished_at: Timestamp
4162
4187
  });
4163
- var MailingScheduledData = z16.object({
4188
+ var MailingScheduledData = z17.object({
4164
4189
  mailing_id: Id,
4165
4190
  mailing_metadata: MailingMetadata,
4166
4191
  scheduled_at: Timestamp.nullable()
4167
4192
  });
4168
- var MailingStartedData = z16.object({
4193
+ var MailingStartedData = z17.object({
4169
4194
  mailing_id: Id,
4170
4195
  mailing_metadata: MailingMetadata,
4171
- trigger: z16.enum(["send", "schedule"]),
4172
- recipients: z16.number().int().min(0),
4196
+ trigger: z17.enum(["send", "schedule"]),
4197
+ recipients: z17.number().int().min(0),
4173
4198
  started_at: Timestamp
4174
4199
  });
4175
- var MailingScheduleFailedData = z16.object({
4200
+ var MailingScheduleFailedData = z17.object({
4176
4201
  mailing_id: Id,
4177
4202
  mailing_metadata: MailingMetadata,
4178
- code: z16.string(),
4179
- message: z16.string(),
4203
+ code: z17.string(),
4204
+ message: z17.string(),
4180
4205
  failed_at: Timestamp
4181
4206
  });
4182
- var MailingAbWinnerSelectedData = z16.object({
4207
+ var MailingAbWinnerSelectedData = z17.object({
4183
4208
  mailing_id: Id,
4184
4209
  mailing_metadata: MailingMetadata,
4185
- winner: z16.string(),
4186
- decided_by: z16.enum(["metric", "manual"]),
4187
- variants: z16.array(VariantAnalytics),
4210
+ winner: z17.string(),
4211
+ decided_by: z17.enum(["metric", "manual"]),
4212
+ variants: z17.array(VariantAnalytics),
4188
4213
  decided_at: Timestamp
4189
4214
  });
4190
- var ContactTaggedData = z16.object({
4215
+ var ContactTaggedData = z17.object({
4191
4216
  contact_id: Id,
4192
- external_id: z16.string().nullable(),
4217
+ external_id: z17.string().nullable(),
4193
4218
  email: Email,
4194
4219
  /** Only the tags the contact did not already have. */
4195
- tags: z16.array(Slug).min(1),
4196
- source: z16.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4220
+ tags: z17.array(Slug).min(1),
4221
+ source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4197
4222
  tagged_at: Timestamp
4198
4223
  });
4199
- var ContactUpdatedData = z16.object({
4224
+ var ContactUpdatedData = z17.object({
4200
4225
  contact_id: Id,
4201
- external_id: z16.string().nullable(),
4226
+ external_id: z17.string().nullable(),
4202
4227
  email: Email,
4203
- changed: z16.array(z16.string()).min(1),
4228
+ changed: z17.array(z17.string()).min(1),
4204
4229
  properties: Properties,
4205
- source: z16.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4230
+ source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4206
4231
  updated_at: Timestamp
4207
4232
  });
4208
- var AutomationRunEventBase = z16.object({
4233
+ var AutomationRunEventBase = z17.object({
4209
4234
  automation_id: Id,
4210
- automation_name: z16.string(),
4235
+ automation_name: z17.string(),
4211
4236
  run_id: Id,
4212
- version: z16.number().int().min(1),
4237
+ version: z17.number().int().min(1),
4213
4238
  contact_id: Id,
4214
- external_id: z16.string().nullable(),
4239
+ external_id: z17.string().nullable(),
4215
4240
  email: Email
4216
4241
  });
4217
4242
  var AutomationRunStartedData = AutomationRunEventBase.extend({
4218
4243
  /** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
4219
- trigger_kind: z16.string(),
4244
+ trigger_kind: z17.string(),
4220
4245
  entered_at: Timestamp
4221
4246
  });
4222
4247
  var AutomationRunCompletedData = AutomationRunEventBase.extend({
4223
- last_step_id: z16.string().nullable(),
4248
+ last_step_id: z17.string().nullable(),
4224
4249
  completed_at: Timestamp
4225
4250
  });
4226
4251
  var AutomationRunExitedData = AutomationRunEventBase.extend({
4227
4252
  reason: AutomationEndReason,
4228
- step_id: z16.string().nullable(),
4253
+ step_id: z17.string().nullable(),
4229
4254
  exited_at: Timestamp
4230
4255
  });
4231
4256
  var AutomationRunFailedData = AutomationRunEventBase.extend({
4232
- reason: z16.string(),
4233
- step_id: z16.string().nullable(),
4257
+ reason: z17.string(),
4258
+ step_id: z17.string().nullable(),
4234
4259
  failed_at: Timestamp
4235
4260
  });
4236
4261
  var AutomationWebhookData = AutomationRunEventBase.extend({
4237
- step_id: z16.string(),
4262
+ step_id: z17.string(),
4238
4263
  /** The step's own label, when it was given one, so a receiver can branch on a name. */
4239
- step_label: z16.string().nullable(),
4264
+ step_label: z17.string().nullable(),
4240
4265
  /** Whatever the step carries, verbatim. Null when it carries nothing. */
4241
4266
  payload: JsonValue.nullable(),
4242
4267
  fired_at: Timestamp
4243
4268
  });
4244
- var TemplateEventBase = z16.object({
4269
+ var TemplateEventBase = z17.object({
4245
4270
  template_id: Id,
4246
- name: z16.string().min(1).max(200),
4247
- version: z16.number().int().min(1),
4248
- source: z16.enum(["api", "dashboard", "mjml_import"])
4271
+ name: z17.string().min(1).max(200),
4272
+ version: z17.number().int().min(1),
4273
+ source: z17.enum(["api", "dashboard", "mjml_import"])
4249
4274
  });
4250
4275
  var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
4251
- var TemplateUpdatedData = TemplateEventBase.extend({ archived: z16.boolean(), updated_at: Timestamp });
4276
+ var TemplateUpdatedData = TemplateEventBase.extend({ archived: z17.boolean(), updated_at: Timestamp });
4252
4277
  var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
4253
- var envelope = (type, data) => z16.object({
4278
+ var envelope = (type, data) => z17.object({
4254
4279
  /** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
4255
4280
  id: Id,
4256
- type: z16.literal(type),
4281
+ type: z17.literal(type),
4257
4282
  created_at: Timestamp,
4258
4283
  workspace_id: Id,
4259
4284
  data
4260
4285
  });
4261
- var WebhookEvent = z16.discriminatedUnion("type", [
4286
+ var WebhookEvent = z17.discriminatedUnion("type", [
4262
4287
  envelope("message.sent", MessageSentData),
4263
4288
  envelope("message.failed", MessageFailedData),
4264
4289
  envelope("contact.unsubscribed", ContactUnsubscribedData),
@@ -4282,16 +4307,16 @@ var WebhookEvent = z16.discriminatedUnion("type", [
4282
4307
  envelope("template.updated", TemplateUpdatedData),
4283
4308
  envelope("template.deleted", TemplateDeletedData)
4284
4309
  ]);
4285
- var WebhookEndpoint = z16.object({
4310
+ var WebhookEndpoint = z17.object({
4286
4311
  id: Id,
4287
- url: z16.string().url(),
4288
- description: z16.string().max(500).nullable(),
4289
- events: z16.array(WebhookEventType).min(1),
4290
- enabled: z16.boolean(),
4312
+ url: z17.string().url(),
4313
+ description: z17.string().max(500).nullable(),
4314
+ events: z17.array(WebhookEventType).min(1),
4315
+ enabled: z17.boolean(),
4291
4316
  created_at: Timestamp,
4292
4317
  updated_at: Timestamp
4293
4318
  });
4294
- var WebhookUrl = z16.string().url().refine((u) => {
4319
+ var WebhookUrl = z17.string().url().refine((u) => {
4295
4320
  try {
4296
4321
  const url = new URL(u);
4297
4322
  if (url.protocol === "https:") return true;
@@ -4300,35 +4325,35 @@ var WebhookUrl = z16.string().url().refine((u) => {
4300
4325
  return false;
4301
4326
  }
4302
4327
  }, "must be https (http only for localhost)");
4303
- var WebhookEndpointCreate = z16.object({
4328
+ var WebhookEndpointCreate = z17.object({
4304
4329
  url: WebhookUrl,
4305
- description: z16.string().max(500).optional(),
4306
- events: z16.array(WebhookEventType).min(1),
4307
- enabled: z16.boolean().optional()
4330
+ description: z17.string().max(500).optional(),
4331
+ events: z17.array(WebhookEventType).min(1),
4332
+ enabled: z17.boolean().optional()
4308
4333
  });
4309
- var WebhookEndpointUpdate = z16.object({
4334
+ var WebhookEndpointUpdate = z17.object({
4310
4335
  url: WebhookUrl,
4311
- description: z16.string().max(500).nullable(),
4312
- events: z16.array(WebhookEventType).min(1),
4313
- enabled: z16.boolean()
4336
+ description: z17.string().max(500).nullable(),
4337
+ events: z17.array(WebhookEventType).min(1),
4338
+ enabled: z17.boolean()
4314
4339
  }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
4315
- var WebhookEndpointWithSecret = z16.object({
4340
+ var WebhookEndpointWithSecret = z17.object({
4316
4341
  endpoint: WebhookEndpoint,
4317
- secret: z16.string().min(32)
4342
+ secret: z17.string().min(32)
4318
4343
  });
4319
4344
  var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
4320
- var WebhookDeliveryStatus = z16.enum(WEBHOOK_DELIVERY_STATUSES);
4345
+ var WebhookDeliveryStatus = z17.enum(WEBHOOK_DELIVERY_STATUSES);
4321
4346
  var WEBHOOK_MAX_ATTEMPTS = 8;
4322
4347
  var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
4323
- var WebhookDelivery = z16.object({
4348
+ var WebhookDelivery = z17.object({
4324
4349
  id: Id,
4325
4350
  endpoint_id: Id,
4326
4351
  event_id: Id,
4327
4352
  event_type: WebhookEventType,
4328
4353
  status: WebhookDeliveryStatus,
4329
- attempts: z16.number().int().min(0),
4330
- last_status_code: z16.number().int().min(100).max(599).nullable(),
4331
- last_error: z16.string().nullable(),
4354
+ attempts: z17.number().int().min(0),
4355
+ last_status_code: z17.number().int().min(100).max(599).nullable(),
4356
+ last_error: z17.string().nullable(),
4332
4357
  next_attempt_at: Timestamp.nullable(),
4333
4358
  delivered_at: Timestamp.nullable(),
4334
4359
  created_at: Timestamp
@@ -4337,7 +4362,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
4337
4362
  status: WebhookDeliveryStatus.optional(),
4338
4363
  event_type: WebhookEventType.optional()
4339
4364
  });
4340
- var WebhookDeliveryParams = z16.object({ id: Id, delivery_id: Id });
4365
+ var WebhookDeliveryParams = z17.object({ id: Id, delivery_id: Id });
4341
4366
 
4342
4367
  // src/webhook-signing.ts
4343
4368
  var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
@@ -4404,94 +4429,96 @@ async function verifyWebhook(input) {
4404
4429
  }
4405
4430
 
4406
4431
  // src/billing.ts
4407
- import { z as z17 } from "zod";
4432
+ import { z as z18 } from "zod";
4408
4433
  var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
4409
- var PlanId = z17.enum(PLAN_IDS);
4410
- var PlanLimits = z17.object({
4411
- monthly_messages: z17.number().int().min(0).nullable(),
4412
- contacts: z17.number().int().min(0).nullable(),
4413
- members: z17.number().int().min(1).nullable(),
4414
- providers: z17.number().int().min(1).nullable(),
4415
- webhook_endpoints: z17.number().int().min(0).nullable(),
4434
+ var PlanId = z18.enum(PLAN_IDS);
4435
+ var PlanLimits = z18.object({
4436
+ monthly_messages: z18.number().int().min(0).nullable(),
4437
+ contacts: z18.number().int().min(0).nullable(),
4438
+ members: z18.number().int().min(1).nullable(),
4439
+ providers: z18.number().int().min(1).nullable(),
4440
+ webhook_endpoints: z18.number().int().min(0).nullable(),
4416
4441
  /** Automations that may be live (active or paused) at once (A1). */
4417
- active_automations: z17.number().int().min(0).nullable(),
4442
+ active_automations: z18.number().int().min(0).nullable(),
4418
4443
  /** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
4419
- automation_steps: z17.number().int().min(1).nullable(),
4444
+ automation_steps: z18.number().int().min(1).nullable(),
4420
4445
  /** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
4421
- sending_domains: z17.number().int().min(0).nullable()
4446
+ sending_domains: z18.number().int().min(0).nullable()
4422
4447
  });
4423
- var PlanFeatures = z17.object({
4448
+ var PlanFeatures = z18.object({
4424
4449
  /** A/B tests of subject and content on a mailing (S4). */
4425
- ab_testing: z17.boolean(),
4450
+ ab_testing: z18.boolean(),
4426
4451
  /** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
4427
- tracking: z17.boolean(),
4452
+ tracking: z18.boolean(),
4428
4453
  /** Automations: flows a person walks through step by step (A1). */
4429
- automations: z17.boolean()
4454
+ automations: z18.boolean()
4430
4455
  });
4431
4456
  var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
4432
- var Plan = z17.object({
4457
+ var Plan = z18.object({
4433
4458
  id: PlanId,
4434
- name: z17.string().min(1),
4459
+ name: z18.string().min(1),
4435
4460
  /** Price in the smallest currency unit per month; null for plans not sold. */
4436
- monthly_price_cents: z17.number().int().min(0).nullable(),
4437
- currency: z17.string().length(3),
4461
+ monthly_price_cents: z18.number().int().min(0).nullable(),
4462
+ currency: z18.string().length(3),
4438
4463
  limits: PlanLimits,
4439
4464
  features: PlanFeatures
4440
4465
  });
4441
- var CatalogPlan = Plan.extend({ sellable: z17.boolean() });
4442
- var Subscription = z17.object({
4466
+ var CatalogPlan = Plan.extend({ sellable: z18.boolean() });
4467
+ var Subscription = z18.object({
4443
4468
  workspace_id: Id,
4444
4469
  plan: PlanId,
4445
- status: z17.enum(["active", "trialing", "past_due", "cancelled"]),
4470
+ status: z18.enum(["active", "trialing", "past_due", "cancelled"]),
4446
4471
  current_period_start: Timestamp,
4447
4472
  current_period_end: Timestamp,
4448
- cancel_at_period_end: z17.boolean(),
4473
+ cancel_at_period_end: z18.boolean(),
4449
4474
  /**
4450
4475
  * A design partner outside billing (plan `design_partner`, no limits, no
4451
4476
  * checkout). Set only by an operator, never through the API.
4452
4477
  */
4453
- billing_exempt: z17.boolean(),
4478
+ billing_exempt: z18.boolean(),
4454
4479
  /**
4455
4480
  * Own sending domains bought on top of the plan's included ones (the
4456
4481
  * add-on), each a monthly charge on the same subscription. 0 without the
4457
4482
  * add-on; the usage limit `sending_domains` is the plan's plus these.
4458
4483
  */
4459
- extra_sending_domains: z17.number().int().min(0)
4484
+ extra_sending_domains: z18.number().int().min(0)
4460
4485
  });
4461
- var BillingAddons = z17.object({
4462
- sending_domain: z17.object({
4463
- monthly_price_cents: z17.number().int().min(0),
4464
- currency: z17.string().length(3),
4465
- sellable: z17.boolean()
4486
+ var BillingAddons = z18.object({
4487
+ sending_domain: z18.object({
4488
+ monthly_price_cents: z18.number().int().min(0),
4489
+ currency: z18.string().length(3),
4490
+ sellable: z18.boolean()
4466
4491
  })
4467
4492
  });
4468
4493
  var MAX_EXTRA_SENDING_DOMAINS = 100;
4469
- var ExtraSendingDomainsUpdate = z17.object({ quantity: z17.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
4494
+ var ExtraSendingDomainsUpdate = z18.object({ quantity: z18.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
4470
4495
  var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
4471
- var UsageMetric = z17.enum(USAGE_METRICS);
4496
+ var UsageMetric = z18.enum(USAGE_METRICS);
4472
4497
  var USAGE_WARNING_RATIO = 0.8;
4473
- var UsageWarning = z17.object({
4498
+ var UsageWarning = z18.object({
4474
4499
  metric: UsageMetric,
4475
- used: z17.number().int().min(0),
4476
- limit: z17.number().int().min(0),
4500
+ used: z18.number().int().min(0),
4501
+ limit: z18.number().int().min(0),
4477
4502
  /** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
4478
- level: z17.enum(["approaching", "reached"])
4503
+ level: z18.enum(["approaching", "reached"])
4479
4504
  });
4480
- var Usage = z17.object({
4505
+ var Usage = z18.object({
4481
4506
  plan: PlanId,
4482
4507
  period_start: Timestamp,
4483
4508
  period_end: Timestamp,
4484
- metrics: z17.record(UsageMetric, z17.object({ used: z17.number().int().min(0), limit: z17.number().int().min(0).nullable() })),
4485
- warnings: z17.array(UsageWarning)
4486
- });
4487
- var CheckoutRequest = z17.object({
4488
- plan: z17.enum(["starter", "growth"]),
4489
- success_url: z17.string().url(),
4490
- cancel_url: z17.string().url()
4491
- });
4492
- var CheckoutSession = z17.object({ url: z17.string().url() });
4493
- var PortalRequest = z17.object({ return_url: z17.string().url() });
4494
- var PortalSession = z17.object({ url: z17.string().url() });
4509
+ metrics: z18.record(UsageMetric, z18.object({ used: z18.number().int().min(0), limit: z18.number().int().min(0).nullable() })),
4510
+ warnings: z18.array(UsageWarning)
4511
+ });
4512
+ var CheckoutRequest = z18.object({
4513
+ plan: z18.enum(["starter", "growth"]),
4514
+ success_url: z18.string().url(),
4515
+ cancel_url: z18.string().url(),
4516
+ /** The buyer accepted the terms of service and the processing agreement of this version. */
4517
+ accept_terms: AcceptTerms
4518
+ });
4519
+ var CheckoutSession = z18.object({ url: z18.string().url() });
4520
+ var PortalRequest = z18.object({ return_url: z18.string().url() });
4521
+ var PortalSession = z18.object({ url: z18.string().url() });
4495
4522
  var USAGE_WARNING_HEADER = "x-mail-usage-warning";
4496
4523
  function formatUsageWarningHeader(warnings) {
4497
4524
  if (warnings.length === 0) return null;
@@ -4511,7 +4538,7 @@ function parseUsageWarningHeader(value) {
4511
4538
  }
4512
4539
 
4513
4540
  // src/routes.ts
4514
- import { z as z18 } from "zod";
4541
+ import { z as z19 } from "zod";
4515
4542
  var list = (item) => page(item);
4516
4543
  var foundationRoutes = {
4517
4544
  "workspaces.create": {
@@ -4757,7 +4784,7 @@ var templateRoutes = {
4757
4784
  path: "/v1/templates/:id/export",
4758
4785
  params: IdParams,
4759
4786
  query: TemplateExportQuery,
4760
- response: z18.string(),
4787
+ response: z19.string(),
4761
4788
  responseType: "text",
4762
4789
  status: 200,
4763
4790
  access: "read",
@@ -5137,7 +5164,7 @@ var sendingRoutes = {
5137
5164
  path: "/v1/mailings/:id/export",
5138
5165
  params: IdParams,
5139
5166
  query: MailingExportQuery,
5140
- response: z18.string(),
5167
+ response: z19.string(),
5141
5168
  responseType: "text",
5142
5169
  status: 200,
5143
5170
  access: "read",
@@ -5404,7 +5431,7 @@ var platformRoutes = {
5404
5431
  "contactProperties.list": {
5405
5432
  method: "GET",
5406
5433
  path: "/v1/contact-properties",
5407
- response: z18.object({ data: z18.array(ContactPropertyDefinition) }),
5434
+ response: z19.object({ data: z19.array(ContactPropertyDefinition) }),
5408
5435
  status: 200,
5409
5436
  access: "read",
5410
5437
  phase: "S4"
@@ -5703,7 +5730,7 @@ var billingRoutes = {
5703
5730
  "billing.plans": {
5704
5731
  method: "GET",
5705
5732
  path: "/v1/billing/plans",
5706
- response: z18.object({ data: z18.array(CatalogPlan), addons: BillingAddons }),
5733
+ response: z19.object({ data: z19.array(CatalogPlan), addons: BillingAddons }),
5707
5734
  status: 200,
5708
5735
  access: "read",
5709
5736
  phase: "S5"
@@ -5854,7 +5881,7 @@ var automationRoutes = {
5854
5881
  method: "POST",
5855
5882
  path: "/v1/automations/:id/pause",
5856
5883
  params: IdParams,
5857
- body: z18.object({}).strict(),
5884
+ body: z19.object({}).strict(),
5858
5885
  response: Automation,
5859
5886
  status: 200,
5860
5887
  access: "write",
@@ -5864,7 +5891,7 @@ var automationRoutes = {
5864
5891
  method: "POST",
5865
5892
  path: "/v1/automations/:id/resume",
5866
5893
  params: IdParams,
5867
- body: z18.object({}).strict(),
5894
+ body: z19.object({}).strict(),
5868
5895
  response: Automation,
5869
5896
  status: 200,
5870
5897
  access: "write",
@@ -5874,7 +5901,7 @@ var automationRoutes = {
5874
5901
  method: "POST",
5875
5902
  path: "/v1/automations/:id/archive",
5876
5903
  params: IdParams,
5877
- body: z18.object({}).strict(),
5904
+ body: z19.object({}).strict(),
5878
5905
  response: Automation,
5879
5906
  status: 200,
5880
5907
  access: "write",
@@ -6054,6 +6081,7 @@ export {
6054
6081
  AbTestState,
6055
6082
  AbVariant,
6056
6083
  AbWinnerRequest,
6084
+ AcceptTerms,
6057
6085
  ApiKey,
6058
6086
  ApiKeyCreate,
6059
6087
  ApiKeyCreated,
@@ -6225,6 +6253,7 @@ export {
6225
6253
  InviteListQuery,
6226
6254
  InviteStatus,
6227
6255
  JsonValue,
6256
+ LEGAL_TERMS_VERSION,
6228
6257
  LETTER_ONLY_MERGE_FIELDS,
6229
6258
  LETTER_RECIPIENT_REFUSAL,
6230
6259
  LIST_UNSUBSCRIBE_POST_VALUE,
@@ -6634,6 +6663,7 @@ export {
6634
6663
  sameJson,
6635
6664
  sampleMergeValue,
6636
6665
  saveDemotions,
6666
+ sendingDomainRecordFullName,
6637
6667
  sendingRoutes,
6638
6668
  setInsertionBy,
6639
6669
  setInsertionFilled,