@getuserfeedback/protocol 3.1.0 → 3.1.2

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.
@@ -37,7 +37,7 @@ export declare const attentionPolicyConfigSchema: z.ZodMiniObject<{
37
37
  blockedBroadcastStrategy: z.ZodMiniEnum<{
38
38
  queue: "queue";
39
39
  }>;
40
- }, z.core.$strict>;
40
+ }, z.core.$loose>;
41
41
  export type AttentionPolicyConfig = z.output<typeof attentionPolicyConfigSchema>;
42
42
  export declare const DEFAULT_ATTENTION_POLICY_CONFIG: AttentionPolicyConfig;
43
43
  //# sourceMappingURL=attention-policy.d.ts.map
@@ -1 +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;AAUzE,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;kBAE7C,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;kBAGtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAC3C,OAAO,2BAA2B,CAClC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,qBAO7C,CAAC"}
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;AAUzE,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;kBAE7C,CAAC;AAKF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;iBAGtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAC3C,OAAO,2BAA2B,CAClC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,qBAO7C,CAAC"}
@@ -10,7 +10,10 @@ const legacyAttentionPolicyConfigFields = {
10
10
  blockedBroadcastStrategy: attentionBlockedBroadcastStrategySchema,
11
11
  };
12
12
  export const legacyAttentionPolicyConfigSchema = z.strictObject(legacyAttentionPolicyConfigFields);
