@autobe/ui 0.19.1 → 0.21.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 (177) hide show
  1. package/lib/AutoBeChatMain.d.ts +16 -0
  2. package/lib/AutoBeChatMain.js +51 -0
  3. package/lib/AutoBeChatMain.js.map +1 -0
  4. package/lib/banner/AutoBeAgentInformation.d.ts +15 -0
  5. package/lib/banner/AutoBeAgentInformation.js +41 -0
  6. package/lib/banner/AutoBeAgentInformation.js.map +1 -0
  7. package/lib/banner/AutoBeChatBanner.d.ts +15 -0
  8. package/lib/banner/AutoBeChatBanner.js +29 -0
  9. package/lib/banner/AutoBeChatBanner.js.map +1 -0
  10. package/lib/banner/AutoBeChatState.d.ts +6 -0
  11. package/lib/banner/AutoBeChatState.js +80 -0
  12. package/lib/banner/AutoBeChatState.js.map +1 -0
  13. package/lib/banner/AutoBeTokenUsage.d.ts +14 -0
  14. package/lib/banner/AutoBeTokenUsage.js +60 -0
  15. package/lib/banner/AutoBeTokenUsage.js.map +1 -0
  16. package/lib/banner/index.d.ts +4 -0
  17. package/lib/banner/index.js +21 -0
  18. package/lib/banner/index.js.map +1 -0
  19. package/lib/common/Collapsible.d.ts +15 -0
  20. package/lib/common/Collapsible.js +45 -0
  21. package/lib/common/Collapsible.js.map +1 -0
  22. package/lib/common/index.d.ts +2 -0
  23. package/lib/common/index.js +19 -0
  24. package/lib/common/index.js.map +1 -0
  25. package/lib/constant/color.d.ts +18 -0
  26. package/lib/constant/color.js +25 -0
  27. package/lib/constant/color.js.map +1 -0
  28. package/lib/events/AutoBeCompleteEventMovie.d.ts +7 -0
  29. package/lib/events/AutoBeCompleteEventMovie.js +210 -0
  30. package/lib/events/AutoBeCompleteEventMovie.js.map +1 -0
  31. package/lib/events/AutoBeEventMovie.d.ts +8 -0
  32. package/lib/events/AutoBeEventMovie.js +84 -0
  33. package/lib/events/AutoBeEventMovie.js.map +1 -0
  34. package/lib/events/AutoBeProgressEventMovie.js +2 -61
  35. package/lib/events/AutoBeProgressEventMovie.js.map +1 -1
  36. package/lib/events/AutoBeScenarioEventMovie.js +2 -44
  37. package/lib/events/AutoBeScenarioEventMovie.js.map +1 -1
  38. package/lib/events/AutoBeValidateEventMovie.d.ts +6 -0
  39. package/lib/events/AutoBeValidateEventMovie.js +115 -0
  40. package/lib/events/AutoBeValidateEventMovie.js.map +1 -0
  41. package/lib/events/common/CollapsibleEventGroup.d.ts +28 -0
  42. package/lib/events/common/CollapsibleEventGroup.js +89 -0
  43. package/lib/events/common/CollapsibleEventGroup.js.map +1 -0
  44. package/lib/events/common/EventCard.d.ts +13 -0
  45. package/lib/events/common/EventCard.js +43 -0
  46. package/lib/events/common/EventCard.js.map +1 -0
  47. package/lib/events/common/EventContent.d.ts +11 -0
  48. package/lib/events/common/EventContent.js +14 -0
  49. package/lib/events/common/EventContent.js.map +1 -0
  50. package/lib/events/common/EventHeader.d.ts +15 -0
  51. package/lib/events/common/EventHeader.js +41 -0
  52. package/lib/events/common/EventHeader.js.map +1 -0
  53. package/lib/events/common/EventIcon.d.ts +11 -0
  54. package/lib/events/common/EventIcon.js +50 -0
  55. package/lib/events/common/EventIcon.js.map +1 -0
  56. package/lib/events/common/ProgressBar.d.ts +14 -0
  57. package/lib/events/common/ProgressBar.js +33 -0
  58. package/lib/events/common/ProgressBar.js.map +1 -0
  59. package/lib/events/common/index.d.ts +6 -0
  60. package/lib/events/common/index.js +16 -0
  61. package/lib/events/common/index.js.map +1 -0
  62. package/lib/events/groups/ValidateEventGroup.d.ts +12 -0
  63. package/lib/events/groups/ValidateEventGroup.js +78 -0
  64. package/lib/events/groups/ValidateEventGroup.js.map +1 -0
  65. package/lib/events/groups/index.d.ts +1 -0
  66. package/lib/events/groups/index.js +6 -0
  67. package/lib/events/groups/index.js.map +1 -0
  68. package/lib/events/index.d.ts +6 -0
  69. package/lib/events/index.js +27 -1
  70. package/lib/events/index.js.map +1 -1
  71. package/lib/events/utils/eventGrouper.d.ts +20 -0
  72. package/lib/events/utils/eventGrouper.js +74 -0
  73. package/lib/events/utils/eventGrouper.js.map +1 -0
  74. package/lib/events/utils/index.d.ts +1 -0
  75. package/lib/events/utils/index.js +6 -0
  76. package/lib/events/utils/index.js.map +1 -0
  77. package/lib/hooks/index.d.ts +2 -0
  78. package/lib/hooks/index.js +19 -0
  79. package/lib/hooks/index.js.map +1 -0
  80. package/lib/hooks/useIsomorphicLayoutEffect.d.ts +6 -0
  81. package/lib/hooks/useIsomorphicLayoutEffect.js +10 -0
  82. package/lib/hooks/useIsomorphicLayoutEffect.js.map +1 -0
  83. package/lib/hooks/useMediaQuery.d.ts +11 -0
  84. package/lib/hooks/useMediaQuery.js +52 -0
  85. package/lib/hooks/useMediaQuery.js.map +1 -0
  86. package/lib/index.d.ts +5 -0
  87. package/lib/index.js +8 -1
  88. package/lib/index.js.map +1 -1
  89. package/lib/structure/AutoBeListener.d.ts +17 -0
  90. package/lib/structure/AutoBeListener.js +250 -0
  91. package/lib/structure/AutoBeListener.js.map +1 -0
  92. package/lib/structure/AutoBeListenerState.d.ts +14 -0
  93. package/lib/structure/AutoBeListenerState.js +39 -0
  94. package/lib/structure/AutoBeListenerState.js.map +1 -0
  95. package/lib/structure/IAutoBeEventGroup.d.ts +5 -0
  96. package/lib/structure/IAutoBeEventGroup.js +3 -0
  97. package/lib/structure/IAutoBeEventGroup.js.map +1 -0
  98. package/lib/structure/index.d.ts +3 -0
  99. package/lib/structure/index.js +20 -0
  100. package/lib/structure/index.js.map +1 -0
  101. package/lib/upload/AutoBeChatUploadBox.d.ts +31 -0
  102. package/lib/upload/AutoBeChatUploadBox.js +221 -0
  103. package/lib/upload/AutoBeChatUploadBox.js.map +1 -0
  104. package/lib/upload/AutoBeChatUploadSendButton.d.ts +15 -0
  105. package/lib/upload/AutoBeChatUploadSendButton.js +38 -0
  106. package/lib/upload/AutoBeChatUploadSendButton.js.map +1 -0
  107. package/lib/upload/AutoBeFileUploadBox.d.ts +8 -0
  108. package/lib/upload/AutoBeFileUploadBox.js +68 -0
  109. package/lib/upload/AutoBeFileUploadBox.js.map +1 -0
  110. package/lib/upload/AutoBeUploadConfig.d.ts +9 -0
  111. package/lib/upload/AutoBeUploadConfig.js +3 -0
  112. package/lib/upload/AutoBeUploadConfig.js.map +1 -0
  113. package/lib/upload/AutoBeVoiceRecoderButton.d.ts +11 -0
  114. package/lib/upload/AutoBeVoiceRecoderButton.js +58 -0
  115. package/lib/upload/AutoBeVoiceRecoderButton.js.map +1 -0
  116. package/lib/upload/index.d.ts +5 -0
  117. package/lib/upload/index.js +22 -0
  118. package/lib/upload/index.js.map +1 -0
  119. package/lib/utils/AutoBeFileUploader.d.ts +28 -0
  120. package/lib/utils/AutoBeFileUploader.js +237 -0
  121. package/lib/utils/AutoBeFileUploader.js.map +1 -0
  122. package/lib/utils/AutoBeVoiceRecorder.d.ts +7 -0
  123. package/lib/utils/AutoBeVoiceRecorder.js +94 -0
  124. package/lib/utils/AutoBeVoiceRecorder.js.map +1 -0
  125. package/lib/utils/index.d.ts +4 -0
  126. package/lib/utils/index.js +21 -0
  127. package/lib/utils/index.js.map +1 -0
  128. package/lib/utils/number.d.ts +1 -0
  129. package/lib/utils/number.js +20 -0
  130. package/lib/utils/number.js.map +1 -0
  131. package/package.json +13 -2
  132. package/src/AutoBeChatMain.tsx +123 -0
  133. package/src/banner/AutoBeAgentInformation.tsx +102 -0
  134. package/src/banner/AutoBeChatBanner.tsx +72 -0
  135. package/src/banner/AutoBeChatState.tsx +152 -0
  136. package/src/banner/AutoBeTokenUsage.tsx +152 -0
  137. package/src/banner/index.ts +4 -0
  138. package/src/common/Collapsible.tsx +95 -0
  139. package/src/common/index.ts +2 -0
  140. package/src/constant/color.ts +24 -0
  141. package/src/events/AutoBeCompleteEventMovie.tsx +402 -0
  142. package/src/events/AutoBeEventMovie.tsx +114 -0
  143. package/src/events/AutoBeProgressEventMovie.tsx +12 -125
  144. package/src/events/AutoBeScenarioEventMovie.tsx +5 -93
  145. package/src/events/AutoBeValidateEventMovie.tsx +326 -0
  146. package/src/events/README.md +300 -0
  147. package/src/events/common/CollapsibleEventGroup.tsx +220 -0
  148. package/src/events/common/EventCard.tsx +61 -0
  149. package/src/events/common/EventContent.tsx +31 -0
  150. package/src/events/common/EventHeader.tsx +85 -0
  151. package/src/events/common/EventIcon.tsx +82 -0
  152. package/src/events/common/ProgressBar.tsx +63 -0
  153. package/src/events/common/index.ts +13 -0
  154. package/src/events/groups/ValidateEventGroup.tsx +150 -0
  155. package/src/events/groups/index.ts +4 -0
  156. package/src/events/index.ts +12 -0
  157. package/src/events/utils/eventGrouper.tsx +118 -0
  158. package/src/events/utils/index.ts +1 -0
  159. package/src/hooks/index.ts +2 -0
  160. package/src/hooks/useIsomorphicLayoutEffect.ts +8 -0
  161. package/src/hooks/useMediaQuery.ts +68 -0
  162. package/src/index.ts +5 -0
  163. package/src/structure/AutoBeListener.ts +263 -0
  164. package/src/structure/AutoBeListenerState.ts +53 -0
  165. package/src/structure/IAutoBeEventGroup.ts +6 -0
  166. package/src/structure/index.ts +3 -0
  167. package/src/upload/AutoBeChatUploadBox.tsx +372 -0
  168. package/src/upload/AutoBeChatUploadSendButton.tsx +66 -0
  169. package/src/upload/AutoBeFileUploadBox.tsx +123 -0
  170. package/src/upload/AutoBeUploadConfig.ts +5 -0
  171. package/src/upload/AutoBeVoiceRecoderButton.tsx +100 -0
  172. package/src/upload/index.ts +5 -0
  173. package/src/utils/AutoBeFileUploader.ts +279 -0
  174. package/src/utils/AutoBeVoiceRecorder.ts +95 -0
  175. package/src/utils/index.ts +4 -0
  176. package/src/utils/number.ts +17 -0
  177. package/tsconfig.json +2 -1
