@gradial/aci 0.1.42 → 0.1.44

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 (44) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +4 -4
  3. package/dist/audience-data-models.d.ts +286 -0
  4. package/dist/audience-data-models.js +46 -0
  5. package/dist/collect/aci.js +1 -0
  6. package/dist/collect/aci.js.sha256 +1 -0
  7. package/dist/collect/batcher.d.ts +2 -0
  8. package/dist/collect/batcher.js +18 -6
  9. package/dist/collect/consent/envelope.d.ts +9 -3
  10. package/dist/collect/consent/envelope.js +58 -40
  11. package/dist/collect/index.js +9 -2
  12. package/dist/collect/linkclicks.js +4 -2
  13. package/dist/collect/transport.d.ts +2 -0
  14. package/dist/collect/transport.js +6 -3
  15. package/dist/consent/portable-envelope.d.ts +9 -0
  16. package/dist/consent/portable-envelope.js +110 -0
  17. package/dist/consent-banner/index.js +2 -1
  18. package/dist/content/assets.d.ts +1 -0
  19. package/dist/content/assets.js +1 -0
  20. package/dist/next/collect-route.d.ts +2 -2
  21. package/dist/next/collect-route.js +90 -19
  22. package/dist/next/envelope-digest.d.ts +21 -0
  23. package/dist/next/envelope-digest.js +58 -0
  24. package/dist/next/middleware.d.ts +16 -2
  25. package/dist/next/middleware.js +190 -10
  26. package/dist/next/personalization-host.d.ts +16 -7
  27. package/dist/next/personalization-host.js +14 -33
  28. package/dist/next/server.d.ts +1 -0
  29. package/dist/next/server.js +3 -0
  30. package/dist/next/vercel-collect-sdk-route.d.ts +27 -0
  31. package/dist/next/vercel-collect-sdk-route.js +205 -0
  32. package/dist/next/vercel-personalization.d.ts +3 -2
  33. package/dist/next/vercel-personalization.js +3 -2
  34. package/dist/next/vercel-s3-personalization.d.ts +25 -4
  35. package/dist/next/vercel-s3-personalization.js +368 -14
  36. package/dist/providers/s3.d.ts +19 -4
  37. package/dist/providers/s3.js +92 -22
  38. package/dist/testing/conformance/checks.js +75 -4
  39. package/package.json +27 -16
  40. package/src/cli/validate-content.mjs +0 -0
  41. package/templates/nextjs/starter-content/src/middleware.ts +31 -1
  42. package/templates/nextjs/template/src/app/collect/route.ts +2 -2
  43. package/templates/nextjs/template/src/middleware.ts +31 -1
  44. package/templates/nextjs/template/src/middleware.ts.tmpl +31 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.44 - 2026-07-28
4
+
5
+ ### Fixed
6
+
7
+ - Build the Linux CLI packages as static binaries so managed frontend builds
8
+ can execute `aci` on Alpine/musl workers.
9
+ - Reject dynamically linked Linux CLI artifacts during release planning.
10
+
11
+ ## 0.1.43 - 2026-07-27
12
+
13
+ ### Fixed
14
+
15
+ - Ship the native CLI support required by the starter's `event_latest`
16
+ audience criteria in the same release as the SDK, so `aci content compile`
17
+ cannot resolve an older nested platform binary.
18
+
3
19
  ## 0.1.40 - 2026-07-21
4
20
 
5
21
  ### Added
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Agentic Content Infrastructure SDK
2
2
 
3
- `@gradial/aci` `0.1.33` is a pre-1.0 public-surface reset for the ACI
3
+ `@gradial/aci` `0.1.44` is a pre-1.0 public-surface reset for the ACI
4
4
  client SDK. Breaking changes from the old `0.1.x` accidental surface are
5
5
  intentional: the root import is framework-neutral, framework runtime behavior is
6
6
  behind explicit subpaths, and the first required customer path is React/Next.
@@ -8,7 +8,7 @@ behind explicit subpaths, and the first required customer path is React/Next.
8
8
  ## Install
9
9
 
10
10
  ```bash
11
- npm install @gradial/aci@0.1.33 zod@^4
11
+ npm install @gradial/aci@0.1.44 zod@^4
12
12
  ```
13
13
 
14
14
  ## Root Import
@@ -85,13 +85,13 @@ go through an app-owned HTTP endpoint backed server-side by a `ContentProvider`.
85
85
  The first RC scaffold path is Next:
86
86
 
87
87
  ```bash
88
- npx @gradial/aci@0.1.33 init my-site --template next-starter
88
+ npx @gradial/aci@0.1.44 init my-site --template next-starter
89
89
  ```
90
90
 
91
91
  List available templates:
92
92
 
93
93
  ```bash
94
- npx @gradial/aci@0.1.33 init --list
94
+ npx @gradial/aci@0.1.44 init --list
95
95
  ```
96
96
 
97
97
  ## Personalization: The One-Tag Install
@@ -9,6 +9,149 @@ export declare const segmentDataModel: import("./index.js").DataModelContract<z.
9
9
  }>;
10
10
  priority: z.ZodOptional<z.ZodNumber>;
11
11
  description: z.ZodOptional<z.ZodString>;
