@modainteract/moda-interact-shared 5.4.0 → 5.6.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.
@@ -0,0 +1,148 @@
1
+ import {
2
+ CommerceConversationGrantSchema,
3
+ CommerceManifestSchema,
4
+ CommerceProductSchema,
5
+ GrantedToolsSchema,
6
+ PublishedToolDescriptorSchema,
7
+ isBuiltInTool,
8
+ isTrustedCommerceBuiltInDescriptor,
9
+ isTrustedCommerceBuiltInGrant
10
+ } from "./chunk-S42O2OCG.js";
11
+ import {
12
+ IdSchema
13
+ } from "./chunk-QVPEX7KY.js";
14
+ import {
15
+ canonicalJson
16
+ } from "./chunk-AUS3WQIW.js";
17
+
18
+ // src/commerce/selection.ts
19
+ function selectCapabilities(candidates, facts) {
20
+ for (const candidate of candidates) {
21
+ IdSchema.parse(candidate.key);
22
+ IdSchema.parse(candidate.featureId);
23
+ if (!Number.isSafeInteger(candidate.position) || candidate.position < 0)
24
+ throw new TypeError("Invalid capability position");
25
+ }
26
+ const selected = candidates.filter((c) => {
27
+ if (!c.enabled) return false;
28
+ const f = facts.features.find((f2) => f2.id === c.featureId);
29
+ return !!f && f.active && f.planMappingEnabled && (f.mode === "ALWAYS_ENABLED" || f.preferenceEnabled === true);
30
+ }).sort((a, b) => a.position - b.position);
31
+ if (new Set(selected.map((c) => c.key)).size !== selected.length || new Set(selected.map((c) => c.position)).size !== selected.length)
32
+ throw new TypeError("Duplicate release membership");
33
+ return selected.map((c) => c.key);
34
+ }
35
+ function deduplicateTools(capabilities, builtInTools = []) {
36
+ const byId = /* @__PURE__ */ new Map();
37
+ const names = /* @__PURE__ */ new Map();
38
+ for (const cap of capabilities) {
39
+ const d = PublishedToolDescriptorSchema.parse(cap.toolDescriptor);
40
+ const previous = byId.get(d.toolId);
41
+ const descriptor = canonicalJson(d);
42
+ if (previous && previous.descriptor !== descriptor || names.has(d.name) && names.get(d.name) !== d.toolId)
43
+ throw new TypeError("Conflicting tool association");
44
+ names.set(d.name, d.toolId);
45
+ if (previous)
46
+ previous.tool.capabilityKeys = [
47
+ .../* @__PURE__ */ new Set([...previous.tool.capabilityKeys, cap.key])
48
+ ].sort();
49
+ else
50
+ byId.set(d.toolId, {
51
+ descriptor,
52
+ tool: {
53
+ toolId: d.toolId,
54
+ toolRevisionId: d.toolRevisionId,
55
+ toolName: d.name,
56
+ definitionVersion: d.definitionVersion,
57
+ capabilityKeys: [cap.key]
58
+ }
59
+ });
60
+ }
61
+ if (builtInTools.some((tool) => !isTrustedCommerceBuiltInDescriptor(tool)))
62
+ throw new TypeError("Untrusted built-in descriptor");
63
+ return GrantedToolsSchema.parse([
64
+ ...[...byId.values()].map((value) => value.tool),
65
+ ...builtInTools.map((tool) => ({
66
+ kind: "BUILT_IN",
67
+ toolName: tool.name,
68
+ definitionVersion: tool.definitionVersion
69
+ }))
70
+ ]).sort((a, b) => a.toolName.localeCompare(b.toolName, "en"));
71
+ }
72
+ function manifestMatchesGrant(manifest, grant) {
73
+ if (!CommerceManifestSchema.safeParse(manifest).success || !CommerceConversationGrantSchema.safeParse(grant).success) return false;
74
+ return manifest.releaseId === grant.releaseId && canonicalJson(manifest.purposeProfile ?? null) === canonicalJson(grant.purposeProfile ?? null) && canonicalJson(manifest.selectedCapabilityKeys) === canonicalJson(grant.selectedCapabilityKeys) && canonicalJson(
75
+ [...manifest.grantedTools].sort(
76
+ (a, b) => a.toolName.localeCompare(b.toolName)
77
+ )
78
+ ) === canonicalJson(
79
+ [...grant.grantedTools].sort(
80
+ (a, b) => a.toolName.localeCompare(b.toolName)
81
+ )
82
+ );
83
+ }
84
+ var parseCommerceManifest = (raw) => CommerceManifestSchema.parse(raw);
85
+ function currentlyGrantedTools(grant, eligibleCapabilityKeys, enabledToolIds, allowedBuiltInTools = []) {
86
+ return grant.grantedTools.filter(
87
+ (t) => isBuiltInTool(t) ? isTrustedCommerceBuiltInGrant(t) && allowedBuiltInTools.some((descriptor) => isTrustedCommerceBuiltInDescriptor(descriptor) && descriptor.name === t.toolName && descriptor.definitionVersion === t.definitionVersion) : enabledToolIds.has(t.toolId) && t.capabilityKeys.some((k) => eligibleCapabilityKeys.has(k))
88
+ );
89
+ }
90
+
91
+ // src/commerce/product-context.ts
92
+ import { z } from "zod";
93
+ var id = z.string().min(1).max(128);
94
+ var date = z.iso.datetime({ offset: false });
95
+ var 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), observedAt: date })).max(20), updatedAt: date }).superRefine((v, c) => {
96
+ const valid = (value, kind) => v.platform === "SHOPIFY" ? new RegExp(`^gid://shopify/${kind}/[1-9][0-9]*$`).test(value) : /^[1-9][0-9]*$/.test(value) && Number.isSafeInteger(Number(value));
97
+ 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" });
98
+ });
99
+ function mergeConversationProductContext(previous, observations, identity) {
100
+ id.parse(identity.shopId);
101
+ id.parse(identity.conversationId);
102
+ z.enum(["SHOPIFY", "WOOCOMMERCE"]).parse(identity.platform);
103
+ if (!Number.isFinite(identity.now)) throw new Error("PRODUCT_CONTEXT_TIME_INVALID");
104
+ let admitted = false;
105
+ if (previous) {
106
+ previous = CommerceConversationProductContextSchema.parse(previous);
107
+ if (previous.shopId !== identity.shopId || previous.conversationId !== identity.conversationId || previous.platform !== identity.platform) throw new Error("PRODUCT_CONTEXT_IDENTITY_MISMATCH");
108
+ }
109
+ const fresh = (time) => Number.isFinite(Date.parse(time)) && Date.parse(time) <= identity.now && Date.parse(time) >= identity.now - 864e5;
110
+ const entries = /* @__PURE__ */ new Map();
111
+ const add = (r) => {
112
+ if (!fresh(r.observedAt)) return;
113
+ const key = JSON.stringify([r.productId, r.variantId]);
114
+ const old = entries.get(key);
115
+ if (!old || Date.parse(r.observedAt) >= Date.parse(old.observedAt)) entries.set(key, r);
116
+ };
117
+ if (previous && fresh(previous.updatedAt)) previous.references.forEach(add);
118
+ for (const o of observations) {
119
+ if (!["commerce_search_products", "commerce_get_product"].includes(o.toolName) || !fresh(o.observedAt)) continue;
120
+ for (const raw of o.products) {
121
+ const p = CommerceProductSchema.parse(raw);
122
+ admitted = true;
123
+ add({ productId: p.productId, variantId: p.variantId, title: p.title, observedAt: o.observedAt });
124
+ }
125
+ }
126
+ 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);
127
+ const result = { schemaVersion: 1, 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() };
128
+ while (references.length && new TextEncoder().encode(JSON.stringify(result)).length > 32768) references.pop();
129
+ return CommerceConversationProductContextSchema.parse(result);
130
+ }
131
+ function resolveConversationProductReference(context, reference) {
132
+ const parsed = CommerceConversationProductContextSchema.parse(context);
133
+ const matches = parsed.references.filter((r) => (reference.productId !== void 0 ? r.productId === reference.productId : reference.title !== void 0 && r.title.trim().toLowerCase() === reference.title.trim().toLowerCase()) && (reference.variantId === void 0 || r.variantId === reference.variantId));
134
+ const unique = [...new Map(matches.map((r) => [JSON.stringify([r.productId, r.variantId]), r])).values()];
135
+ return unique.length === 1 ? { kind: "MATCH", productId: unique[0].productId, variantId: unique[0].variantId } : unique.length > 1 ? { kind: "AMBIGUOUS" } : { kind: "MISSING" };
136
+ }
137
+
138
+ export {
139
+ selectCapabilities,
140
+ deduplicateTools,
141
+ manifestMatchesGrant,
142
+ parseCommerceManifest,
143
+ currentlyGrantedTools,
144
+ CommerceConversationProductContextSchema,
145
+ mergeConversationProductContext,
146
+ resolveConversationProductReference
147
+ };
148
+ //# sourceMappingURL=chunk-KIHGDO35.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commerce/selection.ts","../src/commerce/product-context.ts"],"sourcesContent":["import { IdSchema } from \"./primitives\";\nimport {\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","import { z } from \"zod\";\nimport { CommerceProductSchema } 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),observedAt:date})).max(20),updatedAt:date}).superRefine((v,c)=>{\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,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={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 while(references.length&&new TextEncoder().encode(JSON.stringify(result)).length>32768)references.pop();\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"],"mappings":"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","names":["f"]}