13
- export const attentionPolicyConfigSchema = z.strictObject({
13
+ // V2 is the additive policy envelope for the flow-display wire contract.
14
+ // Keep legacy strict, and add future policy controls here instead of creating
15
+ // another versioned sibling field for every new setting.
16
+ export const attentionPolicyConfigSchema = z.looseObject({
14
17
  ...legacyAttentionPolicyConfigFields,
15
18
  recentInAppCooldownMs: z._default(z.number().check(z.nonnegative()), 0),
16
19
  });
@@ -228,7 +228,7 @@ export declare const flowDisplaySyncResponseSchema: z.ZodMiniObject<{
228
228
  blockedBroadcastStrategy: z.ZodMiniEnum<{
229
229
  queue: "queue";
230
230
  }>;
231
- }, z.core.$strict>>;
231
+ }, z.core.$loose>>;
232
232
  assignments: z.ZodMiniObject<{
233
233
  claimed: z.ZodMiniArray<z.ZodMiniObject<{
234
234
  flowAssignmentId: z.ZodMiniString<string>;
@@ -303,4 +303,5 @@ export type RuntimeDisplayTrigger = z.output<typeof runtimeDisplayTriggerSchema>
303
303
  export type FlowDisplaySyncRequest = z.output<typeof flowDisplaySyncRequestSchema>;
304
304
  export type FlowDisplaySyncResponse = z.output<typeof flowDisplaySyncResponseSchema>;
305
305
  export type FlowDisplayAttentionPolicyConfig = AttentionPolicyConfig;
306
+ export declare const resolveFlowDisplayAttentionPolicyConfig: (displaySync: Pick<FlowDisplaySyncResponse, "attentionPolicy" | "attentionPolicyV2">) => FlowDisplayAttentionPolicyConfig | undefined;
306
307
  //# 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;AAE9B,OAAO,EACN,KAAK,qBAAqB,EAG1B,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQxC,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
+ {"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,EAG1B,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQxC,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;AAErE,eAAO,MAAM,uCAAuC,GACnD,aAAa,IAAI,CAChB,uBAAuB,EACvB,iBAAiB,GAAG,mBAAmB,CACvC,KACC,gCAAgC,GAAG,SAkBrC,CAAC"}
@@ -63,3 +63,20 @@ export const flowDisplaySyncResponseSchema = z.object({
63
63
  }),
64
64
  broadcasts: runtimeDisplayBroadcastsSchema,
65
65
  });
66
+ export const resolveFlowDisplayAttentionPolicyConfig = (displaySync) => {
67
+ const policy = displaySync.attentionPolicyV2 ?? displaySync.attentionPolicy;
68
+ if (!policy) {
69
+ return undefined;
70
+ }
71
+ return {
72
+ version: policy.version,
73
+ source: policy.source,
74
+ recentFlowCooldownMs: policy.recentFlowCooldownMs,
75
+ recentInAppCooldownMs: "recentInAppCooldownMs" in policy &&
76
+ typeof policy.recentInAppCooldownMs === "number"
77
+ ? policy.recentInAppCooldownMs
78
+ : 0,
79
+ exclusiveSurfaceStrategy: policy.exclusiveSurfaceStrategy,
80
+ blockedBroadcastStrategy: policy.blockedBroadcastStrategy,
81
+ };
82
+ };
package/dist/index.d.ts CHANGED
@@ -7,9 +7,9 @@ export { DEFAULT_AUTO_DETECT_COLOR_SCHEME_ATTRS } from "./defaults.js";
7
7
  export type { ErrorEvent, ProtocolErrorCode } from "./errors.js";
8
8
  export { ErrorCategory, ErrorCategorySchema, ErrorEventSchema, ProtocolError, } from "./errors.js";
9
9
  export { type ClaimPendingFlowAssignmentsRequest, type ClaimPendingFlowAssignmentsResponse, claimPendingFlowAssignmentsRequestSchema, claimPendingFlowAssignmentsResponseSchema, type FlowAssignmentExternalIdIdentityTypeValue, type FlowAssignmentIdentityTypeValue, type FlowAssignmentRecipientRequest, type FlowAssignmentRecord, type FlowAssignmentStatus, type FlowAssignmentTargetingContext, flowAssignmentRecipientRequestSchema, flowAssignmentRecordSchema, flowAssignmentStatusSchema, flowAssignmentTargetingContextSchema, type ListPendingFlowAssignmentsResponse, listPendingFlowAssignmentsResponseSchema, nullableUpdateFlowAssignmentLifecycleResponseSchema, type ReleaseFlowAssignmentClaimRequest, type ReleaseFlowAssignmentClaimResponse, releaseFlowAssignmentClaimRequestSchema, releaseFlowAssignmentClaimResponseSchema, type UpdateFlowAssignmentLifecycleRequest, type UpdateFlowAssignmentLifecycleResponse, updateFlowAssignmentLifecycleRequestSchema, updateFlowAssignmentLifecycleResponseSchema, } from "./flow-assignments.js";
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
+ export { type FlowDisplaySyncRequest, type FlowDisplaySyncResponse, flowDisplaySyncRequestSchema, flowDisplaySyncResponseSchema, type RuntimeDisplayAttentionPolicy, type RuntimeDisplayBroadcastOpportunity, type RuntimeDisplayBroadcasts, type RuntimeDisplayEligibility, type RuntimeDisplayTrigger, resolveFlowDisplayAttentionPolicyConfig, runtimeDisplayAttentionPolicySchema, runtimeDisplayBroadcastOpportunitySchema, runtimeDisplayBroadcastsSchema, runtimeDisplayEligibilitySchema, runtimeDisplayTriggerSchema, } from "./flow-display.js";
11
11
  export { buildIdentityTypeGuidanceMessage, getIdentityTypeSuggestion, IDENTITY_TYPE_VALUES, type IdentityTypeValue, isIdentityTypeValue, type StandardIdentityTypeValue, } from "./identity-type.js";
12
- export { type CaptureInstanceFeedbackRequest, type CaptureInstanceFeedbackResponse, captureInstanceFeedbackRequestSchema, captureInstanceFeedbackResponseSchema, type InstanceFeedbackDataType, type InstanceFeedbackValence, instanceFeedbackDataTypeSchema, instanceFeedbackValenceSchema, } from "./instance-feedback.js";
12
+ export { type CaptureInstanceFeedbackRequest, type CaptureInstanceFeedbackResponse, captureInstanceFeedbackRequestSchema, captureInstanceFeedbackResponseSchema, type InstanceFeedbackDataType, type InstanceFeedbackMineFeedback, type InstanceFeedbackValence, instanceFeedbackDataTypeSchema, instanceFeedbackMineFeedbackSchema, instanceFeedbackValenceSchema, type ListInstanceFeedbackMineRequest, type ListInstanceFeedbackMineResponse, listInstanceFeedbackMineRequestSchema, listInstanceFeedbackMineResponseSchema, } from "./instance-feedback.js";
13
13
  export { type PreviewConnectionPairRequest, type PreviewConnectionPairResponse, previewConnectionPairRequestSchema, previewConnectionPairResponseSchema, } from "./preview-connection.js";
14
14
  export { PREVIEW_PAIRING_TRANSPORT_SOURCE, type PreviewPairingHostAck, type PreviewPairingHostRequest, type PreviewPairingHostResult, previewPairingHostAckSchema, previewPairingHostRequestSchema, previewPairingHostResultSchema, } from "./preview-pairing-transport.js";
15
15
  export { isPublicGrantScope, type PublicGrantScope, publicGrantScopeIdSchema, } from "./public-grant-scope.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
@@ -6,9 +6,9 @@ export { coreCommandPayloadSchema, } from "./core-commands.js";
6
6
  export { DEFAULT_AUTO_DETECT_COLOR_SCHEME_ATTRS } from "./defaults.js";
7
7
  export { ErrorCategory, ErrorCategorySchema, ErrorEventSchema, ProtocolError, } from "./errors.js";
8
8
  export { claimPendingFlowAssignmentsRequestSchema, claimPendingFlowAssignmentsResponseSchema, flowAssignmentRecipientRequestSchema, flowAssignmentRecordSchema, flowAssignmentStatusSchema, flowAssignmentTargetingContextSchema, listPendingFlowAssignmentsResponseSchema, nullableUpdateFlowAssignmentLifecycleResponseSchema, releaseFlowAssignmentClaimRequestSchema, releaseFlowAssignmentClaimResponseSchema, updateFlowAssignmentLifecycleRequestSchema, updateFlowAssignmentLifecycleResponseSchema, } from "./flow-assignments.js";
9
- export { flowDisplaySyncRequestSchema, flowDisplaySyncResponseSchema, runtimeDisplayAttentionPolicySchema, runtimeDisplayBroadcastOpportunitySchema, runtimeDisplayBroadcastsSchema, runtimeDisplayEligibilitySchema, runtimeDisplayTriggerSchema, } from "./flow-display.js";
9
+ export { flowDisplaySyncRequestSchema, flowDisplaySyncResponseSchema, resolveFlowDisplayAttentionPolicyConfig, runtimeDisplayAttentionPolicySchema, runtimeDisplayBroadcastOpportunitySchema, runtimeDisplayBroadcastsSchema, runtimeDisplayEligibilitySchema, runtimeDisplayTriggerSchema, } from "./flow-display.js";
10
10
  export { buildIdentityTypeGuidanceMessage, getIdentityTypeSuggestion, IDENTITY_TYPE_VALUES, isIdentityTypeValue, } from "./identity-type.js";
11
- export { captureInstanceFeedbackRequestSchema, captureInstanceFeedbackResponseSchema, instanceFeedbackDataTypeSchema, instanceFeedbackValenceSchema, } from "./instance-feedback.js";
11
+ export { captureInstanceFeedbackRequestSchema, captureInstanceFeedbackResponseSchema, instanceFeedbackDataTypeSchema, instanceFeedbackMineFeedbackSchema, instanceFeedbackValenceSchema, listInstanceFeedbackMineRequestSchema, listInstanceFeedbackMineResponseSchema, } from "./instance-feedback.js";
12
12
  export { previewConnectionPairRequestSchema, previewConnectionPairResponseSchema, } from "./preview-connection.js";
13
13
  export { PREVIEW_PAIRING_TRANSPORT_SOURCE, previewPairingHostAckSchema, previewPairingHostRequestSchema, previewPairingHostResultSchema, } from "./preview-pairing-transport.js";
14
14
  export { isPublicGrantScope, publicGrantScopeIdSchema, } from "./public-grant-scope.js";
@@ -33,8 +33,55 @@ export declare const captureInstanceFeedbackResponseSchema: z.ZodMiniObject<{
33
33
  evaluationId: z.ZodMiniString<string>;
34
34
  status: z.ZodMiniLiteral<"accepted">;
35
35
  }, z.core.$strip>;
36
+ export declare const listInstanceFeedbackMineRequestSchema: z.ZodMiniObject<{
37
+ targets: z.ZodMiniArray<z.ZodMiniObject<{
38
+ name: z.ZodMiniOptional<z.ZodMiniString<string>>;
39
+ targetBindingToken: z.ZodMiniString<string>;
40
+ }, z.core.$strip>>;
41
+ }, z.core.$strip>;
42
+ export declare const instanceFeedbackMineFeedbackSchema: z.ZodMiniObject<{
43
+ capturedAt: z.ZodMiniString<string>;
44
+ dataType: z.ZodMiniEnum<{
45
+ boolean: "boolean";
46
+ categorical: "categorical";
47
+ numeric: "numeric";
48
+ }>;
49
+ evaluationId: z.ZodMiniString<string>;
50
+ label: z.ZodMiniNullable<z.ZodMiniString<string>>;
51
+ name: z.ZodMiniString<string>;
52
+ scoreValue: z.ZodMiniNullable<z.ZodMiniNumber<number>>;
53
+ valence: z.ZodMiniEnum<{
54
+ positive: "positive";
55
+ negative: "negative";
56
+ neutral: "neutral";
57
+ }>;
58
+ }, z.core.$strip>;
59
+ export declare const listInstanceFeedbackMineResponseSchema: z.ZodMiniObject<{
60
+ items: z.ZodMiniArray<z.ZodMiniObject<{
61
+ feedback: z.ZodMiniNullable<z.ZodMiniObject<{
62
+ capturedAt: z.ZodMiniString<string>;
63
+ dataType: z.ZodMiniEnum<{
64
+ boolean: "boolean";
65
+ categorical: "categorical";
66
+ numeric: "numeric";
67
+ }>;
68
+ evaluationId: z.ZodMiniString<string>;
69
+ label: z.ZodMiniNullable<z.ZodMiniString<string>>;
70
+ name: z.ZodMiniString<string>;
71
+ scoreValue: z.ZodMiniNullable<z.ZodMiniNumber<number>>;
72
+ valence: z.ZodMiniEnum<{
73
+ positive: "positive";
74
+ negative: "negative";
75
+ neutral: "neutral";
76
+ }>;
77
+ }, z.core.$strip>>;
78
+ }, z.core.$strip>>;
79
+ }, z.core.$strip>;
36
80
  export type InstanceFeedbackDataType = z.output<typeof instanceFeedbackDataTypeSchema>;
37
81
  export type InstanceFeedbackValence = z.output<typeof instanceFeedbackValenceSchema>;
38
82
  export type CaptureInstanceFeedbackRequest = z.output<typeof captureInstanceFeedbackRequestSchema>;
39
83
  export type CaptureInstanceFeedbackResponse = z.output<typeof captureInstanceFeedbackResponseSchema>;
84
+ export type ListInstanceFeedbackMineRequest = z.output<typeof listInstanceFeedbackMineRequestSchema>;
85
+ export type InstanceFeedbackMineFeedback = z.output<typeof instanceFeedbackMineFeedbackSchema>;
86
+ export type ListInstanceFeedbackMineResponse = z.output<typeof listInstanceFeedbackMineResponseSchema>;
40
87
  //# sourceMappingURL=instance-feedback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"instance-feedback.d.ts","sourceRoot":"","sources":["../src/instance-feedback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAyB9B,eAAO,MAAM,8BAA8B;;;;EAIzC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;EAIxC,CAAC;AAEH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;;;;iBA0B/C,CAAC;AAEH,eAAO,MAAM,qCAAqC;;;;iBAIhD,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAC9C,OAAO,8BAA8B,CACrC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAC7C,OAAO,6BAA6B,CACpC,CAAC;AACF,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CACpD,OAAO,oCAAoC,CAC3C,CAAC;AACF,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CACrD,OAAO,qCAAqC,CAC5C,CAAC"}
1
+ {"version":3,"file":"instance-feedback.d.ts","sourceRoot":"","sources":["../src/instance-feedback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAsC9B,eAAO,MAAM,8BAA8B;;;;EAIzC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;EAIxC,CAAC;AAEH,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;;;;iBAgB/C,CAAC;AAEH,eAAO,MAAM,qCAAqC;;;;iBAIhD,CAAC;AAEH,eAAO,MAAM,qCAAqC;;;;;iBAShD,CAAC;AAEH,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;iBAQ7C,CAAC;AAEH,eAAO,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;iBAMjD,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAC9C,OAAO,8BAA8B,CACrC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAC7C,OAAO,6BAA6B,CACpC,CAAC;AACF,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CACpD,OAAO,oCAAoC,CAC3C,CAAC;AACF,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CACrD,OAAO,qCAAqC,CAC5C,CAAC;AACF,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CACrD,OAAO,qCAAqC,CAC5C,CAAC;AACF,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAClD,OAAO,kCAAkC,CACzC,CAAC;AACF,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,MAAM,CACtD,OAAO,sCAAsC,CAC7C,CAAC"}
@@ -12,9 +12,18 @@ const isCanonicalUtcTimestamp = (value) => {
12
12
  const date = new Date(value);
13
13
  return !Number.isNaN(date.getTime()) && date.toISOString() === value;
14
14
  };
15
+ const canonicalUtcTimestampSchema = z.string().check(z.trim(), z.minLength(1), z.refine(isCanonicalUtcTimestamp, {
16
+ message: "capturedAt must be a canonical UTC timestamp.",
17
+ }));
15
18
  const finiteNumberSchema = z.number().check(z.refine(Number.isFinite, {
16
19
  message: "Expected a finite number.",
17
20
  }));
21
+ const targetBindingTokenSchema = z
22
+ .string()
23
+ .check(z.trim(), z.minLength(1), z.maxLength(maxTargetBindingTokenLength));
24
+ const feedbackNameSchema = z
25
+ .string()
26
+ .check(z.trim(), z.minLength(1), z.maxLength(255));
18
27
  export const instanceFeedbackDataTypeSchema = z.enum([
19
28
  "boolean",
20
29
  "categorical",
@@ -26,16 +35,12 @@ export const instanceFeedbackValenceSchema = z.enum([
26
35
  "neutral",
27
36
  ]);
28
37
  export const captureInstanceFeedbackRequestSchema = z.object({
29
- targetBindingToken: z
30
- .string()
31
- .check(z.trim(), z.minLength(1), z.maxLength(maxTargetBindingTokenLength)),
32
- capturedAt: z.string().check(z.trim(), z.minLength(1), z.refine(isCanonicalUtcTimestamp, {
33
- message: "capturedAt must be a canonical UTC timestamp.",
34
- })),
38
+ targetBindingToken: targetBindingTokenSchema,
39
+ capturedAt: canonicalUtcTimestampSchema,
35
40
  comment: z.optional(z.nullable(z.string().check(z.maxLength(maxCaptureRequestCommentLength)))),
36
41
  dataType: instanceFeedbackDataTypeSchema,
37
42
  label: z.optional(z.nullable(z.string().check(z.maxLength(255)))),
38
- name: z.optional(z.string().check(z.trim(), z.minLength(1), z.maxLength(255))),
43
+ name: z.optional(feedbackNameSchema),
39
44
  reasonCategories: z.optional(z
40
45
  .array(z.string().check(z.trim(), z.minLength(1), z.maxLength(128)))
41
46
  .check(z.maxLength(maxReasonCategoryCount))),
@@ -47,3 +52,25 @@ export const captureInstanceFeedbackResponseSchema = z.object({
47
52
  evaluationId: z.string().check(z.trim(), z.minLength(1)),
48
53
  status: z.literal("accepted"),
49
54
  });
55
+ export const listInstanceFeedbackMineRequestSchema = z.object({
56
+ targets: z
57
+ .array(z.object({
58
+ name: z.optional(feedbackNameSchema),
59
+ targetBindingToken: targetBindingTokenSchema,
60
+ }))
61
+ .check(z.minLength(1), z.maxLength(50)),
62
+ });
63
+ export const instanceFeedbackMineFeedbackSchema = z.object({
64
+ capturedAt: canonicalUtcTimestampSchema,
65
+ dataType: instanceFeedbackDataTypeSchema,
66
+ evaluationId: z.string().check(z.trim(), z.minLength(1)),
67
+ label: z.nullable(z.string()),
68
+ name: feedbackNameSchema,
69
+ scoreValue: z.nullable(finiteNumberSchema),
70
+ valence: instanceFeedbackValenceSchema,
71
+ });
72
+ export const listInstanceFeedbackMineResponseSchema = z.object({
73
+ items: z.array(z.object({
74
+ feedback: z.nullable(instanceFeedbackMineFeedbackSchema),
75
+ })),
76
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getuserfeedback/protocol",
3
- "version": "3.1.0",
3
+ "version": "3.1.2",
4
4
  "description": "getuserfeedback widget protocol — host surface and (later) wire protocol",
5
5
  "keywords": [
6
6
  "getuserfeedback",
@@ -18,7 +18,10 @@ export const legacyAttentionPolicyConfigSchema = z.strictObject(
18
18
  legacyAttentionPolicyConfigFields,
19
19
  );
20
20
 
21
- export const attentionPolicyConfigSchema = z.strictObject({
21
+ // V2 is the additive policy envelope for the flow-display wire contract.
22
+ // Keep legacy strict, and add future policy controls here instead of creating
23
+ // another versioned sibling field for every new setting.
24
+ export const attentionPolicyConfigSchema = z.looseObject({
22
25
  ...legacyAttentionPolicyConfigFields,
23
26
  recentInAppCooldownMs: z._default(z.number().check(z.nonnegative()), 0),
24
27
  });
@@ -2,6 +2,7 @@ import { describe, expect, it } from "bun:test";
2
2
  import {
3
3
  flowDisplaySyncRequestSchema,
4
4
  flowDisplaySyncResponseSchema,
5
+ resolveFlowDisplayAttentionPolicyConfig,
5
6
  } from "./flow-display";
6
7
 
7
8
  describe("flow display sync contracts", () => {
@@ -122,6 +123,112 @@ describe("flow display sync contracts", () => {
122
123
  ).toThrow();
123
124
  });
124
125
 
126
+ it("accepts future additive fields on the v2 attention policy envelope", () => {
127
+ const result = flowDisplaySyncResponseSchema.parse({
128
+ fetchedAt: "2026-06-18T00:00:00.000Z",
129
+ attentionPolicyV2: {
130
+ version: "attention-policy-organization-override-v1",
131
+ source: "custom",
132
+ recentFlowCooldownMs: 45_000,
133
+ recentInAppCooldownMs: 60_000,
134
+ exclusiveSurfaceStrategy: "queue",
135
+ blockedBroadcastStrategy: "queue",
136
+ futureChannelStrategy: "digest",
137
+ },
138
+ assignments: {
139
+ claimed: [],
140
+ },
141
+ broadcasts: {
142
+ version: "empty",
143
+ opportunities: [],
144
+ },
145
+ });
146
+
147
+ expect(result.attentionPolicyV2).toEqual({
148
+ version: "attention-policy-organization-override-v1",
149
+ source: "custom",
150
+ recentFlowCooldownMs: 45_000,
151
+ recentInAppCooldownMs: 60_000,
152
+ exclusiveSurfaceStrategy: "queue",
153
+ blockedBroadcastStrategy: "queue",
154
+ futureChannelStrategy: "digest",
155
+ });
156
+ expect(resolveFlowDisplayAttentionPolicyConfig(result)).toEqual({
157
+ version: "attention-policy-organization-override-v1",
158
+ source: "custom",
159
+ recentFlowCooldownMs: 45_000,
160
+ recentInAppCooldownMs: 60_000,
161
+ exclusiveSurfaceStrategy: "queue",
162
+ blockedBroadcastStrategy: "queue",
163
+ });
164
+ });
165
+
166
+ it("resolves the v2 attention policy before the legacy fallback", () => {
167
+ const result = flowDisplaySyncResponseSchema.parse({
168
+ fetchedAt: "2026-06-18T00:00:00.000Z",
169
+ attentionPolicy: {
170
+ version: "attention-policy-legacy-v1",
171
+ source: "custom",
172
+ recentFlowCooldownMs: 45_000,
173
+ exclusiveSurfaceStrategy: "queue",
174
+ blockedBroadcastStrategy: "queue",
175
+ },
176
+ attentionPolicyV2: {
177
+ version: "attention-policy-v2-v1",
178
+ source: "custom",
179
+ recentFlowCooldownMs: 90_000,
180
+ recentInAppCooldownMs: 30_000,
181
+ exclusiveSurfaceStrategy: "queue",
182
+ blockedBroadcastStrategy: "queue",
183
+ },
184
+ assignments: {
185
+ claimed: [],
186
+ },
187
+ broadcasts: {
188
+ version: "empty",
189
+ opportunities: [],
190
+ },
191
+ });
192
+
193
+ expect(resolveFlowDisplayAttentionPolicyConfig(result)).toEqual({
194
+ version: "attention-policy-v2-v1",
195
+ source: "custom",
196
+ recentFlowCooldownMs: 90_000,
197
+ recentInAppCooldownMs: 30_000,
198
+ exclusiveSurfaceStrategy: "queue",
199
+ blockedBroadcastStrategy: "queue",
200
+ });
201
+ });
202
+
203
+ it("resolves legacy attention policy with default v2-only fields", () => {
204
+ const result = flowDisplaySyncResponseSchema.parse({
205
+ fetchedAt: "2026-06-18T00:00:00.000Z",
206
+ attentionPolicy: {
207
+ version: "attention-policy-legacy-v1",
208
+ source: "custom",
209
+ recentFlowCooldownMs: 45_000,
210
+ exclusiveSurfaceStrategy: "queue",
211
+ blockedBroadcastStrategy: "queue",
212
+ },
213
+ assignments: {
214
+ claimed: [],
215
+ },
216
+ broadcasts: {
217
+ version: "empty",
218
+ opportunities: [],
219
+ },
220
+ });
221
+
222
+ expect(resolveFlowDisplayAttentionPolicyConfig(result)).toEqual({
223
+ version: "attention-policy-legacy-v1",
224
+ source: "custom",
225
+ recentFlowCooldownMs: 45_000,
226
+ recentInAppCooldownMs: 0,
227
+ exclusiveSurfaceStrategy: "queue",
228
+ blockedBroadcastStrategy: "queue",
229
+ });
230
+ });
231
+
125
232
  it("accepts runtime broadcast opportunities", () => {
126
233
  const result = flowDisplaySyncResponseSchema.parse({
127
234
  fetchedAt: "2026-06-18T00:00:00.000Z",
@@ -117,3 +117,28 @@ export type FlowDisplaySyncResponse = z.output<
117
117
  typeof flowDisplaySyncResponseSchema
118
118
  >;
119
119
  export type FlowDisplayAttentionPolicyConfig = AttentionPolicyConfig;
120
+
121
+ export const resolveFlowDisplayAttentionPolicyConfig = (
122
+ displaySync: Pick<
123
+ FlowDisplaySyncResponse,
124
+ "attentionPolicy" | "attentionPolicyV2"
125
+ >,
126
+ ): FlowDisplayAttentionPolicyConfig | undefined => {
127
+ const policy = displaySync.attentionPolicyV2 ?? displaySync.attentionPolicy;
128
+ if (!policy) {
129
+ return undefined;
130
+ }
131
+
132
+ return {
133
+ version: policy.version,
134
+ source: policy.source,
135
+ recentFlowCooldownMs: policy.recentFlowCooldownMs,
136
+ recentInAppCooldownMs:
137
+ "recentInAppCooldownMs" in policy &&
138
+ typeof policy.recentInAppCooldownMs === "number"
139
+ ? policy.recentInAppCooldownMs
140
+ : 0,
141
+ exclusiveSurfaceStrategy: policy.exclusiveSurfaceStrategy,
142
+ blockedBroadcastStrategy: policy.blockedBroadcastStrategy,
143
+ };
144
+ };
package/src/index.ts CHANGED
@@ -88,6 +88,7 @@ export {
88
88
  type RuntimeDisplayBroadcasts,
89
89
  type RuntimeDisplayEligibility,
90
90
  type RuntimeDisplayTrigger,
91
+ resolveFlowDisplayAttentionPolicyConfig,
91
92
  runtimeDisplayAttentionPolicySchema,
92
93
  runtimeDisplayBroadcastOpportunitySchema,
93
94
  runtimeDisplayBroadcastsSchema,
@@ -108,9 +109,15 @@ export {
108
109
  captureInstanceFeedbackRequestSchema,
109
110
  captureInstanceFeedbackResponseSchema,
110
111
  type InstanceFeedbackDataType,
112
+ type InstanceFeedbackMineFeedback,
111
113
  type InstanceFeedbackValence,
112
114
  instanceFeedbackDataTypeSchema,
115
+ instanceFeedbackMineFeedbackSchema,
113
116
  instanceFeedbackValenceSchema,
117
+ type ListInstanceFeedbackMineRequest,
118
+ type ListInstanceFeedbackMineResponse,
119
+ listInstanceFeedbackMineRequestSchema,
120
+ listInstanceFeedbackMineResponseSchema,
114
121
  } from "./instance-feedback.js";
115
122
  export {
116
123
  type PreviewConnectionPairRequest,
@@ -1,6 +1,10 @@
1
1
  import { describe, expect, it } from "bun:test";
2
2
 
3
- import { captureInstanceFeedbackRequestSchema } from "./instance-feedback";
3
+ import {
4
+ captureInstanceFeedbackRequestSchema,
5
+ listInstanceFeedbackMineRequestSchema,
6
+ listInstanceFeedbackMineResponseSchema,
7
+ } from "./instance-feedback";
4
8
 
5
9
  const validCaptureRequest = {
6
10
  capturedAt: "2026-07-01T12:00:00.000Z",
@@ -84,3 +88,63 @@ describe("captureInstanceFeedbackRequestSchema", () => {
84
88
  ).toBe(false);
85
89
  });
86
90
  });
91
+
92
+ describe("listInstanceFeedbackMineRequestSchema", () => {
93
+ it("accepts target binding token batches", () => {
94
+ expect(
95
+ listInstanceFeedbackMineRequestSchema.safeParse({
96
+ targets: [
97
+ { targetBindingToken: "binding-token" },
98
+ { name: "quality_rating", targetBindingToken: "binding-token-2" },
99
+ ],
100
+ }).success,
101
+ ).toBe(true);
102
+ });
103
+
104
+ it("requires at least one target", () => {
105
+ expect(
106
+ listInstanceFeedbackMineRequestSchema.safeParse({ targets: [] }).success,
107
+ ).toBe(false);
108
+ });
109
+
110
+ it("caps target batches", () => {
111
+ expect(
112
+ listInstanceFeedbackMineRequestSchema.safeParse({
113
+ targets: Array.from({ length: 51 }, (_, index) => ({
114
+ targetBindingToken: `binding-token-${index}`,
115
+ })),
116
+ }).success,
117
+ ).toBe(false);
118
+ });
119
+
120
+ it("caps target binding tokens before verification", () => {
121
+ expect(
122
+ listInstanceFeedbackMineRequestSchema.safeParse({
123
+ targets: [{ targetBindingToken: "x".repeat(4097) }],
124
+ }).success,
125
+ ).toBe(false);
126
+ });
127
+ });
128
+
129
+ describe("listInstanceFeedbackMineResponseSchema", () => {
130
+ it("accepts nullable feedback entries aligned with requested targets", () => {
131
+ expect(
132
+ listInstanceFeedbackMineResponseSchema.safeParse({
133
+ items: [
134
+ {
135
+ feedback: {
136
+ capturedAt: "2026-07-01T12:00:00.000Z",
137
+ dataType: "boolean",
138
+ evaluationId: "eval_1",
139
+ label: null,
140
+ name: "user_feedback",
141
+ scoreValue: 1,
142
+ valence: "positive",
143
+ },
144
+ },
145
+ { feedback: null },
146
+ ],
147
+ }).success,
148
+ ).toBe(true);
149
+ });
150
+ });
@@ -17,11 +17,24 @@ const isCanonicalUtcTimestamp = (value: string) => {
17
17
  const date = new Date(value);
18
18
  return !Number.isNaN(date.getTime()) && date.toISOString() === value;
19
19
  };
20
+ const canonicalUtcTimestampSchema = z.string().check(
21
+ z.trim(),
22
+ z.minLength(1),
23
+ z.refine(isCanonicalUtcTimestamp, {
24
+ message: "capturedAt must be a canonical UTC timestamp.",
25
+ }),
26
+ );
20
27
  const finiteNumberSchema = z.number().check(
21
28
  z.refine(Number.isFinite, {
22
29
  message: "Expected a finite number.",
23
30
  }),
24
31
  );
32
+ const targetBindingTokenSchema = z
33
+ .string()
34
+ .check(z.trim(), z.minLength(1), z.maxLength(maxTargetBindingTokenLength));
35
+ const feedbackNameSchema = z
36
+ .string()
37
+ .check(z.trim(), z.minLength(1), z.maxLength(255));
25
38
 
26
39
  export const instanceFeedbackDataTypeSchema = z.enum([
27
40
  "boolean",
@@ -36,24 +49,14 @@ export const instanceFeedbackValenceSchema = z.enum([
36
49
  ]);
37
50
 
38
51
  export const captureInstanceFeedbackRequestSchema = z.object({
39
- targetBindingToken: z
40
- .string()
41
- .check(z.trim(), z.minLength(1), z.maxLength(maxTargetBindingTokenLength)),
42
- capturedAt: z.string().check(
43
- z.trim(),
44
- z.minLength(1),
45
- z.refine(isCanonicalUtcTimestamp, {
46
- message: "capturedAt must be a canonical UTC timestamp.",
47
- }),
48
- ),
52
+ targetBindingToken: targetBindingTokenSchema,
53
+ capturedAt: canonicalUtcTimestampSchema,
49
54
  comment: z.optional(
50
55
  z.nullable(z.string().check(z.maxLength(maxCaptureRequestCommentLength))),
51
56
  ),
52
57
  dataType: instanceFeedbackDataTypeSchema,
53
58
  label: z.optional(z.nullable(z.string().check(z.maxLength(255)))),
54
- name: z.optional(
55
- z.string().check(z.trim(), z.minLength(1), z.maxLength(255)),
56
- ),
59
+ name: z.optional(feedbackNameSchema),
57
60
  reasonCategories: z.optional(
58
61
  z
59
62
  .array(z.string().check(z.trim(), z.minLength(1), z.maxLength(128)))
@@ -69,6 +72,35 @@ export const captureInstanceFeedbackResponseSchema = z.object({
69
72
  status: z.literal("accepted"),
70
73
  });
71
74
 
75
+ export const listInstanceFeedbackMineRequestSchema = z.object({
76
+ targets: z
77
+ .array(
78
+ z.object({
79
+ name: z.optional(feedbackNameSchema),
80
+ targetBindingToken: targetBindingTokenSchema,
81
+ }),
82
+ )
83
+ .check(z.minLength(1), z.maxLength(50)),
84
+ });
85
+
86
+ export const instanceFeedbackMineFeedbackSchema = z.object({
87
+ capturedAt: canonicalUtcTimestampSchema,
88
+ dataType: instanceFeedbackDataTypeSchema,
89
+ evaluationId: z.string().check(z.trim(), z.minLength(1)),
90
+ label: z.nullable(z.string()),
91
+ name: feedbackNameSchema,
92
+ scoreValue: z.nullable(finiteNumberSchema),
93
+ valence: instanceFeedbackValenceSchema,
94
+ });
95
+
96
+ export const listInstanceFeedbackMineResponseSchema = z.object({
97
+ items: z.array(
98
+ z.object({
99
+ feedback: z.nullable(instanceFeedbackMineFeedbackSchema),
100
+ }),
101
+ ),
102
+ });
103
+
72
104
  export type InstanceFeedbackDataType = z.output<
73
105
  typeof instanceFeedbackDataTypeSchema
74
106
  >;
@@ -81,3 +113,12 @@ export type CaptureInstanceFeedbackRequest = z.output<
81
113
  export type CaptureInstanceFeedbackResponse = z.output<
82
114
  typeof captureInstanceFeedbackResponseSchema
83
115
  >;
116
+ export type ListInstanceFeedbackMineRequest = z.output<
117
+ typeof listInstanceFeedbackMineRequestSchema
118
+ >;
119
+ export type InstanceFeedbackMineFeedback = z.output<
120
+ typeof instanceFeedbackMineFeedbackSchema
121
+ >;
122
+ export type ListInstanceFeedbackMineResponse = z.output<
123
+ typeof listInstanceFeedbackMineResponseSchema
124
+ >;