nextmail 0.0.1

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.
Files changed (79) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +183 -0
  3. data/lib/nextmail/api_paths.rb +447 -0
  4. data/lib/nextmail/client.rb +81 -0
  5. data/lib/nextmail/constants.rb +1621 -0
  6. data/lib/nextmail/credentials.rb +53 -0
  7. data/lib/nextmail/decode.rb +34 -0
  8. data/lib/nextmail/defaults.rb +114 -0
  9. data/lib/nextmail/endpoint.rb +144 -0
  10. data/lib/nextmail/errors.rb +121 -0
  11. data/lib/nextmail/http.rb +172 -0
  12. data/lib/nextmail/image_crop.rb +38 -0
  13. data/lib/nextmail/languages.rb +42 -0
  14. data/lib/nextmail/pagination.rb +63 -0
  15. data/lib/nextmail/protocol.rb +221 -0
  16. data/lib/nextmail/raw_body.rb +83 -0
  17. data/lib/nextmail/request_path.rb +50 -0
  18. data/lib/nextmail/resource.rb +109 -0
  19. data/lib/nextmail/resources/account.rb +155 -0
  20. data/lib/nextmail/resources/addresses.rb +38 -0
  21. data/lib/nextmail/resources/analytics.rb +19 -0
  22. data/lib/nextmail/resources/app_host.rb +23 -0
  23. data/lib/nextmail/resources/audiences.rb +95 -0
  24. data/lib/nextmail/resources/automations.rb +125 -0
  25. data/lib/nextmail/resources/billing.rb +76 -0
  26. data/lib/nextmail/resources/bookings.rb +100 -0
  27. data/lib/nextmail/resources/branding.rb +24 -0
  28. data/lib/nextmail/resources/broadcasts.rb +102 -0
  29. data/lib/nextmail/resources/calendar.rb +153 -0
  30. data/lib/nextmail/resources/chats.rb +62 -0
  31. data/lib/nextmail/resources/connected_mailboxes.rb +35 -0
  32. data/lib/nextmail/resources/connectors.rb +75 -0
  33. data/lib/nextmail/resources/contacts.rb +197 -0
  34. data/lib/nextmail/resources/dns_connections.rb +23 -0
  35. data/lib/nextmail/resources/domains.rb +264 -0
  36. data/lib/nextmail/resources/drafts.rb +36 -0
  37. data/lib/nextmail/resources/emails.rb +120 -0
  38. data/lib/nextmail/resources/encryption.rb +19 -0
  39. data/lib/nextmail/resources/events.rb +22 -0
  40. data/lib/nextmail/resources/exports.rb +27 -0
  41. data/lib/nextmail/resources/files.rb +82 -0
  42. data/lib/nextmail/resources/follow_ups.rb +21 -0
  43. data/lib/nextmail/resources/forms.rb +112 -0
  44. data/lib/nextmail/resources/imports.rb +106 -0
  45. data/lib/nextmail/resources/keys.rb +126 -0
  46. data/lib/nextmail/resources/knowledge.rb +137 -0
  47. data/lib/nextmail/resources/labels.rb +43 -0
  48. data/lib/nextmail/resources/languages.rb +11 -0
  49. data/lib/nextmail/resources/me.rb +57 -0
  50. data/lib/nextmail/resources/members.rb +100 -0
  51. data/lib/nextmail/resources/out_of_office.rb +28 -0
  52. data/lib/nextmail/resources/provider_imports.rb +48 -0
  53. data/lib/nextmail/resources/roles.rb +39 -0
  54. data/lib/nextmail/resources/rules.rb +73 -0
  55. data/lib/nextmail/resources/security.rb +39 -0
  56. data/lib/nextmail/resources/segments.rb +31 -0
  57. data/lib/nextmail/resources/senders.rb +19 -0
  58. data/lib/nextmail/resources/sending.rb +23 -0
  59. data/lib/nextmail/resources/settings.rb +16 -0
  60. data/lib/nextmail/resources/signatures.rb +41 -0
  61. data/lib/nextmail/resources/subscriptions.rb +55 -0
  62. data/lib/nextmail/resources/support.rb +11 -0
  63. data/lib/nextmail/resources/suppressions.rb +43 -0
  64. data/lib/nextmail/resources/tasks.rb +95 -0
  65. data/lib/nextmail/resources/temp_mail.rb +67 -0
  66. data/lib/nextmail/resources/templates.rb +153 -0
  67. data/lib/nextmail/resources/threads.rb +218 -0
  68. data/lib/nextmail/resources/tools.rb +35 -0
  69. data/lib/nextmail/resources/tracking.rb +72 -0
  70. data/lib/nextmail/resources/webhooks.rb +170 -0
  71. data/lib/nextmail/resources/workspaces.rb +40 -0
  72. data/lib/nextmail/results.rb +33 -0
  73. data/lib/nextmail/transport.rb +272 -0
  74. data/lib/nextmail/update_notice.rb +69 -0
  75. data/lib/nextmail/version.rb +5 -0
  76. data/lib/nextmail/webhook.rb +82 -0
  77. data/lib/nextmail/wire.rb +102 -0
  78. data/lib/nextmail.rb +126 -0
  79. metadata +122 -0
