@getuserfeedback/protocol 3.0.6 → 3.0.8

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.
@@ -0,0 +1,28 @@
1
+ import * as z from "zod/mini";
2
+ export declare const attentionPolicySourceSchema: z.ZodMiniEnum<{
3
+ default: "default";
4
+ custom: "custom";
5
+ }>;
6
+ export declare const attentionExclusiveSurfaceStrategySchema: z.ZodMiniEnum<{
7
+ queue: "queue";
8
+ }>;
9
+ export declare const attentionBlockedBroadcastStrategySchema: z.ZodMiniEnum<{
10
+ queue: "queue";
11
+ }>;
12
+ export declare const attentionPolicyConfigSchema: z.ZodMiniObject<{
13
+ version: z.ZodMiniString<string>;
14
+ source: z.ZodMiniEnum<{
15
+ default: "default";
16
+ custom: "custom";
17
+ }>;
18
+ recentFlowCooldownMs: z.ZodMiniNumber<number>;
19
+ exclusiveSurfaceStrategy: z.ZodMiniEnum<{
20
+ queue: "queue";
21
+ }>;
22
+ blockedBroadcastStrategy: z.ZodMiniEnum<{
23
+ queue: "queue";
24
+ }>;
25
+ }, z.core.$strict>;
26
+ export type AttentionPolicyConfig = z.output<typeof attentionPolicyConfigSchema>;
27
+ export declare const DEFAULT_ATTENTION_POLICY_CONFIG: AttentionPolicyConfig;
28
+ //# sourceMappingURL=attention-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attention-policy.d.ts","sourceRoot":"","sources":["../src/attention-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,eAAO,MAAM,2BAA2B;;;EAAgC,CAAC;AAEzE,eAAO,MAAM,uCAAuC;;EAAoB,CAAC;AAEzE,eAAO,MAAM,uCAAuC;;EAAoB,CAAC;AAEzE,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;kBAMtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAC3C,OAAO,2BAA2B,CAClC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,qBAM7C,CAAC"}
@@ -0,0 +1,18 @@
1
+ import * as z from "zod/mini";
2
+ export const attentionPolicySourceSchema = z.enum(["default", "custom"]);
3
+ export const attentionExclusiveSurfaceStrategySchema = z.enum(["queue"]);
4
+ export const attentionBlockedBroadcastStrategySchema = z.enum(["queue"]);
5
+ export const attentionPolicyConfigSchema = z.strictObject({
6
+ version: z.string().check(z.trim(), z.minLength(1)),
7
+ source: attentionPolicySourceSchema,
8
+ recentFlowCooldownMs: z.number().check(z.positive()),
9
+ exclusiveSurfaceStrategy: attentionExclusiveSurfaceStrategySchema,
10
+ blockedBroadcastStrategy: attentionBlockedBroadcastStrategySchema,
11
+ });
12
+ export const DEFAULT_ATTENTION_POLICY_CONFIG = {
13
+ version: "attention-policy-default-v1",
14
+ source: "default",
15
+ recentFlowCooldownMs: 5 * 60 * 1000,
16
+ exclusiveSurfaceStrategy: "queue",
17
+ blockedBroadcastStrategy: "queue",
18
+ };
@@ -1,4 +1,5 @@
1
1
  import * as z from "zod/mini";
