@sandbox-agent/react 0.4.0 → 0.5.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { RefObject, ReactNode, KeyboardEvent, Ref, TextareaHTMLAttributes, CSSProperties } from 'react';
3
- import { SandboxAgent, TerminalExitStatus, TerminalErrorStatus } from 'sandbox-agent';
3
+ import { SandboxAgent, DesktopStreamReadyStatus, DesktopStreamErrorStatus, TerminalExitStatus, TerminalErrorStatus } from 'sandbox-agent';
4
4
  import * as _tanstack_react_virtual from '@tanstack/react-virtual';
5
5
 
6
6
  type PermissionReply = "once" | "always" | "reject";
@@ -175,6 +175,20 @@ interface AgentConversationProps {
175
175
  }
176
176
  declare const AgentConversation: ({ entries, className, classNames: classNameOverrides, emptyState, transcriptClassName, transcriptClassNames, scrollRef, composerClassName, composerClassNames, transcriptProps, composerProps, }: AgentConversationProps) => react_jsx_runtime.JSX.Element;
177
177
 
178
+ type DesktopViewerClient = Pick<SandboxAgent, "connectDesktopStream">;
179
+ interface DesktopViewerProps {
180
+ client: DesktopViewerClient;
181
+ className?: string;
182
+ style?: CSSProperties;
183
+ imageStyle?: CSSProperties;
184
+ height?: number | string;
185
+ showStatusBar?: boolean;
186
+ onConnect?: (status: DesktopStreamReadyStatus) => void;
187
+ onDisconnect?: () => void;
188
+ onError?: (error: DesktopStreamErrorStatus | Error) => void;
189
+ }
190
+ declare const DesktopViewer: ({ client, className, style, imageStyle, height, showStatusBar, onConnect, onDisconnect, onError, }: DesktopViewerProps) => react_jsx_runtime.JSX.Element;
191
+
178
192
  type ProcessTerminalClient = Pick<SandboxAgent, "connectProcessTerminal">;
179
193
  interface ProcessTerminalProps {
180
194
  client: ProcessTerminalClient;
@@ -195,4 +209,4 @@ declare function useTranscriptVirtualizer<T>(items: T[], scrollElementRef?: RefO
195
209
  isFollowingRef: RefObject<boolean>;
196
210
  };
197
211
 
198
- export { AgentConversation, type AgentConversationClassNames, type AgentConversationProps, AgentTranscript, type AgentTranscriptClassNames, type AgentTranscriptProps, ChatComposer, type ChatComposerClassNames, type ChatComposerProps, type PermissionOption, type PermissionOptionRenderContext, type PermissionReply, ProcessTerminal, type ProcessTerminalClient, type ProcessTerminalProps, type TranscriptEntry, useTranscriptVirtualizer };
212
+ export { AgentConversation, type AgentConversationClassNames, type AgentConversationProps, AgentTranscript, type AgentTranscriptClassNames, type AgentTranscriptProps, ChatComposer, type ChatComposerClassNames, type ChatComposerProps, DesktopViewer, type DesktopViewerClient, type DesktopViewerProps, type PermissionOption, type PermissionOptionRenderContext, type PermissionReply, ProcessTerminal, type ProcessTerminalClient, type ProcessTerminalProps, type TranscriptEntry, useTranscriptVirtualizer };
package/dist/index.js CHANGED
@@ -779,9 +779,242 @@ var AgentConversation = ({
779
779
  ] });
780
780
  };
781
781
 
782
- // src/ProcessTerminal.tsx
782
+ // src/DesktopViewer.tsx
783
783
  import { useEffect as useEffect3, useRef as useRef3, useState as useState2 } from "react";