12
+ criteria: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
13
+ all: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
14
+ minCount: z.ZodNumber;
15
+ event: z.ZodString;
16
+ path: z.ZodOptional<z.ZodString>;
17
+ referrer: z.ZodOptional<z.ZodString>;
18
+ withinDays: z.ZodOptional<z.ZodNumber>;
19
+ experiment: z.ZodOptional<z.ZodObject<{
20
+ experimentId: z.ZodString;
21
+ armId: z.ZodOptional<z.ZodString>;
22
+ }, z.core.$strict>>;
23
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
24
+ type: z.ZodLiteral<"event_count">;
25
+ }, z.core.$strict>, z.ZodObject<{
26
+ event: z.ZodString;
27
+ path: z.ZodOptional<z.ZodString>;
28
+ referrer: z.ZodOptional<z.ZodString>;
29
+ withinDays: z.ZodOptional<z.ZodNumber>;
30
+ experiment: z.ZodOptional<z.ZodObject<{
31
+ experimentId: z.ZodString;
32
+ armId: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strict>>;
34
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
35
+ type: z.ZodLiteral<"event_exists">;
36
+ }, z.core.$strict>, z.ZodObject<{
37
+ event: z.ZodString;
38
+ path: z.ZodOptional<z.ZodString>;
39
+ referrer: z.ZodOptional<z.ZodString>;
40
+ withinDays: z.ZodOptional<z.ZodNumber>;
41
+ experiment: z.ZodOptional<z.ZodObject<{
42
+ experimentId: z.ZodString;
43
+ armId: z.ZodOptional<z.ZodString>;
44
+ }, z.core.$strict>>;
45
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
46
+ type: z.ZodLiteral<"event_latest">;
47
+ }, z.core.$strict>], "type">>;
48
+ any: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
49
+ minCount: z.ZodNumber;
50
+ event: z.ZodString;
51
+ path: z.ZodOptional<z.ZodString>;
52
+ referrer: z.ZodOptional<z.ZodString>;
53
+ withinDays: z.ZodOptional<z.ZodNumber>;
54
+ experiment: z.ZodOptional<z.ZodObject<{
55
+ experimentId: z.ZodString;
56
+ armId: z.ZodOptional<z.ZodString>;
57
+ }, z.core.$strict>>;
58
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
59
+ type: z.ZodLiteral<"event_count">;
60
+ }, z.core.$strict>, z.ZodObject<{
61
+ event: z.ZodString;
62
+ path: z.ZodOptional<z.ZodString>;
63
+ referrer: z.ZodOptional<z.ZodString>;
64
+ withinDays: z.ZodOptional<z.ZodNumber>;
65
+ experiment: z.ZodOptional<z.ZodObject<{
66
+ experimentId: z.ZodString;
67
+ armId: z.ZodOptional<z.ZodString>;
68
+ }, z.core.$strict>>;
69
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
70
+ type: z.ZodLiteral<"event_exists">;
71
+ }, z.core.$strict>, z.ZodObject<{
72
+ event: z.ZodString;
73
+ path: z.ZodOptional<z.ZodString>;
74
+ referrer: z.ZodOptional<z.ZodString>;
75
+ withinDays: z.ZodOptional<z.ZodNumber>;
76
+ experiment: z.ZodOptional<z.ZodObject<{
77
+ experimentId: z.ZodString;
78
+ armId: z.ZodOptional<z.ZodString>;
79
+ }, z.core.$strict>>;
80
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
81
+ type: z.ZodLiteral<"event_latest">;
82
+ }, z.core.$strict>], "type">>>;
83
+ }, z.core.$strict>, z.ZodObject<{
84
+ all: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
85
+ minCount: z.ZodNumber;
86
+ event: z.ZodString;
87
+ path: z.ZodOptional<z.ZodString>;
88
+ referrer: z.ZodOptional<z.ZodString>;
89
+ withinDays: z.ZodOptional<z.ZodNumber>;
90
+ experiment: z.ZodOptional<z.ZodObject<{
91
+ experimentId: z.ZodString;
92
+ armId: z.ZodOptional<z.ZodString>;
93
+ }, z.core.$strict>>;
94
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
95
+ type: z.ZodLiteral<"event_count">;
96
+ }, z.core.$strict>, z.ZodObject<{
97
+ event: z.ZodString;
98
+ path: z.ZodOptional<z.ZodString>;
99
+ referrer: z.ZodOptional<z.ZodString>;
100
+ withinDays: z.ZodOptional<z.ZodNumber>;
101
+ experiment: z.ZodOptional<z.ZodObject<{
102
+ experimentId: z.ZodString;
103
+ armId: z.ZodOptional<z.ZodString>;
104
+ }, z.core.$strict>>;
105
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
106
+ type: z.ZodLiteral<"event_exists">;
107
+ }, z.core.$strict>, z.ZodObject<{
108
+ event: z.ZodString;
109
+ path: z.ZodOptional<z.ZodString>;
110
+ referrer: z.ZodOptional<z.ZodString>;
111
+ withinDays: z.ZodOptional<z.ZodNumber>;
112
+ experiment: z.ZodOptional<z.ZodObject<{
113
+ experimentId: z.ZodString;
114
+ armId: z.ZodOptional<z.ZodString>;
115
+ }, z.core.$strict>>;
116
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
117
+ type: z.ZodLiteral<"event_latest">;
118
+ }, z.core.$strict>], "type">>>;
119
+ any: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
120
+ minCount: z.ZodNumber;
121
+ event: z.ZodString;
122
+ path: z.ZodOptional<z.ZodString>;
123
+ referrer: z.ZodOptional<z.ZodString>;
124
+ withinDays: z.ZodOptional<z.ZodNumber>;
125
+ experiment: z.ZodOptional<z.ZodObject<{
126
+ experimentId: z.ZodString;
127
+ armId: z.ZodOptional<z.ZodString>;
128
+ }, z.core.$strict>>;
129
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
130
+ type: z.ZodLiteral<"event_count">;
131
+ }, z.core.$strict>, z.ZodObject<{
132
+ event: z.ZodString;
133
+ path: z.ZodOptional<z.ZodString>;
134
+ referrer: z.ZodOptional<z.ZodString>;
135
+ withinDays: z.ZodOptional<z.ZodNumber>;
136
+ experiment: z.ZodOptional<z.ZodObject<{
137
+ experimentId: z.ZodString;
138
+ armId: z.ZodOptional<z.ZodString>;
139
+ }, z.core.$strict>>;
140
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
141
+ type: z.ZodLiteral<"event_exists">;
142
+ }, z.core.$strict>, z.ZodObject<{
143
+ event: z.ZodString;
144
+ path: z.ZodOptional<z.ZodString>;
145
+ referrer: z.ZodOptional<z.ZodString>;
146
+ withinDays: z.ZodOptional<z.ZodNumber>;
147
+ experiment: z.ZodOptional<z.ZodObject<{
148
+ experimentId: z.ZodString;
149
+ armId: z.ZodOptional<z.ZodString>;
150
+ }, z.core.$strict>>;
151
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
152
+ type: z.ZodLiteral<"event_latest">;
153
+ }, z.core.$strict>], "type">>;
154
+ }, z.core.$strict>]>>;
12
155
  }, z.core.$strip>, "segment">;