2
+ import { type AttentionPolicyConfig } from "./attention-policy.js";
2
3
  export declare const runtimeDisplayEligibilitySchema: z.ZodMiniObject<{
3
4
  requiredCapabilities: z.ZodMiniDefault<z.ZodMiniArray<z.ZodMiniString<string>>>;
4
5
  requiredPage: z.ZodMiniOptional<z.ZodMiniObject<{
@@ -199,6 +200,20 @@ export declare const flowDisplaySyncRequestSchema: z.ZodMiniObject<{
199
200
  }, z.core.$strip>;
200
201
  export declare const flowDisplaySyncResponseSchema: z.ZodMiniObject<{
201
202
  fetchedAt: z.ZodMiniString<string>;
203
+ attentionPolicy: z.ZodMiniOptional<z.ZodMiniObject<{
204
+ version: z.ZodMiniString<string>;
205
+ source: z.ZodMiniEnum<{
206
+ default: "default";
207
+ custom: "custom";
208
+ }>;
209
+ recentFlowCooldownMs: z.ZodMiniNumber<number>;
210
+ exclusiveSurfaceStrategy: z.ZodMiniEnum<{
211
+ queue: "queue";
212
+ }>;
213
+ blockedBroadcastStrategy: z.ZodMiniEnum<{
214
+ queue: "queue";
215
+ }>;
216
+ }, z.core.$strict>>;
202
217
  assignments: z.ZodMiniObject<{
203
218
  claimed: z.ZodMiniArray<z.ZodMiniObject<{
204
219
  flowAssignmentId: z.ZodMiniString<string>;
@@ -272,4 +287,5 @@ export type RuntimeDisplayEligibility = z.output<typeof runtimeDisplayEligibilit
272
287
  export type RuntimeDisplayTrigger = z.output<typeof runtimeDisplayTriggerSchema>;
273
288
  export type FlowDisplaySyncRequest = z.output<typeof flowDisplaySyncRequestSchema>;
274
289
  export type FlowDisplaySyncResponse = z.output<typeof flowDisplaySyncResponseSchema>;
290
+ export type FlowDisplayAttentionPolicyConfig = AttentionPolicyConfig;
275
291
  //# sourceMappingURL=flow-display.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow-display.d.ts","sourceRoot":"","sources":["../src/flow-display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAQ9B,eAAO,MAAM,+BAA+B;;;;;iBAU1C,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;2BAOtC,CAAC;AAQH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;iBAY9C,CAAC;AAEH,eAAO,MAAM,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAenD,CAAC;AAEH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGzC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASvC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAMxC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAC9C,OAAO,8BAA8B,CACrC,CAAC;AACF,MAAM,MAAM,kCAAkC,GAAG,CAAC,CAAC,MAAM,CACxD,OAAO,wCAAwC,CAC/C,CAAC;AACF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CACnD,OAAO,mCAAmC,CAC1C,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAC/C,OAAO,+BAA+B,CACtC,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAC3C,OAAO,2BAA2B,CAClC,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAC5C,OAAO,4BAA4B,CACnC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAC7C,OAAO,6BAA6B,CACpC,CAAC"}
1
+ {"version":3,"file":"flow-display.d.ts","sourceRoot":"","sources":["../src/flow-display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,OAAO,EACN,KAAK,qBAAqB,EAE1B,MAAM,uBAAuB,CAAC;AAO/B,eAAO,MAAM,+BAA+B;;;;;iBAU1C,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;2BAOtC,CAAC;AAQH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;iBAY9C,CAAC;AAEH,eAAO,MAAM,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAenD,CAAC;AAEH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGzC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASvC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAOxC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAC9C,OAAO,8BAA8B,CACrC,CAAC;AACF,MAAM,MAAM,kCAAkC,GAAG,CAAC,CAAC,MAAM,CACxD,OAAO,wCAAwC,CAC/C,CAAC;AACF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CACnD,OAAO,mCAAmC,CAC1C,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAC/C,OAAO,+BAA+B,CACtC,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAC3C,OAAO,2BAA2B,CAClC,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAC5C,OAAO,4BAA4B,CACnC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAC7C,OAAO,6BAA6B,CACpC,CAAC;AACF,MAAM,MAAM,gCAAgC,GAAG,qBAAqB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import * as z from "zod/mini";
2
+ import { attentionPolicyConfigSchema, } from "./attention-policy.js";
2
3
  import { flowAssignmentIdentitySchema, flowAssignmentRecordSchema, flowAssignmentTargetingContextSchema, } from "./flow-assignments.js";
3
4
  export const runtimeDisplayEligibilitySchema = z.object({
4
5
  requiredCapabilities: z._default(z.array(z.string().check(z.trim(), z.minLength(1))), []),
@@ -55,6 +56,7 @@ export const flowDisplaySyncRequestSchema = z.object({
55
56
  });
56
57
  export const flowDisplaySyncResponseSchema = z.object({
57
58
  fetchedAt: z.string(),
59
+ attentionPolicy: z.optional(attentionPolicyConfigSchema),
58
60
  assignments: z.object({
59
61
  claimed: z.array(flowAssignmentRecordSchema),
60
62
  }),
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { type AppEventCapability, type AppEventExternalId, type AppEventFlag, type AppEventJsonValue, type AppEventPayload, type AppEventTrackInput, appEventBaseSchema, appEventCapabilitySchema, appEventContextSchema, appEventCustomerTrackSchema, appEventExternalIdSchema, appEventFlagProviderSchema, appEventFlagSchema, appEventFlowDismissedSchema, appEventIdentitySchema, appEventIdentityTypeSchema, appEventPayloadSchema, appEventSurveyViewedSchema, appEventSystemBaseSchema, appEventSystemTrackSchema, appEventTrackSchema, reservedSystemAppEventNames, } from "./app-event.js";
2
+ export { type AttentionPolicyConfig, attentionBlockedBroadcastStrategySchema, attentionExclusiveSurfaceStrategySchema, attentionPolicyConfigSchema, attentionPolicySourceSchema, DEFAULT_ATTENTION_POLICY_CONFIG, } from "./attention-policy.js";
2
3
  export { type ClientMeta, clientMetaSchema, } from "./client-meta.js";
3
4
  export { type CommandContext, type CoreCommandEnvelope, coreCommandEnvelopeSchema, } from "./core-command-envelope.js";
4
5
  export { type CoreCommandPayload, coreCommandPayloadSchema, } from "./core-commands.js";
@@ -9,6 +10,7 @@ export { type ClaimPendingFlowAssignmentsRequest, type ClaimPendingFlowAssignmen
9
10
  export { type FlowDisplaySyncRequest, type FlowDisplaySyncResponse, flowDisplaySyncRequestSchema, flowDisplaySyncResponseSchema, type RuntimeDisplayAttentionPolicy, type RuntimeDisplayBroadcastOpportunity, type RuntimeDisplayBroadcasts, type RuntimeDisplayEligibility, type RuntimeDisplayTrigger, runtimeDisplayAttentionPolicySchema, runtimeDisplayBroadcastOpportunitySchema, runtimeDisplayBroadcastsSchema, runtimeDisplayEligibilitySchema, runtimeDisplayTriggerSchema, } from "./flow-display.js";
10
11
  export { buildIdentityTypeGuidanceMessage, getIdentityTypeSuggestion, IDENTITY_TYPE_VALUES, type IdentityTypeValue, isIdentityTypeValue, type StandardIdentityTypeValue, } from "./identity-type.js";
11
12
  export { type PreviewConnectionPairRequest, type PreviewConnectionPairResponse, previewConnectionPairRequestSchema, previewConnectionPairResponseSchema, } from "./preview-connection.js";
13
+ export { PREVIEW_PAIRING_TRANSPORT_SOURCE, type PreviewPairingHostAck, type PreviewPairingHostRequest, type PreviewPairingHostResult, previewPairingHostAckSchema, previewPairingHostRequestSchema, previewPairingHostResultSchema, } from "./preview-pairing-transport.js";
12
14
  export { isPublicGrantScope, type PublicGrantScope, publicGrantScopeIdSchema, } from "./public-grant-scope.js";
13
15
  export { type RuntimeEndpoints, resolveApiBaseUrl, resolveCoreUrl, resolveRealtimeUrl, resolveTrpcBaseUrl, runtimeEndpointsSchema, } from "./runtime-endpoints.js";
14
16
  export { getScopeMeta, isScope, listScopes, SCOPE_IDS, type Scope, type ScopeMeta, scopeIdSchema, } from "./scopes.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { appEventBaseSchema, appEventCapabilitySchema, appEventContextSchema, appEventCustomerTrackSchema, appEventExternalIdSchema, appEventFlagProviderSchema, appEventFlagSchema, appEventFlowDismissedSchema, appEventIdentitySchema, appEventIdentityTypeSchema, appEventPayloadSchema, appEventSurveyViewedSchema, appEventSystemBaseSchema, appEventSystemTrackSchema, appEventTrackSchema, reservedSystemAppEventNames, } from "./app-event.js";
2
+ export { attentionBlockedBroadcastStrategySchema, attentionExclusiveSurfaceStrategySchema, attentionPolicyConfigSchema, attentionPolicySourceSchema, DEFAULT_ATTENTION_POLICY_CONFIG, } from "./attention-policy.js";
2
3
  export { clientMetaSchema, } from "./client-meta.js";
3
4
  export { coreCommandEnvelopeSchema, } from "./core-command-envelope.js";
4
5
  export { coreCommandPayloadSchema, } from "./core-commands.js";
@@ -8,6 +9,7 @@ export { claimPendingFlowAssignmentsRequestSchema, claimPendingFlowAssignmentsRe
8
9
  export { flowDisplaySyncRequestSchema, flowDisplaySyncResponseSchema, runtimeDisplayAttentionPolicySchema, runtimeDisplayBroadcastOpportunitySchema, runtimeDisplayBroadcastsSchema, runtimeDisplayEligibilitySchema, runtimeDisplayTriggerSchema, } from "./flow-display.js";
9
10
  export { buildIdentityTypeGuidanceMessage, getIdentityTypeSuggestion, IDENTITY_TYPE_VALUES, isIdentityTypeValue, } from "./identity-type.js";
10
11
  export { previewConnectionPairRequestSchema, previewConnectionPairResponseSchema, } from "./preview-connection.js";
12
+ export { PREVIEW_PAIRING_TRANSPORT_SOURCE, previewPairingHostAckSchema, previewPairingHostRequestSchema, previewPairingHostResultSchema, } from "./preview-pairing-transport.js";
11
13
  export { isPublicGrantScope, publicGrantScopeIdSchema, } from "./public-grant-scope.js";
12
14
  export { resolveApiBaseUrl, resolveCoreUrl, resolveRealtimeUrl, resolveTrpcBaseUrl, runtimeEndpointsSchema, } from "./runtime-endpoints.js";
13
15
  export { getScopeMeta, isScope, listScopes, SCOPE_IDS, scopeIdSchema, } from "./scopes.js";
@@ -2,6 +2,7 @@ import * as z from "zod/mini";
2
2
  export declare const previewConnectionPairRequestSchema: z.ZodMiniObject<{
3
3
  capabilities: z.ZodMiniArray<z.ZodMiniString<string>>;
4
4
  expectedRevision: z.ZodMiniNumber<number>;
5
+ pairedAppApiKey: z.ZodMiniOptional<z.ZodMiniString<string>>;
5
6
  pairedIdentity: z.ZodMiniString<string>;
6
7
  pairedUrl: z.ZodMiniNullable<z.ZodMiniURL>;
7
8
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"preview-connection.d.ts","sourceRoot":"","sources":["../src/preview-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAI9B,eAAO,MAAM,kCAAkC;;;;;iBAK7C,CAAC;AAEH,eAAO,MAAM,mCAAmC;;;;;;;;;iBAS9C,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAClD,OAAO,kCAAkC,CACzC,CAAC;AACF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CACnD,OAAO,mCAAmC,CAC1C,CAAC"}
1
+ {"version":3,"file":"preview-connection.d.ts","sourceRoot":"","sources":["../src/preview-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAI9B,eAAO,MAAM,kCAAkC;;;;;;iBAM7C,CAAC;AAEH,eAAO,MAAM,mCAAmC;;;;;;;;;iBAS9C,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAClD,OAAO,kCAAkC,CACzC,CAAC;AACF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CACnD,OAAO,mCAAmC,CAC1C,CAAC"}
@@ -3,6 +3,7 @@ const nonEmptyStringSchema = z.string().check(z.trim(), z.minLength(1));
3
3
  export const previewConnectionPairRequestSchema = z.object({
4
4
  capabilities: z.array(nonEmptyStringSchema),
5
5
  expectedRevision: z.number().check(z.int(), z.positive()),
6
+ pairedAppApiKey: z.optional(nonEmptyStringSchema),
6
7
  pairedIdentity: nonEmptyStringSchema,
7
8
  pairedUrl: z.nullable(z.url()),
8
9
  });
@@ -0,0 +1,44 @@
1
+ import * as z from "zod/mini";
2
+ export declare const PREVIEW_PAIRING_TRANSPORT_SOURCE = "getuserfeedback.preview";
3
+ export declare const previewPairingHostRequestSchema: z.ZodMiniObject<{
4
+ source: z.ZodMiniLiteral<"getuserfeedback.preview">;
5
+ type: z.ZodMiniLiteral<"preview.connection.pair.request">;
6
+ requestId: z.ZodMiniString<string>;
7
+ previewToken: z.ZodMiniString<string>;
8
+ expectedRevision: z.ZodMiniNumber<number>;
9
+ capabilities: z.ZodMiniArray<z.ZodMiniString<string>>;
10
+ }, z.core.$strip>;
11
+ export declare const previewPairingHostAckSchema: z.ZodMiniObject<{
12
+ source: z.ZodMiniLiteral<"getuserfeedback.preview">;
13
+ type: z.ZodMiniLiteral<"preview.connection.pair.ack">;
14
+ requestId: z.ZodMiniString<string>;
15
+ }, z.core.$strip>;
16
+ export declare const previewPairingHostResultSchema: z.ZodMiniDiscriminatedUnion<[z.ZodMiniObject<{
17
+ source: z.ZodMiniLiteral<"getuserfeedback.preview">;
18
+ type: z.ZodMiniLiteral<"preview.connection.pair.result">;
19
+ requestId: z.ZodMiniString<string>;
20
+ ok: z.ZodMiniLiteral<true>;
21
+ result: z.ZodMiniObject<{
22
+ appId: z.ZodMiniString<string>;
23
+ capabilities: z.ZodMiniArray<z.ZodMiniString<string>>;
24
+ id: z.ZodMiniString<string>;
25
+ organizationId: z.ZodMiniString<string>;
26
+ pairedAt: z.ZodMiniNullable<z.ZodMiniString<string>>;
27
+ pairedIdentity: z.ZodMiniNullable<z.ZodMiniString<string>>;
28
+ pairedUrl: z.ZodMiniNullable<z.ZodMiniURL>;
29
+ revision: z.ZodMiniNumber<number>;
30
+ }, z.core.$strip>;
31
+ }, z.core.$strip>, z.ZodMiniObject<{
32
+ source: z.ZodMiniLiteral<"getuserfeedback.preview">;
33
+ type: z.ZodMiniLiteral<"preview.connection.pair.result">;
34
+ requestId: z.ZodMiniString<string>;
35
+ ok: z.ZodMiniLiteral<false>;
36
+ error: z.ZodMiniObject<{
37
+ message: z.ZodMiniString<string>;
38
+ code: z.ZodMiniOptional<z.ZodMiniString<string>>;
39
+ }, z.core.$strip>;
40
+ }, z.core.$strip>], "ok">;
41
+ export type PreviewPairingHostRequest = z.output<typeof previewPairingHostRequestSchema>;
42
+ export type PreviewPairingHostAck = z.output<typeof previewPairingHostAckSchema>;
43
+ export type PreviewPairingHostResult = z.output<typeof previewPairingHostResultSchema>;
44
+ //# sourceMappingURL=preview-pairing-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-pairing-transport.d.ts","sourceRoot":"","sources":["../src/preview-pairing-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAG9B,eAAO,MAAM,gCAAgC,4BAA4B,CAAC;AAI1E,eAAO,MAAM,+BAA+B;;;;;;;iBAO1C,CAAC;AAOH,eAAO,MAAM,2BAA2B;;;;iBAItC,CAAC;AAkBH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;yBAGzC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAC/C,OAAO,+BAA+B,CACtC,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAC3C,OAAO,2BAA2B,CAClC,CAAC;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAC9C,OAAO,8BAA8B,CACrC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import * as z from "zod/mini";
2
+ import { previewConnectionPairResponseSchema } from "./preview-connection.js";
3
+ export const PREVIEW_PAIRING_TRANSPORT_SOURCE = "getuserfeedback.preview";
4
+ const nonEmptyStringSchema = z.string().check(z.trim(), z.minLength(1));
5
+ export const previewPairingHostRequestSchema = z.object({
6
+ source: z.literal(PREVIEW_PAIRING_TRANSPORT_SOURCE),
7
+ type: z.literal("preview.connection.pair.request"),
8
+ requestId: nonEmptyStringSchema,
9
+ previewToken: nonEmptyStringSchema,
10
+ expectedRevision: z.number().check(z.int(), z.positive()),
11
+ capabilities: z.array(nonEmptyStringSchema),
12
+ });
13
+ const previewPairingErrorSchema = z.object({
14
+ message: nonEmptyStringSchema,
15
+ code: z.optional(nonEmptyStringSchema),
16
+ });
17
+ export const previewPairingHostAckSchema = z.object({
18
+ source: z.literal(PREVIEW_PAIRING_TRANSPORT_SOURCE),
19
+ type: z.literal("preview.connection.pair.ack"),
20
+ requestId: nonEmptyStringSchema,
21
+ });
22
+ const previewPairingHostResultSuccessSchema = z.object({
23
+ source: z.literal(PREVIEW_PAIRING_TRANSPORT_SOURCE),
24
+ type: z.literal("preview.connection.pair.result"),
25
+ requestId: nonEmptyStringSchema,
26
+ ok: z.literal(true),
27
+ result: previewConnectionPairResponseSchema,
28
+ });
29
+ const previewPairingHostResultErrorSchema = z.object({
30
+ source: z.literal(PREVIEW_PAIRING_TRANSPORT_SOURCE),
31
+ type: z.literal("preview.connection.pair.result"),
32
+ requestId: nonEmptyStringSchema,
33
+ ok: z.literal(false),
34
+ error: previewPairingErrorSchema,
35
+ });
36
+ export const previewPairingHostResultSchema = z.discriminatedUnion("ok", [
37
+ previewPairingHostResultSuccessSchema,
38
+ previewPairingHostResultErrorSchema,
39
+ ]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getuserfeedback/protocol",
3
- "version": "3.0.6",
3
+ "version": "3.0.8",
4
4
  "description": "getuserfeedback widget protocol — host surface and (later) wire protocol",
5
5
  "keywords": [
6
6
  "getuserfeedback",
@@ -0,0 +1,27 @@
1
+ import * as z from "zod/mini";
2
+
3
+ export const attentionPolicySourceSchema = z.enum(["default", "custom"]);
4
+
5
+ export const attentionExclusiveSurfaceStrategySchema = z.enum(["queue"]);
6
+
7
+ export const attentionBlockedBroadcastStrategySchema = z.enum(["queue"]);
8
+
9
+ export const attentionPolicyConfigSchema = z.strictObject({
10
+ version: z.string().check(z.trim(), z.minLength(1)),
11
+ source: attentionPolicySourceSchema,
12
+ recentFlowCooldownMs: z.number().check(z.positive()),
13
+ exclusiveSurfaceStrategy: attentionExclusiveSurfaceStrategySchema,
14
+ blockedBroadcastStrategy: attentionBlockedBroadcastStrategySchema,
15
+ });
16
+
17
+ export type AttentionPolicyConfig = z.output<
18
+ typeof attentionPolicyConfigSchema
19
+ >;
20
+
21
+ export const DEFAULT_ATTENTION_POLICY_CONFIG: AttentionPolicyConfig = {
22
+ version: "attention-policy-default-v1",
23
+ source: "default",
24
+ recentFlowCooldownMs: 5 * 60 * 1000,
25
+ exclusiveSurfaceStrategy: "queue",
26
+ blockedBroadcastStrategy: "queue",
27
+ };
@@ -52,6 +52,7 @@ describe("flow display sync contracts", () => {
52
52
 
53
53
  expect(result.assignments.claimed[0]?.flowAssignmentId).toBe("fa_1");
54
54
  expect(result.broadcasts.opportunities).toEqual([]);
55
+ expect(result.attentionPolicy).toBeUndefined();
55
56
  });
56
57
 
57
58
  it("accepts runtime broadcast opportunities", () => {
@@ -1,5 +1,9 @@
1
1
  import * as z from "zod/mini";
2
2
 
3
+ import {
4
+ type AttentionPolicyConfig,
5
+ attentionPolicyConfigSchema,
6
+ } from "./attention-policy.js";
3
7
  import {
4
8
  flowAssignmentIdentitySchema,
5
9
  flowAssignmentRecordSchema,
@@ -82,6 +86,7 @@ export const flowDisplaySyncRequestSchema = z.object({
82
86
 
83
87
  export const flowDisplaySyncResponseSchema = z.object({
84
88
  fetchedAt: z.string(),
89
+ attentionPolicy: z.optional(attentionPolicyConfigSchema),
85
90
  assignments: z.object({
86
91
  claimed: z.array(flowAssignmentRecordSchema),
87
92
  }),
@@ -109,3 +114,4 @@ export type FlowDisplaySyncRequest = z.output<
109
114
  export type FlowDisplaySyncResponse = z.output<
110
115
  typeof flowDisplaySyncResponseSchema
111
116
  >;
117
+ export type FlowDisplayAttentionPolicyConfig = AttentionPolicyConfig;
package/src/index.ts CHANGED
@@ -22,6 +22,14 @@ export {
22
22
  appEventTrackSchema,
23
23
  reservedSystemAppEventNames,
24
24
  } from "./app-event.js";
25
+ export {
26
+ type AttentionPolicyConfig,
27
+ attentionBlockedBroadcastStrategySchema,
28
+ attentionExclusiveSurfaceStrategySchema,
29
+ attentionPolicyConfigSchema,
30
+ attentionPolicySourceSchema,
31
+ DEFAULT_ATTENTION_POLICY_CONFIG,
32
+ } from "./attention-policy.js";
25
33
  export {
26
34
  type ClientMeta,
27
35
  clientMetaSchema,
@@ -100,6 +108,15 @@ export {
100
108
  previewConnectionPairRequestSchema,
101
109
  previewConnectionPairResponseSchema,
102
110
  } from "./preview-connection.js";
111
+ export {
112
+ PREVIEW_PAIRING_TRANSPORT_SOURCE,
113
+ type PreviewPairingHostAck,
114
+ type PreviewPairingHostRequest,
115
+ type PreviewPairingHostResult,
116
+ previewPairingHostAckSchema,
117
+ previewPairingHostRequestSchema,
118
+ previewPairingHostResultSchema,
119
+ } from "./preview-pairing-transport.js";
103
120
  export {
104
121
  isPublicGrantScope,
105
122
  type PublicGrantScope,
@@ -9,6 +9,7 @@ describe("preview connection protocol", () => {
9
9
  const result = previewConnectionPairRequestSchema.parse({
10
10
  capabilities: ["post-message", "flow-display-sync"],
11
11
  expectedRevision: 3,
12
+ pairedAppApiKey: "app_api_key",
12
13
  pairedIdentity: "preview-identity",
13
14
  pairedUrl: "https://customer.example.com/app",
14
15
  });
@@ -16,11 +17,28 @@ describe("preview connection protocol", () => {
16
17
  expect(result).toEqual({
17
18
  capabilities: ["post-message", "flow-display-sync"],
18
19
  expectedRevision: 3,
20
+ pairedAppApiKey: "app_api_key",
19
21
  pairedIdentity: "preview-identity",
20
22
  pairedUrl: "https://customer.example.com/app",
21
23
  });
22
24
  });
23
25
 
26
+ it("keeps paired app api keys optional for patch-compatible clients", () => {
27
+ const result = previewConnectionPairRequestSchema.parse({
28
+ capabilities: ["post-message"],
29
+ expectedRevision: 3,
30
+ pairedIdentity: "preview-identity",
31
+ pairedUrl: null,
32
+ });
33
+
34
+ expect(result).toEqual({
35
+ capabilities: ["post-message"],
36
+ expectedRevision: 3,
37
+ pairedIdentity: "preview-identity",
38
+ pairedUrl: null,
39
+ });
40
+ });
41
+
24
42
  it("parses pair responses", () => {
25
43
  const result = previewConnectionPairResponseSchema.parse({
26
44
  appId: "app_123",
@@ -5,6 +5,7 @@ const nonEmptyStringSchema = z.string().check(z.trim(), z.minLength(1));
5
5
  export const previewConnectionPairRequestSchema = z.object({
6
6
  capabilities: z.array(nonEmptyStringSchema),
7
7
  expectedRevision: z.number().check(z.int(), z.positive()),
8
+ pairedAppApiKey: z.optional(nonEmptyStringSchema),
8
9
  pairedIdentity: nonEmptyStringSchema,
9
10
  pairedUrl: z.nullable(z.url()),
10
11
  });
@@ -0,0 +1,65 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import {
3
+ PREVIEW_PAIRING_TRANSPORT_SOURCE,
4
+ previewPairingHostAckSchema,
5
+ previewPairingHostRequestSchema,
6
+ previewPairingHostResultSchema,
7
+ } from "./preview-pairing-transport";
8
+
9
+ describe("preview pairing transport protocol", () => {
10
+ it("parses host pairing requests", () => {
11
+ expect(
12
+ previewPairingHostRequestSchema.parse({
13
+ source: PREVIEW_PAIRING_TRANSPORT_SOURCE,
14
+ type: "preview.connection.pair.request",
15
+ requestId: "req_123",
16
+ previewToken: "prv_123",
17
+ expectedRevision: 2,
18
+ capabilities: ["post-message"],
19
+ }),
20
+ ).toEqual({
21
+ source: PREVIEW_PAIRING_TRANSPORT_SOURCE,
22
+ type: "preview.connection.pair.request",
23
+ requestId: "req_123",
24
+ previewToken: "prv_123",
25
+ expectedRevision: 2,
26
+ capabilities: ["post-message"],
27
+ });
28
+ });
29
+
30
+ it("parses ack and result messages", () => {
31
+ expect(
32
+ previewPairingHostAckSchema.parse({
33
+ source: PREVIEW_PAIRING_TRANSPORT_SOURCE,
34
+ type: "preview.connection.pair.ack",
35
+ requestId: "req_123",
36
+ }),
37
+ ).toEqual({
38
+ source: PREVIEW_PAIRING_TRANSPORT_SOURCE,
39
+ type: "preview.connection.pair.ack",
40
+ requestId: "req_123",
41
+ });
42
+
43
+ expect(
44
+ previewPairingHostResultSchema.parse({
45
+ source: PREVIEW_PAIRING_TRANSPORT_SOURCE,
46
+ type: "preview.connection.pair.result",
47
+ requestId: "req_123",
48
+ ok: true,
49
+ result: {
50
+ appId: "app_123",
51
+ capabilities: ["post-message"],
52
+ id: "prvs_123",
53
+ organizationId: "org_123",
54
+ pairedAt: "2026-06-29T00:00:00.000Z",
55
+ pairedIdentity: "anon_123",
56
+ pairedUrl: "https://customer.example.com/app",
57
+ revision: 3,
58
+ },
59
+ }),
60
+ ).toMatchObject({
61
+ ok: true,
62
+ requestId: "req_123",
63
+ });
64
+ });
65
+ });
@@ -0,0 +1,57 @@
1
+ import * as z from "zod/mini";
2
+ import { previewConnectionPairResponseSchema } from "./preview-connection.js";
3
+
4
+ export const PREVIEW_PAIRING_TRANSPORT_SOURCE = "getuserfeedback.preview";
5
+
6
+ const nonEmptyStringSchema = z.string().check(z.trim(), z.minLength(1));
7
+
8
+ export const previewPairingHostRequestSchema = z.object({
9
+ source: z.literal(PREVIEW_PAIRING_TRANSPORT_SOURCE),
10
+ type: z.literal("preview.connection.pair.request"),
11
+ requestId: nonEmptyStringSchema,
12
+ previewToken: nonEmptyStringSchema,
13
+ expectedRevision: z.number().check(z.int(), z.positive()),
14
+ capabilities: z.array(nonEmptyStringSchema),
15
+ });
16
+
17
+ const previewPairingErrorSchema = z.object({
18
+ message: nonEmptyStringSchema,
19
+ code: z.optional(nonEmptyStringSchema),
20
+ });
21
+
22
+ export const previewPairingHostAckSchema = z.object({
23
+ source: z.literal(PREVIEW_PAIRING_TRANSPORT_SOURCE),
24
+ type: z.literal("preview.connection.pair.ack"),
25
+ requestId: nonEmptyStringSchema,
26
+ });
27
+
28
+ const previewPairingHostResultSuccessSchema = z.object({
29
+ source: z.literal(PREVIEW_PAIRING_TRANSPORT_SOURCE),
30
+ type: z.literal("preview.connection.pair.result"),
31
+ requestId: nonEmptyStringSchema,
32
+ ok: z.literal(true),
33
+ result: previewConnectionPairResponseSchema,
34
+ });
35
+
36
+ const previewPairingHostResultErrorSchema = z.object({
37
+ source: z.literal(PREVIEW_PAIRING_TRANSPORT_SOURCE),
38
+ type: z.literal("preview.connection.pair.result"),
39
+ requestId: nonEmptyStringSchema,
40
+ ok: z.literal(false),
41
+ error: previewPairingErrorSchema,
42
+ });
43
+
44
+ export const previewPairingHostResultSchema = z.discriminatedUnion("ok", [
45
+ previewPairingHostResultSuccessSchema,
46
+ previewPairingHostResultErrorSchema,
47
+ ]);
48
+
49
+ export type PreviewPairingHostRequest = z.output<
50
+ typeof previewPairingHostRequestSchema
51
+ >;
52
+ export type PreviewPairingHostAck = z.output<
53
+ typeof previewPairingHostAckSchema
54
+ >;
55
+ export type PreviewPairingHostResult = z.output<
56
+ typeof previewPairingHostResultSchema
57
+ >;
@@ -11,6 +11,8 @@ import {
11
11
  appEventPayloadSchema,
12
12
  appEventSurveyViewedSchema,
13
13
  appEventTrackSchema,
14
+ attentionPolicyConfigSchema,
15
+ DEFAULT_ATTENTION_POLICY_CONFIG,
14
16
  DEFAULT_AUTO_DETECT_COLOR_SCHEME_ATTRS,
15
17
  flowVersionResolutionSchema,
16
18
  getScopeMeta,
@@ -54,6 +56,18 @@ describe("@getuserfeedback/protocol root contract", () => {
54
56
  ]);
55
57
  });
56
58
 
59
+ it("exports attention policy config defaults and schema", () => {
60
+ expect(
61
+ attentionPolicyConfigSchema.parse(DEFAULT_ATTENTION_POLICY_CONFIG),
62
+ ).toEqual({
63
+ version: "attention-policy-default-v1",
64
+ source: "default",
65
+ recentFlowCooldownMs: 5 * 60 * 1000,
66
+ exclusiveSurfaceStrategy: "queue",
67
+ blockedBroadcastStrategy: "queue",
68
+ });
69
+ });
70
+
57
71
  it("parses widget-config flag and capability inputs via canonical app-event schemas", () => {
58
72
  expect(
59
73
  appEventFlagSchema.parse({