784
784
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
785
+ var shellStyle = {
786
+ display: "flex",
787
+ flexDirection: "column",
788
+ overflow: "hidden",
789
+ border: "1px solid rgba(15, 23, 42, 0.14)",
790
+ borderRadius: 14,
791
+ background: "linear-gradient(180deg, rgba(248, 250, 252, 0.96) 0%, rgba(226, 232, 240, 0.92) 100%)",
792
+ boxShadow: "0 20px 40px rgba(15, 23, 42, 0.08)"
793
+ };
794
+ var statusBarStyle = {
795
+ display: "flex",
796
+ alignItems: "center",
797
+ justifyContent: "space-between",
798
+ gap: 12,
799
+ padding: "10px 14px",
800
+ borderBottom: "1px solid rgba(15, 23, 42, 0.08)",
801
+ background: "rgba(255, 255, 255, 0.78)",
802
+ color: "#0f172a",
803
+ fontSize: 12,
804
+ lineHeight: 1.4
805
+ };
806
+ var viewportStyle = {
807
+ position: "relative",
808
+ display: "flex",
809
+ alignItems: "center",
810
+ justifyContent: "center",
811
+ overflow: "hidden",
812
+ background: "radial-gradient(circle at top, rgba(14, 165, 233, 0.18), transparent 45%), linear-gradient(180deg, #0f172a 0%, #111827 100%)"
813
+ };
814
+ var videoBaseStyle = {
815
+ display: "block",
816
+ width: "100%",
817
+ height: "100%",
818
+ objectFit: "contain",
819
+ userSelect: "none"
820
+ };
821
+ var hintStyle = {
822
+ opacity: 0.66
823
+ };
824
+ var getStatusColor = (state) => {
825
+ switch (state) {
826
+ case "ready":
827
+ return "#15803d";
828
+ case "error":
829
+ return "#b91c1c";
830
+ case "closed":
831
+ return "#b45309";
832
+ default:
833
+ return "#475569";
834
+ }
835
+ };
836
+ var DesktopViewer = ({
837
+ client,
838
+ className,
839
+ style,
840
+ imageStyle,
841
+ height = 480,
842
+ showStatusBar = true,
843
+ onConnect,
844
+ onDisconnect,
845
+ onError
846
+ }) => {
847
+ const wrapperRef = useRef3(null);
848
+ const videoRef = useRef3(null);
849
+ const sessionRef = useRef3(null);
850
+ const [connectionState, setConnectionState] = useState2("connecting");
851
+ const [statusMessage, setStatusMessage] = useState2("Starting desktop stream...");
852
+ const [hasVideo, setHasVideo] = useState2(false);
853
+ const [resolution, setResolution] = useState2(null);
854
+ useEffect3(() => {
855
+ let cancelled = false;
856
+ setConnectionState("connecting");
857
+ setStatusMessage("Connecting to desktop stream...");
858
+ setResolution(null);
859
+ setHasVideo(false);
860
+ const session = client.connectDesktopStream();
861
+ sessionRef.current = session;
862
+ session.onReady((status) => {
863
+ if (cancelled) return;
864
+ setConnectionState("ready");
865
+ setStatusMessage("Desktop stream connected.");
866
+ setResolution({ width: status.width, height: status.height });
867
+ onConnect?.(status);
868
+ });
869
+ session.onTrack((stream) => {
870
+ if (cancelled) return;
871
+ const video = videoRef.current;
872
+ if (video) {
873
+ video.srcObject = stream;
874
+ void video.play().catch(() => void 0);
875
+ setHasVideo(true);
876
+ }
877
+ });
878
+ session.onError((error) => {
879
+ if (cancelled) return;
880
+ setConnectionState("error");
881
+ setStatusMessage(error instanceof Error ? error.message : error.message);
882
+ onError?.(error);
883
+ });
884
+ session.onDisconnect(() => {
885
+ if (cancelled) return;
886
+ setConnectionState((current) => current === "error" ? current : "closed");
887
+ setStatusMessage((current) => current === "Desktop stream connected." ? "Desktop stream disconnected." : current);
888
+ onDisconnect?.();
889
+ });
890
+ return () => {
891
+ cancelled = true;
892
+ session.close();
893
+ sessionRef.current = null;
894
+ const video = videoRef.current;
895
+ if (video) {
896
+ video.srcObject = null;
897
+ }
898
+ setHasVideo(false);
899
+ };
900
+ }, [client, onConnect, onDisconnect, onError]);
901
+ const scalePoint = (clientX, clientY) => {
902
+ const video = videoRef.current;
903
+ if (!video || !resolution) {
904
+ return null;
905
+ }
906
+ const rect = video.getBoundingClientRect();
907
+ if (rect.width === 0 || rect.height === 0) {
908
+ return null;
909
+ }
910
+ const videoAspect = resolution.width / resolution.height;
911
+ const elemAspect = rect.width / rect.height;
912
+ let renderW;
913
+ let renderH;
914
+ if (elemAspect > videoAspect) {
915
+ renderH = rect.height;
916
+ renderW = rect.height * videoAspect;
917
+ } else {
918
+ renderW = rect.width;
919
+ renderH = rect.width / videoAspect;
920
+ }
921
+ const offsetX = (rect.width - renderW) / 2;
922
+ const offsetY = (rect.height - renderH) / 2;
923
+ const relX = clientX - rect.left - offsetX;
924
+ const relY = clientY - rect.top - offsetY;
925
+ const x = Math.max(0, Math.min(resolution.width, relX / renderW * resolution.width));
926
+ const y = Math.max(0, Math.min(resolution.height, relY / renderH * resolution.height));
927
+ return {
928
+ x: Math.round(x),
929
+ y: Math.round(y)
930
+ };
931
+ };
932
+ const buttonFromMouseEvent = (event) => {
933
+ switch (event.button) {
934
+ case 1:
935
+ return "middle";
936
+ case 2:
937
+ return "right";
938
+ default:
939
+ return "left";
940
+ }
941
+ };
942
+ const withSession = (callback) => {
943
+ const session = sessionRef.current;
944
+ if (session) {
945
+ callback(session);
946
+ }
947
+ };
948
+ return /* @__PURE__ */ jsxs4("div", { className, style: { ...shellStyle, ...style }, children: [
949
+ showStatusBar ? /* @__PURE__ */ jsxs4("div", { style: statusBarStyle, children: [
950
+ /* @__PURE__ */ jsx4("span", { style: { color: getStatusColor(connectionState) }, children: statusMessage }),
951
+ /* @__PURE__ */ jsx4("span", { style: hintStyle, children: resolution ? `${resolution.width}\xD7${resolution.height}` : "Awaiting stream" })
952
+ ] }) : null,
953
+ /* @__PURE__ */ jsx4(
954
+ "div",
955
+ {
956
+ ref: wrapperRef,
957
+ role: "button",
958
+ tabIndex: 0,
959
+ style: { ...viewportStyle, height },
960
+ onMouseMove: (event) => {
961
+ const point = scalePoint(event.clientX, event.clientY);
962
+ if (!point) {
963
+ return;
964
+ }
965
+ withSession((session) => session.moveMouse(point.x, point.y));
966
+ },
967
+ onContextMenu: (event) => {
968
+ event.preventDefault();
969
+ },
970
+ onMouseDown: (event) => {
971
+ event.preventDefault();
972
+ wrapperRef.current?.focus();
973
+ const point = scalePoint(event.clientX, event.clientY);
974
+ withSession((session) => session.mouseDown(buttonFromMouseEvent(event), point?.x, point?.y));
975
+ },
976
+ onMouseUp: (event) => {
977
+ const point = scalePoint(event.clientX, event.clientY);
978
+ withSession((session) => session.mouseUp(buttonFromMouseEvent(event), point?.x, point?.y));
979
+ },
980
+ onWheel: (event) => {
981
+ event.preventDefault();
982
+ const point = scalePoint(event.clientX, event.clientY);
983
+ if (!point) {
984
+ return;
985
+ }
986
+ withSession((session) => session.scroll(point.x, point.y, Math.round(event.deltaX), Math.round(event.deltaY)));
987
+ },
988
+ onKeyDown: (event) => {
989
+ event.preventDefault();
990
+ event.stopPropagation();
991
+ withSession((session) => session.keyDown(event.key));
992
+ },
993
+ onKeyUp: (event) => {
994
+ event.preventDefault();
995
+ event.stopPropagation();
996
+ withSession((session) => session.keyUp(event.key));
997
+ },
998
+ children: /* @__PURE__ */ jsx4(
999
+ "video",
1000
+ {
1001
+ ref: videoRef,
1002
+ autoPlay: true,
1003
+ playsInline: true,
1004
+ muted: true,
1005
+ tabIndex: -1,
1006
+ draggable: false,
1007
+ style: { ...videoBaseStyle, ...imageStyle, display: hasVideo ? "block" : "none", pointerEvents: "none" }
1008
+ }
1009
+ )
1010
+ }
1011
+ )
1012
+ ] });
1013
+ };
1014
+
1015
+ // src/ProcessTerminal.tsx
1016
+ import { useEffect as useEffect4, useRef as useRef4, useState as useState3 } from "react";
1017
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
785
1018
  var terminalTheme = {
786
1019
  background: "#09090b",
787
1020
  foreground: "#f4f4f5",
@@ -805,7 +1038,7 @@ var terminalTheme = {
805
1038
  brightCyan: "#67e8f9",
806
1039
  brightWhite: "#fafafa"
807
1040
  };
808
- var shellStyle = {
1041
+ var shellStyle2 = {
809
1042
  display: "flex",
810
1043
  flexDirection: "column",
811
1044
  overflow: "hidden",
@@ -813,7 +1046,7 @@ var shellStyle = {
813
1046
  borderRadius: 10,
814
1047
  background: "rgba(0, 0, 0, 0.3)"
815
1048
  };
816
- var statusBarStyle = {
1049
+ var statusBarStyle2 = {
817
1050
  display: "flex",
818
1051
  alignItems: "center",
819
1052
  justifyContent: "space-between",
@@ -834,7 +1067,7 @@ var exitCodeStyle = {
834
1067
  fontFamily: "ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace",
835
1068
  opacity: 0.72
836
1069
  };
837
- var getStatusColor = (state) => {
1070
+ var getStatusColor2 = (state) => {
838
1071
  switch (state) {
839
1072
  case "ready":
840
1073
  return "#4ade80";
@@ -858,11 +1091,11 @@ var ProcessTerminal = ({
858
1091
  onExit,
859
1092
  onError
860
1093
  }) => {
861
- const hostRef = useRef3(null);
862
- const [connectionState, setConnectionState] = useState2("connecting");
863
- const [statusMessage, setStatusMessage] = useState2("Connecting to PTY...");
864
- const [exitCode, setExitCode] = useState2(null);
865
- useEffect3(() => {
1094
+ const hostRef = useRef4(null);
1095
+ const [connectionState, setConnectionState] = useState3("connecting");
1096
+ const [statusMessage, setStatusMessage] = useState3("Connecting to PTY...");
1097
+ const [exitCode, setExitCode] = useState3(null);
1098
+ useEffect4(() => {
866
1099
  let cancelled = false;
867
1100
  let terminal = null;
868
1101
  let fitAddon = null;
@@ -980,15 +1213,15 @@ var ProcessTerminal = ({
980
1213
  terminal?.dispose();
981
1214
  };
982
1215
  }, [client, onError, onExit, processId]);
983
- return /* @__PURE__ */ jsxs4("div", { className, style: { ...shellStyle, ...style }, children: [
984
- showStatusBar ? /* @__PURE__ */ jsxs4("div", { style: { ...statusBarStyle, ...statusBarStyleOverride }, children: [
985
- /* @__PURE__ */ jsx4("span", { style: { color: getStatusColor(connectionState) }, children: statusMessage }),
986
- exitCode != null ? /* @__PURE__ */ jsxs4("span", { style: exitCodeStyle, children: [
1216
+ return /* @__PURE__ */ jsxs5("div", { className, style: { ...shellStyle2, ...style }, children: [
1217
+ showStatusBar ? /* @__PURE__ */ jsxs5("div", { style: { ...statusBarStyle2, ...statusBarStyleOverride }, children: [
1218
+ /* @__PURE__ */ jsx5("span", { style: { color: getStatusColor2(connectionState) }, children: statusMessage }),
1219
+ exitCode != null ? /* @__PURE__ */ jsxs5("span", { style: exitCodeStyle, children: [
987
1220
  "exit=",
988
1221
  exitCode
989
1222
  ] }) : null
990
1223
  ] }) : null,
991
- /* @__PURE__ */ jsx4(
1224
+ /* @__PURE__ */ jsx5(
992
1225
  "div",
993
1226
  {
994
1227
  ref: hostRef,
@@ -1009,6 +1242,7 @@ export {
1009
1242
  AgentConversation,
1010
1243
  AgentTranscript,
1011
1244
  ChatComposer,
1245
+ DesktopViewer,
1012
1246
  ProcessTerminal,
1013
1247
  useTranscriptVirtualizer
1014
1248
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AgentTranscript.tsx","../src/useTranscriptVirtualizer.ts","../src/ChatComposer.tsx","../src/AgentConversation.tsx","../src/ProcessTerminal.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode, RefObject } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranscriptVirtualizer } from \"./useTranscriptVirtualizer.ts\";\n\nexport type PermissionReply = \"once\" | \"always\" | \"reject\";\n\nexport type PermissionOption = {\n optionId: string;\n name: string;\n kind: string;\n};\n\nexport type TranscriptEntry = {\n id: string;\n eventId?: string;\n kind: \"message\" | \"tool\" | \"meta\" | \"reasoning\" | \"permission\";\n time: string;\n role?: \"user\" | \"assistant\";\n text?: string;\n toolName?: string;\n toolInput?: string;\n toolOutput?: string;\n toolStatus?: string;\n reasoning?: { text: string; visibility?: string };\n meta?: { title: string; detail?: string; severity?: \"info\" | \"error\" };\n permission?: {\n permissionId: string;\n title: string;\n description?: string;\n options: PermissionOption[];\n resolved?: boolean;\n selectedOptionId?: string;\n };\n};\n\nexport interface AgentTranscriptClassNames {\n root: string;\n divider: string;\n dividerLine: string;\n dividerText: string;\n message: string;\n messageContent: string;\n messageText: string;\n error: string;\n toolGroupSingle: string;\n toolGroupContainer: string;\n toolGroupHeader: string;\n toolGroupIcon: string;\n toolGroupLabel: string;\n toolGroupChevron: string;\n toolGroupBody: string;\n toolItem: string;\n toolItemConnector: string;\n toolItemDot: string;\n toolItemLine: string;\n toolItemContent: string;\n toolItemHeader: string;\n toolItemIcon: string;\n toolItemLabel: string;\n toolItemSpinner: string;\n toolItemLink: string;\n toolItemChevron: string;\n toolItemBody: string;\n toolSection: string;\n toolSectionTitle: string;\n toolCode: string;\n toolCodeMuted: string;\n permissionPrompt: string;\n permissionHeader: string;\n permissionIcon: string;\n permissionTitle: string;\n permissionDescription: string;\n permissionActions: string;\n permissionButton: string;\n permissionAutoResolved: string;\n thinkingRow: string;\n thinkingAvatar: string;\n thinkingAvatarImage: string;\n thinkingAvatarLabel: string;\n thinkingIndicator: string;\n thinkingDot: string;\n endAnchor: string;\n}\n\nexport interface PermissionOptionRenderContext {\n entry: TranscriptEntry;\n option: PermissionOption;\n label: string;\n reply: PermissionReply;\n selected: boolean;\n dimmed: boolean;\n resolved: boolean;\n}\n\nexport interface AgentTranscriptProps {\n entries: TranscriptEntry[];\n className?: string;\n classNames?: Partial<AgentTranscriptClassNames>;\n endRef?: RefObject<HTMLDivElement | null>;\n scrollRef?: RefObject<HTMLDivElement | null>;\n scrollToEntryId?: string | null;\n sessionError?: string | null;\n eventError?: string | null;\n isThinking?: boolean;\n agentId?: string;\n virtualize?: boolean;\n onAtBottomChange?: (atBottom: boolean) => void;\n onEventClick?: (eventId: string) => void;\n onPermissionReply?: (permissionId: string, reply: PermissionReply) => void;\n isDividerEntry?: (entry: TranscriptEntry) => boolean;\n canOpenEvent?: (entry: TranscriptEntry) => boolean;\n getToolGroupSummary?: (entries: TranscriptEntry[]) => string;\n renderMessageText?: (entry: TranscriptEntry) => ReactNode;\n renderInlinePendingIndicator?: () => ReactNode;\n renderThinkingState?: (context: { agentId?: string }) => ReactNode;\n renderToolItemIcon?: (entry: TranscriptEntry) => ReactNode;\n renderToolGroupIcon?: (entries: TranscriptEntry[], expanded: boolean) => ReactNode;\n renderChevron?: (expanded: boolean) => ReactNode;\n renderEventLinkContent?: (entry: TranscriptEntry) => ReactNode;\n renderPermissionIcon?: (entry: TranscriptEntry) => ReactNode;\n renderPermissionOptionContent?: (context: PermissionOptionRenderContext) => ReactNode;\n}\n\ntype GroupedEntries =\n | { type: \"message\"; entries: TranscriptEntry[] }\n | { type: \"tool-group\"; entries: TranscriptEntry[] }\n | { type: \"divider\"; entries: TranscriptEntry[] }\n | { type: \"permission\"; entries: TranscriptEntry[] };\n\nconst VIRTUAL_GROUP_GAP_PX = 12;\n\nconst DEFAULT_CLASS_NAMES: AgentTranscriptClassNames = {\n root: \"sa-agent-transcript\",\n divider: \"sa-agent-transcript-divider\",\n dividerLine: \"sa-agent-transcript-divider-line\",\n dividerText: \"sa-agent-transcript-divider-text\",\n message: \"sa-agent-transcript-message\",\n messageContent: \"sa-agent-transcript-message-content\",\n messageText: \"sa-agent-transcript-message-text\",\n error: \"sa-agent-transcript-error\",\n toolGroupSingle: \"sa-agent-transcript-tool-group-single\",\n toolGroupContainer: \"sa-agent-transcript-tool-group\",\n toolGroupHeader: \"sa-agent-transcript-tool-group-header\",\n toolGroupIcon: \"sa-agent-transcript-tool-group-icon\",\n toolGroupLabel: \"sa-agent-transcript-tool-group-label\",\n toolGroupChevron: \"sa-agent-transcript-tool-group-chevron\",\n toolGroupBody: \"sa-agent-transcript-tool-group-body\",\n toolItem: \"sa-agent-transcript-tool-item\",\n toolItemConnector: \"sa-agent-transcript-tool-item-connector\",\n toolItemDot: \"sa-agent-transcript-tool-item-dot\",\n toolItemLine: \"sa-agent-transcript-tool-item-line\",\n toolItemContent: \"sa-agent-transcript-tool-item-content\",\n toolItemHeader: \"sa-agent-transcript-tool-item-header\",\n toolItemIcon: \"sa-agent-transcript-tool-item-icon\",\n toolItemLabel: \"sa-agent-transcript-tool-item-label\",\n toolItemSpinner: \"sa-agent-transcript-tool-item-spinner\",\n toolItemLink: \"sa-agent-transcript-tool-item-link\",\n toolItemChevron: \"sa-agent-transcript-tool-item-chevron\",\n toolItemBody: \"sa-agent-transcript-tool-item-body\",\n toolSection: \"sa-agent-transcript-tool-section\",\n toolSectionTitle: \"sa-agent-transcript-tool-section-title\",\n toolCode: \"sa-agent-transcript-tool-code\",\n toolCodeMuted: \"sa-agent-transcript-tool-code-muted\",\n permissionPrompt: \"sa-agent-transcript-permission-prompt\",\n permissionHeader: \"sa-agent-transcript-permission-header\",\n permissionIcon: \"sa-agent-transcript-permission-icon\",\n permissionTitle: \"sa-agent-transcript-permission-title\",\n permissionDescription: \"sa-agent-transcript-permission-description\",\n permissionActions: \"sa-agent-transcript-permission-actions\",\n permissionButton: \"sa-agent-transcript-permission-button\",\n permissionAutoResolved: \"sa-agent-transcript-permission-auto-resolved\",\n thinkingRow: \"sa-agent-transcript-thinking-row\",\n thinkingAvatar: \"sa-agent-transcript-thinking-avatar\",\n thinkingAvatarImage: \"sa-agent-transcript-thinking-avatar-image\",\n thinkingAvatarLabel: \"sa-agent-transcript-thinking-avatar-label\",\n thinkingIndicator: \"sa-agent-transcript-thinking-indicator\",\n thinkingDot: \"sa-agent-transcript-thinking-dot\",\n endAnchor: \"sa-agent-transcript-end\",\n};\n\nconst DEFAULT_DIVIDER_TITLES = new Set([\"Session Started\", \"Turn Started\", \"Turn Ended\"]);\n\nconst cx = (...values: Array<string | false | null | undefined>) => values.filter(Boolean).join(\" \");\n\nconst mergeClassNames = (defaults: AgentTranscriptClassNames, overrides?: Partial<AgentTranscriptClassNames>): AgentTranscriptClassNames => ({\n root: cx(defaults.root, overrides?.root),\n divider: cx(defaults.divider, overrides?.divider),\n dividerLine: cx(defaults.dividerLine, overrides?.dividerLine),\n dividerText: cx(defaults.dividerText, overrides?.dividerText),\n message: cx(defaults.message, overrides?.message),\n messageContent: cx(defaults.messageContent, overrides?.messageContent),\n messageText: cx(defaults.messageText, overrides?.messageText),\n error: cx(defaults.error, overrides?.error),\n toolGroupSingle: cx(defaults.toolGroupSingle, overrides?.toolGroupSingle),\n toolGroupContainer: cx(defaults.toolGroupContainer, overrides?.toolGroupContainer),\n toolGroupHeader: cx(defaults.toolGroupHeader, overrides?.toolGroupHeader),\n toolGroupIcon: cx(defaults.toolGroupIcon, overrides?.toolGroupIcon),\n toolGroupLabel: cx(defaults.toolGroupLabel, overrides?.toolGroupLabel),\n toolGroupChevron: cx(defaults.toolGroupChevron, overrides?.toolGroupChevron),\n toolGroupBody: cx(defaults.toolGroupBody, overrides?.toolGroupBody),\n toolItem: cx(defaults.toolItem, overrides?.toolItem),\n toolItemConnector: cx(defaults.toolItemConnector, overrides?.toolItemConnector),\n toolItemDot: cx(defaults.toolItemDot, overrides?.toolItemDot),\n toolItemLine: cx(defaults.toolItemLine, overrides?.toolItemLine),\n toolItemContent: cx(defaults.toolItemContent, overrides?.toolItemContent),\n toolItemHeader: cx(defaults.toolItemHeader, overrides?.toolItemHeader),\n toolItemIcon: cx(defaults.toolItemIcon, overrides?.toolItemIcon),\n toolItemLabel: cx(defaults.toolItemLabel, overrides?.toolItemLabel),\n toolItemSpinner: cx(defaults.toolItemSpinner, overrides?.toolItemSpinner),\n toolItemLink: cx(defaults.toolItemLink, overrides?.toolItemLink),\n toolItemChevron: cx(defaults.toolItemChevron, overrides?.toolItemChevron),\n toolItemBody: cx(defaults.toolItemBody, overrides?.toolItemBody),\n toolSection: cx(defaults.toolSection, overrides?.toolSection),\n toolSectionTitle: cx(defaults.toolSectionTitle, overrides?.toolSectionTitle),\n toolCode: cx(defaults.toolCode, overrides?.toolCode),\n toolCodeMuted: cx(defaults.toolCodeMuted, overrides?.toolCodeMuted),\n permissionPrompt: cx(defaults.permissionPrompt, overrides?.permissionPrompt),\n permissionHeader: cx(defaults.permissionHeader, overrides?.permissionHeader),\n permissionIcon: cx(defaults.permissionIcon, overrides?.permissionIcon),\n permissionTitle: cx(defaults.permissionTitle, overrides?.permissionTitle),\n permissionDescription: cx(defaults.permissionDescription, overrides?.permissionDescription),\n permissionActions: cx(defaults.permissionActions, overrides?.permissionActions),\n permissionButton: cx(defaults.permissionButton, overrides?.permissionButton),\n permissionAutoResolved: cx(defaults.permissionAutoResolved, overrides?.permissionAutoResolved),\n thinkingRow: cx(defaults.thinkingRow, overrides?.thinkingRow),\n thinkingAvatar: cx(defaults.thinkingAvatar, overrides?.thinkingAvatar),\n thinkingAvatarImage: cx(defaults.thinkingAvatarImage, overrides?.thinkingAvatarImage),\n thinkingAvatarLabel: cx(defaults.thinkingAvatarLabel, overrides?.thinkingAvatarLabel),\n thinkingIndicator: cx(defaults.thinkingIndicator, overrides?.thinkingIndicator),\n thinkingDot: cx(defaults.thinkingDot, overrides?.thinkingDot),\n endAnchor: cx(defaults.endAnchor, overrides?.endAnchor),\n});\n\nconst getMessageVariant = (entry: TranscriptEntry) => {\n if (entry.kind === \"tool\") return \"tool\";\n if (entry.kind === \"meta\") return entry.meta?.severity === \"error\" ? \"error\" : \"system\";\n if (entry.kind === \"reasoning\") return \"assistant\";\n if (entry.kind === \"permission\") return \"system\";\n if (entry.role === \"user\") return \"user\";\n return \"assistant\";\n};\n\nconst getToolItemLabel = (entry: TranscriptEntry) => {\n if (entry.kind === \"tool\") {\n const statusLabel = entry.toolStatus && entry.toolStatus !== \"completed\" ? ` (${entry.toolStatus.replaceAll(\"_\", \" \")})` : \"\";\n return `${entry.toolName ?? \"tool\"}${statusLabel}`;\n }\n\n if (entry.kind === \"reasoning\") {\n return `Reasoning${entry.reasoning?.visibility ? ` (${entry.reasoning.visibility})` : \"\"}`;\n }\n\n return entry.meta?.title ?? \"Status\";\n};\n\nconst getDefaultToolItemIcon = (entry: TranscriptEntry) => {\n if (entry.kind === \"tool\") return \"Tool\";\n if (entry.kind === \"reasoning\") return \"Thought\";\n return entry.meta?.severity === \"error\" ? \"Error\" : \"Info\";\n};\n\nconst getDefaultToolGroupSummary = (entries: TranscriptEntry[]) => {\n const count = entries.length;\n return `${count} Event${count === 1 ? \"\" : \"s\"}`;\n};\n\nconst getPermissionReplyForOption = (kind: string): PermissionReply => {\n if (kind === \"allow_once\") return \"once\";\n if (kind === \"allow_always\") return \"always\";\n return \"reject\";\n};\n\nconst getPermissionOptionLabel = (option: PermissionOption) => {\n if (option.name) return option.name;\n if (option.kind === \"allow_once\") return \"Allow Once\";\n if (option.kind === \"allow_always\") return \"Always Allow\";\n if (option.kind === \"reject_once\") return \"Reject\";\n if (option.kind === \"reject_always\") return \"Reject Always\";\n return option.kind;\n};\n\nconst getPermissionOptionTone = (kind: string) => (kind.startsWith(\"allow\") ? \"allow\" : \"reject\");\n\nconst defaultRenderMessageText = (entry: TranscriptEntry) => entry.text;\nconst defaultRenderPendingIndicator = () => \"...\";\nconst defaultRenderChevron = (expanded: boolean) => (expanded ? \"▾\" : \"▸\");\nconst defaultRenderEventLinkContent = () => \"Open\";\nconst defaultRenderPermissionIcon = () => \"Permission\";\nconst defaultRenderPermissionOptionContent = ({ label }: PermissionOptionRenderContext) => label;\nconst defaultIsDividerEntry = (entry: TranscriptEntry) => entry.kind === \"meta\" && DEFAULT_DIVIDER_TITLES.has(entry.meta?.title ?? \"\");\n\nconst defaultCanOpenEvent = (entry: TranscriptEntry) => Boolean(entry.eventId);\n\nconst buildGroupedEntries = (entries: TranscriptEntry[], isDividerEntry: (entry: TranscriptEntry) => boolean): GroupedEntries[] => {\n const groupedEntries: GroupedEntries[] = [];\n let currentToolGroup: TranscriptEntry[] = [];\n\n const flushToolGroup = () => {\n if (currentToolGroup.length === 0) {\n return;\n }\n groupedEntries.push({ type: \"tool-group\", entries: currentToolGroup });\n currentToolGroup = [];\n };\n\n for (const entry of entries) {\n if (isDividerEntry(entry)) {\n flushToolGroup();\n groupedEntries.push({ type: \"divider\", entries: [entry] });\n continue;\n }\n\n if (entry.kind === \"permission\") {\n flushToolGroup();\n groupedEntries.push({ type: \"permission\", entries: [entry] });\n continue;\n }\n\n if (entry.kind === \"tool\" || entry.kind === \"reasoning\" || entry.kind === \"meta\") {\n currentToolGroup.push(entry);\n continue;\n }\n\n flushToolGroup();\n groupedEntries.push({ type: \"message\", entries: [entry] });\n }\n\n flushToolGroup();\n return groupedEntries;\n};\n\nconst getGroupedEntryKey = (group: GroupedEntries, index: number): string => {\n const firstEntry = group.entries[0];\n\n if (group.type === \"tool-group\") {\n return `tool-group:${firstEntry?.id ?? index}`;\n }\n\n return firstEntry?.id ?? `${group.type}:${index}`;\n};\n\nconst ToolItem = ({\n entry,\n isLast,\n expanded,\n onExpandedChange,\n classNames,\n onEventClick,\n canOpenEvent,\n renderInlinePendingIndicator,\n renderToolItemIcon,\n renderChevron,\n renderEventLinkContent,\n}: {\n entry: TranscriptEntry;\n isLast: boolean;\n expanded: boolean;\n onExpandedChange: (expanded: boolean) => void;\n classNames: AgentTranscriptClassNames;\n onEventClick?: (eventId: string) => void;\n canOpenEvent: (entry: TranscriptEntry) => boolean;\n renderInlinePendingIndicator: () => ReactNode;\n renderToolItemIcon: (entry: TranscriptEntry) => ReactNode;\n renderChevron: (expanded: boolean) => ReactNode;\n renderEventLinkContent: (entry: TranscriptEntry) => ReactNode;\n}) => {\n const isTool = entry.kind === \"tool\";\n const isReasoning = entry.kind === \"reasoning\";\n const isMeta = entry.kind === \"meta\";\n const isComplete = isTool && (entry.toolStatus === \"completed\" || entry.toolStatus === \"failed\");\n const isFailed = isTool && entry.toolStatus === \"failed\";\n const isInProgress = isTool && entry.toolStatus === \"in_progress\";\n const hasContent = isTool\n ? Boolean(entry.toolInput || entry.toolOutput)\n : isReasoning\n ? Boolean(entry.reasoning?.text?.trim())\n : Boolean(entry.meta?.detail?.trim());\n const showEventLink = Boolean(entry.eventId && onEventClick && canOpenEvent(entry));\n\n return (\n <div\n className={cx(classNames.toolItem, isLast && \"last\", isFailed && \"failed\")}\n data-slot=\"tool-item\"\n data-kind={entry.kind}\n data-state={entry.toolStatus}\n data-last={isLast ? \"true\" : undefined}\n data-failed={isFailed ? \"true\" : undefined}\n >\n <div className={classNames.toolItemConnector} data-slot=\"tool-item-connector\">\n <div className={classNames.toolItemDot} data-slot=\"tool-item-dot\" />\n {!isLast ? <div className={classNames.toolItemLine} data-slot=\"tool-item-line\" /> : null}\n </div>\n <div className={classNames.toolItemContent} data-slot=\"tool-item-content\">\n <button\n type=\"button\"\n className={cx(classNames.toolItemHeader, expanded && \"expanded\")}\n data-slot=\"tool-item-header\"\n data-expanded={expanded ? \"true\" : undefined}\n data-has-content={hasContent ? \"true\" : undefined}\n disabled={!hasContent}\n onClick={() => {\n if (hasContent) {\n onExpandedChange(!expanded);\n }\n }}\n >\n <span className={classNames.toolItemIcon} data-slot=\"tool-item-icon\">\n {renderToolItemIcon(entry)}\n </span>\n <span className={classNames.toolItemLabel} data-slot=\"tool-item-label\">\n {getToolItemLabel(entry)}\n </span>\n {isInProgress ? (\n <span className={classNames.toolItemSpinner} data-slot=\"tool-item-spinner\">\n {renderInlinePendingIndicator()}\n </span>\n ) : null}\n {showEventLink ? (\n <span\n className={classNames.toolItemLink}\n data-slot=\"tool-item-link\"\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n onEventClick?.(entry.eventId!);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n event.stopPropagation();\n onEventClick?.(entry.eventId!);\n }\n }}\n >\n {renderEventLinkContent(entry)}\n </span>\n ) : null}\n {hasContent ? (\n <span className={classNames.toolItemChevron} data-slot=\"tool-item-chevron\">\n {renderChevron(expanded)}\n </span>\n ) : null}\n </button>\n {expanded && hasContent ? (\n <div className={classNames.toolItemBody} data-slot=\"tool-item-body\">\n {isTool && entry.toolInput ? (\n <div className={classNames.toolSection} data-slot=\"tool-section\" data-section=\"input\">\n <div className={classNames.toolSectionTitle} data-slot=\"tool-section-title\">\n Input\n </div>\n <pre className={classNames.toolCode} data-slot=\"tool-code\">\n {entry.toolInput}\n </pre>\n </div>\n ) : null}\n {isTool && isComplete && entry.toolOutput ? (\n <div className={classNames.toolSection} data-slot=\"tool-section\" data-section=\"output\">\n <div className={classNames.toolSectionTitle} data-slot=\"tool-section-title\">\n Output\n </div>\n <pre className={classNames.toolCode} data-slot=\"tool-code\">\n {entry.toolOutput}\n </pre>\n </div>\n ) : null}\n {isReasoning && entry.reasoning?.text ? (\n <div className={classNames.toolSection} data-slot=\"tool-section\" data-section=\"reasoning\">\n <pre className={cx(classNames.toolCode, classNames.toolCodeMuted)} data-slot=\"tool-code\">\n {entry.reasoning.text}\n </pre>\n </div>\n ) : null}\n {isMeta && entry.meta?.detail ? (\n <div className={classNames.toolSection} data-slot=\"tool-section\" data-section=\"meta\">\n <pre className={classNames.toolCode} data-slot=\"tool-code\">\n {entry.meta.detail}\n </pre>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n );\n};\n\nconst ToolGroup = ({\n entries,\n expanded,\n onExpandedChange,\n expandedItemIds,\n onToolItemExpandedChange,\n classNames,\n onEventClick,\n canOpenEvent,\n getToolGroupSummary,\n renderInlinePendingIndicator,\n renderToolItemIcon,\n renderToolGroupIcon,\n renderChevron,\n renderEventLinkContent,\n}: {\n entries: TranscriptEntry[];\n expanded: boolean;\n onExpandedChange: (expanded: boolean) => void;\n expandedItemIds: Record<string, boolean>;\n onToolItemExpandedChange: (entryId: string, expanded: boolean) => void;\n classNames: AgentTranscriptClassNames;\n onEventClick?: (eventId: string) => void;\n canOpenEvent: (entry: TranscriptEntry) => boolean;\n getToolGroupSummary: (entries: TranscriptEntry[]) => string;\n renderInlinePendingIndicator: () => ReactNode;\n renderToolItemIcon: (entry: TranscriptEntry) => ReactNode;\n renderToolGroupIcon: (entries: TranscriptEntry[], expanded: boolean) => ReactNode;\n renderChevron: (expanded: boolean) => ReactNode;\n renderEventLinkContent: (entry: TranscriptEntry) => ReactNode;\n}) => {\n const hasFailed = entries.some((entry) => entry.kind === \"tool\" && entry.toolStatus === \"failed\");\n\n if (entries.length === 1) {\n return (\n <div className={classNames.toolGroupSingle} data-slot=\"tool-group-single\">\n <ToolItem\n entry={entries[0]}\n isLast={true}\n expanded={Boolean(expandedItemIds[entries[0]!.id])}\n onExpandedChange={(nextExpanded) => onToolItemExpandedChange(entries[0]!.id, nextExpanded)}\n classNames={classNames}\n onEventClick={onEventClick}\n canOpenEvent={canOpenEvent}\n renderInlinePendingIndicator={renderInlinePendingIndicator}\n renderToolItemIcon={renderToolItemIcon}\n renderChevron={renderChevron}\n renderEventLinkContent={renderEventLinkContent}\n />\n </div>\n );\n }\n\n return (\n <div className={cx(classNames.toolGroupContainer, hasFailed && \"failed\")} data-slot=\"tool-group\" data-failed={hasFailed ? \"true\" : undefined}>\n <button\n type=\"button\"\n className={cx(classNames.toolGroupHeader, expanded && \"expanded\")}\n data-slot=\"tool-group-header\"\n data-expanded={expanded ? \"true\" : undefined}\n onClick={() => onExpandedChange(!expanded)}\n >\n <span className={classNames.toolGroupIcon} data-slot=\"tool-group-icon\">\n {renderToolGroupIcon(entries, expanded)}\n </span>\n <span className={classNames.toolGroupLabel} data-slot=\"tool-group-label\">\n {getToolGroupSummary(entries)}\n </span>\n <span className={classNames.toolGroupChevron} data-slot=\"tool-group-chevron\">\n {renderChevron(expanded)}\n </span>\n </button>\n {expanded ? (\n <div className={classNames.toolGroupBody} data-slot=\"tool-group-body\">\n {entries.map((entry, index) => (\n <ToolItem\n key={entry.id}\n entry={entry}\n isLast={index === entries.length - 1}\n expanded={Boolean(expandedItemIds[entry.id])}\n onExpandedChange={(nextExpanded) => onToolItemExpandedChange(entry.id, nextExpanded)}\n classNames={classNames}\n onEventClick={onEventClick}\n canOpenEvent={canOpenEvent}\n renderInlinePendingIndicator={renderInlinePendingIndicator}\n renderToolItemIcon={renderToolItemIcon}\n renderChevron={renderChevron}\n renderEventLinkContent={renderEventLinkContent}\n />\n ))}\n </div>\n ) : null}\n </div>\n );\n};\n\nconst PermissionPrompt = ({\n entry,\n classNames,\n onPermissionReply,\n renderPermissionIcon,\n renderPermissionOptionContent,\n}: {\n entry: TranscriptEntry;\n classNames: AgentTranscriptClassNames;\n onPermissionReply?: (permissionId: string, reply: PermissionReply) => void;\n renderPermissionIcon: (entry: TranscriptEntry) => ReactNode;\n renderPermissionOptionContent: (context: PermissionOptionRenderContext) => ReactNode;\n}) => {\n const permission = entry.permission;\n if (!permission) {\n return null;\n }\n\n const resolved = Boolean(permission.resolved);\n const selectedOptionId = permission.selectedOptionId;\n const canReply = Boolean(onPermissionReply) && !resolved;\n\n return (\n <div className={cx(classNames.permissionPrompt, resolved && \"resolved\")} data-slot=\"permission-prompt\" data-resolved={resolved ? \"true\" : undefined}>\n <div className={classNames.permissionHeader} data-slot=\"permission-header\">\n <span className={classNames.permissionIcon} data-slot=\"permission-icon\">\n {renderPermissionIcon(entry)}\n </span>\n <span className={classNames.permissionTitle} data-slot=\"permission-title\">\n {permission.title}\n </span>\n </div>\n {permission.description ? (\n <div className={classNames.permissionDescription} data-slot=\"permission-description\">\n {permission.description}\n </div>\n ) : null}\n <div className={classNames.permissionActions} data-slot=\"permission-actions\">\n {permission.options.map((option) => {\n const reply = getPermissionReplyForOption(option.kind);\n const label = getPermissionOptionLabel(option);\n const selected = resolved && selectedOptionId === option.optionId;\n const dimmed = resolved && !selected && selectedOptionId != null;\n const tone = getPermissionOptionTone(option.kind);\n\n return (\n <button\n key={option.optionId}\n type=\"button\"\n className={cx(classNames.permissionButton, tone, selected && \"selected\", dimmed && \"dimmed\")}\n data-slot=\"permission-button\"\n data-tone={tone}\n data-selected={selected ? \"true\" : undefined}\n data-dimmed={dimmed ? \"true\" : undefined}\n disabled={!canReply}\n onClick={() => onPermissionReply?.(permission.permissionId, reply)}\n >\n {renderPermissionOptionContent({\n entry,\n option,\n label,\n reply,\n selected,\n dimmed,\n resolved,\n })}\n </button>\n );\n })}\n {resolved && !selectedOptionId ? (\n <span className={classNames.permissionAutoResolved} data-slot=\"permission-auto-resolved\">\n Auto-resolved\n </span>\n ) : null}\n </div>\n </div>\n );\n};\n\nexport const AgentTranscript = ({\n entries,\n className,\n classNames: classNameOverrides,\n endRef,\n scrollRef,\n scrollToEntryId,\n sessionError,\n eventError,\n isThinking,\n agentId,\n virtualize = false,\n onAtBottomChange,\n onEventClick,\n onPermissionReply,\n isDividerEntry = defaultIsDividerEntry,\n canOpenEvent = defaultCanOpenEvent,\n getToolGroupSummary = getDefaultToolGroupSummary,\n renderMessageText = defaultRenderMessageText,\n renderInlinePendingIndicator = defaultRenderPendingIndicator,\n renderThinkingState,\n renderToolItemIcon = getDefaultToolItemIcon,\n renderToolGroupIcon = () => null,\n renderChevron = defaultRenderChevron,\n renderEventLinkContent = defaultRenderEventLinkContent,\n renderPermissionIcon = defaultRenderPermissionIcon,\n renderPermissionOptionContent = defaultRenderPermissionOptionContent,\n}: AgentTranscriptProps) => {\n const resolvedClassNames = useMemo(() => mergeClassNames(DEFAULT_CLASS_NAMES, classNameOverrides), [classNameOverrides]);\n const groupedEntries = useMemo(() => buildGroupedEntries(entries, isDividerEntry), [entries, isDividerEntry]);\n const [expandedToolGroups, setExpandedToolGroups] = useState<Record<string, boolean>>({});\n const [expandedToolItems, setExpandedToolItems] = useState<Record<string, boolean>>({});\n const lastScrollTargetRef = useRef<string | null>(null);\n const isVirtualized = virtualize && Boolean(scrollRef);\n const { virtualizer, isFollowingRef } = useTranscriptVirtualizer(groupedEntries, isVirtualized ? scrollRef : undefined, onAtBottomChange);\n\n useEffect(() => {\n if (!scrollToEntryId) {\n lastScrollTargetRef.current = null;\n return;\n }\n\n if (!isVirtualized || scrollToEntryId === lastScrollTargetRef.current) {\n return;\n }\n\n const targetIndex = groupedEntries.findIndex((group) => group.entries.some((entry) => entry.id === scrollToEntryId));\n if (targetIndex < 0) {\n return;\n }\n\n lastScrollTargetRef.current = scrollToEntryId;\n\n const frameId = requestAnimationFrame(() => {\n virtualizer.scrollToIndex(targetIndex, {\n align: \"center\",\n behavior: \"smooth\",\n });\n });\n\n return () => {\n cancelAnimationFrame(frameId);\n };\n }, [groupedEntries, isVirtualized, scrollToEntryId, virtualizer]);\n\n useEffect(() => {\n if (!isVirtualized || !scrollRef?.current || !isFollowingRef.current) {\n return;\n }\n\n const scrollElement = scrollRef.current;\n const frameId = requestAnimationFrame(() => {\n scrollElement.scrollTo({ top: scrollElement.scrollHeight });\n });\n\n return () => {\n cancelAnimationFrame(frameId);\n };\n }, [eventError, isFollowingRef, isThinking, isVirtualized, scrollRef, sessionError]);\n\n const setToolGroupExpanded = (groupKey: string, expanded: boolean) => {\n setExpandedToolGroups((current) => {\n if (current[groupKey] === expanded) {\n return current;\n }\n return { ...current, [groupKey]: expanded };\n });\n };\n\n const setToolItemExpanded = (entryId: string, expanded: boolean) => {\n setExpandedToolItems((current) => {\n if (current[entryId] === expanded) {\n return current;\n }\n return { ...current, [entryId]: expanded };\n });\n };\n\n const renderGroup = (group: GroupedEntries, index: number) => {\n if (group.type === \"divider\") {\n const entry = group.entries[0];\n const title = entry.meta?.title ?? \"Status\";\n return (\n <div key={entry.id} className={resolvedClassNames.divider} data-slot=\"divider\">\n <div className={resolvedClassNames.dividerLine} data-slot=\"divider-line\" />\n <span className={resolvedClassNames.dividerText} data-slot=\"divider-text\">\n {title}\n </span>\n <div className={resolvedClassNames.dividerLine} data-slot=\"divider-line\" />\n </div>\n );\n }\n\n if (group.type === \"tool-group\") {\n const groupKey = getGroupedEntryKey(group, index);\n\n return (\n <ToolGroup\n key={groupKey}\n entries={group.entries}\n expanded={Boolean(expandedToolGroups[groupKey])}\n onExpandedChange={(expanded) => setToolGroupExpanded(groupKey, expanded)}\n expandedItemIds={expandedToolItems}\n onToolItemExpandedChange={setToolItemExpanded}\n classNames={resolvedClassNames}\n onEventClick={onEventClick}\n canOpenEvent={canOpenEvent}\n getToolGroupSummary={getToolGroupSummary}\n renderInlinePendingIndicator={renderInlinePendingIndicator}\n renderToolItemIcon={renderToolItemIcon}\n renderToolGroupIcon={renderToolGroupIcon}\n renderChevron={renderChevron}\n renderEventLinkContent={renderEventLinkContent}\n />\n );\n }\n\n if (group.type === \"permission\") {\n const entry = group.entries[0];\n return (\n <PermissionPrompt\n key={entry.id}\n entry={entry}\n classNames={resolvedClassNames}\n onPermissionReply={onPermissionReply}\n renderPermissionIcon={renderPermissionIcon}\n renderPermissionOptionContent={renderPermissionOptionContent}\n />\n );\n }\n\n const entry = group.entries[0];\n const messageVariant = getMessageVariant(entry);\n\n return (\n <div\n key={entry.id}\n className={cx(resolvedClassNames.message, messageVariant, \"no-avatar\")}\n data-slot=\"message\"\n data-kind={entry.kind}\n data-role={entry.role}\n data-variant={messageVariant}\n data-severity={entry.meta?.severity}\n >\n <div className={resolvedClassNames.messageContent} data-slot=\"message-content\">\n {entry.text ? (\n <div className={resolvedClassNames.messageText} data-slot=\"message-text\">\n {renderMessageText(entry)}\n </div>\n ) : (\n <span className={resolvedClassNames.thinkingIndicator} data-slot=\"thinking-indicator\">\n {renderInlinePendingIndicator()}\n </span>\n )}\n </div>\n </div>\n );\n };\n\n return (\n <div className={cx(resolvedClassNames.root, className)} data-slot=\"root\" data-virtualized={isVirtualized ? \"true\" : undefined}>\n {isVirtualized ? (\n <div\n data-slot=\"virtual-list\"\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n position: \"relative\",\n width: \"100%\",\n }}\n >\n {virtualizer.getVirtualItems().map((virtualItem) => {\n const group = groupedEntries[virtualItem.index];\n if (!group) {\n return null;\n }\n\n return (\n <div\n key={getGroupedEntryKey(group, virtualItem.index)}\n data-index={virtualItem.index}\n ref={(node) => {\n if (node) {\n virtualizer.measureElement(node);\n }\n }}\n style={{\n left: 0,\n position: \"absolute\",\n top: 0,\n transform: `translateY(${virtualItem.start}px)`,\n width: \"100%\",\n }}\n >\n <div style={{ paddingBottom: virtualItem.index === groupedEntries.length - 1 ? 0 : `${VIRTUAL_GROUP_GAP_PX}px` }}>\n {renderGroup(group, virtualItem.index)}\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n groupedEntries.map((group, index) => renderGroup(group, index))\n )}\n {sessionError ? (\n <div className={resolvedClassNames.error} data-slot=\"error\" data-source=\"session\">\n {sessionError}\n </div>\n ) : null}\n {eventError ? (\n <div className={resolvedClassNames.error} data-slot=\"error\" data-source=\"event\">\n {eventError}\n </div>\n ) : null}\n {isThinking\n ? (renderThinkingState?.({ agentId }) ?? (\n <div className={resolvedClassNames.thinkingRow} data-slot=\"thinking-row\">\n <span className={resolvedClassNames.thinkingIndicator} data-slot=\"thinking-indicator\">\n Thinking...\n </span>\n </div>\n ))\n : null}\n {!isVirtualized ? <div ref={endRef} className={resolvedClassNames.endAnchor} data-slot=\"end-anchor\" /> : null}\n </div>\n );\n};\n","\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\n\nexport function useTranscriptVirtualizer<T>(items: T[], scrollElementRef?: RefObject<HTMLDivElement | null>, onAtBottomChange?: (atBottom: boolean) => void) {\n const isFollowingRef = useRef(true);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => scrollElementRef?.current ?? null,\n estimateSize: () => 80,\n measureElement: (element) => element.getBoundingClientRect().height,\n overscan: 10,\n });\n\n virtualizer.shouldAdjustScrollPositionOnItemSizeChange = () => isFollowingRef.current;\n\n useEffect(() => {\n const scrollElement = scrollElementRef?.current;\n if (!scrollElement) {\n return;\n }\n\n const updateFollowState = () => {\n const atBottom = scrollElement.scrollHeight - scrollElement.scrollTop - scrollElement.clientHeight < 50;\n isFollowingRef.current = atBottom;\n onAtBottomChange?.(atBottom);\n };\n\n updateFollowState();\n scrollElement.addEventListener(\"scroll\", updateFollowState, { passive: true });\n\n return () => {\n scrollElement.removeEventListener(\"scroll\", updateFollowState);\n };\n }, [onAtBottomChange, scrollElementRef]);\n\n useEffect(() => {\n if (!isFollowingRef.current || items.length === 0) {\n return;\n }\n\n const frameId = requestAnimationFrame(() => {\n virtualizer.scrollToIndex(items.length - 1, {\n align: \"end\",\n behavior: \"smooth\",\n });\n });\n\n return () => {\n cancelAnimationFrame(frameId);\n };\n }, [items.length, virtualizer]);\n\n return { virtualizer, isFollowingRef };\n}\n","\"use client\";\n\nimport type { KeyboardEvent, ReactNode, Ref, TextareaHTMLAttributes } from \"react\";\n\nexport interface ChatComposerClassNames {\n root: string;\n form: string;\n input: string;\n submit: string;\n submitContent: string;\n}\n\nexport interface ChatComposerProps {\n message: string;\n onMessageChange: (value: string) => void;\n onSubmit: () => void;\n onKeyDown?: (event: KeyboardEvent<HTMLTextAreaElement>) => void;\n placeholder?: string;\n disabled?: boolean;\n submitDisabled?: boolean;\n allowEmptySubmit?: boolean;\n submitLabel?: string;\n className?: string;\n classNames?: Partial<ChatComposerClassNames>;\n inputRef?: Ref<HTMLTextAreaElement>;\n rows?: number;\n textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"className\" | \"disabled\" | \"onChange\" | \"onKeyDown\" | \"placeholder\" | \"rows\" | \"value\">;\n renderSubmitContent?: () => ReactNode;\n renderFooter?: () => ReactNode;\n}\n\nconst DEFAULT_CLASS_NAMES: ChatComposerClassNames = {\n root: \"sa-chat-composer\",\n form: \"sa-chat-composer-form\",\n input: \"sa-chat-composer-input\",\n submit: \"sa-chat-composer-submit\",\n submitContent: \"sa-chat-composer-submit-content\",\n};\n\nconst cx = (...values: Array<string | false | null | undefined>) => values.filter(Boolean).join(\" \");\n\nconst mergeClassNames = (defaults: ChatComposerClassNames, overrides?: Partial<ChatComposerClassNames>): ChatComposerClassNames => ({\n root: cx(defaults.root, overrides?.root),\n form: cx(defaults.form, overrides?.form),\n input: cx(defaults.input, overrides?.input),\n submit: cx(defaults.submit, overrides?.submit),\n submitContent: cx(defaults.submitContent, overrides?.submitContent),\n});\n\nexport const ChatComposer = ({\n message,\n onMessageChange,\n onSubmit,\n onKeyDown,\n placeholder,\n disabled = false,\n submitDisabled = false,\n allowEmptySubmit = false,\n submitLabel = \"Send\",\n className,\n classNames: classNameOverrides,\n inputRef,\n rows = 1,\n textareaProps,\n renderSubmitContent,\n renderFooter,\n}: ChatComposerProps) => {\n const resolvedClassNames = mergeClassNames(DEFAULT_CLASS_NAMES, classNameOverrides);\n const isSubmitDisabled = disabled || submitDisabled || (!allowEmptySubmit && message.trim().length === 0);\n\n return (\n <div className={cx(resolvedClassNames.root, className)} data-slot=\"root\">\n <form\n className={resolvedClassNames.form}\n data-slot=\"form\"\n onSubmit={(event) => {\n event.preventDefault();\n if (!isSubmitDisabled) {\n onSubmit();\n }\n }}\n >\n <textarea\n {...textareaProps}\n ref={inputRef}\n className={resolvedClassNames.input}\n data-slot=\"input\"\n data-disabled={disabled ? \"true\" : undefined}\n data-empty={message.trim().length === 0 ? \"true\" : undefined}\n value={message}\n onChange={(event) => onMessageChange(event.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n rows={rows}\n disabled={disabled}\n />\n {renderFooter?.()}\n <button\n type=\"submit\"\n className={resolvedClassNames.submit}\n data-slot=\"submit\"\n data-disabled={isSubmitDisabled ? \"true\" : undefined}\n disabled={isSubmitDisabled}\n aria-label={submitLabel}\n title={submitLabel}\n >\n <span className={resolvedClassNames.submitContent} data-slot=\"submit-content\">\n {renderSubmitContent?.() ?? submitLabel}\n </span>\n </button>\n </form>\n </div>\n );\n};\n","\"use client\";\n\nimport type { ReactNode, RefObject } from \"react\";\nimport { AgentTranscript, type AgentTranscriptClassNames, type AgentTranscriptProps, type TranscriptEntry } from \"./AgentTranscript.tsx\";\nimport { ChatComposer, type ChatComposerClassNames, type ChatComposerProps } from \"./ChatComposer.tsx\";\n\nexport interface AgentConversationClassNames {\n root: string;\n transcript: string;\n emptyState: string;\n composer: string;\n}\n\nexport interface AgentConversationProps {\n entries: TranscriptEntry[];\n className?: string;\n classNames?: Partial<AgentConversationClassNames>;\n emptyState?: ReactNode;\n transcriptClassName?: string;\n transcriptClassNames?: Partial<AgentTranscriptClassNames>;\n scrollRef?: RefObject<HTMLDivElement | null>;\n composerClassName?: string;\n composerClassNames?: Partial<ChatComposerClassNames>;\n transcriptProps?: Omit<AgentTranscriptProps, \"entries\" | \"className\" | \"classNames\" | \"scrollRef\">;\n composerProps?: Omit<ChatComposerProps, \"className\" | \"classNames\">;\n}\n\nconst DEFAULT_CLASS_NAMES: AgentConversationClassNames = {\n root: \"sa-agent-conversation\",\n transcript: \"sa-agent-conversation-transcript\",\n emptyState: \"sa-agent-conversation-empty-state\",\n composer: \"sa-agent-conversation-composer\",\n};\n\nconst cx = (...values: Array<string | false | null | undefined>) => values.filter(Boolean).join(\" \");\n\nconst mergeClassNames = (defaults: AgentConversationClassNames, overrides?: Partial<AgentConversationClassNames>): AgentConversationClassNames => ({\n root: cx(defaults.root, overrides?.root),\n transcript: cx(defaults.transcript, overrides?.transcript),\n emptyState: cx(defaults.emptyState, overrides?.emptyState),\n composer: cx(defaults.composer, overrides?.composer),\n});\n\nexport const AgentConversation = ({\n entries,\n className,\n classNames: classNameOverrides,\n emptyState,\n transcriptClassName,\n transcriptClassNames,\n scrollRef,\n composerClassName,\n composerClassNames,\n transcriptProps,\n composerProps,\n}: AgentConversationProps) => {\n const resolvedClassNames = mergeClassNames(DEFAULT_CLASS_NAMES, classNameOverrides);\n const hasTranscriptContent = entries.length > 0 || Boolean(transcriptProps?.sessionError) || Boolean(transcriptProps?.eventError);\n\n return (\n <div className={cx(resolvedClassNames.root, className)} data-slot=\"root\">\n {hasTranscriptContent ? (\n scrollRef ? (\n <div className={cx(resolvedClassNames.transcript, transcriptClassName)} data-slot=\"transcript\" ref={scrollRef}>\n <AgentTranscript entries={entries} classNames={transcriptClassNames} {...transcriptProps} />\n </div>\n ) : (\n <AgentTranscript\n entries={entries}\n className={cx(resolvedClassNames.transcript, transcriptClassName)}\n classNames={transcriptClassNames}\n {...transcriptProps}\n />\n )\n ) : emptyState ? (\n <div className={resolvedClassNames.emptyState} data-slot=\"empty-state\">\n {emptyState}\n </div>\n ) : null}\n {composerProps ? (\n <ChatComposer className={cx(resolvedClassNames.composer, composerClassName)} classNames={composerClassNames} {...composerProps} />\n ) : null}\n </div>\n );\n};\n","\"use client\";\n\nimport type { FitAddon as GhosttyFitAddon, Terminal as GhosttyTerminal } from \"ghostty-web\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type {\n SandboxAgent,\n TerminalErrorStatus,\n TerminalExitStatus,\n TerminalReadyStatus,\n} from \"sandbox-agent\";\n\ntype ConnectionState = \"connecting\" | \"ready\" | \"closed\" | \"error\";\n\nexport type ProcessTerminalClient = Pick<SandboxAgent, \"connectProcessTerminal\">;\n\nexport interface ProcessTerminalProps {\n client: ProcessTerminalClient;\n processId: string;\n className?: string;\n style?: CSSProperties;\n terminalStyle?: CSSProperties;\n statusBarStyleOverride?: CSSProperties;\n height?: number | string;\n showStatusBar?: boolean;\n onExit?: (status: TerminalExitStatus) => void;\n onError?: (error: TerminalErrorStatus | Error) => void;\n}\n\nconst terminalTheme = {\n background: \"#09090b\",\n foreground: \"#f4f4f5\",\n cursor: \"#f97316\",\n cursorAccent: \"#09090b\",\n selectionBackground: \"#27272a\",\n black: \"#18181b\",\n red: \"#f87171\",\n green: \"#4ade80\",\n yellow: \"#fbbf24\",\n blue: \"#60a5fa\",\n magenta: \"#f472b6\",\n cyan: \"#22d3ee\",\n white: \"#e4e4e7\",\n brightBlack: \"#3f3f46\",\n brightRed: \"#fb7185\",\n brightGreen: \"#86efac\",\n brightYellow: \"#fde047\",\n brightBlue: \"#93c5fd\",\n brightMagenta: \"#f9a8d4\",\n brightCyan: \"#67e8f9\",\n brightWhite: \"#fafafa\",\n};\n\nconst shellStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 10,\n background: \"rgba(0, 0, 0, 0.3)\",\n};\n\nconst statusBarStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n padding: \"8px 12px\",\n borderBottom: \"1px solid rgba(255, 255, 255, 0.08)\",\n background: \"rgba(0, 0, 0, 0.2)\",\n color: \"rgba(244, 244, 245, 0.86)\",\n fontSize: 11,\n lineHeight: 1.4,\n};\n\nconst hostBaseStyle: CSSProperties = {\n minHeight: 320,\n padding: 10,\n overflow: \"hidden\",\n};\n\nconst exitCodeStyle: CSSProperties = {\n fontFamily: \"ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace\",\n opacity: 0.72,\n};\n\nconst getStatusColor = (state: ConnectionState): string => {\n switch (state) {\n case \"ready\":\n return \"#4ade80\";\n case \"error\":\n return \"#fb7185\";\n case \"closed\":\n return \"#fbbf24\";\n default:\n return \"rgba(244, 244, 245, 0.72)\";\n }\n};\n\nexport const ProcessTerminal = ({\n client,\n processId,\n className,\n style,\n terminalStyle,\n statusBarStyleOverride,\n height = 360,\n showStatusBar = true,\n onExit,\n onError,\n}: ProcessTerminalProps) => {\n const hostRef = useRef<HTMLDivElement | null>(null);\n const [connectionState, setConnectionState] = useState<ConnectionState>(\"connecting\");\n const [statusMessage, setStatusMessage] = useState(\"Connecting to PTY...\");\n const [exitCode, setExitCode] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n let terminal: GhosttyTerminal | null = null;\n let fitAddon: GhosttyFitAddon | null = null;\n let session: ReturnType<ProcessTerminalClient[\"connectProcessTerminal\"]> | null = null;\n let resizeRaf = 0;\n let removeDataListener: { dispose(): void } | null = null;\n let removeResizeListener: { dispose(): void } | null = null;\n\n setConnectionState(\"connecting\");\n setStatusMessage(\"Connecting to PTY...\");\n setExitCode(null);\n\n const syncSize = () => {\n if (!terminal || !session) {\n return;\n }\n\n session.resize({\n cols: terminal.cols,\n rows: terminal.rows,\n });\n };\n\n const connect = async () => {\n try {\n const ghostty = await import(\"ghostty-web\");\n await ghostty.init();\n\n if (cancelled || !hostRef.current) {\n return;\n }\n\n terminal = new ghostty.Terminal({\n allowTransparency: true,\n cursorBlink: true,\n cursorStyle: \"block\",\n fontFamily: \"ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace\",\n fontSize: 13,\n smoothScrollDuration: 90,\n theme: terminalTheme,\n });\n fitAddon = new ghostty.FitAddon();\n\n terminal.open(hostRef.current);\n const terminalRoot = hostRef.current.firstElementChild;\n if (terminalRoot instanceof HTMLElement) {\n terminalRoot.style.width = \"100%\";\n terminalRoot.style.height = \"100%\";\n }\n terminal.loadAddon(fitAddon);\n fitAddon.fit();\n fitAddon.observeResize();\n terminal.focus();\n\n removeDataListener = terminal.onData((data) => {\n session?.sendInput(data);\n });\n\n removeResizeListener = terminal.onResize(() => {\n if (resizeRaf) {\n window.cancelAnimationFrame(resizeRaf);\n }\n resizeRaf = window.requestAnimationFrame(syncSize);\n });\n\n const nextSession = client.connectProcessTerminal(processId);\n session = nextSession;\n\n nextSession.onReady((frame: TerminalReadyStatus) => {\n if (cancelled || frame.type !== \"ready\") {\n return;\n }\n\n setConnectionState(\"ready\");\n setStatusMessage(\"Connected\");\n syncSize();\n });\n\n nextSession.onData((bytes: Uint8Array) => {\n if (cancelled || !terminal) {\n return;\n }\n terminal.write(bytes);\n });\n\n nextSession.onExit((frame: TerminalExitStatus) => {\n if (cancelled || frame.type !== \"exit\") {\n return;\n }\n\n setConnectionState(\"closed\");\n setExitCode(frame.exitCode ?? null);\n setStatusMessage(frame.exitCode == null ? \"Process exited.\" : `Process exited with code ${frame.exitCode}.`);\n onExit?.(frame);\n });\n\n nextSession.onError((error: TerminalErrorStatus | Error) => {\n if (cancelled) {\n return;\n }\n\n setConnectionState(\"error\");\n setStatusMessage(error instanceof Error ? error.message : error.message);\n onError?.(error);\n });\n\n nextSession.onClose(() => {\n if (cancelled) {\n return;\n }\n\n setConnectionState((current) => (current === \"error\" ? current : \"closed\"));\n setStatusMessage((current) => (current === \"Connected\" ? \"Terminal disconnected.\" : current));\n });\n } catch (error) {\n if (cancelled) {\n return;\n }\n\n const nextError = error instanceof Error ? error : new Error(\"Failed to initialize terminal.\");\n setConnectionState(\"error\");\n setStatusMessage(nextError.message);\n onError?.(nextError);\n }\n };\n\n void connect();\n\n return () => {\n cancelled = true;\n if (resizeRaf) {\n window.cancelAnimationFrame(resizeRaf);\n }\n removeDataListener?.dispose();\n removeResizeListener?.dispose();\n session?.close();\n terminal?.dispose();\n };\n }, [client, onError, onExit, processId]);\n\n return (\n <div className={className} style={{ ...shellStyle, ...style }}>\n {showStatusBar ? (\n <div style={{ ...statusBarStyle, ...statusBarStyleOverride }}>\n <span style={{ color: getStatusColor(connectionState) }}>{statusMessage}</span>\n {exitCode != null ? <span style={exitCodeStyle}>exit={exitCode}</span> : null}\n </div>\n ) : null}\n <div\n ref={hostRef}\n role=\"presentation\"\n style={{\n ...hostBaseStyle,\n height,\n ...terminalStyle,\n }}\n onClick={() => {\n hostRef.current?.querySelector(\"textarea\")?.focus();\n }}\n />\n </div>\n );\n};\n"],"mappings":"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","names":["useEffect","useRef","useRef","useEffect","entry","jsx","jsxs","DEFAULT_CLASS_NAMES","cx","mergeClassNames","jsx","jsxs","DEFAULT_CLASS_NAMES","cx","mergeClassNames","useEffect","useRef","useState","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/AgentTranscript.tsx","../src/useTranscriptVirtualizer.ts","../src/ChatComposer.tsx","../src/AgentConversation.tsx","../src/DesktopViewer.tsx","../src/ProcessTerminal.tsx"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode, RefObject } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranscriptVirtualizer } from \"./useTranscriptVirtualizer.ts\";\n\nexport type PermissionReply = \"once\" | \"always\" | \"reject\";\n\nexport type PermissionOption = {\n optionId: string;\n name: string;\n kind: string;\n};\n\nexport type TranscriptEntry = {\n id: string;\n eventId?: string;\n kind: \"message\" | \"tool\" | \"meta\" | \"reasoning\" | \"permission\";\n time: string;\n role?: \"user\" | \"assistant\";\n text?: string;\n toolName?: string;\n toolInput?: string;\n toolOutput?: string;\n toolStatus?: string;\n reasoning?: { text: string; visibility?: string };\n meta?: { title: string; detail?: string; severity?: \"info\" | \"error\" };\n permission?: {\n permissionId: string;\n title: string;\n description?: string;\n options: PermissionOption[];\n resolved?: boolean;\n selectedOptionId?: string;\n };\n};\n\nexport interface AgentTranscriptClassNames {\n root: string;\n divider: string;\n dividerLine: string;\n dividerText: string;\n message: string;\n messageContent: string;\n messageText: string;\n error: string;\n toolGroupSingle: string;\n toolGroupContainer: string;\n toolGroupHeader: string;\n toolGroupIcon: string;\n toolGroupLabel: string;\n toolGroupChevron: string;\n toolGroupBody: string;\n toolItem: string;\n toolItemConnector: string;\n toolItemDot: string;\n toolItemLine: string;\n toolItemContent: string;\n toolItemHeader: string;\n toolItemIcon: string;\n toolItemLabel: string;\n toolItemSpinner: string;\n toolItemLink: string;\n toolItemChevron: string;\n toolItemBody: string;\n toolSection: string;\n toolSectionTitle: string;\n toolCode: string;\n toolCodeMuted: string;\n permissionPrompt: string;\n permissionHeader: string;\n permissionIcon: string;\n permissionTitle: string;\n permissionDescription: string;\n permissionActions: string;\n permissionButton: string;\n permissionAutoResolved: string;\n thinkingRow: string;\n thinkingAvatar: string;\n thinkingAvatarImage: string;\n thinkingAvatarLabel: string;\n thinkingIndicator: string;\n thinkingDot: string;\n endAnchor: string;\n}\n\nexport interface PermissionOptionRenderContext {\n entry: TranscriptEntry;\n option: PermissionOption;\n label: string;\n reply: PermissionReply;\n selected: boolean;\n dimmed: boolean;\n resolved: boolean;\n}\n\nexport interface AgentTranscriptProps {\n entries: TranscriptEntry[];\n className?: string;\n classNames?: Partial<AgentTranscriptClassNames>;\n endRef?: RefObject<HTMLDivElement | null>;\n scrollRef?: RefObject<HTMLDivElement | null>;\n scrollToEntryId?: string | null;\n sessionError?: string | null;\n eventError?: string | null;\n isThinking?: boolean;\n agentId?: string;\n virtualize?: boolean;\n onAtBottomChange?: (atBottom: boolean) => void;\n onEventClick?: (eventId: string) => void;\n onPermissionReply?: (permissionId: string, reply: PermissionReply) => void;\n isDividerEntry?: (entry: TranscriptEntry) => boolean;\n canOpenEvent?: (entry: TranscriptEntry) => boolean;\n getToolGroupSummary?: (entries: TranscriptEntry[]) => string;\n renderMessageText?: (entry: TranscriptEntry) => ReactNode;\n renderInlinePendingIndicator?: () => ReactNode;\n renderThinkingState?: (context: { agentId?: string }) => ReactNode;\n renderToolItemIcon?: (entry: TranscriptEntry) => ReactNode;\n renderToolGroupIcon?: (entries: TranscriptEntry[], expanded: boolean) => ReactNode;\n renderChevron?: (expanded: boolean) => ReactNode;\n renderEventLinkContent?: (entry: TranscriptEntry) => ReactNode;\n renderPermissionIcon?: (entry: TranscriptEntry) => ReactNode;\n renderPermissionOptionContent?: (context: PermissionOptionRenderContext) => ReactNode;\n}\n\ntype GroupedEntries =\n | { type: \"message\"; entries: TranscriptEntry[] }\n | { type: \"tool-group\"; entries: TranscriptEntry[] }\n | { type: \"divider\"; entries: TranscriptEntry[] }\n | { type: \"permission\"; entries: TranscriptEntry[] };\n\nconst VIRTUAL_GROUP_GAP_PX = 12;\n\nconst DEFAULT_CLASS_NAMES: AgentTranscriptClassNames = {\n root: \"sa-agent-transcript\",\n divider: \"sa-agent-transcript-divider\",\n dividerLine: \"sa-agent-transcript-divider-line\",\n dividerText: \"sa-agent-transcript-divider-text\",\n message: \"sa-agent-transcript-message\",\n messageContent: \"sa-agent-transcript-message-content\",\n messageText: \"sa-agent-transcript-message-text\",\n error: \"sa-agent-transcript-error\",\n toolGroupSingle: \"sa-agent-transcript-tool-group-single\",\n toolGroupContainer: \"sa-agent-transcript-tool-group\",\n toolGroupHeader: \"sa-agent-transcript-tool-group-header\",\n toolGroupIcon: \"sa-agent-transcript-tool-group-icon\",\n toolGroupLabel: \"sa-agent-transcript-tool-group-label\",\n toolGroupChevron: \"sa-agent-transcript-tool-group-chevron\",\n toolGroupBody: \"sa-agent-transcript-tool-group-body\",\n toolItem: \"sa-agent-transcript-tool-item\",\n toolItemConnector: \"sa-agent-transcript-tool-item-connector\",\n toolItemDot: \"sa-agent-transcript-tool-item-dot\",\n toolItemLine: \"sa-agent-transcript-tool-item-line\",\n toolItemContent: \"sa-agent-transcript-tool-item-content\",\n toolItemHeader: \"sa-agent-transcript-tool-item-header\",\n toolItemIcon: \"sa-agent-transcript-tool-item-icon\",\n toolItemLabel: \"sa-agent-transcript-tool-item-label\",\n toolItemSpinner: \"sa-agent-transcript-tool-item-spinner\",\n toolItemLink: \"sa-agent-transcript-tool-item-link\",\n toolItemChevron: \"sa-agent-transcript-tool-item-chevron\",\n toolItemBody: \"sa-agent-transcript-tool-item-body\",\n toolSection: \"sa-agent-transcript-tool-section\",\n toolSectionTitle: \"sa-agent-transcript-tool-section-title\",\n toolCode: \"sa-agent-transcript-tool-code\",\n toolCodeMuted: \"sa-agent-transcript-tool-code-muted\",\n permissionPrompt: \"sa-agent-transcript-permission-prompt\",\n permissionHeader: \"sa-agent-transcript-permission-header\",\n permissionIcon: \"sa-agent-transcript-permission-icon\",\n permissionTitle: \"sa-agent-transcript-permission-title\",\n permissionDescription: \"sa-agent-transcript-permission-description\",\n permissionActions: \"sa-agent-transcript-permission-actions\",\n permissionButton: \"sa-agent-transcript-permission-button\",\n permissionAutoResolved: \"sa-agent-transcript-permission-auto-resolved\",\n thinkingRow: \"sa-agent-transcript-thinking-row\",\n thinkingAvatar: \"sa-agent-transcript-thinking-avatar\",\n thinkingAvatarImage: \"sa-agent-transcript-thinking-avatar-image\",\n thinkingAvatarLabel: \"sa-agent-transcript-thinking-avatar-label\",\n thinkingIndicator: \"sa-agent-transcript-thinking-indicator\",\n thinkingDot: \"sa-agent-transcript-thinking-dot\",\n endAnchor: \"sa-agent-transcript-end\",\n};\n\nconst DEFAULT_DIVIDER_TITLES = new Set([\"Session Started\", \"Turn Started\", \"Turn Ended\"]);\n\nconst cx = (...values: Array<string | false | null | undefined>) => values.filter(Boolean).join(\" \");\n\nconst mergeClassNames = (defaults: AgentTranscriptClassNames, overrides?: Partial<AgentTranscriptClassNames>): AgentTranscriptClassNames => ({\n root: cx(defaults.root, overrides?.root),\n divider: cx(defaults.divider, overrides?.divider),\n dividerLine: cx(defaults.dividerLine, overrides?.dividerLine),\n dividerText: cx(defaults.dividerText, overrides?.dividerText),\n message: cx(defaults.message, overrides?.message),\n messageContent: cx(defaults.messageContent, overrides?.messageContent),\n messageText: cx(defaults.messageText, overrides?.messageText),\n error: cx(defaults.error, overrides?.error),\n toolGroupSingle: cx(defaults.toolGroupSingle, overrides?.toolGroupSingle),\n toolGroupContainer: cx(defaults.toolGroupContainer, overrides?.toolGroupContainer),\n toolGroupHeader: cx(defaults.toolGroupHeader, overrides?.toolGroupHeader),\n toolGroupIcon: cx(defaults.toolGroupIcon, overrides?.toolGroupIcon),\n toolGroupLabel: cx(defaults.toolGroupLabel, overrides?.toolGroupLabel),\n toolGroupChevron: cx(defaults.toolGroupChevron, overrides?.toolGroupChevron),\n toolGroupBody: cx(defaults.toolGroupBody, overrides?.toolGroupBody),\n toolItem: cx(defaults.toolItem, overrides?.toolItem),\n toolItemConnector: cx(defaults.toolItemConnector, overrides?.toolItemConnector),\n toolItemDot: cx(defaults.toolItemDot, overrides?.toolItemDot),\n toolItemLine: cx(defaults.toolItemLine, overrides?.toolItemLine),\n toolItemContent: cx(defaults.toolItemContent, overrides?.toolItemContent),\n toolItemHeader: cx(defaults.toolItemHeader, overrides?.toolItemHeader),\n toolItemIcon: cx(defaults.toolItemIcon, overrides?.toolItemIcon),\n toolItemLabel: cx(defaults.toolItemLabel, overrides?.toolItemLabel),\n toolItemSpinner: cx(defaults.toolItemSpinner, overrides?.toolItemSpinner),\n toolItemLink: cx(defaults.toolItemLink, overrides?.toolItemLink),\n toolItemChevron: cx(defaults.toolItemChevron, overrides?.toolItemChevron),\n toolItemBody: cx(defaults.toolItemBody, overrides?.toolItemBody),\n toolSection: cx(defaults.toolSection, overrides?.toolSection),\n toolSectionTitle: cx(defaults.toolSectionTitle, overrides?.toolSectionTitle),\n toolCode: cx(defaults.toolCode, overrides?.toolCode),\n toolCodeMuted: cx(defaults.toolCodeMuted, overrides?.toolCodeMuted),\n permissionPrompt: cx(defaults.permissionPrompt, overrides?.permissionPrompt),\n permissionHeader: cx(defaults.permissionHeader, overrides?.permissionHeader),\n permissionIcon: cx(defaults.permissionIcon, overrides?.permissionIcon),\n permissionTitle: cx(defaults.permissionTitle, overrides?.permissionTitle),\n permissionDescription: cx(defaults.permissionDescription, overrides?.permissionDescription),\n permissionActions: cx(defaults.permissionActions, overrides?.permissionActions),\n permissionButton: cx(defaults.permissionButton, overrides?.permissionButton),\n permissionAutoResolved: cx(defaults.permissionAutoResolved, overrides?.permissionAutoResolved),\n thinkingRow: cx(defaults.thinkingRow, overrides?.thinkingRow),\n thinkingAvatar: cx(defaults.thinkingAvatar, overrides?.thinkingAvatar),\n thinkingAvatarImage: cx(defaults.thinkingAvatarImage, overrides?.thinkingAvatarImage),\n thinkingAvatarLabel: cx(defaults.thinkingAvatarLabel, overrides?.thinkingAvatarLabel),\n thinkingIndicator: cx(defaults.thinkingIndicator, overrides?.thinkingIndicator),\n thinkingDot: cx(defaults.thinkingDot, overrides?.thinkingDot),\n endAnchor: cx(defaults.endAnchor, overrides?.endAnchor),\n});\n\nconst getMessageVariant = (entry: TranscriptEntry) => {\n if (entry.kind === \"tool\") return \"tool\";\n if (entry.kind === \"meta\") return entry.meta?.severity === \"error\" ? \"error\" : \"system\";\n if (entry.kind === \"reasoning\") return \"assistant\";\n if (entry.kind === \"permission\") return \"system\";\n if (entry.role === \"user\") return \"user\";\n return \"assistant\";\n};\n\nconst getToolItemLabel = (entry: TranscriptEntry) => {\n if (entry.kind === \"tool\") {\n const statusLabel = entry.toolStatus && entry.toolStatus !== \"completed\" ? ` (${entry.toolStatus.replaceAll(\"_\", \" \")})` : \"\";\n return `${entry.toolName ?? \"tool\"}${statusLabel}`;\n }\n\n if (entry.kind === \"reasoning\") {\n return `Reasoning${entry.reasoning?.visibility ? ` (${entry.reasoning.visibility})` : \"\"}`;\n }\n\n return entry.meta?.title ?? \"Status\";\n};\n\nconst getDefaultToolItemIcon = (entry: TranscriptEntry) => {\n if (entry.kind === \"tool\") return \"Tool\";\n if (entry.kind === \"reasoning\") return \"Thought\";\n return entry.meta?.severity === \"error\" ? \"Error\" : \"Info\";\n};\n\nconst getDefaultToolGroupSummary = (entries: TranscriptEntry[]) => {\n const count = entries.length;\n return `${count} Event${count === 1 ? \"\" : \"s\"}`;\n};\n\nconst getPermissionReplyForOption = (kind: string): PermissionReply => {\n if (kind === \"allow_once\") return \"once\";\n if (kind === \"allow_always\") return \"always\";\n return \"reject\";\n};\n\nconst getPermissionOptionLabel = (option: PermissionOption) => {\n if (option.name) return option.name;\n if (option.kind === \"allow_once\") return \"Allow Once\";\n if (option.kind === \"allow_always\") return \"Always Allow\";\n if (option.kind === \"reject_once\") return \"Reject\";\n if (option.kind === \"reject_always\") return \"Reject Always\";\n return option.kind;\n};\n\nconst getPermissionOptionTone = (kind: string) => (kind.startsWith(\"allow\") ? \"allow\" : \"reject\");\n\nconst defaultRenderMessageText = (entry: TranscriptEntry) => entry.text;\nconst defaultRenderPendingIndicator = () => \"...\";\nconst defaultRenderChevron = (expanded: boolean) => (expanded ? \"▾\" : \"▸\");\nconst defaultRenderEventLinkContent = () => \"Open\";\nconst defaultRenderPermissionIcon = () => \"Permission\";\nconst defaultRenderPermissionOptionContent = ({ label }: PermissionOptionRenderContext) => label;\nconst defaultIsDividerEntry = (entry: TranscriptEntry) => entry.kind === \"meta\" && DEFAULT_DIVIDER_TITLES.has(entry.meta?.title ?? \"\");\n\nconst defaultCanOpenEvent = (entry: TranscriptEntry) => Boolean(entry.eventId);\n\nconst buildGroupedEntries = (entries: TranscriptEntry[], isDividerEntry: (entry: TranscriptEntry) => boolean): GroupedEntries[] => {\n const groupedEntries: GroupedEntries[] = [];\n let currentToolGroup: TranscriptEntry[] = [];\n\n const flushToolGroup = () => {\n if (currentToolGroup.length === 0) {\n return;\n }\n groupedEntries.push({ type: \"tool-group\", entries: currentToolGroup });\n currentToolGroup = [];\n };\n\n for (const entry of entries) {\n if (isDividerEntry(entry)) {\n flushToolGroup();\n groupedEntries.push({ type: \"divider\", entries: [entry] });\n continue;\n }\n\n if (entry.kind === \"permission\") {\n flushToolGroup();\n groupedEntries.push({ type: \"permission\", entries: [entry] });\n continue;\n }\n\n if (entry.kind === \"tool\" || entry.kind === \"reasoning\" || entry.kind === \"meta\") {\n currentToolGroup.push(entry);\n continue;\n }\n\n flushToolGroup();\n groupedEntries.push({ type: \"message\", entries: [entry] });\n }\n\n flushToolGroup();\n return groupedEntries;\n};\n\nconst getGroupedEntryKey = (group: GroupedEntries, index: number): string => {\n const firstEntry = group.entries[0];\n\n if (group.type === \"tool-group\") {\n return `tool-group:${firstEntry?.id ?? index}`;\n }\n\n return firstEntry?.id ?? `${group.type}:${index}`;\n};\n\nconst ToolItem = ({\n entry,\n isLast,\n expanded,\n onExpandedChange,\n classNames,\n onEventClick,\n canOpenEvent,\n renderInlinePendingIndicator,\n renderToolItemIcon,\n renderChevron,\n renderEventLinkContent,\n}: {\n entry: TranscriptEntry;\n isLast: boolean;\n expanded: boolean;\n onExpandedChange: (expanded: boolean) => void;\n classNames: AgentTranscriptClassNames;\n onEventClick?: (eventId: string) => void;\n canOpenEvent: (entry: TranscriptEntry) => boolean;\n renderInlinePendingIndicator: () => ReactNode;\n renderToolItemIcon: (entry: TranscriptEntry) => ReactNode;\n renderChevron: (expanded: boolean) => ReactNode;\n renderEventLinkContent: (entry: TranscriptEntry) => ReactNode;\n}) => {\n const isTool = entry.kind === \"tool\";\n const isReasoning = entry.kind === \"reasoning\";\n const isMeta = entry.kind === \"meta\";\n const isComplete = isTool && (entry.toolStatus === \"completed\" || entry.toolStatus === \"failed\");\n const isFailed = isTool && entry.toolStatus === \"failed\";\n const isInProgress = isTool && entry.toolStatus === \"in_progress\";\n const hasContent = isTool\n ? Boolean(entry.toolInput || entry.toolOutput)\n : isReasoning\n ? Boolean(entry.reasoning?.text?.trim())\n : Boolean(entry.meta?.detail?.trim());\n const showEventLink = Boolean(entry.eventId && onEventClick && canOpenEvent(entry));\n\n return (\n <div\n className={cx(classNames.toolItem, isLast && \"last\", isFailed && \"failed\")}\n data-slot=\"tool-item\"\n data-kind={entry.kind}\n data-state={entry.toolStatus}\n data-last={isLast ? \"true\" : undefined}\n data-failed={isFailed ? \"true\" : undefined}\n >\n <div className={classNames.toolItemConnector} data-slot=\"tool-item-connector\">\n <div className={classNames.toolItemDot} data-slot=\"tool-item-dot\" />\n {!isLast ? <div className={classNames.toolItemLine} data-slot=\"tool-item-line\" /> : null}\n </div>\n <div className={classNames.toolItemContent} data-slot=\"tool-item-content\">\n <button\n type=\"button\"\n className={cx(classNames.toolItemHeader, expanded && \"expanded\")}\n data-slot=\"tool-item-header\"\n data-expanded={expanded ? \"true\" : undefined}\n data-has-content={hasContent ? \"true\" : undefined}\n disabled={!hasContent}\n onClick={() => {\n if (hasContent) {\n onExpandedChange(!expanded);\n }\n }}\n >\n <span className={classNames.toolItemIcon} data-slot=\"tool-item-icon\">\n {renderToolItemIcon(entry)}\n </span>\n <span className={classNames.toolItemLabel} data-slot=\"tool-item-label\">\n {getToolItemLabel(entry)}\n </span>\n {isInProgress ? (\n <span className={classNames.toolItemSpinner} data-slot=\"tool-item-spinner\">\n {renderInlinePendingIndicator()}\n </span>\n ) : null}\n {showEventLink ? (\n <span\n className={classNames.toolItemLink}\n data-slot=\"tool-item-link\"\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n onEventClick?.(entry.eventId!);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n event.stopPropagation();\n onEventClick?.(entry.eventId!);\n }\n }}\n >\n {renderEventLinkContent(entry)}\n </span>\n ) : null}\n {hasContent ? (\n <span className={classNames.toolItemChevron} data-slot=\"tool-item-chevron\">\n {renderChevron(expanded)}\n </span>\n ) : null}\n </button>\n {expanded && hasContent ? (\n <div className={classNames.toolItemBody} data-slot=\"tool-item-body\">\n {isTool && entry.toolInput ? (\n <div className={classNames.toolSection} data-slot=\"tool-section\" data-section=\"input\">\n <div className={classNames.toolSectionTitle} data-slot=\"tool-section-title\">\n Input\n </div>\n <pre className={classNames.toolCode} data-slot=\"tool-code\">\n {entry.toolInput}\n </pre>\n </div>\n ) : null}\n {isTool && isComplete && entry.toolOutput ? (\n <div className={classNames.toolSection} data-slot=\"tool-section\" data-section=\"output\">\n <div className={classNames.toolSectionTitle} data-slot=\"tool-section-title\">\n Output\n </div>\n <pre className={classNames.toolCode} data-slot=\"tool-code\">\n {entry.toolOutput}\n </pre>\n </div>\n ) : null}\n {isReasoning && entry.reasoning?.text ? (\n <div className={classNames.toolSection} data-slot=\"tool-section\" data-section=\"reasoning\">\n <pre className={cx(classNames.toolCode, classNames.toolCodeMuted)} data-slot=\"tool-code\">\n {entry.reasoning.text}\n </pre>\n </div>\n ) : null}\n {isMeta && entry.meta?.detail ? (\n <div className={classNames.toolSection} data-slot=\"tool-section\" data-section=\"meta\">\n <pre className={classNames.toolCode} data-slot=\"tool-code\">\n {entry.meta.detail}\n </pre>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n );\n};\n\nconst ToolGroup = ({\n entries,\n expanded,\n onExpandedChange,\n expandedItemIds,\n onToolItemExpandedChange,\n classNames,\n onEventClick,\n canOpenEvent,\n getToolGroupSummary,\n renderInlinePendingIndicator,\n renderToolItemIcon,\n renderToolGroupIcon,\n renderChevron,\n renderEventLinkContent,\n}: {\n entries: TranscriptEntry[];\n expanded: boolean;\n onExpandedChange: (expanded: boolean) => void;\n expandedItemIds: Record<string, boolean>;\n onToolItemExpandedChange: (entryId: string, expanded: boolean) => void;\n classNames: AgentTranscriptClassNames;\n onEventClick?: (eventId: string) => void;\n canOpenEvent: (entry: TranscriptEntry) => boolean;\n getToolGroupSummary: (entries: TranscriptEntry[]) => string;\n renderInlinePendingIndicator: () => ReactNode;\n renderToolItemIcon: (entry: TranscriptEntry) => ReactNode;\n renderToolGroupIcon: (entries: TranscriptEntry[], expanded: boolean) => ReactNode;\n renderChevron: (expanded: boolean) => ReactNode;\n renderEventLinkContent: (entry: TranscriptEntry) => ReactNode;\n}) => {\n const hasFailed = entries.some((entry) => entry.kind === \"tool\" && entry.toolStatus === \"failed\");\n\n if (entries.length === 1) {\n return (\n <div className={classNames.toolGroupSingle} data-slot=\"tool-group-single\">\n <ToolItem\n entry={entries[0]}\n isLast={true}\n expanded={Boolean(expandedItemIds[entries[0]!.id])}\n onExpandedChange={(nextExpanded) => onToolItemExpandedChange(entries[0]!.id, nextExpanded)}\n classNames={classNames}\n onEventClick={onEventClick}\n canOpenEvent={canOpenEvent}\n renderInlinePendingIndicator={renderInlinePendingIndicator}\n renderToolItemIcon={renderToolItemIcon}\n renderChevron={renderChevron}\n renderEventLinkContent={renderEventLinkContent}\n />\n </div>\n );\n }\n\n return (\n <div className={cx(classNames.toolGroupContainer, hasFailed && \"failed\")} data-slot=\"tool-group\" data-failed={hasFailed ? \"true\" : undefined}>\n <button\n type=\"button\"\n className={cx(classNames.toolGroupHeader, expanded && \"expanded\")}\n data-slot=\"tool-group-header\"\n data-expanded={expanded ? \"true\" : undefined}\n onClick={() => onExpandedChange(!expanded)}\n >\n <span className={classNames.toolGroupIcon} data-slot=\"tool-group-icon\">\n {renderToolGroupIcon(entries, expanded)}\n </span>\n <span className={classNames.toolGroupLabel} data-slot=\"tool-group-label\">\n {getToolGroupSummary(entries)}\n </span>\n <span className={classNames.toolGroupChevron} data-slot=\"tool-group-chevron\">\n {renderChevron(expanded)}\n </span>\n </button>\n {expanded ? (\n <div className={classNames.toolGroupBody} data-slot=\"tool-group-body\">\n {entries.map((entry, index) => (\n <ToolItem\n key={entry.id}\n entry={entry}\n isLast={index === entries.length - 1}\n expanded={Boolean(expandedItemIds[entry.id])}\n onExpandedChange={(nextExpanded) => onToolItemExpandedChange(entry.id, nextExpanded)}\n classNames={classNames}\n onEventClick={onEventClick}\n canOpenEvent={canOpenEvent}\n renderInlinePendingIndicator={renderInlinePendingIndicator}\n renderToolItemIcon={renderToolItemIcon}\n renderChevron={renderChevron}\n renderEventLinkContent={renderEventLinkContent}\n />\n ))}\n </div>\n ) : null}\n </div>\n );\n};\n\nconst PermissionPrompt = ({\n entry,\n classNames,\n onPermissionReply,\n renderPermissionIcon,\n renderPermissionOptionContent,\n}: {\n entry: TranscriptEntry;\n classNames: AgentTranscriptClassNames;\n onPermissionReply?: (permissionId: string, reply: PermissionReply) => void;\n renderPermissionIcon: (entry: TranscriptEntry) => ReactNode;\n renderPermissionOptionContent: (context: PermissionOptionRenderContext) => ReactNode;\n}) => {\n const permission = entry.permission;\n if (!permission) {\n return null;\n }\n\n const resolved = Boolean(permission.resolved);\n const selectedOptionId = permission.selectedOptionId;\n const canReply = Boolean(onPermissionReply) && !resolved;\n\n return (\n <div className={cx(classNames.permissionPrompt, resolved && \"resolved\")} data-slot=\"permission-prompt\" data-resolved={resolved ? \"true\" : undefined}>\n <div className={classNames.permissionHeader} data-slot=\"permission-header\">\n <span className={classNames.permissionIcon} data-slot=\"permission-icon\">\n {renderPermissionIcon(entry)}\n </span>\n <span className={classNames.permissionTitle} data-slot=\"permission-title\">\n {permission.title}\n </span>\n </div>\n {permission.description ? (\n <div className={classNames.permissionDescription} data-slot=\"permission-description\">\n {permission.description}\n </div>\n ) : null}\n <div className={classNames.permissionActions} data-slot=\"permission-actions\">\n {permission.options.map((option) => {\n const reply = getPermissionReplyForOption(option.kind);\n const label = getPermissionOptionLabel(option);\n const selected = resolved && selectedOptionId === option.optionId;\n const dimmed = resolved && !selected && selectedOptionId != null;\n const tone = getPermissionOptionTone(option.kind);\n\n return (\n <button\n key={option.optionId}\n type=\"button\"\n className={cx(classNames.permissionButton, tone, selected && \"selected\", dimmed && \"dimmed\")}\n data-slot=\"permission-button\"\n data-tone={tone}\n data-selected={selected ? \"true\" : undefined}\n data-dimmed={dimmed ? \"true\" : undefined}\n disabled={!canReply}\n onClick={() => onPermissionReply?.(permission.permissionId, reply)}\n >\n {renderPermissionOptionContent({\n entry,\n option,\n label,\n reply,\n selected,\n dimmed,\n resolved,\n })}\n </button>\n );\n })}\n {resolved && !selectedOptionId ? (\n <span className={classNames.permissionAutoResolved} data-slot=\"permission-auto-resolved\">\n Auto-resolved\n </span>\n ) : null}\n </div>\n </div>\n );\n};\n\nexport const AgentTranscript = ({\n entries,\n className,\n classNames: classNameOverrides,\n endRef,\n scrollRef,\n scrollToEntryId,\n sessionError,\n eventError,\n isThinking,\n agentId,\n virtualize = false,\n onAtBottomChange,\n onEventClick,\n onPermissionReply,\n isDividerEntry = defaultIsDividerEntry,\n canOpenEvent = defaultCanOpenEvent,\n getToolGroupSummary = getDefaultToolGroupSummary,\n renderMessageText = defaultRenderMessageText,\n renderInlinePendingIndicator = defaultRenderPendingIndicator,\n renderThinkingState,\n renderToolItemIcon = getDefaultToolItemIcon,\n renderToolGroupIcon = () => null,\n renderChevron = defaultRenderChevron,\n renderEventLinkContent = defaultRenderEventLinkContent,\n renderPermissionIcon = defaultRenderPermissionIcon,\n renderPermissionOptionContent = defaultRenderPermissionOptionContent,\n}: AgentTranscriptProps) => {\n const resolvedClassNames = useMemo(() => mergeClassNames(DEFAULT_CLASS_NAMES, classNameOverrides), [classNameOverrides]);\n const groupedEntries = useMemo(() => buildGroupedEntries(entries, isDividerEntry), [entries, isDividerEntry]);\n const [expandedToolGroups, setExpandedToolGroups] = useState<Record<string, boolean>>({});\n const [expandedToolItems, setExpandedToolItems] = useState<Record<string, boolean>>({});\n const lastScrollTargetRef = useRef<string | null>(null);\n const isVirtualized = virtualize && Boolean(scrollRef);\n const { virtualizer, isFollowingRef } = useTranscriptVirtualizer(groupedEntries, isVirtualized ? scrollRef : undefined, onAtBottomChange);\n\n useEffect(() => {\n if (!scrollToEntryId) {\n lastScrollTargetRef.current = null;\n return;\n }\n\n if (!isVirtualized || scrollToEntryId === lastScrollTargetRef.current) {\n return;\n }\n\n const targetIndex = groupedEntries.findIndex((group) => group.entries.some((entry) => entry.id === scrollToEntryId));\n if (targetIndex < 0) {\n return;\n }\n\n lastScrollTargetRef.current = scrollToEntryId;\n\n const frameId = requestAnimationFrame(() => {\n virtualizer.scrollToIndex(targetIndex, {\n align: \"center\",\n behavior: \"smooth\",\n });\n });\n\n return () => {\n cancelAnimationFrame(frameId);\n };\n }, [groupedEntries, isVirtualized, scrollToEntryId, virtualizer]);\n\n useEffect(() => {\n if (!isVirtualized || !scrollRef?.current || !isFollowingRef.current) {\n return;\n }\n\n const scrollElement = scrollRef.current;\n const frameId = requestAnimationFrame(() => {\n scrollElement.scrollTo({ top: scrollElement.scrollHeight });\n });\n\n return () => {\n cancelAnimationFrame(frameId);\n };\n }, [eventError, isFollowingRef, isThinking, isVirtualized, scrollRef, sessionError]);\n\n const setToolGroupExpanded = (groupKey: string, expanded: boolean) => {\n setExpandedToolGroups((current) => {\n if (current[groupKey] === expanded) {\n return current;\n }\n return { ...current, [groupKey]: expanded };\n });\n };\n\n const setToolItemExpanded = (entryId: string, expanded: boolean) => {\n setExpandedToolItems((current) => {\n if (current[entryId] === expanded) {\n return current;\n }\n return { ...current, [entryId]: expanded };\n });\n };\n\n const renderGroup = (group: GroupedEntries, index: number) => {\n if (group.type === \"divider\") {\n const entry = group.entries[0];\n const title = entry.meta?.title ?? \"Status\";\n return (\n <div key={entry.id} className={resolvedClassNames.divider} data-slot=\"divider\">\n <div className={resolvedClassNames.dividerLine} data-slot=\"divider-line\" />\n <span className={resolvedClassNames.dividerText} data-slot=\"divider-text\">\n {title}\n </span>\n <div className={resolvedClassNames.dividerLine} data-slot=\"divider-line\" />\n </div>\n );\n }\n\n if (group.type === \"tool-group\") {\n const groupKey = getGroupedEntryKey(group, index);\n\n return (\n <ToolGroup\n key={groupKey}\n entries={group.entries}\n expanded={Boolean(expandedToolGroups[groupKey])}\n onExpandedChange={(expanded) => setToolGroupExpanded(groupKey, expanded)}\n expandedItemIds={expandedToolItems}\n onToolItemExpandedChange={setToolItemExpanded}\n classNames={resolvedClassNames}\n onEventClick={onEventClick}\n canOpenEvent={canOpenEvent}\n getToolGroupSummary={getToolGroupSummary}\n renderInlinePendingIndicator={renderInlinePendingIndicator}\n renderToolItemIcon={renderToolItemIcon}\n renderToolGroupIcon={renderToolGroupIcon}\n renderChevron={renderChevron}\n renderEventLinkContent={renderEventLinkContent}\n />\n );\n }\n\n if (group.type === \"permission\") {\n const entry = group.entries[0];\n return (\n <PermissionPrompt\n key={entry.id}\n entry={entry}\n classNames={resolvedClassNames}\n onPermissionReply={onPermissionReply}\n renderPermissionIcon={renderPermissionIcon}\n renderPermissionOptionContent={renderPermissionOptionContent}\n />\n );\n }\n\n const entry = group.entries[0];\n const messageVariant = getMessageVariant(entry);\n\n return (\n <div\n key={entry.id}\n className={cx(resolvedClassNames.message, messageVariant, \"no-avatar\")}\n data-slot=\"message\"\n data-kind={entry.kind}\n data-role={entry.role}\n data-variant={messageVariant}\n data-severity={entry.meta?.severity}\n >\n <div className={resolvedClassNames.messageContent} data-slot=\"message-content\">\n {entry.text ? (\n <div className={resolvedClassNames.messageText} data-slot=\"message-text\">\n {renderMessageText(entry)}\n </div>\n ) : (\n <span className={resolvedClassNames.thinkingIndicator} data-slot=\"thinking-indicator\">\n {renderInlinePendingIndicator()}\n </span>\n )}\n </div>\n </div>\n );\n };\n\n return (\n <div className={cx(resolvedClassNames.root, className)} data-slot=\"root\" data-virtualized={isVirtualized ? \"true\" : undefined}>\n {isVirtualized ? (\n <div\n data-slot=\"virtual-list\"\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n position: \"relative\",\n width: \"100%\",\n }}\n >\n {virtualizer.getVirtualItems().map((virtualItem) => {\n const group = groupedEntries[virtualItem.index];\n if (!group) {\n return null;\n }\n\n return (\n <div\n key={getGroupedEntryKey(group, virtualItem.index)}\n data-index={virtualItem.index}\n ref={(node) => {\n if (node) {\n virtualizer.measureElement(node);\n }\n }}\n style={{\n left: 0,\n position: \"absolute\",\n top: 0,\n transform: `translateY(${virtualItem.start}px)`,\n width: \"100%\",\n }}\n >\n <div style={{ paddingBottom: virtualItem.index === groupedEntries.length - 1 ? 0 : `${VIRTUAL_GROUP_GAP_PX}px` }}>\n {renderGroup(group, virtualItem.index)}\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n groupedEntries.map((group, index) => renderGroup(group, index))\n )}\n {sessionError ? (\n <div className={resolvedClassNames.error} data-slot=\"error\" data-source=\"session\">\n {sessionError}\n </div>\n ) : null}\n {eventError ? (\n <div className={resolvedClassNames.error} data-slot=\"error\" data-source=\"event\">\n {eventError}\n </div>\n ) : null}\n {isThinking\n ? (renderThinkingState?.({ agentId }) ?? (\n <div className={resolvedClassNames.thinkingRow} data-slot=\"thinking-row\">\n <span className={resolvedClassNames.thinkingIndicator} data-slot=\"thinking-indicator\">\n Thinking...\n </span>\n </div>\n ))\n : null}\n {!isVirtualized ? <div ref={endRef} className={resolvedClassNames.endAnchor} data-slot=\"end-anchor\" /> : null}\n </div>\n );\n};\n","\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { useEffect, useRef } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\n\nexport function useTranscriptVirtualizer<T>(items: T[], scrollElementRef?: RefObject<HTMLDivElement | null>, onAtBottomChange?: (atBottom: boolean) => void) {\n const isFollowingRef = useRef(true);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => scrollElementRef?.current ?? null,\n estimateSize: () => 80,\n measureElement: (element) => element.getBoundingClientRect().height,\n overscan: 10,\n });\n\n virtualizer.shouldAdjustScrollPositionOnItemSizeChange = () => isFollowingRef.current;\n\n useEffect(() => {\n const scrollElement = scrollElementRef?.current;\n if (!scrollElement) {\n return;\n }\n\n const updateFollowState = () => {\n const atBottom = scrollElement.scrollHeight - scrollElement.scrollTop - scrollElement.clientHeight < 50;\n isFollowingRef.current = atBottom;\n onAtBottomChange?.(atBottom);\n };\n\n updateFollowState();\n scrollElement.addEventListener(\"scroll\", updateFollowState, { passive: true });\n\n return () => {\n scrollElement.removeEventListener(\"scroll\", updateFollowState);\n };\n }, [onAtBottomChange, scrollElementRef]);\n\n useEffect(() => {\n if (!isFollowingRef.current || items.length === 0) {\n return;\n }\n\n const frameId = requestAnimationFrame(() => {\n virtualizer.scrollToIndex(items.length - 1, {\n align: \"end\",\n behavior: \"smooth\",\n });\n });\n\n return () => {\n cancelAnimationFrame(frameId);\n };\n }, [items.length, virtualizer]);\n\n return { virtualizer, isFollowingRef };\n}\n","\"use client\";\n\nimport type { KeyboardEvent, ReactNode, Ref, TextareaHTMLAttributes } from \"react\";\n\nexport interface ChatComposerClassNames {\n root: string;\n form: string;\n input: string;\n submit: string;\n submitContent: string;\n}\n\nexport interface ChatComposerProps {\n message: string;\n onMessageChange: (value: string) => void;\n onSubmit: () => void;\n onKeyDown?: (event: KeyboardEvent<HTMLTextAreaElement>) => void;\n placeholder?: string;\n disabled?: boolean;\n submitDisabled?: boolean;\n allowEmptySubmit?: boolean;\n submitLabel?: string;\n className?: string;\n classNames?: Partial<ChatComposerClassNames>;\n inputRef?: Ref<HTMLTextAreaElement>;\n rows?: number;\n textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"className\" | \"disabled\" | \"onChange\" | \"onKeyDown\" | \"placeholder\" | \"rows\" | \"value\">;\n renderSubmitContent?: () => ReactNode;\n renderFooter?: () => ReactNode;\n}\n\nconst DEFAULT_CLASS_NAMES: ChatComposerClassNames = {\n root: \"sa-chat-composer\",\n form: \"sa-chat-composer-form\",\n input: \"sa-chat-composer-input\",\n submit: \"sa-chat-composer-submit\",\n submitContent: \"sa-chat-composer-submit-content\",\n};\n\nconst cx = (...values: Array<string | false | null | undefined>) => values.filter(Boolean).join(\" \");\n\nconst mergeClassNames = (defaults: ChatComposerClassNames, overrides?: Partial<ChatComposerClassNames>): ChatComposerClassNames => ({\n root: cx(defaults.root, overrides?.root),\n form: cx(defaults.form, overrides?.form),\n input: cx(defaults.input, overrides?.input),\n submit: cx(defaults.submit, overrides?.submit),\n submitContent: cx(defaults.submitContent, overrides?.submitContent),\n});\n\nexport const ChatComposer = ({\n message,\n onMessageChange,\n onSubmit,\n onKeyDown,\n placeholder,\n disabled = false,\n submitDisabled = false,\n allowEmptySubmit = false,\n submitLabel = \"Send\",\n className,\n classNames: classNameOverrides,\n inputRef,\n rows = 1,\n textareaProps,\n renderSubmitContent,\n renderFooter,\n}: ChatComposerProps) => {\n const resolvedClassNames = mergeClassNames(DEFAULT_CLASS_NAMES, classNameOverrides);\n const isSubmitDisabled = disabled || submitDisabled || (!allowEmptySubmit && message.trim().length === 0);\n\n return (\n <div className={cx(resolvedClassNames.root, className)} data-slot=\"root\">\n <form\n className={resolvedClassNames.form}\n data-slot=\"form\"\n onSubmit={(event) => {\n event.preventDefault();\n if (!isSubmitDisabled) {\n onSubmit();\n }\n }}\n >\n <textarea\n {...textareaProps}\n ref={inputRef}\n className={resolvedClassNames.input}\n data-slot=\"input\"\n data-disabled={disabled ? \"true\" : undefined}\n data-empty={message.trim().length === 0 ? \"true\" : undefined}\n value={message}\n onChange={(event) => onMessageChange(event.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n rows={rows}\n disabled={disabled}\n />\n {renderFooter?.()}\n <button\n type=\"submit\"\n className={resolvedClassNames.submit}\n data-slot=\"submit\"\n data-disabled={isSubmitDisabled ? \"true\" : undefined}\n disabled={isSubmitDisabled}\n aria-label={submitLabel}\n title={submitLabel}\n >\n <span className={resolvedClassNames.submitContent} data-slot=\"submit-content\">\n {renderSubmitContent?.() ?? submitLabel}\n </span>\n </button>\n </form>\n </div>\n );\n};\n","\"use client\";\n\nimport type { ReactNode, RefObject } from \"react\";\nimport { AgentTranscript, type AgentTranscriptClassNames, type AgentTranscriptProps, type TranscriptEntry } from \"./AgentTranscript.tsx\";\nimport { ChatComposer, type ChatComposerClassNames, type ChatComposerProps } from \"./ChatComposer.tsx\";\n\nexport interface AgentConversationClassNames {\n root: string;\n transcript: string;\n emptyState: string;\n composer: string;\n}\n\nexport interface AgentConversationProps {\n entries: TranscriptEntry[];\n className?: string;\n classNames?: Partial<AgentConversationClassNames>;\n emptyState?: ReactNode;\n transcriptClassName?: string;\n transcriptClassNames?: Partial<AgentTranscriptClassNames>;\n scrollRef?: RefObject<HTMLDivElement | null>;\n composerClassName?: string;\n composerClassNames?: Partial<ChatComposerClassNames>;\n transcriptProps?: Omit<AgentTranscriptProps, \"entries\" | \"className\" | \"classNames\" | \"scrollRef\">;\n composerProps?: Omit<ChatComposerProps, \"className\" | \"classNames\">;\n}\n\nconst DEFAULT_CLASS_NAMES: AgentConversationClassNames = {\n root: \"sa-agent-conversation\",\n transcript: \"sa-agent-conversation-transcript\",\n emptyState: \"sa-agent-conversation-empty-state\",\n composer: \"sa-agent-conversation-composer\",\n};\n\nconst cx = (...values: Array<string | false | null | undefined>) => values.filter(Boolean).join(\" \");\n\nconst mergeClassNames = (defaults: AgentConversationClassNames, overrides?: Partial<AgentConversationClassNames>): AgentConversationClassNames => ({\n root: cx(defaults.root, overrides?.root),\n transcript: cx(defaults.transcript, overrides?.transcript),\n emptyState: cx(defaults.emptyState, overrides?.emptyState),\n composer: cx(defaults.composer, overrides?.composer),\n});\n\nexport const AgentConversation = ({\n entries,\n className,\n classNames: classNameOverrides,\n emptyState,\n transcriptClassName,\n transcriptClassNames,\n scrollRef,\n composerClassName,\n composerClassNames,\n transcriptProps,\n composerProps,\n}: AgentConversationProps) => {\n const resolvedClassNames = mergeClassNames(DEFAULT_CLASS_NAMES, classNameOverrides);\n const hasTranscriptContent = entries.length > 0 || Boolean(transcriptProps?.sessionError) || Boolean(transcriptProps?.eventError);\n\n return (\n <div className={cx(resolvedClassNames.root, className)} data-slot=\"root\">\n {hasTranscriptContent ? (\n scrollRef ? (\n <div className={cx(resolvedClassNames.transcript, transcriptClassName)} data-slot=\"transcript\" ref={scrollRef}>\n <AgentTranscript entries={entries} classNames={transcriptClassNames} {...transcriptProps} />\n </div>\n ) : (\n <AgentTranscript\n entries={entries}\n className={cx(resolvedClassNames.transcript, transcriptClassName)}\n classNames={transcriptClassNames}\n {...transcriptProps}\n />\n )\n ) : emptyState ? (\n <div className={resolvedClassNames.emptyState} data-slot=\"empty-state\">\n {emptyState}\n </div>\n ) : null}\n {composerProps ? (\n <ChatComposer className={cx(resolvedClassNames.composer, composerClassName)} classNames={composerClassNames} {...composerProps} />\n ) : null}\n </div>\n );\n};\n","\"use client\";\n\nimport type { CSSProperties, MouseEvent, WheelEvent } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { DesktopMouseButton, DesktopStreamErrorStatus, DesktopStreamReadyStatus, SandboxAgent } from \"sandbox-agent\";\n\ntype ConnectionState = \"connecting\" | \"ready\" | \"closed\" | \"error\";\n\nexport type DesktopViewerClient = Pick<SandboxAgent, \"connectDesktopStream\">;\n\nexport interface DesktopViewerProps {\n client: DesktopViewerClient;\n className?: string;\n style?: CSSProperties;\n imageStyle?: CSSProperties;\n height?: number | string;\n showStatusBar?: boolean;\n onConnect?: (status: DesktopStreamReadyStatus) => void;\n onDisconnect?: () => void;\n onError?: (error: DesktopStreamErrorStatus | Error) => void;\n}\n\nconst shellStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n border: \"1px solid rgba(15, 23, 42, 0.14)\",\n borderRadius: 14,\n background: \"linear-gradient(180deg, rgba(248, 250, 252, 0.96) 0%, rgba(226, 232, 240, 0.92) 100%)\",\n boxShadow: \"0 20px 40px rgba(15, 23, 42, 0.08)\",\n};\n\nconst statusBarStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n padding: \"10px 14px\",\n borderBottom: \"1px solid rgba(15, 23, 42, 0.08)\",\n background: \"rgba(255, 255, 255, 0.78)\",\n color: \"#0f172a\",\n fontSize: 12,\n lineHeight: 1.4,\n};\n\nconst viewportStyle: CSSProperties = {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n background: \"radial-gradient(circle at top, rgba(14, 165, 233, 0.18), transparent 45%), linear-gradient(180deg, #0f172a 0%, #111827 100%)\",\n};\n\nconst videoBaseStyle: CSSProperties = {\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n userSelect: \"none\",\n};\n\nconst hintStyle: CSSProperties = {\n opacity: 0.66,\n};\n\nconst getStatusColor = (state: ConnectionState): string => {\n switch (state) {\n case \"ready\":\n return \"#15803d\";\n case \"error\":\n return \"#b91c1c\";\n case \"closed\":\n return \"#b45309\";\n default:\n return \"#475569\";\n }\n};\n\nexport const DesktopViewer = ({\n client,\n className,\n style,\n imageStyle,\n height = 480,\n showStatusBar = true,\n onConnect,\n onDisconnect,\n onError,\n}: DesktopViewerProps) => {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const sessionRef = useRef<ReturnType<DesktopViewerClient[\"connectDesktopStream\"]> | null>(null);\n const [connectionState, setConnectionState] = useState<ConnectionState>(\"connecting\");\n const [statusMessage, setStatusMessage] = useState(\"Starting desktop stream...\");\n const [hasVideo, setHasVideo] = useState(false);\n const [resolution, setResolution] = useState<{ width: number; height: number } | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n setConnectionState(\"connecting\");\n setStatusMessage(\"Connecting to desktop stream...\");\n setResolution(null);\n setHasVideo(false);\n\n const session = client.connectDesktopStream();\n sessionRef.current = session;\n\n session.onReady((status) => {\n if (cancelled) return;\n setConnectionState(\"ready\");\n setStatusMessage(\"Desktop stream connected.\");\n setResolution({ width: status.width, height: status.height });\n onConnect?.(status);\n });\n session.onTrack((stream) => {\n if (cancelled) return;\n const video = videoRef.current;\n if (video) {\n video.srcObject = stream;\n void video.play().catch(() => undefined);\n setHasVideo(true);\n }\n });\n session.onError((error) => {\n if (cancelled) return;\n setConnectionState(\"error\");\n setStatusMessage(error instanceof Error ? error.message : error.message);\n onError?.(error);\n });\n session.onDisconnect(() => {\n if (cancelled) return;\n setConnectionState((current) => (current === \"error\" ? current : \"closed\"));\n setStatusMessage((current) => (current === \"Desktop stream connected.\" ? \"Desktop stream disconnected.\" : current));\n onDisconnect?.();\n });\n\n return () => {\n cancelled = true;\n session.close();\n sessionRef.current = null;\n const video = videoRef.current;\n if (video) {\n video.srcObject = null;\n }\n setHasVideo(false);\n };\n }, [client, onConnect, onDisconnect, onError]);\n\n const scalePoint = (clientX: number, clientY: number) => {\n const video = videoRef.current;\n if (!video || !resolution) {\n return null;\n }\n const rect = video.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n return null;\n }\n // The video uses objectFit: \"contain\", so we need to compute the actual\n // rendered content area within the <video> element to map coordinates\n // accurately (ignoring letterbox bars).\n const videoAspect = resolution.width / resolution.height;\n const elemAspect = rect.width / rect.height;\n let renderW: number;\n let renderH: number;\n if (elemAspect > videoAspect) {\n // Pillarboxed (black bars on left/right)\n renderH = rect.height;\n renderW = rect.height * videoAspect;\n } else {\n // Letterboxed (black bars on top/bottom)\n renderW = rect.width;\n renderH = rect.width / videoAspect;\n }\n const offsetX = (rect.width - renderW) / 2;\n const offsetY = (rect.height - renderH) / 2;\n const relX = clientX - rect.left - offsetX;\n const relY = clientY - rect.top - offsetY;\n const x = Math.max(0, Math.min(resolution.width, (relX / renderW) * resolution.width));\n const y = Math.max(0, Math.min(resolution.height, (relY / renderH) * resolution.height));\n return {\n x: Math.round(x),\n y: Math.round(y),\n };\n };\n\n const buttonFromMouseEvent = (event: MouseEvent<HTMLDivElement>): DesktopMouseButton => {\n switch (event.button) {\n case 1:\n return \"middle\";\n case 2:\n return \"right\";\n default:\n return \"left\";\n }\n };\n\n const withSession = (callback: (session: NonNullable<ReturnType<DesktopViewerClient[\"connectDesktopStream\"]>>) => void) => {\n const session = sessionRef.current;\n if (session) {\n callback(session);\n }\n };\n\n return (\n <div className={className} style={{ ...shellStyle, ...style }}>\n {showStatusBar ? (\n <div style={statusBarStyle}>\n <span style={{ color: getStatusColor(connectionState) }}>{statusMessage}</span>\n <span style={hintStyle}>{resolution ? `${resolution.width}×${resolution.height}` : \"Awaiting stream\"}</span>\n </div>\n ) : null}\n <div\n ref={wrapperRef}\n role=\"button\"\n tabIndex={0}\n style={{ ...viewportStyle, height }}\n onMouseMove={(event) => {\n const point = scalePoint(event.clientX, event.clientY);\n if (!point) {\n return;\n }\n withSession((session) => session.moveMouse(point.x, point.y));\n }}\n onContextMenu={(event) => {\n event.preventDefault();\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n // preventDefault on mousedown suppresses the default focus behavior,\n // so we must explicitly focus the wrapper to receive keyboard events.\n wrapperRef.current?.focus();\n const point = scalePoint(event.clientX, event.clientY);\n withSession((session) => session.mouseDown(buttonFromMouseEvent(event), point?.x, point?.y));\n }}\n onMouseUp={(event) => {\n const point = scalePoint(event.clientX, event.clientY);\n withSession((session) => session.mouseUp(buttonFromMouseEvent(event), point?.x, point?.y));\n }}\n onWheel={(event: WheelEvent<HTMLDivElement>) => {\n event.preventDefault();\n const point = scalePoint(event.clientX, event.clientY);\n if (!point) {\n return;\n }\n withSession((session) => session.scroll(point.x, point.y, Math.round(event.deltaX), Math.round(event.deltaY)));\n }}\n onKeyDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n withSession((session) => session.keyDown(event.key));\n }}\n onKeyUp={(event) => {\n event.preventDefault();\n event.stopPropagation();\n withSession((session) => session.keyUp(event.key));\n }}\n >\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n tabIndex={-1}\n draggable={false}\n style={{ ...videoBaseStyle, ...imageStyle, display: hasVideo ? \"block\" : \"none\", pointerEvents: \"none\" }}\n />\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport type { FitAddon as GhosttyFitAddon, Terminal as GhosttyTerminal } from \"ghostty-web\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type {\n SandboxAgent,\n TerminalErrorStatus,\n TerminalExitStatus,\n TerminalReadyStatus,\n} from \"sandbox-agent\";\n\ntype ConnectionState = \"connecting\" | \"ready\" | \"closed\" | \"error\";\n\nexport type ProcessTerminalClient = Pick<SandboxAgent, \"connectProcessTerminal\">;\n\nexport interface ProcessTerminalProps {\n client: ProcessTerminalClient;\n processId: string;\n className?: string;\n style?: CSSProperties;\n terminalStyle?: CSSProperties;\n statusBarStyleOverride?: CSSProperties;\n height?: number | string;\n showStatusBar?: boolean;\n onExit?: (status: TerminalExitStatus) => void;\n onError?: (error: TerminalErrorStatus | Error) => void;\n}\n\nconst terminalTheme = {\n background: \"#09090b\",\n foreground: \"#f4f4f5\",\n cursor: \"#f97316\",\n cursorAccent: \"#09090b\",\n selectionBackground: \"#27272a\",\n black: \"#18181b\",\n red: \"#f87171\",\n green: \"#4ade80\",\n yellow: \"#fbbf24\",\n blue: \"#60a5fa\",\n magenta: \"#f472b6\",\n cyan: \"#22d3ee\",\n white: \"#e4e4e7\",\n brightBlack: \"#3f3f46\",\n brightRed: \"#fb7185\",\n brightGreen: \"#86efac\",\n brightYellow: \"#fde047\",\n brightBlue: \"#93c5fd\",\n brightMagenta: \"#f9a8d4\",\n brightCyan: \"#67e8f9\",\n brightWhite: \"#fafafa\",\n};\n\nconst shellStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n borderRadius: 10,\n background: \"rgba(0, 0, 0, 0.3)\",\n};\n\nconst statusBarStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n padding: \"8px 12px\",\n borderBottom: \"1px solid rgba(255, 255, 255, 0.08)\",\n background: \"rgba(0, 0, 0, 0.2)\",\n color: \"rgba(244, 244, 245, 0.86)\",\n fontSize: 11,\n lineHeight: 1.4,\n};\n\nconst hostBaseStyle: CSSProperties = {\n minHeight: 320,\n padding: 10,\n overflow: \"hidden\",\n};\n\nconst exitCodeStyle: CSSProperties = {\n fontFamily: \"ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace\",\n opacity: 0.72,\n};\n\nconst getStatusColor = (state: ConnectionState): string => {\n switch (state) {\n case \"ready\":\n return \"#4ade80\";\n case \"error\":\n return \"#fb7185\";\n case \"closed\":\n return \"#fbbf24\";\n default:\n return \"rgba(244, 244, 245, 0.72)\";\n }\n};\n\nexport const ProcessTerminal = ({\n client,\n processId,\n className,\n style,\n terminalStyle,\n statusBarStyleOverride,\n height = 360,\n showStatusBar = true,\n onExit,\n onError,\n}: ProcessTerminalProps) => {\n const hostRef = useRef<HTMLDivElement | null>(null);\n const [connectionState, setConnectionState] = useState<ConnectionState>(\"connecting\");\n const [statusMessage, setStatusMessage] = useState(\"Connecting to PTY...\");\n const [exitCode, setExitCode] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n let terminal: GhosttyTerminal | null = null;\n let fitAddon: GhosttyFitAddon | null = null;\n let session: ReturnType<ProcessTerminalClient[\"connectProcessTerminal\"]> | null = null;\n let resizeRaf = 0;\n let removeDataListener: { dispose(): void } | null = null;\n let removeResizeListener: { dispose(): void } | null = null;\n\n setConnectionState(\"connecting\");\n setStatusMessage(\"Connecting to PTY...\");\n setExitCode(null);\n\n const syncSize = () => {\n if (!terminal || !session) {\n return;\n }\n\n session.resize({\n cols: terminal.cols,\n rows: terminal.rows,\n });\n };\n\n const connect = async () => {\n try {\n const ghostty = await import(\"ghostty-web\");\n await ghostty.init();\n\n if (cancelled || !hostRef.current) {\n return;\n }\n\n terminal = new ghostty.Terminal({\n allowTransparency: true,\n cursorBlink: true,\n cursorStyle: \"block\",\n fontFamily: \"ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace\",\n fontSize: 13,\n smoothScrollDuration: 90,\n theme: terminalTheme,\n });\n fitAddon = new ghostty.FitAddon();\n\n terminal.open(hostRef.current);\n const terminalRoot = hostRef.current.firstElementChild;\n if (terminalRoot instanceof HTMLElement) {\n terminalRoot.style.width = \"100%\";\n terminalRoot.style.height = \"100%\";\n }\n terminal.loadAddon(fitAddon);\n fitAddon.fit();\n fitAddon.observeResize();\n terminal.focus();\n\n removeDataListener = terminal.onData((data) => {\n session?.sendInput(data);\n });\n\n removeResizeListener = terminal.onResize(() => {\n if (resizeRaf) {\n window.cancelAnimationFrame(resizeRaf);\n }\n resizeRaf = window.requestAnimationFrame(syncSize);\n });\n\n const nextSession = client.connectProcessTerminal(processId);\n session = nextSession;\n\n nextSession.onReady((frame: TerminalReadyStatus) => {\n if (cancelled || frame.type !== \"ready\") {\n return;\n }\n\n setConnectionState(\"ready\");\n setStatusMessage(\"Connected\");\n syncSize();\n });\n\n nextSession.onData((bytes: Uint8Array) => {\n if (cancelled || !terminal) {\n return;\n }\n terminal.write(bytes);\n });\n\n nextSession.onExit((frame: TerminalExitStatus) => {\n if (cancelled || frame.type !== \"exit\") {\n return;\n }\n\n setConnectionState(\"closed\");\n setExitCode(frame.exitCode ?? null);\n setStatusMessage(frame.exitCode == null ? \"Process exited.\" : `Process exited with code ${frame.exitCode}.`);\n onExit?.(frame);\n });\n\n nextSession.onError((error: TerminalErrorStatus | Error) => {\n if (cancelled) {\n return;\n }\n\n setConnectionState(\"error\");\n setStatusMessage(error instanceof Error ? error.message : error.message);\n onError?.(error);\n });\n\n nextSession.onClose(() => {\n if (cancelled) {\n return;\n }\n\n setConnectionState((current) => (current === \"error\" ? current : \"closed\"));\n setStatusMessage((current) => (current === \"Connected\" ? \"Terminal disconnected.\" : current));\n });\n } catch (error) {\n if (cancelled) {\n return;\n }\n\n const nextError = error instanceof Error ? error : new Error(\"Failed to initialize terminal.\");\n setConnectionState(\"error\");\n setStatusMessage(nextError.message);\n onError?.(nextError);\n }\n };\n\n void connect();\n\n return () => {\n cancelled = true;\n if (resizeRaf) {\n window.cancelAnimationFrame(resizeRaf);\n }\n removeDataListener?.dispose();\n removeResizeListener?.dispose();\n session?.close();\n terminal?.dispose();\n };\n }, [client, onError, onExit, processId]);\n\n return (\n <div className={className} style={{ ...shellStyle, ...style }}>\n {showStatusBar ? (\n <div style={{ ...statusBarStyle, ...statusBarStyleOverride }}>\n <span style={{ color: getStatusColor(connectionState) }}>{statusMessage}</span>\n {exitCode != null ? <span style={exitCodeStyle}>exit={exitCode}</span> : null}\n </div>\n ) : null}\n <div\n ref={hostRef}\n role=\"presentation\"\n style={{\n ...hostBaseStyle,\n height,\n ...terminalStyle,\n }}\n onClick={() => {\n hostRef.current?.querySelector(\"textarea\")?.focus();\n }}\n />\n </div>\n );\n};\n"],"mappings":"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","names":["useEffect","useRef","useRef","useEffect","entry","jsx","jsxs","DEFAULT_CLASS_NAMES","cx","mergeClassNames","jsx","jsxs","DEFAULT_CLASS_NAMES","cx","mergeClassNames","useEffect","useRef","useState","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","shellStyle","statusBarStyle","getStatusColor"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sandbox-agent/react",
3
- "version": "0.4.0",
3
+ "version": "0.5.0-rc.1",
4
4
  "description": "React components for Sandbox Agent frontend integrations",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -32,7 +32,7 @@
32
32
  "react": "^19.1.1",
33
33
  "tsup": "^8.0.0",
34
34
  "typescript": "^5.7.0",
35
- "sandbox-agent": "0.4.0"
35
+ "sandbox-agent": "0.5.0-rc.1"
36
36
  },
37
37
  "scripts": {
38
38
  "build": "tsup",