@agents24/chat-react 0.4.0 → 0.5.0
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 +6 -1
- package/compatibility.json +6 -6
- package/dist/{chunk-NLEOWTZG.js → chunk-R7WFL3YR.js} +2 -2
- package/dist/chunk-R7WFL3YR.js.map +1 -0
- package/dist/styles.css +91 -5
- package/dist/templates/agent-chat-layout.d.ts +9 -1
- package/dist/templates/appearance-control.d.ts +5 -0
- package/dist/templates/index.cjs +125 -1
- package/dist/templates/index.cjs.map +1 -1
- package/dist/templates/index.d.ts +1 -0
- package/dist/templates/index.js +124 -1
- package/dist/templates/index.js.map +1 -1
- package/dist/ui/index.cjs +1 -1
- package/dist/ui/index.cjs.map +1 -1
- package/dist/ui/index.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-NLEOWTZG.js.map +0 -1
package/dist/templates/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
AgentChatDefaultActions,
|
|
9
9
|
AgentChatMessage,
|
|
10
10
|
cn
|
|
11
|
-
} from "../chunk-
|
|
11
|
+
} from "../chunk-R7WFL3YR.js";
|
|
12
12
|
import "../chunk-CHAU7FNW.js";
|
|
13
13
|
|
|
14
14
|
// src/templates/agent-chat-shell.tsx
|
|
@@ -253,8 +253,84 @@ function connectionLabel(state) {
|
|
|
253
253
|
function AgentAvatar({ agent }) {
|
|
254
254
|
return agent.avatarUrl ? /* @__PURE__ */ jsx2("img", { alt: "", className: "a24-avatar", height: 36, src: agent.avatarUrl, width: 36 }) : /* @__PURE__ */ jsx2("span", { "aria-hidden": "true", className: "a24-avatar a24-avatar--fallback", children: agent.name.trim().slice(0, 1).toUpperCase() || "A" });
|
|
255
255
|
}
|
|
256
|
+
function AgentTargetSelector({ agent, selector }) {
|
|
257
|
+
const rootRef = React2.useRef(null);
|
|
258
|
+
const triggerRef = React2.useRef(null);
|
|
259
|
+
const inputId = React2.useId();
|
|
260
|
+
const [draft, setDraft] = React2.useState(selector.value);
|
|
261
|
+
const [error, setError] = React2.useState(null);
|
|
262
|
+
const [open, setOpen] = React2.useState(false);
|
|
263
|
+
const [submitting, setSubmitting] = React2.useState(false);
|
|
264
|
+
React2.useEffect(() => setDraft(selector.value), [selector.value]);
|
|
265
|
+
React2.useEffect(() => {
|
|
266
|
+
if (!open) return void 0;
|
|
267
|
+
const closeOnPointerDown = (event) => {
|
|
268
|
+
if (!rootRef.current?.contains(event.target)) setOpen(false);
|
|
269
|
+
};
|
|
270
|
+
const closeOnEscape = (event) => {
|
|
271
|
+
if (event.key !== "Escape") return;
|
|
272
|
+
event.preventDefault();
|
|
273
|
+
setOpen(false);
|
|
274
|
+
triggerRef.current?.focus();
|
|
275
|
+
};
|
|
276
|
+
document.addEventListener("pointerdown", closeOnPointerDown);
|
|
277
|
+
document.addEventListener("keydown", closeOnEscape);
|
|
278
|
+
return () => {
|
|
279
|
+
document.removeEventListener("pointerdown", closeOnPointerDown);
|
|
280
|
+
document.removeEventListener("keydown", closeOnEscape);
|
|
281
|
+
};
|
|
282
|
+
}, [open]);
|
|
283
|
+
const apply = async (event) => {
|
|
284
|
+
event.preventDefault();
|
|
285
|
+
const value = draft.trim();
|
|
286
|
+
if (!value) {
|
|
287
|
+
setError(`${selector.label} is required.`);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
setSubmitting(true);
|
|
291
|
+
setError(null);
|
|
292
|
+
try {
|
|
293
|
+
await selector.onApply(value);
|
|
294
|
+
setOpen(false);
|
|
295
|
+
} catch (nextError) {
|
|
296
|
+
setError(nextError instanceof Error ? nextError.message : "The target could not be changed.");
|
|
297
|
+
} finally {
|
|
298
|
+
setSubmitting(false);
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
return /* @__PURE__ */ jsxs2("div", { className: "a24-target-selector", "data-open": open || void 0, ref: rootRef, children: [
|
|
302
|
+
/* @__PURE__ */ jsxs2(
|
|
303
|
+
"button",
|
|
304
|
+
{
|
|
305
|
+
"aria-expanded": open,
|
|
306
|
+
"aria-haspopup": "dialog",
|
|
307
|
+
"aria-label": `Change ${selector.label}`,
|
|
308
|
+
className: "a24-target-selector__trigger",
|
|
309
|
+
onClick: () => setOpen((value) => !value),
|
|
310
|
+
ref: triggerRef,
|
|
311
|
+
type: "button",
|
|
312
|
+
children: [
|
|
313
|
+
/* @__PURE__ */ jsx2(AgentAvatar, { agent }),
|
|
314
|
+
/* @__PURE__ */ jsxs2("span", { className: "a24-target-selector__copy", children: [
|
|
315
|
+
/* @__PURE__ */ jsx2("strong", { children: agent.name }),
|
|
316
|
+
/* @__PURE__ */ jsx2("span", { children: agent.description || "Click to change target" })
|
|
317
|
+
] }),
|
|
318
|
+
/* @__PURE__ */ jsx2(ChevronDown, { "aria-hidden": "true" })
|
|
319
|
+
]
|
|
320
|
+
}
|
|
321
|
+
),
|
|
322
|
+
open ? /* @__PURE__ */ jsxs2("form", { "aria-label": `Change ${selector.label}`, className: "a24-target-selector__panel", onSubmit: (event) => void apply(event), children: [
|
|
323
|
+
/* @__PURE__ */ jsx2("label", { htmlFor: inputId, children: selector.label }),
|
|
324
|
+
/* @__PURE__ */ jsx2("input", { autoComplete: "off", id: inputId, onChange: (event) => setDraft(event.target.value), placeholder: selector.placeholder, spellCheck: false, value: draft }),
|
|
325
|
+
selector.helperText ? /* @__PURE__ */ jsx2("p", { children: selector.helperText }) : null,
|
|
326
|
+
error ? /* @__PURE__ */ jsx2("p", { className: "a24-target-selector__error", role: "alert", children: error }) : null,
|
|
327
|
+
/* @__PURE__ */ jsx2("button", { className: "a24-button a24-target-selector__apply", disabled: submitting || !draft.trim(), type: "submit", children: submitting ? "Switching\u2026" : "Use target" })
|
|
328
|
+
] }) : null
|
|
329
|
+
] });
|
|
330
|
+
}
|
|
256
331
|
function ThreadNavigation({
|
|
257
332
|
activeThreadId,
|
|
333
|
+
agent,
|
|
258
334
|
close,
|
|
259
335
|
hasMoreThreads,
|
|
260
336
|
isDeletingThread,
|
|
@@ -264,12 +340,14 @@ function ThreadNavigation({
|
|
|
264
340
|
onNewThread,
|
|
265
341
|
onOpenThread,
|
|
266
342
|
slots,
|
|
343
|
+
targetSelector,
|
|
267
344
|
threads
|
|
268
345
|
}) {
|
|
269
346
|
const [query, setQuery] = React2.useState("");
|
|
270
347
|
const normalizedQuery = query.trim().toLocaleLowerCase();
|
|
271
348
|
const visibleThreads = normalizedQuery ? threads.filter((thread) => String(thread.title || "New chat").toLocaleLowerCase().includes(normalizedQuery)) : threads;
|
|
272
349
|
return /* @__PURE__ */ jsxs2("div", { className: "a24-sidebar__inner", children: [
|
|
350
|
+
targetSelector ? /* @__PURE__ */ jsx2(AgentTargetSelector, { agent, selector: targetSelector }) : null,
|
|
273
351
|
/* @__PURE__ */ jsxs2("div", { className: "a24-sidebar__top", children: [
|
|
274
352
|
/* @__PURE__ */ jsxs2(
|
|
275
353
|
"button",
|
|
@@ -376,6 +454,7 @@ function AgentChatLayout({
|
|
|
376
454
|
slots,
|
|
377
455
|
state = "ready",
|
|
378
456
|
streamingMessageId,
|
|
457
|
+
targetSelector,
|
|
379
458
|
threads,
|
|
380
459
|
title
|
|
381
460
|
}) {
|
|
@@ -420,6 +499,7 @@ function AgentChatLayout({
|
|
|
420
499
|
ThreadNavigation,
|
|
421
500
|
{
|
|
422
501
|
activeThreadId,
|
|
502
|
+
agent,
|
|
423
503
|
close: closeSidebar,
|
|
424
504
|
hasMoreThreads,
|
|
425
505
|
isDeletingThread,
|
|
@@ -429,6 +509,7 @@ function AgentChatLayout({
|
|
|
429
509
|
onNewThread,
|
|
430
510
|
onOpenThread,
|
|
431
511
|
slots,
|
|
512
|
+
targetSelector,
|
|
432
513
|
threads
|
|
433
514
|
}
|
|
434
515
|
) }),
|
|
@@ -712,8 +793,50 @@ function AgentChatApp({
|
|
|
712
793
|
}
|
|
713
794
|
);
|
|
714
795
|
}
|
|
796
|
+
|
|
797
|
+
// src/templates/appearance-control.tsx
|
|
798
|
+
import { Monitor, Moon, Sun } from "lucide-react";
|
|
799
|
+
import * as React4 from "react";
|
|
800
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
801
|
+
var MODES = ["system", "light", "dark"];
|
|
802
|
+
function storedMode(storageKey) {
|
|
803
|
+
if (typeof window === "undefined") return "system";
|
|
804
|
+
const value = window.localStorage.getItem(storageKey);
|
|
805
|
+
return value === "light" || value === "dark" ? value : "system";
|
|
806
|
+
}
|
|
807
|
+
function applyMode(mode) {
|
|
808
|
+
if (typeof document === "undefined") return;
|
|
809
|
+
document.documentElement.dataset.agents24ColorMode = mode;
|
|
810
|
+
}
|
|
811
|
+
function AgentChatAppearanceControl({
|
|
812
|
+
storageKey = "agents24-color-mode"
|
|
813
|
+
}) {
|
|
814
|
+
const [mode, setMode] = React4.useState(() => storedMode(storageKey));
|
|
815
|
+
React4.useEffect(() => applyMode(mode), [mode]);
|
|
816
|
+
const label = `Appearance: ${mode[0]?.toUpperCase()}${mode.slice(1)}`;
|
|
817
|
+
const Icon = mode === "light" ? Sun : mode === "dark" ? Moon : Monitor;
|
|
818
|
+
return /* @__PURE__ */ jsxs3(
|
|
819
|
+
"button",
|
|
820
|
+
{
|
|
821
|
+
"aria-label": `${label}. Activate to change.`,
|
|
822
|
+
className: "a24-icon-button a24-appearance",
|
|
823
|
+
onClick: () => {
|
|
824
|
+
const next = MODES[(MODES.indexOf(mode) + 1) % MODES.length] || "system";
|
|
825
|
+
window.localStorage.setItem(storageKey, next);
|
|
826
|
+
setMode(next);
|
|
827
|
+
},
|
|
828
|
+
title: label,
|
|
829
|
+
type: "button",
|
|
830
|
+
children: [
|
|
831
|
+
/* @__PURE__ */ jsx4(Icon, { "aria-hidden": "true" }),
|
|
832
|
+
/* @__PURE__ */ jsx4("span", { className: "a24-sr-only", children: label })
|
|
833
|
+
]
|
|
834
|
+
}
|
|
835
|
+
);
|
|
836
|
+
}
|
|
715
837
|
export {
|
|
716
838
|
AgentChatApp,
|
|
839
|
+
AgentChatAppearanceControl,
|
|
717
840
|
AgentChatLayout,
|
|
718
841
|
AgentChatShell,
|
|
719
842
|
AgentChatStatePanel,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/templates/agent-chat-shell.tsx","../../src/templates/agent-chat-layout.tsx","../../src/templates/agent-chat-app.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport {\n LatestThreadScroller,\n type LatestThreadScrollerOutlineItem,\n} from \"../latest-thread-scroller\";\nimport type { ChatMessage } from \"../types\";\nimport { cn } from \"../ui/utils\";\n\nexport type AgentChatShellMessage = Pick<ChatMessage, \"id\" | \"role\" | \"content\"> & {\n [key: string]: unknown;\n};\n\nexport type AgentChatShellScrollState = {\n canScroll: boolean;\n isScrolled: boolean;\n};\n\nexport type AgentChatShellProps<TMessage extends AgentChatShellMessage> = {\n className?: string;\n contentClassName?: string;\n composer?: React.ReactNode;\n composerOverlayClassName?: string;\n composerOverlayHeight?: number;\n defaultComposerOverlayHeight?: number;\n dir?: \"ltr\" | \"rtl\";\n emptyInputAttachmentCount?: number;\n emptyTitle?: string;\n hideComposer?: boolean;\n isLoadingOlder?: boolean;\n messages: TMessage[];\n onLoadOlder?: (() => Promise<unknown> | unknown) | null;\n onScrollStateChange?: (state: AgentChatShellScrollState) => void;\n outlineItems?: LatestThreadScrollerOutlineItem[];\n outlineSide?: \"left\" | \"right\";\n renderEmptyState?: (input: { composer?: React.ReactNode; title: string }) => React.ReactNode;\n renderMessage: (message: TMessage, index: number) => React.ReactNode;\n renderOlderLoader?: () => React.ReactNode;\n};\n\nexport function getAgentChatShellScrollState(\n viewport: Pick<HTMLElement, \"clientHeight\" | \"scrollHeight\" | \"scrollTop\">\n): AgentChatShellScrollState {\n const canScroll = viewport.scrollHeight - viewport.clientHeight > 1;\n return {\n canScroll,\n isScrolled: canScroll && viewport.scrollTop > 4,\n };\n}\n\nconst defaultOutlineLabel = (content: unknown, index: number) => {\n const label = String(content || \"\").replace(/\\s+/g, \" \").trim();\n return label || `Turn ${index + 1}`;\n};\n\nconst defaultOutlinePreview = (content: unknown) =>\n String(content || \"\").replace(/\\s+/g, \" \").trim();\n\nexport function buildAgentChatOutlineItems<TMessage extends AgentChatShellMessage>(\n messages: TMessage[],\n getLabel: (message: TMessage, index: number) => string = (message, index) =>\n defaultOutlineLabel(message.content, index),\n getResponsePreview: (message: TMessage) => string = (message) =>\n defaultOutlinePreview(message.content)\n): LatestThreadScrollerOutlineItem[] {\n return messages.reduce((items, message) => {\n if (message.role === \"user\") {\n items.push({\n id: message.id,\n label: getLabel(message, items.length),\n messageIds: [message.id],\n });\n return items;\n }\n const currentItem = items[items.length - 1];\n currentItem?.messageIds?.push(message.id);\n if (\n currentItem &&\n !currentItem.responsePreview &&\n message.role === \"assistant\"\n ) {\n currentItem.responsePreview = getResponsePreview(message);\n }\n return items;\n }, [] as LatestThreadScrollerOutlineItem[]);\n}\n\nexport function AgentChatShell<TMessage extends AgentChatShellMessage>({\n className,\n composer,\n composerOverlayClassName,\n composerOverlayHeight,\n contentClassName,\n defaultComposerOverlayHeight = 192,\n dir = \"ltr\",\n emptyInputAttachmentCount = 0,\n emptyTitle = \"Ready when you are.\",\n hideComposer = false,\n isLoadingOlder = false,\n messages,\n onLoadOlder,\n onScrollStateChange,\n outlineItems,\n outlineSide = \"left\",\n renderEmptyState,\n renderMessage,\n renderOlderLoader,\n}: AgentChatShellProps<TMessage>) {\n const overlayRef = React.useRef<HTMLDivElement | null>(null);\n const viewportRef = React.useRef<HTMLElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const lastScrollStateRef = React.useRef<AgentChatShellScrollState | null>(null);\n const [measuredOverlayHeight, setMeasuredOverlayHeight] = React.useState(\n defaultComposerOverlayHeight\n );\n const olderPageRequestRef = React.useRef(false);\n const items = React.useMemo(\n () => outlineItems || buildAgentChatOutlineItems(messages),\n [messages, outlineItems]\n );\n\n const updateScrollState = React.useCallback(() => {\n const viewport = viewportRef.current;\n if (!viewport || !onScrollStateChange) return;\n const next = getAgentChatShellScrollState(viewport);\n const previous = lastScrollStateRef.current;\n if (\n previous &&\n previous.canScroll === next.canScroll &&\n previous.isScrolled === next.isScrolled\n ) {\n return;\n }\n lastScrollStateRef.current = next;\n onScrollStateChange(next);\n }, [onScrollStateChange]);\n\n React.useEffect(() => {\n const overlay = overlayRef.current;\n if (!overlay || hideComposer) return;\n const updateHeight = () => {\n setMeasuredOverlayHeight(Math.ceil(overlay.getBoundingClientRect().height));\n };\n updateHeight();\n const observer = new ResizeObserver(updateHeight);\n observer.observe(overlay);\n return () => observer.disconnect();\n }, [hideComposer]);\n\n React.useEffect(() => {\n if (!onScrollStateChange) return;\n updateScrollState();\n const viewport = viewportRef.current;\n const content = contentRef.current;\n if (!viewport || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(updateScrollState);\n observer.observe(viewport);\n if (content) observer.observe(content);\n return () => observer.disconnect();\n }, [messages, onScrollStateChange, updateScrollState]);\n\n const handleScroll = React.useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n updateScrollState();\n if (\n !onLoadOlder ||\n isLoadingOlder ||\n olderPageRequestRef.current ||\n event.currentTarget.scrollTop > 48\n ) {\n return;\n }\n olderPageRequestRef.current = true;\n void Promise.resolve(onLoadOlder()).finally(() => {\n olderPageRequestRef.current = false;\n });\n },\n [isLoadingOlder, onLoadOlder, updateScrollState]\n );\n\n const bottomPadding = hideComposer\n ? 32\n : (composerOverlayHeight ?? measuredOverlayHeight) + 72;\n const isEmptyState = messages.length === 0;\n\n if (isEmptyState) {\n return (\n <div className={cn(\"a24-shell a24-shell--empty relative flex h-full min-h-0 w-full flex-col overflow-visible px-4\", className)} dir={dir}>\n {renderEmptyState ? (\n renderEmptyState({ composer: hideComposer ? undefined : composer, title: emptyTitle })\n ) : (\n <div className=\"a24-shell__empty relative z-10 flex h-full flex-1 flex-col justify-center p-0 pt-13\">\n <div className=\"a24-shell__empty-content flex w-full flex-col items-center pb-34 text-center animate-in fade-in slide-in-from-bottom-4 duration-500\">\n <p\n className={cn(\n \"a24-shell__empty-title pb-6 text-3xl font-semibold transition-transform duration-200\",\n emptyInputAttachmentCount > 0 && \"-translate-y-12\"\n )}\n >\n {emptyTitle}\n </p>\n {!hideComposer && composer ? (\n <div className=\"a24-shell__empty-composer mx-auto w-full max-w-3xl px-4\">{composer}</div>\n ) : null}\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={cn(\"a24-shell relative flex h-full min-h-0 w-full flex-col\", className)} dir={dir}>\n <LatestThreadScroller.Provider>\n <LatestThreadScroller.Root>\n <LatestThreadScroller.Viewport\n onScroll={handleScroll}\n onViewportChange={(node) => {\n viewportRef.current = node;\n updateScrollState();\n }}\n >\n <LatestThreadScroller.Content\n ref={contentRef}\n className={cn(\n \"a24-shell__content mx-auto flex min-h-full w-full max-w-3xl flex-col gap-8 px-4 pt-12\",\n contentClassName\n )}\n style={{ paddingBottom: bottomPadding }}\n >\n {isLoadingOlder ? renderOlderLoader?.() : null}\n {messages.map((message, index) => (\n <LatestThreadScroller.Item\n key={message.id}\n messageId={message.id}\n scrollAnchor={message.role === \"user\"}\n >\n {renderMessage(message, index)}\n </LatestThreadScroller.Item>\n ))}\n </LatestThreadScroller.Content>\n </LatestThreadScroller.Viewport>\n <LatestThreadScroller.Outline\n dir={dir}\n items={items}\n side={outlineSide}\n />\n </LatestThreadScroller.Root>\n\n {!hideComposer && composer ? (\n <div\n ref={overlayRef}\n className={cn(\n \"a24-shell__composer-overlay pointer-events-none absolute inset-x-0 bottom-0 z-20 overflow-visible px-4 pb-4 pt-10\",\n composerOverlayClassName\n )}\n style={{\n background:\n \"linear-gradient(to bottom, transparent 0%, color-mix(in oklch, var(--chat-background, var(--background)) 85%, transparent) 45%, var(--chat-background, var(--background)) 65%, var(--chat-background, var(--background)) 100%)\",\n }}\n >\n <div className=\"a24-shell__scroll-button pointer-events-auto absolute inset-x-0 top-0 flex -translate-y-full justify-center pb-3\">\n <LatestThreadScroller.Button />\n </div>\n <div className=\"a24-shell__composer-inner pointer-events-auto mx-auto w-full max-w-3xl px-4\">\n {composer}\n </div>\n </div>\n ) : null}\n </LatestThreadScroller.Provider>\n </div>\n );\n}\n","import * as React from \"react\";\nimport {\n ChevronDown,\n Menu,\n MessageSquare,\n MoreHorizontal,\n Plus,\n RefreshCw,\n Search,\n Trash2,\n Wifi,\n WifiOff,\n X,\n} from \"lucide-react\";\n\nimport type { ChatHitlPart, ChatMessage } from \"../types\";\nimport {\n AgentChatComposer,\n type AgentChatComposerSubmit,\n} from \"../ui/agent-chat-composer\";\nimport { AgentChatMessage } from \"../ui/agent-chat-message\";\nimport { cn } from \"../ui/utils\";\nimport { AgentChatShell } from \"./agent-chat-shell\";\n\nexport type AgentChatConnectionState =\n | \"connected\"\n | \"connecting\"\n | \"reconnecting\"\n | \"offline\"\n | \"expired\";\n\nexport type AgentChatViewState =\n | \"ready\"\n | \"loading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"offline\"\n | \"denied\"\n | \"quota\"\n | \"failed\"\n | \"expired\";\n\nexport type AgentChatLayoutThread = {\n id: string;\n title?: string | null;\n updatedAt?: string | null;\n status?: string | null;\n};\n\nexport type AgentChatLayoutModel = {\n id: string;\n label: string;\n};\n\nexport type AgentChatLayoutAgent = {\n name: string;\n description?: string | null;\n avatarUrl?: string | null;\n};\n\nexport type AgentChatLayoutSlots = {\n assistantBody?: (input: {\n isStreaming: boolean;\n message: ChatMessage;\n }) => React.ReactNode;\n empty?: React.ReactNode;\n headerActions?: React.ReactNode;\n messageActions?: (message: ChatMessage) => React.ReactNode;\n threadActions?: (thread: AgentChatLayoutThread) => React.ReactNode;\n};\n\nexport type AgentChatLayoutProps = {\n activeThreadId?: string | null;\n agent: AgentChatLayoutAgent;\n allowAttachments?: boolean;\n className?: string;\n connectionState?: AgentChatConnectionState;\n dir?: \"ltr\" | \"rtl\";\n errorMessage?: string | null;\n hasMoreThreads?: boolean;\n isDeletingThread?: boolean;\n isLoadingOlder?: boolean;\n isLoadingThreads?: boolean;\n isRunning?: boolean;\n messages: ChatMessage[];\n modelId?: string | null;\n models?: AgentChatLayoutModel[];\n onDeleteThread?: (threadId: string) => Promise<void> | void;\n onHitlAction?: (part: ChatHitlPart, action: string, comment?: string) => Promise<void> | void;\n onLoadMoreThreads?: () => Promise<void> | void;\n onLoadOlder?: () => Promise<void> | void;\n onModelChange?: (modelId: string) => void;\n onNewThread: () => void;\n onOpenThread: (threadId: string) => Promise<void> | void;\n onRetryConnection?: () => Promise<void> | void;\n onStop?: () => void;\n onSubmit: (message: AgentChatComposerSubmit) => Promise<void> | void;\n placeholder?: string;\n slots?: AgentChatLayoutSlots;\n state?: AgentChatViewState;\n streamingMessageId?: string | null;\n threads: AgentChatLayoutThread[];\n title?: string;\n};\n\nconst stateCopy: Record<\n Exclude<AgentChatViewState, \"ready\" | \"streaming\" | \"paused\">,\n { title: string; detail: string }\n> = {\n loading: { title: \"Loading chat\", detail: \"Your conversation is being prepared.\" },\n reconnecting: { title: \"Reconnecting\", detail: \"Messages are safe. Trying the connection again.\" },\n offline: { title: \"You’re offline\", detail: \"Reconnect to continue this conversation.\" },\n denied: { title: \"Access denied\", detail: \"This deployment does not allow this request.\" },\n quota: { title: \"Usage limit reached\", detail: \"Try again after the deployment limit resets.\" },\n failed: { title: \"Something went wrong\", detail: \"The request could not be completed safely.\" },\n expired: { title: \"Session expired\", detail: \"Reconnect to start a new secure session.\" },\n};\n\nexport function AgentChatStatePanel({\n errorMessage,\n onRetry,\n state,\n}: {\n errorMessage?: string | null;\n onRetry?: () => Promise<void> | void;\n state: Exclude<AgentChatViewState, \"ready\" | \"streaming\" | \"paused\">;\n}) {\n const copy = stateCopy[state];\n const retryable = state === \"offline\" || state === \"failed\" || state === \"expired\";\n return (\n <div className=\"a24-state\" data-state={state} role={state === \"failed\" ? \"alert\" : \"status\"}>\n <div className=\"a24-state__icon\" aria-hidden=\"true\">\n {state === \"offline\" ? <WifiOff /> : state === \"reconnecting\" ? <RefreshCw /> : <MessageSquare />}\n </div>\n <h2>{copy.title}</h2>\n <p>{errorMessage || copy.detail}</p>\n {retryable && onRetry ? (\n <button className=\"a24-button a24-button--primary\" onClick={() => void onRetry()} type=\"button\">\n Try again\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction connectionLabel(state: AgentChatConnectionState) {\n if (state === \"connected\") return \"Connected\";\n if (state === \"connecting\") return \"Connecting\";\n if (state === \"reconnecting\") return \"Reconnecting\";\n if (state === \"expired\") return \"Session expired\";\n return \"Offline\";\n}\n\nfunction AgentAvatar({ agent }: { agent: AgentChatLayoutAgent }) {\n return agent.avatarUrl ? (\n <img alt=\"\" className=\"a24-avatar\" height={36} src={agent.avatarUrl} width={36} />\n ) : (\n <span aria-hidden=\"true\" className=\"a24-avatar a24-avatar--fallback\">\n {agent.name.trim().slice(0, 1).toUpperCase() || \"A\"}\n </span>\n );\n}\n\nfunction ThreadNavigation({\n activeThreadId,\n close,\n hasMoreThreads,\n isDeletingThread,\n isLoadingThreads,\n onDeleteThread,\n onLoadMoreThreads,\n onNewThread,\n onOpenThread,\n slots,\n threads,\n}: Pick<\n AgentChatLayoutProps,\n | \"activeThreadId\"\n | \"hasMoreThreads\"\n | \"isDeletingThread\"\n | \"isLoadingThreads\"\n | \"onDeleteThread\"\n | \"onLoadMoreThreads\"\n | \"onNewThread\"\n | \"onOpenThread\"\n | \"slots\"\n | \"threads\"\n> & { close: () => void }) {\n const [query, setQuery] = React.useState(\"\");\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const visibleThreads = normalizedQuery\n ? threads.filter((thread) => String(thread.title || \"New chat\").toLocaleLowerCase().includes(normalizedQuery))\n : threads;\n return (\n <div className=\"a24-sidebar__inner\">\n <div className=\"a24-sidebar__top\">\n <button\n aria-label=\"New chat\"\n className=\"a24-button a24-button--primary a24-sidebar__new\"\n onClick={() => {\n onNewThread();\n close();\n }}\n type=\"button\"\n >\n <Plus aria-hidden=\"true\" />\n New chat\n </button>\n <button aria-label=\"Close conversations\" className=\"a24-icon-button a24-sidebar__mobile-close\" onClick={close} type=\"button\">\n <X aria-hidden=\"true\" />\n </button>\n </div>\n <label className=\"a24-search\">\n <Search aria-hidden=\"true\" />\n <span className=\"a24-sr-only\">Search conversations</span>\n <input\n autoComplete=\"off\"\n name=\"conversation-search\"\n onChange={(event) => setQuery(event.target.value)}\n placeholder=\"Search conversations…\"\n type=\"search\"\n value={query}\n />\n </label>\n <nav aria-label=\"Conversations\" className=\"a24-thread-list\">\n {isLoadingThreads && threads.length === 0 ? <p className=\"a24-sidebar__hint\" role=\"status\">Loading conversations…</p> : null}\n {!isLoadingThreads && visibleThreads.length === 0 ? <p className=\"a24-sidebar__hint\">No conversations yet.</p> : null}\n {visibleThreads.map((thread) => {\n const selected = thread.id === activeThreadId;\n return (\n <div className=\"a24-thread\" data-selected={selected || undefined} key={thread.id}>\n <button\n aria-current={selected ? \"page\" : undefined}\n className=\"a24-thread__open\"\n onClick={() => {\n void onOpenThread(thread.id);\n close();\n }}\n type=\"button\"\n >\n <span className=\"a24-thread__title\">{thread.title || \"New chat\"}</span>\n {thread.status ? <span className=\"a24-thread__status\">{thread.status}</span> : null}\n </button>\n {slots?.threadActions ? slots.threadActions(thread) : onDeleteThread ? (\n <button\n aria-label={`Delete ${thread.title || \"conversation\"}`}\n className=\"a24-icon-button a24-thread__delete\"\n disabled={isDeletingThread}\n onClick={() => void onDeleteThread(thread.id)}\n type=\"button\"\n >\n <Trash2 aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n );\n })}\n </nav>\n {hasMoreThreads && onLoadMoreThreads ? (\n <button className=\"a24-button a24-button--quiet a24-sidebar__more\" onClick={() => void onLoadMoreThreads()} type=\"button\">\n <MoreHorizontal aria-hidden=\"true\" />\n Load more\n </button>\n ) : null}\n </div>\n );\n}\n\nexport function AgentChatLayout({\n activeThreadId,\n agent,\n allowAttachments = true,\n className,\n connectionState = \"connected\",\n dir = \"ltr\",\n errorMessage,\n hasMoreThreads,\n isDeletingThread,\n isLoadingOlder,\n isLoadingThreads,\n isRunning = false,\n messages,\n modelId,\n models = [],\n onDeleteThread,\n onHitlAction,\n onLoadMoreThreads,\n onLoadOlder,\n onModelChange,\n onNewThread,\n onOpenThread,\n onRetryConnection,\n onStop,\n onSubmit,\n placeholder,\n slots,\n state = \"ready\",\n streamingMessageId,\n threads,\n title,\n}: AgentChatLayoutProps) {\n const [sidebarOpen, setSidebarOpen] = React.useState(false);\n const menuButtonRef = React.useRef<HTMLButtonElement>(null);\n const closeSidebar = React.useCallback(() => {\n setSidebarOpen(false);\n menuButtonRef.current?.focus();\n }, []);\n React.useEffect(() => {\n if (!sidebarOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n closeSidebar();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [closeSidebar, sidebarOpen]);\n const shellState = state === \"streaming\" || state === \"paused\" ? \"ready\" : state;\n const showState = shellState !== \"ready\";\n const liveLabel = state === \"streaming\"\n ? \"Agent is responding\"\n : state === \"paused\"\n ? \"Waiting for your response\"\n : connectionLabel(connectionState);\n const composer = (\n <AgentChatComposer\n allowAttachments={allowAttachments}\n disabled={state === \"denied\" || state === \"quota\" || state === \"expired\" || state === \"offline\"}\n inputToolbarContent={models.length > 0 ? (\n <label className=\"a24-model-select\">\n <span className=\"a24-sr-only\">Model</span>\n <select aria-label=\"Model\" onChange={(event) => onModelChange?.(event.target.value)} value={modelId || models[0]?.id}>\n {models.map((model) => <option key={model.id} value={model.id}>{model.label}</option>)}\n </select>\n <ChevronDown aria-hidden=\"true\" />\n </label>\n ) : undefined}\n isRunning={isRunning}\n onStop={onStop}\n onSubmit={onSubmit}\n placeholder={placeholder}\n />\n );\n return (\n <section className={cn(\"a24-chat\", className)} data-agents24-chat-layout=\"\" dir={dir}>\n <a className=\"a24-skip-link\" href=\"#agents24-chat-main\">Skip to messages</a>\n <nav aria-label=\"Chat navigation\" className=\"a24-sidebar\" data-open={sidebarOpen || undefined}>\n <ThreadNavigation\n activeThreadId={activeThreadId}\n close={closeSidebar}\n hasMoreThreads={hasMoreThreads}\n isDeletingThread={isDeletingThread}\n isLoadingThreads={isLoadingThreads}\n onDeleteThread={onDeleteThread}\n onLoadMoreThreads={onLoadMoreThreads}\n onNewThread={onNewThread}\n onOpenThread={onOpenThread}\n slots={slots}\n threads={threads}\n />\n </nav>\n {sidebarOpen ? <button aria-label=\"Close conversations\" className=\"a24-sidebar-backdrop\" onClick={closeSidebar} type=\"button\" /> : null}\n <div className=\"a24-chat__body\">\n <header className=\"a24-header\" role=\"banner\">\n <button aria-label=\"Open conversations\" className=\"a24-icon-button a24-header__menu\" onClick={() => setSidebarOpen(true)} ref={menuButtonRef} type=\"button\">\n <Menu aria-hidden=\"true\" />\n </button>\n <AgentAvatar agent={agent} />\n <div className=\"a24-header__identity\">\n <h1>{title || agent.name}</h1>\n <div className=\"a24-connection\" data-state={connectionState}>\n {connectionState === \"offline\" || connectionState === \"expired\" ? <WifiOff aria-hidden=\"true\" /> : <Wifi aria-hidden=\"true\" />}\n <span>{connectionLabel(connectionState)}</span>\n </div>\n </div>\n <div className=\"a24-header__actions\">{slots?.headerActions}</div>\n </header>\n <main aria-busy={state === \"loading\" || state === \"reconnecting\"} className=\"a24-main\" id=\"agents24-chat-main\">\n {showState ? (\n <AgentChatStatePanel errorMessage={errorMessage} onRetry={onRetryConnection} state={shellState} />\n ) : (\n <AgentChatShell\n composer={composer}\n dir={dir}\n isLoadingOlder={isLoadingOlder}\n messages={messages}\n onLoadOlder={onLoadOlder}\n renderEmptyState={slots?.empty ? () => slots.empty : undefined}\n renderMessage={(message) => (\n <AgentChatMessage\n actions={slots?.messageActions?.(message)}\n message={message}\n onHitlAction={(part, action, comment) => void onHitlAction?.(part, action, comment)}\n renderAssistantContent={slots?.assistantBody}\n streamingMessageId={streamingMessageId}\n />\n )}\n />\n )}\n </main>\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"a24-sr-only\">{liveLabel}</div>\n </div>\n </section>\n );\n}\n","import type { AgentClient, Agents24ClientError, HitlAction } from \"@agents24/client\";\nimport {\n Agents24Provider,\n type Agents24ProviderProps,\n type ChatHitlPart,\n type ChatMessage,\n useAgentAttachments,\n useAgentChat,\n useAgentMcp,\n} from \"@agents24/react\";\nimport * as React from \"react\";\n\nimport { validateMcpCallbackResult, waitForMcpOauthComplete } from \"../mcp-oauth\";\nimport type { ChatMcpOauthCompletion } from \"../types\";\nimport { AgentChatDefaultActions } from \"../ui/agent-chat-actions\";\nimport type { AgentChatComposerSubmit } from \"../ui/agent-chat-composer\";\nimport {\n AgentChatLayout,\n type AgentChatConnectionState,\n type AgentChatLayoutAgent,\n type AgentChatLayoutProps,\n type AgentChatViewState,\n} from \"./agent-chat-layout\";\n\ntype CryptoLike = {\n getRandomValues<T extends Uint8Array>(array: T): T;\n randomUUID(): string;\n subtle: { digest(algorithm: string, data: Uint8Array): Promise<ArrayBuffer> };\n};\n\nfunction browserCrypto(): CryptoLike {\n const value = (globalThis as unknown as { crypto?: CryptoLike }).crypto;\n if (!value?.subtle || !value.randomUUID) throw new Error(\"Secure browser crypto is required for MCP authorization.\");\n return value;\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n bytes.forEach((byte) => { binary += String.fromCharCode(byte); });\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\n\nasync function createPkceProof(): Promise<{ challenge: string; verifier: string }> {\n const crypto = browserCrypto();\n const verifier = base64Url(crypto.getRandomValues(new Uint8Array(32)));\n const bytes = new TextEncoder().encode(verifier);\n const digest = await crypto.subtle.digest(\"SHA-256\", bytes);\n return { verifier, challenge: base64Url(new Uint8Array(digest)) };\n}\n\nfunction stateFromError(error: unknown): AgentChatViewState {\n const typed = error as Partial<Agents24ClientError> | null;\n if (typed?.kind === \"authentication\") return \"expired\";\n if (typed?.kind === \"authorization\") return \"denied\";\n if (typed?.kind === \"quota\" || typed?.kind === \"rate_limit\") return \"quota\";\n if (typed?.kind === \"network\") return \"offline\";\n return \"failed\";\n}\n\nexport type AgentChatAppProps = Omit<\n AgentChatLayoutProps,\n | \"activeThreadId\"\n | \"agent\"\n | \"connectionState\"\n | \"isLoadingOlder\"\n | \"isLoadingThreads\"\n | \"isRunning\"\n | \"messages\"\n | \"onDeleteThread\"\n | \"onHitlAction\"\n | \"onLoadOlder\"\n | \"onNewThread\"\n | \"onOpenThread\"\n | \"onRetryConnection\"\n | \"onStop\"\n | \"onSubmit\"\n | \"state\"\n | \"streamingMessageId\"\n | \"threads\"\n> & {\n agent?: AgentChatLayoutAgent;\n client: AgentClient;\n createAbortController?: Agents24ProviderProps[\"createAbortController\"];\n createId?: Agents24ProviderProps[\"createId\"];\n completeMcpAuthorization?: (input: {\n completion: ChatMcpOauthCompletion;\n codeVerifier: string;\n serverId: string;\n }) => Promise<void>;\n mcpRedirectUri?: string;\n storage?: Agents24ProviderProps[\"storage\"];\n};\n\nfunction BoundAgentChatApp({\n agent: agentOverride,\n client,\n completeMcpAuthorization,\n mcpRedirectUri,\n modelId,\n models: modelOverrides,\n onModelChange,\n slots,\n ...layoutProps\n}: Omit<AgentChatAppProps, \"createAbortController\" | \"createId\" | \"storage\">) {\n const controller = useAgentChat();\n const attachments = useAgentAttachments();\n const mcp = useAgentMcp();\n const [agent, setAgent] = React.useState<AgentChatLayoutAgent>(agentOverride || { name: \"Agent\" });\n const [capabilities, setCapabilities] = React.useState<readonly string[]>([]);\n const [bootstrapModels, setBootstrapModels] = React.useState<AgentChatLayoutProps[\"models\"]>([]);\n const [selectedModelId, setSelectedModelId] = React.useState<string | null>(modelId || null);\n const [bootstrapLoading, setBootstrapLoading] = React.useState(true);\n const [localError, setLocalError] = React.useState<unknown>(null);\n const [liked, setLiked] = React.useState<Record<string, boolean>>({});\n const [disliked, setDisliked] = React.useState<Record<string, boolean>>({});\n\n const loadBootstrap = React.useCallback(async () => {\n setBootstrapLoading(true);\n setLocalError(null);\n try {\n const bootstrap = await client.bootstrap();\n if (!agentOverride) setAgent({ name: bootstrap.deployment.name || \"Agent\" });\n setCapabilities(bootstrap.capabilities);\n const modelFeatures = bootstrap.features.models as Record<string, unknown> | undefined;\n const allowedModelIds = Array.isArray(modelFeatures?.allowed_ids)\n ? modelFeatures.allowed_ids.filter((value): value is string => typeof value === \"string\")\n : [];\n if (bootstrap.capabilities.includes(\"models.select\") && modelFeatures?.selectable) {\n setBootstrapModels(allowedModelIds.map((id) => ({ id, label: id })));\n if (!modelId) {\n const defaultId = typeof modelFeatures.default_id === \"string\" ? modelFeatures.default_id : allowedModelIds[0];\n setSelectedModelId(defaultId || null);\n }\n } else {\n setBootstrapModels([]);\n }\n await controller.refreshThreads();\n } catch (error) {\n setLocalError(error);\n } finally {\n setBootstrapLoading(false);\n }\n }, [agentOverride, client, controller.refreshThreads, modelId]);\n\n React.useEffect(() => {\n if (modelId !== undefined) setSelectedModelId(modelId);\n }, [modelId]);\n\n React.useEffect(() => { void loadBootstrap(); }, [loadBootstrap]);\n\n const submit = React.useCallback(async (message: AgentChatComposerSubmit) => {\n setLocalError(null);\n try {\n const uploaded = await Promise.all(message.files.map((file) => attachments.upload({\n data: file.source,\n name: file.filename,\n mediaType: file.mediaType,\n threadId: controller.activeThreadId || undefined,\n })));\n await controller.submit({\n text: message.text,\n attachmentIds: uploaded.flatMap((attachment) => attachment.id ? [attachment.id] : []),\n attachments: uploaded,\n requestedModelId: selectedModelId || undefined,\n });\n } catch (error) {\n setLocalError(error);\n }\n }, [attachments, controller, selectedModelId]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n if (!window.confirm(\"Delete this conversation? This cannot be undone.\")) return;\n await controller.deleteThread(threadId);\n }, [controller.deleteThread]);\n\n const changeModel = React.useCallback((nextModelId: string) => {\n if (modelId === undefined) setSelectedModelId(nextModelId);\n onModelChange?.(nextModelId);\n }, [modelId, onModelChange]);\n\n const handleMcp = React.useCallback(async (part: ChatHitlPart) => {\n if (!mcpRedirectUri) throw new Error(\"mcpRedirectUri is required for MCP Connect.\");\n const serverId = String(part.presentation.server_id || \"\").trim();\n if (!serverId) throw new Error(\"MCP authorization is missing its server identity.\");\n const runId = controller.activeRunId || controller.messages.find((message) => message.parts.includes(part))?.runId;\n if (!runId) throw new Error(\"MCP authorization is missing its paused run.\");\n const popupNonce = browserCrypto().randomUUID();\n const proof = await createPkceProof();\n const popup = window.open(\"about:blank\", \"agents24-mcp\", \"popup,width=560,height=720\");\n try {\n const start = await mcp.startAuthorization({\n runId,\n serverId,\n interruptId: part.interruptId,\n redirectUri: mcpRedirectUri,\n popupNonce,\n codeChallenge: proof.challenge,\n });\n if (!start.callback_origin) throw new Error(\"MCP authorization did not return a callback origin.\");\n if (popup) popup.location.replace(start.authorization_url);\n const completion = await waitForMcpOauthComplete({\n popup,\n callbackOrigin: start.callback_origin,\n popupNonce,\n requireConnectionId: Boolean(completeMcpAuthorization),\n serverId,\n });\n if (completeMcpAuthorization) {\n await completeMcpAuthorization({ completion, codeVerifier: proof.verifier, serverId });\n } else {\n const redeemed = await mcp.redeemCallback({ code: completion.code, codeVerifier: proof.verifier });\n validateMcpCallbackResult(redeemed, serverId);\n }\n popup?.close();\n await controller.resumeHitl(part, \"connect\");\n } catch (error) {\n popup?.close();\n throw error;\n }\n }, [completeMcpAuthorization, controller, mcp, mcpRedirectUri]);\n\n const onHitlAction = React.useCallback(async (part: ChatHitlPart, action: string, comment?: string) => {\n setLocalError(null);\n try {\n if (part.hitlKind === \"mcp_auth\" && action === \"connect\") await handleMcp(part);\n else await controller.resumeHitl(part, action as HitlAction, comment);\n } catch (error) {\n setLocalError(error);\n }\n }, [controller, handleMcp]);\n\n const error = localError || controller.error;\n const state: AgentChatViewState = bootstrapLoading\n ? \"loading\"\n : error\n ? stateFromError(error)\n : controller.runState === \"streaming\"\n ? \"streaming\"\n : controller.runState === \"reconnecting\"\n ? \"reconnecting\"\n : controller.runState === \"paused\"\n ? \"paused\"\n : \"ready\";\n const connectionState: AgentChatConnectionState = state === \"offline\"\n ? \"offline\"\n : state === \"expired\"\n ? \"expired\"\n : state === \"reconnecting\"\n ? \"reconnecting\"\n : bootstrapLoading\n ? \"connecting\"\n : \"connected\";\n const defaultMessageActions = (message: ChatMessage) => message.role === \"assistant\" ? (\n <AgentChatDefaultActions\n handlers={{\n copied: false,\n disliked: Boolean(disliked[message.id]),\n liked: Boolean(liked[message.id]),\n onCopy: async (content) => navigator.clipboard.writeText(content),\n onDislike: () => {\n setDisliked((current) => ({ ...current, [message.id]: !current[message.id] }));\n setLiked((current) => ({ ...current, [message.id]: false }));\n },\n onLike: () => {\n setLiked((current) => ({ ...current, [message.id]: !current[message.id] }));\n setDisliked((current) => ({ ...current, [message.id]: false }));\n },\n onRetry: () => controller.regenerate(message),\n }}\n message={message}\n />\n ) : null;\n return (\n <AgentChatLayout\n {...layoutProps}\n activeThreadId={controller.activeThreadId}\n agent={agent}\n allowAttachments={layoutProps.allowAttachments ?? capabilities.includes(\"attachments.write\")}\n connectionState={connectionState}\n errorMessage={error instanceof Error ? error.message : null}\n isLoadingOlder={controller.isLoadingOlder}\n isLoadingThreads={controller.isLoadingThreads}\n isRunning={controller.runState === \"streaming\" || controller.isSubmitting}\n messages={controller.messages}\n hasMoreThreads={controller.hasMoreThreads}\n modelId={selectedModelId}\n models={modelOverrides ?? bootstrapModels}\n onDeleteThread={deleteThread}\n onHitlAction={onHitlAction}\n onLoadOlder={controller.hasOlderTurns ? controller.loadOlder : undefined}\n onLoadMoreThreads={controller.hasMoreThreads ? controller.loadMoreThreads : undefined}\n onModelChange={changeModel}\n onNewThread={controller.startNewThread}\n onOpenThread={controller.openThread}\n onRetryConnection={loadBootstrap}\n onStop={() => void controller.cancelRun()}\n onSubmit={submit}\n slots={{ ...slots, messageActions: slots?.messageActions || defaultMessageActions }}\n state={state}\n streamingMessageId={controller.streamingMessageId}\n threads={controller.threads.map((thread) => ({ id: thread.id, title: thread.title, status: thread.last_run_status || thread.status, updatedAt: thread.updated_at }))}\n />\n );\n}\n\nexport function AgentChatApp({\n client,\n createAbortController,\n createId,\n storage,\n ...props\n}: AgentChatAppProps) {\n return (\n <Agents24Provider\n client={client}\n createAbortController={createAbortController || (() => new AbortController())}\n createId={createId}\n storage={storage}\n >\n <BoundAgentChatApp client={client} {...props} />\n </Agents24Provider>\n );\n}\n"],"mappings":"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","names":["React","jsx","jsxs","React","jsx","error"]}
|
|
1
|
+
{"version":3,"sources":["../../src/templates/agent-chat-shell.tsx","../../src/templates/agent-chat-layout.tsx","../../src/templates/agent-chat-app.tsx","../../src/templates/appearance-control.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport {\n LatestThreadScroller,\n type LatestThreadScrollerOutlineItem,\n} from \"../latest-thread-scroller\";\nimport type { ChatMessage } from \"../types\";\nimport { cn } from \"../ui/utils\";\n\nexport type AgentChatShellMessage = Pick<ChatMessage, \"id\" | \"role\" | \"content\"> & {\n [key: string]: unknown;\n};\n\nexport type AgentChatShellScrollState = {\n canScroll: boolean;\n isScrolled: boolean;\n};\n\nexport type AgentChatShellProps<TMessage extends AgentChatShellMessage> = {\n className?: string;\n contentClassName?: string;\n composer?: React.ReactNode;\n composerOverlayClassName?: string;\n composerOverlayHeight?: number;\n defaultComposerOverlayHeight?: number;\n dir?: \"ltr\" | \"rtl\";\n emptyInputAttachmentCount?: number;\n emptyTitle?: string;\n hideComposer?: boolean;\n isLoadingOlder?: boolean;\n messages: TMessage[];\n onLoadOlder?: (() => Promise<unknown> | unknown) | null;\n onScrollStateChange?: (state: AgentChatShellScrollState) => void;\n outlineItems?: LatestThreadScrollerOutlineItem[];\n outlineSide?: \"left\" | \"right\";\n renderEmptyState?: (input: { composer?: React.ReactNode; title: string }) => React.ReactNode;\n renderMessage: (message: TMessage, index: number) => React.ReactNode;\n renderOlderLoader?: () => React.ReactNode;\n};\n\nexport function getAgentChatShellScrollState(\n viewport: Pick<HTMLElement, \"clientHeight\" | \"scrollHeight\" | \"scrollTop\">\n): AgentChatShellScrollState {\n const canScroll = viewport.scrollHeight - viewport.clientHeight > 1;\n return {\n canScroll,\n isScrolled: canScroll && viewport.scrollTop > 4,\n };\n}\n\nconst defaultOutlineLabel = (content: unknown, index: number) => {\n const label = String(content || \"\").replace(/\\s+/g, \" \").trim();\n return label || `Turn ${index + 1}`;\n};\n\nconst defaultOutlinePreview = (content: unknown) =>\n String(content || \"\").replace(/\\s+/g, \" \").trim();\n\nexport function buildAgentChatOutlineItems<TMessage extends AgentChatShellMessage>(\n messages: TMessage[],\n getLabel: (message: TMessage, index: number) => string = (message, index) =>\n defaultOutlineLabel(message.content, index),\n getResponsePreview: (message: TMessage) => string = (message) =>\n defaultOutlinePreview(message.content)\n): LatestThreadScrollerOutlineItem[] {\n return messages.reduce((items, message) => {\n if (message.role === \"user\") {\n items.push({\n id: message.id,\n label: getLabel(message, items.length),\n messageIds: [message.id],\n });\n return items;\n }\n const currentItem = items[items.length - 1];\n currentItem?.messageIds?.push(message.id);\n if (\n currentItem &&\n !currentItem.responsePreview &&\n message.role === \"assistant\"\n ) {\n currentItem.responsePreview = getResponsePreview(message);\n }\n return items;\n }, [] as LatestThreadScrollerOutlineItem[]);\n}\n\nexport function AgentChatShell<TMessage extends AgentChatShellMessage>({\n className,\n composer,\n composerOverlayClassName,\n composerOverlayHeight,\n contentClassName,\n defaultComposerOverlayHeight = 192,\n dir = \"ltr\",\n emptyInputAttachmentCount = 0,\n emptyTitle = \"Ready when you are.\",\n hideComposer = false,\n isLoadingOlder = false,\n messages,\n onLoadOlder,\n onScrollStateChange,\n outlineItems,\n outlineSide = \"left\",\n renderEmptyState,\n renderMessage,\n renderOlderLoader,\n}: AgentChatShellProps<TMessage>) {\n const overlayRef = React.useRef<HTMLDivElement | null>(null);\n const viewportRef = React.useRef<HTMLElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const lastScrollStateRef = React.useRef<AgentChatShellScrollState | null>(null);\n const [measuredOverlayHeight, setMeasuredOverlayHeight] = React.useState(\n defaultComposerOverlayHeight\n );\n const olderPageRequestRef = React.useRef(false);\n const items = React.useMemo(\n () => outlineItems || buildAgentChatOutlineItems(messages),\n [messages, outlineItems]\n );\n\n const updateScrollState = React.useCallback(() => {\n const viewport = viewportRef.current;\n if (!viewport || !onScrollStateChange) return;\n const next = getAgentChatShellScrollState(viewport);\n const previous = lastScrollStateRef.current;\n if (\n previous &&\n previous.canScroll === next.canScroll &&\n previous.isScrolled === next.isScrolled\n ) {\n return;\n }\n lastScrollStateRef.current = next;\n onScrollStateChange(next);\n }, [onScrollStateChange]);\n\n React.useEffect(() => {\n const overlay = overlayRef.current;\n if (!overlay || hideComposer) return;\n const updateHeight = () => {\n setMeasuredOverlayHeight(Math.ceil(overlay.getBoundingClientRect().height));\n };\n updateHeight();\n const observer = new ResizeObserver(updateHeight);\n observer.observe(overlay);\n return () => observer.disconnect();\n }, [hideComposer]);\n\n React.useEffect(() => {\n if (!onScrollStateChange) return;\n updateScrollState();\n const viewport = viewportRef.current;\n const content = contentRef.current;\n if (!viewport || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(updateScrollState);\n observer.observe(viewport);\n if (content) observer.observe(content);\n return () => observer.disconnect();\n }, [messages, onScrollStateChange, updateScrollState]);\n\n const handleScroll = React.useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n updateScrollState();\n if (\n !onLoadOlder ||\n isLoadingOlder ||\n olderPageRequestRef.current ||\n event.currentTarget.scrollTop > 48\n ) {\n return;\n }\n olderPageRequestRef.current = true;\n void Promise.resolve(onLoadOlder()).finally(() => {\n olderPageRequestRef.current = false;\n });\n },\n [isLoadingOlder, onLoadOlder, updateScrollState]\n );\n\n const bottomPadding = hideComposer\n ? 32\n : (composerOverlayHeight ?? measuredOverlayHeight) + 72;\n const isEmptyState = messages.length === 0;\n\n if (isEmptyState) {\n return (\n <div className={cn(\"a24-shell a24-shell--empty relative flex h-full min-h-0 w-full flex-col overflow-visible px-4\", className)} dir={dir}>\n {renderEmptyState ? (\n renderEmptyState({ composer: hideComposer ? undefined : composer, title: emptyTitle })\n ) : (\n <div className=\"a24-shell__empty relative z-10 flex h-full flex-1 flex-col justify-center p-0 pt-13\">\n <div className=\"a24-shell__empty-content flex w-full flex-col items-center pb-34 text-center animate-in fade-in slide-in-from-bottom-4 duration-500\">\n <p\n className={cn(\n \"a24-shell__empty-title pb-6 text-3xl font-semibold transition-transform duration-200\",\n emptyInputAttachmentCount > 0 && \"-translate-y-12\"\n )}\n >\n {emptyTitle}\n </p>\n {!hideComposer && composer ? (\n <div className=\"a24-shell__empty-composer mx-auto w-full max-w-3xl px-4\">{composer}</div>\n ) : null}\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={cn(\"a24-shell relative flex h-full min-h-0 w-full flex-col\", className)} dir={dir}>\n <LatestThreadScroller.Provider>\n <LatestThreadScroller.Root>\n <LatestThreadScroller.Viewport\n onScroll={handleScroll}\n onViewportChange={(node) => {\n viewportRef.current = node;\n updateScrollState();\n }}\n >\n <LatestThreadScroller.Content\n ref={contentRef}\n className={cn(\n \"a24-shell__content mx-auto flex min-h-full w-full max-w-3xl flex-col gap-8 px-4 pt-12\",\n contentClassName\n )}\n style={{ paddingBottom: bottomPadding }}\n >\n {isLoadingOlder ? renderOlderLoader?.() : null}\n {messages.map((message, index) => (\n <LatestThreadScroller.Item\n key={message.id}\n messageId={message.id}\n scrollAnchor={message.role === \"user\"}\n >\n {renderMessage(message, index)}\n </LatestThreadScroller.Item>\n ))}\n </LatestThreadScroller.Content>\n </LatestThreadScroller.Viewport>\n <LatestThreadScroller.Outline\n dir={dir}\n items={items}\n side={outlineSide}\n />\n </LatestThreadScroller.Root>\n\n {!hideComposer && composer ? (\n <div\n ref={overlayRef}\n className={cn(\n \"a24-shell__composer-overlay pointer-events-none absolute inset-x-0 bottom-0 z-20 overflow-visible px-4 pb-4 pt-10\",\n composerOverlayClassName\n )}\n style={{\n background:\n \"linear-gradient(to bottom, transparent 0%, color-mix(in oklch, var(--chat-background, var(--background)) 85%, transparent) 45%, var(--chat-background, var(--background)) 65%, var(--chat-background, var(--background)) 100%)\",\n }}\n >\n <div className=\"a24-shell__scroll-button pointer-events-auto absolute inset-x-0 top-0 flex -translate-y-full justify-center pb-3\">\n <LatestThreadScroller.Button />\n </div>\n <div className=\"a24-shell__composer-inner pointer-events-auto mx-auto w-full max-w-3xl px-4\">\n {composer}\n </div>\n </div>\n ) : null}\n </LatestThreadScroller.Provider>\n </div>\n );\n}\n","import * as React from \"react\";\nimport {\n ChevronDown,\n Menu,\n MessageSquare,\n MoreHorizontal,\n Plus,\n RefreshCw,\n Search,\n Trash2,\n Wifi,\n WifiOff,\n X,\n} from \"lucide-react\";\n\nimport type { ChatHitlPart, ChatMessage } from \"../types\";\nimport {\n AgentChatComposer,\n type AgentChatComposerSubmit,\n} from \"../ui/agent-chat-composer\";\nimport { AgentChatMessage } from \"../ui/agent-chat-message\";\nimport { cn } from \"../ui/utils\";\nimport { AgentChatShell } from \"./agent-chat-shell\";\n\nexport type AgentChatConnectionState =\n | \"connected\"\n | \"connecting\"\n | \"reconnecting\"\n | \"offline\"\n | \"expired\";\n\nexport type AgentChatViewState =\n | \"ready\"\n | \"loading\"\n | \"streaming\"\n | \"reconnecting\"\n | \"paused\"\n | \"offline\"\n | \"denied\"\n | \"quota\"\n | \"failed\"\n | \"expired\";\n\nexport type AgentChatLayoutThread = {\n id: string;\n title?: string | null;\n updatedAt?: string | null;\n status?: string | null;\n};\n\nexport type AgentChatLayoutModel = {\n id: string;\n label: string;\n};\n\nexport type AgentChatLayoutAgent = {\n name: string;\n description?: string | null;\n avatarUrl?: string | null;\n};\n\nexport type AgentChatTargetSelector = {\n helperText?: string;\n label: string;\n onApply: (value: string) => Promise<void> | void;\n placeholder?: string;\n value: string;\n};\n\nexport type AgentChatLayoutSlots = {\n assistantBody?: (input: {\n isStreaming: boolean;\n message: ChatMessage;\n }) => React.ReactNode;\n empty?: React.ReactNode;\n headerActions?: React.ReactNode;\n messageActions?: (message: ChatMessage) => React.ReactNode;\n threadActions?: (thread: AgentChatLayoutThread) => React.ReactNode;\n};\n\nexport type AgentChatLayoutProps = {\n activeThreadId?: string | null;\n agent: AgentChatLayoutAgent;\n allowAttachments?: boolean;\n className?: string;\n connectionState?: AgentChatConnectionState;\n dir?: \"ltr\" | \"rtl\";\n errorMessage?: string | null;\n hasMoreThreads?: boolean;\n isDeletingThread?: boolean;\n isLoadingOlder?: boolean;\n isLoadingThreads?: boolean;\n isRunning?: boolean;\n messages: ChatMessage[];\n modelId?: string | null;\n models?: AgentChatLayoutModel[];\n onDeleteThread?: (threadId: string) => Promise<void> | void;\n onHitlAction?: (part: ChatHitlPart, action: string, comment?: string) => Promise<void> | void;\n onLoadMoreThreads?: () => Promise<void> | void;\n onLoadOlder?: () => Promise<void> | void;\n onModelChange?: (modelId: string) => void;\n onNewThread: () => void;\n onOpenThread: (threadId: string) => Promise<void> | void;\n onRetryConnection?: () => Promise<void> | void;\n onStop?: () => void;\n onSubmit: (message: AgentChatComposerSubmit) => Promise<void> | void;\n placeholder?: string;\n slots?: AgentChatLayoutSlots;\n state?: AgentChatViewState;\n streamingMessageId?: string | null;\n targetSelector?: AgentChatTargetSelector;\n threads: AgentChatLayoutThread[];\n title?: string;\n};\n\nconst stateCopy: Record<\n Exclude<AgentChatViewState, \"ready\" | \"streaming\" | \"paused\">,\n { title: string; detail: string }\n> = {\n loading: { title: \"Loading chat\", detail: \"Your conversation is being prepared.\" },\n reconnecting: { title: \"Reconnecting\", detail: \"Messages are safe. Trying the connection again.\" },\n offline: { title: \"You’re offline\", detail: \"Reconnect to continue this conversation.\" },\n denied: { title: \"Access denied\", detail: \"This deployment does not allow this request.\" },\n quota: { title: \"Usage limit reached\", detail: \"Try again after the deployment limit resets.\" },\n failed: { title: \"Something went wrong\", detail: \"The request could not be completed safely.\" },\n expired: { title: \"Session expired\", detail: \"Reconnect to start a new secure session.\" },\n};\n\nexport function AgentChatStatePanel({\n errorMessage,\n onRetry,\n state,\n}: {\n errorMessage?: string | null;\n onRetry?: () => Promise<void> | void;\n state: Exclude<AgentChatViewState, \"ready\" | \"streaming\" | \"paused\">;\n}) {\n const copy = stateCopy[state];\n const retryable = state === \"offline\" || state === \"failed\" || state === \"expired\";\n return (\n <div className=\"a24-state\" data-state={state} role={state === \"failed\" ? \"alert\" : \"status\"}>\n <div className=\"a24-state__icon\" aria-hidden=\"true\">\n {state === \"offline\" ? <WifiOff /> : state === \"reconnecting\" ? <RefreshCw /> : <MessageSquare />}\n </div>\n <h2>{copy.title}</h2>\n <p>{errorMessage || copy.detail}</p>\n {retryable && onRetry ? (\n <button className=\"a24-button a24-button--primary\" onClick={() => void onRetry()} type=\"button\">\n Try again\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction connectionLabel(state: AgentChatConnectionState) {\n if (state === \"connected\") return \"Connected\";\n if (state === \"connecting\") return \"Connecting\";\n if (state === \"reconnecting\") return \"Reconnecting\";\n if (state === \"expired\") return \"Session expired\";\n return \"Offline\";\n}\n\nfunction AgentAvatar({ agent }: { agent: AgentChatLayoutAgent }) {\n return agent.avatarUrl ? (\n <img alt=\"\" className=\"a24-avatar\" height={36} src={agent.avatarUrl} width={36} />\n ) : (\n <span aria-hidden=\"true\" className=\"a24-avatar a24-avatar--fallback\">\n {agent.name.trim().slice(0, 1).toUpperCase() || \"A\"}\n </span>\n );\n}\n\nfunction AgentTargetSelector({ agent, selector }: { agent: AgentChatLayoutAgent; selector: AgentChatTargetSelector }) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const inputId = React.useId();\n const [draft, setDraft] = React.useState(selector.value);\n const [error, setError] = React.useState<string | null>(null);\n const [open, setOpen] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n\n React.useEffect(() => setDraft(selector.value), [selector.value]);\n React.useEffect(() => {\n if (!open) return undefined;\n const closeOnPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n const closeOnEscape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n };\n document.addEventListener(\"pointerdown\", closeOnPointerDown);\n document.addEventListener(\"keydown\", closeOnEscape);\n return () => {\n document.removeEventListener(\"pointerdown\", closeOnPointerDown);\n document.removeEventListener(\"keydown\", closeOnEscape);\n };\n }, [open]);\n\n const apply = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const value = draft.trim();\n if (!value) {\n setError(`${selector.label} is required.`);\n return;\n }\n setSubmitting(true);\n setError(null);\n try {\n await selector.onApply(value);\n setOpen(false);\n } catch (nextError) {\n setError(nextError instanceof Error ? nextError.message : \"The target could not be changed.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <div className=\"a24-target-selector\" data-open={open || undefined} ref={rootRef}>\n <button\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label={`Change ${selector.label}`}\n className=\"a24-target-selector__trigger\"\n onClick={() => setOpen((value) => !value)}\n ref={triggerRef}\n type=\"button\"\n >\n <AgentAvatar agent={agent} />\n <span className=\"a24-target-selector__copy\">\n <strong>{agent.name}</strong>\n <span>{agent.description || \"Click to change target\"}</span>\n </span>\n <ChevronDown aria-hidden=\"true\" />\n </button>\n {open ? (\n <form aria-label={`Change ${selector.label}`} className=\"a24-target-selector__panel\" onSubmit={(event) => void apply(event)}>\n <label htmlFor={inputId}>{selector.label}</label>\n <input autoComplete=\"off\" id={inputId} onChange={(event) => setDraft(event.target.value)} placeholder={selector.placeholder} spellCheck={false} value={draft} />\n {selector.helperText ? <p>{selector.helperText}</p> : null}\n {error ? <p className=\"a24-target-selector__error\" role=\"alert\">{error}</p> : null}\n <button className=\"a24-button a24-target-selector__apply\" disabled={submitting || !draft.trim()} type=\"submit\">\n {submitting ? \"Switching…\" : \"Use target\"}\n </button>\n </form>\n ) : null}\n </div>\n );\n}\n\nfunction ThreadNavigation({\n activeThreadId,\n agent,\n close,\n hasMoreThreads,\n isDeletingThread,\n isLoadingThreads,\n onDeleteThread,\n onLoadMoreThreads,\n onNewThread,\n onOpenThread,\n slots,\n targetSelector,\n threads,\n}: Pick<\n AgentChatLayoutProps,\n | \"activeThreadId\"\n | \"agent\"\n | \"hasMoreThreads\"\n | \"isDeletingThread\"\n | \"isLoadingThreads\"\n | \"onDeleteThread\"\n | \"onLoadMoreThreads\"\n | \"onNewThread\"\n | \"onOpenThread\"\n | \"slots\"\n | \"targetSelector\"\n | \"threads\"\n> & { close: () => void }) {\n const [query, setQuery] = React.useState(\"\");\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const visibleThreads = normalizedQuery\n ? threads.filter((thread) => String(thread.title || \"New chat\").toLocaleLowerCase().includes(normalizedQuery))\n : threads;\n return (\n <div className=\"a24-sidebar__inner\">\n {targetSelector ? <AgentTargetSelector agent={agent} selector={targetSelector} /> : null}\n <div className=\"a24-sidebar__top\">\n <button\n aria-label=\"New chat\"\n className=\"a24-button a24-button--primary a24-sidebar__new\"\n onClick={() => {\n onNewThread();\n close();\n }}\n type=\"button\"\n >\n <Plus aria-hidden=\"true\" />\n New chat\n </button>\n <button aria-label=\"Close conversations\" className=\"a24-icon-button a24-sidebar__mobile-close\" onClick={close} type=\"button\">\n <X aria-hidden=\"true\" />\n </button>\n </div>\n <label className=\"a24-search\">\n <Search aria-hidden=\"true\" />\n <span className=\"a24-sr-only\">Search conversations</span>\n <input\n autoComplete=\"off\"\n name=\"conversation-search\"\n onChange={(event) => setQuery(event.target.value)}\n placeholder=\"Search conversations…\"\n type=\"search\"\n value={query}\n />\n </label>\n <nav aria-label=\"Conversations\" className=\"a24-thread-list\">\n {isLoadingThreads && threads.length === 0 ? <p className=\"a24-sidebar__hint\" role=\"status\">Loading conversations…</p> : null}\n {!isLoadingThreads && visibleThreads.length === 0 ? <p className=\"a24-sidebar__hint\">No conversations yet.</p> : null}\n {visibleThreads.map((thread) => {\n const selected = thread.id === activeThreadId;\n return (\n <div className=\"a24-thread\" data-selected={selected || undefined} key={thread.id}>\n <button\n aria-current={selected ? \"page\" : undefined}\n className=\"a24-thread__open\"\n onClick={() => {\n void onOpenThread(thread.id);\n close();\n }}\n type=\"button\"\n >\n <span className=\"a24-thread__title\">{thread.title || \"New chat\"}</span>\n {thread.status ? <span className=\"a24-thread__status\">{thread.status}</span> : null}\n </button>\n {slots?.threadActions ? slots.threadActions(thread) : onDeleteThread ? (\n <button\n aria-label={`Delete ${thread.title || \"conversation\"}`}\n className=\"a24-icon-button a24-thread__delete\"\n disabled={isDeletingThread}\n onClick={() => void onDeleteThread(thread.id)}\n type=\"button\"\n >\n <Trash2 aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n );\n })}\n </nav>\n {hasMoreThreads && onLoadMoreThreads ? (\n <button className=\"a24-button a24-button--quiet a24-sidebar__more\" onClick={() => void onLoadMoreThreads()} type=\"button\">\n <MoreHorizontal aria-hidden=\"true\" />\n Load more\n </button>\n ) : null}\n </div>\n );\n}\n\nexport function AgentChatLayout({\n activeThreadId,\n agent,\n allowAttachments = true,\n className,\n connectionState = \"connected\",\n dir = \"ltr\",\n errorMessage,\n hasMoreThreads,\n isDeletingThread,\n isLoadingOlder,\n isLoadingThreads,\n isRunning = false,\n messages,\n modelId,\n models = [],\n onDeleteThread,\n onHitlAction,\n onLoadMoreThreads,\n onLoadOlder,\n onModelChange,\n onNewThread,\n onOpenThread,\n onRetryConnection,\n onStop,\n onSubmit,\n placeholder,\n slots,\n state = \"ready\",\n streamingMessageId,\n targetSelector,\n threads,\n title,\n}: AgentChatLayoutProps) {\n const [sidebarOpen, setSidebarOpen] = React.useState(false);\n const menuButtonRef = React.useRef<HTMLButtonElement>(null);\n const closeSidebar = React.useCallback(() => {\n setSidebarOpen(false);\n menuButtonRef.current?.focus();\n }, []);\n React.useEffect(() => {\n if (!sidebarOpen) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n closeSidebar();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [closeSidebar, sidebarOpen]);\n const shellState = state === \"streaming\" || state === \"paused\" ? \"ready\" : state;\n const showState = shellState !== \"ready\";\n const liveLabel = state === \"streaming\"\n ? \"Agent is responding\"\n : state === \"paused\"\n ? \"Waiting for your response\"\n : connectionLabel(connectionState);\n const composer = (\n <AgentChatComposer\n allowAttachments={allowAttachments}\n disabled={state === \"denied\" || state === \"quota\" || state === \"expired\" || state === \"offline\"}\n inputToolbarContent={models.length > 0 ? (\n <label className=\"a24-model-select\">\n <span className=\"a24-sr-only\">Model</span>\n <select aria-label=\"Model\" onChange={(event) => onModelChange?.(event.target.value)} value={modelId || models[0]?.id}>\n {models.map((model) => <option key={model.id} value={model.id}>{model.label}</option>)}\n </select>\n <ChevronDown aria-hidden=\"true\" />\n </label>\n ) : undefined}\n isRunning={isRunning}\n onStop={onStop}\n onSubmit={onSubmit}\n placeholder={placeholder}\n />\n );\n return (\n <section className={cn(\"a24-chat\", className)} data-agents24-chat-layout=\"\" dir={dir}>\n <a className=\"a24-skip-link\" href=\"#agents24-chat-main\">Skip to messages</a>\n <nav aria-label=\"Chat navigation\" className=\"a24-sidebar\" data-open={sidebarOpen || undefined}>\n <ThreadNavigation\n activeThreadId={activeThreadId}\n agent={agent}\n close={closeSidebar}\n hasMoreThreads={hasMoreThreads}\n isDeletingThread={isDeletingThread}\n isLoadingThreads={isLoadingThreads}\n onDeleteThread={onDeleteThread}\n onLoadMoreThreads={onLoadMoreThreads}\n onNewThread={onNewThread}\n onOpenThread={onOpenThread}\n slots={slots}\n targetSelector={targetSelector}\n threads={threads}\n />\n </nav>\n {sidebarOpen ? <button aria-label=\"Close conversations\" className=\"a24-sidebar-backdrop\" onClick={closeSidebar} type=\"button\" /> : null}\n <div className=\"a24-chat__body\">\n <header className=\"a24-header\" role=\"banner\">\n <button aria-label=\"Open conversations\" className=\"a24-icon-button a24-header__menu\" onClick={() => setSidebarOpen(true)} ref={menuButtonRef} type=\"button\">\n <Menu aria-hidden=\"true\" />\n </button>\n <AgentAvatar agent={agent} />\n <div className=\"a24-header__identity\">\n <h1>{title || agent.name}</h1>\n <div className=\"a24-connection\" data-state={connectionState}>\n {connectionState === \"offline\" || connectionState === \"expired\" ? <WifiOff aria-hidden=\"true\" /> : <Wifi aria-hidden=\"true\" />}\n <span>{connectionLabel(connectionState)}</span>\n </div>\n </div>\n <div className=\"a24-header__actions\">{slots?.headerActions}</div>\n </header>\n <main aria-busy={state === \"loading\" || state === \"reconnecting\"} className=\"a24-main\" id=\"agents24-chat-main\">\n {showState ? (\n <AgentChatStatePanel errorMessage={errorMessage} onRetry={onRetryConnection} state={shellState} />\n ) : (\n <AgentChatShell\n composer={composer}\n dir={dir}\n isLoadingOlder={isLoadingOlder}\n messages={messages}\n onLoadOlder={onLoadOlder}\n renderEmptyState={slots?.empty ? () => slots.empty : undefined}\n renderMessage={(message) => (\n <AgentChatMessage\n actions={slots?.messageActions?.(message)}\n message={message}\n onHitlAction={(part, action, comment) => void onHitlAction?.(part, action, comment)}\n renderAssistantContent={slots?.assistantBody}\n streamingMessageId={streamingMessageId}\n />\n )}\n />\n )}\n </main>\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"a24-sr-only\">{liveLabel}</div>\n </div>\n </section>\n );\n}\n","import type { AgentClient, Agents24ClientError, HitlAction } from \"@agents24/client\";\nimport {\n Agents24Provider,\n type Agents24ProviderProps,\n type ChatHitlPart,\n type ChatMessage,\n useAgentAttachments,\n useAgentChat,\n useAgentMcp,\n} from \"@agents24/react\";\nimport * as React from \"react\";\n\nimport { validateMcpCallbackResult, waitForMcpOauthComplete } from \"../mcp-oauth\";\nimport type { ChatMcpOauthCompletion } from \"../types\";\nimport { AgentChatDefaultActions } from \"../ui/agent-chat-actions\";\nimport type { AgentChatComposerSubmit } from \"../ui/agent-chat-composer\";\nimport {\n AgentChatLayout,\n type AgentChatConnectionState,\n type AgentChatLayoutAgent,\n type AgentChatLayoutProps,\n type AgentChatViewState,\n} from \"./agent-chat-layout\";\n\ntype CryptoLike = {\n getRandomValues<T extends Uint8Array>(array: T): T;\n randomUUID(): string;\n subtle: { digest(algorithm: string, data: Uint8Array): Promise<ArrayBuffer> };\n};\n\nfunction browserCrypto(): CryptoLike {\n const value = (globalThis as unknown as { crypto?: CryptoLike }).crypto;\n if (!value?.subtle || !value.randomUUID) throw new Error(\"Secure browser crypto is required for MCP authorization.\");\n return value;\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n bytes.forEach((byte) => { binary += String.fromCharCode(byte); });\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, \"\");\n}\n\nasync function createPkceProof(): Promise<{ challenge: string; verifier: string }> {\n const crypto = browserCrypto();\n const verifier = base64Url(crypto.getRandomValues(new Uint8Array(32)));\n const bytes = new TextEncoder().encode(verifier);\n const digest = await crypto.subtle.digest(\"SHA-256\", bytes);\n return { verifier, challenge: base64Url(new Uint8Array(digest)) };\n}\n\nfunction stateFromError(error: unknown): AgentChatViewState {\n const typed = error as Partial<Agents24ClientError> | null;\n if (typed?.kind === \"authentication\") return \"expired\";\n if (typed?.kind === \"authorization\") return \"denied\";\n if (typed?.kind === \"quota\" || typed?.kind === \"rate_limit\") return \"quota\";\n if (typed?.kind === \"network\") return \"offline\";\n return \"failed\";\n}\n\nexport type AgentChatAppProps = Omit<\n AgentChatLayoutProps,\n | \"activeThreadId\"\n | \"agent\"\n | \"connectionState\"\n | \"isLoadingOlder\"\n | \"isLoadingThreads\"\n | \"isRunning\"\n | \"messages\"\n | \"onDeleteThread\"\n | \"onHitlAction\"\n | \"onLoadOlder\"\n | \"onNewThread\"\n | \"onOpenThread\"\n | \"onRetryConnection\"\n | \"onStop\"\n | \"onSubmit\"\n | \"state\"\n | \"streamingMessageId\"\n | \"threads\"\n> & {\n agent?: AgentChatLayoutAgent;\n client: AgentClient;\n createAbortController?: Agents24ProviderProps[\"createAbortController\"];\n createId?: Agents24ProviderProps[\"createId\"];\n completeMcpAuthorization?: (input: {\n completion: ChatMcpOauthCompletion;\n codeVerifier: string;\n serverId: string;\n }) => Promise<void>;\n mcpRedirectUri?: string;\n storage?: Agents24ProviderProps[\"storage\"];\n};\n\nfunction BoundAgentChatApp({\n agent: agentOverride,\n client,\n completeMcpAuthorization,\n mcpRedirectUri,\n modelId,\n models: modelOverrides,\n onModelChange,\n slots,\n ...layoutProps\n}: Omit<AgentChatAppProps, \"createAbortController\" | \"createId\" | \"storage\">) {\n const controller = useAgentChat();\n const attachments = useAgentAttachments();\n const mcp = useAgentMcp();\n const [agent, setAgent] = React.useState<AgentChatLayoutAgent>(agentOverride || { name: \"Agent\" });\n const [capabilities, setCapabilities] = React.useState<readonly string[]>([]);\n const [bootstrapModels, setBootstrapModels] = React.useState<AgentChatLayoutProps[\"models\"]>([]);\n const [selectedModelId, setSelectedModelId] = React.useState<string | null>(modelId || null);\n const [bootstrapLoading, setBootstrapLoading] = React.useState(true);\n const [localError, setLocalError] = React.useState<unknown>(null);\n const [liked, setLiked] = React.useState<Record<string, boolean>>({});\n const [disliked, setDisliked] = React.useState<Record<string, boolean>>({});\n\n const loadBootstrap = React.useCallback(async () => {\n setBootstrapLoading(true);\n setLocalError(null);\n try {\n const bootstrap = await client.bootstrap();\n if (!agentOverride) setAgent({ name: bootstrap.deployment.name || \"Agent\" });\n setCapabilities(bootstrap.capabilities);\n const modelFeatures = bootstrap.features.models as Record<string, unknown> | undefined;\n const allowedModelIds = Array.isArray(modelFeatures?.allowed_ids)\n ? modelFeatures.allowed_ids.filter((value): value is string => typeof value === \"string\")\n : [];\n if (bootstrap.capabilities.includes(\"models.select\") && modelFeatures?.selectable) {\n setBootstrapModels(allowedModelIds.map((id) => ({ id, label: id })));\n if (!modelId) {\n const defaultId = typeof modelFeatures.default_id === \"string\" ? modelFeatures.default_id : allowedModelIds[0];\n setSelectedModelId(defaultId || null);\n }\n } else {\n setBootstrapModels([]);\n }\n await controller.refreshThreads();\n } catch (error) {\n setLocalError(error);\n } finally {\n setBootstrapLoading(false);\n }\n }, [agentOverride, client, controller.refreshThreads, modelId]);\n\n React.useEffect(() => {\n if (modelId !== undefined) setSelectedModelId(modelId);\n }, [modelId]);\n\n React.useEffect(() => { void loadBootstrap(); }, [loadBootstrap]);\n\n const submit = React.useCallback(async (message: AgentChatComposerSubmit) => {\n setLocalError(null);\n try {\n const uploaded = await Promise.all(message.files.map((file) => attachments.upload({\n data: file.source,\n name: file.filename,\n mediaType: file.mediaType,\n threadId: controller.activeThreadId || undefined,\n })));\n await controller.submit({\n text: message.text,\n attachmentIds: uploaded.flatMap((attachment) => attachment.id ? [attachment.id] : []),\n attachments: uploaded,\n requestedModelId: selectedModelId || undefined,\n });\n } catch (error) {\n setLocalError(error);\n }\n }, [attachments, controller, selectedModelId]);\n\n const deleteThread = React.useCallback(async (threadId: string) => {\n if (!window.confirm(\"Delete this conversation? This cannot be undone.\")) return;\n await controller.deleteThread(threadId);\n }, [controller.deleteThread]);\n\n const changeModel = React.useCallback((nextModelId: string) => {\n if (modelId === undefined) setSelectedModelId(nextModelId);\n onModelChange?.(nextModelId);\n }, [modelId, onModelChange]);\n\n const handleMcp = React.useCallback(async (part: ChatHitlPart) => {\n if (!mcpRedirectUri) throw new Error(\"mcpRedirectUri is required for MCP Connect.\");\n const serverId = String(part.presentation.server_id || \"\").trim();\n if (!serverId) throw new Error(\"MCP authorization is missing its server identity.\");\n const runId = controller.activeRunId || controller.messages.find((message) => message.parts.includes(part))?.runId;\n if (!runId) throw new Error(\"MCP authorization is missing its paused run.\");\n const popupNonce = browserCrypto().randomUUID();\n const proof = await createPkceProof();\n const popup = window.open(\"about:blank\", \"agents24-mcp\", \"popup,width=560,height=720\");\n try {\n const start = await mcp.startAuthorization({\n runId,\n serverId,\n interruptId: part.interruptId,\n redirectUri: mcpRedirectUri,\n popupNonce,\n codeChallenge: proof.challenge,\n });\n if (!start.callback_origin) throw new Error(\"MCP authorization did not return a callback origin.\");\n if (popup) popup.location.replace(start.authorization_url);\n const completion = await waitForMcpOauthComplete({\n popup,\n callbackOrigin: start.callback_origin,\n popupNonce,\n requireConnectionId: Boolean(completeMcpAuthorization),\n serverId,\n });\n if (completeMcpAuthorization) {\n await completeMcpAuthorization({ completion, codeVerifier: proof.verifier, serverId });\n } else {\n const redeemed = await mcp.redeemCallback({ code: completion.code, codeVerifier: proof.verifier });\n validateMcpCallbackResult(redeemed, serverId);\n }\n popup?.close();\n await controller.resumeHitl(part, \"connect\");\n } catch (error) {\n popup?.close();\n throw error;\n }\n }, [completeMcpAuthorization, controller, mcp, mcpRedirectUri]);\n\n const onHitlAction = React.useCallback(async (part: ChatHitlPart, action: string, comment?: string) => {\n setLocalError(null);\n try {\n if (part.hitlKind === \"mcp_auth\" && action === \"connect\") await handleMcp(part);\n else await controller.resumeHitl(part, action as HitlAction, comment);\n } catch (error) {\n setLocalError(error);\n }\n }, [controller, handleMcp]);\n\n const error = localError || controller.error;\n const state: AgentChatViewState = bootstrapLoading\n ? \"loading\"\n : error\n ? stateFromError(error)\n : controller.runState === \"streaming\"\n ? \"streaming\"\n : controller.runState === \"reconnecting\"\n ? \"reconnecting\"\n : controller.runState === \"paused\"\n ? \"paused\"\n : \"ready\";\n const connectionState: AgentChatConnectionState = state === \"offline\"\n ? \"offline\"\n : state === \"expired\"\n ? \"expired\"\n : state === \"reconnecting\"\n ? \"reconnecting\"\n : bootstrapLoading\n ? \"connecting\"\n : \"connected\";\n const defaultMessageActions = (message: ChatMessage) => message.role === \"assistant\" ? (\n <AgentChatDefaultActions\n handlers={{\n copied: false,\n disliked: Boolean(disliked[message.id]),\n liked: Boolean(liked[message.id]),\n onCopy: async (content) => navigator.clipboard.writeText(content),\n onDislike: () => {\n setDisliked((current) => ({ ...current, [message.id]: !current[message.id] }));\n setLiked((current) => ({ ...current, [message.id]: false }));\n },\n onLike: () => {\n setLiked((current) => ({ ...current, [message.id]: !current[message.id] }));\n setDisliked((current) => ({ ...current, [message.id]: false }));\n },\n onRetry: () => controller.regenerate(message),\n }}\n message={message}\n />\n ) : null;\n return (\n <AgentChatLayout\n {...layoutProps}\n activeThreadId={controller.activeThreadId}\n agent={agent}\n allowAttachments={layoutProps.allowAttachments ?? capabilities.includes(\"attachments.write\")}\n connectionState={connectionState}\n errorMessage={error instanceof Error ? error.message : null}\n isLoadingOlder={controller.isLoadingOlder}\n isLoadingThreads={controller.isLoadingThreads}\n isRunning={controller.runState === \"streaming\" || controller.isSubmitting}\n messages={controller.messages}\n hasMoreThreads={controller.hasMoreThreads}\n modelId={selectedModelId}\n models={modelOverrides ?? bootstrapModels}\n onDeleteThread={deleteThread}\n onHitlAction={onHitlAction}\n onLoadOlder={controller.hasOlderTurns ? controller.loadOlder : undefined}\n onLoadMoreThreads={controller.hasMoreThreads ? controller.loadMoreThreads : undefined}\n onModelChange={changeModel}\n onNewThread={controller.startNewThread}\n onOpenThread={controller.openThread}\n onRetryConnection={loadBootstrap}\n onStop={() => void controller.cancelRun()}\n onSubmit={submit}\n slots={{ ...slots, messageActions: slots?.messageActions || defaultMessageActions }}\n state={state}\n streamingMessageId={controller.streamingMessageId}\n threads={controller.threads.map((thread) => ({ id: thread.id, title: thread.title, status: thread.last_run_status || thread.status, updatedAt: thread.updated_at }))}\n />\n );\n}\n\nexport function AgentChatApp({\n client,\n createAbortController,\n createId,\n storage,\n ...props\n}: AgentChatAppProps) {\n return (\n <Agents24Provider\n client={client}\n createAbortController={createAbortController || (() => new AbortController())}\n createId={createId}\n storage={storage}\n >\n <BoundAgentChatApp client={client} {...props} />\n </Agents24Provider>\n );\n}\n","import { Monitor, Moon, Sun } from \"lucide-react\";\nimport * as React from \"react\";\n\nexport type AgentChatColorMode = \"system\" | \"light\" | \"dark\";\n\nexport type AgentChatAppearanceControlProps = {\n storageKey?: string;\n};\n\nconst MODES: readonly AgentChatColorMode[] = [\"system\", \"light\", \"dark\"];\n\nfunction storedMode(storageKey: string): AgentChatColorMode {\n if (typeof window === \"undefined\") return \"system\";\n const value = window.localStorage.getItem(storageKey);\n return value === \"light\" || value === \"dark\" ? value : \"system\";\n}\n\nfunction applyMode(mode: AgentChatColorMode): void {\n if (typeof document === \"undefined\") return;\n document.documentElement.dataset.agents24ColorMode = mode;\n}\n\nexport function AgentChatAppearanceControl({\n storageKey = \"agents24-color-mode\",\n}: AgentChatAppearanceControlProps) {\n const [mode, setMode] = React.useState<AgentChatColorMode>(() => storedMode(storageKey));\n React.useEffect(() => applyMode(mode), [mode]);\n const label = `Appearance: ${mode[0]?.toUpperCase()}${mode.slice(1)}`;\n const Icon = mode === \"light\" ? Sun : mode === \"dark\" ? Moon : Monitor;\n\n return (\n <button\n aria-label={`${label}. Activate to change.`}\n className=\"a24-icon-button a24-appearance\"\n onClick={() => {\n const next = MODES[(MODES.indexOf(mode) + 1) % MODES.length] || \"system\";\n window.localStorage.setItem(storageKey, next);\n setMode(next);\n }}\n title={label}\n type=\"button\"\n >\n <Icon aria-hidden=\"true\" />\n <span className=\"a24-sr-only\">{label}</span>\n </button>\n );\n}\n"],"mappings":"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","names":["React","jsx","jsxs","React","jsx","error","React","jsx","jsxs"]}
|
package/dist/ui/index.cjs
CHANGED
|
@@ -1065,7 +1065,7 @@ var MessageResponse = React3.memo(
|
|
|
1065
1065
|
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1066
1066
|
import_streamdown.Streamdown,
|
|
1067
1067
|
{
|
|
1068
|
-
className: cn("
|
|
1068
|
+
className: cn("a24-message-response", className),
|
|
1069
1069
|
components: streamdownComponents,
|
|
1070
1070
|
rehypePlugins: rehypePlugins || MESSAGE_RESPONSE_REHYPE_PLUGINS,
|
|
1071
1071
|
...props,
|