@gengage/assistant-fe 0.6.17 → 0.6.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account-config-D_EMuR0g.js +1479 -0
- package/dist/agentic/context/context-store.d.ts +2 -1
- package/dist/agentic/events/comparison.d.ts +6 -0
- package/dist/agentic/events/context-products.d.ts +6 -0
- package/dist/agentic/index.d.ts +7 -0
- package/dist/agentic/index.js +245 -188
- package/dist/agentic/types.d.ts +6 -1
- package/dist/agentic/util/account-config.d.ts +8 -0
- package/dist/agentic/util/privacy.d.ts +12 -0
- package/dist/agentic/widgets/endpoints.d.ts +12 -0
- package/dist/agentic/worker.d.ts +6 -0
- package/dist/agentic/worker.js +80 -69
- package/dist/agentic.iife.js +7 -5
- package/dist/{api-paths-xsHH9jtm.js → api-paths-lIioK7-S.js} +1 -1
- package/dist/chat/components/InlineLauncher.d.ts +1 -1
- package/dist/chat-runtime.js +1 -1
- package/dist/{chat-BP-yXukW.js → chat-rvSffJXw.js} +1 -1
- package/dist/chat.iife.js +11 -11
- package/dist/chat.js +2 -2
- package/dist/{common-O0BUdXOn.js → common-8WOyaL9-.js} +3 -3
- package/dist/common.js +8 -8
- package/dist/{connection-warning-DWMfjv0Y.js → connection-warning-CBR0CWsY.js} +1 -1
- package/dist/{fastIntent-RTSVRJhw.js → fastIntent-Dw79pmRK.js} +2 -2
- package/dist/index.js +13 -13
- package/dist/{native-webview-U9HtGabb.js → native-webview-NWc9LrJh.js} +1 -1
- package/dist/native.iife.js +2 -2
- package/dist/native.js +1 -1
- package/dist/{overlay-ClYgI2Kl.js → overlay-COzFFq0-.js} +1 -1
- package/dist/overlay.js +2 -2
- package/dist/{qna-B3lMzHvS.js → qna-DUs97irI.js} +1 -1
- package/dist/qna-runtime.js +1 -1
- package/dist/qna.iife.js +1 -1
- package/dist/qna.js +2 -2
- package/dist/{runtime-COh3CwNU.js → runtime-BsnZ6gt2.js} +8 -8
- package/dist/{runtime-n7fEJGDt.js → runtime-D5Sj-_tA.js} +6 -6
- package/dist/{runtime-BKU-NQXf.js → runtime-w0f2VkzL.js} +116 -116
- package/dist/{simbut-DaFCfvp7.js → simbut-BvdJtzCu.js} +3 -3
- package/dist/simbut.iife.js +1 -1
- package/dist/simbut.js +1 -1
- package/dist/{simrel-CX1JBDa5.js → simrel-DU6a27g9.js} +4 -4
- package/dist/simrel-runtime.js +1 -1
- package/dist/simrel.iife.js +2 -2
- package/dist/simrel.js +2 -2
- package/dist/{widget-base-DoZrhVze.js → widget-base-BeWuIxD6.js} +2 -2
- package/package.json +4 -2
- package/dist/request-text-DThlE-Xd.js +0 -1318
- /package/dist/{context-BBuSsXZ9.js → context-heG8hv5l.js} +0 -0
- /package/dist/{locale-CfqNifrU.js → locale-uQ5XZ2yS.js} +0 -0
- /package/dist/{price-formatter-CFsWT0lP.js → price-formatter-CHUmYq8I.js} +0 -0
- /package/dist/{request-response-cache-zsgz3Awp.js → request-response-cache-BxRsKGJ0.js} +0 -0
- /package/dist/{schemas-Cq2blsO_.js → schemas-BnYUhYSy.js} +0 -0
package/dist/agentic/types.d.ts
CHANGED
|
@@ -81,6 +81,10 @@ export interface EmitStep {
|
|
|
81
81
|
kind: 'emit';
|
|
82
82
|
build: (ctx: FlowStepCtx) => StreamEvent;
|
|
83
83
|
}
|
|
84
|
+
export interface PatchStep {
|
|
85
|
+
kind: 'patch';
|
|
86
|
+
patch: FlowPatch;
|
|
87
|
+
}
|
|
84
88
|
export interface BranchStep {
|
|
85
89
|
kind: 'branch';
|
|
86
90
|
on: FlowValue<string | undefined>;
|
|
@@ -102,7 +106,7 @@ export interface RefusalStep {
|
|
|
102
106
|
export interface CommitStep {
|
|
103
107
|
kind: 'commit';
|
|
104
108
|
}
|
|
105
|
-
export type FlowStep = BeOpStep | ToolStep | AdapterStep | EmitStep | BranchStep | ParallelStep | RefusalStep | CommitStep;
|
|
109
|
+
export type FlowStep = BeOpStep | ToolStep | AdapterStep | EmitStep | PatchStep | BranchStep | ParallelStep | RefusalStep | CommitStep;
|
|
106
110
|
export type Flow = readonly FlowStep[];
|
|
107
111
|
export type ToolFn = (input: unknown) => unknown | Promise<unknown>;
|
|
108
112
|
export type ToolMap = Record<string, ToolFn>;
|
|
@@ -115,6 +119,7 @@ export interface AccountModule {
|
|
|
115
119
|
accountConfig?: Record<string, unknown>;
|
|
116
120
|
contextPersistence?: {
|
|
117
121
|
panelKeys?: readonly string[];
|
|
122
|
+
panelKeyLimits?: Record<string, number>;
|
|
118
123
|
};
|
|
119
124
|
}
|
|
120
125
|
export interface AgentOpBeacon {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface AccountConfigPayloadOptions {
|
|
2
|
+
baseKeys?: readonly string[];
|
|
3
|
+
opAllowlist?: Readonly<Record<string, readonly string[]>>;
|
|
4
|
+
}
|
|
5
|
+
export declare function withAccountConfig<T extends Record<string, unknown>>(payload: T, accountConfig: Record<string, unknown> | null | undefined, opName: string, options?: AccountConfigPayloadOptions): T & {
|
|
6
|
+
account_config?: Record<string, unknown>;
|
|
7
|
+
};
|
|
8
|
+
export declare function compactAccountConfig(accountConfig: Record<string, unknown> | null | undefined, opName: string, options?: AccountConfigPayloadOptions): Record<string, unknown>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ProcessActionRequest } from '../../common/transport.js';
|
|
2
|
+
export interface RedactionPattern {
|
|
3
|
+
pattern: RegExp;
|
|
4
|
+
replacement: string | ((value: string) => string);
|
|
5
|
+
}
|
|
6
|
+
export interface RedactionPatternPack {
|
|
7
|
+
patterns?: readonly RedactionPattern[];
|
|
8
|
+
}
|
|
9
|
+
export declare const defaultPiiPatterns: readonly RedactionPattern[];
|
|
10
|
+
export declare const defaultPiiPatternPack: RedactionPatternPack;
|
|
11
|
+
export declare function redactPii(value: unknown, patternPack?: RedactionPatternPack): string;
|
|
12
|
+
export declare function anonymousRequestText(request: ProcessActionRequest | null | undefined, patternPack?: RedactionPatternPack): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { InjectorBridgeEndpoint, InjectorEndpointHandler } from '../../common/transport.js';
|
|
2
|
+
import type { EndpointCachePolicyResolver } from '../adaptor/fetch-bridge.js';
|
|
3
|
+
export interface EndpointCachePolicyOptions {
|
|
4
|
+
partitionPrefix: string;
|
|
5
|
+
version?: string;
|
|
6
|
+
ttlMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function endpointStableKey(endpoint: InjectorBridgeEndpoint, request: unknown, version?: string): string;
|
|
9
|
+
export declare function createEndpointCachePolicies(options: EndpointCachePolicyOptions): Partial<Record<InjectorBridgeEndpoint, EndpointCachePolicyResolver>>;
|
|
10
|
+
export declare function createEndpointHandlers(handlers: Partial<Record<InjectorBridgeEndpoint, InjectorEndpointHandler>>): Partial<Record<InjectorBridgeEndpoint, InjectorEndpointHandler>>;
|
|
11
|
+
export declare function ndjsonResponse(lines: unknown[], init?: ResponseInit): Response;
|
|
12
|
+
export declare function jsonResponse(value: unknown, init?: ResponseInit): Response;
|
package/dist/agentic/worker.d.ts
CHANGED
|
@@ -2,13 +2,19 @@ export { ContextStore } from './context/context-store.js';
|
|
|
2
2
|
export { action, done, error, metadata, textChunk, uiSpec } from './events/builders.js';
|
|
3
3
|
export { AgentError, beErrorToAgentError, caughtToStreamError, httpErrorToAgentError, } from './events/error-taxonomy.js';
|
|
4
4
|
export { normalizeProduct, trimProductFactsCore, trimProductFactsListCore } from './events/product-normalize.js';
|
|
5
|
+
export { compactContextProducts } from './events/context-products.js';
|
|
6
|
+
export { alignProductsToTable, comparisonResultForUi, normalizeComparisonTable } from './events/comparison.js';
|
|
5
7
|
export { actionButtonsUiSpec, comparisonUiSpec, productDetailsUiSpec, productsUiSpec } from './events/ui-specs.js';
|
|
6
8
|
export { createFlow } from './flow/create-flow.js';
|
|
7
9
|
export { resolveFlow } from './flow/dispatch.js';
|
|
8
10
|
export { buildPhotoSimilarityProfile, buildProductSimilarityProfile, buildSimilarityQueries, normalizeSimilarityText, rankSimilarProducts, scoreSimilarityCandidate, tokenizeSimilarityText, type PhotoSimilaritySignals, type ProductSimilarityProfile, type SimilarityProductLike, type SimilarityRankedProduct, type SimilarityRankingOptions, type SimilarityScore, type SimilarityWeights, } from './similarity.js';
|
|
9
11
|
export { requestText } from './util/request-text.js';
|
|
12
|
+
export { anonymousRequestText, defaultPiiPatternPack, defaultPiiPatterns, redactPii } from './util/privacy.js';
|
|
13
|
+
export { compactAccountConfig, withAccountConfig } from './util/account-config.js';
|
|
10
14
|
export { llmCacheKey, productFactsKey, productSkuKey, stableKey, textKey } from './util/cache-key.js';
|
|
11
15
|
export type { LlmCacheKeyOptions, ProductFactsKeyOptions, ProductKeyOptions } from './util/cache-key.js';
|
|
16
|
+
export type { RedactionPattern, RedactionPatternPack } from './util/privacy.js';
|
|
17
|
+
export type { AccountConfigPayloadOptions } from './util/account-config.js';
|
|
12
18
|
export { elapsedMs, nowIso } from './util/time.js';
|
|
13
19
|
export { invokeBeOp } from './worker/be-client.js';
|
|
14
20
|
export { startWorker } from './worker/entry.js';
|
package/dist/agentic/worker.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
function
|
|
3
|
-
const
|
|
4
|
-
let t = null, u = null,
|
|
5
|
-
|
|
1
|
+
import { $ as E, A as J, B as g, C as F, D as L, E as R, F as j, G as q, H as z, I as m, J as x, K as B, L as M, M as C, N as I, O as D, P as W, Q as G, R as O, S as Q, T as H, U as N, V as T, W as K, X as V, Y as X, Z as h, _ as Y, a as Z, b as _, c as $, d as ee, f as te, g as re, h as oe, i as ae, j as ne, k as ie, l as ce, m as se, n as le, o as de, p as ue, q as pe, r as ke, s as ye, t as Pe, u as fe, v as Se, w as be, x as ve, y as Ue, z as we } from "../account-config-D_EMuR0g.js";
|
|
2
|
+
function me(a) {
|
|
3
|
+
const n = self, i = /* @__PURE__ */ new Map(), c = h(n), y = C(c);
|
|
4
|
+
let t = null, u = null, s = null, p = "";
|
|
5
|
+
n.addEventListener("message", (e) => {
|
|
6
6
|
const r = e.data;
|
|
7
7
|
if (r) {
|
|
8
8
|
if (r.type === "abort") {
|
|
9
9
|
typeof r.id == "number" && (i.get(r.id)?.abort(), i.delete(r.id));
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
|
-
r.type === "invoke" &&
|
|
12
|
+
r.type === "invoke" && P(r);
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
|
-
async function
|
|
15
|
+
async function P(e) {
|
|
16
16
|
t = {
|
|
17
|
-
accountId: String(e.accountId ||
|
|
17
|
+
accountId: String(e.accountId || a.accountId || ""),
|
|
18
18
|
beUrl: e.beUrl || "",
|
|
19
19
|
...e.devJwtSecret ? { devJwtSecret: e.devJwtSecret } : {},
|
|
20
20
|
...e.tokenBrokerUrl ? { tokenBrokerUrl: e.tokenBrokerUrl } : {},
|
|
21
21
|
...e.tokenBrokerAudience ? { tokenBrokerAudience: e.tokenBrokerAudience } : {},
|
|
22
|
-
locale: e.defaultLocale ||
|
|
22
|
+
locale: e.defaultLocale || a.defaultLocale || "en-GB",
|
|
23
23
|
parentUrl: e.parentUrl || ""
|
|
24
24
|
};
|
|
25
25
|
const r = [
|
|
@@ -29,55 +29,56 @@ function pe(n) {
|
|
|
29
29
|
t.tokenBrokerAudience || ""
|
|
30
30
|
].join(`
|
|
31
31
|
`);
|
|
32
|
-
(!
|
|
32
|
+
(!s || p !== r) && (s = B(t), p = r), u ||= new x({
|
|
33
33
|
accountId: t.accountId,
|
|
34
34
|
locale: t.locale,
|
|
35
35
|
parentUrl: t.parentUrl,
|
|
36
36
|
rpc: c,
|
|
37
|
-
persistentPanelKeys:
|
|
37
|
+
persistentPanelKeys: a.contextPersistence?.panelKeys,
|
|
38
|
+
panelKeyLimits: a.contextPersistence?.panelKeyLimits
|
|
38
39
|
});
|
|
39
|
-
const
|
|
40
|
-
i.set(e.id,
|
|
40
|
+
const l = new AbortController();
|
|
41
|
+
i.set(e.id, l);
|
|
41
42
|
const d = (o) => {
|
|
42
|
-
|
|
43
|
+
n.postMessage({
|
|
43
44
|
id: e.id,
|
|
44
45
|
type: "event",
|
|
45
46
|
event: o
|
|
46
47
|
});
|
|
47
48
|
};
|
|
48
49
|
try {
|
|
49
|
-
const o = t,
|
|
50
|
-
await
|
|
50
|
+
const o = t, f = s;
|
|
51
|
+
await I({
|
|
51
52
|
request: e.request || {},
|
|
52
53
|
accountModule: {
|
|
53
|
-
...
|
|
54
|
+
...a,
|
|
54
55
|
accountId: o.accountId
|
|
55
56
|
},
|
|
56
57
|
contextStore: u,
|
|
57
|
-
beClient: { invoke({ op:
|
|
58
|
+
beClient: { invoke({ op: S, input: b, signal: k, cacheTtlS: v, cacheKey: U, browserCache: w }) {
|
|
58
59
|
return T({
|
|
59
60
|
beUrl: o.beUrl,
|
|
60
61
|
accountId: o.accountId,
|
|
61
|
-
jwtProvider:
|
|
62
|
+
jwtProvider: f,
|
|
62
63
|
parentUrl: o.parentUrl,
|
|
63
|
-
op:
|
|
64
|
-
input:
|
|
65
|
-
cacheTtlS:
|
|
66
|
-
cacheKey:
|
|
67
|
-
browserCache:
|
|
64
|
+
op: S,
|
|
65
|
+
input: b,
|
|
66
|
+
cacheTtlS: v,
|
|
67
|
+
cacheKey: U,
|
|
68
|
+
browserCache: w,
|
|
68
69
|
...k ? { signal: k } : {}
|
|
69
70
|
});
|
|
70
71
|
} },
|
|
71
72
|
toolBridge: y,
|
|
72
73
|
emit: d,
|
|
73
74
|
rpc: c,
|
|
74
|
-
signal:
|
|
75
|
-
}),
|
|
75
|
+
signal: l.signal
|
|
76
|
+
}), n.postMessage({
|
|
76
77
|
id: e.id,
|
|
77
78
|
type: "end"
|
|
78
79
|
});
|
|
79
80
|
} catch (o) {
|
|
80
|
-
|
|
81
|
+
l.signal.aborted || (d(K(o)), d(m()), n.postMessage({
|
|
81
82
|
id: e.id,
|
|
82
83
|
type: "end"
|
|
83
84
|
}));
|
|
@@ -87,48 +88,58 @@ function pe(n) {
|
|
|
87
88
|
}
|
|
88
89
|
}
|
|
89
90
|
export {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
91
|
+
z as AgentError,
|
|
92
|
+
x as ContextStore,
|
|
93
|
+
j as action,
|
|
94
|
+
re as actionButtonsUiSpec,
|
|
95
|
+
_ as alignProductsToTable,
|
|
96
|
+
ke as anonymousRequestText,
|
|
97
|
+
N as beErrorToAgentError,
|
|
98
|
+
$ as buildPhotoSimilarityProfile,
|
|
99
|
+
ce as buildProductSimilarityProfile,
|
|
100
|
+
fe as buildSimilarityQueries,
|
|
101
|
+
K as caughtToStreamError,
|
|
102
|
+
Pe as compactAccountConfig,
|
|
103
|
+
F as compactContextProducts,
|
|
104
|
+
ve as comparisonResultForUi,
|
|
105
|
+
Y as comparisonUiSpec,
|
|
106
|
+
oe as createFlow,
|
|
107
|
+
B as createJwtProvider,
|
|
108
|
+
C as createToolBridge,
|
|
109
|
+
h as createWorkerRpc,
|
|
110
|
+
ae as defaultPiiPatternPack,
|
|
111
|
+
Z as defaultPiiPatterns,
|
|
112
|
+
m as done,
|
|
113
|
+
X as elapsedMs,
|
|
114
|
+
M as error,
|
|
115
|
+
G as handleMainRpc,
|
|
116
|
+
q as httpErrorToAgentError,
|
|
109
117
|
T as invokeBeOp,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
be as llmCacheKey,
|
|
119
|
+
O as metadata,
|
|
120
|
+
pe as mintDevJwt,
|
|
121
|
+
Q as normalizeComparisonTable,
|
|
122
|
+
ie as normalizeProduct,
|
|
123
|
+
ee as normalizeSimilarityText,
|
|
124
|
+
V as nowIso,
|
|
125
|
+
Se as productDetailsUiSpec,
|
|
126
|
+
H as productFactsKey,
|
|
127
|
+
R as productSkuKey,
|
|
128
|
+
Ue as productsUiSpec,
|
|
120
129
|
te as rankSimilarProducts,
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
130
|
+
de as redactPii,
|
|
131
|
+
ye as requestText,
|
|
132
|
+
W as resolveFlow,
|
|
133
|
+
E as runMainRpc,
|
|
134
|
+
I as runTurn,
|
|
135
|
+
ue as scoreSimilarityCandidate,
|
|
136
|
+
L as stableKey,
|
|
137
|
+
me as startWorker,
|
|
138
|
+
we as textChunk,
|
|
139
|
+
D as textKey,
|
|
140
|
+
se as tokenizeSimilarityText,
|
|
141
|
+
J as trimProductFactsCore,
|
|
142
|
+
ne as trimProductFactsListCore,
|
|
143
|
+
g as uiSpec,
|
|
144
|
+
le as withAccountConfig
|
|
134
145
|
};
|
package/dist/agentic.iife.js
CHANGED
|
@@ -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
|
|
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?.(),
|
|
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(f){Object.defineProperty(f,Symbol.toStringTag,{value:"Module"});function at(e){return!!e&&typeof e=="object"&&e.type==="rpc.req"}function ct({worker:e,tools:t={},beacon:n,memory:r=sessionStorage}){e.addEventListener("message",o=>{const i=o.data;at(i)&&st(e,i,{tools:t,beacon:n,memory:r})})}async function st(e,t,n){try{const r=await ue(t.method,t.payload,n);e.postMessage({type:"rpc.result",rpcId:t.rpcId,ok:!0,value:r})}catch(r){e.postMessage({type:"rpc.result",rpcId:t.rpcId,ok:!1,error:{message:r instanceof Error?r.message:String(r)}})}}function ut(e){if(e&&typeof e=="object"&&typeof e.name=="string")return e;throw new Error("tool.invoke requires { name, input }")}function lt(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.get requires { key }")}function dt(e){if(e&&typeof e=="object"&&e.key!==void 0)return e;throw new Error("memory.set requires { key }")}async function ue(e,t,{tools:n,beacon:r,memory:o}){if(e==="tool.invoke"){const{name:i,input:a}=ut(t),c=n[i];if(typeof c!="function")throw new Error(`Unknown tool: ${i}`);return c(a)}if(e==="beacon.send")return r?.(t),{sent:!0};if(e==="memory.get"){const{key:i}=lt(t),a=o.getItem(String(i));return a?JSON.parse(a):null}if(e==="memory.set"){const{key:i,value:a}=dt(t);return o.setItem(String(i),JSON.stringify(a??null)),{ok:!0}}throw new Error(`Unknown RPC method: ${e}`)}function le(){return new Date().toISOString()}function I(e){return Math.max(0,Math.round(performance.now()-e))}function M(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ft(e){const{accountId:t,locale:n="en-GB",parentUrl:r="",threadId:o,incomingContext:i}=e,a=M(i)?i:{},c=M(a.thread)?a.thread:{},y=M(a.panel)?a.panel:{},m=M(a.meta)?a.meta:{},d=de(a.messages),s={id:String(o||c.id||self.crypto.randomUUID()),started_at:String(c.started_at||le()),extensions:M(c.extensions)?{...c.extensions}:{}},u=String(m.locale||n),l=String(m.parentUrl||r||typeof self<"u"&&self.location?.href||"");return{panel:{...y},messages:d,thread:s,meta:{locale:u,parentUrl:l,accountId:t}}}function mt(e,t){const n=de([t])[0];return n?{...e,messages:[...e.messages,n].slice(-50)}:e}function de(e){return Array.isArray(e)?e.map(t=>{const n=t?.role;return{role:n==="model"?"assistant":typeof n=="string"?n:"",content:String(t?.content||"")}}).filter(t=>(t.role==="user"||t.role==="assistant")&&!!t.content).slice(-50):[]}var yt="gengage:agent:context:";async function pt({accountId:e,threadId:t,rpc:n}){const r=await n("memory.get",{tier:"session",key:fe(e,t)});return r&&typeof r=="object"&&!Array.isArray(r)?r:{}}async function gt({accountId:e,threadId:t,extensions:n,panel:r,rpc:o}){await o("memory.set",{tier:"session",key:fe(e,t),value:{thread:{extensions:n},...r&&Object.keys(r).length>0?{panel:r}:{}}})}function fe(e,t){return`${yt}${e}:${t}`}function b(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var me=class{#e=new Map;#t;#r;#o;#n;#i;#a;constructor({accountId:e,locale:t,parentUrl:n,rpc:r,persistentPanelKeys:o=[],panelKeyLimits:i={}}){this.#t=e,this.#r=t,this.#o=n,this.#n=r,this.#i=[...new Set(o.filter(Boolean))],this.#a=wt(i)}async load(e){const t=e?.meta?.threadId||e?.session_id||e?.sessionId,n=String(t||"default"),r=this.#e.get(n);if(r)return r;const o=await pt({accountId:this.#t,threadId:n,rpc:this.#n}),i=ft({accountId:this.#t,locale:e?.locale||this.#r,parentUrl:this.#o,threadId:n,incomingContext:St(o,e?.context)});return this.#e.set(n,i),i}patch(e,t){const n=String(e||"default"),r=this.#e.get(n);if(!r)return null;const o=ye(r,typeof t=="function"?t(r):t);return this.#e.set(n,o),o}appendUserMessage(e,t){const n=String(e||"default");if(!t)return this.#e.get(n)??null;const r=this.#e.get(n);if(!r)return null;const o=mt(r,{role:"user",content:t});return this.#e.set(n,o),o}async commit(e){const t=String(e||"default"),n=this.#e.get(t);return n?(await gt({accountId:this.#t,threadId:t,extensions:n.thread.extensions,panel:ht(n.panel,this.#i,this.#a),rpc:this.#n}),n):null}};function ht(e,t,n){if(!t.length||!b(e))return;const r={};for(const o of t)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=bt(e[o],n[o]));return r}function wt(e){const t={};for(const[n,r]of Object.entries(e||{})){const o=Math.floor(Number(r));n&&Number.isFinite(o)&&o>0&&(t[n]=o)}return t}function bt(e,t){return!t||!Array.isArray(e)?e:e.slice(-t)}function St(e,t){return!b(e)&&!b(t)?{}:ye(b(e)?e:{},b(t)?t:{})}function ye(e,t){if(!b(t))return e;const n=e,r=t,o=b(n.panel)?n.panel:{},i=b(r.panel)?r.panel:{},a=b(n.thread)?n.thread:{},c=b(r.thread)?r.thread:{},y=b(a.extensions)?a.extensions:{},m=b(c.extensions)?c.extensions:{},d=b(n.meta)?n.meta:{},s=b(r.meta)?r.meta:{};return{...e,...t,panel:{...o,...i},thread:{...a,...c,extensions:{...y,...m}},meta:{...d,...s},messages:Array.isArray(r.messages)?r.messages.slice(-50):e.messages??[]}}function pe(e){const t=String.fromCharCode(...e);return btoa(t).replace(/\+/gu,"-").replace(/\//gu,"_").replace(/=+$/u,"")}function ge(e){return pe(new TextEncoder().encode(JSON.stringify(e)))}async function At({accountId:e,devJwtSecret:t,ttlS:n=300}){if(!t)throw new Error("devJwtSecret is required for local agent mode.");const r=Math.floor(Date.now()/1e3),o=`${ge({alg:"HS256",typ:"JWT"})}.${ge({sub:e,iat:r,exp:r+n,scope:"invoke",jti:crypto.randomUUID?.()||`${r}-${Math.random()}`})}`,i=await crypto.subtle.importKey("raw",new TextEncoder().encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),a=await crypto.subtle.sign("HMAC",i,new TextEncoder().encode(o));return`${o}.${pe(new Uint8Array(a))}`}function H({accountId:e,devJwtSecret:t,tokenBrokerUrl:n,tokenBrokerAudience:r,refreshSkewS:o=30,fetchImpl:i=fetch}){let a=null;return async({signal:c,parentUrl:y}={})=>{if(t)return At({accountId:e,devJwtSecret:t});if(!n)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 kt({accountId:e,tokenBrokerUrl:n,tokenBrokerAudience:r,parentUrl:y,signal:c,fetchImpl:i})),a.token}}async function kt({accountId:e,tokenBrokerUrl:t,tokenBrokerAudience:n,parentUrl:r,signal:o,fetchImpl:i}){const a=await i(t,{method:"POST",credentials:"include",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify({accountId:e,scope:"invoke",audience:n||void 0,parentUrl:r||void 0}),...o?{signal:o}:{}});if(!a.ok)throw new Error(`Token broker request failed (${a.status}).`);const 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:_t(c)||Et(y)||Math.floor(Date.now()/1e3)+300}}function _t(e){const t=e?.expiresAtS??e?.expires_at_s??e?.expiresInS??e?.expires_in_s;if(Number.isFinite(t))return Number(t);const n=e?.expiresIn??e?.expires_in;if(Number.isFinite(n))return Math.floor(Date.now()/1e3)+Number(n);const r=e?.expiresAt??e?.expires_at;if(typeof r=="string"){const o=Date.parse(r);if(Number.isFinite(o))return Math.floor(o/1e3)}return null}function Et(e){try{const[,t]=e.split(".");if(!t)return null;const n=t.replace(/-/gu,"+").replace(/_/gu,"/"),r=atob(n.padEnd(Math.ceil(n.length/4)*4,"=")),o=JSON.parse(r);return Number.isFinite(o?.exp)?Number(o.exp):null}catch{return null}}var he={unauthorized:{code:"auth",message:"Assistant authentication failed. Please retry."},forbidden:{code:"auth",message:"Assistant authentication failed. Please retry."},unknown_op:{code:"op_unavailable",message:"This assistant action is not available yet."},invalid_input:{code:"invalid_request",message:"The assistant request was not valid."},account_config:{code:"account_config",message:"Assistant configuration is unavailable."},upstream_llm:{code:"op_failed",message:"The assistant could not complete that request."},upstream_timeout:{code:"op_timeout",message:"The assistant took too long to respond."},schema_mismatch:{code:"op_failed",message:"The assistant could not complete that request."},rate_limited:{code:"rate_limited",message:"The assistant is receiving too many requests. Please retry shortly."},internal:{code:"op_failed",message:"The assistant could not complete that request."},payload_too_large:{code:"invalid_request",message:"The assistant request was too large."}},D=class extends Error{constructor(e,t,n={}){super(t),this.name="AgentError",this.code=e,this.source=n.source||"agent",n.sourceCode&&(this.sourceCode=n.sourceCode),n.detail!==void 0&&(this.detail=n.detail)}};function G(e){const t=String(e?.code||"upstream_llm"),n=he[t]||he.upstream_llm;return new D(n.code,n.message,{source:"be",sourceCode:t,detail:e?.detail})}function we(e,t){const n=t?.error&&typeof t.error=="object"?t.error:{};return G({code:String(n.code||Tt(e)),detail:n.detail})}function be(e){return e instanceof D?{type:"error",code:e.code,message:e.message}:{type:"error",code:"agent_invoke_failed",message:"The assistant could not complete that request."}}function Tt(e){return e===401?"unauthorized":e===403?"forbidden":e===413?"payload_too_large":e===429?"rate_limited":"internal"}var xt=7200*1e3,Se=200,Pt=5*1024*1024,jt="gengage_request_response_cache",Ct=1,_="responses",It=new Set(["addToCart","like"]),E=new Map,Ae=null;async function Ot(e,t={},n={}){const r=Rt(e,t);if(!r)return fetch(e,t);const o=Date.now(),i=await Mt(r,o);if(i)return Lt(i);const a=await fetch(e,t);return a.ok&&Bt(r,a.clone(),o,{ttlMs:n.ttlMs??xt,maxEntries:n.maxEntries??Se,maxBodyBytes:n.maxBodyBytes??Pt}),a}function Rt(e,t={}){if(typeof Request<"u"&&e instanceof Request)return null;const n=String(t.method||"GET").toUpperCase();return n!=="POST"||typeof t.body!="string"||Ut(t.body)?null:`rr:${zt(Kt({url:String(e),method:n,headers:Nt(t.headers),body:t.body}))}`}function Ut(e){try{const t=JSON.parse(e);if(!t||typeof t!="object"||Array.isArray(t))return!1;const n=t.type;return typeof n=="string"&&It.has(n)}catch{return!1}}async function Mt(e,t){const n=E.get(e);if(n)if(n.expiresAt<=t)E.delete(e);else return n.lastAccessedAt=t,E.delete(e),E.set(e,n),W(n),n;const r=await $t(e);return r?r.expiresAt<=t?(E.delete(e),Ft(e),null):(r.lastAccessedAt=t,E.set(e,r),W(r),ke(Se),r):null}async function Bt(e,t,n,r){try{const o=await t.text();if(Jt(o)>r.maxBodyBytes||vt(o))return;const i={key:e,status:t.status,statusText:t.statusText,headers:Dt(t.headers),body:o,createdAt:n,expiresAt:n+r.ttlMs,lastAccessedAt:n};E.set(e,i),ke(r.maxEntries),await W(i),await qt(r.maxEntries,n)}catch{}}function vt(e){return/"_error"\s*:/u.test(e)||/"type"\s*:\s*"error"/u.test(e)}function Lt(e){return new Response(e.body,{status:e.status,statusText:e.statusText,headers:new Headers(e.headers)})}function Nt(e){const t=new Headers(e),n=[];return t.forEach((r,o)=>{const i=o.toLowerCase();i!=="authorization"&&i!=="cookie"&&n.push([i,r])}),n.sort(([r],[o])=>r.localeCompare(o))}function Dt(e){const t=[];return e.forEach((n,r)=>{const o=r.toLowerCase();o!=="set-cookie"&&t.push([o,n])}),t.sort(([n],[r])=>n.localeCompare(r))}function ke(e){for(;E.size>e;){const t=[...E.values()].sort((n,r)=>n.lastAccessedAt-r.lastAccessedAt)[0];if(!t)break;E.delete(t.key)}}async function $(){return typeof indexedDB>"u"?null:(Ae??=new Promise(e=>{const t=indexedDB.open(jt,Ct);t.onupgradeneeded=()=>{const n=t.result;n.objectStoreNames.contains(_)||n.createObjectStore(_,{keyPath:"key"}).createIndex("lastAccessedAt","lastAccessedAt",{unique:!1})},t.onsuccess=()=>e(t.result),t.onerror=()=>e(null),t.onblocked=()=>e(null)}),Ae)}async function $t(e){const t=await $();return t?new Promise(n=>{const r=t.transaction(_,"readonly"),o=r.objectStore(_).get(e);o.onsuccess=()=>n(o.result??null),o.onerror=()=>n(null),r.onerror=()=>n(null)}):null}async function W(e){const t=await $();t&&await new Promise(n=>{const r=t.transaction(_,"readwrite");r.objectStore(_).put(e),r.oncomplete=()=>n(),r.onerror=()=>n(),r.onabort=()=>n()})}async function Ft(e){const t=await $();t&&await new Promise(n=>{const r=t.transaction(_,"readwrite");r.objectStore(_).delete(e),r.oncomplete=()=>n(),r.onerror=()=>n(),r.onabort=()=>n()})}async function qt(e,t){const n=await $();n&&await new Promise(r=>{const o=n.transaction(_,"readwrite"),i=o.objectStore(_),a=[],c=i.openCursor();c.onsuccess=()=>{const y=c.result;if(!y){const m=a.filter(s=>s.expiresAt<=t),d=a.filter(s=>s.expiresAt>t).sort((s,u)=>s.lastAccessedAt-u.lastAccessedAt).slice(0,Math.max(0,a.length-m.length-e));for(const s of[...m,...d])i.delete(s.key);return}a.push(y.value),y.continue()},c.onerror=()=>r(),o.oncomplete=()=>r(),o.onerror=()=>r(),o.onabort=()=>r()})}function Kt(e){return JSON.stringify(V(e))}function V(e){return Array.isArray(e)?e.map(V):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,V(n)]))}function zt(e){let t=14695981039346656037n;const n=1099511628211n;for(let r=0;r<e.length;r+=1)t^=BigInt(e.charCodeAt(r)),t=BigInt.asUintN(64,t*n);return t.toString(16).padStart(16,"0")}function Jt(e){return typeof TextEncoder<"u"?new TextEncoder().encode(e).byteLength:e.length}async function Ht({beUrl:e,accountId:t,devJwtSecret:n,tokenBrokerUrl:r,tokenBrokerAudience:o,jwtProvider:i,parentUrl:a,op:c,input:y,cacheTtlS:m,cacheKey:d,browserCache:s,signal:u}){const l=await(i||H({accountId:t,devJwtSecret:n,tokenBrokerUrl:r,tokenBrokerAudience:o}))({...u?{signal:u}:{},...a?{parentUrl:a}:{}}),{opDomain:p,opName:g}=Gt(c,t),h={method:"POST",headers:{authorization:`Bearer ${l}`,"content-type":"application/json",accept:"application/x-ndjson"},body:JSON.stringify({op_domain:p,op_name:g,op_payload:y,...m!==void 0?{cache_ttl_s:m}:{},...d!==void 0?{cache_key:d}:{}}),...u?{signal:u}:{}},A=`${String(e).replace(/\/+$/u,"")}/v1/execute`,w=s===!1?await fetch(A,h):await Ot(A,h,typeof s=="object"?s:{});if(!w.ok)throw we(w.status,await Vt(w));return Yt(w)}function Gt(e,t){if(!e||e.startsWith("-")||e.endsWith("-"))throw new Error(`Invalid BE op name: ${e}`);return{opDomain:Wt(t),opName:e}}function Wt(e){return e.replace(/-agentic$/u,"")}async function Vt(e){try{return await e.json()}catch{return{error:{code:e.statusText||"internal"}}}}async function Yt(e){const t=e.body?.getReader();if(!t)throw new Error("BE response body is not readable.");const n=new TextDecoder;let r="";const o={};for(;;){const{value:a,done:c}=await t.read();if(c)break;r+=n.decode(a,{stream:!0});let y=r.indexOf(`
|
|
2
|
+
`);for(;y>=0;){const m=r.slice(0,y).trim();r=r.slice(y+1),m&&_e(JSON.parse(m),o),y=r.indexOf(`
|
|
3
|
+
`)}}const i=r.trim();return i&&_e(JSON.parse(i),o),o}function _e(e,t){if(e._error)throw G(e._error);if(!e._end)for(const[n,r]of Object.entries(e)){if(Object.prototype.hasOwnProperty.call(t,n))throw new D("op_failed",`BE streamed duplicate field "${n}".`,{source:"be",sourceCode:"schema_mismatch"});t[n]=r}}function Qt(e={}){return{type:"metadata",...e}}function Ee(e,t=!1,n={}){return{type:"text_chunk",content:e,final:t,...n}}function Xt(e){return{type:"ui_spec",...e}}function Zt(e){return{type:"action",action:e}}function Te(e,t){return{type:"error",code:e,message:t}}function Y(){return{type:"done"}}function xe(e,t){return e[t?.type||t?.action?.type||"inputText"]||e.inputText}async function en({request:e,accountModule:t,contextStore:n,beClient:r,toolBridge:o,emit:i,rpc:a,signal:c}){const y=performance.now(),m=await n.load(e),d=m.thread.id,s=pn(e);n.appendUserMessage(d,s);const u=xe(t.flows,e);if(!u)return i(Te("unknown_action",`No agent flow for request type ${e?.type||"inputText"}`)),i(Y()),{steps:0,productSkusEmitted:[]};const l={request:e,context:n.patch(d,{})||m,bag:{},accountConfig:t.accountConfig||{},threadId:d,steps:0,productSkusEmitted:new Set,committed:!1},p={contextStore:n,beClient:r,toolBridge:o,emit:i,rpc:a,adapters:t.adapters||{},...c?{signal:c}:{}};return await B(u,l,p),l.committed||await Q(l,p),await a("beacon.send",{type:"turnSummary",threadId:d,sessionId:e?.session_id||e?.sessionId||d,accountId:t.accountId||l.context.meta.accountId,steps:l.steps,totalLatencyMs:I(y),productSkusEmitted:[...l.productSkusEmitted]}),{steps:l.steps,productSkusEmitted:[...l.productSkusEmitted]}}async function B(e,t,n){for(const r of e){if(n.signal?.aborted||t.committed)return;t.steps+=1,await tn(r,t,n),t.context=n.contextStore.patch(t.threadId,{})||t.context}}async function tn(e,t,n){const r=X(t);if(e.kind==="be_op"){await nn(e,t,n,r);return}if(e.kind==="tool"){await rn(e,t,n,r);return}if(e.kind==="adapter"){await on(e,t,n,r);return}if(e.kind==="emit"){an(e,t,n);return}if(e.kind==="patch"){cn(e,t,n);return}if(e.kind==="branch"){await sn(e,t,n,r);return}if(e.kind==="parallel"){await un(e,t,n);return}if(e.kind==="refusal"){await ln(e,t,n,r);return}e.kind==="commit"&&await dn(e,t,n)}async function nn(e,t,n,r){const o=performance.now();let i;const a=j(e.cacheTtlS,r),c=j(e.cacheKey,r),y=j(e.browserCache,r);try{i=await n.beClient.invoke({op:e.op,input:j(e.input,r),...a!==void 0?{cacheTtlS:a}:{},...c!==void 0?{cacheKey:c}:{},...y!==void 0?{browserCache:y}:{},...n.signal?{signal:n.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:I(o),errorCode:u};if(await n.rpc("beacon.send",l),e.onError){e.errorOut&&(t.bag[e.errorOut]=d),await B(e.onError,t,n);return}throw d}e.out&&(t.bag[e.out]=i),F(e,i,t,n.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:I(o)};await n.rpc("beacon.send",m)}async function rn(e,t,n,r){const o=performance.now();try{const i=await n.toolBridge.invoke(e.name,j(e.input,r));e.out&&(t.bag[e.out]=i),F(e,i,t,n.contextStore),await n.rpc("beacon.send",{type:"agentTool",threadId:t.threadId,sessionId:Pe(t),accountId:t.context.meta.accountId,tool:e.name,status:"ok",latencyMs:I(o)})}catch(i){const a=i;if(await n.rpc("beacon.send",{type:"agentTool",threadId:t.threadId,sessionId:Pe(t),accountId:t.context.meta.accountId,tool:e.name,status:"error",latencyMs:I(o),errorCode:String(a?.code||a?.name||"unknown")}),e.onError){e.errorOut&&(t.bag[e.errorOut]=i),await B(e.onError,t,n);return}throw i}}async function on(e,t,n,r){const o=n.adapters?.[e.name];if(typeof o!="function")throw new Error(`Unknown flow adapter: ${e.name}`);const i=await o(j(e.input,r),r);e.out&&(t.bag[e.out]=i),F(e,i,t,n.contextStore)}function an(e,t,n){const r=e.build(X(t));gn(r,t.productSkusEmitted),n.emit(r)}function cn(e,t,n){F(e,void 0,t,n.contextStore)}async function sn(e,t,n,r){const o=String(j(e.on,r)||"default");await B(e.cases[o]||e.cases.default||[],t,n)}async function un(e,t,n){const r=e.steps.map(a=>{const c={...t,context:fn(t.context),bag:{...t.bag},productSkusEmitted:t.productSkusEmitted,committed:!1};return B(a,c,{...n,emit:y=>{y.type!=="done"&&n.emit(y)},contextStore:mn(c)}).then(()=>c)}),o=await Promise.all(r),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=je(a.context.panel,i.panel);Object.keys(c).length&&(t.context=n.contextStore.patch(t.threadId,{panel:c})||t.context)}if(i.threadExtensions?.length){const c=je(a.context.thread.extensions,i.threadExtensions);Object.keys(c).length&&(t.context=n.contextStore.patch(t.threadId,{thread:{...t.context.thread,extensions:c}})||t.context)}}}async function ln(e,t,n,r){n.emit(Ee(j(e.message,r),!0)),await Q(t,n)}async function dn(e,t,n){await Q(t,n)}async function Q(e,{contextStore:t,emit:n}){e.committed||(e.context=await t.commit(e.threadId)||e.context,e.committed=!0,n(Y()))}function F(e,t,n,r){if(typeof e.patch!="function")return;const o=e.patch(n.context,t,X(n));o&&(n.context=r.patch(n.threadId,o)||n.context)}function X(e){return{request:e.request,context:e.context,bag:e.bag,accountConfig:e.accountConfig}}function Pe(e){return e.request?.session_id||e.request?.sessionId||e.threadId}function fn(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function je(e,t){const n={};for(const r of t)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function mn(e){return{async load(){return e.context},patch(t,n){return e.context=yn(e.context,n),e.context},appendUserMessage(){return e.context},async commit(){return e.context}}}function yn(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 j(e,t){return typeof e=="function"?e(t):e}function pn(e){const t=e?.payload;if(typeof t=="string")return t;if(t&&typeof t=="object"&&"text"in t){const n=t.text;if(typeof n=="string")return n}return typeof e?.action?.payload=="string"?e.action.payload:typeof e?.action?.title=="string"?e.action.title:""}function gn(e,t){const n=e,r=n.spec,o=Array.isArray(r?.items)?r.items:void 0,i=Array.isArray(n.items)?n.items:void 0,a=o||i;if(Array.isArray(a)){for(const c of a)if(c&&typeof c=="object"){const y=c.sku;typeof y=="string"&&t.add(y)}}}function hn(e){return{invoke(t,n){return e("tool.invoke",{name:t,input:n})}}}var wn=512,bn=.74;function Ce({accountId:e,worker:t,beUrl:n,devJwtSecret:r,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:c={},beacon:y}){let m=1;const d=new Map;return ct({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 p=d.get(l);if(p){if(u.type==="event"&&u.event){Z(p,u.event);return}if(u.type==="error"){p.onError(new Error(u.message||"Agent worker failed")),d.delete(l);return}u.type==="end"&&d.delete(l)}}),(s,u,l,p)=>{const g=m++;d.set(g,u);const h=()=>{d.delete(g),t.postMessage({id:g,type:"abort"})},A=w=>{if(l.aborted){h();return}t.postMessage({id:g,type:"invoke",accountId:e,beUrl:n,devJwtSecret:r,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,request:w,parentUrl:window.location.href})};if(l.aborted){h();return}if(l.addEventListener("abort",h,{once:!0}),p){Oe(s,p).then(A).catch(w=>{d.delete(g),u.onError(w instanceof Error?w:new Error("Failed to read image attachment"))});return}A(s)}}function Ie({accountId:e,accountModule:t,beUrl:n,devJwtSecret:r,tokenBrokerUrl:o,tokenBrokerAudience:i,defaultLocale:a,tools:c={},beacon:y}){let m=null;const d=Sn({accountId:e,tools:c,beacon:y}),s=hn(d),u=H({accountId:e,...r?{devJwtSecret:r}:{},...o?{tokenBrokerUrl:o}:{},...i?{tokenBrokerAudience:i}:{}});return async(l,p,g,h)=>{const A=await Oe(l||{},h);m||=new me({accountId:e,locale:A?.locale||a,parentUrl:window.location.href,rpc:d,persistentPanelKeys:t.contextPersistence?.panelKeys,panelKeyLimits:t.contextPersistence?.panelKeyLimits});try{await en({request:A,accountModule:{...t,accountId:e},contextStore:m,beClient:{invoke({op:w,input:se,signal:it,cacheTtlS:ro,cacheKey:oo,browserCache:io}){return Ht({beUrl:n,accountId:e,jwtProvider:u,parentUrl:window.location.href,op:w,input:se,cacheTtlS:ro,cacheKey:oo,browserCache:io,...it?{signal:it}:{}})}},toolBridge:s,emit:w=>Z(p,w),rpc:d,signal:g})}catch(w){g?.aborted||(Z(p,be(w)),p.onDone())}}}function Sn({accountId:e,tools:t,beacon:n}){const r=o=>n?.({...o,accountId:o.accountId||e});return((o,i)=>ue(o,i,{tools:t,beacon:r,memory:sessionStorage}))}async function Oe(e,t){if(!t||!t.type?.startsWith("image/"))return e;const n=await _n(t),r={...An(e.payload??e.action?.payload),image_data_url:n.dataUrl,image_mime:n.mime};return{...e,payload:r,...e.action?{action:{...e.action,payload:r}}:{}}}function An(e){return kn(e)?{...e}:typeof e=="string"?{text:e}:{}}function kn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function _n(e){const t=await En(e);return t||{dataUrl:await Re(e),mime:e.type}}async function En(e){if(typeof createImageBitmap!="function"||typeof document>"u")return null;let t=null;try{t=await createImageBitmap(e);const n=Math.min(1,wn/Math.max(t.width,t.height)),r=Math.max(1,Math.round(t.width*n)),o=Math.max(1,Math.round(t.height*n)),i=document.createElement("canvas");i.width=r,i.height=o;const a=i.getContext("2d");if(!a)return null;a.drawImage(t,0,0,r,o);const c=await new Promise(y=>i.toBlob(y,"image/jpeg",bn));return c?{dataUrl:await Re(c),mime:c.type||"image/jpeg"}:null}catch{return null}finally{t?.close()}}async function Re(e){const t=new Uint8Array(await e.arrayBuffer());let n="";const r=32768;for(let o=0;o<t.length;o+=r)n+=String.fromCharCode(...t.subarray(o,o+r));return`data:${e.type};base64,${btoa(n)}`}function Z(e,t){switch(t?.type){case"text_chunk":{const n=t;e.onTextChunk(n.content||"",n.final===!0,n);break}case"ui_spec":{const n=t;e.onUISpec(n.spec,n.widget,n.panelHint,n.clearPanel===!0);break}case"action":e.onAction(t);break;case"metadata":e.onMetadata(t);break;case"error":e.onError(Tn(t));break;case"done":e.onDone();break;default:break}}function Tn(e){const t=new Error(e.message||e.code||"Agent error");return e.code&&(t.code=e.code),t}function Ue(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function q(e){const t=Ue(e);if(!t)return null;const n=O(t.sku,t.SKU);if(!n)return null;const r={sku:n,name:O(t.name,t.title,t.short_name,n)||n,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&&(r.imageUrl=i),o&&o.length>1&&(r.images=o.filter(g=>!!g).map(String));const a=v(t.price_discounted),c=v(t.price),y=a||c;y>0&&(r.price=String(y));const m=a>0?c:0;m>0&&(r.originalPrice=String(m));const d=O(t.brand);d&&(r.brand=d);const s=v(t.rating);s>0&&(r.rating=s);const u=v(t.review_count)||v(t.reviewCount);u>0&&(r.reviewCount=u);const l=O(t.cart_code,t.cartCode);l&&(r.cartCode=l),typeof t.in_stock=="boolean"&&(r.inStock=t.in_stock),typeof t.inStock=="boolean"&&(r.inStock=t.inStock);const p=t.category_names;return Array.isArray(p)&&(r.categoryNames=p.map(String)),r}function K(e){const t=Ue(e);if(!t)return e;const n=t.category_names,r=Array.isArray(n)?n:void 0,o=t.images,i=Array.isArray(o)?o:void 0,a={sku:t.sku,name:t.name||t.title,url:t.url,price:t.price,currency:t.price_currency||t.currency,category:r?.[r.length-1]??void 0,category_names:r?r.slice(0,4):void 0,image:i?i[0]:t.image,in_stock:t.in_stock,rating:t.rating,review_count:t.review_count};for(const c of Object.keys(a))a[c]===void 0&&delete a[c];return a}function xn(e){return Array.isArray(e)?e.map(K).filter(t=>!!t):[]}function O(...e){for(const t of e)if(typeof t=="string"&&t.trim())return t.trim();return""}function v(e){const t=Number(e);return Number.isFinite(t)?t:0}function Me(e){return Array.isArray(e)?e.map(String).filter(Boolean):typeof e=="string"&&e?[e]:[]}function Pn(e,t,n={}){return`${e}:${n.version||"v2"}:${R(t)}`}function jn(e,t={}){return Be(e).map(n=>ve(typeof n=="string"?n:n.sku,t.locale)).filter(Boolean).filter((n,r,o)=>o.indexOf(n)===r).sort((n,r)=>ee(n,r,t.locale)).slice(0,t.limit||16).join(",")}function Cn(e,t={}){return R(Be(e).map(n=>On(n,t)).filter(n=>!!n).sort((n,r)=>ee(String(n.sku||n.name||""),String(r.sku||r.name||""),t.locale)).slice(0,t.limit||16))}function In(e,t){return C(e,t)}function R(e){let t=2166136261;const n=Rn(e);for(let r=0;r<n.length;r+=1)t^=n.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(36)}function On(e,t){if(!e||typeof e!="object"||Array.isArray(e))return null;const n=e,r=t.mapProduct?.(n);if(r)return L(r);const o=K(n);return o&&typeof o=="object"&&!Array.isArray(o)?L(Un(o,t)):null}function Be(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"||!!(t&&typeof t=="object"&&!Array.isArray(t))):[]}function Rn(e){return JSON.stringify(L(e))}function L(e){return Array.isArray(e)?e.map(L):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,L(n)]))}function Un(e,t){return{sku:ve(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:Mn(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 ve(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,n){return e.localeCompare(t,n,{numeric:!0})}function Mn(e,t,n){return Array.isArray(e)?e.map(r=>C(r,t)).filter(Boolean).sort((r,o)=>ee(r,o,t)).slice(0,n):void 0}var Bn="entries",vn=1,Ln={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."},Le=new Map;function te(){return Date.now()}function ne(e){return e?.expiresAt!=null&&e.expiresAt<=te()}function re(e,t){return{value:e,createdAt:te(),expiresAt:t?te()+t:null}}function Nn(e,t,n){try{const r=e.getItem(`${t}${n}`);if(!r)return null;const o=JSON.parse(r);return ne(o)?(e.removeItem(`${t}${n}`),null):o.value}catch{return null}}function Dn(e,t,n,r,o){try{return e.setItem(`${t}${n}`,JSON.stringify(re(r,o))),!0}catch{return!1}}function $n(e,t,n){try{e.removeItem(`${t}${n}`)}catch{}}function Ne(e){try{return window[e]}catch{return null}}function De(e,t){return e?{get:n=>Nn(e,t,n),set:(n,r,o={})=>Dn(e,t,n,r,o.ttlMs),remove:n=>$n(e,t,n)}:{get:()=>null,set:()=>!1,remove:()=>{}}}function Fn(e,t){const n=t.dbName||`gengage-${e}`,r=t.dbStore||Bn,o=t.dbVersion||vn,i=new Map;let a=null;const c=()=>"indexedDB"in window?a||(a=new Promise(s=>{const u=indexedDB.open(n,o);u.onupgradeneeded=()=>{u.result.createObjectStore(r,{keyPath:"key"})},u.onsuccess=()=>s(u.result),u.onerror=()=>s(null),u.onblocked=()=>s(null)}),a):Promise.resolve(null);return{volatileEntries:i,idbGet:async s=>{const u=await c();return u?new Promise(l=>{const p=u.transaction(r,"readwrite").objectStore(r),g=p.get(s);g.onsuccess=()=>{const h=g.result;if(!h||ne(h)){h&&p.delete(s),l(null);return}l(h.value)},g.onerror=()=>l(null)}):null},idbSet:async(s,u,l={})=>{const p=await c();return p?new Promise(g=>{const h=p.transaction(r,"readwrite");h.oncomplete=()=>g(!0),h.onerror=()=>g(!1),h.objectStore(r).put({key:s,...re(u,l.ttlMs)})}):!1},idbRemove:async s=>{const u=await c();u&&u.transaction(r,"readwrite").objectStore(r).delete(s)}}}function oe(e,t={}){const n=window,r=n.gengage||(n.gengage={}),o=r.memory||(r.memory={}),i=o[e];if(i)return i;const a=Le.get(e)||Fn(e,t);Le.set(e,a);const c=t.sessionPrefix||`gengage:${e}:session:`,y=t.localPrefix||`gengage:${e}:local:`,d={get:l=>{const p=a.volatileEntries.get(l);return p?ne(p)?(a.volatileEntries.delete(l),null):p.value:null},set:(l,p,g={})=>(a.volatileEntries.set(l,re(p,g.ttlMs)),!0),remove:l=>{a.volatileEntries.delete(l)},clear:()=>a.volatileEntries.clear()},s={get:a.idbGet,set:a.idbSet,remove:a.idbRemove},u={accountId:e,volatile:d,session:De(Ne("sessionStorage"),c),local:De(Ne("localStorage"),y),indexedDb:s,stableKey:R,policy:{...Ln,...t.policy||{}}};o[e]=u;for(const l of t.aliases||[])o[l]=u;return u}var z="__gengageAgentFetchBridge",qn=1e3*60*60*24*14;function Kn({accountId:e,streamTransport:t,endpoints:n={},endpointCache:r}){if(!e)throw new Error("accountId is required.");if(typeof t!="function")throw new Error("streamTransport is required.");const o=zn(),i=`https://gengage-injector.invalid/${encodeURIComponent(e)}`,a=new Set,c=r?Yn({accountId:e,endpointCache:r,fetchImpl:o.originalFetch}):void 0,y=m=>{const d=`${i}/chat/${m}`;a.add(d);const s=n[m],u={streamTransport:t,endpoint:m};s&&(u.endpointHandler=s),c&&(u.endpointCache=c),o.routes.set(d,u)};y("process_action");for(const m of Object.keys(n))m!=="process_action"&&y(m);return{middlewareUrl:i,stop(){for(const m of a)o.routes.delete(m);Jn(o)}}}function zn(){const e=window,t=e[z];if(t)return t;const n=e.fetch.bind(e),r={routes:new Map,originalFetch:n,installedFetch:n};return r.installedFetch=(o,i)=>{const a=$e(o),c=r.routes.get(a);return c?Gn(c,o,i):n(o,i)},e.fetch=r.installedFetch,e[z]=r,r}function Jn(e){if(e.routes.size>0)return;const t=window;t.fetch===e.installedFetch&&(t.fetch=e.originalFetch),t[z]===e&&delete t[z]}function $e(e){return typeof e=="string"?e:e instanceof URL?e.href:e?.url||""}function Fe(e,t){if(t?.signal)return t.signal;if(typeof Request<"u"&&e instanceof Request)return e.signal}function qe(e,t){return t?.body!==void 0&&t?.body!==null?t.body:typeof Request<"u"&&e instanceof Request?e.clone().text():null}async function Hn(e,t){const n=qe(e,t);if(n instanceof FormData){const o=n.get("request"),i=n.get("attachment");return{request:JSON.parse(String(o||"{}")),...i instanceof File?{attachment:i}:{}}}const r=await Promise.resolve(n);return typeof r=="string"?{request:JSON.parse(r||"{}")}:{request:{}}}async function Gn(e,t,n){if(e.endpoint&&e.endpoint!=="process_action"&&e.endpointHandler){const m=new AbortController,d=Fe(t,n);let s=null;if(d){const u=()=>m.abort();d.aborted&&u(),d.addEventListener("abort",u,{once:!0}),s=()=>d.removeEventListener("abort",u)}try{const u=await Wn(t,n),l={accountId:Vn(t),endpoint:e.endpoint,signal:m.signal},p=Qn(e.endpointCache,e.endpoint,u,l.accountId);if(p){const h=await Xn(e.endpointCache,p,m.signal);if(h)return or(h)}const g=await e.endpointHandler(u,l);return p&&g.ok&&await Zn(e.endpointCache,p,g.clone(),m.signal),g}finally{s?.()}}const r=new TextEncoder,o=new AbortController,i=Fe(t,n);let a=!1,c=null;const y=new ReadableStream({async start(m){const d=l=>{a||m.enqueue(r.encode(`${JSON.stringify(l)}
|
|
4
|
+
`))},s=()=>{a||(a=!0,c?.(),m.close())},u=l=>{d({type:"error",code:l?.code||"agent_bridge_error",message:l instanceof Error?l.message:String(l)}),d({type:"done"}),s()};if(i){const l=()=>{o.abort(),a||(a=!0,c?.(),m.error(new DOMException("Aborted","AbortError")))};if(i.aborted){l();return}i.addEventListener("abort",l,{once:!0}),c=()=>i.removeEventListener("abort",l)}try{const{request:l,attachment:p}=await Hn(t,n),g=e.streamTransport(l,{onTextChunk:(h,A,w={})=>d({type:"text_chunk",content:h,final:A===!0,...w}),onUISpec:(h,A,w,se)=>d({type:"ui_spec",spec:h,widget:A,...w?{panelHint:w}:{},...se?{clearPanel:!0}:{}}),onAction:h=>{d(h?.type==="action"?h:{type:"action",action:h})},onMetadata:h=>{d(h?.type==="metadata"?h:{type:"metadata",...h})},onError:u,onDone:()=>{d({type:"done"}),s()}},o.signal,p);sr(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 Wn(e,t){const n=await Promise.resolve(qe(e,t));return typeof n!="string"||n.trim()===""?{}:JSON.parse(n)}function Vn(e){try{const[t]=new URL($e(e)).pathname.split("/").filter(Boolean);return decodeURIComponent(t||"")}catch{return""}}function Yn({accountId:e,endpointCache:t,fetchImpl:n}){return{accountId:e,beUrl:t.beUrl,...t.parentUrl?{parentUrl:t.parentUrl}:{},ttlMs:t.ttlMs??qn,policies:t.policies,fetchImpl:n,jwtProvider:H({accountId:e,...t.devJwtSecret?{devJwtSecret:t.devJwtSecret}:{},...t.tokenBrokerUrl?{tokenBrokerUrl:t.tokenBrokerUrl}:{},...t.tokenBrokerAudience?{tokenBrokerAudience:t.tokenBrokerAudience}:{},fetchImpl:n})}}function Qn(e,t,n,r){if(!e)return null;const o=e.policies[t];if(!o)return null;const i=o(n,{accountId:r,endpoint:t});return!i?.partition||!i?.key?null:{partition:i.partition,key:i.key,ttlMs:i.ttlMs??e.ttlMs}}async function Xn(e,t,n){const r=He(e.accountId,t),o=await ir(e.accountId,r);if(Je(o))return o;const i=await er(e,t,n);return i?(await Ge(e.accountId,r,i,t.ttlMs),i):null}async function Zn(e,t,n,r){try{const o=await rr(n);if(cr(o.body))return;const i=He(e.accountId,t);await Ge(e.accountId,i,o,t.ttlMs),tr(e,t,o,r)}catch{}}async function er(e,t,n){try{const r=await e.fetchImpl(ze(e.beUrl),{method:"POST",headers:await Ke(e,n),body:JSON.stringify({partition:t.partition,key:t.key}),signal:n});if(!r.ok)return null;const o=await r.json();return o.hit===!0&&Je(o.payload)?o.payload:null}catch{return null}}async function tr(e,t,n,r){try{await e.fetchImpl(ze(e.beUrl),{method:"POST",headers:await Ke(e,r),body:JSON.stringify({partition:t.partition,key:t.key,ttl_s:Math.max(1,Math.ceil(t.ttlMs/1e3)),payload:n}),signal:r})}catch{}}async function Ke(e,t){return{authorization:`Bearer ${await e.jwtProvider({signal:t,parentUrl:e.parentUrl||nr()})}`,"content-type":"application/json",accept:"application/json"}}function nr(){try{return window.location?.href||""}catch{return""}}function ze(e){return`${String(e).replace(/\/+$/u,"")}/v1/cache`}async function rr(e){return{status:e.status,statusText:e.statusText,headers:[...e.headers.entries()].filter(([t])=>ar(t)),body:await e.text()}}function or(e){return new Response(e.body,{status:e.status,statusText:e.statusText,headers:new Headers(e.headers)})}function Je(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 He(e,t){return`endpoint-response:${R({accountId:e,partition:t.partition,key:t.key})}`}async function ir(e,t){const n=oe(e);return n.volatile.get(t)||await n.indexedDb.get(t)||n.local.get(t)}async function Ge(e,t,n,r){const o=oe(e);o.volatile.set(t,n,{ttlMs:r}),await o.indexedDb.set(t,n,{ttlMs:r})||o.local.set(t,n,{ttlMs:r})}function ar(e){return["content-type","cache-control"].includes(e.toLowerCase())}function cr(e){return/"_error"\s*:/u.test(e)||/"type"\s*:\s*"error"/u.test(e)}function sr(e){return e!==null&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"}function ur({accountId:e,beUrl:t,devJwtSecret:n,tokenBrokerUrl:r,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 s=window,u=s.GengageAssistantInjector||(s.GengageAssistantInjector={}),l=u[e]||(u[e]={});if(l.agentController)return l.agentController;const p=ie(i)||d?We(i,`gengage-${e}-agent`,{allowBlobWorker:d}):null;p||m?.({type:"agentRuntime",accountId:e,transport:"main-thread",reason:"cross-origin-worker-url",workerUrl:i}),l.streamTransport=p?Ce({accountId:e,worker:p.worker,beUrl:t,...n?{devJwtSecret:n}:{},...r?{tokenBrokerUrl:r}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:y,...m?{beacon:m}:{}}):Ie({accountId:e,accountModule:c,beUrl:t,...n?{devJwtSecret:n}:{},...r?{tokenBrokerUrl:r}:{},...o?{tokenBrokerAudience:o}:{},defaultLocale:a,tools:y,...m?{beacon:m}:{}});const g={type:"agent",stop(){delete l.streamTransport,p?.worker.terminate(),p?.cleanup(),delete l.agentController},diagnostics(){return{accountId:e,beUrl:t,workerUrl:i,mounted:!0,transport:p?"worker":"main-thread",transportReason:p?"module-worker":"cross-origin-worker-url",flows:Object.keys(c?.flows||{})}}};return l.agentController=g,g}function ie(e){const t=new URL(e,window.location.href);return t.origin===window.location.origin||t.protocol==="blob:"}function We(e,t,n={}){const r=new URL(e,window.location.href);if(ie(e))return{worker:new Worker(r.href,{type:"module",name:t}),cleanup(){}};if(!n.allowBlobWorker)throw new Error("Cross-origin agent workers require allowBlobWorker=true or a same-origin workerUrl.");const o=new Blob([`import ${JSON.stringify(r.href)};
|
|
5
|
+
`],{type:"text/javascript"}),i=URL.createObjectURL(o);try{return{worker:new Worker(i,{type:"module",name:t}),cleanup(){URL.revokeObjectURL(i)}}}catch(a){throw URL.revokeObjectURL(i),a}}function lr(e,t={}){if(!Array.isArray(e))return[];const n=t.maxItems??8,r=t.maxFeatures??8;return e.map(o=>dr(o,t.defaultBrand,r)).filter(o=>!!o).slice(0,n)}function dr(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))return null;const r=e,o=K(r);return o?yr({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:r.brand||t,features:fr(r.features,n),specs:mr(r.specs,n),in_stock:o.in_stock}):null}function fr(e,t){return Array.isArray(e)?e.filter(Boolean).slice(0,t):void 0}function mr(e,t){if(!(!e||typeof e!="object"||Array.isArray(e)))return Object.fromEntries(Object.entries(e).filter(([,n])=>n!=null).slice(0,t))}function yr(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!=null))}function ae(e){if(!e||typeof e!="object"||Array.isArray(e))return{};const t=e,n=Array.isArray(t.rows)?t.rows:[];return{...t,rows:n.map(gr).filter(Boolean)}}function Ve(e,t){const n=Array.isArray(e)?e.filter(c=>!!(c&&typeof c=="object"&&!Array.isArray(c))):[],r=ae(t),o=Array.isArray(r.columns)?r.columns.map(String):[];if(!o.length)return n;const i=new Map(n.map(c=>[String(c.sku||c.id||""),c])),a=o.map(c=>i.get(c)).filter(c=>!!c);return a.length?a:n}function pr(e,t){const n=ae(e?.table),r=Ve(t,n);return{...e||{},table:n,products:r,multiple_product_details:r}}function gr(e){return!e||typeof e!="object"||Array.isArray(e)?null:Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function hr(e=[]){const t={},n=[];return(Array.isArray(e)?e.map(q).filter(r=>!!r):[]).forEach((r,o)=>{const i=`product-${o.toString()}`;n.push(i);const a={sku:r.sku,product:r};t[i]={type:"ProductCard",props:{product:r,index:o,action:{title:r.name,type:"launchSingleProduct",payload:a}}}}),t.root={type:"ProductGrid",props:{layout:"grid"},children:n},{widget:"chat",panelHint:"panel",spec:{root:"root",elements:t}}}function wr(e){return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ProductDetailsPanel",props:{product:q(e)||e||{}}}}}}}function br(e={}){const t=(e.multiple_product_details||e.products||[]).map(q).filter(r=>!!r),n=e.table||{};return{widget:"chat",panelHint:"panel",spec:{root:"root",elements:{root:{type:"ComparisonTable",props:{products:t,recommended:t.find(r=>r.sku===e.recommended_choice_sku)||t[0],attributes:Object.entries(n).map(([r,o])=>({label:r,values:Array.isArray(o)?o.map(String):[String(o??"")]})),highlights:Me(e.key_differences),specialCases:Me(e.special_considerations),recommendedText:e.recommended_choice,productActions:Object.fromEntries(t.map(r=>[r.sku,{title:r.name,type:"launchSingleProduct",payload:{sku:r.sku,product:r}}]))}}}}}}function Sr(e=[]){return{widget:"chat",panelHint:"inline",spec:{root:"root",elements:{root:{type:"ActionButtons",props:{buttons:(Array.isArray(e)?e:[]).map(t=>{const n=t.label||t.title||t.shortName||"",r=t.action||t.requestDetails||t.request_details;return!n||!r?.type?null:{label:n,action:{title:n,type:r.type,...r.payload!==void 0?{payload:r.payload}:{}}}}).filter(t=>!!t)}}}}}}function Ar(e){return Object.freeze([...e])}function Ye(e,t,n="v1"){return`endpoint:${n}:${R({endpoint:e,request:t})}`}function kr(e){const t=e.version||"v1",n=r=>o=>({partition:`${e.partitionPrefix}/${r}`,key:Ye(r,o,t),...e.ttlMs?{ttlMs:e.ttlMs}:{}});return{launcher_action:n("launcher_action"),similar_products:n("similar_products"),product_groupings:n("product_groupings")}}function _r(e){return{...e}}function Er(e,t={}){return new Response(e.map(n=>JSON.stringify(n)).join(`
|
|
6
|
+
`)+`
|
|
7
|
+
`,{...t,headers:{"content-type":"application/x-ndjson",...t.headers||{}}})}function Tr(e,t={}){return new Response(JSON.stringify(e),{...t,headers:{"content-type":"application/json",...t.headers||{}}})}var Qe=new Set(["and","are","for","from","the","with"]),xr={token:.26,keyword:.22,category:.18,facet:.16,color:.08,attribute:.06,price:.08,retrieval:.08},Pr=["amber","beige","black","blue","blush","bronze","brown","cream","gold","green","grey","ivory","lilac","mixed","orange","pastel","pink","purple","red","silver","white","yellow"];function x(e){return String(e??"").normalize("NFKD").replace(new RegExp("\\p{Diacritic}","gu"),"").toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").replace(/\s+/gu," ").trim()}function k(e,t=Qe){const n=t instanceof Set?t:new Set([...Qe,...t]),r=new Set,o=[];for(const i of x(e).split(/\s+/u))i.length<3||n.has(i)||r.has(i)||(r.add(i),o.push(i));return o}function N(e,t={}){if(Or(e))return e;const n=t.facetKeys,r=S(e.category_names??e.category),o=S(e.category_ids),i=Rr(e.facet_hits),a=Object.entries(i).filter(([g])=>!n||n.some(h=>x(h)===x(g))).map(([,g])=>g),c=T(e.name,e.title),y=T(e.brand),m=t.sourceKeywords??[],d=[c,y,...r,...a,...S(e.promotions),T(e.description),...m].join(" "),s=k(d,t.stopWords),u=T(t.sourceProductType,Br(r,c,s),s[0]),l=P([...Mr(d,Pr),...Object.entries(i).filter(([g])=>/colou?r/iu.test(g)).flatMap(([,g])=>k(g,t.stopWords))]),p=P([...a.flatMap(g=>k(g,t.stopWords)),...S(e.promotions).flatMap(g=>k(g,t.stopWords))]).slice(0,24);return{sku:T(e.sku),title:c,brand:y,productType:u,categoryNames:r,categoryIds:o,facets:i,keywords:P([...m.flatMap(g=>k(g,t.stopWords)),...s]).slice(0,12),tokens:s,colors:l,attributes:p,price:Ur(e)}}function jr(e,t={}){const n=T(e.product_type,e.productType),r=T(e.title,n,S(e.keywords).join(" ")),o=P([...S(e.keywords),...S(e.colors),...S(e.materials),...S(e.styles),...S(e.attributes)]);return N({sku:"__photo__",name:r,category_names:n?[n]:[],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:n,sourceKeywords:o})}function Cr(e,t={}){const n=N(e,t);return P([...t.sourceQueries??[],J([n.productType,...n.colors.slice(0,1),...n.attributes.slice(0,2)]),J([n.productType,...n.keywords.slice(0,3)]),J([n.categoryNames[n.categoryNames.length-1],...n.keywords.slice(0,2)]),J(n.title.split(/\s+/u).slice(0,6)),n.productType].map(r=>r.trim()).filter(Boolean)).slice(0,t.queryLimit??6)}function Xe(e,t,n={}){const r={...xr,...n.weights},o=N(t,n),i=[],a=U(e.tokens,o.tokens),c=U(e.keywords,o.tokens),y=vr(e.categoryNames,o.categoryNames)||U(Ze(e.categoryNames),Ze(o.categoryNames)),m=U(e.attributes,o.attributes),d=U(e.colors,o.colors),s=U(e.attributes,o.tokens),u=Lr(e.price,o.price),l=Nr(o.sku,n.hitCounts)>0?1:0,p=Dr(e,o),g=a*r.token+c*r.keyword+y*r.category+m*r.facet+d*r.color+s*r.attribute+u*r.price+l*r.retrieval,h=$r(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"),u>.8&&i.push("similar price"),p||i.push("weaker product-type match"),{score:Number(h.toFixed(4)),reasons:i}}function Ir(e,t,n={}){const r=N(e,n),o=new Set([r.sku,...n.ignoreSkus??[]].filter(Boolean));return t.filter(i=>{const a=T(i.sku);return a&&!o.has(a)}).map(i=>{const a=Xe(r,i,n);return{...i,similarity_score:a.score,similarity_reasons:a.reasons}}).sort((i,a)=>a.similarity_score-i.similarity_score).slice(0,Math.max(1,Math.min(n.limit??12,100)))}function Or(e){return!!(e&&typeof e=="object"&&Array.isArray(e.tokens))}function T(...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=>T(t)).filter(Boolean):typeof e=="string"&&e.trim()?e.split(/[,;/|]+/u).map(t=>t.trim()).filter(Boolean):[]}function Rr(e){return!e||typeof e!="object"||Array.isArray(e)?{}:Object.fromEntries(Object.entries(e).map(([t,n])=>[t,T(n)]).filter(([,t])=>t))}function Ur(e){const t=Number(e.price_discounted);if(Number.isFinite(t)&&t>0)return t;const n=Number(e.price);return Number.isFinite(n)&&n>0?n:0}function P(e){const t=new Set,n=[];for(const r of e){const o=x(r);!o||t.has(o)||(t.add(o),n.push(o))}return n}function Mr(e,t){const n=` ${x(e)} `;return t.filter(r=>n.includes(` ${x(r)} `))}function Br(e,t,n){const r=x(e[e.length-1]??e[0]??"");if(r){const o=k(r),i=new Set(k(t));return o.find(a=>i.has(a))??o[0]??r}return n[0]??""}function J(e){return e.map(t=>x(t)).filter(Boolean).join(" ").replace(/\s+/gu," ").trim().slice(0,120)}function Ze(e){return e.flatMap(t=>k(t))}function U(e,t){const n=P(e),r=new Set(P(t));return n.length===0||r.size===0?0:n.filter(o=>r.has(o)).length/n.length}function vr(e,t){const n=P(e),r=new Set(P(t));return n.length===0||r.size===0?0:n.filter(o=>r.has(o)).length/n.length}function Lr(e,t){return e<=0||t<=0?0:Math.min(e,t)/Math.max(e,t)}function Nr(e,t){return!e||!t?0:typeof t.get=="function"?t.get(e)??0:t[e]??0}function Dr(e,t){if(!e.productType||!t.productType||e.productType===t.productType)return!0;const n=new Set(k(e.productType)),r=new Set([...k(t.productType),...t.tokens]);return[...n].some(o=>r.has(o))}function $r(e){return Math.max(0,Math.min(1,e))}function Fr(e){const t=(e?.chat||e?._chat)?.root||e?._chat?.root;return t?t.getRootNode?.()?.host||t:Array.from(document.querySelectorAll("*")).find(n=>n.shadowRoot?.querySelector?.(".gengage-chat-root, .gengage-chat-launcher-container"))}function qr(e,t){const n=Fr(e);n?.style&&(t?n.style.removeProperty("display"):n.style.setProperty("display","none","important")),t||(e?.chat||e?._chat)?.close?.()}var Kr="nd_be_url";function zr(e,t){const n=Jr()||e.beUrl||t;if(!n)throw new Error("resolveBeUrl: backend URL is required. The injector must supply a fallback URL; the SDK has no default.");return n}function Jr(){try{const e=new URLSearchParams(window.location.search).get(Kr)?.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 et(e){const t=e?.payload;if(typeof t=="string")return t;if(t&&typeof t=="object"&&"text"in t){const r=t.text;if(typeof r=="string")return r}const n=e?.action;return n&&typeof n.payload=="string"?n.payload:n&&typeof n.title=="string"?n.title:""}var tt=[{pattern:/\bhttps?:\/\/[^\s?#]+(?:\?[^\s#]*)?/giu,replacement:Gr},{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]"}],ce={patterns:tt};function nt(e,t=ce){let n=typeof e=="string"?e:e==null?"":String(e);for(const r of t.patterns||[]){const o=r.replacement;n=typeof o=="function"?n.replace(r.pattern,i=>o(i)):n.replace(r.pattern,o)}return n}function Hr(e,t=ce){return nt(et(e),t)}function Gr(e){try{const t=new URL(e);return`${t.origin}${t.pathname}${t.search?"?[query]":""}`}catch{return"[url]"}}var Wr=["assistantName","homeDomain","categories","policyTopics"],Vr={intent:["searchContract","competitorBrands"]};function Yr(e,t,n,r={}){const o=rt(t,n,r);return Object.keys(o).length?{...e,account_config:o}:e}function rt(e,t,n={}){if(!e)return{};const r={},o=n.baseKeys||Wr;for(const c of o)ot(r,e,c);const i=e[t];i&&typeof i=="object"&&!Array.isArray(i)&&Object.assign(r,Qr(i));const a=n.opAllowlist||Vr;for(const c of a[t]||[])ot(r,e,c);return r}function ot(e,t,n){t[n]!==void 0&&(e[n]=t[n])}function Qr(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}var Xr=["addToCart","search","searchKeyword","facetedSearch","searchGiftOptions","similaritySearch"];function Zr(e,t,n={}){const r=window,o=r.gengage||(r.gengage={}),i=o.tools||(o.tools={});i[e]=t;for(const a of n.accountAliases||[])i[a]=t;if(n.exposeStandardAliases!==!1)for(const a of n.standardAliases||Xr){const c=t[a];typeof c=="function"&&(i[a]=i[a]||c)}return t}function eo({getPageType:e,getProduct:t}){return()=>({url:window.location.href,title:document.title,pageType:e(),product:t()})}function to({accountId:e,getPageType:t,getProduct:n,getToolNames:r,getSearchCapabilities:o,getMemory:i}){return async()=>({accountId:e,url:window.location.href,pageType:t(),productSku:n()?.sku??null,toolNames:r(),...o?{searchCapabilities:o()}:{},...i?{memoryPolicy:i().policy}:{},timestamp:new Date().toISOString()})}function no({accountId:e,runtimeFile:t="runtime.js",startExport:n="start",globalBaseUrlKey:r,errorLabel:o}={}){if(!e)throw new Error("accountId is required.");const i=o||e,a=window,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")||(r?a[r]:null);if(!u)throw new Error(`${i} runtime URL cannot be resolved.`);return new URL(t,u).href},m=a.GengageAssistantInjector||(a.GengageAssistantInjector={}),d=m[e]||(m[e]={});return d.loaderPromise||(d.loaderPromise=import(y()).then(s=>{const u=s[n];if(typeof u!="function")throw new Error(`${i} runtime export ${n} is unavailable.`);return u()}).catch(s=>{throw delete d.loaderPromise,console.error(`[Gengage][${e}] runtime load failed`,s),s})),d.loaderPromise}f.AgentError=D,f.ContextStore=me,f.action=Zt,f.actionButtonsUiSpec=Sr,f.alignProductsToTable=Ve,f.anonymousRequestText=Hr,f.beErrorToAgentError=G,f.buildPhotoSimilarityProfile=jr,f.buildProductSimilarityProfile=N,f.buildSimilarityQueries=Cr,f.canUseModuleWorker=ie,f.caughtToStreamError=be,f.compactAccountConfig=rt,f.compactContextProducts=lr,f.comparisonResultForUi=pr,f.comparisonUiSpec=br,f.createBrowserMemory=oe,f.createDiagnosticsTool=to,f.createEndpointCachePolicies=kr,f.createEndpointHandlers=_r,f.createFlow=Ar,f.createInjectorAdapter=Ce,f.createMainThreadInjectorAdapter=Ie,f.createModuleWorker=We,f.createReadPageTool=eo,f.defaultPiiPatternPack=ce,f.defaultPiiPatterns=tt,f.done=Y,f.elapsedMs=I,f.endpointStableKey=Ye,f.error=Te,f.httpErrorToAgentError=we,f.installBrowserTools=Zr,f.installFetchTransportBridge=Kn,f.jsonResponse=Tr,f.llmCacheKey=Pn,f.metadata=Qt,f.mountAccount=ur,f.ndjsonResponse=Er,f.normalizeComparisonTable=ae,f.normalizeProduct=q,f.normalizeSimilarityText=x,f.nowIso=le,f.productDetailsUiSpec=wr,f.productFactsKey=Cn,f.productSkuKey=jn,f.productsUiSpec=hr,f.rankSimilarProducts=Ir,f.redactPii=nt,f.requestText=et,f.resolveBeUrl=zr,f.resolveFlow=xe,f.scoreSimilarityCandidate=Xe,f.setAssistantHostVisible=qr,f.stableKey=R,f.startLazyRuntimeLoader=no,f.textChunk=Ee,f.textKey=In,f.tokenizeSimilarityText=k,f.trimProductFactsCore=K,f.trimProductFactsListCore=xn,f.uiSpec=Xt,f.withAccountConfig=Yr})(this.Gengage=this.Gengage||{});
|
|
@@ -61,7 +61,7 @@ export interface InlineLauncherOptions {
|
|
|
61
61
|
siblingPlacement?: 'before' | 'after';
|
|
62
62
|
/**
|
|
63
63
|
* Where the flex row is inserted inside the host when first created.
|
|
64
|
-
* `'start'` keeps dropdown/sibling overlays below the search row
|
|
64
|
+
* `'start'` keeps dropdown/sibling overlays below the search row in compact header layouts.
|
|
65
65
|
* Default: `'end'`.
|
|
66
66
|
*/
|
|
67
67
|
rowPlacement?: 'start' | 'end';
|
package/dist/chat-runtime.js
CHANGED
|
@@ -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-
|
|
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-w0f2VkzL.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-
|
|
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(),
|