@@ -6,7 +6,7 @@ import {
6
6
  } from "@autobe/interface";
7
7
  import { JSX } from "react";
8
8
 
9
- import { formatTime } from "../utils/time";
9
+ import { EventCard, EventContent, EventHeader } from "./common";
10
10
 
11
11
  export interface IAutoBeScenarioEventMovieProps {
12
12
  event:
@@ -22,98 +22,10 @@ export const AutoBeScenarioEventMovie = (
22
22
  const { title, description } = getState(event);
23
23
 
24
24
  return (
25
- <div
26
- style={{
27
- backgroundColor: "#f8fafc",
28
- border: "1px solid #e2e8f0",
29
- borderRadius: "0.75rem",
30
- padding: "1.5rem",
31
- marginBottom: "1rem",
32
- boxShadow: "0 1px 3px 0 rgb(0 0 0 / 0.1)",
33
- }}
34
- >
35
- {/* Header */}
36
- <div
37
- style={{
38
- display: "flex",
39
- alignItems: "center",
40
- justifyContent: "space-between",
41
- marginBottom: "1rem",
42
- }}
43
- >
44
- <div
45
- style={{
46
- display: "flex",
47
- alignItems: "center",
48
- gap: "0.75rem",
49
- }}
50
- >
51
- {/* Status Icon */}
52
- <div
53
- style={{
54
- width: "2rem",
55
- height: "2rem",
56
- backgroundColor: "#3b82f6",
57
- borderRadius: "50%",
58
- display: "flex",
59
- alignItems: "center",
60
- justifyContent: "center",
61
- }}
62
- >
63
- <svg
64
- width="16"
65
- height="16"
66
- viewBox="0 0 24 24"
67
- fill="currentColor"
68
- style={{ color: "#ffffff" }}
69
- >
70
- <path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" />
71
- </svg>
72
- </div>
73
-
74
- {/* Title and Step */}
75
- <div>
76
- <h3
77
- style={{
78
- fontSize: "1.125rem",
79
- fontWeight: "600",
80
- color: "#1e293b",
81
- margin: 0,
82
- marginBottom: "0.25rem",
83
- }}
84
- >
85
- {title}
86
- </h3>
87
- </div>
88
- </div>
89
-
90
- {/* Timestamp */}
91
- <div
92
- style={{
93
- fontSize: "0.75rem",
94
- color: "#64748b",
95
- textAlign: "right",
96
- }}
97
- >
98
- {formatTime(event.created_at)}
99
- </div>
100
- </div>
101
-
102
- {/* Description */}
103
- <div
104
- style={{
105
- fontSize: "0.875rem",
106
- lineHeight: "1.5",
107
- color: "#475569",
108
- backgroundColor: "#ffffff",
109
- padding: "1rem",
110
- borderRadius: "0.5rem",
111
- border: "1px solid #e2e8f0",
112
- }}
113
- >
114
- {description}
115
- </div>
116
- </div>
25
+ <EventCard>
26
+ <EventHeader title={title} timestamp={event.created_at} iconType="info" />
27
+ <EventContent>{description}</EventContent>
28
+ </EventCard>
117
29
  );
118
30
  };
119
31
  export default AutoBeScenarioEventMovie;
@@ -0,0 +1,326 @@
1
+ import {
2
+ AutoBeInterfaceComplementEvent,
3
+ AutoBeInterfaceOperationsReviewEvent,
4
+ AutoBePrismaInsufficientEvent,
5
+ AutoBePrismaValidateEvent,
6
+ AutoBeRealizeAuthorizationValidateEvent,
7
+ AutoBeRealizeValidateEvent,
8
+ AutoBeTestValidateEvent,
9
+ } from "@autobe/interface";
10
+ import { JSX } from "react";
11
+
12
+ import { EventCard, EventContent, EventHeader } from "./common";
13
+
14
+ export interface IAutoBeValidateEventMovieProps {
15
+ event:
16
+ | AutoBePrismaInsufficientEvent
17
+ | AutoBePrismaValidateEvent
18
+ | AutoBeInterfaceOperationsReviewEvent
19
+ | AutoBeInterfaceComplementEvent
20
+ | AutoBeTestValidateEvent
21
+ | AutoBeRealizeValidateEvent
22
+ | AutoBeRealizeAuthorizationValidateEvent;
23
+ }
24
+
25
+ export const AutoBeValidateEventMovie = (
26
+ props: IAutoBeValidateEventMovieProps,
27
+ ) => {
28
+ const { event } = props;
29
+ const { title, description, isError, step, isSuccess } = getState(event);
30
+
31
+ const getCardVariant = () => {
32
+ if (isSuccess) return "success";
33
+ if (isError) return "error";
34
+ return "warning";
35
+ };
36
+
37
+ const getIconType = () => {
38
+ if (isSuccess) return "success";
39
+ if (isError) return "error";
40
+ return "warning";
41
+ };
42
+
43
+ return (
44
+ <EventCard variant={getCardVariant()}>
45
+ <EventHeader
46
+ title={title}
47
+ timestamp={event.created_at}
48
+ iconType={getIconType()}
49
+ step={step}
50
+ />
51
+ <EventContent>{description}</EventContent>
52
+ </EventCard>
53
+ );
54
+ };
55
+
56
+ export default AutoBeValidateEventMovie;
57
+
58
+ interface IState {
59
+ title: string;
60
+ description: string | JSX.Element;
61
+ isError: boolean;
62
+ isSuccess: boolean;
63
+ step?: number;
64
+ }
65
+
66
+ function getState(event: IAutoBeValidateEventMovieProps["event"]): IState {
67
+ switch (event.type) {
68
+ case "prismaValidate":
69
+ return {
70
+ title: "Prisma Validation Failed",
71
+ description: (
72
+ <>
73
+ Database schema validation encountered errors that require
74
+ correction.
75
+ <br />
76
+ <br />
77
+ <strong>Error Details:</strong>
78
+ <br />
79
+ {event.result.errors.length > 0 && (
80
+ <>
81
+ {event.result.errors
82
+ .slice(0, 3)
83
+ .map((error: any, idx: number) => (
84
+ <div key={idx} style={{ marginTop: "0.25rem" }}>
85
+ • {error.message}
86
+ </div>
87
+ ))}
88
+ </>
89
+ )}
90
+ <br />
91
+ <strong>Failed Schemas:</strong> {Object.keys(event.schemas).length}{" "}
92
+ file(s)
93
+ </>
94
+ ),
95
+ isError: true,
96
+ isSuccess: false,
97
+ step: event.step,
98
+ };
99
+ case "testValidate":
100
+ const isTestSuccess = event.result.type === "success";
101
+ return {
102
+ title: isTestSuccess
103
+ ? "Test Validation Successful"
104
+ : "Test Validation Failed",
105
+ description: (
106
+ <>
107
+ Test file validation completed.
108
+ <br />
109
+ <br />
110
+ <strong>File:</strong> {event.file.location}
111
+ <br />
112
+ <strong>Status:</strong> {isTestSuccess ? "Success" : "Failed"}
113
+ {!isTestSuccess && (
114
+ <>
115
+ <br />
116
+ <br />
117
+ <strong>Compilation Issues:</strong>
118
+ <br />
119
+ {event.result.type === "failure" &&
120
+ event.result.diagnostics
121
+ .slice(0, 3)
122
+ .map((diagnostic: any, idx: number) => (
123
+ <div key={idx} style={{ marginTop: "0.25rem" }}>
124
+ • {diagnostic.messageText}
125
+ </div>
126
+ ))}
127
+ {event.result.type === "exception" && (
128
+ <div style={{ marginTop: "0.25rem" }}>
129
+ • Exception occurred during compilation
130
+ </div>
131
+ )}
132
+ </>
133
+ )}
134
+ </>
135
+ ),
136
+ isError: !isTestSuccess,
137
+ isSuccess: isTestSuccess,
138
+ step: event.step,
139
+ };
140
+ case "realizeValidate":
141
+ return {
142
+ title: "Implementation Validation Failed",
143
+ description: (
144
+ <>
145
+ Implementation code compilation encountered errors that need
146
+ correction.
147
+ <br />
148
+ <br />
149
+ <strong>Failed Files:</strong> {Object.keys(event.files).length}{" "}
150
+ file(s)
151
+ <br />
152
+ <br />
153
+ <strong>Error Type:</strong>{" "}
154
+ {event.result.type === "failure"
155
+ ? "Compilation Error"
156
+ : "Runtime Exception"}
157
+ <br />
158
+ {event.result.type === "failure" &&
159
+ event.result.diagnostics.length > 0 && (
160
+ <>
161
+ <br />
162
+ <strong>First Error:</strong>
163
+ <br />
164
+ {event.result.diagnostics[0].messageText}
165
+ </>
166
+ )}
167
+ </>
168
+ ),
169
+ isError: true,
170
+ isSuccess: false,
171
+ step: event.step,
172
+ };
173
+ case "realizeAuthorizationValidate":
174
+ const isAuthSuccess = event.result.type === "success";
175
+ return {
176
+ title: isAuthSuccess
177
+ ? "Authorization Validation Successful"
178
+ : "Authorization Validation Failed",
179
+ description: (
180
+ <>
181
+ Authorization implementation validation completed.
182
+ <br />
183
+ <br />
184
+ <strong>Role:</strong> {event.authorization.role.name}(
185
+ {event.authorization.role.description})
186
+ <br />
187
+ <strong>Status:</strong> {isAuthSuccess ? "Success" : "Failed"}
188
+ {!isAuthSuccess && (
189
+ <>
190
+ <br />
191
+ <br />
192
+ <strong>Validation Issues:</strong>
193
+ <br />
194
+ {event.result.type === "failure" &&
195
+ event.result.diagnostics
196
+ .slice(0, 2)
197
+ .map((diagnostic: any, idx: number) => (
198
+ <div key={idx} style={{ marginTop: "0.25rem" }}>
199
+ • {diagnostic.messageText}
200
+ </div>
201
+ ))}
202
+ {event.result.type === "exception" && (
203
+ <div style={{ marginTop: "0.25rem" }}>
204
+ • Exception occurred during validation
205
+ </div>
206
+ )}
207
+ </>
208
+ )}
209
+ </>
210
+ ),
211
+ isError: !isAuthSuccess,
212
+ isSuccess: isAuthSuccess,
213
+ step: event.step,
214
+ };
215
+ case "prismaInsufficient":
216
+ return {
217
+ title: "Prisma Model Generation Insufficient",
218
+ description: (
219
+ <>
220
+ Prisma model generation was incomplete for the assigned component.
221
+ <br />
222
+ <br />
223
+ <strong>Component:</strong> {event.component.namespace}
224
+ <br />
225
+ <strong>Generated Models:</strong> {event.actual.length}
226
+ <br />
227
+ <strong>Missing Models:</strong> {event.missed.length}
228
+ <br />
229
+ <br />
230
+ {event.missed.length > 0 && (
231
+ <>
232
+ <strong>Missed Tables:</strong>
233
+ <br />
234
+ {event.missed.slice(0, 5).map((table: string, idx: number) => (
235
+ <div key={idx} style={{ marginTop: "0.25rem" }}>
236
+ • {table}
237
+ </div>
238
+ ))}
239
+ {event.missed.length > 5 && (
240
+ <div style={{ marginTop: "0.25rem" }}>
241
+ ... and {event.missed.length - 5} more
242
+ </div>
243
+ )}
244
+ </>
245
+ )}
246
+ </>
247
+ ),
248
+ isError: true,
249
+ isSuccess: false,
250
+ step: undefined, // prismaInsufficient doesn't have step
251
+ };
252
+ case "interfaceOperationsReview":
253
+ return {
254
+ title: "Interface Operations Review",
255
+ description: (
256
+ <>
257
+ API operations are being reviewed for quality and consistency.
258
+ <br />
259
+ <br />
260
+ <strong>Operations Count:</strong> {event.operations.length}
261
+ <br />
262
+ <strong>Status:</strong> Review in progress
263
+ <br />
264
+ <br />
265
+ <strong>Review Summary:</strong>
266
+ <br />
267
+ <div
268
+ style={{
269
+ maxHeight: "100px",
270
+ overflow: "hidden",
271
+ fontSize: "0.75rem",
272
+ color: "#64748b",
273
+ marginTop: "0.5rem",
274
+ }}
275
+ >
276
+ {event.review.length > 200
277
+ ? `${event.review.substring(0, 200)}...`
278
+ : event.review}
279
+ </div>
280
+ </>
281
+ ),
282
+ isError: false,
283
+ isSuccess: true,
284
+ step: event.step,
285
+ };
286
+ case "interfaceComplement":
287
+ return {
288
+ title: "Interface Schema Complement",
289
+ description: (
290
+ <>
291
+ Missing schema definitions are being added to complete the API
292
+ specification.
293
+ <br />
294
+ <br />
295
+ <strong>Missing Schemas:</strong> {event.missed.length}
296
+ <br />
297
+ <strong>Added Schemas:</strong> {Object.keys(event.schemas).length}
298
+ <br />
299
+ <br />
300
+ {event.missed.length > 0 && (
301
+ <>
302
+ <strong>Complemented Types:</strong>
303
+ <br />
304
+ {event.missed.slice(0, 5).map((schema: string, idx: number) => (
305
+ <div key={idx} style={{ marginTop: "0.25rem" }}>
306
+ • {schema}
307
+ </div>
308
+ ))}
309
+ {event.missed.length > 5 && (
310
+ <div style={{ marginTop: "0.25rem" }}>
311
+ ... and {event.missed.length - 5} more
312
+ </div>
313
+ )}
314
+ </>
315
+ )}
316
+ </>
317
+ ),
318
+ isError: false,
319
+ isSuccess: true,
320
+ step: event.step,
321
+ };
322
+ default:
323
+ event satisfies never;
324
+ throw new Error("Unknown validation event type");
325
+ }
326
+ }