@modainteract/moda-interact-shared 5.11.1 → 5.12.0
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/{chunk-5BIYNMMT.js → chunk-JWX4ZVKK.js} +2 -101
- package/dist/chunk-JWX4ZVKK.js.map +1 -0
- package/dist/chunk-SOAGFZ7A.js +184 -0
- package/dist/chunk-SOAGFZ7A.js.map +1 -0
- package/dist/chunk-VJNXWDA5.js +105 -0
- package/dist/chunk-VJNXWDA5.js.map +1 -0
- package/dist/commerce/index.js +6 -4
- package/dist/commerce/index.js.map +1 -1
- package/dist/commerce/presentation/index.d.ts +5 -78
- package/dist/commerce/presentation/index.js +37 -87
- package/dist/commerce/presentation/index.js.map +1 -1
- package/dist/commerce/presentation/node/index.d.ts +186 -0
- package/dist/commerce/presentation/node/index.js +976 -0
- package/dist/commerce/presentation/node/index.js.map +1 -0
- package/dist/commerce/runner/index.js +6 -4
- package/dist/commerce/runner/index.js.map +1 -1
- package/dist/wrapper-contracts-BcxDQPon.d.ts +243 -0
- package/package.json +9 -2
- package/dist/chunk-5BIYNMMT.js.map +0 -1
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
/** Admin's documented stable JSON hashing protocol, without importing its AST/compiler. */
|
|
4
|
+
declare function stableJson(value: unknown): string;
|
|
5
|
+
type PresentationDigest = (value: string) => string;
|
|
6
|
+
declare function digest(value: string, sha256: PresentationDigest): string;
|
|
7
|
+
/** Never parse localeAst.authoring. Fail closed if the compiled runtime projection is absent. */
|
|
8
|
+
declare function readPreparedWrapper(localeAst: unknown, contentHash: string | null, sha256: PresentationDigest): {
|
|
9
|
+
kind: "ok";
|
|
10
|
+
prepared: PreparedWrapper;
|
|
11
|
+
} | {
|
|
12
|
+
kind: "missing" | "invalid";
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
declare const Platform: z.ZodEnum<{
|
|
16
|
+
SHOPIFY: "SHOPIFY";
|
|
17
|
+
WOOCOMMERCE: "WOOCOMMERCE";
|
|
18
|
+
}>;
|
|
19
|
+
declare const ConversationProductImageBindingSchema: z.ZodObject<{
|
|
20
|
+
variable: z.ZodLiteral<"response.productImage">;
|
|
21
|
+
placement: z.ZodLiteral<"BEFORE_BODY">;
|
|
22
|
+
optional: z.ZodLiteral<true>;
|
|
23
|
+
}, z.core.$strict>;
|
|
24
|
+
type ConversationProductImageBinding = z.infer<typeof ConversationProductImageBindingSchema>;
|
|
25
|
+
declare const ConversationProductPairSchema: z.ZodObject<{
|
|
26
|
+
productId: z.ZodString;
|
|
27
|
+
variantId: z.ZodNullable<z.ZodString>;
|
|
28
|
+
}, z.core.$strict>;
|
|
29
|
+
type ConversationProductPair = z.infer<typeof ConversationProductPairSchema>;
|
|
30
|
+
declare const ConversationVerifiedProductsSchema: z.ZodObject<{
|
|
31
|
+
shopId: z.ZodString;
|
|
32
|
+
platform: z.ZodEnum<{
|
|
33
|
+
SHOPIFY: "SHOPIFY";
|
|
34
|
+
WOOCOMMERCE: "WOOCOMMERCE";
|
|
35
|
+
}>;
|
|
36
|
+
products: z.ZodArray<z.ZodObject<{
|
|
37
|
+
stock: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
38
|
+
status: z.ZodLiteral<"KNOWN">;
|
|
39
|
+
quantity: z.ZodNumber;
|
|
40
|
+
scope: z.ZodEnum<{
|
|
41
|
+
PRODUCT: "PRODUCT";
|
|
42
|
+
VARIANT: "VARIANT";
|
|
43
|
+
}>;
|
|
44
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
45
|
+
status: z.ZodLiteral<"NOT_TRACKED">;
|
|
46
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
47
|
+
status: z.ZodLiteral<"UNAVAILABLE">;
|
|
48
|
+
}, z.core.$strict>], "status">>;
|
|
49
|
+
description: z.ZodOptional<z.ZodPreprocess<z.ZodObject<{
|
|
50
|
+
status: z.ZodEnum<{
|
|
51
|
+
AVAILABLE: "AVAILABLE";
|
|
52
|
+
NOT_PROVIDED: "NOT_PROVIDED";
|
|
53
|
+
PARTIAL: "PARTIAL";
|
|
54
|
+
}>;
|
|
55
|
+
text: z.ZodString;
|
|
56
|
+
}, z.core.$strict>>>;
|
|
57
|
+
attributes: z.ZodOptional<z.ZodPreprocess<z.ZodObject<{
|
|
58
|
+
status: z.ZodEnum<{
|
|
59
|
+
AVAILABLE: "AVAILABLE";
|
|
60
|
+
NOT_PROVIDED: "NOT_PROVIDED";
|
|
61
|
+
PARTIAL: "PARTIAL";
|
|
62
|
+
}>;
|
|
63
|
+
items: z.ZodArray<z.ZodObject<{
|
|
64
|
+
name: z.ZodString;
|
|
65
|
+
values: z.ZodArray<z.ZodString>;
|
|
66
|
+
}, z.core.$strict>>;
|
|
67
|
+
}, z.core.$strict>>>;
|
|
68
|
+
options: z.ZodOptional<z.ZodPreprocess<z.ZodObject<{
|
|
69
|
+
status: z.ZodEnum<{
|
|
70
|
+
AVAILABLE: "AVAILABLE";
|
|
71
|
+
NOT_PROVIDED: "NOT_PROVIDED";
|
|
72
|
+
PARTIAL: "PARTIAL";
|
|
73
|
+
}>;
|
|
74
|
+
items: z.ZodArray<z.ZodObject<{
|
|
75
|
+
name: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>;
|
|
76
|
+
values: z.ZodArray<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>>;
|
|
77
|
+
usedForVariants: z.ZodNullable<z.ZodBoolean>;
|
|
78
|
+
}, z.core.$strict>>;
|
|
79
|
+
}, z.core.$strict>>>;
|
|
80
|
+
selectedOptions: z.ZodOptional<z.ZodPreprocess<z.ZodArray<z.ZodObject<{
|
|
81
|
+
name: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>;
|
|
82
|
+
value: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodString>;
|
|
83
|
+
}, z.core.$strict>>>>;
|
|
84
|
+
productId: z.ZodString;
|
|
85
|
+
variantId: z.ZodNullable<z.ZodString>;
|
|
86
|
+
title: z.ZodString;
|
|
87
|
+
url: z.ZodNullable<z.ZodURL>;
|
|
88
|
+
available: z.ZodNullable<z.ZodBoolean>;
|
|
89
|
+
unitPrice: z.ZodNullable<z.ZodString>;
|
|
90
|
+
currency: z.ZodNullable<z.ZodString>;
|
|
91
|
+
productType: z.ZodNullable<z.ZodString>;
|
|
92
|
+
vendor: z.ZodNullable<z.ZodString>;
|
|
93
|
+
categories: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
94
|
+
categoryIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
95
|
+
collectionIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
96
|
+
imageUrl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
97
|
+
saleEvidence: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
98
|
+
regularPrice: z.ZodNullable<z.ZodString>;
|
|
99
|
+
salePrice: z.ZodNullable<z.ZodString>;
|
|
100
|
+
observedAt: z.ZodISODateTime;
|
|
101
|
+
}, z.core.$strict>>>;
|
|
102
|
+
observedAt: z.ZodISODateTime;
|
|
103
|
+
}, z.core.$strict>>;
|
|
104
|
+
}, z.core.$strict>;
|
|
105
|
+
type ConversationVerifiedProducts = z.infer<typeof ConversationVerifiedProductsSchema>;
|
|
106
|
+
declare const ConversationProductImageSourceSchema: z.ZodObject<{
|
|
107
|
+
kind: z.ZodLiteral<"SOURCE">;
|
|
108
|
+
shopId: z.ZodString;
|
|
109
|
+
platform: z.ZodEnum<{
|
|
110
|
+
SHOPIFY: "SHOPIFY";
|
|
111
|
+
WOOCOMMERCE: "WOOCOMMERCE";
|
|
112
|
+
}>;
|
|
113
|
+
productId: z.ZodString;
|
|
114
|
+
variantId: z.ZodNullable<z.ZodString>;
|
|
115
|
+
sourceUrl: z.ZodString;
|
|
116
|
+
}, z.core.$strict>;
|
|
117
|
+
type ConversationProductImageSource = z.infer<typeof ConversationProductImageSourceSchema>;
|
|
118
|
+
declare const ConversationPreparedProductImageSchema: z.ZodObject<{
|
|
119
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
120
|
+
shopId: z.ZodString;
|
|
121
|
+
productId: z.ZodString;
|
|
122
|
+
variantId: z.ZodNullable<z.ZodString>;
|
|
123
|
+
publicUrl: z.ZodString;
|
|
124
|
+
objectKey: z.ZodString;
|
|
125
|
+
contentSha256: z.ZodString;
|
|
126
|
+
contentType: z.ZodLiteral<"image/jpeg">;
|
|
127
|
+
byteLength: z.ZodNumber;
|
|
128
|
+
width: z.ZodLiteral<1125>;
|
|
129
|
+
height: z.ZodLiteral<600>;
|
|
130
|
+
}, z.core.$strict>;
|
|
131
|
+
type ConversationPreparedProductImage = z.infer<typeof ConversationPreparedProductImageSchema>;
|
|
132
|
+
declare const ConversationDeliveryPlanSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
133
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
134
|
+
kind: z.ZodLiteral<"TEXT">;
|
|
135
|
+
body: z.ZodString;
|
|
136
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
137
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
138
|
+
kind: z.ZodLiteral<"IMAGE">;
|
|
139
|
+
body: z.ZodString;
|
|
140
|
+
image: z.ZodObject<{
|
|
141
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
142
|
+
shopId: z.ZodString;
|
|
143
|
+
productId: z.ZodString;
|
|
144
|
+
variantId: z.ZodNullable<z.ZodString>;
|
|
145
|
+
publicUrl: z.ZodString;
|
|
146
|
+
objectKey: z.ZodString;
|
|
147
|
+
contentSha256: z.ZodString;
|
|
148
|
+
contentType: z.ZodLiteral<"image/jpeg">;
|
|
149
|
+
byteLength: z.ZodNumber;
|
|
150
|
+
width: z.ZodLiteral<1125>;
|
|
151
|
+
height: z.ZodLiteral<600>;
|
|
152
|
+
}, z.core.$strict>;
|
|
153
|
+
}, z.core.$strict>], "kind">;
|
|
154
|
+
type ConversationDeliveryPlan = z.infer<typeof ConversationDeliveryPlanSchema>;
|
|
155
|
+
declare function chooseConversationProductImageSource(input: {
|
|
156
|
+
shopId: string;
|
|
157
|
+
platform: z.infer<typeof Platform>;
|
|
158
|
+
displayedPairs: readonly ConversationProductPair[];
|
|
159
|
+
verifiedProducts: ConversationVerifiedProducts;
|
|
160
|
+
}): ConversationProductImageSource | {
|
|
161
|
+
kind: 'OMITTED';
|
|
162
|
+
reason: 'NO_PRESENTED_PRODUCT' | 'NO_PRODUCT_IMAGE' | 'PRODUCT_NOT_VERIFIED';
|
|
163
|
+
};
|
|
164
|
+
type ConversationMediaOmission = 'BINDING_DISABLED' | 'NO_PRESENTED_PRODUCT' | 'CAPTION_TOO_LONG' | 'IMAGE_UNAVAILABLE' | 'IMAGE_IDENTITY_MISMATCH';
|
|
165
|
+
declare function buildConversationDeliveryPlan(input: {
|
|
166
|
+
body: string;
|
|
167
|
+
binding?: ConversationProductImageBinding;
|
|
168
|
+
image?: ConversationPreparedProductImage | null;
|
|
169
|
+
shopId: string;
|
|
170
|
+
displayedPairs: readonly ConversationProductPair[];
|
|
171
|
+
}): {
|
|
172
|
+
plan: ConversationDeliveryPlan;
|
|
173
|
+
mediaOmission: ConversationMediaOmission | null;
|
|
174
|
+
};
|
|
175
|
+
declare function digestConversationDeliveryPlan(plan: ConversationDeliveryPlan, sha256: PresentationDigest): string;
|
|
176
|
+
|
|
177
|
+
/** Pure immutable wrapper projections. Host-owned persistence and sending stay outside Shared. */
|
|
178
|
+
type WrapperSource = "AI" | "HUMAN";
|
|
179
|
+
type WrapperAudience = "SHARED" | WrapperSource;
|
|
180
|
+
type WrapperVariable = "customer.firstName" | "shop.name" | "checkout.url" | "shopBrand.brandName" | "shopBrand.logoUrl" | "shopBrand.logoAltText" | "shopBrand.logoWidth" | "shopBrand.logoHeight" | "shopBrand.squareLogoUrl" | "shopBrand.squareLogoAltText" | "shopBrand.coverImageUrl";
|
|
181
|
+
type PreparedToken = Readonly<{
|
|
182
|
+
kind: "text";
|
|
183
|
+
value: string;
|
|
184
|
+
}> | Readonly<{
|
|
185
|
+
kind: "variable";
|
|
186
|
+
name: WrapperVariable;
|
|
187
|
+
}> | Readonly<{
|
|
188
|
+
kind: "responseSlot";
|
|
189
|
+
name: "response.body";
|
|
190
|
+
}>;
|
|
191
|
+
/** Admin emits this immutable projection in WhatsAppTemplateLocale.localeAst.prepared. */
|
|
192
|
+
type PreparedWrapper = Readonly<{
|
|
193
|
+
schemaVersion: 1;
|
|
194
|
+
family: "MODA_CONVERSATION_WRAPPER";
|
|
195
|
+
responseSlot: "response.body";
|
|
196
|
+
productImage?: ConversationProductImageBinding;
|
|
197
|
+
header: readonly PreparedToken[];
|
|
198
|
+
body: readonly PreparedToken[];
|
|
199
|
+
footer: readonly PreparedToken[];
|
|
200
|
+
conditionals: readonly Readonly<{
|
|
201
|
+
when: "checkout.available";
|
|
202
|
+
tokens: readonly PreparedToken[];
|
|
203
|
+
}>[];
|
|
204
|
+
}>;
|
|
205
|
+
type VerifiedWrapperContext = Readonly<{
|
|
206
|
+
conversationId: string;
|
|
207
|
+
shopId: string;
|
|
208
|
+
conversationLanguageTag: string | null;
|
|
209
|
+
merchantLanguageTag: string | null;
|
|
210
|
+
variables: Partial<Record<WrapperVariable, string>>;
|
|
211
|
+
checkoutAvailable: boolean;
|
|
212
|
+
}>;
|
|
213
|
+
type WrapperDefinition = Readonly<{
|
|
214
|
+
id: string;
|
|
215
|
+
kind: string;
|
|
216
|
+
audience: string | null;
|
|
217
|
+
status: string;
|
|
218
|
+
sourceLanguageTag: string;
|
|
219
|
+
astSchemaVersion: number;
|
|
220
|
+
sourceHash: string;
|
|
221
|
+
publishedAt: Date | null;
|
|
222
|
+
retiredAt: Date | null;
|
|
223
|
+
createdByAdminId: string;
|
|
224
|
+
locales: readonly Readonly<{
|
|
225
|
+
id: string;
|
|
226
|
+
languageTag: string;
|
|
227
|
+
status: string;
|
|
228
|
+
providerLanguageCode: string | null;
|
|
229
|
+
localeAst: unknown;
|
|
230
|
+
contentHash: string | null;
|
|
231
|
+
reviewedAt: Date | null;
|
|
232
|
+
reviewedByAdminId: string | null;
|
|
233
|
+
}>[];
|
|
234
|
+
}>;
|
|
235
|
+
type WrapperSlot = Readonly<{
|
|
236
|
+
audience: string;
|
|
237
|
+
definitionId: string;
|
|
238
|
+
editVersion: number;
|
|
239
|
+
definition: WrapperDefinition;
|
|
240
|
+
}>;
|
|
241
|
+
type WrapperRefusal = "INVALID_INPUT" | "INVALID_LANGUAGE" | "CONVERSATION_UNAVAILABLE" | "TENANT_MISMATCH" | "NOT_CONFIGURED" | "DEFINITION_UNAVAILABLE" | "LOCALE_UNAVAILABLE" | "PREPARED_MISSING" | "PREPARED_INVALID" | "VARIABLE_UNAVAILABLE" | "ALREADY_WRAPPED" | "OUTPUT_TOO_LONG" | "REPLAY_MISMATCH";
|
|
242
|
+
|
|
243
|
+
export { type ConversationPreparedProductImage as C, type PreparedWrapper as P, type VerifiedWrapperContext as V, type WrapperRefusal as W, type ConversationProductImageSource as a, type WrapperSlot as b, type WrapperDefinition as c, type PresentationDigest as d, type ConversationDeliveryPlan as e, ConversationDeliveryPlanSchema as f, type ConversationMediaOmission as g, ConversationPreparedProductImageSchema as h, type ConversationProductImageBinding as i, ConversationProductImageBindingSchema as j, ConversationProductImageSourceSchema as k, type ConversationProductPair as l, ConversationProductPairSchema as m, type ConversationVerifiedProducts as n, ConversationVerifiedProductsSchema as o, type PreparedToken as p, type WrapperAudience as q, type WrapperSource as r, type WrapperVariable as s, buildConversationDeliveryPlan as t, chooseConversationProductImageSource as u, digest as v, digestConversationDeliveryPlan as w, readPreparedWrapper as x, stableJson as y };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@modainteract/moda-interact-shared",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.12.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -138,6 +138,10 @@
|
|
|
138
138
|
"./commerce/outreach": {
|
|
139
139
|
"types": "./dist/commerce/outreach/index.d.ts",
|
|
140
140
|
"import": "./dist/commerce/outreach/index.js"
|
|
141
|
+
},
|
|
142
|
+
"./commerce/presentation/node": {
|
|
143
|
+
"types": "./dist/commerce/presentation/node/index.d.ts",
|
|
144
|
+
"import": "./dist/commerce/presentation/node/index.js"
|
|
141
145
|
}
|
|
142
146
|
},
|
|
143
147
|
"files": [
|
|
@@ -165,9 +169,11 @@
|
|
|
165
169
|
"validate:arch047-whatsapp-template-events": "node scripts/validate-whatsapp-template-events-entrypoint.mjs",
|
|
166
170
|
"test:product-discovery-contracts": "tsx --test src/commerce/product-discovery-contracts.test.ts src/commerce/product-discovery-projection.test.ts src/commerce/runner/built-in-tools.test.ts src/commerce/runner/runner.test.ts",
|
|
167
171
|
"validate:commerce-presentation": "node scripts/validate-commerce-presentation.mjs",
|
|
168
|
-
"validate:commerce-outreach": "node scripts/validate-commerce-outreach.mjs"
|
|
172
|
+
"validate:commerce-outreach": "node scripts/validate-commerce-outreach.mjs",
|
|
173
|
+
"validate:conversation-product-image-node": "node scripts/validate-conversation-product-image-node.mjs"
|
|
169
174
|
},
|
|
170
175
|
"dependencies": {
|
|
176
|
+
"@aws-sdk/client-s3": "3.1143.0",
|
|
171
177
|
"@langchain/core": "1.2.13",
|
|
172
178
|
"@langchain/langgraph": "1.4.15",
|
|
173
179
|
"@langchain/openrouter": "0.4.15",
|
|
@@ -190,6 +196,7 @@
|
|
|
190
196
|
"libphonenumber-js": "1.12.30",
|
|
191
197
|
"parse5": "8.0.1",
|
|
192
198
|
"semver": "7.8.5",
|
|
199
|
+
"sharp": "0.35.4",
|
|
193
200
|
"winston": "3.19.0",
|
|
194
201
|
"winston-loki": "6.1.7",
|
|
195
202
|
"zod": "^4.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commerce/selection.ts","../src/commerce/product-context.ts"],"sourcesContent":["import { IdSchema } from \"./primitives\";\nimport {\n CommerceAnswerPresentationSelectionSchema,\n type CommerceAnswerPresentationSelection,\n type CommerceManifest,\n CommerceManifestSchema,\n type CommerceConversationGrant,\n CommerceConversationGrantSchema,\n} from \"./schemas\";\nimport { GrantedToolsSchema, PublishedToolDescriptorSchema, type GrantedTool, type PublishedGrantedTool, type PublishedToolDescriptor, type CommerceBuiltInToolDescriptor, isBuiltInTool } from \"./definitions\";\nimport { isTrustedCommerceBuiltInDescriptor, isTrustedCommerceBuiltInGrant } from \"./built-in-tools\";\nimport { canonicalJson } from \"./canonical-json\";\nexport type FeatureFacts = {\n id: string;\n active: boolean;\n planMappingEnabled: boolean;\n mode: \"ALWAYS_ENABLED\" | \"MERCHANT_OPT_IN\";\n preferenceEnabled: boolean | null;\n};\nexport function selectCapabilities(\n candidates: Array<{\n key: string;\n featureId: string;\n enabled: boolean;\n position: number;\n }>,\n facts: {\n features: FeatureFacts[];\n },\n) {\n for (const candidate of candidates) {\n IdSchema.parse(candidate.key);\n IdSchema.parse(candidate.featureId);\n if (!Number.isSafeInteger(candidate.position) || candidate.position < 0)\n throw new TypeError(\"Invalid capability position\");\n }\n const selected = candidates\n .filter((c) => {\n if (!c.enabled) return false;\n const f = facts.features.find((f) => f.id === c.featureId);\n return (\n !!f &&\n f.active &&\n f.planMappingEnabled &&\n (f.mode === \"ALWAYS_ENABLED\" || f.preferenceEnabled === true)\n );\n })\n .sort((a, b) => a.position - b.position);\n if (\n new Set(selected.map((c) => c.key)).size !== selected.length ||\n new Set(selected.map((c) => c.position)).size !== selected.length\n )\n throw new TypeError(\"Duplicate release membership\");\n return selected.map((c) => c.key);\n}\nexport function deduplicateTools(\n capabilities: Array<{ key: string; toolDescriptor: PublishedToolDescriptor }>,\n builtInTools: readonly CommerceBuiltInToolDescriptor[] = [],\n): GrantedTool[] {\n const byId = new Map<string, { tool: PublishedGrantedTool; descriptor: string }>();\n const names = new Map<string, string>();\n for (const cap of capabilities) {\n const d = PublishedToolDescriptorSchema.parse(cap.toolDescriptor);\n const previous = byId.get(d.toolId);\n const descriptor = canonicalJson(d);\n if (\n (previous && previous.descriptor !== descriptor) ||\n (names.has(d.name) && names.get(d.name) !== d.toolId)\n )\n throw new TypeError(\"Conflicting tool association\");\n names.set(d.name, d.toolId);\n if (previous)\n previous.tool.capabilityKeys = [\n ...new Set([...previous.tool.capabilityKeys, cap.key]),\n ].sort();\n else\n byId.set(d.toolId, {\n descriptor,\n tool: {\n toolId: d.toolId,\n toolRevisionId: d.toolRevisionId,\n toolName: d.name,\n definitionVersion: d.definitionVersion,\n capabilityKeys: [cap.key],\n },\n });\n }\n if (builtInTools.some(tool => !isTrustedCommerceBuiltInDescriptor(tool)))\n throw new TypeError(\"Untrusted built-in descriptor\");\n return GrantedToolsSchema.parse([\n ...[...byId.values()].map(value => value.tool),\n ...builtInTools.map(tool => ({\n kind: \"BUILT_IN\" as const, toolName: tool.name,\n definitionVersion: tool.definitionVersion,\n })),\n ]).sort((a, b) => a.toolName.localeCompare(b.toolName, \"en\"));\n}\nexport function manifestMatchesGrant(\n manifest: CommerceManifest,\n grant: CommerceConversationGrant,\n) {\n if (!CommerceManifestSchema.safeParse(manifest).success || !CommerceConversationGrantSchema.safeParse(grant).success) return false;\n return (\n manifest.releaseId === grant.releaseId &&\n canonicalJson(manifest.purposeProfile ?? null) === canonicalJson(grant.purposeProfile ?? null) &&\n canonicalJson(manifest.selectedCapabilityKeys) ===\n canonicalJson(grant.selectedCapabilityKeys) &&\n canonicalJson(\n [...manifest.grantedTools].sort((a, b) =>\n a.toolName.localeCompare(b.toolName),\n ),\n ) ===\n canonicalJson(\n [...grant.grantedTools].sort((a, b) =>\n a.toolName.localeCompare(b.toolName),\n ),\n )\n );\n}\nexport const parseCommerceManifest = (raw: unknown) =>\n CommerceManifestSchema.parse(raw);\nexport function currentlyGrantedTools(\n grant: CommerceConversationGrant,\n eligibleCapabilityKeys: ReadonlySet<string>,\n enabledToolIds: ReadonlySet<string>,\n allowedBuiltInTools: readonly CommerceBuiltInToolDescriptor[] = [],\n) {\n return grant.grantedTools.filter(\n (t) =>\n isBuiltInTool(t)\n ? isTrustedCommerceBuiltInGrant(t) && allowedBuiltInTools.some(descriptor =>\n isTrustedCommerceBuiltInDescriptor(descriptor) && descriptor.name === t.toolName &&\n descriptor.definitionVersion === t.definitionVersion)\n : enabledToolIds.has(t.toolId) && t.capabilityKeys.some((k) => eligibleCapabilityKeys.has(k)),\n );\n}\n\n/** Validate model-selected identities; hosts must still authorize and freshly verify facts. */\nexport function verifyCommerceAnswerPresentationSelection(raw: unknown):\n | { kind: \"verified\"; selection: CommerceAnswerPresentationSelection }\n | { kind: \"limitation\"; reason: \"INVALID_SELECTION\" } {\n const parsed = CommerceAnswerPresentationSelectionSchema.safeParse(raw);\n if (!parsed.success || (parsed.data.productOptionSelections?.length && parsed.data.productDetailSelections?.length))\n return { kind: \"limitation\", reason: \"INVALID_SELECTION\" };\n return { kind: \"verified\", selection: parsed.data };\n}\n","import { z } from \"zod\";\nimport { CommerceProductSchema, CommerceProductSelectedOptionsSchema } from \"./schemas.js\";\nconst id = z.string().min(1).max(128);\nconst date = z.iso.datetime({offset:false});\nexport const CommerceConversationProductContextSchema = z.strictObject({schemaVersion:z.literal(1),shopId:id,conversationId:id,platform:z.enum([\"SHOPIFY\",\"WOOCOMMERCE\"]),references:z.array(z.strictObject({productId:id,variantId:id.nullable(),title:z.string().min(1).max(512),selectedOptions:CommerceProductSelectedOptionsSchema.optional(),observedAt:date})).max(20),presentation:z.strictObject({references:z.array(z.strictObject({productId:id,variantId:id.nullable()})).max(3),presentedAt:date}).optional(),updatedAt:date}).superRefine((v,c)=>{\n const pairs=v.presentation?.references??[];\n if(new Set(pairs.map(r=>JSON.stringify([r.productId,r.variantId]))).size!==pairs.length||pairs.some(p=>!v.references.some(r=>r.productId===p.productId&&r.variantId===p.variantId)))c.addIssue({code:'custom',message:'Invalid product presentation'});\n const valid=(value:string,kind:string)=>v.platform === \"SHOPIFY\" ? new RegExp(`^gid://shopify/${kind}/[1-9][0-9]*$`).test(value) : /^[1-9][0-9]*$/.test(value) && Number.isSafeInteger(Number(value));\n if(v.references.some(r=>!valid(r.productId,\"Product\")||(r.variantId!==null&&!valid(r.variantId,\"ProductVariant\")))||new TextEncoder().encode(JSON.stringify(v)).length>32768)c.addIssue({code:\"custom\",message:\"Invalid product context\"});\n});\nexport type CommerceConversationProductContext = z.infer<typeof CommerceConversationProductContextSchema>;\nexport type CommerceProductObservation = {toolName:string;products:z.infer<typeof CommerceProductSchema>[];observedAt:string};\nexport type CommerceProductContextIdentity = {shopId:string;conversationId:string;platform:\"SHOPIFY\"|\"WOOCOMMERCE\";now:number};\nexport function mergeConversationProductContext(previous:CommerceConversationProductContext|null,observations:readonly CommerceProductObservation[],identity:CommerceProductContextIdentity):CommerceConversationProductContext {\n id.parse(identity.shopId);id.parse(identity.conversationId);z.enum([\"SHOPIFY\",\"WOOCOMMERCE\"]).parse(identity.platform);if(!Number.isFinite(identity.now))throw new Error(\"PRODUCT_CONTEXT_TIME_INVALID\");\n let admitted=false;\n if(previous){previous=CommerceConversationProductContextSchema.parse(previous);if(previous.shopId!==identity.shopId||previous.conversationId!==identity.conversationId||previous.platform!==identity.platform)throw new Error(\"PRODUCT_CONTEXT_IDENTITY_MISMATCH\");}\n const fresh=(time:string)=>Number.isFinite(Date.parse(time))&&Date.parse(time)<=identity.now&&Date.parse(time)>=identity.now-86400000;\n const entries=new Map<string,CommerceConversationProductContext[\"references\"][number]>();\n const add=(r:CommerceConversationProductContext[\"references\"][number])=>{if(!fresh(r.observedAt))return;const key=JSON.stringify([r.productId,r.variantId]);const old=entries.get(key);if(!old||Date.parse(r.observedAt)>=Date.parse(old.observedAt))entries.set(key,r);};\n if(previous&&fresh(previous.updatedAt))previous.references.forEach(add);\n for(const o of observations){if(![\"commerce_search_products\",\"commerce_get_product\"].includes(o.toolName)||!fresh(o.observedAt))continue;for(const raw of o.products){const p=CommerceProductSchema.parse(raw);admitted=true;add({productId:p.productId,variantId:p.variantId,title:p.title,...(p.selectedOptions!==undefined?{selectedOptions:p.selectedOptions}:{}),observedAt:o.observedAt});}}\n const references=[...entries.values()].sort((a,b)=>Date.parse(b.observedAt)-Date.parse(a.observedAt)||(a.productId<b.productId?-1:a.productId>b.productId?1:0)||((a.variantId??\"\")<(b.variantId??\"\")?-1:(a.variantId??\"\")>(b.variantId??\"\")?1:0)).slice(0,20);\n const result:CommerceConversationProductContext={schemaVersion:1 as const,shopId:identity.shopId,conversationId:identity.conversationId,platform:identity.platform,references,updatedAt:admitted?new Date(identity.now).toISOString():previous&&fresh(previous.updatedAt)?previous.updatedAt:new Date(identity.now).toISOString()};\n if(previous?.presentation&&fresh(previous.presentation.presentedAt)&&previous.presentation.references.every(p=>references.some(r=>r.productId===p.productId&&r.variantId===p.variantId)))result.presentation=previous.presentation;\n while(references.length&&new TextEncoder().encode(JSON.stringify(result)).length>32768){references.pop();if(result.presentation?.references.some(p=>!references.some(r=>r.productId===p.productId&&r.variantId===p.variantId)))delete result.presentation;}\n return CommerceConversationProductContextSchema.parse(result);\n}\nexport function resolveConversationProductReference(context:CommerceConversationProductContext,reference:{productId?:string;variantId?:string|null;title?:string}):{kind:\"MATCH\";productId:string;variantId:string|null}|{kind:\"AMBIGUOUS\"}|{kind:\"MISSING\"}{\n const parsed=CommerceConversationProductContextSchema.parse(context);\n const matches=parsed.references.filter(r=>(reference.productId!==undefined?r.productId===reference.productId:reference.title!==undefined&&r.title.trim().toLowerCase()===reference.title.trim().toLowerCase())&&(reference.variantId===undefined||r.variantId===reference.variantId));\n const unique=[...new Map(matches.map(r=>[JSON.stringify([r.productId,r.variantId]),r])).values()];return unique.length===1?{kind:\"MATCH\",productId:unique[0]!.productId,variantId:unique[0]!.variantId}:unique.length>1?{kind:\"AMBIGUOUS\"}:{kind:\"MISSING\"};\n}\n\n/** Record only exact pairs actually composed by the host; references remain stale labels. */\nexport function recordCommerceProductPresentation(context:CommerceConversationProductContext,pairs:readonly {productId:string;variantId:string|null}[],identity:CommerceProductContextIdentity):CommerceConversationProductContext {\n const fresh=mergeConversationProductContext(context,[],identity);\n const parsed=z.array(z.strictObject({productId:id,variantId:id.nullable()})).max(3).safeParse(pairs);\n if(!parsed.success||new Set(pairs.map(p=>JSON.stringify([p.productId,p.variantId]))).size!==pairs.length||pairs.some(p=>!fresh.references.some(r=>r.productId===p.productId&&r.variantId===p.variantId)))throw new Error('PRODUCT_PRESENTATION_INVALID');\n const result:CommerceConversationProductContext={...fresh,presentation:{references:parsed.data,presentedAt:new Date(identity.now).toISOString()}};\n while(result.references.length&&new TextEncoder().encode(JSON.stringify(result)).length>32768){result.references.pop();if(result.presentation?.references.some(p=>!result.references.some(r=>r.productId===p.productId&&r.variantId===p.variantId)))delete result.presentation;}\n return CommerceConversationProductContextSchema.parse(result);\n}\n"],"mappings":"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","names":["f"]}
|