@getuserfeedback/protocol 2.2.0 → 3.0.3

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 (40) hide show
  1. package/dist/app-event.d.ts +1 -1
  2. package/dist/app-event.d.ts.map +1 -1
  3. package/dist/app-event.js +1 -0
  4. package/dist/command-kinds.d.ts +53 -0
  5. package/dist/command-kinds.d.ts.map +1 -0
  6. package/dist/command-kinds.js +37 -0
  7. package/dist/core-command-envelope.d.ts +749 -0
  8. package/dist/core-command-envelope.d.ts.map +1 -0
  9. package/dist/core-command-envelope.js +15 -0
  10. package/dist/core-commands.d.ts +698 -0
  11. package/dist/core-commands.d.ts.map +1 -0
  12. package/dist/core-commands.js +129 -0
  13. package/dist/flow-assignments.d.ts +0 -18
  14. package/dist/flow-assignments.d.ts.map +1 -1
  15. package/dist/flow-assignments.js +0 -3
  16. package/dist/flow-display.d.ts +0 -3
  17. package/dist/flow-display.d.ts.map +1 -1
  18. package/dist/host/command-envelope-schema.d.ts +12 -12
  19. package/dist/host/host-event-contract.d.ts +16 -0
  20. package/dist/host/host-event-contract.d.ts.map +1 -1
  21. package/dist/host/host-event-contract.js +16 -0
  22. package/dist/host/host-event-schemas.d.ts +138 -0
  23. package/dist/host/host-event-schemas.d.ts.map +1 -0
  24. package/dist/host/host-event-schemas.js +94 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -0
  28. package/dist/scopes.d.ts +2 -2
  29. package/dist/webview-transport.d.ts +14 -14
  30. package/dist/widget-commands.d.ts +12 -12
  31. package/dist/widget-config.d.ts +15 -15
  32. package/package.json +7 -2
  33. package/src/app-event.ts +1 -0
  34. package/src/command-kinds.ts +42 -0
  35. package/src/core-command-envelope.ts +27 -0
  36. package/src/core-commands.ts +164 -0
  37. package/src/flow-assignments.ts +0 -3
  38. package/src/host/host-event-contract.ts +31 -0
  39. package/src/host/host-event-schemas.ts +135 -0
  40. package/src/index.ts +9 -0
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export { appEventBaseSchema, appEventCapabilitySchema, appEventContextSchema, appEventCustomerTrackSchema, appEventExternalIdSchema, appEventFlagProviderSchema, appEventFlagSchema, appEventFlowDismissedSchema, appEventIdentitySchema, appEventIdentityTypeSchema, appEventPayloadSchema, appEventSurveyViewedSchema, appEventSystemBaseSchema, appEventSystemTrackSchema, appEventTrackSchema, reservedSystemAppEventNames, } from "./app-event.js";
2
2
  export { clientMetaSchema, } from "./client-meta.js";
3
+ export { coreCommandEnvelopeSchema, } from "./core-command-envelope.js";
4
+ export { coreCommandPayloadSchema, } from "./core-commands.js";
3
5
  export { DEFAULT_AUTO_DETECT_COLOR_SCHEME_ATTRS } from "./defaults.js";
4
6
  export { ErrorCategory, ErrorCategorySchema, ErrorEventSchema, ProtocolError, } from "./errors.js";
5
7
  export { claimPendingFlowAssignmentsRequestSchema, claimPendingFlowAssignmentsResponseSchema, flowAssignmentRecipientRequestSchema, flowAssignmentRecordSchema, flowAssignmentStatusSchema, flowAssignmentTargetingContextSchema, listPendingFlowAssignmentsResponseSchema, nullableUpdateFlowAssignmentLifecycleResponseSchema, releaseFlowAssignmentClaimRequestSchema, releaseFlowAssignmentClaimResponseSchema, updateFlowAssignmentLifecycleRequestSchema, updateFlowAssignmentLifecycleResponseSchema, } from "./flow-assignments.js";
package/dist/scopes.d.ts CHANGED
@@ -10,14 +10,14 @@ export declare const SCOPE_IDS: readonly [
10
10
  "ads.personalization"
11
11
  ];
