@gengage/assistant-fe 0.6.11 → 0.6.13

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.
Files changed (50) hide show
  1. package/dist/agentic/adaptor/mount.d.ts +1 -0
  2. package/dist/agentic/context/context-store.d.ts +2 -1
  3. package/dist/agentic/context/persistence.d.ts +2 -1
  4. package/dist/agentic/index.d.ts +3 -1
  5. package/dist/agentic/index.js +244 -240
  6. package/dist/agentic/types.d.ts +39 -21
  7. package/dist/agentic/util/browser-memory.d.ts +2 -2
  8. package/dist/agentic/util/cache-key.d.ts +15 -0
  9. package/dist/agentic/worker/be-client.d.ts +3 -1
  10. package/dist/agentic/worker.d.ts +3 -1
  11. package/dist/agentic/worker.js +92 -86
  12. package/dist/agentic.iife.js +5 -5
  13. package/dist/{api-paths-D65Uavfh.js → api-paths-ChCMvKkx.js} +1 -1
  14. package/dist/{chat-CrEa2W-e.js → chat-BP-yXukW.js} +1 -1
  15. package/dist/chat-runtime.js +1 -1
  16. package/dist/chat.iife.js +17 -17
  17. package/dist/chat.js +2 -2
  18. package/dist/common/request-response-cache.d.ts +9 -0
  19. package/dist/{common-D9p39tcK.js → common-BD_DSsqY.js} +3 -3
  20. package/dist/common.js +7 -7
  21. package/dist/{connection-warning-B4WXvW_P.js → connection-warning-CPeEsQ35.js} +1 -1
  22. package/dist/{fastIntent-CtaxOsQe.js → fastIntent-C1WeEqW8.js} +1 -1
  23. package/dist/index.js +12 -12
  24. package/dist/{native-webview-BlHM7cLs.js → native-webview-DbKq9lN8.js} +1 -1
  25. package/dist/native.iife.js +14 -14
  26. package/dist/native.js +1 -1
  27. package/dist/overlay.js +1 -1
  28. package/dist/{qna-BNvttR6s.js → qna-B3lMzHvS.js} +1 -1
  29. package/dist/qna-runtime.js +1 -1
  30. package/dist/qna.iife.js +13 -13
  31. package/dist/qna.js +2 -2
  32. package/dist/request-response-cache-zsgz3Awp.js +154 -0
  33. package/dist/request-text-su3Vlhrs.js +1318 -0
  34. package/dist/{runtime-BozDJELC.js → runtime-Dbwwd8yF.js} +38 -37
  35. package/dist/{runtime-CDjc7MP2.js → runtime-DclobJaN.js} +365 -364
  36. package/dist/{runtime-Brx9ReJA.js → runtime-Duvrignh.js} +69 -68
  37. package/dist/{simbut-DFRlkncH.js → simbut-5C5EAfoM.js} +1 -1
  38. package/dist/simbut.iife.js +1 -1
  39. package/dist/simbut.js +1 -1
  40. package/dist/{simrel-Cizk0RY8.js → simrel-DCcSBFez.js} +3 -3
  41. package/dist/simrel-runtime.js +1 -1
  42. package/dist/simrel.iife.js +12 -12
  43. package/dist/simrel.js +2 -2
  44. package/dist/{widget-base-Bux39ZWf.js → widget-base-BolzGV28.js} +1 -1
  45. package/package.json +1 -1
  46. package/dist/agentic/flow/beauty-consulting-turn.d.ts +0 -1
  47. package/dist/similarity-CqRK9i75.js +0 -1251
  48. /package/dist/{overlay-fgrzmFTR.js → overlay-CyoB1K0w.js} +0 -0
  49. /package/dist/{price-formatter-xI3g9Cd4.js → price-formatter-CFsWT0lP.js} +0 -0
  50. /package/dist/{schemas-CLo8wCjs.js → schemas-Cq2blsO_.js} +0 -0
