@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.
Files changed (151) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +261 -0
  3. package/lib/components/AutoBeChatMain.js +5 -5
  4. package/lib/components/AutoBeChatMain.js.map +1 -1
  5. package/lib/components/AutoBeConfigModal.js +9 -9
  6. package/lib/components/AutoBeStatusModal.js +4 -4
  7. package/lib/components/AutoBeStatusModal.js.map +1 -1
  8. package/lib/components/AutoBeUserMessageMovie.d.ts +2 -2
  9. package/lib/components/common/ChatBubble.d.ts +2 -2
  10. package/lib/components/common/openai/OpenAIContent.d.ts +2 -2
  11. package/lib/components/common/openai/OpenAIContent.js.map +1 -1
  12. package/lib/components/common/openai/OpenAIUserAudioContent.js +1 -1
  13. package/lib/components/common/openai/OpenAIUserAudioContent.js.map +1 -1
  14. package/lib/components/common/openai/OpenAIUserFileContent.js +1 -1
  15. package/lib/components/common/openai/OpenAIUserFileContent.js.map +1 -1
  16. package/lib/components/common/openai/OpenAIUserImageContent.d.ts +2 -2
  17. package/lib/components/events/AutoBeCompleteEventMovie.d.ts +2 -2
  18. package/lib/components/events/AutoBeCompleteEventMovie.js +5 -5
  19. package/lib/components/events/AutoBeCompleteEventMovie.js.map +1 -1
  20. package/lib/components/events/AutoBeCorrectEventMovie.d.ts +2 -2
  21. package/lib/components/events/AutoBeCorrectEventMovie.js +4 -4
  22. package/lib/components/events/AutoBeCorrectEventMovie.js.map +1 -1
  23. package/lib/components/events/AutoBeEventMovie.js +38 -17
  24. package/lib/components/events/AutoBeEventMovie.js.map +1 -1
  25. package/lib/components/events/AutoBeProgressEventMovie.js +73 -13
  26. package/lib/components/events/AutoBeProgressEventMovie.js.map +1 -1
  27. package/lib/components/events/AutoBeScenarioEventMovie.d.ts +2 -2
  28. package/lib/components/events/AutoBeScenarioEventMovie.js +18 -5
  29. package/lib/components/events/AutoBeScenarioEventMovie.js.map +1 -1
  30. package/lib/components/events/AutoBeStartEventMovie.d.ts +2 -2
  31. package/lib/components/events/AutoBeStartEventMovie.js +2 -2
  32. package/lib/components/events/AutoBeStartEventMovie.js.map +1 -1
  33. package/lib/components/events/AutoBeValidateEventMovie.d.ts +2 -2
  34. package/lib/components/events/AutoBeValidateEventMovie.js +3 -11
  35. package/lib/components/events/AutoBeValidateEventMovie.js.map +1 -1
  36. package/lib/components/events/groups/CorrectEventGroup.d.ts +2 -2
  37. package/lib/components/events/groups/CorrectEventGroup.js +1 -1
  38. package/lib/components/events/groups/CorrectEventGroup.js.map +1 -1
  39. package/lib/components/events/groups/ValidateEventGroup.d.ts +2 -2
  40. package/lib/components/events/groups/ValidateEventGroup.js +1 -2
  41. package/lib/components/events/groups/ValidateEventGroup.js.map +1 -1
  42. package/lib/components/events/utils/eventGrouper.js +1 -2
  43. package/lib/components/events/utils/eventGrouper.js.map +1 -1
  44. package/lib/components/upload/AutoBeChatUploadBox.d.ts +3 -4
  45. package/lib/components/upload/AutoBeChatUploadBox.js +2 -1
  46. package/lib/components/upload/AutoBeChatUploadBox.js.map +1 -1
  47. package/lib/components/upload/AutoBeChatUploadSendButton.js +1 -1
  48. package/lib/components/upload/AutoBeChatUploadSendButton.js.map +1 -1
  49. package/lib/context/AutoBeAgentContext.d.ts +1 -3
  50. package/lib/context/AutoBeAgentContext.js +0 -4
  51. package/lib/context/AutoBeAgentContext.js.map +1 -1
  52. package/lib/hooks/useSessionStorage.d.ts +4 -0
  53. package/lib/hooks/useSessionStorage.js +16 -0
  54. package/lib/hooks/useSessionStorage.js.map +1 -0
  55. package/lib/index.d.ts +1 -0
  56. package/lib/index.js +1 -0
  57. package/lib/index.js.map +1 -1
  58. package/lib/strategy/AutoBeAgentSessionStorageStrategy.d.ts +10 -0
  59. package/lib/strategy/AutoBeAgentSessionStorageStrategy.js +117 -0
  60. package/lib/strategy/AutoBeAgentSessionStorageStrategy.js.map +1 -0
  61. package/lib/structure/AutoBeListener.js +91 -23
  62. package/lib/structure/AutoBeListener.js.map +1 -1
  63. package/lib/structure/AutoBeListenerState.d.ts +3 -3
  64. package/lib/structure/AutoBeListenerState.js +4 -4
  65. package/lib/structure/AutoBeListenerState.js.map +1 -1
  66. package/lib/structure/IAutoBeAgentSessionStorageStrategy.js +1 -1
  67. package/lib/structure/IAutoBeAgentSessionStorageStrategy.js.map +1 -1
  68. package/lib/utils/AutoBeFileUploader.d.ts +2 -2
  69. package/lib/utils/AutoBeFileUploader.js.map +1 -1
  70. package/package.json +3 -4
  71. package/src/components/AutoBeAssistantMessageMovie.tsx +22 -22
  72. package/src/components/AutoBeChatMain.tsx +376 -376
  73. package/src/components/AutoBeChatSidebar.tsx +414 -414
  74. package/src/components/AutoBeConfigButton.tsx +83 -83
  75. package/src/components/AutoBeConfigModal.tsx +443 -443
  76. package/src/components/AutoBeStatusButton.tsx +75 -75
  77. package/src/components/AutoBeStatusModal.tsx +486 -484
  78. package/src/components/AutoBeUserMessageMovie.tsx +27 -27
  79. package/src/components/common/ActionButton.tsx +205 -205
  80. package/src/components/common/ActionButtonGroup.tsx +80 -80
  81. package/src/components/common/AutoBeConfigInput.tsx +185 -185
  82. package/src/components/common/ChatBubble.tsx +119 -119
  83. package/src/components/common/Collapsible.tsx +95 -95
  84. package/src/components/common/CompactSessionIndicator.tsx +73 -73
  85. package/src/components/common/CompactSessionList.tsx +82 -82
  86. package/src/components/common/index.ts +8 -8
  87. package/src/components/common/openai/OpenAIContent.tsx +53 -53
  88. package/src/components/common/openai/OpenAIUserAudioContent.tsx +70 -70
  89. package/src/components/common/openai/OpenAIUserFileContent.tsx +76 -76
  90. package/src/components/common/openai/OpenAIUserImageContent.tsx +34 -34
  91. package/src/components/common/openai/OpenAIUserTextContent.tsx +15 -15
  92. package/src/components/common/openai/index.ts +5 -5
  93. package/src/components/events/AutoBeCompleteEventMovie.tsx +402 -402
  94. package/src/components/events/AutoBeCorrectEventMovie.tsx +354 -368
  95. package/src/components/events/AutoBeEventGroupMovie.tsx +18 -18
  96. package/src/components/events/AutoBeEventMovie.tsx +158 -139
  97. package/src/components/events/AutoBeProgressEventMovie.tsx +217 -157
  98. package/src/components/events/AutoBeScenarioEventMovie.tsx +135 -95
  99. package/src/components/events/AutoBeStartEventMovie.tsx +82 -82
  100. package/src/components/events/AutoBeValidateEventMovie.tsx +249 -286
  101. package/src/components/events/README.md +300 -300
  102. package/src/components/events/common/CollapsibleEventGroup.tsx +211 -211
  103. package/src/components/events/common/EventCard.tsx +61 -61
  104. package/src/components/events/common/EventContent.tsx +31 -31
  105. package/src/components/events/common/EventHeader.tsx +85 -85
  106. package/src/components/events/common/EventIcon.tsx +82 -82
  107. package/src/components/events/common/ProgressBar.tsx +64 -64
  108. package/src/components/events/common/index.ts +13 -13
  109. package/src/components/events/groups/CorrectEventGroup.tsx +183 -183
  110. package/src/components/events/groups/ValidateEventGroup.tsx +143 -146
  111. package/src/components/events/groups/index.ts +8 -8
  112. package/src/components/events/index.ts +16 -16
  113. package/src/components/events/utils/eventGrouper.tsx +116 -117
  114. package/src/components/events/utils/index.ts +1 -1
  115. package/src/components/index.ts +13 -13
  116. package/src/components/upload/AutoBeChatUploadBox.tsx +425 -424
  117. package/src/components/upload/AutoBeChatUploadSendButton.tsx +66 -66
  118. package/src/components/upload/AutoBeFileUploadBox.tsx +123 -123
  119. package/src/components/upload/AutoBeUploadConfig.ts +5 -5
  120. package/src/components/upload/AutoBeVoiceRecoderButton.tsx +100 -100
  121. package/src/components/upload/index.ts +5 -5
  122. package/src/constant/color.ts +28 -28
  123. package/src/context/AutoBeAgentContext.tsx +245 -258
  124. package/src/context/AutoBeAgentSessionList.tsx +58 -58
  125. package/src/context/SearchParamsContext.tsx +49 -49
  126. package/src/hooks/index.ts +3 -3
  127. package/src/hooks/useEscapeKey.ts +24 -24
  128. package/src/hooks/useIsomorphicLayoutEffect.ts +8 -8
  129. package/src/hooks/useMediaQuery.ts +73 -73
  130. package/src/hooks/useSessionStorage.ts +10 -0
  131. package/src/icons/Receipt.tsx +74 -74
  132. package/src/index.ts +9 -8
  133. package/src/strategy/AutoBeAgentSessionStorageStrategy.ts +127 -0
  134. package/src/structure/AutoBeListener.ts +373 -304
  135. package/src/structure/AutoBeListenerState.ts +53 -53
  136. package/src/structure/IAutoBeAgentSessionStorageStrategy.ts +87 -87
  137. package/src/structure/IAutoBeEventGroup.ts +6 -6
  138. package/src/structure/index.ts +4 -4
  139. package/src/types/config.ts +44 -44
  140. package/src/types/index.ts +1 -1
  141. package/src/utils/AutoBeFileUploader.ts +279 -279
  142. package/src/utils/AutoBeVoiceRecorder.ts +95 -95
  143. package/src/utils/__tests__/crypto.test.ts +286 -286
  144. package/src/utils/__tests__/storage.test.ts +229 -229
  145. package/src/utils/crypto.ts +95 -95
  146. package/src/utils/index.ts +6 -6
  147. package/src/utils/number.ts +17 -17
  148. package/src/utils/storage.ts +96 -96
  149. package/src/utils/time.ts +14 -14
  150. package/tsconfig.json +9 -9
  151. 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 { AutoBeUserMessageContent } 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<AutoBeUserMessageContent | 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: AutoBeUserMessageContent | 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;
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;