12
12
  export declare const scopeIdSchema: z.ZodMiniEnum<{
13
+ "functionality.storage": "functionality.storage";
14
+ "security.storage": "security.storage";
13
15
  "analytics.storage": "analytics.storage";
14
16
  "analytics.measurement": "analytics.measurement";
15
17
  "personalization.storage": "personalization.storage";
16
18
  "ads.storage": "ads.storage";
17
19
  "ads.user_data": "ads.user_data";
18
20
  "ads.personalization": "ads.personalization";
19
- "functionality.storage": "functionality.storage";
20
- "security.storage": "security.storage";
21
21
  }>;
22
22
  export type Scope = (typeof SCOPE_IDS)[number];
23
23
  export declare function isScope(value: unknown): value is Scope;
@@ -124,19 +124,19 @@ export declare const webViewCommandEnvelopeSchema: z.ZodMiniObject<{
124
124
  dark: "dark";
125
125
  }>]>>;
126
126
  consent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
127
- pending: "pending";
128
127
  granted: "granted";
129
128
  denied: "denied";
129
+ pending: "pending";
130
130
  revoked: "revoked";
131
131
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
132
+ "functionality.storage": "functionality.storage";
133
+ "security.storage": "security.storage";
132
134
  "analytics.storage": "analytics.storage";
133
135
  "analytics.measurement": "analytics.measurement";
134
136
  "personalization.storage": "personalization.storage";
135
137
  "ads.storage": "ads.storage";
136
138
  "ads.user_data": "ads.user_data";
137
139
  "ads.personalization": "ads.personalization";
138
- "functionality.storage": "functionality.storage";
139
- "security.storage": "security.storage";
140
140
  }>>]>>;
141
141
  auth: z.ZodMiniOptional<z.ZodMiniObject<{
142
142
  jwt: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniObject<{
@@ -167,19 +167,19 @@ export declare const webViewCommandEnvelopeSchema: z.ZodMiniObject<{
167
167
  disableTelemetry: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
168
168
  enableDebug: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniBoolean<boolean>, z.ZodMiniString<string>, z.ZodMiniArray<z.ZodMiniString<string>>]>>;
169
169
  defaultConsent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
170
- pending: "pending";
171
170
  granted: "granted";
172
171
  denied: "denied";
172
+ pending: "pending";
173
173
  revoked: "revoked";
174
174
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
175
+ "functionality.storage": "functionality.storage";
176
+ "security.storage": "security.storage";
175
177
  "analytics.storage": "analytics.storage";
176
178
  "analytics.measurement": "analytics.measurement";
177
179
  "personalization.storage": "personalization.storage";
178
180
  "ads.storage": "ads.storage";
179
181
  "ads.user_data": "ads.user_data";
180
182
  "ads.personalization": "ads.personalization";
181
- "functionality.storage": "functionality.storage";
182
- "security.storage": "security.storage";
183
183
  }>>]>>;
184
184
  clientMeta: z.ZodMiniOptional<z.ZodMiniObject<{
185
185
  loader: z.ZodMiniEnum<{
@@ -563,19 +563,19 @@ export declare const webViewTransportNativeMessageSchema: z.ZodMiniDiscriminated
563
563
  dark: "dark";
564
564
  }>]>>;
565
565
  consent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
566
- pending: "pending";
567
566
  granted: "granted";
568
567
  denied: "denied";
568
+ pending: "pending";
569
569
  revoked: "revoked";
570
570
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
571
+ "functionality.storage": "functionality.storage";
572
+ "security.storage": "security.storage";
571
573
  "analytics.storage": "analytics.storage";
572
574
  "analytics.measurement": "analytics.measurement";
573
575
  "personalization.storage": "personalization.storage";
574
576
  "ads.storage": "ads.storage";
575
577
  "ads.user_data": "ads.user_data";
576
578
  "ads.personalization": "ads.personalization";
577
- "functionality.storage": "functionality.storage";
578
- "security.storage": "security.storage";
579
579
  }>>]>>;
