@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.
- package/dist/attention-policy.d.ts +1 -1
- package/dist/attention-policy.d.ts.map +1 -1
- package/dist/attention-policy.js +4 -1
- package/dist/flow-display.d.ts +2 -1
- package/dist/flow-display.d.ts.map +1 -1
- package/dist/flow-display.js +17 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/instance-feedback.d.ts +47 -0
- package/dist/instance-feedback.d.ts.map +1 -1
- package/dist/instance-feedback.js +34 -7
- package/package.json +1 -1
- package/src/attention-policy.ts +4 -1
- package/src/flow-display.test.ts +107 -0
- package/src/flow-display.ts +25 -0
- package/src/index.ts +7 -0
- package/src/instance-feedback.test.ts +65 -1
- package/src/instance-feedback.ts +54 -13
|
@@ -37,7 +37,7 @@ export declare const attentionPolicyConfigSchema: z.ZodMiniObject<{
|
|
|
37
37
|
blockedBroadcastStrategy: z.ZodMiniEnum<{
|
|
38
38
|
queue: "queue";
|
|
39
39
|
}>;
|
|
40
|
-
}, z.core.$
|
|
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;
|
|
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"}
|
package/dist/attention-policy.js
CHANGED
|
@@ -10,7 +10,10 @@ const legacyAttentionPolicyConfigFields = {
|
|
|
10
10
|
blockedBroadcastStrategy: attentionBlockedBroadcastStrategySchema,
|
|
11
11
|
};
|
|
12
12
|
export const legacyAttentionPolicyConfigSchema = z.strictObject(legacyAttentionPolicyConfigFields);
|
|
13
|
-
|
|
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
|
});
|
package/dist/flow-display.d.ts
CHANGED
|
@@ -228,7 +228,7 @@ export declare const flowDisplaySyncResponseSchema: z.ZodMiniObject<{
|
|
|
228
228
|
blockedBroadcastStrategy: z.ZodMiniEnum<{
|
|
229
229
|
queue: "queue";
|
|
230
230
|
}>;
|
|
231
|
-
}, z.core.$
|
|
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"}
|
package/dist/flow-display.js
CHANGED
|
@@ -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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,EACxB,0BAA0B,EAC1B,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,2BAA2B,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,KAAK,qBAAqB,EAC1B,uCAAuC,EACvC,uCAAuC,EACvC,2BAA2B,EAC3B,2BAA2B,EAC3B,+BAA+B,GAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,KAAK,UAAU,EACf,gBAAgB,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,yBAAyB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,KAAK,kBAAkB,EACvB,wBAAwB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sCAAsC,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,KAAK,kCAAkC,EACvC,KAAK,mCAAmC,EACxC,wCAAwC,EACxC,yCAAyC,EACzC,KAAK,yCAAyC,EAC9C,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,oCAAoC,EACpC,0BAA0B,EAC1B,0BAA0B,EAC1B,oCAAoC,EACpC,KAAK,kCAAkC,EACvC,wCAAwC,EACxC,mDAAmD,EACnD,KAAK,iCAAiC,EACtC,KAAK,kCAAkC,EACvC,uCAAuC,EACvC,wCAAwC,EACxC,KAAK,oCAAoC,EACzC,KAAK,qCAAqC,EAC1C,0CAA0C,EAC1C,2CAA2C,GAC3C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,KAAK,6BAA6B,EAClC,KAAK,kCAAkC,EACvC,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,mCAAmC,EACnC,wCAAwC,EACxC,8BAA8B,EAC9B,+BAA+B,EAC/B,2BAA2B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,gCAAgC,EAChC,yBAAyB,EACzB,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,mBAAmB,EACnB,KAAK,yBAAyB,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,KAAK,8BAA8B,EACnC,KAAK,+BAA+B,EACpC,oCAAoC,EACpC,qCAAqC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,8BAA8B,EAC9B,6BAA6B,
|
|
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;
|
|
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:
|
|
30
|
-
|
|
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(
|
|
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
package/src/attention-policy.ts
CHANGED
|
@@ -18,7 +18,10 @@ export const legacyAttentionPolicyConfigSchema = z.strictObject(
|
|
|
18
18
|
legacyAttentionPolicyConfigFields,
|
|
19
19
|
);
|
|
20
20
|
|
|
21
|
-
|
|
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
|
});
|
package/src/flow-display.test.ts
CHANGED
|
@@ -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",
|
package/src/flow-display.ts
CHANGED
|
@@ -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 {
|
|
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
|
+
});
|
package/src/instance-feedback.ts
CHANGED
|
@@ -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:
|
|
40
|
-
|
|
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
|
+
>;
|