@webless/agent 0.2.8 → 0.2.9

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.
@@ -216,7 +216,6 @@ var AgentSession = class {
216
216
  clientHost;
217
217
  session;
218
218
  activeResponse;
219
- renderedPrefix = "";
220
219
  capability;
221
220
  getActiveSessionId() {
222
221
  return this.session?.state.sessionId ?? loadPersistedAgentSession(this.visitorSessionId, this.storeOptions)?.sessionId;
@@ -226,7 +225,6 @@ var AgentSession = class {
226
225
  });
227
226
  this.activeResponse = void 0;
228
227
  this.session = void 0;
229
- this.renderedPrefix = "";
230
228
  clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);
231
229
  }
232
230
  persistSessionCursor(session) {
@@ -261,7 +259,6 @@ var AgentSession = class {
261
259
  attachPersistedSession(client) {
262
260
  const persisted = loadPersistedAgentSession(this.visitorSessionId, this.storeOptions);
263
261
  if (!persisted?.sessionId) return void 0;
264
- this.renderedPrefix = "";
265
262
  return client.sessions.attach(persisted.sessionId, {
266
263
  streamIndex: persisted.streamIndex
267
264
  });
@@ -296,11 +293,10 @@ var AgentSession = class {
296
293
  response = created.response;
297
294
  session = created.session;
298
295
  this.session = session;
299
- this.renderedPrefix = "";
300
296
  this.persistSessionCursor(session);
301
297
  }
302
298
  this.activeResponse = response;
303
- let rendered = this.renderedPrefix;
299
+ let rendered = "";
304
300
  try {
305
301
  for await (const event of response) {
306
302
  if (signal.aborted) break;
@@ -326,7 +322,6 @@ var AgentSession = class {
326
322
  }
327
323
  } finally {
328
324
  this.activeResponse = void 0;
329
- this.renderedPrefix = rendered;
330
325
  if (session) {
331
326
  this.persistSessionCursor(session);
332
327
  }
@@ -424,11 +419,6 @@ var STATUS_SEQUENCE = [
424
419
  { id: "s1", label: "Starting Eve session", ms: 400 },
425
420
  { id: "s2", label: "Connecting to runtime", ms: 500 }
426
421
  ];
427
- var DEFAULT_FOLLOW_UPS = [
428
- { id: "fu-1", label: "What can you help me with?" },
429
- { id: "fu-2", label: "Summarize your capabilities" },
430
- { id: "fu-3", label: "What should I ask next?" }
431
- ];
432
422
  function delay(ms, signal) {
433
423
  return new Promise((resolve, reject) => {
434
424
  const timer = window.setTimeout(resolve, ms);
@@ -585,7 +575,7 @@ function useAgentChat({
585
575
  messages: [...prev.messages, agentMessage],
586
576
  toolSteps: [],
587
577
  streamingText: "",
588
- followUps: DEFAULT_FOLLOW_UPS,
578
+ followUps: [],
589
579
  journey: null
590
580
  }));
591
581
  } catch (error) {
@@ -876,12 +866,17 @@ function AgentRail({
876
866
  const transcriptRef = useRef3(null);
877
867
  const railStyle = theme?.railMaxWidth ? { ["--rail-width"]: theme.railMaxWidth, ["--as-rail-max-width"]: theme.railMaxWidth } : void 0;
878
868
  const isBusy = state.phase === "thinking" || state.phase === "running-tools" || state.phase === "streaming";
879
- const showActivity = state.toolSteps.length > 0 && (state.phase === "thinking" || state.phase === "running-tools" || state.phase === "streaming");
880
- const showStreamingInActivity = state.phase === "streaming" && Boolean(state.streamingText);
869
+ const showActivity = state.toolSteps.length > 0 && (state.phase === "thinking" || state.phase === "running-tools");
881
870
  const hasVisitorMessages2 = state.messages.some((message) => message.role === "visitor");
882
871
  const showIdleFollowUps = !hasVisitorMessages2 && state.followUps.length > 0;
883
- const showCompleteFollowUps = state.phase === "complete" && state.followUps.length > 0 && hasVisitorMessages2;
884
- const showDockFollowUps = expanded && (showIdleFollowUps || showCompleteFollowUps);
872
+ const showDockFollowUps = expanded && showIdleFollowUps;
873
+ const streamingMessage = state.phase === "streaming" && state.streamingText ? {
874
+ createdAt: 0,
875
+ id: "streaming-response",
876
+ role: "agent",
877
+ streaming: true,
878
+ text: state.streamingText
879
+ } : null;
885
880
  useEffect2(() => {
886
881
  const node = transcriptRef.current;
887
882
  if (!node) return;
@@ -919,14 +914,8 @@ function AgentRail({
919
914
  ] }) }),
920
915
  /* @__PURE__ */ jsxs5("div", { ref: transcriptRef, className: "agent-rail__transcript", children: [
921
916
  state.messages.map((message) => /* @__PURE__ */ jsx6(MessageBubble, { message }, message.id)),
922
- showActivity ? /* @__PURE__ */ jsx6(
923
- AgentActivityBubble,
924
- {
925
- steps: state.toolSteps,
926
- streamingText: state.streamingText,
927
- showStreaming: showStreamingInActivity
928
- }
929
- ) : null,
917
+ streamingMessage ? /* @__PURE__ */ jsx6(MessageBubble, { message: streamingMessage }) : null,
918
+ showActivity ? /* @__PURE__ */ jsx6(AgentActivityBubble, { steps: state.toolSteps }) : null,
930
919
  !expanded && showIdleFollowUps ? /* @__PURE__ */ jsx6("div", { className: "agent-rail__followups-slot", children: /* @__PURE__ */ jsx6(
931
920
  FollowUpChips,
932
921
  {
@@ -936,14 +925,6 @@ function AgentRail({
936
925
  onSelect: (suggestion) => onFollowUpSelect?.(suggestion.label)
937
926
  }
938
927
  ) }) : null,
939
- !expanded && showCompleteFollowUps ? /* @__PURE__ */ jsx6("div", { className: "agent-rail__followups-slot", children: /* @__PURE__ */ jsx6(
940
- FollowUpChips,
941
- {
942
- suggestions: state.followUps,
943
- disabled: isBusy,
944
- onSelect: (suggestion) => onFollowUpSelect?.(suggestion.label)
945
- }
946
- ) }) : null,
947
928
  state.error ? /* @__PURE__ */ jsx6("p", { role: "alert", style: { fontSize: 13, color: "var(--as-danger)", margin: 0 }, children: state.error }) : null
948
929
  ] }),
949
930
  expanded ? /* @__PURE__ */ jsxs5("div", { className: "agent-rail__dock-wrap", children: [
@@ -1195,4 +1176,4 @@ export {
1195
1176
  AssistEdgeTab,
1196
1177
  AgentWidget
1197
1178
  };
1198
- //# sourceMappingURL=chunk-4SMLPH3B.js.map
1179
+ //# sourceMappingURL=chunk-7XB5OBTP.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\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: [],\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 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 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 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 rendered = \"\";\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 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\" || 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 \"./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"]}
package/dist/embed.cjs CHANGED
@@ -267,7 +267,6 @@ var AgentSession = class {
267
267
  clientHost;
268
268
  session;
269
269
  activeResponse;
270
- renderedPrefix = "";
271
270
  capability;
272
271
  getActiveSessionId() {
273
272
  return this.session?.state.sessionId ?? loadPersistedAgentSession(this.visitorSessionId, this.storeOptions)?.sessionId;
@@ -277,7 +276,6 @@ var AgentSession = class {
277
276
  });
278
277
  this.activeResponse = void 0;
279
278
  this.session = void 0;
280
- this.renderedPrefix = "";
281
279
  clearPersistedAgentSession(this.visitorSessionId, this.storeOptions);
282
280
  }
283
281
  persistSessionCursor(session) {
@@ -312,7 +310,6 @@ var AgentSession = class {
312
310
  attachPersistedSession(client) {
313
311
  const persisted = loadPersistedAgentSession(this.visitorSessionId, this.storeOptions);
314
312
  if (!persisted?.sessionId) return void 0;
315
- this.renderedPrefix = "";
316
313
  return client.sessions.attach(persisted.sessionId, {
317
314
  streamIndex: persisted.streamIndex
318
315
  });
@@ -347,11 +344,10 @@ var AgentSession = class {
347
344
  response = created.response;
348
345
  session = created.session;
349
346
  this.session = session;
350
- this.renderedPrefix = "";
351
347
  this.persistSessionCursor(session);
352
348
  }
353
349
  this.activeResponse = response;
354
- let rendered = this.renderedPrefix;
350
+ let rendered = "";
355
351
  try {
356
352
  for await (const event of response) {
357
353
  if (signal.aborted) break;
@@ -377,7 +373,6 @@ var AgentSession = class {
377
373
  }
378
374
  } finally {
379
375
  this.activeResponse = void 0;
380
- this.renderedPrefix = rendered;
381
376
  if (session) {
382
377
  this.persistSessionCursor(session);
383
378
  }
@@ -475,11 +470,6 @@ var STATUS_SEQUENCE = [
475
470
  { id: "s1", label: "Starting Eve session", ms: 400 },
476
471
  { id: "s2", label: "Connecting to runtime", ms: 500 }
477
472
  ];
478
- var DEFAULT_FOLLOW_UPS = [
479
- { id: "fu-1", label: "What can you help me with?" },
480
- { id: "fu-2", label: "Summarize your capabilities" },
481
- { id: "fu-3", label: "What should I ask next?" }
482
- ];
483
473
  function delay(ms, signal) {
484
474
  return new Promise((resolve, reject) => {
485
475
  const timer = window.setTimeout(resolve, ms);
@@ -636,7 +626,7 @@ function useAgentChat({
636
626
  messages: [...prev.messages, agentMessage],
637
627
  toolSteps: [],
638
628
  streamingText: "",
639
- followUps: DEFAULT_FOLLOW_UPS,
629
+ followUps: [],
640
630
  journey: null
641
631
  }));
642
632
  } catch (error) {
@@ -940,12 +930,17 @@ function AgentRail({
940
930
  const transcriptRef = (0, import_react4.useRef)(null);
941
931
  const railStyle = theme?.railMaxWidth ? { ["--rail-width"]: theme.railMaxWidth, ["--as-rail-max-width"]: theme.railMaxWidth } : void 0;
942
932
  const isBusy = state.phase === "thinking" || state.phase === "running-tools" || state.phase === "streaming";
943
- const showActivity = state.toolSteps.length > 0 && (state.phase === "thinking" || state.phase === "running-tools" || state.phase === "streaming");
944
- const showStreamingInActivity = state.phase === "streaming" && Boolean(state.streamingText);
933
+ const showActivity = state.toolSteps.length > 0 && (state.phase === "thinking" || state.phase === "running-tools");
945
934
  const hasVisitorMessages2 = state.messages.some((message) => message.role === "visitor");
946
935
  const showIdleFollowUps = !hasVisitorMessages2 && state.followUps.length > 0;
947
- const showCompleteFollowUps = state.phase === "complete" && state.followUps.length > 0 && hasVisitorMessages2;
948
- const showDockFollowUps = expanded && (showIdleFollowUps || showCompleteFollowUps);
936
+ const showDockFollowUps = expanded && showIdleFollowUps;
937
+ const streamingMessage = state.phase === "streaming" && state.streamingText ? {
938
+ createdAt: 0,
939
+ id: "streaming-response",
940
+ role: "agent",
941
+ streaming: true,
942
+ text: state.streamingText
943
+ } : null;
949
944
  (0, import_react4.useEffect)(() => {
950
945
  const node = transcriptRef.current;
951
946
  if (!node) return;
@@ -983,14 +978,8 @@ function AgentRail({
983
978
  ] }) }),
984
979
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { ref: transcriptRef, className: "agent-rail__transcript", children: [
985
980
  state.messages.map((message) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MessageBubble, { message }, message.id)),
986
- showActivity ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
987
- AgentActivityBubble,
988
- {
989
- steps: state.toolSteps,
990
- streamingText: state.streamingText,
991
- showStreaming: showStreamingInActivity
992
- }
993
- ) : null,
981
+ streamingMessage ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MessageBubble, { message: streamingMessage }) : null,
982
+ showActivity ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AgentActivityBubble, { steps: state.toolSteps }) : null,
994
983
  !expanded && showIdleFollowUps ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "agent-rail__followups-slot", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
995
984
  FollowUpChips,
996
985
  {
@@ -1000,14 +989,6 @@ function AgentRail({
1000
989
  onSelect: (suggestion) => onFollowUpSelect?.(suggestion.label)
1001
990
  }
1002
991
  ) }) : null,
1003
- !expanded && showCompleteFollowUps ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "agent-rail__followups-slot", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1004
- FollowUpChips,
1005
- {
1006
- suggestions: state.followUps,
1007
- disabled: isBusy,
1008
- onSelect: (suggestion) => onFollowUpSelect?.(suggestion.label)
1009
- }
1010
- ) }) : null,
1011
992
  state.error ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { role: "alert", style: { fontSize: 13, color: "var(--as-danger)", margin: 0 }, children: state.error }) : null
1012
993
  ] }),
1013
994
  expanded ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "agent-rail__dock-wrap", children: [