580
580
  auth: z.ZodMiniOptional<z.ZodMiniObject<{
581
581
  jwt: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniObject<{
@@ -606,19 +606,19 @@ export declare const webViewTransportNativeMessageSchema: z.ZodMiniDiscriminated
606
606
  disableTelemetry: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
607
607
  enableDebug: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniBoolean<boolean>, z.ZodMiniString<string>, z.ZodMiniArray<z.ZodMiniString<string>>]>>;
608
608
  defaultConsent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
609
- pending: "pending";
610
609
  granted: "granted";
611
610
  denied: "denied";
611
+ pending: "pending";
612
612
  revoked: "revoked";
613
613
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
614
+ "functionality.storage": "functionality.storage";
615
+ "security.storage": "security.storage";
614
616
  "analytics.storage": "analytics.storage";
615
617
  "analytics.measurement": "analytics.measurement";
616
618
  "personalization.storage": "personalization.storage";
617
619
  "ads.storage": "ads.storage";
618
620
  "ads.user_data": "ads.user_data";
619
621
  "ads.personalization": "ads.personalization";
620
- "functionality.storage": "functionality.storage";
621
- "security.storage": "security.storage";
622
622
  }>>]>>;
623
623
  clientMeta: z.ZodMiniOptional<z.ZodMiniObject<{
624
624
  loader: z.ZodMiniEnum<{
@@ -933,8 +933,8 @@ export declare const webViewTransportHostEventSchema: z.ZodMiniDiscriminatedUnio
933
933
  handleId: z.ZodMiniString<string>;
934
934
  reasonCode: z.ZodMiniEnum<{
935
935
  INTERNAL: "INTERNAL";
936
- RESET: "RESET";
937
936
  CLOSED: "CLOSED";
937
+ RESET: "RESET";
938
938
  STALE_HANDLE: "STALE_HANDLE";
939
939
  OWNERSHIP_CONFLICT: "OWNERSHIP_CONFLICT";
940
940
  OWNER_DISPOSED: "OWNER_DISPOSED";
@@ -1518,8 +1518,8 @@ export declare const webViewTransportWebMessageSchema: z.ZodMiniDiscriminatedUni
1518
1518
  handleId: z.ZodMiniString<string>;
1519
1519
  reasonCode: z.ZodMiniEnum<{
1520
1520
  INTERNAL: "INTERNAL";
1521
- RESET: "RESET";
1522
1521
  CLOSED: "CLOSED";
1522
+ RESET: "RESET";
1523
1523
  STALE_HANDLE: "STALE_HANDLE";
1524
1524
  OWNERSHIP_CONFLICT: "OWNERSHIP_CONFLICT";
1525
1525
  OWNER_DISPOSED: "OWNER_DISPOSED";
@@ -2,18 +2,18 @@ import * as z from "zod/mini";
2
2
  import { type ConfigureOptions, type InitOptions } from "./widget-config.js";
3
3
  export declare const publicWidgetCommandKindSchema: z.ZodMiniEnum<{
4
4
  open: "open";
5
- prerender: "prerender";
6
5
  prefetch: "prefetch";
6
+ prerender: "prerender";
7
7
  identify: "identify";
8
- updateHostContext: "updateHostContext";
9
- emitHostSignal: "emitHostSignal";
10
- setContainer: "setContainer";
11
- setDefaultContainerPolicy: "setDefaultContainerPolicy";
8
+ track: "track";
12
9
  configure: "configure";
13
10
  init: "init";
14
11
  close: "close";
15
12
  reset: "reset";
16
- track: "track";
13
+ updateHostContext: "updateHostContext";
14
+ emitHostSignal: "emitHostSignal";
15
+ setContainer: "setContainer";
16
+ setDefaultContainerPolicy: "setDefaultContainerPolicy";
17
17
  }>;
18
18
  export declare const containerPolicySchema: z.ZodMiniDiscriminatedUnion<[z.ZodMiniObject<{
19
19
  kind: z.ZodMiniLiteral<"floating">;
@@ -109,19 +109,19 @@ export declare const publicCommandPayloadSchema: z.ZodMiniUnion<readonly [z.ZodM
109
109
  dark: "dark";
110
110
  }>]>>;
111
111
  consent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
112
- pending: "pending";
113
112
  granted: "granted";
114
113
  denied: "denied";
114
+ pending: "pending";
115
115
  revoked: "revoked";
116
116
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
117
+ "functionality.storage": "functionality.storage";
118
+ "security.storage": "security.storage";
117
119
  "analytics.storage": "analytics.storage";
118
120
  "analytics.measurement": "analytics.measurement";
119
121
  "personalization.storage": "personalization.storage";
120
122
  "ads.storage": "ads.storage";
121
123
  "ads.user_data": "ads.user_data";
122
124
  "ads.personalization": "ads.personalization";
123
- "functionality.storage": "functionality.storage";
124
- "security.storage": "security.storage";
125
125
  }>>]>>;
126
126
  auth: z.ZodMiniOptional<z.ZodMiniObject<{
127
127
  jwt: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniObject<{
@@ -152,19 +152,19 @@ export declare const publicCommandPayloadSchema: z.ZodMiniUnion<readonly [z.ZodM
152
152
  disableTelemetry: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
153
153
  enableDebug: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniBoolean<boolean>, z.ZodMiniString<string>, z.ZodMiniArray<z.ZodMiniString<string>>]>>;
154
154
  defaultConsent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
155
- pending: "pending";
156
155
  granted: "granted";
157
156
  denied: "denied";
157
+ pending: "pending";
158
158
  revoked: "revoked";
159
159
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
160
+ "functionality.storage": "functionality.storage";
161
+ "security.storage": "security.storage";
160
162
  "analytics.storage": "analytics.storage";
161
163
  "analytics.measurement": "analytics.measurement";
162
164
  "personalization.storage": "personalization.storage";
163
165
  "ads.storage": "ads.storage";
164
166
  "ads.user_data": "ads.user_data";
165
167
  "ads.personalization": "ads.personalization";
166
- "functionality.storage": "functionality.storage";
167
- "security.storage": "security.storage";
168
168
  }>>]>>;
169
169
  clientMeta: z.ZodMiniOptional<z.ZodMiniObject<{
170
170
  loader: z.ZodMiniEnum<{
@@ -12,19 +12,19 @@ export declare const telemetryConfigInputSchema: z.ZodMiniObject<{
12
12
  }, z.core.$strip>;
13
13
  export type TelemetryConfigInput = z.output<typeof telemetryConfigInputSchema>;
14
14
  export declare const consentConfigInputSchema: z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
15
- pending: "pending";
16
15
  granted: "granted";
17
16
  denied: "denied";
17
+ pending: "pending";
18
18
  revoked: "revoked";
19
19
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
20
+ "functionality.storage": "functionality.storage";
21
+ "security.storage": "security.storage";
20
22
  "analytics.storage": "analytics.storage";
21
23
  "analytics.measurement": "analytics.measurement";
22
24
  "personalization.storage": "personalization.storage";
23
25
  "ads.storage": "ads.storage";
24
26
  "ads.user_data": "ads.user_data";
25
27
  "ads.personalization": "ads.personalization";
26
- "functionality.storage": "functionality.storage";
27
- "security.storage": "security.storage";
28
28
  }>>]>;
29
29
  export type ConsentConfigInput = z.output<typeof consentConfigInputSchema>;
30
30
  export declare const debugInputSchema: z.ZodMiniUnion<readonly [z.ZodMiniBoolean<boolean>, z.ZodMiniString<string>, z.ZodMiniArray<z.ZodMiniString<string>>]>;
@@ -149,19 +149,19 @@ export declare const configureOptionsSchema: z.ZodMiniObject<{
149
149
  dark: "dark";
150
150
  }>]>>;
151
151
  consent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
152
- pending: "pending";
153
152
  granted: "granted";
154
153
  denied: "denied";
154
+ pending: "pending";
155
155
  revoked: "revoked";
156
156
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
157
+ "functionality.storage": "functionality.storage";
158
+ "security.storage": "security.storage";
157
159
  "analytics.storage": "analytics.storage";
158
160
  "analytics.measurement": "analytics.measurement";
159
161
  "personalization.storage": "personalization.storage";
160
162
  "ads.storage": "ads.storage";
161
163
  "ads.user_data": "ads.user_data";
162
164
  "ads.personalization": "ads.personalization";
163
- "functionality.storage": "functionality.storage";
164
- "security.storage": "security.storage";
165
165
  }>>]>>;
