@autobe/ui 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/lib/{AutoBeAssistantMessageMovie.d.ts → components/AutoBeAssistantMessageMovie.d.ts} +1 -1
  2. package/lib/{AutoBeAssistantMessageMovie.js → components/AutoBeAssistantMessageMovie.js} +3 -1
  3. package/lib/components/AutoBeAssistantMessageMovie.js.map +1 -0
  4. package/lib/components/AutoBeChatMain.d.ts +12 -0
  5. package/lib/components/AutoBeChatMain.js +88 -0
  6. package/lib/components/AutoBeChatMain.js.map +1 -0
  7. package/lib/components/AutoBeStatusModal.d.ts +6 -0
  8. package/lib/components/AutoBeStatusModal.js +269 -0
  9. package/lib/components/AutoBeStatusModal.js.map +1 -0
  10. package/lib/{AutoBeUserMessageMovie.d.ts → components/AutoBeUserMessageMovie.d.ts} +1 -1
  11. package/lib/{AutoBeUserMessageMovie.js → components/AutoBeUserMessageMovie.js} +3 -1
  12. package/lib/components/AutoBeUserMessageMovie.js.map +1 -0
  13. package/lib/{common → components/common}/ChatBubble.js +1 -1
  14. package/lib/components/common/ChatBubble.js.map +1 -0
  15. package/lib/components/common/Collapsible.d.ts +15 -0
  16. package/lib/components/common/Collapsible.js +45 -0
  17. package/lib/components/common/Collapsible.js.map +1 -0
  18. package/lib/components/common/index.d.ts +2 -0
  19. package/lib/components/common/index.js +19 -0
  20. package/lib/components/common/index.js.map +1 -0
  21. package/lib/components/common/openai/OpenAIContent.js.map +1 -0
  22. package/lib/components/common/openai/OpenAIUserAudioContent.js.map +1 -0
  23. package/lib/components/common/openai/OpenAIUserFileContent.js.map +1 -0
  24. package/lib/components/common/openai/OpenAIUserImageContent.js.map +1 -0
  25. package/lib/{common → components/common}/openai/OpenAIUserTextContent.js +0 -1
  26. package/lib/components/common/openai/OpenAIUserTextContent.js.map +1 -0
  27. package/lib/components/common/openai/index.js.map +1 -0
  28. package/lib/components/events/AutoBeCompleteEventMovie.js.map +1 -0
  29. package/lib/components/events/AutoBeCorrectEventMovie.d.ts +9 -0
  30. package/lib/components/events/AutoBeCorrectEventMovie.js +146 -0
  31. package/lib/components/events/AutoBeCorrectEventMovie.js.map +1 -0
  32. package/lib/components/events/AutoBeEventMovie.d.ts +7 -0
  33. package/lib/components/events/AutoBeEventMovie.js +93 -0
  34. package/lib/components/events/AutoBeEventMovie.js.map +1 -0
  35. package/lib/components/events/AutoBeProgressEventMovie.js.map +1 -0
  36. package/lib/components/events/AutoBeScenarioEventMovie.js.map +1 -0
  37. package/lib/components/events/AutoBeStartEventMovie.js.map +1 -0
  38. package/lib/{events → components/events}/AutoBeValidateEventMovie.js +2 -2
  39. package/lib/components/events/AutoBeValidateEventMovie.js.map +1 -0
  40. package/lib/{events → components/events}/common/CollapsibleEventGroup.js +1 -5
  41. package/lib/components/events/common/CollapsibleEventGroup.js.map +1 -0
  42. package/lib/components/events/common/EventCard.js.map +1 -0
  43. package/lib/components/events/common/EventContent.js.map +1 -0
  44. package/lib/{events → components/events}/common/EventHeader.js +1 -1
  45. package/lib/components/events/common/EventHeader.js.map +1 -0
  46. package/lib/components/events/common/EventIcon.js.map +1 -0
  47. package/lib/{events → components/events}/common/ProgressBar.js +3 -2
  48. package/lib/components/events/common/ProgressBar.js.map +1 -0
  49. package/lib/components/events/common/index.js.map +1 -0
  50. package/lib/components/events/groups/CorrectEventGroup.d.ts +12 -0
  51. package/lib/components/events/groups/CorrectEventGroup.js +83 -0
  52. package/lib/components/events/groups/CorrectEventGroup.js.map +1 -0
  53. package/lib/{events → components/events}/groups/ValidateEventGroup.js +3 -3
  54. package/lib/components/events/groups/ValidateEventGroup.js.map +1 -0
  55. package/lib/{events → components/events}/groups/index.d.ts +1 -0
  56. package/lib/components/events/groups/index.js +8 -0
  57. package/lib/components/events/groups/index.js.map +1 -0
  58. package/lib/{events → components/events}/index.d.ts +3 -1
  59. package/lib/{events → components/events}/index.js +7 -3
  60. package/lib/components/events/index.js.map +1 -0
  61. package/lib/components/events/utils/eventGrouper.js.map +1 -0
  62. package/lib/components/events/utils/index.js.map +1 -0
  63. package/lib/components/index.d.ts +7 -0
  64. package/lib/components/index.js +24 -0
  65. package/lib/components/index.js.map +1 -0
  66. package/lib/components/upload/AutoBeChatUploadBox.d.ts +31 -0
  67. package/lib/components/upload/AutoBeChatUploadBox.js +222 -0
  68. package/lib/components/upload/AutoBeChatUploadBox.js.map +1 -0
  69. package/lib/components/upload/AutoBeChatUploadSendButton.js.map +1 -0
  70. package/lib/components/upload/AutoBeFileUploadBox.d.ts +8 -0
  71. package/lib/components/upload/AutoBeFileUploadBox.js.map +1 -0
  72. package/lib/components/upload/AutoBeUploadConfig.d.ts +9 -0
  73. package/lib/components/upload/AutoBeUploadConfig.js +3 -0
  74. package/lib/components/upload/AutoBeUploadConfig.js.map +1 -0
  75. package/lib/{AutoBeVoiceRecoderButton.js → components/upload/AutoBeVoiceRecoderButton.js} +2 -2
  76. package/lib/components/upload/AutoBeVoiceRecoderButton.js.map +1 -0
  77. package/lib/components/upload/index.d.ts +5 -0
  78. package/lib/components/upload/index.js +22 -0
  79. package/lib/components/upload/index.js.map +1 -0
  80. package/lib/constant/color.d.ts +22 -0
  81. package/lib/constant/color.js +29 -0
  82. package/lib/constant/color.js.map +1 -0
  83. package/lib/context/AutoBeAgentContext.d.ts +20 -0
  84. package/lib/context/AutoBeAgentContext.js +50 -0
  85. package/lib/context/AutoBeAgentContext.js.map +1 -0
  86. package/lib/hooks/index.d.ts +3 -0
  87. package/lib/hooks/index.js +20 -0
  88. package/lib/hooks/index.js.map +1 -0
  89. package/lib/hooks/useEscapeKey.d.ts +7 -0
  90. package/lib/hooks/useEscapeKey.js +27 -0
  91. package/lib/hooks/useEscapeKey.js.map +1 -0
  92. package/lib/hooks/useIsomorphicLayoutEffect.d.ts +6 -0
  93. package/lib/hooks/useIsomorphicLayoutEffect.js +10 -0
  94. package/lib/hooks/useIsomorphicLayoutEffect.js.map +1 -0
  95. package/lib/hooks/useMediaQuery.d.ts +16 -0
  96. package/lib/hooks/useMediaQuery.js +57 -0
  97. package/lib/hooks/useMediaQuery.js.map +1 -0
  98. package/lib/icons/Receipt.d.ts +12 -0
  99. package/lib/icons/Receipt.js +9 -0
  100. package/lib/icons/Receipt.js.map +1 -0
  101. package/lib/index.d.ts +4 -8
  102. package/lib/index.js +4 -17
  103. package/lib/index.js.map +1 -1
  104. package/lib/structure/AutoBeListener.d.ts +17 -0
  105. package/lib/structure/AutoBeListener.js +250 -0
  106. package/lib/structure/AutoBeListener.js.map +1 -0
  107. package/lib/structure/AutoBeListenerState.d.ts +14 -0
  108. package/lib/structure/AutoBeListenerState.js +39 -0
  109. package/lib/structure/AutoBeListenerState.js.map +1 -0
  110. package/lib/structure/IAutoBeEventGroup.d.ts +5 -0
  111. package/lib/structure/IAutoBeEventGroup.js +3 -0
  112. package/lib/structure/IAutoBeEventGroup.js.map +1 -0
  113. package/lib/structure/index.d.ts +3 -0
  114. package/lib/structure/index.js +20 -0
  115. package/lib/structure/index.js.map +1 -0
  116. package/lib/utils/index.d.ts +1 -0
  117. package/lib/utils/index.js +1 -0
  118. package/lib/utils/index.js.map +1 -1
  119. package/lib/utils/number.d.ts +1 -0
  120. package/lib/utils/number.js +20 -0
  121. package/lib/utils/number.js.map +1 -0
  122. package/package.json +7 -11
  123. package/src/{AutoBeAssistantMessageMovie.tsx → components/AutoBeAssistantMessageMovie.tsx} +1 -1
  124. package/src/components/AutoBeChatMain.tsx +178 -0
  125. package/src/components/AutoBeStatusModal.tsx +483 -0
  126. package/src/{AutoBeUserMessageMovie.tsx → components/AutoBeUserMessageMovie.tsx} +3 -1
  127. package/src/{common → components/common}/ChatBubble.tsx +1 -1
  128. package/src/components/common/Collapsible.tsx +95 -0
  129. package/src/components/common/index.ts +2 -0
  130. package/src/{common → components/common}/openai/OpenAIUserTextContent.tsx +0 -1
  131. package/src/components/events/AutoBeCorrectEventMovie.tsx +368 -0
  132. package/src/components/events/AutoBeEventMovie.tsx +130 -0
  133. package/src/{events → components/events}/AutoBeValidateEventMovie.tsx +2 -2
  134. package/src/components/events/README.md +300 -0
  135. package/src/{events → components/events}/common/CollapsibleEventGroup.tsx +1 -10
  136. package/src/{events → components/events}/common/EventHeader.tsx +1 -1
  137. package/src/{events → components/events}/common/ProgressBar.tsx +3 -2
  138. package/src/components/events/groups/CorrectEventGroup.tsx +183 -0
  139. package/src/{events → components/events}/groups/ValidateEventGroup.tsx +3 -3
  140. package/src/{events → components/events}/groups/index.ts +4 -0
  141. package/src/{events → components/events}/index.ts +3 -4
  142. package/src/components/index.ts +7 -0
  143. package/src/components/upload/AutoBeChatUploadBox.tsx +374 -0
  144. package/src/{AutoBeFileUploadBox.tsx → components/upload/AutoBeFileUploadBox.tsx} +7 -8
  145. package/src/components/upload/AutoBeUploadConfig.ts +5 -0
  146. package/src/{AutoBeVoiceRecoderButton.tsx → components/upload/AutoBeVoiceRecoderButton.tsx} +2 -2
  147. package/src/components/upload/index.ts +5 -0
  148. package/src/constant/color.ts +28 -0
  149. package/src/context/AutoBeAgentContext.tsx +79 -0
  150. package/src/hooks/index.ts +3 -0
  151. package/src/hooks/useEscapeKey.ts +24 -0
  152. package/src/hooks/useIsomorphicLayoutEffect.ts +8 -0
  153. package/src/hooks/useMediaQuery.ts +73 -0
  154. package/src/icons/Receipt.tsx +74 -0
  155. package/src/index.ts +4 -14
  156. package/src/structure/AutoBeListener.ts +263 -0
  157. package/src/structure/AutoBeListenerState.ts +53 -0
  158. package/src/structure/IAutoBeEventGroup.ts +6 -0
  159. package/src/structure/index.ts +3 -0
  160. package/src/utils/index.ts +1 -0
  161. package/src/utils/number.ts +17 -0
  162. package/tsconfig.json +2 -1
  163. package/lib/AutoBeAssistantMessageMovie.js.map +0 -1
  164. package/lib/AutoBeChatUploadSendButton.js.map +0 -1
  165. package/lib/AutoBeFileUploadBox.d.ts +0 -10
  166. package/lib/AutoBeFileUploadBox.js.map +0 -1
  167. package/lib/AutoBeUserMessageMovie.js.map +0 -1
  168. package/lib/AutoBeVoiceRecoderButton.js.map +0 -1
  169. package/lib/common/ChatBubble.js.map +0 -1
  170. package/lib/common/openai/OpenAIContent.js.map +0 -1
  171. package/lib/common/openai/OpenAIUserAudioContent.js.map +0 -1
  172. package/lib/common/openai/OpenAIUserFileContent.js.map +0 -1
  173. package/lib/common/openai/OpenAIUserImageContent.js.map +0 -1
  174. package/lib/common/openai/OpenAIUserTextContent.js.map +0 -1
  175. package/lib/common/openai/index.js.map +0 -1
  176. package/lib/events/AutoBeCompleteEventMovie.js.map +0 -1
  177. package/lib/events/AutoBeProgressEventMovie.js.map +0 -1
  178. package/lib/events/AutoBeScenarioEventMovie.js.map +0 -1
  179. package/lib/events/AutoBeStartEventMovie.js.map +0 -1
  180. package/lib/events/AutoBeValidateEventMovie.js.map +0 -1
  181. package/lib/events/common/CollapsibleEventGroup.js.map +0 -1
  182. package/lib/events/common/EventCard.js.map +0 -1
  183. package/lib/events/common/EventContent.js.map +0 -1
  184. package/lib/events/common/EventHeader.js.map +0 -1
  185. package/lib/events/common/EventIcon.js.map +0 -1
  186. package/lib/events/common/ProgressBar.js.map +0 -1
  187. package/lib/events/common/index.js.map +0 -1
  188. package/lib/events/groups/ValidateEventGroup.js.map +0 -1
  189. package/lib/events/groups/index.js +0 -6
  190. package/lib/events/groups/index.js.map +0 -1
  191. package/lib/events/index.js.map +0 -1
  192. package/lib/events/utils/eventGrouper.js.map +0 -1
  193. package/lib/events/utils/index.js.map +0 -1
  194. package/src/events/README.md +0 -169
  195. /package/lib/{common → components/common}/ChatBubble.d.ts +0 -0
  196. /package/lib/{common → components/common}/openai/OpenAIContent.d.ts +0 -0
  197. /package/lib/{common → components/common}/openai/OpenAIContent.js +0 -0
  198. /package/lib/{common → components/common}/openai/OpenAIUserAudioContent.d.ts +0 -0
  199. /package/lib/{common → components/common}/openai/OpenAIUserAudioContent.js +0 -0
  200. /package/lib/{common → components/common}/openai/OpenAIUserFileContent.d.ts +0 -0
  201. /package/lib/{common → components/common}/openai/OpenAIUserFileContent.js +0 -0
  202. /package/lib/{common → components/common}/openai/OpenAIUserImageContent.d.ts +0 -0
  203. /package/lib/{common → components/common}/openai/OpenAIUserImageContent.js +0 -0
  204. /package/lib/{common → components/common}/openai/OpenAIUserTextContent.d.ts +0 -0
  205. /package/lib/{common → components/common}/openai/index.d.ts +0 -0
  206. /package/lib/{common → components/common}/openai/index.js +0 -0
  207. /package/lib/{events → components/events}/AutoBeCompleteEventMovie.d.ts +0 -0
  208. /package/lib/{events → components/events}/AutoBeCompleteEventMovie.js +0 -0
  209. /package/lib/{events → components/events}/AutoBeProgressEventMovie.d.ts +0 -0
  210. /package/lib/{events → components/events}/AutoBeProgressEventMovie.js +0 -0
  211. /package/lib/{events → components/events}/AutoBeScenarioEventMovie.d.ts +0 -0
  212. /package/lib/{events → components/events}/AutoBeScenarioEventMovie.js +0 -0
  213. /package/lib/{events → components/events}/AutoBeStartEventMovie.d.ts +0 -0
  214. /package/lib/{events → components/events}/AutoBeStartEventMovie.js +0 -0
  215. /package/lib/{events → components/events}/AutoBeValidateEventMovie.d.ts +0 -0
  216. /package/lib/{events → components/events}/common/CollapsibleEventGroup.d.ts +0 -0
  217. /package/lib/{events → components/events}/common/EventCard.d.ts +0 -0
  218. /package/lib/{events → components/events}/common/EventCard.js +0 -0
  219. /package/lib/{events → components/events}/common/EventContent.d.ts +0 -0
  220. /package/lib/{events → components/events}/common/EventContent.js +0 -0
  221. /package/lib/{events → components/events}/common/EventHeader.d.ts +0 -0
  222. /package/lib/{events → components/events}/common/EventIcon.d.ts +0 -0
  223. /package/lib/{events → components/events}/common/EventIcon.js +0 -0
  224. /package/lib/{events → components/events}/common/ProgressBar.d.ts +0 -0
  225. /package/lib/{events → components/events}/common/index.d.ts +0 -0
  226. /package/lib/{events → components/events}/common/index.js +0 -0
  227. /package/lib/{events → components/events}/groups/ValidateEventGroup.d.ts +0 -0
  228. /package/lib/{events → components/events}/utils/eventGrouper.d.ts +0 -0
  229. /package/lib/{events → components/events}/utils/eventGrouper.js +0 -0
  230. /package/lib/{events → components/events}/utils/index.d.ts +0 -0
  231. /package/lib/{events → components/events}/utils/index.js +0 -0
  232. /package/lib/{AutoBeChatUploadSendButton.d.ts → components/upload/AutoBeChatUploadSendButton.d.ts} +0 -0
  233. /package/lib/{AutoBeChatUploadSendButton.js → components/upload/AutoBeChatUploadSendButton.js} +0 -0
  234. /package/lib/{AutoBeFileUploadBox.js → components/upload/AutoBeFileUploadBox.js} +0 -0
  235. /package/lib/{AutoBeVoiceRecoderButton.d.ts → components/upload/AutoBeVoiceRecoderButton.d.ts} +0 -0
  236. /package/src/{common → components/common}/openai/OpenAIContent.tsx +0 -0
  237. /package/src/{common → components/common}/openai/OpenAIUserAudioContent.tsx +0 -0
  238. /package/src/{common → components/common}/openai/OpenAIUserFileContent.tsx +0 -0
  239. /package/src/{common → components/common}/openai/OpenAIUserImageContent.tsx +0 -0
  240. /package/src/{common → components/common}/openai/index.ts +0 -0
  241. /package/src/{events → components/events}/AutoBeCompleteEventMovie.tsx +0 -0
  242. /package/src/{events → components/events}/AutoBeProgressEventMovie.tsx +0 -0
  243. /package/src/{events → components/events}/AutoBeScenarioEventMovie.tsx +0 -0
  244. /package/src/{events → components/events}/AutoBeStartEventMovie.tsx +0 -0
  245. /package/src/{events → components/events}/common/EventCard.tsx +0 -0
  246. /package/src/{events → components/events}/common/EventContent.tsx +0 -0
  247. /package/src/{events → components/events}/common/EventIcon.tsx +0 -0
  248. /package/src/{events → components/events}/common/index.ts +0 -0
  249. /package/src/{events → components/events}/utils/eventGrouper.tsx +0 -0
  250. /package/src/{events → components/events}/utils/index.ts +0 -0
  251. /package/src/{AutoBeChatUploadSendButton.tsx → components/upload/AutoBeChatUploadSendButton.tsx} +0 -0
