@webless/agent 0.2.14 → 0.2.15
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/README.md +26 -0
- package/dist/{chunk-6FNE65AR.js → chunk-7IR64MFS.js} +98 -5
- package/dist/chunk-7IR64MFS.js.map +1 -0
- package/dist/embed.cjs +124 -29
- package/dist/embed.cjs.map +1 -1
- package/dist/embed.css +10 -0
- package/dist/embed.css.map +1 -1
- package/dist/embed.d.cts +2 -0
- package/dist/embed.d.ts +2 -0
- package/dist/embed.js +4 -2
- package/dist/embed.js.map +1 -1
- package/dist/react.cjs +121 -28
- package/dist/react.cjs.map +1 -1
- package/dist/react.css +10 -0
- package/dist/react.css.map +1 -1
- package/dist/react.d.cts +2 -1
- package/dist/react.d.ts +2 -1
- package/dist/react.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-6FNE65AR.js.map +0 -1
package/README.md
CHANGED
|
@@ -26,7 +26,33 @@ The exact URL is generated in the console when you build your bundle.
|
|
|
26
26
|
- Answers grounded in your published index
|
|
27
27
|
- Edge tab launcher (position configured in Agent Studio)
|
|
28
28
|
- Session continuity for returning visitors
|
|
29
|
+
- Page content shifts to make room for the desktop side rail (`pageShift`, default `true`)
|
|
29
30
|
|
|
31
|
+
## Embed manifest options
|
|
32
|
+
|
|
33
|
+
When building the agent IIFE bundle, the manifest supports:
|
|
34
|
+
|
|
35
|
+
| Field | Default | Description |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| `pageShift` | `true` | On desktop, apply `margin-right` to `html` when the side rail is open so page content reflows instead of sitting under the overlay. Disabled when collapsed, expanded modal, or mobile. |
|
|
38
|
+
|
|
39
|
+
Example:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"customerId": "your_customer_id",
|
|
44
|
+
"indexId": "your_index_id",
|
|
45
|
+
"runtimeOrigin": "https://runtime.webless.ai",
|
|
46
|
+
"version": "published",
|
|
47
|
+
"pageShift": true
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Set `"pageShift": false` to keep the classic overlay behavior.
|
|
52
|
+
|
|
53
|
+
For React consumers, pass `pageShift={false}` to `<AgentWidget />`.
|
|
54
|
+
|
|
55
|
+
See `examples/agent.manifest.json` for a full manifest example.
|
|
30
56
|
|
|
31
57
|
## This npm package
|
|
32
58
|
|
|
@@ -1389,15 +1389,95 @@ function AssistEdgeTab({
|
|
|
1389
1389
|
}
|
|
1390
1390
|
|
|
1391
1391
|
// src/react/components/AgentWidget/AgentWidget.tsx
|
|
1392
|
-
import { useEffect as
|
|
1392
|
+
import { useEffect as useEffect5, useRef as useRef4, useState as useState4 } from "react";
|
|
1393
|
+
|
|
1394
|
+
// src/react/page-shift.ts
|
|
1395
|
+
import { useEffect as useEffect3 } from "react";
|
|
1396
|
+
var PAGE_SHIFT_CLASS = "webless-agent-page-shift";
|
|
1397
|
+
var DEFAULT_RAIL_WIDTH_PX = 450;
|
|
1398
|
+
function shouldApplyPageShift(input) {
|
|
1399
|
+
return input.pageShift && !input.isMobile && !input.railCollapsed && !input.railExpanded;
|
|
1400
|
+
}
|
|
1401
|
+
function resolvePageShiftWidth(railWidth) {
|
|
1402
|
+
if (typeof railWidth === "number" && railWidth > 0) {
|
|
1403
|
+
return railWidth;
|
|
1404
|
+
}
|
|
1405
|
+
if (typeof document !== "undefined") {
|
|
1406
|
+
const token = getComputedStyle(document.documentElement).getPropertyValue("--as-rail-max-width").trim();
|
|
1407
|
+
const parsed = Number.parseFloat(token);
|
|
1408
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
1409
|
+
return parsed;
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
return DEFAULT_RAIL_WIDTH_PX;
|
|
1413
|
+
}
|
|
1414
|
+
var savedPageMargin = null;
|
|
1415
|
+
function readPageMarginSnapshot(style) {
|
|
1416
|
+
return {
|
|
1417
|
+
value: style.getPropertyValue("margin-right"),
|
|
1418
|
+
priority: style.getPropertyPriority("margin-right")
|
|
1419
|
+
};
|
|
1420
|
+
}
|
|
1421
|
+
function restorePageMargin(style, snapshot) {
|
|
1422
|
+
if (snapshot.value) {
|
|
1423
|
+
style.setProperty("margin-right", snapshot.value, snapshot.priority || void 0);
|
|
1424
|
+
return;
|
|
1425
|
+
}
|
|
1426
|
+
style.removeProperty("margin-right");
|
|
1427
|
+
}
|
|
1428
|
+
function snapshotPageMarginIfNeeded() {
|
|
1429
|
+
if (savedPageMargin !== null) {
|
|
1430
|
+
return;
|
|
1431
|
+
}
|
|
1432
|
+
savedPageMargin = readPageMarginSnapshot(document.documentElement.style);
|
|
1433
|
+
}
|
|
1434
|
+
function setPageMargin(margin) {
|
|
1435
|
+
snapshotPageMarginIfNeeded();
|
|
1436
|
+
document.documentElement.style.setProperty("margin-right", margin, "important");
|
|
1437
|
+
}
|
|
1438
|
+
function clearPageMargin() {
|
|
1439
|
+
if (savedPageMargin === null) {
|
|
1440
|
+
return;
|
|
1441
|
+
}
|
|
1442
|
+
restorePageMargin(document.documentElement.style, savedPageMargin);
|
|
1443
|
+
savedPageMargin = null;
|
|
1444
|
+
}
|
|
1445
|
+
function usePageShift(input) {
|
|
1446
|
+
const { active, railSlotRef } = input;
|
|
1447
|
+
useEffect3(() => {
|
|
1448
|
+
if (typeof document === "undefined") {
|
|
1449
|
+
return;
|
|
1450
|
+
}
|
|
1451
|
+
if (!active) {
|
|
1452
|
+
document.documentElement.classList.remove(PAGE_SHIFT_CLASS);
|
|
1453
|
+
clearPageMargin();
|
|
1454
|
+
return;
|
|
1455
|
+
}
|
|
1456
|
+
document.documentElement.classList.add(PAGE_SHIFT_CLASS);
|
|
1457
|
+
function applyMargin() {
|
|
1458
|
+
const rail = railSlotRef.current?.querySelector(".agent-rail");
|
|
1459
|
+
const width = resolvePageShiftWidth(
|
|
1460
|
+
rail instanceof HTMLElement ? rail.offsetWidth : null
|
|
1461
|
+
);
|
|
1462
|
+
setPageMargin(`${width}px`);
|
|
1463
|
+
}
|
|
1464
|
+
applyMargin();
|
|
1465
|
+
const frame = requestAnimationFrame(applyMargin);
|
|
1466
|
+
return () => {
|
|
1467
|
+
cancelAnimationFrame(frame);
|
|
1468
|
+
document.documentElement.classList.remove(PAGE_SHIFT_CLASS);
|
|
1469
|
+
clearPageMargin();
|
|
1470
|
+
};
|
|
1471
|
+
}, [active, railSlotRef]);
|
|
1472
|
+
}
|
|
1393
1473
|
|
|
1394
1474
|
// src/react/hooks/useIsMobile.ts
|
|
1395
|
-
import { useEffect as
|
|
1475
|
+
import { useEffect as useEffect4, useState as useState3 } from "react";
|
|
1396
1476
|
function useIsMobile(breakpoint = 767) {
|
|
1397
1477
|
const [isMobile, setIsMobile] = useState3(
|
|
1398
1478
|
() => typeof window !== "undefined" && window.matchMedia(`(max-width: ${breakpoint}px)`).matches
|
|
1399
1479
|
);
|
|
1400
|
-
|
|
1480
|
+
useEffect4(() => {
|
|
1401
1481
|
const media = window.matchMedia(`(max-width: ${breakpoint}px)`);
|
|
1402
1482
|
const onChange = () => setIsMobile(media.matches);
|
|
1403
1483
|
onChange();
|
|
@@ -1432,12 +1512,24 @@ function AgentWidget({
|
|
|
1432
1512
|
runtimeOrigin,
|
|
1433
1513
|
placement: placementInput,
|
|
1434
1514
|
defaultCollapsed = true,
|
|
1515
|
+
pageShift = true,
|
|
1435
1516
|
registerPanelController = false
|
|
1436
1517
|
}) {
|
|
1437
1518
|
const isMobile = useIsMobile();
|
|
1438
1519
|
const placement = normalizeAgentPlacement(placementInput);
|
|
1520
|
+
const railSlotRef = useRef4(null);
|
|
1439
1521
|
const [railCollapsed, setRailCollapsed] = useState4(defaultCollapsed);
|
|
1440
1522
|
const [railExpanded, setRailExpanded] = useState4(false);
|
|
1523
|
+
const pageShiftActive = shouldApplyPageShift({
|
|
1524
|
+
pageShift,
|
|
1525
|
+
isMobile,
|
|
1526
|
+
railCollapsed,
|
|
1527
|
+
railExpanded
|
|
1528
|
+
});
|
|
1529
|
+
usePageShift({
|
|
1530
|
+
active: pageShiftActive,
|
|
1531
|
+
railSlotRef
|
|
1532
|
+
});
|
|
1441
1533
|
const { state, submit } = useAgentChat({
|
|
1442
1534
|
customerId,
|
|
1443
1535
|
getUnpublishedPreviewGrant,
|
|
@@ -1446,7 +1538,7 @@ function AgentWidget({
|
|
|
1446
1538
|
runtimeOrigin
|
|
1447
1539
|
});
|
|
1448
1540
|
const idle = state.phase === "idle" && !hasVisitorMessages(state.messages);
|
|
1449
|
-
|
|
1541
|
+
useEffect5(() => {
|
|
1450
1542
|
if (!registerPanelController) return;
|
|
1451
1543
|
registerAgentPanelController(customerId, {
|
|
1452
1544
|
open: () => setRailCollapsed(false),
|
|
@@ -1469,6 +1561,7 @@ function AgentWidget({
|
|
|
1469
1561
|
children: /* @__PURE__ */ jsx8(
|
|
1470
1562
|
"div",
|
|
1471
1563
|
{
|
|
1564
|
+
ref: railSlotRef,
|
|
1472
1565
|
className: "webless-agent-root__rail-slot",
|
|
1473
1566
|
inert: railCollapsed || void 0,
|
|
1474
1567
|
"aria-hidden": railCollapsed,
|
|
@@ -1530,4 +1623,4 @@ export {
|
|
|
1530
1623
|
AssistEdgeTab,
|
|
1531
1624
|
AgentWidget
|
|
1532
1625
|
};
|
|
1533
|
-
//# sourceMappingURL=chunk-
|
|
1626
|
+
//# sourceMappingURL=chunk-7IR64MFS.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/persisted-conversation.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/page-shift.ts","../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 {\n clearPersistedAgentConversation,\n loadPersistedAgentConversation,\n savePersistedAgentConversation,\n type PersistedAgentConversation,\n} from \"../persisted-conversation\";\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\nfunction stateFromConversation(\n conversation: PersistedAgentConversation | null\n): AgentRailState {\n if (!conversation || conversation.messages.length === 0) return INITIAL_STATE;\n return {\n ...INITIAL_STATE,\n messages: conversation.messages,\n phase: conversation.pending\n ? conversation.streamingText\n ? \"streaming\"\n : \"thinking\"\n : \"complete\",\n streamingText: conversation.streamingText,\n };\n}\n\nconst STATUS_SEQUENCE: Array<{\n id: string;\n label: string;\n detail?: string;\n ms: number;\n}> = [\n { id: \"s1\", label: \"Starting Eve session\", ms: 400 },\n { id: \"s2\", label: \"Connecting to runtime\", ms: 500 },\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(\n signal: AbortSignal,\n onStep: (step: ToolStep) => void\n) {\n for (const item of STATUS_SEQUENCE) {\n onStep({\n id: item.id,\n label: item.label,\n detail: item.detail,\n state: \"active\",\n });\n await delay(item.ms, signal);\n }\n}\n\nexport type UseAgentChatOptions = {\n customerId?: string;\n getUnpublishedPreviewGrant?: () => Promise<string>;\n indexId: string;\n version?: AgentIndexVersion;\n runtimeOrigin?: string;\n visitorSessionId?: string;\n storageKeyPrefix?: string;\n};\n\nexport function useAgentChat({\n customerId,\n getUnpublishedPreviewGrant,\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId,\n storageKeyPrefix,\n}: UseAgentChatOptions) {\n const previewGrantProviderRef = useRef(getUnpublishedPreviewGrant);\n previewGrantProviderRef.current = getUnpublishedPreviewGrant;\n const resolveUnpublishedPreviewGrant = () => {\n const provider = previewGrantProviderRef.current;\n if (!provider) {\n return Promise.reject(\n new Error(\n \"An unpublished preview grant is required to use the Agent Runtime preview.\"\n )\n );\n }\n return provider();\n };\n const resolvedStorageKeyPrefix = useMemo(\n () =>\n storageKeyPrefix?.trim() ||\n buildAgentStorageKeyPrefix({\n customerId,\n indexId,\n version,\n runtimeOrigin,\n }),\n [customerId, indexId, runtimeOrigin, storageKeyPrefix, version]\n );\n const visitorId = useMemo(\n () =>\n visitorSessionId?.trim() ||\n getOrCreateVisitorSessionId({\n storageKeyPrefix: resolvedStorageKeyPrefix,\n }),\n [resolvedStorageKeyPrefix, visitorSessionId]\n );\n const [state, setState] = useState<AgentRailState>(() =>\n stateFromConversation(\n loadPersistedAgentConversation(resolvedStorageKeyPrefix, visitorId)\n )\n );\n const runRef = useRef<AbortController | null>(null);\n const clientRef = useRef(\n createAgentClient({\n customerId,\n getUnpublishedPreviewGrant: resolveUnpublishedPreviewGrant,\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId: visitorId,\n storageKeyPrefix: resolvedStorageKeyPrefix,\n })\n );\n const identityKey = `${customerId ?? \"\"}|${indexId}|${\n version ?? \"published\"\n }|${runtimeOrigin ?? \"\"}|${resolvedStorageKeyPrefix}|${visitorId}`;\n const identityRef = useRef(identityKey);\n\n useEffect(() => {\n if (identityRef.current === identityKey) {\n return;\n }\n\n identityRef.current = identityKey;\n runRef.current?.abort();\n runRef.current = null;\n clientRef.current = createAgentClient({\n customerId,\n getUnpublishedPreviewGrant: resolveUnpublishedPreviewGrant,\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId: visitorId,\n storageKeyPrefix: resolvedStorageKeyPrefix,\n });\n setState(\n stateFromConversation(\n loadPersistedAgentConversation(resolvedStorageKeyPrefix, visitorId)\n )\n );\n }, [\n customerId,\n identityKey,\n indexId,\n runtimeOrigin,\n resolvedStorageKeyPrefix,\n version,\n visitorId,\n ]);\n\n useEffect(() => {\n if (!hasVisitorMessages(state.messages)) return;\n savePersistedAgentConversation(resolvedStorageKeyPrefix, visitorId, {\n messages: state.messages,\n pending: isAgentBusy(state.phase),\n streamingText: state.streamingText,\n });\n }, [\n resolvedStorageKeyPrefix,\n state.messages,\n state.phase,\n state.streamingText,\n visitorId,\n ]);\n\n const reset = useCallback(() => {\n runRef.current?.abort();\n runRef.current = null;\n clientRef.current.reset();\n clearPersistedAgentConversation(resolvedStorageKeyPrefix, visitorId);\n setState(INITIAL_STATE);\n }, [resolvedStorageKeyPrefix, visitorId]);\n\n const runTurn = useCallback(\n async (input: {\n controller: AbortController;\n initialText?: string;\n resume: boolean;\n visitorText: string;\n }) => {\n const { controller, initialText = \"\", resume, visitorText } = input;\n const { signal } = controller;\n const isActiveRun = () =>\n runRef.current === controller && !signal.aborted;\n\n try {\n let streamStarted = Boolean(initialText);\n let streamed = initialText;\n const planningPromise = resume\n ? Promise.resolve()\n : runStatusSequence(signal, (step) => {\n if (streamStarted || !isActiveRun()) return;\n setState((prev) => ({\n ...prev,\n phase: \"running-tools\",\n toolSteps: [step],\n }));\n });\n const handlers = {\n onStep: (label: string, detail?: string) => {\n if (streamStarted || !isActiveRun()) return;\n setState((prev) => ({\n ...prev,\n phase: \"running-tools\",\n toolSteps: [\n { id: `step-${label}`, label, detail, state: \"active\" },\n ],\n }));\n },\n onDelta: (delta: string) => {\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) => ({\n ...prev,\n phase: \"streaming\",\n streamingText: streamed,\n }));\n },\n onComplete: () => {\n if (!isActiveRun()) return;\n streamStarted = true;\n },\n };\n\n let finalText = resume\n ? await clientRef.current.resumeTurn({\n handlers,\n initialText,\n message: visitorText,\n signal,\n })\n : await clientRef.current.sendTurn(visitorText, { handlers, signal });\n\n if (resume && finalText === null) {\n finalText = await clientRef.current.sendTurn(visitorText, {\n handlers,\n signal,\n });\n }\n\n await planningPromise.catch(() => {});\n if (!isActiveRun() || finalText === null) 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: [],\n journey: null,\n }));\n runRef.current = null;\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\")\n 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 runRef.current = null;\n }\n },\n []\n );\n\n const submit = useCallback(\n async (visitorText: string) => {\n if (runRef.current) {\n runRef.current.abort();\n clientRef.current.cancelActive();\n }\n const controller = new AbortController();\n runRef.current = controller;\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: [\n { id: \"s1\", label: \"Starting Eve session\", state: \"active\" },\n ],\n journey: null,\n followUps: [],\n streamingText: \"\",\n error: null,\n }));\n await runTurn({ controller, resume: false, visitorText });\n },\n [runTurn]\n );\n\n useEffect(() => {\n const conversation = loadPersistedAgentConversation(\n resolvedStorageKeyPrefix,\n visitorId\n );\n if (!conversation?.pending) return;\n const visitorMessage = [...conversation.messages]\n .reverse()\n .find((message) => message.role === \"visitor\");\n if (!visitorMessage) return;\n\n const controller = new AbortController();\n runRef.current = controller;\n void runTurn({\n controller,\n initialText: conversation.streamingText,\n resume: true,\n visitorText: visitorMessage.text,\n });\n\n return () => {\n if (runRef.current === controller) {\n runRef.current = null;\n }\n controller.abort();\n };\n }, [identityKey, resolvedStorageKeyPrefix, runTurn, visitorId]);\n\n useEffect(() => {\n return () => {\n runRef.current?.abort();\n runRef.current = null;\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 (\n phase === \"thinking\" || phase === \"running-tools\" || phase === \"streaming\"\n );\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 AgentResumeTurnOptions,\n AgentSendTurnOptions,\n AgentStreamHandlers,\n} from \"./types\";\n\nfunction isTurnBoundary(event: MessageStreamEvent) {\n return (\n event.type === \"session.waiting\" ||\n event.type === \"session.completed\" ||\n event.type === \"session.failed\"\n );\n}\n\nfunction applyMessageEvent(\n event: MessageStreamEvent,\n rendered: string,\n handlers: AgentStreamHandlers\n) {\n const step = mapStepLabel(event);\n if (step) handlers.onStep?.(step.label, step.detail);\n\n if (event.type === \"session.failed\") {\n throw new Error(event.data.message || event.data.code);\n }\n\n if (event.type === \"message.completed\") {\n handlers.onComplete?.();\n }\n\n if (event.type !== \"message.appended\") return rendered;\n\n const { messageDelta, messageSoFar } = event.data;\n let delta = messageDelta;\n let next = rendered;\n if (messageSoFar.startsWith(rendered)) {\n delta = messageSoFar.slice(rendered.length);\n next = messageSoFar;\n } else if (messageDelta) {\n next += messageDelta;\n }\n if (delta) handlers.onDelta(delta);\n return next;\n}\n\nfunction latestTurnEvents(events: readonly MessageStreamEvent[]) {\n let startIndex = -1;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n if (events[index]?.type === \"message.received\") {\n startIndex = index;\n break;\n }\n }\n return startIndex >= 0 ? events.slice(startIndex) : [];\n}\n\nfunction renderTurn(events: readonly MessageStreamEvent[]) {\n let rendered = \"\";\n for (const event of events) {\n if (event.type !== \"message.appended\") continue;\n const { messageDelta, messageSoFar } = event.data;\n if (messageSoFar.startsWith(rendered)) {\n rendered = messageSoFar;\n } else if (messageDelta) {\n rendered += messageDelta;\n }\n }\n return rendered;\n}\n\nfunction mapStepLabel(\n event: MessageStreamEvent\n): { 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 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 getUnpublishedPreviewGrant?: () => Promise<string>\n ) {\n this.capability = createAgentRuntimeCapability({\n getUnpublishedPreviewGrant,\n indexId,\n runtimeOrigin,\n version,\n visitorSessionId,\n });\n }\n\n getActiveSessionId(): string | undefined {\n return (\n this.session?.state.sessionId ??\n loadPersistedAgentSession(this.visitorSessionId, this.storeOptions)\n ?.sessionId\n );\n }\n\n reset() {\n if (this.activeResponse) {\n void this.activeResponse.cancel().catch(() => {});\n } else {\n void this.session?.cancel().catch(() => {});\n }\n this.activeResponse = undefined;\n this.session = undefined;\n this.capability.invalidate();\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.activeResponse = undefined;\n this.session = undefined;\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(\n this.visitorSessionId,\n this.storeOptions\n );\n if (!persisted?.sessionId) return undefined;\n\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.persistSessionCursor(session);\n }\n\n this.activeResponse = response;\n let streamIndex = session?.state.streamIndex ?? 0;\n let rendered = \"\";\n\n try {\n for await (const event of response) {\n if (signal.aborted) break;\n rendered = applyMessageEvent(event, rendered, handlers);\n streamIndex += 1;\n if (session) {\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n streamIndex,\n this.storeOptions\n );\n }\n }\n } finally {\n this.activeResponse = undefined;\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 return rendered.trim();\n }\n\n async resumeTurn(\n message: string,\n signal: AbortSignal,\n handlers: AgentStreamHandlers,\n initialText = \"\"\n ): Promise<string | null> {\n const persisted = loadPersistedAgentSession(\n this.visitorSessionId,\n this.storeOptions\n );\n if (!persisted) return null;\n\n const client = this.ensureClient();\n const attached = client.sessions.attach(persisted.sessionId, {\n streamIndex: persisted.streamIndex,\n });\n const snapshot = await withCapabilityRefresh(this.capability, () =>\n attached.snapshot({ signal })\n );\n const turnEvents = latestTurnEvents(snapshot.events);\n const received = turnEvents[0];\n if (\n received?.type !== \"message.received\" ||\n received.data.message !== message\n ) {\n return null;\n }\n let rendered = renderTurn(turnEvents);\n\n if (rendered.startsWith(initialText)) {\n const missedText = rendered.slice(initialText.length);\n if (missedText) handlers.onDelta(missedText);\n } else if (initialText.startsWith(rendered)) {\n rendered = initialText;\n } else if (!initialText.startsWith(rendered)) {\n rendered = initialText + rendered;\n }\n\n let session = client.sessions.attach(snapshot.session.sessionId, {\n streamIndex: snapshot.session.streamIndex,\n });\n this.session = session;\n this.persistSessionCursor(session);\n\n let snapshotBoundary: MessageStreamEvent | undefined;\n for (let index = turnEvents.length - 1; index >= 0; index -= 1) {\n const event = turnEvents[index];\n if (event && isTurnBoundary(event)) {\n snapshotBoundary = event;\n break;\n }\n }\n if (snapshotBoundary) {\n if (snapshotBoundary.type === \"session.failed\") {\n throw new Error(\n snapshotBoundary.data.message || snapshotBoundary.data.code\n );\n }\n handlers.onComplete?.();\n if (!rendered.trim()) throw new Error(\"Empty response from runtime\");\n return rendered.trim();\n }\n\n let streamIndex = snapshot.session.streamIndex;\n for await (const event of session.stream({ signal })) {\n if (signal.aborted) break;\n rendered = applyMessageEvent(event, rendered, handlers);\n streamIndex += 1;\n savePersistedAgentSession(\n this.visitorSessionId,\n session.state.sessionId,\n streamIndex,\n this.storeOptions\n );\n if (isTurnBoundary(event)) break;\n }\n\n session = client.sessions.attach(session.state.sessionId, { streamIndex });\n this.session = session;\n this.persistSessionCursor(session);\n\n if (!rendered.trim() && !signal.aborted) {\n throw new Error(\"Empty response from runtime\");\n }\n return rendered.trim();\n }\n\n cancelActive() {\n if (this.activeResponse) {\n this.activeResponse.cancel().catch(() => {});\n } else {\n this.session?.cancel().catch(() => {});\n }\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() ||\n getOrCreateVisitorSessionId(storeOptions);\n\n const session = new AgentSession(\n indexId,\n version,\n runtimeOrigin,\n visitorSessionId,\n storeOptions,\n options.getUnpublishedPreviewGrant\n );\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 resumeTurn: (resumeOptions: AgentResumeTurnOptions) =>\n session.resumeTurn(\n resumeOptions.message,\n resumeOptions.signal ?? new AbortController().signal,\n resumeOptions.handlers,\n resumeOptions.initialText\n ),\n reset: () => session.reset(),\n cancelActive: () => session.cancelActive(),\n getActiveSessionId: () => session.getActiveSessionId(),\n };\n}\n","import { ClientError } from \"eve/client\";\nimport type { AgentIndexVersion } from \"./types\";\n\ntype RuntimeCapability = {\n accessToken: string;\n refreshAt: number;\n};\n\ntype AgentRuntimeCapabilityOptions = {\n getUnpublishedPreviewGrant?: () => Promise<string>;\n indexId: string;\n runtimeOrigin: string;\n version: AgentIndexVersion;\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(\n value: unknown,\n indexId: string,\n now: number\n): 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(\n MAX_REFRESH_SKEW_MS,\n Math.floor((expiresAt - now) / 10)\n );\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(\n options: AgentRuntimeCapabilityOptions\n) {\n const fetchImplementation = options.fetchImplementation ?? fetch;\n const now = options.now ?? Date.now;\n let capability: RuntimeCapability | undefined;\n let generation = 0;\n let pendingBootstrap: Promise<RuntimeCapability> | undefined;\n\n const bootstrap = async (): Promise<RuntimeCapability> => {\n let previewGrant: string | undefined;\n if (options.version === \"unpublished\") {\n previewGrant = (await options.getUnpublishedPreviewGrant?.())?.trim();\n if (!previewGrant) {\n throw new Error(\n \"An unpublished preview grant is required to use the Agent Runtime preview.\"\n );\n }\n }\n\n const response = await fetchImplementation(\n `${options.runtimeOrigin}/webless/v1/bootstrap`,\n {\n body: JSON.stringify({\n clientSessionId: options.visitorSessionId,\n indexId: options.indexId,\n ...(previewGrant ? { previewGrant } : {}),\n version: options.version,\n }),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n }\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 const getAccessToken = async (): Promise<string> => {\n if (capability && capability.refreshAt > now()) {\n return capability.accessToken;\n }\n\n const requestedGeneration = generation;\n if (!pendingBootstrap) {\n const trackedBootstrap = bootstrap().finally(() => {\n if (pendingBootstrap === trackedBootstrap) {\n pendingBootstrap = undefined;\n }\n });\n pendingBootstrap = trackedBootstrap;\n }\n\n const nextCapability = await pendingBootstrap;\n if (requestedGeneration !== generation) {\n return getAccessToken();\n }\n\n capability = nextCapability;\n return capability.accessToken;\n };\n\n return {\n getAccessToken,\n invalidate: () => {\n capability = undefined;\n generation += 1;\n pendingBootstrap = undefined;\n },\n };\n}\n\nexport type AgentRuntimeCapability = ReturnType<\n typeof createAgentRuntimeCapability\n>;\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 { ConversationMessage } from \"./types/conversation\";\n\nconst CONVERSATION_VERSION = 1;\n\nexport type PersistedAgentConversation = {\n messages: ConversationMessage[];\n pending: boolean;\n streamingText: string;\n};\n\nfunction conversationKey(storageKeyPrefix: string, visitorSessionId: string) {\n return `${storageKeyPrefix}:conversation:${visitorSessionId}`;\n}\n\nfunction parseMessage(value: unknown): ConversationMessage | null {\n if (typeof value !== \"object\" || value === null) return null;\n const record = value as Record<string, unknown>;\n if (\n typeof record.id !== \"string\" ||\n (record.role !== \"agent\" && record.role !== \"visitor\") ||\n typeof record.text !== \"string\" ||\n typeof record.createdAt !== \"number\" ||\n !Number.isFinite(record.createdAt)\n ) {\n return null;\n }\n return {\n id: record.id,\n role: record.role,\n text: record.text,\n createdAt: record.createdAt,\n };\n}\n\nexport function loadPersistedAgentConversation(\n storageKeyPrefix: string,\n visitorSessionId: string,\n): PersistedAgentConversation | null {\n if (typeof sessionStorage === \"undefined\") return null;\n const raw = sessionStorage.getItem(conversationKey(storageKeyPrefix, visitorSessionId));\n if (!raw) return null;\n\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null) return null;\n const record = value as Record<string, unknown>;\n if (\n record.version !== CONVERSATION_VERSION ||\n !Array.isArray(record.messages) ||\n typeof record.pending !== \"boolean\" ||\n typeof record.streamingText !== \"string\"\n ) {\n return null;\n }\n const messages = record.messages.map(parseMessage);\n if (messages.some((message) => message === null)) return null;\n return {\n messages: messages.filter((message): message is ConversationMessage => message !== null),\n pending: record.pending,\n streamingText: record.streamingText,\n };\n } catch {\n return null;\n }\n}\n\nexport function savePersistedAgentConversation(\n storageKeyPrefix: string,\n visitorSessionId: string,\n conversation: PersistedAgentConversation,\n) {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.setItem(\n conversationKey(storageKeyPrefix, visitorSessionId),\n JSON.stringify({ version: CONVERSATION_VERSION, ...conversation }),\n );\n}\n\nexport function clearPersistedAgentConversation(\n storageKeyPrefix: string,\n visitorSessionId: string,\n) {\n if (typeof sessionStorage === \"undefined\") return;\n sessionStorage.removeItem(conversationKey(storageKeyPrefix, visitorSessionId));\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\" || state.phase === \"running-tools\");\n\n const hasVisitorMessages = state.messages.some((message) => message.role === \"visitor\");\n const showIdleFollowUps = !hasVisitorMessages && state.followUps.length > 0;\n const showDockFollowUps = expanded && showIdleFollowUps;\n const streamingMessage =\n state.phase === \"streaming\" && state.streamingText\n ? {\n createdAt: 0,\n id: \"streaming-response\",\n role: \"agent\" as const,\n streaming: true,\n text: state.streamingText,\n }\n : null;\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 {streamingMessage ? <MessageBubble message={streamingMessage} /> : null}\n\n {showActivity ? <AgentActivityBubble steps={state.toolSteps} /> : 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 {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 { Streamdown } from \"streamdown\";\nimport \"streamdown/styles.css\";\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 <div className=\"message-bubble__text\">\n <Streamdown\n animated\n caret=\"circle\"\n className=\"message-bubble__markdown\"\n controls={false}\n isAnimating={message.streaming}\n linkSafety={{ enabled: false }}\n mode={message.streaming ? \"streaming\" : \"static\"}\n skipHtml\n >\n {message.text}\n </Streamdown>\n </div>\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, useRef, useState } from \"react\";\nimport { shouldApplyPageShift, usePageShift } from \"../../page-shift\";\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 getUnpublishedPreviewGrant?: () => Promise<string>;\n version?: AgentIndexVersion;\n runtimeOrigin?: string;\n placement?: Partial<AgentPlacementConfig>;\n defaultCollapsed?: boolean;\n pageShift?: boolean;\n registerPanelController?: boolean;\n};\n\nexport function AgentWidget({\n indexId,\n customerId,\n getUnpublishedPreviewGrant,\n version,\n runtimeOrigin,\n placement: placementInput,\n defaultCollapsed = true,\n pageShift = true,\n registerPanelController = false,\n}: AgentWidgetProps) {\n const isMobile = useIsMobile();\n const placement = normalizeAgentPlacement(placementInput);\n const railSlotRef = useRef<HTMLDivElement>(null);\n const [railCollapsed, setRailCollapsed] = useState(defaultCollapsed);\n const [railExpanded, setRailExpanded] = useState(false);\n const pageShiftActive = shouldApplyPageShift({\n pageShift,\n isMobile,\n railCollapsed,\n railExpanded,\n });\n\n usePageShift({\n active: pageShiftActive,\n railSlotRef,\n });\n const { state, submit } = useAgentChat({\n customerId,\n getUnpublishedPreviewGrant,\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${\n railCollapsed ? \" webless-agent-root__shell--collapsed\" : \"\"\n }${railExpanded ? \" webless-agent-root__shell--expanded\" : \"\"}`}\n >\n <div\n ref={railSlotRef}\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={\n !isMobile\n ? () => setRailExpanded((current) => !current)\n : undefined\n }\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, type RefObject } from \"react\";\n\nexport const PAGE_SHIFT_CLASS = \"webless-agent-page-shift\";\nconst DEFAULT_RAIL_WIDTH_PX = 450;\n\nexport function shouldApplyPageShift(input: {\n pageShift: boolean;\n isMobile: boolean;\n railCollapsed: boolean;\n railExpanded: boolean;\n}) {\n return input.pageShift && !input.isMobile && !input.railCollapsed && !input.railExpanded;\n}\n\nexport function resolvePageShiftWidth(railWidth: number | null | undefined) {\n if (typeof railWidth === \"number\" && railWidth > 0) {\n return railWidth;\n }\n\n if (typeof document !== \"undefined\") {\n const token = getComputedStyle(document.documentElement)\n .getPropertyValue(\"--as-rail-max-width\")\n .trim();\n const parsed = Number.parseFloat(token);\n if (Number.isFinite(parsed) && parsed > 0) {\n return parsed;\n }\n }\n\n return DEFAULT_RAIL_WIDTH_PX;\n}\n\ntype PageMarginSnapshot = {\n value: string;\n priority: string;\n};\n\nexport type PageMarginStyle = Pick<\n CSSStyleDeclaration,\n \"getPropertyValue\" | \"getPropertyPriority\" | \"setProperty\" | \"removeProperty\"\n>;\n\nlet savedPageMargin: PageMarginSnapshot | null = null;\n\nexport function readPageMarginSnapshot(style: PageMarginStyle): PageMarginSnapshot {\n return {\n value: style.getPropertyValue(\"margin-right\"),\n priority: style.getPropertyPriority(\"margin-right\"),\n };\n}\n\nexport function restorePageMargin(style: PageMarginStyle, snapshot: PageMarginSnapshot) {\n if (snapshot.value) {\n style.setProperty(\"margin-right\", snapshot.value, snapshot.priority || undefined);\n return;\n }\n\n style.removeProperty(\"margin-right\");\n}\n\nfunction snapshotPageMarginIfNeeded() {\n if (savedPageMargin !== null) {\n return;\n }\n\n savedPageMargin = readPageMarginSnapshot(document.documentElement.style);\n}\n\nfunction setPageMargin(margin: string) {\n snapshotPageMarginIfNeeded();\n document.documentElement.style.setProperty(\"margin-right\", margin, \"important\");\n}\n\nfunction clearPageMargin() {\n if (savedPageMargin === null) {\n return;\n }\n\n restorePageMargin(document.documentElement.style, savedPageMargin);\n savedPageMargin = null;\n}\n\nexport function usePageShift(input: {\n active: boolean;\n railSlotRef: RefObject<HTMLElement | null>;\n}) {\n const { active, railSlotRef } = input;\n\n useEffect(() => {\n if (typeof document === \"undefined\") {\n return;\n }\n\n if (!active) {\n document.documentElement.classList.remove(PAGE_SHIFT_CLASS);\n clearPageMargin();\n return;\n }\n\n document.documentElement.classList.add(PAGE_SHIFT_CLASS);\n\n function applyMargin() {\n const rail = railSlotRef.current?.querySelector(\".agent-rail\");\n const width = resolvePageShiftWidth(\n rail instanceof HTMLElement ? rail.offsetWidth : null,\n );\n setPageMargin(`${width}px`);\n }\n\n applyMargin();\n const frame = requestAnimationFrame(applyMargin);\n\n return () => {\n cancelAnimationFrame(frame);\n document.documentElement.classList.remove(PAGE_SHIFT_CLASS);\n clearPageMargin();\n };\n }, [active, railSlotRef]);\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","jsx","jsxs","useRef","hasVisitorMessages","useEffect","jsx","jsxs","useEffect","useRef","useState","useEffect","useEffect","useState","jsx","jsxs","useRef","useState","useEffect"]}
|