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