@@ -1,5 +1,5 @@
1
- (function(m){Object.defineProperty(m,Symbol.toStringTag,{value:"Module"});function qe(e){return!!e&&typeof e=="object"&&e.type==="rpc.req"}function ze({worker:e,tools:t={},beacon:n,memory:r=sessionStorage}){e.addEventListener("message",o=>{const i=o.data;qe(i)&&Ge(e,i,{tools:t,beacon:n,memory:r})})}async function Ge(e,t,n){try{const r=await te(t.method,t.payload,n);e.postMessage({type:"rpc.result",rpcId:t.rpcId,ok:!0,value:r})}catch(r){e.postMessage({type:"rpc.result",rpcId:t.rpcId,ok:!1,error:{message:r instanceof Error?r.message:String(r)}})}}function Je(e){if(e&&typeof e=="object"&&typeof e.name=="string")return e;throw new Error("tool.invoke requires { name, input }")}function He(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.get requires { key }")}function We(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.set requires { key }")}async function te(e,t,{tools:n,beacon:r,memory:o}){if(e==="tool.invoke"){const{name:i,input:a}=Je(t),s=n[i];if(typeof s!="function")throw new Error(`Unknown tool: ${i}`);return s(a)}if(e==="beacon.send")return r?.(t),{sent:!0};if(e==="memory.get"){const{key:i}=He(t),a=o.getItem(String(i));return a?JSON.parse(a):null}if(e==="memory.set"){const{key:i,value:a}=We(t);return o.setItem(String(i),JSON.stringify(a??null)),{ok:!0}}throw new Error(`Unknown RPC method: ${e}`)}function ne(){return new Date().toISOString()}function U(e){return Math.max(0,Math.round(performance.now()-e))}function v(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ke(e){const{accountId:t,locale:n="en-GB",parentUrl:r="",threadId:o,incomingContext:i}=e,a=v(i)?i:{},s=v(a.thread)?a.thread:{},f=v(a.panel)?a.panel:{},p=v(a.meta)?a.meta:{},d=re(a.messages),u={id:String(o||s.id||self.crypto.randomUUID()),started_at:String(s.started_at||ne()),extensions:v(s.extensions)?{...s.extensions}:{}},c=String(p.locale||n),l=String(p.parentUrl||r||typeof self<"u"&&self.location?.href||"");return{panel:{...f},messages:d,thread:u,meta:{locale:c,parentUrl:l,accountId:t}}}function Ve(e,t){const n=re([t])[0];return n?{...e,messages:[...e.messages,n].slice(-50)}:e}function re(e){return Array.isArray(e)?e.map(t=>{const n=t?.role;return{role:n==="model"?"assistant":typeof n=="string"?n:"",content:String(t?.content||"")}}).filter(t=>(t.role==="user"||t.role==="assistant")&&!!t.content).slice(-50):[]}var Qe="gengage:agent:context:";async function Ye({accountId:e,threadId:t,rpc:n}){const r=await n("memory.get",{tier:"session",key:oe(e,t)});return r&&typeof r=="object"&&!Array.isArray(r)?r:{}}async function Xe({accountId:e,threadId:t,extensions:n,rpc:r}){await r("memory.set",{tier:"session",key:oe(e,t),value:{thread:{extensions:n}}})}function oe(e,t){return`${Qe}${e}:${t}`}function S(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ie=class{#e=new Map;#t;#r;#o;#n;constructor({accountId:e,locale:t,parentUrl:n,rpc:r}){this.#t=e,this.#r=t,this.#o=n,this.#n=r}async load(e){const t=e?.meta?.threadId||e?.session_id||e?.sessionId,n=String(t||"default"),r=this.#e.get(n);if(r)return r;const o=await Ye({accountId:this.#t,threadId:n,rpc:this.#n}),i=Ke({accountId:this.#t,locale:e?.locale||this.#r,parentUrl:this.#o,threadId:n,incomingContext:Ze(o,e?.context)});return this.#e.set(n,i),i}patch(e,t){const n=String(e||"default"),r=this.#e.get(n);if(!r)return null;const o=ae(r,typeof t=="function"?t(r):t);return this.#e.set(n,o),o}appendUserMessage(e,t){const n=String(e||"default");if(!t)return this.#e.get(n)??null;const r=this.#e.get(n);if(!r)return null;const o=Ve(r,{role:"user",content:t});return this.#e.set(n,o),o}async commit(e){const t=String(e||"default"),n=this.#e.get(t);return n?(await Xe({accountId:this.#t,threadId:t,extensions:n.thread.extensions,rpc:this.#n}),n):null}};function Ze(e,t){return!S(e)&&!S(t)?{}:ae(S(e)?e:{},S(t)?t:{})}function ae(e,t){if(!S(t))return e;const n=e,r=t,o=S(n.panel)?n.panel:{},i=S(r.panel)?r.panel:{},a=S(n.thread)?n.thread:{},s=S(r.thread)?r.thread:{},f=S(a.extensions)?a.extensions:{},p=S(s.extensions)?s.extensions:{},d=S(n.meta)?n.meta:{},u=S(r.meta)?r.meta:{};return{...e,...t,panel:{...o,...i},thread:{...a,...s,extensions:{...f,...p}},meta:{...d,...u},messages:Array.isArray(r.messages)?r.messages.slice(-50):e.messages??[]}}function se(e){const t=String.fromCharCode(...e);return btoa(t).replace(/\+/gu,"-").replace(/\//gu,"_").replace(/=+$/u,"")}function ce(e){return se(new TextEncoder().encode(JSON.stringify(e)))}async function et({accountId:e,devJwtSecret:t,ttlS:n=300}){if(!t)throw new Error("devJwtSecret is required for local agent mode.");const r=Math.floor(Date.now()/1e3),o=`${ce({alg:"HS256",typ:"JWT"})}.${ce({sub:e,iat:r,exp:r+n,scope:"invoke",jti:crypto.randomUUID?.()||`${r}-${Math.random()}`})}`,i=await crypto.subtle.importKey("raw",new TextEncoder().encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),a=await crypto.subtle.sign("HMAC",i,new TextEncoder().encode(o));return`${o}.${se(new Uint8Array(a))}`}function ue({accountId:e,devJwtSecret:t,tokenBrokerUrl:n,tokenBrokerAudience:r,refreshSkewS:o=30,fetchImpl:i=fetch}){let a=null;return async({signal:s,parentUrl:f}={})=>{if(t)return et({accountId:e,devJwtSecret:t});if(!n)throw new Error("tokenBrokerUrl is required for production agent mode.");const p=Math.floor(Date.now()/1e3);return a?.token&&a.expiresAtS-o>p||(a=await tt({accountId:e,tokenBrokerUrl:n,tokenBrokerAudience:r,parentUrl:f,signal:s,fetchImpl:i})),a.token}}async function tt({accountId:e,tokenBrokerUrl:t,tokenBrokerAudience:n,parentUrl:r,signal:o,fetchImpl:i}){const a=await i(t,{method:"POST",credentials:"include",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({accountId:e,scope:"invoke",audience:n||void 0,parentUrl:r||void 0}),...o?{signal:o}:{}});if(!a.ok)throw new Error(`Token broker request failed (${a.status}).`);const s=await a.json(),f=s?.token||s?.jwt||s?.access_token;if(!f||typeof f!="string")throw new Error("Token broker response did not include a JWT.");return{token:f,expiresAtS:nt(s)||rt(f)||Math.floor(Date.now()/1e3)+300}}function nt(e){const t=e?.expiresAtS??e?.expires_at_s??e?.expiresInS??e?.expires_in_s;if(Number.isFinite(t))return Number(t);const n=e?.expiresIn??e?.expires_in;if(Number.isFinite(n))return Math.floor(Date.now()/1e3)+Number(n);const r=e?.expiresAt??e?.expires_at;if(typeof r=="string"){const o=Date.parse(r);if(Number.isFinite(o))return Math.floor(o/1e3)}return null}function rt(e){try{const[,t]=e.split(".");if(!t)return null;const n=t.replace(/-/gu,"+").replace(/_/gu,"/"),r=atob(n.padEnd(Math.ceil(n.length/4)*4,"=")),o=JSON.parse(r);return Number.isFinite(o?.exp)?Number(o.exp):null}catch{return null}}var le={unauthorized:{code:"auth",message:"Assistant authentication failed. Please retry."},forbidden:{code:"auth",message:"Assistant authentication failed. Please retry."},unknown_op:{code:"op_unavailable",message:"This assistant action is not available yet."},invalid_input:{code:"invalid_request",message:"The assistant request was not valid."},account_config:{code:"account_config",message:"Assistant configuration is unavailable."},upstream_llm:{code:"op_failed",message:"The assistant could not complete that request."},upstream_timeout:{code:"op_timeout",message:"The assistant took too long to respond."},schema_mismatch:{code:"op_failed",message:"The assistant could not complete that request."},rate_limited:{code:"rate_limited",message:"The assistant is receiving too many requests. Please retry shortly."},internal:{code:"op_failed",message:"The assistant could not complete that request."},payload_too_large:{code:"invalid_request",message:"The assistant request was too large."}},$=class extends Error{constructor(e,t,n={}){super(t),this.name="AgentError",this.code=e,this.source=n.source||"agent",n.sourceCode&&(this.sourceCode=n.sourceCode),n.detail!==void 0&&(this.detail=n.detail)}};function L(e){const t=String(e?.code||"upstream_llm"),n=le[t]||le.upstream_llm;return new $(n.code,n.message,{source:"be",sourceCode:t,detail:e?.detail})}function de(e,t){const n=t?.error&&typeof t.error=="object"?t.error:{};return L({code:String(n.code||ot(e)),detail:n.detail})}function fe(e){return e instanceof $?{type:"error",code:e.code,message:e.message}:{type:"error",code:"agent_invoke_failed",message:"The assistant could not complete that request."}}function ot(e){return e===401?"unauthorized":e===403?"forbidden":e===413?"payload_too_large":e===429?"rate_limited":"internal"}async function it({beUrl:e,accountId:t,devJwtSecret:n,tokenBrokerUrl:r,tokenBrokerAudience:o,jwtProvider:i,parentUrl:a,op:s,input:f,cacheTtlS:p,cacheKey:d,signal:u}){const c=await(i||ue({accountId:t,devJwtSecret:n,tokenBrokerUrl:r,tokenBrokerAudience:o}))({...u?{signal:u}:{},...a?{parentUrl:a}:{}}),{opDomain:l,opName:y}=at(s,t),g={method:"POST",headers:{authorization:`Bearer ${c}`,"content-type":"application/json",accept:"application/x-ndjson"},body:JSON.stringify({op_domain:l,op_name:y,op_payload:f,...p!==void 0?{cache_ttl_s:p}:{},...d!==void 0?{cache_key:d}:{}}),...u?{signal:u}:{}},h=await fetch(`${String(e).replace(/\/+$/u,"")}/v1/execute`,g);if(!h.ok)throw de(h.status,await ct(h));return ut(h)}function at(e,t){if(!e||e.startsWith("-")||e.endsWith("-"))throw new Error(`Invalid BE op name: ${e}`);return{opDomain:st(t),opName:e}}function st(e){return e.replace(/-agentic$/u,"")}async function ct(e){try{return await e.json()}catch{return{error:{code:e.statusText||"internal"}}}}async function ut(e){const t=e.body?.getReader();if(!t)throw new Error("BE response body is not readable.");const n=new TextDecoder;let r="";const o={};for(;;){const{value:a,done:s}=await t.read();if(s)break;r+=n.decode(a,{stream:!0});let f=r.indexOf(`
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
- `)}}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 lt(e={}){return{type:"metadata",...e}}function C(e,t=!1,n={}){return{type:"text_chunk",content:e,final:t,...n}}function me(e){return{type:"ui_spec",...e}}function dt(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 ft({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),d=p.thread.id,u=_t(e);n.appendUserMessage(d,u);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 l={request:e,context:n.patch(d,{})||p,bag:{},accountConfig:t.accountConfig||{},threadId:d,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,l,y),l.committed||await q(l,y),await a("beacon.send",{type:"turnSummary",threadId:d,sessionId:e?.session_id||e?.sessionId||d,accountId:t.accountId||l.context.meta.accountId,steps:l.steps,totalLatencyMs:U(f),productSkusEmitted:[...l.productSkusEmitted]}),{steps:l.steps,productSkusEmitted:[...l.productSkusEmitted]}}async function F(e,t,n){for(const r of e){if(n.signal?.aborted)return;t.steps+=1,await pt(r,t,n),t.context=n.contextStore.patch(t.threadId,{})||t.context}}async function pt(e,t,n){const r=z(t);if(e.kind==="be_op"){await mt(e,t,n,r);return}if(e.kind==="tool"){await yt(e,t,n,r);return}if(e.kind==="emit"){gt(e,t,n);return}if(e.kind==="branch"){await ht(e,t,n,r);return}if(e.kind==="parallel"){await wt(e,t,n);return}if(e.kind==="refusal"){await bt(e,t,n,r);return}e.kind==="commit"&&await St(e,t,n)}async function mt(e,t,n,r){const o=performance.now();let i;const a=j(e.cacheTtlS,r),s=j(e.cacheKey,r);try{i=await n.beClient.invoke({op:e.op,input:j(e.input,r),...a!==void 0?{cacheTtlS:a}:{},...s!==void 0?{cacheKey:s}:{},...n.signal?{signal:n.signal}:{}})}catch(p){const d=p,u=String(d?.sourceCode||d?.code||"unknown"),c={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",c),p}e.out&&(t.bag[e.out]=i),he(e,i,t,n.contextStore);const f={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",f)}async function yt(e,t,n,r){const o=await n.toolBridge.invoke(e.name,j(e.input,r));e.out&&(t.bag[e.out]=o),he(e,o,t,n.contextStore)}function gt(e,t,n){const r=e.build(z(t));kt(r,t.productSkusEmitted),n.emit(r)}async function ht(e,t,n,r){const o=String(j(e.on,r)||"default");await F(e.cases[o]||e.cases.default||[],t,n)}async function wt(e,t,n){await Promise.all(e.steps.map(r=>F(r,t,n)))}async function bt(e,t,n,r){n.emit(C(j(e.message,r),!0)),await q(t,n)}async function St(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 j(e,t){return typeof e=="function"?e(t):e}function _t(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 kt(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 At(e){return{invoke(t,n){return e("tool.invoke",{name:t,input:n})}}}var Tt=512,Et=.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 d=new Map;return ze({worker:t,tools:s,beacon:u=>f?.({...u,accountId:u.accountId||e}),memory:sessionStorage}),t.addEventListener("message",u=>{const c=u.data||{},l=typeof c.id=="number"?c.id:null;if(l==null)return;const y=d.get(l);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")),d.delete(l);return}c.type==="end"&&d.delete(l)}}),(u,c,l,y)=>{const g=p++;d.set(g,c);const h=()=>{d.delete(g),t.postMessage({id:g,type:"abort"})},E=w=>{if(l.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(l.aborted){h();return}if(l.addEventListener("abort",h,{once:!0}),y){Se(u,y).then(E).catch(w=>{d.delete(g),c.onError(w instanceof Error?w:new Error("Failed to read image attachment"))});return}E(u)}}function be({accountId:e,accountModule:t,beUrl:n,devJwtSecret:r,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:s={},beacon:f}){let p=null;const d=Pt({accountId:e,tools:s,beacon:f}),u=At(d),c=ue({accountId:e,...r?{devJwtSecret:r}:{},...o?{tokenBrokerUrl:o}:{},...i?{tokenBrokerAudience:i}:{}});return async(l,y,g,h)=>{const E=await Se(l||{},h);p||=new ie({accountId:e,locale:E?.locale||a,parentUrl:window.location.href,rpc:d});try{await ft({request:E,accountModule:{...t,accountId:e},contextStore:p,beClient:{invoke({op:w,input:ee,signal:Fe,cacheTtlS:Pn,cacheKey:jn}){return it({beUrl:n,accountId:e,jwtProvider:c,parentUrl:window.location.href,op:w,input:ee,cacheTtlS:Pn,cacheKey:jn,...Fe?{signal:Fe}:{}})}},toolBridge:u,emit:w=>G(y,w),rpc:d,signal:g})}catch(w){g?.aborted||(G(y,fe(w)),y.onDone())}}}function Pt({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 It(t),r={...jt(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 jt(e){return xt(e)?{...e}:typeof e=="string"?{text:e}:{}}function xt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function It(e){const t=await vt(e);return t||{dataUrl:await _e(e),mime:e.type}}async function vt(e){if(typeof createImageBitmap!="function"||typeof document>"u")return null;let t=null;try{t=await createImageBitmap(e);const n=Math.min(1,Tt/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",Et));return s?{dataUrl:await _e(s),mime:s.type||"image/jpeg"}:null}catch{return null}finally{t?.close()}}async function _e(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(Ct(t));break;case"done":e.onDone();break;default:break}}function Ct(e){const t=new Error(e.message||e.code||"Agent error");return e.code&&(t.code=e.code),t}var ke="__gengageAgentFetchBridge";function Mt({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=Rt(),o=`https://gengage-injector.invalid/${encodeURIComponent(e)}`,i=new Set,a=s=>{const f=`${o}/chat/${s}`;i.add(f);const p=n[s],d={streamTransport:t,endpoint:s};p&&(d.endpointHandler=p),r.routes.set(f,d)};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 Rt(){const e=window,t=e[ke];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?Ot(s,o,i):n(o,i)},e[ke]=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 Ut(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 Ot(e,t,n){if(e.endpoint&&e.endpoint!=="process_action"&&e.endpointHandler){const p=new AbortController,d=Te(t,n);let u=null;if(d){const c=()=>p.abort();d.aborted&&c(),d.addEventListener("abort",c,{once:!0}),u=()=>d.removeEventListener("abort",c)}try{const c=await Bt(t,n);return await e.endpointHandler(c,{accountId:Nt(t),endpoint:e.endpoint,signal:p.signal})}finally{u?.()}}const r=new TextEncoder,o=new AbortController,i=Te(t,n);let a=!1,s=null;const f=new ReadableStream({async start(p){const d=l=>{a||p.enqueue(r.encode(`${JSON.stringify(l)}
4
- `))},u=()=>{a||(a=!0,s?.(),p.close())},c=l=>{d({type:"error",code:l?.code||"agent_bridge_error",message:l instanceof Error?l.message:String(l)}),d({type:"done"}),u()};if(i){const l=()=>{o.abort(),a||(a=!0,s?.(),p.error(new DOMException("Aborted","AbortError")))};if(i.aborted){l();return}i.addEventListener("abort",l,{once:!0}),s=()=>i.removeEventListener("abort",l)}try{const{request:l,attachment:y}=await Ut(t,n),g=e.streamTransport(l,{onTextChunk:(h,E,w={})=>d({type:"text_chunk",content:h,final:E===!0,...w}),onUISpec:(h,E,w,ee)=>d({type:"ui_spec",spec:h,widget:E,...w?{panelHint:w}:{},...ee?{clearPanel:!0}:{}}),onAction:h=>{d(h?.type==="action"?h:{type:"action",action:h})},onMetadata:h=>{d(h?.type==="metadata"?h:{type:"metadata",...h})},onError:c,onDone:()=>{d({type:"done"}),u()}},o.signal,y);$t(g)&&(await g,o.signal.aborted||(d({type:"done"}),u()))}catch(l){o.signal.aborted||c(l)}},cancel(){o.abort(),s?.(),a=!0}});return new Response(f,{status:200,headers:{"Content-Type":"application/x-ndjson"}})}async function Bt(e,t){const n=await Promise.resolve(Ee(e,t));return typeof n!="string"||n.trim()===""?{}:JSON.parse(n)}function Nt(e){try{const[t]=new URL(Ae(e)).pathname.split("/").filter(Boolean);return decodeURIComponent(t||"")}catch{return""}}function $t(e){return e!==null&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"}function Lt({accountId:e,beUrl:t,devJwtSecret:n,tokenBrokerUrl:r,tokenBrokerAudience:o,workerUrl:i,defaultLocale:a="en-GB",accountModule:s,tools:f={},beacon:p,allowBlobWorker:d=!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 u=window,c=u.GengageAssistantInjector||(u.GengageAssistantInjector={}),l=c[e]||(c[e]={});if(l.agentController)return l.agentController;const y=J(i)||d?Pe(i,`gengage-${e}-agent`,{allowBlobWorker:d}):null;l.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 l.streamTransport,y?.worker.terminate(),y?.cleanup(),delete l.agentController},diagnostics(){return{accountId:e,beUrl:t,workerUrl:i,mounted:!0,transport:y?"worker":"main-thread",flows:Object.keys(s?.flows||{})}}};return l.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 je(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function O(e){const t=je(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 d=x(t.brand);d&&(r.brand=d);const u=M(t.rating);u>0&&(r.rating=u);const c=M(t.review_count)||M(t.reviewCount);c>0&&(r.reviewCount=c);const l=x(t.cart_code,t.cartCode);l&&(r.cartCode=l),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 xe(e){const t=je(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(xe).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 Dt(e){return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ProductDetailsPanel",props:{product:O(e)||e||{}}}}}}}function Ft(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 qt(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 W(e){return e&&typeof e=="object"?e:{}}function Me(e){return e.thread.extensions.beauty_profile}var zt=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:Jt(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})=>C(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=W(t);return{panel:{...e.panel,screen_sku_list:K(n).map(r=>Gt(r)).filter(r=>!!r),last_search:{query:n.query||""}}}}},{kind:"emit",build:({bag:e})=>me(ve(K(W(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(K(W(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 C(V(t),!0,{productMentions:t.product_mentions||[]})}},{kind:"commit"}],default:[{kind:"emit",build:({bag:e})=>{const t=P(e.consultation);return C(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 K(e){return Array.isArray(e?.products)?e.products:[]}function Gt(e){if(e&&typeof e=="object"&&"sku"in e){const t=e.sku;if(typeof t=="string")return t}}function Jt(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"]),Ht={token:.26,keyword:.22,category:.18,facet:.16,color:.08,attribute:.06,price:.08,retrieval:.08},Wt=["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 _(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(Yt(e))return e;const n=t.facetKeys,r=b(e.category_names??e.category),o=b(e.category_ids),i=Xt(e.facet_hits),a=Object.entries(i).filter(([g])=>!n||n.some(h=>A(h)===A(g))).map(([,g])=>g),s=k(e.name,e.title),f=k(e.brand),p=t.sourceKeywords??[],d=[s,f,...r,...a,...b(e.promotions),k(e.description),...p].join(" "),u=_(d,t.stopWords),c=k(t.sourceProductType,tn(r,s,u),u[0]),l=T([...en(d,Wt),...Object.entries(i).filter(([g])=>/colou?r/iu.test(g)).flatMap(([,g])=>_(g,t.stopWords))]),y=T([...a.flatMap(g=>_(g,t.stopWords)),...b(e.promotions).flatMap(g=>_(g,t.stopWords))]).slice(0,24);return{sku:k(e.sku),title:s,brand:f,productType:c,categoryNames:r,categoryIds:o,facets:i,keywords:T([...p.flatMap(g=>_(g,t.stopWords)),...u]).slice(0,12),tokens:u,colors:l,attributes:y,price:Zt(e)}}function Kt(e,t={}){const n=k(e.product_type,e.productType),r=k(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 Vt(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={...Ht,...n.weights},o=R(t,n),i=[],a=I(e.tokens,o.tokens),s=I(e.keywords,o.tokens),f=nn(e.categoryNames,o.categoryNames)||I(Be(e.categoryNames),Be(o.categoryNames)),p=I(e.attributes,o.attributes),d=I(e.colors,o.colors),u=I(e.attributes,o.tokens),c=rn(e.price,o.price),l=on(o.sku,n.hitCounts)>0?1:0,y=an(e,o),g=a*r.token+s*r.keyword+f*r.category+p*r.facet+d*r.color+u*r.attribute+c*r.price+l*r.retrieval,h=sn(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"),d>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 Qt(e,t,n={}){const r=R(e,n),o=new Set([r.sku,...n.ignoreSkus??[]].filter(Boolean));return t.filter(i=>{const a=k(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 Yt(e){return!!(e&&typeof e=="object"&&Array.isArray(e.tokens))}function k(...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=>k(t)).filter(Boolean):typeof e=="string"&&e.trim()?e.split(/[,;/|]+/u).map(t=>t.trim()).filter(Boolean):[]}function Xt(e){return!e||typeof e!="object"||Array.isArray(e)?{}:Object.fromEntries(Object.entries(e).map(([t,n])=>[t,k(n)]).filter(([,t])=>t))}function Zt(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 en(e,t){const n=` ${A(e)} `;return t.filter(r=>n.includes(` ${A(r)} `))}function tn(e,t,n){const r=A(e[e.length-1]??e[0]??"");if(r){const o=_(r),i=new Set(_(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=>_(t))}function I(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 nn(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 rn(e,t){return e<=0||t<=0?0:Math.min(e,t)/Math.max(e,t)}function on(e,t){return!e||!t?0:typeof t.get=="function"?t.get(e)??0:t[e]??0}function an(e,t){if(!e.productType||!t.productType||e.productType===t.productType)return!0;const n=new Set(_(e.productType)),r=new Set([..._(t.productType),...t.tokens]);return[...n].some(o=>r.has(o))}function sn(e){return Math.max(0,Math.min(1,e))}function cn(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 un(e,t){const n=cn(e);n?.style&&(t?n.style.removeProperty("display"):n.style.setProperty("display","none","important")),t||(e?.chat||e?._chat)?.close?.()}var ln="nd_be_url";function dn(e,t){const n=fn()||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 fn(){try{const e=new URLSearchParams(window.location.search).get(ln)?.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 pn="entries",mn=1,yn={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 gn(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 hn(e,t,n,r,o){try{return e.setItem(`${t}${n}`,JSON.stringify(X(r,o))),!0}catch{return!1}}function wn(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=>gn(e,t,n),set:(n,r,o={})=>hn(e,t,n,r,o.ttlMs),remove:n=>wn(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 bn(e,t){const n=t.dbName||`gengage-${e}`,r=t.dbStore||pn,o=t.dbVersion||mn,i=new Map;let a=null;const s=()=>"indexedDB"in window?a||(a=new Promise(u=>{const c=indexedDB.open(n,o);c.onupgradeneeded=()=>{c.result.createObjectStore(r,{keyPath:"key"})},c.onsuccess=()=>u(c.result),c.onerror=()=>u(null),c.onblocked=()=>u(null)}),a):Promise.resolve(null);return{volatileEntries:i,idbGet:async u=>{const c=await s();return c?new Promise(l=>{const y=c.transaction(r,"readwrite").objectStore(r),g=y.get(u);g.onsuccess=()=>{const h=g.result;if(!h||Y(h)){h&&y.delete(u),l(null);return}l(h.value)},g.onerror=()=>l(null)}):null},idbSet:async(u,c,l={})=>{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:u,...X(c,l.ttlMs)})}):!1},idbRemove:async u=>{const c=await s();c&&c.transaction(r,"readwrite").objectStore(r).delete(u)}}}function Sn(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)||bn(e,t);Ne.set(e,a);const s=t.sessionPrefix||`gengage:${e}:session:`,f=t.localPrefix||`gengage:${e}:local:`,d={get:l=>{const y=a.volatileEntries.get(l);return y?Y(y)?(a.volatileEntries.delete(l),null):y.value:null},set:(l,y,g={})=>(a.volatileEntries.set(l,X(y,g.ttlMs)),!0),remove:l=>{a.volatileEntries.delete(l)},clear:()=>a.volatileEntries.clear()},u={get:a.idbGet,set:a.idbSet,remove:a.idbRemove},c={accountId:e,volatile:d,session:Le($e("sessionStorage"),s),local:Le($e("localStorage"),f),indexedDb:u,stableKey:De,policy:{...yn,...t.policy||{}}};o[e]=c;for(const l of t.aliases||[])o[l]=c;return c}var _n=["addToCart","search","searchKeyword","facetedSearch","searchGiftOptions","similaritySearch"];function kn(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||_n){const s=t[a];typeof s=="function"&&(i[a]=i[a]||s)}return t}function An({getPageType:e,getProduct:t}){return()=>({url:window.location.href,title:document.title,pageType:e(),product:t()})}function Tn({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 En({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 u=a.GengageInjectorConfig||{},c=u[e]||{};return{...u,...c}},f=()=>{const u=s();if(u.runtimeUrl)return u.runtimeUrl;const c=u.assetBaseUrl||u.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={}),d=p[e]||(p[e]={});return d.loaderPromise||(d.loaderPromise=import(f()).then(u=>{const c=u[n];if(typeof c!="function")throw new Error(`${i} runtime export ${n} is unavailable.`);return c()}).catch(u=>{throw delete d.loaderPromise,console.error(`[Gengage][${e}] runtime load failed`,u),u})),d.loaderPromise}m.AgentError=$,m.ContextStore=ie,m.action=dt,m.actionButtonsUiSpec=qt,m.beErrorToAgentError=L,m.beautyConsultingTurnFlow=zt,m.buildPhotoSimilarityProfile=Kt,m.buildProductSimilarityProfile=R,m.buildSimilarityQueries=Vt,m.canUseModuleWorker=J,m.caughtToStreamError=fe,m.comparisonUiSpec=Ft,m.createBrowserMemory=Sn,m.createDiagnosticsTool=Tn,m.createFlow=Ce,m.createInjectorAdapter=we,m.createMainThreadInjectorAdapter=be,m.createModuleWorker=Pe,m.createReadPageTool=An,m.done=D,m.elapsedMs=U,m.error=ye,m.httpErrorToAgentError=de,m.installBrowserTools=kn,m.installFetchTransportBridge=Mt,m.metadata=lt,m.mountAccount=Lt,m.normalizeProduct=O,m.normalizeSimilarityText=A,m.nowIso=ne,m.productDetailsUiSpec=Dt,m.productsUiSpec=ve,m.rankSimilarProducts=Qt,m.requestText=B,m.resolveBeUrl=dn,m.resolveFlow=ge,m.scoreSimilarityCandidate=Oe,m.setAssistantHostVisible=un,m.stableKey=De,m.startLazyRuntimeLoader=En,m.textChunk=C,m.tokenizeSimilarityText=_,m.trimProductFactsCore=xe,m.trimProductFactsListCore=H,m.uiSpec=me})(this.Gengage=this.Gengage||{});
1
+ (function(y){Object.defineProperty(y,Symbol.toStringTag,{value:"Module"});function Je(e){return!!e&&typeof e=="object"&&e.type==="rpc.req"}function Ge({worker:e,tools:t={},beacon:r,memory:n=sessionStorage}){e.addEventListener("message",o=>{const i=o.data;Je(i)&&He(e,i,{tools:t,beacon:r,memory:n})})}async function He(e,t,r){try{const n=await ie(t.method,t.payload,r);e.postMessage({type:"rpc.result",rpcId:t.rpcId,ok:!0,value:n})}catch(n){e.postMessage({type:"rpc.result",rpcId:t.rpcId,ok:!1,error:{message:n instanceof Error?n.message:String(n)}})}}function We(e){if(e&&typeof e=="object"&&typeof e.name=="string")return e;throw new Error("tool.invoke requires { name, input }")}function Ve(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.get requires { key }")}function Ye(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.set requires { key }")}async function ie(e,t,{tools:r,beacon:n,memory:o}){if(e==="tool.invoke"){const{name:i,input:a}=We(t),c=r[i];if(typeof c!="function")throw new Error(`Unknown tool: ${i}`);return c(a)}if(e==="beacon.send")return n?.(t),{sent:!0};if(e==="memory.get"){const{key:i}=Ve(t),a=o.getItem(String(i));return a?JSON.parse(a):null}if(e==="memory.set"){const{key:i,value:a}=Ye(t);return o.setItem(String(i),JSON.stringify(a??null)),{ok:!0}}throw new Error(`Unknown RPC method: ${e}`)}function ae(){return new Date().toISOString()}function C(e){return Math.max(0,Math.round(performance.now()-e))}function M(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Qe(e){const{accountId:t,locale:r="en-GB",parentUrl:n="",threadId:o,incomingContext:i}=e,a=M(i)?i:{},c=M(a.thread)?a.thread:{},f=M(a.panel)?a.panel:{},m=M(a.meta)?a.meta:{},d=ce(a.messages),s={id:String(o||c.id||self.crypto.randomUUID()),started_at:String(c.started_at||ae()),extensions:M(c.extensions)?{...c.extensions}:{}},u=String(m.locale||r),l=String(m.parentUrl||n||typeof self<"u"&&self.location?.href||"");return{panel:{...f},messages:d,thread:s,meta:{locale:u,parentUrl:l,accountId:t}}}function Xe(e,t){const r=ce([t])[0];return r?{...e,messages:[...e.messages,r].slice(-50)}:e}function ce(e){return Array.isArray(e)?e.map(t=>{const r=t?.role;return{role:r==="model"?"assistant":typeof r=="string"?r:"",content:String(t?.content||"")}}).filter(t=>(t.role==="user"||t.role==="assistant")&&!!t.content).slice(-50):[]}var Ze="gengage:agent:context:";async function et({accountId:e,threadId:t,rpc:r}){const n=await r("memory.get",{tier:"session",key:se(e,t)});return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}async function tt({accountId:e,threadId:t,extensions:r,panel:n,rpc:o}){await o("memory.set",{tier:"session",key:se(e,t),value:{thread:{extensions:r},...n&&Object.keys(n).length>0?{panel:n}:{}}})}function se(e,t){return`${Ze}${e}:${t}`}function b(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ue=class{#e=new Map;#t;#n;#o;#r;#i;constructor({accountId:e,locale:t,parentUrl:r,rpc:n,persistentPanelKeys:o=[]}){this.#t=e,this.#n=t,this.#o=r,this.#r=n,this.#i=[...new Set(o.filter(Boolean))]}async load(e){const t=e?.meta?.threadId||e?.session_id||e?.sessionId,r=String(t||"default"),n=this.#e.get(r);if(n)return n;const o=await et({accountId:this.#t,threadId:r,rpc:this.#r}),i=Qe({accountId:this.#t,locale:e?.locale||this.#n,parentUrl:this.#o,threadId:r,incomingContext:nt(o,e?.context)});return this.#e.set(r,i),i}patch(e,t){const r=String(e||"default"),n=this.#e.get(r);if(!n)return null;const o=le(n,typeof t=="function"?t(n):t);return this.#e.set(r,o),o}appendUserMessage(e,t){const r=String(e||"default");if(!t)return this.#e.get(r)??null;const n=this.#e.get(r);if(!n)return null;const o=Xe(n,{role:"user",content:t});return this.#e.set(r,o),o}async commit(e){const t=String(e||"default"),r=this.#e.get(t);return r?(await tt({accountId:this.#t,threadId:t,extensions:r.thread.extensions,panel:rt(r.panel,this.#i),rpc:this.#r}),r):null}};function rt(e,t){if(!t.length||!b(e))return;const r={};for(const n of t)Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}function nt(e,t){return!b(e)&&!b(t)?{}:le(b(e)?e:{},b(t)?t:{})}function le(e,t){if(!b(t))return e;const r=e,n=t,o=b(r.panel)?r.panel:{},i=b(n.panel)?n.panel:{},a=b(r.thread)?r.thread:{},c=b(n.thread)?n.thread:{},f=b(a.extensions)?a.extensions:{},m=b(c.extensions)?c.extensions:{},d=b(r.meta)?r.meta:{},s=b(n.meta)?n.meta:{};return{...e,...t,panel:{...o,...i},thread:{...a,...c,extensions:{...f,...m}},meta:{...d,...s},messages:Array.isArray(n.messages)?n.messages.slice(-50):e.messages??[]}}function de(e){const t=String.fromCharCode(...e);return btoa(t).replace(/\+/gu,"-").replace(/\//gu,"_").replace(/=+$/u,"")}function fe(e){return de(new TextEncoder().encode(JSON.stringify(e)))}async function ot({accountId:e,devJwtSecret:t,ttlS:r=300}){if(!t)throw new Error("devJwtSecret is required for local agent mode.");const n=Math.floor(Date.now()/1e3),o=`${fe({alg:"HS256",typ:"JWT"})}.${fe({sub:e,iat:n,exp:n+r,scope:"invoke",jti:crypto.randomUUID?.()||`${n}-${Math.random()}`})}`,i=await crypto.subtle.importKey("raw",new TextEncoder().encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),a=await crypto.subtle.sign("HMAC",i,new TextEncoder().encode(o));return`${o}.${de(new Uint8Array(a))}`}function me({accountId:e,devJwtSecret:t,tokenBrokerUrl:r,tokenBrokerAudience:n,refreshSkewS:o=30,fetchImpl:i=fetch}){let a=null;return async({signal:c,parentUrl:f}={})=>{if(t)return ot({accountId:e,devJwtSecret:t});if(!r)throw new Error("tokenBrokerUrl is required for production agent mode.");const m=Math.floor(Date.now()/1e3);return a?.token&&a.expiresAtS-o>m||(a=await it({accountId:e,tokenBrokerUrl:r,tokenBrokerAudience:n,parentUrl:f,signal:c,fetchImpl:i})),a.token}}async function it({accountId:e,tokenBrokerUrl:t,tokenBrokerAudience:r,parentUrl:n,signal:o,fetchImpl:i}){const a=await i(t,{method:"POST",credentials:"include",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({accountId:e,scope:"invoke",audience:r||void 0,parentUrl:n||void 0}),...o?{signal:o}:{}});if(!a.ok)throw new Error(`Token broker request failed (${a.status}).`);const c=await a.json(),f=c?.token||c?.jwt||c?.access_token;if(!f||typeof f!="string")throw new Error("Token broker response did not include a JWT.");return{token:f,expiresAtS:at(c)||ct(f)||Math.floor(Date.now()/1e3)+300}}function at(e){const t=e?.expiresAtS??e?.expires_at_s??e?.expiresInS??e?.expires_in_s;if(Number.isFinite(t))return Number(t);const r=e?.expiresIn??e?.expires_in;if(Number.isFinite(r))return Math.floor(Date.now()/1e3)+Number(r);const n=e?.expiresAt??e?.expires_at;if(typeof n=="string"){const o=Date.parse(n);if(Number.isFinite(o))return Math.floor(o/1e3)}return null}function ct(e){try{const[,t]=e.split(".");if(!t)return null;const r=t.replace(/-/gu,"+").replace(/_/gu,"/"),n=atob(r.padEnd(Math.ceil(r.length/4)*4,"=")),o=JSON.parse(n);return Number.isFinite(o?.exp)?Number(o.exp):null}catch{return null}}var ye={unauthorized:{code:"auth",message:"Assistant authentication failed. Please retry."},forbidden:{code:"auth",message:"Assistant authentication failed. Please retry."},unknown_op:{code:"op_unavailable",message:"This assistant action is not available yet."},invalid_input:{code:"invalid_request",message:"The assistant request was not valid."},account_config:{code:"account_config",message:"Assistant configuration is unavailable."},upstream_llm:{code:"op_failed",message:"The assistant could not complete that request."},upstream_timeout:{code:"op_timeout",message:"The assistant took too long to respond."},schema_mismatch:{code:"op_failed",message:"The assistant could not complete that request."},rate_limited:{code:"rate_limited",message:"The assistant is receiving too many requests. Please retry shortly."},internal:{code:"op_failed",message:"The assistant could not complete that request."},payload_too_large:{code:"invalid_request",message:"The assistant request was too large."}},D=class extends Error{constructor(e,t,r={}){super(t),this.name="AgentError",this.code=e,this.source=r.source||"agent",r.sourceCode&&(this.sourceCode=r.sourceCode),r.detail!==void 0&&(this.detail=r.detail)}};function z(e){const t=String(e?.code||"upstream_llm"),r=ye[t]||ye.upstream_llm;return new D(r.code,r.message,{source:"be",sourceCode:t,detail:e?.detail})}function pe(e,t){const r=t?.error&&typeof t.error=="object"?t.error:{};return z({code:String(r.code||st(e)),detail:r.detail})}function ge(e){return e instanceof D?{type:"error",code:e.code,message:e.message}:{type:"error",code:"agent_invoke_failed",message:"The assistant could not complete that request."}}function st(e){return e===401?"unauthorized":e===403?"forbidden":e===413?"payload_too_large":e===429?"rate_limited":"internal"}var ut=7200*1e3,he=200,lt=5*1024*1024,dt="gengage_request_response_cache",ft=1,_="responses",mt=new Set(["addToCart","like"]),E=new Map,we=null;async function yt(e,t={},r={}){const n=pt(e,t);if(!n)return fetch(e,t);const o=Date.now(),i=await ht(n,o);if(i)return St(i);const a=await fetch(e,t);return a.ok&&wt(n,a.clone(),o,{ttlMs:r.ttlMs??ut,maxEntries:r.maxEntries??he,maxBodyBytes:r.maxBodyBytes??lt}),a}function pt(e,t={}){if(typeof Request<"u"&&e instanceof Request)return null;const r=String(t.method||"GET").toUpperCase();return r!=="POST"||typeof t.body!="string"||gt(t.body)?null:`rr:${Pt(Tt({url:String(e),method:r,headers:kt(t.headers),body:t.body}))}`}function gt(e){try{const t=JSON.parse(e);if(!t||typeof t!="object"||Array.isArray(t))return!1;const r=t.type;return typeof r=="string"&&mt.has(r)}catch{return!1}}async function ht(e,t){const r=E.get(e);if(r)if(r.expiresAt<=t)E.delete(e);else return r.lastAccessedAt=t,E.delete(e),E.set(e,r),J(r),r;const n=await _t(e);return n?n.expiresAt<=t?(E.delete(e),Et(e),null):(n.lastAccessedAt=t,E.set(e,n),J(n),be(he),n):null}async function wt(e,t,r,n){try{const o=await t.text();if(It(o)>n.maxBodyBytes||bt(o))return;const i={key:e,status:t.status,statusText:t.statusText,headers:At(t.headers),body:o,createdAt:r,expiresAt:r+n.ttlMs,lastAccessedAt:r};E.set(e,i),be(n.maxEntries),await J(i),await xt(n.maxEntries,r)}catch{}}function bt(e){return/"_error"\s*:/u.test(e)||/"type"\s*:\s*"error"/u.test(e)}function St(e){return new Response(e.body,{status:e.status,statusText:e.statusText,headers:new Headers(e.headers)})}function kt(e){const t=new Headers(e),r=[];return t.forEach((n,o)=>{const i=o.toLowerCase();i!=="authorization"&&i!=="cookie"&&r.push([i,n])}),r.sort(([n],[o])=>n.localeCompare(o))}function At(e){const t=[];return e.forEach((r,n)=>{const o=n.toLowerCase();o!=="set-cookie"&&t.push([o,r])}),t.sort(([r],[n])=>r.localeCompare(n))}function be(e){for(;E.size>e;){const t=[...E.values()].sort((r,n)=>r.lastAccessedAt-n.lastAccessedAt)[0];if(!t)break;E.delete(t.key)}}async function L(){return typeof indexedDB>"u"?null:(we??=new Promise(e=>{const t=indexedDB.open(dt,ft);t.onupgradeneeded=()=>{const r=t.result;r.objectStoreNames.contains(_)||r.createObjectStore(_,{keyPath:"key"}).createIndex("lastAccessedAt","lastAccessedAt",{unique:!1})},t.onsuccess=()=>e(t.result),t.onerror=()=>e(null),t.onblocked=()=>e(null)}),we)}async function _t(e){const t=await L();return t?new Promise(r=>{const n=t.transaction(_,"readonly"),o=n.objectStore(_).get(e);o.onsuccess=()=>r(o.result??null),o.onerror=()=>r(null),n.onerror=()=>r(null)}):null}async function J(e){const t=await L();t&&await new Promise(r=>{const n=t.transaction(_,"readwrite");n.objectStore(_).put(e),n.oncomplete=()=>r(),n.onerror=()=>r(),n.onabort=()=>r()})}async function Et(e){const t=await L();t&&await new Promise(r=>{const n=t.transaction(_,"readwrite");n.objectStore(_).delete(e),n.oncomplete=()=>r(),n.onerror=()=>r(),n.onabort=()=>r()})}async function xt(e,t){const r=await L();r&&await new Promise(n=>{const o=r.transaction(_,"readwrite"),i=o.objectStore(_),a=[],c=i.openCursor();c.onsuccess=()=>{const f=c.result;if(!f){const m=a.filter(s=>s.expiresAt<=t),d=a.filter(s=>s.expiresAt>t).sort((s,u)=>s.lastAccessedAt-u.lastAccessedAt).slice(0,Math.max(0,a.length-m.length-e));for(const s of[...m,...d])i.delete(s.key);return}a.push(f.value),f.continue()},c.onerror=()=>n(),o.oncomplete=()=>n(),o.onerror=()=>n(),o.onabort=()=>n()})}function Tt(e){return JSON.stringify(G(e))}function G(e){return Array.isArray(e)?e.map(G):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,G(r)]))}function Pt(e){let t=14695981039346656037n;const r=1099511628211n;for(let n=0;n<e.length;n+=1)t^=BigInt(e.charCodeAt(n)),t=BigInt.asUintN(64,t*r);return t.toString(16).padStart(16,"0")}function It(e){return typeof TextEncoder<"u"?new TextEncoder().encode(e).byteLength:e.length}async function jt({beUrl:e,accountId:t,devJwtSecret:r,tokenBrokerUrl:n,tokenBrokerAudience:o,jwtProvider:i,parentUrl:a,op:c,input:f,cacheTtlS:m,cacheKey:d,browserCache:s,signal:u}){const l=await(i||me({accountId:t,devJwtSecret:r,tokenBrokerUrl:n,tokenBrokerAudience:o}))({...u?{signal:u}:{},...a?{parentUrl:a}:{}}),{opDomain:p,opName:g}=Ct(c,t),h={method:"POST",headers:{authorization:`Bearer ${l}`,"content-type":"application/json",accept:"application/x-ndjson"},body:JSON.stringify({op_domain:p,op_name:g,op_payload:f,...m!==void 0?{cache_ttl_s:m}:{},...d!==void 0?{cache_key:d}:{}}),...u?{signal:u}:{}},k=`${String(e).replace(/\/+$/u,"")}/v1/execute`,w=s===!1?await fetch(k,h):await yt(k,h,typeof s=="object"?s:{});if(!w.ok)throw pe(w.status,await Rt(w));return Mt(w)}function Ct(e,t){if(!e||e.startsWith("-")||e.endsWith("-"))throw new Error(`Invalid BE op name: ${e}`);return{opDomain:Ot(t),opName:e}}function Ot(e){return e.replace(/-agentic$/u,"")}async function Rt(e){try{return await e.json()}catch{return{error:{code:e.statusText||"internal"}}}}async function Mt(e){const t=e.body?.getReader();if(!t)throw new Error("BE response body is not readable.");const r=new TextDecoder;let n="";const o={};for(;;){const{value:a,done:c}=await t.read();if(c)break;n+=r.decode(a,{stream:!0});let f=n.indexOf(`
2
+ `);for(;f>=0;){const m=n.slice(0,f).trim();n=n.slice(f+1),m&&Se(JSON.parse(m),o),f=n.indexOf(`
3
+ `)}}const i=n.trim();return i&&Se(JSON.parse(i),o),o}function Se(e,t){if(e._error)throw z(e._error);if(!e._end)for(const[r,n]of Object.entries(e)){if(Object.prototype.hasOwnProperty.call(t,r))throw new D("op_failed",`BE streamed duplicate field "${r}".`,{source:"be",sourceCode:"schema_mismatch"});t[r]=n}}function Ut(e={}){return{type:"metadata",...e}}function ke(e,t=!1,r={}){return{type:"text_chunk",content:e,final:t,...r}}function Bt(e){return{type:"ui_spec",...e}}function vt(e){return{type:"action",action:e}}function Ae(e,t){return{type:"error",code:e,message:t}}function H(){return{type:"done"}}function _e(e,t){return e[t?.type||t?.action?.type||"inputText"]||e.inputText}async function Nt({request:e,accountModule:t,contextStore:r,beClient:n,toolBridge:o,emit:i,rpc:a,signal:c}){const f=performance.now(),m=await r.load(e),d=m.thread.id,s=Yt(e);r.appendUserMessage(d,s);const u=_e(t.flows,e);if(!u)return i(Ae("unknown_action",`No agent flow for request type ${e?.type||"inputText"}`)),i(H()),{steps:0,productSkusEmitted:[]};const l={request:e,context:r.patch(d,{})||m,bag:{},accountConfig:t.accountConfig||{},threadId:d,steps:0,productSkusEmitted:new Set,committed:!1},p={contextStore:r,beClient:n,toolBridge:o,emit:i,rpc:a,adapters:t.adapters||{},...c?{signal:c}:{}};return await U(u,l,p),l.committed||await W(l,p),await a("beacon.send",{type:"turnSummary",threadId:d,sessionId:e?.session_id||e?.sessionId||d,accountId:t.accountId||l.context.meta.accountId,steps:l.steps,totalLatencyMs:C(f),productSkusEmitted:[...l.productSkusEmitted]}),{steps:l.steps,productSkusEmitted:[...l.productSkusEmitted]}}async function U(e,t,r){for(const n of e){if(r.signal?.aborted)return;t.steps+=1,await Dt(n,t,r),t.context=r.contextStore.patch(t.threadId,{})||t.context}}async function Dt(e,t,r){const n=Y(t);if(e.kind==="be_op"){await Lt(e,t,r,n);return}if(e.kind==="tool"){await $t(e,t,r,n);return}if(e.kind==="adapter"){await Ft(e,t,r,n);return}if(e.kind==="emit"){qt(e,t,r);return}if(e.kind==="branch"){await Kt(e,t,r,n);return}if(e.kind==="parallel"){await zt(e,t,r);return}if(e.kind==="refusal"){await Jt(e,t,r,n);return}e.kind==="commit"&&await Gt(e,t,r)}async function Lt(e,t,r,n){const o=performance.now();let i;const a=I(e.cacheTtlS,n),c=I(e.cacheKey,n),f=I(e.browserCache,n);try{i=await r.beClient.invoke({op:e.op,input:I(e.input,n),...a!==void 0?{cacheTtlS:a}:{},...c!==void 0?{cacheKey:c}:{},...f!==void 0?{browserCache:f}:{},...r.signal?{signal:r.signal}:{}})}catch(d){const s=d,u=String(s?.sourceCode||s?.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:C(o),errorCode:u};if(await r.rpc("beacon.send",l),e.onError){e.errorOut&&(t.bag[e.errorOut]=d),await U(e.onError,t,r);return}throw d}e.out&&(t.bag[e.out]=i),V(e,i,t,r.contextStore);const m={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:C(o)};await r.rpc("beacon.send",m)}async function $t(e,t,r,n){const o=performance.now();try{const i=await r.toolBridge.invoke(e.name,I(e.input,n));e.out&&(t.bag[e.out]=i),V(e,i,t,r.contextStore),await r.rpc("beacon.send",{type:"agentTool",threadId:t.threadId,sessionId:Ee(t),accountId:t.context.meta.accountId,tool:e.name,status:"ok",latencyMs:C(o)})}catch(i){const a=i;if(await r.rpc("beacon.send",{type:"agentTool",threadId:t.threadId,sessionId:Ee(t),accountId:t.context.meta.accountId,tool:e.name,status:"error",latencyMs:C(o),errorCode:String(a?.code||a?.name||"unknown")}),e.onError){e.errorOut&&(t.bag[e.errorOut]=i),await U(e.onError,t,r);return}throw i}}async function Ft(e,t,r,n){const o=r.adapters?.[e.name];if(typeof o!="function")throw new Error(`Unknown flow adapter: ${e.name}`);const i=await o(I(e.input,n),n);e.out&&(t.bag[e.out]=i),V(e,i,t,r.contextStore)}function qt(e,t,r){const n=e.build(Y(t));Qt(n,t.productSkusEmitted),r.emit(n)}async function Kt(e,t,r,n){const o=String(I(e.on,n)||"default");await U(e.cases[o]||e.cases.default||[],t,r)}async function zt(e,t,r){const n=e.steps.map(a=>{const c={...t,context:Ht(t.context),bag:{...t.bag},productSkusEmitted:t.productSkusEmitted,committed:!1};return U(a,c,{...r,contextStore:Wt(c)}).then(()=>c)}),o=await Promise.all(n),i=e.merge||{};for(const a of o){for(const c of i.bag||[])Object.prototype.hasOwnProperty.call(a.bag,c)&&(t.bag[c]=a.bag[c]);if(i.panel?.length){const c=xe(a.context.panel,i.panel);Object.keys(c).length&&(t.context=r.contextStore.patch(t.threadId,{panel:c})||t.context)}if(i.threadExtensions?.length){const c=xe(a.context.thread.extensions,i.threadExtensions);Object.keys(c).length&&(t.context=r.contextStore.patch(t.threadId,{thread:{...t.context.thread,extensions:c}})||t.context)}}}async function Jt(e,t,r,n){r.emit(ke(I(e.message,n),!0)),await W(t,r)}async function Gt(e,t,r){await W(t,r)}async function W(e,{contextStore:t,emit:r}){e.committed||(e.context=await t.commit(e.threadId)||e.context,e.committed=!0,r(H()))}function V(e,t,r,n){if(typeof e.patch!="function")return;const o=e.patch(r.context,t,Y(r));o&&(r.context=n.patch(r.threadId,o)||r.context)}function Y(e){return{request:e.request,context:e.context,bag:e.bag,accountConfig:e.accountConfig}}function Ee(e){return e.request?.session_id||e.request?.sessionId||e.threadId}function Ht(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function xe(e,t){const r={};for(const n of t)Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}function Wt(e){return{async load(){return e.context},patch(t,r){return e.context=Vt(e.context,r),e.context},appendUserMessage(){return e.context},async commit(){return e.context}}}function Vt(e,t){return!t||typeof t!="object"?e:{...e,...t,panel:{...e.panel||{},...t.panel||{}},thread:{...e.thread||{},...t.thread||{},extensions:{...e.thread?.extensions||{},...t.thread?.extensions||{}}},meta:{...e.meta||{},...t.meta||{}},messages:Array.isArray(t.messages)?t.messages.slice(-50):e.messages}}function I(e,t){return typeof e=="function"?e(t):e}function Yt(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}return typeof e?.action?.payload=="string"?e.action.payload:typeof e?.action?.title=="string"?e.action.title:""}function Qt(e,t){const r=e,n=r.spec,o=Array.isArray(n?.items)?n.items:void 0,i=Array.isArray(r.items)?r.items:void 0,a=o||i;if(Array.isArray(a)){for(const c of a)if(c&&typeof c=="object"){const f=c.sku;typeof f=="string"&&t.add(f)}}}function Xt(e){return{invoke(t,r){return e("tool.invoke",{name:t,input:r})}}}var Zt=512,er=.74;function Te({accountId:e,worker:t,beUrl:r,devJwtSecret:n,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:c={},beacon:f}){let m=1;const d=new Map;return Ge({worker:t,tools:c,beacon:s=>f?.({...s,accountId:s.accountId||e}),memory:sessionStorage}),t.addEventListener("message",s=>{const u=s.data||{},l=typeof u.id=="number"?u.id:null;if(l==null)return;const p=d.get(l);if(p){if(u.type==="event"&&u.event){Q(p,u.event);return}if(u.type==="error"){p.onError(new Error(u.message||"Agent worker failed")),d.delete(l);return}u.type==="end"&&d.delete(l)}}),(s,u,l,p)=>{const g=m++;d.set(g,u);const h=()=>{d.delete(g),t.postMessage({id:g,type:"abort"})},k=w=>{if(l.aborted){h();return}t.postMessage({id:g,type:"invoke",accountId:e,beUrl:r,devJwtSecret:n,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,request:w,parentUrl:window.location.href})};if(l.aborted){h();return}if(l.addEventListener("abort",h,{once:!0}),p){Ie(s,p).then(k).catch(w=>{d.delete(g),u.onError(w instanceof Error?w:new Error("Failed to read image attachment"))});return}k(s)}}function Pe({accountId:e,accountModule:t,beUrl:r,devJwtSecret:n,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:c={},beacon:f}){let m=null;const d=tr({accountId:e,tools:c,beacon:f}),s=Xt(d),u=me({accountId:e,...n?{devJwtSecret:n}:{},...o?{tokenBrokerUrl:o}:{},...i?{tokenBrokerAudience:i}:{}});return async(l,p,g,h)=>{const k=await Ie(l||{},h);m||=new ue({accountId:e,locale:k?.locale||a,parentUrl:window.location.href,rpc:d,persistentPanelKeys:t.contextPersistence?.panelKeys});try{await Nt({request:k,accountModule:{...t,accountId:e},contextStore:m,beClient:{invoke({op:w,input:oe,signal:ze,cacheTtlS:dn,cacheKey:fn,browserCache:mn}){return jt({beUrl:r,accountId:e,jwtProvider:u,parentUrl:window.location.href,op:w,input:oe,cacheTtlS:dn,cacheKey:fn,browserCache:mn,...ze?{signal:ze}:{}})}},toolBridge:s,emit:w=>Q(p,w),rpc:d,signal:g})}catch(w){g?.aborted||(Q(p,ge(w)),p.onDone())}}}function tr({accountId:e,tools:t,beacon:r}){const n=o=>r?.({...o,accountId:o.accountId||e});return((o,i)=>ie(o,i,{tools:t,beacon:n,memory:sessionStorage}))}async function Ie(e,t){if(!t||!t.type?.startsWith("image/"))return e;const r=await or(t),n={...rr(e.payload??e.action?.payload),image_data_url:r.dataUrl,image_mime:r.mime};return{...e,payload:n,...e.action?{action:{...e.action,payload:n}}:{}}}function rr(e){return nr(e)?{...e}:typeof e=="string"?{text:e}:{}}function nr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function or(e){const t=await ir(e);return t||{dataUrl:await je(e),mime:e.type}}async function ir(e){if(typeof createImageBitmap!="function"||typeof document>"u")return null;let t=null;try{t=await createImageBitmap(e);const r=Math.min(1,Zt/Math.max(t.width,t.height)),n=Math.max(1,Math.round(t.width*r)),o=Math.max(1,Math.round(t.height*r)),i=document.createElement("canvas");i.width=n,i.height=o;const a=i.getContext("2d");if(!a)return null;a.drawImage(t,0,0,n,o);const c=await new Promise(f=>i.toBlob(f,"image/jpeg",er));return c?{dataUrl:await je(c),mime:c.type||"image/jpeg"}:null}catch{return null}finally{t?.close()}}async function je(e){const t=new Uint8Array(await e.arrayBuffer());let r="";const n=32768;for(let o=0;o<t.length;o+=n)r+=String.fromCharCode(...t.subarray(o,o+n));return`data:${e.type};base64,${btoa(r)}`}function Q(e,t){switch(t?.type){case"text_chunk":{const r=t;e.onTextChunk(r.content||"",r.final===!0,r);break}case"ui_spec":{const r=t;e.onUISpec(r.spec,r.widget,r.panelHint,r.clearPanel===!0);break}case"action":e.onAction(t);break;case"metadata":e.onMetadata(t);break;case"error":e.onError(ar(t));break;case"done":e.onDone();break;default:break}}function ar(e){const t=new Error(e.message||e.code||"Agent error");return e.code&&(t.code=e.code),t}var $="__gengageAgentFetchBridge";function cr({accountId:e,streamTransport:t,endpoints:r={}}){if(!e)throw new Error("accountId is required.");if(typeof t!="function")throw new Error("streamTransport is required.");const n=sr(),o=`https://gengage-injector.invalid/${encodeURIComponent(e)}`,i=new Set,a=c=>{const f=`${o}/chat/${c}`;i.add(f);const m=r[c],d={streamTransport:t,endpoint:c};m&&(d.endpointHandler=m),n.routes.set(f,d)};a("process_action");for(const c of Object.keys(r))c!=="process_action"&&a(c);return{middlewareUrl:o,stop(){for(const c of i)n.routes.delete(c);ur(n)}}}function sr(){const e=window,t=e[$];if(t)return t;const r=e.fetch.bind(e),n={routes:new Map,originalFetch:r,installedFetch:r};return n.installedFetch=(o,i)=>{const a=Ce(o),c=n.routes.get(a);return c?dr(c,o,i):r(o,i)},e.fetch=n.installedFetch,e[$]=n,n}function ur(e){if(e.routes.size>0)return;const t=window;t.fetch===e.installedFetch&&(t.fetch=e.originalFetch),t[$]===e&&delete t[$]}function Ce(e){return typeof e=="string"?e:e instanceof URL?e.href:e?.url||""}function Oe(e,t){if(t?.signal)return t.signal;if(typeof Request<"u"&&e instanceof Request)return e.signal}function Re(e,t){return t?.body!==void 0&&t?.body!==null?t.body:typeof Request<"u"&&e instanceof Request?e.clone().text():null}async function lr(e,t){const r=Re(e,t);if(r instanceof FormData){const o=r.get("request"),i=r.get("attachment");return{request:JSON.parse(String(o||"{}")),...i instanceof File?{attachment:i}:{}}}const n=await Promise.resolve(r);return typeof n=="string"?{request:JSON.parse(n||"{}")}:{request:{}}}async function dr(e,t,r){if(e.endpoint&&e.endpoint!=="process_action"&&e.endpointHandler){const m=new AbortController,d=Oe(t,r);let s=null;if(d){const u=()=>m.abort();d.aborted&&u(),d.addEventListener("abort",u,{once:!0}),s=()=>d.removeEventListener("abort",u)}try{const u=await fr(t,r);return await e.endpointHandler(u,{accountId:mr(t),endpoint:e.endpoint,signal:m.signal})}finally{s?.()}}const n=new TextEncoder,o=new AbortController,i=Oe(t,r);let a=!1,c=null;const f=new ReadableStream({async start(m){const d=l=>{a||m.enqueue(n.encode(`${JSON.stringify(l)}
4
+ `))},s=()=>{a||(a=!0,c?.(),m.close())},u=l=>{d({type:"error",code:l?.code||"agent_bridge_error",message:l instanceof Error?l.message:String(l)}),d({type:"done"}),s()};if(i){const l=()=>{o.abort(),a||(a=!0,c?.(),m.error(new DOMException("Aborted","AbortError")))};if(i.aborted){l();return}i.addEventListener("abort",l,{once:!0}),c=()=>i.removeEventListener("abort",l)}try{const{request:l,attachment:p}=await lr(t,r),g=e.streamTransport(l,{onTextChunk:(h,k,w={})=>d({type:"text_chunk",content:h,final:k===!0,...w}),onUISpec:(h,k,w,oe)=>d({type:"ui_spec",spec:h,widget:k,...w?{panelHint:w}:{},...oe?{clearPanel:!0}:{}}),onAction:h=>{d(h?.type==="action"?h:{type:"action",action:h})},onMetadata:h=>{d(h?.type==="metadata"?h:{type:"metadata",...h})},onError:u,onDone:()=>{d({type:"done"}),s()}},o.signal,p);yr(g)&&(await g,o.signal.aborted||(d({type:"done"}),s()))}catch(l){o.signal.aborted||u(l)}},cancel(){o.abort(),c?.(),a=!0}});return new Response(f,{status:200,headers:{"Content-Type":"application/x-ndjson"}})}async function fr(e,t){const r=await Promise.resolve(Re(e,t));return typeof r!="string"||r.trim()===""?{}:JSON.parse(r)}function mr(e){try{const[t]=new URL(Ce(e)).pathname.split("/").filter(Boolean);return decodeURIComponent(t||"")}catch{return""}}function yr(e){return e!==null&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"}function pr({accountId:e,beUrl:t,devJwtSecret:r,tokenBrokerUrl:n,tokenBrokerAudience:o,workerUrl:i,defaultLocale:a="en-GB",accountModule:c,tools:f={},beacon:m,allowBlobWorker:d=!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 s=window,u=s.GengageAssistantInjector||(s.GengageAssistantInjector={}),l=u[e]||(u[e]={});if(l.agentController)return l.agentController;const p=X(i)||d?Me(i,`gengage-${e}-agent`,{allowBlobWorker:d}):null;p||m?.({type:"agentRuntime",accountId:e,transport:"main-thread",reason:"cross-origin-worker-url",workerUrl:i}),l.streamTransport=p?Te({accountId:e,worker:p.worker,beUrl:t,...r?{devJwtSecret:r}:{},...n?{tokenBrokerUrl:n}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:f,...m?{beacon:m}:{}}):Pe({accountId:e,accountModule:c,beUrl:t,...r?{devJwtSecret:r}:{},...n?{tokenBrokerUrl:n}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:f,...m?{beacon:m}:{}});const g={type:"agent",stop(){delete l.streamTransport,p?.worker.terminate(),p?.cleanup(),delete l.agentController},diagnostics(){return{accountId:e,beUrl:t,workerUrl:i,mounted:!0,transport:p?"worker":"main-thread",transportReason:p?"module-worker":"cross-origin-worker-url",flows:Object.keys(c?.flows||{})}}};return l.agentController=g,g}function X(e){const t=new URL(e,window.location.href);return t.origin===window.location.origin||t.protocol==="blob:"}function Me(e,t,r={}){const n=new URL(e,window.location.href);if(X(e))return{worker:new Worker(n.href,{type:"module",name:t}),cleanup(){}};if(!r.allowBlobWorker)throw new Error("Cross-origin agent workers require allowBlobWorker=true or a same-origin workerUrl.");const o=new Blob([`import ${JSON.stringify(n.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 Ue(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function F(e){const t=Ue(e);if(!t)return null;const r=O(t.sku,t.SKU);if(!r)return null;const n={sku:r,name:O(t.name,t.title,t.short_name,r)||r,url:O(t.url)||""},o=Array.isArray(t.images)?t.images:void 0,i=O(t.imageUrl,t.image_url,t.image,o?.[0]);i&&(n.imageUrl=i),o&&o.length>1&&(n.images=o.filter(g=>!!g).map(String));const a=B(t.price_discounted),c=B(t.price),f=a||c;f>0&&(n.price=String(f));const m=a>0?c:0;m>0&&(n.originalPrice=String(m));const d=O(t.brand);d&&(n.brand=d);const s=B(t.rating);s>0&&(n.rating=s);const u=B(t.review_count)||B(t.reviewCount);u>0&&(n.reviewCount=u);const l=O(t.cart_code,t.cartCode);l&&(n.cartCode=l),typeof t.in_stock=="boolean"&&(n.inStock=t.in_stock),typeof t.inStock=="boolean"&&(n.inStock=t.inStock);const p=t.category_names;return Array.isArray(p)&&(n.categoryNames=p.map(String)),n}function Z(e){const t=Ue(e);if(!t)return e;const r=t.category_names,n=Array.isArray(r)?r: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:n?.[n.length-1]??void 0,category_names:n?n.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 c of Object.keys(a))a[c]===void 0&&delete a[c];return a}function gr(e){return Array.isArray(e)?e.map(Z).filter(t=>!!t):[]}function O(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function B(e){const t=Number(e);return Number.isFinite(t)?t:0}function Be(e){return Array.isArray(e)?e.map(String).filter(Boolean):typeof e=="string"&&e?[e]:[]}function hr(e=[]){const t={},r=[];return(Array.isArray(e)?e.map(F).filter(n=>!!n):[]).forEach((n,o)=>{const i=`product-${o.toString()}`;r.push(i);const a={sku:n.sku,product:n};t[i]={type:"ProductCard",props:{product:n,index:o,action:{title:n.name,type:"launchSingleProduct",payload:a}}}}),t.root={type:"ProductGrid",props:{layout:"grid"},children:r},{widget:"chat",panelHint:"panel",spec:{root:"root",elements:t}}}function wr(e){return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ProductDetailsPanel",props:{product:F(e)||e||{}}}}}}}function br(e={}){const t=(e.multiple_product_details||e.products||[]).map(F).filter(n=>!!n),r=e.table||{};return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ComparisonTable",props:{products:t,recommended:t.find(n=>n.sku===e.recommended_choice_sku)||t[0],attributes:Object.entries(r).map(([n,o])=>({label:n,values:Array.isArray(o)?o.map(String):[String(o??"")]})),highlights:Be(e.key_differences),specialCases:Be(e.special_considerations),recommendedText:e.recommended_choice,productActions:Object.fromEntries(t.map(n=>[n.sku,{title:n.name,type:"launchSingleProduct",payload:{sku:n.sku,product:n}}]))}}}}}}function Sr(e=[]){return{widget:"chat",panelHint:"inline",spec:{root:"root",elements:{root:{type:"ActionButtons",props:{buttons:(Array.isArray(e)?e:[]).map(t=>{const r=t.label||t.title||t.shortName||"",n=t.action||t.requestDetails||t.request_details;return!r||!n?.type?null:{label:r,action:{title:r,type:n.type,...n.payload!==void 0?{payload:n.payload}:{}}}}).filter(t=>!!t)}}}}}}function kr(e){return Object.freeze([...e])}var ve=new Set(["and","are","for","from","the","with"]),Ar={token:.26,keyword:.22,category:.18,facet:.16,color:.08,attribute:.06,price:.08,retrieval:.08},_r=["amber","beige","black","blue","blush","bronze","brown","cream","gold","green","grey","ivory","lilac","mixed","orange","pastel","pink","purple","red","silver","white","yellow"];function T(e){return String(e??"").normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),"").toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").replace(/\s+/gu," ").trim()}function A(e,t=ve){const r=t instanceof Set?t:new Set([...ve,...t]),n=new Set,o=[];for(const i of T(e).split(/\s+/u))i.length<3||r.has(i)||n.has(i)||(n.add(i),o.push(i));return o}function v(e,t={}){if(Pr(e))return e;const r=t.facetKeys,n=S(e.category_names??e.category),o=S(e.category_ids),i=Ir(e.facet_hits),a=Object.entries(i).filter(([g])=>!r||r.some(h=>T(h)===T(g))).map(([,g])=>g),c=x(e.name,e.title),f=x(e.brand),m=t.sourceKeywords??[],d=[c,f,...n,...a,...S(e.promotions),x(e.description),...m].join(" "),s=A(d,t.stopWords),u=x(t.sourceProductType,Or(n,c,s),s[0]),l=P([...Cr(d,_r),...Object.entries(i).filter(([g])=>/colou?r/iu.test(g)).flatMap(([,g])=>A(g,t.stopWords))]),p=P([...a.flatMap(g=>A(g,t.stopWords)),...S(e.promotions).flatMap(g=>A(g,t.stopWords))]).slice(0,24);return{sku:x(e.sku),title:c,brand:f,productType:u,categoryNames:n,categoryIds:o,facets:i,keywords:P([...m.flatMap(g=>A(g,t.stopWords)),...s]).slice(0,12),tokens:s,colors:l,attributes:p,price:jr(e)}}function Er(e,t={}){const r=x(e.product_type,e.productType),n=x(e.title,r,S(e.keywords).join(" ")),o=P([...S(e.keywords),...S(e.colors),...S(e.materials),...S(e.styles),...S(e.attributes)]);return v({sku:"__photo__",name:n,category_names:r?[r]:[],facet_hits:{colors:S(e.colors).join(", "),materials:S(e.materials).join(", "),styles:S(e.styles).join(", "),attributes:S(e.attributes).join(", ")},promotions:o},{...t,sourceProductType:r,sourceKeywords:o})}function xr(e,t={}){const r=v(e,t);return P([...t.sourceQueries??[],q([r.productType,...r.colors.slice(0,1),...r.attributes.slice(0,2)]),q([r.productType,...r.keywords.slice(0,3)]),q([r.categoryNames[r.categoryNames.length-1],...r.keywords.slice(0,2)]),q(r.title.split(/\s+/u).slice(0,6)),r.productType].map(n=>n.trim()).filter(Boolean)).slice(0,t.queryLimit??6)}function Ne(e,t,r={}){const n={...Ar,...r.weights},o=v(t,r),i=[],a=R(e.tokens,o.tokens),c=R(e.keywords,o.tokens),f=Rr(e.categoryNames,o.categoryNames)||R(De(e.categoryNames),De(o.categoryNames)),m=R(e.attributes,o.attributes),d=R(e.colors,o.colors),s=R(e.attributes,o.tokens),u=Mr(e.price,o.price),l=Ur(o.sku,r.hitCounts)>0?1:0,p=Br(e,o),g=a*n.token+c*n.keyword+f*n.category+m*n.facet+d*n.color+s*n.attribute+u*n.price+l*n.retrieval,h=vr(p?g:g*.35);return p&&e.productType&&e.productType===o.productType&&i.push("same product type"),f>.4&&i.push("similar category"),m>.2&&i.push("matching product attributes"),d>0&&i.push("matching colour"),u>.8&&i.push("similar price"),p||i.push("weaker product-type match"),{score:Number(h.toFixed(4)),reasons:i}}function Tr(e,t,r={}){const n=v(e,r),o=new Set([n.sku,...r.ignoreSkus??[]].filter(Boolean));return t.filter(i=>{const a=x(i.sku);return a&&!o.has(a)}).map(i=>{const a=Ne(n,i,r);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(r.limit??12,100)))}function Pr(e){return!!(e&&typeof e=="object"&&Array.isArray(e.tokens))}function x(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function S(e){return Array.isArray(e)?e.map(t=>x(t)).filter(Boolean):typeof e=="string"&&e.trim()?e.split(/[,;/|]+/u).map(t=>t.trim()).filter(Boolean):[]}function Ir(e){return!e||typeof e!="object"||Array.isArray(e)?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t,x(r)]).filter(([,t])=>t))}function jr(e){const t=Number(e.price_discounted);if(Number.isFinite(t)&&t>0)return t;const r=Number(e.price);return Number.isFinite(r)&&r>0?r:0}function P(e){const t=new Set,r=[];for(const n of e){const o=T(n);!o||t.has(o)||(t.add(o),r.push(o))}return r}function Cr(e,t){const r=` ${T(e)} `;return t.filter(n=>r.includes(` ${T(n)} `))}function Or(e,t,r){const n=T(e[e.length-1]??e[0]??"");if(n){const o=A(n),i=new Set(A(t));return o.find(a=>i.has(a))??o[0]??n}return r[0]??""}function q(e){return e.map(t=>T(t)).filter(Boolean).join(" ").replace(/\s+/gu," ").trim().slice(0,120)}function De(e){return e.flatMap(t=>A(t))}function R(e,t){const r=P(e),n=new Set(P(t));return r.length===0||n.size===0?0:r.filter(o=>n.has(o)).length/r.length}function Rr(e,t){const r=P(e),n=new Set(P(t));return r.length===0||n.size===0?0:r.filter(o=>n.has(o)).length/r.length}function Mr(e,t){return e<=0||t<=0?0:Math.min(e,t)/Math.max(e,t)}function Ur(e,t){return!e||!t?0:typeof t.get=="function"?t.get(e)??0:t[e]??0}function Br(e,t){if(!e.productType||!t.productType||e.productType===t.productType)return!0;const r=new Set(A(e.productType)),n=new Set([...A(t.productType),...t.tokens]);return[...r].some(o=>n.has(o))}function vr(e){return Math.max(0,Math.min(1,e))}function Nr(e){const t=(e?.chat||e?._chat)?.root||e?._chat?.root;return t?t.getRootNode?.()?.host||t:Array.from(document.querySelectorAll("*")).find(r=>r.shadowRoot?.querySelector?.(".gengage-chat-root, .gengage-chat-launcher-container"))}function Dr(e,t){const r=Nr(e);r?.style&&(t?r.style.removeProperty("display"):r.style.setProperty("display","none","important")),t||(e?.chat||e?._chat)?.close?.()}var Lr="nd_be_url";function $r(e,t){const r=Fr()||e.beUrl||t;if(!r)throw new Error("resolveBeUrl: backend URL is required. The injector must supply a fallback URL; the SDK has no default.");return r}function Fr(){try{const e=new URLSearchParams(window.location.search).get(Lr)?.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}}function qr(e,t,r={}){return`${e}:${r.version||"v2"}:${K(t)}`}function Kr(e,t={}){return Le(e).map(r=>$e(typeof r=="string"?r:r.sku,t.locale)).filter(Boolean).filter((r,n,o)=>o.indexOf(r)===n).sort((r,n)=>ee(r,n,t.locale)).slice(0,t.limit||16).join(",")}function zr(e,t={}){return K(Le(e).map(r=>Gr(r,t)).filter(r=>!!r).sort((r,n)=>ee(String(r.sku||r.name||""),String(n.sku||n.name||""),t.locale)).slice(0,t.limit||16))}function Jr(e,t){return j(e,t)}function K(e){let t=2166136261;const r=Hr(e);for(let n=0;n<r.length;n+=1)t^=r.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(36)}function Gr(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;const r=e,n=t.mapProduct?.(r);if(n)return N(n);const o=Z(r);return o&&typeof o=="object"&&!Array.isArray(o)?N(Wr(o,t)):null}function Le(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"||!!(t&&typeof t=="object"&&!Array.isArray(t))):[]}function Hr(e){return JSON.stringify(N(e))}function N(e){return Array.isArray(e)?e.map(N):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,N(r)]))}function Wr(e,t){return{sku:$e(e.sku,t.locale),name:j(e.name,t.locale),url:j(e.url,t.locale),price:e.price,currency:j(e.currency,t.locale),category:j(e.category,t.locale),category_names:Vr(e.category_names,t.locale,16),image:j(e.image,t.locale),in_stock:e.in_stock,rating:e.rating,review_count:e.review_count}}function $e(e,t){return j(e,t).toUpperCase()}function j(e,t){return typeof e=="string"?e.trim().replace(/\s+/gu," ").toLocaleLowerCase(t||void 0):""}function ee(e,t,r){return e.localeCompare(t,r,{numeric:!0})}function Vr(e,t,r){return Array.isArray(e)?e.map(n=>j(n,t)).filter(Boolean).sort((n,o)=>ee(n,o,t)).slice(0,r):void 0}var Yr="entries",Qr=1,Xr={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."},Fe=new Map;function te(){return Date.now()}function re(e){return e?.expiresAt!=null&&e.expiresAt<=te()}function ne(e,t){return{value:e,createdAt:te(),expiresAt:t?te()+t:null}}function Zr(e,t,r){try{const n=e.getItem(`${t}${r}`);if(!n)return null;const o=JSON.parse(n);return re(o)?(e.removeItem(`${t}${r}`),null):o.value}catch{return null}}function en(e,t,r,n,o){try{return e.setItem(`${t}${r}`,JSON.stringify(ne(n,o))),!0}catch{return!1}}function tn(e,t,r){try{e.removeItem(`${t}${r}`)}catch{}}function qe(e){try{return window[e]}catch{return null}}function Ke(e,t){return e?{get:r=>Zr(e,t,r),set:(r,n,o={})=>en(e,t,r,n,o.ttlMs),remove:r=>tn(e,t,r)}:{get:()=>null,set:()=>!1,remove:()=>{}}}function rn(e,t){const r=t.dbName||`gengage-${e}`,n=t.dbStore||Yr,o=t.dbVersion||Qr,i=new Map;let a=null;const c=()=>"indexedDB"in window?a||(a=new Promise(s=>{const u=indexedDB.open(r,o);u.onupgradeneeded=()=>{u.result.createObjectStore(n,{keyPath:"key"})},u.onsuccess=()=>s(u.result),u.onerror=()=>s(null),u.onblocked=()=>s(null)}),a):Promise.resolve(null);return{volatileEntries:i,idbGet:async s=>{const u=await c();return u?new Promise(l=>{const p=u.transaction(n,"readwrite").objectStore(n),g=p.get(s);g.onsuccess=()=>{const h=g.result;if(!h||re(h)){h&&p.delete(s),l(null);return}l(h.value)},g.onerror=()=>l(null)}):null},idbSet:async(s,u,l={})=>{const p=await c();return p?new Promise(g=>{const h=p.transaction(n,"readwrite");h.oncomplete=()=>g(!0),h.onerror=()=>g(!1),h.objectStore(n).put({key:s,...ne(u,l.ttlMs)})}):!1},idbRemove:async s=>{const u=await c();u&&u.transaction(n,"readwrite").objectStore(n).delete(s)}}}function nn(e,t={}){const r=window,n=r.gengage||(r.gengage={}),o=n.memory||(n.memory={}),i=o[e];if(i)return i;const a=Fe.get(e)||rn(e,t);Fe.set(e,a);const c=t.sessionPrefix||`gengage:${e}:session:`,f=t.localPrefix||`gengage:${e}:local:`,d={get:l=>{const p=a.volatileEntries.get(l);return p?re(p)?(a.volatileEntries.delete(l),null):p.value:null},set:(l,p,g={})=>(a.volatileEntries.set(l,ne(p,g.ttlMs)),!0),remove:l=>{a.volatileEntries.delete(l)},clear:()=>a.volatileEntries.clear()},s={get:a.idbGet,set:a.idbSet,remove:a.idbRemove},u={accountId:e,volatile:d,session:Ke(qe("sessionStorage"),c),local:Ke(qe("localStorage"),f),indexedDb:s,stableKey:K,policy:{...Xr,...t.policy||{}}};o[e]=u;for(const l of t.aliases||[])o[l]=u;return u}var on=["addToCart","search","searchKeyword","facetedSearch","searchGiftOptions","similaritySearch"];function an(e,t,r={}){const n=window,o=n.gengage||(n.gengage={}),i=o.tools||(o.tools={});i[e]=t;for(const a of r.accountAliases||[])i[a]=t;if(r.exposeStandardAliases!==!1)for(const a of r.standardAliases||on){const c=t[a];typeof c=="function"&&(i[a]=i[a]||c)}return t}function cn({getPageType:e,getProduct:t}){return()=>({url:window.location.href,title:document.title,pageType:e(),product:t()})}function sn({accountId:e,getPageType:t,getProduct:r,getToolNames:n,getSearchCapabilities:o,getMemory:i}){return async()=>({accountId:e,url:window.location.href,pageType:t(),productSku:r()?.sku??null,toolNames:n(),...o?{searchCapabilities:o()}:{},...i?{memoryPolicy:i().policy}:{},timestamp:new Date().toISOString()})}function un({accountId:e,runtimeFile:t="runtime.js",startExport:r="start",globalBaseUrlKey:n,errorLabel:o}={}){if(!e)throw new Error("accountId is required.");const i=o||e,a=window,c=()=>{const s=a.GengageInjectorConfig||{},u=s[e]||{};return{...s,...u}},f=()=>{const s=c();if(s.runtimeUrl)return s.runtimeUrl;const u=s.assetBaseUrl||s.baseUrl||document.currentScript?.getAttribute("src")||(n?a[n]:null);if(!u)throw new Error(`${i} runtime URL cannot be resolved.`);return new URL(t,u).href},m=a.GengageAssistantInjector||(a.GengageAssistantInjector={}),d=m[e]||(m[e]={});return d.loaderPromise||(d.loaderPromise=import(f()).then(s=>{const u=s[r];if(typeof u!="function")throw new Error(`${i} runtime export ${r} is unavailable.`);return u()}).catch(s=>{throw delete d.loaderPromise,console.error(`[Gengage][${e}] runtime load failed`,s),s})),d.loaderPromise}function ln(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}const r=e?.action;return r&&typeof r.payload=="string"?r.payload:r&&typeof r.title=="string"?r.title:""}y.AgentError=D,y.ContextStore=ue,y.action=vt,y.actionButtonsUiSpec=Sr,y.beErrorToAgentError=z,y.buildPhotoSimilarityProfile=Er,y.buildProductSimilarityProfile=v,y.buildSimilarityQueries=xr,y.canUseModuleWorker=X,y.caughtToStreamError=ge,y.comparisonUiSpec=br,y.createBrowserMemory=nn,y.createDiagnosticsTool=sn,y.createFlow=kr,y.createInjectorAdapter=Te,y.createMainThreadInjectorAdapter=Pe,y.createModuleWorker=Me,y.createReadPageTool=cn,y.done=H,y.elapsedMs=C,y.error=Ae,y.httpErrorToAgentError=pe,y.installBrowserTools=an,y.installFetchTransportBridge=cr,y.llmCacheKey=qr,y.metadata=Ut,y.mountAccount=pr,y.normalizeProduct=F,y.normalizeSimilarityText=T,y.nowIso=ae,y.productDetailsUiSpec=wr,y.productFactsKey=zr,y.productSkuKey=Kr,y.productsUiSpec=hr,y.rankSimilarProducts=Tr,y.requestText=ln,y.resolveBeUrl=$r,y.resolveFlow=_e,y.scoreSimilarityCandidate=Ne,y.setAssistantHostVisible=Dr,y.stableKey=K,y.startLazyRuntimeLoader=un,y.textChunk=ke,y.textKey=Jr,y.tokenizeSimilarityText=A,y.trimProductFactsCore=Z,y.trimProductFactsListCore=gr,y.uiSpec=Bt})(this.Gengage=this.Gengage||{});
@@ -1,4 +1,4 @@
1
- import { i as U } from "./widget-base-Bux39ZWf.js";
1
+ import { i as U } from "./widget-base-BolzGV28.js";
2
2
  var z = ({ element: e, renderElement: t }) => {
3
3
  if (!e.children || e.children.length === 0) return null;
4
4
  const r = document.createElement("div");
@@ -1,4 +1,4 @@
1
- import { a as i, c as o, l as p, n as t, o as a, r as n, s as l, t as s, u as e } from "./schemas-CLo8wCjs.js";
1
+ import { a as i, c as o, l as p, n as t, o as a, r as n, s as l, t as s, u as e } from "./schemas-Cq2blsO_.js";
2
2
  var h = a({
3
3
  role: s(["user", "assistant"]),
4
4
  content: o(),
@@ -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-CDjc7MP2.js";
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-DclobJaN.js";
2
2
  export {
3
3
  s as CHAT_SCROLL_ELEMENT_ID,
4
4
  r as ChatPresentationState,