@aranova/tracking-next 1.0.0 → 1.2.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.
Files changed (48) hide show
  1. package/README.md +48 -1
  2. package/dist/blog-server.js.map +1 -1
  3. package/dist/blog-server.mjs.map +1 -1
  4. package/dist/blog.js.map +1 -1
  5. package/dist/blog.mjs.map +1 -1
  6. package/dist/calendar-server.d.mts +1 -1
  7. package/dist/calendar-server.d.ts +1 -1
  8. package/dist/calendar-server.js.map +1 -1
  9. package/dist/calendar-server.mjs.map +1 -1
  10. package/dist/calendar.d.mts +14 -3
  11. package/dist/calendar.d.ts +14 -3
  12. package/dist/calendar.js +212 -18
  13. package/dist/calendar.js.map +1 -1
  14. package/dist/calendar.mjs +211 -18
  15. package/dist/calendar.mjs.map +1 -1
  16. package/dist/client.d.mts +9 -3
  17. package/dist/client.d.ts +9 -3
  18. package/dist/client.js +550 -194
  19. package/dist/client.js.map +1 -1
  20. package/dist/client.mjs +550 -194
  21. package/dist/client.mjs.map +1 -1
  22. package/dist/index.d.mts +10 -9
  23. package/dist/index.d.ts +10 -9
  24. package/dist/index.js +491 -284
  25. package/dist/index.js.map +1 -1
  26. package/dist/index.mjs +490 -284
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/{ingest-typed-BdKmlouW.d.ts → ingest-typed-MBuMe9Pn.d.ts} +94 -2
  29. package/dist/{ingest-typed-Bo7WPmpU.d.mts → ingest-typed-UA13xTfI.d.mts} +94 -2
  30. package/dist/{phone-utils-CubQif9Z.d.mts → phone-utils-C0ds6cqZ.d.mts} +6 -0
  31. package/dist/{phone-utils-CubQif9Z.d.ts → phone-utils-C0ds6cqZ.d.ts} +6 -0
  32. package/dist/phone.d.mts +1 -1
  33. package/dist/phone.d.ts +1 -1
  34. package/dist/{sales-DG150g3o.d.ts → sales-DQC815f3.d.ts} +1 -1
  35. package/dist/{sales-D7KstKA-.d.mts → sales-w1reW_Y3.d.mts} +1 -1
  36. package/dist/sales.d.mts +2 -2
  37. package/dist/sales.d.ts +2 -2
  38. package/dist/sales.js +17 -1
  39. package/dist/sales.js.map +1 -1
  40. package/dist/sales.mjs +17 -1
  41. package/dist/sales.mjs.map +1 -1
  42. package/dist/server.d.mts +1 -1
  43. package/dist/server.d.ts +1 -1
  44. package/dist/{tracking-config-runtime-D7prdTE1.d.mts → tracking-config-runtime-C6H7ofmo.d.mts} +6 -0
  45. package/dist/{tracking-config-runtime-D7prdTE1.d.ts → tracking-config-runtime-C6H7ofmo.d.ts} +6 -0
  46. package/dist/{transport-I_cMSFQ6.d.mts → transport-BlXQZs9Z.d.mts} +120 -50
  47. package/dist/{transport-CDmGOiCq.d.ts → transport-CAZYrZbB.d.ts} +120 -50
  48. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -82,6 +82,7 @@ __export(src_exports, {
82
82
  formatPhoneAsTyped: () => formatPhoneAsTyped,
83
83
  formatSlotRange: () => formatSlotRange,
84
84
  fromMinor: () => fromMinor,
85
+ getBookingAttribution: () => getBookingAttribution,
85
86
  getConsentChoice: () => getConsentChoice,
86
87
  getConsentState: () => getConsentState,
87
88
  getEventSemantics: () => getEventSemantics,
@@ -339,6 +340,7 @@ var TRACKING_CAPABILITIES = [
339
340
  "consent_controls",
340
341
  "conversion_goals_auto",
341
342
  "conversion_goals_manual",
343
+ "cross_site_linker",
342
344
  "cta_click_capture",
343
345
  "form_capture",
344
346
  "phone_click_capture",
@@ -365,6 +367,9 @@ function readDomMarkers() {
365
367
  return found;
366
368
  }
367
369
 
370
+ // ../tracking-core/src/cross-site-link.ts
371
+ var z = __toESM(require("zod/mini"));
372
+
368
373
  // ../tracking-core/src/tracking.ts
369
374
  var TRACKING_COOKIE_MAX_AGE_SECONDS = 7776e3;
370
375
  var TRACKING_PARAM_KEYS = [
@@ -609,6 +614,72 @@ function buildLandingPayloadFields(sessionId, override) {
609
614
  };
610
615
  }
611
616
 
617
+ // ../tracking-core/src/session.ts
618
+ var VISITOR_STORAGE_KEY = "aranova_tracking_visitor";
619
+ var SESSION_STORAGE_KEY = "aranova_tracking_session";
620
+ var SESSION_IDLE_MS = 30 * 60 * 1e3;
621
+ function readLocalStorage(key) {
622
+ try {
623
+ return window.localStorage.getItem(key);
624
+ } catch {
625
+ return null;
626
+ }
627
+ }
628
+ function peekVisitorId() {
629
+ if (typeof window === "undefined") return null;
630
+ const existing = readLocalStorage(VISITOR_STORAGE_KEY);
631
+ return existing && existing.length > 0 ? existing : null;
632
+ }
633
+ function peekSessionId(now = Date.now()) {
634
+ if (typeof window === "undefined") return null;
635
+ const raw = readLocalStorage(SESSION_STORAGE_KEY);
636
+ if (!raw) return null;
637
+ try {
638
+ const parsed = JSON.parse(raw);
639
+ if (typeof parsed.id !== "string" || typeof parsed.last_event_at !== "number") return null;
640
+ return now - parsed.last_event_at <= SESSION_IDLE_MS ? parsed.id : null;
641
+ } catch {
642
+ return null;
643
+ }
644
+ }
645
+
646
+ // ../tracking-core/src/cross-site-link.ts
647
+ var LINK_PARAM = "_arv";
648
+ var LINK_TOKEN_TTL_MS = 5 * 60 * 1e3;
649
+ var FUTURE_SKEW_MS = 60 * 1e3;
650
+ var CARRIED_KEYS = {
651
+ g: "gclid",
652
+ w: "wbraid",
653
+ gb: "gbraid",
654
+ f: "fbclid",
655
+ y: "ylpcid"
656
+ };
657
+ var CARRIED_ENTRIES = Object.entries(CARRIED_KEYS);
658
+ var identifier = z.string().check(z.minLength(1), z.maxLength(128));
659
+ var optionalIdentifier = z.optional(identifier);
660
+ var linkTokenSchema = z.object({
661
+ v: identifier,
662
+ s: identifier,
663
+ // Epoch ms in base36.
664
+ t: z.string().check(z.regex(/^[0-9a-z]{1,12}$/)),
665
+ g: optionalIdentifier,
666
+ w: optionalIdentifier,
667
+ gb: optionalIdentifier,
668
+ f: optionalIdentifier,
669
+ fc: optionalIdentifier,
670
+ y: optionalIdentifier
671
+ });
672
+ function stripLinkParam(url) {
673
+ try {
674
+ const parsed = new URL(url, typeof window === "undefined" ? void 0 : window.location.href);
675
+ if (!parsed.searchParams.has(LINK_PARAM)) return url;
676
+ parsed.searchParams.delete(LINK_PARAM);
677
+ return parsed.href;
678
+ } catch {
679
+ return url;
680
+ }
681
+ }
682
+
612
683
  // ../tracking-core/src/payloads.ts
613
684
  function createTrackingClientContext(surface, input = {}) {
614
685
  return {
@@ -648,6 +719,7 @@ function createTrackingSessionUpsertPayload(trackingParams, input, context) {
648
719
  };
649
720
  }
650
721
  function createTrackingEventCreatePayload(trackingParams, input, context) {
722
+ const pageUrl = input.pageUrl ?? (typeof window === "undefined" ? null : window.location.href);
651
723
  return {
652
724
  session_id: input.sessionId,
653
725
  event_type: input.eventType,
@@ -658,7 +730,7 @@ function createTrackingEventCreatePayload(trackingParams, input, context) {
658
730
  fbclid: trackingParams.fbclid,
659
731
  fbc: getFbcCookie(),
660
732
  fbp: getFbpCookie(),
661
- page_url: input.pageUrl ?? (typeof window === "undefined" ? null : window.location.href),
733
+ page_url: pageUrl === null ? null : stripLinkParam(pageUrl),
662
734
  metadata: input.metadata ?? null,
663
735
  context
664
736
  };
@@ -770,7 +842,8 @@ function parseConversionConfig(raw) {
770
842
  gtag_ids: isStringMap(obj.gtag_ids) ? obj.gtag_ids : {},
771
843
  meta_pixel_ids: isStringMap(obj.meta_pixel_ids) ? obj.meta_pixel_ids : {},
772
844
  services,
773
- goals
845
+ goals,
846
+ linked_hostnames: Array.isArray(obj.linked_hostnames) ? obj.linked_hostnames.filter((h) => typeof h === "string" && h.length > 0) : []
774
847
  };
775
848
  }
776
849
  var CACHE_PREFIX = "_aranova_cfg_";
@@ -854,6 +927,7 @@ function resolveConversionConfig(options) {
854
927
  getFiring: (key) => goalsByKey.get(key)?.firing ?? null,
855
928
  getGoal: (key) => goalsByKey.get(key) ?? null,
856
929
  listGoals: () => [...goalsByKey.values()],
930
+ linkedHostnames: () => current?.linked_hostnames ?? [],
857
931
  current: () => current,
858
932
  isReady: () => current !== null,
859
933
  onResolve: (listener) => {
@@ -1061,7 +1135,7 @@ function validateConfig(config, ref) {
1061
1135
  function pageViewSnapshot() {
1062
1136
  if (typeof window === "undefined" || typeof document === "undefined") return null;
1063
1137
  return {
1064
- href: window.location.href,
1138
+ href: stripLinkParam(window.location.href),
1065
1139
  title: document.title || null,
1066
1140
  referrer: document.referrer || null
1067
1141
  };
@@ -1212,6 +1286,10 @@ var TrackingConfigRuntime = class {
1212
1286
  listGoals() {
1213
1287
  return this.current?.goals ?? [];
1214
1288
  }
1289
+ /** Sibling hostnames for the linker — read from the cached object even while unconfirmed. */
1290
+ linkedHostnames() {
1291
+ return this.current?.linked_hostnames ?? [];
1292
+ }
1215
1293
  async revalidateNow() {
1216
1294
  try {
1217
1295
  const headers = {};
@@ -1455,6 +1533,18 @@ var EVENT_SEMANTICS = {
1455
1533
  category: "engagement",
1456
1534
  outcomeRole: "engagement",
1457
1535
  clientVisibility: "simple"
1536
+ },
1537
+ site_link_click: {
1538
+ label: "Left for sibling site",
1539
+ category: "page",
1540
+ outcomeRole: "navigation",
1541
+ clientVisibility: "detailed"
1542
+ },
1543
+ site_link_arrival: {
1544
+ label: "Arrived from sibling site",
1545
+ category: "page",
1546
+ outcomeRole: "navigation",
1547
+ clientVisibility: "simple"
1458
1548
  }
1459
1549
  };
1460
1550
  function getEventSemantics(eventName) {
@@ -1696,11 +1786,11 @@ function createSalesClient(config) {
1696
1786
  }
1697
1787
 
1698
1788
  // ../tracking-core/src/resources/sales/schema.ts
1699
- var z2 = __toESM(require("zod/mini"));
1789
+ var z3 = __toESM(require("zod/mini"));
1700
1790
 
1701
1791
  // ../tracking-core/src/resources/sales/generated/zod.gen.ts
1702
- var z = __toESM(require("zod/mini"));
1703
- var zErrorCode = z.enum([
1792
+ var z2 = __toESM(require("zod/mini"));
1793
+ var zErrorCode = z2.enum([
1704
1794
  "missing_credentials",
1705
1795
  "invalid_api_key",
1706
1796
  "not_authenticated",
@@ -1715,9 +1805,19 @@ var zErrorCode = z.enum([
1715
1805
  "bad_request",
1716
1806
  "not_found",
1717
1807
  "conflict",
1808
+ "gone",
1718
1809
  "incompatible_payload",
1719
1810
  "repeat_confirmation_required",
1720
1811
  "idempotency_conflict",
1812
+ "slot_unavailable",
1813
+ "calendar_not_connected",
1814
+ "calendar_disconnected",
1815
+ "booking_not_found",
1816
+ "booking_not_cancellable",
1817
+ "booking_not_reschedulable",
1818
+ "manage_token_invalid",
1819
+ "google_error",
1820
+ "calendar_not_owned",
1721
1821
  "validation_error",
1722
1822
  "unknown_service",
1723
1823
  "invalid_sale_properties",
@@ -1725,36 +1825,36 @@ var zErrorCode = z.enum([
1725
1825
  "rate_limited",
1726
1826
  "internal_error"
1727
1827
  ]);
1728
- var zSaleItemEntitySchema = z.object({
1729
- category: z.nullable(z.string()),
1730
- external_item_id: z.nullable(z.string()),
1731
- id: z.uuid(),
1732
- name: z.nullable(z.string()),
1733
- quantity: z.string().check(z.regex(/^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$/)),
1734
- unit_cost_cents: z.nullable(z.int()),
1735
- unit_price_cents: z.int()
1828
+ var zSaleItemEntitySchema = z2.object({
1829
+ category: z2.nullable(z2.string()),
1830
+ external_item_id: z2.nullable(z2.string()),
1831
+ id: z2.uuid(),
1832
+ name: z2.nullable(z2.string()),
1833
+ quantity: z2.string().check(z2.regex(/^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$/)),
1834
+ unit_cost_cents: z2.nullable(z2.int()),
1835
+ unit_price_cents: z2.int()
1736
1836
  });
1737
- var zSaleItemInputSchema = z.strictObject({
1738
- category: z.nullish(z.string()),
1739
- external_item_id: z.nullish(z.string()),
1740
- name: z.nullish(z.string()),
1741
- quantity: z.string().check(z.regex(/^\d+(\.\d{1,3})?$/)),
1742
- unit_cost_cents: z.nullish(z.int().check(z.gte(0))),
1743
- unit_price_cents: z.int().check(z.gte(0))
1837
+ var zSaleItemInputSchema = z2.strictObject({
1838
+ category: z2.nullish(z2.string()),
1839
+ external_item_id: z2.nullish(z2.string()),
1840
+ name: z2.nullish(z2.string()),
1841
+ quantity: z2.string().check(z2.regex(/^\d+(\.\d{1,3})?$/)),
1842
+ unit_cost_cents: z2.nullish(z2.int().check(z2.gte(0))),
1843
+ unit_price_cents: z2.int().check(z2.gte(0))
1744
1844
  });
1745
- var zSaleServiceEntitySchema = z.object({
1746
- amount_cents: z.int(),
1747
- id: z.uuid(),
1748
- mapped: z.nullable(z.boolean()),
1749
- service_id: z.uuid(),
1750
- service_key: z.string(),
1751
- service_label: z.string()
1845
+ var zSaleServiceEntitySchema = z2.object({
1846
+ amount_cents: z2.int(),
1847
+ id: z2.uuid(),
1848
+ mapped: z2.nullable(z2.boolean()),
1849
+ service_id: z2.uuid(),
1850
+ service_key: z2.string(),
1851
+ service_label: z2.string()
1752
1852
  });
1753
- var zSaleServiceInputSchema = z.strictObject({
1754
- amount_cents: z.int().check(z.gte(0)),
1755
- service: z.string()
1853
+ var zSaleServiceInputSchema = z2.strictObject({
1854
+ amount_cents: z2.int().check(z2.gte(0)),
1855
+ service: z2.string()
1756
1856
  });
1757
- var zSmsAutomationState = z.enum([
1857
+ var zSmsAutomationState = z2.enum([
1758
1858
  "needs_check",
1759
1859
  "failed",
1760
1860
  "undelivered",
@@ -1766,7 +1866,7 @@ var zSmsAutomationState = z.enum([
1766
1866
  "eligible",
1767
1867
  "not_applicable"
1768
1868
  ]);
1769
- var zSmsWithheldReason = z.enum([
1869
+ var zSmsWithheldReason = z2.enum([
1770
1870
  "automation_disabled",
1771
1871
  "sms_disabled",
1772
1872
  "no_phone",
@@ -1779,77 +1879,83 @@ var zSmsWithheldReason = z.enum([
1779
1879
  "sender_not_ready",
1780
1880
  "missing_review_url",
1781
1881
  "no_handler",
1782
- "dispatch_already_recorded"
1882
+ "dispatch_already_recorded",
1883
+ "text_back_disabled",
1884
+ "number_text_back_disabled",
1885
+ "number_not_active",
1886
+ "a2p_registration_required",
1887
+ "alert_recipient_cannot_receive_sms",
1888
+ "line_type_unresolved"
1783
1889
  ]);
1784
- var zSaleSmsStatusSchema = z.object({
1785
- can_send_now: z._default(z.boolean(), false),
1786
- last_message_at: z.nullable(z.iso.datetime({ offset: true })),
1787
- reason_detail: z.nullable(z.string()),
1890
+ var zSaleSmsStatusSchema = z2.object({
1891
+ can_send_now: z2._default(z2.boolean(), false),
1892
+ last_message_at: z2.nullable(z2.iso.datetime({ offset: true })),
1893
+ reason_detail: z2.nullable(z2.string()),
1788
1894
  state: zSmsAutomationState,
1789
- suppressed_by_other_sale: z._default(z.boolean(), false),
1790
- withheld_reason: z.nullable(zSmsWithheldReason)
1895
+ suppressed_by_other_sale: z2._default(z2.boolean(), false),
1896
+ withheld_reason: z2.nullable(zSmsWithheldReason)
1791
1897
  });
1792
- var zSupportedCurrency = z.enum(["USD", "CAD"]);
1793
- var zTrackingEnvironment = z.enum(["production", "development"]);
1794
- var zSaleCreateSchema = z.strictObject({
1795
- amount_total_cents: z.nullish(z.int().check(z.gte(0))),
1898
+ var zSupportedCurrency = z2.enum(["USD", "CAD"]);
1899
+ var zTrackingEnvironment = z2.enum(["production", "development"]);
1900
+ var zSaleCreateSchema = z2.strictObject({
1901
+ amount_total_cents: z2.nullish(z2.int().check(z2.gte(0))),
1796
1902
  currency: zSupportedCurrency,
1797
- customer_email: z.nullish(z.email().check(z.maxLength(320))),
1798
- customer_name: z.nullish(z.string().check(z.maxLength(200))),
1799
- customer_phone: z.nullish(z.string().check(z.maxLength(64))),
1800
- description: z.nullish(z.string()),
1801
- environment: z._default(z.optional(zTrackingEnvironment), "production"),
1802
- external_id: z.nullish(z.string()),
1803
- items: z.optional(z.array(zSaleItemInputSchema)),
1804
- metadata: z.nullish(z.record(z.string(), z.unknown())),
1805
- occurred_at: z.iso.datetime({ offset: true }),
1806
- service: z.nullish(z.string()),
1807
- services: z.nullish(z.array(zSaleServiceInputSchema)),
1808
- sms_consent: z.nullish(z.boolean())
1903
+ customer_email: z2.nullish(z2.email().check(z2.maxLength(320))),
1904
+ customer_name: z2.nullish(z2.string().check(z2.maxLength(200))),
1905
+ customer_phone: z2.nullish(z2.string().check(z2.maxLength(64))),
1906
+ description: z2.nullish(z2.string()),
1907
+ environment: z2._default(z2.optional(zTrackingEnvironment), "production"),
1908
+ external_id: z2.nullish(z2.string()),
1909
+ items: z2.optional(z2.array(zSaleItemInputSchema)),
1910
+ metadata: z2.nullish(z2.record(z2.string(), z2.unknown())),
1911
+ occurred_at: z2.iso.datetime({ offset: true }),
1912
+ service: z2.nullish(z2.string()),
1913
+ services: z2.nullish(z2.array(zSaleServiceInputSchema)),
1914
+ sms_consent: z2.nullish(z2.boolean())
1809
1915
  });
1810
- var zValidationError = z.object({
1811
- ctx: z.optional(z.record(z.string(), z.unknown())),
1812
- input: z.optional(z.unknown()),
1813
- loc: z.array(z.union([z.string(), z.int()])),
1814
- msg: z.string(),
1815
- type: z.string()
1916
+ var zValidationError = z2.object({
1917
+ ctx: z2.optional(z2.record(z2.string(), z2.unknown())),
1918
+ input: z2.optional(z2.unknown()),
1919
+ loc: z2.array(z2.union([z2.string(), z2.int()])),
1920
+ msg: z2.string(),
1921
+ type: z2.string()
1816
1922
  });
1817
- var zHttpValidationError = z.object({
1818
- detail: z.optional(z.array(zValidationError))
1923
+ var zHttpValidationError = z2.object({
1924
+ detail: z2.optional(z2.array(zValidationError))
1819
1925
  });
1820
- var zValidationErrorItem = z.object({
1821
- loc: z.array(z.union([z.string(), z.int()])),
1822
- msg: z.string(),
1823
- type: z.string()
1926
+ var zValidationErrorItem = z2.object({
1927
+ loc: z2.array(z2.union([z2.string(), z2.int()])),
1928
+ msg: z2.string(),
1929
+ type: z2.string()
1824
1930
  });
1825
- var zApiErrorSchema = z.object({
1931
+ var zApiErrorSchema = z2.object({
1826
1932
  code: zErrorCode,
1827
- context: z._default(z.nullish(z.record(z.string(), z.unknown())), null),
1828
- detail: z.string(),
1829
- errors: z._default(z.nullish(z.array(zValidationErrorItem)), null),
1830
- request_id: z._default(z.nullish(z.string()), null)
1933
+ context: z2._default(z2.nullish(z2.record(z2.string(), z2.unknown())), null),
1934
+ detail: z2.string(),
1935
+ errors: z2._default(z2.nullish(z2.array(zValidationErrorItem)), null),
1936
+ request_id: z2._default(z2.nullish(z2.string()), null)
1831
1937
  });
1832
- var zWritebackEmailSource = z.enum(["NONE", "SALE", "CUSTOMER", "HARVESTED"]);
1833
- var zWritebackEnrichmentStatus = z.enum(["NONE", "MATCHED", "AMBIGUOUS"]);
1834
- var zWritebackSaleUploadCounts = z.object({
1835
- failed: z._default(z.int(), 0),
1836
- pending: z._default(z.int(), 0),
1837
- skipped: z._default(z.int(), 0),
1838
- submitted: z._default(z.int(), 0),
1839
- total: z._default(z.int(), 0),
1840
- uploaded: z._default(z.int(), 0)
1938
+ var zWritebackEmailSource = z2.enum(["NONE", "SALE", "CUSTOMER", "HARVESTED"]);
1939
+ var zWritebackEnrichmentStatus = z2.enum(["NONE", "MATCHED", "AMBIGUOUS"]);
1940
+ var zWritebackSaleUploadCounts = z2.object({
1941
+ failed: z2._default(z2.int(), 0),
1942
+ pending: z2._default(z2.int(), 0),
1943
+ skipped: z2._default(z2.int(), 0),
1944
+ submitted: z2._default(z2.int(), 0),
1945
+ total: z2._default(z2.int(), 0),
1946
+ uploaded: z2._default(z2.int(), 0)
1841
1947
  });
1842
- var zSaleWritebackStatusSchema = z.object({
1843
- blocked_reason: z.nullable(z.string()),
1844
- can_dispatch: z._default(z.boolean(), false),
1845
- email_source: z.nullable(zWritebackEmailSource),
1846
- enrichment_status: z.nullable(zWritebackEnrichmentStatus),
1847
- gclid_attached: z._default(z.boolean(), false),
1848
- identifiers_sent: z.nullable(z.string()),
1849
- mapped_service_ids: z.array(z.uuid()),
1850
- matched_submit_count: z.nullable(z.int()),
1851
- needs_force: z._default(z.boolean(), false),
1852
- rollup: z.enum([
1948
+ var zSaleWritebackStatusSchema = z2.object({
1949
+ blocked_reason: z2.nullable(z2.string()),
1950
+ can_dispatch: z2._default(z2.boolean(), false),
1951
+ email_source: z2.nullable(zWritebackEmailSource),
1952
+ enrichment_status: z2.nullable(zWritebackEnrichmentStatus),
1953
+ gclid_attached: z2._default(z2.boolean(), false),
1954
+ identifiers_sent: z2.nullable(z2.string()),
1955
+ mapped_service_ids: z2.array(z2.uuid()),
1956
+ matched_submit_count: z2.nullable(z2.int()),
1957
+ needs_force: z2._default(z2.boolean(), false),
1958
+ rollup: z2.enum([
1853
1959
  "failed",
1854
1960
  "skipped",
1855
1961
  "pending",
@@ -1859,37 +1965,37 @@ var zSaleWritebackStatusSchema = z.object({
1859
1965
  "out_of_window",
1860
1966
  "blocked"
1861
1967
  ]),
1862
- stale: z._default(z.boolean(), false),
1863
- uncovered_service_ids: z.array(z.uuid()),
1968
+ stale: z2._default(z2.boolean(), false),
1969
+ uncovered_service_ids: z2.array(z2.uuid()),
1864
1970
  uploads: zWritebackSaleUploadCounts
1865
1971
  });
1866
- var zSaleEntitySchema = z.object({
1867
- amount_total_cents: z.int(),
1868
- business_id: z.uuid(),
1869
- business_name: z.nullable(z.string()),
1870
- created_at: z.iso.datetime({ offset: true }),
1871
- currency: z.string(),
1872
- customer_email: z.nullable(z.string()),
1873
- customer_name: z.nullable(z.string()),
1874
- customer_name_placeholder_confirmed: z._default(z.boolean(), false),
1875
- customer_name_placeholder_confirmed_at: z.nullable(z.iso.datetime({ offset: true })),
1876
- customer_phone: z.nullable(z.string()),
1877
- description: z.nullable(z.string()),
1972
+ var zSaleEntitySchema = z2.object({
1973
+ amount_total_cents: z2.int(),
1974
+ business_id: z2.uuid(),
1975
+ business_name: z2.nullable(z2.string()),
1976
+ created_at: z2.iso.datetime({ offset: true }),
1977
+ currency: z2.string(),
1978
+ customer_email: z2.nullable(z2.string()),
1979
+ customer_name: z2.nullable(z2.string()),
1980
+ customer_name_placeholder_confirmed: z2._default(z2.boolean(), false),
1981
+ customer_name_placeholder_confirmed_at: z2.nullable(z2.iso.datetime({ offset: true })),
1982
+ customer_phone: z2.nullable(z2.string()),
1983
+ description: z2.nullable(z2.string()),
1878
1984
  environment: zTrackingEnvironment,
1879
- external_id: z.nullable(z.string()),
1880
- id: z.uuid(),
1881
- items: z.array(zSaleItemEntitySchema),
1882
- metadata: z.nullable(z.record(z.string(), z.unknown())),
1883
- occurred_at: z.iso.datetime({ offset: true }),
1884
- service_id: z.nullable(z.uuid()),
1885
- service_key: z.nullable(z.string()),
1886
- service_label: z.nullable(z.string()),
1887
- services: z.array(zSaleServiceEntitySchema),
1888
- sms_automation: z.nullable(zSaleSmsStatusSchema),
1889
- sms_consent: z._default(z.boolean(), false),
1890
- sms_consent_granted_at: z.nullable(z.iso.datetime({ offset: true })),
1891
- updated_at: z.iso.datetime({ offset: true }),
1892
- writeback: z.nullable(zSaleWritebackStatusSchema)
1985
+ external_id: z2.nullable(z2.string()),
1986
+ id: z2.uuid(),
1987
+ items: z2.array(zSaleItemEntitySchema),
1988
+ metadata: z2.nullable(z2.record(z2.string(), z2.unknown())),
1989
+ occurred_at: z2.iso.datetime({ offset: true }),
1990
+ service_id: z2.nullable(z2.uuid()),
1991
+ service_key: z2.nullable(z2.string()),
1992
+ service_label: z2.nullable(z2.string()),
1993
+ services: z2.array(zSaleServiceEntitySchema),
1994
+ sms_automation: z2.nullable(zSaleSmsStatusSchema),
1995
+ sms_consent: z2._default(z2.boolean(), false),
1996
+ sms_consent_granted_at: z2.nullable(z2.iso.datetime({ offset: true })),
1997
+ updated_at: z2.iso.datetime({ offset: true }),
1998
+ writeback: z2.nullable(zSaleWritebackStatusSchema)
1893
1999
  });
1894
2000
 
1895
2001
  // ../tracking-core/src/resources/sales/schema.ts
@@ -1897,11 +2003,11 @@ var saleItemSchema = zSaleItemInputSchema;
1897
2003
  var saleServiceSchema = zSaleServiceInputSchema;
1898
2004
  var currencySchema = zSupportedCurrency;
1899
2005
  var SUPPORTED_CURRENCIES = currencySchema.options;
1900
- var centsSchema = z2.int().check(z2.gte(0));
1901
- var metadataSchema = z2.record(z2.string(), z2.unknown());
1902
- var customerNameSchema = z2.string().check(z2.maxLength(200));
1903
- var customerPhoneSchema = z2.string().check(z2.maxLength(64));
1904
- var customerEmailSchema = z2.email().check(z2.maxLength(320));
2006
+ var centsSchema = z3.int().check(z3.gte(0));
2007
+ var metadataSchema = z3.record(z3.string(), z3.unknown());
2008
+ var customerNameSchema = z3.string().check(z3.maxLength(200));
2009
+ var customerPhoneSchema = z3.string().check(z3.maxLength(64));
2010
+ var customerEmailSchema = z3.email().check(z3.maxLength(320));
1905
2011
  function addIssue(ctx, path, message) {
1906
2012
  ctx.issues.push({ code: "custom", input: ctx.value, path, message });
1907
2013
  }
@@ -1935,24 +2041,24 @@ function refineServiceXor(val, ctx, { requireAmount }) {
1935
2041
  );
1936
2042
  }
1937
2043
  }
1938
- var saleCreateSchema = z2.extend(zSaleCreateSchema, { items: z2._default(z2.array(saleItemSchema), []) }).check((ctx) => refineServiceXor(ctx.value, ctx, { requireAmount: true }));
1939
- var saleUpdateSchema = z2.strictObject({
1940
- description: z2.nullish(z2.string()),
1941
- service: z2.nullish(z2.string()),
1942
- services: z2.nullish(z2.array(saleServiceSchema)),
1943
- currency: z2.optional(currencySchema),
1944
- amount_total_cents: z2.optional(centsSchema),
1945
- occurred_at: z2.optional(z2.iso.datetime()),
1946
- items: z2.optional(z2.array(saleItemSchema)),
1947
- metadata: z2.nullish(metadataSchema),
1948
- customer_name: z2.nullish(customerNameSchema),
2044
+ var saleCreateSchema = z3.extend(zSaleCreateSchema, { items: z3._default(z3.array(saleItemSchema), []) }).check((ctx) => refineServiceXor(ctx.value, ctx, { requireAmount: true }));
2045
+ var saleUpdateSchema = z3.strictObject({
2046
+ description: z3.nullish(z3.string()),
2047
+ service: z3.nullish(z3.string()),
2048
+ services: z3.nullish(z3.array(saleServiceSchema)),
2049
+ currency: z3.optional(currencySchema),
2050
+ amount_total_cents: z3.optional(centsSchema),
2051
+ occurred_at: z3.optional(z3.iso.datetime()),
2052
+ items: z3.optional(z3.array(saleItemSchema)),
2053
+ metadata: z3.nullish(metadataSchema),
2054
+ customer_name: z3.nullish(customerNameSchema),
1949
2055
  // Re-attest when changing a filler-looking name; the server clears the
1950
2056
  // prior attestation whenever `customer_name` changes.
1951
- customer_name_placeholder_confirmed: z2.optional(z2.boolean()),
1952
- customer_phone: z2.nullish(customerPhoneSchema),
1953
- customer_email: z2.nullish(customerEmailSchema),
2057
+ customer_name_placeholder_confirmed: z3.optional(z3.boolean()),
2058
+ customer_phone: z3.nullish(customerPhoneSchema),
2059
+ customer_email: z3.nullish(customerEmailSchema),
1954
2060
  // NOT NULL server-side: omit to leave unchanged (explicit null is rejected).
1955
- sms_consent: z2.optional(z2.boolean())
2061
+ sms_consent: z3.optional(z3.boolean())
1956
2062
  }).check((ctx) => refineServiceXor(ctx.value, ctx, { requireAmount: false }));
1957
2063
  var TRACKING_RANGES = ["24h", "7d", "30d"];
1958
2064
  var NAMED_RANGES = [
@@ -1982,6 +2088,40 @@ function phoneField(name, raw, country) {
1982
2088
  // src/index.ts
1983
2089
  var import_client = require("@aranova/tracking-next/client");
1984
2090
 
2091
+ // ../tracking-core/src/resources/calendar/attribution.ts
2092
+ var LIMITS = {
2093
+ session_id: 64,
2094
+ visitor_id: 64,
2095
+ gclid: 256,
2096
+ fbclid: 256,
2097
+ utm_source: 128,
2098
+ utm_medium: 128,
2099
+ utm_campaign: 128,
2100
+ utm_term: 128,
2101
+ utm_content: 128
2102
+ };
2103
+ function getBookingAttribution() {
2104
+ if (typeof window === "undefined") return {};
2105
+ const params = getTrackingParamsFromCookieReader(getCookieValueFromDocument);
2106
+ const values = {
2107
+ session_id: peekSessionId(),
2108
+ visitor_id: peekVisitorId(),
2109
+ gclid: params.gclid,
2110
+ fbclid: params.fbclid,
2111
+ utm_source: params.utm_source,
2112
+ utm_medium: params.utm_medium,
2113
+ utm_campaign: params.utm_campaign,
2114
+ utm_term: params.utm_term,
2115
+ utm_content: params.utm_content
2116
+ };
2117
+ const attribution = {};
2118
+ for (const key of Object.keys(LIMITS)) {
2119
+ const value = values[key];
2120
+ if (value) attribution[key] = value.slice(0, LIMITS[key]);
2121
+ }
2122
+ return attribution;
2123
+ }
2124
+
1985
2125
  // ../tracking-core/src/resources/calendar/transport.ts
1986
2126
  async function calendarRequest(config, method, path, body) {
1987
2127
  return apiRequest(config, method, `/calendar${path}`, body);
@@ -2080,80 +2220,119 @@ function isCalendarError(error, code) {
2080
2220
  }
2081
2221
 
2082
2222
  // ../tracking-core/src/resources/calendar/schema.ts
2083
- var z4 = __toESM(require("zod/mini"));
2223
+ var z5 = __toESM(require("zod/mini"));
2084
2224
 
2085
2225
  // ../tracking-core/src/resources/calendar/generated/zod.gen.ts
2086
- var z3 = __toESM(require("zod/mini"));
2087
- var zBookingAttendee = z3.strictObject({
2088
- display_name: z3.nullish(z3.string().check(z3.maxLength(200))),
2089
- email: z3.email().check(z3.maxLength(320)),
2090
- optional: z3._default(z3.optional(z3.boolean()), false)
2226
+ var z4 = __toESM(require("zod/mini"));
2227
+ var zBookingAttendee = z4.strictObject({
2228
+ display_name: z4.nullish(z4.string().check(z4.maxLength(200))),
2229
+ email: z4.email().check(z4.maxLength(320)),
2230
+ optional: z4._default(z4.optional(z4.boolean()), false)
2091
2231
  });
2092
- var zBookingCancelSchema = z3.strictObject({
2093
- notify_attendees: z3._default(z3.optional(z3.boolean()), true),
2094
- reason: z3.nullish(z3.string().check(z3.maxLength(500)))
2232
+ var zBookingCancelSchema = z4.strictObject({
2233
+ notify_attendees: z4._default(z4.optional(z4.boolean()), true),
2234
+ reason: z4.nullish(z4.string().check(z4.maxLength(500)))
2095
2235
  });
2096
- var zBookingCustomerInput = z3.strictObject({
2097
- email: z3.email().check(z3.maxLength(320)),
2098
- name: z3.nullish(z3.string().check(z3.maxLength(200))),
2099
- phone: z3.nullish(z3.string().check(z3.maxLength(64))),
2100
- sms_consent: z3._default(z3.optional(z3.boolean()), false)
2236
+ var zBookingCustomerInput = z4.strictObject({
2237
+ email: z4.email().check(z4.maxLength(320)),
2238
+ name: z4.nullish(z4.string().check(z4.maxLength(200))),
2239
+ phone: z4.nullish(z4.string().check(z4.maxLength(64))),
2240
+ sms_consent: z4._default(z4.optional(z4.boolean()), false)
2101
2241
  });
2102
- var zBookingCustomerOutput = z3.strictObject({
2103
- email: z3.email().check(z3.maxLength(320)),
2104
- name: z3.nullable(z3.string().check(z3.maxLength(200))),
2105
- phone: z3.nullable(z3.string().check(z3.maxLength(64))),
2106
- sms_consent: z3._default(z3.boolean(), false)
2242
+ var zBookingCustomerOutput = z4.strictObject({
2243
+ email: z4.email().check(z4.maxLength(320)),
2244
+ name: z4.nullable(z4.string().check(z4.maxLength(200))),
2245
+ phone: z4.nullable(z4.string().check(z4.maxLength(64))),
2246
+ sms_consent: z4._default(z4.boolean(), false)
2107
2247
  });
2108
- var zBookingRescheduleSchema = z3.strictObject({
2109
- duration_minutes: z3.nullish(z3.int().check(z3.gt(0), z3.lte(1440))),
2110
- end_at: z3.nullish(z3.iso.datetime({ offset: true })),
2111
- notify_attendees: z3._default(z3.optional(z3.boolean()), true),
2112
- reason: z3.nullish(z3.string().check(z3.maxLength(500))),
2113
- start_at: z3.iso.datetime({ offset: true }),
2114
- time_zone: z3.string().check(z3.minLength(1), z3.maxLength(64), z3.regex(/^[A-Za-z0-9_+\-\/]+$/))
2248
+ var zBookingRescheduleSchema = z4.strictObject({
2249
+ duration_minutes: z4.nullish(z4.int().check(z4.gt(0), z4.lte(1440))),
2250
+ end_at: z4.nullish(z4.iso.datetime({ offset: true })),
2251
+ notify_attendees: z4._default(z4.optional(z4.boolean()), true),
2252
+ reason: z4.nullish(z4.string().check(z4.maxLength(500))),
2253
+ start_at: z4.iso.datetime({ offset: true }),
2254
+ time_zone: z4.string().check(z4.minLength(1), z4.maxLength(64), z4.regex(/^[A-Za-z0-9_+\-\/]+$/))
2115
2255
  });
2116
- var zBookingResponse = z3.strictObject({
2117
- appointment_type: z3.nullable(z3.string()),
2118
- calendar_key: z3.string(),
2256
+ var zBookingResponse = z4.strictObject({
2257
+ all_day: z4.boolean(),
2258
+ appointment_type: z4.nullable(z4.string()),
2259
+ calendar_key: z4.string(),
2260
+ created_at: z4.iso.datetime({ offset: true }),
2119
2261
  customer: zBookingCustomerOutput,
2120
- end_at: z3.iso.datetime({ offset: true }),
2121
- google_html_link: z3.nullable(z3.string()),
2122
- google_sync_state: z3.string(),
2123
- id: z3.string(),
2124
- manage_token: z3.nullable(z3.string()),
2125
- meet_url: z3.nullable(z3.string()),
2126
- start_at: z3.iso.datetime({ offset: true }),
2127
- status: z3.string(),
2128
- time_zone: z3.string(),
2129
- title: z3.string()
2262
+ end_at: z4.iso.datetime({ offset: true }),
2263
+ google_event_id: z4.nullable(z4.string()),
2264
+ google_html_link: z4.nullable(z4.string()),
2265
+ google_sync_state: z4.enum(["queued", "synced", "uncertain", "failed", "drifted"]),
2266
+ ical_uid: z4.nullable(z4.string()),
2267
+ id: z4.string(),
2268
+ manage_token: z4.nullable(z4.string()),
2269
+ meet_url: z4.nullable(z4.string()),
2270
+ organizer_email: z4.nullable(z4.string()),
2271
+ start_at: z4.iso.datetime({ offset: true }),
2272
+ status: z4.enum(["pending", "confirmed", "cancelled", "no_show"]),
2273
+ time_zone: z4.string(),
2274
+ title: z4.string()
2130
2275
  });
2131
- var zBookingSource = z3.enum(["website", "phone", "walk_in", "import", "operator"]);
2132
- var zBookingMetadata = z3.strictObject({
2133
- custom: z3.nullish(
2134
- z3.record(z3.string(), z3.nullable(z3.union([z3.string(), z3.int(), z3.number(), z3.boolean()])))
2276
+ var zBookingSource = z4.enum(["website", "phone", "walk_in", "import", "operator"]);
2277
+ var zBookingMetadataInput = z4.strictObject({
2278
+ custom: z4.nullish(
2279
+ z4.record(z4.string(), z4.nullable(z4.union([z4.string(), z4.int(), z4.number(), z4.boolean()])))
2135
2280
  ),
2136
- fbclid: z3.nullish(z3.string().check(z3.maxLength(256))),
2137
- gclid: z3.nullish(z3.string().check(z3.maxLength(256))),
2138
- landing_page: z3.nullish(z3.string().check(z3.maxLength(2048))),
2139
- notes: z3.nullish(z3.string().check(z3.maxLength(2e3))),
2140
- referrer: z3.nullish(z3.string().check(z3.maxLength(2048))),
2141
- schema_version: z3._default(z3.optional(z3.int()), 1),
2142
- service: z3.nullish(z3.string().check(z3.maxLength(64))),
2143
- session_id: z3.nullish(z3.string().check(z3.maxLength(64))),
2144
- source: z3.nullish(zBookingSource),
2145
- utm_campaign: z3.nullish(z3.string().check(z3.maxLength(128))),
2146
- utm_content: z3.nullish(z3.string().check(z3.maxLength(128))),
2147
- utm_medium: z3.nullish(z3.string().check(z3.maxLength(128))),
2148
- utm_source: z3.nullish(z3.string().check(z3.maxLength(128))),
2149
- utm_term: z3.nullish(z3.string().check(z3.maxLength(128))),
2150
- visitor_id: z3.nullish(z3.string().check(z3.maxLength(64)))
2281
+ fbclid: z4.nullish(z4.string().check(z4.maxLength(256))),
2282
+ gclid: z4.nullish(z4.string().check(z4.maxLength(256))),
2283
+ landing_page: z4.nullish(z4.string().check(z4.maxLength(2048))),
2284
+ notes: z4.nullish(z4.string().check(z4.maxLength(2e3))),
2285
+ referrer: z4.nullish(z4.string().check(z4.maxLength(2048))),
2286
+ schema_version: z4._default(z4.optional(z4.int()), 1),
2287
+ service: z4.nullish(z4.string().check(z4.maxLength(64))),
2288
+ session_id: z4.nullish(z4.string().check(z4.maxLength(64))),
2289
+ source: z4.nullish(zBookingSource),
2290
+ utm_campaign: z4.nullish(z4.string().check(z4.maxLength(128))),
2291
+ utm_content: z4.nullish(z4.string().check(z4.maxLength(128))),
2292
+ utm_medium: z4.nullish(z4.string().check(z4.maxLength(128))),
2293
+ utm_source: z4.nullish(z4.string().check(z4.maxLength(128))),
2294
+ utm_term: z4.nullish(z4.string().check(z4.maxLength(128))),
2295
+ visitor_id: z4.nullish(z4.string().check(z4.maxLength(64)))
2151
2296
  });
2152
- var zCustomLocation = z3.strictObject({
2153
- kind: z3.literal("custom"),
2154
- text: z3.string().check(z3.maxLength(1024))
2297
+ var zBusySource = z4.enum(["google", "booking"]);
2298
+ var zBusyInterval = z4.strictObject({
2299
+ end_at: z4.iso.datetime({ offset: true }),
2300
+ source: zBusySource,
2301
+ start_at: z4.iso.datetime({ offset: true })
2155
2302
  });
2156
- var zErrorCode2 = z3.enum([
2303
+ var zBusyWindow = z4.strictObject({
2304
+ since: z4.iso.datetime({ offset: true }),
2305
+ until: z4.iso.datetime({ offset: true })
2306
+ });
2307
+ var zBusyResponse = z4.strictObject({
2308
+ busy: z4.array(zBusyInterval),
2309
+ calendar_key: z4.string(),
2310
+ generated_at: z4.iso.datetime({ offset: true }),
2311
+ time_zone: z4.string(),
2312
+ window: zBusyWindow
2313
+ });
2314
+ var zCalendarSummary = z4.strictObject({
2315
+ allow_overlaps: z4.boolean(),
2316
+ calendar_key: z4.string(),
2317
+ connected_at: z4.nullable(z4.iso.datetime({ offset: true })),
2318
+ google_account_email: z4.nullable(z4.string()),
2319
+ granted_scopes: z4.nullable(z4.array(z4.string())),
2320
+ label: z4.string(),
2321
+ status: z4.enum([
2322
+ "pending_invite",
2323
+ "awaiting_calendar_selection",
2324
+ "connected",
2325
+ "needs_reconnect",
2326
+ "revoked",
2327
+ "disabled"
2328
+ ]),
2329
+ time_zone: z4.string()
2330
+ });
2331
+ var zCustomLocation = z4.strictObject({
2332
+ kind: z4.literal("custom"),
2333
+ text: z4.string().check(z4.maxLength(1024))
2334
+ });
2335
+ var zErrorCode2 = z4.enum([
2157
2336
  "missing_credentials",
2158
2337
  "invalid_api_key",
2159
2338
  "not_authenticated",
@@ -2168,9 +2347,19 @@ var zErrorCode2 = z3.enum([
2168
2347
  "bad_request",
2169
2348
  "not_found",
2170
2349
  "conflict",
2350
+ "gone",
2171
2351
  "incompatible_payload",
2172
2352
  "repeat_confirmation_required",
2173
2353
  "idempotency_conflict",
2354
+ "slot_unavailable",
2355
+ "calendar_not_connected",
2356
+ "calendar_disconnected",
2357
+ "booking_not_found",
2358
+ "booking_not_cancellable",
2359
+ "booking_not_reschedulable",
2360
+ "manage_token_invalid",
2361
+ "google_error",
2362
+ "calendar_not_owned",
2174
2363
  "validation_error",
2175
2364
  "unknown_service",
2176
2365
  "invalid_sale_properties",
@@ -2178,66 +2367,67 @@ var zErrorCode2 = z3.enum([
2178
2367
  "rate_limited",
2179
2368
  "internal_error"
2180
2369
  ]);
2181
- var zMeetLocation = z3.strictObject({
2182
- kind: z3.literal("google_meet")
2370
+ var zMeetLocation = z4.strictObject({
2371
+ kind: z4.literal("google_meet")
2183
2372
  });
2184
- var zPhoneLocation = z3.strictObject({
2185
- kind: z3.literal("phone"),
2186
- phone: z3.string().check(z3.maxLength(64))
2373
+ var zPhoneLocation = z4.strictObject({
2374
+ kind: z4.literal("phone"),
2375
+ phone: z4.string().check(z4.maxLength(64))
2187
2376
  });
2188
- var zPhysicalLocation = z3.strictObject({
2189
- address: z3.string().check(z3.maxLength(1024)),
2190
- kind: z3.literal("physical")
2377
+ var zPhysicalLocation = z4.strictObject({
2378
+ address: z4.string().check(z4.maxLength(1024)),
2379
+ kind: z4.literal("physical")
2191
2380
  });
2192
- var zReminderMethod = z3.enum(["email", "popup"]);
2193
- var zBookingReminder = z3.strictObject({
2381
+ var zReminderMethod = z4.enum(["email", "popup"]);
2382
+ var zBookingReminder = z4.strictObject({
2194
2383
  method: zReminderMethod,
2195
- minutes_before: z3.int().check(z3.gte(0), z3.lte(40320))
2384
+ minutes_before: z4.int().check(z4.gte(0), z4.lte(40320))
2196
2385
  });
2197
- var zBookingReminders = z3.strictObject({
2198
- overrides: z3.optional(z3.array(zBookingReminder).check(z3.maxLength(5))),
2199
- use_calendar_defaults: z3._default(z3.optional(z3.boolean()), true)
2386
+ var zBookingReminders = z4.strictObject({
2387
+ overrides: z4.optional(z4.array(zBookingReminder).check(z4.maxLength(5))),
2388
+ use_calendar_defaults: z4._default(z4.optional(z4.boolean()), true)
2200
2389
  });
2201
- var zBookingCreateSchema = z3.strictObject({
2202
- appointment_type: z3.nullish(z3.string().check(z3.maxLength(64))),
2203
- attendees: z3.optional(z3.array(zBookingAttendee).check(z3.maxLength(20))),
2204
- buffer_after_minutes: z3._default(z3.optional(z3.int().check(z3.gte(0), z3.lte(1440))), 0),
2205
- buffer_before_minutes: z3._default(z3.optional(z3.int().check(z3.gte(0), z3.lte(1440))), 0),
2206
- calendar_key: z3.string().check(z3.minLength(1), z3.maxLength(64)),
2390
+ var zBookingCreateSchema = z4.strictObject({
2391
+ appointment_type: z4.nullish(z4.string().check(z4.maxLength(64))),
2392
+ attendees: z4.optional(z4.array(zBookingAttendee).check(z4.maxLength(20))),
2393
+ buffer_after_minutes: z4._default(z4.optional(z4.int().check(z4.gte(0), z4.lte(1440))), 0),
2394
+ buffer_before_minutes: z4._default(z4.optional(z4.int().check(z4.gte(0), z4.lte(1440))), 0),
2395
+ calendar_key: z4.string().check(z4.minLength(1), z4.maxLength(64)),
2207
2396
  customer: zBookingCustomerInput,
2208
- description: z3.nullish(z3.string().check(z3.maxLength(8e3))),
2209
- duration_minutes: z3.nullish(z3.int().check(z3.gt(0), z3.lte(1440))),
2210
- end_at: z3.nullish(z3.iso.datetime({ offset: true })),
2211
- idempotency_key: z3.nullish(z3.string().check(z3.maxLength(128))),
2212
- location: z3.nullish(z3.union([zMeetLocation, zPhysicalLocation, zPhoneLocation, zCustomLocation])),
2213
- metadata: z3.nullish(zBookingMetadata),
2214
- reminders: z3.nullish(zBookingReminders),
2215
- send_invites: z3._default(z3.optional(z3.boolean()), true),
2216
- start_at: z3.iso.datetime({ offset: true }),
2217
- time_zone: z3.string().check(z3.minLength(1), z3.maxLength(64), z3.regex(/^[A-Za-z0-9_+\-\/]+$/)),
2218
- title: z3.nullish(z3.string().check(z3.maxLength(300)))
2397
+ date: z4.nullish(z4.iso.date()),
2398
+ description: z4.nullish(z4.string().check(z4.maxLength(8e3))),
2399
+ duration_minutes: z4.nullish(z4.int().check(z4.gt(0), z4.lte(1440))),
2400
+ end_at: z4.nullish(z4.iso.datetime({ offset: true })),
2401
+ idempotency_key: z4.nullish(z4.string().check(z4.maxLength(128))),
2402
+ location: z4.nullish(z4.union([zMeetLocation, zPhysicalLocation, zPhoneLocation, zCustomLocation])),
2403
+ metadata: z4.nullish(zBookingMetadataInput),
2404
+ reminders: z4.nullish(zBookingReminders),
2405
+ send_invites: z4._default(z4.optional(z4.boolean()), true),
2406
+ start_at: z4.nullish(z4.iso.datetime({ offset: true })),
2407
+ time_zone: z4.string().check(z4.minLength(1), z4.maxLength(64), z4.regex(/^[A-Za-z0-9_+\-\/]+$/)),
2408
+ title: z4.nullish(z4.string().check(z4.maxLength(300)))
2219
2409
  });
2220
- var zValidationError2 = z3.object({
2221
- ctx: z3.optional(z3.record(z3.string(), z3.unknown())),
2222
- input: z3.optional(z3.unknown()),
2223
- loc: z3.array(z3.union([z3.string(), z3.int()])),
2224
- msg: z3.string(),
2225
- type: z3.string()
2410
+ var zValidationError2 = z4.object({
2411
+ ctx: z4.optional(z4.record(z4.string(), z4.unknown())),
2412
+ input: z4.optional(z4.unknown()),
2413
+ loc: z4.array(z4.union([z4.string(), z4.int()])),
2414
+ msg: z4.string(),
2415
+ type: z4.string()
2226
2416
  });
2227
- var zHttpValidationError2 = z3.object({
2228
- detail: z3.optional(z3.array(zValidationError2))
2417
+ var zHttpValidationError2 = z4.object({
2418
+ detail: z4.optional(z4.array(zValidationError2))
2229
2419
  });
2230
- var zValidationErrorItem2 = z3.object({
2231
- loc: z3.array(z3.union([z3.string(), z3.int()])),
2232
- msg: z3.string(),
2233
- type: z3.string()
2420
+ var zValidationErrorItem2 = z4.object({
2421
+ loc: z4.array(z4.union([z4.string(), z4.int()])),
2422
+ msg: z4.string(),
2423
+ type: z4.string()
2234
2424
  });
2235
- var zApiErrorSchema2 = z3.object({
2425
+ var zApiErrorSchema2 = z4.object({
2236
2426
  code: zErrorCode2,
2237
- context: z3._default(z3.nullish(z3.record(z3.string(), z3.unknown())), null),
2238
- detail: z3.string(),
2239
- errors: z3._default(z3.nullish(z3.array(zValidationErrorItem2)), null),
2240
- request_id: z3._default(z3.nullish(z3.string()), null)
2427
+ context: z4._default(z4.nullish(z4.record(z4.string(), z4.unknown())), null),
2428
+ detail: z4.string(),
2429
+ errors: z4._default(z4.nullish(z4.array(zValidationErrorItem2)), null),
2430
+ request_id: z4._default(z4.nullish(z4.string()), null)
2241
2431
  });
2242
2432
 
2243
2433
  // ../tracking-core/src/resources/calendar/schema.ts
@@ -2247,22 +2437,17 @@ var MAX_REMINDER_OVERRIDES = 5;
2247
2437
  var MAX_REMINDER_MINUTES = 40320;
2248
2438
  var MAX_BOOKING_MINUTES = 1440;
2249
2439
  var BOOKING_SOURCES = ["website", "phone", "walk_in", "import", "operator"];
2250
- var BOOKING_STATUSES = ["pending", "confirmed", "cancelled", "no_show"];
2251
- var GOOGLE_SYNC_STATES = ["queued", "synced", "uncertain", "failed", "drifted"];
2252
- var CALENDAR_SYNC_STATUSES = [
2253
- "pending_invite",
2254
- "awaiting_calendar_selection",
2255
- "connected",
2256
- "needs_reconnect",
2257
- "revoked",
2258
- "disabled"
2259
- ];
2440
+ var BOOKING_STATUSES = zBookingResponse.shape.status.options;
2441
+ var GOOGLE_SYNC_STATES = zBookingResponse.shape.google_sync_state.options;
2442
+ var CALENDAR_SYNC_STATUSES = zCalendarSummary.shape.status.options;
2260
2443
  var CALENDAR_ERROR_CODES = [
2261
2444
  "slot_unavailable",
2262
2445
  "calendar_not_connected",
2263
2446
  "calendar_disconnected",
2264
2447
  "booking_not_found",
2265
- "outside_booking_window",
2448
+ "booking_not_cancellable",
2449
+ "booking_not_reschedulable",
2450
+ "manage_token_invalid",
2266
2451
  "rate_limited",
2267
2452
  "google_error"
2268
2453
  ];
@@ -2274,29 +2459,29 @@ function isKnownTimeZone(timeZone) {
2274
2459
  return false;
2275
2460
  }
2276
2461
  }
2277
- var ianaTz = z4.string().check(
2278
- z4.minLength(1),
2279
- z4.maxLength(64),
2280
- z4.regex(/^[A-Za-z0-9_+\-/]+$/),
2281
- z4.refine(isKnownTimeZone, { error: "unknown IANA time zone" })
2462
+ var ianaTz = z5.string().check(
2463
+ z5.minLength(1),
2464
+ z5.maxLength(64),
2465
+ z5.regex(/^[A-Za-z0-9_+\-/]+$/),
2466
+ z5.refine(isKnownTimeZone, { error: "unknown IANA time zone" })
2282
2467
  );
2283
2468
  var bookingAttendeeSchema = zBookingAttendee;
2284
2469
  var bookingReminderSchema = zBookingReminder;
2285
2470
  var bookingCustomerSchema = zBookingCustomerInput;
2286
- var bookingMetadataSchema = z4.extend(zBookingMetadata, {
2287
- custom: z4.nullish(
2288
- z4.record(z4.string(), z4.union([z4.string(), z4.int(), z4.number(), z4.boolean(), z4.null()]))
2471
+ var bookingMetadataSchema = z5.extend(zBookingMetadataInput, {
2472
+ custom: z5.nullish(
2473
+ z5.record(z5.string(), z5.union([z5.string(), z5.int(), z5.number(), z5.boolean(), z5.null()]))
2289
2474
  )
2290
2475
  });
2291
- var bookingLocationSchema = z4.union([
2476
+ var bookingLocationSchema = z5.union([
2292
2477
  zMeetLocation,
2293
2478
  zPhysicalLocation,
2294
2479
  zPhoneLocation,
2295
2480
  zCustomLocation
2296
2481
  ]);
2297
- var bookingLocationNullableSchema = z4.union([
2482
+ var bookingLocationNullableSchema = z5.union([
2298
2483
  ...bookingLocationSchema.def.options,
2299
- z4.null()
2484
+ z5.null()
2300
2485
  ]);
2301
2486
  function addIssue2(ctx, path, message) {
2302
2487
  ctx.issues.push({ code: "custom", input: ctx.value, path, message });
@@ -2312,26 +2497,44 @@ function refineEndXor(value, ctx) {
2312
2497
  addIssue2(ctx, ["end_at"], "end_at must be after start_at");
2313
2498
  }
2314
2499
  }
2315
- var bookingRemindersSchema = z4.extend(zBookingReminders, {
2316
- overrides: z4._default(
2317
- z4.array(bookingReminderSchema).check(z4.maxLength(MAX_REMINDER_OVERRIDES)),
2500
+ function refineStartXor(value, ctx) {
2501
+ const hasStart = value.start_at !== void 0 && value.start_at !== null;
2502
+ const hasDate = value.date !== void 0 && value.date !== null;
2503
+ if (hasStart === hasDate) {
2504
+ addIssue2(ctx, ["start_at"], "provide exactly one of start_at or date");
2505
+ return;
2506
+ }
2507
+ if (hasStart) {
2508
+ refineEndXor(value, ctx);
2509
+ return;
2510
+ }
2511
+ if (value.end_at != null || value.duration_minutes != null) {
2512
+ addIssue2(ctx, ["date"], "an all-day booking (date) takes no end_at or duration_minutes");
2513
+ }
2514
+ if (value.buffer_before_minutes || value.buffer_after_minutes) {
2515
+ addIssue2(ctx, ["date"], "an all-day booking (date) takes no buffers");
2516
+ }
2517
+ }
2518
+ var bookingRemindersSchema = z5.extend(zBookingReminders, {
2519
+ overrides: z5._default(
2520
+ z5.array(bookingReminderSchema).check(z5.maxLength(MAX_REMINDER_OVERRIDES)),
2318
2521
  []
2319
2522
  )
2320
2523
  });
2321
- var bookingCreateSchema = z4.extend(zBookingCreateSchema, {
2524
+ var bookingCreateSchema = z5.extend(zBookingCreateSchema, {
2322
2525
  time_zone: ianaTz,
2323
2526
  // The generated field is `z.union([...variants]).nullish()`, which nests one
2324
2527
  // `anyOf` inside another; Pydantic's `BookingLocation | None` flattens to a
2325
2528
  // single list and the drift snapshot compares structure. Override with the
2326
2529
  // flattened union.
2327
- location: z4.optional(bookingLocationNullableSchema),
2328
- attendees: z4._default(z4.array(bookingAttendeeSchema).check(z4.maxLength(MAX_ATTENDEES)), []),
2530
+ location: z5.optional(bookingLocationNullableSchema),
2531
+ attendees: z5._default(z5.array(bookingAttendeeSchema).check(z5.maxLength(MAX_ATTENDEES)), []),
2329
2532
  // These reference the un-composed generated schemas; generation can't nest
2330
2533
  // our compositions into its own output.
2331
- reminders: z4.nullish(bookingRemindersSchema),
2332
- metadata: z4.nullish(bookingMetadataSchema)
2333
- }).check((ctx) => refineEndXor(ctx.value, ctx));
2334
- var bookingRescheduleSchema = z4.extend(zBookingRescheduleSchema, { time_zone: ianaTz }).check((ctx) => refineEndXor(ctx.value, ctx));
2534
+ reminders: z5.nullish(bookingRemindersSchema),
2535
+ metadata: z5.nullish(bookingMetadataSchema)
2536
+ }).check((ctx) => refineStartXor(ctx.value, ctx));
2537
+ var bookingRescheduleSchema = z5.extend(zBookingRescheduleSchema, { time_zone: ianaTz }).check((ctx) => refineEndXor(ctx.value, ctx));
2335
2538
  var bookingCancelSchema = zBookingCancelSchema;
2336
2539
 
2337
2540
  // ../tracking-core/src/resources/calendar/slots.ts
@@ -2489,7 +2692,10 @@ function useBookingForm(options = {}) {
2489
2692
  const response = await fetch(endpoint, {
2490
2693
  method: "POST",
2491
2694
  headers: { "Content-Type": "application/json" },
2492
- body: JSON.stringify(input)
2695
+ body: JSON.stringify({
2696
+ ...input,
2697
+ metadata: { ...getBookingAttribution(), ...input.metadata }
2698
+ })
2493
2699
  });
2494
2700
  const body = await response.json().catch(() => null);
2495
2701
  if (!response.ok) {
@@ -2570,6 +2776,7 @@ var import_client2 = require("@aranova/tracking-next/client");
2570
2776
  formatPhoneAsTyped,
2571
2777
  formatSlotRange,
2572
2778
  fromMinor,
2779
+ getBookingAttribution,
2573
2780
  getConsentChoice,
2574
2781
  getConsentState,
2575
2782
  getEventSemantics,