166
166
  auth: z.ZodMiniOptional<z.ZodMiniObject<{
167
167
  jwt: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniObject<{
@@ -191,19 +191,19 @@ export declare const initOptionsSchema: z.ZodMiniObject<{
191
191
  disableTelemetry: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
192
192
  enableDebug: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniBoolean<boolean>, z.ZodMiniString<string>, z.ZodMiniArray<z.ZodMiniString<string>>]>>;
193
193
  defaultConsent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
194
- pending: "pending";
195
194
  granted: "granted";
196
195
  denied: "denied";
196
+ pending: "pending";
197
197
  revoked: "revoked";
198
198
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
199
+ "functionality.storage": "functionality.storage";
200
+ "security.storage": "security.storage";
199
201
  "analytics.storage": "analytics.storage";
200
202
  "analytics.measurement": "analytics.measurement";
201
203
  "personalization.storage": "personalization.storage";
202
204
  "ads.storage": "ads.storage";
203
205
  "ads.user_data": "ads.user_data";
204
206
  "ads.personalization": "ads.personalization";
205
- "functionality.storage": "functionality.storage";
206
- "security.storage": "security.storage";
207
207
  }>>]>>;
208
208
  clientMeta: z.ZodMiniOptional<z.ZodMiniObject<{
209
209
  loader: z.ZodMiniEnum<{
@@ -341,19 +341,19 @@ export declare const instanceUpdateableConfigSchema: z.ZodMiniObject<{
341
341
  dark: "dark";
342
342
  }>]>>;
343
343
  consent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
344
- pending: "pending";
345
344
  granted: "granted";
346
345
  denied: "denied";
346
+ pending: "pending";
347
347
  revoked: "revoked";
348
348
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
349
+ "functionality.storage": "functionality.storage";
350
+ "security.storage": "security.storage";
349
351
  "analytics.storage": "analytics.storage";
350
352
  "analytics.measurement": "analytics.measurement";
351
353
  "personalization.storage": "personalization.storage";
352
354
  "ads.storage": "ads.storage";
353
355
  "ads.user_data": "ads.user_data";
354
356
  "ads.personalization": "ads.personalization";
355
- "functionality.storage": "functionality.storage";
356
- "security.storage": "security.storage";
357
357
  }>>]>>;
