@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,258 +1,245 @@
1
- import {
2
- IAutoBeRpcListener,
3
- IAutoBeRpcService,
4
- IAutoBeTokenUsageJson,
5
- } from "@autobe/interface";
6
- import {
7
- ReactNode,
8
- createContext,
9
- useCallback,
10
- useContext,
11
- useEffect,
12
- useState,
13
- } from "react";
14
- import { Communicator } from "tgrid";
15
-
16
- import {
17
- AutoBeListener,
18
- AutoBeListenerState,
19
- IAutoBeAgentSessionStorageStrategy,
20
- IAutoBeEventGroup,
21
- } from "../structure";
22
- import { IAutoBeConfig } from "../types/config";
23
- import { useAutoBeAgentSessionList } from "./AutoBeAgentSessionList";
24
- import { useSearchParams } from "./SearchParamsContext";
25
-
26
- export interface IAutoBeServiceData {
27
- service: IAutoBeRpcService;
28
- listener: AutoBeListener;
29
- connector: Communicator<IAutoBeRpcListener, IAutoBeRpcService>;
30
- close: () => void | Promise<void>;
31
- sessionId: string;
32
- }
33
-
34
- export type AutoBeServiceFactory = (
35
- config: IAutoBeConfig,
36
- ) => Promise<IAutoBeServiceData>;
37
-
38
- export type AutoBeConnectionStatus =
39
- | "disconnected" // 연결되지 않음
40
- | "connecting" // 연결 중
41
- | "connected"; // 연결 완료 활성 상태
42
-
43
- interface AutoBeAgentContextType {
44
- // Service state
45
- connectionStatus: AutoBeConnectionStatus;
46
-
47
- // Service data (available when ready)
48
- eventGroups: IAutoBeEventGroup[];
49
- tokenUsage: IAutoBeTokenUsageJson | null;
50
- state: AutoBeListenerState | null;
51
- service: IAutoBeRpcService | null;
52
- listener: AutoBeListener | null;
53
-
54
- // Service management
55
- getAutoBeService: (config?: IAutoBeConfig) => Promise<IAutoBeServiceData>;
56
- resetService: () => void;
57
- }
58
-
59
- const AutoBeAgentContext = createContext<AutoBeAgentContextType | null>(null);
60
-
61
- export function AutoBeAgentProvider({
62
- children,
63
- serviceFactory,
64
- storageStrategy,
65
- }: {
66
- serviceFactory: AutoBeServiceFactory;
67
- children: ReactNode;
68
- storageStrategy: IAutoBeAgentSessionStorageStrategy;
69
- }) {
70
- // Service state
71
- const [connectionStatus, setConnectionStatus] =
72
- useState<AutoBeConnectionStatus>("disconnected");
73
-
74
- // Service data
75
- const { searchParams, setSearchParams } = useSearchParams();
76
- // Use URL parameter for conversation ID - enables bookmark/share support
77
- const activeConversationId = searchParams.get("session-id") ?? null;
78
-
79
- const [tokenUsage, setTokenUsage] = useState<IAutoBeTokenUsageJson | null>(
80
- null,
81
- );
82
- const [eventGroups, setEventGroups] = useState<IAutoBeEventGroup[]>([]);
83
-
84
- // Context-scoped service instance (contains service, listener, header)
85
- const [serviceInstance, setServiceInstance] =
86
- useState<IAutoBeServiceData | null>(null);
87
-
88
- const { refreshSessionList } = useAutoBeAgentSessionList();
89
- // Context-scoped service getter
90
- const getAutoBeService = useCallback(
91
- async (
92
- config: IAutoBeConfig = {} as IAutoBeConfig,
93
- ): Promise<IAutoBeServiceData> => {
94
- // Return existing instance if available
95
- if (serviceInstance && connectionStatus === "connected") {
96
- return serviceInstance;
97
- }
98
-
99
- // Prevent multiple concurrent creations
100
- if (connectionStatus === "connecting") {
101
- throw new Error("Service is already connecting. Please wait.");
102
- }
103
-
104
- if (!serviceFactory) {
105
- throw new Error("No service factory provided. Cannot create service.");
106
- }
107
-
108
- try {
109
- setConnectionStatus("connecting");
110
-
111
- // Create new service instance
112
- const newServiceData = await serviceFactory({
113
- ...config,
114
- sessionId: activeConversationId,
115
- });
116
- newServiceData.connector.join().then(async () => {
117
- const res = await serviceFactory({
118
- ...config,
119
- sessionId: activeConversationId,
120
- });
121
- setServiceInstance(res);
122
- });
123
- setServiceInstance(newServiceData);
124
-
125
- setSearchParams((sp) => {
126
- const newSp = new URLSearchParams(sp);
127
- newSp.set("session-id", newServiceData.sessionId);
128
- return newSp;
129
- });
130
- setConnectionStatus("connected");
131
-
132
- return newServiceData;
133
- } catch (error) {
134
- setConnectionStatus("disconnected");
135
- throw error;
136
- }
137
- },
138
- [
139
- serviceFactory,
140
- serviceInstance,
141
- connectionStatus,
142
- activeConversationId,
143
- searchParams,
144
- ],
145
- );
146
-
147
- // Reset service (for reconnection, etc.)
148
- const resetService = useCallback(() => {
149
- setServiceInstance(null);
150
- setConnectionStatus("disconnected");
151
- setEventGroups([]);
152
- setTokenUsage(null);
153
- }, []);
154
-
155
- useEffect(() => {
156
- if (activeConversationId === null) {
157
- setEventGroups([]);
158
- setTokenUsage(null);
159
- return;
160
- }
161
-
162
- storageStrategy
163
- .getSession({
164
- id: activeConversationId,
165
- })
166
- .then((v) => {
167
- if (v === null) {
168
- return null;
169
- }
170
- refreshSessionList();
171
- setEventGroups(v.events);
172
- setTokenUsage(v.tokenUsage);
173
- })
174
- .catch(console.error);
175
- }, [activeConversationId]);
176
-
177
- useEffect(() => {
178
- if (serviceInstance === null) {
179
- return;
180
- }
181
-
182
- serviceInstance.listener.on(async (e) => {
183
- serviceInstance.service
184
- .getTokenUsage()
185
- .then(setTokenUsage)
186
- .catch(() => {});
187
- setEventGroups(e);
188
- });
189
-
190
- serviceInstance.service
191
- .getTokenUsage()
192
- .then(setTokenUsage)
193
- .catch(() => {});
194
- }, [serviceInstance]);
195
-
196
- useEffect(() => {
197
- if (activeConversationId === null || serviceInstance === null) {
198
- return;
199
- }
200
-
201
- const originConversate = serviceInstance.service.conversate;
202
- serviceInstance.service.conversate = async (content) => {
203
- const result = await originConversate(content);
204
- await storageStrategy.appendHistory({
205
- id: activeConversationId,
206
- history: result,
207
- });
208
- return result;
209
- };
210
-
211
- const registerEvent = async (e: IAutoBeEventGroup[]) => {
212
- await storageStrategy.appendEvent({
213
- id: activeConversationId,
214
- events: e,
215
- });
216
- await storageStrategy.setTokenUsage({
217
- id: activeConversationId,
218
- tokenUsage: await serviceInstance.service.getTokenUsage(),
219
- });
220
- };
221
-
222
- serviceInstance.listener.on(registerEvent);
223
- return () => {
224
- serviceInstance.service.conversate = originConversate;
225
- serviceInstance.listener.off(registerEvent);
226
- };
227
- }, [activeConversationId, serviceInstance]);
228
-
229
- return (
230
- <AutoBeAgentContext.Provider
231
- value={{
232
- // Service state
233
- connectionStatus,
234
-
235
- // Service data
236
- eventGroups,
237
- tokenUsage,
238
- state: serviceInstance?.listener?.getState() ?? null,
239
- service: serviceInstance?.service ?? null,
240
- listener: serviceInstance?.listener ?? null,
241
-
242
- // Service management
243
- getAutoBeService,
244
- resetService,
245
- }}
246
- >
247
- {children}
248
- </AutoBeAgentContext.Provider>
249
- );
250
- }
251
-
252
- export function useAutoBeAgent() {
253
- const context = useContext(AutoBeAgentContext);
254
- if (!context) {
255
- throw new Error("useAutoBeAgent must be used within a AutoBeAgentProvider");
256
- }
257
- return context;
258
- }
1
+ import { IAutoBeRpcService, IAutoBeTokenUsageJson } from "@autobe/interface";
2
+ import {
3
+ ReactNode,
4
+ createContext,
5
+ useCallback,
6
+ useContext,
7
+ useEffect,
8
+ useState,
9
+ } from "react";
10
+
11
+ import {
12
+ AutoBeListener,
13
+ AutoBeListenerState,
14
+ IAutoBeAgentSessionStorageStrategy,
15
+ IAutoBeEventGroup,
16
+ } from "../structure";
17
+ import { IAutoBeConfig } from "../types/config";
18
+ import { useAutoBeAgentSessionList } from "./AutoBeAgentSessionList";
19
+ import { useSearchParams } from "./SearchParamsContext";
20
+
21
+ export interface IAutoBeServiceData {
22
+ service: IAutoBeRpcService;
23
+ listener: AutoBeListener;
24
+ close: () => void | Promise<void>;
25
+ sessionId: string;
26
+ }
27
+
28
+ export type AutoBeServiceFactory = (
29
+ config: IAutoBeConfig,
30
+ ) => Promise<IAutoBeServiceData>;
31
+
32
+ export type AutoBeConnectionStatus =
33
+ | "disconnected"
34
+ | "connecting"
35
+ | "connected";
36
+
37
+ interface AutoBeAgentContextType {
38
+ // Service state
39
+ connectionStatus: AutoBeConnectionStatus;
40
+
41
+ // Service data (available when ready)
42
+ eventGroups: IAutoBeEventGroup[];
43
+ tokenUsage: IAutoBeTokenUsageJson | null;
44
+ state: AutoBeListenerState | null;
45
+ service: IAutoBeRpcService | null;
46
+ listener: AutoBeListener | null;
47
+
48
+ // Service management
49
+ getAutoBeService: (config?: IAutoBeConfig) => Promise<IAutoBeServiceData>;
50
+ resetService: () => void;
51
+ }
52
+
53
+ const AutoBeAgentContext = createContext<AutoBeAgentContextType | null>(null);
54
+
55
+ export function AutoBeAgentProvider({
56
+ children,
57
+ serviceFactory,
58
+ storageStrategy,
59
+ }: {
60
+ serviceFactory: AutoBeServiceFactory;
61
+ children: ReactNode;
62
+ storageStrategy: IAutoBeAgentSessionStorageStrategy;
63
+ }) {
64
+ // Service state
65
+ const [connectionStatus, setConnectionStatus] =
66
+ useState<AutoBeConnectionStatus>("disconnected");
67
+
68
+ // Service data
69
+ const { searchParams, setSearchParams } = useSearchParams();
70
+ // Use URL parameter for conversation ID - enables bookmark/share support
71
+ const activeConversationId = searchParams.get("session-id") ?? null;
72
+
73
+ const [tokenUsage, setTokenUsage] = useState<IAutoBeTokenUsageJson | null>(
74
+ null,
75
+ );
76
+ const [eventGroups, setEventGroups] = useState<IAutoBeEventGroup[]>([]);
77
+
78
+ // Context-scoped service instance (contains service, listener, header)
79
+ const [serviceInstance, setServiceInstance] =
80
+ useState<IAutoBeServiceData | null>(null);
81
+
82
+ const { refreshSessionList } = useAutoBeAgentSessionList();
83
+ // Context-scoped service getter
84
+ const getAutoBeService = useCallback(
85
+ async (
86
+ config: IAutoBeConfig = {} as IAutoBeConfig,
87
+ ): Promise<IAutoBeServiceData> => {
88
+ // Return existing instance if available
89
+ if (serviceInstance && connectionStatus === "connected") {
90
+ return serviceInstance;
91
+ }
92
+
93
+ // Prevent multiple concurrent creations
94
+ if (connectionStatus === "connecting") {
95
+ throw new Error("Service is already connecting. Please wait.");
96
+ }
97
+
98
+ if (!serviceFactory) {
99
+ throw new Error("No service factory provided. Cannot create service.");
100
+ }
101
+
102
+ try {
103
+ setConnectionStatus("connecting");
104
+
105
+ // Create new service instance
106
+ const newServiceData = await serviceFactory({
107
+ ...config,
108
+ sessionId: activeConversationId,
109
+ });
110
+ setServiceInstance(newServiceData);
111
+
112
+ setSearchParams((sp) => {
113
+ const newSp = new URLSearchParams(sp);
114
+ newSp.set("session-id", newServiceData.sessionId);
115
+ return newSp;
116
+ });
117
+ setConnectionStatus("connected");
118
+
119
+ return newServiceData;
120
+ } catch (error) {
121
+ setConnectionStatus("disconnected");
122
+ throw error;
123
+ }
124
+ },
125
+ [
126
+ serviceFactory,
127
+ serviceInstance,
128
+ connectionStatus,
129
+ activeConversationId,
130
+ searchParams,
131
+ ],
132
+ );
133
+
134
+ // Reset service (for reconnection, etc.)
135
+ const resetService = useCallback(() => {
136
+ setServiceInstance(null);
137
+ setConnectionStatus("disconnected");
138
+ setEventGroups([]);
139
+ setTokenUsage(null);
140
+ }, []);
141
+
142
+ useEffect(() => {
143
+ if (activeConversationId === null) {
144
+ setEventGroups([]);
145
+ setTokenUsage(null);
146
+ return;
147
+ }
148
+
149
+ storageStrategy
150
+ .getSession({
151
+ id: activeConversationId,
152
+ })
153
+ .then((v) => {
154
+ if (v === null) {
155
+ return null;
156
+ }
157
+ refreshSessionList();
158
+ setEventGroups(v.events);
159
+ setTokenUsage(v.tokenUsage);
160
+ })
161
+ .catch(console.error);
162
+ }, [activeConversationId]);
163
+
164
+ useEffect(() => {
165
+ if (serviceInstance === null) {
166
+ return;
167
+ }
168
+
169
+ serviceInstance.listener.on(async (e) => {
170
+ serviceInstance.service
171
+ .getTokenUsage()
172
+ .then(setTokenUsage)
173
+ .catch(() => {});
174
+ setEventGroups(e);
175
+ });
176
+
177
+ serviceInstance.service
178
+ .getTokenUsage()
179
+ .then(setTokenUsage)
180
+ .catch(() => {});
181
+ }, [serviceInstance]);
182
+
183
+ useEffect(() => {
184
+ if (activeConversationId === null || serviceInstance === null) {
185
+ return;
186
+ }
187
+
188
+ const originConversate = serviceInstance.service.conversate;
189
+ serviceInstance.service.conversate = async (content) => {
190
+ const result = await originConversate(content);
191
+ await storageStrategy.appendHistory({
192
+ id: activeConversationId,
193
+ history: result,
194
+ });
195
+ return result;
196
+ };
197
+
198
+ const registerEvent = async (e: IAutoBeEventGroup[]) => {
199
+ await storageStrategy.appendEvent({
200
+ id: activeConversationId,
201
+ events: e,
202
+ });
203
+ await storageStrategy.setTokenUsage({
204
+ id: activeConversationId,
205
+ tokenUsage: await serviceInstance.service.getTokenUsage(),
206
+ });
207
+ };
208
+
209
+ serviceInstance.listener.on(registerEvent);
210
+ return () => {
211
+ serviceInstance.service.conversate = originConversate;
212
+ serviceInstance.listener.off(registerEvent);
213
+ };
214
+ }, [activeConversationId, serviceInstance]);
215
+
216
+ return (
217
+ <AutoBeAgentContext.Provider
218
+ value={{
219
+ // Service state
220
+ connectionStatus,
221
+
222
+ // Service data
223
+ eventGroups,
224
+ tokenUsage,
225
+ state: serviceInstance?.listener?.getState() ?? null,
226
+ service: serviceInstance?.service ?? null,
227
+ listener: serviceInstance?.listener ?? null,
228
+
229
+ // Service management
230
+ getAutoBeService,
231
+ resetService,
232
+ }}
233
+ >
234
+ {children}
235
+ </AutoBeAgentContext.Provider>
236
+ );
237
+ }
238
+
239
+ export function useAutoBeAgent() {
240
+ const context = useContext(AutoBeAgentContext);
241
+ if (!context) {
242
+ throw new Error("useAutoBeAgent must be used within a AutoBeAgentProvider");
243
+ }
244
+ return context;
245
+ }
@@ -1,58 +1,58 @@
1
- import {
2
- ReactNode,
3
- createContext,
4
- useCallback,
5
- useContext,
6
- useEffect,
7
- useState,
8
- } from "react";
9
-
10
- import {
11
- IAutoBeAgentSession,
12
- IAutoBeAgentSessionStorageStrategy,
13
- } from "../structure";
14
-
15
- interface AutoBeAgentSessionListContextType {
16
- sessionList: IAutoBeAgentSession[];
17
- refreshSessionList: () => Promise<void>;
18
- }
19
-
20
- const AutoBeAgentSessionListContext =
21
- createContext<AutoBeAgentSessionListContextType | null>(null);
22
-
23
- export function AutoBeAgentSessionListProvider({
24
- children,
25
- storageStrategy,
26
- }: {
27
- storageStrategy: IAutoBeAgentSessionStorageStrategy;
28
- children: ReactNode;
29
- }) {
30
- const [sessionList, setSessionList] = useState<IAutoBeAgentSession[]>([]);
31
-
32
- const refreshSessionList = useCallback(async () => {
33
- await storageStrategy.getSessionList().then(setSessionList);
34
- }, [storageStrategy]);
35
-
36
- useEffect(() => {
37
- refreshSessionList();
38
- }, [storageStrategy]);
39
-
40
- return (
41
- <AutoBeAgentSessionListContext.Provider
42
- value={{
43
- sessionList,
44
- refreshSessionList,
45
- }}
46
- >
47
- {children}
48
- </AutoBeAgentSessionListContext.Provider>
49
- );
50
- }
51
-
52
- export function useAutoBeAgentSessionList() {
53
- const context = useContext(AutoBeAgentSessionListContext);
54
- if (!context) {
55
- throw new Error("useAutoBeAgent must be used within a AutoBeAgentProvider");
56
- }
57
- return context;
58
- }
1
+ import {
2
+ ReactNode,
3
+ createContext,
4
+ useCallback,
5
+ useContext,
6
+ useEffect,
7
+ useState,
8
+ } from "react";
9
+
10
+ import {
11
+ IAutoBeAgentSession,
12
+ IAutoBeAgentSessionStorageStrategy,
13
+ } from "../structure";
14
+
15
+ interface AutoBeAgentSessionListContextType {
16
+ sessionList: IAutoBeAgentSession[];
17
+ refreshSessionList: () => Promise<void>;
18
+ }
19
+
20
+ const AutoBeAgentSessionListContext =
21
+ createContext<AutoBeAgentSessionListContextType | null>(null);
22
+
23
+ export function AutoBeAgentSessionListProvider({
24
+ children,
25
+ storageStrategy,
26
+ }: {
27
+ storageStrategy: IAutoBeAgentSessionStorageStrategy;
28
+ children: ReactNode;
29
+ }) {
30
+ const [sessionList, setSessionList] = useState<IAutoBeAgentSession[]>([]);
31
+
32
+ const refreshSessionList = useCallback(async () => {
33
+ await storageStrategy.getSessionList().then(setSessionList);
34
+ }, [storageStrategy]);
35
+
36
+ useEffect(() => {
37
+ refreshSessionList();
38
+ }, [storageStrategy]);
39
+
40
+ return (
41
+ <AutoBeAgentSessionListContext.Provider
42
+ value={{
43
+ sessionList,
44
+ refreshSessionList,
45
+ }}
46
+ >
47
+ {children}
48
+ </AutoBeAgentSessionListContext.Provider>
49
+ );
50
+ }
51
+
52
+ export function useAutoBeAgentSessionList() {
53
+ const context = useContext(AutoBeAgentSessionListContext);
54
+ if (!context) {
55
+ throw new Error("useAutoBeAgent must be used within a AutoBeAgentProvider");
56
+ }
57
+ return context;
58
+ }