@@ -0,0 +1,483 @@
1
+ import { IAutoBeTokenUsageJson } from "@autobe/interface";
2
+ import React from "react";
3
+
4
+ import { useAutoBeAgent } from "../context/AutoBeAgentContext";
5
+ import { useEscapeKey } from "../hooks";
6
+ import { AutoBeListenerState } from "../structure";
7
+ import { toCompactNumberFormat } from "../utils";
8
+
9
+ // Types
10
+ interface IAutoBeStatusModalProps {
11
+ isOpen: boolean;
12
+ onClose: () => void;
13
+ }
14
+
15
+ // Style constants
16
+ const MODAL_STYLES = {
17
+ overlay: {
18
+ position: "fixed" as const,
19
+ top: 0,
20
+ left: 0,
21
+ right: 0,
22
+ bottom: 0,
23
+ background: "rgba(0, 0, 0, 0.6)",
24
+ backdropFilter: "blur(8px)",
25
+ display: "flex",
26
+ alignItems: "center",
27
+ justifyContent: "center",
28
+ zIndex: 1001,
29
+ padding: "1rem",
30
+ },
31
+ container: {
32
+ background: "#ffffff",
33
+ borderRadius: "16px",
34
+ boxShadow:
35
+ "0 25px 50px -12px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.05)",
36
+ maxWidth: "700px",
37
+ maxHeight: "85vh",
38
+ width: "100%",
39
+ overflowY: "auto" as const,
40
+ position: "relative" as const,
41
+ },
42
+ closeButton: {
43
+ position: "absolute" as const,
44
+ top: "1rem",
45
+ right: "1rem",
46
+ background: "rgba(107, 114, 128, 0.1)",
47
+ border: "none",
48
+ borderRadius: "50%",
49
+ width: "2rem",
50
+ height: "2rem",
51
+ display: "flex",
52
+ alignItems: "center",
53
+ justifyContent: "center",
54
+ cursor: "pointer",
55
+ color: "#6b7280",
56
+ fontSize: "1.2rem",
57
+ zIndex: 10,
58
+ },
59
+ content: {
60
+ padding: "1.25rem",
61
+ },
62
+ section: {
63
+ display: "flex",
64
+ flexDirection: "column" as const,
65
+ gap: "1.5rem",
66
+ },
67
+ } as const;
68
+
69
+ const CARD_STYLES = {
70
+ base: {
71
+ background: "linear-gradient(145deg, #ffffff, #f8fafc)",
72
+ borderRadius: "8px",
73
+ padding: "0.7rem",
74
+ marginBottom: "0.4rem",
75
+ border: "1px solid rgba(148, 163, 184, 0.15)",
76
+ boxShadow: "0 1px 3px 0 rgba(0, 0, 0, 0.1)",
77
+ },
78
+ header: {
79
+ margin: "0 0 0.5rem 0",
80
+ fontSize: "0.8rem",
81
+ fontWeight: "700",
82
+ color: "#374151",
83
+ textTransform: "capitalize" as const,
84
+ letterSpacing: "0.025em",
85
+ },
86
+ sectionTitle: {
87
+ margin: 0,
88
+ color: "#1e293b",
89
+ fontSize: "0.9rem",
90
+ fontWeight: "600",
91
+ letterSpacing: "-0.01em",
92
+ },
93
+ } as const;
94
+
95
+ const PROGRESS_STYLES = {
96
+ card: {
97
+ borderRadius: "10px",
98
+ padding: "0.75rem",
99
+ position: "relative" as const,
100
+ overflow: "hidden",
101
+ },
102
+ completed: {
103
+ background: "linear-gradient(135deg, #10b981, #059669)",
104
+ border: "1px solid rgba(16, 185, 129, 0.2)",
105
+ color: "white",
106
+ boxShadow: "0 2px 8px rgba(16, 185, 129, 0.25)",
107
+ },
108
+ pending: {
109
+ background: "linear-gradient(145deg, #ffffff, #f8fafc)",
110
+ border: "1px solid rgba(148, 163, 184, 0.15)",
111
+ color: "#6b7280",
112
+ boxShadow: "0 2px 4px -1px rgba(0, 0, 0, 0.05)",
113
+ },
114
+ } as const;
115
+
116
+ // Step configuration
117
+ const PROGRESS_STEPS = [
118
+ {
119
+ name: "analyze",
120
+ title: "Requirements Analysis",
121
+ getResults: (state: AutoBeListenerState) => {
122
+ if (!state.analyze) return null;
123
+ const fileCount = Object.keys(state.analyze.files).length;
124
+ const roleCount = state.analyze.roles.length;
125
+ return `${fileCount} analysis files, ${roleCount} user roles`;
126
+ },
127
+ },
128
+ {
129
+ name: "prisma",
130
+ title: "Database Design",
131
+ getResults: (state: AutoBeListenerState) => {
132
+ if (!state.prisma) return null;
133
+ const schemaCount = Object.keys(state.prisma.schemas).length;
134
+ return `${schemaCount} schema files`;
135
+ },
136
+ },
137
+ {
138
+ name: "interface",
139
+ title: "API Interface",
140
+ getResults: (state: AutoBeListenerState) => {
141
+ if (!state.interface) return null;
142
+ const operationCount = state.interface.document.operations.length;
143
+ const authCount = state.interface.authorizations.length;
144
+ return `${operationCount} API endpoints, ${authCount} auth`;
145
+ },
146
+ },
147
+ {
148
+ name: "test",
149
+ title: "Test Code",
150
+ getResults: (state: AutoBeListenerState) => {
151
+ if (!state.test) return null;
152
+ const testCount = state.test.files.length;
153
+ return `${testCount} test files`;
154
+ },
155
+ },
156
+ {
157
+ name: "realize",
158
+ title: "Implementation Complete",
159
+ getResults: (state: AutoBeListenerState) => {
160
+ if (!state.realize) return null;
161
+ const functionCount = state.realize.functions.length;
162
+ const authCount = state.realize.authorizations.length;
163
+ return `${functionCount} implementation functions, ${authCount} auth decorators`;
164
+ },
165
+ },
166
+ ] as const;
167
+
168
+ // Helper components
169
+ const SectionTitle = ({ children }: { children: React.ReactNode }) => (
170
+ <div style={{ marginBottom: "1rem" }}>
171
+ <h3 style={CARD_STYLES.sectionTitle}>{children}</h3>
172
+ </div>
173
+ );
174
+
175
+ const ConnectionInfo = ({
176
+ header,
177
+ }: {
178
+ header: ReturnType<typeof useAutoBeAgent>["header"];
179
+ }) => (
180
+ <div>
181
+ <SectionTitle>Connection Info</SectionTitle>
182
+ <div
183
+ style={{
184
+ background: "linear-gradient(145deg, #ffffff, #f8fafc)",
185
+ borderRadius: "10px",
186
+ padding: "1rem",
187
+ border: "1px solid rgba(148, 163, 184, 0.15)",
188
+ boxShadow: "0 2px 4px -1px rgba(0, 0, 0, 0.05)",
189
+ }}
190
+ >
191
+ <p
192
+ style={{
193
+ margin: 0,
194
+ fontSize: "0.8rem",
195
+ color: "#374151",
196
+ lineHeight: 1.5,
197
+ }}
198
+ >
199
+ <strong>Model:</strong> {header?.model || "N/A"} |{" "}
200
+ <strong>Vendor:</strong> {header?.vendor.model || "N/A"} |{" "}
201
+ <strong>Locale:</strong> {header?.locale || "N/A"} |{" "}
202
+ <strong>Timezone:</strong> {header?.timezone || "N/A"}
203
+ </p>
204
+ </div>
205
+ </div>
206
+ );
207
+
208
+ const HighlightNumbers = ({
209
+ text,
210
+ isCompleted,
211
+ }: {
212
+ text: string;
213
+ isCompleted: boolean;
214
+ }) => {
215
+ const parts = text.split(/(\d+)/);
216
+ return (
217
+ <>
218
+ {parts.map((part, index) => {
219
+ const isNumber = /^\d+$/.test(part);
220
+ if (isNumber) {
221
+ return (
222
+ <span
223
+ key={index}
224
+ style={{
225
+ fontWeight: "700",
226
+ fontSize: "0.8rem",
227
+ color: isCompleted ? "#ffffff" : "#3b82f6",
228
+ }}
229
+ >
230
+ {part}
231
+ </span>
232
+ );
233
+ }
234
+ return part;
235
+ })}
236
+ </>
237
+ );
238
+ };
239
+
240
+ const ProgressCard = ({
241
+ step,
242
+ isCompleted,
243
+ results,
244
+ }: {
245
+ step: (typeof PROGRESS_STEPS)[number];
246
+ isCompleted: boolean;
247
+ results: string | null;
248
+ }) => (
249
+ <div
250
+ style={{
251
+ ...PROGRESS_STYLES.card,
252
+ ...(isCompleted ? PROGRESS_STYLES.completed : PROGRESS_STYLES.pending),
253
+ }}
254
+ >
255
+ <div
256
+ style={{
257
+ display: "flex",
258
+ justifyContent: "space-between",
259
+ alignItems: "center",
260
+ }}
261
+ >
262
+ <div style={{ flex: 1 }}>
263
+ <div style={{ display: "flex", flexDirection: "row", gap: "0.2rem" }}>
264
+ <span
265
+ style={{
266
+ fontSize: "0.85rem",
267
+ fontWeight: "700",
268
+ marginBottom: "0.2rem",
269
+ textTransform: "uppercase",
270
+ letterSpacing: "0.02em",
271
+ }}
272
+ >
273
+ {step.name}
274
+ </span>
275
+ <span
276
+ style={{
277
+ fontSize: "0.75rem",
278
+ opacity: 0.9,
279
+ marginBottom: "0.2rem",
280
+ }}
281
+ >
282
+ ({step.title})
283
+ </span>
284
+ </div>
285
+
286
+ {results && (
287
+ <div
288
+ style={{
289
+ fontSize: "0.7rem",
290
+ opacity: 0.8,
291
+ fontWeight: "500",
292
+ }}
293
+ >
294
+ <HighlightNumbers text={results} isCompleted={isCompleted} />
295
+ </div>
296
+ )}
297
+ </div>
298
+ <div
299
+ style={{
300
+ fontSize: "0.7rem",
301
+ fontWeight: "600",
302
+ padding: "0.3rem 0.6rem",
303
+ borderRadius: "10px",
304
+ background: isCompleted
305
+ ? "rgba(255, 255, 255, 0.2)"
306
+ : "rgba(107, 114, 128, 0.1)",
307
+ }}
308
+ >
309
+ {isCompleted ? "Completed" : "Pending"}
310
+ </div>
311
+ </div>
312
+ </div>
313
+ );
314
+
315
+ const ProgressStatus = ({ state }: { state: AutoBeListenerState }) => (
316
+ <div>
317
+ <SectionTitle>Progress Status</SectionTitle>
318
+ <div
319
+ style={{
320
+ display: "flex",
321
+ flexDirection: "column",
322
+ gap: "0.5rem",
323
+ }}
324
+ >
325
+ {PROGRESS_STEPS.map((step) => (
326
+ <ProgressCard
327
+ key={step.name}
328
+ step={step}
329
+ isCompleted={state[step.name as keyof AutoBeListenerState] !== null}
330
+ results={step.getResults(state)}
331
+ />
332
+ ))}
333
+ </div>
334
+ </div>
335
+ );
336
+
337
+ const TokenRow = ({
338
+ label,
339
+ value,
340
+ subInfo,
341
+ }: {
342
+ label: string;
343
+ value: number;
344
+ subInfo?: { label: string; value: number };
345
+ }) => (
346
+ <div
347
+ style={{
348
+ display: "flex",
349
+ justifyContent: "space-between",
350
+ alignItems: "center",
351
+ }}
352
+ >
353
+ <div style={{ display: "flex", flexDirection: "column" }}>
354
+ <span
355
+ style={{
356
+ fontSize: "0.7rem",
357
+ fontWeight: "600",
358
+ color: "#6b7280",
359
+ }}
360
+ >
361
+ {label}
362
+ </span>
363
+ {subInfo && (
364
+ <span
365
+ style={{
366
+ fontSize: "0.6rem",
367
+ color: "#9ca3af",
368
+ fontWeight: "500",
369
+ }}
370
+ >
371
+ {subInfo.label}: {toCompactNumberFormat(subInfo.value)}
372
+ </span>
373
+ )}
374
+ </div>
375
+ <span
376
+ style={{
377
+ fontSize: "0.75rem",
378
+ fontWeight: "700",
379
+ color: "#1f2937",
380
+ }}
381
+ >
382
+ {toCompactNumberFormat(value)}
383
+ </span>
384
+ </div>
385
+ );
386
+
387
+ const ComponentStats = ({
388
+ name,
389
+ component,
390
+ }: {
391
+ name: string;
392
+ component: IAutoBeTokenUsageJson.IComponent;
393
+ }) => (
394
+ <div style={CARD_STYLES.base}>
395
+ <h4 style={CARD_STYLES.header}>{name}</h4>
396
+ <div
397
+ style={{
398
+ display: "flex",
399
+ flexDirection: "column",
400
+ gap: "0.4rem",
401
+ }}
402
+ >
403
+ <div
404
+ style={{
405
+ display: "flex",
406
+ flexDirection: "column",
407
+ gap: "0.2rem",
408
+ }}
409
+ >
410
+ <TokenRow label="Total" value={component.total} />
411
+ <TokenRow
412
+ label="Input"
413
+ value={component.input.total}
414
+ subInfo={
415
+ component.input.cached > 0
416
+ ? { label: "Cache", value: component.input.cached }
417
+ : undefined
418
+ }
419
+ />
420
+ <TokenRow label="Output" value={component.output.total} />
421
+ </div>
422
+ </div>
423
+ </div>
424
+ );
425
+
426
+ const TokenUsage = ({
427
+ tokenUsage,
428
+ }: {
429
+ tokenUsage: IAutoBeTokenUsageJson | null;
430
+ }) => {
431
+ if (!tokenUsage) {
432
+ return (
433
+ <div
434
+ style={{
435
+ padding: "2rem",
436
+ textAlign: "center",
437
+ color: "#6b7280",
438
+ fontSize: "0.9rem",
439
+ }}
440
+ >
441
+ Unable to load token usage information
442
+ </div>
443
+ );
444
+ }
445
+
446
+ return (
447
+ <div>
448
+ <SectionTitle>Token Usage - Total</SectionTitle>
449
+ <ComponentStats name="total" component={tokenUsage.aggregate} />
450
+ </div>
451
+ );
452
+ };
453
+
454
+ export const AutoBeStatusModal = ({
455
+ isOpen,
456
+ onClose,
457
+ }: IAutoBeStatusModalProps) => {
458
+ const { tokenUsage, state, header } = useAutoBeAgent();
459
+
460
+ useEscapeKey(isOpen, onClose);
461
+
462
+ if (!isOpen) return null;
463
+
464
+ return (
465
+ <div style={MODAL_STYLES.overlay} onClick={onClose}>
466
+ <div style={MODAL_STYLES.container} onClick={(e) => e.stopPropagation()}>
467
+ <button onClick={onClose} style={MODAL_STYLES.closeButton}>
468
+ ×
469
+ </button>
470
+
471
+ <div style={MODAL_STYLES.content}>
472
+ <div style={MODAL_STYLES.section}>
473
+ <ConnectionInfo header={header} />
474
+ <ProgressStatus state={state} />
475
+ <TokenUsage tokenUsage={tokenUsage} />
476
+ </div>
477
+ </div>
478
+ </div>
479
+ </div>
480
+ );
481
+ };
482
+
483
+ export default AutoBeStatusModal;
@@ -6,7 +6,9 @@ interface IAutoBeUserMessageHistoryMovieProps {
6
6
  message: Array<AutoBeUserMessageContent>;
7
7
  }
8
8
 
9
- const AutoBeUserMessageMovie = (props: IAutoBeUserMessageHistoryMovieProps) => {
9
+ export const AutoBeUserMessageMovie = (
10
+ props: IAutoBeUserMessageHistoryMovieProps,
11
+ ) => {
10
12
  const { message } = props;
11
13
 
12
14
  return (
@@ -1,6 +1,6 @@
1
1
  import { AutoBeUserMessageContent } from "@autobe/interface";
2
2
 
3
- import { formatTime } from "../utils/time";
3
+ import { formatTime } from "../../utils/time";
4
4
  import { OpenAIContent } from "./openai";
5
5
 
6
6
  /** Props interface for ChatBubble component */
@@ -0,0 +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;
@@ -0,0 +1,2 @@
1
+ export * from "./Collapsible";
2
+ export * from "./ChatBubble";
@@ -3,7 +3,6 @@ export const OpenAIUserTextContent = ({ text }: { text: string }) => (
3
3
  <div
4
4
  style={{
5
5
  position: "relative",
6
- zIndex: 10,
7
6
  fontSize: "0.875rem",
8
7
  lineHeight: "1.625",
9
8
  whiteSpace: "pre-wrap",