@gengage/assistant-fe 0.6.16 → 0.6.18

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 (56) hide show
  1. package/dist/{request-text-DThlE-Xd.js → account-config-gj7_mF6Q.js} +725 -312
  2. package/dist/agentic/events/comparison.d.ts +6 -0
  3. package/dist/agentic/events/context-products.d.ts +6 -0
  4. package/dist/agentic/index.d.ts +8 -0
  5. package/dist/agentic/index.js +251 -168
  6. package/dist/agentic/recipes/catalog-assistant-flow.d.ts +50 -0
  7. package/dist/agentic/recipes/input-text/actions.d.ts +15 -0
  8. package/dist/agentic/recipes/input-text/index.d.ts +4 -0
  9. package/dist/agentic/recipes/input-text/products.d.ts +4 -0
  10. package/dist/agentic/recipes/input-text/ranking.d.ts +14 -0
  11. package/dist/agentic/recipes/input-text/steps.d.ts +31 -0
  12. package/dist/agentic/util/account-config.d.ts +8 -0
  13. package/dist/agentic/util/privacy.d.ts +12 -0
  14. package/dist/agentic/widgets/endpoints.d.ts +12 -0
  15. package/dist/agentic/worker.d.ts +8 -0
  16. package/dist/agentic/worker.js +415 -106
  17. package/dist/agentic.iife.js +7 -5
  18. package/dist/{api-paths-C7Y4wTde.js → api-paths-CEDR4rld.js} +1 -1
  19. package/dist/chat/components/InlineLauncher.d.ts +15 -0
  20. package/dist/chat/index.d.ts +1 -1
  21. package/dist/chat-runtime.js +1 -1
  22. package/dist/{chat-BP-yXukW.js → chat-rvSffJXw.js} +1 -1
  23. package/dist/chat.iife.js +15 -12
  24. package/dist/chat.js +2 -2
  25. package/dist/{common-BR9JIIjb.js → common-BBgWfT-W.js} +3 -3
  26. package/dist/common.js +8 -8
  27. package/dist/{connection-warning-DyeP1AB2.js → connection-warning-B-doodzu.js} +1 -1
  28. package/dist/{fastIntent-C8jh7D1D.js → fastIntent-CloHPZQh.js} +2 -2
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.js +13 -13
  31. package/dist/{native-webview-U9HtGabb.js → native-webview-NWc9LrJh.js} +1 -1
  32. package/dist/native.iife.js +13 -10
  33. package/dist/native.js +1 -1
  34. package/dist/{overlay-ClYgI2Kl.js → overlay-COzFFq0-.js} +1 -1
  35. package/dist/overlay.js +2 -2
  36. package/dist/{qna-B3lMzHvS.js → qna-DUs97irI.js} +1 -1
  37. package/dist/qna-runtime.js +1 -1
  38. package/dist/qna.iife.js +1 -1
  39. package/dist/qna.js +2 -2
  40. package/dist/{runtime-LY1J9JFl.js → runtime-BGCNkU1H.js} +6 -6
  41. package/dist/{runtime-Bt2VV3L3.js → runtime-CbWCU424.js} +1082 -1042
  42. package/dist/{runtime-rjNaPWIi.js → runtime-Ctqq0V6G.js} +8 -8
  43. package/dist/{simbut-DV4oPMpH.js → simbut-Dh4cJysK.js} +3 -3
  44. package/dist/simbut.iife.js +1 -1
  45. package/dist/simbut.js +1 -1
  46. package/dist/{simrel-DaAhtabq.js → simrel-B-sjHbL5.js} +4 -4
  47. package/dist/simrel-runtime.js +1 -1
  48. package/dist/simrel.iife.js +2 -2
  49. package/dist/simrel.js +2 -2
  50. package/dist/{widget-base-DRaUfd-H.js → widget-base-CIJT5AiP.js} +2 -2
  51. package/package.json +1 -1
  52. /package/dist/{context-BBuSsXZ9.js → context-heG8hv5l.js} +0 -0
  53. /package/dist/{locale-CfqNifrU.js → locale-uQ5XZ2yS.js} +0 -0
  54. /package/dist/{price-formatter-CFsWT0lP.js → price-formatter-CHUmYq8I.js} +0 -0
  55. /package/dist/{request-response-cache-zsgz3Awp.js → request-response-cache-BxRsKGJ0.js} +0 -0
  56. /package/dist/{schemas-Cq2blsO_.js → schemas-BnYUhYSy.js} +0 -0