13
156
  export declare const audienceDataModel: import("./index.js").DataModelContract<z.ZodObject<{
14
157
  id: z.ZodString;
@@ -259,6 +402,149 @@ export declare const audienceDataModels: (import("./index.js").DataModelContract
259
402
  }>;
260
403
  priority: z.ZodOptional<z.ZodNumber>;
261
404
  description: z.ZodOptional<z.ZodString>;
405
+ criteria: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
406
+ all: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
407
+ minCount: z.ZodNumber;
408
+ event: z.ZodString;
409
+ path: z.ZodOptional<z.ZodString>;
410
+ referrer: z.ZodOptional<z.ZodString>;
411
+ withinDays: z.ZodOptional<z.ZodNumber>;
412
+ experiment: z.ZodOptional<z.ZodObject<{
413
+ experimentId: z.ZodString;
414
+ armId: z.ZodOptional<z.ZodString>;
415
+ }, z.core.$strict>>;
416
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
417
+ type: z.ZodLiteral<"event_count">;
418
+ }, z.core.$strict>, z.ZodObject<{
419
+ event: z.ZodString;
420
+ path: z.ZodOptional<z.ZodString>;
421
+ referrer: z.ZodOptional<z.ZodString>;
422
+ withinDays: z.ZodOptional<z.ZodNumber>;
423
+ experiment: z.ZodOptional<z.ZodObject<{
424
+ experimentId: z.ZodString;
425
+ armId: z.ZodOptional<z.ZodString>;
426
+ }, z.core.$strict>>;
427
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
428
+ type: z.ZodLiteral<"event_exists">;
429
+ }, z.core.$strict>, z.ZodObject<{
430
+ event: z.ZodString;
431
+ path: z.ZodOptional<z.ZodString>;
432
+ referrer: z.ZodOptional<z.ZodString>;
433
+ withinDays: z.ZodOptional<z.ZodNumber>;
434
+ experiment: z.ZodOptional<z.ZodObject<{
435
+ experimentId: z.ZodString;
436
+ armId: z.ZodOptional<z.ZodString>;
437
+ }, z.core.$strict>>;
438
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
439
+ type: z.ZodLiteral<"event_latest">;
440
+ }, z.core.$strict>], "type">>;
441
+ any: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
442
+ minCount: z.ZodNumber;
443
+ event: z.ZodString;
444
+ path: z.ZodOptional<z.ZodString>;
445
+ referrer: z.ZodOptional<z.ZodString>;
446
+ withinDays: z.ZodOptional<z.ZodNumber>;
447
+ experiment: z.ZodOptional<z.ZodObject<{
448
+ experimentId: z.ZodString;
449
+ armId: z.ZodOptional<z.ZodString>;
450
+ }, z.core.$strict>>;
451
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
452
+ type: z.ZodLiteral<"event_count">;
453
+ }, z.core.$strict>, z.ZodObject<{
454
+ event: z.ZodString;
455
+ path: z.ZodOptional<z.ZodString>;
456
+ referrer: z.ZodOptional<z.ZodString>;
457
+ withinDays: z.ZodOptional<z.ZodNumber>;
458
+ experiment: z.ZodOptional<z.ZodObject<{
459
+ experimentId: z.ZodString;
460
+ armId: z.ZodOptional<z.ZodString>;
461
+ }, z.core.$strict>>;
462
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
463
+ type: z.ZodLiteral<"event_exists">;
464
+ }, z.core.$strict>, z.ZodObject<{
465
+ event: z.ZodString;
466
+ path: z.ZodOptional<z.ZodString>;
467
+ referrer: z.ZodOptional<z.ZodString>;
468
+ withinDays: z.ZodOptional<z.ZodNumber>;
469
+ experiment: z.ZodOptional<z.ZodObject<{
470
+ experimentId: z.ZodString;
471
+ armId: z.ZodOptional<z.ZodString>;
472
+ }, z.core.$strict>>;
473
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
474
+ type: z.ZodLiteral<"event_latest">;
475
+ }, z.core.$strict>], "type">>>;
476
+ }, z.core.$strict>, z.ZodObject<{
477
+ all: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
478
+ minCount: z.ZodNumber;
479
+ event: z.ZodString;
480
+ path: z.ZodOptional<z.ZodString>;
481
+ referrer: z.ZodOptional<z.ZodString>;
482
+ withinDays: z.ZodOptional<z.ZodNumber>;
483
+ experiment: z.ZodOptional<z.ZodObject<{
484
+ experimentId: z.ZodString;
485
+ armId: z.ZodOptional<z.ZodString>;
486
+ }, z.core.$strict>>;
487
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
488
+ type: z.ZodLiteral<"event_count">;
489
+ }, z.core.$strict>, z.ZodObject<{
490
+ event: z.ZodString;
491
+ path: z.ZodOptional<z.ZodString>;
492
+ referrer: z.ZodOptional<z.ZodString>;
493
+ withinDays: z.ZodOptional<z.ZodNumber>;
494
+ experiment: z.ZodOptional<z.ZodObject<{
495
+ experimentId: z.ZodString;
496
+ armId: z.ZodOptional<z.ZodString>;
497
+ }, z.core.$strict>>;
498
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
499
+ type: z.ZodLiteral<"event_exists">;
500
+ }, z.core.$strict>, z.ZodObject<{
501
+ event: z.ZodString;
502
+ path: z.ZodOptional<z.ZodString>;
503
+ referrer: z.ZodOptional<z.ZodString>;
504
+ withinDays: z.ZodOptional<z.ZodNumber>;
505
+ experiment: z.ZodOptional<z.ZodObject<{
506
+ experimentId: z.ZodString;
507
+ armId: z.ZodOptional<z.ZodString>;
508
+ }, z.core.$strict>>;
509
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
510
+ type: z.ZodLiteral<"event_latest">;
511
+ }, z.core.$strict>], "type">>>;
512
+ any: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
513
+ minCount: z.ZodNumber;
514
+ event: z.ZodString;
515
+ path: z.ZodOptional<z.ZodString>;
516
+ referrer: z.ZodOptional<z.ZodString>;
517
+ withinDays: z.ZodOptional<z.ZodNumber>;
518
+ experiment: z.ZodOptional<z.ZodObject<{
519
+ experimentId: z.ZodString;
520
+ armId: z.ZodOptional<z.ZodString>;
521
+ }, z.core.$strict>>;
522
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
523
+ type: z.ZodLiteral<"event_count">;
524
+ }, z.core.$strict>, z.ZodObject<{
525
+ event: z.ZodString;
526
+ path: z.ZodOptional<z.ZodString>;
527
+ referrer: z.ZodOptional<z.ZodString>;
528
+ withinDays: z.ZodOptional<z.ZodNumber>;
529
+ experiment: z.ZodOptional<z.ZodObject<{
530
+ experimentId: z.ZodString;
531
+ armId: z.ZodOptional<z.ZodString>;
532
+ }, z.core.$strict>>;
533
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
534
+ type: z.ZodLiteral<"event_exists">;
535
+ }, z.core.$strict>, z.ZodObject<{
536
+ event: z.ZodString;
537
+ path: z.ZodOptional<z.ZodString>;
538
+ referrer: z.ZodOptional<z.ZodString>;
539
+ withinDays: z.ZodOptional<z.ZodNumber>;
540
+ experiment: z.ZodOptional<z.ZodObject<{
541
+ experimentId: z.ZodString;
542
+ armId: z.ZodOptional<z.ZodString>;
543
+ }, z.core.$strict>>;
544
+ properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
545
+ type: z.ZodLiteral<"event_latest">;
546
+ }, z.core.$strict>], "type">>;
547
+ }, z.core.$strict>]>>;
262
548
  }, z.core.$strip>, "segment"> | import("./index.js").DataModelContract<z.ZodObject<{
263
549
  id: z.ZodString;
264
550
  displayName: z.ZodString;
@@ -4,6 +4,51 @@ const resourceStatus = z.enum(['draft', 'enabled', 'disabled']);
4
4
  const experimentStatus = z.enum(['draft', 'running', 'paused', 'stopped', 'promoted', 'archived']);
5
5
  const experimentKind = z.enum(['ab', 'abn', 'xt']);
6
6
  const scalarValue = z.union([z.string(), z.number(), z.boolean()]);
7
+ // Largest whole-day window whose nanoseconds fit in Go's time.Duration:
8
+ // floor(MaxInt64 / (24 * time.Hour)) = 106751.
9
+ const maxCriteriaWithinDays = 106751;
10
+ const criteriaFilterValue = z.union([
11
+ z.string().regex(/^(?!\*$)/, 'must not be a lone "*"'),
12
+ z.number(),
13
+ z.boolean(),
14
+ ]);
15
+ const criteriaExperimentSchema = z.object({
16
+ experimentId: z.string().regex(/\S/, 'experimentId is required'),
17
+ armId: z.string().optional(),
18
+ }).strict();
19
+ const criteriaFilterShape = {
20
+ event: z.string().regex(/\S/, 'event is required'),
21
+ path: z.string().regex(/^(?!\*$)/, 'path must not be a lone "*"').optional(),
22
+ referrer: z.string().regex(/^(?!\*$)/, 'referrer must not be a lone "*"').optional(),
23
+ withinDays: z.number().int().positive().max(maxCriteriaWithinDays).optional(),
24
+ experiment: criteriaExperimentSchema.optional(),
25
+ properties: z.record(z.string(), criteriaFilterValue).optional(),
26
+ };
27
+ const segmentCriteriaConditionSchema = z.discriminatedUnion('type', [
28
+ z.object({
29
+ type: z.literal('event_count'),
30
+ ...criteriaFilterShape,
31
+ minCount: z.number().int().positive(),
32
+ }).strict(),
33
+ z.object({
34
+ type: z.literal('event_exists'),
35
+ ...criteriaFilterShape,
36
+ }).strict(),
37
+ z.object({
38
+ type: z.literal('event_latest'),
39
+ ...criteriaFilterShape,
40
+ }).strict(),
41
+ ]);
42
+ const segmentCriteriaSchema = z.union([
43
+ z.object({
44
+ all: z.array(segmentCriteriaConditionSchema).min(1),
45
+ any: z.array(segmentCriteriaConditionSchema).optional(),
46
+ }).strict(),
47
+ z.object({
48
+ all: z.array(segmentCriteriaConditionSchema).optional(),
49
+ any: z.array(segmentCriteriaConditionSchema).min(1),
50
+ }).strict(),
51
+ ]);
7
52
  const requestRuleConditionSchema = z.object({
8
53
  field: z.string().min(1),
9
54
  operator: z.enum(['equals', 'contains', 'startsWith', 'exists']),
@@ -21,6 +66,7 @@ export const segmentDataModel = defineDataModel({
21
66
  status: resourceStatus,
22
67
  priority: z.number().int().nonnegative().optional(),
23
68
  description: z.string().optional(),
69
+ criteria: segmentCriteriaSchema.optional(),
24
70
  }),
25
71
  });
26
72
  export const audienceDataModel = defineDataModel({
@@ -0,0 +1 @@
1
+ "use strict";(()=>{var Ne=Object.defineProperty;var Le=(t,e,n)=>e in t?Ne(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var y=(t,e,n)=>Le(t,typeof e!="symbol"?e+"":e,n);var x="data-aci-event",Oe="data-aci-on",H="data-aci-prop-",De="data-aci-refresh",q="custom.";function D(t){if(typeof t!="string")return;let e=t.trim().toLowerCase();if(!(e===""||/[\s/]/.test(e)))return e.startsWith(q)?e:q+e}function Re(t){let e;for(let n of Array.from(t.attributes)){if(!n.name.startsWith(H))continue;let r=n.name.slice(H.length);r!==""&&((e!=null?e:e={})[r]=n.value)}return e}function U(t,e){let n=D(t.getAttribute(x));if(n===void 0){e==null||e("capture",{reason:"malformed_declaration",attr:x});return}return{eventName:n,properties:Re(t)}}function X(t){var e,n;return(n=(e=t.getAttribute(Oe))==null?void 0:e.trim().toLowerCase())!=null?n:"click"}function $(t,e,n){let{document:r,debug:o}=e;r.addEventListener("click",f=>{var l,p;try{let u=f.target;if((l=u==null?void 0:u.closest)==null?void 0:l.call(u,`[${De}]`)){n==null||n();return}let m=(p=u==null?void 0:u.closest)==null?void 0:p.call(u,`[${x}]`);if(!m||X(m)!=="click")return;let g=U(m,o);g&&t(g)}catch(u){o==null||o("capture",{reason:"click_handler_failed",error:String(u)})}});let i=e.intersectionObserver;if(typeof i!="function")return;let s=Array.from(r.querySelectorAll(`[${x}]`)).filter(f=>X(f)==="visible");if(s.length===0)return;let a=new WeakSet,c=new i((f,l)=>{try{for(let p of f){if(!p.isIntersecting||p.intersectionRatio<.5||a.has(p.target))continue;a.add(p.target),l.unobserve(p.target);let u=U(p.target,o);u&&t(u)}}catch(p){o==null||o("capture",{reason:"visible_handler_failed",error:String(p)})}},{threshold:.5});for(let f of s)c.observe(f)}function K(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Y(t,e,n,r){let o=(...a)=>{try{let[c,...f]=a;if(c==="track"){let l=D(f[0]);if(l===void 0){r==null||r("capture",{reason:"malformed_track_name",name:f[0]});return}let p=f[1];if(p!==void 0&&!K(p)){r==null||r("capture",{reason:"malformed_track_properties",name:l});return}n.track(l,p);return}if(c==="consent"){if(e.preset!=="manual"){r==null||r("consent",{reason:"preset_authoritative",preset:e.preset});return}let l=f[0];if(!K(l)){r==null||r("consent",{reason:"malformed_consent_envelope"});return}n.consent({p:l.p,src:l.src});return}r==null||r("capture",{reason:"unknown_command",command:c})}catch(c){r==null||r("capture",{reason:"command_failed",error:String(c)})}},i=t.aci,s=i==null?void 0:i.q;if(t.aci=o,s!=null)for(let a of Array.from(s)){let c=Array.from(a);o(...c)}}var Be="experiment.exposure",Fe='script[type="application/json"][data-aci-assignments]';function Ve(t){if(typeof t!="object"||t===null)return null;let e=t,n=e.experimentId,r=e.armId,o=e.allocationVersion;return typeof n!="string"||n===""||typeof r!="string"||r===""||typeof o!="string"?null:{experimentId:n,armId:r,allocationVersion:o}}function Me(t,e){try{let n=t.querySelector(Fe);if(!n)return[];let r=n.textContent;if(r==null||r.trim()==="")return[];let o=JSON.parse(r);if(typeof o!="object"||o===null)return e==null||e("capture",{reason:"assignments_malformed"}),[];let i=o;if(i.v!==1||!Array.isArray(i.experiments))return e==null||e("capture",{reason:"assignments_malformed"}),[];let s=[];for(let a of i.experiments){let c=Ve(a);c&&s.push(c)}return s}catch(n){return e==null||e("capture",{reason:"assignments_parse_failed",error:String(n)}),[]}}function J(t,e){if(!e||t.experiment!==void 0)return t;let n=e.getActiveAssignments()[0];if(!n)return t;let r={experimentId:n.experimentId,armId:n.armId,allocationVersion:n.allocationVersion};return{...t,experiment:r}}function Q(t){let e=[],n=new Set,r,o=()=>{e=Me(t.document,t.debug);for(let i of e)n.has(i.experimentId)||(n.add(i.experimentId),r==null||r({eventName:Be,url:t.window.location.href,experiment:{experimentId:i.experimentId,armId:i.armId,allocationVersion:i.allocationVersion}}))};return{getActiveAssignments:()=>e.map(i=>({...i})),start(i){r=i,o()},rearm(){n.clear(),o()}}}var Z="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function We(t){globalThis.crypto.getRandomValues(t)}function S(t,e){let n=t!=null?t:Date.now(),r="";for(let c=0;c<10;c++)r=Z[n%32]+r,n=Math.floor(n/32);let o=new Uint8Array(10);(e!=null?e:We)(o);let i="",s=0,a=0;for(let c of o)for(s=s<<8|c,a+=8;a>=5;)i+=Z[s>>>a-5&31],a-=5;return r+i}var Ge=60*1024,je=100,ze=5e3,ee='{"envelopeId":"',te='","events":[',ne="]}",He=26,A=ee.length+He+te.length+ne.length,qe=new TextEncoder,Ue=t=>qe.encode(t).length,T=class{constructor(e){y(this,"options");y(this,"maxBytes");y(this,"queue",[]);y(this,"queuedBytes",0);y(this,"flushing",!1);y(this,"intervalId");var n;this.options=e,this.maxBytes=(n=e.maxBatchBytes)!=null?n:Ge}get pending(){return this.queue.length}push(e){let n=JSON.stringify(e),r=Ue(n);this.queue.push({json:n,bytes:r,eventId:e.eventId}),this.queuedBytes+=r,!this.flushing&&this.envelopeBytes()>=this.maxBytes&&this.flush()}flush(){var e,n;if(!this.flushing){this.flushing=!0;try{(n=(e=this.options).onTick)==null||n.call(e),this.drain()}finally{this.flushing=!1}}}start(){var o,i,s,a;let e=(o=this.options.timers)!=null?o:{setInterval:(c,f)=>setInterval(c,f),clearInterval:c=>clearInterval(c)};this.intervalId=e.setInterval(()=>this.flush(),(i=this.options.flushIntervalMs)!=null?i:ze);let n=(s=this.options.documentTarget)!=null?s:typeof document!="undefined"?document:void 0;n==null||n.addEventListener("visibilitychange",()=>{n.visibilityState==="hidden"&&this.flush()});let r=(a=this.options.windowTarget)!=null?a:typeof window!="undefined"?window:void 0;r==null||r.addEventListener("pagehide",()=>this.flush()),this.flush()}stop(){if(this.intervalId!==void 0){let e=this.options.timers;e?e.clearInterval(this.intervalId):clearInterval(this.intervalId),this.intervalId=void 0}}envelopeBytes(){let e=this.queue.length>1?this.queue.length-1:0;return A+this.queuedBytes+e}drain(){var e,n,r;for(;this.queue.length>0;){let o=this.queue[0];if(A+o.bytes>this.maxBytes){this.queue.shift(),this.queuedBytes-=o.bytes,(n=(e=this.options).debug)==null||n.call(e,"flush",{reason:"oversize_event",eventId:o.eventId,bytes:o.bytes});continue}let i=[],s=A;for(;this.queue.length>0;){let c=this.queue[0];if(A+c.bytes>this.maxBytes||i.length>=je)break;let f=s+c.bytes+(i.length>0?1:0);if(f>this.maxBytes)break;i.push(c.json),s=f,this.queue.shift(),this.queuedBytes-=c.bytes}if(i.length===0)continue;let a=((r=this.options.createEnvelopeId)!=null?r:S)();this.options.send(ee+a+te+i.join(",")+ne)}}};var Xe=new Set(["c15t","onetrust","cookiebot","trustarc","manual"]);function P(t,e){var o;let n=(o=t==null?void 0:t.getAttribute)==null?void 0:o.call(t,e);if(n==null)return;let r=n.trim();return r===""?void 0:r}function re(t){var r;let e=(r=P(t,"data-aci-consent"))==null?void 0:r.toLowerCase(),n=e!==void 0&&Xe.has(e)?e:"manual";return{site:P(t,"data-aci-site"),preset:n,categories:P(t,"data-aci-consent-categories"),debug:P(t,"data-aci-debug")==="1"}}function oe(t,e,n){if(!t)return()=>{};let r=e!=null?e:(i=>console.debug("[aci]",i)),o=n!=null?n:Date.now;return(i,s)=>{try{r({t:o(),kind:i,detail:s})}catch{}}}var R=new TextEncoder,$e=2048,Ke=32,Ye=128,Je=512,Qe=2147483647,Ze=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,9}))?(Z|[+-]\d{2}:\d{2})$/,et=/^[\t\n\v\f\r ]+|[\t\n\v\f\r ]+$/g,tt=new Set(["true","all","granted","yes","personalization","personalized"]);function _(t,e=!0){let n=w(t);if(!n)return null;if(e)try{n=decodeURIComponent(n)}catch{}if(n=w(n),!n||R.encode(n).byteLength>$e)return null;if(tt.has(n.toLowerCase()))return{version:0,purposes:["personalization"],grantedAt:""};try{let r=JSON.parse(n),o=typeof r.t=="string"?r.t:"";return!Number.isInteger(r.v)||r.v<0||r.v>Qe||!Array.isArray(r.p)||r.p.length>Ke||!r.p.every(i=>typeof i=="string")||r.p.some(i=>R.encode(i).byteLength>Ye)||r.t!==void 0&&r.t!==null&&(typeof r.t!="string"||r.t===""||!nt(r.t))||r.src!==void 0&&r.src!==null&&typeof r.src!="string"||typeof r.src=="string"&&R.encode(r.src).byteLength>Je?null:{version:r.v,purposes:r.p,grantedAt:o,source:typeof r.src=="string"?r.src:void 0}}catch{return null}}function B(t){return(t==null?void 0:t.purposes.some(e=>w(e).toLowerCase()==="personalization"))||!1}function w(t){return t.replace(et,"")}function nt(t){let e=Ze.exec(t);if(!e||Number.isNaN(Date.parse(t)))return!1;let n=Number(e[1]),r=Number(e[2]),o=Number(e[3]),i=Number(e[4]),s=Number(e[5]),a=Number(e[6]);if(r<1||r>12||o<1||o>rt(n,r)||i>23||s>59||a>59)return!1;let c=e[8];return c==="Z"||Number(c.slice(1,3))<=23&&Number(c.slice(4,6))<=59}function rt(t,e){return e===2?t%4===0&&(t%100!==0||t%400===0)?29:28:[4,6,9,11].includes(e)?30:31}var ie="personalization",F="aci_consent",V=1,ot=365*24*60*60;function it(t,e){var r;let n=`${F}=${t.encoded}; Path=/; Max-Age=${ot}; SameSite=Lax`;((r=e.document.location)==null?void 0:r.protocol)==="https:"&&(n+="; Secure"),e.document.cookie=n}function I(t,e,n){var o;let r=st(t,e,n.now);return r===null?!1:(B(r.snapshot)||(o=n.gapBuffer)==null||o.purge(),it(r,n),!0)}function se(t){for(let e of t.cookie.split(";")){let n=w(e);if(n.startsWith(F+"="))return n.slice(F.length+1)}}function ae(t){return t===void 0||t===""?!1:B(_(t,!0))}function ce(t){var r;if(!Array.isArray(t))return;let e=[];for(let o of t){if(typeof o!="string")return;e.push(w(o))}let n=JSON.stringify({v:V,p:e});return(r=_(n,!1))==null?void 0:r.purposes}function ue(t){var o;if(t!==void 0&&typeof t!="string")return;let e=typeof t=="string"?w(t):"",r=JSON.stringify({v:V,p:[],src:e===""?"manual":e});return(o=_(r,!1))==null?void 0:o.source}function st(t,e,n){try{let r=JSON.stringify({v:V,p:t,t:new Date((n!=null?n:Date.now)()).toISOString(),src:e}),o=_(r,!1);return o===null?null:{encoded:encodeURIComponent(r),snapshot:o}}catch{return null}}var at="cmp-",ct=/^[a-z0-9._-]+$/,ut={c15t:"measurement,marketing",onetrust:"c0002,c0004",cookiebot:"statistics,marketing",trustarc:"functional,advertising"};function M(t,e){let n=e!=null?e:ut[t];if(n===void 0)return null;let r=n.split(",").map(o=>o.trim().toLowerCase()).filter(o=>o!=="");if(r.length===0)return null;for(let o of r)if(!ct.test(o))return null;return r}function ft(t,e){return e.filter(r=>r in t.categories).some(r=>t.categories[r]===!0)?[ie]:[]}function k(t,e,n){var r,o,i,s;try{let a=M(e,n.categories);if(a===null){(r=n.debug)==null||r.call(n,"consent",{reason:"unparseable_mapping",preset:e});return}if(a.filter(l=>l in t.categories).length===0){(o=n.debug)==null||o.call(n,"consent",{reason:"unmappable_cmp_state",preset:e});return}let f=ft(t,a);I(f,at+e,{document:n.document,gapBuffer:n.gapBuffer,now:n.now}),(i=n.debug)==null||i.call(n,"consent",{reason:"written",preset:e,purposes:f})}catch(a){(s=n.debug)==null||s.call(n,"consent",{reason:"consent_bridge_failed",preset:e,error:String(a)})}}var fe=250,lt=1e4;function C(t,e,n){var s;let r=(s=n==null?void 0:n.scheduler)!=null?s:{setTimeout:(a,c)=>setTimeout(a,c),clearTimeout:a=>clearTimeout(a)},o=Math.floor(lt/fe),i=()=>{var c,f;let a;try{a=t()}catch(l){(c=n==null?void 0:n.debug)==null||c.call(n,"consent",{reason:"cmp_read_failed",error:String(l)});return}if(a!==void 0){e(a);return}if(o-=1,o<=0){(f=n==null?void 0:n.debug)==null||f.call(n,"consent",{reason:"cmp_not_found"});return}r.setTimeout(i,fe)};i()}function b(t,e){try{e()}catch(n){t==null||t("consent",{reason:"adapter_failed",error:String(n)})}}var dt="c15t";function pt(t){if(typeof t!="object"||t===null)return;let e={};for(let[n,r]of Object.entries(t))typeof r=="boolean"&&(e[n.toLowerCase()]=r);return{categories:e}}function mt(t,e){return typeof t=="object"&&t!==null?"consents"in t?t.consents:t:e.consents}function le(t){C(()=>{let e=t.window.c15t;return typeof e=="object"&&e!==null?e:void 0},e=>{b(t.debug,()=>{var r;let n=o=>{let i=pt(o);i&&k(i,dt,t)};n(e.consents),(r=e.onConsentChange)==null||r.call(e,o=>b(t.debug,()=>n(mt(o,e))))})},t)}var gt="cookiebot",vt=["CookiebotOnConsentReady","CookiebotOnAccept","CookiebotOnDecline"];function de(t){let e=t.Cookiebot;return typeof e=="object"&&e!==null?e:void 0}function ht(t){if(typeof t!="object"||t===null)return;let e={};for(let[n,r]of Object.entries(t))typeof r=="boolean"&&(e[n.toLowerCase()]=r);return{categories:e}}function pe(t){let e=()=>{let r=de(t.window);if(!r||r.hasResponse!==!0)return;let o=ht(r.consent);o&&k(o,gt,t)},n=t.window;if(typeof n.addEventListener=="function")for(let r of vt)n.addEventListener(r,()=>b(t.debug,e));C(()=>de(t.window),()=>b(t.debug,e),t)}var me="onetrust",bt=/^c\d{4}$/;function yt(t,e){let n={};for(let r of t.split(",")){let o=r.trim().toLowerCase();o!==""&&(n[o]=!0)}for(let r of e!=null?e:[])!(r in n)&&bt.test(r)&&(n[r]=!1);return{categories:n}}function ge(t){let e=t.window,n=()=>{let o=e.OnetrustActiveGroups;if(typeof o!="string")return;let i=M(me,t.categories);k(yt(o,i),me,t)},r=e.OptanonWrapper;e.OptanonWrapper=()=>{if(typeof r=="function")try{r()}catch{}b(t.debug,n)},C(()=>{let o=e.OnetrustActiveGroups;return typeof o=="string"?o:void 0},()=>b(t.debug,n),t)}var Et="trustarc",kt={required:1,functional:2,advertising:3},ve="PrivacyManagerAPI";function he(t){let e=t.truste,n=e==null?void 0:e.cma,r=n==null?void 0:n.callApi;return typeof r=="function"?r.bind(n):void 0}function Ct(t){if(typeof t!="object"||t===null)return;let e=t.consentDecision;if(typeof e!="number"||!Number.isFinite(e)||e<1)return;let n={};for(let[r,o]of Object.entries(kt))n[r]=e>=o;return{categories:n}}function wt(t){return typeof t=="string"?t.includes(ve):typeof t=="object"&&t!==null&&ve in t}function St(t){let e=t.location;return typeof(e==null?void 0:e.hostname)=="string"?e.hostname:void 0}function be(t){let e=()=>{let r=he(t.window);if(!r)return;let o=Ct(r("getConsentDecision",St(t.window)));o&&k(o,Et,t)},n=t.window;typeof n.addEventListener=="function"&&n.addEventListener("message",r=>b(t.debug,()=>{wt(r==null?void 0:r.data)&&e()})),C(()=>he(t.window),()=>b(t.debug,e),t)}var N="aci:buf";var ye="aci_m",L=class{constructor(e){y(this,"events");y(this,"storage");y(this,"debug");this.debug=e==null?void 0:e.debug,this.storage=e==null?void 0:e.storage,this.events=this.restore()}push(e){var n;this.events.push(e),this.events.length>50&&(this.events.splice(0,this.events.length-50),(n=this.debug)==null||n.call(this,"buffer",{reason:"cap_drop_oldest"})),this.persist()}drain(){let e=this.events;return this.events=[],this.persist(),e}purge(){var e;this.events.length>0&&((e=this.debug)==null||e.call(this,"buffer",{reason:"purged",count:this.events.length})),this.events=[],this.persist()}size(){return this.events.length}restore(){var r;let e=this.storage;if(!e)return[];let n;try{n=e.getItem(N)}catch(o){return this.storage=void 0,(r=this.debug)==null||r.call(this,"buffer",{reason:"storage_unavailable",error:String(o)}),[]}if(n==null)return[];try{let o=JSON.parse(n);if(Array.isArray(o))return o}catch{}try{e.removeItem(N)}catch{this.storage=void 0}return[]}persist(){var n;let e=this.storage;if(e)try{this.events.length===0?e.removeItem(N):e.setItem(N,JSON.stringify(this.events))}catch(r){this.storage=void 0,(n=this.debug)==null||n.call(this,"buffer",{reason:"storage_unavailable",error:String(r)})}}};function Ee(t){for(let e of t.cookie.split(";")){let n=e.trim();if(n.startsWith(ye+"="))return n.slice(ye.length+1)!==""}return!1}function ke(t,e){if(e.grants()&&!e.marker()){e.gapBuffer.push(t);return}e.batcher.push(t)}function W(t,e,n,r){if(t.size()===0||!n())return;let o=t.drain();for(let i of o)e.push(i);r==null||r("buffer",{reason:"flushed",count:o.length})}var _t="rum.link_click";function Ce(t,e){var i;let{document:n,debug:r}=e,o=(i=n.defaultView)==null?void 0:i.location;n.addEventListener("click",s=>{var a,c,f;try{let l=s.target,p=(a=l==null?void 0:l.closest)==null?void 0:a.call(l,"a[href]");if(!p)return;let u=p;t({eventName:_t,url:o==null?void 0:o.href,properties:{linkText:(f=(c=u.textContent)==null?void 0:c.trim())!=null?f:"",linkHref:u.href}})}catch(l){r==null||r("capture",{reason:"link_click_failed",error:String(l)})}},{capture:!0})}var xt="rum.page_view";function we(t){let e=t.indexOf("#");return e===-1?t:t.slice(0,e)}function Se(t,e){let n=we(t.location.href),r=()=>{let s=we(t.location.href);if(s!==n){n=s;for(let a of e)a()}},o=t.history,i=s=>{let a=o[s].bind(o);o[s]=(...c)=>{let f=a(...c);return r(),f}};i("pushState"),i("replaceState"),t.addEventListener("popstate",r)}function _e(t,e){let n=()=>t({eventName:xt,url:e.location.href,referrer:e.document.referrer});return n(),n}var G="/collect";function xe(t,e){let n=e==null?void 0:e.debug,r=e!==void 0&&"navigator"in e?e.navigator:globalThis.navigator,o=e!==void 0&&"fetch"in e?e.fetch:globalThis.fetch,i;try{i=new Blob([t],{type:"text/plain"})}catch{n==null||n("flush",{reason:"no_blob"});return}if(r!=null&&r.sendBeacon)try{if(r.sendBeacon(G,i))return}catch{}if(!o){n==null||n("flush",{reason:"no_transport"});return}try{o(G,{method:"POST",body:i,keepalive:!0}).catch(s=>{n==null||n("flush",{reason:"fetch_failed",error:String(s)})})}catch(s){n==null||n("flush",{reason:"fetch_failed",error:String(s)})}}function Ae(t){var n,r;let e=t!==void 0&&"fetch"in t?t.fetch:globalThis.fetch;if(!e)return Promise.resolve(!1);try{let o=((n=t==null?void 0:t.createEnvelopeId)!=null?n:S)(),i=new Blob([`{"envelopeId":"${o}","events":[]}`],{type:"text/plain"});return e(G,{method:"POST",body:i,keepalive:!0,credentials:"same-origin"}).then(s=>{var a;return typeof s=="object"&&s!==null&&"ok"in s&&s.ok===!1?((a=t==null?void 0:t.debug)==null||a.call(t,"flush",{reason:"refresh_failed",status:"not_ok"}),!1):!0}).catch(s=>{var a;return(a=t==null?void 0:t.debug)==null||a.call(t,"flush",{reason:"refresh_failed",error:String(s)}),!1})}catch(o){return(r=t==null?void 0:t.debug)==null||r.call(t,"flush",{reason:"refresh_failed",error:String(o)}),Promise.resolve(!1)}}var At="rum.variation_view",j="data-aci-variation";function Te(t,e){var f,l,p;let{document:n,debug:r}=e,o=e.MutationObserver;if(typeof o!="function")return;let i=(f=n.defaultView)==null?void 0:f.location,s=new WeakSet,a=u=>{let h=u.getAttribute(j);h!=null&&(s.has(u)||(s.add(u),t({eventName:At,url:i==null?void 0:i.href,properties:{variantKey:h}})))},c=u=>{try{u.hasAttribute(j)&&a(u);for(let h of Array.from(u.querySelectorAll(`[${j}]`)))a(h)}catch(h){r==null||r("capture",{reason:"variation_scan_failed",error:String(h)})}};try{let u=(l=n.body)!=null?l:n.documentElement;u&&c(u)}catch(u){r==null||r("capture",{reason:"variation_initial_scan_failed",error:String(u)})}try{let u=(p=n.body)!=null?p:n.documentElement;if(!u)return;new o(m=>{try{for(let g of m)for(let d=0;d<g.addedNodes.length;d++){let v=g.addedNodes[d];if((v==null?void 0:v.nodeType)!==1)continue;let E=v.element;E&&c(E)}}catch(g){r==null||r("capture",{reason:"variation_observer_failed",error:String(g)})}}).observe(u,{subtree:!0,childList:!0})}catch(u){r==null||r("capture",{reason:"variation_observe_failed",error:String(u)})}}var Tt="rum.web_vital";function Pe(t,e){var h,m,g;let n=e.PerformanceObserver;if(typeof n!="function")return;let{performance:r,debug:o}=e,i=(m=(h=e.window)==null?void 0:h.location)==null?void 0:m.href,s=e.document,a=new Set,c=(d,v)=>{a.has(d)||(a.add(d),t({eventName:Tt,url:i,properties:{vitalName:d,vitalValue:v}}))};try{let d=r==null?void 0:r.getEntriesByType("navigation")[0];d&&typeof d.responseStart=="number"&&typeof d.requestStart=="number"&&c("TTFB",d.responseStart-d.requestStart)}catch(d){o==null||o("capture",{reason:"ttfb_failed",error:String(d)})}let f=0,l=0,p=(d,v)=>{try{new n(Ie=>{try{for(let O of Ie.getEntries())v(O)}catch(O){o==null||o("capture",{reason:`${d}_handler_failed`,error:String(O)})}}).observe({type:d,buffered:!0})}catch(E){o==null||o("capture",{reason:`${d}_observe_failed`,error:String(E)})}};p("largest-contentful-paint",d=>{c("LCP",d.startTime)}),p("first-input",d=>{c("FID",d.startTime)}),p("layout-shift",d=>{var v;d.hadRecentInput||(f+=(v=d.value)!=null?v:0)}),p("event",d=>{var E;let v=(E=d.value)!=null?E:0;v>l&&(l=v)}),p("paint",d=>{d.name==="first-contentful-paint"&&c("FCP",d.startTime)});let u=()=>{try{a.has("CLS")||c("CLS",f),a.has("INP")||c("INP",l)}catch(d){o==null||o("capture",{reason:"visibility_handler_failed",error:String(d)})}};s&&s.addEventListener("visibilitychange",()=>{s.visibilityState==="hidden"&&u()}),(g=e.window)==null||g.addEventListener("pagehide",u)}var z={c15t:le,onetrust:ge,cookiebot:pe,trustarc:be};function Pt(t){var e,n;return typeof((e=t.navigator)==null?void 0:e.sendBeacon)=="function"&&typeof t.IntersectionObserver=="function"&&typeof((n=t.crypto)==null?void 0:n.getRandomValues)=="function"}function It(t){try{return t.sessionStorage}catch{return}}function Nt(t){var o;let e=t!=null?t:typeof window!="undefined"?window:void 0;if(!e||e.__aci_loaded||(e.__aci_loaded=!0,!Pt(e)))return;let n=re(e.document.currentScript),r=oe(n.debug);try{let i=e.document,s=new L({storage:It(e),debug:r}),a=()=>{try{return ae(se(i))}catch{return!1}},c=()=>{try{return Ee(i)}catch{return!1}},f={navigator:e.navigator,fetch:typeof e.fetch=="function"?e.fetch.bind(e):void 0,debug:r},l;l=new T({send:m=>xe(m,f),debug:r,onTick:()=>W(s,l,c,r),timers:{setInterval:(m,g)=>e.setInterval(m,g),clearInterval:m=>e.clearInterval(m)},documentTarget:i,windowTarget:e});let p=Q({document:i,window:e,debug:r}),u=m=>{ke({...J(m,p),eventId:S(void 0,g=>e.crypto.getRandomValues(g))},{grants:a,marker:c,gapBuffer:s,batcher:l})};p.start(u),Y(e,n,{track:(m,g)=>u({eventName:m,properties:g}),consent:({p:m,src:g})=>{let d=ce(m);if(d===void 0){r("consent",{reason:"malformed_purposes"});return}let v=ue(g);if(v===void 0){r("consent",{reason:"malformed_source"});return}I(d,v,{document:i,gapBuffer:s})||r("consent",{reason:"oversized_envelope"})}},r);let h=_e(u,e);Se(e,[()=>p.rearm(),h]),$(u,{document:i,intersectionObserver:e.IntersectionObserver,debug:r},()=>{Ae(f).then(m=>{m&&e.location.reload()})}),Ce(u,{document:i,debug:r}),Pe(u,{performance:e.performance,PerformanceObserver:e.PerformanceObserver,window:e,document:i,debug:r}),Te(u,{document:i,MutationObserver:e.MutationObserver,debug:r}),n.preset!=="manual"&&((o=z[n.preset])==null||o.call(z,{window:e,document:i,categories:n.categories,gapBuffer:s,debug:r,scheduler:{setTimeout:(m,g)=>e.setTimeout(m,g),clearTimeout:m=>e.clearTimeout(m)}})),l.start(),W(s,l,c,r),r("init",{config:n})}catch(i){r("init",{error:String(i)})}}Nt();})();
@@ -0,0 +1 @@
1
+ 46f87bbce4c938e9540939102be1094f5cd956d0f3a5836e9af5c3b0b8c582ad
@@ -45,6 +45,8 @@ interface ListenerTarget {
45
45
  export interface BatcherOptions {
46
46
  /** Transport for one serialized batch envelope. */
47
47
  send: (body: string) => void;
48
+ /** Injectable only so tests can prove one ID is minted per sealed batch. */
49
+ createEnvelopeId?: () => string;
48
50
  debug?: DebugFn;
49
51
  /** Runs at the start of every flush tick (gap-buffer marker re-check). */
50
52
  onTick?: () => void;
@@ -1,7 +1,9 @@
1
1
  // Batcher (design/05): queue events, split so no request exceeds the 60 KiB
2
- // planning threshold (64 KiB wire ceiling), flush on start, size, interval,
3
- // visibilitychange and pagehide. Byte accounting is incremental — a running
4
- // per-event size computed at enqueue — so a flush stays O(n).
2
+ // planning threshold (64 KiB wire ceiling), mint one envelope ULID per sealed
3
+ // batch, and flush on start, size, interval, visibilitychange and pagehide.
4
+ // Byte accounting is incremental — a running per-event size computed at
5
+ // enqueue — so a flush stays O(n).
6
+ import { ulid } from "./ulid.js";
5
7
  /** Planning threshold: full serialized envelope, UTF-8 bytes. */
6
8
  export const MAX_BATCH_BYTES = 60 * 1024;
7
9
  /**
@@ -14,9 +16,14 @@ export const MAX_BATCH_BYTES = 60 * 1024;
14
16
  export const MAX_BATCH_EVENTS = 100;
15
17
  /** Flush interval (build-time constant, design/04 config table). */
16
18
  export const FLUSH_INTERVAL_MS = 5000;
17
- const ENVELOPE_PREFIX = '{"events":[';
19
+ const ENVELOPE_PREFIX = '{"envelopeId":"';
20
+ const EVENTS_PREFIX = '","events":[';
18
21
  const ENVELOPE_SUFFIX = "]}";
19
- const ENVELOPE_OVERHEAD = ENVELOPE_PREFIX.length + ENVELOPE_SUFFIX.length;
22
+ const ENVELOPE_ID_BYTES = 26;
23
+ const ENVELOPE_OVERHEAD = ENVELOPE_PREFIX.length +
24
+ ENVELOPE_ID_BYTES +
25
+ EVENTS_PREFIX.length +
26
+ ENVELOPE_SUFFIX.length;
20
27
  const encoder = new TextEncoder();
21
28
  const utf8ByteLength = (s) => encoder.encode(s).length;
22
29
  export class Batcher {
@@ -131,7 +138,12 @@ export class Batcher {
131
138
  }
132
139
  if (parts.length === 0)
133
140
  continue;
134
- this.options.send(ENVELOPE_PREFIX + parts.join(",") + ENVELOPE_SUFFIX);
141
+ const envelopeId = (this.options.createEnvelopeId ?? ulid)();
142
+ this.options.send(ENVELOPE_PREFIX +
143
+ envelopeId +
144
+ EVENTS_PREFIX +
145
+ parts.join(",") +
146
+ ENVELOPE_SUFFIX);
135
147
  }
136
148
  }
137
149
  }
@@ -21,16 +21,17 @@ export interface ApplyConsentDeps extends ConsentWriteDeps {
21
21
  }
22
22
  /**
23
23
  * writeConsent builds the {v:1, p, t, src} envelope, URL-encodes it and sets
24
- * the aci_consent cookie (Path=/, SameSite=Lax, Secure on https).
24
+ * the aci_consent cookie (Path=/, SameSite=Lax, Secure on https). Inputs that
25
+ * cannot produce a portable envelope are ignored.
25
26
  */
26
- export declare function writeConsent(purposes: string[], src: string, deps: ConsentWriteDeps): void;
27
+ export declare function writeConsent(purposes: string[], src: string, deps: ConsentWriteDeps): boolean;
27
28
  /**
28
29
  * applyConsent is the single write path for every consent decision — CMP
29
30
  * adapters and the manual JS API alike. Any decision where personalization
30
31
  * is absent purges the gap buffer (REQ-8), and the envelope is still
31
32
  * written: withdrawal must reach the server.
32
33
  */
33
- export declare function applyConsent(purposes: string[], src: string, deps: ApplyConsentDeps): void;
34
+ export declare function applyConsent(purposes: string[], src: string, deps: ApplyConsentDeps): boolean;
34
35
  /** readConsentCookie returns the raw (still URL-encoded) cookie value. */
35
36
  export declare function readConsentCookie(doc: {
36
37
  cookie: string;
@@ -47,3 +48,8 @@ export declare function envelopeGrantsPersonalization(raw: string | undefined):
47
48
  * and the command is ignored.
48
49
  */
49
50
  export declare function sanitizePurposes(raw: unknown): string[] | undefined;
51
+ /**
52
+ * sanitizeConsentSource preserves the manual API's default while applying the
53
+ * same portable whitespace and byte bounds as every envelope reader.
54
+ */
55
+ export declare function sanitizeConsentSource(raw: unknown): string | undefined;