358
358
  auth: z.ZodMiniOptional<z.ZodMiniObject<{
359
359
  jwt: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniObject<{
@@ -402,19 +402,19 @@ export declare const coreInstanceConfigSchema: z.ZodMiniObject<{
402
402
  disableTelemetry: z.ZodMiniDefault<z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>>;
403
403
  enableDebug: z.ZodMiniDefault<z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniBoolean<boolean>, z.ZodMiniString<string>, z.ZodMiniArray<z.ZodMiniString<string>>]>>>;
404
404
  consent: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniEnum<{
405
- pending: "pending";
406
405
  granted: "granted";
407
406
  denied: "denied";
407
+ pending: "pending";
408
408
  revoked: "revoked";
409
409
  }>, z.ZodMiniArray<z.ZodMiniEnum<{
410
+ "functionality.storage": "functionality.storage";
411
+ "security.storage": "security.storage";
410
412
  "analytics.storage": "analytics.storage";
411
413
  "analytics.measurement": "analytics.measurement";
412
414
  "personalization.storage": "personalization.storage";
413
415
  "ads.storage": "ads.storage";
414
416
  "ads.user_data": "ads.user_data";
415
417
  "ads.personalization": "ads.personalization";
416
- "functionality.storage": "functionality.storage";
417
- "security.storage": "security.storage";
418
418
  }>>]>>;
419
419
  auth: z.ZodMiniOptional<z.ZodMiniObject<{
420
420
  jwt: z.ZodMiniOptional<z.ZodMiniUnion<readonly [z.ZodMiniObject<{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getuserfeedback/protocol",
3
- "version": "2.2.0",
3
+ "version": "3.0.3",
4
4
  "description": "getuserfeedback widget protocol — host surface and (later) wire protocol",
5
5
  "keywords": [
6
6
  "getuserfeedback",
@@ -46,6 +46,12 @@
46
46
  "import": "./dist/host/host-event-contract.js",
47
47
  "default": "./dist/host/host-event-contract.js"
48
48
  },
49
+ "./host/host-event-schemas": {
50
+ "types": "./dist/host/host-event-schemas.d.ts",
51
+ "bun": "./src/host/host-event-schemas.ts",
52
+ "import": "./dist/host/host-event-schemas.js",
53
+ "default": "./dist/host/host-event-schemas.js"
54
+ },
49
55
  "./host/constants": {
50
56
  "types": "./dist/host/constants.d.ts",
51
57
  "bun": "./src/host/constants.ts",
@@ -140,7 +146,6 @@
140
146
  "zod": "^4.2.1"
141
147
  },
142
148
  "devDependencies": {
143
- "rimraf": "^6.0.0",
144
149
  "typescript": "^5.8.3"
145
150
  }
146
151
  }
package/src/app-event.ts CHANGED
@@ -132,6 +132,7 @@ const appEventSurveyReferenceSchema = z.object({
132
132
 
133
133
  export const reservedSystemAppEventNames = [
134
134
  "Response Submitted",
135
+ "Flow Completed",
135
136
  "Flow Viewed",
136
137
  "Flow Dismissed",
137
138
  "Identified",
@@ -0,0 +1,42 @@
1
+ import * as z from "zod/mini";
2
+
3
+ const coreCommandKinds = [
4
+ "open",
5
+ "prefetch",
6
+ "prerender",
7
+ "hostContextUpdated",
8
+ "hostSignal",
9
+ "setTargetingPlan",
10
+ "telemetry",
11
+ "identify",
12
+ "track",
13
+ "configure",
14
+ "init",
15
+ "close",
16
+ "reset",
17
+ "error",
18
+ ] as const;
19
+
20
+ const publicCommandKinds = [
21
+ "open",
22
+ "prefetch",
23
+ "prerender",
24
+ "identify",
25
+ "updateHostContext",
26
+ "emitHostSignal",
27
+ "setContainer",
28
+ "setDefaultContainerPolicy",
29
+ "configure",
30
+ "init",
31
+ "close",
32
+ "reset",
33
+ "track",
34
+ ] as const;
35
+
36
+ export const coreCommandKindSchema = z.enum(coreCommandKinds);
37
+ export const publicCommandKindSchema = z.enum(publicCommandKinds);
38
+
39
+ /** All command kinds that may appear in settlement events (core receives loader + SDK commands). */
40
+ const allCommandKinds = [...coreCommandKinds, ...publicCommandKinds] as const;
41
+
42
+ export const allCommandKindSchema = z.enum(allCommandKinds);
@@ -0,0 +1,27 @@
1
+ import * as z from "zod/mini";
2
+ import { type ClientMeta, clientMetaSchema } from "./client-meta.js";
3
+ import { coreCommandPayloadSchema } from "./core-commands.js";
4
+
5
+ const requestIdSchema = z.string().check(z.trim(), z.minLength(1));
6
+ const idempotencyKeySchema = z.string().check(z.trim(), z.minLength(1));
7
+ const versionSchema = z.literal("1");
8
+
9
+ /** Loader -> core iframe command envelope (MessagePort transport). */
10
+ export const coreCommandEnvelopeSchema = z.object({
11
+ version: versionSchema,
12
+ instanceId: z.string().check(z.trim(), z.minLength(1)),
13
+ requestId: requestIdSchema,
14
+ idempotencyKey: idempotencyKeySchema,
15
+ clientMeta: z.optional(clientMetaSchema),
16
+ command: coreCommandPayloadSchema,
17
+ });
18
+
19
+ export type CoreCommandEnvelope = z.output<typeof coreCommandEnvelopeSchema>;
20
+
21
+ /** Context passed to core plugin handlers after envelope validation. */
22
+ export type CommandContext = {
23
+ instanceId: string;
24
+ requestId: string;
25
+ idempotencyKey: string;
26
+ clientMeta?: ClientMeta;
27
+ };
@@ -0,0 +1,164 @@
1
+ import * as z from "zod/mini";
2
+ import {
3
+ appEventCustomerTrackSchema,
4
+ appEventExternalIdSchema,
5
+ appEventSystemTrackSchema,
6
+ } from "./app-event.js";
7
+ import { ErrorEventSchema } from "./errors.js";
8
+ import { responseMetadataInputSchema } from "./response-metadata.js";
9
+ import { configureOptionsSchema, initOptionsSchema } from "./widget-config.js";
10
+
11
+ const flowHandleIdSchema = z.string().check(z.trim(), z.minLength(1));
12
+ const flowIdSchema = z.string().check(z.trim(), z.minLength(1));
13
+
14
+ const identifyTraitsSchema = z.record(z.string(), z.unknown());
15
+ const identifyOptionsSchema = z.strictObject({
16
+ externalIds: z.optional(
17
+ z.array(appEventExternalIdSchema).check(z.maxLength(20)),
18
+ ),
19
+ });
20
+
21
+ const identifyPayloadSchema = z.union([
22
+ z.strictObject({
23
+ kind: z.literal("identify"),
24
+ traits: identifyTraitsSchema,
25
+ options: z.optional(identifyOptionsSchema),
26
+ }),
27
+ z.strictObject({
28
+ kind: z.literal("identify"),
29
+ userId: z.string().check(z.trim(), z.minLength(1)),
30
+ traits: z.optional(identifyTraitsSchema),
31
+ options: z.optional(identifyOptionsSchema),
32
+ }),
33
+ ]);
34
+
35
+ const legacySystemTrackPayloadSchema = z.pipe(
36
+ z.extend(appEventSystemTrackSchema, {
37
+ kind: z.literal("track"),
38
+ origin: z.optional(z.literal("system")),
39
+ }),
40
+ z.transform(({ origin: _origin, ...rest }) => ({
41
+ ...rest,
42
+ origin: "system" as const,
43
+ })),
44
+ );
45
+
46
+ const customerTrackPayloadSchema = z.extend(appEventCustomerTrackSchema, {
47
+ kind: z.literal("track"),
48
+ });
49
+
50
+ const trackPayloadSchema = z.union([
51
+ legacySystemTrackPayloadSchema,
52
+ customerTrackPayloadSchema,
53
+ ]);
54
+
55
+ const prefetchPayloadSchema = z.strictObject({
56
+ kind: z.literal("prefetch"),
57
+ flowId: flowIdSchema,
58
+ flowHandleId: z.optional(flowHandleIdSchema),
59
+ });
60
+
61
+ const openCorePayloadSchema = z.strictObject({
62
+ kind: z.literal("open"),
63
+ flowId: flowIdSchema,
64
+ flowHandleId: z.optional(flowHandleIdSchema),
65
+ metadata: z.optional(responseMetadataInputSchema),
66
+ hideCloseButton: z.optional(z.boolean()),
67
+ });
68
+
69
+ const prerenderCorePayloadSchema = z.strictObject({
70
+ kind: z.literal("prerender"),
71
+ flowId: flowIdSchema,
72
+ flowHandleId: z.optional(flowHandleIdSchema),
73
+ hideCloseButton: z.optional(z.boolean()),
74
+ });
75
+
76
+ const closeCorePayloadSchema = z.object({
77
+ kind: z.literal("close"),
78
+ flowHandleId: z.optional(flowHandleIdSchema),
79
+ reasonCode: z.optional(z.enum(["CLOSED", "RESET"])),
80
+ });
81
+
82
+ const hostContextUpdatedPayloadSchema = z.object({
83
+ kind: z.literal("hostContextUpdated"),
84
+ context: z.object({
85
+ url: z.string().check(z.url()),
86
+ env: z.optional(z.record(z.string(), z.string())),
87
+ storage: z.optional(z.record(z.string(), z.string())),
88
+ page: z.optional(
89
+ z.object({
90
+ path: z.optional(z.string()),
91
+ referrer: z.optional(z.string()),
92
+ search: z.optional(z.string()),
93
+ }),
94
+ ),
95
+ }),
96
+ });
97
+
98
+ const hostSignalPayloadSchema = z.object({
99
+ kind: z.literal("hostSignal"),
100
+ name: z.string(),
101
+ data: z.optional(z.unknown()),
102
+ });
103
+
104
+ const setTargetingPlanPayloadSchema = z.object({
105
+ kind: z.literal("setTargetingPlan"),
106
+ plan: z.object({
107
+ strategy: z.optional(z.enum(["firstMatch"])),
108
+ candidates: z.array(
109
+ z.object({
110
+ action: z.enum(["open", "prefetch"]),
111
+ flowId: flowIdSchema,
112
+ rules: z.array(z.unknown()),
113
+ }),
114
+ ),
115
+ }),
116
+ });
117
+
118
+ const telemetryPayloadSchema = z.object({
119
+ kind: z.literal("telemetry"),
120
+ name: z.string(),
121
+ props: z.optional(z.record(z.string(), z.unknown())),
122
+ });
123
+
124
+ const errorPayloadSchema = z.object({
125
+ kind: z.literal("error"),
126
+ event: ErrorEventSchema,
127
+ });
128
+
129
+ const configureCorePayloadSchema = z.object({
130
+ kind: z.literal("configure"),
131
+ opts: configureOptionsSchema,
132
+ });
133
+
134
+ const initCorePayloadSchema = z.strictObject({
135
+ kind: z.literal("init"),
136
+ opts: initOptionsSchema,
137
+ });
138
+
139
+ const resetPayloadSchema = z.object({
140
+ kind: z.literal("reset"),
141
+ });
142
+
143
+ const coreCommandPayloadWithoutIdentifySchema = z.discriminatedUnion("kind", [
144
+ openCorePayloadSchema,
145
+ prefetchPayloadSchema,
146
+ prerenderCorePayloadSchema,
147
+ hostContextUpdatedPayloadSchema,
148
+ hostSignalPayloadSchema,
149
+ setTargetingPlanPayloadSchema,
150
+ telemetryPayloadSchema,
151
+ configureCorePayloadSchema,
152
+ initCorePayloadSchema,
153
+ closeCorePayloadSchema,
154
+ resetPayloadSchema,
155
+ errorPayloadSchema,
156
+ ]);
157
+
158
+ export const coreCommandPayloadSchema = z.union([
159
+ coreCommandPayloadWithoutIdentifySchema,
160
+ identifyPayloadSchema,
161
+ trackPayloadSchema,
162
+ ]);
163
+
164
+ export type CoreCommandPayload = z.output<typeof coreCommandPayloadSchema>;
@@ -40,9 +40,6 @@ export const flowAssignmentStatusSchema = z.enum([
40
40
  "completed",
41
41
  "expired",
42
42
  "superseded",
43
- "withdrawn_pending",
44
- "withdrawn_presented",
45
- "withdrawn_final",
46
43
  ]);
47
44
 
48
45
  export const flowAssignmentTargetingContextSchema = z.object({
@@ -278,3 +278,34 @@ export function getFlowHandleFromSettlementDetail(detail: {
278
278
  ...(isNonEmptyString(flowRunId) && { flowRunId }),
279
279
  };
280
280
  }
281
+
282
+ /** Normalized allocation from a handle-returning settlement: handle + instanceId for state. */
283
+ export type FlowHandleAllocationFromSettlement = {
284
+ flowHandleId: string;
285
+ flowRunId: string | null;
286
+ instanceId: string | null;
287
+ };
288
+
289
+ const nonEmptyOrNull = (value: string | null | undefined): string | null =>
290
+ typeof value === "string" && value.length > 0 ? value : null;
291
+
292
+ /**
293
+ * Parse a command settlement into a single allocation object when the command
294
+ * returned a flow handle (open/prerender/prefetch). Returns null otherwise.
295
+ */
296
+ export function getFlowHandleAllocationFromSettlement(detail: {
297
+ ok: boolean;
298
+ kind: string;
299
+ result?: unknown;
300
+ instanceId?: string | null;
301
+ }): FlowHandleAllocationFromSettlement | null {
302
+ const handle = getFlowHandleFromSettlementDetail(detail);
303
+ if (!handle) {
304
+ return null;
305
+ }
306
+ return {
307
+ flowHandleId: handle.flowHandleId,
308
+ flowRunId: handle.flowRunId ?? null,
309
+ instanceId: nonEmptyOrNull(detail.instanceId ?? null),
310
+ };
311
+ }