@gengage/assistant-fe 0.6.6 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agentic/index.js +1 -1
- package/dist/agentic/worker.js +1 -1
- package/dist/agentic.iife.js +1 -1
- package/dist/{api-paths-BVJFBOlx.js → api-paths-Dkah8jhG.js} +1 -1
- package/dist/chat-runtime.js +1 -1
- package/dist/chat.iife.js +1 -1
- package/dist/chat.js +1 -1
- package/dist/{common-B4nHKSFT.js → common-Buxw5G_i.js} +1 -1
- package/dist/common.js +5 -5
- package/dist/{connection-warning-DgF3pszY.js → connection-warning-CEm2TZpj.js} +1 -1
- package/dist/{fastIntent-CInsI6th.js → fastIntent-HK3SqGgn.js} +1 -1
- package/dist/index.js +10 -10
- package/dist/native.iife.js +1 -1
- package/dist/qna-runtime.js +1 -1
- package/dist/qna.iife.js +1 -1
- package/dist/qna.js +1 -1
- package/dist/{runtime-CUKK4JPr.js → runtime-DEOej3zn.js} +3 -3
- package/dist/{runtime-C3UFeEo5.js → runtime-Dir14P0o.js} +3 -3
- package/dist/{runtime-uR_sFkfH.js → runtime-OdW89-j-.js} +3 -3
- package/dist/{simbut-yrRks9TK.js → simbut-DWvSKXQ7.js} +1 -1
- package/dist/simbut.iife.js +1 -1
- package/dist/simbut.js +1 -1
- package/dist/{similarity-DcfZ0CKT.js → similarity-CfOr8nPO.js} +0 -1
- package/dist/{simrel-Xs3OdvZH.js → simrel-DWV_87jY.js} +1 -1
- package/dist/simrel-runtime.js +1 -1
- package/dist/simrel.iife.js +1 -1
- package/dist/simrel.js +2 -2
- package/dist/{widget-base-BdgsXG7Y.js → widget-base-Cafa292X.js} +1 -1
- package/package.json +1 -1
package/dist/agentic/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as q, C as Ee, D as B, E as Ae, F as Pe, I as Re, M as I, O as Ue, P as k, R as F, S as ve, T as Te, _ as xe, a as _e, b as Le, c as je, d as Ce, f as Me, g as $e, h as De, i as Oe, j as qe, k as Be, l as Ie, m as ke, n as Fe, o as Ge, p as Ne, r as He, s as Je, t as ze, u as We, v as G, w as Ke, x as Qe, y as N, z as H } from "../similarity-
|
|
1
|
+
import { A as q, C as Ee, D as B, E as Ae, F as Pe, I as Re, M as I, O as Ue, P as k, R as F, S as ve, T as Te, _ as xe, a as _e, b as Le, c as je, d as Ce, f as Me, g as $e, h as De, i as Oe, j as qe, k as Be, l as Ie, m as ke, n as Fe, o as Ge, p as Ne, r as He, s as Je, t as ze, u as We, v as G, w as Ke, x as Qe, y as N, z as H } from "../similarity-CfOr8nPO.js";
|
|
2
2
|
var J = 512, z = 0.74;
|
|
3
3
|
function W({ accountId: e, worker: t, beUrl: r, devJwtSecret: n, tokenBrokerUrl: o, tokenBrokerAudience: s, defaultLocale: i, tools: d = {}, beacon: w }) {
|
|
4
4
|
let m = 1;
|
package/dist/agentic/worker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as U, C as E, D as P, E as m, F as J, I as M, L as B, M as I, N as F, O as g, P as C, R as j, S as T, T as L, _ as z, a as R, b as q, c as D, d as K, f as O, g as W, h as G, i as N, j as Q, k as _, l as H, m as V, n as X, o as Y, p as Z, r as $, s as tt, t as et, u as rt, v as h, w as ot, x as at, y as x, z as nt } from "../similarity-
|
|
1
|
+
import { A as U, C as E, D as P, E as m, F as J, I as M, L as B, M as I, N as F, O as g, P as C, R as j, S as T, T as L, _ as z, a as R, b as q, c as D, d as K, f as O, g as W, h as G, i as N, j as Q, k as _, l as H, m as V, n as X, o as Y, p as Z, r as $, s as tt, t as et, u as rt, v as h, w as ot, x as at, y as x, z as nt } from "../similarity-CfOr8nPO.js";
|
|
2
2
|
function it(i) {
|
|
3
3
|
const a = self, n = /* @__PURE__ */ new Map(), c = B(a), S = h(c);
|
|
4
4
|
let e = null, u = null, l = null, p = "";
|
package/dist/agentic.iife.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
`);for(;f>=0;){const p=r.slice(0,f).trim();r=r.slice(f+1),p&&pe(JSON.parse(p),o),f=r.indexOf(`
|
|
3
3
|
`)}}const i=r.trim();return i&&pe(JSON.parse(i),o),o}function pe(e,t){if(e._error)throw L(e._error);e._end||Object.assign(t,e)}function ct(e={}){return{type:"metadata",...e}}function v(e,t=!1,n={}){return{type:"text_chunk",content:e,final:t,...n}}function me(e){return{type:"ui_spec",...e}}function ut(e){return{type:"action",action:e}}function ye(e,t){return{type:"error",code:e,message:t}}function D(){return{type:"done"}}function ge(e,t){return e[t?.type||t?.action?.type||"inputText"]||e.inputText}async function lt({request:e,accountModule:t,contextStore:n,beClient:r,toolBridge:o,emit:i,rpc:a,signal:s}){const f=performance.now(),p=await n.load(e),u=p.thread.id,l=bt(e);n.appendUserMessage(u,l);const c=ge(t.flows,e);if(!c)return i(ye("unknown_action",`No agent flow for request type ${e?.type||"inputText"}`)),i(D()),{steps:0,productSkusEmitted:[]};const d={request:e,context:n.patch(u,{})||p,bag:{},accountConfig:t.accountConfig||{},threadId:u,steps:0,productSkusEmitted:new Set,committed:!1},y={contextStore:n,beClient:r,toolBridge:o,emit:i,rpc:a,...s?{signal:s}:{}};return await F(c,d,y),d.committed||await q(d,y),await a("beacon.send",{type:"turnSummary",threadId:u,sessionId:e?.session_id||e?.sessionId||u,accountId:t.accountId||d.context.meta.accountId,steps:d.steps,totalLatencyMs:U(f),productSkusEmitted:[...d.productSkusEmitted]}),{steps:d.steps,productSkusEmitted:[...d.productSkusEmitted]}}async function F(e,t,n){for(const r of e){if(n.signal?.aborted)return;t.steps+=1,await dt(r,t,n),t.context=n.contextStore.patch(t.threadId,{})||t.context}}async function dt(e,t,n){const r=z(t);if(e.kind==="be_op"){await ft(e,t,n,r);return}if(e.kind==="tool"){await pt(e,t,n,r);return}if(e.kind==="emit"){mt(e,t,n);return}if(e.kind==="branch"){await yt(e,t,n,r);return}if(e.kind==="parallel"){await gt(e,t,n);return}if(e.kind==="refusal"){await ht(e,t,n,r);return}e.kind==="commit"&&await wt(e,t,n)}async function ft(e,t,n,r){const o=performance.now();let i;const a=C(e.cacheTtlS,r);try{i=await n.beClient.invoke({op:e.op,input:C(e.input,r),...a!==void 0?{cacheTtlS:a}:{},...n.signal?{signal:n.signal}:{}})}catch(f){const p=f,u=String(p?.sourceCode||p?.code||"unknown"),l={type:"agentOp",threadId:t.threadId,sessionId:t.request?.session_id||t.request?.sessionId||t.threadId,accountId:t.context.meta.accountId,op:e.op,status:"error",latencyMs:U(o),errorCode:u};throw await n.rpc("beacon.send",l),f}e.out&&(t.bag[e.out]=i),he(e,i,t,n.contextStore);const s={type:"agentOp",threadId:t.threadId,sessionId:t.request?.session_id||t.request?.sessionId||t.threadId,accountId:t.context.meta.accountId,op:e.op,status:"ok",latencyMs:U(o)};await n.rpc("beacon.send",s)}async function pt(e,t,n,r){const o=await n.toolBridge.invoke(e.name,C(e.input,r));e.out&&(t.bag[e.out]=o),he(e,o,t,n.contextStore)}function mt(e,t,n){const r=e.build(z(t));St(r,t.productSkusEmitted),n.emit(r)}async function yt(e,t,n,r){const o=String(C(e.on,r)||"default");await F(e.cases[o]||e.cases.default||[],t,n)}async function gt(e,t,n){await Promise.all(e.steps.map(r=>F(r,t,n)))}async function ht(e,t,n,r){n.emit(v(C(e.message,r),!0)),await q(t,n)}async function wt(e,t,n){await q(t,n)}async function q(e,{contextStore:t,emit:n}){e.committed||(e.context=await t.commit(e.threadId)||e.context,e.committed=!0,n(D()))}function he(e,t,n,r){if(typeof e.patch!="function")return;const o=e.patch(n.context,t,z(n));o&&(n.context=r.patch(n.threadId,o)||n.context)}function z(e){return{request:e.request,context:e.context,bag:e.bag,accountConfig:e.accountConfig}}function C(e,t){return typeof e=="function"?e(t):e}function bt(e){const t=e?.payload;if(typeof t=="string")return t;if(t&&typeof t=="object"&&"text"in t){const n=t.text;if(typeof n=="string")return n}return typeof e?.action?.payload=="string"?e.action.payload:typeof e?.action?.title=="string"?e.action.title:""}function St(e,t){const n=e,r=n.spec,o=Array.isArray(r?.items)?r.items:void 0,i=Array.isArray(n.items)?n.items:void 0,a=o||i;if(Array.isArray(a)){for(const s of a)if(s&&typeof s=="object"){const f=s.sku;typeof f=="string"&&t.add(f)}}}function kt(e){return{invoke(t,n){return e("tool.invoke",{name:t,input:n})}}}var _t=512,At=.74;function we({accountId:e,worker:t,beUrl:n,devJwtSecret:r,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:s={},beacon:f}){let p=1;const u=new Map;return ze({worker:t,tools:s,beacon:l=>f?.({...l,accountId:l.accountId||e}),memory:sessionStorage}),t.addEventListener("message",l=>{const c=l.data||{},d=typeof c.id=="number"?c.id:null;if(d==null)return;const y=u.get(d);if(y){if(c.type==="event"&&c.event){G(y,c.event);return}if(c.type==="error"){y.onError(new Error(c.message||"Agent worker failed")),u.delete(d);return}c.type==="end"&&u.delete(d)}}),(l,c,d,y)=>{const g=p++;u.set(g,c);const h=()=>{u.delete(g),t.postMessage({id:g,type:"abort"})},E=w=>{if(d.aborted){h();return}t.postMessage({id:g,type:"invoke",accountId:e,beUrl:n,devJwtSecret:r,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,request:w,parentUrl:window.location.href})};if(d.aborted){h();return}if(d.addEventListener("abort",h,{once:!0}),y){Se(l,y).then(E).catch(w=>{u.delete(g),c.onError(w instanceof Error?w:new Error("Failed to read image attachment"))});return}E(l)}}function be({accountId:e,accountModule:t,beUrl:n,devJwtSecret:r,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:s={},beacon:f}){let p=null;const u=Tt({accountId:e,tools:s,beacon:f}),l=kt(u),c=ue({accountId:e,...r?{devJwtSecret:r}:{},...o?{tokenBrokerUrl:o}:{},...i?{tokenBrokerAudience:i}:{}});return async(d,y,g,h)=>{const E=await Se(d||{},h);p||=new ie({accountId:e,locale:E?.locale||a,parentUrl:window.location.href,rpc:u});try{await lt({request:E,accountModule:{...t,accountId:e},contextStore:p,beClient:{invoke({op:w,input:ee,signal:Fe,cacheTtlS:Tn}){return it({beUrl:n,accountId:e,jwtProvider:c,parentUrl:window.location.href,op:w,input:ee,cacheTtlS:Tn,...Fe?{signal:Fe}:{}})}},toolBridge:l,emit:w=>G(y,w),rpc:u,signal:g})}catch(w){g?.aborted||(G(y,fe(w)),y.onDone())}}}function Tt({accountId:e,tools:t,beacon:n}){const r=o=>n?.({...o,accountId:o.accountId||e});return((o,i)=>te(o,i,{tools:t,beacon:r,memory:sessionStorage}))}async function Se(e,t){if(!t||!t.type?.startsWith("image/"))return e;const n=await xt(t),r={...Et(e.payload??e.action?.payload),image_data_url:n.dataUrl,image_mime:n.mime};return{...e,payload:r,...e.action?{action:{...e.action,payload:r}}:{}}}function Et(e){return Pt(e)?{...e}:typeof e=="string"?{text:e}:{}}function Pt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function xt(e){const t=await jt(e);return t||{dataUrl:await ke(e),mime:e.type}}async function jt(e){if(typeof createImageBitmap!="function"||typeof document>"u")return null;let t=null;try{t=await createImageBitmap(e);const n=Math.min(1,_t/Math.max(t.width,t.height)),r=Math.max(1,Math.round(t.width*n)),o=Math.max(1,Math.round(t.height*n)),i=document.createElement("canvas");i.width=r,i.height=o;const a=i.getContext("2d");if(!a)return null;a.drawImage(t,0,0,r,o);const s=await new Promise(f=>i.toBlob(f,"image/jpeg",At));return s?{dataUrl:await ke(s),mime:s.type||"image/jpeg"}:null}catch{return null}finally{t?.close()}}async function ke(e){const t=new Uint8Array(await e.arrayBuffer());let n="";const r=32768;for(let o=0;o<t.length;o+=r)n+=String.fromCharCode(...t.subarray(o,o+r));return`data:${e.type};base64,${btoa(n)}`}function G(e,t){switch(t?.type){case"text_chunk":{const n=t;e.onTextChunk(n.content||"",n.final===!0,n);break}case"ui_spec":{const n=t;e.onUISpec(n.spec,n.widget,n.panelHint,n.clearPanel===!0);break}case"action":e.onAction(t);break;case"metadata":e.onMetadata(t);break;case"error":e.onError(It(t));break;case"done":e.onDone();break;default:break}}function It(e){const t=new Error(e.message||e.code||"Agent error");return e.code&&(t.code=e.code),t}var _e="__gengageAgentFetchBridge";function vt({accountId:e,streamTransport:t,endpoints:n={}}){if(!e)throw new Error("accountId is required.");if(typeof t!="function")throw new Error("streamTransport is required.");const r=Ct(),o=`https://gengage-injector.invalid/${encodeURIComponent(e)}`,i=new Set,a=s=>{const f=`${o}/chat/${s}`;i.add(f);const p=n[s],u={streamTransport:t,endpoint:s};p&&(u.endpointHandler=p),r.routes.set(f,u)};a("process_action");for(const s of Object.keys(n))s!=="process_action"&&a(s);return{middlewareUrl:o,stop(){for(const s of i)r.routes.delete(s)}}}function Ct(){const e=window,t=e[_e];if(t)return t;const n=e.fetch.bind(e),r={routes:new Map,originalFetch:n};return e.fetch=(o,i)=>{const a=Ae(o),s=r.routes.get(a);return s?Rt(s,o,i):n(o,i)},e[_e]=r,r}function Ae(e){return typeof e=="string"?e:e instanceof URL?e.href:e?.url||""}function Te(e,t){if(t?.signal)return t.signal;if(typeof Request<"u"&&e instanceof Request)return e.signal}function Ee(e,t){return t?.body!==void 0&&t?.body!==null?t.body:typeof Request<"u"&&e instanceof Request?e.clone().text():null}async function Mt(e,t){const n=Ee(e,t);if(n instanceof FormData){const o=n.get("request"),i=n.get("attachment");return{request:JSON.parse(String(o||"{}")),...i instanceof File?{attachment:i}:{}}}const r=await Promise.resolve(n);return typeof r=="string"?{request:JSON.parse(r||"{}")}:{request:{}}}async function Rt(e,t,n){if(e.endpoint&&e.endpoint!=="process_action"&&e.endpointHandler){const p=new AbortController,u=Te(t,n);let l=null;if(u){const c=()=>p.abort();u.aborted&&c(),u.addEventListener("abort",c,{once:!0}),l=()=>u.removeEventListener("abort",c)}try{const c=await Ut(t,n);return await e.endpointHandler(c,{accountId:Ot(t),endpoint:e.endpoint,signal:p.signal})}finally{l?.()}}const r=new TextEncoder,o=new AbortController,i=Te(t,n);let a=!1,s=null;const f=new ReadableStream({async start(p){const u=d=>{a||p.enqueue(r.encode(`${JSON.stringify(d)}
|
|
4
4
|
`))},l=()=>{a||(a=!0,s?.(),p.close())},c=d=>{u({type:"error",code:d?.code||"agent_bridge_error",message:d instanceof Error?d.message:String(d)}),u({type:"done"}),l()};if(i){const d=()=>{o.abort(),a||(a=!0,s?.(),p.error(new DOMException("Aborted","AbortError")))};if(i.aborted){d();return}i.addEventListener("abort",d,{once:!0}),s=()=>i.removeEventListener("abort",d)}try{const{request:d,attachment:y}=await Mt(t,n),g=e.streamTransport(d,{onTextChunk:(h,E,w={})=>u({type:"text_chunk",content:h,final:E===!0,...w}),onUISpec:(h,E,w,ee)=>u({type:"ui_spec",spec:h,widget:E,...w?{panelHint:w}:{},...ee?{clearPanel:!0}:{}}),onAction:h=>{u(h?.type==="action"?h:{type:"action",action:h})},onMetadata:h=>{u(h?.type==="metadata"?h:{type:"metadata",...h})},onError:c,onDone:()=>{u({type:"done"}),l()}},o.signal,y);Bt(g)&&(await g,o.signal.aborted||(u({type:"done"}),l()))}catch(d){o.signal.aborted||c(d)}},cancel(){o.abort(),s?.(),a=!0}});return new Response(f,{status:200,headers:{"Content-Type":"application/x-ndjson"}})}async function Ut(e,t){const n=await Promise.resolve(Ee(e,t));return typeof n!="string"||n.trim()===""?{}:JSON.parse(n)}function Ot(e){try{const[t]=new URL(Ae(e)).pathname.split("/").filter(Boolean);return decodeURIComponent(t||"")}catch{return""}}function Bt(e){return e!==null&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"}function Nt({accountId:e,beUrl:t,devJwtSecret:n,tokenBrokerUrl:r,tokenBrokerAudience:o,workerUrl:i,defaultLocale:a="en-GB",accountModule:s,tools:f={},beacon:p,allowBlobWorker:u=!1}){if(!e)throw new Error("accountId is required.");if(!t)throw new Error("beUrl is required. The injector owns backend URLs; the SDK has no default.");if(!i)throw new Error("workerUrl is required.");const l=window,c=l.GengageAssistantInjector||(l.GengageAssistantInjector={}),d=c[e]||(c[e]={});if(d.agentController)return d.agentController;const y=J(i)||u?Pe(i,`gengage-${e}-agent`,{allowBlobWorker:u}):null;d.streamTransport=y?we({accountId:e,worker:y.worker,beUrl:t,...n?{devJwtSecret:n}:{},...r?{tokenBrokerUrl:r}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:f,...p?{beacon:p}:{}}):be({accountId:e,accountModule:s,beUrl:t,...n?{devJwtSecret:n}:{},...r?{tokenBrokerUrl:r}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:f,...p?{beacon:p}:{}});const g={type:"agent",stop(){delete d.streamTransport,y?.worker.terminate(),y?.cleanup(),delete d.agentController},diagnostics(){return{accountId:e,beUrl:t,workerUrl:i,mounted:!0,transport:y?"worker":"main-thread",flows:Object.keys(s?.flows||{})}}};return d.agentController=g,g}function J(e){const t=new URL(e,window.location.href);return t.origin===window.location.origin||t.protocol==="blob:"}function Pe(e,t,n={}){const r=new URL(e,window.location.href);if(J(e))return{worker:new Worker(r.href,{type:"module",name:t}),cleanup(){}};if(!n.allowBlobWorker)throw new Error("Cross-origin agent workers require allowBlobWorker=true or a same-origin workerUrl.");const o=new Blob([`import ${JSON.stringify(r.href)};
|
|
5
|
-
`],{type:"text/javascript"}),i=URL.createObjectURL(o);try{return{worker:new Worker(i,{type:"module",name:t}),cleanup(){URL.revokeObjectURL(i)}}}catch(a){throw URL.revokeObjectURL(i),a}}function xe(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function O(e){const t=xe(e);if(!t)return null;const n=x(t.sku,t.SKU);if(!n)return null;const r={sku:n,name:x(t.name,t.title,t.short_name,n)||n,url:x(t.url)||""},o=Array.isArray(t.images)?t.images:void 0,i=x(t.imageUrl,t.image_url,t.image,o?.[0]);i&&(r.imageUrl=i),o&&o.length>1&&(r.images=o.filter(g=>!!g).map(String));const a=M(t.price_discounted),s=M(t.price),f=a||s;f>0&&(r.price=String(f));const p=a>0?s:0;p>0&&(r.originalPrice=String(p));const u=x(t.brand);u&&(r.brand=u);const l=M(t.rating);l>0&&(r.rating=l);const c=M(t.review_count)||M(t.reviewCount);c>0&&(r.reviewCount=c);const d=x(t.cart_code,t.cartCode);d&&(r.cartCode=d),typeof t.in_stock=="boolean"&&(r.inStock=t.in_stock),typeof t.inStock=="boolean"&&(r.inStock=t.inStock);const y=t.category_names;return Array.isArray(y)&&(r.categoryNames=y.map(String)),r}function je(e){const t=xe(e);if(!t)return e;const n=t.category_names,r=Array.isArray(n)?n:void 0,o=t.images,i=Array.isArray(o)?o:void 0,a={sku:t.sku,name:t.name||t.title,url:t.url,price:t.price,currency:t.price_currency||t.currency,category:r?.[r.length-1]??void 0,category_names:r?r.slice(0,4):void 0,image:i?i[0]:t.image,in_stock:t.in_stock,rating:t.rating,review_count:t.review_count};for(const s of Object.keys(a))a[s]===void 0&&delete a[s];return a}function H(e){return Array.isArray(e)?e.map(je).filter(t=>!!t):[]}function x(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function M(e){const t=Number(e);return Number.isFinite(t)?t:0}function Ie(e){return Array.isArray(e)?e.map(String).filter(Boolean):typeof e=="string"&&e?[e]:[]}function ve(e=[]){const t={},n=[];return(Array.isArray(e)?e.map(O).filter(r=>!!r):[]).forEach((r,o)=>{const i=`product-${o.toString()}`;n.push(i);const a={sku:r.sku,product:r};t[i]={type:"ProductCard",props:{product:r,index:o,action:{title:r.name,type:"launchSingleProduct",payload:a}}}}),t.root={type:"ProductGrid",props:{layout:"grid"},children:n},{widget:"chat",panelHint:"panel",spec:{root:"root",elements:t}}}function $t(e){return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ProductDetailsPanel",props:{product:O(e)||e||{}}}}}}}function Lt(e={}){const t=(e.multiple_product_details||e.products||[]).map(O).filter(r=>!!r),n=e.table||{};return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ComparisonTable",props:{products:t,recommended:t.find(r=>r.sku===e.recommended_choice_sku)||t[0],attributes:Object.entries(n).map(([r,o])=>({label:r,values:Array.isArray(o)?o.map(String):[String(o??"")]})),highlights:Ie(e.key_differences),specialCases:Ie(e.special_considerations),recommendedText:e.recommended_choice,productActions:Object.fromEntries(t.map(r=>[r.sku,{title:r.name,type:"launchSingleProduct",payload:{sku:r.sku,product:r}}]))}}}}}}function Dt(e=[]){return{widget:"chat",panelHint:"inline",spec:{root:"root",elements:{root:{type:"ActionButtons",props:{buttons:(Array.isArray(e)?e:[]).map(t=>{const n=t.label||t.title||t.shortName||"",r=t.action||t.requestDetails||t.request_details;return!n||!r?.type?null:{label:n,action:{title:n,type:r.type,...r.payload!==void 0?{payload:r.payload}:{}}}}).filter(t=>!!t)}}}}}}function B(e){const t=e?.payload;if(typeof t=="string")return t;if(t&&typeof t=="object"&&"text"in t){const r=t.text;if(typeof r=="string")return r}const n=e?.action;return n&&typeof n.payload=="string"?n.payload:n&&typeof n.title=="string"?n.title:""}function Ce(e){return Object.freeze([...e])}function P(e){return e&&typeof e=="object"?e:{}}function K(e){return e&&typeof e=="object"?e:{}}function Me(e){return e.thread.extensions.beauty_profile}var Ft=Ce([{kind:"be_op",op:"beauty-consulting-turn",input:({request:e,context:t})=>({utterance:B(e),prior_messages:t.messages.slice(-10),profile:Me(t),candidate_products:zt(e),locale:t.meta.locale}),out:"consultation",patch:Re},{kind:"branch",on:({bag:e})=>P(e.consultation).consultation_state?.stage||"answer",cases:{refuse:[{kind:"refusal",message:({bag:e})=>{const t=P(e.consultation);return t.refusal?.message||t.plain_text||"I cannot help with that request."}}],needs_more_info:[{kind:"emit",build:({bag:e})=>v(V(P(e.consultation)),!0)},{kind:"commit"}],search:[{kind:"tool",name:"search",input:({request:e,bag:t,context:n})=>{const r=P(t.consultation);return{query:r.search_params?.query||B(e),facets:r.search_params?.facets||{},limit:12,locale:n.meta.locale}},out:"products",patch:(e,t)=>{const n=K(t);return{panel:{...e.panel,screen_sku_list:W(n).map(r=>qt(r)).filter(r=>!!r),last_search:{query:n.query||""}}}}},{kind:"emit",build:({bag:e})=>me(ve(W(K(e.products))))},{kind:"be_op",op:"beauty-consulting-turn",input:({request:e,context:t,bag:n})=>({utterance:B(e),prior_messages:t.messages.slice(-10),profile:Me(t),candidate_products:H(W(K(n.products)).slice(0,12)),locale:t.meta.locale}),out:"answer",patch:(e,t)=>{const n=Re(e,t),r=(P(t).product_mentions||[]).map(o=>o.sku).filter(o=>!!o);return{...n||{},panel:{...e.panel,chat_mentioned_skus:r}}}},{kind:"emit",build:({bag:e})=>{const t=P(e.answer);return v(V(t),!0,{productMentions:t.product_mentions||[]})}},{kind:"commit"}],default:[{kind:"emit",build:({bag:e})=>{const t=P(e.consultation);return v(V(t),!0,{productMentions:t.product_mentions||[]})}},{kind:"commit"}]}}]);function Re(e,t){const n=P(t).consultation_state?.captured_profile;if(!n)return null;const r=e.thread.extensions.beauty_profile&&typeof e.thread.extensions.beauty_profile=="object"?e.thread.extensions.beauty_profile:{};return{thread:{...e.thread,extensions:{...e.thread.extensions,beauty_profile:{...r,...n}}}}}function W(e){return Array.isArray(e?.products)?e.products:[]}function qt(e){if(e&&typeof e=="object"&&"sku"in e){const t=e.sku;if(typeof t=="string")return t}}function zt(e){const t=e?.payload&&typeof e.payload=="object"?e.payload.products:void 0,n=e?.action?.payload&&typeof e.action.payload=="object"?e.action.payload.products:void 0,r=t||n;return Array.isArray(r)?H(r.slice(0,12)):void 0}function V(e){return e?.answer_html||e?.plain_text||e?.refusal?.message||"I can help with beauty shopping."}var Ue=new Set(["and","are","box","for","from","gift","gifts","interflora","the","with"]),Gt={token:.26,keyword:.22,category:.18,facet:.16,color:.08,attribute:.06,price:.08,retrieval:.08},Jt=["amber","beige","black","blue","blush","bronze","brown","cream","gold","green","grey","ivory","lilac","mixed","orange","pastel","pink","purple","red","silver","white","yellow"];function A(e){return String(e??"").normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),"").toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").replace(/\s+/gu," ").trim()}function k(e,t=Ue){const n=t instanceof Set?t:new Set([...Ue,...t]),r=new Set,o=[];for(const i of A(e).split(/\s+/u))i.length<3||n.has(i)||r.has(i)||(r.add(i),o.push(i));return o}function R(e,t={}){if(Vt(e))return e;const n=t.facetKeys,r=b(e.category_names??e.category),o=b(e.category_ids),i=Qt(e.facet_hits),a=Object.entries(i).filter(([g])=>!n||n.some(h=>A(h)===A(g))).map(([,g])=>g),s=_(e.name,e.title),f=_(e.brand),p=t.sourceKeywords??[],u=[s,f,...r,...a,...b(e.promotions),_(e.description),...p].join(" "),l=k(u,t.stopWords),c=_(t.sourceProductType,Zt(r,s,l),l[0]),d=T([...Xt(u,Jt),...Object.entries(i).filter(([g])=>/colou?r/iu.test(g)).flatMap(([,g])=>k(g,t.stopWords))]),y=T([...a.flatMap(g=>k(g,t.stopWords)),...b(e.promotions).flatMap(g=>k(g,t.stopWords))]).slice(0,24);return{sku:_(e.sku),title:s,brand:f,productType:c,categoryNames:r,categoryIds:o,facets:i,keywords:T([...p.flatMap(g=>k(g,t.stopWords)),...l]).slice(0,12),tokens:l,colors:d,attributes:y,price:Yt(e)}}function Ht(e,t={}){const n=_(e.product_type,e.productType),r=_(e.title,n,b(e.keywords).join(" ")),o=T([...b(e.keywords),...b(e.colors),...b(e.materials),...b(e.styles),...b(e.attributes)]);return R({sku:"__photo__",name:r,category_names:n?[n]:[],facet_hits:{colors:b(e.colors).join(", "),materials:b(e.materials).join(", "),styles:b(e.styles).join(", "),attributes:b(e.attributes).join(", ")},promotions:o},{...t,sourceProductType:n,sourceKeywords:o})}function Kt(e,t={}){const n=R(e,t);return T([...t.sourceQueries??[],N([n.productType,...n.colors.slice(0,1),...n.attributes.slice(0,2)]),N([n.productType,...n.keywords.slice(0,3)]),N([n.categoryNames[n.categoryNames.length-1],...n.keywords.slice(0,2)]),N(n.title.split(/\s+/u).slice(0,6)),n.productType].map(r=>r.trim()).filter(Boolean)).slice(0,t.queryLimit??6)}function Oe(e,t,n={}){const r={...Gt,...n.weights},o=R(t,n),i=[],a=j(e.tokens,o.tokens),s=j(e.keywords,o.tokens),f=en(e.categoryNames,o.categoryNames)||j(Be(e.categoryNames),Be(o.categoryNames)),p=j(e.attributes,o.attributes),u=j(e.colors,o.colors),l=j(e.attributes,o.tokens),c=tn(e.price,o.price),d=nn(o.sku,n.hitCounts)>0?1:0,y=rn(e,o),g=a*r.token+s*r.keyword+f*r.category+p*r.facet+u*r.color+l*r.attribute+c*r.price+d*r.retrieval,h=on(y?g:g*.35);return y&&e.productType&&e.productType===o.productType&&i.push("same product type"),f>.4&&i.push("similar category"),p>.2&&i.push("matching product attributes"),u>0&&i.push("matching colour"),c>.8&&i.push("similar price"),y||i.push("weaker product-type match"),{score:Number(h.toFixed(4)),reasons:i}}function Wt(e,t,n={}){const r=R(e,n),o=new Set([r.sku,...n.ignoreSkus??[]].filter(Boolean));return t.filter(i=>{const a=_(i.sku);return a&&!o.has(a)}).map(i=>{const a=Oe(r,i,n);return{...i,similarity_score:a.score,similarity_reasons:a.reasons}}).sort((i,a)=>a.similarity_score-i.similarity_score).slice(0,Math.max(1,Math.min(n.limit??12,100)))}function Vt(e){return!!(e&&typeof e=="object"&&Array.isArray(e.tokens))}function _(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function b(e){return Array.isArray(e)?e.map(t=>_(t)).filter(Boolean):typeof e=="string"&&e.trim()?e.split(/[,;/|]+/u).map(t=>t.trim()).filter(Boolean):[]}function Qt(e){return!e||typeof e!="object"||Array.isArray(e)?{}:Object.fromEntries(Object.entries(e).map(([t,n])=>[t,_(n)]).filter(([,t])=>t))}function Yt(e){const t=Number(e.price_discounted);if(Number.isFinite(t)&&t>0)return t;const n=Number(e.price);return Number.isFinite(n)&&n>0?n:0}function T(e){const t=new Set,n=[];for(const r of e){const o=A(r);!o||t.has(o)||(t.add(o),n.push(o))}return n}function Xt(e,t){const n=` ${A(e)} `;return t.filter(r=>n.includes(` ${A(r)} `))}function Zt(e,t,n){const r=A(e[e.length-1]??e[0]??"");if(r){const o=k(r),i=new Set(k(t));return o.find(a=>i.has(a))??o[0]??r}return n[0]??""}function N(e){return e.map(t=>A(t)).filter(Boolean).join(" ").replace(/\s+/gu," ").trim().slice(0,120)}function Be(e){return e.flatMap(t=>k(t))}function j(e,t){const n=T(e),r=new Set(T(t));return n.length===0||r.size===0?0:n.filter(o=>r.has(o)).length/n.length}function en(e,t){const n=T(e),r=new Set(T(t));return n.length===0||r.size===0?0:n.filter(o=>r.has(o)).length/n.length}function tn(e,t){return e<=0||t<=0?0:Math.min(e,t)/Math.max(e,t)}function nn(e,t){return!e||!t?0:typeof t.get=="function"?t.get(e)??0:t[e]??0}function rn(e,t){if(!e.productType||!t.productType||e.productType===t.productType)return!0;const n=new Set(k(e.productType)),r=new Set([...k(t.productType),...t.tokens]);return[...n].some(o=>r.has(o))}function on(e){return Math.max(0,Math.min(1,e))}function an(e){const t=(e?.chat||e?._chat)?.root||e?._chat?.root;return t?t.getRootNode?.()?.host||t:Array.from(document.querySelectorAll("*")).find(n=>n.shadowRoot?.querySelector?.(".gengage-chat-root, .gengage-chat-launcher-container"))}function sn(e,t){const n=an(e);n?.style&&(t?n.style.removeProperty("display"):n.style.setProperty("display","none","important")),t||(e?.chat||e?._chat)?.close?.()}var cn="nd_be_url";function un(e,t){const n=ln()||e.beUrl||t;if(!n)throw new Error("resolveBeUrl: backend URL is required. The injector must supply a fallback URL; the SDK has no default.");return n}function ln(){try{const e=new URLSearchParams(window.location.search).get(cn)?.trim();if(!e)return null;const t=new URL(e);return t.protocol!=="https:"&&t.protocol!=="http:"?null:t.toString().replace(/\/+$/u,"")}catch{return null}}var dn="entries",fn=1,pn={volatile:"Hot per-page state and sensitive request context.",session:"Current-visit tool context without raw tokens or PII-heavy payloads.",local:"Small, non-sensitive capability facts or user preferences.",indexedDb:"Larger product/search payload caches with short TTLs."},Ne=new Map;function Q(){return Date.now()}function Y(e){return e?.expiresAt!=null&&e.expiresAt<=Q()}function X(e,t){return{value:e,createdAt:Q(),expiresAt:t?Q()+t:null}}function mn(e,t,n){try{const r=e.getItem(`${t}${n}`);if(!r)return null;const o=JSON.parse(r);return Y(o)?(e.removeItem(`${t}${n}`),null):o.value}catch{return null}}function yn(e,t,n,r,o){try{return e.setItem(`${t}${n}`,JSON.stringify(X(r,o))),!0}catch{return!1}}function gn(e,t,n){try{e.removeItem(`${t}${n}`)}catch{}}function $e(e){try{return window[e]}catch{return null}}function Le(e,t){return e?{get:n=>mn(e,t,n),set:(n,r,o={})=>yn(e,t,n,r,o.ttlMs),remove:n=>gn(e,t,n)}:{get:()=>null,set:()=>!1,remove:()=>{}}}function Z(e){if(Array.isArray(e))return`[${e.map(Z).join(",")}]`;if(e&&typeof e=="object"){const t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Z(t[n])}`).join(",")}}`}return JSON.stringify(e)}function De(e){let t=2166136261;const n=Z(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(36)}function hn(e,t){const n=t.dbName||`gengage-${e}`,r=t.dbStore||dn,o=t.dbVersion||fn,i=new Map;let a=null;const s=()=>"indexedDB"in window?a||(a=new Promise(l=>{const c=indexedDB.open(n,o);c.onupgradeneeded=()=>{c.result.createObjectStore(r,{keyPath:"key"})},c.onsuccess=()=>l(c.result),c.onerror=()=>l(null),c.onblocked=()=>l(null)}),a):Promise.resolve(null);return{volatileEntries:i,idbGet:async l=>{const c=await s();return c?new Promise(d=>{const y=c.transaction(r,"readwrite").objectStore(r),g=y.get(l);g.onsuccess=()=>{const h=g.result;if(!h||Y(h)){h&&y.delete(l),d(null);return}d(h.value)},g.onerror=()=>d(null)}):null},idbSet:async(l,c,d={})=>{const y=await s();return y?new Promise(g=>{const h=y.transaction(r,"readwrite");h.oncomplete=()=>g(!0),h.onerror=()=>g(!1),h.objectStore(r).put({key:l,...X(c,d.ttlMs)})}):!1},idbRemove:async l=>{const c=await s();c&&c.transaction(r,"readwrite").objectStore(r).delete(l)}}}function wn(e,t={}){const n=window,r=n.gengage||(n.gengage={}),o=r.memory||(r.memory={}),i=o[e];if(i)return i;const a=Ne.get(e)||hn(e,t);Ne.set(e,a);const s=t.sessionPrefix||`gengage:${e}:session:`,f=t.localPrefix||`gengage:${e}:local:`,u={get:d=>{const y=a.volatileEntries.get(d);return y?Y(y)?(a.volatileEntries.delete(d),null):y.value:null},set:(d,y,g={})=>(a.volatileEntries.set(d,X(y,g.ttlMs)),!0),remove:d=>{a.volatileEntries.delete(d)},clear:()=>a.volatileEntries.clear()},l={get:a.idbGet,set:a.idbSet,remove:a.idbRemove},c={accountId:e,volatile:u,session:Le($e("sessionStorage"),s),local:Le($e("localStorage"),f),indexedDb:l,stableKey:De,policy:{...pn,...t.policy||{}}};o[e]=c;for(const d of t.aliases||[])o[d]=c;return c}var bn=["addToCart","search","searchKeyword","facetedSearch","searchGiftOptions","similaritySearch"];function Sn(e,t,n={}){const r=window,o=r.gengage||(r.gengage={}),i=o.tools||(o.tools={});i[e]=t;for(const a of n.accountAliases||[])i[a]=t;if(n.exposeStandardAliases!==!1)for(const a of n.standardAliases||bn){const s=t[a];typeof s=="function"&&(i[a]=i[a]||s)}return t}function kn({getPageType:e,getProduct:t}){return()=>({url:window.location.href,title:document.title,pageType:e(),product:t()})}function _n({accountId:e,getPageType:t,getProduct:n,getToolNames:r,getSearchCapabilities:o,getMemory:i}){return async()=>({accountId:e,url:window.location.href,pageType:t(),productSku:n()?.sku??null,toolNames:r(),...o?{searchCapabilities:o()}:{},...i?{memoryPolicy:i().policy}:{},timestamp:new Date().toISOString()})}function An({accountId:e,runtimeFile:t="runtime.js",startExport:n="start",globalBaseUrlKey:r,errorLabel:o}={}){if(!e)throw new Error("accountId is required.");const i=o||e,a=window,s=()=>{const l=a.GengageInjectorConfig||{},c=l[e]||{};return{...l,...c}},f=()=>{const l=s();if(l.runtimeUrl)return l.runtimeUrl;const c=l.assetBaseUrl||l.baseUrl||document.currentScript?.getAttribute("src")||(r?a[r]:null);if(!c)throw new Error(`${i} runtime URL cannot be resolved.`);return new URL(t,c).href},p=a.GengageAssistantInjector||(a.GengageAssistantInjector={}),u=p[e]||(p[e]={});return u.loaderPromise||(u.loaderPromise=import(f()).then(l=>{const c=l[n];if(typeof c!="function")throw new Error(`${i} runtime export ${n} is unavailable.`);return c()}).catch(l=>{throw delete u.loaderPromise,console.error(`[Gengage][${e}] runtime load failed`,l),l})),u.loaderPromise}m.AgentError=$,m.ContextStore=ie,m.action=ut,m.actionButtonsUiSpec=Dt,m.beErrorToAgentError=L,m.beautyConsultingTurnFlow=Ft,m.buildPhotoSimilarityProfile=Ht,m.buildProductSimilarityProfile=R,m.buildSimilarityQueries=Kt,m.canUseModuleWorker=J,m.caughtToStreamError=fe,m.comparisonUiSpec=Lt,m.createBrowserMemory=wn,m.createDiagnosticsTool=_n,m.createFlow=Ce,m.createInjectorAdapter=we,m.createMainThreadInjectorAdapter=be,m.createModuleWorker=Pe,m.createReadPageTool=kn,m.done=D,m.elapsedMs=U,m.error=ye,m.httpErrorToAgentError=de,m.installBrowserTools=Sn,m.installFetchTransportBridge=vt,m.metadata=ct,m.mountAccount=Nt,m.normalizeProduct=O,m.normalizeSimilarityText=A,m.nowIso=ne,m.productDetailsUiSpec=$t,m.productsUiSpec=ve,m.rankSimilarProducts=Wt,m.requestText=B,m.resolveBeUrl=un,m.resolveFlow=ge,m.scoreSimilarityCandidate=Oe,m.setAssistantHostVisible=sn,m.stableKey=De,m.startLazyRuntimeLoader=An,m.textChunk=v,m.tokenizeSimilarityText=k,m.trimProductFactsCore=je,m.trimProductFactsListCore=H,m.uiSpec=me})(this.Gengage=this.Gengage||{});
|
|
5
|
+
`],{type:"text/javascript"}),i=URL.createObjectURL(o);try{return{worker:new Worker(i,{type:"module",name:t}),cleanup(){URL.revokeObjectURL(i)}}}catch(a){throw URL.revokeObjectURL(i),a}}function xe(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function O(e){const t=xe(e);if(!t)return null;const n=x(t.sku,t.SKU);if(!n)return null;const r={sku:n,name:x(t.name,t.title,t.short_name,n)||n,url:x(t.url)||""},o=Array.isArray(t.images)?t.images:void 0,i=x(t.imageUrl,t.image_url,t.image,o?.[0]);i&&(r.imageUrl=i),o&&o.length>1&&(r.images=o.filter(g=>!!g).map(String));const a=M(t.price_discounted),s=M(t.price),f=a||s;f>0&&(r.price=String(f));const p=a>0?s:0;p>0&&(r.originalPrice=String(p));const u=x(t.brand);u&&(r.brand=u);const l=M(t.rating);l>0&&(r.rating=l);const c=M(t.review_count)||M(t.reviewCount);c>0&&(r.reviewCount=c);const d=x(t.cart_code,t.cartCode);d&&(r.cartCode=d),typeof t.in_stock=="boolean"&&(r.inStock=t.in_stock),typeof t.inStock=="boolean"&&(r.inStock=t.inStock);const y=t.category_names;return Array.isArray(y)&&(r.categoryNames=y.map(String)),r}function je(e){const t=xe(e);if(!t)return e;const n=t.category_names,r=Array.isArray(n)?n:void 0,o=t.images,i=Array.isArray(o)?o:void 0,a={sku:t.sku,name:t.name||t.title,url:t.url,price:t.price,currency:t.price_currency||t.currency,category:r?.[r.length-1]??void 0,category_names:r?r.slice(0,4):void 0,image:i?i[0]:t.image,in_stock:t.in_stock,rating:t.rating,review_count:t.review_count};for(const s of Object.keys(a))a[s]===void 0&&delete a[s];return a}function H(e){return Array.isArray(e)?e.map(je).filter(t=>!!t):[]}function x(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function M(e){const t=Number(e);return Number.isFinite(t)?t:0}function Ie(e){return Array.isArray(e)?e.map(String).filter(Boolean):typeof e=="string"&&e?[e]:[]}function ve(e=[]){const t={},n=[];return(Array.isArray(e)?e.map(O).filter(r=>!!r):[]).forEach((r,o)=>{const i=`product-${o.toString()}`;n.push(i);const a={sku:r.sku,product:r};t[i]={type:"ProductCard",props:{product:r,index:o,action:{title:r.name,type:"launchSingleProduct",payload:a}}}}),t.root={type:"ProductGrid",props:{layout:"grid"},children:n},{widget:"chat",panelHint:"panel",spec:{root:"root",elements:t}}}function $t(e){return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ProductDetailsPanel",props:{product:O(e)||e||{}}}}}}}function Lt(e={}){const t=(e.multiple_product_details||e.products||[]).map(O).filter(r=>!!r),n=e.table||{};return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ComparisonTable",props:{products:t,recommended:t.find(r=>r.sku===e.recommended_choice_sku)||t[0],attributes:Object.entries(n).map(([r,o])=>({label:r,values:Array.isArray(o)?o.map(String):[String(o??"")]})),highlights:Ie(e.key_differences),specialCases:Ie(e.special_considerations),recommendedText:e.recommended_choice,productActions:Object.fromEntries(t.map(r=>[r.sku,{title:r.name,type:"launchSingleProduct",payload:{sku:r.sku,product:r}}]))}}}}}}function Dt(e=[]){return{widget:"chat",panelHint:"inline",spec:{root:"root",elements:{root:{type:"ActionButtons",props:{buttons:(Array.isArray(e)?e:[]).map(t=>{const n=t.label||t.title||t.shortName||"",r=t.action||t.requestDetails||t.request_details;return!n||!r?.type?null:{label:n,action:{title:n,type:r.type,...r.payload!==void 0?{payload:r.payload}:{}}}}).filter(t=>!!t)}}}}}}function B(e){const t=e?.payload;if(typeof t=="string")return t;if(t&&typeof t=="object"&&"text"in t){const r=t.text;if(typeof r=="string")return r}const n=e?.action;return n&&typeof n.payload=="string"?n.payload:n&&typeof n.title=="string"?n.title:""}function Ce(e){return Object.freeze([...e])}function P(e){return e&&typeof e=="object"?e:{}}function K(e){return e&&typeof e=="object"?e:{}}function Me(e){return e.thread.extensions.beauty_profile}var Ft=Ce([{kind:"be_op",op:"beauty-consulting-turn",input:({request:e,context:t})=>({utterance:B(e),prior_messages:t.messages.slice(-10),profile:Me(t),candidate_products:zt(e),locale:t.meta.locale}),out:"consultation",patch:Re},{kind:"branch",on:({bag:e})=>P(e.consultation).consultation_state?.stage||"answer",cases:{refuse:[{kind:"refusal",message:({bag:e})=>{const t=P(e.consultation);return t.refusal?.message||t.plain_text||"I cannot help with that request."}}],needs_more_info:[{kind:"emit",build:({bag:e})=>v(V(P(e.consultation)),!0)},{kind:"commit"}],search:[{kind:"tool",name:"search",input:({request:e,bag:t,context:n})=>{const r=P(t.consultation);return{query:r.search_params?.query||B(e),facets:r.search_params?.facets||{},limit:12,locale:n.meta.locale}},out:"products",patch:(e,t)=>{const n=K(t);return{panel:{...e.panel,screen_sku_list:W(n).map(r=>qt(r)).filter(r=>!!r),last_search:{query:n.query||""}}}}},{kind:"emit",build:({bag:e})=>me(ve(W(K(e.products))))},{kind:"be_op",op:"beauty-consulting-turn",input:({request:e,context:t,bag:n})=>({utterance:B(e),prior_messages:t.messages.slice(-10),profile:Me(t),candidate_products:H(W(K(n.products)).slice(0,12)),locale:t.meta.locale}),out:"answer",patch:(e,t)=>{const n=Re(e,t),r=(P(t).product_mentions||[]).map(o=>o.sku).filter(o=>!!o);return{...n||{},panel:{...e.panel,chat_mentioned_skus:r}}}},{kind:"emit",build:({bag:e})=>{const t=P(e.answer);return v(V(t),!0,{productMentions:t.product_mentions||[]})}},{kind:"commit"}],default:[{kind:"emit",build:({bag:e})=>{const t=P(e.consultation);return v(V(t),!0,{productMentions:t.product_mentions||[]})}},{kind:"commit"}]}}]);function Re(e,t){const n=P(t).consultation_state?.captured_profile;if(!n)return null;const r=e.thread.extensions.beauty_profile&&typeof e.thread.extensions.beauty_profile=="object"?e.thread.extensions.beauty_profile:{};return{thread:{...e.thread,extensions:{...e.thread.extensions,beauty_profile:{...r,...n}}}}}function W(e){return Array.isArray(e?.products)?e.products:[]}function qt(e){if(e&&typeof e=="object"&&"sku"in e){const t=e.sku;if(typeof t=="string")return t}}function zt(e){const t=e?.payload&&typeof e.payload=="object"?e.payload.products:void 0,n=e?.action?.payload&&typeof e.action.payload=="object"?e.action.payload.products:void 0,r=t||n;return Array.isArray(r)?H(r.slice(0,12)):void 0}function V(e){return e?.answer_html||e?.plain_text||e?.refusal?.message||"I can help with beauty shopping."}var Ue=new Set(["and","are","box","for","from","gift","gifts","the","with"]),Gt={token:.26,keyword:.22,category:.18,facet:.16,color:.08,attribute:.06,price:.08,retrieval:.08},Jt=["amber","beige","black","blue","blush","bronze","brown","cream","gold","green","grey","ivory","lilac","mixed","orange","pastel","pink","purple","red","silver","white","yellow"];function A(e){return String(e??"").normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),"").toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").replace(/\s+/gu," ").trim()}function k(e,t=Ue){const n=t instanceof Set?t:new Set([...Ue,...t]),r=new Set,o=[];for(const i of A(e).split(/\s+/u))i.length<3||n.has(i)||r.has(i)||(r.add(i),o.push(i));return o}function R(e,t={}){if(Vt(e))return e;const n=t.facetKeys,r=b(e.category_names??e.category),o=b(e.category_ids),i=Qt(e.facet_hits),a=Object.entries(i).filter(([g])=>!n||n.some(h=>A(h)===A(g))).map(([,g])=>g),s=_(e.name,e.title),f=_(e.brand),p=t.sourceKeywords??[],u=[s,f,...r,...a,...b(e.promotions),_(e.description),...p].join(" "),l=k(u,t.stopWords),c=_(t.sourceProductType,Zt(r,s,l),l[0]),d=T([...Xt(u,Jt),...Object.entries(i).filter(([g])=>/colou?r/iu.test(g)).flatMap(([,g])=>k(g,t.stopWords))]),y=T([...a.flatMap(g=>k(g,t.stopWords)),...b(e.promotions).flatMap(g=>k(g,t.stopWords))]).slice(0,24);return{sku:_(e.sku),title:s,brand:f,productType:c,categoryNames:r,categoryIds:o,facets:i,keywords:T([...p.flatMap(g=>k(g,t.stopWords)),...l]).slice(0,12),tokens:l,colors:d,attributes:y,price:Yt(e)}}function Ht(e,t={}){const n=_(e.product_type,e.productType),r=_(e.title,n,b(e.keywords).join(" ")),o=T([...b(e.keywords),...b(e.colors),...b(e.materials),...b(e.styles),...b(e.attributes)]);return R({sku:"__photo__",name:r,category_names:n?[n]:[],facet_hits:{colors:b(e.colors).join(", "),materials:b(e.materials).join(", "),styles:b(e.styles).join(", "),attributes:b(e.attributes).join(", ")},promotions:o},{...t,sourceProductType:n,sourceKeywords:o})}function Kt(e,t={}){const n=R(e,t);return T([...t.sourceQueries??[],N([n.productType,...n.colors.slice(0,1),...n.attributes.slice(0,2)]),N([n.productType,...n.keywords.slice(0,3)]),N([n.categoryNames[n.categoryNames.length-1],...n.keywords.slice(0,2)]),N(n.title.split(/\s+/u).slice(0,6)),n.productType].map(r=>r.trim()).filter(Boolean)).slice(0,t.queryLimit??6)}function Oe(e,t,n={}){const r={...Gt,...n.weights},o=R(t,n),i=[],a=j(e.tokens,o.tokens),s=j(e.keywords,o.tokens),f=en(e.categoryNames,o.categoryNames)||j(Be(e.categoryNames),Be(o.categoryNames)),p=j(e.attributes,o.attributes),u=j(e.colors,o.colors),l=j(e.attributes,o.tokens),c=tn(e.price,o.price),d=nn(o.sku,n.hitCounts)>0?1:0,y=rn(e,o),g=a*r.token+s*r.keyword+f*r.category+p*r.facet+u*r.color+l*r.attribute+c*r.price+d*r.retrieval,h=on(y?g:g*.35);return y&&e.productType&&e.productType===o.productType&&i.push("same product type"),f>.4&&i.push("similar category"),p>.2&&i.push("matching product attributes"),u>0&&i.push("matching colour"),c>.8&&i.push("similar price"),y||i.push("weaker product-type match"),{score:Number(h.toFixed(4)),reasons:i}}function Wt(e,t,n={}){const r=R(e,n),o=new Set([r.sku,...n.ignoreSkus??[]].filter(Boolean));return t.filter(i=>{const a=_(i.sku);return a&&!o.has(a)}).map(i=>{const a=Oe(r,i,n);return{...i,similarity_score:a.score,similarity_reasons:a.reasons}}).sort((i,a)=>a.similarity_score-i.similarity_score).slice(0,Math.max(1,Math.min(n.limit??12,100)))}function Vt(e){return!!(e&&typeof e=="object"&&Array.isArray(e.tokens))}function _(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function b(e){return Array.isArray(e)?e.map(t=>_(t)).filter(Boolean):typeof e=="string"&&e.trim()?e.split(/[,;/|]+/u).map(t=>t.trim()).filter(Boolean):[]}function Qt(e){return!e||typeof e!="object"||Array.isArray(e)?{}:Object.fromEntries(Object.entries(e).map(([t,n])=>[t,_(n)]).filter(([,t])=>t))}function Yt(e){const t=Number(e.price_discounted);if(Number.isFinite(t)&&t>0)return t;const n=Number(e.price);return Number.isFinite(n)&&n>0?n:0}function T(e){const t=new Set,n=[];for(const r of e){const o=A(r);!o||t.has(o)||(t.add(o),n.push(o))}return n}function Xt(e,t){const n=` ${A(e)} `;return t.filter(r=>n.includes(` ${A(r)} `))}function Zt(e,t,n){const r=A(e[e.length-1]??e[0]??"");if(r){const o=k(r),i=new Set(k(t));return o.find(a=>i.has(a))??o[0]??r}return n[0]??""}function N(e){return e.map(t=>A(t)).filter(Boolean).join(" ").replace(/\s+/gu," ").trim().slice(0,120)}function Be(e){return e.flatMap(t=>k(t))}function j(e,t){const n=T(e),r=new Set(T(t));return n.length===0||r.size===0?0:n.filter(o=>r.has(o)).length/n.length}function en(e,t){const n=T(e),r=new Set(T(t));return n.length===0||r.size===0?0:n.filter(o=>r.has(o)).length/n.length}function tn(e,t){return e<=0||t<=0?0:Math.min(e,t)/Math.max(e,t)}function nn(e,t){return!e||!t?0:typeof t.get=="function"?t.get(e)??0:t[e]??0}function rn(e,t){if(!e.productType||!t.productType||e.productType===t.productType)return!0;const n=new Set(k(e.productType)),r=new Set([...k(t.productType),...t.tokens]);return[...n].some(o=>r.has(o))}function on(e){return Math.max(0,Math.min(1,e))}function an(e){const t=(e?.chat||e?._chat)?.root||e?._chat?.root;return t?t.getRootNode?.()?.host||t:Array.from(document.querySelectorAll("*")).find(n=>n.shadowRoot?.querySelector?.(".gengage-chat-root, .gengage-chat-launcher-container"))}function sn(e,t){const n=an(e);n?.style&&(t?n.style.removeProperty("display"):n.style.setProperty("display","none","important")),t||(e?.chat||e?._chat)?.close?.()}var cn="nd_be_url";function un(e,t){const n=ln()||e.beUrl||t;if(!n)throw new Error("resolveBeUrl: backend URL is required. The injector must supply a fallback URL; the SDK has no default.");return n}function ln(){try{const e=new URLSearchParams(window.location.search).get(cn)?.trim();if(!e)return null;const t=new URL(e);return t.protocol!=="https:"&&t.protocol!=="http:"?null:t.toString().replace(/\/+$/u,"")}catch{return null}}var dn="entries",fn=1,pn={volatile:"Hot per-page state and sensitive request context.",session:"Current-visit tool context without raw tokens or PII-heavy payloads.",local:"Small, non-sensitive capability facts or user preferences.",indexedDb:"Larger product/search payload caches with short TTLs."},Ne=new Map;function Q(){return Date.now()}function Y(e){return e?.expiresAt!=null&&e.expiresAt<=Q()}function X(e,t){return{value:e,createdAt:Q(),expiresAt:t?Q()+t:null}}function mn(e,t,n){try{const r=e.getItem(`${t}${n}`);if(!r)return null;const o=JSON.parse(r);return Y(o)?(e.removeItem(`${t}${n}`),null):o.value}catch{return null}}function yn(e,t,n,r,o){try{return e.setItem(`${t}${n}`,JSON.stringify(X(r,o))),!0}catch{return!1}}function gn(e,t,n){try{e.removeItem(`${t}${n}`)}catch{}}function $e(e){try{return window[e]}catch{return null}}function Le(e,t){return e?{get:n=>mn(e,t,n),set:(n,r,o={})=>yn(e,t,n,r,o.ttlMs),remove:n=>gn(e,t,n)}:{get:()=>null,set:()=>!1,remove:()=>{}}}function Z(e){if(Array.isArray(e))return`[${e.map(Z).join(",")}]`;if(e&&typeof e=="object"){const t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Z(t[n])}`).join(",")}}`}return JSON.stringify(e)}function De(e){let t=2166136261;const n=Z(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(36)}function hn(e,t){const n=t.dbName||`gengage-${e}`,r=t.dbStore||dn,o=t.dbVersion||fn,i=new Map;let a=null;const s=()=>"indexedDB"in window?a||(a=new Promise(l=>{const c=indexedDB.open(n,o);c.onupgradeneeded=()=>{c.result.createObjectStore(r,{keyPath:"key"})},c.onsuccess=()=>l(c.result),c.onerror=()=>l(null),c.onblocked=()=>l(null)}),a):Promise.resolve(null);return{volatileEntries:i,idbGet:async l=>{const c=await s();return c?new Promise(d=>{const y=c.transaction(r,"readwrite").objectStore(r),g=y.get(l);g.onsuccess=()=>{const h=g.result;if(!h||Y(h)){h&&y.delete(l),d(null);return}d(h.value)},g.onerror=()=>d(null)}):null},idbSet:async(l,c,d={})=>{const y=await s();return y?new Promise(g=>{const h=y.transaction(r,"readwrite");h.oncomplete=()=>g(!0),h.onerror=()=>g(!1),h.objectStore(r).put({key:l,...X(c,d.ttlMs)})}):!1},idbRemove:async l=>{const c=await s();c&&c.transaction(r,"readwrite").objectStore(r).delete(l)}}}function wn(e,t={}){const n=window,r=n.gengage||(n.gengage={}),o=r.memory||(r.memory={}),i=o[e];if(i)return i;const a=Ne.get(e)||hn(e,t);Ne.set(e,a);const s=t.sessionPrefix||`gengage:${e}:session:`,f=t.localPrefix||`gengage:${e}:local:`,u={get:d=>{const y=a.volatileEntries.get(d);return y?Y(y)?(a.volatileEntries.delete(d),null):y.value:null},set:(d,y,g={})=>(a.volatileEntries.set(d,X(y,g.ttlMs)),!0),remove:d=>{a.volatileEntries.delete(d)},clear:()=>a.volatileEntries.clear()},l={get:a.idbGet,set:a.idbSet,remove:a.idbRemove},c={accountId:e,volatile:u,session:Le($e("sessionStorage"),s),local:Le($e("localStorage"),f),indexedDb:l,stableKey:De,policy:{...pn,...t.policy||{}}};o[e]=c;for(const d of t.aliases||[])o[d]=c;return c}var bn=["addToCart","search","searchKeyword","facetedSearch","searchGiftOptions","similaritySearch"];function Sn(e,t,n={}){const r=window,o=r.gengage||(r.gengage={}),i=o.tools||(o.tools={});i[e]=t;for(const a of n.accountAliases||[])i[a]=t;if(n.exposeStandardAliases!==!1)for(const a of n.standardAliases||bn){const s=t[a];typeof s=="function"&&(i[a]=i[a]||s)}return t}function kn({getPageType:e,getProduct:t}){return()=>({url:window.location.href,title:document.title,pageType:e(),product:t()})}function _n({accountId:e,getPageType:t,getProduct:n,getToolNames:r,getSearchCapabilities:o,getMemory:i}){return async()=>({accountId:e,url:window.location.href,pageType:t(),productSku:n()?.sku??null,toolNames:r(),...o?{searchCapabilities:o()}:{},...i?{memoryPolicy:i().policy}:{},timestamp:new Date().toISOString()})}function An({accountId:e,runtimeFile:t="runtime.js",startExport:n="start",globalBaseUrlKey:r,errorLabel:o}={}){if(!e)throw new Error("accountId is required.");const i=o||e,a=window,s=()=>{const l=a.GengageInjectorConfig||{},c=l[e]||{};return{...l,...c}},f=()=>{const l=s();if(l.runtimeUrl)return l.runtimeUrl;const c=l.assetBaseUrl||l.baseUrl||document.currentScript?.getAttribute("src")||(r?a[r]:null);if(!c)throw new Error(`${i} runtime URL cannot be resolved.`);return new URL(t,c).href},p=a.GengageAssistantInjector||(a.GengageAssistantInjector={}),u=p[e]||(p[e]={});return u.loaderPromise||(u.loaderPromise=import(f()).then(l=>{const c=l[n];if(typeof c!="function")throw new Error(`${i} runtime export ${n} is unavailable.`);return c()}).catch(l=>{throw delete u.loaderPromise,console.error(`[Gengage][${e}] runtime load failed`,l),l})),u.loaderPromise}m.AgentError=$,m.ContextStore=ie,m.action=ut,m.actionButtonsUiSpec=Dt,m.beErrorToAgentError=L,m.beautyConsultingTurnFlow=Ft,m.buildPhotoSimilarityProfile=Ht,m.buildProductSimilarityProfile=R,m.buildSimilarityQueries=Kt,m.canUseModuleWorker=J,m.caughtToStreamError=fe,m.comparisonUiSpec=Lt,m.createBrowserMemory=wn,m.createDiagnosticsTool=_n,m.createFlow=Ce,m.createInjectorAdapter=we,m.createMainThreadInjectorAdapter=be,m.createModuleWorker=Pe,m.createReadPageTool=kn,m.done=D,m.elapsedMs=U,m.error=ye,m.httpErrorToAgentError=de,m.installBrowserTools=Sn,m.installFetchTransportBridge=vt,m.metadata=ct,m.mountAccount=Nt,m.normalizeProduct=O,m.normalizeSimilarityText=A,m.nowIso=ne,m.productDetailsUiSpec=$t,m.productsUiSpec=ve,m.rankSimilarProducts=Wt,m.requestText=B,m.resolveBeUrl=un,m.resolveFlow=ge,m.scoreSimilarityCandidate=Oe,m.setAssistantHostVisible=sn,m.stableKey=De,m.startLazyRuntimeLoader=An,m.textChunk=v,m.tokenizeSimilarityText=k,m.trimProductFactsCore=je,m.trimProductFactsListCore=H,m.uiSpec=me})(this.Gengage=this.Gengage||{});
|
package/dist/chat-runtime.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as e, d as t, i as r, l as s, n, o as i, r as l, s as C, t as c, u as d } from "./runtime-
|
|
1
|
+
import { c as e, d as t, i as r, l as s, n, o as i, r as l, s as C, t as c, u as d } from "./runtime-OdW89-j-.js";
|
|
2
2
|
export {
|
|
3
3
|
s as CHAT_SCROLL_ELEMENT_ID,
|
|
4
4
|
r as ChatPresentationState,
|