@webless/agent 0.2.6 → 0.2.8
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/{chunk-GMG4WJNF.js → chunk-4SMLPH3B.js} +141 -20
- package/dist/chunk-4SMLPH3B.js.map +1 -0
- package/dist/embed.cjs +193 -21
- package/dist/embed.cjs.map +1 -1
- package/dist/embed.d.cts +19 -5
- package/dist/embed.d.ts +19 -5
- package/dist/embed.js +52 -2
- package/dist/embed.js.map +1 -1
- package/dist/index.cjs +129 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -3
- package/dist/index.d.ts +10 -3
- package/dist/index.js +130 -14
- package/dist/index.js.map +1 -1
- package/dist/{placement-2d9GQGou.d.cts → placement-CXW_83AF.d.cts} +3 -1
- package/dist/{placement-2d9GQGou.d.ts → placement-CXW_83AF.d.ts} +3 -1
- package/dist/react.cjs +139 -18
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +6 -4
- package/dist/react.d.ts +6 -4
- package/dist/react.js +1 -1
- package/package.json +4 -4
- package/scripts/build-agent-manifest-bundle-impl.mjs +32 -32
- package/dist/chunk-GMG4WJNF.js.map +0 -1
|
@@ -4,23 +4,111 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
|
4
4
|
// src/runtime/client.ts
|
|
5
5
|
import {
|
|
6
6
|
Client,
|
|
7
|
-
ClientError
|
|
7
|
+
ClientError as ClientError2
|
|
8
8
|
} from "eve/client";
|
|
9
9
|
|
|
10
|
+
// src/runtime/capability.ts
|
|
11
|
+
import { ClientError } from "eve/client";
|
|
12
|
+
var MAX_REFRESH_SKEW_MS = 3e4;
|
|
13
|
+
function isRecord(value) {
|
|
14
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
function parseBootstrapResponse(value, indexId, now) {
|
|
17
|
+
if (!isRecord(value) || value.apiVersion !== "webless.ai/agent-runtime-bootstrap/v1" || typeof value.accessToken !== "string" || !value.accessToken || typeof value.expiresAt !== "string" || !isRecord(value.identity) || value.identity.indexId !== indexId || typeof value.identity.revision !== "string" || !value.identity.revision || typeof value.identity.tenantId !== "string" || !value.identity.tenantId || typeof value.origin !== "string" || !value.origin || value.tokenType !== "Bearer" || typeof value.visitorSubject !== "string" || !value.visitorSubject) {
|
|
18
|
+
throw new Error("Agent Runtime returned an invalid access response.");
|
|
19
|
+
}
|
|
20
|
+
const expiresAt = Date.parse(value.expiresAt);
|
|
21
|
+
if (!Number.isFinite(expiresAt) || expiresAt <= now) {
|
|
22
|
+
throw new Error("Agent Runtime returned an expired access response.");
|
|
23
|
+
}
|
|
24
|
+
const refreshSkew = Math.min(MAX_REFRESH_SKEW_MS, Math.floor((expiresAt - now) / 10));
|
|
25
|
+
return {
|
|
26
|
+
accessToken: value.accessToken,
|
|
27
|
+
refreshAt: expiresAt - refreshSkew
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function readBootstrapError(response) {
|
|
31
|
+
const fallback = `Agent Runtime is unavailable (${response.status}).`;
|
|
32
|
+
try {
|
|
33
|
+
const value = await response.json();
|
|
34
|
+
return isRecord(value) && typeof value.error === "string" && value.error ? value.error : fallback;
|
|
35
|
+
} catch {
|
|
36
|
+
return fallback;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function createAgentRuntimeCapability(options) {
|
|
40
|
+
const fetchImplementation = options.fetchImplementation ?? fetch;
|
|
41
|
+
const now = options.now ?? Date.now;
|
|
42
|
+
let capability;
|
|
43
|
+
let pendingBootstrap;
|
|
44
|
+
const bootstrap = async () => {
|
|
45
|
+
const response = await fetchImplementation(`${options.runtimeOrigin}/webless/v1/bootstrap`, {
|
|
46
|
+
body: JSON.stringify({
|
|
47
|
+
clientSessionId: options.visitorSessionId,
|
|
48
|
+
indexId: options.indexId
|
|
49
|
+
}),
|
|
50
|
+
headers: { "content-type": "application/json" },
|
|
51
|
+
method: "POST"
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
throw new Error(await readBootstrapError(response));
|
|
55
|
+
}
|
|
56
|
+
let value;
|
|
57
|
+
try {
|
|
58
|
+
value = await response.json();
|
|
59
|
+
} catch {
|
|
60
|
+
throw new Error("Agent Runtime returned an invalid access response.");
|
|
61
|
+
}
|
|
62
|
+
return parseBootstrapResponse(value, options.indexId, now());
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
getAccessToken: async () => {
|
|
66
|
+
if (capability && capability.refreshAt > now()) {
|
|
67
|
+
return capability.accessToken;
|
|
68
|
+
}
|
|
69
|
+
pendingBootstrap ??= bootstrap().finally(() => {
|
|
70
|
+
pendingBootstrap = void 0;
|
|
71
|
+
});
|
|
72
|
+
capability = await pendingBootstrap;
|
|
73
|
+
return capability.accessToken;
|
|
74
|
+
},
|
|
75
|
+
invalidate: () => {
|
|
76
|
+
capability = void 0;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async function withCapabilityRefresh(capability, request) {
|
|
81
|
+
try {
|
|
82
|
+
return await request();
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if (!(error instanceof ClientError) || error.status !== 401) {
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
capability.invalidate();
|
|
88
|
+
return await request();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
10
92
|
// src/runtime/config.ts
|
|
11
93
|
var DEFAULT_RUNTIME_ORIGIN = "https://runtime.staging.webless.ai";
|
|
12
94
|
var trimTrailingSlash = (value) => value.replace(/\/+$/, "");
|
|
13
|
-
function buildEveHost(origin, indexId) {
|
|
95
|
+
function buildEveHost(origin, indexId, version = "published") {
|
|
14
96
|
const base = trimTrailingSlash(origin);
|
|
15
|
-
|
|
97
|
+
const searchParams = new URLSearchParams({ indexId: indexId.trim() });
|
|
98
|
+
if (version === "unpublished") {
|
|
99
|
+
searchParams.set("version", version);
|
|
100
|
+
}
|
|
101
|
+
return `${base}?${searchParams.toString()}`;
|
|
16
102
|
}
|
|
17
103
|
function resolveAgentRuntimeConfig(input) {
|
|
18
104
|
const origin = trimTrailingSlash(input.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);
|
|
19
105
|
const resolvedIndexId = input.indexId.trim();
|
|
106
|
+
const version = input.version ?? "published";
|
|
20
107
|
return {
|
|
21
108
|
origin,
|
|
22
109
|
indexId: resolvedIndexId,
|
|
23
|
-
|
|
110
|
+
version,
|
|
111
|
+
host: resolvedIndexId ? buildEveHost(origin, resolvedIndexId, version) : origin
|
|
24
112
|
};
|
|
25
113
|
}
|
|
26
114
|
|
|
@@ -37,7 +125,8 @@ function buildAgentStorageKeyPrefix(input) {
|
|
|
37
125
|
if (!indexId) {
|
|
38
126
|
throw new Error("indexId is required to build agent storage keys.");
|
|
39
127
|
}
|
|
40
|
-
|
|
128
|
+
const versionSuffix = input.version === "unpublished" ? ":unpublished" : "";
|
|
129
|
+
return `${DEFAULT_STORAGE_KEY_PREFIX}:${customerId}:${indexId}${versionSuffix}:${normalizeRuntimeOrigin(input.runtimeOrigin)}`;
|
|
41
130
|
}
|
|
42
131
|
function createSessionId() {
|
|
43
132
|
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
@@ -106,13 +195,20 @@ function mapStepLabel(event) {
|
|
|
106
195
|
};
|
|
107
196
|
}
|
|
108
197
|
var AgentSession = class {
|
|
109
|
-
constructor(indexId, runtimeOrigin, visitorSessionId, storeOptions) {
|
|
198
|
+
constructor(indexId, version, runtimeOrigin, visitorSessionId, storeOptions) {
|
|
110
199
|
this.indexId = indexId;
|
|
200
|
+
this.version = version;
|
|
111
201
|
this.runtimeOrigin = runtimeOrigin;
|
|
112
202
|
this.visitorSessionId = visitorSessionId;
|
|
113
203
|
this.storeOptions = storeOptions;
|
|
204
|
+
this.capability = createAgentRuntimeCapability({
|
|
205
|
+
indexId,
|
|
206
|
+
runtimeOrigin,
|
|
207
|
+
visitorSessionId
|
|
208
|
+
});
|
|
114
209
|
}
|
|
115
210
|
indexId;
|
|
211
|
+
version;
|
|
116
212
|
runtimeOrigin;
|
|
117
213
|
visitorSessionId;
|
|
118
214
|
storeOptions;
|
|
@@ -121,6 +217,7 @@ var AgentSession = class {
|
|
|
121
217
|
session;
|
|
122
218
|
activeResponse;
|
|
123
219
|
renderedPrefix = "";
|
|
220
|
+
capability;
|
|
124
221
|
getActiveSessionId() {
|
|
125
222
|
return this.session?.state.sessionId ?? loadPersistedAgentSession(this.visitorSessionId, this.storeOptions)?.sessionId;
|
|
126
223
|
}
|
|
@@ -143,6 +240,7 @@ var AgentSession = class {
|
|
|
143
240
|
ensureClient() {
|
|
144
241
|
const config = resolveAgentRuntimeConfig({
|
|
145
242
|
indexId: this.indexId,
|
|
243
|
+
version: this.version,
|
|
146
244
|
runtimeOrigin: this.runtimeOrigin
|
|
147
245
|
});
|
|
148
246
|
if (!config.indexId) {
|
|
@@ -152,7 +250,11 @@ var AgentSession = class {
|
|
|
152
250
|
return this.client;
|
|
153
251
|
}
|
|
154
252
|
this.reset();
|
|
155
|
-
this.client = new Client({
|
|
253
|
+
this.client = new Client({
|
|
254
|
+
auth: { bearer: () => this.capability.getAccessToken() },
|
|
255
|
+
host: config.host,
|
|
256
|
+
redirect: "error"
|
|
257
|
+
});
|
|
156
258
|
this.clientHost = config.host;
|
|
157
259
|
return this.client;
|
|
158
260
|
}
|
|
@@ -171,9 +273,13 @@ var AgentSession = class {
|
|
|
171
273
|
if (session) {
|
|
172
274
|
this.session = session;
|
|
173
275
|
try {
|
|
174
|
-
|
|
276
|
+
const activeSession = session;
|
|
277
|
+
response = await withCapabilityRefresh(
|
|
278
|
+
this.capability,
|
|
279
|
+
() => activeSession.send(message, { signal })
|
|
280
|
+
);
|
|
175
281
|
} catch (error) {
|
|
176
|
-
if (error instanceof
|
|
282
|
+
if (error instanceof ClientError2 && error.status === 409 && error.code === "session_not_active") {
|
|
177
283
|
clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);
|
|
178
284
|
this.session = void 0;
|
|
179
285
|
session = void 0;
|
|
@@ -183,7 +289,10 @@ var AgentSession = class {
|
|
|
183
289
|
}
|
|
184
290
|
}
|
|
185
291
|
if (!response) {
|
|
186
|
-
const created = await
|
|
292
|
+
const created = await withCapabilityRefresh(
|
|
293
|
+
this.capability,
|
|
294
|
+
() => client.sessions.create({ message, signal })
|
|
295
|
+
);
|
|
187
296
|
response = created.response;
|
|
188
297
|
session = created.session;
|
|
189
298
|
this.session = session;
|
|
@@ -241,18 +350,25 @@ function createAgentClient(options) {
|
|
|
241
350
|
if (!indexId) {
|
|
242
351
|
throw new Error("indexId is required.");
|
|
243
352
|
}
|
|
244
|
-
const
|
|
353
|
+
const version = options.version ?? "published";
|
|
354
|
+
const runtimeOrigin = resolveAgentRuntimeConfig({
|
|
355
|
+
indexId,
|
|
356
|
+
runtimeOrigin: options.runtimeOrigin,
|
|
357
|
+
version
|
|
358
|
+
}).origin;
|
|
245
359
|
const storeOptions = {
|
|
246
360
|
storageKeyPrefix: options.storageKeyPrefix?.trim() || buildAgentStorageKeyPrefix({
|
|
247
361
|
customerId: options.customerId,
|
|
248
362
|
indexId,
|
|
363
|
+
version,
|
|
249
364
|
runtimeOrigin
|
|
250
365
|
})
|
|
251
366
|
};
|
|
252
367
|
const visitorSessionId = options.visitorSessionId?.trim() || getOrCreateVisitorSessionId(storeOptions);
|
|
253
|
-
const session = new AgentSession(indexId, runtimeOrigin, visitorSessionId, storeOptions);
|
|
368
|
+
const session = new AgentSession(indexId, version, runtimeOrigin, visitorSessionId, storeOptions);
|
|
254
369
|
return {
|
|
255
370
|
indexId,
|
|
371
|
+
version,
|
|
256
372
|
runtimeOrigin,
|
|
257
373
|
visitorSessionId,
|
|
258
374
|
sendTurn: (message, sendOptions) => session.sendTurn(
|
|
@@ -267,9 +383,9 @@ function createAgentClient(options) {
|
|
|
267
383
|
}
|
|
268
384
|
|
|
269
385
|
// src/runtime/errors.ts
|
|
270
|
-
import { ClientError as
|
|
386
|
+
import { ClientError as ClientError3 } from "eve/client";
|
|
271
387
|
function formatAgentError(error) {
|
|
272
|
-
if (error instanceof
|
|
388
|
+
if (error instanceof ClientError3) {
|
|
273
389
|
if (error.status === 401 && error.code === "index_required") {
|
|
274
390
|
return "Missing indexId \u2014 pass a published index id to createAgentClient().";
|
|
275
391
|
}
|
|
@@ -335,6 +451,7 @@ async function runStatusSequence(signal, onStep) {
|
|
|
335
451
|
function useAgentChat({
|
|
336
452
|
customerId,
|
|
337
453
|
indexId,
|
|
454
|
+
version,
|
|
338
455
|
runtimeOrigin,
|
|
339
456
|
visitorSessionId,
|
|
340
457
|
storageKeyPrefix
|
|
@@ -342,8 +459,8 @@ function useAgentChat({
|
|
|
342
459
|
const [state, setState] = useState(INITIAL_STATE);
|
|
343
460
|
const runRef = useRef(null);
|
|
344
461
|
const resolvedStorageKeyPrefix = useMemo(
|
|
345
|
-
() => storageKeyPrefix?.trim() || buildAgentStorageKeyPrefix({ customerId, indexId, runtimeOrigin }),
|
|
346
|
-
[customerId, indexId, runtimeOrigin, storageKeyPrefix]
|
|
462
|
+
() => storageKeyPrefix?.trim() || buildAgentStorageKeyPrefix({ customerId, indexId, version, runtimeOrigin }),
|
|
463
|
+
[customerId, indexId, runtimeOrigin, storageKeyPrefix, version]
|
|
347
464
|
);
|
|
348
465
|
const visitorId = useMemo(
|
|
349
466
|
() => visitorSessionId?.trim() || getOrCreateVisitorSessionId({ storageKeyPrefix: resolvedStorageKeyPrefix }),
|
|
@@ -353,13 +470,14 @@ function useAgentChat({
|
|
|
353
470
|
createAgentClient({
|
|
354
471
|
customerId,
|
|
355
472
|
indexId,
|
|
473
|
+
version,
|
|
356
474
|
runtimeOrigin,
|
|
357
475
|
visitorSessionId: visitorId,
|
|
358
476
|
storageKeyPrefix: resolvedStorageKeyPrefix
|
|
359
477
|
})
|
|
360
478
|
);
|
|
361
479
|
const identityRef = useRef(null);
|
|
362
|
-
const identityKey = `${customerId ?? ""}|${indexId}|${runtimeOrigin ?? ""}|${resolvedStorageKeyPrefix}|${visitorId}`;
|
|
480
|
+
const identityKey = `${customerId ?? ""}|${indexId}|${version ?? "published"}|${runtimeOrigin ?? ""}|${resolvedStorageKeyPrefix}|${visitorId}`;
|
|
363
481
|
useEffect(() => {
|
|
364
482
|
if (identityRef.current === null) {
|
|
365
483
|
identityRef.current = identityKey;
|
|
@@ -375,12 +493,13 @@ function useAgentChat({
|
|
|
375
493
|
clientRef.current = createAgentClient({
|
|
376
494
|
customerId,
|
|
377
495
|
indexId,
|
|
496
|
+
version,
|
|
378
497
|
runtimeOrigin,
|
|
379
498
|
visitorSessionId: visitorId,
|
|
380
499
|
storageKeyPrefix: resolvedStorageKeyPrefix
|
|
381
500
|
});
|
|
382
501
|
setState(INITIAL_STATE);
|
|
383
|
-
}, [customerId, identityKey, indexId, runtimeOrigin, resolvedStorageKeyPrefix, visitorId]);
|
|
502
|
+
}, [customerId, identityKey, indexId, runtimeOrigin, resolvedStorageKeyPrefix, version, visitorId]);
|
|
384
503
|
const reset = useCallback(() => {
|
|
385
504
|
runRef.current?.abort();
|
|
386
505
|
runRef.current = null;
|
|
@@ -483,7 +602,7 @@ function useAgentChat({
|
|
|
483
602
|
}));
|
|
484
603
|
}
|
|
485
604
|
},
|
|
486
|
-
[customerId, indexId, runtimeOrigin, resolvedStorageKeyPrefix, visitorId]
|
|
605
|
+
[customerId, indexId, runtimeOrigin, resolvedStorageKeyPrefix, version, visitorId]
|
|
487
606
|
);
|
|
488
607
|
useEffect(() => {
|
|
489
608
|
return () => {
|
|
@@ -975,6 +1094,7 @@ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
|
975
1094
|
function AgentWidget({
|
|
976
1095
|
indexId,
|
|
977
1096
|
customerId,
|
|
1097
|
+
version,
|
|
978
1098
|
runtimeOrigin,
|
|
979
1099
|
placement: placementInput,
|
|
980
1100
|
defaultCollapsed = true,
|
|
@@ -987,6 +1107,7 @@ function AgentWidget({
|
|
|
987
1107
|
const { state, submit } = useAgentChat({
|
|
988
1108
|
customerId,
|
|
989
1109
|
indexId,
|
|
1110
|
+
version,
|
|
990
1111
|
runtimeOrigin
|
|
991
1112
|
});
|
|
992
1113
|
const idle = state.phase === "idle" && !hasVisitorMessages(state.messages);
|
|
@@ -1074,4 +1195,4 @@ export {
|
|
|
1074
1195
|
AssistEdgeTab,
|
|
1075
1196
|
AgentWidget
|
|
1076
1197
|
};
|
|
1077
|
-
//# sourceMappingURL=chunk-
|
|
1198
|
+
//# sourceMappingURL=chunk-4SMLPH3B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/hooks/useAgentChat.ts","../src/runtime/client.ts","../src/runtime/capability.ts","../src/runtime/config.ts","../src/runtime/session-store.ts","../src/runtime/errors.ts","../src/react/placement.ts","../src/react/components/AgentRail/AgentRail.tsx","../src/react/components/ToolTimeline/ToolTimeline.tsx","../src/react/components/AgentActivityBubble/AgentActivityBubble.tsx","../src/react/components/Composer/Composer.tsx","../src/react/components/FollowUpChips/FollowUpChips.tsx","../src/react/components/MessageBubble/MessageBubble.tsx","../src/react/components/AssistEdgeTab/AssistEdgeTab.tsx","../src/react/components/AgentWidget/AgentWidget.tsx","../src/react/hooks/useIsMobile.ts","../src/react/panel-controller.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createAgentClient } from \"../../runtime/client\";\nimport { formatAgentError } from \"../../runtime/errors\";\nimport type { AgentIndexVersion } from \"../../runtime/types\";\nimport {\n buildAgentStorageKeyPrefix,\n getOrCreateVisitorSessionId,\n} from \"../../runtime/session-store\";\nimport type {\n AgentRailPhase,\n AgentRailState,\n ConversationMessage,\n FollowUpSuggestion,\n ToolStep,\n} from \"../types/conversation\";\n\nconst GREETING_MESSAGE: ConversationMessage = {\n id: \"greeting\",\n role: \"agent\",\n text: \"Hi! I'm connected to the Webless Agent Runtime. Ask anything about your published site index.\",\n createdAt: 0,\n};\n\nconst INITIAL_STATE: AgentRailState = {\n phase: \"idle\",\n messages: [GREETING_MESSAGE],\n toolSteps: [],\n journey: null,\n followUps: [],\n streamingText: \"\",\n error: null,\n};\n\nconst STATUS_SEQUENCE: Array<{ id: string; label: string; detail?: string; ms: number }> = [\n { id: \"s1\", label: \"Starting Eve session\", ms: 400 },\n { id: \"s2\", label: \"Connecting to runtime\", ms: 500 },\n];\n\nconst DEFAULT_FOLLOW_UPS: FollowUpSuggestion[] = [\n { id: \"fu-1\", label: \"What can you help me with?\" },\n { id: \"fu-2\", label: \"Summarize your capabilities\" },\n { id: \"fu-3\", label: \"What should I ask next?\" },\n];\n\nfunction delay(ms: number, signal: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n const timer = window.setTimeout(resolve, ms);\n signal.addEventListener(\n \"abort\",\n () => {\n window.clearTimeout(timer);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n}\n\nasync function runStatusSequence(signal: AbortSignal, onStep: (step: ToolStep) => void) {\n for (const item of STATUS_SEQUENCE) {\n onStep({ id: item.id, label: item.label, detail: item.detail, state: \"active\" });\n await delay(item.ms, signal);\n }\n}\n\nexport type UseAgentChatOptions = {\n customerId?: string;\n indexId: string;\n version?: AgentIndexVersion;\n runtimeOrigin?: string;\n visitorSessionId?: string;\n storageKeyPrefix?: string;\n};\n\nexport function useAgentChat({\n customerId,\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId,\n storageKeyPrefix,\n}: UseAgentChatOptions) {\n const [state, setState] = useState<AgentRailState>(INITIAL_STATE);\n const runRef = useRef<AbortController | null>(null);\n const resolvedStorageKeyPrefix = useMemo(\n () =>\n storageKeyPrefix?.trim() ||\n buildAgentStorageKeyPrefix({ customerId, indexId, version, runtimeOrigin }),\n [customerId, indexId, runtimeOrigin, storageKeyPrefix, version],\n );\n const visitorId = useMemo(\n () =>\n visitorSessionId?.trim() ||\n getOrCreateVisitorSessionId({ storageKeyPrefix: resolvedStorageKeyPrefix }),\n [resolvedStorageKeyPrefix, visitorSessionId],\n );\n const clientRef = useRef(\n createAgentClient({\n customerId,\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId: visitorId,\n storageKeyPrefix: resolvedStorageKeyPrefix,\n }),\n );\n const identityRef = useRef<string | null>(null);\n const identityKey = `${customerId ?? \"\"}|${indexId}|${version ?? \"published\"}|${runtimeOrigin ?? \"\"}|${resolvedStorageKeyPrefix}|${visitorId}`;\n\n useEffect(() => {\n if (identityRef.current === null) {\n identityRef.current = identityKey;\n return;\n }\n\n if (identityRef.current === identityKey) {\n return;\n }\n\n identityRef.current = identityKey;\n runRef.current?.abort();\n runRef.current = null;\n clientRef.current.reset();\n clientRef.current = createAgentClient({\n customerId,\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId: visitorId,\n storageKeyPrefix: resolvedStorageKeyPrefix,\n });\n setState(INITIAL_STATE);\n }, [customerId, identityKey, indexId, runtimeOrigin, resolvedStorageKeyPrefix, version, visitorId]);\n\n const reset = useCallback(() => {\n runRef.current?.abort();\n runRef.current = null;\n clientRef.current.reset();\n setState(INITIAL_STATE);\n }, []);\n\n const submit = useCallback(\n async (visitorText: string) => {\n runRef.current?.abort();\n clientRef.current.cancelActive();\n const controller = new AbortController();\n runRef.current = controller;\n const { signal } = controller;\n const isActiveRun = () => runRef.current === controller && !signal.aborted;\n\n const visitorMessage: ConversationMessage = {\n id: `visitor-${Date.now()}`,\n role: \"visitor\",\n text: visitorText,\n createdAt: Date.now(),\n };\n\n setState((prev) => ({\n ...prev,\n phase: \"thinking\",\n messages: [...prev.messages, visitorMessage],\n toolSteps: [{ id: \"s1\", label: \"Starting Eve session\", state: \"active\" }],\n journey: null,\n followUps: [],\n streamingText: \"\",\n error: null,\n }));\n\n try {\n let streamStarted = false;\n const planningPromise = runStatusSequence(signal, (step) => {\n if (streamStarted || !isActiveRun()) return;\n setState((prev) => ({ ...prev, phase: \"running-tools\", toolSteps: [step] }));\n });\n\n let streamed = \"\";\n const finalText = await clientRef.current.sendTurn(visitorText, {\n signal,\n handlers: {\n onStep: (label, detail) => {\n if (streamStarted || !isActiveRun()) return;\n setState((prev) => ({\n ...prev,\n phase: \"running-tools\",\n toolSteps: [{ id: `step-${label}`, label, detail, state: \"active\" }],\n }));\n },\n onDelta: (delta) => {\n if (!isActiveRun()) return;\n void planningPromise.catch(() => {});\n if (!streamStarted) {\n streamStarted = true;\n setState((prev) => ({\n ...prev,\n phase: \"streaming\",\n toolSteps: [],\n streamingText: \"\",\n }));\n }\n streamed += delta;\n setState((prev) => ({ ...prev, phase: \"streaming\", streamingText: streamed }));\n },\n onComplete: () => {\n if (!isActiveRun()) return;\n streamStarted = true;\n },\n },\n });\n\n await planningPromise.catch(() => {});\n if (!isActiveRun()) return;\n\n const agentMessage: ConversationMessage = {\n id: `agent-${Date.now()}`,\n role: \"agent\",\n text: finalText,\n createdAt: Date.now(),\n };\n\n setState((prev) => ({\n ...prev,\n phase: \"complete\",\n messages: [...prev.messages, agentMessage],\n toolSteps: [],\n streamingText: \"\",\n followUps: DEFAULT_FOLLOW_UPS,\n journey: null,\n }));\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") return;\n if (!isActiveRun()) return;\n const message = formatAgentError(error);\n if (!message) return;\n setState((prev) => ({\n ...prev,\n phase: \"complete\",\n toolSteps: [],\n streamingText: \"\",\n error: message,\n }));\n }\n },\n [customerId, indexId, runtimeOrigin, resolvedStorageKeyPrefix, version, visitorId],\n );\n\n useEffect(() => {\n return () => {\n runRef.current?.abort();\n clientRef.current.cancelActive();\n };\n }, []);\n\n return {\n state,\n reset,\n submit,\n visitorSessionId: visitorId,\n sessionId: clientRef.current.getActiveSessionId(),\n };\n}\n\nexport function hasVisitorMessages(messages: ConversationMessage[]) {\n return messages.some((message) => message.role === \"visitor\");\n}\n\nexport function createIdleSuggestions(): FollowUpSuggestion[] {\n return [\n { id: \"idle-1\", label: \"Hello — what can you do?\" },\n { id: \"idle-2\", label: \"Help me evaluate this product\" },\n { id: \"idle-3\", label: \"What should I ask you?\" },\n ];\n}\n\nexport function isAgentBusy(phase: AgentRailPhase) {\n return phase === \"thinking\" || phase === \"running-tools\" || phase === \"streaming\";\n}\n","import {\n Client,\n ClientError,\n type ClientSession,\n type MessageResponse,\n type MessageStreamEvent,\n} from \"eve/client\";\nimport {\n createAgentRuntimeCapability,\n type AgentRuntimeCapability,\n withCapabilityRefresh,\n} from \"./capability\";\nimport { resolveAgentRuntimeConfig } from \"./config\";\nimport {\n buildAgentStorageKeyPrefix,\n clearPersistedAgentSession,\n getOrCreateVisitorSessionId,\n loadPersistedAgentSession,\n savePersistedAgentSession,\n type SessionStoreOptions,\n} from \"./session-store\";\nimport type {\n AgentClient,\n AgentClientOptions,\n AgentIndexVersion,\n AgentSendTurnOptions,\n AgentStreamHandlers,\n} from \"./types\";\n\nfunction mapStepLabel(event: MessageStreamEvent): { label: string; detail?: string } | null {\n if (event.type !== \"step.started\") return null;\n const stepIndex = event.data.stepIndex;\n return {\n label: \"Model step running\",\n detail: typeof stepIndex === \"number\" ? `Step ${stepIndex + 1}` : undefined,\n };\n}\n\nclass AgentSession {\n private client: Client | undefined;\n private clientHost: string | undefined;\n private session: ClientSession | undefined;\n private activeResponse: MessageResponse | undefined;\n private renderedPrefix = \"\";\n private readonly capability: AgentRuntimeCapability;\n\n constructor(\n private readonly indexId: string,\n private readonly version: AgentIndexVersion,\n private readonly runtimeOrigin: string,\n private readonly visitorSessionId: string,\n private readonly storeOptions: SessionStoreOptions,\n ) {\n this.capability = createAgentRuntimeCapability({\n indexId,\n runtimeOrigin,\n visitorSessionId,\n });\n }\n\n getActiveSessionId(): string | undefined {\n return (\n this.session?.state.sessionId ??\n loadPersistedAgentSession(this.visitorSessionId, this.storeOptions)?.sessionId\n );\n }\n\n reset() {\n void this.activeResponse?.cancel().catch(() => {});\n this.activeResponse = undefined;\n this.session = undefined;\n this.renderedPrefix = \"\";\n clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);\n }\n\n private persistSessionCursor(session: ClientSession) {\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n session.state.streamIndex,\n this.storeOptions,\n );\n }\n\n private ensureClient(): Client {\n const config = resolveAgentRuntimeConfig({\n indexId: this.indexId,\n version: this.version,\n runtimeOrigin: this.runtimeOrigin,\n });\n if (!config.indexId) {\n throw new Error(\"indexId is required.\");\n }\n\n if (this.client && this.clientHost === config.host) {\n return this.client;\n }\n\n this.reset();\n this.client = new Client({\n auth: { bearer: () => this.capability.getAccessToken() },\n host: config.host,\n redirect: \"error\",\n });\n this.clientHost = config.host;\n return this.client;\n }\n\n private attachPersistedSession(client: Client): ClientSession | undefined {\n const persisted = loadPersistedAgentSession(this.visitorSessionId, this.storeOptions);\n if (!persisted?.sessionId) return undefined;\n\n this.renderedPrefix = \"\";\n return client.sessions.attach(persisted.sessionId, {\n streamIndex: persisted.streamIndex,\n });\n }\n\n async sendTurn(\n message: string,\n signal: AbortSignal,\n handlers: AgentStreamHandlers,\n ): Promise<string> {\n const client = this.ensureClient();\n let response: MessageResponse | undefined;\n let session = this.session ?? this.attachPersistedSession(client);\n\n if (session) {\n this.session = session;\n try {\n const activeSession = session;\n response = await withCapabilityRefresh(this.capability, () =>\n activeSession.send(message, { signal }),\n );\n } catch (error) {\n if (\n error instanceof ClientError &&\n error.status === 409 &&\n error.code === \"session_not_active\"\n ) {\n clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);\n this.session = undefined;\n session = undefined;\n } else {\n throw error;\n }\n }\n }\n\n if (!response) {\n const created = await withCapabilityRefresh(this.capability, () =>\n client.sessions.create({ message, signal }),\n );\n response = created.response;\n session = created.session;\n this.session = session;\n this.renderedPrefix = \"\";\n this.persistSessionCursor(session);\n }\n\n this.activeResponse = response;\n let rendered = this.renderedPrefix;\n\n try {\n for await (const event of response) {\n if (signal.aborted) break;\n\n const step = mapStepLabel(event);\n if (step) handlers.onStep?.(step.label, step.detail);\n\n if (event.type === \"message.appended\") {\n const { messageDelta, messageSoFar } = event.data;\n let delta = messageDelta;\n if (messageSoFar.startsWith(rendered)) {\n delta = messageSoFar.slice(rendered.length);\n rendered = messageSoFar;\n } else if (messageDelta) {\n rendered += messageDelta;\n }\n if (delta) handlers.onDelta(delta);\n }\n\n if (event.type === \"message.completed\") {\n handlers.onComplete?.();\n }\n\n if (event.type === \"session.failed\") {\n throw new Error(event.data.message || event.data.code);\n }\n }\n } finally {\n this.activeResponse = undefined;\n this.renderedPrefix = rendered;\n if (session) {\n this.persistSessionCursor(session);\n }\n }\n\n if (!rendered.trim() && !signal.aborted) {\n throw new Error(\"Empty response from runtime\");\n }\n\n if (signal.aborted) {\n await response.cancel().catch(() => {});\n }\n\n return rendered.trim();\n }\n\n cancelActive() {\n this.activeResponse?.cancel().catch(() => {});\n }\n}\n\nexport function createAgentClient(options: AgentClientOptions): AgentClient {\n const indexId = options.indexId.trim();\n if (!indexId) {\n throw new Error(\"indexId is required.\");\n }\n\n const version = options.version ?? \"published\";\n const runtimeOrigin = resolveAgentRuntimeConfig({\n indexId,\n runtimeOrigin: options.runtimeOrigin,\n version,\n }).origin;\n const storeOptions: SessionStoreOptions = {\n storageKeyPrefix:\n options.storageKeyPrefix?.trim() ||\n buildAgentStorageKeyPrefix({\n customerId: options.customerId,\n indexId,\n version,\n runtimeOrigin,\n }),\n };\n const visitorSessionId =\n options.visitorSessionId?.trim() || getOrCreateVisitorSessionId(storeOptions);\n\n const session = new AgentSession(indexId, version, runtimeOrigin, visitorSessionId, storeOptions);\n\n return {\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId,\n sendTurn: (message, sendOptions: AgentSendTurnOptions) =>\n session.sendTurn(\n message,\n sendOptions.signal ?? new AbortController().signal,\n sendOptions.handlers,\n ),\n reset: () => session.reset(),\n cancelActive: () => session.cancelActive(),\n getActiveSessionId: () => session.getActiveSessionId(),\n };\n}\n","import { ClientError } from \"eve/client\";\n\ntype RuntimeCapability = {\n accessToken: string;\n refreshAt: number;\n};\n\ntype AgentRuntimeCapabilityOptions = {\n indexId: string;\n runtimeOrigin: string;\n visitorSessionId: string;\n fetchImplementation?: typeof fetch;\n now?: () => number;\n};\n\nconst MAX_REFRESH_SKEW_MS = 30_000;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseBootstrapResponse(value: unknown, indexId: string, now: number): RuntimeCapability {\n if (\n !isRecord(value) ||\n value.apiVersion !== \"webless.ai/agent-runtime-bootstrap/v1\" ||\n typeof value.accessToken !== \"string\" ||\n !value.accessToken ||\n typeof value.expiresAt !== \"string\" ||\n !isRecord(value.identity) ||\n value.identity.indexId !== indexId ||\n typeof value.identity.revision !== \"string\" ||\n !value.identity.revision ||\n typeof value.identity.tenantId !== \"string\" ||\n !value.identity.tenantId ||\n typeof value.origin !== \"string\" ||\n !value.origin ||\n value.tokenType !== \"Bearer\" ||\n typeof value.visitorSubject !== \"string\" ||\n !value.visitorSubject\n ) {\n throw new Error(\"Agent Runtime returned an invalid access response.\");\n }\n\n const expiresAt = Date.parse(value.expiresAt);\n if (!Number.isFinite(expiresAt) || expiresAt <= now) {\n throw new Error(\"Agent Runtime returned an expired access response.\");\n }\n\n const refreshSkew = Math.min(MAX_REFRESH_SKEW_MS, Math.floor((expiresAt - now) / 10));\n return {\n accessToken: value.accessToken,\n refreshAt: expiresAt - refreshSkew,\n };\n}\n\nasync function readBootstrapError(response: Response): Promise<string> {\n const fallback = `Agent Runtime is unavailable (${response.status}).`;\n try {\n const value: unknown = await response.json();\n return isRecord(value) && typeof value.error === \"string\" && value.error\n ? value.error\n : fallback;\n } catch {\n return fallback;\n }\n}\n\nexport function createAgentRuntimeCapability(options: AgentRuntimeCapabilityOptions) {\n const fetchImplementation = options.fetchImplementation ?? fetch;\n const now = options.now ?? Date.now;\n let capability: RuntimeCapability | undefined;\n let pendingBootstrap: Promise<RuntimeCapability> | undefined;\n\n const bootstrap = async (): Promise<RuntimeCapability> => {\n const response = await fetchImplementation(`${options.runtimeOrigin}/webless/v1/bootstrap`, {\n body: JSON.stringify({\n clientSessionId: options.visitorSessionId,\n indexId: options.indexId,\n }),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n });\n if (!response.ok) {\n throw new Error(await readBootstrapError(response));\n }\n\n let value: unknown;\n try {\n value = await response.json();\n } catch {\n throw new Error(\"Agent Runtime returned an invalid access response.\");\n }\n return parseBootstrapResponse(value, options.indexId, now());\n };\n\n return {\n getAccessToken: async (): Promise<string> => {\n if (capability && capability.refreshAt > now()) {\n return capability.accessToken;\n }\n\n pendingBootstrap ??= bootstrap().finally(() => {\n pendingBootstrap = undefined;\n });\n capability = await pendingBootstrap;\n return capability.accessToken;\n },\n invalidate: () => {\n capability = undefined;\n },\n };\n}\n\nexport type AgentRuntimeCapability = ReturnType<typeof createAgentRuntimeCapability>;\n\nexport async function withCapabilityRefresh<T>(\n capability: AgentRuntimeCapability,\n request: () => Promise<T>,\n): Promise<T> {\n try {\n return await request();\n } catch (error) {\n if (!(error instanceof ClientError) || error.status !== 401) {\n throw error;\n }\n capability.invalidate();\n return await request();\n }\n}\n","import type { AgentIndexVersion, AgentRuntimeConfig } from \"./types\";\n\nexport const DEFAULT_RUNTIME_ORIGIN = \"https://runtime.staging.webless.ai\";\n\nconst trimTrailingSlash = (value: string) => value.replace(/\\/+$/, \"\");\n\nexport function buildEveHost(\n origin: string,\n indexId: string,\n version: AgentIndexVersion = \"published\",\n): string {\n const base = trimTrailingSlash(origin);\n const searchParams = new URLSearchParams({ indexId: indexId.trim() });\n if (version === \"unpublished\") {\n searchParams.set(\"version\", version);\n }\n return `${base}?${searchParams.toString()}`;\n}\n\nexport function resolveAgentRuntimeConfig(input: {\n indexId: string;\n runtimeOrigin?: string;\n version?: AgentIndexVersion;\n}): AgentRuntimeConfig {\n const origin = trimTrailingSlash(input.runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);\n const resolvedIndexId = input.indexId.trim();\n const version = input.version ?? \"published\";\n\n return {\n origin,\n indexId: resolvedIndexId,\n version,\n host: resolvedIndexId ? buildEveHost(origin, resolvedIndexId, version) : origin,\n };\n}\n\nexport function agentHealthUrl(runtimeOrigin?: string): string {\n const origin = trimTrailingSlash(runtimeOrigin?.trim() || DEFAULT_RUNTIME_ORIGIN);\n return `${origin}/eve/v1/health`;\n}\n","import type { AgentIndexVersion, PersistedAgentSession } from \"./types\";\n\nconst DEFAULT_STORAGE_KEY_PREFIX = \"webless:agent\";\n\nexport type SessionStoreOptions = {\n storageKeyPrefix?: string;\n};\n\nfunction normalizeRuntimeOrigin(runtimeOrigin?: string) {\n const trimmed = runtimeOrigin?.trim();\n if (!trimmed) return \"_\";\n return trimmed.replace(/\\/+$/, \"\");\n}\n\nexport function buildAgentStorageKeyPrefix(input: {\n customerId?: string;\n indexId: string;\n runtimeOrigin?: string;\n version?: AgentIndexVersion;\n}) {\n const customerId = input.customerId?.trim() || \"_\";\n const indexId = input.indexId.trim();\n if (!indexId) {\n throw new Error(\"indexId is required to build agent storage keys.\");\n }\n\n const versionSuffix = input.version === \"unpublished\" ? \":unpublished\" : \"\";\n return `${DEFAULT_STORAGE_KEY_PREFIX}:${customerId}:${indexId}${versionSuffix}:${normalizeRuntimeOrigin(input.runtimeOrigin)}`;\n}\n\nfunction createSessionId(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n return `sess_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\n}\n\nfunction resolvePrefix(options?: SessionStoreOptions) {\n return options?.storageKeyPrefix?.trim() || DEFAULT_STORAGE_KEY_PREFIX;\n}\n\nexport function getOrCreateVisitorSessionId(options?: SessionStoreOptions): string {\n const prefix = resolvePrefix(options);\n const visitorKey = `${prefix}:visitorSessionId`;\n\n if (typeof sessionStorage === \"undefined\") {\n return createSessionId();\n }\n\n const existing = sessionStorage.getItem(visitorKey)?.trim();\n if (existing) return existing;\n\n const next = createSessionId();\n sessionStorage.setItem(visitorKey, next);\n return next;\n}\n\nexport function clearVisitorSessionId(options?: SessionStoreOptions) {\n if (typeof sessionStorage === \"undefined\") return;\n\n const prefix = resolvePrefix(options);\n sessionStorage.removeItem(`${prefix}:visitorSessionId`);\n}\n\nfunction runtimeSessionIdKey(visitorSessionId: string, prefix: string) {\n return `${prefix}:eve:${visitorSessionId}:sessionId`;\n}\n\nfunction runtimeStreamIndexKey(visitorSessionId: string, prefix: string) {\n return `${prefix}:eve:${visitorSessionId}:streamIndex`;\n}\n\nexport function loadPersistedAgentSession(\n visitorSessionId: string,\n options?: SessionStoreOptions,\n): PersistedAgentSession | null {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim()) return null;\n\n const prefix = resolvePrefix(options);\n const sessionId = sessionStorage.getItem(runtimeSessionIdKey(visitorSessionId, prefix))?.trim();\n if (!sessionId) return null;\n\n const rawIndex = sessionStorage.getItem(runtimeStreamIndexKey(visitorSessionId, prefix));\n const streamIndex = rawIndex ? Number.parseInt(rawIndex, 10) : 0;\n\n return {\n sessionId,\n streamIndex: Number.isFinite(streamIndex) && streamIndex >= 0 ? streamIndex : 0,\n };\n}\n\nexport function savePersistedAgentSession(\n visitorSessionId: string,\n sessionId: string,\n streamIndex: number,\n options?: SessionStoreOptions,\n) {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim() || !sessionId.trim()) {\n return;\n }\n\n const prefix = resolvePrefix(options);\n sessionStorage.setItem(runtimeSessionIdKey(visitorSessionId, prefix), sessionId);\n sessionStorage.setItem(\n runtimeStreamIndexKey(visitorSessionId, prefix),\n String(Math.max(0, streamIndex)),\n );\n}\n\nexport function clearPersistedAgentSession(\n visitorSessionId: string,\n options?: SessionStoreOptions,\n) {\n if (typeof sessionStorage === \"undefined\" || !visitorSessionId.trim()) return;\n const prefix = resolvePrefix(options);\n sessionStorage.removeItem(runtimeSessionIdKey(visitorSessionId, prefix));\n sessionStorage.removeItem(runtimeStreamIndexKey(visitorSessionId, prefix));\n}\n","import { ClientError } from \"eve/client\";\n\nexport function formatAgentError(error: unknown): string {\n if (error instanceof ClientError) {\n if (error.status === 401 && error.code === \"index_required\") {\n return \"Missing indexId — pass a published index id to createAgentClient().\";\n }\n if (error.status === 403 && error.code === \"agent_unavailable\") {\n return \"Agent unavailable for this index (disabled or unpublished).\";\n }\n if (error.status === 409 && error.code === \"session_not_active\") {\n return \"Session expired — send a new message to start again.\";\n }\n return error.message || `Runtime error (${error.status})`;\n }\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return \"\";\n }\n if (error instanceof Error) return error.message;\n return \"Runtime request failed\";\n}\n","import type { AssistTabSide, AssistTabVariant } from \"./components/AssistEdgeTab/AssistEdgeTab\";\n\nexport type AgentPlacementConfig = {\n side: AssistTabSide;\n along: number;\n inset: number;\n variant: AssistTabVariant;\n};\n\nexport const DEFAULT_AGENT_PLACEMENT: AgentPlacementConfig = {\n side: \"right\",\n along: 50,\n inset: 0,\n variant: \"outline\",\n};\n\nexport function normalizeAgentPlacement(\n placement?: Partial<AgentPlacementConfig>,\n): AgentPlacementConfig {\n const along = placement?.along ?? DEFAULT_AGENT_PLACEMENT.along;\n return {\n side: placement?.side ?? DEFAULT_AGENT_PLACEMENT.side,\n along: Math.min(100, Math.max(0, along)),\n inset: Math.max(0, placement?.inset ?? DEFAULT_AGENT_PLACEMENT.inset),\n variant: placement?.variant ?? DEFAULT_AGENT_PLACEMENT.variant,\n };\n}\n","import { useEffect, useRef, type CSSProperties } from \"react\";\nimport type { AgentRailState, AgentRailTheme } from \"../../types/conversation\";\nimport { AgentActivityBubble } from \"../AgentActivityBubble/AgentActivityBubble\";\nimport { Composer } from \"../Composer/Composer\";\nimport { FollowUpChips } from \"../FollowUpChips/FollowUpChips\";\nimport { MessageBubble } from \"../MessageBubble/MessageBubble\";\nimport \"./AgentRail.css\";\n\nfunction MinimizeIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3.5 8h9\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction ExpandIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M6 3.5H3.5V6M10 3.5h2.5V6M10 12.5h2.5V10M6 12.5H3.5V10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction RestoreIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M5.5 5.5H3.5V7.5M10.5 5.5h2V7.5M10.5 10.5h2V8.5M5.5 10.5H3.5V8.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport type AgentRailProps = {\n state: AgentRailState;\n theme?: Partial<AgentRailTheme>;\n brandLabel?: string;\n poweredByLabel?: string;\n composerPlaceholder?: string;\n mobileFullscreen?: boolean;\n expanded?: boolean;\n onCollapse?: () => void;\n onClose?: () => void;\n onExpandToggle?: () => void;\n onSubmit?: (message: string) => void;\n onFollowUpSelect?: (label: string) => void;\n};\n\nexport function AgentRail({\n state,\n theme,\n brandLabel = \"Webless Assist\",\n poweredByLabel = \"Powered by Webless\",\n composerPlaceholder = \"Ask anything…\",\n mobileFullscreen = false,\n expanded = false,\n onCollapse,\n onClose,\n onExpandToggle,\n onSubmit,\n onFollowUpSelect,\n}: AgentRailProps) {\n const transcriptRef = useRef<HTMLDivElement>(null);\n const railStyle = theme?.railMaxWidth\n ? ({ [\"--rail-width\" as string]: theme.railMaxWidth, [\"--as-rail-max-width\" as string]: theme.railMaxWidth } as CSSProperties)\n : undefined;\n\n const isBusy =\n state.phase === \"thinking\" ||\n state.phase === \"running-tools\" ||\n state.phase === \"streaming\";\n\n const showActivity =\n state.toolSteps.length > 0 &&\n (state.phase === \"thinking\" ||\n state.phase === \"running-tools\" ||\n state.phase === \"streaming\");\n\n const showStreamingInActivity =\n state.phase === \"streaming\" && Boolean(state.streamingText);\n\n const hasVisitorMessages = state.messages.some((message) => message.role === \"visitor\");\n const showIdleFollowUps = !hasVisitorMessages && state.followUps.length > 0;\n const showCompleteFollowUps =\n state.phase === \"complete\" && state.followUps.length > 0 && hasVisitorMessages;\n const showDockFollowUps = expanded && (showIdleFollowUps || showCompleteFollowUps);\n\n useEffect(() => {\n const node = transcriptRef.current;\n if (!node) return;\n node.scrollTop = node.scrollHeight;\n }, [state.messages, state.toolSteps, state.streamingText, state.followUps, state.journey]);\n\n return (\n <aside\n className={`agent-rail${mobileFullscreen ? \" agent-rail--mobile-fullscreen\" : \"\"}${expanded ? \" agent-rail--expanded\" : \"\"}`}\n style={railStyle}\n aria-label=\"Agent conversation\"\n >\n <header className=\"agent-rail__header\">\n <div className=\"agent-rail__brand-row\">\n {onCollapse ? (\n <button\n type=\"button\"\n className=\"agent-rail__collapse\"\n aria-label=\"Collapse assist\"\n onClick={onCollapse}\n >\n <MinimizeIcon />\n </button>\n ) : onClose ? (\n <button type=\"button\" className=\"agent-rail__close\" aria-label=\"Close agent\" onClick={onClose}>\n <MinimizeIcon />\n </button>\n ) : (\n <span className=\"agent-rail__brand-spacer\" aria-hidden=\"true\" />\n )}\n <span className=\"agent-rail__brand-label\">{brandLabel}</span>\n {onExpandToggle ? (\n <button\n type=\"button\"\n className=\"agent-rail__expand\"\n aria-label={expanded ? \"Restore assist panel\" : \"Expand assist panel\"}\n onClick={onExpandToggle}\n >\n {expanded ? <RestoreIcon /> : <ExpandIcon />}\n </button>\n ) : (\n <span className=\"agent-rail__brand-spacer\" aria-hidden=\"true\" />\n )}\n </div>\n </header>\n\n <div ref={transcriptRef} className=\"agent-rail__transcript\">\n {state.messages.map((message) => (\n <MessageBubble key={message.id} message={message} />\n ))}\n\n {showActivity ? (\n <AgentActivityBubble\n steps={state.toolSteps}\n streamingText={state.streamingText}\n showStreaming={showStreamingInActivity}\n />\n ) : null}\n\n {!expanded && showIdleFollowUps ? (\n <div className=\"agent-rail__followups-slot\">\n <FollowUpChips\n suggestions={state.followUps}\n disabled={isBusy}\n label=\"Try asking\"\n onSelect={(suggestion) => onFollowUpSelect?.(suggestion.label)}\n />\n </div>\n ) : null}\n\n {!expanded && showCompleteFollowUps ? (\n <div className=\"agent-rail__followups-slot\">\n <FollowUpChips\n suggestions={state.followUps}\n disabled={isBusy}\n onSelect={(suggestion) => onFollowUpSelect?.(suggestion.label)}\n />\n </div>\n ) : null}\n\n {state.error ? (\n <p role=\"alert\" style={{ fontSize: 13, color: \"var(--as-danger)\", margin: 0 }}>\n {state.error}\n </p>\n ) : null}\n </div>\n\n {expanded ? (\n <div className=\"agent-rail__dock-wrap\">\n {showDockFollowUps ? (\n <div className=\"agent-rail__dock-followups\">\n <FollowUpChips\n variant=\"dock\"\n suggestions={state.followUps}\n disabled={isBusy}\n onSelect={(suggestion) => onFollowUpSelect?.(suggestion.label)}\n />\n </div>\n ) : null}\n <div className=\"agent-rail__dock\">\n <Composer\n variant=\"dock\"\n disabled={isBusy}\n placeholder={composerPlaceholder}\n onSubmit={onSubmit}\n />\n </div>\n <div className=\"agent-rail__footer\">\n <p className=\"agent-rail__footer-disclaimer\">AI can make mistakes. Check important info.</p>\n <p className=\"agent-rail__footer-note\">{poweredByLabel}</p>\n </div>\n </div>\n ) : (\n <div className=\"agent-rail__composer-wrap\">\n <Composer\n disabled={isBusy}\n placeholder={composerPlaceholder}\n onSubmit={onSubmit}\n />\n <div className=\"agent-rail__footer\">\n <p className=\"agent-rail__footer-disclaimer\">AI can make mistakes. Check important info.</p>\n <p className=\"agent-rail__footer-note\">{poweredByLabel}</p>\n </div>\n </div>\n )}\n </aside>\n );\n}\n","import type { ToolStep } from \"../../types/conversation\";\nimport \"./ToolTimeline.css\";\n\nfunction SpinnerIcon() {\n return (\n <svg className=\"agent-status__spinner\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeOpacity=\"0.25\" />\n <path d=\"M14 8a6 6 0 0 0-6-6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction getCurrentStep(steps: ToolStep[]): ToolStep | null {\n const active = steps.find((step) => step.state === \"active\");\n if (active) return active;\n\n const error = steps.find((step) => step.state === \"error\");\n if (error) return error;\n\n const pending = steps.find((step) => step.state === \"pending\");\n if (pending) return pending;\n\n return steps.at(-1) ?? null;\n}\n\nexport function ToolTimeline({\n steps,\n streamingText,\n showStreaming = false,\n inline = false,\n}: {\n steps: ToolStep[];\n streamingText?: string;\n showStreaming?: boolean;\n inline?: boolean;\n}) {\n if (steps.length === 0 && !(showStreaming && streamingText)) return null;\n\n const currentStep = getCurrentStep(steps);\n const showStatus = currentStep && currentStep.state !== \"completed\" && !(showStreaming && streamingText);\n\n return (\n <div\n className={`tool-timeline${inline ? \" tool-timeline--inline\" : \"\"}`}\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Agent progress\"\n >\n {showStatus ? (\n <div className=\"agent-status\" key={currentStep.id}>\n {currentStep.state === \"error\" ? (\n <span className=\"agent-status__icon agent-status__icon--error\" aria-hidden=\"true\">\n !\n </span>\n ) : (\n <span className=\"agent-status__icon\" aria-hidden=\"true\">\n <SpinnerIcon />\n </span>\n )}\n <div className=\"agent-status__copy\">\n <span className=\"agent-status__label\">{currentStep.label}</span>\n {currentStep.detail ? (\n <span className=\"agent-status__detail\">{currentStep.detail}</span>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {showStreaming && streamingText ? (\n <p className=\"tool-timeline__streaming-text\">\n {streamingText}\n <span className=\"tool-timeline__cursor\" aria-hidden=\"true\" />\n </p>\n ) : null}\n </div>\n );\n}\n","import type { ToolStep } from \"../../types/conversation\";\nimport { ToolTimeline } from \"../ToolTimeline/ToolTimeline\";\nimport \"./AgentActivityBubble.css\";\n\nexport function AgentActivityBubble({\n steps,\n streamingText,\n showStreaming = false,\n}: {\n steps: ToolStep[];\n streamingText?: string;\n showStreaming?: boolean;\n}) {\n return (\n <article className=\"agent-activity-bubble\">\n <div className=\"agent-activity-bubble__shell\">\n <ToolTimeline\n steps={steps}\n streamingText={streamingText}\n showStreaming={showStreaming}\n inline\n />\n </div>\n </article>\n );\n}\n","import { useRef, useState, type FormEvent, type KeyboardEvent } from \"react\";\nimport \"./Composer.css\";\n\nfunction SendIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8 12V4M8 4l-3 3M8 4l3 3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nexport function Composer({\n disabled = false,\n placeholder = \"Ask anything…\",\n variant = \"default\",\n onSubmit,\n}: {\n disabled?: boolean;\n placeholder?: string;\n variant?: \"default\" | \"dock\";\n onSubmit?: (message: string) => void;\n}) {\n const [value, setValue] = useState(\"\");\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n function submitCurrent() {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n onSubmit?.(trimmed);\n setValue(\"\");\n inputRef.current?.focus();\n }\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault();\n submitCurrent();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLTextAreaElement>) {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submitCurrent();\n }\n }\n\n return (\n <form className={`composer${variant === \"dock\" ? \" composer--dock\" : \"\"}`} onSubmit={handleSubmit}>\n <div className=\"composer__field\">\n <textarea\n ref={inputRef}\n className=\"composer__input\"\n rows={1}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n aria-label=\"Message\"\n onChange={(event) => setValue(event.target.value)}\n onKeyDown={handleKeyDown}\n />\n <button\n type=\"submit\"\n className=\"composer__send\"\n disabled={disabled || !value.trim()}\n aria-label=\"Send message\"\n >\n <SendIcon />\n </button>\n </div>\n </form>\n );\n}\n","import type { FollowUpSuggestion } from \"../../types/conversation\";\nimport \"./FollowUpChips.css\";\n\nexport function FollowUpChips({\n suggestions,\n disabled = false,\n label = \"Follow up\",\n variant = \"default\",\n onSelect,\n}: {\n suggestions: FollowUpSuggestion[];\n disabled?: boolean;\n label?: string;\n variant?: \"default\" | \"dock\";\n onSelect?: (suggestion: FollowUpSuggestion) => void;\n}) {\n if (suggestions.length === 0) return null;\n\n if (variant === \"dock\") {\n return (\n <div className=\"followups followups--dock\">\n <div className=\"followups__scroll\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion.id}\n type=\"button\"\n className=\"followups__chip followups__chip--dock\"\n disabled={disabled}\n onClick={() => onSelect?.(suggestion)}\n >\n {suggestion.label}\n </button>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"followups\">\n <span className=\"followups__label\">{label}</span>\n <div className=\"followups__list\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion.id}\n type=\"button\"\n className=\"followups__chip\"\n disabled={disabled}\n onClick={() => onSelect?.(suggestion)}\n >\n {suggestion.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { ConversationMessage } from \"../../types/conversation\";\nimport \"./MessageBubble.css\";\n\nexport function MessageBubble({ message }: { message: ConversationMessage }) {\n if (message.role === \"visitor\") {\n return (\n <article className=\"message-bubble message-bubble--visitor\">\n <p className=\"message-bubble__text\">{message.text}</p>\n </article>\n );\n }\n\n return (\n <article className=\"message-bubble message-bubble--agent\">\n <p className=\"message-bubble__text\">\n {message.text}\n {message.streaming ? <span className=\"tool-timeline__cursor\" aria-hidden=\"true\" /> : null}\n </p>\n </article>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport \"./AssistEdgeTab.css\";\n\nexport type AssistTabVariant = \"outline\" | \"ask\" | \"fill\";\nexport type AssistTabSide = \"right\" | \"left\" | \"top\" | \"bottom\";\n\nfunction SparklesIcon() {\n return (\n <svg className=\"assist-edge-tab__sparkles\" viewBox=\"0 0 18 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8 1.2l.95 2.7 2.85.05-2.25 1.75.8 2.75L8 6.7 5.65 8.45l.8-2.75L4.2 3.95l2.85-.05L8 1.2z\" fill=\"currentColor\" />\n <path d=\"M14.2 6.4l.55 1.55 1.65.03-1.3 1 .46 1.58-1.36-1-1.36 1 .46-1.58-1.3-1 1.65-.03.55-1.55z\" fill=\"currentColor\" />\n <path d=\"M3.1 9.1l.4 1.15 1.22.02-.96.74.34 1.17-1-.74-1 .74.34-1.17-.96-.74 1.22-.02.4-1.15z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M10 4L6 8l4 4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction ChevronDownIcon() {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction DragDots() {\n return (\n <span className=\"assist-edge-tab__dots\" aria-hidden=\"true\">\n {Array.from({ length: 12 }, (_, index) => (\n <i key={index} />\n ))}\n </span>\n );\n}\n\nconst VARIANT_COPY: Record<AssistTabVariant, { label: string; aria: string }> = {\n outline: { label: \"Assist\", aria: \"Open Assist\" },\n ask: { label: \"Ask anything\", aria: \"Ask anything\" },\n fill: { label: \"Assist\", aria: \"Open Assist\" },\n};\n\nexport function AssistEdgeTab({\n variant,\n side,\n along,\n inset,\n visible,\n onOpen,\n}: {\n variant: AssistTabVariant;\n side: AssistTabSide;\n along: number;\n inset: number;\n visible: boolean;\n onOpen: () => void;\n}) {\n const copy = VARIANT_COPY[variant];\n const style = {\n \"--tab-along\": `${along}%`,\n \"--tab-inset\": `${inset}px`,\n } as CSSProperties;\n\n return (\n <button\n type=\"button\"\n className={`assist-edge-tab assist-edge-tab--${variant} assist-edge-tab--${side}${visible ? \" is-visible\" : \"\"}`}\n style={style}\n aria-label={copy.aria}\n aria-hidden={!visible}\n tabIndex={visible ? 0 : -1}\n onClick={onOpen}\n >\n {variant === \"outline\" ? (\n <>\n <SparklesIcon />\n <span className=\"assist-edge-tab__label\">{copy.label}</span>\n <ChevronDownIcon />\n </>\n ) : null}\n\n {variant === \"ask\" ? (\n <>\n <ChevronLeftIcon />\n <span className=\"assist-edge-tab__label\">{copy.label}</span>\n <DragDots />\n </>\n ) : null}\n\n {variant === \"fill\" ? (\n <>\n <SparklesIcon />\n <span className=\"assist-edge-tab__label\">{copy.label}</span>\n <ChevronLeftIcon />\n </>\n ) : null}\n </button>\n );\n}\n","import \"../../styles/all.css\";\nimport { useEffect, useState } from \"react\";\nimport {\n createIdleSuggestions,\n hasVisitorMessages,\n useAgentChat,\n} from \"../../hooks/useAgentChat\";\nimport { useIsMobile } from \"../../hooks/useIsMobile\";\nimport type { AgentIndexVersion } from \"../../../runtime/types\";\nimport {\n normalizeAgentPlacement,\n type AgentPlacementConfig,\n} from \"../../placement\";\nimport {\n registerAgentPanelController,\n unregisterAgentPanelController,\n} from \"../../panel-controller\";\nimport { AgentRail } from \"../AgentRail\";\nimport { AssistEdgeTab } from \"../AssistEdgeTab/AssistEdgeTab\";\n\nexport type AgentWidgetProps = {\n indexId: string;\n customerId: string;\n version?: AgentIndexVersion;\n runtimeOrigin?: string;\n placement?: Partial<AgentPlacementConfig>;\n defaultCollapsed?: boolean;\n registerPanelController?: boolean;\n};\n\nexport function AgentWidget({\n indexId,\n customerId,\n version,\n runtimeOrigin,\n placement: placementInput,\n defaultCollapsed = true,\n registerPanelController = false,\n}: AgentWidgetProps) {\n const isMobile = useIsMobile();\n const placement = normalizeAgentPlacement(placementInput);\n const [railCollapsed, setRailCollapsed] = useState(defaultCollapsed);\n const [railExpanded, setRailExpanded] = useState(false);\n const { state, submit } = useAgentChat({\n customerId,\n indexId,\n version,\n runtimeOrigin,\n });\n\n const idle = state.phase === \"idle\" && !hasVisitorMessages(state.messages);\n\n useEffect(() => {\n if (!registerPanelController) return;\n\n registerAgentPanelController(customerId, {\n open: () => setRailCollapsed(false),\n close: () => {\n setRailCollapsed(true);\n setRailExpanded(false);\n },\n });\n\n return () => unregisterAgentPanelController(customerId);\n }, [customerId, registerPanelController]);\n\n async function handleSubmit(message: string) {\n if (isMobile) setRailCollapsed(false);\n await submit(message);\n }\n\n return (\n <div className=\"webless-agent-root\">\n <div\n className={`webless-agent-root__shell${railCollapsed ? \" webless-agent-root__shell--collapsed\" : \"\"}${railExpanded ? \" webless-agent-root__shell--expanded\" : \"\"}`}\n >\n <div\n className=\"webless-agent-root__rail-slot\"\n inert={railCollapsed || undefined}\n aria-hidden={railCollapsed}\n >\n <AgentRail\n state={\n idle\n ? {\n ...state,\n followUps: createIdleSuggestions(),\n }\n : state\n }\n mobileFullscreen={isMobile && !railCollapsed}\n expanded={railExpanded}\n onCollapse={!isMobile ? () => setRailCollapsed(true) : undefined}\n onClose={isMobile ? () => setRailCollapsed(true) : undefined}\n onExpandToggle={!isMobile ? () => setRailExpanded((current) => !current) : undefined}\n onSubmit={handleSubmit}\n onFollowUpSelect={(label) => void handleSubmit(label)}\n />\n </div>\n </div>\n\n {!isMobile && railExpanded && !railCollapsed ? (\n <button\n type=\"button\"\n className=\"webless-agent-root__backdrop\"\n aria-label=\"Close expanded assist\"\n onClick={() => setRailExpanded(false)}\n />\n ) : null}\n\n {railCollapsed ? (\n <AssistEdgeTab\n variant={placement.variant}\n side={placement.side}\n along={placement.along}\n inset={placement.inset}\n visible\n onOpen={() => setRailCollapsed(false)}\n />\n ) : null}\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nexport function useIsMobile(breakpoint = 767) {\n const [isMobile, setIsMobile] = useState(\n () => typeof window !== \"undefined\" && window.matchMedia(`(max-width: ${breakpoint}px)`).matches,\n );\n\n useEffect(() => {\n const media = window.matchMedia(`(max-width: ${breakpoint}px)`);\n const onChange = () => setIsMobile(media.matches);\n onChange();\n media.addEventListener(\"change\", onChange);\n return () => media.removeEventListener(\"change\", onChange);\n }, [breakpoint]);\n\n return isMobile;\n}\n","type AgentPanelController = {\n open: () => void;\n close: () => void;\n};\n\nconst controllers = new Map<string, AgentPanelController>();\n\nexport function registerAgentPanelController(customerId: string, controller: AgentPanelController) {\n controllers.set(customerId, controller);\n}\n\nexport function unregisterAgentPanelController(customerId: string) {\n controllers.delete(customerId);\n}\n\nexport function openAgentPanel(customerId: string) {\n controllers.get(customerId)?.open();\n}\n\nexport function closeAgentPanel(customerId: string) {\n controllers.get(customerId)?.close();\n}\n"],"mappings":"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","names":["ClientError","ClientError","ClientError","useEffect","useRef","jsx","useRef","useState","jsx","jsxs","useState","useRef","jsx","jsxs","jsx","jsxs","jsx","jsxs","useRef","hasVisitorMessages","useEffect","jsx","jsxs","useEffect","useState","useEffect","useState","jsx","jsxs","useState","useEffect"]}
|