@autobe/ui 0.29.2 → 0.30.0-dev.20260315
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/LICENSE +661 -661
- package/README.md +261 -0
- package/lib/components/AutoBeChatMain.js +5 -5
- package/lib/components/AutoBeChatMain.js.map +1 -1
- package/lib/components/AutoBeConfigModal.js +9 -9
- package/lib/components/AutoBeStatusModal.js +4 -4
- package/lib/components/AutoBeStatusModal.js.map +1 -1
- package/lib/components/AutoBeUserMessageMovie.d.ts +2 -2
- package/lib/components/common/ChatBubble.d.ts +2 -2
- package/lib/components/common/openai/OpenAIContent.d.ts +2 -2
- package/lib/components/common/openai/OpenAIContent.js.map +1 -1
- package/lib/components/common/openai/OpenAIUserAudioContent.js +1 -1
- package/lib/components/common/openai/OpenAIUserAudioContent.js.map +1 -1
- package/lib/components/common/openai/OpenAIUserFileContent.js +1 -1
- package/lib/components/common/openai/OpenAIUserFileContent.js.map +1 -1
- package/lib/components/common/openai/OpenAIUserImageContent.d.ts +2 -2
- package/lib/components/events/AutoBeCompleteEventMovie.d.ts +2 -2
- package/lib/components/events/AutoBeCompleteEventMovie.js +5 -5
- package/lib/components/events/AutoBeCompleteEventMovie.js.map +1 -1
- package/lib/components/events/AutoBeCorrectEventMovie.d.ts +2 -2
- package/lib/components/events/AutoBeCorrectEventMovie.js +4 -4
- package/lib/components/events/AutoBeCorrectEventMovie.js.map +1 -1
- package/lib/components/events/AutoBeEventMovie.js +38 -17
- package/lib/components/events/AutoBeEventMovie.js.map +1 -1
- package/lib/components/events/AutoBeProgressEventMovie.js +73 -13
- package/lib/components/events/AutoBeProgressEventMovie.js.map +1 -1
- package/lib/components/events/AutoBeScenarioEventMovie.d.ts +2 -2
- package/lib/components/events/AutoBeScenarioEventMovie.js +18 -5
- package/lib/components/events/AutoBeScenarioEventMovie.js.map +1 -1
- package/lib/components/events/AutoBeStartEventMovie.d.ts +2 -2
- package/lib/components/events/AutoBeStartEventMovie.js +2 -2
- package/lib/components/events/AutoBeStartEventMovie.js.map +1 -1
- package/lib/components/events/AutoBeValidateEventMovie.d.ts +2 -2
- package/lib/components/events/AutoBeValidateEventMovie.js +3 -11
- package/lib/components/events/AutoBeValidateEventMovie.js.map +1 -1
- package/lib/components/events/groups/CorrectEventGroup.d.ts +2 -2
- package/lib/components/events/groups/CorrectEventGroup.js +1 -1
- package/lib/components/events/groups/CorrectEventGroup.js.map +1 -1
- package/lib/components/events/groups/ValidateEventGroup.d.ts +2 -2
- package/lib/components/events/groups/ValidateEventGroup.js +1 -2
- package/lib/components/events/groups/ValidateEventGroup.js.map +1 -1
- package/lib/components/events/utils/eventGrouper.js +1 -2
- package/lib/components/events/utils/eventGrouper.js.map +1 -1
- package/lib/components/upload/AutoBeChatUploadBox.d.ts +3 -4
- package/lib/components/upload/AutoBeChatUploadBox.js +2 -1
- package/lib/components/upload/AutoBeChatUploadBox.js.map +1 -1
- package/lib/components/upload/AutoBeChatUploadSendButton.js +1 -1
- package/lib/components/upload/AutoBeChatUploadSendButton.js.map +1 -1
- package/lib/context/AutoBeAgentContext.d.ts +1 -3
- package/lib/context/AutoBeAgentContext.js +0 -4
- package/lib/context/AutoBeAgentContext.js.map +1 -1
- package/lib/hooks/useSessionStorage.d.ts +4 -0
- package/lib/hooks/useSessionStorage.js +16 -0
- package/lib/hooks/useSessionStorage.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/strategy/AutoBeAgentSessionStorageStrategy.d.ts +10 -0
- package/lib/strategy/AutoBeAgentSessionStorageStrategy.js +117 -0
- package/lib/strategy/AutoBeAgentSessionStorageStrategy.js.map +1 -0
- package/lib/structure/AutoBeListener.js +91 -23
- package/lib/structure/AutoBeListener.js.map +1 -1
- package/lib/structure/AutoBeListenerState.d.ts +3 -3
- package/lib/structure/AutoBeListenerState.js +4 -4
- package/lib/structure/AutoBeListenerState.js.map +1 -1
- package/lib/structure/IAutoBeAgentSessionStorageStrategy.js +1 -1
- package/lib/structure/IAutoBeAgentSessionStorageStrategy.js.map +1 -1
- package/lib/utils/AutoBeFileUploader.d.ts +2 -2
- package/lib/utils/AutoBeFileUploader.js.map +1 -1
- package/package.json +3 -4
- package/src/components/AutoBeAssistantMessageMovie.tsx +22 -22
- package/src/components/AutoBeChatMain.tsx +376 -376
- package/src/components/AutoBeChatSidebar.tsx +414 -414
- package/src/components/AutoBeConfigButton.tsx +83 -83
- package/src/components/AutoBeConfigModal.tsx +443 -443
- package/src/components/AutoBeStatusButton.tsx +75 -75
- package/src/components/AutoBeStatusModal.tsx +486 -484
- package/src/components/AutoBeUserMessageMovie.tsx +27 -27
- package/src/components/common/ActionButton.tsx +205 -205
- package/src/components/common/ActionButtonGroup.tsx +80 -80
- package/src/components/common/AutoBeConfigInput.tsx +185 -185
- package/src/components/common/ChatBubble.tsx +119 -119
- package/src/components/common/Collapsible.tsx +95 -95
- package/src/components/common/CompactSessionIndicator.tsx +73 -73
- package/src/components/common/CompactSessionList.tsx +82 -82
- package/src/components/common/index.ts +8 -8
- package/src/components/common/openai/OpenAIContent.tsx +53 -53
- package/src/components/common/openai/OpenAIUserAudioContent.tsx +70 -70
- package/src/components/common/openai/OpenAIUserFileContent.tsx +76 -76
- package/src/components/common/openai/OpenAIUserImageContent.tsx +34 -34
- package/src/components/common/openai/OpenAIUserTextContent.tsx +15 -15
- package/src/components/common/openai/index.ts +5 -5
- package/src/components/events/AutoBeCompleteEventMovie.tsx +402 -402
- package/src/components/events/AutoBeCorrectEventMovie.tsx +354 -368
- package/src/components/events/AutoBeEventGroupMovie.tsx +18 -18
- package/src/components/events/AutoBeEventMovie.tsx +158 -139
- package/src/components/events/AutoBeProgressEventMovie.tsx +217 -157
- package/src/components/events/AutoBeScenarioEventMovie.tsx +135 -95
- package/src/components/events/AutoBeStartEventMovie.tsx +82 -82
- package/src/components/events/AutoBeValidateEventMovie.tsx +249 -286
- package/src/components/events/README.md +300 -300
- package/src/components/events/common/CollapsibleEventGroup.tsx +211 -211
- package/src/components/events/common/EventCard.tsx +61 -61
- package/src/components/events/common/EventContent.tsx +31 -31
- package/src/components/events/common/EventHeader.tsx +85 -85
- package/src/components/events/common/EventIcon.tsx +82 -82
- package/src/components/events/common/ProgressBar.tsx +64 -64
- package/src/components/events/common/index.ts +13 -13
- package/src/components/events/groups/CorrectEventGroup.tsx +183 -183
- package/src/components/events/groups/ValidateEventGroup.tsx +143 -146
- package/src/components/events/groups/index.ts +8 -8
- package/src/components/events/index.ts +16 -16
- package/src/components/events/utils/eventGrouper.tsx +116 -117
- package/src/components/events/utils/index.ts +1 -1
- package/src/components/index.ts +13 -13
- package/src/components/upload/AutoBeChatUploadBox.tsx +425 -424
- package/src/components/upload/AutoBeChatUploadSendButton.tsx +66 -66
- package/src/components/upload/AutoBeFileUploadBox.tsx +123 -123
- package/src/components/upload/AutoBeUploadConfig.ts +5 -5
- package/src/components/upload/AutoBeVoiceRecoderButton.tsx +100 -100
- package/src/components/upload/index.ts +5 -5
- package/src/constant/color.ts +28 -28
- package/src/context/AutoBeAgentContext.tsx +245 -258
- package/src/context/AutoBeAgentSessionList.tsx +58 -58
- package/src/context/SearchParamsContext.tsx +49 -49
- package/src/hooks/index.ts +3 -3
- package/src/hooks/useEscapeKey.ts +24 -24
- package/src/hooks/useIsomorphicLayoutEffect.ts +8 -8
- package/src/hooks/useMediaQuery.ts +73 -73
- package/src/hooks/useSessionStorage.ts +10 -0
- package/src/icons/Receipt.tsx +74 -74
- package/src/index.ts +9 -8
- package/src/strategy/AutoBeAgentSessionStorageStrategy.ts +127 -0
- package/src/structure/AutoBeListener.ts +373 -304
- package/src/structure/AutoBeListenerState.ts +53 -53
- package/src/structure/IAutoBeAgentSessionStorageStrategy.ts +87 -87
- package/src/structure/IAutoBeEventGroup.ts +6 -6
- package/src/structure/index.ts +4 -4
- package/src/types/config.ts +44 -44
- package/src/types/index.ts +1 -1
- package/src/utils/AutoBeFileUploader.ts +279 -279
- package/src/utils/AutoBeVoiceRecorder.ts +95 -95
- package/src/utils/__tests__/crypto.test.ts +286 -286
- package/src/utils/__tests__/storage.test.ts +229 -229
- package/src/utils/crypto.ts +95 -95
- package/src/utils/index.ts +6 -6
- package/src/utils/number.ts +17 -17
- package/src/utils/storage.ts +96 -96
- package/src/utils/time.ts +14 -14
- package/tsconfig.json +9 -9
- package/vitest.config.ts +15 -15
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
import { ReactNode, useState } from "react";
|
|
2
|
-
|
|
3
|
-
import { COLORS } from "../../constant/color";
|
|
4
|
-
|
|
5
|
-
/** Props interface for Collapsible component */
|
|
6
|
-
interface ICollapsibleProps {
|
|
7
|
-
/** Title to display in the header */
|
|
8
|
-
title: string;
|
|
9
|
-
/** Content to be collapsed/expanded */
|
|
10
|
-
children: ReactNode;
|
|
11
|
-
/** Initial collapsed state */
|
|
12
|
-
defaultCollapsed?: boolean;
|
|
13
|
-
/** Whether to show animation */
|
|
14
|
-
animated?: boolean;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** Reusable collapsible component with toggle functionality */
|
|
18
|
-
export const Collapsible = ({
|
|
19
|
-
title,
|
|
20
|
-
children,
|
|
21
|
-
defaultCollapsed = false,
|
|
22
|
-
animated = true,
|
|
23
|
-
}: ICollapsibleProps) => {
|
|
24
|
-
const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<div>
|
|
28
|
-
<div
|
|
29
|
-
style={{
|
|
30
|
-
display: "flex",
|
|
31
|
-
alignItems: "center",
|
|
32
|
-
marginBottom: isCollapsed ? "0" : "12px",
|
|
33
|
-
}}
|
|
34
|
-
>
|
|
35
|
-
<button
|
|
36
|
-
onClick={() => setIsCollapsed(!isCollapsed)}
|
|
37
|
-
style={{
|
|
38
|
-
background: "none",
|
|
39
|
-
border: "none",
|
|
40
|
-
cursor: "pointer",
|
|
41
|
-
padding: "0",
|
|
42
|
-
borderRadius: "1rem",
|
|
43
|
-
display: "flex",
|
|
44
|
-
alignItems: "center",
|
|
45
|
-
justifyContent: "center",
|
|
46
|
-
transition: animated ? "background-color 0.2s" : "none",
|
|
47
|
-
color: COLORS.GRAY_TEXT_MEDIUM,
|
|
48
|
-
marginRight: "1rem",
|
|
49
|
-
}}
|
|
50
|
-
onMouseEnter={(e) => {
|
|
51
|
-
e.currentTarget.style.backgroundColor = COLORS.GRAY_BORDER_LIGHT;
|
|
52
|
-
}}
|
|
53
|
-
onMouseLeave={(e) => {
|
|
54
|
-
e.currentTarget.style.backgroundColor = "transparent";
|
|
55
|
-
}}
|
|
56
|
-
>
|
|
57
|
-
<svg
|
|
58
|
-
width="16"
|
|
59
|
-
height="16"
|
|
60
|
-
viewBox="0 0 24 24"
|
|
61
|
-
fill="currentColor"
|
|
62
|
-
style={{
|
|
63
|
-
transform: isCollapsed ? "rotate(-90deg)" : "rotate(0deg)",
|
|
64
|
-
transition: animated ? "transform 0.2s ease" : "none",
|
|
65
|
-
}}
|
|
66
|
-
>
|
|
67
|
-
<path d="M7.41 8.58L12 13.17l4.59-4.59L18 10l-6 6-6-6 1.41-1.42z" />
|
|
68
|
-
</svg>
|
|
69
|
-
</button>
|
|
70
|
-
<h4
|
|
71
|
-
style={{
|
|
72
|
-
margin: 0,
|
|
73
|
-
fontSize: "1rem",
|
|
74
|
-
fontWeight: "600",
|
|
75
|
-
color: COLORS.GRAY_TEXT_DARK,
|
|
76
|
-
}}
|
|
77
|
-
>
|
|
78
|
-
{title}
|
|
79
|
-
</h4>
|
|
80
|
-
</div>
|
|
81
|
-
{!isCollapsed && (
|
|
82
|
-
<div
|
|
83
|
-
style={{
|
|
84
|
-
opacity: isCollapsed ? 0 : 1,
|
|
85
|
-
transition: animated ? "opacity 0.2s ease" : "none",
|
|
86
|
-
}}
|
|
87
|
-
>
|
|
88
|
-
{children}
|
|
89
|
-
</div>
|
|
90
|
-
)}
|
|
91
|
-
</div>
|
|
92
|
-
);
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
export default Collapsible;
|
|
1
|
+
import { ReactNode, useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { COLORS } from "../../constant/color";
|
|
4
|
+
|
|
5
|
+
/** Props interface for Collapsible component */
|
|
6
|
+
interface ICollapsibleProps {
|
|
7
|
+
/** Title to display in the header */
|
|
8
|
+
title: string;
|
|
9
|
+
/** Content to be collapsed/expanded */
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
/** Initial collapsed state */
|
|
12
|
+
defaultCollapsed?: boolean;
|
|
13
|
+
/** Whether to show animation */
|
|
14
|
+
animated?: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Reusable collapsible component with toggle functionality */
|
|
18
|
+
export const Collapsible = ({
|
|
19
|
+
title,
|
|
20
|
+
children,
|
|
21
|
+
defaultCollapsed = false,
|
|
22
|
+
animated = true,
|
|
23
|
+
}: ICollapsibleProps) => {
|
|
24
|
+
const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div>
|
|
28
|
+
<div
|
|
29
|
+
style={{
|
|
30
|
+
display: "flex",
|
|
31
|
+
alignItems: "center",
|
|
32
|
+
marginBottom: isCollapsed ? "0" : "12px",
|
|
33
|
+
}}
|
|
34
|
+
>
|
|
35
|
+
<button
|
|
36
|
+
onClick={() => setIsCollapsed(!isCollapsed)}
|
|
37
|
+
style={{
|
|
38
|
+
background: "none",
|
|
39
|
+
border: "none",
|
|
40
|
+
cursor: "pointer",
|
|
41
|
+
padding: "0",
|
|
42
|
+
borderRadius: "1rem",
|
|
43
|
+
display: "flex",
|
|
44
|
+
alignItems: "center",
|
|
45
|
+
justifyContent: "center",
|
|
46
|
+
transition: animated ? "background-color 0.2s" : "none",
|
|
47
|
+
color: COLORS.GRAY_TEXT_MEDIUM,
|
|
48
|
+
marginRight: "1rem",
|
|
49
|
+
}}
|
|
50
|
+
onMouseEnter={(e) => {
|
|
51
|
+
e.currentTarget.style.backgroundColor = COLORS.GRAY_BORDER_LIGHT;
|
|
52
|
+
}}
|
|
53
|
+
onMouseLeave={(e) => {
|
|
54
|
+
e.currentTarget.style.backgroundColor = "transparent";
|
|
55
|
+
}}
|
|
56
|
+
>
|
|
57
|
+
<svg
|
|
58
|
+
width="16"
|
|
59
|
+
height="16"
|
|
60
|
+
viewBox="0 0 24 24"
|
|
61
|
+
fill="currentColor"
|
|
62
|
+
style={{
|
|
63
|
+
transform: isCollapsed ? "rotate(-90deg)" : "rotate(0deg)",
|
|
64
|
+
transition: animated ? "transform 0.2s ease" : "none",
|
|
65
|
+
}}
|
|
66
|
+
>
|
|
67
|
+
<path d="M7.41 8.58L12 13.17l4.59-4.59L18 10l-6 6-6-6 1.41-1.42z" />
|
|
68
|
+
</svg>
|
|
69
|
+
</button>
|
|
70
|
+
<h4
|
|
71
|
+
style={{
|
|
72
|
+
margin: 0,
|
|
73
|
+
fontSize: "1rem",
|
|
74
|
+
fontWeight: "600",
|
|
75
|
+
color: COLORS.GRAY_TEXT_DARK,
|
|
76
|
+
}}
|
|
77
|
+
>
|
|
78
|
+
{title}
|
|
79
|
+
</h4>
|
|
80
|
+
</div>
|
|
81
|
+
{!isCollapsed && (
|
|
82
|
+
<div
|
|
83
|
+
style={{
|
|
84
|
+
opacity: isCollapsed ? 0 : 1,
|
|
85
|
+
transition: animated ? "opacity 0.2s ease" : "none",
|
|
86
|
+
}}
|
|
87
|
+
>
|
|
88
|
+
{children}
|
|
89
|
+
</div>
|
|
90
|
+
)}
|
|
91
|
+
</div>
|
|
92
|
+
);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export default Collapsible;
|
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
import { IAutoBeAgentSession } from "../../structure";
|
|
2
|
-
|
|
3
|
-
export function CompactSessionIndicator(props: CompactSessionIndicator.IProps) {
|
|
4
|
-
//----
|
|
5
|
-
// EVENT HANDLERS
|
|
6
|
-
//----
|
|
7
|
-
const handleMouseEnter = (e: React.MouseEvent<HTMLDivElement>) => {
|
|
8
|
-
if (!props.isActive) {
|
|
9
|
-
e.currentTarget.style.backgroundColor = "#e5e7eb";
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const handleMouseLeave = (e: React.MouseEvent<HTMLDivElement>) => {
|
|
14
|
-
if (!props.isActive) {
|
|
15
|
-
e.currentTarget.style.backgroundColor = "#f3f4f6";
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const handleClick = () => {
|
|
20
|
-
props.onSelect?.(props.session.id);
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
//----
|
|
24
|
-
// STYLES
|
|
25
|
-
//----
|
|
26
|
-
const indicatorStyle: React.CSSProperties = {
|
|
27
|
-
width: "36px",
|
|
28
|
-
height: "36px",
|
|
29
|
-
borderRadius: "0.5rem",
|
|
30
|
-
backgroundColor: props.isActive ? "#3b82f6" : "#f3f4f6",
|
|
31
|
-
display: "flex",
|
|
32
|
-
alignItems: "center",
|
|
33
|
-
justifyContent: "center",
|
|
34
|
-
cursor: "pointer",
|
|
35
|
-
transition: "all 0.2s ease",
|
|
36
|
-
margin: "0 auto",
|
|
37
|
-
color: props.isActive ? "#ffffff" : "#6b7280",
|
|
38
|
-
fontSize: "0.875rem",
|
|
39
|
-
fontWeight: "500",
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
//----
|
|
43
|
-
// RENDER
|
|
44
|
-
//----
|
|
45
|
-
return (
|
|
46
|
-
<div
|
|
47
|
-
style={indicatorStyle}
|
|
48
|
-
onMouseEnter={handleMouseEnter}
|
|
49
|
-
onMouseLeave={handleMouseLeave}
|
|
50
|
-
onClick={handleClick}
|
|
51
|
-
title={props.session.title}
|
|
52
|
-
>
|
|
53
|
-
{props.session.title.charAt(0).toUpperCase()}
|
|
54
|
-
</div>
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export namespace CompactSessionIndicator {
|
|
59
|
-
export interface IProps {
|
|
60
|
-
/** Session data to display */
|
|
61
|
-
session: IAutoBeAgentSession;
|
|
62
|
-
|
|
63
|
-
/** Whether this session is currently active */
|
|
64
|
-
isActive: boolean;
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Callback when session indicator is clicked
|
|
68
|
-
*
|
|
69
|
-
* @param sessionId - ID of the selected session
|
|
70
|
-
*/
|
|
71
|
-
onSelect?: (sessionId: string) => void;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
1
|
+
import { IAutoBeAgentSession } from "../../structure";
|
|
2
|
+
|
|
3
|
+
export function CompactSessionIndicator(props: CompactSessionIndicator.IProps) {
|
|
4
|
+
//----
|
|
5
|
+
// EVENT HANDLERS
|
|
6
|
+
//----
|
|
7
|
+
const handleMouseEnter = (e: React.MouseEvent<HTMLDivElement>) => {
|
|
8
|
+
if (!props.isActive) {
|
|
9
|
+
e.currentTarget.style.backgroundColor = "#e5e7eb";
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const handleMouseLeave = (e: React.MouseEvent<HTMLDivElement>) => {
|
|
14
|
+
if (!props.isActive) {
|
|
15
|
+
e.currentTarget.style.backgroundColor = "#f3f4f6";
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const handleClick = () => {
|
|
20
|
+
props.onSelect?.(props.session.id);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
//----
|
|
24
|
+
// STYLES
|
|
25
|
+
//----
|
|
26
|
+
const indicatorStyle: React.CSSProperties = {
|
|
27
|
+
width: "36px",
|
|
28
|
+
height: "36px",
|
|
29
|
+
borderRadius: "0.5rem",
|
|
30
|
+
backgroundColor: props.isActive ? "#3b82f6" : "#f3f4f6",
|
|
31
|
+
display: "flex",
|
|
32
|
+
alignItems: "center",
|
|
33
|
+
justifyContent: "center",
|
|
34
|
+
cursor: "pointer",
|
|
35
|
+
transition: "all 0.2s ease",
|
|
36
|
+
margin: "0 auto",
|
|
37
|
+
color: props.isActive ? "#ffffff" : "#6b7280",
|
|
38
|
+
fontSize: "0.875rem",
|
|
39
|
+
fontWeight: "500",
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
//----
|
|
43
|
+
// RENDER
|
|
44
|
+
//----
|
|
45
|
+
return (
|
|
46
|
+
<div
|
|
47
|
+
style={indicatorStyle}
|
|
48
|
+
onMouseEnter={handleMouseEnter}
|
|
49
|
+
onMouseLeave={handleMouseLeave}
|
|
50
|
+
onClick={handleClick}
|
|
51
|
+
title={props.session.title}
|
|
52
|
+
>
|
|
53
|
+
{props.session.title.charAt(0).toUpperCase()}
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export namespace CompactSessionIndicator {
|
|
59
|
+
export interface IProps {
|
|
60
|
+
/** Session data to display */
|
|
61
|
+
session: IAutoBeAgentSession;
|
|
62
|
+
|
|
63
|
+
/** Whether this session is currently active */
|
|
64
|
+
isActive: boolean;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Callback when session indicator is clicked
|
|
68
|
+
*
|
|
69
|
+
* @param sessionId - ID of the selected session
|
|
70
|
+
*/
|
|
71
|
+
onSelect?: (sessionId: string) => void;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import { IAutoBeAgentSession } from "../../structure";
|
|
2
|
-
import { CompactSessionIndicator } from "./CompactSessionIndicator";
|
|
3
|
-
|
|
4
|
-
export function CompactSessionList(props: CompactSessionList.IProps) {
|
|
5
|
-
//----
|
|
6
|
-
// VARIABLES
|
|
7
|
-
//----
|
|
8
|
-
const maxItems = props.maxItems ?? 8;
|
|
9
|
-
const displaySessions = props.sessions.slice(0, maxItems);
|
|
10
|
-
const remainingCount = props.sessions.length - maxItems;
|
|
11
|
-
|
|
12
|
-
//----
|
|
13
|
-
// STYLES
|
|
14
|
-
//----
|
|
15
|
-
const containerStyle: React.CSSProperties = {
|
|
16
|
-
display: "flex",
|
|
17
|
-
flexDirection: "column",
|
|
18
|
-
gap: "0.5rem",
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const remainingIndicatorStyle: React.CSSProperties = {
|
|
22
|
-
width: "36px",
|
|
23
|
-
height: "36px",
|
|
24
|
-
borderRadius: "0.5rem",
|
|
25
|
-
backgroundColor: "#f3f4f6",
|
|
26
|
-
display: "flex",
|
|
27
|
-
alignItems: "center",
|
|
28
|
-
justifyContent: "center",
|
|
29
|
-
margin: "0 auto",
|
|
30
|
-
color: "#6b7280",
|
|
31
|
-
fontSize: "0.75rem",
|
|
32
|
-
fontWeight: "500",
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
//----
|
|
36
|
-
// RENDER
|
|
37
|
-
//----
|
|
38
|
-
return (
|
|
39
|
-
<div style={containerStyle}>
|
|
40
|
-
{displaySessions.map((session) => (
|
|
41
|
-
<CompactSessionIndicator
|
|
42
|
-
key={session.id}
|
|
43
|
-
session={session}
|
|
44
|
-
isActive={session.id === props.activeSessionId}
|
|
45
|
-
onSelect={props.onSessionSelect}
|
|
46
|
-
/>
|
|
47
|
-
))}
|
|
48
|
-
{remainingCount > 0 && (
|
|
49
|
-
<div
|
|
50
|
-
style={remainingIndicatorStyle}
|
|
51
|
-
title={`+${remainingCount} more conversations`}
|
|
52
|
-
>
|
|
53
|
-
+{remainingCount}
|
|
54
|
-
</div>
|
|
55
|
-
)}
|
|
56
|
-
</div>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export namespace CompactSessionList {
|
|
61
|
-
export interface IProps {
|
|
62
|
-
/** List of sessions to display */
|
|
63
|
-
sessions: IAutoBeAgentSession[];
|
|
64
|
-
|
|
65
|
-
/** Currently active session ID */
|
|
66
|
-
activeSessionId?: string | null;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Maximum number of sessions to display
|
|
70
|
-
*
|
|
71
|
-
* @default 8
|
|
72
|
-
*/
|
|
73
|
-
maxItems?: number;
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Callback when a session is selected
|
|
77
|
-
*
|
|
78
|
-
* @param sessionId - ID of the selected session
|
|
79
|
-
*/
|
|
80
|
-
onSessionSelect?: (sessionId: string) => void;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
1
|
+
import { IAutoBeAgentSession } from "../../structure";
|
|
2
|
+
import { CompactSessionIndicator } from "./CompactSessionIndicator";
|
|
3
|
+
|
|
4
|
+
export function CompactSessionList(props: CompactSessionList.IProps) {
|
|
5
|
+
//----
|
|
6
|
+
// VARIABLES
|
|
7
|
+
//----
|
|
8
|
+
const maxItems = props.maxItems ?? 8;
|
|
9
|
+
const displaySessions = props.sessions.slice(0, maxItems);
|
|
10
|
+
const remainingCount = props.sessions.length - maxItems;
|
|
11
|
+
|
|
12
|
+
//----
|
|
13
|
+
// STYLES
|
|
14
|
+
//----
|
|
15
|
+
const containerStyle: React.CSSProperties = {
|
|
16
|
+
display: "flex",
|
|
17
|
+
flexDirection: "column",
|
|
18
|
+
gap: "0.5rem",
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const remainingIndicatorStyle: React.CSSProperties = {
|
|
22
|
+
width: "36px",
|
|
23
|
+
height: "36px",
|
|
24
|
+
borderRadius: "0.5rem",
|
|
25
|
+
backgroundColor: "#f3f4f6",
|
|
26
|
+
display: "flex",
|
|
27
|
+
alignItems: "center",
|
|
28
|
+
justifyContent: "center",
|
|
29
|
+
margin: "0 auto",
|
|
30
|
+
color: "#6b7280",
|
|
31
|
+
fontSize: "0.75rem",
|
|
32
|
+
fontWeight: "500",
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
//----
|
|
36
|
+
// RENDER
|
|
37
|
+
//----
|
|
38
|
+
return (
|
|
39
|
+
<div style={containerStyle}>
|
|
40
|
+
{displaySessions.map((session) => (
|
|
41
|
+
<CompactSessionIndicator
|
|
42
|
+
key={session.id}
|
|
43
|
+
session={session}
|
|
44
|
+
isActive={session.id === props.activeSessionId}
|
|
45
|
+
onSelect={props.onSessionSelect}
|
|
46
|
+
/>
|
|
47
|
+
))}
|
|
48
|
+
{remainingCount > 0 && (
|
|
49
|
+
<div
|
|
50
|
+
style={remainingIndicatorStyle}
|
|
51
|
+
title={`+${remainingCount} more conversations`}
|
|
52
|
+
>
|
|
53
|
+
+{remainingCount}
|
|
54
|
+
</div>
|
|
55
|
+
)}
|
|
56
|
+
</div>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export namespace CompactSessionList {
|
|
61
|
+
export interface IProps {
|
|
62
|
+
/** List of sessions to display */
|
|
63
|
+
sessions: IAutoBeAgentSession[];
|
|
64
|
+
|
|
65
|
+
/** Currently active session ID */
|
|
66
|
+
activeSessionId?: string | null;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Maximum number of sessions to display
|
|
70
|
+
*
|
|
71
|
+
* @default 8
|
|
72
|
+
*/
|
|
73
|
+
maxItems?: number;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Callback when a session is selected
|
|
77
|
+
*
|
|
78
|
+
* @param sessionId - ID of the selected session
|
|
79
|
+
*/
|
|
80
|
+
onSessionSelect?: (sessionId: string) => void;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from "./ActionButton";
|
|
2
|
-
export * from "./ActionButtonGroup";
|
|
3
|
-
export * from "./AutoBeConfigInput";
|
|
4
|
-
export * from "./Collapsible";
|
|
5
|
-
export * from "./ChatBubble";
|
|
6
|
-
export * from "./CompactSessionIndicator";
|
|
7
|
-
export * from "./CompactSessionList";
|
|
8
|
-
export * from "./openai";
|
|
1
|
+
export * from "./ActionButton";
|
|
2
|
+
export * from "./ActionButtonGroup";
|
|
3
|
+
export * from "./AutoBeConfigInput";
|
|
4
|
+
export * from "./Collapsible";
|
|
5
|
+
export * from "./ChatBubble";
|
|
6
|
+
export * from "./CompactSessionIndicator";
|
|
7
|
+
export * from "./CompactSessionList";
|
|
8
|
+
export * from "./openai";
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { OpenAIUserAudioContent } from "./OpenAIUserAudioContent";
|
|
4
|
-
import { OpenAIUserFileContent } from "./OpenAIUserFileContent";
|
|
5
|
-
import { OpenAIUserImageContent } from "./OpenAIUserImageContent";
|
|
6
|
-
import { OpenAIUserTextContent } from "./OpenAIUserTextContent";
|
|
7
|
-
|
|
8
|
-
export interface IOpenAIUserContentProps {
|
|
9
|
-
content: Array<
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const OpenAIContent = (props: IOpenAIUserContentProps) => {
|
|
13
|
-
const { content } = props;
|
|
14
|
-
|
|
15
|
-
/** Renders a single content item */
|
|
16
|
-
const renderSingleContent = (
|
|
17
|
-
item:
|
|
18
|
-
index: number,
|
|
19
|
-
) => {
|
|
20
|
-
if (typeof item === "string") {
|
|
21
|
-
return <OpenAIUserTextContent key={index} text={item} />;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
switch (item.type) {
|
|
25
|
-
case "text":
|
|
26
|
-
return <OpenAIUserTextContent key={index} text={item.text} />;
|
|
27
|
-
case "audio":
|
|
28
|
-
return <OpenAIUserAudioContent key={index} content={item} />;
|
|
29
|
-
case "file":
|
|
30
|
-
return <OpenAIUserFileContent key={index} content={item} />;
|
|
31
|
-
case "image":
|
|
32
|
-
return <OpenAIUserImageContent key={index} content={item} />;
|
|
33
|
-
default:
|
|
34
|
-
return (
|
|
35
|
-
<OpenAIUserTextContent key={index} text="Unsupported content type" />
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
return (
|
|
41
|
-
<div
|
|
42
|
-
style={{
|
|
43
|
-
display: "flex",
|
|
44
|
-
flexDirection: "column",
|
|
45
|
-
gap: "0.75rem",
|
|
46
|
-
}}
|
|
47
|
-
>
|
|
48
|
-
{content.map((item, index) => renderSingleContent(item, index))}
|
|
49
|
-
</div>
|
|
50
|
-
);
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
export default OpenAIContent;
|
|
1
|
+
import { AutoBeUserConversateContent } from "@autobe/interface";
|
|
2
|
+
|
|
3
|
+
import { OpenAIUserAudioContent } from "./OpenAIUserAudioContent";
|
|
4
|
+
import { OpenAIUserFileContent } from "./OpenAIUserFileContent";
|
|
5
|
+
import { OpenAIUserImageContent } from "./OpenAIUserImageContent";
|
|
6
|
+
import { OpenAIUserTextContent } from "./OpenAIUserTextContent";
|
|
7
|
+
|
|
8
|
+
export interface IOpenAIUserContentProps {
|
|
9
|
+
content: Array<AutoBeUserConversateContent | string>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const OpenAIContent = (props: IOpenAIUserContentProps) => {
|
|
13
|
+
const { content } = props;
|
|
14
|
+
|
|
15
|
+
/** Renders a single content item */
|
|
16
|
+
const renderSingleContent = (
|
|
17
|
+
item: AutoBeUserConversateContent | string,
|
|
18
|
+
index: number,
|
|
19
|
+
) => {
|
|
20
|
+
if (typeof item === "string") {
|
|
21
|
+
return <OpenAIUserTextContent key={index} text={item} />;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
switch (item.type) {
|
|
25
|
+
case "text":
|
|
26
|
+
return <OpenAIUserTextContent key={index} text={item.text} />;
|
|
27
|
+
case "audio":
|
|
28
|
+
return <OpenAIUserAudioContent key={index} content={item} />;
|
|
29
|
+
case "file":
|
|
30
|
+
return <OpenAIUserFileContent key={index} content={item} />;
|
|
31
|
+
case "image":
|
|
32
|
+
return <OpenAIUserImageContent key={index} content={item} />;
|
|
33
|
+
default:
|
|
34
|
+
return (
|
|
35
|
+
<OpenAIUserTextContent key={index} text="Unsupported content type" />
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<div
|
|
42
|
+
style={{
|
|
43
|
+
display: "flex",
|
|
44
|
+
flexDirection: "column",
|
|
45
|
+
gap: "0.75rem",
|
|
46
|
+
}}
|
|
47
|
+
>
|
|
48
|
+
{content.map((item, index) => renderSingleContent(item, index))}
|
|
49
|
+
</div>
|
|
50
|
+
);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export default OpenAIContent;
|