@@ -1,5 +1,7 @@
1
- (function(p){Object.defineProperty(p,Symbol.toStringTag,{value:"Module"});function Qe(e){return!!e&&typeof e=="object"&&e.type==="rpc.req"}function Xe({worker:e,tools:t={},beacon:r,memory:n=sessionStorage}){e.addEventListener("message",o=>{const i=o.data;Qe(i)&&Ze(e,i,{tools:t,beacon:r,memory:n})})}async function Ze(e,t,r){try{const n=await ce(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 et(e){if(e&&typeof e=="object"&&typeof e.name=="string")return e;throw new Error("tool.invoke requires { name, input }")}function tt(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.get requires { key }")}function rt(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.set requires { key }")}async function ce(e,t,{tools:r,beacon:n,memory:o}){if(e==="tool.invoke"){const{name:i,input:a}=et(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}=tt(t),a=o.getItem(String(i));return a?JSON.parse(a):null}if(e==="memory.set"){const{key:i,value:a}=rt(t);return o.setItem(String(i),JSON.stringify(a??null)),{ok:!0}}throw new Error(`Unknown RPC method: ${e}`)}function se(){return new Date().toISOString()}function j(e){return Math.max(0,Math.round(performance.now()-e))}function U(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function nt(e){const{accountId:t,locale:r="en-GB",parentUrl:n="",threadId:o,incomingContext:i}=e,a=U(i)?i:{},c=U(a.thread)?a.thread:{},y=U(a.panel)?a.panel:{},f=U(a.meta)?a.meta:{},d=ue(a.messages),s={id:String(o||c.id||self.crypto.randomUUID()),started_at:String(c.started_at||se()),extensions:U(c.extensions)?{...c.extensions}:{}},u=String(f.locale||r),l=String(f.parentUrl||n||typeof self<"u"&&self.location?.href||"");return{panel:{...y},messages:d,thread:s,meta:{locale:u,parentUrl:l,accountId:t}}}function ot(e,t){const r=ue([t])[0];return r?{...e,messages:[...e.messages,r].slice(-50)}:e}function ue(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 it="gengage:agent:context:";async function at({accountId:e,threadId:t,rpc:r}){const n=await r("memory.get",{tier:"session",key:le(e,t)});return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}async function ct({accountId:e,threadId:t,extensions:r,panel:n,rpc:o}){await o("memory.set",{tier:"session",key:le(e,t),value:{thread:{extensions:r},...n&&Object.keys(n).length>0?{panel:n}:{}}})}function le(e,t){return`${it}${e}:${t}`}function b(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var de=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 at({accountId:this.#t,threadId:r,rpc:this.#r}),i=nt({accountId:this.#t,locale:e?.locale||this.#n,parentUrl:this.#o,threadId:r,incomingContext:ut(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=fe(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=ot(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 ct({accountId:this.#t,threadId:t,extensions:r.thread.extensions,panel:st(r.panel,this.#i),rpc:this.#r}),r):null}};function st(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 ut(e,t){return!b(e)&&!b(t)?{}:fe(b(e)?e:{},b(t)?t:{})}function fe(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:{},y=b(a.extensions)?a.extensions:{},f=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:{...y,...f}},meta:{...d,...s},messages:Array.isArray(n.messages)?n.messages.slice(-50):e.messages??[]}}function ye(e){const t=String.fromCharCode(...e);return btoa(t).replace(/\+/gu,"-").replace(/\//gu,"_").replace(/=+$/u,"")}function me(e){return ye(new TextEncoder().encode(JSON.stringify(e)))}async function lt({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=`${me({alg:"HS256",typ:"JWT"})}.${me({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}.${ye(new Uint8Array(a))}`}function J({accountId:e,devJwtSecret:t,tokenBrokerUrl:r,tokenBrokerAudience:n,refreshSkewS:o=30,fetchImpl:i=fetch}){let a=null;return async({signal:c,parentUrl:y}={})=>{if(t)return lt({accountId:e,devJwtSecret:t});if(!r)throw new Error("tokenBrokerUrl is required for production agent mode.");const f=Math.floor(Date.now()/1e3);return a?.token&&a.expiresAtS-o>f||(a=await dt({accountId:e,tokenBrokerUrl:r,tokenBrokerAudience:n,parentUrl:y,signal:c,fetchImpl:i})),a.token}}async function dt({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(),y=c?.token||c?.jwt||c?.access_token;if(!y||typeof y!="string")throw new Error("Token broker response did not include a JWT.");return{token:y,expiresAtS:ft(c)||yt(y)||Math.floor(Date.now()/1e3)+300}}function ft(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 yt(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 pe={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."}},L=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=pe[t]||pe.upstream_llm;return new L(r.code,r.message,{source:"be",sourceCode:t,detail:e?.detail})}function ge(e,t){const r=t?.error&&typeof t.error=="object"?t.error:{};return z({code:String(r.code||mt(e)),detail:r.detail})}function he(e){return e instanceof L?{type:"error",code:e.code,message:e.message}:{type:"error",code:"agent_invoke_failed",message:"The assistant could not complete that request."}}function mt(e){return e===401?"unauthorized":e===403?"forbidden":e===413?"payload_too_large":e===429?"rate_limited":"internal"}var pt=7200*1e3,we=200,gt=5*1024*1024,ht="gengage_request_response_cache",wt=1,_="responses",bt=new Set(["addToCart","like"]),E=new Map,be=null;async function St(e,t={},r={}){const n=kt(e,t);if(!n)return fetch(e,t);const o=Date.now(),i=await _t(n,o);if(i)return Tt(i);const a=await fetch(e,t);return a.ok&&Et(n,a.clone(),o,{ttlMs:r.ttlMs??pt,maxEntries:r.maxEntries??we,maxBodyBytes:r.maxBodyBytes??gt}),a}function kt(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"||At(t.body)?null:`rr:${Ut(Rt({url:String(e),method:r,headers:Pt(t.headers),body:t.body}))}`}function At(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"&&bt.has(r)}catch{return!1}}async function _t(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),H(r),r;const n=await Ct(e);return n?n.expiresAt<=t?(E.delete(e),jt(e),null):(n.lastAccessedAt=t,E.set(e,n),H(n),Se(we),n):null}async function Et(e,t,r,n){try{const o=await t.text();if(Mt(o)>n.maxBodyBytes||xt(o))return;const i={key:e,status:t.status,statusText:t.statusText,headers:It(t.headers),body:o,createdAt:r,expiresAt:r+n.ttlMs,lastAccessedAt:r};E.set(e,i),Se(n.maxEntries),await H(i),await Ot(n.maxEntries,r)}catch{}}function xt(e){return/"_error"\s*:/u.test(e)||/"type"\s*:\s*"error"/u.test(e)}function Tt(e){return new Response(e.body,{status:e.status,statusText:e.statusText,headers:new Headers(e.headers)})}function Pt(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 It(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 Se(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 $(){return typeof indexedDB>"u"?null:(be??=new Promise(e=>{const t=indexedDB.open(ht,wt);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)}),be)}async function Ct(e){const t=await $();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 H(e){const t=await $();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 jt(e){const t=await $();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 Ot(e,t){const r=await $();r&&await new Promise(n=>{const o=r.transaction(_,"readwrite"),i=o.objectStore(_),a=[],c=i.openCursor();c.onsuccess=()=>{const y=c.result;if(!y){const f=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-f.length-e));for(const s of[...f,...d])i.delete(s.key);return}a.push(y.value),y.continue()},c.onerror=()=>n(),o.oncomplete=()=>n(),o.onerror=()=>n(),o.onabort=()=>n()})}function Rt(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 Ut(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 Mt(e){return typeof TextEncoder<"u"?new TextEncoder().encode(e).byteLength:e.length}async function Bt({beUrl:e,accountId:t,devJwtSecret:r,tokenBrokerUrl:n,tokenBrokerAudience:o,jwtProvider:i,parentUrl:a,op:c,input:y,cacheTtlS:f,cacheKey:d,browserCache:s,signal:u}){const l=await(i||J({accountId:t,devJwtSecret:r,tokenBrokerUrl:n,tokenBrokerAudience:o}))({...u?{signal:u}:{},...a?{parentUrl:a}:{}}),{opDomain:m,opName:g}=vt(c,t),h={method:"POST",headers:{authorization:`Bearer ${l}`,"content-type":"application/json",accept:"application/x-ndjson"},body:JSON.stringify({op_domain:m,op_name:g,op_payload:y,...f!==void 0?{cache_ttl_s:f}:{},...d!==void 0?{cache_key:d}:{}}),...u?{signal:u}:{}},k=`${String(e).replace(/\/+$/u,"")}/v1/execute`,w=s===!1?await fetch(k,h):await St(k,h,typeof s=="object"?s:{});if(!w.ok)throw ge(w.status,await Dt(w));return Lt(w)}function vt(e,t){if(!e||e.startsWith("-")||e.endsWith("-"))throw new Error(`Invalid BE op name: ${e}`);return{opDomain:Nt(t),opName:e}}function Nt(e){return e.replace(/-agentic$/u,"")}async function Dt(e){try{return await e.json()}catch{return{error:{code:e.statusText||"internal"}}}}async function Lt(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 y=n.indexOf(`
2
- `);for(;y>=0;){const f=n.slice(0,y).trim();n=n.slice(y+1),f&&ke(JSON.parse(f),o),y=n.indexOf(`
3
- `)}}const i=n.trim();return i&&ke(JSON.parse(i),o),o}function ke(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 L("op_failed",`BE streamed duplicate field "${r}".`,{source:"be",sourceCode:"schema_mismatch"});t[r]=n}}function $t(e={}){return{type:"metadata",...e}}function Ae(e,t=!1,r={}){return{type:"text_chunk",content:e,final:t,...r}}function Ft(e){return{type:"ui_spec",...e}}function qt(e){return{type:"action",action:e}}function _e(e,t){return{type:"error",code:e,message:t}}function W(){return{type:"done"}}function Ee(e,t){return e[t?.type||t?.action?.type||"inputText"]||e.inputText}async function Kt({request:e,accountModule:t,contextStore:r,beClient:n,toolBridge:o,emit:i,rpc:a,signal:c}){const y=performance.now(),f=await r.load(e),d=f.thread.id,s=rr(e);r.appendUserMessage(d,s);const u=Ee(t.flows,e);if(!u)return i(_e("unknown_action",`No agent flow for request type ${e?.type||"inputText"}`)),i(W()),{steps:0,productSkusEmitted:[]};const l={request:e,context:r.patch(d,{})||f,bag:{},accountConfig:t.accountConfig||{},threadId:d,steps:0,productSkusEmitted:new Set,committed:!1},m={contextStore:r,beClient:n,toolBridge:o,emit:i,rpc:a,adapters:t.adapters||{},...c?{signal:c}:{}};return await M(u,l,m),l.committed||await V(l,m),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:j(y),productSkusEmitted:[...l.productSkusEmitted]}),{steps:l.steps,productSkusEmitted:[...l.productSkusEmitted]}}async function M(e,t,r){for(const n of e){if(r.signal?.aborted)return;t.steps+=1,await Jt(n,t,r),t.context=r.contextStore.patch(t.threadId,{})||t.context}}async function Jt(e,t,r){const n=Q(t);if(e.kind==="be_op"){await zt(e,t,r,n);return}if(e.kind==="tool"){await Ht(e,t,r,n);return}if(e.kind==="adapter"){await Gt(e,t,r,n);return}if(e.kind==="emit"){Wt(e,t,r);return}if(e.kind==="branch"){await Vt(e,t,r,n);return}if(e.kind==="parallel"){await Yt(e,t,r);return}if(e.kind==="refusal"){await Qt(e,t,r,n);return}e.kind==="commit"&&await Xt(e,t,r)}async function zt(e,t,r,n){const o=performance.now();let i;const a=I(e.cacheTtlS,n),c=I(e.cacheKey,n),y=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}:{},...y!==void 0?{browserCache:y}:{},...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:j(o),errorCode:u};if(await r.rpc("beacon.send",l),e.onError){e.errorOut&&(t.bag[e.errorOut]=d),await M(e.onError,t,r);return}throw d}e.out&&(t.bag[e.out]=i),Y(e,i,t,r.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:j(o)};await r.rpc("beacon.send",f)}async function Ht(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),Y(e,i,t,r.contextStore),await r.rpc("beacon.send",{type:"agentTool",threadId:t.threadId,sessionId:xe(t),accountId:t.context.meta.accountId,tool:e.name,status:"ok",latencyMs:j(o)})}catch(i){const a=i;if(await r.rpc("beacon.send",{type:"agentTool",threadId:t.threadId,sessionId:xe(t),accountId:t.context.meta.accountId,tool:e.name,status:"error",latencyMs:j(o),errorCode:String(a?.code||a?.name||"unknown")}),e.onError){e.errorOut&&(t.bag[e.errorOut]=i),await M(e.onError,t,r);return}throw i}}async function Gt(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),Y(e,i,t,r.contextStore)}function Wt(e,t,r){const n=e.build(Q(t));nr(n,t.productSkusEmitted),r.emit(n)}async function Vt(e,t,r,n){const o=String(I(e.on,n)||"default");await M(e.cases[o]||e.cases.default||[],t,r)}async function Yt(e,t,r){const n=e.steps.map(a=>{const c={...t,context:Zt(t.context),bag:{...t.bag},productSkusEmitted:t.productSkusEmitted,committed:!1};return M(a,c,{...r,contextStore:er(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=Te(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=Te(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 Qt(e,t,r,n){r.emit(Ae(I(e.message,n),!0)),await V(t,r)}async function Xt(e,t,r){await V(t,r)}async function V(e,{contextStore:t,emit:r}){e.committed||(e.context=await t.commit(e.threadId)||e.context,e.committed=!0,r(W()))}function Y(e,t,r,n){if(typeof e.patch!="function")return;const o=e.patch(r.context,t,Q(r));o&&(r.context=n.patch(r.threadId,o)||r.context)}function Q(e){return{request:e.request,context:e.context,bag:e.bag,accountConfig:e.accountConfig}}function xe(e){return e.request?.session_id||e.request?.sessionId||e.threadId}function Zt(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function Te(e,t){const r={};for(const n of t)Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}function er(e){return{async load(){return e.context},patch(t,r){return e.context=tr(e.context,r),e.context},appendUserMessage(){return e.context},async commit(){return e.context}}}function tr(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 rr(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 nr(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 y=c.sku;typeof y=="string"&&t.add(y)}}}function or(e){return{invoke(t,r){return e("tool.invoke",{name:t,input:r})}}}var ir=512,ar=.74;function Pe({accountId:e,worker:t,beUrl:r,devJwtSecret:n,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:c={},beacon:y}){let f=1;const d=new Map;return Xe({worker:t,tools:c,beacon:s=>y?.({...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 m=d.get(l);if(m){if(u.type==="event"&&u.event){X(m,u.event);return}if(u.type==="error"){m.onError(new Error(u.message||"Agent worker failed")),d.delete(l);return}u.type==="end"&&d.delete(l)}}),(s,u,l,m)=>{const g=f++;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}),m){Ce(s,m).then(k).catch(w=>{d.delete(g),u.onError(w instanceof Error?w:new Error("Failed to read image attachment"))});return}k(s)}}function Ie({accountId:e,accountModule:t,beUrl:r,devJwtSecret:n,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:c={},beacon:y}){let f=null;const d=cr({accountId:e,tools:c,beacon:y}),s=or(d),u=J({accountId:e,...n?{devJwtSecret:n}:{},...o?{tokenBrokerUrl:o}:{},...i?{tokenBrokerAudience:i}:{}});return async(l,m,g,h)=>{const k=await Ce(l||{},h);f||=new de({accountId:e,locale:k?.locale||a,parentUrl:window.location.href,rpc:d,persistentPanelKeys:t.contextPersistence?.panelKeys});try{await Kt({request:k,accountModule:{...t,accountId:e},contextStore:f,beClient:{invoke({op:w,input:ae,signal:Ye,cacheTtlS:Cn,cacheKey:jn,browserCache:On}){return Bt({beUrl:r,accountId:e,jwtProvider:u,parentUrl:window.location.href,op:w,input:ae,cacheTtlS:Cn,cacheKey:jn,browserCache:On,...Ye?{signal:Ye}:{}})}},toolBridge:s,emit:w=>X(m,w),rpc:d,signal:g})}catch(w){g?.aborted||(X(m,he(w)),m.onDone())}}}function cr({accountId:e,tools:t,beacon:r}){const n=o=>r?.({...o,accountId:o.accountId||e});return((o,i)=>ce(o,i,{tools:t,beacon:n,memory:sessionStorage}))}async function Ce(e,t){if(!t||!t.type?.startsWith("image/"))return e;const r=await lr(t),n={...sr(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 sr(e){return ur(e)?{...e}:typeof e=="string"?{text:e}:{}}function ur(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function lr(e){const t=await dr(e);return t||{dataUrl:await je(e),mime:e.type}}async function dr(e){if(typeof createImageBitmap!="function"||typeof document>"u")return null;let t=null;try{t=await createImageBitmap(e);const r=Math.min(1,ir/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(y=>i.toBlob(y,"image/jpeg",ar));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 X(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(fr(t));break;case"done":e.onDone();break;default:break}}function fr(e){const t=new Error(e.message||e.code||"Agent error");return e.code&&(t.code=e.code),t}function Oe(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function F(e){const t=Oe(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),y=a||c;y>0&&(n.price=String(y));const f=a>0?c:0;f>0&&(n.originalPrice=String(f));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 m=t.category_names;return Array.isArray(m)&&(n.categoryNames=m.map(String)),n}function Z(e){const t=Oe(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 yr(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 Re(e){return Array.isArray(e)?e.map(String).filter(Boolean):typeof e=="string"&&e?[e]:[]}function mr(e,t,r={}){return`${e}:${r.version||"v2"}:${v(t)}`}function pr(e,t={}){return Ue(e).map(r=>Me(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 gr(e,t={}){return v(Ue(e).map(r=>wr(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 hr(e,t){return C(e,t)}function v(e){let t=2166136261;const r=br(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 wr(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(Sr(o,t)):null}function Ue(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"||!!(t&&typeof t=="object"&&!Array.isArray(t))):[]}function br(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 Sr(e,t){return{sku:Me(e.sku,t.locale),name:C(e.name,t.locale),url:C(e.url,t.locale),price:e.price,currency:C(e.currency,t.locale),category:C(e.category,t.locale),category_names:kr(e.category_names,t.locale,16),image:C(e.image,t.locale),in_stock:e.in_stock,rating:e.rating,review_count:e.review_count}}function Me(e,t){return C(e,t).toUpperCase()}function C(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 kr(e,t,r){return Array.isArray(e)?e.map(n=>C(n,t)).filter(Boolean).sort((n,o)=>ee(n,o,t)).slice(0,r):void 0}var Ar="entries",_r=1,Er={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."},Be=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 xr(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 Tr(e,t,r,n,o){try{return e.setItem(`${t}${r}`,JSON.stringify(ne(n,o))),!0}catch{return!1}}function Pr(e,t,r){try{e.removeItem(`${t}${r}`)}catch{}}function ve(e){try{return window[e]}catch{return null}}function Ne(e,t){return e?{get:r=>xr(e,t,r),set:(r,n,o={})=>Tr(e,t,r,n,o.ttlMs),remove:r=>Pr(e,t,r)}:{get:()=>null,set:()=>!1,remove:()=>{}}}function Ir(e,t){const r=t.dbName||`gengage-${e}`,n=t.dbStore||Ar,o=t.dbVersion||_r,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 m=u.transaction(n,"readwrite").objectStore(n),g=m.get(s);g.onsuccess=()=>{const h=g.result;if(!h||re(h)){h&&m.delete(s),l(null);return}l(h.value)},g.onerror=()=>l(null)}):null},idbSet:async(s,u,l={})=>{const m=await c();return m?new Promise(g=>{const h=m.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 oe(e,t={}){const r=window,n=r.gengage||(r.gengage={}),o=n.memory||(n.memory={}),i=o[e];if(i)return i;const a=Be.get(e)||Ir(e,t);Be.set(e,a);const c=t.sessionPrefix||`gengage:${e}:session:`,y=t.localPrefix||`gengage:${e}:local:`,d={get:l=>{const m=a.volatileEntries.get(l);return m?re(m)?(a.volatileEntries.delete(l),null):m.value:null},set:(l,m,g={})=>(a.volatileEntries.set(l,ne(m,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:Ne(ve("sessionStorage"),c),local:Ne(ve("localStorage"),y),indexedDb:s,stableKey:v,policy:{...Er,...t.policy||{}}};o[e]=u;for(const l of t.aliases||[])o[l]=u;return u}var q="__gengageAgentFetchBridge",Cr=1e3*60*60*24*14;function jr({accountId:e,streamTransport:t,endpoints:r={},endpointCache:n}){if(!e)throw new Error("accountId is required.");if(typeof t!="function")throw new Error("streamTransport is required.");const o=Or(),i=`https://gengage-injector.invalid/${encodeURIComponent(e)}`,a=new Set,c=n?Nr({accountId:e,endpointCache:n,fetchImpl:o.originalFetch}):void 0,y=f=>{const d=`${i}/chat/${f}`;a.add(d);const s=r[f],u={streamTransport:t,endpoint:f};s&&(u.endpointHandler=s),c&&(u.endpointCache=c),o.routes.set(d,u)};y("process_action");for(const f of Object.keys(r))f!=="process_action"&&y(f);return{middlewareUrl:i,stop(){for(const f of a)o.routes.delete(f);Rr(o)}}}function Or(){const e=window,t=e[q];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=De(o),c=n.routes.get(a);return c?Mr(c,o,i):r(o,i)},e.fetch=n.installedFetch,e[q]=n,n}function Rr(e){if(e.routes.size>0)return;const t=window;t.fetch===e.installedFetch&&(t.fetch=e.originalFetch),t[q]===e&&delete t[q]}function De(e){return typeof e=="string"?e:e instanceof URL?e.href:e?.url||""}function Le(e,t){if(t?.signal)return t.signal;if(typeof Request<"u"&&e instanceof Request)return e.signal}function $e(e,t){return t?.body!==void 0&&t?.body!==null?t.body:typeof Request<"u"&&e instanceof Request?e.clone().text():null}async function Ur(e,t){const r=$e(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 Mr(e,t,r){if(e.endpoint&&e.endpoint!=="process_action"&&e.endpointHandler){const f=new AbortController,d=Le(t,r);let s=null;if(d){const u=()=>f.abort();d.aborted&&u(),d.addEventListener("abort",u,{once:!0}),s=()=>d.removeEventListener("abort",u)}try{const u=await Br(t,r),l={accountId:vr(t),endpoint:e.endpoint,signal:f.signal},m=Dr(e.endpointCache,e.endpoint,u,l.accountId);if(m){const h=await Lr(e.endpointCache,m,f.signal);if(h)return zr(h)}const g=await e.endpointHandler(u,l);return m&&g.ok&&await $r(e.endpointCache,m,g.clone(),f.signal),g}finally{s?.()}}const n=new TextEncoder,o=new AbortController,i=Le(t,r);let a=!1,c=null;const y=new ReadableStream({async start(f){const d=l=>{a||f.enqueue(n.encode(`${JSON.stringify(l)}
4
- `))},s=()=>{a||(a=!0,c?.(),f.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?.(),f.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:m}=await Ur(t,r),g=e.streamTransport(l,{onTextChunk:(h,k,w={})=>d({type:"text_chunk",content:h,final:k===!0,...w}),onUISpec:(h,k,w,ae)=>d({type:"ui_spec",spec:h,widget:k,...w?{panelHint:w}:{},...ae?{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,m);Vr(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(y,{status:200,headers:{"Content-Type":"application/x-ndjson"}})}async function Br(e,t){const r=await Promise.resolve($e(e,t));return typeof r!="string"||r.trim()===""?{}:JSON.parse(r)}function vr(e){try{const[t]=new URL(De(e)).pathname.split("/").filter(Boolean);return decodeURIComponent(t||"")}catch{return""}}function Nr({accountId:e,endpointCache:t,fetchImpl:r}){return{accountId:e,beUrl:t.beUrl,...t.parentUrl?{parentUrl:t.parentUrl}:{},ttlMs:t.ttlMs??Cr,policies:t.policies,fetchImpl:r,jwtProvider:J({accountId:e,...t.devJwtSecret?{devJwtSecret:t.devJwtSecret}:{},...t.tokenBrokerUrl?{tokenBrokerUrl:t.tokenBrokerUrl}:{},...t.tokenBrokerAudience?{tokenBrokerAudience:t.tokenBrokerAudience}:{},fetchImpl:r})}}function Dr(e,t,r,n){if(!e)return null;const o=e.policies[t];if(!o)return null;const i=o(r,{accountId:n,endpoint:t});return!i?.partition||!i?.key?null:{partition:i.partition,key:i.key,ttlMs:i.ttlMs??e.ttlMs}}async function Lr(e,t,r){const n=Je(e.accountId,t),o=await Hr(e.accountId,n);if(Ke(o))return o;const i=await Fr(e,t,r);return i?(await ze(e.accountId,n,i,t.ttlMs),i):null}async function $r(e,t,r,n){try{const o=await Jr(r);if(Wr(o.body))return;const i=Je(e.accountId,t);await ze(e.accountId,i,o,t.ttlMs),qr(e,t,o,n)}catch{}}async function Fr(e,t,r){try{const n=await e.fetchImpl(qe(e.beUrl),{method:"POST",headers:await Fe(e,r),body:JSON.stringify({partition:t.partition,key:t.key}),signal:r});if(!n.ok)return null;const o=await n.json();return o.hit===!0&&Ke(o.payload)?o.payload:null}catch{return null}}async function qr(e,t,r,n){try{await e.fetchImpl(qe(e.beUrl),{method:"POST",headers:await Fe(e,n),body:JSON.stringify({partition:t.partition,key:t.key,ttl_s:Math.max(1,Math.ceil(t.ttlMs/1e3)),payload:r}),signal:n})}catch{}}async function Fe(e,t){return{authorization:`Bearer ${await e.jwtProvider({signal:t,parentUrl:e.parentUrl||Kr()})}`,"content-type":"application/json",accept:"application/json"}}function Kr(){try{return window.location?.href||""}catch{return""}}function qe(e){return`${String(e).replace(/\/+$/u,"")}/v1/cache`}async function Jr(e){return{status:e.status,statusText:e.statusText,headers:[...e.headers.entries()].filter(([t])=>Gr(t)),body:await e.text()}}function zr(e){return new Response(e.body,{status:e.status,statusText:e.statusText,headers:new Headers(e.headers)})}function Ke(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;const t=e;return typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.body=="string"&&Array.isArray(t.headers)}function Je(e,t){return`endpoint-response:${v({accountId:e,partition:t.partition,key:t.key})}`}async function Hr(e,t){const r=oe(e);return r.volatile.get(t)||await r.indexedDb.get(t)||r.local.get(t)}async function ze(e,t,r,n){const o=oe(e);o.volatile.set(t,r,{ttlMs:n}),await o.indexedDb.set(t,r,{ttlMs:n})||o.local.set(t,r,{ttlMs:n})}function Gr(e){return["content-type","cache-control"].includes(e.toLowerCase())}function Wr(e){return/"_error"\s*:/u.test(e)||/"type"\s*:\s*"error"/u.test(e)}function Vr(e){return e!==null&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"}function Yr({accountId:e,beUrl:t,devJwtSecret:r,tokenBrokerUrl:n,tokenBrokerAudience:o,workerUrl:i,defaultLocale:a="en-GB",accountModule:c,tools:y={},beacon:f,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 m=ie(i)||d?He(i,`gengage-${e}-agent`,{allowBlobWorker:d}):null;m||f?.({type:"agentRuntime",accountId:e,transport:"main-thread",reason:"cross-origin-worker-url",workerUrl:i}),l.streamTransport=m?Pe({accountId:e,worker:m.worker,beUrl:t,...r?{devJwtSecret:r}:{},...n?{tokenBrokerUrl:n}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:y,...f?{beacon:f}:{}}):Ie({accountId:e,accountModule:c,beUrl:t,...r?{devJwtSecret:r}:{},...n?{tokenBrokerUrl:n}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:y,...f?{beacon:f}:{}});const g={type:"agent",stop(){delete l.streamTransport,m?.worker.terminate(),m?.cleanup(),delete l.agentController},diagnostics(){return{accountId:e,beUrl:t,workerUrl:i,mounted:!0,transport:m?"worker":"main-thread",transportReason:m?"module-worker":"cross-origin-worker-url",flows:Object.keys(c?.flows||{})}}};return l.agentController=g,g}function ie(e){const t=new URL(e,window.location.href);return t.origin===window.location.origin||t.protocol==="blob:"}function He(e,t,r={}){const n=new URL(e,window.location.href);if(ie(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 Qr(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 Xr(e){return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ProductDetailsPanel",props:{product:F(e)||e||{}}}}}}}function Zr(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:Re(e.key_differences),specialCases:Re(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 en(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 tn(e){return Object.freeze([...e])}var Ge=new Set(["and","are","for","from","the","with"]),rn={token:.26,keyword:.22,category:.18,facet:.16,color:.08,attribute:.06,price:.08,retrieval:.08},nn=["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=Ge){const r=t instanceof Set?t:new Set([...Ge,...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 D(e,t={}){if(sn(e))return e;const r=t.facetKeys,n=S(e.category_names??e.category),o=S(e.category_ids),i=un(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),y=x(e.brand),f=t.sourceKeywords??[],d=[c,y,...n,...a,...S(e.promotions),x(e.description),...f].join(" "),s=A(d,t.stopWords),u=x(t.sourceProductType,fn(n,c,s),s[0]),l=P([...dn(d,nn),...Object.entries(i).filter(([g])=>/colou?r/iu.test(g)).flatMap(([,g])=>A(g,t.stopWords))]),m=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:y,productType:u,categoryNames:n,categoryIds:o,facets:i,keywords:P([...f.flatMap(g=>A(g,t.stopWords)),...s]).slice(0,12),tokens:s,colors:l,attributes:m,price:ln(e)}}function on(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 D({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 an(e,t={}){const r=D(e,t);return P([...t.sourceQueries??[],K([r.productType,...r.colors.slice(0,1),...r.attributes.slice(0,2)]),K([r.productType,...r.keywords.slice(0,3)]),K([r.categoryNames[r.categoryNames.length-1],...r.keywords.slice(0,2)]),K(r.title.split(/\s+/u).slice(0,6)),r.productType].map(n=>n.trim()).filter(Boolean)).slice(0,t.queryLimit??6)}function We(e,t,r={}){const n={...rn,...r.weights},o=D(t,r),i=[],a=R(e.tokens,o.tokens),c=R(e.keywords,o.tokens),y=yn(e.categoryNames,o.categoryNames)||R(Ve(e.categoryNames),Ve(o.categoryNames)),f=R(e.attributes,o.attributes),d=R(e.colors,o.colors),s=R(e.attributes,o.tokens),u=mn(e.price,o.price),l=pn(o.sku,r.hitCounts)>0?1:0,m=gn(e,o),g=a*n.token+c*n.keyword+y*n.category+f*n.facet+d*n.color+s*n.attribute+u*n.price+l*n.retrieval,h=hn(m?g:g*.35);return m&&e.productType&&e.productType===o.productType&&i.push("same product type"),y>.4&&i.push("similar category"),f>.2&&i.push("matching product attributes"),d>0&&i.push("matching colour"),u>.8&&i.push("similar price"),m||i.push("weaker product-type match"),{score:Number(h.toFixed(4)),reasons:i}}function cn(e,t,r={}){const n=D(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=We(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 sn(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 un(e){return!e||typeof e!="object"||Array.isArray(e)?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t,x(r)]).filter(([,t])=>t))}function ln(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 dn(e,t){const r=` ${T(e)} `;return t.filter(n=>r.includes(` ${T(n)} `))}function fn(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 K(e){return e.map(t=>T(t)).filter(Boolean).join(" ").replace(/\s+/gu," ").trim().slice(0,120)}function Ve(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 yn(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 mn(e,t){return e<=0||t<=0?0:Math.min(e,t)/Math.max(e,t)}function pn(e,t){return!e||!t?0:typeof t.get=="function"?t.get(e)??0:t[e]??0}function gn(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 hn(e){return Math.max(0,Math.min(1,e))}function wn(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 bn(e,t){const r=wn(e);r?.style&&(t?r.style.removeProperty("display"):r.style.setProperty("display","none","important")),t||(e?.chat||e?._chat)?.close?.()}var Sn="nd_be_url";function kn(e,t){const r=An()||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 An(){try{const e=new URLSearchParams(window.location.search).get(Sn)?.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 _n=["addToCart","search","searchKeyword","facetedSearch","searchGiftOptions","similaritySearch"];function En(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||_n){const c=t[a];typeof c=="function"&&(i[a]=i[a]||c)}return t}function xn({getPageType:e,getProduct:t}){return()=>({url:window.location.href,title:document.title,pageType:e(),product:t()})}function Tn({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 Pn({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}},y=()=>{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},f=a.GengageAssistantInjector||(a.GengageAssistantInjector={}),d=f[e]||(f[e]={});return d.loaderPromise||(d.loaderPromise=import(y()).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 In(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:""}p.AgentError=L,p.ContextStore=de,p.action=qt,p.actionButtonsUiSpec=en,p.beErrorToAgentError=z,p.buildPhotoSimilarityProfile=on,p.buildProductSimilarityProfile=D,p.buildSimilarityQueries=an,p.canUseModuleWorker=ie,p.caughtToStreamError=he,p.comparisonUiSpec=Zr,p.createBrowserMemory=oe,p.createDiagnosticsTool=Tn,p.createFlow=tn,p.createInjectorAdapter=Pe,p.createMainThreadInjectorAdapter=Ie,p.createModuleWorker=He,p.createReadPageTool=xn,p.done=W,p.elapsedMs=j,p.error=_e,p.httpErrorToAgentError=ge,p.installBrowserTools=En,p.installFetchTransportBridge=jr,p.llmCacheKey=mr,p.metadata=$t,p.mountAccount=Yr,p.normalizeProduct=F,p.normalizeSimilarityText=T,p.nowIso=se,p.productDetailsUiSpec=Xr,p.productFactsKey=gr,p.productSkuKey=pr,p.productsUiSpec=Qr,p.rankSimilarProducts=cn,p.requestText=In,p.resolveBeUrl=kn,p.resolveFlow=Ee,p.scoreSimilarityCandidate=We,p.setAssistantHostVisible=bn,p.stableKey=v,p.startLazyRuntimeLoader=Pn,p.textChunk=Ae,p.textKey=hr,p.tokenizeSimilarityText=A,p.trimProductFactsCore=Z,p.trimProductFactsListCore=yr,p.uiSpec=Ft})(this.Gengage=this.Gengage||{});
1
+ (function(s){Object.defineProperty(s,Symbol.toStringTag,{value:"Module"});function It(e){return!!e&&typeof e=="object"&&e.type==="rpc.req"}function Rt({worker:e,tools:t={},beacon:r,memory:n=sessionStorage}){e.addEventListener("message",o=>{const i=o.data;It(i)&&Mt(e,i,{tools:t,beacon:r,memory:n})})}async function Mt(e,t,r){try{const n=await we(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 Ut(e){if(e&&typeof e=="object"&&typeof e.name=="string")return e;throw new Error("tool.invoke requires { name, input }")}function Bt(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.get requires { key }")}function Lt(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.set requires { key }")}async function we(e,t,{tools:r,beacon:n,memory:o}){if(e==="tool.invoke"){const{name:i,input:a}=Ut(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}=Bt(t),a=o.getItem(String(i));return a?JSON.parse(a):null}if(e==="memory.set"){const{key:i,value:a}=Lt(t);return o.setItem(String(i),JSON.stringify(a??null)),{ok:!0}}throw new Error(`Unknown RPC method: ${e}`)}function be(){return new Date().toISOString()}function O(e){return Math.max(0,Math.round(performance.now()-e))}function U(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Nt(e){const{accountId:t,locale:r="en-GB",parentUrl:n="",threadId:o,incomingContext:i}=e,a=U(i)?i:{},c=U(a.thread)?a.thread:{},y=U(a.panel)?a.panel:{},m=U(a.meta)?a.meta:{},d=Se(a.messages),u={id:String(o||c.id||self.crypto.randomUUID()),started_at:String(c.started_at||be()),extensions:U(c.extensions)?{...c.extensions}:{}},l=String(m.locale||r),f=String(m.parentUrl||n||typeof self<"u"&&self.location?.href||"");return{panel:{...y},messages:d,thread:u,meta:{locale:l,parentUrl:f,accountId:t}}}function Dt(e,t){const r=Se([t])[0];return r?{...e,messages:[...e.messages,r].slice(-50)}:e}function Se(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 vt="gengage:agent:context:";async function $t({accountId:e,threadId:t,rpc:r}){const n=await r("memory.get",{tier:"session",key:Ae(e,t)});return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}async function Ft({accountId:e,threadId:t,extensions:r,panel:n,rpc:o}){await o("memory.set",{tier:"session",key:Ae(e,t),value:{thread:{extensions:r},...n&&Object.keys(n).length>0?{panel:n}:{}}})}function Ae(e,t){return`${vt}${e}:${t}`}function b(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ke=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 $t({accountId:this.#t,threadId:r,rpc:this.#r}),i=Nt({accountId:this.#t,locale:e?.locale||this.#n,parentUrl:this.#o,threadId:r,incomingContext:zt(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=_e(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=Dt(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 Ft({accountId:this.#t,threadId:t,extensions:r.thread.extensions,panel:qt(r.panel,this.#i),rpc:this.#r}),r):null}};function qt(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 zt(e,t){return!b(e)&&!b(t)?{}:_e(b(e)?e:{},b(t)?t:{})}function _e(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:{},y=b(a.extensions)?a.extensions:{},m=b(c.extensions)?c.extensions:{},d=b(r.meta)?r.meta:{},u=b(n.meta)?n.meta:{};return{...e,...t,panel:{...o,...i},thread:{...a,...c,extensions:{...y,...m}},meta:{...d,...u},messages:Array.isArray(n.messages)?n.messages.slice(-50):e.messages??[]}}function Ee(e){const t=String.fromCharCode(...e);return btoa(t).replace(/\+/gu,"-").replace(/\//gu,"_").replace(/=+$/u,"")}function Te(e){return Ee(new TextEncoder().encode(JSON.stringify(e)))}async function Kt({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=`${Te({alg:"HS256",typ:"JWT"})}.${Te({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}.${Ee(new Uint8Array(a))}`}function Y({accountId:e,devJwtSecret:t,tokenBrokerUrl:r,tokenBrokerAudience:n,refreshSkewS:o=30,fetchImpl:i=fetch}){let a=null;return async({signal:c,parentUrl:y}={})=>{if(t)return Kt({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 Jt({accountId:e,tokenBrokerUrl:r,tokenBrokerAudience:n,parentUrl:y,signal:c,fetchImpl:i})),a.token}}async function Jt({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(),y=c?.token||c?.jwt||c?.access_token;if(!y||typeof y!="string")throw new Error("Token broker response did not include a JWT.");return{token:y,expiresAtS:Ht(c)||Gt(y)||Math.floor(Date.now()/1e3)+300}}function Ht(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 Gt(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 Pe={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."}},F=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 X(e){const t=String(e?.code||"upstream_llm"),r=Pe[t]||Pe.upstream_llm;return new F(r.code,r.message,{source:"be",sourceCode:t,detail:e?.detail})}function je(e,t){const r=t?.error&&typeof t.error=="object"?t.error:{};return X({code:String(r.code||Wt(e)),detail:r.detail})}function xe(e){return e instanceof F?{type:"error",code:e.code,message:e.message}:{type:"error",code:"agent_invoke_failed",message:"The assistant could not complete that request."}}function Wt(e){return e===401?"unauthorized":e===403?"forbidden":e===413?"payload_too_large":e===429?"rate_limited":"internal"}var Qt=7200*1e3,Ce=200,Vt=5*1024*1024,Yt="gengage_request_response_cache",Xt=1,E="responses",Zt=new Set(["addToCart","like"]),T=new Map,Oe=null;async function er(e,t={},r={}){const n=tr(e,t);if(!n)return fetch(e,t);const o=Date.now(),i=await nr(n,o);if(i)return ar(i);const a=await fetch(e,t);return a.ok&&or(n,a.clone(),o,{ttlMs:r.ttlMs??Qt,maxEntries:r.maxEntries??Ce,maxBodyBytes:r.maxBodyBytes??Vt}),a}function tr(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"||rr(t.body)?null:`rr:${mr(dr({url:String(e),method:r,headers:cr(t.headers),body:t.body}))}`}function rr(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"&&Zt.has(r)}catch{return!1}}async function nr(e,t){const r=T.get(e);if(r)if(r.expiresAt<=t)T.delete(e);else return r.lastAccessedAt=t,T.delete(e),T.set(e,r),Z(r),r;const n=await ur(e);return n?n.expiresAt<=t?(T.delete(e),lr(e),null):(n.lastAccessedAt=t,T.set(e,n),Z(n),Ie(Ce),n):null}async function or(e,t,r,n){try{const o=await t.text();if(yr(o)>n.maxBodyBytes||ir(o))return;const i={key:e,status:t.status,statusText:t.statusText,headers:sr(t.headers),body:o,createdAt:r,expiresAt:r+n.ttlMs,lastAccessedAt:r};T.set(e,i),Ie(n.maxEntries),await Z(i),await fr(n.maxEntries,r)}catch{}}function ir(e){return/"_error"\s*:/u.test(e)||/"type"\s*:\s*"error"/u.test(e)}function ar(e){return new Response(e.body,{status:e.status,statusText:e.statusText,headers:new Headers(e.headers)})}function cr(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 sr(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 Ie(e){for(;T.size>e;){const t=[...T.values()].sort((r,n)=>r.lastAccessedAt-n.lastAccessedAt)[0];if(!t)break;T.delete(t.key)}}async function q(){return typeof indexedDB>"u"?null:(Oe??=new Promise(e=>{const t=indexedDB.open(Yt,Xt);t.onupgradeneeded=()=>{const r=t.result;r.objectStoreNames.contains(E)||r.createObjectStore(E,{keyPath:"key"}).createIndex("lastAccessedAt","lastAccessedAt",{unique:!1})},t.onsuccess=()=>e(t.result),t.onerror=()=>e(null),t.onblocked=()=>e(null)}),Oe)}async function ur(e){const t=await q();return t?new Promise(r=>{const n=t.transaction(E,"readonly"),o=n.objectStore(E).get(e);o.onsuccess=()=>r(o.result??null),o.onerror=()=>r(null),n.onerror=()=>r(null)}):null}async function Z(e){const t=await q();t&&await new Promise(r=>{const n=t.transaction(E,"readwrite");n.objectStore(E).put(e),n.oncomplete=()=>r(),n.onerror=()=>r(),n.onabort=()=>r()})}async function lr(e){const t=await q();t&&await new Promise(r=>{const n=t.transaction(E,"readwrite");n.objectStore(E).delete(e),n.oncomplete=()=>r(),n.onerror=()=>r(),n.onabort=()=>r()})}async function fr(e,t){const r=await q();r&&await new Promise(n=>{const o=r.transaction(E,"readwrite"),i=o.objectStore(E),a=[],c=i.openCursor();c.onsuccess=()=>{const y=c.result;if(!y){const m=a.filter(u=>u.expiresAt<=t),d=a.filter(u=>u.expiresAt>t).sort((u,l)=>u.lastAccessedAt-l.lastAccessedAt).slice(0,Math.max(0,a.length-m.length-e));for(const u of[...m,...d])i.delete(u.key);return}a.push(y.value),y.continue()},c.onerror=()=>n(),o.oncomplete=()=>n(),o.onerror=()=>n(),o.onabort=()=>n()})}function dr(e){return JSON.stringify(ee(e))}function ee(e){return Array.isArray(e)?e.map(ee):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>[t,ee(r)]))}function mr(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 yr(e){return typeof TextEncoder<"u"?new TextEncoder().encode(e).byteLength:e.length}async function pr({beUrl:e,accountId:t,devJwtSecret:r,tokenBrokerUrl:n,tokenBrokerAudience:o,jwtProvider:i,parentUrl:a,op:c,input:y,cacheTtlS:m,cacheKey:d,browserCache:u,signal:l}){const f=await(i||Y({accountId:t,devJwtSecret:r,tokenBrokerUrl:n,tokenBrokerAudience:o}))({...l?{signal:l}:{},...a?{parentUrl:a}:{}}),{opDomain:p,opName:g}=gr(c,t),h={method:"POST",headers:{authorization:`Bearer ${f}`,"content-type":"application/json",accept:"application/x-ndjson"},body:JSON.stringify({op_domain:p,op_name:g,op_payload:y,...m!==void 0?{cache_ttl_s:m}:{},...d!==void 0?{cache_key:d}:{}}),...l?{signal:l}:{}},A=`${String(e).replace(/\/+$/u,"")}/v1/execute`,w=u===!1?await fetch(A,h):await er(A,h,typeof u=="object"?u:{});if(!w.ok)throw je(w.status,await wr(w));return br(w)}function gr(e,t){if(!e||e.startsWith("-")||e.endsWith("-"))throw new Error(`Invalid BE op name: ${e}`);return{opDomain:hr(t),opName:e}}function hr(e){return e.replace(/-agentic$/u,"")}async function wr(e){try{return await e.json()}catch{return{error:{code:e.statusText||"internal"}}}}async function br(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 y=n.indexOf(`
2
+ `);for(;y>=0;){const m=n.slice(0,y).trim();n=n.slice(y+1),m&&Re(JSON.parse(m),o),y=n.indexOf(`
3
+ `)}}const i=n.trim();return i&&Re(JSON.parse(i),o),o}function Re(e,t){if(e._error)throw X(e._error);if(!e._end)for(const[r,n]of Object.entries(e)){if(Object.prototype.hasOwnProperty.call(t,r))throw new F("op_failed",`BE streamed duplicate field "${r}".`,{source:"be",sourceCode:"schema_mismatch"});t[r]=n}}function Sr(e={}){return{type:"metadata",...e}}function te(e,t=!1,r={}){return{type:"text_chunk",content:e,final:t,...r}}function B(e){return{type:"ui_spec",...e}}function Ar(e){return{type:"action",action:e}}function Me(e,t){return{type:"error",code:e,message:t}}function re(){return{type:"done"}}function Ue(e,t){return e[t?.type||t?.action?.type||"inputText"]||e.inputText}async function kr({request:e,accountModule:t,contextStore:r,beClient:n,toolBridge:o,emit:i,rpc:a,signal:c}){const y=performance.now(),m=await r.load(e),d=m.thread.id,u=Br(e);r.appendUserMessage(d,u);const l=Ue(t.flows,e);if(!l)return i(Me("unknown_action",`No agent flow for request type ${e?.type||"inputText"}`)),i(re()),{steps:0,productSkusEmitted:[]};const f={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 L(l,f,p),f.committed||await ne(f,p),await a("beacon.send",{type:"turnSummary",threadId:d,sessionId:e?.session_id||e?.sessionId||d,accountId:t.accountId||f.context.meta.accountId,steps:f.steps,totalLatencyMs:O(y),productSkusEmitted:[...f.productSkusEmitted]}),{steps:f.steps,productSkusEmitted:[...f.productSkusEmitted]}}async function L(e,t,r){for(const n of e){if(r.signal?.aborted)return;t.steps+=1,await _r(n,t,r),t.context=r.contextStore.patch(t.threadId,{})||t.context}}async function _r(e,t,r){const n=ie(t);if(e.kind==="be_op"){await Er(e,t,r,n);return}if(e.kind==="tool"){await Tr(e,t,r,n);return}if(e.kind==="adapter"){await Pr(e,t,r,n);return}if(e.kind==="emit"){jr(e,t,r);return}if(e.kind==="branch"){await xr(e,t,r,n);return}if(e.kind==="parallel"){await Cr(e,t,r);return}if(e.kind==="refusal"){await Or(e,t,r,n);return}e.kind==="commit"&&await Ir(e,t,r)}async function Er(e,t,r,n){const o=performance.now();let i;const a=x(e.cacheTtlS,n),c=x(e.cacheKey,n),y=x(e.browserCache,n);try{i=await r.beClient.invoke({op:e.op,input:x(e.input,n),...a!==void 0?{cacheTtlS:a}:{},...c!==void 0?{cacheKey:c}:{},...y!==void 0?{browserCache:y}:{},...r.signal?{signal:r.signal}:{}})}catch(d){const u=d,l=String(u?.sourceCode||u?.code||"unknown"),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:"error",latencyMs:O(o),errorCode:l};if(await r.rpc("beacon.send",f),e.onError){e.errorOut&&(t.bag[e.errorOut]=d),await L(e.onError,t,r);return}throw d}e.out&&(t.bag[e.out]=i),oe(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:O(o)};await r.rpc("beacon.send",m)}async function Tr(e,t,r,n){const o=performance.now();try{const i=await r.toolBridge.invoke(e.name,x(e.input,n));e.out&&(t.bag[e.out]=i),oe(e,i,t,r.contextStore),await r.rpc("beacon.send",{type:"agentTool",threadId:t.threadId,sessionId:Be(t),accountId:t.context.meta.accountId,tool:e.name,status:"ok",latencyMs:O(o)})}catch(i){const a=i;if(await r.rpc("beacon.send",{type:"agentTool",threadId:t.threadId,sessionId:Be(t),accountId:t.context.meta.accountId,tool:e.name,status:"error",latencyMs:O(o),errorCode:String(a?.code||a?.name||"unknown")}),e.onError){e.errorOut&&(t.bag[e.errorOut]=i),await L(e.onError,t,r);return}throw i}}async function Pr(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(x(e.input,n),n);e.out&&(t.bag[e.out]=i),oe(e,i,t,r.contextStore)}function jr(e,t,r){const n=e.build(ie(t));Lr(n,t.productSkusEmitted),r.emit(n)}async function xr(e,t,r,n){const o=String(x(e.on,n)||"default");await L(e.cases[o]||e.cases.default||[],t,r)}async function Cr(e,t,r){const n=e.steps.map(a=>{const c={...t,context:Rr(t.context),bag:{...t.bag},productSkusEmitted:t.productSkusEmitted,committed:!1};return L(a,c,{...r,contextStore:Mr(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=Le(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=Le(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 Or(e,t,r,n){r.emit(te(x(e.message,n),!0)),await ne(t,r)}async function Ir(e,t,r){await ne(t,r)}async function ne(e,{contextStore:t,emit:r}){e.committed||(e.context=await t.commit(e.threadId)||e.context,e.committed=!0,r(re()))}function oe(e,t,r,n){if(typeof e.patch!="function")return;const o=e.patch(r.context,t,ie(r));o&&(r.context=n.patch(r.threadId,o)||r.context)}function ie(e){return{request:e.request,context:e.context,bag:e.bag,accountConfig:e.accountConfig}}function Be(e){return e.request?.session_id||e.request?.sessionId||e.threadId}function Rr(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function Le(e,t){const r={};for(const n of t)Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}function Mr(e){return{async load(){return e.context},patch(t,r){return e.context=Ur(e.context,r),e.context},appendUserMessage(){return e.context},async commit(){return e.context}}}function Ur(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 x(e,t){return typeof e=="function"?e(t):e}function Br(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 Lr(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 y=c.sku;typeof y=="string"&&t.add(y)}}}function Nr(e){return{invoke(t,r){return e("tool.invoke",{name:t,input:r})}}}var Dr=512,vr=.74;function Ne({accountId:e,worker:t,beUrl:r,devJwtSecret:n,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:c={},beacon:y}){let m=1;const d=new Map;return Rt({worker:t,tools:c,beacon:u=>y?.({...u,accountId:u.accountId||e}),memory:sessionStorage}),t.addEventListener("message",u=>{const l=u.data||{},f=typeof l.id=="number"?l.id:null;if(f==null)return;const p=d.get(f);if(p){if(l.type==="event"&&l.event){ae(p,l.event);return}if(l.type==="error"){p.onError(new Error(l.message||"Agent worker failed")),d.delete(f);return}l.type==="end"&&d.delete(f)}}),(u,l,f,p)=>{const g=m++;d.set(g,l);const h=()=>{d.delete(g),t.postMessage({id:g,type:"abort"})},A=w=>{if(f.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(f.aborted){h();return}if(f.addEventListener("abort",h,{once:!0}),p){ve(u,p).then(A).catch(w=>{d.delete(g),l.onError(w instanceof Error?w:new Error("Failed to read image attachment"))});return}A(u)}}function De({accountId:e,accountModule:t,beUrl:r,devJwtSecret:n,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:c={},beacon:y}){let m=null;const d=$r({accountId:e,tools:c,beacon:y}),u=Nr(d),l=Y({accountId:e,...n?{devJwtSecret:n}:{},...o?{tokenBrokerUrl:o}:{},...i?{tokenBrokerAudience:i}:{}});return async(f,p,g,h)=>{const A=await ve(f||{},h);m||=new ke({accountId:e,locale:A?.locale||a,parentUrl:window.location.href,rpc:d,persistentPanelKeys:t.contextPersistence?.panelKeys});try{await kr({request:A,accountModule:{...t,accountId:e},contextStore:m,beClient:{invoke({op:w,input:he,signal:Ot,cacheTtlS:$o,cacheKey:Fo,browserCache:qo}){return pr({beUrl:r,accountId:e,jwtProvider:l,parentUrl:window.location.href,op:w,input:he,cacheTtlS:$o,cacheKey:Fo,browserCache:qo,...Ot?{signal:Ot}:{}})}},toolBridge:u,emit:w=>ae(p,w),rpc:d,signal:g})}catch(w){g?.aborted||(ae(p,xe(w)),p.onDone())}}}function $r({accountId:e,tools:t,beacon:r}){const n=o=>r?.({...o,accountId:o.accountId||e});return((o,i)=>we(o,i,{tools:t,beacon:n,memory:sessionStorage}))}async function ve(e,t){if(!t||!t.type?.startsWith("image/"))return e;const r=await zr(t),n={...Fr(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 Fr(e){return qr(e)?{...e}:typeof e=="string"?{text:e}:{}}function qr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function zr(e){const t=await Kr(e);return t||{dataUrl:await $e(e),mime:e.type}}async function Kr(e){if(typeof createImageBitmap!="function"||typeof document>"u")return null;let t=null;try{t=await createImageBitmap(e);const r=Math.min(1,Dr/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(y=>i.toBlob(y,"image/jpeg",vr));return c?{dataUrl:await $e(c),mime:c.type||"image/jpeg"}:null}catch{return null}finally{t?.close()}}async function $e(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 ae(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(Jr(t));break;case"done":e.onDone();break;default:break}}function Jr(e){const t=new Error(e.message||e.code||"Agent error");return e.code&&(t.code=e.code),t}function Fe(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function z(e){const t=Fe(e);if(!t)return null;const r=I(t.sku,t.SKU);if(!r)return null;const n={sku:r,name:I(t.name,t.title,t.short_name,r)||r,url:I(t.url)||""},o=Array.isArray(t.images)?t.images:void 0,i=I(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=N(t.price_discounted),c=N(t.price),y=a||c;y>0&&(n.price=String(y));const m=a>0?c:0;m>0&&(n.originalPrice=String(m));const d=I(t.brand);d&&(n.brand=d);const u=N(t.rating);u>0&&(n.rating=u);const l=N(t.review_count)||N(t.reviewCount);l>0&&(n.reviewCount=l);const f=I(t.cart_code,t.cartCode);f&&(n.cartCode=f),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 K(e){const t=Fe(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 Hr(e){return Array.isArray(e)?e.map(K).filter(t=>!!t):[]}function I(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function N(e){const t=Number(e);return Number.isFinite(t)?t:0}function qe(e){return Array.isArray(e)?e.map(String).filter(Boolean):typeof e=="string"&&e?[e]:[]}function Gr(e,t,r={}){return`${e}:${r.version||"v2"}:${R(t)}`}function Wr(e,t={}){return ze(e).map(r=>Ke(typeof r=="string"?r:r.sku,t.locale)).filter(Boolean).filter((r,n,o)=>o.indexOf(r)===n).sort((r,n)=>ce(r,n,t.locale)).slice(0,t.limit||16).join(",")}function Qr(e,t={}){return R(ze(e).map(r=>Yr(r,t)).filter(r=>!!r).sort((r,n)=>ce(String(r.sku||r.name||""),String(n.sku||n.name||""),t.locale)).slice(0,t.limit||16))}function Vr(e,t){return C(e,t)}function R(e){let t=2166136261;const r=Xr(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 Yr(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;const r=e,n=t.mapProduct?.(r);if(n)return D(n);const o=K(r);return o&&typeof o=="object"&&!Array.isArray(o)?D(Zr(o,t)):null}function ze(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"||!!(t&&typeof t=="object"&&!Array.isArray(t))):[]}function Xr(e){return JSON.stringify(D(e))}function D(e){return Array.isArray(e)?e.map(D):!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,D(r)]))}function Zr(e,t){return{sku:Ke(e.sku,t.locale),name:C(e.name,t.locale),url:C(e.url,t.locale),price:e.price,currency:C(e.currency,t.locale),category:C(e.category,t.locale),category_names:en(e.category_names,t.locale,16),image:C(e.image,t.locale),in_stock:e.in_stock,rating:e.rating,review_count:e.review_count}}function Ke(e,t){return C(e,t).toUpperCase()}function C(e,t){return typeof e=="string"?e.trim().replace(/\s+/gu," ").toLocaleLowerCase(t||void 0):""}function ce(e,t,r){return e.localeCompare(t,r,{numeric:!0})}function en(e,t,r){return Array.isArray(e)?e.map(n=>C(n,t)).filter(Boolean).sort((n,o)=>ce(n,o,t)).slice(0,r):void 0}var tn="entries",rn=1,nn={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."},Je=new Map;function se(){return Date.now()}function ue(e){return e?.expiresAt!=null&&e.expiresAt<=se()}function le(e,t){return{value:e,createdAt:se(),expiresAt:t?se()+t:null}}function on(e,t,r){try{const n=e.getItem(`${t}${r}`);if(!n)return null;const o=JSON.parse(n);return ue(o)?(e.removeItem(`${t}${r}`),null):o.value}catch{return null}}function an(e,t,r,n,o){try{return e.setItem(`${t}${r}`,JSON.stringify(le(n,o))),!0}catch{return!1}}function cn(e,t,r){try{e.removeItem(`${t}${r}`)}catch{}}function He(e){try{return window[e]}catch{return null}}function Ge(e,t){return e?{get:r=>on(e,t,r),set:(r,n,o={})=>an(e,t,r,n,o.ttlMs),remove:r=>cn(e,t,r)}:{get:()=>null,set:()=>!1,remove:()=>{}}}function sn(e,t){const r=t.dbName||`gengage-${e}`,n=t.dbStore||tn,o=t.dbVersion||rn,i=new Map;let a=null;const c=()=>"indexedDB"in window?a||(a=new Promise(u=>{const l=indexedDB.open(r,o);l.onupgradeneeded=()=>{l.result.createObjectStore(n,{keyPath:"key"})},l.onsuccess=()=>u(l.result),l.onerror=()=>u(null),l.onblocked=()=>u(null)}),a):Promise.resolve(null);return{volatileEntries:i,idbGet:async u=>{const l=await c();return l?new Promise(f=>{const p=l.transaction(n,"readwrite").objectStore(n),g=p.get(u);g.onsuccess=()=>{const h=g.result;if(!h||ue(h)){h&&p.delete(u),f(null);return}f(h.value)},g.onerror=()=>f(null)}):null},idbSet:async(u,l,f={})=>{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:u,...le(l,f.ttlMs)})}):!1},idbRemove:async u=>{const l=await c();l&&l.transaction(n,"readwrite").objectStore(n).delete(u)}}}function fe(e,t={}){const r=window,n=r.gengage||(r.gengage={}),o=n.memory||(n.memory={}),i=o[e];if(i)return i;const a=Je.get(e)||sn(e,t);Je.set(e,a);const c=t.sessionPrefix||`gengage:${e}:session:`,y=t.localPrefix||`gengage:${e}:local:`,d={get:f=>{const p=a.volatileEntries.get(f);return p?ue(p)?(a.volatileEntries.delete(f),null):p.value:null},set:(f,p,g={})=>(a.volatileEntries.set(f,le(p,g.ttlMs)),!0),remove:f=>{a.volatileEntries.delete(f)},clear:()=>a.volatileEntries.clear()},u={get:a.idbGet,set:a.idbSet,remove:a.idbRemove},l={accountId:e,volatile:d,session:Ge(He("sessionStorage"),c),local:Ge(He("localStorage"),y),indexedDb:u,stableKey:R,policy:{...nn,...t.policy||{}}};o[e]=l;for(const f of t.aliases||[])o[f]=l;return l}var J="__gengageAgentFetchBridge",un=1e3*60*60*24*14;function ln({accountId:e,streamTransport:t,endpoints:r={},endpointCache:n}){if(!e)throw new Error("accountId is required.");if(typeof t!="function")throw new Error("streamTransport is required.");const o=fn(),i=`https://gengage-injector.invalid/${encodeURIComponent(e)}`,a=new Set,c=n?hn({accountId:e,endpointCache:n,fetchImpl:o.originalFetch}):void 0,y=m=>{const d=`${i}/chat/${m}`;a.add(d);const u=r[m],l={streamTransport:t,endpoint:m};u&&(l.endpointHandler=u),c&&(l.endpointCache=c),o.routes.set(d,l)};y("process_action");for(const m of Object.keys(r))m!=="process_action"&&y(m);return{middlewareUrl:i,stop(){for(const m of a)o.routes.delete(m);dn(o)}}}function fn(){const e=window,t=e[J];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=We(o),c=n.routes.get(a);return c?yn(c,o,i):r(o,i)},e.fetch=n.installedFetch,e[J]=n,n}function dn(e){if(e.routes.size>0)return;const t=window;t.fetch===e.installedFetch&&(t.fetch=e.originalFetch),t[J]===e&&delete t[J]}function We(e){return typeof e=="string"?e:e instanceof URL?e.href:e?.url||""}function Qe(e,t){if(t?.signal)return t.signal;if(typeof Request<"u"&&e instanceof Request)return e.signal}function Ve(e,t){return t?.body!==void 0&&t?.body!==null?t.body:typeof Request<"u"&&e instanceof Request?e.clone().text():null}async function mn(e,t){const r=Ve(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 yn(e,t,r){if(e.endpoint&&e.endpoint!=="process_action"&&e.endpointHandler){const m=new AbortController,d=Qe(t,r);let u=null;if(d){const l=()=>m.abort();d.aborted&&l(),d.addEventListener("abort",l,{once:!0}),u=()=>d.removeEventListener("abort",l)}try{const l=await pn(t,r),f={accountId:gn(t),endpoint:e.endpoint,signal:m.signal},p=wn(e.endpointCache,e.endpoint,l,f.accountId);if(p){const h=await bn(e.endpointCache,p,m.signal);if(h)return Tn(h)}const g=await e.endpointHandler(l,f);return p&&g.ok&&await Sn(e.endpointCache,p,g.clone(),m.signal),g}finally{u?.()}}const n=new TextEncoder,o=new AbortController,i=Qe(t,r);let a=!1,c=null;const y=new ReadableStream({async start(m){const d=f=>{a||m.enqueue(n.encode(`${JSON.stringify(f)}
4
+ `))},u=()=>{a||(a=!0,c?.(),m.close())},l=f=>{d({type:"error",code:f?.code||"agent_bridge_error",message:f instanceof Error?f.message:String(f)}),d({type:"done"}),u()};if(i){const f=()=>{o.abort(),a||(a=!0,c?.(),m.error(new DOMException("Aborted","AbortError")))};if(i.aborted){f();return}i.addEventListener("abort",f,{once:!0}),c=()=>i.removeEventListener("abort",f)}try{const{request:f,attachment:p}=await mn(t,r),g=e.streamTransport(f,{onTextChunk:(h,A,w={})=>d({type:"text_chunk",content:h,final:A===!0,...w}),onUISpec:(h,A,w,he)=>d({type:"ui_spec",spec:h,widget:A,...w?{panelHint:w}:{},...he?{clearPanel:!0}:{}}),onAction:h=>{d(h?.type==="action"?h:{type:"action",action:h})},onMetadata:h=>{d(h?.type==="metadata"?h:{type:"metadata",...h})},onError:l,onDone:()=>{d({type:"done"}),u()}},o.signal,p);Cn(g)&&(await g,o.signal.aborted||(d({type:"done"}),u()))}catch(f){o.signal.aborted||l(f)}},cancel(){o.abort(),c?.(),a=!0}});return new Response(y,{status:200,headers:{"Content-Type":"application/x-ndjson"}})}async function pn(e,t){const r=await Promise.resolve(Ve(e,t));return typeof r!="string"||r.trim()===""?{}:JSON.parse(r)}function gn(e){try{const[t]=new URL(We(e)).pathname.split("/").filter(Boolean);return decodeURIComponent(t||"")}catch{return""}}function hn({accountId:e,endpointCache:t,fetchImpl:r}){return{accountId:e,beUrl:t.beUrl,...t.parentUrl?{parentUrl:t.parentUrl}:{},ttlMs:t.ttlMs??un,policies:t.policies,fetchImpl:r,jwtProvider:Y({accountId:e,...t.devJwtSecret?{devJwtSecret:t.devJwtSecret}:{},...t.tokenBrokerUrl?{tokenBrokerUrl:t.tokenBrokerUrl}:{},...t.tokenBrokerAudience?{tokenBrokerAudience:t.tokenBrokerAudience}:{},fetchImpl:r})}}function wn(e,t,r,n){if(!e)return null;const o=e.policies[t];if(!o)return null;const i=o(r,{accountId:n,endpoint:t});return!i?.partition||!i?.key?null:{partition:i.partition,key:i.key,ttlMs:i.ttlMs??e.ttlMs}}async function bn(e,t,r){const n=et(e.accountId,t),o=await Pn(e.accountId,n);if(Ze(o))return o;const i=await An(e,t,r);return i?(await tt(e.accountId,n,i,t.ttlMs),i):null}async function Sn(e,t,r,n){try{const o=await En(r);if(xn(o.body))return;const i=et(e.accountId,t);await tt(e.accountId,i,o,t.ttlMs),kn(e,t,o,n)}catch{}}async function An(e,t,r){try{const n=await e.fetchImpl(Xe(e.beUrl),{method:"POST",headers:await Ye(e,r),body:JSON.stringify({partition:t.partition,key:t.key}),signal:r});if(!n.ok)return null;const o=await n.json();return o.hit===!0&&Ze(o.payload)?o.payload:null}catch{return null}}async function kn(e,t,r,n){try{await e.fetchImpl(Xe(e.beUrl),{method:"POST",headers:await Ye(e,n),body:JSON.stringify({partition:t.partition,key:t.key,ttl_s:Math.max(1,Math.ceil(t.ttlMs/1e3)),payload:r}),signal:n})}catch{}}async function Ye(e,t){return{authorization:`Bearer ${await e.jwtProvider({signal:t,parentUrl:e.parentUrl||_n()})}`,"content-type":"application/json",accept:"application/json"}}function _n(){try{return window.location?.href||""}catch{return""}}function Xe(e){return`${String(e).replace(/\/+$/u,"")}/v1/cache`}async function En(e){return{status:e.status,statusText:e.statusText,headers:[...e.headers.entries()].filter(([t])=>jn(t)),body:await e.text()}}function Tn(e){return new Response(e.body,{status:e.status,statusText:e.statusText,headers:new Headers(e.headers)})}function Ze(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;const t=e;return typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.body=="string"&&Array.isArray(t.headers)}function et(e,t){return`endpoint-response:${R({accountId:e,partition:t.partition,key:t.key})}`}async function Pn(e,t){const r=fe(e);return r.volatile.get(t)||await r.indexedDb.get(t)||r.local.get(t)}async function tt(e,t,r,n){const o=fe(e);o.volatile.set(t,r,{ttlMs:n}),await o.indexedDb.set(t,r,{ttlMs:n})||o.local.set(t,r,{ttlMs:n})}function jn(e){return["content-type","cache-control"].includes(e.toLowerCase())}function xn(e){return/"_error"\s*:/u.test(e)||/"type"\s*:\s*"error"/u.test(e)}function Cn(e){return e!==null&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"}function On({accountId:e,beUrl:t,devJwtSecret:r,tokenBrokerUrl:n,tokenBrokerAudience:o,workerUrl:i,defaultLocale:a="en-GB",accountModule:c,tools:y={},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 u=window,l=u.GengageAssistantInjector||(u.GengageAssistantInjector={}),f=l[e]||(l[e]={});if(f.agentController)return f.agentController;const p=de(i)||d?rt(i,`gengage-${e}-agent`,{allowBlobWorker:d}):null;p||m?.({type:"agentRuntime",accountId:e,transport:"main-thread",reason:"cross-origin-worker-url",workerUrl:i}),f.streamTransport=p?Ne({accountId:e,worker:p.worker,beUrl:t,...r?{devJwtSecret:r}:{},...n?{tokenBrokerUrl:n}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:y,...m?{beacon:m}:{}}):De({accountId:e,accountModule:c,beUrl:t,...r?{devJwtSecret:r}:{},...n?{tokenBrokerUrl:n}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:y,...m?{beacon:m}:{}});const g={type:"agent",stop(){delete f.streamTransport,p?.worker.terminate(),p?.cleanup(),delete f.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 f.agentController=g,g}function de(e){const t=new URL(e,window.location.href);return t.origin===window.location.origin||t.protocol==="blob:"}function rt(e,t,r={}){const n=new URL(e,window.location.href);if(de(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 In(e,t={}){if(!Array.isArray(e))return[];const r=t.maxItems??8,n=t.maxFeatures??8;return e.map(o=>Rn(o,t.defaultBrand,n)).filter(o=>!!o).slice(0,r)}function Rn(e,t,r){if(!e||typeof e!="object"||Array.isArray(e))return null;const n=e,o=K(n);return o?Bn({sku:o.sku,name:o.name,url:o.url,image:o.image,price:o.price,currency:o.currency,category:o.category,category_names:o.category_names,brand:n.brand||t,features:Mn(n.features,r),specs:Un(n.specs,r),in_stock:o.in_stock}):null}function Mn(e,t){return Array.isArray(e)?e.filter(Boolean).slice(0,t):void 0}function Un(e,t){if(!(!e||typeof e!="object"||Array.isArray(e)))return Object.fromEntries(Object.entries(e).filter(([,r])=>r!=null).slice(0,t))}function Bn(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!=null))}function me(e){if(!e||typeof e!="object"||Array.isArray(e))return{};const t=e,r=Array.isArray(t.rows)?t.rows:[];return{...t,rows:r.map(Nn).filter(Boolean)}}function nt(e,t){const r=Array.isArray(e)?e.filter(c=>!!(c&&typeof c=="object"&&!Array.isArray(c))):[],n=me(t),o=Array.isArray(n.columns)?n.columns.map(String):[];if(!o.length)return r;const i=new Map(r.map(c=>[String(c.sku||c.id||""),c])),a=o.map(c=>i.get(c)).filter(c=>!!c);return a.length?a:r}function Ln(e,t){const r=me(e?.table),n=nt(t,r);return{...e||{},table:r,products:n,multiple_product_details:n}}function Nn(e){return!e||typeof e!="object"||Array.isArray(e)?null:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function ot(e=[]){const t={},r=[];return(Array.isArray(e)?e.map(z).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 it(e){return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ProductDetailsPanel",props:{product:z(e)||e||{}}}}}}}function at(e={}){const t=(e.multiple_product_details||e.products||[]).map(z).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:qe(e.key_differences),specialCases:qe(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 ct(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 Dn(e){return Object.freeze([...e])}var st=new Set(["and","are","for","from","the","with"]),vn={token:.26,keyword:.22,category:.18,facet:.16,color:.08,attribute:.06,price:.08,retrieval:.08},$n=["amber","beige","black","blue","blush","bronze","brown","cream","gold","green","grey","ivory","lilac","mixed","orange","pastel","pink","purple","red","silver","white","yellow"];function k(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=st){const r=t instanceof Set?t:new Set([...st,...t]),n=new Set,o=[];for(const i of k(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(Kn(e))return e;const r=t.facetKeys,n=S(e.category_names??e.category),o=S(e.category_ids),i=Jn(e.facet_hits),a=Object.entries(i).filter(([g])=>!r||r.some(h=>k(h)===k(g))).map(([,g])=>g),c=P(e.name,e.title),y=P(e.brand),m=t.sourceKeywords??[],d=[c,y,...n,...a,...S(e.promotions),P(e.description),...m].join(" "),u=_(d,t.stopWords),l=P(t.sourceProductType,Wn(n,c,u),u[0]),f=j([...Gn(d,$n),...Object.entries(i).filter(([g])=>/colou?r/iu.test(g)).flatMap(([,g])=>_(g,t.stopWords))]),p=j([...a.flatMap(g=>_(g,t.stopWords)),...S(e.promotions).flatMap(g=>_(g,t.stopWords))]).slice(0,24);return{sku:P(e.sku),title:c,brand:y,productType:l,categoryNames:n,categoryIds:o,facets:i,keywords:j([...m.flatMap(g=>_(g,t.stopWords)),...u]).slice(0,12),tokens:u,colors:f,attributes:p,price:Hn(e)}}function Fn(e,t={}){const r=P(e.product_type,e.productType),n=P(e.title,r,S(e.keywords).join(" ")),o=j([...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 qn(e,t={}){const r=v(e,t);return j([...t.sourceQueries??[],H([r.productType,...r.colors.slice(0,1),...r.attributes.slice(0,2)]),H([r.productType,...r.keywords.slice(0,3)]),H([r.categoryNames[r.categoryNames.length-1],...r.keywords.slice(0,2)]),H(r.title.split(/\s+/u).slice(0,6)),r.productType].map(n=>n.trim()).filter(Boolean)).slice(0,t.queryLimit??6)}function ut(e,t,r={}){const n={...vn,...r.weights},o=v(t,r),i=[],a=M(e.tokens,o.tokens),c=M(e.keywords,o.tokens),y=Qn(e.categoryNames,o.categoryNames)||M(lt(e.categoryNames),lt(o.categoryNames)),m=M(e.attributes,o.attributes),d=M(e.colors,o.colors),u=M(e.attributes,o.tokens),l=Vn(e.price,o.price),f=Yn(o.sku,r.hitCounts)>0?1:0,p=Xn(e,o),g=a*n.token+c*n.keyword+y*n.category+m*n.facet+d*n.color+u*n.attribute+l*n.price+f*n.retrieval,h=Zn(p?g:g*.35);return p&&e.productType&&e.productType===o.productType&&i.push("same product type"),y>.4&&i.push("similar category"),m>.2&&i.push("matching product attributes"),d>0&&i.push("matching colour"),l>.8&&i.push("similar price"),p||i.push("weaker product-type match"),{score:Number(h.toFixed(4)),reasons:i}}function zn(e,t,r={}){const n=v(e,r),o=new Set([n.sku,...r.ignoreSkus??[]].filter(Boolean));return t.filter(i=>{const a=P(i.sku);return a&&!o.has(a)}).map(i=>{const a=ut(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 Kn(e){return!!(e&&typeof e=="object"&&Array.isArray(e.tokens))}function P(...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=>P(t)).filter(Boolean):typeof e=="string"&&e.trim()?e.split(/[,;/|]+/u).map(t=>t.trim()).filter(Boolean):[]}function Jn(e){return!e||typeof e!="object"||Array.isArray(e)?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t,P(r)]).filter(([,t])=>t))}function Hn(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 j(e){const t=new Set,r=[];for(const n of e){const o=k(n);!o||t.has(o)||(t.add(o),r.push(o))}return r}function Gn(e,t){const r=` ${k(e)} `;return t.filter(n=>r.includes(` ${k(n)} `))}function Wn(e,t,r){const n=k(e[e.length-1]??e[0]??"");if(n){const o=_(n),i=new Set(_(t));return o.find(a=>i.has(a))??o[0]??n}return r[0]??""}function H(e){return e.map(t=>k(t)).filter(Boolean).join(" ").replace(/\s+/gu," ").trim().slice(0,120)}function lt(e){return e.flatMap(t=>_(t))}function M(e,t){const r=j(e),n=new Set(j(t));return r.length===0||n.size===0?0:r.filter(o=>n.has(o)).length/r.length}function Qn(e,t){const r=j(e),n=new Set(j(t));return r.length===0||n.size===0?0:r.filter(o=>n.has(o)).length/r.length}function Vn(e,t){return e<=0||t<=0?0:Math.min(e,t)/Math.max(e,t)}function Yn(e,t){return!e||!t?0:typeof t.get=="function"?t.get(e)??0:t[e]??0}function Xn(e,t){if(!e.productType||!t.productType||e.productType===t.productType)return!0;const r=new Set(_(e.productType)),n=new Set([..._(t.productType),...t.tokens]);return[...r].some(o=>n.has(o))}function Zn(e){return Math.max(0,Math.min(1,e))}function eo(e,t={}){if(!Array.isArray(e))return[];const r=e.filter(n=>!!(n&&typeof n=="object"&&!Array.isArray(n))).map((n,o)=>({product:n,index:o,score:ft(n,t)})).sort((n,o)=>o.score-n.score||n.index-o.index).map(({product:n})=>n);return typeof t.limit=="number"?r.slice(0,t.limit):r}function ft(e,t={}){const r=dt(t),n=ye(e);let o=0;for(const i of r)n.includes(i)&&(o+=i.length>3?3:1);return mt(e)&&(o+=2),yt(e)&&(o+=2),pt(e)&&(o+=1),e.in_stock===!1&&(o-=5),o}function dt(e={}){const t=[e.query,e.searchInput?.brands,e.searchInput?.categories,e.searchInput?.features,e.searchInput?.keywords,e.intent?.brands,e.intent?.categories,e.intent?.keywords];return[...new Set(t.flatMap(to))]}function mt(e){return e.price!=null||e.price_discounted!=null||e.priceText!=null}function yt(e){return!!(e.image||e.imageUrl||Array.isArray(e.images)&&e.images[0])}function pt(e){return!!(e.category||e.category_names||e.features||e.specs||e.facet_hits)}function ye(e){return k([e.name,e.title,e.brand,e.category,e.category_names,e.features,e.specs,e.facet_hits].flatMap(G).join(" "))}function gt(e){return k(typeof e=="string"?e:e==null?"":String(e))}function to(e){return G(e).join(" ").split(/\s+/u).map(gt).filter(t=>t.length>1)}function G(e){return Array.isArray(e)?e.flatMap(G):e&&typeof e=="object"?Object.values(e).flatMap(G):e==null?[]:[String(e)]}function W(e){if(!Array.isArray(e))return[];const t=new Set,r=[];for(const n of e){if(!n||typeof n!="object"||Array.isArray(n))continue;const o=n,i=String(o.sku||o.url||o.name||"");!i||t.has(i)||(t.add(i),r.push(o))}return r}function ro(e,t){const r=W(e);if(!t||typeof t!="object"||Array.isArray(t))return r;const n=Object.values(t).flatMap(o=>Array.isArray(o)?o:[o]).map(o=>String(o||"").trim().toLocaleLowerCase()).filter(Boolean);return n.length?r.filter(o=>{const i=ye(o);return n.some(a=>i.includes(a))}):r}function no(e,t,r=8){const n=W(e),o=W(t),i=new Set(o.map(a=>String(a.sku||a.url||a.name||"")));return n.map((a,c)=>({product:a,index:c,score:ht(a,i)})).sort((a,c)=>c.score-a.score||a.index-c.index).map(({product:a})=>a).slice(0,r)}function ht(e,t){const r=String(e.sku||e.url||e.name||"");return t.has(r)?10:0}function wt(e,t={}){const r=e.sku,n=t.labels||{};return[t.includeCompare!==!1&&r?Q(n.compare||"Compare",{type:"compare",payload:{skus:[r]}}):null,t.includeSpecs!==!1&&r?Q(n.specs||"Specs",{type:"productQuestion",payload:{sku:r,text:n.specs||"Specs"}}):null,t.includeSimilar!==!1&&r?Q(n.similar||"Similar",{type:"findSimilar",payload:{sku:r}}):null].filter(o=>!!o)}function oo(e,t={}){return Array.isArray(e)?e.flatMap(r=>r&&typeof r=="object"&&!Array.isArray(r)?wt(r,t):[]):[]}function Q(e,t){return{label:pe(e),requestDetails:t}}function io(e,t=4){return Array.isArray(e)?e.map(r=>r&&typeof r=="object"&&!Array.isArray(r)?r:null).filter(r=>!!r).map(r=>({...r,label:pe(r.label)})).filter(r=>r.label).slice(0,t):[]}function pe(e,t=48){const r=typeof e=="string"?e.trim().replace(/\s+/gu," "):"";return r.length>t?`${r.slice(0,t-1).trim()}...`:r}function ao(e={}){return e.steps?[...e.steps]:V("intent","intent",e)}function co(e={}){return e.steps?[...e.steps]:[At("search","products",e),...e.emitProducts===!1?[]:[kt(e.out||"products")],...$(e)]}function bt(e={}){if(e.steps)return[...e.steps];const t=e.out||"answer";return[...V("product-answer","answer",e),...e.emitProductDetails?[po("product")]:[],...$(e,t)]}function so(e={}){return bt(e)}function uo(e={}){if(e.steps)return[...e.steps];const t=e.out||"comparison";return[...V("compare","comparison",e),...e.emitComparison===!1?[]:[_t(t)],...$(e,t)]}function lo(e={}){return e.steps?[...e.steps]:[At("search","products",e)]}function fo(e={}){return St(e)}function St(e={}){return e.steps?[...e.steps]:[_t(e.out||"comparison"),...$(e,"comparison")]}function mo(e={}){return e.steps?[...e.steps]:[kt(e.out||"products"),...$(e,"products")]}function yo(e={}){return e.steps?[...e.steps]:[...V("suggested-actions","suggestedActions",e),...e.emitActions===!1?[]:[go(e.out||"suggestedActions")]]}function V(e,t,r){return[{kind:"be_op",op:r.beOpName||e,input:r.input??(()=>({})),...r.cacheTtlS!==void 0?{cacheTtlS:r.cacheTtlS}:{},...r.cacheKey!==void 0?{cacheKey:r.cacheKey}:{},...r.browserCache!==void 0?{browserCache:r.browserCache}:{},...r.errorOut?{errorOut:r.errorOut}:{},...r.onError?{onError:r.onError}:{},...r.patch?{patch:r.patch}:{},out:r.out||t}]}function At(e,t,r){return{kind:"tool",name:r.toolName||e,input:r.input??(()=>({})),...r.errorOut?{errorOut:r.errorOut}:{},...r.onError?{onError:r.onError}:{},...r.patch?{patch:r.patch}:{},out:r.out||t}}function kt(e){return{kind:"emit",build:({bag:t})=>B(ot(wo(t[e])))}}function po(e){return{kind:"emit",build:({bag:t})=>B(it(t[e]))}}function _t(e){return{kind:"emit",build:({bag:t})=>B(at(t[e]))}}function go(e){return{kind:"emit",build:({bag:t})=>B(ct(bo(t[e])))}}function $(e,t){return!e.emitText&&!t?[]:[{kind:"emit",build:r=>te(ho(e.emitText,r,t),!0)}]}function ho(e,t,r){if(typeof e=="function")return e(t);if(typeof e=="string")return e;const n=r?t.bag[r]:void 0;return String(n?.answer_html||n?.plain_text||n?.summary||"")}function wo(e){return Array.isArray(e)?e:e&&typeof e=="object"&&Array.isArray(e.products)?e.products:[]}function bo(e){if(Array.isArray(e))return e;if(e&&typeof e=="object"){const t=e;if(Array.isArray(t.actions))return t.actions;if(Array.isArray(t.buttons))return t.buttons}return[]}function Et(e,t,r="v1"){return`endpoint:${r}:${R({endpoint:e,request:t})}`}function So(e){const t=e.version||"v1",r=n=>o=>({partition:`${e.partitionPrefix}/${n}`,key:Et(n,o,t),...e.ttlMs?{ttlMs:e.ttlMs}:{}});return{launcher_action:r("launcher_action"),similar_products:r("similar_products"),product_groupings:r("product_groupings")}}function Ao(e){return{...e}}function ko(e,t={}){return new Response(e.map(r=>JSON.stringify(r)).join(`
6
+ `)+`
7
+ `,{...t,headers:{"content-type":"application/x-ndjson",...t.headers||{}}})}function _o(e,t={}){return new Response(JSON.stringify(e),{...t,headers:{"content-type":"application/json",...t.headers||{}}})}function Eo(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 To(e,t){const r=Eo(e);r?.style&&(t?r.style.removeProperty("display"):r.style.setProperty("display","none","important")),t||(e?.chat||e?._chat)?.close?.()}var Po="nd_be_url";function jo(e,t){const r=xo()||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 xo(){try{const e=new URLSearchParams(window.location.search).get(Po)?.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 Tt(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:""}var Pt=[{pattern:/\bhttps?:\/\/[^\s?#]+(?:\?[^\s#]*)?/giu,replacement:Oo},{pattern:/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/giu,replacement:"[email]"},{pattern:/\b(?:\+?\d[\d\s().-]{7,}\d)\b/gu,replacement:"[phone]"},{pattern:/\b(?:token|secret|csrf|cookie|bearer|session|sid|cart(?:[_-]?id)?)\s*[:=]\s*[^\s,;&]+/giu,replacement:"[secret]"},{pattern:/\b(?:order|cart|session)[_-]?(?:id|no|number)?\s*[:#=]?\s*[A-Z0-9-]{6,}\b/giu,replacement:"[secret]"}],ge={patterns:Pt};function jt(e,t=ge){let r=typeof e=="string"?e:e==null?"":String(e);for(const n of t.patterns||[]){const o=n.replacement;r=typeof o=="function"?r.replace(n.pattern,i=>o(i)):r.replace(n.pattern,o)}return r}function Co(e,t=ge){return jt(Tt(e),t)}function Oo(e){try{const t=new URL(e);return`${t.origin}${t.pathname}${t.search?"?[query]":""}`}catch{return"[url]"}}var Io=["assistantName","homeDomain","categories","policyTopics"],Ro={intent:["searchContract","competitorBrands"]};function Mo(e,t,r,n={}){const o=xt(t,r,n);return Object.keys(o).length?{...e,account_config:o}:e}function xt(e,t,r={}){if(!e)return{};const n={},o=r.baseKeys||Io;for(const c of o)Ct(n,e,c);const i=e[t];i&&typeof i=="object"&&!Array.isArray(i)&&Object.assign(n,Uo(i));const a=r.opAllowlist||Ro;for(const c of a[t]||[])Ct(n,e,c);return n}function Ct(e,t,r){t[r]!==void 0&&(e[r]=t[r])}function Uo(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var Bo=["addToCart","search","searchKeyword","facetedSearch","searchGiftOptions","similaritySearch"];function Lo(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||Bo){const c=t[a];typeof c=="function"&&(i[a]=i[a]||c)}return t}function No({getPageType:e,getProduct:t}){return()=>({url:window.location.href,title:document.title,pageType:e(),product:t()})}function Do({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 vo({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 u=a.GengageInjectorConfig||{},l=u[e]||{};return{...u,...l}},y=()=>{const u=c();if(u.runtimeUrl)return u.runtimeUrl;const l=u.assetBaseUrl||u.baseUrl||document.currentScript?.getAttribute("src")||(n?a[n]:null);if(!l)throw new Error(`${i} runtime URL cannot be resolved.`);return new URL(t,l).href},m=a.GengageAssistantInjector||(a.GengageAssistantInjector={}),d=m[e]||(m[e]={});return d.loaderPromise||(d.loaderPromise=import(y()).then(u=>{const l=u[r];if(typeof l!="function")throw new Error(`${i} runtime export ${r} is unavailable.`);return l()}).catch(u=>{throw delete d.loaderPromise,console.error(`[Gengage][${e}] runtime load failed`,u),u})),d.loaderPromise}s.AgentError=F,s.ContextStore=ke,s.action=Ar,s.actionButtonsUiSpec=ct,s.actionCandidatePayload=Q,s.alignProductsToTable=nt,s.anonymousRequestText=Co,s.beErrorToAgentError=X,s.buildPhotoSimilarityProfile=Fn,s.buildProductSimilarityProfile=v,s.buildSimilarityQueries=qn,s.canUseModuleWorker=de,s.caughtToStreamError=xe,s.compactAccountConfig=xt,s.compactContextProducts=In,s.compareCachedResultSteps=fo,s.compareResultSteps=St,s.compareSearchSteps=lo,s.compareSteps=uo,s.comparisonResultForUi=Ln,s.comparisonUiSpec=at,s.createBrowserMemory=fe,s.createDiagnosticsTool=Do,s.createEndpointCachePolicies=So,s.createEndpointHandlers=Ao,s.createFlow=Dn,s.createInjectorAdapter=Ne,s.createMainThreadInjectorAdapter=De,s.createModuleWorker=rt,s.createReadPageTool=No,s.defaultPiiPatternPack=ge,s.defaultPiiPatterns=Pt,s.done=re,s.elapsedMs=O,s.endpointStableKey=Et,s.error=Me,s.hasProductImage=yt,s.hasUsablePrice=mt,s.hasVisibleShoppingFacts=pt,s.httpErrorToAgentError=je,s.installBrowserTools=Lo,s.installFetchTransportBridge=ln,s.intentQuestionSteps=ao,s.jsonResponse=_o,s.llmCacheKey=Gr,s.metadata=Sr,s.mountAccount=On,s.ndjsonResponse=ko,s.normalizeActionLabel=pe,s.normalizeComparisonTable=me,s.normalizeProduct=z,s.normalizeQueryText=gt,s.normalizeSimilarityText=k,s.normalizeSuggestedActions=io,s.nowIso=be,s.panelProductScore=ht,s.panelQuestionSteps=so,s.prioritizePanelProducts=no,s.productActions=wt,s.productDetailsUiSpec=it,s.productFactsKey=Qr,s.productPanelActions=oo,s.productQuestionSteps=bt,s.productRankScore=ft,s.productSearchText=ye,s.productSkuKey=Wr,s.productsMatchingParams=ro,s.productsUiSpec=ot,s.rankSimilarProducts=zn,s.rankedSearchProducts=eo,s.rankingTokens=dt,s.redactPii=jt,s.requestText=Tt,s.resolveBeUrl=jo,s.resolveFlow=Ue,s.scoreSimilarityCandidate=ut,s.searchResultSteps=mo,s.searchSteps=co,s.setAssistantHostVisible=To,s.stableKey=R,s.startLazyRuntimeLoader=vo,s.suggestedActionSteps=yo,s.textChunk=te,s.textKey=Vr,s.tokenizeSimilarityText=_,s.trimProductFactsCore=K,s.trimProductFactsListCore=Hr,s.uiSpec=B,s.uniqueProducts=W,s.withAccountConfig=Mo})(this.Gengage=this.Gengage||{});
@@ -1,4 +1,4 @@
1
- import { i as U } from "./widget-base-DRaUfd-H.js";
1
+ import { i as U } from "./widget-base-CIJT5AiP.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");
@@ -17,6 +17,15 @@
17
17
  * },
18
18
  * }
19
19
  */
20
+ export interface InlineLauncherMobileHostOptions {
21
+ /** Host element for the inline row on compact viewports. */
22
+ hostSelector: string;
23
+ /** Sibling co-located in the row (e.g. mobile search trigger). */
24
+ siblingSelector?: string;
25
+ siblingPlacement?: 'before' | 'after';
26
+ siblingRestoreParentSelector?: string;
27
+ rowPlacement?: 'start' | 'end';
28
+ }
20
29
  export interface InlineLauncherSizeOptions {
21
30
  /** Gap between sibling search and launcher button in the row. */
22
31
  rowGap?: string;
@@ -105,6 +114,11 @@ export interface InlineLauncherOptions {
105
114
  debounceMs?: number;
106
115
  /** Stable id for the launcher button. Default: 'gengage-inline-launcher'. */
107
116
  buttonId?: string;
117
+ /**
118
+ * Optional DOM targets for compact viewports when `enableOnMobile` is true
119
+ * and width is below `desktopMinWidth`. Falls back to desktop selectors when omitted.
120
+ */
121
+ mobileHost?: InlineLauncherMobileHostOptions;
108
122
  /**
109
123
  * Optional size overrides. Desktop values apply by default; `size.mobile`
110
124
  * applies below the compact breakpoint (`desktopMinWidth` when `enableOnMobile`, else 576px).
@@ -113,6 +127,7 @@ export interface InlineLauncherOptions {
113
127
  mobile?: InlineLauncherSizeOptions & {
114
128
  hideTitle?: boolean;
115
129
  hideSpark?: boolean;
130
+ hideLogo?: boolean;
116
131
  };
117
132
  };
118
133
  }
@@ -4,5 +4,5 @@ export type { ChatCatalog, ChatComponentName } from './catalog.js';
4
4
  export { createFloatingLauncher } from './components/FloatingLauncher.js';
5
5
  export type { FloatingLauncherOptions } from './components/FloatingLauncher.js';
6
6
  export { createInlineLauncher } from './components/InlineLauncher.js';
7
- export type { InlineLauncherOptions, InlineLauncherSizeOptions } from './components/InlineLauncher.js';
7
+ export type { InlineLauncherOptions, InlineLauncherSizeOptions, InlineLauncherMobileHostOptions, } from './components/InlineLauncher.js';
8
8
  export type { ActionEnrichmentContext, BackendRequestMeta, InjectorAdapter, ProcessActionRequest, StreamCallbacks, } from '../common/transport.js';
@@ -1,4 +1,4 @@
1
- import { c as e, d as t, f as r, i as s, l as n, n as i, r as l, s as C, t as c, u as d } from "./runtime-Bt2VV3L3.js";
1
+ import { c as e, d as t, f as r, i as s, l as n, n as i, r as l, s as C, t as c, u as d } from "./runtime-CbWCU424.js";
2
2
  export {
3
3
  d as CHAT_SCROLL_ELEMENT_ID,
4
4
  s as ChatPresentationState,
@@ -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-Cq2blsO_.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-BnYUhYSy.js";
2
2
  var h = a({
3
3
  role: s(["user", "assistant"]),
4
4
  content: o(),