@@ -0,0 +1,1621 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Nextmail
4
+ ADDRESS_CHECK_REASONS = {
5
+ INVALID_SYNTAX: "invalid_syntax",
6
+ DOMAIN_NOT_FOUND: "domain_not_found",
7
+ NO_MAIL_SERVER: "no_mail_server",
8
+ NULL_MX: "null_mx",
9
+ NO_MX_RECORD: "no_mx_record",
10
+ DNS_UNREACHABLE: "dns_unreachable",
11
+ DISPOSABLE: "disposable",
12
+ ROLE_ADDRESS: "role_address",
13
+ TYPO_SUSPECTED: "typo_suspected",
14
+ SUPPRESSED: "suppressed",
15
+ BOUNCED_BEFORE: "bounced_before",
16
+ MAILBOX_NOT_FOUND: "mailbox_not_found",
17
+ MAILBOX_UNCERTAIN: "mailbox_uncertain",
18
+ RANDOM_INPUT: "random_input"
19
+ }.freeze
20
+
21
+ ADDRESS_CHECK_RESULTS = {VALID: "valid", RISKY: "risky", INVALID: "invalid", UNKNOWN: "unknown"}.freeze
22
+
23
+ ADDRESS_CONFIDENCES = {HIGH: "high", MEDIUM: "medium", LOW: "low"}.freeze
24
+
25
+ ADDRESS_EXPIRY_ACTIONS = {STOP: "stop", DELETE: "delete"}.freeze
26
+
27
+ ADDRESS_FORWARD_CONSENT_STATUSES = {
28
+ SENT: "sent",
29
+ ALREADY_CONFIRMED: "already-confirmed",
30
+ REVOKED: "revoked",
31
+ TOO_SOON: "too-soon",
32
+ SEND_FAILED: "send-failed"
33
+ }.freeze
34
+
35
+ ADDRESS_FORWARD_STATUSES = {LIVE: "live", PENDING: "pending", REFUSED: "refused", PAUSED: "paused"}.freeze
36
+
37
+ ADDRESS_GROUP_POSTING_POLICIES = {ANYONE: "anyone", MEMBERS: "members", WORKSPACE: "workspace"}.freeze
38
+
39
+ ADDRESS_HOLDS = {PAUSED: "paused", DISABLED: "disabled"}.freeze
40
+
41
+ ADDRESS_MEMBER_VIAS = {
42
+ OWNER: "owner",
43
+ EVERY_ADDRESS: "every-address",
44
+ WHOLE_DOMAIN: "whole-domain",
45
+ DIRECT: "direct"
46
+ }.freeze
47
+
48
+ ADDRESS_MX_STATUSES = {
49
+ FOUND: "found",
50
+ IMPLICIT: "implicit",
51
+ MISSING: "missing",
52
+ NULL_MX: "null_mx",
53
+ DOMAIN_NOT_FOUND: "domain_not_found",
54
+ UNKNOWN: "unknown"
55
+ }.freeze
56
+
57
+ ADDRESS_ROLES = {OWNER: "owner", MEMBER: "member", VIEWER: "viewer"}.freeze
58
+
59
+ ADDRESS_ROUTE_ACTIONS = {DELIVER: "deliver", FORWARD: "forward", WEBHOOK: "webhook", REWRITE: "rewrite"}.freeze
60
+
61
+ ADDRESS_ROUTE_INACTIVE_REASONS = {
62
+ SWITCHED_OFF: "switched_off",
63
+ TARGET_REMOVED: "target_removed",
64
+ TARGET_DISABLED: "target_disabled",
65
+ WEBHOOK_DELETED: "webhook_deleted",
66
+ WEBHOOK_DISABLED: "webhook_disabled",
67
+ REWRITE_DOMAIN_REMOVED: "rewrite_domain_removed",
68
+ FORWARD_PENDING: "forward_pending",
69
+ FORWARD_REFUSED: "forward_refused"
70
+ }.freeze
71
+
72
+ ADDRESS_ROUTE_TEST_STEPS = {
73
+ ADDRESS: "address",
74
+ ALIAS: "alias",
75
+ ROUTE: "route",
76
+ CATCH_ALL: "catch_all",
77
+ NONE: "none"
78
+ }.freeze
79
+
80
+ ADD_ONS = {DEDICATED_IP: "dedicated-ip"}.freeze
81
+
82
+ API_SCOPES = {
83
+ EMAILS_SEND: "emails:send",
84
+ EMAILS_READ: "emails:read",
85
+ DRAFTS_READ: "drafts:read",
86
+ DRAFTS_WRITE: "drafts:write",
87
+ THREADS_READ: "threads:read",
88
+ THREADS_WRITE: "threads:write",
89
+ FILES_READ: "files:read",
90
+ FILES_WRITE: "files:write",
91
+ LABELS_READ: "labels:read",
92
+ LABELS_WRITE: "labels:write",
93
+ CONTACTS_READ: "contacts:read",
94
+ CONTACTS_WRITE: "contacts:write",
95
+ AUDIENCES_READ: "audiences:read",
96
+ AUDIENCES_WRITE: "audiences:write",
97
+ CALENDAR_READ: "calendar:read",
98
+ CALENDAR_WRITE: "calendar:write",
99
+ TEMPLATES_READ: "templates:read",
100
+ TEMPLATES_WRITE: "templates:write",
101
+ DOMAINS_READ: "domains:read",
102
+ DOMAINS_WRITE: "domains:write",
103
+ WEBHOOKS_READ: "webhooks:read",
104
+ WEBHOOKS_WRITE: "webhooks:write",
105
+ RULES_READ: "rules:read",
106
+ RULES_WRITE: "rules:write",
107
+ CONNECTIONS_READ: "connections:read",
108
+ MEMBERS_READ: "members:read",
109
+ MEMBERS_WRITE: "members:write",
110
+ ROLES_READ: "roles:read",
111
+ ROLES_WRITE: "roles:write",
112
+ SETTINGS_READ: "settings:read",
113
+ SETTINGS_WRITE: "settings:write",
114
+ KEYS_WRITE: "keys:write",
115
+ KEYS_READ: "keys:read",
116
+ KEYS_MANAGE: "keys:manage",
117
+ FORMS_READ: "forms:read",
118
+ FORMS_WRITE: "forms:write",
119
+ KNOWLEDGE_READ: "knowledge:read",
120
+ KNOWLEDGE_WRITE: "knowledge:write",
121
+ AUTOMATIONS_READ: "automations:read",
122
+ AUTOMATIONS_WRITE: "automations:write",
123
+ TASKS_READ: "tasks:read",
124
+ TASKS_WRITE: "tasks:write",
125
+ CONNECTORS_READ: "connectors:read",
126
+ CONNECTORS_USE: "connectors:use",
127
+ CONNECTORS_WRITE: "connectors:write",
128
+ BILLING_READ: "billing:read",
129
+ BILLING_WRITE: "billing:write",
130
+ ACCOUNT_READ: "account:read",
131
+ ACCOUNT_WRITE: "account:write"
132
+ }.freeze
133
+
134
+ APP_HOST_SENDER_WAITS = {LOGO: "logo", SIGNING: "signing"}.freeze
135
+
136
+ APP_HOST_STATUSES = {NONE: "none", PENDING: "pending", ACTIVE: "active", FAILED: "failed"}.freeze
137
+
138
+ APP_PASSWORD_ORIGINS = {SETTINGS: "settings", SETUP_LINK: "setup-link", API: "api"}.freeze
139
+
140
+ AUDIENCE_MEMBER_STATUSES = {SUBSCRIBED: "subscribed", UNSUBSCRIBED: "unsubscribed"}.freeze
141
+
142
+ AUTOMATION_ADDRESS_ACCEPTS = {VALID: "valid", VALID_OR_RISKY: "valid_or_risky"}.freeze
143
+
144
+ AUTOMATION_CONDITION_KINDS = {
145
+ EMAIL_OPENED: "email_opened",
146
+ EMAIL_CLICKED: "email_clicked",
147
+ IN_AUDIENCE: "in_audience",
148
+ FIELD: "field",
149
+ EVENT: "event",
150
+ REPLIED: "replied",
151
+ EMAIL_MATCHES: "email_matches",
152
+ AI_CHECK: "ai_check",
153
+ ADDRESS_CHECK: "address_check"
154
+ }.freeze
155
+
156
+ AUTOMATION_DATE_FIELDS = {BIRTHDAY: "birthday", JOINED: "joined"}.freeze
157
+
158
+ AUTOMATION_DURATION_UNITS = {MINUTES: "minutes", HOURS: "hours", DAYS: "days", WEEKS: "weeks"}.freeze
159
+
160
+ AUTOMATION_EMAIL_FIELDS = {FROM: "from", SUBJECT: "subject", TEXT: "text"}.freeze
161
+
162
+ AUTOMATION_EMAIL_MATCHES = {ANY: "any", REPLY: "reply", NEW: "new"}.freeze
163
+
164
+ AUTOMATION_ENROLLMENT_SOURCES = {TRIGGER: "trigger", MANUAL: "manual", API: "api"}.freeze
165
+
166
+ AUTOMATION_ENROLLMENT_STATUSES = {ACTIVE: "active", COMPLETED: "completed", EXITED: "exited"}.freeze
167
+
168
+ AUTOMATION_EXIT_REASONS = {
169
+ COMPLETED: "completed",
170
+ EXIT_STEP: "exit_step",
171
+ UNSUBSCRIBED: "unsubscribed",
172
+ SUPPRESSED: "suppressed",
173
+ LEFT_AUDIENCE: "left_audience",
174
+ REMOVED: "removed",
175
+ ARCHIVED: "archived",
176
+ FAILED: "failed"
177
+ }.freeze
178
+
179
+ AUTOMATION_FIELD_OPERATORS = {
180
+ EQUALS: "equals",
181
+ NOT_EQUALS: "not_equals",
182
+ CONTAINS: "contains",
183
+ NOT_CONTAINS: "not_contains",
184
+ STARTS_WITH: "starts_with",
185
+ ENDS_WITH: "ends_with",
186
+ IS_SET: "is_set",
187
+ IS_NOT_SET: "is_not_set",
188
+ GREATER_THAN: "greater_than",
189
+ LESS_THAN: "less_than"
190
+ }.freeze
191
+
192
+ AUTOMATION_HOLD_REASONS = {WINDOW: "window", QUOTA: "quota", LANE: "lane", RETRY: "retry", AI_LIMIT: "ai_limit"}.freeze
193
+
194
+ AUTOMATION_PAUSE_REASONS = {
195
+ MANUAL: "manual",
196
+ SENDER_REFUSED: "sender_refused",
197
+ KEY_REVOKED: "key_revoked",
198
+ TEMPLATE_UNAVAILABLE: "template_unavailable",
199
+ AUDIENCE_MISSING: "audience_missing",
200
+ PLAN_LIMIT: "plan_limit"
201
+ }.freeze
202
+
203
+ AUTOMATION_REPLY_MODES = {TEXT: "text", AI: "ai"}.freeze
204
+
205
+ AUTOMATION_RUN_EVENTS = {ENTERED: "entered", STEP: "step", COMPLETED: "completed", EXITED: "exited"}.freeze
206
+
207
+ AUTOMATION_RUN_OUTCOMES = {
208
+ SENT: "sent",
209
+ SKIPPED: "skipped",
210
+ WAITED: "waited",
211
+ YES: "yes",
212
+ NO: "no",
213
+ ADDED: "added",
214
+ REMOVED: "removed",
215
+ UPDATED: "updated",
216
+ CALLED: "called",
217
+ EXITED: "exited",
218
+ FAILED: "failed"
219
+ }.freeze
220
+
221
+ AUTOMATION_STATUSES = {DRAFT: "draft", LIVE: "live", PAUSED: "paused", ARCHIVED: "archived"}.freeze
222
+
223
+ AUTOMATION_STEP_KINDS = {
224
+ SEND_EMAIL: "send_email",
225
+ WAIT: "wait",
226
+ BRANCH: "branch",
227
+ ADD_TO_AUDIENCE: "add_to_audience",
228
+ REMOVE_FROM_AUDIENCE: "remove_from_audience",
229
+ UPDATE_FIELD: "update_field",
230
+ WEBHOOK: "webhook",
231
+ EXIT: "exit",
232
+ REPLY: "reply"
233
+ }.freeze
234
+
235
+ AUTOMATION_TRIGGER_KINDS = {
236
+ AUDIENCE_JOINED: "audience_joined",
237
+ FORM_SUBMITTED: "form_submitted",
238
+ EVENT: "event",
239
+ DATE: "date",
240
+ MANUAL: "manual",
241
+ EMAIL_RECEIVED: "email_received"
242
+ }.freeze
243
+
244
+ AUTOMATION_VALUE_SOURCES = {STATIC: "static", CONTACT: "contact", EVENT: "event"}.freeze
245
+
246
+ AUTOMATION_WAIT_MODES = {DURATION: "duration", UNTIL: "until", EVENT: "event", REPLY: "reply"}.freeze
247
+
248
+ BILLING_ALERT_KINDS = {
249
+ PAYMENT_FAILED: "payment_failed",
250
+ PAY_AS_YOU_GO_PAUSED: "pay_as_you_go_paused",
251
+ SENDING_PAUSED: "sending_paused",
252
+ SPEND_LIMIT_REACHED: "spend_limit_reached",
253
+ AI_USED_UP: "ai_used_up",
254
+ PLAN_ENDING: "plan_ending",
255
+ SENDS_NEARLY_USED: "sends_nearly_used",
256
+ SPEND_NEARLY_REACHED: "spend_nearly_reached",
257
+ UPCOMING_CHARGE: "upcoming_charge"
258
+ }.freeze
259
+
260
+ BILLING_ALERT_SEVERITIES = {BLOCKED: "blocked", WARNING: "warning", INFO: "info"}.freeze
261
+
262
+ BILLING_ALERT_TARGETS = {BILLING: "billing", USAGE: "usage"}.freeze
263
+
264
+ BILLING_INTERVALS = {MONTH: "month", YEAR: "year"}.freeze
265
+
266
+ BILLING_INVOICE_SORTS = {NEWEST: "newest", OLDEST: "oldest"}.freeze
267
+
268
+ BILLING_INVOICE_STARTS = {READY: "ready", STARTED: "started", REFUSED: "refused"}.freeze
269
+
270
+ BILLING_INVOICE_STATUSES = {
271
+ DRAFT: "draft",
272
+ PENDING: "pending",
273
+ PAID: "paid",
274
+ REFUNDED: "refunded",
275
+ PARTIALLY_REFUNDED: "partially_refunded",
276
+ VOID: "void"
277
+ }.freeze
278
+
279
+ BILLING_THEMES = {LIGHT: "light", DARK: "dark"}.freeze
280
+
281
+ BILLING_USAGE_WINDOWS = {ALL: "all"}.freeze
282
+
283
+ BIMI_STATUSES = {PRESENT: "present", PARTIAL: "partial", ABSENT: "absent", INVALID: "invalid"}.freeze
284
+
285
+ BOOKING_ACTORS = {HOST: "host", GUEST: "guest"}.freeze
286
+
287
+ BOOKING_LOCATION_KINDS = {VIDEO: "video", PHONE: "phone", IN_PERSON: "in-person", NONE: "none"}.freeze
288
+
289
+ BOOKING_PAGE_PROBLEMS = {SENDER: "sender", HOST: "host", HOURS: "hours"}.freeze
290
+
291
+ BOOKING_PAGE_SORTS = {OLDEST: "oldest", NEWEST: "newest", NAME: "name", UPCOMING: "upcoming"}.freeze
292
+
293
+ BOOKING_PAGE_STATUSES = {ACTIVE: "active", PAUSED: "paused"}.freeze
294
+
295
+ BOOKING_QUESTION_KINDS = {
296
+ TEXT: "text",
297
+ LONG_TEXT: "long-text",
298
+ PHONE: "phone",
299
+ CHOICE: "choice",
300
+ CHECKBOX: "checkbox"
301
+ }.freeze
302
+
303
+ BOOKING_STATUSES = {
304
+ PENDING: "pending",
305
+ CONFIRMED: "confirmed",
306
+ DECLINED: "declined",
307
+ CANCELLED: "cancelled"
308
+ }.freeze
309
+
310
+ BOOKING_THEMES = {AUTO: "auto", LIGHT: "light", DARK: "dark"}.freeze
311
+
312
+ BOOKING_VIEWS = {UPCOMING: "upcoming", PENDING: "pending", PAST: "past", ENDED: "ended"}.freeze
313
+
314
+ BRAND_FONT_IDS = {
315
+ SYSTEM: "system",
316
+ ARIAL: "arial",
317
+ HELVETICA: "helvetica",
318
+ VERDANA: "verdana",
319
+ TAHOMA: "tahoma",
320
+ TREBUCHET_MS: "trebuchet-ms",
321
+ GEORGIA: "georgia",
322
+ TIMES_NEW_ROMAN: "times-new-roman",
323
+ COURIER_NEW: "courier-new",
324
+ DM_SANS: "dm-sans",
325
+ INTER: "inter",
326
+ ROBOTO: "roboto",
327
+ OPEN_SANS: "open-sans",
328
+ LATO: "lato",
329
+ MONTSERRAT: "montserrat",
330
+ POPPINS: "poppins",
331
+ NUNITO: "nunito",
332
+ WORK_SANS: "work-sans",
333
+ SOURCE_SANS_3: "source-sans-3",
334
+ IBM_PLEX_SANS: "ibm-plex-sans",
335
+ MERRIWEATHER: "merriweather",
336
+ PLAYFAIR_DISPLAY: "playfair-display",
337
+ INSTRUMENT_SERIF: "instrument-serif",
338
+ JETBRAINS_MONO: "jetbrains-mono",
339
+ DM_MONO: "dm-mono",
340
+ GEIST_MONO: "geist-mono"
341
+ }.freeze
342
+
343
+ BRAND_IMAGE_TYPES = {
344
+ SVG: "image/svg+xml",
345
+ PNG: "image/png",
346
+ JPEG: "image/jpeg",
347
+ WEBP: "image/webp",
348
+ GIF: "image/gif"
349
+ }.freeze
350
+
351
+ BRAND_IMAGE_VARIANTS = {
352
+ MARK: "mark",
353
+ WORDMARK: "wordmark",
354
+ WORDMARK_DARK: "wordmark-dark",
355
+ LOGIN_BACKGROUND: "login-background"
356
+ }.freeze
357
+
358
+ BROADCAST_RECIPIENT_FILTERS = {
359
+ PENDING: "pending",
360
+ SENT: "sent",
361
+ DELIVERED: "delivered",
362
+ OPENED: "opened",
363
+ NOT_OPENED: "not_opened",
364
+ CLICKED: "clicked",
365
+ BOUNCED: "bounced",
366
+ COMPLAINED: "complained",
367
+ FAILED: "failed",
368
+ UNSUBSCRIBED: "unsubscribed"
369
+ }.freeze
370
+
371
+ BROADCAST_STATUSES = {
372
+ DRAFT: "draft",
373
+ SCHEDULED: "scheduled",
374
+ QUEUED: "queued",
375
+ SENDING: "sending",
376
+ SENT: "sent",
377
+ CANCELLED: "cancelled",
378
+ FAILED: "failed"
379
+ }.freeze
380
+
381
+ CALENDAR_COLORS = {
382
+ BLUE: "blue",
383
+ SKY: "sky",
384
+ TEAL: "teal",
385
+ GREEN: "green",
386
+ LIME: "lime",
387
+ YELLOW: "yellow",
388
+ ORANGE: "orange",
389
+ RED: "red",
390
+ PINK: "pink",
391
+ PURPLE: "purple",
392
+ GRAY: "gray"
393
+ }.freeze
394
+
395
+ CALENDAR_EDIT_SCOPES = {OCCURRENCE: "occurrence", FOLLOWING: "following", SERIES: "series"}.freeze
396
+
397
+ CALENDAR_FEED_MODES = {FULL: "full", BUSY: "busy"}.freeze
398
+
399
+ CALENDAR_REMINDER_ACTIONS = {DISPLAY: "DISPLAY", EMAIL: "EMAIL", AUDIO: "AUDIO"}.freeze
400
+
401
+ CALENDAR_RESPONSES = {ACCEPTED: "ACCEPTED", DECLINED: "DECLINED", TENTATIVE: "TENTATIVE"}.freeze
402
+
403
+ CALENDAR_SUBSCRIPTION_ERRORS = {
404
+ UNREACHABLE: "unreachable",
405
+ TOO_LARGE: "too-large",
406
+ NOT_A_CALENDAR: "not-a-calendar",
407
+ TOO_MANY_EVENTS: "too-many-events"
408
+ }.freeze
409
+
410
+ CALENDAR_SUBSCRIPTION_STATUSES = {ACTIVE: "active", FAILING: "failing", STOPPED: "stopped"}.freeze
411
+
412
+ CALENDAR_TRANSPARENCIES = {OPAQUE: "OPAQUE", TRANSPARENT: "TRANSPARENT"}.freeze
413
+
414
+ CALENDAR_VISIBILITIES = {PUBLIC: "PUBLIC", PRIVATE: "PRIVATE", CONFIDENTIAL: "CONFIDENTIAL"}.freeze
415
+
416
+ CHAT_MESSAGE_ORDERS = {ASC: "asc", DESC: "desc"}.freeze
417
+
418
+ CHAT_MESSAGE_PART_TYPES = {TEXT: "text", TOOL_CALL: "tool_call", FILE: "file"}.freeze
419
+
420
+ CHAT_MESSAGE_ROLES = {USER: "user", ASSISTANT: "assistant"}.freeze
421
+
422
+ CHAT_SORTS = {NEWEST: "newest", OLDEST: "oldest", TITLE: "title"}.freeze
423
+
424
+ CHAT_STOP_REASONS = {STOP_REQUESTED: "stop_requested", SUPERSEDED: "superseded", TIME_LIMIT: "time_limit"}.freeze
425
+
426
+ CHAT_STOP_STATUSES = {STOPPED: "stopped", IDLE: "idle"}.freeze
427
+
428
+ CHAT_TOOL_CALL_STATUSES = {
429
+ PENDING_APPROVAL: "pending_approval",
430
+ DONE: "done",
431
+ DENIED: "denied",
432
+ INTERRUPTED: "interrupted"
433
+ }.freeze
434
+
435
+ CHAT_TURN_STATUSES = {
436
+ COMPLETED: "completed",
437
+ AWAITING_APPROVAL: "awaiting_approval",
438
+ STOPPED: "stopped",
439
+ FAILED: "failed"
440
+ }.freeze
441
+
442
+ CONNECTED_APP_KINDS = {APP: "app", CLI: "cli"}.freeze
443
+
444
+ CONNECTED_APP_STATUSES = {
445
+ ACTIVE: "active",
446
+ EXPIRED: "expired",
447
+ NEEDS_APPROVAL: "needs-approval",
448
+ ACCESS_LOST: "access-lost"
449
+ }.freeze
450
+
451
+ CONNECTED_MAILBOX_METHODS = {IMAP: "imap", MICROSOFT: "microsoft"}.freeze
452
+
453
+ CONNECTED_MAILBOX_PAUSE_REASONS = {BY_PERSON: "by-person", SIGN_IN: "sign-in", UNREACHABLE: "unreachable"}.freeze
454
+
455
+ CONNECTED_MAILBOX_STATUSES = {ACTIVE: "active", PAUSED: "paused", NEEDS_SIGN_IN: "needs-sign-in", FAILING: "failing"}.freeze
456
+
457
+ CONNECTOR_ACCESS_LEVELS = {READ: "read", FULL: "full"}.freeze
458
+
459
+ CONNECTOR_ACTION_KINDS = {READ: "read", CHANGE: "change"}.freeze
460
+
461
+ CONNECTOR_AUTH_KINDS = {SIGN_IN: "sign-in", KEY: "key"}.freeze
462
+
463
+ CONNECTOR_CALL_SOURCES = {CHAT: "chat", TASK: "task", API: "api", MCP: "mcp"}.freeze
464
+
465
+ CONNECTOR_CALL_STATUSES = {OK: "ok", FAILED: "failed", REFUSED: "refused"}.freeze
466
+
467
+ CONNECTOR_FAILURES = {EXPIRED: "expired", REVOKED: "revoked", FAILED: "failed", DISABLED: "disabled"}.freeze
468
+
469
+ CONNECTOR_PAUSE_REASONS = {USER: "user", PLAN: "plan"}.freeze
470
+
471
+ CONNECTOR_SCOPES = {ACCOUNT: "account", WORKSPACE: "workspace"}.freeze
472
+
473
+ CONNECTOR_STATUSES = {PENDING: "pending", ACTIVE: "active", EXPIRED: "expired", PAUSED: "paused"}.freeze
474
+
475
+ CONSOLE_PERMISSIONS = {
476
+ ADDRESSES_ALL: "addresses:all",
477
+ API_KEYS_READ: "api-keys:read",
478
+ API_KEYS_WRITE: "api-keys:write",
479
+ BILLING_READ: "billing:read",
480
+ BILLING_WRITE: "billing:write",
481
+ WORKSPACE_MANAGE: "workspace:manage"
482
+ }.freeze
483
+
484
+ CONTACT_BLOCK_LISTS = {BLOCKED_SENDERS: "blockedSenders", BLOCKED_DOMAINS: "blockedDomains"}.freeze
485
+
486
+ CONTACT_CARD_DUPLICATE_REASONS = {EMAIL: "email", PHONE: "phone", NAME: "name"}.freeze
487
+
488
+ CONTACT_CARD_KINDS = {INDIVIDUAL: "individual", GROUP: "group"}.freeze
489
+
490
+ CONTACT_CARD_LABELS = {
491
+ HOME: "home",
492
+ WORK: "work",
493
+ MOBILE: "mobile",
494
+ MAIN: "main",
495
+ FAX: "fax",
496
+ PAGER: "pager",
497
+ OTHER: "other"
498
+ }.freeze
499
+
500
+ CONTACT_PHOTO_TYPES = {PNG: "image/png", JPEG: "image/jpeg", WEBP: "image/webp", GIF: "image/gif"}.freeze
501
+
502
+ CONTACT_SOURCES = {MANUAL: "manual", AUTO: "auto", FORM: "form"}.freeze
503
+
504
+ CONTACT_THREAD_SORTS = {NEWEST: "newest", OLDEST: "oldest", SENDER: "sender", SUBJECT: "subject"}.freeze
505
+
506
+ CREDENTIAL_KINDS = {API_KEY: "apiKey", OAUTH: "oauth"}.freeze
507
+
508
+ DEDICATED_IP_INELIGIBLE_REASONS = {PLAN: "plan", VOLUME: "volume"}.freeze
509
+
510
+ DEDICATED_IP_STATUSES = {AVAILABLE: "available", WARMING: "warming", READY: "ready", RELEASED: "released"}.freeze
511
+
512
+ DELIVERABILITY_CHECK_IDS = {MX: "mx", SPF: "spf", DKIM: "dkim", DMARC: "dmarc", BIMI: "bimi"}.freeze
513
+
514
+ DELIVERABILITY_CHECK_STATUSES = {PASS: "pass", WARN: "warn", FAIL: "fail", ABSENT: "absent"}.freeze
515
+
516
+ DELIVERABILITY_GRADES = {A: "A", B: "B", C: "C", D: "D", F: "F"}.freeze
517
+
518
+ DIRECTORY_PERSON_STATES = {MEMBER: "member", INVITED: "invited", WAITING: "waiting", INACTIVE: "inactive"}.freeze
519
+
520
+ DNS_CONNECTION_STATUSES = {ACTIVE: "active", NEEDS_REAUTH: "needs-reauth", REVOKED: "revoked", ERROR: "error"}.freeze
521
+
522
+ DNS_PROVISION_STATES = {
523
+ UNMANAGED: "unmanaged",
524
+ READY: "ready",
525
+ AWAITING_SYNC: "awaiting-sync",
526
+ AWAITING_SIGNING: "awaiting-signing",
527
+ CONFLICT: "conflict",
528
+ BLOCKED: "blocked"
529
+ }.freeze
530
+
531
+ DNS_SYNC_OUTCOMES = {SYNCED: "synced", REFUSED: "refused"}.freeze
532
+
533
+ DNS_SYNC_PURPOSES = {
534
+ DMARC: "dmarc",
535
+ TRACKING: "tracking",
536
+ STORAGE: "storage",
537
+ BIMI: "bimi",
538
+ APP_HOST: "app-host"
539
+ }.freeze
540
+
541
+ DNS_ZONE_RESOLUTION_KINDS = {RESOLVED: "resolved", AMBIGUOUS: "ambiguous", NONE: "none", UNUSABLE: "unusable"}.freeze
542
+
543
+ DOMAIN_ADDRESS_DESTINATIONS = {MAILBOX: "mailbox", FORWARD: "forward", WEBHOOK: "webhook", GROUP: "group"}.freeze
544
+
545
+ DOMAIN_DELETED_REASONS = {REMOVED: "removed", NEVER_VERIFIED: "never_verified", MOVED: "moved"}.freeze
546
+
547
+ DOMAIN_DMARC_POLICIES = {NONE: "none", QUARANTINE: "quarantine", REJECT: "reject"}.freeze
548
+
549
+ DOMAIN_DMARC_STAGES = {
550
+ MISSING: "missing",
551
+ INVALID: "invalid",
552
+ MONITOR: "monitor",
553
+ QUARANTINE: "quarantine",
554
+ REJECT: "reject"
555
+ }.freeze
556
+
557
+ DOMAIN_LOGO_MARK_KINDS = {VERIFIED: "verified", COMMON: "common", UNKNOWN: "unknown"}.freeze
558
+
559
+ DOMAIN_LOGO_RECORD_OUTCOMES = {
560
+ PUBLISHED: "published",
561
+ MANUAL: "manual",
562
+ BLOCKED: "blocked",
563
+ BUSY: "busy",
564
+ FAILED: "failed"
565
+ }.freeze
566
+
567
+ DOMAIN_RECORD_PROBLEMS = {
568
+ NOTHING_PUBLISHED: "nothing-published",
569
+ DIFFERENT_VALUE: "different-value",
570
+ DOUBLED_NAME: "doubled-name",
571
+ QUOTED_VALUE: "quoted-value",
572
+ RELATIVE_TARGET: "relative-target",
573
+ PROXIED: "proxied",
574
+ SEVERAL_SPF: "several-spf",
575
+ SEVERAL_DMARC: "several-dmarc",
576
+ UNREADABLE: "unreadable"
577
+ }.freeze
578
+
579
+ DOMAIN_RECORD_STATUSES = {FOUND: "found", MISSING: "missing"}.freeze
580
+
581
+ EMAIL_FAILURE_STAGES = {SCHEDULE: "schedule", TRANSPORT: "transport"}.freeze
582
+
583
+ EMAIL_NOTIFICATION_CATEGORIES = {ACCOUNT: "account", BILLING: "billing", ACTIVITY: "activity", PRODUCT: "product"}.freeze
584
+
585
+ ERROR_TYPES = {
586
+ INVALID_REQUEST_ERROR: "invalid_request_error",
587
+ AUTHENTICATION_ERROR: "authentication_error",
588
+ PERMISSION_ERROR: "permission_error",
589
+ NOT_FOUND_ERROR: "not_found_error",
590
+ CONFLICT_ERROR: "conflict_error",
591
+ VALIDATION_ERROR: "validation_error",
592
+ RATE_LIMIT_ERROR: "rate_limit_error",
593
+ API_ERROR: "api_error"
594
+ }.freeze
595
+
596
+ EXPORT_PHASES = {PLANNING: "planning", MAIL: "mail", RECORDS: "records", FINISHING: "finishing"}.freeze
597
+
598
+ EXPORT_REFUSALS = {
599
+ NOT_PERMITTED: "not-permitted",
600
+ MAILBOX_LOGIN: "mailbox-login",
601
+ TWO_FACTOR_REQUIRED: "two-factor-required"
602
+ }.freeze
603
+
604
+ EXPORT_STATUSES = {
605
+ QUEUED: "queued",
606
+ RUNNING: "running",
607
+ READY: "ready",
608
+ FAILED: "failed",
609
+ EXPIRED: "expired"
610
+ }.freeze
611
+
612
+ FILE_DIRECTIONS = {INBOUND: "inbound", OUTBOUND: "outbound", UPLOADED: "uploaded"}.freeze
613
+
614
+ FILE_KINDS = {IMAGE: "image", PDF: "pdf", AUDIO: "audio", VIDEO: "video", TEXT: "text"}.freeze
615
+
616
+ FILE_SORTS = {NEWEST: "newest", OLDEST: "oldest", LARGEST: "largest", NAME: "name"}.freeze
617
+
618
+ FILE_USAGES = {RECEIVED: "received", SENT: "sent", LINKED: "linked", SCHEDULED: "scheduled"}.freeze
619
+
620
+ FILE_VISIBILITIES = {PUBLIC: "public", PRIVATE: "private"}.freeze
621
+
622
+ FOLLOW_UP_STATUSES = {WAITING: "waiting", ANSWERED: "answered", DUE: "due", CANCELLED: "cancelled"}.freeze
623
+
624
+ FORM_ALIGNS = {LEFT: "left", CENTER: "center"}.freeze
625
+
626
+ FORM_CONFIRM_SOURCES = {LINK: "link", APPROVAL: "approval"}.freeze
627
+
628
+ FORM_CONTACT_FIELDS = {
629
+ EMAIL: "email",
630
+ FIRST_NAME: "firstName",
631
+ LAST_NAME: "lastName",
632
+ NAME: "name",
633
+ PHONE: "phone",
634
+ COMPANY: "company",
635
+ JOB_TITLE: "jobTitle",
636
+ WEBSITE: "website",
637
+ BIRTHDAY: "birthday"
638
+ }.freeze
639
+
640
+ FORM_FIELD_ERRORS = {
641
+ REQUIRED: "required",
642
+ EMAIL: "email",
643
+ NUMBER: "number",
644
+ MIN: "min",
645
+ MAX: "max",
646
+ TOO_SHORT: "too_short",
647
+ TOO_LONG: "too_long",
648
+ URL: "url",
649
+ DATE: "date",
650
+ PHONE: "phone",
651
+ OPTION: "option",
652
+ UNDELIVERABLE: "undeliverable",
653
+ DISPOSABLE: "disposable",
654
+ MAILBOX_NOT_FOUND: "mailbox_not_found"
655
+ }.freeze
656
+
657
+ FORM_FIELD_TYPES = {
658
+ EMAIL: "email",
659
+ TEXT: "text",
660
+ TEXTAREA: "textarea",
661
+ NUMBER: "number",
662
+ PHONE: "phone",
663
+ URL: "url",
664
+ DATE: "date",
665
+ SELECT: "select",
666
+ RADIO: "radio",
667
+ CHECKBOXES: "checkboxes",
668
+ CHECKBOX: "checkbox",
669
+ CONSENT: "consent",
670
+ AUDIENCES: "audiences",
671
+ HIDDEN: "hidden",
672
+ HEADING: "heading",
673
+ PARAGRAPH: "paragraph",
674
+ DIVIDER: "divider"
675
+ }.freeze
676
+
677
+ FORM_FIELD_WIDTHS = {FULL: "full", HALF: "half"}.freeze
678
+
679
+ FORM_FONTS = {SYSTEM: "system", SANS: "sans", SERIF: "serif", MONO: "mono"}.freeze
680
+
681
+ FORM_LAYOUTS = {CARD: "card", PLAIN: "plain"}.freeze
682
+
683
+ FORM_RADII = {NONE: "none", SM: "sm", MD: "md", LG: "lg", FULL: "full"}.freeze
684
+
685
+ FORM_SENDER_ISSUES = {MISSING: "missing", NOT_SENDABLE: "not_sendable", NOT_ALLOWED: "not_allowed"}.freeze
686
+
687
+ FORM_STARTER_SLUGS = {
688
+ BLANK: "blank",
689
+ NEWSLETTER: "newsletter",
690
+ WAITLIST: "waitlist",
691
+ EVENT: "event",
692
+ EARLY_ACCESS: "early-access",
693
+ CONTACT: "contact"
694
+ }.freeze
695
+
696
+ FORM_STATUSES = {DRAFT: "draft", LIVE: "live", PAUSED: "paused"}.freeze
697
+
698
+ FORM_SUBMISSION_STATUSES = {PENDING: "pending", ADDED: "added"}.freeze
699
+
700
+ FORM_SUBSCRIBE_OUTCOMES = {ADDED: "added", PENDING: "pending"}.freeze
701
+
702
+ FORM_SUCCESS_ACTIONS = {MESSAGE: "message", REDIRECT: "redirect"}.freeze
703
+
704
+ FORM_WIDTHS = {NARROW: "narrow", NORMAL: "normal", WIDE: "wide"}.freeze
705
+
706
+ GROUP_MEMBER_KINDS = {ADDRESS: "address", EMAIL: "email"}.freeze
707
+
708
+ IMPORT_FORMATS = {
709
+ GMAIL: "gmail",
710
+ PLATFORM: "platform",
711
+ THUNDERBIRD: "thunderbird",
712
+ PROTON: "proton",
713
+ MBOX: "mbox",
714
+ EML: "eml",
715
+ IMAP: "imap",
716
+ MICROSOFT: "microsoft"
717
+ }.freeze
718
+
719
+ IMPORT_HISTORY_STATUSES = {
720
+ QUEUED: "queued",
721
+ RUNNING: "running",
722
+ PAUSED: "paused",
723
+ DONE: "done",
724
+ FAILED: "failed",
725
+ CANCELLED: "cancelled"
726
+ }.freeze
727
+
728
+ IMPORT_PAUSE_REASONS = {
729
+ THROTTLED: "throttled",
730
+ DAILY_LIMIT: "daily-limit",
731
+ UNREACHABLE: "unreachable",
732
+ SIGN_IN: "sign-in"
733
+ }.freeze
734
+
735
+ IMPORT_STATUSES = {
736
+ UPLOADING: "uploading",
737
+ QUEUED: "queued",
738
+ RUNNING: "running",
739
+ PARKED: "parked",
740
+ NEEDS_PASSWORD: "needs-password",
741
+ COMPLETED: "completed",
742
+ FAILED: "failed",
743
+ CANCELLED: "cancelled"
744
+ }.freeze
745
+
746
+ INBOX_CATEGORIES = {
747
+ PRIMARY: "primary",
748
+ PROMOTIONS: "promotions",
749
+ UPDATES: "updates",
750
+ SOCIAL: "social",
751
+ FORUMS: "forums"
752
+ }.freeze
753
+
754
+ ITEM_IMPORT_KINDS = {CALENDAR: "calendar", CONTACTS: "contacts"}.freeze
755
+
756
+ ITEM_IMPORT_SKIP_REASONS = {
757
+ UID_TAKEN: "uid-taken",
758
+ NO_START: "no-start",
759
+ DUPLICATE: "duplicate",
760
+ LIMIT: "limit",
761
+ INVALID: "invalid",
762
+ EMPTY: "empty"
763
+ }.freeze
764
+
765
+ ITEM_IMPORT_SOURCES = {
766
+ FILE: "file",
767
+ TAKEOUT: "takeout",
768
+ CALDAV: "caldav",
769
+ CARDDAV: "carddav",
770
+ MICROSOFT: "microsoft"
771
+ }.freeze
772
+
773
+ ITEM_IMPORT_STATUSES = {
774
+ UPLOADING: "uploading",
775
+ QUEUED: "queued",
776
+ RUNNING: "running",
777
+ COMPLETED: "completed",
778
+ FAILED: "failed",
779
+ CANCELLED: "cancelled",
780
+ UNDONE: "undone"
781
+ }.freeze
782
+
783
+ KNOWLEDGE_CONNECTOR_KINDS = {SITE: "site", SITEMAP: "sitemap", FEED: "feed", ZENDESK: "zendesk"}.freeze
784
+
785
+ KNOWLEDGE_CONNECTOR_STATUSES = {QUEUED: "queued", SYNCING: "syncing", READY: "ready", FAILED: "failed"}.freeze
786
+
787
+ KNOWLEDGE_FAILURES = {
788
+ UNSUPPORTED: "unsupported",
789
+ EMPTY: "empty",
790
+ TOO_LARGE: "too_large",
791
+ FETCH_FAILED: "fetch_failed",
792
+ BLOCKED_URL: "blocked_url",
793
+ CONVERSION_FAILED: "conversion_failed",
794
+ INDEX_FAILED: "index_failed",
795
+ OVER_ALLOWANCE: "over_allowance",
796
+ MISSING_FILE: "missing_file"
797
+ }.freeze
798
+
799
+ KNOWLEDGE_FLAG_KINDS = {DUPLICATE: "duplicate", CONFLICT: "conflict"}.freeze
800
+
801
+ KNOWLEDGE_FLAG_STATUSES = {OPEN: "open", DISMISSED: "dismissed"}.freeze
802
+
803
+ KNOWLEDGE_KINDS = {NOTE: "note", FILE: "file", LINK: "link"}.freeze
804
+
805
+ KNOWLEDGE_LEVELS = {WORKSPACE: "workspace", DOMAIN: "domain", ADDRESS: "address"}.freeze
806
+
807
+ KNOWLEDGE_ORIGINS = {APP: "app", API: "api", ASSISTANT: "assistant", MCP: "mcp"}.freeze
808
+
809
+ KNOWLEDGE_REFRESH_DAY_CHOICES = {DAY: 1, WEEK: 7, MONTH: 30}.freeze
810
+
811
+ KNOWLEDGE_STATUSES = {QUEUED: "queued", PROCESSING: "processing", READY: "ready", FAILED: "failed"}.freeze
812
+
813
+ KNOWLEDGE_SUGGESTION_KINDS = {LEARNED: "learned", QUESTION: "question"}.freeze
814
+
815
+ KNOWLEDGE_SUGGESTION_STATUSES = {PENDING: "pending", ACCEPTED: "accepted", DISMISSED: "dismissed"}.freeze
816
+
817
+ LANGUAGES = [
818
+ {code: "en", label: "English", native: "English", flag: "🇬🇧", rtl: false}.freeze,
819
+ {code: "es", label: "Spanish", native: "Español", flag: "🇪🇸", rtl: false}.freeze,
820
+ {code: "zh-Hans", label: "Simplified Chinese", native: "简体中文", flag: "🇨🇳", rtl: false}.freeze,
821
+ {code: "zh-Hant", label: "Traditional Chinese", native: "繁體中文", flag: "🇹🇼", rtl: false}.freeze,
822
+ {code: "hi", label: "Hindi", native: "हिन्दी", flag: "🇮🇳", rtl: false}.freeze,
823
+ {code: "ar", label: "Arabic", native: "العربية", flag: "🇸🇦", rtl: true}.freeze,
824
+ {
825
+ code: "pt-BR",
826
+ label: "Brazilian Portuguese",
827
+ native: "Português (Brasil)",
828
+ flag: "🇧🇷",
829
+ rtl: false
830
+ }.freeze,
831
+ {code: "pt", label: "Portuguese", native: "Português", flag: "🇵🇹", rtl: false}.freeze,
832
+ {code: "fr", label: "French", native: "Français", flag: "🇫🇷", rtl: false}.freeze,
833
+ {code: "de", label: "German", native: "Deutsch", flag: "🇩🇪", rtl: false}.freeze,
834
+ {code: "ru", label: "Russian", native: "Русский", flag: "🇷🇺", rtl: false}.freeze,
835
+ {code: "ja", label: "Japanese", native: "日本語", flag: "🇯🇵", rtl: false}.freeze,
836
+ {code: "ko", label: "Korean", native: "한국어", flag: "🇰🇷", rtl: false}.freeze,
837
+ {code: "it", label: "Italian", native: "Italiano", flag: "🇮🇹", rtl: false}.freeze,
838
+ {code: "nl", label: "Dutch", native: "Nederlands", flag: "🇳🇱", rtl: false}.freeze,
839
+ {code: "tr", label: "Turkish", native: "Türkçe", flag: "🇹🇷", rtl: false}.freeze,
840
+ {code: "pl", label: "Polish", native: "Polski", flag: "🇵🇱", rtl: false}.freeze,
841
+ {code: "uk", label: "Ukrainian", native: "Українська", flag: "🇺🇦", rtl: false}.freeze,
842
+ {code: "vi", label: "Vietnamese", native: "Tiếng Việt", flag: "🇻🇳", rtl: false}.freeze,
843
+ {code: "id", label: "Indonesian", native: "Bahasa Indonesia", flag: "🇮🇩", rtl: false}.freeze,
844
+ {code: "th", label: "Thai", native: "ไทย", flag: "🇹🇭", rtl: false}.freeze,
845
+ {code: "sv", label: "Swedish", native: "Svenska", flag: "🇸🇪", rtl: false}.freeze,
846
+ {code: "da", label: "Danish", native: "Dansk", flag: "🇩🇰", rtl: false}.freeze,
847
+ {code: "no", label: "Norwegian", native: "Norsk", flag: "🇳🇴", rtl: false}.freeze,
848
+ {code: "fi", label: "Finnish", native: "Suomi", flag: "🇫🇮", rtl: false}.freeze,
849
+ {code: "cs", label: "Czech", native: "Čeština", flag: "🇨🇿", rtl: false}.freeze,
850
+ {code: "el", label: "Greek", native: "Ελληνικά", flag: "🇬🇷", rtl: false}.freeze,
851
+ {code: "he", label: "Hebrew", native: "עברית", flag: "🇮🇱", rtl: true}.freeze,
852
+ {code: "ro", label: "Romanian", native: "Română", flag: "🇷🇴", rtl: false}.freeze,
853
+ {code: "hu", label: "Hungarian", native: "Magyar", flag: "🇭🇺", rtl: false}.freeze,
854
+ {code: "bn", label: "Bengali", native: "বাংলা", flag: "🇧🇩", rtl: false}.freeze,
855
+ {code: "ur", label: "Urdu", native: "اردو", flag: "🇵🇰", rtl: true}.freeze,
856
+ {code: "fa", label: "Persian", native: "فارسی", flag: "🇮🇷", rtl: true}.freeze,
857
+ {code: "ms", label: "Malay", native: "Bahasa Melayu", flag: "🇲🇾", rtl: false}.freeze,
858
+ {code: "ta", label: "Tamil", native: "தமிழ்", flag: "🇮🇳", rtl: false}.freeze,
859
+ {code: "ca", label: "Catalan", native: "Català", flag: "🇦🇩", rtl: false}.freeze,
860
+ {
861
+ code: "en-GB",
862
+ label: "British English",
863
+ native: "English (United Kingdom)",
864
+ flag: "🇬🇧",
865
+ rtl: false
866
+ }.freeze,
867
+ {
868
+ code: "en-US",
869
+ label: "American English",
870
+ native: "English (United States)",
871
+ flag: "🇺🇸",
872
+ rtl: false
873
+ }.freeze,
874
+ {
875
+ code: "es-419",
876
+ label: "Latin American Spanish",
877
+ native: "Español (Latinoamérica)",
878
+ flag: "🇲🇽",
879
+ rtl: false
880
+ }.freeze,
881
+ {
882
+ code: "fr-CA",
883
+ label: "Canadian French",
884
+ native: "Français (Canada)",
885
+ flag: "🇨🇦",
886
+ rtl: false
887
+ }.freeze,
888
+ {
889
+ code: "de-AT",
890
+ label: "Austrian German",
891
+ native: "Deutsch (Österreich)",
892
+ flag: "🇦🇹",
893
+ rtl: false
894
+ }.freeze,
895
+ {
896
+ code: "de-CH",
897
+ label: "Swiss Standard German",
898
+ native: "Deutsch (Schweiz)",
899
+ flag: "🇨🇭",
900
+ rtl: false
901
+ }.freeze,
902
+ {code: "nl-BE", label: "Flemish", native: "Vlaams", flag: "🇧🇪", rtl: false}.freeze,
903
+ {code: "zh-HK", label: "Hong Kong Chinese", native: "繁體中文(香港)", flag: "🇭🇰", rtl: false}.freeze,
904
+ {code: "yue", label: "Cantonese", native: "粵語", flag: "🇭🇰", rtl: false}.freeze,
905
+ {code: "nb", label: "Norwegian Bokmål", native: "Norsk bokmål", flag: "🇳🇴", rtl: false}.freeze,
906
+ {
907
+ code: "nn",
908
+ label: "Norwegian Nynorsk",
909
+ native: "Norsk nynorsk",
910
+ flag: "🇳🇴",
911
+ rtl: false
912
+ }.freeze,
913
+ {code: "sr", label: "Serbian", native: "Српски", flag: "🇷🇸", rtl: false}.freeze,
914
+ {
915
+ code: "sr-Latn",
916
+ label: "Serbian (Latin)",
917
+ native: "Srpski (latinica)",
918
+ flag: "🇷🇸",
919
+ rtl: false
920
+ }.freeze,
921
+ {
922
+ code: "ar-EG",
923
+ label: "Egyptian Arabic",
924
+ native: "العربية (مصر)",
925
+ flag: "🇪🇬",
926
+ rtl: true
927
+ }.freeze,
928
+ {
929
+ code: "ar-MA",
930
+ label: "Moroccan Arabic",
931
+ native: "الدارجة المغربية",
932
+ flag: "🇲🇦",
933
+ rtl: true
934
+ }.freeze,
935
+ {code: "sk", label: "Slovak", native: "Slovenčina", flag: "🇸🇰", rtl: false}.freeze,
936
+ {code: "sl", label: "Slovenian", native: "Slovenščina", flag: "🇸🇮", rtl: false}.freeze,
937
+ {code: "hr", label: "Croatian", native: "Hrvatski", flag: "🇭🇷", rtl: false}.freeze,
938
+ {code: "bs", label: "Bosnian", native: "Bosanski", flag: "🇧🇦", rtl: false}.freeze,
939
+ {code: "cnr", label: "Montenegrin", native: "Crnogorski", flag: "🇲🇪", rtl: false}.freeze,
940
+ {code: "mk", label: "Macedonian", native: "Македонски", flag: "🇲🇰", rtl: false}.freeze,
941
+ {code: "bg", label: "Bulgarian", native: "Български", flag: "🇧🇬", rtl: false}.freeze,
942
+ {code: "be", label: "Belarusian", native: "Беларуская", flag: "🇧🇾", rtl: false}.freeze,
943
+ {
944
+ code: "hsb",
945
+ label: "Upper Sorbian",
946
+ native: "Hornjoserbšćina",
947
+ flag: "🇩🇪",
948
+ rtl: false
949
+ }.freeze,
950
+ {code: "rue", label: "Rusyn", native: "Русиньскый", flag: "🇸🇰", rtl: false}.freeze,
951
+ {code: "lt", label: "Lithuanian", native: "Lietuvių", flag: "🇱🇹", rtl: false}.freeze,
952
+ {code: "lv", label: "Latvian", native: "Latviešu", flag: "🇱🇻", rtl: false}.freeze,
953
+ {code: "et", label: "Estonian", native: "Eesti", flag: "🇪🇪", rtl: false}.freeze,
954
+ {code: "se", label: "Northern Sami", native: "Davvisámegiella", flag: "🇳🇴", rtl: false}.freeze,
955
+ {code: "is", label: "Icelandic", native: "Íslenska", flag: "🇮🇸", rtl: false}.freeze,
956
+ {code: "fo", label: "Faroese", native: "Føroyskt", flag: "🇫🇴", rtl: false}.freeze,
957
+ {code: "kl", label: "Greenlandic", native: "Kalaallisut", flag: "🇬🇱", rtl: false}.freeze,
958
+ {code: "ga", label: "Irish", native: "Gaeilge", flag: "🇮🇪", rtl: false}.freeze,
959
+ {code: "gd", label: "Scottish Gaelic", native: "Gàidhlig", flag: "🇬🇧", rtl: false}.freeze,
960
+ {code: "cy", label: "Welsh", native: "Cymraeg", flag: "🇬🇧", rtl: false}.freeze,
961
+ {code: "kw", label: "Cornish", native: "Kernewek", flag: "🇬🇧", rtl: false}.freeze,
962
+ {code: "gv", label: "Manx", native: "Gaelg", flag: "🇮🇲", rtl: false}.freeze,
963
+ {code: "br", label: "Breton", native: "Brezhoneg", flag: "🇫🇷", rtl: false}.freeze,
964
+ {code: "eu", label: "Basque", native: "Euskara", flag: "🇪🇸", rtl: false}.freeze,
965
+ {code: "gl", label: "Galician", native: "Galego", flag: "🇪🇸", rtl: false}.freeze,
966
+ {code: "ast", label: "Asturian", native: "Asturianu", flag: "🇪🇸", rtl: false}.freeze,
967
+ {code: "an", label: "Aragonese", native: "Aragonés", flag: "🇪🇸", rtl: false}.freeze,
968
+ {code: "oc", label: "Occitan", native: "Occitan", flag: "🇫🇷", rtl: false}.freeze,
969
+ {code: "co", label: "Corsican", native: "Corsu", flag: "🇫🇷", rtl: false}.freeze,
970
+ {code: "sc", label: "Sardinian", native: "Sardu", flag: "🇮🇹", rtl: false}.freeze,
971
+ {code: "fur", label: "Friulian", native: "Furlan", flag: "🇮🇹", rtl: false}.freeze,
972
+ {code: "rm", label: "Romansh", native: "Rumantsch", flag: "🇨🇭", rtl: false}.freeze,
973
+ {
974
+ code: "gsw",
975
+ label: "Alemannic German",
976
+ native: "Schwiizerdütsch",
977
+ flag: "🇨🇭",
978
+ rtl: false
979
+ }.freeze,
980
+ {code: "lb", label: "Luxembourgish", native: "Lëtzebuergesch", flag: "🇱🇺", rtl: false}.freeze,
981
+ {code: "nds", label: "Low German", native: "Plattdüütsch", flag: "🇩🇪", rtl: false}.freeze,
982
+ {code: "bar", label: "Bavarian", native: "Boarisch", flag: "🇩🇪", rtl: false}.freeze,
983
+ {code: "fy", label: "Western Frisian", native: "Frysk", flag: "🇳🇱", rtl: false}.freeze,
984
+ {code: "li", label: "Limburgish", native: "Limburgs", flag: "🇳🇱", rtl: false}.freeze,
985
+ {code: "wa", label: "Walloon", native: "Walon", flag: "🇧🇪", rtl: false}.freeze,
986
+ {code: "mt", label: "Maltese", native: "Malti", flag: "🇲🇹", rtl: false}.freeze,
987
+ {code: "sq", label: "Albanian", native: "Shqip", flag: "🇦🇱", rtl: false}.freeze,
988
+ {code: "la", label: "Latin", native: "Latina", flag: "🇻🇦", rtl: false}.freeze,
989
+ {code: "eo", label: "Esperanto", native: "Esperanto", flag: "🇪🇺", rtl: false}.freeze,
990
+ {code: "yi", label: "Yiddish", native: "ייִדיש", flag: "🇮🇱", rtl: true}.freeze,
991
+ {code: "hy", label: "Armenian", native: "Հայերեն", flag: "🇦🇲", rtl: false}.freeze,
992
+ {code: "ka", label: "Georgian", native: "ქართული", flag: "🇬🇪", rtl: false}.freeze,
993
+ {code: "os", label: "Ossetian", native: "Ирон æвзаг", flag: "🇬🇪", rtl: false}.freeze,
994
+ {code: "ab", label: "Abkhaz", native: "Аԥсшәа", flag: "🇬🇪", rtl: false}.freeze,
995
+ {code: "ce", label: "Chechen", native: "Нохчийн мотт", flag: "🇷🇺", rtl: false}.freeze,
996
+ {code: "az", label: "Azerbaijani", native: "Azərbaycan dili", flag: "🇦🇿", rtl: false}.freeze,
997
+ {code: "kk", label: "Kazakh", native: "Қазақ тілі", flag: "🇰🇿", rtl: false}.freeze,
998
+ {code: "ky", label: "Kyrgyz", native: "Кыргызча", flag: "🇰🇬", rtl: false}.freeze,
999
+ {code: "uz", label: "Uzbek", native: "Oʻzbekcha", flag: "🇺🇿", rtl: false}.freeze,
1000
+ {code: "tk", label: "Turkmen", native: "Türkmençe", flag: "🇹🇲", rtl: false}.freeze,
1001
+ {code: "tt", label: "Tatar", native: "Татар теле", flag: "🇷🇺", rtl: false}.freeze,
1002
+ {code: "ba", label: "Bashkir", native: "Башҡортса", flag: "🇷🇺", rtl: false}.freeze,
1003
+ {code: "cv", label: "Chuvash", native: "Чӑвашла", flag: "🇷🇺", rtl: false}.freeze,
1004
+ {code: "sah", label: "Yakut", native: "Саха тыла", flag: "🇷🇺", rtl: false}.freeze,
1005
+ {code: "ug", label: "Uyghur", native: "ئۇيغۇرچە", flag: "🇨🇳", rtl: true}.freeze,
1006
+ {code: "mn", label: "Mongolian", native: "Монгол хэл", flag: "🇲🇳", rtl: false}.freeze,
1007
+ {code: "bo", label: "Tibetan", native: "བོད་སྐད་", flag: "🇨🇳", rtl: false}.freeze,
1008
+ {code: "dz", label: "Dzongkha", native: "རྫོང་ཁ", flag: "🇧🇹", rtl: false}.freeze,
1009
+ {code: "fa-AF", label: "Dari", native: "دری", flag: "🇦🇫", rtl: true}.freeze,
1010
+ {code: "ps", label: "Pashto", native: "پښتو", flag: "🇦🇫", rtl: true}.freeze,
1011
+ {code: "ku", label: "Kurmanji Kurdish", native: "Kurmancî", flag: "🇹🇷", rtl: false}.freeze,
1012
+ {code: "ckb", label: "Sorani Kurdish", native: "کوردیی ناوەندی", flag: "🇮🇶", rtl: true}.freeze,
1013
+ {code: "syr", label: "Syriac", native: "ܣܘܪܝܝܐ", flag: "🇮🇶", rtl: true}.freeze,
1014
+ {code: "te", label: "Telugu", native: "తెలుగు", flag: "🇮🇳", rtl: false}.freeze,
1015
+ {code: "mr", label: "Marathi", native: "मराठी", flag: "🇮🇳", rtl: false}.freeze,
1016
+ {code: "gu", label: "Gujarati", native: "ગુજરાતી", flag: "🇮🇳", rtl: false}.freeze,
1017
+ {code: "kn", label: "Kannada", native: "ಕನ್ನಡ", flag: "🇮🇳", rtl: false}.freeze,
1018
+ {code: "ml", label: "Malayalam", native: "മലയാളം", flag: "🇮🇳", rtl: false}.freeze,
1019
+ {code: "or", label: "Odia", native: "ଓଡ଼ିଆ", flag: "🇮🇳", rtl: false}.freeze,
1020
+ {code: "pa", label: "Punjabi", native: "ਪੰਜਾਬੀ", flag: "🇮🇳", rtl: false}.freeze,
1021
+ {code: "pa-Arab", label: "Western Punjabi", native: "پنجابی", flag: "🇵🇰", rtl: true}.freeze,
1022
+ {code: "as", label: "Assamese", native: "অসমীয়া", flag: "🇮🇳", rtl: false}.freeze,
1023
+ {code: "mai", label: "Maithili", native: "मैथिली", flag: "🇮🇳", rtl: false}.freeze,
1024
+ {code: "bho", label: "Bhojpuri", native: "भोजपुरी", flag: "🇮🇳", rtl: false}.freeze,
1025
+ {code: "sat", label: "Santali", native: "ᱥᱟᱱᱛᱟᱲᱤ", flag: "🇮🇳", rtl: false}.freeze,
1026
+ {code: "ks", label: "Kashmiri", native: "کٲشُر", flag: "🇮🇳", rtl: true}.freeze,
1027
+ {code: "sa", label: "Sanskrit", native: "संस्कृतम्", flag: "🇮🇳", rtl: false}.freeze,
1028
+ {code: "ne", label: "Nepali", native: "नेपाली", flag: "🇳🇵", rtl: false}.freeze,
1029
+ {code: "si", label: "Sinhala", native: "සිංහල", flag: "🇱🇰", rtl: false}.freeze,
1030
+ {code: "sd", label: "Sindhi", native: "سنڌي", flag: "🇵🇰", rtl: true}.freeze,
1031
+ {code: "dv", label: "Divehi", native: "ދިވެހި", flag: "🇲🇻", rtl: true}.freeze,
1032
+ {code: "km", label: "Khmer", native: "ភាសាខ្មែរ", flag: "🇰🇭", rtl: false}.freeze,
1033
+ {code: "lo", label: "Lao", native: "ລາວ", flag: "🇱🇦", rtl: false}.freeze,
1034
+ {code: "my", label: "Burmese", native: "မြန်မာဘာသာ", flag: "🇲🇲", rtl: false}.freeze,
1035
+ {code: "jv", label: "Javanese", native: "Basa Jawa", flag: "🇮🇩", rtl: false}.freeze,
1036
+ {code: "su", label: "Sundanese", native: "Basa Sunda", flag: "🇮🇩", rtl: false}.freeze,
1037
+ {code: "fil", label: "Filipino", native: "Filipino", flag: "🇵🇭", rtl: false}.freeze,
1038
+ {code: "tl", label: "Tagalog", native: "Tagalog", flag: "🇵🇭", rtl: false}.freeze,
1039
+ {code: "ceb", label: "Cebuano", native: "Binisaya", flag: "🇵🇭", rtl: false}.freeze,
1040
+ {code: "ilo", label: "Ilocano", native: "Ilokano", flag: "🇵🇭", rtl: false}.freeze,
1041
+ {code: "war", label: "Waray", native: "Winaray", flag: "🇵🇭", rtl: false}.freeze,
1042
+ {code: "sw", label: "Swahili", native: "Kiswahili", flag: "🇰🇪", rtl: false}.freeze,
1043
+ {code: "am", label: "Amharic", native: "አማርኛ", flag: "🇪🇹", rtl: false}.freeze,
1044
+ {code: "ti", label: "Tigrinya", native: "ትግርኛ", flag: "🇪🇷", rtl: false}.freeze,
1045
+ {code: "om", label: "Oromo", native: "Afaan Oromoo", flag: "🇪🇹", rtl: false}.freeze,
1046
+ {code: "so", label: "Somali", native: "Soomaali", flag: "🇸🇴", rtl: false}.freeze,
1047
+ {code: "ha", label: "Hausa", native: "Hausa", flag: "🇳🇬", rtl: false}.freeze,
1048
+ {code: "yo", label: "Yoruba", native: "Yorùbá", flag: "🇳🇬", rtl: false}.freeze,
1049
+ {code: "ig", label: "Igbo", native: "Igbo", flag: "🇳🇬", rtl: false}.freeze,
1050
+ {code: "af", label: "Afrikaans", native: "Afrikaans", flag: "🇿🇦", rtl: false}.freeze,
1051
+ {code: "zu", label: "Zulu", native: "isiZulu", flag: "🇿🇦", rtl: false}.freeze,
1052
+ {code: "xh", label: "Xhosa", native: "isiXhosa", flag: "🇿🇦", rtl: false}.freeze,
1053
+ {code: "st", label: "Sesotho", native: "Sesotho", flag: "🇱🇸", rtl: false}.freeze,
1054
+ {code: "nso", label: "Sepedi", native: "Sepedi", flag: "🇿🇦", rtl: false}.freeze,
1055
+ {code: "tn", label: "Setswana", native: "Setswana", flag: "🇧🇼", rtl: false}.freeze,
1056
+ {code: "ts", label: "Xitsonga", native: "Xitsonga", flag: "🇿🇦", rtl: false}.freeze,
1057
+ {code: "ve", label: "Tshivenda", native: "Tshivenḓa", flag: "🇿🇦", rtl: false}.freeze,
1058
+ {code: "ss", label: "Swati", native: "siSwati", flag: "🇸🇿", rtl: false}.freeze,
1059
+ {code: "nr", label: "Southern Ndebele", native: "isiNdebele", flag: "🇿🇦", rtl: false}.freeze,
1060
+ {code: "sn", label: "Shona", native: "chiShona", flag: "🇿🇼", rtl: false}.freeze,
1061
+ {code: "ny", label: "Chichewa", native: "Chichewa", flag: "🇲🇼", rtl: false}.freeze,
1062
+ {code: "rw", label: "Kinyarwanda", native: "Ikinyarwanda", flag: "🇷🇼", rtl: false}.freeze,
1063
+ {code: "rn", label: "Kirundi", native: "Ikirundi", flag: "🇧🇮", rtl: false}.freeze,
1064
+ {code: "lg", label: "Luganda", native: "Luganda", flag: "🇺🇬", rtl: false}.freeze,
1065
+ {code: "ln", label: "Lingala", native: "Lingála", flag: "🇨🇩", rtl: false}.freeze,
1066
+ {code: "kg", label: "Kikongo", native: "Kikongo", flag: "🇨🇩", rtl: false}.freeze,
1067
+ {code: "wo", label: "Wolof", native: "Wolof", flag: "🇸🇳", rtl: false}.freeze,
1068
+ {code: "ff", label: "Fula", native: "Pulaar", flag: "🇸🇳", rtl: false}.freeze,
1069
+ {code: "bm", label: "Bambara", native: "Bamanankan", flag: "🇲🇱", rtl: false}.freeze,
1070
+ {code: "ak", label: "Akan", native: "Akan", flag: "🇬🇭", rtl: false}.freeze,
1071
+ {code: "tw", label: "Twi", native: "Twi", flag: "🇬🇭", rtl: false}.freeze,
1072
+ {code: "ee", label: "Ewe", native: "Eʋegbe", flag: "🇬🇭", rtl: false}.freeze,
1073
+ {code: "mg", label: "Malagasy", native: "Malagasy", flag: "🇲🇬", rtl: false}.freeze,
1074
+ {code: "kab", label: "Kabyle", native: "Taqbaylit", flag: "🇩🇿", rtl: false}.freeze,
1075
+ {code: "tzm", label: "Tamazight", native: "ⵜⴰⵎⴰⵣⵉⵖⵜ", flag: "🇲🇦", rtl: false}.freeze,
1076
+ {code: "sg", label: "Sango", native: "Sängö", flag: "🇨🇫", rtl: false}.freeze,
1077
+ {code: "ht", label: "Haitian Creole", native: "Kreyòl ayisyen", flag: "🇭🇹", rtl: false}.freeze,
1078
+ {code: "pap", label: "Papiamento", native: "Papiamentu", flag: "🇦🇼", rtl: false}.freeze,
1079
+ {code: "srn", label: "Sranan Tongo", native: "Sranantongo", flag: "🇸🇷", rtl: false}.freeze,
1080
+ {code: "qu", label: "Quechua", native: "Runa Simi", flag: "🇵🇪", rtl: false}.freeze,
1081
+ {code: "gn", label: "Guarani", native: "Avañe'ẽ", flag: "🇵🇾", rtl: false}.freeze,
1082
+ {code: "ay", label: "Aymara", native: "Aymar aru", flag: "🇧🇴", rtl: false}.freeze,
1083
+ {code: "nah", label: "Nahuatl", native: "Nāhuatl", flag: "🇲🇽", rtl: false}.freeze,
1084
+ {code: "chr", label: "Cherokee", native: "ᏣᎳᎩ", flag: "🇺🇸", rtl: false}.freeze,
1085
+ {code: "nv", label: "Navajo", native: "Diné bizaad", flag: "🇺🇸", rtl: false}.freeze,
1086
+ {code: "iu", label: "Inuktitut", native: "ᐃᓄᒃᑎᑐᑦ", flag: "🇨🇦", rtl: false}.freeze,
1087
+ {code: "mi", label: "Maori", native: "Te reo Māori", flag: "🇳🇿", rtl: false}.freeze,
1088
+ {code: "sm", label: "Samoan", native: "Gagana Sāmoa", flag: "🇼🇸", rtl: false}.freeze,
1089
+ {code: "to", label: "Tongan", native: "Lea faka-Tonga", flag: "🇹🇴", rtl: false}.freeze,
1090
+ {code: "fj", label: "Fijian", native: "Na Vosa Vakaviti", flag: "🇫🇯", rtl: false}.freeze,
1091
+ {code: "haw", label: "Hawaiian", native: "ʻŌlelo Hawaiʻi", flag: "🇺🇸", rtl: false}.freeze,
1092
+ {code: "ty", label: "Tahitian", native: "Reo Tahiti", flag: "🇵🇫", rtl: false}.freeze,
1093
+ {code: "ch", label: "Chamorro", native: "Chamoru", flag: "🇬🇺", rtl: false}.freeze,
1094
+ {code: "mh", label: "Marshallese", native: "Kajin M̧ajeļ", flag: "🇲🇭", rtl: false}.freeze,
1095
+ {code: "tpi", label: "Tok Pisin", native: "Tok Pisin", flag: "🇵🇬", rtl: false}.freeze
1096
+ ].freeze
1097
+
1098
+ LOGIN_BACKGROUND_KINDS = {PRESET: "preset", COLOR: "color", IMAGE: "image"}.freeze
1099
+
1100
+ LOGIN_BACKGROUND_PRESETS = {
1101
+ DUSK: "dusk",
1102
+ MIST: "mist",
1103
+ SAND: "sand",
1104
+ NIGHT: "night",
1105
+ MEADOW: "meadow",
1106
+ DOTS: "dots",
1107
+ BRUSH: "brush",
1108
+ TRAIL: "trail",
1109
+ EMBER: "ember",
1110
+ CANVAS: "canvas",
1111
+ BLOOM: "bloom",
1112
+ FIELD: "field",
1113
+ WANDERER: "wanderer",
1114
+ GOLD: "gold"
1115
+ }.freeze
1116
+
1117
+ LOGIN_LOGOS = {DARK: "dark", LIGHT: "light"}.freeze
1118
+
1119
+ MAILBOX_BOUNCE_OUTCOMES = {
1120
+ FAILED: "failed",
1121
+ DELAYED: "delayed",
1122
+ DELIVERED: "delivered",
1123
+ RELAYED: "relayed",
1124
+ EXPANDED: "expanded"
1125
+ }.freeze
1126
+
1127
+ MAILBOX_FOLDER_ROLES = {
1128
+ INBOX: "inbox",
1129
+ SENT: "sent",
1130
+ DRAFTS: "drafts",
1131
+ SPAM: "spam",
1132
+ TRASH: "trash",
1133
+ ARCHIVE: "archive",
1134
+ ALL: "all",
1135
+ FLAGGED: "flagged",
1136
+ IMPORTANT: "important",
1137
+ FOLDER: "folder"
1138
+ }.freeze
1139
+
1140
+ MAILBOX_IMPORT_SOURCES = {FILE: "file", IMAP: "imap", MICROSOFT: "microsoft"}.freeze
1141
+
1142
+ MAILBOX_PROVIDERS = {
1143
+ GMAIL: "gmail",
1144
+ OUTLOOK: "outlook",
1145
+ YAHOO: "yahoo",
1146
+ AOL: "aol",
1147
+ ICLOUD: "icloud",
1148
+ FASTMAIL: "fastmail",
1149
+ ZOHO: "zoho",
1150
+ OTHER: "other"
1151
+ }.freeze
1152
+
1153
+ MAILBOX_SECURITIES = {TLS: "tls", STARTTLS: "starttls"}.freeze
1154
+
1155
+ MAILBOX_SETTINGS_SOURCES = {PRESET: "preset", MX: "mx", AUTOCONFIG: "autoconfig", SRV: "srv", GIVEN: "given"}.freeze
1156
+
1157
+ MAILBOX_SIGN_INS = {APP_PASSWORD: "app-password", PASSWORD: "password", MICROSOFT: "microsoft"}.freeze
1158
+
1159
+ MAIL_APP_PROTOCOLS = {IMAP: "imap", SMTP: "smtp", POP3: "pop3", CALDAV: "caldav", CARDDAV: "carddav"}.freeze
1160
+
1161
+ MAIL_APP_SECURITIES = {SSL_TLS: "ssl-tls", STARTTLS: "starttls"}.freeze
1162
+
1163
+ MAIL_SERVICES = {
1164
+ PLATFORM: "platform",
1165
+ GMAIL: "gmail",
1166
+ OUTLOOK: "outlook",
1167
+ ICLOUD: "icloud",
1168
+ YAHOO: "yahoo",
1169
+ PROTON: "proton",
1170
+ ZOHO: "zoho",
1171
+ FASTMAIL: "fastmail",
1172
+ RESEND: "resend",
1173
+ SENDGRID: "sendgrid",
1174
+ MAILGUN: "mailgun",
1175
+ POSTMARK: "postmark",
1176
+ MAILCHIMP: "mailchimp",
1177
+ BREVO: "brevo",
1178
+ SPARKPOST: "sparkpost",
1179
+ HUBSPOT: "hubspot",
1180
+ AMAZON_SES: "amazon-ses"
1181
+ }.freeze
1182
+
1183
+ MESSAGE_ENCRYPTION_FORMATS = {
1184
+ PGP_MIME: "pgp-mime",
1185
+ PGP_SIGNED: "pgp-signed",
1186
+ PGP_INLINE: "pgp-inline",
1187
+ SMIME_ENCRYPTED: "smime-encrypted",
1188
+ SMIME_SIGNED: "smime-signed"
1189
+ }.freeze
1190
+
1191
+ PAGE_LIMITS = {MAX_LIMIT: 100, DEFAULT_LIMIT: 25}.freeze
1192
+
1193
+ PAID_PLAN_IDS = {STARTER: "starter", BUSINESS: "business", ENTERPRISE: "enterprise"}.freeze
1194
+
1195
+ PASSKEY_TRANSPORTS = {
1196
+ INTERNAL: "internal",
1197
+ HYBRID: "hybrid",
1198
+ USB: "usb",
1199
+ NFC: "nfc",
1200
+ BLE: "ble",
1201
+ SMART_CARD: "smart-card",
1202
+ CABLE: "cable"
1203
+ }.freeze
1204
+
1205
+ PAY_AS_YOU_GO_LIMITS_CENTS = [1000, 2500, 5000, 10000, 25000, 50000, 100000, 250000, 500000].freeze
1206
+
1207
+ PEOPLE_SORTS = {RECENT: "recent", NAME: "name", THREADS: "threads"}.freeze
1208
+
1209
+ PLAN_BLOCKERS = {DOMAINS: "domains", PEOPLE: "people", SENDS: "sends"}.freeze
1210
+
1211
+ PLAN_IDS = {FREE: "free", STARTER: "starter", BUSINESS: "business", ENTERPRISE: "enterprise"}.freeze
1212
+
1213
+ PROVIDER_IMPORT_DOMAIN_STATES = {ABSENT: "absent", ADDED: "added", VERIFIED: "verified"}.freeze
1214
+
1215
+ PROVIDER_IMPORT_PROVIDERS = {
1216
+ RESEND: "resend",
1217
+ SENDGRID: "sendgrid",
1218
+ POSTMARK: "postmark",
1219
+ MAILGUN: "mailgun",
1220
+ MAILCHIMP: "mailchimp"
1221
+ }.freeze
1222
+
1223
+ PROVIDER_IMPORT_RESOURCES = {
1224
+ SUPPRESSIONS: "suppressions",
1225
+ AUDIENCES: "audiences",
1226
+ CONTACTS: "contacts",
1227
+ TEMPLATES: "templates",
1228
+ WEBHOOKS: "webhooks",
1229
+ DOMAINS: "domains",
1230
+ API_KEYS: "api-keys"
1231
+ }.freeze
1232
+
1233
+ PROVIDER_IMPORT_STATUSES = {
1234
+ QUEUED: "queued",
1235
+ RUNNING: "running",
1236
+ COMPLETED: "completed",
1237
+ FAILED: "failed",
1238
+ CANCELLED: "cancelled"
1239
+ }.freeze
1240
+
1241
+ PUSH_PLATFORMS = {IOS: "ios", ANDROID: "android"}.freeze
1242
+
1243
+ RAW_MESSAGE_SOURCES = {ORIGINAL: "original", REBUILT: "rebuilt"}.freeze
1244
+
1245
+ REPLY_SUGGESTION_STATES = {READY: "ready", PENDING: "pending", NONE: "none"}.freeze
1246
+
1247
+ REWRITE_ACTIONS = {
1248
+ SHORTEN: "shorten",
1249
+ LENGTHEN: "lengthen",
1250
+ REPHRASE: "rephrase",
1251
+ FORMAL: "formal",
1252
+ CASUAL: "casual",
1253
+ CUSTOM: "custom"
1254
+ }.freeze
1255
+
1256
+ REWRITE_TARGETS = {SUBJECT: "subject", BODY: "body"}.freeze
1257
+
1258
+ RULE_ACTIONS = {
1259
+ LABEL: "label",
1260
+ REMOVE_LABEL: "remove_label",
1261
+ ARCHIVE: "archive",
1262
+ MARK_READ: "mark_read",
1263
+ STAR: "star",
1264
+ SPAM: "spam",
1265
+ TRASH: "trash",
1266
+ FORWARD: "forward",
1267
+ REPLY: "reply",
1268
+ BLOCK_SENDER: "block_sender",
1269
+ REJECT: "reject"
1270
+ }.freeze
1271
+
1272
+ RULE_FIELDS = {
1273
+ FROM: "from",
1274
+ FROM_DOMAIN: "from_domain",
1275
+ ENVELOPE_FROM: "envelope_from",
1276
+ TO: "to",
1277
+ CC: "cc",
1278
+ BCC: "bcc",
1279
+ RECIPIENT: "recipient",
1280
+ REPLY_TO: "reply_to",
1281
+ DELIVERED_TO: "delivered_to",
1282
+ SUBJECT: "subject",
1283
+ BODY: "body",
1284
+ HEADER: "header",
1285
+ LIST_ID: "list_id",
1286
+ ATTACHMENT_NAME: "attachment_name",
1287
+ ATTACHMENT_TYPE: "attachment_type",
1288
+ HAS_ATTACHMENT: "has_attachment",
1289
+ ATTACHMENT_SIZE: "attachment_size",
1290
+ MESSAGE_SIZE: "message_size",
1291
+ SPAM: "spam",
1292
+ BOUNCED: "bounced",
1293
+ HOUR: "hour",
1294
+ WEEKDAY: "weekday"
1295
+ }.freeze
1296
+
1297
+ RULE_FILED_FOLDERS = {ARCHIVE: "archive", SPAM: "spam", TRASH: "trash"}.freeze
1298
+
1299
+ RULE_OPERATORS = {
1300
+ MATCHES: "matches",
1301
+ CONTAINS: "contains",
1302
+ EQUALS: "equals",
1303
+ STARTS_WITH: "starts_with",
1304
+ ENDS_WITH: "ends_with",
1305
+ GT: "gt",
1306
+ LT: "lt"
1307
+ }.freeze
1308
+
1309
+ SECURITY_EVENT_KINDS = {
1310
+ SIGN_IN: "sign-in",
1311
+ SESSION_REVOKED: "session-revoked",
1312
+ SESSIONS_REVOKED: "sessions-revoked",
1313
+ PASSWORD_CHANGED: "password-changed",
1314
+ PASSWORD_RESET: "password-reset",
1315
+ TWO_FACTOR_ENABLED: "two-factor-enabled",
1316
+ TWO_FACTOR_DISABLED: "two-factor-disabled",
1317
+ PASSKEY_ADDED: "passkey-added",
1318
+ PASSKEY_REMOVED: "passkey-removed",
1319
+ MEMBER_ADDED: "member-added",
1320
+ MEMBER_REMOVED: "member-removed",
1321
+ MEMBER_ROLE_CHANGED: "member-role-changed",
1322
+ INVITATION_SENT: "invitation-sent",
1323
+ INVITATION_REVOKED: "invitation-revoked",
1324
+ ROLE_CREATED: "role-created",
1325
+ ROLE_CHANGED: "role-changed",
1326
+ ROLE_DELETED: "role-deleted",
1327
+ TWO_FACTOR_REQUIREMENT_CHANGED: "two-factor-requirement-changed",
1328
+ ADDRESS_PASSWORD_SET: "address-password-set",
1329
+ ADDRESS_PASSWORD_REMOVED: "address-password-removed",
1330
+ DIRECTORY_SYNC_CONNECTED: "directory-sync-connected",
1331
+ DIRECTORY_SYNC_DISCONNECTED: "directory-sync-disconnected",
1332
+ DIRECTORY_SYNC_TOKEN_ROTATED: "directory-sync-token-rotated",
1333
+ DIRECTORY_SYNC_CHANGED: "directory-sync-changed",
1334
+ CONNECTOR_CONNECTED: "connector-connected",
1335
+ CONNECTOR_DISCONNECTED: "connector-disconnected",
1336
+ CONNECTOR_CHANGED: "connector-changed",
1337
+ OWNERSHIP_OFFERED: "ownership-offered",
1338
+ OWNERSHIP_TRANSFERRED: "ownership-transferred"
1339
+ }.freeze
1340
+
1341
+ SECURITY_EVENT_SCOPES = {ACCOUNT: "account", WORKSPACE: "workspace"}.freeze
1342
+
1343
+ SEGMENT_FIELDS = {
1344
+ EMAIL: "email",
1345
+ NAME: "name",
1346
+ SOURCE: "source",
1347
+ CREATED: "created",
1348
+ AUDIENCE: "audience",
1349
+ OPENED: "opened",
1350
+ CLICKED: "clicked",
1351
+ ENGAGED: "engaged",
1352
+ EVENT: "event",
1353
+ ATTRIBUTE: "attribute"
1354
+ }.freeze
1355
+
1356
+ SEGMENT_MATCHES = {ALL: "all", ANY: "any"}.freeze
1357
+
1358
+ SEGMENT_OPERATORS = {
1359
+ IS: "is",
1360
+ IS_NOT: "is_not",
1361
+ CONTAINS: "contains",
1362
+ NOT_CONTAINS: "not_contains",
1363
+ ENDS_WITH: "ends_with",
1364
+ IS_SET: "is_set",
1365
+ IS_NOT_SET: "is_not_set",
1366
+ WITHIN_DAYS: "within_days",
1367
+ NOT_WITHIN_DAYS: "not_within_days",
1368
+ IN: "in",
1369
+ NOT_IN: "not_in"
1370
+ }.freeze
1371
+
1372
+ SENDER_AVATAR_KINDS = {MEMBER: "member", CONTACT: "contact", LOOKUP: "lookup", GENERATED: "generated"}.freeze
1373
+
1374
+ SENDING_POOL_STATUSES = {
1375
+ PENDING: "pending",
1376
+ WARMING: "warming",
1377
+ ACTIVE: "active",
1378
+ RELEASING: "releasing",
1379
+ RELEASED: "released",
1380
+ FAILED: "failed"
1381
+ }.freeze
1382
+
1383
+ SENDING_STREAM_PAUSE_REASONS = {BOUNCE_RATE: "bounce_rate", COMPLAINT_RATE: "complaint_rate"}.freeze
1384
+
1385
+ SENDING_STREAM_STATUSES = {ACTIVE: "active", PAUSED: "paused"}.freeze
1386
+
1387
+ SEND_STREAMS = {TRANSACTIONAL: "transactional", BROADCAST: "broadcast"}.freeze
1388
+
1389
+ SESSION_AUTH_METHODS = {
1390
+ PASSWORD: "password",
1391
+ TOTP: "totp",
1392
+ BACKUP_CODE: "backup-code",
1393
+ PASSKEY: "passkey",
1394
+ EMAIL_LINK: "email-link",
1395
+ HANDOFF: "handoff"
1396
+ }.freeze
1397
+
1398
+ SESSION_DEVICE_KINDS = {BROWSER: "browser", APP: "app", UNKNOWN: "unknown"}.freeze
1399
+
1400
+ SETTINGS_COLOR_THEMES = {LIGHT: "light", DARK: "dark", SYSTEM: "system"}.freeze
1401
+
1402
+ SETTINGS_DATE_FORMATS = {DMY: "dmy", MDY: "mdy", YMD: "ymd"}.freeze
1403
+
1404
+ SETTINGS_IMAGE_COMPRESSIONS = {LOW: "low", MEDIUM: "medium", ORIGINAL: "original"}.freeze
1405
+
1406
+ SETTINGS_TIME_FORMATS = {H12: "12h", H24: "24h"}.freeze
1407
+
1408
+ SETTINGS_WEEK_STARTS = {MONDAY: "monday", SUNDAY: "sunday"}.freeze
1409
+
1410
+ STEP_UP_ERROR_CODES = {
1411
+ STEP_UP_REQUIRED: "step_up_required",
1412
+ STEP_UP_NOT_APPLICABLE: "step_up_not_applicable",
1413
+ STEP_UP_THROTTLED: "step_up_throttled",
1414
+ STEP_UP_UNDELIVERABLE: "step_up_undeliverable",
1415
+ STEP_UP_CODE_INVALID: "step_up_code_invalid",
1416
+ STEP_UP_CODE_EXPIRED: "step_up_code_expired",
1417
+ STEP_UP_LOCKED: "step_up_locked"
1418
+ }.freeze
1419
+
1420
+ STEP_UP_METHODS = {EMAIL: "email", TOTP: "totp"}.freeze
1421
+
1422
+ SUBSCRIPTION_BATCH_REFUSALS = {ALREADY_UNSUBSCRIBED: "already_unsubscribed", NO_METHOD: "no_method"}.freeze
1423
+
1424
+ SUBSCRIPTION_DESTINATIONS = {ARCHIVE: "archive", BIN: "bin", LABEL: "label"}.freeze
1425
+
1426
+ SUBSCRIPTION_SORTS = {
1427
+ RECENT: "recent",
1428
+ MOST: "most",
1429
+ EMAILS: "emails",
1430
+ READ: "read",
1431
+ UNREAD: "unread",
1432
+ NAME: "name"
1433
+ }.freeze
1434
+
1435
+ SUBSCRIPTION_STATUSES = {ACTIVE: "active", KEPT: "kept", UNSUBSCRIBED: "unsubscribed"}.freeze
1436
+
1437
+ SUPPRESSION_REASONS = {BOUNCE: "bounce", COMPLAINT: "complaint", MANUAL: "manual"}.freeze
1438
+
1439
+ TASK_APPROVAL_STATUSES = {
1440
+ PENDING: "pending",
1441
+ APPROVED: "approved",
1442
+ DENIED: "denied",
1443
+ EXPIRED: "expired",
1444
+ CANCELLED: "cancelled"
1445
+ }.freeze
1446
+
1447
+ TASK_AUTONOMIES = {ASK: "ask", ORGANIZE: "organize", REPLY: "reply"}.freeze
1448
+
1449
+ TASK_CADENCES = {HOURLY: "hourly", DAILY: "daily", MONTHLY: "monthly"}.freeze
1450
+
1451
+ TASK_MODELS = {STANDARD: "standard", ADVANCED: "advanced"}.freeze
1452
+
1453
+ TASK_NOTIFY_MODES = {ALWAYS: "always", ATTENTION: "attention", NEVER: "never"}.freeze
1454
+
1455
+ TASK_PAUSE_REASONS = {USER: "user", FAILURES: "failures", PLAN_LIMIT: "plan_limit"}.freeze
1456
+
1457
+ TASK_RUN_ERRORS = {
1458
+ AI_LIMIT: "ai_limit",
1459
+ AI_UNAVAILABLE: "ai_unavailable",
1460
+ NO_PROGRESS: "no_progress",
1461
+ ATTEMPTS: "attempts"
1462
+ }.freeze
1463
+
1464
+ TASK_RUN_STATUSES = {
1465
+ QUEUED: "queued",
1466
+ RUNNING: "running",
1467
+ WAITING: "waiting",
1468
+ DONE: "done",
1469
+ FAILED: "failed",
1470
+ CANCELLED: "cancelled"
1471
+ }.freeze
1472
+
1473
+ TASK_RUN_STEP_ROLES = {USER: "user", ASSISTANT: "assistant"}.freeze
1474
+
1475
+ TASK_STATUSES = {ACTIVE: "active", PAUSED: "paused"}.freeze
1476
+
1477
+ TASK_TOOLKITS = {
1478
+ CONTACTS: "contacts",
1479
+ AUDIENCES: "audiences",
1480
+ TEMPLATES: "templates",
1481
+ TRACKING: "tracking",
1482
+ TRANSLATE: "translate",
1483
+ FILES: "files",
1484
+ NOTES: "notes",
1485
+ DRAFTS: "drafts",
1486
+ SENT: "sent",
1487
+ INSIGHTS: "insights",
1488
+ SUBSCRIPTIONS: "subscriptions",
1489
+ CALENDAR: "calendar",
1490
+ KNOWLEDGE: "knowledge",
1491
+ CONNECTORS: "connectors",
1492
+ WEB: "web"
1493
+ }.freeze
1494
+
1495
+ TASK_TRIGGER_KINDS = {SCHEDULE: "schedule", MAIL: "mail", MANUAL: "manual"}.freeze
1496
+
1497
+ TEMPLATE_IMAGE_TYPES = {
1498
+ PNG: "image/png",
1499
+ JPEG: "image/jpeg",
1500
+ WEBP: "image/webp",
1501
+ GIF: "image/gif",
1502
+ SVG: "image/svg+xml"
1503
+ }.freeze
1504
+
1505
+ THREAD_NOTE_COLORS = {
1506
+ DEFAULT: "default",
1507
+ RED: "red",
1508
+ ORANGE: "orange",
1509
+ YELLOW: "yellow",
1510
+ GREEN: "green",
1511
+ BLUE: "blue",
1512
+ PURPLE: "purple",
1513
+ PINK: "pink"
1514
+ }.freeze
1515
+
1516
+ THREAD_SORTS = {NEWEST: "newest", OLDEST: "oldest", SENDER: "sender", SUBJECT: "subject"}.freeze
1517
+
1518
+ THREAD_SUMMARY_STATES = {READY: "ready", PENDING: "pending", FAILED: "failed", NONE: "none"}.freeze
1519
+
1520
+ UNSUBSCRIBE_METHODS = {ONE_CLICK: "one-click", EMAIL: "email", LINK: "link"}.freeze
1521
+
1522
+ UNSUBSCRIBE_SOURCES = {
1523
+ LINK: "link",
1524
+ ONE_CLICK: "one_click",
1525
+ MANUAL: "manual",
1526
+ COMPLAINT: "complaint",
1527
+ IMPORT: "import"
1528
+ }.freeze
1529
+
1530
+ USERNAME_STATUSES = {
1531
+ AVAILABLE: "available",
1532
+ CURRENT: "current",
1533
+ TAKEN: "taken",
1534
+ RESERVED: "reserved",
1535
+ INVALID: "invalid",
1536
+ TOO_SHORT: "too_short",
1537
+ TOO_LONG: "too_long"
1538
+ }.freeze
1539
+
1540
+ WEBHOOK_DEAD_LETTER_FILTERS = {OPEN: "open", REPLAYED: "replayed", DISCARDED: "discarded", ALL: "all"}.freeze
1541
+
1542
+ WEBHOOK_DEAD_LETTER_REPLAY_OUTCOMES = {DELIVERED: "delivered", FAILED: "failed", REFUSED: "refused", SKIPPED: "skipped"}.freeze
1543
+
1544
+ WEBHOOK_DEAD_LETTER_STATUSES = {OPEN: "open", REPLAYED: "replayed", DISCARDED: "discarded"}.freeze
1545
+
1546
+ WEBHOOK_EVENTS = {
1547
+ EMAIL_RECEIVED: "email.received",
1548
+ EMAIL_REPLIED: "email.replied",
1549
+ EMAIL_SENT: "email.sent",
1550
+ EMAIL_FAILED: "email.failed",
1551
+ EMAIL_CANCELLED: "email.cancelled",
1552
+ EMAIL_SCHEDULED: "email.scheduled",
1553
+ EMAIL_QUEUED: "email.queued",
1554
+ EMAIL_DELIVERED: "email.delivered",
1555
+ EMAIL_DELIVERY_DELAYED: "email.delivery_delayed",
1556
+ EMAIL_BOUNCED: "email.bounced",
1557
+ EMAIL_COMPLAINED: "email.complained",
1558
+ EMAIL_SUPPRESSED: "email.suppressed",
1559
+ EMAIL_OPENED: "email.opened",
1560
+ EMAIL_CLICKED: "email.clicked",
1561
+ EMAIL_DOWNLOADED: "email.downloaded",
1562
+ EMAIL_ROUTED: "email.routed",
1563
+ DOMAIN_VERIFIED: "domain.verified",
1564
+ DOMAIN_SENDING_CHANGED: "domain.sending_changed",
1565
+ DOMAIN_DELETED: "domain.deleted",
1566
+ SUPPRESSION_ADDED: "suppression.added",
1567
+ SUPPRESSION_REMOVED: "suppression.removed",
1568
+ FILE_UPLOADED: "file.uploaded",
1569
+ FILE_DELETED: "file.deleted",
1570
+ FORM_SUBMITTED: "form.submitted",
1571
+ FORM_CONFIRMED: "form.confirmed",
1572
+ AUTOMATION_ENTERED: "automation.entered",
1573
+ AUTOMATION_EXITED: "automation.exited",
1574
+ AUTOMATION_PAUSED: "automation.paused",
1575
+ AUTOMATION_RESUMED: "automation.resumed",
1576
+ AUTOMATION_WEBHOOK: "automation.webhook",
1577
+ CONTACT_CREATED: "contact.created",
1578
+ CONTACT_UPDATED: "contact.updated",
1579
+ CONTACT_DELETED: "contact.deleted",
1580
+ CONTACT_UNSUBSCRIBED: "contact.unsubscribed",
1581
+ CONTACT_RESUBSCRIBED: "contact.resubscribed",
1582
+ SENDING_PAUSED: "sending.paused",
1583
+ SENDING_RESUMED: "sending.resumed",
1584
+ CONNECTOR_CONNECTED: "connector.connected",
1585
+ CONNECTOR_DISCONNECTED: "connector.disconnected",
1586
+ CONNECTOR_NEEDS_ATTENTION: "connector.needs_attention",
1587
+ TASK_RUN_COMPLETED: "task.run.completed",
1588
+ TASK_RUN_FAILED: "task.run.failed",
1589
+ TASK_RUN_CANCELLED: "task.run.cancelled",
1590
+ APPROVAL_REQUESTED: "approval.requested",
1591
+ BOOKING_CREATED: "booking.created",
1592
+ BOOKING_CONFIRMED: "booking.confirmed",
1593
+ BOOKING_RESCHEDULED: "booking.rescheduled",
1594
+ BOOKING_CANCELLED: "booking.cancelled",
1595
+ BROADCAST_SENDING: "broadcast.sending",
1596
+ BROADCAST_SENT: "broadcast.sent",
1597
+ BROADCAST_FAILED: "broadcast.failed",
1598
+ BROADCAST_CANCELLED: "broadcast.cancelled",
1599
+ ADDRESS_EXPIRED: "address.expired"
1600
+ }.freeze
1601
+
1602
+ WEBHOOK_REPLAY_ERROR_CODES = {
1603
+ RESOURCE_NOT_FOUND: "resource_not_found",
1604
+ WEBHOOK_DISABLED: "webhook_disabled",
1605
+ EVENT_NOT_SUBSCRIBED: "event_not_subscribed",
1606
+ EVENT_OUT_OF_SCOPE: "event_out_of_scope",
1607
+ DELIVERY_NOT_REPLAYABLE: "delivery_not_replayable",
1608
+ RETRY_IN_PROGRESS: "retry_in_progress",
1609
+ REPLAY_IN_PROGRESS: "replay_in_progress"
1610
+ }.freeze
1611
+
1612
+ WEBHOOK_RETRY_POLICIES = {STANDARD: "standard", EXTENDED: "extended"}.freeze
1613
+
1614
+ WEBHOOK_ROUTED_SOURCES = {ADDRESS: "address", ROUTE: "route"}.freeze
1615
+
1616
+ WEBHOOK_SIGNATURE_HEADERS = {
1617
+ SIGNATURE: "X-Webhook-Signature",
1618
+ EVENT: "X-Webhook-Event",
1619
+ DELIVERY: "X-Webhook-Delivery"
1620
+ }.freeze
1621
+ end