@marlinjai/mail-contract 0.18.0 → 0.20.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 = [
@@ -3024,6 +3037,7 @@ var AUDIT_ACTIONS = [
3024
3037
  "billing.subscription_changed",
3025
3038
  "billing.exemption_changed",
3026
3039
  "billing.extra_sending_domains_changed",
3040
+ "billing.terms_accepted",
3027
3041
  // A1: automations
3028
3042
  "automation.created",
3029
3043
  "automation.updated",
@@ -3037,14 +3051,14 @@ var AUDIT_ACTIONS = [
3037
3051
  "automation.run_ended",
3038
3052
  "event.recorded"
3039
3053
  ];
3040
- var AuditAction = z11.enum(AUDIT_ACTIONS);
3054
+ var AuditAction = z12.enum(AUDIT_ACTIONS);
3041
3055
  var TRUSTED_APPS = ["booking"];
3042
- var TrustedApp = z11.enum(TRUSTED_APPS);
3043
- var AuditActor = z11.discriminatedUnion("type", [
3044
- z11.object({
3045
- type: z11.literal("member"),
3056
+ var TrustedApp = z12.enum(TRUSTED_APPS);
3057
+ var AuditActor = z12.discriminatedUnion("type", [
3058
+ z12.object({
3059
+ type: z12.literal("member"),
3046
3060
  member_id: Id,
3047
- subject: z11.string().min(1),
3061
+ subject: z12.string().min(1),
3048
3062
  /**
3049
3063
  * The application the person acted through, when it was not the dashboard:
3050
3064
  * the service set it from the service token the call carried, so it is
@@ -3052,26 +3066,26 @@ var AuditActor = z11.discriminatedUnion("type", [
3052
3066
  */
3053
3067
  app: TrustedApp.optional()
3054
3068
  }),
3055
- z11.object({
3056
- type: z11.literal("api_key"),
3069
+ z12.object({
3070
+ type: z12.literal("api_key"),
3057
3071
  api_key_id: Id,
3058
3072
  /**
3059
3073
  * Who the client's application said it was acting for, from
3060
3074
  * `ON_BEHALF_OF_HEADER`: reported by that application, never verified.
3061
3075
  * Absent when the call carried no label.
3062
3076
  */
3063
- on_behalf_of: z11.string().min(1).max(ON_BEHALF_OF_MAX_LENGTH).optional()
3077
+ on_behalf_of: z12.string().min(1).max(ON_BEHALF_OF_MAX_LENGTH).optional()
3064
3078
  }),
3065
3079
  /** The service itself (the worker, a bounce, the hosted unsubscribe page). */
3066
- z11.object({ type: z11.literal("system"), reason: z11.string().min(1).max(200) })
3080
+ z12.object({ type: z12.literal("system"), reason: z12.string().min(1).max(200) })
3067
3081
  ]);
3068
- var AuditEntry = z11.object({
3082
+ var AuditEntry = z12.object({
3069
3083
  id: Id,
3070
3084
  action: AuditAction,
3071
3085
  actor: AuditActor,
3072
- target_type: z11.string().min(1).max(64),
3086
+ target_type: z12.string().min(1).max(64),
3073
3087
  target_id: Id.nullable(),
3074
- details: z11.record(z11.unknown()),
3088
+ details: z12.record(z12.unknown()),
3075
3089
  created_at: Timestamp
3076
3090
  });
3077
3091
  var AuditQuery = PageQuery.extend({
@@ -3080,12 +3094,12 @@ var AuditQuery = PageQuery.extend({
3080
3094
  });
3081
3095
 
3082
3096
  // src/invites.ts
3083
- import { z as z12 } from "zod";
3097
+ import { z as z13 } from "zod";
3084
3098
  var INVITE_STATUSES = ["pending", "accepted", "revoked", "expired"];
3085
- var InviteStatus = z12.enum(INVITE_STATUSES);
3099
+ var InviteStatus = z13.enum(INVITE_STATUSES);
3086
3100
  var DEFAULT_INVITE_TTL_DAYS = 7;
3087
3101
  var MAX_INVITE_TTL_DAYS = 30;
3088
- var Invite = z12.object({
3102
+ var Invite = z13.object({
3089
3103
  id: Id,
3090
3104
  /** Stored lowercased; only a person signed in with this address can accept. */
3091
3105
  email: Email,
@@ -3093,32 +3107,32 @@ var Invite = z12.object({
3093
3107
  /** Derived from the timestamps below, never stored. */
3094
3108
  status: InviteStatus,
3095
3109
  /** The member who invited, while they are still one (null after they left). */
3096
- invited_by: z12.object({ member_id: Id.nullable(), email: Email.nullable() }),
3110
+ invited_by: z13.object({ member_id: Id.nullable(), email: Email.nullable() }),
3097
3111
  expires_at: Timestamp,
3098
3112
  accepted_at: Timestamp.nullable(),
3099
3113
  revoked_at: Timestamp.nullable(),
3100
3114
  created_at: Timestamp
3101
3115
  });
3102
- var InviteCreate = z12.object({
3116
+ var InviteCreate = z13.object({
3103
3117
  email: Email,
3104
3118
  role: MemberRole,
3105
- expires_in_days: z12.number().int().min(1).max(MAX_INVITE_TTL_DAYS).optional()
3119
+ expires_in_days: z13.number().int().min(1).max(MAX_INVITE_TTL_DAYS).optional()
3106
3120
  });
3107
- var InviteCreated = z12.object({
3121
+ var InviteCreated = z13.object({
3108
3122
  invite: Invite,
3109
- token: z12.string().min(32).max(128)
3123
+ token: z13.string().min(32).max(128)
3110
3124
  });
3111
3125
  var InviteListQuery = PageQuery.extend({
3112
3126
  status: InviteStatus.optional()
3113
3127
  });
3114
- var InviteAccept = z12.object({
3115
- token: z12.string().min(32).max(128),
3128
+ var InviteAccept = z13.object({
3129
+ token: z13.string().min(32).max(128),
3116
3130
  email: Email,
3117
- name: z12.string().max(200).nullable().optional()
3131
+ name: z13.string().max(200).nullable().optional()
3118
3132
  });
3119
- var InviteAccepted = z12.object({
3133
+ var InviteAccepted = z13.object({
3120
3134
  workspace: WorkspaceMembership,
3121
- already_member: z12.boolean()
3135
+ already_member: z13.boolean()
3122
3136
  });
3123
3137
  var INVITE_REFUSAL_REASONS = ["email_mismatch", "inviter_lacks_role", "expired", "revoked", "accepted"];
3124
3138
 
@@ -3748,13 +3762,13 @@ function renameInsertionEverywhere(drafts, from, rawTo) {
3748
3762
  }
3749
3763
 
3750
3764
  // src/providers.ts
3751
- import { z as z13 } from "zod";
3765
+ import { z as z14 } from "zod";
3752
3766
  var PROVIDER_KINDS = ["smtp", "resend"];
3753
- var ProviderKind = z13.enum(PROVIDER_KINDS);
3754
- var ProviderPolicy = z13.object({
3755
- daily_recipient_budget: z13.number().int().min(1).max(1e7),
3756
- min_interval_ms: z13.number().int().min(0).max(36e5),
3757
- max_recipients_per_message: z13.number().int().min(1).max(1e3)
3767
+ var ProviderKind = z14.enum(PROVIDER_KINDS);
3768
+ var ProviderPolicy = z14.object({
3769
+ daily_recipient_budget: z14.number().int().min(1).max(1e7),
3770
+ min_interval_ms: z14.number().int().min(0).max(36e5),
3771
+ max_recipients_per_message: z14.number().int().min(1).max(1e3)
3758
3772
  });
3759
3773
  var ICLOUD_SMTP_POLICY = {
3760
3774
  daily_recipient_budget: 800,
@@ -3762,17 +3776,17 @@ var ICLOUD_SMTP_POLICY = {
3762
3776
  max_recipients_per_message: 1
3763
3777
  };
3764
3778
  var SMTP_SECURITY = ["tls", "starttls"];
3765
- var SmtpConfigBase = z13.object({
3766
- host: z13.string().min(1).max(255),
3767
- port: z13.number().int().min(1).max(65535),
3779
+ var SmtpConfigBase = z14.object({
3780
+ host: z14.string().min(1).max(255),
3781
+ port: z14.number().int().min(1).max(65535),
3768
3782
  /** `tls` connects encrypted (465), `starttls` upgrades (587). Never plaintext. */
3769
- security: z13.enum(SMTP_SECURITY),
3770
- username: z13.string().min(1).max(255)
3783
+ security: z14.enum(SMTP_SECURITY),
3784
+ username: z14.string().min(1).max(255)
3771
3785
  });
3772
- var ResendConfigBase = z13.object({});
3773
- var ProviderRejections = z13.object({
3774
- count: z13.number().int().min(0),
3775
- last_error: z13.string().nullable(),
3786
+ var ResendConfigBase = z14.object({});
3787
+ var ProviderRejections = z14.object({
3788
+ count: z14.number().int().min(0),
3789
+ last_error: z14.string().nullable(),
3776
3790
  last_at: Timestamp.nullable(),
3777
3791
  /**
3778
3792
  * The last time the bounce circuit breaker tripped on one of this provider's
@@ -3782,59 +3796,59 @@ var ProviderRejections = z13.object({
3782
3796
  * run's bounce blocks were undone and the mailing paused. `sample` is the
3783
3797
  * reply that tripped it.
3784
3798
  */
3785
- anomaly: z13.object({
3799
+ anomaly: z14.object({
3786
3800
  at: Timestamp,
3787
3801
  /** `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. */
3788
- scope: z13.enum(["mailing", "provider"]),
3802
+ scope: z14.enum(["mailing", "provider"]),
3789
3803
  /**
3790
3804
  * True while the provider-wide breaker is open: no bounce blocks through
3791
3805
  * this provider, test sends refused and mailings not started or resumed
3792
3806
  * (`provider_anomaly`), until an admin clears it (`providers.clearAnomaly`).
3793
3807
  */
3794
- blocking: z13.boolean(),
3808
+ blocking: z14.boolean(),
3795
3809
  mailing_id: Id.nullable(),
3796
- reason: z13.string(),
3797
- sample: z13.string()
3810
+ reason: z14.string(),
3811
+ sample: z14.string()
3798
3812
  }).nullable()
3799
3813
  });
3800
- var ProviderEvents = z13.object({
3801
- status: z13.enum(["active", "needs_secret"]),
3802
- source: z13.enum(["automatic", "manual", "managed"]).nullable(),
3803
- url: z13.string().url(),
3804
- error: z13.string().nullable(),
3814
+ var ProviderEvents = z14.object({
3815
+ status: z14.enum(["active", "needs_secret"]),
3816
+ source: z14.enum(["automatic", "manual", "managed"]).nullable(),
3817
+ url: z14.string().url(),
3818
+ error: z14.string().nullable(),
3805
3819
  /**
3806
3820
  * Events that named an email this provider never sent through the service
3807
3821
  * (another workspace or system sharing the Resend account): counted, never
3808
3822
  * acted on.
3809
3823
  */
3810
- unmatched: z13.number().int().min(0)
3824
+ unmatched: z14.number().int().min(0)
3811
3825
  });
3812
3826
  var RESEND_EVENT_TYPES = ["email.bounced", "email.complained", "email.delivery_delayed"];
3813
- 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_");
3814
- var ProviderEventsSecret = z13.object({ signing_secret: ResendSigningSecret });
3827
+ 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_");
3828
+ var ProviderEventsSecret = z14.object({ signing_secret: ResendSigningSecret });
3815
3829
  var ProviderFields = {
3816
- name: z13.string().min(1).max(120),
3817
- from_name: z13.string().min(1).max(120),
3830
+ name: z14.string().min(1).max(120),
3831
+ from_name: z14.string().min(1).max(120),
3818
3832
  from_email: Email,
3819
3833
  reply_to: Email.nullable(),
3820
3834
  policy: ProviderPolicy
3821
3835
  };
3822
- var Provider = z13.discriminatedUnion("kind", [
3823
- z13.object({
3836
+ var Provider = z14.discriminatedUnion("kind", [
3837
+ z14.object({
3824
3838
  id: Id,
3825
- kind: z13.literal("smtp"),
3839
+ kind: z14.literal("smtp"),
3826
3840
  config: SmtpConfigBase,
3827
- has_secret: z13.boolean(),
3841
+ has_secret: z14.boolean(),
3828
3842
  ...ProviderFields,
3829
3843
  rejections: ProviderRejections,
3830
3844
  created_at: Timestamp,
3831
3845
  updated_at: Timestamp
3832
3846
  }),
3833
- z13.object({
3847
+ z14.object({
3834
3848
  id: Id,
3835
- kind: z13.literal("resend"),
3849
+ kind: z14.literal("resend"),
3836
3850
  config: ResendConfigBase,
3837
- has_secret: z13.boolean(),
3851
+ has_secret: z14.boolean(),
3838
3852
  ...ProviderFields,
3839
3853
  rejections: ProviderRejections,
3840
3854
  events: ProviderEvents,
@@ -3842,31 +3856,31 @@ var Provider = z13.discriminatedUnion("kind", [
3842
3856
  updated_at: Timestamp
3843
3857
  })
3844
3858
  ]);
3845
- var ProviderCreate = z13.discriminatedUnion("kind", [
3846
- z13.object({
3847
- kind: z13.literal("smtp"),
3848
- config: SmtpConfigBase.extend({ password: z13.string().min(1).max(1024) }),
3859
+ var ProviderCreate = z14.discriminatedUnion("kind", [
3860
+ z14.object({
3861
+ kind: z14.literal("smtp"),
3862
+ config: SmtpConfigBase.extend({ password: z14.string().min(1).max(1024) }),
3849
3863
  ...ProviderFields
3850
3864
  }),
3851
- z13.object({
3852
- kind: z13.literal("resend"),
3853
- config: ResendConfigBase.extend({ api_key: z13.string().min(1).max(1024) }),
3865
+ z14.object({
3866
+ kind: z14.literal("resend"),
3867
+ config: ResendConfigBase.extend({ api_key: z14.string().min(1).max(1024) }),
3854
3868
  ...ProviderFields
3855
3869
  })
3856
3870
  ]);
3857
- var ProviderUpdate = z13.discriminatedUnion("kind", [
3858
- z13.object({
3859
- kind: z13.literal("smtp"),
3860
- config: SmtpConfigBase.extend({ password: z13.string().min(1).max(1024).optional() }).partial().optional(),
3871
+ var ProviderUpdate = z14.discriminatedUnion("kind", [
3872
+ z14.object({
3873
+ kind: z14.literal("smtp"),
3874
+ config: SmtpConfigBase.extend({ password: z14.string().min(1).max(1024).optional() }).partial().optional(),
3861
3875
  name: ProviderFields.name.optional(),
3862
3876
  from_name: ProviderFields.from_name.optional(),
3863
3877
  from_email: ProviderFields.from_email.optional(),
3864
3878
  reply_to: ProviderFields.reply_to.optional(),
3865
3879
  policy: ProviderPolicy.partial().optional()
3866
3880
  }),
3867
- z13.object({
3868
- kind: z13.literal("resend"),
3869
- config: ResendConfigBase.extend({ api_key: z13.string().min(1).max(1024).optional() }).optional(),
3881
+ z14.object({
3882
+ kind: z14.literal("resend"),
3883
+ config: ResendConfigBase.extend({ api_key: z14.string().min(1).max(1024).optional() }).optional(),
3870
3884
  name: ProviderFields.name.optional(),
3871
3885
  from_name: ProviderFields.from_name.optional(),
3872
3886
  from_email: ProviderFields.from_email.optional(),
@@ -3874,37 +3888,37 @@ var ProviderUpdate = z13.discriminatedUnion("kind", [
3874
3888
  policy: ProviderPolicy.partial().optional()
3875
3889
  })
3876
3890
  ]);
3877
- var ProviderUsage = z13.object({
3891
+ var ProviderUsage = z14.object({
3878
3892
  provider_id: Id,
3879
- recipients_last_24h: z13.number().int().min(0),
3880
- remaining_budget: z13.number().int().min(0),
3893
+ recipients_last_24h: z14.number().int().min(0),
3894
+ remaining_budget: z14.number().int().min(0),
3881
3895
  /** When enough of the rolling window frees up to send again, if exhausted. */
3882
3896
  next_capacity_at: Timestamp.nullable()
3883
3897
  });
3884
- var ProviderVerifyResult = z13.object({
3885
- ok: z13.boolean(),
3886
- error: z13.string().nullable()
3898
+ var ProviderVerifyResult = z14.object({
3899
+ ok: z14.boolean(),
3900
+ error: z14.string().nullable()
3887
3901
  });
3888
3902
 
3889
3903
  // src/sending-domains.ts
3890
- import { z as z14 } from "zod";
3904
+ import { z as z15 } from "zod";
3891
3905
  var SENDING_DOMAIN_STATUSES = ["pending_dns", "verifying", "verified", "failed", "temporary_failure"];
3892
- var SendingDomainStatus = z14.enum(SENDING_DOMAIN_STATUSES);
3906
+ var SendingDomainStatus = z15.enum(SENDING_DOMAIN_STATUSES);
3893
3907
  var SENDING_DOMAIN_DNS_MODES = ["manual", "managed"];
3894
- var SendingDomainDnsMode = z14.enum(SENDING_DOMAIN_DNS_MODES);
3908
+ var SendingDomainDnsMode = z15.enum(SENDING_DOMAIN_DNS_MODES);
3895
3909
  var SENDING_DOMAIN_REGION = "eu-west-1";
3896
- var SendingDomainName = z14.string().trim().toLowerCase().max(253).regex(
3910
+ var SendingDomainName = z15.string().trim().toLowerCase().max(253).regex(
3897
3911
  /^(?=.{1,253}$)(?!-)[a-z0-9-]{1,63}(?<!-)(\.(?!-)[a-z0-9-]{1,63}(?<!-))*\.[a-z]{2,63}$/,
3898
3912
  "must be a domain such as example.com, without https:// or an @"
3899
3913
  );
3900
- var SendingDomainRecord = z14.object({
3901
- record: z14.string().max(40),
3902
- name: z14.string().max(253),
3903
- type: z14.string().max(10),
3904
- value: z14.string().max(4096),
3905
- ttl: z14.string().max(20),
3906
- status: z14.string().max(40),
3907
- priority: z14.number().int().min(0).max(65535).optional()
3914
+ var SendingDomainRecord = z15.object({
3915
+ record: z15.string().max(40),
3916
+ name: z15.string().max(253),
3917
+ type: z15.string().max(10),
3918
+ value: z15.string().max(4096),
3919
+ ttl: z15.string().max(20),
3920
+ status: z15.string().max(40),
3921
+ priority: z15.number().int().min(0).max(65535).optional()
3908
3922
  });
3909
3923
  function sendingDomainRecordFullName(domain, name) {
3910
3924
  const d = domain.toLowerCase();
@@ -3917,66 +3931,66 @@ function sendingDomainRecordFullName(domain, name) {
3917
3931
  }
3918
3932
  return `${n}.${d}`;
3919
3933
  }
3920
- var SendingDomain = z14.object({
3934
+ var SendingDomain = z15.object({
3921
3935
  id: Id,
3922
- domain: z14.string(),
3923
- from_name: z14.string(),
3936
+ domain: z15.string(),
3937
+ from_name: z15.string(),
3924
3938
  from_email: Email,
3925
3939
  reply_to: Email.nullable(),
3926
3940
  status: SendingDomainStatus,
3927
3941
  dns_mode: SendingDomainDnsMode,
3928
- records: z14.array(SendingDomainRecord),
3942
+ records: z15.array(SendingDomainRecord),
3929
3943
  provider_id: Id.nullable(),
3930
3944
  checked_at: Timestamp.nullable(),
3931
3945
  verified_at: Timestamp.nullable(),
3932
- last_error: z14.string().nullable(),
3946
+ last_error: z15.string().nullable(),
3933
3947
  created_at: Timestamp,
3934
3948
  updated_at: Timestamp
3935
3949
  });
3936
3950
  var SenderFields = {
3937
- from_name: z14.string().trim().min(1).max(120),
3951
+ from_name: z15.string().trim().min(1).max(120),
3938
3952
  from_email: Email,
3939
3953
  reply_to: Email.nullable().optional()
3940
3954
  };
3941
3955
  function senderOnDomain(input, ctx) {
3942
3956
  const at = input.from_email.lastIndexOf("@");
3943
3957
  if (at < 0 || input.from_email.slice(at + 1).toLowerCase() !== input.domain) {
3944
- ctx.addIssue({ code: z14.ZodIssueCode.custom, path: ["from_email"], message: `must be an address on ${input.domain}` });
3958
+ ctx.addIssue({ code: z15.ZodIssueCode.custom, path: ["from_email"], message: `must be an address on ${input.domain}` });
3945
3959
  }
3946
3960
  }
3947
- var SendingDomainCreate = z14.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
3948
- 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");
3961
+ var SendingDomainCreate = z15.object({ domain: SendingDomainName, ...SenderFields }).superRefine(senderOnDomain);
3962
+ 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");
3949
3963
 
3950
3964
  // src/contacts.ts
3951
- import { z as z15 } from "zod";
3952
- var Topic = z15.object({
3965
+ import { z as z16 } from "zod";
3966
+ var Topic = z16.object({
3953
3967
  id: Id,
3954
3968
  slug: Slug,
3955
- name: z15.string().min(1).max(120),
3969
+ name: z16.string().min(1).max(120),
3956
3970
  /** Shown on the hosted preference page. */
3957
- description: z15.string().max(1e3).nullable(),
3971
+ description: z16.string().max(1e3).nullable(),
3958
3972
  /** Translations of `name` and `description` per locale, for the hosted page. */
3959
- translations: z15.record(
3960
- z15.object({ name: z15.string().min(1).max(120), description: z15.string().max(1e3).nullable() })
3973
+ translations: z16.record(
3974
+ z16.object({ name: z16.string().min(1).max(120), description: z16.string().max(1e3).nullable() })
3961
3975
  ),
3962
3976
  created_at: Timestamp,
3963
3977
  updated_at: Timestamp
3964
3978
  });
3965
- var TopicCreate = z15.object({
3979
+ var TopicCreate = z16.object({
3966
3980
  slug: Slug,
3967
- name: z15.string().min(1).max(120),
3968
- description: z15.string().max(1e3).optional(),
3981
+ name: z16.string().min(1).max(120),
3982
+ description: z16.string().max(1e3).optional(),
3969
3983
  translations: Topic.shape.translations.optional()
3970
3984
  });
3971
3985
  var TopicUpdate = TopicCreate.omit({ slug: true }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
3972
- var Contact = z15.object({
3986
+ var Contact = z16.object({
3973
3987
  id: Id,
3974
- external_id: z15.string().min(1).max(255).nullable(),
3988
+ external_id: z16.string().min(1).max(255).nullable(),
3975
3989
  /** Stored lowercased, unique per workspace. */
3976
3990
  email: Email,
3977
- first_name: z15.string().max(200).nullable(),
3978
- last_name: z15.string().max(200).nullable(),
3979
- locale: z15.string().min(2).max(35).nullable(),
3991
+ first_name: z16.string().max(200).nullable(),
3992
+ last_name: z16.string().max(200).nullable(),
3993
+ locale: z16.string().min(2).max(35).nullable(),
3980
3994
  /**
3981
3995
  * The person's own time zone, an IANA name such as `Europe/Berlin` (A1).
3982
3996
  * Every wall clock an automation waits for is read in it, falling back to the
@@ -3984,65 +3998,65 @@ var Contact = z15.object({
3984
3998
  */
3985
3999
  timezone: TimezoneName.nullable(),
3986
4000
  properties: Properties,
3987
- topics: z15.array(Slug),
4001
+ topics: z16.array(Slug),
3988
4002
  /** The slugs of the contact's tags (S4). */
3989
- tags: z15.array(Slug),
4003
+ tags: z16.array(Slug),
3990
4004
  created_at: Timestamp,
3991
4005
  updated_at: Timestamp
3992
4006
  });
3993
- var ContactUpsert = z15.object({
3994
- external_id: z15.string().min(1).max(255).optional(),
4007
+ var ContactUpsert = z16.object({
4008
+ external_id: z16.string().min(1).max(255).optional(),
3995
4009
  email: Email.optional(),
3996
- first_name: z15.string().max(200).nullable().optional(),
3997
- last_name: z15.string().max(200).nullable().optional(),
3998
- locale: z15.string().min(2).max(35).nullable().optional(),
4010
+ first_name: z16.string().max(200).nullable().optional(),
4011
+ last_name: z16.string().max(200).nullable().optional(),
4012
+ locale: z16.string().min(2).max(35).nullable().optional(),
3999
4013
  timezone: TimezoneName.nullable().optional(),
4000
4014
  properties: Properties.optional(),
4001
- topics: z15.array(Slug).max(100).optional()
4015
+ topics: z16.array(Slug).max(100).optional()
4002
4016
  }).refine((v) => v.external_id !== void 0 || v.email !== void 0, {
4003
4017
  message: "external_id or email is required",
4004
4018
  path: ["email"]
4005
4019
  });
4006
- var ContactUpsertResult = z15.object({
4020
+ var ContactUpsertResult = z16.object({
4007
4021
  contact: Contact,
4008
- created: z15.boolean()
4022
+ created: z16.boolean()
4009
4023
  });
4010
4024
  var ContactListQuery = PageQuery.extend({
4011
- email: z15.string().min(1).max(254).optional(),
4012
- external_id: z15.string().min(1).max(255).optional(),
4025
+ email: z16.string().min(1).max(254).optional(),
4026
+ external_id: z16.string().min(1).max(255).optional(),
4013
4027
  topic: Slug.optional()
4014
4028
  });
4015
- var ContactErased = z15.object({
4016
- ok: z15.literal(true),
4017
- erased_messages: z15.number().int().min(0),
4018
- erased_recipients: z15.number().int().min(0),
4019
- suppressions_kept: z15.number().int().min(0)
4029
+ var ContactErased = z16.object({
4030
+ ok: z16.literal(true),
4031
+ erased_messages: z16.number().int().min(0),
4032
+ erased_recipients: z16.number().int().min(0),
4033
+ suppressions_kept: z16.number().int().min(0)
4020
4034
  });
4021
4035
  var SUPPRESSION_REASONS = ["unsubscribed", "bounced", "complained", "manual"];
4022
- var SuppressionReason = z15.enum(SUPPRESSION_REASONS);
4023
- var Suppression = z15.object({
4036
+ var SuppressionReason = z16.enum(SUPPRESSION_REASONS);
4037
+ var Suppression = z16.object({
4024
4038
  id: Id,
4025
4039
  email: Email,
4026
4040
  reason: SuppressionReason,
4027
4041
  topic: Slug.nullable(),
4028
4042
  source_message_id: Id.nullable(),
4029
- note: z15.string().max(1e3).nullable(),
4043
+ note: z16.string().max(1e3).nullable(),
4030
4044
  created_at: Timestamp
4031
4045
  });
4032
- var SuppressionCreate = z15.object({
4046
+ var SuppressionCreate = z16.object({
4033
4047
  email: Email,
4034
- reason: z15.enum(["manual", "unsubscribed"]),
4048
+ reason: z16.enum(["manual", "unsubscribed"]),
4035
4049
  topic: Slug.nullable().optional(),
4036
- note: z15.string().max(1e3).optional()
4050
+ note: z16.string().max(1e3).optional()
4037
4051
  });
4038
4052
  var SuppressionListQuery = PageQuery.extend({
4039
- email: z15.string().min(1).max(254).optional(),
4053
+ email: z16.string().min(1).max(254).optional(),
4040
4054
  reason: SuppressionReason.optional(),
4041
4055
  topic: Slug.optional()
4042
4056
  });
4043
4057
 
4044
4058
  // src/webhooks.ts
4045
- import { z as z16 } from "zod";
4059
+ import { z as z17 } from "zod";
4046
4060
  var WEBHOOK_EVENT_TYPES = [
4047
4061
  "message.sent",
4048
4062
  "message.failed",
@@ -4086,23 +4100,23 @@ var WEBHOOK_EVENT_TYPES = [
4086
4100
  "template.updated",
4087
4101
  "template.deleted"
4088
4102
  ];
4089
- var WebhookEventType = z16.enum(WEBHOOK_EVENT_TYPES);
4090
- var MessageEventBase = z16.object({
4103
+ var WebhookEventType = z17.enum(WEBHOOK_EVENT_TYPES);
4104
+ var MessageEventBase = z17.object({
4091
4105
  message_id: Id,
4092
4106
  mailing_id: Id.nullable(),
4093
4107
  mailing_metadata: MailingMetadata.nullable(),
4094
4108
  recipient_id: Id.nullable(),
4095
4109
  contact_id: Id.nullable(),
4096
- external_id: z16.string().nullable(),
4110
+ external_id: z17.string().nullable(),
4097
4111
  email: Email,
4098
- subject: z16.string(),
4112
+ subject: z17.string(),
4099
4113
  topic: Slug.nullable(),
4100
- provider_message_id: z16.string().nullable(),
4101
- is_test: z16.boolean()
4114
+ provider_message_id: z17.string().nullable(),
4115
+ is_test: z17.boolean()
4102
4116
  });
4103
4117
  var MessageSentData = MessageEventBase.extend({
4104
4118
  /** The final HTML as sent, so the client can archive it beside its own records. */
4105
- html: z16.string(),
4119
+ html: z17.string(),
4106
4120
  sent_at: Timestamp,
4107
4121
  /**
4108
4122
  * The choice each insertion made (see `Message.insertions`); absent or null
@@ -4113,20 +4127,20 @@ var MessageSentData = MessageEventBase.extend({
4113
4127
  insertions: InsertionChoices.nullish()
4114
4128
  });
4115
4129
  var MessageFailedData = MessageEventBase.extend({
4116
- error: z16.string(),
4130
+ error: z17.string(),
4117
4131
  /** False when the provider rejected permanently; the recipient will not be retried. */
4118
- retryable: z16.boolean(),
4132
+ retryable: z17.boolean(),
4119
4133
  failed_at: Timestamp
4120
4134
  });
4121
4135
  var UNSUBSCRIBE_SOURCES = ["hosted_page", "one_click", "api", "dashboard", "signup_form"];
4122
- var ContactUnsubscribedData = z16.object({
4136
+ var ContactUnsubscribedData = z17.object({
4123
4137
  contact_id: Id.nullable(),
4124
- external_id: z16.string().nullable(),
4138
+ external_id: z17.string().nullable(),
4125
4139
  email: Email,
4126
4140
  /** The topic unsubscribed from; null means every topic. */
4127
4141
  topic: Slug.nullable(),
4128
4142
  mailing_id: Id.nullable(),
4129
- source: z16.enum(UNSUBSCRIBE_SOURCES),
4143
+ source: z17.enum(UNSUBSCRIBE_SOURCES),
4130
4144
  unsubscribed_at: Timestamp
4131
4145
  });
4132
4146
  var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: true }).extend({
@@ -4135,142 +4149,142 @@ var ContactResubscribedData = ContactUnsubscribedData.omit({ unsubscribed_at: tr
4135
4149
  * breaker undid a `bounced` block it judged false (a `contact.bounced` for the
4136
4150
  * same address and mailing went out before); `topic` is null.
4137
4151
  */
4138
- source: z16.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4152
+ source: z17.enum([...UNSUBSCRIBE_SOURCES, "bounce_reverted"]),
4139
4153
  resubscribed_at: Timestamp
4140
4154
  });
4141
- var ContactBouncedData = z16.object({
4155
+ var ContactBouncedData = z17.object({
4142
4156
  contact_id: Id.nullable(),
4143
- external_id: z16.string().nullable(),
4157
+ external_id: z17.string().nullable(),
4144
4158
  email: Email,
4145
4159
  /** `bounced` for a hard bounce, `complained` for a spam complaint. */
4146
- reason: z16.enum(["bounced", "complained"]),
4160
+ reason: z17.enum(["bounced", "complained"]),
4147
4161
  message_id: Id.nullable(),
4148
- diagnostic: z16.string().nullable(),
4162
+ diagnostic: z17.string().nullable(),
4149
4163
  bounced_at: Timestamp
4150
4164
  });
4151
- var MailingFinishedData = z16.object({
4165
+ var MailingFinishedData = z17.object({
4152
4166
  mailing_id: Id,
4153
4167
  mailing_metadata: MailingMetadata,
4154
- status: z16.enum(["sent", "partially_failed", "cancelled"]),
4168
+ status: z17.enum(["sent", "partially_failed", "cancelled"]),
4155
4169
  counts: MailingCounts,
4156
4170
  finished_at: Timestamp
4157
4171
  });
4158
- var ContactSubscribedData = z16.object({
4172
+ var ContactSubscribedData = z17.object({
4159
4173
  contact_id: Id,
4160
- external_id: z16.string().nullable(),
4174
+ external_id: z17.string().nullable(),
4161
4175
  email: Email,
4162
- topics: z16.array(Slug),
4163
- source: z16.enum(["signup_form", "api", "dashboard", "automation"]),
4176
+ topics: z17.array(Slug),
4177
+ source: z17.enum(["signup_form", "api", "dashboard", "automation"]),
4164
4178
  signup_form_id: Id.nullable(),
4165
- signup_form_version: z16.number().int().min(1).nullable(),
4179
+ signup_form_version: z17.number().int().min(1).nullable(),
4166
4180
  subscribed_at: Timestamp
4167
4181
  });
4168
- var ImportFinishedData = z16.object({
4182
+ var ImportFinishedData = z17.object({
4169
4183
  import_id: Id,
4170
- status: z16.enum(["completed", "cancelled", "failed"]),
4184
+ status: z17.enum(["completed", "cancelled", "failed"]),
4171
4185
  result: ImportReport.nullable(),
4172
- error: z16.string().nullable(),
4186
+ error: z17.string().nullable(),
4173
4187
  finished_at: Timestamp
4174
4188
  });
4175
- var MailingScheduledData = z16.object({
4189
+ var MailingScheduledData = z17.object({
4176
4190
  mailing_id: Id,
4177
4191
  mailing_metadata: MailingMetadata,
4178
4192
  scheduled_at: Timestamp.nullable()
4179
4193
  });
4180
- var MailingStartedData = z16.object({
4194
+ var MailingStartedData = z17.object({
4181
4195
  mailing_id: Id,
4182
4196
  mailing_metadata: MailingMetadata,
4183
- trigger: z16.enum(["send", "schedule"]),
4184
- recipients: z16.number().int().min(0),
4197
+ trigger: z17.enum(["send", "schedule"]),
4198
+ recipients: z17.number().int().min(0),
4185
4199
  started_at: Timestamp
4186
4200
  });
4187
- var MailingScheduleFailedData = z16.object({
4201
+ var MailingScheduleFailedData = z17.object({
4188
4202
  mailing_id: Id,
4189
4203
  mailing_metadata: MailingMetadata,
4190
- code: z16.string(),
4191
- message: z16.string(),
4204
+ code: z17.string(),
4205
+ message: z17.string(),
4192
4206
  failed_at: Timestamp
4193
4207
  });
4194
- var MailingAbWinnerSelectedData = z16.object({
4208
+ var MailingAbWinnerSelectedData = z17.object({
4195
4209
  mailing_id: Id,
4196
4210
  mailing_metadata: MailingMetadata,
4197
- winner: z16.string(),
4198
- decided_by: z16.enum(["metric", "manual"]),
4199
- variants: z16.array(VariantAnalytics),
4211
+ winner: z17.string(),
4212
+ decided_by: z17.enum(["metric", "manual"]),
4213
+ variants: z17.array(VariantAnalytics),
4200
4214
  decided_at: Timestamp
4201
4215
  });
4202
- var ContactTaggedData = z16.object({
4216
+ var ContactTaggedData = z17.object({
4203
4217
  contact_id: Id,
4204
- external_id: z16.string().nullable(),
4218
+ external_id: z17.string().nullable(),
4205
4219
  email: Email,
4206
4220
  /** Only the tags the contact did not already have. */
4207
- tags: z16.array(Slug).min(1),
4208
- source: z16.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4221
+ tags: z17.array(Slug).min(1),
4222
+ source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4209
4223
  tagged_at: Timestamp
4210
4224
  });
4211
- var ContactUpdatedData = z16.object({
4225
+ var ContactUpdatedData = z17.object({
4212
4226
  contact_id: Id,
4213
- external_id: z16.string().nullable(),
4227
+ external_id: z17.string().nullable(),
4214
4228
  email: Email,
4215
- changed: z16.array(z16.string()).min(1),
4229
+ changed: z17.array(z17.string()).min(1),
4216
4230
  properties: Properties,
4217
- source: z16.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4231
+ source: z17.enum(["api", "dashboard", "signup_form", "import", "automation"]),
4218
4232
  updated_at: Timestamp
4219
4233
  });
4220
- var AutomationRunEventBase = z16.object({
4234
+ var AutomationRunEventBase = z17.object({
4221
4235
  automation_id: Id,
4222
- automation_name: z16.string(),
4236
+ automation_name: z17.string(),
4223
4237
  run_id: Id,
4224
- version: z16.number().int().min(1),
4238
+ version: z17.number().int().min(1),
4225
4239
  contact_id: Id,
4226
- external_id: z16.string().nullable(),
4240
+ external_id: z17.string().nullable(),
4227
4241
  email: Email
4228
4242
  });
4229
4243
  var AutomationRunStartedData = AutomationRunEventBase.extend({
4230
4244
  /** What let them in: a trigger kind, or `manual` for an explicit enrolment. */
4231
- trigger_kind: z16.string(),
4245
+ trigger_kind: z17.string(),
4232
4246
  entered_at: Timestamp
4233
4247
  });
4234
4248
  var AutomationRunCompletedData = AutomationRunEventBase.extend({
4235
- last_step_id: z16.string().nullable(),
4249
+ last_step_id: z17.string().nullable(),
4236
4250
  completed_at: Timestamp
4237
4251
  });
4238
4252
  var AutomationRunExitedData = AutomationRunEventBase.extend({
4239
4253
  reason: AutomationEndReason,
4240
- step_id: z16.string().nullable(),
4254
+ step_id: z17.string().nullable(),
4241
4255
  exited_at: Timestamp
4242
4256
  });
4243
4257
  var AutomationRunFailedData = AutomationRunEventBase.extend({
4244
- reason: z16.string(),
4245
- step_id: z16.string().nullable(),
4258
+ reason: z17.string(),
4259
+ step_id: z17.string().nullable(),
4246
4260
  failed_at: Timestamp
4247
4261
  });
4248
4262
  var AutomationWebhookData = AutomationRunEventBase.extend({
4249
- step_id: z16.string(),
4263
+ step_id: z17.string(),
4250
4264
  /** The step's own label, when it was given one, so a receiver can branch on a name. */
4251
- step_label: z16.string().nullable(),
4265
+ step_label: z17.string().nullable(),
4252
4266
  /** Whatever the step carries, verbatim. Null when it carries nothing. */
4253
4267
  payload: JsonValue.nullable(),
4254
4268
  fired_at: Timestamp
4255
4269
  });
4256
- var TemplateEventBase = z16.object({
4270
+ var TemplateEventBase = z17.object({
4257
4271
  template_id: Id,
4258
- name: z16.string().min(1).max(200),
4259
- version: z16.number().int().min(1),
4260
- source: z16.enum(["api", "dashboard", "mjml_import"])
4272
+ name: z17.string().min(1).max(200),
4273
+ version: z17.number().int().min(1),
4274
+ source: z17.enum(["api", "dashboard", "mjml_import"])
4261
4275
  });
4262
4276
  var TemplateCreatedData = TemplateEventBase.extend({ created_at: Timestamp });
4263
- var TemplateUpdatedData = TemplateEventBase.extend({ archived: z16.boolean(), updated_at: Timestamp });
4277
+ var TemplateUpdatedData = TemplateEventBase.extend({ archived: z17.boolean(), updated_at: Timestamp });
4264
4278
  var TemplateDeletedData = TemplateEventBase.extend({ deleted_at: Timestamp });
4265
- var envelope = (type, data) => z16.object({
4279
+ var envelope = (type, data) => z17.object({
4266
4280
  /** Unique per event: a receiver deduplicates on it (deliveries may repeat). */
4267
4281
  id: Id,
4268
- type: z16.literal(type),
4282
+ type: z17.literal(type),
4269
4283
  created_at: Timestamp,
4270
4284
  workspace_id: Id,
4271
4285
  data
4272
4286
  });
4273
- var WebhookEvent = z16.discriminatedUnion("type", [
4287
+ var WebhookEvent = z17.discriminatedUnion("type", [
4274
4288
  envelope("message.sent", MessageSentData),
4275
4289
  envelope("message.failed", MessageFailedData),
4276
4290
  envelope("contact.unsubscribed", ContactUnsubscribedData),
@@ -4294,16 +4308,16 @@ var WebhookEvent = z16.discriminatedUnion("type", [
4294
4308
  envelope("template.updated", TemplateUpdatedData),
4295
4309
  envelope("template.deleted", TemplateDeletedData)
4296
4310
  ]);
4297
- var WebhookEndpoint = z16.object({
4311
+ var WebhookEndpoint = z17.object({
4298
4312
  id: Id,
4299
- url: z16.string().url(),
4300
- description: z16.string().max(500).nullable(),
4301
- events: z16.array(WebhookEventType).min(1),
4302
- enabled: z16.boolean(),
4313
+ url: z17.string().url(),
4314
+ description: z17.string().max(500).nullable(),
4315
+ events: z17.array(WebhookEventType).min(1),
4316
+ enabled: z17.boolean(),
4303
4317
  created_at: Timestamp,
4304
4318
  updated_at: Timestamp
4305
4319
  });
4306
- var WebhookUrl = z16.string().url().refine((u) => {
4320
+ var WebhookUrl = z17.string().url().refine((u) => {
4307
4321
  try {
4308
4322
  const url = new URL(u);
4309
4323
  if (url.protocol === "https:") return true;
@@ -4312,35 +4326,35 @@ var WebhookUrl = z16.string().url().refine((u) => {
4312
4326
  return false;
4313
4327
  }
4314
4328
  }, "must be https (http only for localhost)");
4315
- var WebhookEndpointCreate = z16.object({
4329
+ var WebhookEndpointCreate = z17.object({
4316
4330
  url: WebhookUrl,
4317
- description: z16.string().max(500).optional(),
4318
- events: z16.array(WebhookEventType).min(1),
4319
- enabled: z16.boolean().optional()
4331
+ description: z17.string().max(500).optional(),
4332
+ events: z17.array(WebhookEventType).min(1),
4333
+ enabled: z17.boolean().optional()
4320
4334
  });
4321
- var WebhookEndpointUpdate = z16.object({
4335
+ var WebhookEndpointUpdate = z17.object({
4322
4336
  url: WebhookUrl,
4323
- description: z16.string().max(500).nullable(),
4324
- events: z16.array(WebhookEventType).min(1),
4325
- enabled: z16.boolean()
4337
+ description: z17.string().max(500).nullable(),
4338
+ events: z17.array(WebhookEventType).min(1),
4339
+ enabled: z17.boolean()
4326
4340
  }).partial().refine((v) => Object.keys(v).length > 0, "at least one field");
4327
- var WebhookEndpointWithSecret = z16.object({
4341
+ var WebhookEndpointWithSecret = z17.object({
4328
4342
  endpoint: WebhookEndpoint,
4329
- secret: z16.string().min(32)
4343
+ secret: z17.string().min(32)
4330
4344
  });
4331
4345
  var WEBHOOK_DELIVERY_STATUSES = ["pending", "succeeded", "failed"];
4332
- var WebhookDeliveryStatus = z16.enum(WEBHOOK_DELIVERY_STATUSES);
4346
+ var WebhookDeliveryStatus = z17.enum(WEBHOOK_DELIVERY_STATUSES);
4333
4347
  var WEBHOOK_MAX_ATTEMPTS = 8;
4334
4348
  var WEBHOOK_RETRY_DELAYS_SECONDS = [30, 120, 600, 1800, 3600, 7200, 21600];
4335
- var WebhookDelivery = z16.object({
4349
+ var WebhookDelivery = z17.object({
4336
4350
  id: Id,
4337
4351
  endpoint_id: Id,
4338
4352
  event_id: Id,
4339
4353
  event_type: WebhookEventType,
4340
4354
  status: WebhookDeliveryStatus,
4341
- attempts: z16.number().int().min(0),
4342
- last_status_code: z16.number().int().min(100).max(599).nullable(),
4343
- last_error: z16.string().nullable(),
4355
+ attempts: z17.number().int().min(0),
4356
+ last_status_code: z17.number().int().min(100).max(599).nullable(),
4357
+ last_error: z17.string().nullable(),
4344
4358
  next_attempt_at: Timestamp.nullable(),
4345
4359
  delivered_at: Timestamp.nullable(),
4346
4360
  created_at: Timestamp
@@ -4349,7 +4363,7 @@ var WebhookDeliveryListQuery = PageQuery.extend({
4349
4363
  status: WebhookDeliveryStatus.optional(),
4350
4364
  event_type: WebhookEventType.optional()
4351
4365
  });
4352
- var WebhookDeliveryParams = z16.object({ id: Id, delivery_id: Id });
4366
+ var WebhookDeliveryParams = z17.object({ id: Id, delivery_id: Id });
4353
4367
 
4354
4368
  // src/webhook-signing.ts
4355
4369
  var WEBHOOK_SIGNATURE_HEADER = "x-mail-signature";
@@ -4416,94 +4430,99 @@ async function verifyWebhook(input) {
4416
4430
  }
4417
4431
 
4418
4432
  // src/billing.ts
4419
- import { z as z17 } from "zod";
4433
+ import { z as z18 } from "zod";
4420
4434
  var PLAN_IDS = ["free", "starter", "growth", "design_partner"];
4421
- var PlanId = z17.enum(PLAN_IDS);
4422
- var PlanLimits = z17.object({
4423
- monthly_messages: z17.number().int().min(0).nullable(),
4424
- contacts: z17.number().int().min(0).nullable(),
4425
- members: z17.number().int().min(1).nullable(),
4426
- providers: z17.number().int().min(1).nullable(),
4427
- webhook_endpoints: z17.number().int().min(0).nullable(),
4435
+ var PlanId = z18.enum(PLAN_IDS);
4436
+ var PlanLimits = z18.object({
4437
+ monthly_messages: z18.number().int().min(0).nullable(),
4438
+ contacts: z18.number().int().min(0).nullable(),
4439
+ members: z18.number().int().min(1).nullable(),
4440
+ providers: z18.number().int().min(1).nullable(),
4441
+ webhook_endpoints: z18.number().int().min(0).nullable(),
4428
4442
  /** Automations that may be live (active or paused) at once (A1). */
4429
- active_automations: z17.number().int().min(0).nullable(),
4443
+ active_automations: z18.number().int().min(0).nullable(),
4430
4444
  /** Steps one automation may hold. Null is the flow's own cap, not unlimited. */
4431
- automation_steps: z17.number().int().min(1).nullable(),
4445
+ automation_steps: z18.number().int().min(1).nullable(),
4432
4446
  /** Own domains Lumitra Mail sends from (managed sending domains); 0 when the plan has none. */
4433
- sending_domains: z17.number().int().min(0).nullable()
4447
+ sending_domains: z18.number().int().min(0).nullable()
4434
4448
  });
4435
- var PlanFeatures = z17.object({
4449
+ var PlanFeatures = z18.object({
4436
4450
  /** A/B tests of subject and content on a mailing (S4). */
4437
- ab_testing: z17.boolean(),
4451
+ ab_testing: z18.boolean(),
4438
4452
  /** Open and click tracking, still off until a workspace turns it on (`settings.tracking_enabled`). */
4439
- tracking: z17.boolean(),
4453
+ tracking: z18.boolean(),
4440
4454
  /** Automations: flows a person walks through step by step (A1). */
4441
- automations: z17.boolean()
4455
+ automations: z18.boolean()
4442
4456
  });
4443
4457
  var PLAN_FEATURES = ["ab_testing", "tracking", "automations"];
4444
- var Plan = z17.object({
4458
+ var Plan = z18.object({
4445
4459
  id: PlanId,
4446
- name: z17.string().min(1),
4460
+ name: z18.string().min(1),
4447
4461
  /** Price in the smallest currency unit per month; null for plans not sold. */
4448
- monthly_price_cents: z17.number().int().min(0).nullable(),
4449
- currency: z17.string().length(3),
4462
+ monthly_price_cents: z18.number().int().min(0).nullable(),
4463
+ currency: z18.string().length(3),
4450
4464
  limits: PlanLimits,
4451
4465
  features: PlanFeatures
4452
4466
  });
4453
- var CatalogPlan = Plan.extend({ sellable: z17.boolean() });
4454
- var Subscription = z17.object({
4467
+ var CatalogPlan = Plan.extend({ sellable: z18.boolean() });
4468
+ var Subscription = z18.object({
4455
4469
  workspace_id: Id,
4456
4470
  plan: PlanId,
4457
- status: z17.enum(["active", "trialing", "past_due", "cancelled"]),
4471
+ status: z18.enum(["active", "trialing", "past_due", "cancelled"]),
4458
4472
  current_period_start: Timestamp,
4459
4473
  current_period_end: Timestamp,
4460
- cancel_at_period_end: z17.boolean(),
4474
+ cancel_at_period_end: z18.boolean(),
4461
4475
  /**
4462
4476
  * A design partner outside billing (plan `design_partner`, no limits, no
4463
4477
  * checkout). Set only by an operator, never through the API.
4464
4478
  */
4465
- billing_exempt: z17.boolean(),
4479
+ billing_exempt: z18.boolean(),
4466
4480
  /**
4467
4481
  * Own sending domains bought on top of the plan's included ones (the
4468
4482
  * add-on), each a monthly charge on the same subscription. 0 without the
4469
4483
  * add-on; the usage limit `sending_domains` is the plan's plus these.
4470
4484
  */
4471
- extra_sending_domains: z17.number().int().min(0)
4485
+ extra_sending_domains: z18.number().int().min(0)
4472
4486
  });
4473
- var BillingAddons = z17.object({
4474
- sending_domain: z17.object({
4475
- monthly_price_cents: z17.number().int().min(0),
4476
- currency: z17.string().length(3),
4477
- sellable: z17.boolean()
4487
+ var BillingAddons = z18.object({
4488
+ sending_domain: z18.object({
4489
+ monthly_price_cents: z18.number().int().min(0),
4490
+ currency: z18.string().length(3),
4491
+ sellable: z18.boolean()
4478
4492
  })
4479
4493
  });
4480
4494
  var MAX_EXTRA_SENDING_DOMAINS = 100;
4481
- var ExtraSendingDomainsUpdate = z17.object({ quantity: z17.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
4495
+ var ExtraSendingDomainsUpdate = z18.object({ quantity: z18.number().int().min(0).max(MAX_EXTRA_SENDING_DOMAINS) });
4482
4496
  var USAGE_METRICS = ["messages", "contacts", "members", "providers", "webhook_endpoints", "active_automations", "sending_domains"];
4483
- var UsageMetric = z17.enum(USAGE_METRICS);
4497
+ var UsageMetric = z18.enum(USAGE_METRICS);
4484
4498
  var USAGE_WARNING_RATIO = 0.8;
4485
- var UsageWarning = z17.object({
4499
+ var UsageWarning = z18.object({
4486
4500
  metric: UsageMetric,
4487
- used: z17.number().int().min(0),
4488
- limit: z17.number().int().min(0),
4501
+ used: z18.number().int().min(0),
4502
+ limit: z18.number().int().min(0),
4489
4503
  /** `approaching`: at or above USAGE_WARNING_RATIO of the limit; `reached`: at or above the limit. */
4490
- level: z17.enum(["approaching", "reached"])
4504
+ level: z18.enum(["approaching", "reached"])
4491
4505
  });
4492
- var Usage = z17.object({
4506
+ var TermsStatus = z18.object({ accepted_version: z18.string().nullable(), current_version: z18.string() });
4507
+ var Usage = z18.object({
4493
4508
  plan: PlanId,
4494
4509
  period_start: Timestamp,
4495
4510
  period_end: Timestamp,
4496
- metrics: z17.record(UsageMetric, z17.object({ used: z17.number().int().min(0), limit: z17.number().int().min(0).nullable() })),
4497
- warnings: z17.array(UsageWarning)
4498
- });
4499
- var CheckoutRequest = z17.object({
4500
- plan: z17.enum(["starter", "growth"]),
4501
- success_url: z17.string().url(),
4502
- cancel_url: z17.string().url()
4503
- });
4504
- var CheckoutSession = z17.object({ url: z17.string().url() });
4505
- var PortalRequest = z17.object({ return_url: z17.string().url() });
4506
- var PortalSession = z17.object({ url: z17.string().url() });
4511
+ metrics: z18.record(UsageMetric, z18.object({ used: z18.number().int().min(0), limit: z18.number().int().min(0).nullable() })),
4512
+ warnings: z18.array(UsageWarning),
4513
+ terms: TermsStatus
4514
+ });
4515
+ var TermsAcceptance = z18.object({ accept_terms: AcceptTerms });
4516
+ var CheckoutRequest = z18.object({
4517
+ plan: z18.enum(["starter", "growth"]),
4518
+ success_url: z18.string().url(),
4519
+ cancel_url: z18.string().url(),
4520
+ /** The buyer accepted the terms of service and the processing agreement of this version. */
4521
+ accept_terms: AcceptTerms
4522
+ });
4523
+ var CheckoutSession = z18.object({ url: z18.string().url() });
4524
+ var PortalRequest = z18.object({ return_url: z18.string().url() });
4525
+ var PortalSession = z18.object({ url: z18.string().url() });
4507
4526
  var USAGE_WARNING_HEADER = "x-mail-usage-warning";
4508
4527
  function formatUsageWarningHeader(warnings) {
4509
4528
  if (warnings.length === 0) return null;
@@ -4523,7 +4542,7 @@ function parseUsageWarningHeader(value) {
4523
4542
  }
4524
4543
 
4525
4544
  // src/routes.ts
4526
- import { z as z18 } from "zod";
4545
+ import { z as z19 } from "zod";
4527
4546
  var list = (item) => page(item);
4528
4547
  var foundationRoutes = {
4529
4548
  "workspaces.create": {
@@ -4769,7 +4788,7 @@ var templateRoutes = {
4769
4788
  path: "/v1/templates/:id/export",
4770
4789
  params: IdParams,
4771
4790
  query: TemplateExportQuery,
4772
- response: z18.string(),
4791
+ response: z19.string(),
4773
4792
  responseType: "text",
4774
4793
  status: 200,
4775
4794
  access: "read",
@@ -5149,7 +5168,7 @@ var sendingRoutes = {
5149
5168
  path: "/v1/mailings/:id/export",
5150
5169
  params: IdParams,
5151
5170
  query: MailingExportQuery,
5152
- response: z18.string(),
5171
+ response: z19.string(),
5153
5172
  responseType: "text",
5154
5173
  status: 200,
5155
5174
  access: "read",
@@ -5416,7 +5435,7 @@ var platformRoutes = {
5416
5435
  "contactProperties.list": {
5417
5436
  method: "GET",
5418
5437
  path: "/v1/contact-properties",
5419
- response: z18.object({ data: z18.array(ContactPropertyDefinition) }),
5438
+ response: z19.object({ data: z19.array(ContactPropertyDefinition) }),
5420
5439
  status: 200,
5421
5440
  access: "read",
5422
5441
  phase: "S4"
@@ -5715,7 +5734,7 @@ var billingRoutes = {
5715
5734
  "billing.plans": {
5716
5735
  method: "GET",
5717
5736
  path: "/v1/billing/plans",
5718
- response: z18.object({ data: z18.array(CatalogPlan), addons: BillingAddons }),
5737
+ response: z19.object({ data: z19.array(CatalogPlan), addons: BillingAddons }),
5719
5738
  status: 200,
5720
5739
  access: "read",
5721
5740
  phase: "S5"
@@ -5755,6 +5774,15 @@ var billingRoutes = {
5755
5774
  status: 200,
5756
5775
  access: "admin",
5757
5776
  phase: "S5"
5777
+ },
5778
+ "billing.acceptTerms": {
5779
+ method: "POST",
5780
+ path: "/v1/billing/terms",
5781
+ body: TermsAcceptance,
5782
+ response: TermsStatus,
5783
+ status: 200,
5784
+ access: "admin",
5785
+ phase: "S5"
5758
5786
  }
5759
5787
  };
5760
5788
  var inviteRoutes = {
@@ -5866,7 +5894,7 @@ var automationRoutes = {
5866
5894
  method: "POST",
5867
5895
  path: "/v1/automations/:id/pause",
5868
5896
  params: IdParams,
5869
- body: z18.object({}).strict(),
5897
+ body: z19.object({}).strict(),
5870
5898
  response: Automation,
5871
5899
  status: 200,
5872
5900
  access: "write",
@@ -5876,7 +5904,7 @@ var automationRoutes = {
5876
5904
  method: "POST",
5877
5905
  path: "/v1/automations/:id/resume",
5878
5906
  params: IdParams,
5879
- body: z18.object({}).strict(),
5907
+ body: z19.object({}).strict(),
5880
5908
  response: Automation,
5881
5909
  status: 200,
5882
5910
  access: "write",
@@ -5886,7 +5914,7 @@ var automationRoutes = {
5886
5914
  method: "POST",
5887
5915
  path: "/v1/automations/:id/archive",
5888
5916
  params: IdParams,
5889
- body: z18.object({}).strict(),
5917
+ body: z19.object({}).strict(),
5890
5918
  response: Automation,
5891
5919
  status: 200,
5892
5920
  access: "write",
@@ -6066,6 +6094,7 @@ export {
6066
6094
  AbTestState,
6067
6095
  AbVariant,
6068
6096
  AbWinnerRequest,
6097
+ AcceptTerms,
6069
6098
  ApiKey,
6070
6099
  ApiKeyCreate,
6071
6100
  ApiKeyCreated,
@@ -6237,6 +6266,7 @@ export {
6237
6266
  InviteListQuery,
6238
6267
  InviteStatus,
6239
6268
  JsonValue,
6269
+ LEGAL_TERMS_VERSION,
6240
6270
  LETTER_ONLY_MERGE_FIELDS,
6241
6271
  LETTER_RECIPIENT_REFUSAL,
6242
6272
  LIST_UNSUBSCRIBE_POST_VALUE,
@@ -6483,6 +6513,8 @@ export {
6483
6513
  TemplateUpdatedData,
6484
6514
  TemplateVersion,
6485
6515
  TemplateVersionParams,
6516
+ TermsAcceptance,
6517
+ TermsStatus,
6486
6518
  TimeOfDay,
6487
6519
  Timestamp,
6488
6520
  TimezoneName,