@modainteract/moda-interact-shared 5.11.0 → 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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commerce/presentation/facts.ts","../../../src/commerce/presentation/fact-messages.ts","../../../src/commerce/presentation/schemas.ts","../../../src/commerce/presentation/option-messages.ts","../../../src/commerce/presentation/messages.ts","../../../src/commerce/presentation/options.ts","../../../src/commerce/presentation/format.ts","../../../src/commerce/presentation/money.ts","../../../src/commerce/presentation/render.ts","../../../src/commerce/presentation/candidates.ts","../../../src/commerce/presentation/shipping.ts","../../../src/commerce/presentation/wrapper-projection.ts","../../../src/commerce/presentation/wrapper-render.ts","../../../src/commerce/presentation/wrapper-selection.ts","../../../src/commerce/presentation/compose.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { CommerceProductStockSchema, CommerceProductSchema, CommerceProductOptionsSchema, CommerceProductSelectedOptionsSchema } from \"../schemas.js\";\nimport { CommerceProductDescriptionSchema, CommerceProductAttributesSchema } from \"../product-facts.js\";\nimport type { ModaSupportedLanguageTag } from \"../../internationalization.js\";\nimport { DateSchema } from \"../primitives.js\";\nimport { stockFactMessages } from \"./fact-messages.js\";\nimport { productFactMessages } from \"./fact-messages.js\";\nexport const CommerceProductFactSchema = z.strictObject({stock:CommerceProductStockSchema,observedAt:DateSchema,productId:z.string().min(1).max(128),variantId:z.string().min(1).max(128).nullable(),title:z.string().min(1).max(512),description:CommerceProductDescriptionSchema,attributes:CommerceProductAttributesSchema,options:CommerceProductOptionsSchema,selectedOptions:CommerceProductSelectedOptionsSchema});\nexport type CommerceProductFact = z.infer<typeof CommerceProductFactSchema>;\nexport function verifyCommerceProductFacts(selection: readonly {productId:string;variantId:string|null}[], currentProducts: readonly unknown[]): {kind:\"verified\";productFacts:CommerceProductFact[]}|{kind:\"limitation\";reason:\"INVALID_SELECTION\"|\"PRODUCT_NOT_FOUND\"|\"PRODUCT_INVALID\"} {\n const parsed=z.array(z.strictObject({productId:z.string().min(1).max(128),variantId:z.string().min(1).max(128).nullable()})).max(3).safeParse(selection);\n if(!parsed.success||new Set(selection.map(s=>JSON.stringify([s.productId,s.variantId]))).size!==selection.length)return {kind:\"limitation\",reason:\"INVALID_SELECTION\"};\n const facts:CommerceProductFact[]=[];\n for(const selected of parsed.data){const matches=currentProducts.filter(p=>p&&typeof p===\"object\"&&(p as {productId?:unknown}).productId===selected.productId&&(p as {variantId?:unknown}).variantId===selected.variantId);if(matches.length!==1)return {kind:\"limitation\",reason:\"PRODUCT_NOT_FOUND\"};const product=CommerceProductSchema.safeParse(matches[0]);if(!product.success)return {kind:\"limitation\",reason:\"PRODUCT_INVALID\"};facts.push({stock:product.data.stock??{status:'UNAVAILABLE'},observedAt:product.data.observedAt,productId:product.data.productId,variantId:product.data.variantId,title:product.data.title,description:product.data.description??{status:\"PARTIAL\",text:\"\"},attributes:product.data.attributes??{status:\"PARTIAL\",items:[]},options:product.data.options??{status:\"PARTIAL\",items:[]},selectedOptions:product.data.selectedOptions??[]});}\n return {kind:\"verified\",productFacts:facts};\n}\nexport function renderCommerceProductFacts(facts:readonly CommerceProductFact[],locale:ModaSupportedLanguageTag):string {\n const [unavailable,incomplete,selected]=productFactMessages[locale];if(!facts.length)return unavailable;\n return facts.map(f=>{\n const labels=stockFactMessages[locale];\n const lines:string[]=[f.stock.status==='KNOWN'?`${f.stock.scope==='VARIANT'?labels[1]:labels[0]}: ${new Intl.NumberFormat(locale).format(f.stock.quantity)}`:f.stock.status==='NOT_TRACKED'?labels[2]:labels[3]];\n if(f.description.text)lines.push(f.description.text);\n const selectedLines = [...new Set(f.selectedOptions.map(o=>`${o.name}: ${o.value}`))];\n const factLines = [...f.attributes.items.map(a=>`${a.name}: ${a.values.length?a.values.join(\", \"):unavailable}`),...f.options.items.filter(o=>!f.attributes.items.some(a=>a.name===o.name&&JSON.stringify(a.values)===JSON.stringify(o.values))).map(o=>`${o.name}: ${o.values.length?o.values.join(\", \"):unavailable}`)];\n lines.push(...new Set(factLines.filter(line=>!selectedLines.includes(line))));\n if(selectedLines.length)lines.push(`${selected}:`,...selectedLines);\n if(!f.description.text&&!f.attributes.items.some(a=>a.values.length)&&!f.options.items.some(o=>o.values.length)&&!selectedLines.length)lines.push(unavailable);\n if([f.description.status,f.attributes.status,f.options.status].includes(\"PARTIAL\"))lines.push(incomplete);\n return [f.title,...lines].join(\"\\n\");\n }).join(\"\\n\\n\");\n}\n","import type { ModaSupportedLanguageTag } from \"../../internationalization.js\";\nconst labels: Record<ModaSupportedLanguageTag, readonly [string,string,string]> = {\n \"zh-Hans\":[\"商品详情不可用。\",\"商品信息不完整。\",\"所选选项\"],\"zh-Hant\":[\"商品詳情無法取得。\",\"商品資訊不完整。\",\"所選選項\"],\n cs:[\"Podrobnosti produktu nejsou dostupné.\",\"Informace o produktu jsou neúplné.\",\"Vybrané možnosti\"],da:[\"Produktoplysninger er ikke tilgængelige.\",\"Produktoplysningerne er ufuldstændige.\",\"Valgte muligheder\"],nl:[\"Productdetails zijn niet beschikbaar.\",\"De productinformatie is onvolledig.\",\"Geselecteerde opties\"],en:[\"Product details are unavailable.\",\"Product information is incomplete.\",\"Selected options\"],fi:[\"Tuotetietoja ei ole saatavilla.\",\"Tuotetiedot ovat puutteelliset.\",\"Valitut vaihtoehdot\"],fr:[\"Les détails du produit sont indisponibles.\",\"Les informations du produit sont incomplètes.\",\"Options sélectionnées\"],de:[\"Produktdetails sind nicht verfügbar.\",\"Die Produktinformationen sind unvollständig.\",\"Ausgewählte Optionen\"],it:[\"I dettagli del prodotto non sono disponibili.\",\"Le informazioni sul prodotto sono incomplete.\",\"Opzioni selezionate\"],ja:[\"商品詳細を確認できません。\",\"商品情報は完全ではありません。\",\"選択したオプション\"],ko:[\"제품 세부 정보를 확인할 수 없습니다.\",\"제품 정보가 완전하지 않습니다.\",\"선택한 옵션\"],nb:[\"Produktdetaljer er ikke tilgjengelige.\",\"Produktinformasjonen er ufullstendig.\",\"Valgte alternativer\"],pl:[\"Szczegóły produktu są niedostępne.\",\"Informacje o produkcie są niepełne.\",\"Wybrane opcje\"],\"pt-BR\":[\"Os detalhes do produto estão indisponíveis.\",\"As informações do produto estão incompletas.\",\"Opções selecionadas\"],\"pt-PT\":[\"Os detalhes do produto estão indisponíveis.\",\"As informações do produto estão incompletas.\",\"Opções selecionadas\"],es:[\"Los detalles del producto no están disponibles.\",\"La información del producto está incompleta.\",\"Opciones seleccionadas\"],sv:[\"Produktinformation är inte tillgänglig.\",\"Produktinformationen är ofullständig.\",\"Valda alternativ\"],th:[\"ไม่มีรายละเอียดสินค้า\",\"ข้อมูลสินค้าไม่ครบถ้วน\",\"ตัวเลือกที่เลือก\"],tr:[\"Ürün ayrıntıları mevcut değil.\",\"Ürün bilgileri eksik.\",\"Seçilen seçenekler\"]};\nexport const productFactMessages = Object.freeze(labels);\n\n/** Aggregate sellable counts for the exact selected identity, never a fulfillment promise. */\nexport const stockFactMessages:Readonly<Record<ModaSupportedLanguageTag,readonly [string,string,string,string]>>=Object.freeze({\n en:['Stock (product)','Stock (selected variant)','Stock is not tracked.','Stock is unavailable.'],\n 'zh-Hans':['库存(商品)','库存(所选款式)','未跟踪库存。','库存信息不可用。'],\n 'zh-Hant':['庫存(商品)','庫存(所選款式)','未追蹤庫存。','庫存資訊無法取得。'],\n cs:['Zásoby (produkt)','Zásoby (vybraná varianta)','Zásoby nejsou sledovány.','Zásoby nejsou dostupné.'],\n da:['Lager (produkt)','Lager (valgt variant)','Lager spores ikke.','Lageroplysninger er ikke tilgængelige.'],\n nl:['Voorraad (product)','Voorraad (geselecteerde variant)','Voorraad wordt niet bijgehouden.','Voorraad is niet beschikbaar.'],\n fi:['Varasto (tuote)','Varasto (valittu vaihtoehto)','Varastoa ei seurata.','Varastotietoja ei ole saatavilla.'],\n fr:['Stock (produit)','Stock (variante sélectionnée)','Le stock n’est pas suivi.','Le stock est indisponible.'],\n de:['Bestand (Produkt)','Bestand (ausgewählte Variante)','Der Bestand wird nicht verfolgt.','Der Bestand ist nicht verfügbar.'],\n it:['Scorte (prodotto)','Scorte (variante selezionata)','Le scorte non sono monitorate.','Le scorte non sono disponibili.'],\n ja:['在庫(商品)','在庫(選択したバリエーション)','在庫は追跡されていません。','在庫情報を確認できません。'],\n ko:['재고 (제품)','재고 (선택한 옵션)','재고를 추적하지 않습니다.','재고 정보를 확인할 수 없습니다.'],\n nb:['Lager (produkt)','Lager (valgt variant)','Lager spores ikke.','Lagerinformasjon er ikke tilgjengelig.'],\n pl:['Stan magazynowy (produkt)','Stan magazynowy (wybrany wariant)','Stan magazynowy nie jest śledzony.','Stan magazynowy jest niedostępny.'],\n 'pt-BR':['Estoque (produto)','Estoque (variante selecionada)','O estoque não é acompanhado.','O estoque está indisponível.'],\n 'pt-PT':['Stock (produto)','Stock (variante selecionada)','O stock não é acompanhado.','O stock está indisponível.'],\n es:['Existencias (producto)','Existencias (variante seleccionada)','No se realiza seguimiento de existencias.','Las existencias no están disponibles.'],\n sv:['Lager (produkt)','Lager (vald variant)','Lager spåras inte.','Lagerinformation är inte tillgänglig.'],\n th:['สต็อก (สินค้า)','สต็อก (ตัวเลือกที่เลือก)','ไม่มีการติดตามสต็อก','ไม่มีข้อมูลสต็อก'],\n tr:['Stok (ürün)','Stok (seçilen varyant)','Stok takip edilmiyor.','Stok bilgisi mevcut değil.']\n});\n","import { CommerceProductFactSchema } from \"./facts.js\";\nimport { z } from \"zod\";\nimport { ModaSupportedLanguageTagSchema } from \"../../internationalization.js\";\nimport { CommerceOptionFactSchema } from \"./options.js\";\nconst safeUrl=z.string().max(2048).refine(value=>{try{const u=new URL(value);return !/[\\x00-\\x1f\\x7f]/.test(value)&&!u.hostname.startsWith(\"[\")&&!/^[0-9.]+$/.test(u.hostname)&&u.hostname!==\"localhost\"&&!u.hostname.endsWith(\".localhost\")&&u.protocol===\"https:\"&&!u.username&&!u.password&&!u.port&&!u.hash;}catch{return false;}});\nconst product=z.strictObject({title:z.string().min(1).max(512),url:safeUrl,quantity:z.number().int().min(1).max(Number.MAX_SAFE_INTEGER),scope:z.enum([\"PRODUCT_ONLY\",\"ADD_TO_BASKET\",\"REPLACE_BASKET_LINE\"]),currentPrice:z.string().max(128).nullable(),currency:z.string().regex(/^[A-Z]{3}$/).nullable(),regularPrice:z.string().max(128).nullable().optional(),offerTerms:z.array(z.strictObject({kind:z.enum([\"percent\",\"amount\",\"free-shipping\"]),value:z.string().max(128).optional(),currency:z.string().regex(/^[A-Z]{3}$/).optional(),code:z.string().max(128).nullable().optional(),automatic:z.boolean().optional()})).max(32).optional()});\nexport const CommerceVerifiedPresentationSchema=z.strictObject({schemaVersion:z.literal(1),brandName:z.string().min(1).max(512).nullable(),locale:ModaSupportedLanguageTagSchema,disposition:z.enum([\"STANDARD\",\"OUT_OF_SCOPE_REDIRECT\",\"SHIPPING_INFORMATION_UNVERIFIED\",\"PRODUCT_OPTIONS\",\"PRODUCT_DETAILS\"]),storeUrl:safeUrl.refine(value=>!new URL(value).search),products:z.array(product).max(3),productFacts:z.array(CommerceProductFactSchema).max(3).default([]),optionFacts:z.array(CommerceOptionFactSchema).max(3),requiresShipping:z.boolean().nullable(),policyUrl:safeUrl.refine(value=>!new URL(value).search).nullable(),includeNoVerifiedOffer:z.boolean()}).superRefine((v,c)=>{if(v.disposition===\"PRODUCT_DETAILS\"&&(!v.productFacts.length||v.optionFacts.length||v.products.length))c.addIssue({code:\"custom\",message:\"Invalid product details combination\"});try {const origin=new URL(v.storeUrl).origin;if(v.products.some(p=>new URL(p.url).origin!==origin)||(v.policyUrl&&new URL(v.policyUrl).origin!==origin))c.addIssue({code:\"custom\",message:\"Presentation URL is outside current shop\"});} catch {c.addIssue({code:\"custom\",message:\"Invalid presentation URL\"});}});\nexport type CommerceVerifiedPresentation=z.input<typeof CommerceVerifiedPresentationSchema>;\n","import type { ModaSupportedLanguageTag } from \"../../internationalization.js\";\n// Full locale coverage mirrors the recommendation catalogue. Labels describe\n// supplied facts only; they never assert stock or infer unnamed option values.\nconst labels: Record<ModaSupportedLanguageTag, readonly [string,string,string]> = {\n \"zh-Hans\":[\"选项详情不可用。\",\"选项列表不完整。\",\"所选选项\"],\"zh-Hant\":[\"選項詳情無法取得。\",\"選項清單不完整。\",\"所選選項\"],\n cs:[\"Podrobnosti možností nejsou dostupné.\",\"Seznam možností není úplný.\",\"Vybrané možnosti\"],da:[\"Oplysninger om valgmuligheder er ikke tilgængelige.\",\"Listen over valgmuligheder er ufuldstændig.\",\"Valgte muligheder\"],nl:[\"Optiedetails zijn niet beschikbaar.\",\"De optielijst is onvolledig.\",\"Geselecteerde opties\"],en:[\"Option details are unavailable.\",\"The option list is incomplete.\",\"Selected options\"],fi:[\"Vaihtoehtojen tiedot eivät ole saatavilla.\",\"Vaihtoehtoluettelo on puutteellinen.\",\"Valitut vaihtoehdot\"],fr:[\"Les détails des options sont indisponibles.\",\"La liste des options est incomplète.\",\"Options sélectionnées\"],de:[\"Optionsdetails sind nicht verfügbar.\",\"Die Optionsliste ist unvollständig.\",\"Ausgewählte Optionen\"],it:[\"I dettagli delle opzioni non sono disponibili.\",\"L’elenco delle opzioni è incompleto.\",\"Opzioni selezionate\"],ja:[\"オプションの詳細は確認できません。\",\"オプション一覧は完全ではありません。\",\"選択したオプション\"],ko:[\"옵션 세부 정보를 확인할 수 없습니다.\",\"옵션 목록이 완전하지 않습니다.\",\"선택한 옵션\"],nb:[\"Alternativdetaljer er ikke tilgjengelige.\",\"Listen over alternativer er ufullstendig.\",\"Valgte alternativer\"],pl:[\"Szczegóły opcji są niedostępne.\",\"Lista opcji jest niepełna.\",\"Wybrane opcje\"],\"pt-BR\":[\"Os detalhes das opções estão indisponíveis.\",\"A lista de opções está incompleta.\",\"Opções selecionadas\"],\"pt-PT\":[\"Os detalhes das opções estão indisponíveis.\",\"A lista de opções está incompleta.\",\"Opções selecionadas\"],es:[\"Los detalles de las opciones no están disponibles.\",\"La lista de opciones está incompleta.\",\"Opciones seleccionadas\"],sv:[\"Alternativinformation är inte tillgänglig.\",\"Listan över alternativ är ofullständig.\",\"Valda alternativ\"],th:[\"ไม่มีรายละเอียดตัวเลือก\",\"รายการตัวเลือกไม่ครบถ้วน\",\"ตัวเลือกที่เลือก\"],tr:[\"Seçenek ayrıntıları mevcut değil.\",\"Seçenek listesi eksik.\",\"Seçilen seçenekler\"]};\nexport const productOptionMessages=Object.freeze(labels);\n","import { productOptionMessages } from \"./option-messages.js\";\nimport {\n createInternationalizationRuntime,\n MODA_SUPPORTED_LANGUAGE_TAGS,\n validateIcuCatalogue,\n type IcuMessageCatalogue,\n type ModaSupportedLanguageTag,\n} from \"../../internationalization.js\";\n\nexport const recommendationMessageKeys = [\n \"scopeLimit\", \"shippingUnverified\", \"shippingRequired\", \"shippingNotRequired\", \"policyLink\", \"storeLink\",\n \"productOption\", \"proposedQuantity\", \"addProposal\", \"replaceProposal\", \"currentPrice\", \"regularPrice\",\n \"percentTerms\", \"amountTerms\", \"freeShippingTerms\", \"code\", \"automatic\", \"checkoutQualification\",\n \"productLink\", \"noVerifiedOffer\", \"optionsUnavailable\", \"optionsPartial\", \"optionsSelected\",\n] as const;\ntype MessageKey = typeof recommendationMessageKeys[number];\n\nconst rows: Record<ModaSupportedLanguageTag, readonly string[]> = {\n \"zh-Hans\": [\"我可以帮助您了解本店商品,但无法回答这个问题。\", \"我无法确认您询问的配送详情。请向商店查询。\", \"此商品需要配送。\", \"此商品无需配送。\", \"配送政策:{url}\", \"商店:{url}\", \"{title}\", \"拟购买数量:{quantity}:\", \"如果您将此商品的 {quantity} 件加入购物篮:\", \"如果您用此商品的 {quantity} 件替换所选购物篮商品:\", \"当前标价:{price}\", \"常规标价:{price}\", \"优惠条款:{percentage} 折扣,具体取决于已核实的条件。\", \"优惠条款:减免 {amount},具体取决于已核实的条件。\", \"优惠条款:免费配送,以结账验证为准。\", \"优惠码:{code}\", \"自动优惠;最终应用以结账确认为准。\", \"资格和最终价格将在结账时确认。\", \"查看商品:{url}\", \"我无法核实此推荐适用的优惠。\"],\n \"zh-Hant\": [\"我可以協助您了解本店商品,但無法回答這個問題。\", \"我無法確認您詢問的配送詳情。請向商店查詢。\", \"此商品需要配送。\", \"此商品不需要配送。\", \"配送政策:{url}\", \"商店:{url}\", \"{title}\", \"擬購買數量:{quantity}:\", \"如果您將此商品的 {quantity} 件加入購物籃:\", \"如果您以此商品的 {quantity} 件取代所選購物籃商品:\", \"目前標價:{price}\", \"一般標價:{price}\", \"優惠條款:{percentage} 折扣,須符合已核實的條件。\", \"優惠條款:折抵 {amount},須符合已核實的條件。\", \"優惠條款:免費配送,以結帳驗證為準。\", \"優惠碼:{code}\", \"自動優惠;最終套用情況以結帳確認為準。\", \"資格和最終價格將於結帳時確認。\", \"查看商品:{url}\", \"我無法核實此推薦適用的優惠。\"],\n cs: [\"S produkty tohoto obchodu vám pomohu, na tuto otázku ale odpovědět nemohu.\", \"Požadované údaje o dopravě nemohu potvrdit. Ověřte je prosím u obchodu.\", \"Tuto položku je nutné odeslat.\", \"Tuto položku není nutné odesílat.\", \"Podmínky dopravy: {url}\", \"Obchod: {url}\", \"{title}\", \"Pro navrhovaný nákup v množství {quantity}:\", \"Pokud do košíku přidáte {quantity} kusů této položky:\", \"Pokud vybranou položku v košíku nahradíte {quantity} kusy tohoto zboží:\", \"Aktuální uvedená cena: {price}\", \"Běžná uvedená cena: {price}\", \"Podmínky nabídky: sleva {percentage}, podle ověřených podmínek.\", \"Podmínky nabídky: sleva {amount}, podle ověřených podmínek.\", \"Podmínky nabídky: doprava zdarma, podléhá ověření při placení.\", \"Kód: {code}\", \"Automatická nabídka; konečné uplatnění potvrdí pokladna.\", \"Nárok a konečnou cenu potvrdí pokladna.\", \"Zobrazit produkt: {url}\", \"U tohoto návrhu se nepodařilo ověřit použitelnou nabídku.\"],\n da: [\"Jeg kan hjælpe med butikkens produkter, men jeg kan ikke besvare det spørgsmål.\", \"Jeg kan ikke bekræfte de ønskede leveringsoplysninger. Spørg venligst butikken.\", \"Denne vare kræver levering.\", \"Denne vare kræver ikke levering.\", \"Leveringspolitik: {url}\", \"Butik: {url}\", \"{title}\", \"For et foreslået køb af {quantity}:\", \"Hvis du lægger {quantity} af denne vare i kurven:\", \"Hvis du erstatter den valgte vare i kurven med {quantity} af denne vare:\", \"Aktuel angivet pris: {price}\", \"Normal angivet pris: {price}\", \"Tilbudsvilkår: {percentage} rabat, afhængigt af de bekræftede vilkår.\", \"Tilbudsvilkår: {amount} i rabat, afhængigt af de bekræftede vilkår.\", \"Tilbudsvilkår: gratis levering, bekræftes ved betaling.\", \"Kode: {code}\", \"Automatisk tilbud; betaling bekræfter den endelige anvendelse.\", \"Berettigelse og endelig pris bekræftes ved betaling.\", \"Se produkt: {url}\", \"Jeg kunne ikke bekræfte et gældende tilbud for dette forslag.\"],\n nl: [\"Ik kan u helpen met producten van deze winkel, maar ik kan die vraag niet beantwoorden.\", \"Ik kan de gevraagde verzendgegevens niet bevestigen. Vraag het aan de winkel.\", \"Dit artikel moet worden verzonden.\", \"Dit artikel hoeft niet te worden verzonden.\", \"Verzendbeleid: {url}\", \"Winkel: {url}\", \"{title}\", \"Voor een voorgestelde aankoop van {quantity}:\", \"Als u {quantity} van dit artikel aan uw mandje toevoegt:\", \"Als u het gekozen artikel in uw mandje vervangt door {quantity} van dit artikel:\", \"Huidige vermelde prijs: {price}\", \"Normale vermelde prijs: {price}\", \"Aanbiedingsvoorwaarden: {percentage} korting, afhankelijk van de geverifieerde voorwaarden.\", \"Aanbiedingsvoorwaarden: {amount} korting, afhankelijk van de geverifieerde voorwaarden.\", \"Aanbiedingsvoorwaarden: gratis verzending, bevestiging bij het afrekenen.\", \"Code: {code}\", \"Automatische aanbieding; de kassa bevestigt de uiteindelijke toepassing.\", \"Voorwaarden en eindprijs worden bij het afrekenen bevestigd.\", \"Product bekijken: {url}\", \"Ik kon geen toepasbare aanbieding voor dit voorstel verifiëren.\"],\n en: [\"I can help with this store's products, but I can't answer that question.\", \"I can't confirm the shipping details for your request. Please check with the store.\", \"This item requires shipping.\", \"This item does not require shipping.\", \"Shipping policy: {url}\", \"Store: {url}\", \"{title}\", \"For a proposed purchase of {quantity}:\", \"If you add {quantity} of this item to your basket:\", \"If you replace the selected basket item with {quantity} of this item:\", \"Current listed price: {price}\", \"Regular listed price: {price}\", \"Offer terms: a {percentage} discount, subject to its verified conditions.\", \"Offer terms: a {amount} discount, subject to its verified conditions.\", \"Offer terms: free shipping, subject to checkout validation.\", \"Code: {code}\", \"Automatic offer; checkout confirms the final application.\", \"Eligibility and the final price are confirmed at checkout.\", \"View product: {url}\", \"I couldn't verify an applicable offer for this suggestion.\"],\n fi: [\"Voin auttaa tämän kaupan tuotteissa, mutta en voi vastata tähän kysymykseen.\", \"En voi vahvistaa pyytämiäsi toimitustietoja. Tarkista asia kaupasta.\", \"Tämä tuote on toimitettava.\", \"Tätä tuotetta ei tarvitse toimittaa.\", \"Toimitusehdot: {url}\", \"Kauppa: {url}\", \"{title}\", \"Ehdotetulle {quantity} tuotteen ostolle:\", \"Jos lisäät {quantity} tätä tuotetta koriisi:\", \"Jos korvaat valitun korituotteen {quantity} tällä tuotteella:\", \"Nykyinen ilmoitettu hinta: {price}\", \"Normaali ilmoitettu hinta: {price}\", \"Tarjouksen ehdot: {percentage} alennus vahvistettujen ehtojen mukaisesti.\", \"Tarjouksen ehdot: {amount} alennus vahvistettujen ehtojen mukaisesti.\", \"Tarjouksen ehdot: ilmainen toimitus, vahvistetaan kassalla.\", \"Koodi: {code}\", \"Automaattinen tarjous; kassa vahvistaa lopullisen käytön.\", \"Kelpoisuus ja lopullinen hinta vahvistetaan kassalla.\", \"Näytä tuote: {url}\", \"Tälle ehdotukselle ei voitu vahvistaa soveltuvaa tarjousta.\"],\n fr: [\"Je peux vous aider avec les produits de cette boutique, mais pas répondre à cette question.\", \"Je ne peux pas confirmer les détails de livraison demandés. Veuillez consulter la boutique.\", \"Cet article nécessite une livraison.\", \"Cet article ne nécessite pas de livraison.\", \"Politique de livraison : {url}\", \"Boutique : {url}\", \"{title}\", \"Pour un achat proposé de {quantity} :\", \"Si vous ajoutez {quantity} de cet article à votre panier :\", \"Si vous remplacez l'article sélectionné par {quantity} de cet article :\", \"Prix affiché actuel : {price}\", \"Prix affiché habituel : {price}\", \"Conditions de l'offre : remise de {percentage}, selon les conditions vérifiées.\", \"Conditions de l'offre : remise de {amount}, selon les conditions vérifiées.\", \"Conditions de l'offre : livraison gratuite, à confirmer lors du paiement.\", \"Code : {code}\", \"Offre automatique ; le paiement confirme son application finale.\", \"L'éligibilité et le prix final sont confirmés au paiement.\", \"Voir le produit : {url}\", \"Je n'ai pas pu vérifier une offre applicable à cette suggestion.\"],\n de: [\"Ich helfe Ihnen gern mit den Produkten dieses Shops, kann diese Frage aber nicht beantworten.\", \"Ich kann die gewünschten Versanddetails nicht bestätigen. Bitte fragen Sie beim Shop nach.\", \"Dieser Artikel muss versendet werden.\", \"Dieser Artikel muss nicht versendet werden.\", \"Versandbedingungen: {url}\", \"Shop: {url}\", \"{title}\", \"Für einen vorgeschlagenen Kauf von {quantity}:\", \"Wenn Sie {quantity} dieses Artikels in den Warenkorb legen:\", \"Wenn Sie den ausgewählten Warenkorbartikel durch {quantity} dieses Artikels ersetzen:\", \"Aktueller Listenpreis: {price}\", \"Regulärer Listenpreis: {price}\", \"Angebotsbedingungen: {percentage} Rabatt, vorbehaltlich der geprüften Bedingungen.\", \"Angebotsbedingungen: {amount} Rabatt, vorbehaltlich der geprüften Bedingungen.\", \"Angebotsbedingungen: kostenloser Versand, vorbehaltlich der Bestätigung beim Bezahlen.\", \"Code: {code}\", \"Automatisches Angebot; die Kasse bestätigt die endgültige Anwendung.\", \"Berechtigung und Endpreis werden beim Bezahlen bestätigt.\", \"Produkt ansehen: {url}\", \"Ich konnte kein passendes Angebot für diesen Vorschlag bestätigen.\"],\n it: [\"Posso aiutarti con i prodotti di questo negozio, ma non posso rispondere a questa domanda.\", \"Non posso confermare i dettagli di spedizione richiesti. Contatta il negozio.\", \"Questo articolo richiede la spedizione.\", \"Questo articolo non richiede la spedizione.\", \"Politica di spedizione: {url}\", \"Negozio: {url}\", \"{title}\", \"Per un acquisto proposto di {quantity}:\", \"Se aggiungi {quantity} di questo articolo al carrello:\", \"Se sostituisci l'articolo selezionato nel carrello con {quantity} di questo articolo:\", \"Prezzo di listino attuale: {price}\", \"Prezzo di listino normale: {price}\", \"Termini dell'offerta: sconto del {percentage}, secondo le condizioni verificate.\", \"Termini dell'offerta: sconto di {amount}, secondo le condizioni verificate.\", \"Termini dell'offerta: spedizione gratuita, da verificare al pagamento.\", \"Codice: {code}\", \"Offerta automatica; il pagamento conferma l'applicazione finale.\", \"Idoneità e prezzo finale sono confermati al pagamento.\", \"Visualizza prodotto: {url}\", \"Non ho potuto verificare un'offerta applicabile a questo suggerimento.\"],\n ja: [\"このストアの商品についてはお手伝いできますが、その質問には回答できません。\", \"ご希望の配送情報を確認できません。ストアにご確認ください。\", \"この商品は配送が必要です。\", \"この商品は配送不要です。\", \"配送ポリシー:{url}\", \"ストア:{url}\", \"{title}\", \"購入候補数 {quantity}:\", \"この商品を {quantity} 個カートに追加する場合:\", \"選択したカート商品をこの商品 {quantity} 個に置き換える場合:\", \"現在の表示価格:{price}\", \"通常の表示価格:{price}\", \"オファー条件:確認済みの条件に従い {percentage} 割引。\", \"オファー条件:確認済みの条件に従い {amount} 割引。\", \"オファー条件:送料無料。適用はチェックアウトで確認してください。\", \"コード:{code}\", \"自動オファーです。最終的な適用はチェックアウトで確認されます。\", \"適用条件と最終価格はチェックアウトで確認されます。\", \"商品を見る:{url}\", \"この提案に適用できるオファーを確認できませんでした。\"],\n ko: [\"이 스토어의 상품은 도와드릴 수 있지만 해당 질문에는 답변할 수 없습니다.\", \"요청하신 배송 정보를 확인할 수 없습니다. 스토어에 문의해 주세요.\", \"이 상품은 배송이 필요합니다.\", \"이 상품은 배송이 필요하지 않습니다.\", \"배송 정책: {url}\", \"스토어: {url}\", \"{title}\", \"제안 구매 수량 {quantity}개:\", \"이 상품 {quantity}개를 장바구니에 추가하면:\", \"선택한 장바구니 상품을 이 상품 {quantity}개로 교체하면:\", \"현재 표시 가격: {price}\", \"정상 표시 가격: {price}\", \"혜택 조건: 확인된 조건에 따라 {percentage} 할인.\", \"혜택 조건: 확인된 조건에 따라 {amount} 할인.\", \"혜택 조건: 무료 배송. 결제 단계에서 확인됩니다.\", \"코드: {code}\", \"자동 혜택이며 최종 적용은 결제 단계에서 확인됩니다.\", \"자격과 최종 가격은 결제 단계에서 확인됩니다.\", \"상품 보기: {url}\", \"이 제안에 적용 가능한 혜택을 확인하지 못했습니다.\"],\n nb: [\"Jeg kan hjelpe med produktene i denne butikken, men ikke svare på det spørsmålet.\", \"Jeg kan ikke bekrefte de ønskede fraktopplysningene. Kontakt butikken.\", \"Denne varen må sendes.\", \"Denne varen trenger ikke å sendes.\", \"Fraktvilkår: {url}\", \"Butikk: {url}\", \"{title}\", \"For et foreslått kjøp på {quantity}:\", \"Hvis du legger {quantity} av denne varen i handlekurven:\", \"Hvis du erstatter den valgte handlekurvvaren med {quantity} av denne varen:\", \"Gjeldende oppført pris: {price}\", \"Ordinær oppført pris: {price}\", \"Tilbudsvilkår: {percentage} rabatt, med forbehold om bekreftede vilkår.\", \"Tilbudsvilkår: {amount} rabatt, med forbehold om bekreftede vilkår.\", \"Tilbudsvilkår: gratis frakt, bekreftes i kassen.\", \"Kode: {code}\", \"Automatisk tilbud; kassen bekrefter endelig bruk.\", \"Kvalifikasjon og sluttpris bekreftes i kassen.\", \"Vis produkt: {url}\", \"Jeg kunne ikke bekrefte et gjeldende tilbud for dette forslaget.\"],\n pl: [\"Mogę pomóc w sprawie produktów tego sklepu, ale nie mogę odpowiedzieć na to pytanie.\", \"Nie mogę potwierdzić żądanych informacji o wysyłce. Sprawdź je w sklepie.\", \"Ten produkt wymaga wysyłki.\", \"Ten produkt nie wymaga wysyłki.\", \"Zasady wysyłki: {url}\", \"Sklep: {url}\", \"{title}\", \"Dla proponowanego zakupu w liczbie {quantity}:\", \"Jeśli dodasz {quantity} szt. tego produktu do koszyka:\", \"Jeśli zastąpisz wybrany produkt w koszyku {quantity} szt. tego produktu:\", \"Aktualna cena katalogowa: {price}\", \"Regularna cena katalogowa: {price}\", \"Warunki oferty: rabat {percentage}, zgodnie ze zweryfikowanymi warunkami.\", \"Warunki oferty: rabat {amount}, zgodnie ze zweryfikowanymi warunkami.\", \"Warunki oferty: bezpłatna wysyłka, do potwierdzenia przy kasie.\", \"Kod: {code}\", \"Oferta automatyczna; kasa potwierdzi ostateczne zastosowanie.\", \"Uprawnienie i cena końcowa zostaną potwierdzone przy kasie.\", \"Zobacz produkt: {url}\", \"Nie udało się potwierdzić oferty dla tej propozycji.\"],\n \"pt-BR\": [\"Posso ajudar com os produtos desta loja, mas não posso responder a essa pergunta.\", \"Não consigo confirmar os detalhes de envio solicitados. Consulte a loja.\", \"Este item precisa ser enviado.\", \"Este item não precisa ser enviado.\", \"Política de envio: {url}\", \"Loja: {url}\", \"{title}\", \"Para uma compra sugerida de {quantity}:\", \"Se você adicionar {quantity} deste item à sua cesta:\", \"Se você substituir o item selecionado da cesta por {quantity} deste item:\", \"Preço listado atual: {price}\", \"Preço listado normal: {price}\", \"Termos da oferta: desconto de {percentage}, sujeito às condições verificadas.\", \"Termos da oferta: desconto de {amount}, sujeito às condições verificadas.\", \"Termos da oferta: frete grátis, sujeito à validação no checkout.\", \"Código: {code}\", \"Oferta automática; o checkout confirma a aplicação final.\", \"A elegibilidade e o preço final são confirmados no checkout.\", \"Ver produto: {url}\", \"Não foi possível verificar uma oferta aplicável para esta sugestão.\"],\n \"pt-PT\": [\"Posso ajudar com os produtos desta loja, mas não posso responder a essa pergunta.\", \"Não consigo confirmar os detalhes de entrega pedidos. Consulte a loja.\", \"Este artigo requer entrega.\", \"Este artigo não requer entrega.\", \"Política de entrega: {url}\", \"Loja: {url}\", \"{title}\", \"Para uma compra proposta de {quantity}:\", \"Se adicionar {quantity} deste artigo ao cesto:\", \"Se substituir o artigo selecionado no cesto por {quantity} deste artigo:\", \"Preço atual anunciado: {price}\", \"Preço normal anunciado: {price}\", \"Condições da oferta: desconto de {percentage}, sujeito às condições verificadas.\", \"Condições da oferta: desconto de {amount}, sujeito às condições verificadas.\", \"Condições da oferta: entrega gratuita, sujeita a validação no pagamento.\", \"Código: {code}\", \"Oferta automática; o pagamento confirma a aplicação final.\", \"A elegibilidade e o preço final são confirmados no pagamento.\", \"Ver produto: {url}\", \"Não foi possível confirmar uma oferta aplicável a esta sugestão.\"],\n es: [\"Puedo ayudarle con los productos de esta tienda, pero no puedo responder a esa pregunta.\", \"No puedo confirmar los detalles de envío solicitados. Consulte con la tienda.\", \"Este artículo requiere envío.\", \"Este artículo no requiere envío.\", \"Política de envío: {url}\", \"Tienda: {url}\", \"{title}\", \"Para una compra propuesta de {quantity}:\", \"Si añade {quantity} de este artículo a la cesta:\", \"Si sustituye el artículo seleccionado de la cesta por {quantity} de este artículo:\", \"Precio actual indicado: {price}\", \"Precio habitual indicado: {price}\", \"Condiciones de la oferta: descuento del {percentage}, sujeto a las condiciones verificadas.\", \"Condiciones de la oferta: descuento de {amount}, sujeto a las condiciones verificadas.\", \"Condiciones de la oferta: envío gratis, sujeto a validación al pagar.\", \"Código: {code}\", \"Oferta automática; el pago confirma la aplicación final.\", \"La elegibilidad y el precio final se confirman al pagar.\", \"Ver producto: {url}\", \"No pude verificar una oferta aplicable a esta sugerencia.\"],\n sv: [\"Jag kan hjälpa till med butikens produkter, men jag kan inte svara på den frågan.\", \"Jag kan inte bekräfta de efterfrågade leveransuppgifterna. Fråga butiken.\", \"Den här varan måste skickas.\", \"Den här varan behöver inte skickas.\", \"Leveranspolicy: {url}\", \"Butik: {url}\", \"{title}\", \"För ett föreslaget köp av {quantity}:\", \"Om du lägger {quantity} av den här varan i varukorgen:\", \"Om du ersätter den valda varukorgsvaran med {quantity} av den här varan:\", \"Aktuellt listpris: {price}\", \"Ordinarie listpris: {price}\", \"Erbjudandevillkor: {percentage} rabatt, enligt verifierade villkor.\", \"Erbjudandevillkor: {amount} rabatt, enligt verifierade villkor.\", \"Erbjudandevillkor: fri frakt, bekräftas i kassan.\", \"Kod: {code}\", \"Automatiskt erbjudande; kassan bekräftar den slutliga tillämpningen.\", \"Behörighet och slutpris bekräftas i kassan.\", \"Visa produkt: {url}\", \"Jag kunde inte verifiera ett tillämpligt erbjudande för det här förslaget.\"],\n th: [\"ฉันช่วยแนะนำสินค้าในร้านนี้ได้ แต่ไม่สามารถตอบคำถามนั้นได้\", \"ฉันยืนยันรายละเอียดการจัดส่งตามที่ขอไม่ได้ โปรดตรวจสอบกับร้านค้า\", \"สินค้านี้ต้องจัดส่ง\", \"สินค้านี้ไม่ต้องจัดส่ง\", \"นโยบายการจัดส่ง: {url}\", \"ร้านค้า: {url}\", \"{title}\", \"สำหรับข้อเสนอซื้อจำนวน {quantity}:\", \"หากเพิ่มสินค้านี้ {quantity} ชิ้นลงในตะกร้า:\", \"หากแทนที่สินค้าในตะกร้าที่เลือกด้วยสินค้านี้ {quantity} ชิ้น:\", \"ราคาปัจจุบันที่แสดง: {price}\", \"ราคาปกติที่แสดง: {price}\", \"เงื่อนไขข้อเสนอ: ส่วนลด {percentage} ตามเงื่อนไขที่ตรวจสอบแล้ว\", \"เงื่อนไขข้อเสนอ: ส่วนลด {amount} ตามเงื่อนไขที่ตรวจสอบแล้ว\", \"เงื่อนไขข้อเสนอ: จัดส่งฟรี โดยต้องยืนยันที่หน้าชำระเงิน\", \"รหัส: {code}\", \"ข้อเสนออัตโนมัติ ระบบชำระเงินจะยืนยันการใช้ขั้นสุดท้าย\", \"ตรวจสอบสิทธิ์และราคาสุดท้ายที่หน้าชำระเงิน\", \"ดูสินค้า: {url}\", \"ฉันตรวจสอบข้อเสนอที่ใช้ได้สำหรับคำแนะนำนี้ไม่ได้\"],\n tr: [\"Bu mağazanın ürünleri konusunda yardımcı olabilirim ancak bu soruyu yanıtlayamam.\", \"İstediğiniz gönderim ayrıntılarını doğrulayamıyorum. Lütfen mağazaya danışın.\", \"Bu ürünün gönderilmesi gerekir.\", \"Bu ürünün gönderilmesi gerekmez.\", \"Gönderim politikası: {url}\", \"Mağaza: {url}\", \"{title}\", \"Önerilen {quantity} adetlik satın alma için:\", \"Bu üründen {quantity} adet sepetinize eklerseniz:\", \"Seçili sepet ürününü bu üründen {quantity} adetle değiştirirseniz:\", \"Güncel liste fiyatı: {price}\", \"Normal liste fiyatı: {price}\", \"Teklif koşulları: doğrulanmış koşullara tabi {percentage} indirim.\", \"Teklif koşulları: doğrulanmış koşullara tabi {amount} indirim.\", \"Teklif koşulları: ücretsiz gönderim; ödeme sırasında doğrulanır.\", \"Kod: {code}\", \"Otomatik teklif; son uygulamayı ödeme ekranı doğrular.\", \"Uygunluk ve son fiyat ödeme sırasında doğrulanır.\", \"Ürünü görüntüle: {url}\", \"Bu öneri için geçerli bir teklifi doğrulayamadım.\"],\n};\n\nexport const recommendationMessages = Object.fromEntries(MODA_SUPPORTED_LANGUAGE_TAGS.map((locale) => {\n const values = [...rows[locale], ...productOptionMessages[locale]];\n if (values.length !== recommendationMessageKeys.length) throw new Error(`INVALID_RECOMMENDATION_CATALOGUE:${locale}`);\n return [locale, Object.freeze(Object.fromEntries(recommendationMessageKeys.map((key, index) => [key, values[index]!])) as Record<MessageKey, string>)];\n})) as Readonly<Record<ModaSupportedLanguageTag, IcuMessageCatalogue>>;\n\nfor (const locale of MODA_SUPPORTED_LANGUAGE_TAGS) validateIcuCatalogue(recommendationMessages[locale], recommendationMessageKeys, { locale });\n\nexport function recommendationMessage(locale: ModaSupportedLanguageTag, key: MessageKey, values?: Record<string, string | number>): string {\n return createInternationalizationRuntime({ locale, catalogue: recommendationMessages[locale] }).t(key, values);\n}\n","import { recommendationMessage } from \"./messages.js\";\nimport { z } from \"zod\";\nimport { CommerceProductSchema, CommerceProductOptionsSchema, CommerceProductSelectedOptionsSchema } from \"../schemas.js\";\nimport { type ModaSupportedLanguageTag } from \"../../internationalization.js\";\nexport const CommerceOptionFactSchema = z.strictObject({productId:z.string().min(1).max(128),variantId:z.string().min(1).max(128).nullable(),title:z.string().min(1).max(512),options:CommerceProductOptionsSchema,selectedOptions:CommerceProductSelectedOptionsSchema});\nexport type CommerceOptionFact = z.infer<typeof CommerceOptionFactSchema>;\nexport function verifyCommerceOptionFacts(selection: readonly {productId:string;variantId:string|null}[], currentProducts: readonly unknown[]): {kind:\"verified\";optionFacts:CommerceOptionFact[]}|{kind:\"limitation\";reason:\"INVALID_SELECTION\"|\"PRODUCT_NOT_FOUND\"|\"PRODUCT_INVALID\"} {\n const parsed=z.array(z.strictObject({productId:z.string().min(1).max(128),variantId:z.string().min(1).max(128).nullable()})).max(3).safeParse(selection);\n if(!parsed.success||new Set(selection.map(s=>JSON.stringify([s.productId,s.variantId]))).size!==selection.length)return {kind:\"limitation\",reason:\"INVALID_SELECTION\"};\n const facts:CommerceOptionFact[]=[];\n for(const selected of parsed.data){const matches=currentProducts.filter(p=>p&&typeof p===\"object\"&&(p as {productId?:unknown}).productId===selected.productId&&(p as {variantId?:unknown}).variantId===selected.variantId);if(matches.length!==1)return {kind:\"limitation\",reason:\"PRODUCT_NOT_FOUND\"};const product=CommerceProductSchema.safeParse(matches[0]);if(!product.success)return {kind:\"limitation\",reason:\"PRODUCT_INVALID\"};facts.push({productId:product.data.productId,variantId:product.data.variantId,title:product.data.title,options:product.data.options??{status:\"PARTIAL\",items:[]},selectedOptions:product.data.selectedOptions??[]});}\n return {kind:\"verified\",optionFacts:facts};\n}\nexport function renderProductOptionFacts(facts:readonly CommerceOptionFact[],locale:ModaSupportedLanguageTag):string {\n const unavailable=recommendationMessage(locale,\"optionsUnavailable\"),partial=recommendationMessage(locale,\"optionsPartial\"),selected=recommendationMessage(locale,\"optionsSelected\");if(!facts.length)return unavailable;\n return facts.map(f=>[f.title,...(f.options.status===\"PARTIAL\"?[partial]:[]),...(f.options.items.length?f.options.items.map(o=>`${o.name}: ${o.values.length?o.values.join(\", \"):unavailable}`):[unavailable]),...(f.selectedOptions.length?[`${selected}:`,...f.selectedOptions.map(o=>`${o.name}: ${o.value}`)]:[])].join(\"\\n\")).join(\"\\n\\n\");\n}\n","/** Plain text only. Unbalanced markers and non-HTTPS links remain literal. */\nexport function normalizeCommerceReplyText(value:string):string {\n const linked=value.replace(/\\[([^\\]\\r\\n]+)\\]\\((https:\\/\\/[^\\s)]+)\\)/g,(original,label:string,raw:string)=>{try{const url=new URL(raw);return url.protocol===\"https:\"&&!url.username&&!url.password?`${label}: ${raw}`:original;}catch{return original;}});\n const strip=(text:string,pattern:RegExp)=>text.replace(pattern,(original:string,inner:string,offset:number,source:string)=>/https?:\\/\\/[^\\s]*$/.test(source.slice(0,offset))?original:inner);\n return strip(strip(linked,/\\*\\*([^*]+)\\*\\*/g),/~~([^~]+)~~/g);\n}\n","import type { InternationalizationRuntime } from \"../../internationalization.js\";\n\nconst DECIMAL = /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/;\nexport function isValidDecimal(value: string): boolean { return DECIMAL.test(value); }\n\nexport function currencyExponent(currency: string): number | null {\n try {\n const options = new Intl.NumberFormat(\"en\", { style: \"currency\", currency }).resolvedOptions();\n const exponent = options.maximumFractionDigits;\n return typeof exponent === \"number\" && Number.isInteger(exponent) && exponent >= 0 && exponent <= 4 &&\n options.minimumFractionDigits === exponent ? exponent : null;\n } catch { return null; }\n}\n\nexport function minorUnitsToDecimal(value: bigint, currency: string): string | null {\n const exponent = currencyExponent(currency);\n if (exponent === null || value < 0n) return null;\n if (exponent === 0) return value.toString();\n const padded = value.toString().padStart(exponent + 1, \"0\");\n return `${padded.slice(0, -exponent)}.${padded.slice(-exponent)}`;\n}\n\nfunction minorUnits(value: string, exponent: number): bigint | null {\n if (!DECIMAL.test(value)) return null;\n const [whole = \"\", fraction = \"\"] = value.split(\".\");\n if (fraction.length > exponent) return null;\n try { return BigInt(`${whole}${fraction.padEnd(exponent, \"0\")}`); }\n catch { return null; }\n}\n\nexport function decimalToMinorUnits(value: string, currency: string): bigint | null {\n const exponent = currencyExponent(currency);\n return exponent === null ? null : minorUnits(value, exponent);\n}\n\nexport function sumPurchaseSubtotal(lines: readonly Readonly<{ amountDecimal: string; quantity: number }>[], currency: string): bigint | null {\n let total = 0n;\n for (const line of lines) {\n if (!Number.isSafeInteger(line.quantity) || line.quantity < 1) return null;\n const amount = decimalToMinorUnits(line.amountDecimal, currency);\n if (amount === null) return null;\n total += amount * BigInt(line.quantity);\n }\n return total;\n}\n\nexport function formatObservedMoney(value: string, currency: string, runtime: InternationalizationRuntime): string | null {\n const minor = decimalToMinorUnits(value, currency);\n const exponent = currencyExponent(currency);\n if (minor === null || exponent === null || minor > BigInt(Number.MAX_SAFE_INTEGER)) return null;\n const numeric = Number(minor) / 10 ** exponent;\n if (!Number.isFinite(numeric) || decimalToMinorUnits(numeric.toFixed(exponent), currency) !== minor) return null;\n try { return runtime.formatMoney(numeric, currency); } catch { return null; }\n}\n","import { createInternationalizationRuntime } from \"../../internationalization.js\";\nimport type { ModaSupportedLanguageTag } from \"../../internationalization.js\";\nimport { recommendationMessage } from \"./messages.js\";\nimport { formatObservedMoney } from \"./money.js\";\nimport { recommendationMessages } from \"./messages.js\";\n\nexport type RenderRecommendationProduct = Readonly<{\n title: string;\n url: string;\n quantity: number;\n scope: \"PRODUCT_ONLY\" | \"ADD_TO_BASKET\" | \"REPLACE_BASKET_LINE\";\n currentPrice: string | null;\n currency: string | null;\n regularPrice?: string | null;\n offerTerms?: readonly Readonly<{ kind: \"percent\" | \"amount\" | \"free-shipping\"; value?: string; currency?: string; code?: string | null; automatic?: boolean }> [];\n}>;\n\nexport function renderRecommendationReply(input: {\n locale: ModaSupportedLanguageTag;\n disposition: \"STANDARD\" | \"OUT_OF_SCOPE_REDIRECT\" | \"SHIPPING_INFORMATION_UNVERIFIED\";\n storeUrl: string;\n policyUrl?: string | null;\n requiresShipping?: boolean | null;\n products?: readonly RenderRecommendationProduct[];\n includeNoVerifiedOffer?: boolean;\n}): string {\n const t = (key: Parameters<typeof recommendationMessage>[1], values?: Record<string, string | number>) =>\n recommendationMessage(input.locale, key, values);\n const lines: string[] = [];\n if (input.disposition === \"OUT_OF_SCOPE_REDIRECT\") lines.push(t(\"scopeLimit\"));\n if (input.disposition === \"SHIPPING_INFORMATION_UNVERIFIED\") lines.push(t(\"shippingUnverified\"));\n if (input.requiresShipping !== null && input.requiresShipping !== undefined) {\n lines.push(t(input.requiresShipping ? \"shippingRequired\" : \"shippingNotRequired\"));\n }\n if (input.policyUrl) lines.push(t(\"policyLink\", { url: input.policyUrl }));\n for (const product of input.products ?? []) {\n if (product.scope === \"ADD_TO_BASKET\") lines.push(t(\"addProposal\", { quantity: product.quantity }));\n else if (product.scope === \"REPLACE_BASKET_LINE\") lines.push(t(\"replaceProposal\", { quantity: product.quantity }));\n else lines.push(t(\"proposedQuantity\", { quantity: product.quantity }));\n lines.push(t(\"productOption\", { title: product.title }));\n if (product.currentPrice && product.currency) {\n const price = formatObservedMoney(product.currentPrice, product.currency,\n // Formatting is provided by the published Shared internationalization runtime.\n (awaitlessRuntime(input.locale)));\n if (price) lines.push(t(\"currentPrice\", { price }));\n }\n if (product.regularPrice && product.currency && product.currentPrice && product.regularPrice !== product.currentPrice) {\n const regular = formatObservedMoney(product.regularPrice, product.currency, awaitlessRuntime(input.locale));\n if (regular) lines.push(t(\"regularPrice\", { price: regular }));\n }\n for (const offer of product.offerTerms ?? []) {\n if (offer.kind === \"percent\" && offer.value) {\n const raw = Number(offer.value);\n if (Number.isFinite(raw) && raw > 0 && raw <= 100) {\n const percentage = awaitlessRuntime(input.locale).formatPercent(raw / 100);\n lines.push(t(\"percentTerms\", { percentage }));\n }\n }\n else if (offer.kind === \"amount\" && offer.value && offer.currency) {\n const amount = formatObservedMoney(offer.value, offer.currency, awaitlessRuntime(input.locale));\n if (amount) lines.push(t(\"amountTerms\", { amount }));\n }\n else if (offer.kind === \"free-shipping\") lines.push(t(\"freeShippingTerms\"));\n if (offer.code) lines.push(t(\"code\", { code: offer.code }));\n if (offer.automatic) lines.push(t(\"automatic\"));\n if (offer.kind !== \"free-shipping\") lines.push(t(\"checkoutQualification\"));\n }\n lines.push(t(\"productLink\", { url: product.url }));\n }\n if (input.includeNoVerifiedOffer && (input.products?.length ?? 0) > 0) lines.push(t(\"noVerifiedOffer\"));\n if ((input.products?.length ?? 0) === 0 && !input.policyUrl && input.requiresShipping == null) {\n lines.push(t(\"storeLink\", { url: input.storeUrl }));\n }\n return lines.join(\"\\n\");\n}\n\nfunction awaitlessRuntime(locale: ModaSupportedLanguageTag) {\n // Constructed per call to keep this module stateless and locale-specific.\n return createRuntime(locale);\n}\nfunction createRuntime(locale: ModaSupportedLanguageTag) {\n return createInternationalizationRuntime({ locale, catalogue: recommendationMessages[locale] });\n}\n","export function buildReplyCandidates(input: {\n fullBody: string;\n firstProductBody?: string | null;\n minimalBody: string;\n}): readonly string[] {\n const candidates: string[] = [];\n for (const body of [input.fullBody, input.firstProductBody ?? null, input.minimalBody]) {\n if (typeof body !== \"string\" || !body.trim() || body.length > 4096 || candidates.includes(body)) continue;\n candidates.push(body);\n }\n if (!candidates.includes(input.minimalBody) && input.minimalBody.trim() && input.minimalBody.length <= 4096) {\n candidates.push(input.minimalBody);\n }\n return Object.freeze(candidates);\n}\n","import type { CommerceShippingInformation } from \"../index.js\";\n\nexport type ShippingPresentation = Readonly<{\n requiresShipping: boolean | null;\n policyUrl: string | null;\n limitation: boolean;\n}>;\n\nfunction safeAvailablePolicyUrl(source: CommerceShippingInformation): string | null {\n if (source.policy.status !== \"AVAILABLE\" || !source.policy.url) return null;\n try {\n const url = new URL(source.policy.url);\n return url.protocol === \"https:\" && !url.username && !url.password && !url.port && !url.search && !url.hash\n ? source.policy.url : null;\n } catch { return null; }\n}\n\nexport function selectShippingPresentation(input: {\n selection: Readonly<{ productId: string | null; variantId: string | null }>;\n observation: CommerceShippingInformation | null;\n refreshed: CommerceShippingInformation | null;\n}): ShippingPresentation {\n const source = input.refreshed;\n if (!source || source.product.productId !== input.selection.productId ||\n source.product.variantId !== input.selection.variantId ||\n source.provider !== input.observation?.provider) {\n return Object.freeze({ requiresShipping: null, policyUrl: null, limitation: true });\n }\n const policyUrl = safeAvailablePolicyUrl(source);\n return Object.freeze({\n requiresShipping: source.product.status === \"AVAILABLE\" ? source.product.requiresShipping : null,\n policyUrl,\n limitation: source.product.status !== \"AVAILABLE\" || source.product.requiresShipping === null ||\n source.policy.status !== \"AVAILABLE\" || source.policy.trust === \"UNTRUSTED_REFERENCE\",\n });\n}\n","import type { PreparedToken, PreparedWrapper, WrapperVariable } from \"./wrapper-contracts.js\";\n\nconst VARIABLES = new Set<WrapperVariable>([\n \"customer.firstName\", \"shop.name\", \"checkout.url\", \"shopBrand.brandName\",\n \"shopBrand.logoUrl\", \"shopBrand.logoAltText\", \"shopBrand.logoWidth\",\n \"shopBrand.logoHeight\", \"shopBrand.squareLogoUrl\", \"shopBrand.squareLogoAltText\",\n \"shopBrand.coverImageUrl\",\n]);\nconst SLOT = \"response.body\";\nconst TOKEN_MARKER = /\\{\\{[^{}]*\\}\\}|\\{\\{|\\}\\}/;\n\nfunction object(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction onlyKeys(value: Record<string, unknown>, allowed: readonly string[]): boolean {\n return Object.keys(value).every((key) => allowed.includes(key));\n}\n\n/** Admin's documented stable JSON hashing protocol, without importing its AST/compiler. */\nexport function stableJson(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n const result = JSON.stringify(value);\n if (result === undefined) throw new Error(\"Non-JSON prepared projection value\");\n return result;\n }\n if (Array.isArray(value)) return `[${value.map(stableJson).join(\",\")}]`;\n return `{${Object.entries(value).filter(([, child]) => child !== undefined)\n .sort(([a], [b]) => a.localeCompare(b, \"en\"))\n .map(([key, child]) => `${JSON.stringify(key)}:${stableJson(child)}`).join(\",\")}}`;\n}\nexport type PresentationDigest = (value: string) => string;\nexport function digest(value: string, sha256: PresentationDigest): string { return sha256(value); }\n\nfunction readTokens(value: unknown, where: \"header\" | \"body\" | \"footer\" | \"conditional\"):\n PreparedToken[] | null {\n if (!Array.isArray(value) || value.length > 80) return null;\n const limit = where === \"body\" ? 4_000 : 1_500;\n let length = 0;\n const result: PreparedToken[] = [];\n for (const node of value) {\n if (!object(node)) return null;\n if (node.kind === \"text\" && onlyKeys(node, [\"kind\", \"value\"]) &&\n typeof node.value === \"string\" && !TOKEN_MARKER.test(node.value)) {\n length += node.value.length;\n result.push({ kind: \"text\", value: node.value });\n } else if (node.kind === \"variable\" && onlyKeys(node, [\"kind\", \"name\"]) &&\n typeof node.name === \"string\" && VARIABLES.has(node.name as WrapperVariable) &&\n (node.name !== \"checkout.url\" || where === \"conditional\")) {\n length += 5;\n result.push({ kind: \"variable\", name: node.name as WrapperVariable });\n } else if (node.kind === \"responseSlot\" && where === \"body\" &&\n onlyKeys(node, [\"kind\", \"name\"]) && node.name === SLOT) {\n length += 5;\n result.push({ kind: \"responseSlot\", name: SLOT });\n } else return null;\n if (length > limit) return null;\n }\n return result;\n}\n\n/** Never parse localeAst.authoring. Fail closed if the compiled runtime projection is absent. */\nexport function readPreparedWrapper(localeAst: unknown, contentHash: string | null, sha256: PresentationDigest):\n { kind: \"ok\"; prepared: PreparedWrapper } | { kind: \"missing\" | \"invalid\" } {\n if (!object(localeAst) || localeAst.schemaVersion !== 1 || !object(localeAst.prepared)) {\n return { kind: \"missing\" };\n }\n const prepared = localeAst.prepared;\n if (!onlyKeys(prepared, [\"schemaVersion\", \"family\", \"responseSlot\", \"header\", \"body\", \"footer\", \"conditionals\"]) ||\n prepared.schemaVersion !== 1 || prepared.family !== \"MODA_CONVERSATION_WRAPPER\" ||\n prepared.responseSlot !== SLOT || !Array.isArray(prepared.conditionals) ||\n prepared.conditionals.length > 1) return { kind: \"invalid\" };\n const header = readTokens(prepared.header, \"header\");\n const body = readTokens(prepared.body, \"body\");\n const footer = readTokens(prepared.footer, \"footer\");\n if (!header || !body || !footer || body.filter((part) => part.kind === \"responseSlot\").length !== 1) {\n return { kind: \"invalid\" };\n }\n const conditionals: Array<{ when: \"checkout.available\"; tokens: PreparedToken[] }> = [];\n for (const conditional of prepared.conditionals) {\n if (!object(conditional) || !onlyKeys(conditional, [\"when\", \"tokens\"]) ||\n conditional.when !== \"checkout.available\") return { kind: \"invalid\" };\n const tokens = readTokens(conditional.tokens, \"conditional\");\n if (!tokens) return { kind: \"invalid\" };\n conditionals.push({ when: \"checkout.available\", tokens });\n }\n // Hash of the immutable Admin projection; never trust mutable JSONB unverified.\n if (!contentHash || !/^[a-f0-9]{64}$/.test(contentHash) ||\n digest(stableJson(prepared), sha256) !== contentHash) return { kind: \"invalid\" };\n return { kind: \"ok\", prepared: {\n schemaVersion: 1, family: \"MODA_CONVERSATION_WRAPPER\", responseSlot: SLOT,\n header, body, footer, conditionals,\n } };\n}\n","import type { PreparedToken, PreparedWrapper, VerifiedWrapperContext, WrapperRefusal } from \"./wrapper-contracts.js\";\n\n/** WhatsApp plain-text message maximum; reject before moderation and provider calls. */\nexport const MAX_WHATSAPP_TEXT_LENGTH = 4096;\nconst MAX_VARIABLE_LENGTH = 2048;\n\n/** Reject C0 controls other than tab, LF and CR, which WhatsApp text permits. */\nfunction hasDisallowedTextControl(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code < 0x20 && code !== 0x09 && code !== 0x0a && code !== 0x0d) return true;\n }\n return false;\n}\n\nfunction valueFor(token: PreparedToken, context: VerifiedWrapperContext): string | null {\n if (token.kind !== \"variable\") return null;\n const value = context.variables[token.name];\n if (typeof value !== \"string\" || !value.trim() || value.length > MAX_VARIABLE_LENGTH ||\n hasDisallowedTextControl(value)) return null;\n return value;\n}\nfunction renderTokens(tokens: readonly PreparedToken[], context: VerifiedWrapperContext, response: string):\n string | null {\n const parts: string[] = [];\n for (const token of tokens) {\n if (token.kind === \"text\") parts.push(token.value);\n else if (token.kind === \"responseSlot\") parts.push(response);\n else {\n const variable = valueFor(token, context);\n if (variable === null) return null;\n parts.push(variable);\n }\n }\n return parts.join(\"\");\n}\n\nfunction renderSections(prepared: PreparedWrapper, context: VerifiedWrapperContext, response: string):\n string | null {\n const header = renderTokens(prepared.header, context, response);\n const body = renderTokens(prepared.body, context, response);\n const footer = renderTokens(prepared.footer, context, response);\n if (header === null || body === null || footer === null) return null;\n const parts = [header, body];\n if (context.checkoutAvailable) {\n for (const conditional of prepared.conditionals) {\n const content = renderTokens(conditional.tokens, context, response);\n // Optional checkout section: omit whole section on missing/stale values.\n if (content !== null) parts.push(content);\n }\n }\n parts.push(footer);\n return parts.filter((part) => part.length > 0).join(\"\\n\");\n}\n\n/** No AST reads, external dependencies, side effects, network, billing or sending. */\nexport function renderPreparedWrapper(input: {\n prepared: PreparedWrapper;\n context: VerifiedWrapperContext;\n responseBody: string;\n}): { kind: \"rendered\"; body: string } | { kind: \"rejected\"; reason: WrapperRefusal } {\n const { prepared, context, responseBody } = input;\n if (prepared.body.filter(token => token.kind === \"responseSlot\").length !== 1 ||\n [...prepared.header, ...prepared.footer, ...prepared.conditionals.flatMap(c => c.tokens)].some(token => token.kind === \"responseSlot\")) return { kind: \"rejected\", reason: \"PREPARED_INVALID\" };\n if (typeof responseBody !== \"string\" || !responseBody.trim() ||\n hasDisallowedTextControl(responseBody)) {\n return { kind: \"rejected\", reason: \"INVALID_INPUT\" };\n }\n if (responseBody.length > MAX_WHATSAPP_TEXT_LENGTH) {\n return { kind: \"rejected\", reason: \"OUTPUT_TOO_LONG\" };\n }\n // Detect a previous application of this *same* prepared envelope. An independent\n // caller-owned previousApplication handles retries after the active slot changes.\n const probe = \"\\u0000__MODA_RESPONSE_SLOT__\\u0000\";\n const envelope = renderSections(prepared, context, probe);\n if (envelope === null) return { kind: \"rejected\", reason: \"VARIABLE_UNAVAILABLE\" };\n const position = envelope.indexOf(probe);\n const prefix = envelope.slice(0, position);\n const suffix = envelope.slice(position + probe.length);\n if ((prefix || suffix) && responseBody.length > prefix.length + suffix.length &&\n responseBody.startsWith(prefix) && responseBody.endsWith(suffix)) {\n return { kind: \"rejected\", reason: \"ALREADY_WRAPPED\" };\n }\n const rendered = renderSections(prepared, context, responseBody);\n if (rendered === null) return { kind: \"rejected\", reason: \"VARIABLE_UNAVAILABLE\" };\n if (hasDisallowedTextControl(rendered)) return { kind: \"rejected\", reason: \"PREPARED_INVALID\" };\n if (rendered.length > MAX_WHATSAPP_TEXT_LENGTH) {\n return { kind: \"rejected\", reason: \"OUTPUT_TOO_LONG\" };\n }\n return { kind: \"rendered\", body: rendered };\n}\n","import { canonicaliseLanguageTag } from \"../../internationalization.js\";\nimport type { WrapperAudience, WrapperDefinition, WrapperSlot } from \"./wrapper-contracts.js\";\n\nexport function canonicalTag(value: string | null | undefined): string | null {\n if (!value?.trim()) return null;\n return canonicaliseLanguageTag(value);\n}\n\n/** Explicit precedence. Invalid override never silently falls back to SHARED. */\nexport function chooseSlot(slots: readonly WrapperSlot[], source: \"AI\" | \"HUMAN\"):\n WrapperSlot | \"invalid\" | null {\n const own = slots.filter((slot) => slot.audience === source);\n const shared = slots.filter((slot) => slot.audience === \"SHARED\");\n if (own.length > 1 || shared.length > 1 || slots.some((slot) =>\n ![\"SHARED\", \"AI\", \"HUMAN\"].includes(slot.audience))) return \"invalid\";\n return own[0] ?? shared[0] ?? null;\n}\n\nexport function validDefinition(def: WrapperDefinition, slot: WrapperSlot): boolean {\n return def.id === slot.definitionId && slot.definition.id === slot.definitionId &&\n Number.isSafeInteger(slot.editVersion) && slot.editVersion > 0 &&\n def.kind === \"MODA_CONVERSATION_WRAPPER\" && def.audience === slot.audience &&\n [\"SHARED\", \"AI\", \"HUMAN\"].includes(slot.audience as WrapperAudience) &&\n def.status === \"PUBLISHED\" && def.publishedAt instanceof Date &&\n Number.isFinite(def.publishedAt.getTime()) && def.retiredAt === null &&\n Boolean(def.createdByAdminId) && def.sourceLanguageTag === \"en\" &&\n def.astSchemaVersion === 1 && /^[a-f0-9]{64}$/.test(def.sourceHash);\n}\n\nexport function languageChoices(input: {\n conversationTag: string | null;\n merchantTag: string | null;\n preferredTag: string | null | undefined;\n platformFallbackTag: string | null;\n}, onInvalid?: (error: unknown) => void): string[] | \"invalid\" {\n let customer: string | null;\n let merchant: string | null;\n let caller: string | null;\n let platform: string | null;\n try {\n customer = canonicalTag(input.conversationTag);\n merchant = canonicalTag(input.merchantTag);\n caller = canonicalTag(input.preferredTag);\n platform = canonicalTag(input.platformFallbackTag);\n } catch (error) { onInvalid?.(error); return \"invalid\"; }\n if ((input.conversationTag && !customer) || (input.merchantTag && !merchant) ||\n (input.preferredTag && !caller) || (input.platformFallbackTag && !platform)) return \"invalid\";\n // The stored conversation language is authoritative. Caller cannot override it.\n if (caller && customer && caller !== customer) return \"invalid\";\n const choices: string[] = [];\n const add = (tag: string | null) => { if (tag && !choices.includes(tag)) choices.push(tag); };\n add(customer ?? caller);\n const base = customer ?? caller;\n if (base) {\n try { add(new Intl.Locale(base).language); } catch (error) { onInvalid?.(error); return \"invalid\"; }\n }\n add(merchant);\n add(platform);\n return choices;\n}\n","import { renderCommerceProductFacts } from \"./facts.js\";\nimport { CommerceFinalResponseSchema, type CommerceFinalResponse } from \"../response.js\";\nimport { CommerceVerifiedPresentationSchema, type CommerceVerifiedPresentation } from \"./schemas.js\";\nimport { normalizeCommerceReplyText } from \"./format.js\";\nimport { renderRecommendationReply } from \"./render.js\";\nimport { renderProductOptionFacts } from \"./options.js\";\nimport { buildReplyCandidates } from \"./candidates.js\";\nimport { canonicalTag, chooseSlot, languageChoices, validDefinition } from \"./wrapper-selection.js\";\nimport { readPreparedWrapper, type PresentationDigest } from \"./wrapper-projection.js\";\nimport { renderPreparedWrapper } from \"./wrapper-render.js\";\nimport { resolveModaConfigurationLocale } from \"../../internationalization.js\";\nimport type { VerifiedWrapperContext, WrapperSlot } from \"./wrapper-contracts.js\";\nexport type CommerceWhatsAppPreviewInput = {\n envelope: CommerceFinalResponse;\n presentation: import(\"zod\").input<typeof CommerceVerifiedPresentationSchema>;\n /** Must agree with the host-verified projection. */\n locale?: string;\n brandName?: string | null;\n wrapper?: {slots:readonly WrapperSlot[];context:VerifiedWrapperContext;digest:PresentationDigest;platformFallbackLanguageTag?:string|null;languageTag?:string|null} | null;\n};\nexport type CommerceWhatsAppPreviewResult={kind:\"ready\";body:string;candidates:readonly string[];wrapper:{definitionId:string;localeId:string;contentHash:string;slotEditVersion:number}|null}|{kind:\"refused\";reason:string};\nfunction candidatesFor(envelope:CommerceFinalResponse,p:import(\"zod\").output<typeof CommerceVerifiedPresentationSchema>):readonly string[] {\n if(envelope.answerKind===\"REFER_TO_STORE\")return buildReplyCandidates({fullBody:normalizeCommerceReplyText(envelope.replyText),minimalBody:normalizeCommerceReplyText(envelope.replyText)});\n if(p.disposition===\"PRODUCT_DETAILS\")return buildReplyCandidates({fullBody:renderCommerceProductFacts(p.productFacts,p.locale),firstProductBody:p.productFacts.length>1?renderCommerceProductFacts(p.productFacts.slice(0,1),p.locale):null,minimalBody:renderCommerceProductFacts([],p.locale)});\n if(p.disposition===\"PRODUCT_OPTIONS\")return buildReplyCandidates({fullBody:renderProductOptionFacts(p.optionFacts,p.locale),firstProductBody:p.optionFacts.length>1?renderProductOptionFacts(p.optionFacts.slice(0,1),p.locale):null,minimalBody:renderProductOptionFacts([],p.locale)});\n if(p.products.length||p.disposition!==\"STANDARD\"||p.requiresShipping!==null||p.policyUrl){\n const shared={locale:p.locale,disposition:p.disposition,storeUrl:p.storeUrl,policyUrl:p.policyUrl,requiresShipping:p.requiresShipping};\n return buildReplyCandidates({fullBody:renderRecommendationReply({...shared,products:p.products,includeNoVerifiedOffer:p.includeNoVerifiedOffer}),firstProductBody:p.products.length?renderRecommendationReply({...shared,products:p.products.slice(0,1),includeNoVerifiedOffer:p.includeNoVerifiedOffer}):null,minimalBody:renderRecommendationReply({...shared,products:[]})});\n }\n const body=normalizeCommerceReplyText(envelope.replyText);return buildReplyCandidates({fullBody:body,minimalBody:body});\n}\n/** Pure formatting/projection only; never moderation, billing or send admission. */\nexport function composeCommerceWhatsAppPreview(input:CommerceWhatsAppPreviewInput):CommerceWhatsAppPreviewResult {\n try {\n const envelope=CommerceFinalResponseSchema.parse(input.envelope),p=CommerceVerifiedPresentationSchema.parse(input.presentation);\n if((input.locale!==undefined&&resolveModaConfigurationLocale(input.locale)!==p.locale)||(input.brandName!==undefined&&input.brandName!==p.brandName))return {kind:\"refused\",reason:\"INVALID_INPUT\"};\n const candidates=candidatesFor(envelope,p);if(candidates[0]&&/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/.test(candidates[0]))return {kind:\"refused\",reason:\"INVALID_INPUT\"};if(!candidates.length)return {kind:\"refused\",reason:\"OUTPUT_TOO_LONG\"};\n const w=input.wrapper;\n // With no configured wrapper, still enforce the plain-text controls and bounds.\n if(!w||!w.slots.length){const body=candidates[0]!;if(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/.test(body))return {kind:\"refused\",reason:\"INVALID_INPUT\"};return {kind:\"ready\",body,candidates,wrapper:null};}\n const slot=chooseSlot(w.slots,\"AI\");if(!slot)return {kind:\"ready\",body:candidates[0]!,candidates,wrapper:null};if(slot===\"invalid\"||!validDefinition(slot.definition,slot))return {kind:\"refused\",reason:\"DEFINITION_UNAVAILABLE\"};\n const choices=languageChoices({conversationTag:w.context.conversationLanguageTag,merchantTag:w.context.merchantLanguageTag,preferredTag:w.languageTag,platformFallbackTag:w.platformFallbackLanguageTag??null});\n if(choices===\"invalid\")return {kind:\"refused\",reason:\"INVALID_LANGUAGE\"};\n const effectiveTag=canonicalTag(w.context.conversationLanguageTag),bodyLocale=resolveModaConfigurationLocale(effectiveTag);\n if(bodyLocale!==p.locale)return {kind:\"refused\",reason:\"INVALID_LANGUAGE\"};\n const language=new Intl.Locale(bodyLocale).language;\n const lookup=[...new Set([effectiveTag,bodyLocale,...choices].filter((tag):tag is string=>tag!==null))].filter(tag=>new Intl.Locale(tag).language===language&&resolveModaConfigurationLocale(tag)===bodyLocale);\n const locale=lookup.map(tag=>slot.definition.locales.find(row=>row.languageTag===tag)).find(row=>row!==undefined);\n if(!locale||locale.status!==(locale.languageTag===\"en\"?\"SOURCE_SAVED\":\"REVIEWED\")||locale.providerLanguageCode!==null||(locale.languageTag!==\"en\"&&(!locale.reviewedAt||!locale.reviewedByAdminId)))return {kind:\"refused\",reason:\"LOCALE_UNAVAILABLE\"};\n const projection=readPreparedWrapper(locale.localeAst,locale.contentHash,w.digest);if(projection.kind!==\"ok\")return {kind:\"refused\",reason:projection.kind===\"missing\"?\"PREPARED_MISSING\":\"PREPARED_INVALID\"};\n for(const candidate of candidates){const rendered=renderPreparedWrapper({prepared:projection.prepared,context:w.context,responseBody:candidate});if(rendered.kind===\"rendered\")return {kind:\"ready\",body:rendered.body,candidates,wrapper:{definitionId:slot.definitionId,localeId:locale.id,contentHash:locale.contentHash!,slotEditVersion:slot.editVersion}};if(rendered.reason!==\"OUTPUT_TOO_LONG\")return {kind:\"refused\",reason:rendered.reason};}\n return {kind:\"refused\",reason:\"OUTPUT_TOO_LONG\"};\n } catch {return {kind:\"refused\",reason:\"INVALID_INPUT\"};}\n}\n"],"mappings":"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","names":["product","labels","z","labels","z","z","product","z","product"]}
1
+ {"version":3,"sources":["../../../src/commerce/presentation/facts.ts","../../../src/commerce/presentation/fact-messages.ts","../../../src/commerce/presentation/schemas.ts","../../../src/commerce/presentation/option-messages.ts","../../../src/commerce/presentation/messages.ts","../../../src/commerce/presentation/options.ts","../../../src/commerce/presentation/format.ts","../../../src/commerce/presentation/money.ts","../../../src/commerce/presentation/render.ts","../../../src/commerce/presentation/candidates.ts","../../../src/commerce/presentation/shipping.ts","../../../src/commerce/presentation/wrapper-render.ts","../../../src/commerce/presentation/wrapper-selection.ts","../../../src/commerce/presentation/compose.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { CommerceProductStockSchema, CommerceProductSchema, CommerceProductOptionsSchema, CommerceProductSelectedOptionsSchema } from \"../schemas.js\";\nimport { CommerceProductDescriptionSchema, CommerceProductAttributesSchema } from \"../product-facts.js\";\nimport type { ModaSupportedLanguageTag } from \"../../internationalization.js\";\nimport { DateSchema } from \"../primitives.js\";\nimport { stockFactMessages } from \"./fact-messages.js\";\nimport { productFactMessages } from \"./fact-messages.js\";\nexport const CommerceProductFactSchema = z.strictObject({stock:CommerceProductStockSchema,observedAt:DateSchema,productId:z.string().min(1).max(128),variantId:z.string().min(1).max(128).nullable(),title:z.string().min(1).max(512),description:CommerceProductDescriptionSchema,attributes:CommerceProductAttributesSchema,options:CommerceProductOptionsSchema,selectedOptions:CommerceProductSelectedOptionsSchema});\nexport type CommerceProductFact = z.infer<typeof CommerceProductFactSchema>;\nexport function verifyCommerceProductFacts(selection: readonly {productId:string;variantId:string|null}[], currentProducts: readonly unknown[]): {kind:\"verified\";productFacts:CommerceProductFact[]}|{kind:\"limitation\";reason:\"INVALID_SELECTION\"|\"PRODUCT_NOT_FOUND\"|\"PRODUCT_INVALID\"} {\n const parsed=z.array(z.strictObject({productId:z.string().min(1).max(128),variantId:z.string().min(1).max(128).nullable()})).max(3).safeParse(selection);\n if(!parsed.success||new Set(selection.map(s=>JSON.stringify([s.productId,s.variantId]))).size!==selection.length)return {kind:\"limitation\",reason:\"INVALID_SELECTION\"};\n const facts:CommerceProductFact[]=[];\n for(const selected of parsed.data){const matches=currentProducts.filter(p=>p&&typeof p===\"object\"&&(p as {productId?:unknown}).productId===selected.productId&&(p as {variantId?:unknown}).variantId===selected.variantId);if(matches.length!==1)return {kind:\"limitation\",reason:\"PRODUCT_NOT_FOUND\"};const product=CommerceProductSchema.safeParse(matches[0]);if(!product.success)return {kind:\"limitation\",reason:\"PRODUCT_INVALID\"};facts.push({stock:product.data.stock??{status:'UNAVAILABLE'},observedAt:product.data.observedAt,productId:product.data.productId,variantId:product.data.variantId,title:product.data.title,description:product.data.description??{status:\"PARTIAL\",text:\"\"},attributes:product.data.attributes??{status:\"PARTIAL\",items:[]},options:product.data.options??{status:\"PARTIAL\",items:[]},selectedOptions:product.data.selectedOptions??[]});}\n return {kind:\"verified\",productFacts:facts};\n}\nexport function renderCommerceProductFacts(facts:readonly CommerceProductFact[],locale:ModaSupportedLanguageTag):string {\n const [unavailable,incomplete,selected]=productFactMessages[locale];if(!facts.length)return unavailable;\n return facts.map(f=>{\n const labels=stockFactMessages[locale];\n const lines:string[]=[f.stock.status==='KNOWN'?`${f.stock.scope==='VARIANT'?labels[1]:labels[0]}: ${new Intl.NumberFormat(locale).format(f.stock.quantity)}`:f.stock.status==='NOT_TRACKED'?labels[2]:labels[3]];\n if(f.description.text)lines.push(f.description.text);\n const selectedLines = [...new Set(f.selectedOptions.map(o=>`${o.name}: ${o.value}`))];\n const factLines = [...f.attributes.items.map(a=>`${a.name}: ${a.values.length?a.values.join(\", \"):unavailable}`),...f.options.items.filter(o=>!f.attributes.items.some(a=>a.name===o.name&&JSON.stringify(a.values)===JSON.stringify(o.values))).map(o=>`${o.name}: ${o.values.length?o.values.join(\", \"):unavailable}`)];\n lines.push(...new Set(factLines.filter(line=>!selectedLines.includes(line))));\n if(selectedLines.length)lines.push(`${selected}:`,...selectedLines);\n if(!f.description.text&&!f.attributes.items.some(a=>a.values.length)&&!f.options.items.some(o=>o.values.length)&&!selectedLines.length)lines.push(unavailable);\n if([f.description.status,f.attributes.status,f.options.status].includes(\"PARTIAL\"))lines.push(incomplete);\n return [f.title,...lines].join(\"\\n\");\n }).join(\"\\n\\n\");\n}\n","import type { ModaSupportedLanguageTag } from \"../../internationalization.js\";\nconst labels: Record<ModaSupportedLanguageTag, readonly [string,string,string]> = {\n \"zh-Hans\":[\"商品详情不可用。\",\"商品信息不完整。\",\"所选选项\"],\"zh-Hant\":[\"商品詳情無法取得。\",\"商品資訊不完整。\",\"所選選項\"],\n cs:[\"Podrobnosti produktu nejsou dostupné.\",\"Informace o produktu jsou neúplné.\",\"Vybrané možnosti\"],da:[\"Produktoplysninger er ikke tilgængelige.\",\"Produktoplysningerne er ufuldstændige.\",\"Valgte muligheder\"],nl:[\"Productdetails zijn niet beschikbaar.\",\"De productinformatie is onvolledig.\",\"Geselecteerde opties\"],en:[\"Product details are unavailable.\",\"Product information is incomplete.\",\"Selected options\"],fi:[\"Tuotetietoja ei ole saatavilla.\",\"Tuotetiedot ovat puutteelliset.\",\"Valitut vaihtoehdot\"],fr:[\"Les détails du produit sont indisponibles.\",\"Les informations du produit sont incomplètes.\",\"Options sélectionnées\"],de:[\"Produktdetails sind nicht verfügbar.\",\"Die Produktinformationen sind unvollständig.\",\"Ausgewählte Optionen\"],it:[\"I dettagli del prodotto non sono disponibili.\",\"Le informazioni sul prodotto sono incomplete.\",\"Opzioni selezionate\"],ja:[\"商品詳細を確認できません。\",\"商品情報は完全ではありません。\",\"選択したオプション\"],ko:[\"제품 세부 정보를 확인할 수 없습니다.\",\"제품 정보가 완전하지 않습니다.\",\"선택한 옵션\"],nb:[\"Produktdetaljer er ikke tilgjengelige.\",\"Produktinformasjonen er ufullstendig.\",\"Valgte alternativer\"],pl:[\"Szczegóły produktu są niedostępne.\",\"Informacje o produkcie są niepełne.\",\"Wybrane opcje\"],\"pt-BR\":[\"Os detalhes do produto estão indisponíveis.\",\"As informações do produto estão incompletas.\",\"Opções selecionadas\"],\"pt-PT\":[\"Os detalhes do produto estão indisponíveis.\",\"As informações do produto estão incompletas.\",\"Opções selecionadas\"],es:[\"Los detalles del producto no están disponibles.\",\"La información del producto está incompleta.\",\"Opciones seleccionadas\"],sv:[\"Produktinformation är inte tillgänglig.\",\"Produktinformationen är ofullständig.\",\"Valda alternativ\"],th:[\"ไม่มีรายละเอียดสินค้า\",\"ข้อมูลสินค้าไม่ครบถ้วน\",\"ตัวเลือกที่เลือก\"],tr:[\"Ürün ayrıntıları mevcut değil.\",\"Ürün bilgileri eksik.\",\"Seçilen seçenekler\"]};\nexport const productFactMessages = Object.freeze(labels);\n\n/** Aggregate sellable counts for the exact selected identity, never a fulfillment promise. */\nexport const stockFactMessages:Readonly<Record<ModaSupportedLanguageTag,readonly [string,string,string,string]>>=Object.freeze({\n en:['Stock (product)','Stock (selected variant)','Stock is not tracked.','Stock is unavailable.'],\n 'zh-Hans':['库存(商品)','库存(所选款式)','未跟踪库存。','库存信息不可用。'],\n 'zh-Hant':['庫存(商品)','庫存(所選款式)','未追蹤庫存。','庫存資訊無法取得。'],\n cs:['Zásoby (produkt)','Zásoby (vybraná varianta)','Zásoby nejsou sledovány.','Zásoby nejsou dostupné.'],\n da:['Lager (produkt)','Lager (valgt variant)','Lager spores ikke.','Lageroplysninger er ikke tilgængelige.'],\n nl:['Voorraad (product)','Voorraad (geselecteerde variant)','Voorraad wordt niet bijgehouden.','Voorraad is niet beschikbaar.'],\n fi:['Varasto (tuote)','Varasto (valittu vaihtoehto)','Varastoa ei seurata.','Varastotietoja ei ole saatavilla.'],\n fr:['Stock (produit)','Stock (variante sélectionnée)','Le stock n’est pas suivi.','Le stock est indisponible.'],\n de:['Bestand (Produkt)','Bestand (ausgewählte Variante)','Der Bestand wird nicht verfolgt.','Der Bestand ist nicht verfügbar.'],\n it:['Scorte (prodotto)','Scorte (variante selezionata)','Le scorte non sono monitorate.','Le scorte non sono disponibili.'],\n ja:['在庫(商品)','在庫(選択したバリエーション)','在庫は追跡されていません。','在庫情報を確認できません。'],\n ko:['재고 (제품)','재고 (선택한 옵션)','재고를 추적하지 않습니다.','재고 정보를 확인할 수 없습니다.'],\n nb:['Lager (produkt)','Lager (valgt variant)','Lager spores ikke.','Lagerinformasjon er ikke tilgjengelig.'],\n pl:['Stan magazynowy (produkt)','Stan magazynowy (wybrany wariant)','Stan magazynowy nie jest śledzony.','Stan magazynowy jest niedostępny.'],\n 'pt-BR':['Estoque (produto)','Estoque (variante selecionada)','O estoque não é acompanhado.','O estoque está indisponível.'],\n 'pt-PT':['Stock (produto)','Stock (variante selecionada)','O stock não é acompanhado.','O stock está indisponível.'],\n es:['Existencias (producto)','Existencias (variante seleccionada)','No se realiza seguimiento de existencias.','Las existencias no están disponibles.'],\n sv:['Lager (produkt)','Lager (vald variant)','Lager spåras inte.','Lagerinformation är inte tillgänglig.'],\n th:['สต็อก (สินค้า)','สต็อก (ตัวเลือกที่เลือก)','ไม่มีการติดตามสต็อก','ไม่มีข้อมูลสต็อก'],\n tr:['Stok (ürün)','Stok (seçilen varyant)','Stok takip edilmiyor.','Stok bilgisi mevcut değil.']\n});\n","import { CommerceProductFactSchema } from \"./facts.js\";\nimport { z } from \"zod\";\nimport { ModaSupportedLanguageTagSchema } from \"../../internationalization.js\";\nimport { CommerceOptionFactSchema } from \"./options.js\";\nconst safeUrl=z.string().max(2048).refine(value=>{try{const u=new URL(value);return !/[\\x00-\\x1f\\x7f]/.test(value)&&!u.hostname.startsWith(\"[\")&&!/^[0-9.]+$/.test(u.hostname)&&u.hostname!==\"localhost\"&&!u.hostname.endsWith(\".localhost\")&&u.protocol===\"https:\"&&!u.username&&!u.password&&!u.port&&!u.hash;}catch{return false;}});\nconst product=z.strictObject({title:z.string().min(1).max(512),url:safeUrl,quantity:z.number().int().min(1).max(Number.MAX_SAFE_INTEGER),scope:z.enum([\"PRODUCT_ONLY\",\"ADD_TO_BASKET\",\"REPLACE_BASKET_LINE\"]),currentPrice:z.string().max(128).nullable(),currency:z.string().regex(/^[A-Z]{3}$/).nullable(),regularPrice:z.string().max(128).nullable().optional(),offerTerms:z.array(z.strictObject({kind:z.enum([\"percent\",\"amount\",\"free-shipping\"]),value:z.string().max(128).optional(),currency:z.string().regex(/^[A-Z]{3}$/).optional(),code:z.string().max(128).nullable().optional(),automatic:z.boolean().optional()})).max(32).optional()});\nexport const CommerceVerifiedPresentationSchema=z.strictObject({schemaVersion:z.literal(1),brandName:z.string().min(1).max(512).nullable(),locale:ModaSupportedLanguageTagSchema,disposition:z.enum([\"STANDARD\",\"OUT_OF_SCOPE_REDIRECT\",\"SHIPPING_INFORMATION_UNVERIFIED\",\"PRODUCT_OPTIONS\",\"PRODUCT_DETAILS\"]),storeUrl:safeUrl.refine(value=>!new URL(value).search),products:z.array(product).max(3),productFacts:z.array(CommerceProductFactSchema).max(3).default([]),optionFacts:z.array(CommerceOptionFactSchema).max(3),requiresShipping:z.boolean().nullable(),policyUrl:safeUrl.refine(value=>!new URL(value).search).nullable(),includeNoVerifiedOffer:z.boolean()}).superRefine((v,c)=>{if(v.disposition===\"PRODUCT_DETAILS\"&&(!v.productFacts.length||v.optionFacts.length||v.products.length))c.addIssue({code:\"custom\",message:\"Invalid product details combination\"});try {const origin=new URL(v.storeUrl).origin;if(v.products.some(p=>new URL(p.url).origin!==origin)||(v.policyUrl&&new URL(v.policyUrl).origin!==origin))c.addIssue({code:\"custom\",message:\"Presentation URL is outside current shop\"});} catch {c.addIssue({code:\"custom\",message:\"Invalid presentation URL\"});}});\nexport type CommerceVerifiedPresentation=z.input<typeof CommerceVerifiedPresentationSchema>;\n","import type { ModaSupportedLanguageTag } from \"../../internationalization.js\";\n// Full locale coverage mirrors the recommendation catalogue. Labels describe\n// supplied facts only; they never assert stock or infer unnamed option values.\nconst labels: Record<ModaSupportedLanguageTag, readonly [string,string,string]> = {\n \"zh-Hans\":[\"选项详情不可用。\",\"选项列表不完整。\",\"所选选项\"],\"zh-Hant\":[\"選項詳情無法取得。\",\"選項清單不完整。\",\"所選選項\"],\n cs:[\"Podrobnosti možností nejsou dostupné.\",\"Seznam možností není úplný.\",\"Vybrané možnosti\"],da:[\"Oplysninger om valgmuligheder er ikke tilgængelige.\",\"Listen over valgmuligheder er ufuldstændig.\",\"Valgte muligheder\"],nl:[\"Optiedetails zijn niet beschikbaar.\",\"De optielijst is onvolledig.\",\"Geselecteerde opties\"],en:[\"Option details are unavailable.\",\"The option list is incomplete.\",\"Selected options\"],fi:[\"Vaihtoehtojen tiedot eivät ole saatavilla.\",\"Vaihtoehtoluettelo on puutteellinen.\",\"Valitut vaihtoehdot\"],fr:[\"Les détails des options sont indisponibles.\",\"La liste des options est incomplète.\",\"Options sélectionnées\"],de:[\"Optionsdetails sind nicht verfügbar.\",\"Die Optionsliste ist unvollständig.\",\"Ausgewählte Optionen\"],it:[\"I dettagli delle opzioni non sono disponibili.\",\"L’elenco delle opzioni è incompleto.\",\"Opzioni selezionate\"],ja:[\"オプションの詳細は確認できません。\",\"オプション一覧は完全ではありません。\",\"選択したオプション\"],ko:[\"옵션 세부 정보를 확인할 수 없습니다.\",\"옵션 목록이 완전하지 않습니다.\",\"선택한 옵션\"],nb:[\"Alternativdetaljer er ikke tilgjengelige.\",\"Listen over alternativer er ufullstendig.\",\"Valgte alternativer\"],pl:[\"Szczegóły opcji są niedostępne.\",\"Lista opcji jest niepełna.\",\"Wybrane opcje\"],\"pt-BR\":[\"Os detalhes das opções estão indisponíveis.\",\"A lista de opções está incompleta.\",\"Opções selecionadas\"],\"pt-PT\":[\"Os detalhes das opções estão indisponíveis.\",\"A lista de opções está incompleta.\",\"Opções selecionadas\"],es:[\"Los detalles de las opciones no están disponibles.\",\"La lista de opciones está incompleta.\",\"Opciones seleccionadas\"],sv:[\"Alternativinformation är inte tillgänglig.\",\"Listan över alternativ är ofullständig.\",\"Valda alternativ\"],th:[\"ไม่มีรายละเอียดตัวเลือก\",\"รายการตัวเลือกไม่ครบถ้วน\",\"ตัวเลือกที่เลือก\"],tr:[\"Seçenek ayrıntıları mevcut değil.\",\"Seçenek listesi eksik.\",\"Seçilen seçenekler\"]};\nexport const productOptionMessages=Object.freeze(labels);\n","import { productOptionMessages } from \"./option-messages.js\";\nimport {\n createInternationalizationRuntime,\n MODA_SUPPORTED_LANGUAGE_TAGS,\n validateIcuCatalogue,\n type IcuMessageCatalogue,\n type ModaSupportedLanguageTag,\n} from \"../../internationalization.js\";\n\nexport const recommendationMessageKeys = [\n \"scopeLimit\", \"shippingUnverified\", \"shippingRequired\", \"shippingNotRequired\", \"policyLink\", \"storeLink\",\n \"productOption\", \"proposedQuantity\", \"addProposal\", \"replaceProposal\", \"currentPrice\", \"regularPrice\",\n \"percentTerms\", \"amountTerms\", \"freeShippingTerms\", \"code\", \"automatic\", \"checkoutQualification\",\n \"productLink\", \"noVerifiedOffer\", \"optionsUnavailable\", \"optionsPartial\", \"optionsSelected\",\n] as const;\ntype MessageKey = typeof recommendationMessageKeys[number];\n\nconst rows: Record<ModaSupportedLanguageTag, readonly string[]> = {\n \"zh-Hans\": [\"我可以帮助您了解本店商品,但无法回答这个问题。\", \"我无法确认您询问的配送详情。请向商店查询。\", \"此商品需要配送。\", \"此商品无需配送。\", \"配送政策:{url}\", \"商店:{url}\", \"{title}\", \"拟购买数量:{quantity}:\", \"如果您将此商品的 {quantity} 件加入购物篮:\", \"如果您用此商品的 {quantity} 件替换所选购物篮商品:\", \"当前标价:{price}\", \"常规标价:{price}\", \"优惠条款:{percentage} 折扣,具体取决于已核实的条件。\", \"优惠条款:减免 {amount},具体取决于已核实的条件。\", \"优惠条款:免费配送,以结账验证为准。\", \"优惠码:{code}\", \"自动优惠;最终应用以结账确认为准。\", \"资格和最终价格将在结账时确认。\", \"查看商品:{url}\", \"我无法核实此推荐适用的优惠。\"],\n \"zh-Hant\": [\"我可以協助您了解本店商品,但無法回答這個問題。\", \"我無法確認您詢問的配送詳情。請向商店查詢。\", \"此商品需要配送。\", \"此商品不需要配送。\", \"配送政策:{url}\", \"商店:{url}\", \"{title}\", \"擬購買數量:{quantity}:\", \"如果您將此商品的 {quantity} 件加入購物籃:\", \"如果您以此商品的 {quantity} 件取代所選購物籃商品:\", \"目前標價:{price}\", \"一般標價:{price}\", \"優惠條款:{percentage} 折扣,須符合已核實的條件。\", \"優惠條款:折抵 {amount},須符合已核實的條件。\", \"優惠條款:免費配送,以結帳驗證為準。\", \"優惠碼:{code}\", \"自動優惠;最終套用情況以結帳確認為準。\", \"資格和最終價格將於結帳時確認。\", \"查看商品:{url}\", \"我無法核實此推薦適用的優惠。\"],\n cs: [\"S produkty tohoto obchodu vám pomohu, na tuto otázku ale odpovědět nemohu.\", \"Požadované údaje o dopravě nemohu potvrdit. Ověřte je prosím u obchodu.\", \"Tuto položku je nutné odeslat.\", \"Tuto položku není nutné odesílat.\", \"Podmínky dopravy: {url}\", \"Obchod: {url}\", \"{title}\", \"Pro navrhovaný nákup v množství {quantity}:\", \"Pokud do košíku přidáte {quantity} kusů této položky:\", \"Pokud vybranou položku v košíku nahradíte {quantity} kusy tohoto zboží:\", \"Aktuální uvedená cena: {price}\", \"Běžná uvedená cena: {price}\", \"Podmínky nabídky: sleva {percentage}, podle ověřených podmínek.\", \"Podmínky nabídky: sleva {amount}, podle ověřených podmínek.\", \"Podmínky nabídky: doprava zdarma, podléhá ověření při placení.\", \"Kód: {code}\", \"Automatická nabídka; konečné uplatnění potvrdí pokladna.\", \"Nárok a konečnou cenu potvrdí pokladna.\", \"Zobrazit produkt: {url}\", \"U tohoto návrhu se nepodařilo ověřit použitelnou nabídku.\"],\n da: [\"Jeg kan hjælpe med butikkens produkter, men jeg kan ikke besvare det spørgsmål.\", \"Jeg kan ikke bekræfte de ønskede leveringsoplysninger. Spørg venligst butikken.\", \"Denne vare kræver levering.\", \"Denne vare kræver ikke levering.\", \"Leveringspolitik: {url}\", \"Butik: {url}\", \"{title}\", \"For et foreslået køb af {quantity}:\", \"Hvis du lægger {quantity} af denne vare i kurven:\", \"Hvis du erstatter den valgte vare i kurven med {quantity} af denne vare:\", \"Aktuel angivet pris: {price}\", \"Normal angivet pris: {price}\", \"Tilbudsvilkår: {percentage} rabat, afhængigt af de bekræftede vilkår.\", \"Tilbudsvilkår: {amount} i rabat, afhængigt af de bekræftede vilkår.\", \"Tilbudsvilkår: gratis levering, bekræftes ved betaling.\", \"Kode: {code}\", \"Automatisk tilbud; betaling bekræfter den endelige anvendelse.\", \"Berettigelse og endelig pris bekræftes ved betaling.\", \"Se produkt: {url}\", \"Jeg kunne ikke bekræfte et gældende tilbud for dette forslag.\"],\n nl: [\"Ik kan u helpen met producten van deze winkel, maar ik kan die vraag niet beantwoorden.\", \"Ik kan de gevraagde verzendgegevens niet bevestigen. Vraag het aan de winkel.\", \"Dit artikel moet worden verzonden.\", \"Dit artikel hoeft niet te worden verzonden.\", \"Verzendbeleid: {url}\", \"Winkel: {url}\", \"{title}\", \"Voor een voorgestelde aankoop van {quantity}:\", \"Als u {quantity} van dit artikel aan uw mandje toevoegt:\", \"Als u het gekozen artikel in uw mandje vervangt door {quantity} van dit artikel:\", \"Huidige vermelde prijs: {price}\", \"Normale vermelde prijs: {price}\", \"Aanbiedingsvoorwaarden: {percentage} korting, afhankelijk van de geverifieerde voorwaarden.\", \"Aanbiedingsvoorwaarden: {amount} korting, afhankelijk van de geverifieerde voorwaarden.\", \"Aanbiedingsvoorwaarden: gratis verzending, bevestiging bij het afrekenen.\", \"Code: {code}\", \"Automatische aanbieding; de kassa bevestigt de uiteindelijke toepassing.\", \"Voorwaarden en eindprijs worden bij het afrekenen bevestigd.\", \"Product bekijken: {url}\", \"Ik kon geen toepasbare aanbieding voor dit voorstel verifiëren.\"],\n en: [\"I can help with this store's products, but I can't answer that question.\", \"I can't confirm the shipping details for your request. Please check with the store.\", \"This item requires shipping.\", \"This item does not require shipping.\", \"Shipping policy: {url}\", \"Store: {url}\", \"{title}\", \"For a proposed purchase of {quantity}:\", \"If you add {quantity} of this item to your basket:\", \"If you replace the selected basket item with {quantity} of this item:\", \"Current listed price: {price}\", \"Regular listed price: {price}\", \"Offer terms: a {percentage} discount, subject to its verified conditions.\", \"Offer terms: a {amount} discount, subject to its verified conditions.\", \"Offer terms: free shipping, subject to checkout validation.\", \"Code: {code}\", \"Automatic offer; checkout confirms the final application.\", \"Eligibility and the final price are confirmed at checkout.\", \"View product: {url}\", \"I couldn't verify an applicable offer for this suggestion.\"],\n fi: [\"Voin auttaa tämän kaupan tuotteissa, mutta en voi vastata tähän kysymykseen.\", \"En voi vahvistaa pyytämiäsi toimitustietoja. Tarkista asia kaupasta.\", \"Tämä tuote on toimitettava.\", \"Tätä tuotetta ei tarvitse toimittaa.\", \"Toimitusehdot: {url}\", \"Kauppa: {url}\", \"{title}\", \"Ehdotetulle {quantity} tuotteen ostolle:\", \"Jos lisäät {quantity} tätä tuotetta koriisi:\", \"Jos korvaat valitun korituotteen {quantity} tällä tuotteella:\", \"Nykyinen ilmoitettu hinta: {price}\", \"Normaali ilmoitettu hinta: {price}\", \"Tarjouksen ehdot: {percentage} alennus vahvistettujen ehtojen mukaisesti.\", \"Tarjouksen ehdot: {amount} alennus vahvistettujen ehtojen mukaisesti.\", \"Tarjouksen ehdot: ilmainen toimitus, vahvistetaan kassalla.\", \"Koodi: {code}\", \"Automaattinen tarjous; kassa vahvistaa lopullisen käytön.\", \"Kelpoisuus ja lopullinen hinta vahvistetaan kassalla.\", \"Näytä tuote: {url}\", \"Tälle ehdotukselle ei voitu vahvistaa soveltuvaa tarjousta.\"],\n fr: [\"Je peux vous aider avec les produits de cette boutique, mais pas répondre à cette question.\", \"Je ne peux pas confirmer les détails de livraison demandés. Veuillez consulter la boutique.\", \"Cet article nécessite une livraison.\", \"Cet article ne nécessite pas de livraison.\", \"Politique de livraison : {url}\", \"Boutique : {url}\", \"{title}\", \"Pour un achat proposé de {quantity} :\", \"Si vous ajoutez {quantity} de cet article à votre panier :\", \"Si vous remplacez l'article sélectionné par {quantity} de cet article :\", \"Prix affiché actuel : {price}\", \"Prix affiché habituel : {price}\", \"Conditions de l'offre : remise de {percentage}, selon les conditions vérifiées.\", \"Conditions de l'offre : remise de {amount}, selon les conditions vérifiées.\", \"Conditions de l'offre : livraison gratuite, à confirmer lors du paiement.\", \"Code : {code}\", \"Offre automatique ; le paiement confirme son application finale.\", \"L'éligibilité et le prix final sont confirmés au paiement.\", \"Voir le produit : {url}\", \"Je n'ai pas pu vérifier une offre applicable à cette suggestion.\"],\n de: [\"Ich helfe Ihnen gern mit den Produkten dieses Shops, kann diese Frage aber nicht beantworten.\", \"Ich kann die gewünschten Versanddetails nicht bestätigen. Bitte fragen Sie beim Shop nach.\", \"Dieser Artikel muss versendet werden.\", \"Dieser Artikel muss nicht versendet werden.\", \"Versandbedingungen: {url}\", \"Shop: {url}\", \"{title}\", \"Für einen vorgeschlagenen Kauf von {quantity}:\", \"Wenn Sie {quantity} dieses Artikels in den Warenkorb legen:\", \"Wenn Sie den ausgewählten Warenkorbartikel durch {quantity} dieses Artikels ersetzen:\", \"Aktueller Listenpreis: {price}\", \"Regulärer Listenpreis: {price}\", \"Angebotsbedingungen: {percentage} Rabatt, vorbehaltlich der geprüften Bedingungen.\", \"Angebotsbedingungen: {amount} Rabatt, vorbehaltlich der geprüften Bedingungen.\", \"Angebotsbedingungen: kostenloser Versand, vorbehaltlich der Bestätigung beim Bezahlen.\", \"Code: {code}\", \"Automatisches Angebot; die Kasse bestätigt die endgültige Anwendung.\", \"Berechtigung und Endpreis werden beim Bezahlen bestätigt.\", \"Produkt ansehen: {url}\", \"Ich konnte kein passendes Angebot für diesen Vorschlag bestätigen.\"],\n it: [\"Posso aiutarti con i prodotti di questo negozio, ma non posso rispondere a questa domanda.\", \"Non posso confermare i dettagli di spedizione richiesti. Contatta il negozio.\", \"Questo articolo richiede la spedizione.\", \"Questo articolo non richiede la spedizione.\", \"Politica di spedizione: {url}\", \"Negozio: {url}\", \"{title}\", \"Per un acquisto proposto di {quantity}:\", \"Se aggiungi {quantity} di questo articolo al carrello:\", \"Se sostituisci l'articolo selezionato nel carrello con {quantity} di questo articolo:\", \"Prezzo di listino attuale: {price}\", \"Prezzo di listino normale: {price}\", \"Termini dell'offerta: sconto del {percentage}, secondo le condizioni verificate.\", \"Termini dell'offerta: sconto di {amount}, secondo le condizioni verificate.\", \"Termini dell'offerta: spedizione gratuita, da verificare al pagamento.\", \"Codice: {code}\", \"Offerta automatica; il pagamento conferma l'applicazione finale.\", \"Idoneità e prezzo finale sono confermati al pagamento.\", \"Visualizza prodotto: {url}\", \"Non ho potuto verificare un'offerta applicabile a questo suggerimento.\"],\n ja: [\"このストアの商品についてはお手伝いできますが、その質問には回答できません。\", \"ご希望の配送情報を確認できません。ストアにご確認ください。\", \"この商品は配送が必要です。\", \"この商品は配送不要です。\", \"配送ポリシー:{url}\", \"ストア:{url}\", \"{title}\", \"購入候補数 {quantity}:\", \"この商品を {quantity} 個カートに追加する場合:\", \"選択したカート商品をこの商品 {quantity} 個に置き換える場合:\", \"現在の表示価格:{price}\", \"通常の表示価格:{price}\", \"オファー条件:確認済みの条件に従い {percentage} 割引。\", \"オファー条件:確認済みの条件に従い {amount} 割引。\", \"オファー条件:送料無料。適用はチェックアウトで確認してください。\", \"コード:{code}\", \"自動オファーです。最終的な適用はチェックアウトで確認されます。\", \"適用条件と最終価格はチェックアウトで確認されます。\", \"商品を見る:{url}\", \"この提案に適用できるオファーを確認できませんでした。\"],\n ko: [\"이 스토어의 상품은 도와드릴 수 있지만 해당 질문에는 답변할 수 없습니다.\", \"요청하신 배송 정보를 확인할 수 없습니다. 스토어에 문의해 주세요.\", \"이 상품은 배송이 필요합니다.\", \"이 상품은 배송이 필요하지 않습니다.\", \"배송 정책: {url}\", \"스토어: {url}\", \"{title}\", \"제안 구매 수량 {quantity}개:\", \"이 상품 {quantity}개를 장바구니에 추가하면:\", \"선택한 장바구니 상품을 이 상품 {quantity}개로 교체하면:\", \"현재 표시 가격: {price}\", \"정상 표시 가격: {price}\", \"혜택 조건: 확인된 조건에 따라 {percentage} 할인.\", \"혜택 조건: 확인된 조건에 따라 {amount} 할인.\", \"혜택 조건: 무료 배송. 결제 단계에서 확인됩니다.\", \"코드: {code}\", \"자동 혜택이며 최종 적용은 결제 단계에서 확인됩니다.\", \"자격과 최종 가격은 결제 단계에서 확인됩니다.\", \"상품 보기: {url}\", \"이 제안에 적용 가능한 혜택을 확인하지 못했습니다.\"],\n nb: [\"Jeg kan hjelpe med produktene i denne butikken, men ikke svare på det spørsmålet.\", \"Jeg kan ikke bekrefte de ønskede fraktopplysningene. Kontakt butikken.\", \"Denne varen må sendes.\", \"Denne varen trenger ikke å sendes.\", \"Fraktvilkår: {url}\", \"Butikk: {url}\", \"{title}\", \"For et foreslått kjøp på {quantity}:\", \"Hvis du legger {quantity} av denne varen i handlekurven:\", \"Hvis du erstatter den valgte handlekurvvaren med {quantity} av denne varen:\", \"Gjeldende oppført pris: {price}\", \"Ordinær oppført pris: {price}\", \"Tilbudsvilkår: {percentage} rabatt, med forbehold om bekreftede vilkår.\", \"Tilbudsvilkår: {amount} rabatt, med forbehold om bekreftede vilkår.\", \"Tilbudsvilkår: gratis frakt, bekreftes i kassen.\", \"Kode: {code}\", \"Automatisk tilbud; kassen bekrefter endelig bruk.\", \"Kvalifikasjon og sluttpris bekreftes i kassen.\", \"Vis produkt: {url}\", \"Jeg kunne ikke bekrefte et gjeldende tilbud for dette forslaget.\"],\n pl: [\"Mogę pomóc w sprawie produktów tego sklepu, ale nie mogę odpowiedzieć na to pytanie.\", \"Nie mogę potwierdzić żądanych informacji o wysyłce. Sprawdź je w sklepie.\", \"Ten produkt wymaga wysyłki.\", \"Ten produkt nie wymaga wysyłki.\", \"Zasady wysyłki: {url}\", \"Sklep: {url}\", \"{title}\", \"Dla proponowanego zakupu w liczbie {quantity}:\", \"Jeśli dodasz {quantity} szt. tego produktu do koszyka:\", \"Jeśli zastąpisz wybrany produkt w koszyku {quantity} szt. tego produktu:\", \"Aktualna cena katalogowa: {price}\", \"Regularna cena katalogowa: {price}\", \"Warunki oferty: rabat {percentage}, zgodnie ze zweryfikowanymi warunkami.\", \"Warunki oferty: rabat {amount}, zgodnie ze zweryfikowanymi warunkami.\", \"Warunki oferty: bezpłatna wysyłka, do potwierdzenia przy kasie.\", \"Kod: {code}\", \"Oferta automatyczna; kasa potwierdzi ostateczne zastosowanie.\", \"Uprawnienie i cena końcowa zostaną potwierdzone przy kasie.\", \"Zobacz produkt: {url}\", \"Nie udało się potwierdzić oferty dla tej propozycji.\"],\n \"pt-BR\": [\"Posso ajudar com os produtos desta loja, mas não posso responder a essa pergunta.\", \"Não consigo confirmar os detalhes de envio solicitados. Consulte a loja.\", \"Este item precisa ser enviado.\", \"Este item não precisa ser enviado.\", \"Política de envio: {url}\", \"Loja: {url}\", \"{title}\", \"Para uma compra sugerida de {quantity}:\", \"Se você adicionar {quantity} deste item à sua cesta:\", \"Se você substituir o item selecionado da cesta por {quantity} deste item:\", \"Preço listado atual: {price}\", \"Preço listado normal: {price}\", \"Termos da oferta: desconto de {percentage}, sujeito às condições verificadas.\", \"Termos da oferta: desconto de {amount}, sujeito às condições verificadas.\", \"Termos da oferta: frete grátis, sujeito à validação no checkout.\", \"Código: {code}\", \"Oferta automática; o checkout confirma a aplicação final.\", \"A elegibilidade e o preço final são confirmados no checkout.\", \"Ver produto: {url}\", \"Não foi possível verificar uma oferta aplicável para esta sugestão.\"],\n \"pt-PT\": [\"Posso ajudar com os produtos desta loja, mas não posso responder a essa pergunta.\", \"Não consigo confirmar os detalhes de entrega pedidos. Consulte a loja.\", \"Este artigo requer entrega.\", \"Este artigo não requer entrega.\", \"Política de entrega: {url}\", \"Loja: {url}\", \"{title}\", \"Para uma compra proposta de {quantity}:\", \"Se adicionar {quantity} deste artigo ao cesto:\", \"Se substituir o artigo selecionado no cesto por {quantity} deste artigo:\", \"Preço atual anunciado: {price}\", \"Preço normal anunciado: {price}\", \"Condições da oferta: desconto de {percentage}, sujeito às condições verificadas.\", \"Condições da oferta: desconto de {amount}, sujeito às condições verificadas.\", \"Condições da oferta: entrega gratuita, sujeita a validação no pagamento.\", \"Código: {code}\", \"Oferta automática; o pagamento confirma a aplicação final.\", \"A elegibilidade e o preço final são confirmados no pagamento.\", \"Ver produto: {url}\", \"Não foi possível confirmar uma oferta aplicável a esta sugestão.\"],\n es: [\"Puedo ayudarle con los productos de esta tienda, pero no puedo responder a esa pregunta.\", \"No puedo confirmar los detalles de envío solicitados. Consulte con la tienda.\", \"Este artículo requiere envío.\", \"Este artículo no requiere envío.\", \"Política de envío: {url}\", \"Tienda: {url}\", \"{title}\", \"Para una compra propuesta de {quantity}:\", \"Si añade {quantity} de este artículo a la cesta:\", \"Si sustituye el artículo seleccionado de la cesta por {quantity} de este artículo:\", \"Precio actual indicado: {price}\", \"Precio habitual indicado: {price}\", \"Condiciones de la oferta: descuento del {percentage}, sujeto a las condiciones verificadas.\", \"Condiciones de la oferta: descuento de {amount}, sujeto a las condiciones verificadas.\", \"Condiciones de la oferta: envío gratis, sujeto a validación al pagar.\", \"Código: {code}\", \"Oferta automática; el pago confirma la aplicación final.\", \"La elegibilidad y el precio final se confirman al pagar.\", \"Ver producto: {url}\", \"No pude verificar una oferta aplicable a esta sugerencia.\"],\n sv: [\"Jag kan hjälpa till med butikens produkter, men jag kan inte svara på den frågan.\", \"Jag kan inte bekräfta de efterfrågade leveransuppgifterna. Fråga butiken.\", \"Den här varan måste skickas.\", \"Den här varan behöver inte skickas.\", \"Leveranspolicy: {url}\", \"Butik: {url}\", \"{title}\", \"För ett föreslaget köp av {quantity}:\", \"Om du lägger {quantity} av den här varan i varukorgen:\", \"Om du ersätter den valda varukorgsvaran med {quantity} av den här varan:\", \"Aktuellt listpris: {price}\", \"Ordinarie listpris: {price}\", \"Erbjudandevillkor: {percentage} rabatt, enligt verifierade villkor.\", \"Erbjudandevillkor: {amount} rabatt, enligt verifierade villkor.\", \"Erbjudandevillkor: fri frakt, bekräftas i kassan.\", \"Kod: {code}\", \"Automatiskt erbjudande; kassan bekräftar den slutliga tillämpningen.\", \"Behörighet och slutpris bekräftas i kassan.\", \"Visa produkt: {url}\", \"Jag kunde inte verifiera ett tillämpligt erbjudande för det här förslaget.\"],\n th: [\"ฉันช่วยแนะนำสินค้าในร้านนี้ได้ แต่ไม่สามารถตอบคำถามนั้นได้\", \"ฉันยืนยันรายละเอียดการจัดส่งตามที่ขอไม่ได้ โปรดตรวจสอบกับร้านค้า\", \"สินค้านี้ต้องจัดส่ง\", \"สินค้านี้ไม่ต้องจัดส่ง\", \"นโยบายการจัดส่ง: {url}\", \"ร้านค้า: {url}\", \"{title}\", \"สำหรับข้อเสนอซื้อจำนวน {quantity}:\", \"หากเพิ่มสินค้านี้ {quantity} ชิ้นลงในตะกร้า:\", \"หากแทนที่สินค้าในตะกร้าที่เลือกด้วยสินค้านี้ {quantity} ชิ้น:\", \"ราคาปัจจุบันที่แสดง: {price}\", \"ราคาปกติที่แสดง: {price}\", \"เงื่อนไขข้อเสนอ: ส่วนลด {percentage} ตามเงื่อนไขที่ตรวจสอบแล้ว\", \"เงื่อนไขข้อเสนอ: ส่วนลด {amount} ตามเงื่อนไขที่ตรวจสอบแล้ว\", \"เงื่อนไขข้อเสนอ: จัดส่งฟรี โดยต้องยืนยันที่หน้าชำระเงิน\", \"รหัส: {code}\", \"ข้อเสนออัตโนมัติ ระบบชำระเงินจะยืนยันการใช้ขั้นสุดท้าย\", \"ตรวจสอบสิทธิ์และราคาสุดท้ายที่หน้าชำระเงิน\", \"ดูสินค้า: {url}\", \"ฉันตรวจสอบข้อเสนอที่ใช้ได้สำหรับคำแนะนำนี้ไม่ได้\"],\n tr: [\"Bu mağazanın ürünleri konusunda yardımcı olabilirim ancak bu soruyu yanıtlayamam.\", \"İstediğiniz gönderim ayrıntılarını doğrulayamıyorum. Lütfen mağazaya danışın.\", \"Bu ürünün gönderilmesi gerekir.\", \"Bu ürünün gönderilmesi gerekmez.\", \"Gönderim politikası: {url}\", \"Mağaza: {url}\", \"{title}\", \"Önerilen {quantity} adetlik satın alma için:\", \"Bu üründen {quantity} adet sepetinize eklerseniz:\", \"Seçili sepet ürününü bu üründen {quantity} adetle değiştirirseniz:\", \"Güncel liste fiyatı: {price}\", \"Normal liste fiyatı: {price}\", \"Teklif koşulları: doğrulanmış koşullara tabi {percentage} indirim.\", \"Teklif koşulları: doğrulanmış koşullara tabi {amount} indirim.\", \"Teklif koşulları: ücretsiz gönderim; ödeme sırasında doğrulanır.\", \"Kod: {code}\", \"Otomatik teklif; son uygulamayı ödeme ekranı doğrular.\", \"Uygunluk ve son fiyat ödeme sırasında doğrulanır.\", \"Ürünü görüntüle: {url}\", \"Bu öneri için geçerli bir teklifi doğrulayamadım.\"],\n};\n\nexport const recommendationMessages = Object.fromEntries(MODA_SUPPORTED_LANGUAGE_TAGS.map((locale) => {\n const values = [...rows[locale], ...productOptionMessages[locale]];\n if (values.length !== recommendationMessageKeys.length) throw new Error(`INVALID_RECOMMENDATION_CATALOGUE:${locale}`);\n return [locale, Object.freeze(Object.fromEntries(recommendationMessageKeys.map((key, index) => [key, values[index]!])) as Record<MessageKey, string>)];\n})) as Readonly<Record<ModaSupportedLanguageTag, IcuMessageCatalogue>>;\n\nfor (const locale of MODA_SUPPORTED_LANGUAGE_TAGS) validateIcuCatalogue(recommendationMessages[locale], recommendationMessageKeys, { locale });\n\nexport function recommendationMessage(locale: ModaSupportedLanguageTag, key: MessageKey, values?: Record<string, string | number>): string {\n return createInternationalizationRuntime({ locale, catalogue: recommendationMessages[locale] }).t(key, values);\n}\n","import { recommendationMessage } from \"./messages.js\";\nimport { z } from \"zod\";\nimport { CommerceProductSchema, CommerceProductOptionsSchema, CommerceProductSelectedOptionsSchema } from \"../schemas.js\";\nimport { type ModaSupportedLanguageTag } from \"../../internationalization.js\";\nexport const CommerceOptionFactSchema = z.strictObject({productId:z.string().min(1).max(128),variantId:z.string().min(1).max(128).nullable(),title:z.string().min(1).max(512),options:CommerceProductOptionsSchema,selectedOptions:CommerceProductSelectedOptionsSchema});\nexport type CommerceOptionFact = z.infer<typeof CommerceOptionFactSchema>;\nexport function verifyCommerceOptionFacts(selection: readonly {productId:string;variantId:string|null}[], currentProducts: readonly unknown[]): {kind:\"verified\";optionFacts:CommerceOptionFact[]}|{kind:\"limitation\";reason:\"INVALID_SELECTION\"|\"PRODUCT_NOT_FOUND\"|\"PRODUCT_INVALID\"} {\n const parsed=z.array(z.strictObject({productId:z.string().min(1).max(128),variantId:z.string().min(1).max(128).nullable()})).max(3).safeParse(selection);\n if(!parsed.success||new Set(selection.map(s=>JSON.stringify([s.productId,s.variantId]))).size!==selection.length)return {kind:\"limitation\",reason:\"INVALID_SELECTION\"};\n const facts:CommerceOptionFact[]=[];\n for(const selected of parsed.data){const matches=currentProducts.filter(p=>p&&typeof p===\"object\"&&(p as {productId?:unknown}).productId===selected.productId&&(p as {variantId?:unknown}).variantId===selected.variantId);if(matches.length!==1)return {kind:\"limitation\",reason:\"PRODUCT_NOT_FOUND\"};const product=CommerceProductSchema.safeParse(matches[0]);if(!product.success)return {kind:\"limitation\",reason:\"PRODUCT_INVALID\"};facts.push({productId:product.data.productId,variantId:product.data.variantId,title:product.data.title,options:product.data.options??{status:\"PARTIAL\",items:[]},selectedOptions:product.data.selectedOptions??[]});}\n return {kind:\"verified\",optionFacts:facts};\n}\nexport function renderProductOptionFacts(facts:readonly CommerceOptionFact[],locale:ModaSupportedLanguageTag):string {\n const unavailable=recommendationMessage(locale,\"optionsUnavailable\"),partial=recommendationMessage(locale,\"optionsPartial\"),selected=recommendationMessage(locale,\"optionsSelected\");if(!facts.length)return unavailable;\n return facts.map(f=>[f.title,...(f.options.status===\"PARTIAL\"?[partial]:[]),...(f.options.items.length?f.options.items.map(o=>`${o.name}: ${o.values.length?o.values.join(\", \"):unavailable}`):[unavailable]),...(f.selectedOptions.length?[`${selected}:`,...f.selectedOptions.map(o=>`${o.name}: ${o.value}`)]:[])].join(\"\\n\")).join(\"\\n\\n\");\n}\n","/** Plain text only. Unbalanced markers and non-HTTPS links remain literal. */\nexport function normalizeCommerceReplyText(value:string):string {\n const linked=value.replace(/\\[([^\\]\\r\\n]+)\\]\\((https:\\/\\/[^\\s)]+)\\)/g,(original,label:string,raw:string)=>{try{const url=new URL(raw);return url.protocol===\"https:\"&&!url.username&&!url.password?`${label}: ${raw}`:original;}catch{return original;}});\n const strip=(text:string,pattern:RegExp)=>text.replace(pattern,(original:string,inner:string,offset:number,source:string)=>/https?:\\/\\/[^\\s]*$/.test(source.slice(0,offset))?original:inner);\n return strip(strip(linked,/\\*\\*([^*]+)\\*\\*/g),/~~([^~]+)~~/g);\n}\n","import type { InternationalizationRuntime } from \"../../internationalization.js\";\n\nconst DECIMAL = /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/;\nexport function isValidDecimal(value: string): boolean { return DECIMAL.test(value); }\n\nexport function currencyExponent(currency: string): number | null {\n try {\n const options = new Intl.NumberFormat(\"en\", { style: \"currency\", currency }).resolvedOptions();\n const exponent = options.maximumFractionDigits;\n return typeof exponent === \"number\" && Number.isInteger(exponent) && exponent >= 0 && exponent <= 4 &&\n options.minimumFractionDigits === exponent ? exponent : null;\n } catch { return null; }\n}\n\nexport function minorUnitsToDecimal(value: bigint, currency: string): string | null {\n const exponent = currencyExponent(currency);\n if (exponent === null || value < 0n) return null;\n if (exponent === 0) return value.toString();\n const padded = value.toString().padStart(exponent + 1, \"0\");\n return `${padded.slice(0, -exponent)}.${padded.slice(-exponent)}`;\n}\n\nfunction minorUnits(value: string, exponent: number): bigint | null {\n if (!DECIMAL.test(value)) return null;\n const [whole = \"\", fraction = \"\"] = value.split(\".\");\n if (fraction.length > exponent) return null;\n try { return BigInt(`${whole}${fraction.padEnd(exponent, \"0\")}`); }\n catch { return null; }\n}\n\nexport function decimalToMinorUnits(value: string, currency: string): bigint | null {\n const exponent = currencyExponent(currency);\n return exponent === null ? null : minorUnits(value, exponent);\n}\n\nexport function sumPurchaseSubtotal(lines: readonly Readonly<{ amountDecimal: string; quantity: number }>[], currency: string): bigint | null {\n let total = 0n;\n for (const line of lines) {\n if (!Number.isSafeInteger(line.quantity) || line.quantity < 1) return null;\n const amount = decimalToMinorUnits(line.amountDecimal, currency);\n if (amount === null) return null;\n total += amount * BigInt(line.quantity);\n }\n return total;\n}\n\nexport function formatObservedMoney(value: string, currency: string, runtime: InternationalizationRuntime): string | null {\n const minor = decimalToMinorUnits(value, currency);\n const exponent = currencyExponent(currency);\n if (minor === null || exponent === null || minor > BigInt(Number.MAX_SAFE_INTEGER)) return null;\n const numeric = Number(minor) / 10 ** exponent;\n if (!Number.isFinite(numeric) || decimalToMinorUnits(numeric.toFixed(exponent), currency) !== minor) return null;\n try { return runtime.formatMoney(numeric, currency); } catch { return null; }\n}\n","import { createInternationalizationRuntime } from \"../../internationalization.js\";\nimport type { ModaSupportedLanguageTag } from \"../../internationalization.js\";\nimport { recommendationMessage } from \"./messages.js\";\nimport { formatObservedMoney } from \"./money.js\";\nimport { recommendationMessages } from \"./messages.js\";\n\nexport type RenderRecommendationProduct = Readonly<{\n title: string;\n url: string;\n quantity: number;\n scope: \"PRODUCT_ONLY\" | \"ADD_TO_BASKET\" | \"REPLACE_BASKET_LINE\";\n currentPrice: string | null;\n currency: string | null;\n regularPrice?: string | null;\n offerTerms?: readonly Readonly<{ kind: \"percent\" | \"amount\" | \"free-shipping\"; value?: string; currency?: string; code?: string | null; automatic?: boolean }> [];\n}>;\n\nexport function renderRecommendationReply(input: {\n locale: ModaSupportedLanguageTag;\n disposition: \"STANDARD\" | \"OUT_OF_SCOPE_REDIRECT\" | \"SHIPPING_INFORMATION_UNVERIFIED\";\n storeUrl: string;\n policyUrl?: string | null;\n requiresShipping?: boolean | null;\n products?: readonly RenderRecommendationProduct[];\n includeNoVerifiedOffer?: boolean;\n}): string {\n const t = (key: Parameters<typeof recommendationMessage>[1], values?: Record<string, string | number>) =>\n recommendationMessage(input.locale, key, values);\n const lines: string[] = [];\n if (input.disposition === \"OUT_OF_SCOPE_REDIRECT\") lines.push(t(\"scopeLimit\"));\n if (input.disposition === \"SHIPPING_INFORMATION_UNVERIFIED\") lines.push(t(\"shippingUnverified\"));\n if (input.requiresShipping !== null && input.requiresShipping !== undefined) {\n lines.push(t(input.requiresShipping ? \"shippingRequired\" : \"shippingNotRequired\"));\n }\n if (input.policyUrl) lines.push(t(\"policyLink\", { url: input.policyUrl }));\n for (const product of input.products ?? []) {\n if (product.scope === \"ADD_TO_BASKET\") lines.push(t(\"addProposal\", { quantity: product.quantity }));\n else if (product.scope === \"REPLACE_BASKET_LINE\") lines.push(t(\"replaceProposal\", { quantity: product.quantity }));\n else lines.push(t(\"proposedQuantity\", { quantity: product.quantity }));\n lines.push(t(\"productOption\", { title: product.title }));\n if (product.currentPrice && product.currency) {\n const price = formatObservedMoney(product.currentPrice, product.currency,\n // Formatting is provided by the published Shared internationalization runtime.\n (awaitlessRuntime(input.locale)));\n if (price) lines.push(t(\"currentPrice\", { price }));\n }\n if (product.regularPrice && product.currency && product.currentPrice && product.regularPrice !== product.currentPrice) {\n const regular = formatObservedMoney(product.regularPrice, product.currency, awaitlessRuntime(input.locale));\n if (regular) lines.push(t(\"regularPrice\", { price: regular }));\n }\n for (const offer of product.offerTerms ?? []) {\n if (offer.kind === \"percent\" && offer.value) {\n const raw = Number(offer.value);\n if (Number.isFinite(raw) && raw > 0 && raw <= 100) {\n const percentage = awaitlessRuntime(input.locale).formatPercent(raw / 100);\n lines.push(t(\"percentTerms\", { percentage }));\n }\n }\n else if (offer.kind === \"amount\" && offer.value && offer.currency) {\n const amount = formatObservedMoney(offer.value, offer.currency, awaitlessRuntime(input.locale));\n if (amount) lines.push(t(\"amountTerms\", { amount }));\n }\n else if (offer.kind === \"free-shipping\") lines.push(t(\"freeShippingTerms\"));\n if (offer.code) lines.push(t(\"code\", { code: offer.code }));\n if (offer.automatic) lines.push(t(\"automatic\"));\n if (offer.kind !== \"free-shipping\") lines.push(t(\"checkoutQualification\"));\n }\n lines.push(t(\"productLink\", { url: product.url }));\n }\n if (input.includeNoVerifiedOffer && (input.products?.length ?? 0) > 0) lines.push(t(\"noVerifiedOffer\"));\n if ((input.products?.length ?? 0) === 0 && !input.policyUrl && input.requiresShipping == null) {\n lines.push(t(\"storeLink\", { url: input.storeUrl }));\n }\n return lines.join(\"\\n\");\n}\n\nfunction awaitlessRuntime(locale: ModaSupportedLanguageTag) {\n // Constructed per call to keep this module stateless and locale-specific.\n return createRuntime(locale);\n}\nfunction createRuntime(locale: ModaSupportedLanguageTag) {\n return createInternationalizationRuntime({ locale, catalogue: recommendationMessages[locale] });\n}\n","export function buildReplyCandidates(input: {\n fullBody: string;\n firstProductBody?: string | null;\n minimalBody: string;\n}): readonly string[] {\n const candidates: string[] = [];\n for (const body of [input.fullBody, input.firstProductBody ?? null, input.minimalBody]) {\n if (typeof body !== \"string\" || !body.trim() || body.length > 4096 || candidates.includes(body)) continue;\n candidates.push(body);\n }\n if (!candidates.includes(input.minimalBody) && input.minimalBody.trim() && input.minimalBody.length <= 4096) {\n candidates.push(input.minimalBody);\n }\n return Object.freeze(candidates);\n}\n","import type { CommerceShippingInformation } from \"../index.js\";\n\nexport type ShippingPresentation = Readonly<{\n requiresShipping: boolean | null;\n policyUrl: string | null;\n limitation: boolean;\n}>;\n\nfunction safeAvailablePolicyUrl(source: CommerceShippingInformation): string | null {\n if (source.policy.status !== \"AVAILABLE\" || !source.policy.url) return null;\n try {\n const url = new URL(source.policy.url);\n return url.protocol === \"https:\" && !url.username && !url.password && !url.port && !url.search && !url.hash\n ? source.policy.url : null;\n } catch { return null; }\n}\n\nexport function selectShippingPresentation(input: {\n selection: Readonly<{ productId: string | null; variantId: string | null }>;\n observation: CommerceShippingInformation | null;\n refreshed: CommerceShippingInformation | null;\n}): ShippingPresentation {\n const source = input.refreshed;\n if (!source || source.product.productId !== input.selection.productId ||\n source.product.variantId !== input.selection.variantId ||\n source.provider !== input.observation?.provider) {\n return Object.freeze({ requiresShipping: null, policyUrl: null, limitation: true });\n }\n const policyUrl = safeAvailablePolicyUrl(source);\n return Object.freeze({\n requiresShipping: source.product.status === \"AVAILABLE\" ? source.product.requiresShipping : null,\n policyUrl,\n limitation: source.product.status !== \"AVAILABLE\" || source.product.requiresShipping === null ||\n source.policy.status !== \"AVAILABLE\" || source.policy.trust === \"UNTRUSTED_REFERENCE\",\n });\n}\n","import { ConversationProductImageBindingSchema } from \"./product-image.js\";\nimport type { PreparedToken, PreparedWrapper, VerifiedWrapperContext, WrapperRefusal } from \"./wrapper-contracts.js\";\n\n/** WhatsApp plain-text message maximum; reject before moderation and provider calls. */\nexport const MAX_WHATSAPP_TEXT_LENGTH = 4096;\nconst MAX_VARIABLE_LENGTH = 2048;\n\n/** Reject C0 controls other than tab, LF and CR, which WhatsApp text permits. */\nfunction hasDisallowedTextControl(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code < 0x20 && code !== 0x09 && code !== 0x0a && code !== 0x0d) return true;\n }\n return false;\n}\n\nfunction valueFor(token: PreparedToken, context: VerifiedWrapperContext): string | null {\n if (token.kind !== \"variable\") return null;\n const value = context.variables[token.name];\n if (typeof value !== \"string\" || !value.trim() || value.length > MAX_VARIABLE_LENGTH ||\n hasDisallowedTextControl(value)) return null;\n return value;\n}\nfunction renderTokens(tokens: readonly PreparedToken[], context: VerifiedWrapperContext, response: string):\n string | null {\n const parts: string[] = [];\n for (const token of tokens) {\n if (token.kind === \"text\") parts.push(token.value);\n else if (token.kind === \"responseSlot\") parts.push(response);\n else {\n const variable = valueFor(token, context);\n if (variable === null) return null;\n parts.push(variable);\n }\n }\n return parts.join(\"\");\n}\n\nfunction renderSections(prepared: PreparedWrapper, context: VerifiedWrapperContext, response: string):\n string | null {\n const header = renderTokens(prepared.header, context, response);\n const body = renderTokens(prepared.body, context, response);\n const footer = renderTokens(prepared.footer, context, response);\n if (header === null || body === null || footer === null) return null;\n const parts = [header, body];\n if (context.checkoutAvailable) {\n for (const conditional of prepared.conditionals) {\n const content = renderTokens(conditional.tokens, context, response);\n // Optional checkout section: omit whole section on missing/stale values.\n if (content !== null) parts.push(content);\n }\n }\n parts.push(footer);\n return parts.filter((part) => part.length > 0).join(\"\\n\");\n}\n\n/** No AST reads, external dependencies, side effects, network, billing or sending. */\nexport function renderPreparedWrapper(input: {\n prepared: PreparedWrapper;\n context: VerifiedWrapperContext;\n responseBody: string;\n}): { kind: \"rendered\"; body: string } | { kind: \"rejected\"; reason: WrapperRefusal } {\n const { prepared, context, responseBody } = input;\n if (Object.hasOwn(prepared, \"productImage\") && !ConversationProductImageBindingSchema.safeParse(prepared.productImage).success) return { kind: \"rejected\", reason: \"PREPARED_INVALID\" };\n if (prepared.body.filter(token => token.kind === \"responseSlot\").length !== 1 ||\n [...prepared.header, ...prepared.footer, ...prepared.conditionals.flatMap(c => c.tokens)].some(token => token.kind === \"responseSlot\")) return { kind: \"rejected\", reason: \"PREPARED_INVALID\" };\n if (typeof responseBody !== \"string\" || !responseBody.trim() ||\n hasDisallowedTextControl(responseBody)) {\n return { kind: \"rejected\", reason: \"INVALID_INPUT\" };\n }\n if (responseBody.length > MAX_WHATSAPP_TEXT_LENGTH) {\n return { kind: \"rejected\", reason: \"OUTPUT_TOO_LONG\" };\n }\n // Detect a previous application of this *same* prepared envelope. An independent\n // caller-owned previousApplication handles retries after the active slot changes.\n const probe = \"\\u0000__MODA_RESPONSE_SLOT__\\u0000\";\n const envelope = renderSections(prepared, context, probe);\n if (envelope === null) return { kind: \"rejected\", reason: \"VARIABLE_UNAVAILABLE\" };\n const position = envelope.indexOf(probe);\n const prefix = envelope.slice(0, position);\n const suffix = envelope.slice(position + probe.length);\n if ((prefix || suffix) && responseBody.length > prefix.length + suffix.length &&\n responseBody.startsWith(prefix) && responseBody.endsWith(suffix)) {\n return { kind: \"rejected\", reason: \"ALREADY_WRAPPED\" };\n }\n const rendered = renderSections(prepared, context, responseBody);\n if (rendered === null) return { kind: \"rejected\", reason: \"VARIABLE_UNAVAILABLE\" };\n if (hasDisallowedTextControl(rendered)) return { kind: \"rejected\", reason: \"PREPARED_INVALID\" };\n if (rendered.length > MAX_WHATSAPP_TEXT_LENGTH) {\n return { kind: \"rejected\", reason: \"OUTPUT_TOO_LONG\" };\n }\n return { kind: \"rendered\", body: rendered };\n}\n","import { canonicaliseLanguageTag } from \"../../internationalization.js\";\nimport type { WrapperAudience, WrapperDefinition, WrapperSlot } from \"./wrapper-contracts.js\";\n\nexport function canonicalTag(value: string | null | undefined): string | null {\n if (!value?.trim()) return null;\n return canonicaliseLanguageTag(value);\n}\n\n/** Explicit precedence. Invalid override never silently falls back to SHARED. */\nexport function chooseSlot(slots: readonly WrapperSlot[], source: \"AI\" | \"HUMAN\"):\n WrapperSlot | \"invalid\" | null {\n const own = slots.filter((slot) => slot.audience === source);\n const shared = slots.filter((slot) => slot.audience === \"SHARED\");\n if (own.length > 1 || shared.length > 1 || slots.some((slot) =>\n ![\"SHARED\", \"AI\", \"HUMAN\"].includes(slot.audience))) return \"invalid\";\n return own[0] ?? shared[0] ?? null;\n}\n\nexport function validDefinition(def: WrapperDefinition, slot: WrapperSlot): boolean {\n return def.id === slot.definitionId && slot.definition.id === slot.definitionId &&\n Number.isSafeInteger(slot.editVersion) && slot.editVersion > 0 &&\n def.kind === \"MODA_CONVERSATION_WRAPPER\" && def.audience === slot.audience &&\n [\"SHARED\", \"AI\", \"HUMAN\"].includes(slot.audience as WrapperAudience) &&\n def.status === \"PUBLISHED\" && def.publishedAt instanceof Date &&\n Number.isFinite(def.publishedAt.getTime()) && def.retiredAt === null &&\n Boolean(def.createdByAdminId) && def.sourceLanguageTag === \"en\" &&\n def.astSchemaVersion === 1 && /^[a-f0-9]{64}$/.test(def.sourceHash);\n}\n\nexport function languageChoices(input: {\n conversationTag: string | null;\n merchantTag: string | null;\n preferredTag: string | null | undefined;\n platformFallbackTag: string | null;\n}, onInvalid?: (error: unknown) => void): string[] | \"invalid\" {\n let customer: string | null;\n let merchant: string | null;\n let caller: string | null;\n let platform: string | null;\n try {\n customer = canonicalTag(input.conversationTag);\n merchant = canonicalTag(input.merchantTag);\n caller = canonicalTag(input.preferredTag);\n platform = canonicalTag(input.platformFallbackTag);\n } catch (error) { onInvalid?.(error); return \"invalid\"; }\n if ((input.conversationTag && !customer) || (input.merchantTag && !merchant) ||\n (input.preferredTag && !caller) || (input.platformFallbackTag && !platform)) return \"invalid\";\n // The stored conversation language is authoritative. Caller cannot override it.\n if (caller && customer && caller !== customer) return \"invalid\";\n const choices: string[] = [];\n const add = (tag: string | null) => { if (tag && !choices.includes(tag)) choices.push(tag); };\n add(customer ?? caller);\n const base = customer ?? caller;\n if (base) {\n try { add(new Intl.Locale(base).language); } catch (error) { onInvalid?.(error); return \"invalid\"; }\n }\n add(merchant);\n add(platform);\n return choices;\n}\n","import { verifyCommerceAnswerPresentationSelection } from \"../selection.js\";\nimport { renderCommerceProductFacts } from \"./facts.js\";\nimport { CommerceFinalResponseSchema, type CommerceFinalResponse } from \"../response.js\";\nimport { CommerceVerifiedPresentationSchema, type CommerceVerifiedPresentation } from \"./schemas.js\";\nimport { normalizeCommerceReplyText } from \"./format.js\";\nimport { renderRecommendationReply } from \"./render.js\";\nimport { renderProductOptionFacts } from \"./options.js\";\nimport { buildReplyCandidates } from \"./candidates.js\";\nimport { canonicalTag, chooseSlot, languageChoices, validDefinition } from \"./wrapper-selection.js\";\nimport { readPreparedWrapper, type PresentationDigest } from \"./wrapper-projection.js\";\nimport { renderPreparedWrapper } from \"./wrapper-render.js\";\nimport { resolveModaConfigurationLocale } from \"../../internationalization.js\";\nimport type { VerifiedWrapperContext, WrapperSlot } from \"./wrapper-contracts.js\";\nexport type CommerceWhatsAppPreviewInput = {\n envelope: CommerceFinalResponse;\n /** Follow-up replies preserve grounded agent wording; legacy formatting remains explicit. */\n responseStyle?: \"AGENT\" | \"LEGACY\";\n presentation: import(\"zod\").input<typeof CommerceVerifiedPresentationSchema>;\n /** Must agree with the host-verified projection. */\n locale?: string;\n brandName?: string | null;\n wrapper?: {slots:readonly WrapperSlot[];context:VerifiedWrapperContext;digest:PresentationDigest;platformFallbackLanguageTag?:string|null;languageTag?:string|null} | null;\n};\nexport type CommerceWhatsAppPreviewResult={kind:\"ready\";body:string;candidates:readonly string[];wrapper:{definitionId:string;localeId:string;contentHash:string;slotEditVersion:number}|null}|{kind:\"refused\";reason:string};\nfunction candidatesFor(envelope:CommerceFinalResponse,p:import(\"zod\").output<typeof CommerceVerifiedPresentationSchema>):readonly string[] {\n if(envelope.answerKind===\"REFER_TO_STORE\")return buildReplyCandidates({fullBody:normalizeCommerceReplyText(envelope.replyText),minimalBody:normalizeCommerceReplyText(envelope.replyText)});\n if(p.disposition===\"PRODUCT_DETAILS\")return buildReplyCandidates({fullBody:renderCommerceProductFacts(p.productFacts,p.locale),firstProductBody:p.productFacts.length>1?renderCommerceProductFacts(p.productFacts.slice(0,1),p.locale):null,minimalBody:renderCommerceProductFacts([],p.locale)});\n if(p.disposition===\"PRODUCT_OPTIONS\")return buildReplyCandidates({fullBody:renderProductOptionFacts(p.optionFacts,p.locale),firstProductBody:p.optionFacts.length>1?renderProductOptionFacts(p.optionFacts.slice(0,1),p.locale):null,minimalBody:renderProductOptionFacts([],p.locale)});\n if(p.products.length||p.disposition!==\"STANDARD\"||p.requiresShipping!==null||p.policyUrl){\n const shared={locale:p.locale,disposition:p.disposition,storeUrl:p.storeUrl,policyUrl:p.policyUrl,requiresShipping:p.requiresShipping};\n return buildReplyCandidates({fullBody:renderRecommendationReply({...shared,products:p.products,includeNoVerifiedOffer:p.includeNoVerifiedOffer}),firstProductBody:p.products.length?renderRecommendationReply({...shared,products:p.products.slice(0,1),includeNoVerifiedOffer:p.includeNoVerifiedOffer}):null,minimalBody:renderRecommendationReply({...shared,products:[]})});\n }\n const body=normalizeCommerceReplyText(envelope.replyText);return buildReplyCandidates({fullBody:body,minimalBody:body});\n}\n/** Pure formatting/projection only; never moderation, billing or send admission. */\nexport function composeCommerceWhatsAppPreview(input:CommerceWhatsAppPreviewInput):CommerceWhatsAppPreviewResult {\n try {\n const envelope=CommerceFinalResponseSchema.parse(input.envelope),p=CommerceVerifiedPresentationSchema.parse(input.presentation);\n if((input.locale!==undefined&&resolveModaConfigurationLocale(input.locale)!==p.locale)||(input.brandName!==undefined&&input.brandName!==p.brandName))return {kind:\"refused\",reason:\"INVALID_INPUT\"};\n if(input.responseStyle!==undefined&&input.responseStyle!==\"AGENT\"&&input.responseStyle!==\"LEGACY\")return {kind:\"refused\",reason:\"INVALID_INPUT\"};\n if(input.responseStyle===\"AGENT\") {\n const selection=verifyCommerceAnswerPresentationSelection(Object.fromEntries([\"productOptionSelections\",\"productDetailSelections\",\"responseDisposition\",\"shippingInformationSelection\"].filter(name=>Object.hasOwn(envelope.details,name)).map(name=>[name,envelope.details[name]])));\n if(selection.kind!==\"verified\")return {kind:\"refused\",reason:\"INVALID_SELECTION\"};\n const details=selection.selection.productDetailSelections??[],options=selection.selection.productOptionSelections??[];\n const pairs=details.length?details:options;\n const facts=details.length?p.productFacts:p.optionFacts;\n if(pairs.length&&(pairs.length!==facts.length||pairs.some((pair,index)=>pair.productId!==facts[index]?.productId||pair.variantId!==facts[index]?.variantId)))return {kind:\"refused\",reason:\"UNOBSERVED_SELECTION\"};\n }\n const candidates=input.responseStyle===\"AGENT\"?buildReplyCandidates({fullBody:normalizeCommerceReplyText(envelope.replyText),minimalBody:normalizeCommerceReplyText(envelope.replyText)}):candidatesFor(envelope,p);if(candidates[0]&&/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/.test(candidates[0]))return {kind:\"refused\",reason:\"INVALID_INPUT\"};if(!candidates.length)return {kind:\"refused\",reason:\"OUTPUT_TOO_LONG\"};\n const w=input.wrapper;\n // With no configured wrapper, still enforce the plain-text controls and bounds.\n if(!w||!w.slots.length){const body=candidates[0]!;if(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/.test(body))return {kind:\"refused\",reason:\"INVALID_INPUT\"};return {kind:\"ready\",body,candidates,wrapper:null};}\n const slot=chooseSlot(w.slots,\"AI\");if(!slot)return {kind:\"ready\",body:candidates[0]!,candidates,wrapper:null};if(slot===\"invalid\"||!validDefinition(slot.definition,slot))return {kind:\"refused\",reason:\"DEFINITION_UNAVAILABLE\"};\n const choices=languageChoices({conversationTag:w.context.conversationLanguageTag,merchantTag:w.context.merchantLanguageTag,preferredTag:w.languageTag,platformFallbackTag:w.platformFallbackLanguageTag??null});\n if(choices===\"invalid\")return {kind:\"refused\",reason:\"INVALID_LANGUAGE\"};\n const effectiveTag=canonicalTag(w.context.conversationLanguageTag),bodyLocale=resolveModaConfigurationLocale(effectiveTag);\n if(bodyLocale!==p.locale)return {kind:\"refused\",reason:\"INVALID_LANGUAGE\"};\n const language=new Intl.Locale(bodyLocale).language;\n const lookup=[...new Set([effectiveTag,bodyLocale,...choices].filter((tag):tag is string=>tag!==null))].filter(tag=>new Intl.Locale(tag).language===language&&resolveModaConfigurationLocale(tag)===bodyLocale);\n const locale=lookup.map(tag=>slot.definition.locales.find(row=>row.languageTag===tag)).find(row=>row!==undefined);\n if(!locale||locale.status!==(locale.languageTag===\"en\"?\"SOURCE_SAVED\":\"REVIEWED\")||locale.providerLanguageCode!==null||(locale.languageTag!==\"en\"&&(!locale.reviewedAt||!locale.reviewedByAdminId)))return {kind:\"refused\",reason:\"LOCALE_UNAVAILABLE\"};\n const projection=readPreparedWrapper(locale.localeAst,locale.contentHash,w.digest);if(projection.kind!==\"ok\")return {kind:\"refused\",reason:projection.kind===\"missing\"?\"PREPARED_MISSING\":\"PREPARED_INVALID\"};\n for(const candidate of candidates){const rendered=renderPreparedWrapper({prepared:projection.prepared,context:w.context,responseBody:candidate});if(rendered.kind===\"rendered\")return {kind:\"ready\",body:rendered.body,candidates,wrapper:{definitionId:slot.definitionId,localeId:locale.id,contentHash:locale.contentHash!,slotEditVersion:slot.editVersion}};if(rendered.reason!==\"OUTPUT_TOO_LONG\")return {kind:\"refused\",reason:rendered.reason};}\n return {kind:\"refused\",reason:\"OUTPUT_TOO_LONG\"};\n } catch {return {kind:\"refused\",reason:\"INVALID_INPUT\"};}\n}\n"],"mappings":"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","names":["product","labels","z","labels","z","z","product","z","product"]}