veryfront 0.1.875 → 0.1.876

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 (62) hide show
  1. package/esm/deno.d.ts +2 -0
  2. package/esm/deno.js +3 -1
  3. package/esm/src/agent/testing/agent-tester.d.ts +53 -0
  4. package/esm/src/agent/testing/agent-tester.d.ts.map +1 -0
  5. package/esm/src/agent/testing/agent-tester.js +132 -0
  6. package/esm/src/agent/testing/durable-run-canaries/cli-runner.d.ts +21 -0
  7. package/esm/src/agent/testing/durable-run-canaries/cli-runner.d.ts.map +1 -0
  8. package/esm/src/agent/testing/durable-run-canaries/cli-runner.js +66 -0
  9. package/esm/src/agent/testing/durable-run-canaries/environment.d.ts +14 -0
  10. package/esm/src/agent/testing/durable-run-canaries/environment.d.ts.map +1 -0
  11. package/esm/src/agent/testing/durable-run-canaries/environment.js +15 -0
  12. package/esm/src/agent/testing/durable-run-canaries/index.d.ts +5 -0
  13. package/esm/src/agent/testing/durable-run-canaries/index.d.ts.map +1 -0
  14. package/esm/src/agent/testing/durable-run-canaries/index.js +4 -0
  15. package/esm/src/agent/testing/durable-run-canaries/runner.d.ts +118 -0
  16. package/esm/src/agent/testing/durable-run-canaries/runner.d.ts.map +1 -0
  17. package/esm/src/agent/testing/durable-run-canaries/runner.js +391 -0
  18. package/esm/src/agent/testing/durable-run-canaries/validation.d.ts +12 -0
  19. package/esm/src/agent/testing/durable-run-canaries/validation.d.ts.map +1 -0
  20. package/esm/src/agent/testing/durable-run-canaries/validation.js +71 -0
  21. package/esm/src/agent/testing/index.d.ts +10 -0
  22. package/esm/src/agent/testing/index.d.ts.map +1 -0
  23. package/esm/src/agent/testing/index.js +9 -0
  24. package/esm/src/agent/testing/live-evals/api-client.d.ts +102 -0
  25. package/esm/src/agent/testing/live-evals/api-client.d.ts.map +1 -0
  26. package/esm/src/agent/testing/live-evals/api-client.js +313 -0
  27. package/esm/src/agent/testing/live-evals/cli-runner.d.ts +40 -0
  28. package/esm/src/agent/testing/live-evals/cli-runner.d.ts.map +1 -0
  29. package/esm/src/agent/testing/live-evals/cli-runner.js +144 -0
  30. package/esm/src/agent/testing/live-evals/environment.d.ts +15 -0
  31. package/esm/src/agent/testing/live-evals/environment.d.ts.map +1 -0
  32. package/esm/src/agent/testing/live-evals/environment.js +20 -0
  33. package/esm/src/agent/testing/live-evals/formatting.d.ts +15 -0
  34. package/esm/src/agent/testing/live-evals/formatting.d.ts.map +1 -0
  35. package/esm/src/agent/testing/live-evals/formatting.js +75 -0
  36. package/esm/src/agent/testing/live-evals/index.d.ts +12 -0
  37. package/esm/src/agent/testing/live-evals/index.d.ts.map +1 -0
  38. package/esm/src/agent/testing/live-evals/index.js +11 -0
  39. package/esm/src/agent/testing/live-evals/metadata.d.ts +34 -0
  40. package/esm/src/agent/testing/live-evals/metadata.d.ts.map +1 -0
  41. package/esm/src/agent/testing/live-evals/metadata.js +116 -0
  42. package/esm/src/agent/testing/live-evals/performance.d.ts +19 -0
  43. package/esm/src/agent/testing/live-evals/performance.d.ts.map +1 -0
  44. package/esm/src/agent/testing/live-evals/performance.js +22 -0
  45. package/esm/src/agent/testing/live-evals/preflight.d.ts +12 -0
  46. package/esm/src/agent/testing/live-evals/preflight.d.ts.map +1 -0
  47. package/esm/src/agent/testing/live-evals/preflight.js +27 -0
  48. package/esm/src/agent/testing/live-evals/report.d.ts +55 -0
  49. package/esm/src/agent/testing/live-evals/report.d.ts.map +1 -0
  50. package/esm/src/agent/testing/live-evals/report.js +79 -0
  51. package/esm/src/agent/testing/live-evals/request.d.ts +31 -0
  52. package/esm/src/agent/testing/live-evals/request.d.ts.map +1 -0
  53. package/esm/src/agent/testing/live-evals/request.js +48 -0
  54. package/esm/src/agent/testing/live-evals/result.d.ts +56 -0
  55. package/esm/src/agent/testing/live-evals/result.d.ts.map +1 -0
  56. package/esm/src/agent/testing/live-evals/result.js +36 -0
  57. package/esm/src/agent/testing/live-evals/runner.d.ts +135 -0
  58. package/esm/src/agent/testing/live-evals/runner.d.ts.map +1 -0
  59. package/esm/src/agent/testing/live-evals/runner.js +396 -0
  60. package/esm/src/utils/version-constant.d.ts +1 -1
  61. package/esm/src/utils/version-constant.js +1 -1
  62. package/package.json +5 -1
@@ -0,0 +1,313 @@
1
+ import * as dntShim from "../../../../_dnt.shims.js";
2
+ import { ensureBuiltinSchemaValidator } from "../../../extensions/builtin-extensions.js";
3
+ import { defineSchema } from "../../../schemas/index.js";
4
+ ensureBuiltinSchemaValidator();
5
+ const getLiveEvalIdResponseSchema = defineSchema((v) => v.object({
6
+ id: v.string().optional(),
7
+ }));
8
+ const getProjectUploadResponseSchema = defineSchema((v) => v.object({
9
+ file_upload_url: v.string().optional(),
10
+ required_headers: v.record(v.string(), v.string()).optional(),
11
+ }));
12
+ const getProjectUploadListResponseSchema = defineSchema((v) => v.object({
13
+ data: v.array(v.object({ path: v.string().optional() }).passthrough()).optional(),
14
+ }));
15
+ const getProjectFileResponseSchema = defineSchema((v) => v.object({
16
+ path: v.string().optional(),
17
+ content: v.string().optional(),
18
+ }));
19
+ const getInputRequestRecordSchema = defineSchema((v) => v.object({
20
+ id: v.string(),
21
+ status: v.string(),
22
+ }));
23
+ const getInputRequestListResponseSchema = defineSchema((v) => v.object({
24
+ data: v.array(v.unknown()).optional(),
25
+ }));
26
+ function createLiveEvalAuthHeaders(context) {
27
+ const headers = new Headers();
28
+ headers.set("Authorization", `Bearer ${context.authToken}`);
29
+ return headers;
30
+ }
31
+ function createLiveEvalJsonHeaders(context) {
32
+ const headers = createLiveEvalAuthHeaders(context);
33
+ headers.set("Content-Type", "application/json");
34
+ return headers;
35
+ }
36
+ function requireLiveEvalProjectId(projectId, errorMessage) {
37
+ if (!projectId) {
38
+ throw new Error(errorMessage);
39
+ }
40
+ return projectId;
41
+ }
42
+ function createFetch(context) {
43
+ return context.fetch ?? fetch;
44
+ }
45
+ function createApiUrl(context, path) {
46
+ const baseHref = context.apiUrl.endsWith("/") ? context.apiUrl : `${context.apiUrl}/`;
47
+ const relativePath = path.startsWith("/") ? path.slice(1) : path;
48
+ return new URL(relativePath, baseHref);
49
+ }
50
+ function createProjectUploadHeaders(requiredHeaders, contentType) {
51
+ const uploadHeaders = new Headers(requiredHeaders);
52
+ if (!uploadHeaders.has("Content-Type")) {
53
+ uploadHeaders.set("Content-Type", contentType);
54
+ }
55
+ return uploadHeaders;
56
+ }
57
+ function getProjectUploadBodySize(body, explicitSize) {
58
+ if (typeof explicitSize === "number") {
59
+ return explicitSize;
60
+ }
61
+ if (typeof body === "string") {
62
+ return new TextEncoder().encode(body).byteLength;
63
+ }
64
+ if (body instanceof Blob) {
65
+ return body.size;
66
+ }
67
+ if (body instanceof URLSearchParams) {
68
+ return new TextEncoder().encode(body.toString()).byteLength;
69
+ }
70
+ if (body instanceof ArrayBuffer) {
71
+ return body.byteLength;
72
+ }
73
+ if (ArrayBuffer.isView(body)) {
74
+ return body.byteLength;
75
+ }
76
+ throw new Error("Project upload fixtures require size when body length cannot be inferred");
77
+ }
78
+ function createProjectUploadBody(body, contentType) {
79
+ if (body instanceof Blob) {
80
+ return body;
81
+ }
82
+ if (typeof body === "string") {
83
+ return new Blob([body], { type: contentType });
84
+ }
85
+ if (body instanceof Uint8Array) {
86
+ return new Blob([body.slice()], { type: contentType });
87
+ }
88
+ return body;
89
+ }
90
+ function getResponseText(response) {
91
+ return response.text();
92
+ }
93
+ async function wait(input) {
94
+ await new Promise((resolve) => {
95
+ dntShim.setTimeout(resolve, input.ms);
96
+ });
97
+ }
98
+ async function waitForProjectUploadFixture(context, input) {
99
+ const listUrl = createApiUrl(context, `/projects/${input.projectId}/uploads`);
100
+ const requestFetch = createFetch(context);
101
+ const maxAttempts = input.maxAttempts ?? 12;
102
+ const pollIntervalMs = input.pollIntervalMs ?? 2_000;
103
+ for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
104
+ const listResponse = await requestFetch(listUrl, {
105
+ headers: createLiveEvalAuthHeaders(context),
106
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
107
+ });
108
+ if (!listResponse.ok) {
109
+ throw new Error(`Failed to confirm project upload fixture: ${listResponse.status} ${await getResponseText(listResponse)}`);
110
+ }
111
+ const payload = getProjectUploadListResponseSchema().parse(await listResponse.json());
112
+ if (payload.data?.some((upload) => upload.path === input.filePath)) {
113
+ return input.filePath;
114
+ }
115
+ if (attempt + 1 < maxAttempts) {
116
+ await wait({ ms: pollIntervalMs });
117
+ }
118
+ }
119
+ throw new Error(`Project upload fixture did not appear in time: ${input.filePath}`);
120
+ }
121
+ /** Create live eval API client. */
122
+ export function createLiveEvalApiClient(context) {
123
+ return {
124
+ createConversation: (input) => createLiveEvalConversation(context, input),
125
+ deleteConversation: (input) => deleteLiveEvalConversation(context, input),
126
+ createProjectUploadFixture: (input) => createLiveEvalProjectUploadFixture(context, input),
127
+ getProjectFile: (input) => getLiveEvalProjectFile(context, input),
128
+ createRelease: (input) => createLiveEvalRelease(context, input),
129
+ deleteProjectFile: (input) => deleteLiveEvalProjectFile(context, input),
130
+ listOpenInputRequests: (input) => listOpenLiveEvalInputRequests(context, input),
131
+ waitForOpenInputRequest: (input) => waitForOpenLiveEvalInputRequest(context, input),
132
+ submitInputResponse: (input) => submitLiveEvalInputResponse(context, input),
133
+ cancelInputRequest: (input) => cancelLiveEvalInputRequest(context, input),
134
+ };
135
+ }
136
+ /** Create live eval conversation. */
137
+ export async function createLiveEvalConversation(context, input) {
138
+ const response = await createFetch(context)(createApiUrl(context, "/conversations"), {
139
+ method: "POST",
140
+ headers: createLiveEvalJsonHeaders(context),
141
+ body: JSON.stringify({
142
+ ...(context.projectId ? { project_id: context.projectId } : {}),
143
+ title: input.title,
144
+ }),
145
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
146
+ });
147
+ if (!response.ok) {
148
+ throw new Error(`Failed to create eval conversation: ${response.status} ${await getResponseText(response)}`);
149
+ }
150
+ const payload = getLiveEvalIdResponseSchema().parse(await response.json());
151
+ if (!payload.id) {
152
+ throw new Error("Conversation creation response did not include id");
153
+ }
154
+ return payload.id;
155
+ }
156
+ /** Delete live eval conversation helper. */
157
+ export async function deleteLiveEvalConversation(context, input) {
158
+ const response = await createFetch(context)(createApiUrl(context, `/conversations/${input.conversationId}`), {
159
+ method: "DELETE",
160
+ headers: createLiveEvalAuthHeaders(context),
161
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
162
+ });
163
+ if (!response.ok && response.status !== 404) {
164
+ throw new Error(`Failed to delete eval conversation ${input.conversationId}: ${response.status} ${await getResponseText(response)}`);
165
+ }
166
+ }
167
+ /** Create live eval project upload fixture. */
168
+ export async function createLiveEvalProjectUploadFixture(context, input) {
169
+ const projectId = requireLiveEvalProjectId(context.projectId, "Project upload fixtures require a live-eval project id");
170
+ const createResponse = await createFetch(context)(createApiUrl(context, `/projects/${projectId}/uploads`), {
171
+ method: "POST",
172
+ headers: createLiveEvalJsonHeaders(context),
173
+ body: JSON.stringify({
174
+ file_path: input.filePath,
175
+ content_type: input.contentType,
176
+ size: getProjectUploadBodySize(input.body, input.size),
177
+ }),
178
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
179
+ });
180
+ if (!createResponse.ok) {
181
+ throw new Error(`Failed to create project upload URL: ${createResponse.status} ${await getResponseText(createResponse)}`);
182
+ }
183
+ const createPayload = getProjectUploadResponseSchema().parse(await createResponse.json());
184
+ if (!createPayload.file_upload_url) {
185
+ throw new Error("Project upload response did not include file_upload_url");
186
+ }
187
+ const uploadResponse = await createFetch(context)(createPayload.file_upload_url, {
188
+ method: "PUT",
189
+ headers: createProjectUploadHeaders(createPayload.required_headers, input.contentType),
190
+ body: createProjectUploadBody(input.body, input.contentType),
191
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
192
+ });
193
+ if (!uploadResponse.ok) {
194
+ throw new Error(`Failed to upload project fixture: ${uploadResponse.status} ${await getResponseText(uploadResponse)}`);
195
+ }
196
+ return waitForProjectUploadFixture(context, {
197
+ projectId,
198
+ filePath: input.filePath,
199
+ requestTimeoutMs: input.requestTimeoutMs,
200
+ pollIntervalMs: input.pollIntervalMs,
201
+ maxAttempts: input.maxAttempts,
202
+ });
203
+ }
204
+ /** Return live eval project file. */
205
+ export async function getLiveEvalProjectFile(context, input) {
206
+ const projectId = requireLiveEvalProjectId(context.projectId, "getLiveEvalProjectFile requires a live-eval project id");
207
+ const response = await createFetch(context)(createApiUrl(context, `/projects/${projectId}/files/${encodeURIComponent(input.filePath)}`), {
208
+ headers: createLiveEvalAuthHeaders(context),
209
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
210
+ });
211
+ if (response.status === 404) {
212
+ return null;
213
+ }
214
+ if (!response.ok) {
215
+ throw new Error(`Failed to read project file: ${response.status} ${await getResponseText(response)}`);
216
+ }
217
+ const payload = getProjectFileResponseSchema().parse(await response.json());
218
+ return {
219
+ path: payload.path ?? input.filePath,
220
+ content: payload.content ?? "",
221
+ };
222
+ }
223
+ /** Create live eval release. */
224
+ export async function createLiveEvalRelease(context, input) {
225
+ const projectId = requireLiveEvalProjectId(context.projectId, "createLiveEvalRelease requires a live-eval project id");
226
+ const response = await createFetch(context)(createApiUrl(context, `/projects/${projectId}/releases`), {
227
+ method: "POST",
228
+ headers: createLiveEvalJsonHeaders(context),
229
+ body: JSON.stringify({
230
+ description: input.description ?? "eval platform capability release",
231
+ }),
232
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
233
+ });
234
+ if (!response.ok) {
235
+ throw new Error(`Failed to create release: ${response.status} ${await getResponseText(response)}`);
236
+ }
237
+ const payload = getLiveEvalIdResponseSchema().parse(await response.json());
238
+ if (!payload.id) {
239
+ throw new Error("Release creation response did not include id");
240
+ }
241
+ return payload.id;
242
+ }
243
+ /** Delete live eval project file helper. */
244
+ export async function deleteLiveEvalProjectFile(context, input) {
245
+ const projectId = context.projectId;
246
+ if (!projectId) {
247
+ return;
248
+ }
249
+ const response = await createFetch(context)(createApiUrl(context, `/projects/${projectId}/files/${encodeURIComponent(input.filePath)}`), {
250
+ method: "DELETE",
251
+ headers: createLiveEvalAuthHeaders(context),
252
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
253
+ });
254
+ if (!response.ok && response.status !== 404) {
255
+ throw new Error(`Failed to delete project file: ${response.status} ${await getResponseText(response)}`);
256
+ }
257
+ }
258
+ /** List open live eval input requests. */
259
+ export async function listOpenLiveEvalInputRequests(context, input) {
260
+ const response = await createFetch(context)(createApiUrl(context, `/conversations/${input.conversationId}/input-requests?status=open`), {
261
+ headers: createLiveEvalAuthHeaders(context),
262
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
263
+ });
264
+ if (!response.ok) {
265
+ throw new Error(`Failed to list eval input requests: ${response.status} ${await getResponseText(response)}`);
266
+ }
267
+ const payload = getInputRequestListResponseSchema().parse(await response.json());
268
+ return (payload.data ?? []).flatMap((item) => {
269
+ const parsed = getInputRequestRecordSchema().safeParse(item);
270
+ return parsed.success ? [parsed.data] : [];
271
+ });
272
+ }
273
+ /** Request payload for wait for open live eval input. */
274
+ export async function waitForOpenLiveEvalInputRequest(context, input) {
275
+ const timeoutMs = input.timeoutMs ?? 30_000;
276
+ const pollIntervalMs = input.pollIntervalMs ?? 500;
277
+ const deadline = Date.now() + timeoutMs;
278
+ while (Date.now() < deadline) {
279
+ if (input.abortSignal.aborted) {
280
+ throw new Error("Eval sidecar aborted before an input request appeared");
281
+ }
282
+ const requests = await listOpenLiveEvalInputRequests(context, input);
283
+ const request = requests[0];
284
+ if (request) {
285
+ return request.id;
286
+ }
287
+ await wait({ ms: pollIntervalMs });
288
+ }
289
+ throw new Error(`Timed out while waiting for an open input request in conversation ${input.conversationId}`);
290
+ }
291
+ /** Response payload for submit live eval input. */
292
+ export async function submitLiveEvalInputResponse(context, input) {
293
+ const response = await createFetch(context)(createApiUrl(context, `/conversations/${input.conversationId}/input-requests/${input.inputRequestId}/responses`), {
294
+ method: "POST",
295
+ headers: createLiveEvalJsonHeaders(context),
296
+ body: JSON.stringify({ values: input.values }),
297
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
298
+ });
299
+ if (!response.ok) {
300
+ throw new Error(`Failed to submit eval input response: ${response.status} ${await getResponseText(response)}`);
301
+ }
302
+ }
303
+ /** Request payload for cancel live eval input. */
304
+ export async function cancelLiveEvalInputRequest(context, input) {
305
+ const response = await createFetch(context)(createApiUrl(context, `/conversations/${input.conversationId}/input-requests/${input.inputRequestId}/cancel`), {
306
+ method: "POST",
307
+ headers: createLiveEvalAuthHeaders(context),
308
+ signal: AbortSignal.timeout(input.requestTimeoutMs),
309
+ });
310
+ if (!response.ok) {
311
+ throw new Error(`Failed to cancel eval input request: ${response.status} ${await getResponseText(response)}`);
312
+ }
313
+ }
@@ -0,0 +1,40 @@
1
+ import { type LiveEvalRuntime } from "./performance.js";
2
+ import { containsSkillLoad, countStepStartedEvents, createLiveEvalCaseSupport, hasFinished, type LiveEvalCase, type LiveEvalRunnerConfig } from "./runner.js";
3
+ type EnvRecord = Record<string, string | undefined>;
4
+ /** Public API contract for live eval cli case groups. */
5
+ export interface LiveEvalCliCaseGroups {
6
+ readOnlyCases: LiveEvalCase[];
7
+ writeCases: LiveEvalCase[];
8
+ experimentalWriteCases: LiveEvalCase[];
9
+ }
10
+ /** Input payload for live eval cli case factory. */
11
+ export interface LiveEvalCliCaseFactoryInput {
12
+ authToken: string;
13
+ endpoint: string;
14
+ projectId: string | null;
15
+ branchId: string | null;
16
+ model: string | null;
17
+ requestTimeoutMs: number;
18
+ enableLlmJudge: boolean;
19
+ hasFinished: typeof hasFinished;
20
+ containsSkillLoad: typeof containsSkillLoad;
21
+ countStepStartedEvents: typeof countStepStartedEvents;
22
+ verifyFileExists: ReturnType<typeof createLiveEvalCaseSupport>["verifyFileExists"];
23
+ withJudge: ReturnType<typeof createLiveEvalCaseSupport>["withJudge"];
24
+ judgeLlm: ReturnType<typeof createLiveEvalCaseSupport>["judgeLlm"];
25
+ }
26
+ /** Input payload for run live eval cli. */
27
+ export interface RunLiveEvalCliInput {
28
+ env: EnvRecord;
29
+ caseSets: Record<string, readonly string[]>;
30
+ createCases: (input: LiveEvalCliCaseFactoryInput) => LiveEvalCliCaseGroups;
31
+ runtimes?: readonly LiveEvalRuntime[];
32
+ cwd?: string;
33
+ log?: (message: string) => void;
34
+ error?: (message: string) => void;
35
+ createCaseSupport?: (config: LiveEvalRunnerConfig) => ReturnType<typeof createLiveEvalCaseSupport>;
36
+ }
37
+ /** Run live eval cli. */
38
+ export declare function runLiveEvalCli(input: RunLiveEvalCliInput): Promise<number>;
39
+ export {};
40
+ //# sourceMappingURL=cli-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-runner.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/testing/live-evals/cli-runner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAQxF,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,aAAa,CAAC;AAKrB,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEpD,yDAAyD;AACzD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,sBAAsB,EAAE,YAAY,EAAE,CAAC;CACxC;AAED,oDAAoD;AACpD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,gBAAgB,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACnF,SAAS,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,WAAW,CAAC,CAAC;IACrE,QAAQ,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,UAAU,CAAC,CAAC;CACpE;AAED,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAC5C,WAAW,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,qBAAqB,CAAC;IAC3E,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,CAClB,MAAM,EAAE,oBAAoB,KACzB,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;CACnD;AAuBD,yBAAyB;AACzB,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwJhF"}
@@ -0,0 +1,144 @@
1
+ import { mkdir, writeTextFile } from "../../../platform/compat/fs.js";
2
+ import { dirname, resolve } from "../../../platform/compat/path/index.js";
3
+ import { cwd as getProcessCwd } from "../../../platform/compat/process.js";
4
+ import { buildRuntimePerformanceSummary } from "./performance.js";
5
+ import { buildLiveEvalCaseTagSummary, buildLiveEvalRuntimeSummary, buildLiveEvalStatusSummary, resolveLiveEvalRequestedCaseIds, selectLiveEvalCases, } from "./report.js";
6
+ import { containsSkillLoad, countStepStartedEvents, createLiveEvalCaseSupport, hasFinished, } from "./runner.js";
7
+ import { getLiveEvalProjectFile } from "./api-client.js";
8
+ import { resolveLiveEvalEnvironment } from "./environment.js";
9
+ function splitCsvEnv(value) {
10
+ return new Set((value ?? "")
11
+ .split(",")
12
+ .map((entry) => entry.trim())
13
+ .filter((entry) => entry.length > 0));
14
+ }
15
+ function createTimestampedReportPath(input) {
16
+ return resolve(input.cwd, ".omx/logs", input.directory, `${new Date().toISOString().replaceAll(":", "-").replaceAll(".", "-")}.json`);
17
+ }
18
+ /** Run live eval cli. */
19
+ export async function runLiveEvalCli(input) {
20
+ const log = input.log ?? console.log;
21
+ const error = input.error ?? console.error;
22
+ const cwd = input.cwd ?? getProcessCwd();
23
+ const { endpoint, authToken, apiUrl, projectId, branchId, model } = resolveLiveEvalEnvironment(input.env);
24
+ const requestedRuntimeSelection = input.runtimes ?? ["framework"];
25
+ const runWriteEvals = input.env.AG_UI_EVAL_WRITE === "1";
26
+ const runExperimentalWriteEvals = input.env.AG_UI_EVAL_EXPERIMENTAL === "1";
27
+ const requestTimeoutMs = Number(input.env.AG_UI_EVAL_TIMEOUT_MS ?? "240000");
28
+ const progressLogIntervalMs = Number(input.env.AG_UI_EVAL_PROGRESS_MS ?? "15000");
29
+ const reportPath = input.env.AG_UI_EVAL_REPORT_PATH ??
30
+ createTimestampedReportPath({ cwd, directory: "ag-ui-live-evals" });
31
+ const requestedCaseIds = splitCsvEnv(input.env.AG_UI_EVAL_CASES);
32
+ const requestedCaseTags = splitCsvEnv(input.env.AG_UI_EVAL_TAGS);
33
+ const requestedCaseSetId = input.env.AG_UI_EVAL_CASE_SET?.trim() || null;
34
+ const enableLlmJudge = input.env.AG_UI_EVAL_LLM_JUDGE === "1";
35
+ const apiContext = {
36
+ apiUrl,
37
+ authToken,
38
+ projectId: projectId ?? null,
39
+ };
40
+ const createCaseSupport = input.createCaseSupport ?? createLiveEvalCaseSupport;
41
+ const { judgeLlm, runEval, verifyFileExists, withJudge } = createCaseSupport({
42
+ endpoint,
43
+ authToken,
44
+ apiUrl,
45
+ projectId: projectId ?? null,
46
+ branchId: branchId ?? null,
47
+ model: model ?? null,
48
+ requestTimeoutMs,
49
+ progressLogIntervalMs,
50
+ enableLlmJudge,
51
+ readProjectFile: (readerInput) => getLiveEvalProjectFile(apiContext, readerInput),
52
+ });
53
+ const { readOnlyCases, writeCases, experimentalWriteCases } = input.createCases({
54
+ authToken,
55
+ endpoint,
56
+ projectId: projectId ?? null,
57
+ branchId: branchId ?? null,
58
+ model: model ?? null,
59
+ requestTimeoutMs,
60
+ enableLlmJudge,
61
+ hasFinished,
62
+ containsSkillLoad,
63
+ countStepStartedEvents,
64
+ verifyFileExists,
65
+ withJudge,
66
+ judgeLlm,
67
+ });
68
+ if (authToken.length === 0) {
69
+ error("Missing VERYFRONT_TOKEN");
70
+ return 1;
71
+ }
72
+ log(`AG-UI live evals -> ${endpoint}`);
73
+ log(`Veryfront API -> ${apiUrl}`);
74
+ log(`Project scope -> ${projectId ?? "none"}`);
75
+ log(`Runtime -> ${requestedRuntimeSelection.join(", ")}`);
76
+ log(`Write evals -> ${runWriteEvals ? "enabled" : "disabled"}`);
77
+ log(`Experimental evals -> ${runExperimentalWriteEvals ? "enabled" : "disabled"}`);
78
+ log(`Case set -> ${requestedCaseSetId ?? "none"}`);
79
+ log(`Case tags -> ${requestedCaseTags.size > 0 ? [...requestedCaseTags].join(", ") : "none"}`);
80
+ const allCases = [...readOnlyCases, ...writeCases, ...experimentalWriteCases];
81
+ const resolvedRequestedCaseIds = resolveLiveEvalRequestedCaseIds({
82
+ caseSets: input.caseSets,
83
+ requestedCaseIds,
84
+ requestedCaseSetId,
85
+ });
86
+ const cases = selectLiveEvalCases({
87
+ allCases,
88
+ readOnlyCases,
89
+ writeCases,
90
+ experimentalWriteCases,
91
+ requestedCaseIds: resolvedRequestedCaseIds,
92
+ requestedCaseTags,
93
+ runWriteEvals,
94
+ runExperimentalWriteEvals,
95
+ });
96
+ const selectedCaseTagSummary = buildLiveEvalCaseTagSummary(cases);
97
+ if (cases.length === 0) {
98
+ error("No eval cases selected.");
99
+ return 1;
100
+ }
101
+ const results = [];
102
+ for (const runtime of requestedRuntimeSelection) {
103
+ log(`\n[runtime] ${runtime}`);
104
+ for (const testCase of cases) {
105
+ log(`\n[run] ${runtime} :: ${testCase.label}`);
106
+ const result = await runEval(testCase, runtime);
107
+ results.push(result);
108
+ log(`[${runtime}] [${result.status}] ${result.details}`);
109
+ }
110
+ }
111
+ const summary = buildLiveEvalStatusSummary(results);
112
+ const runtimeSummary = buildLiveEvalRuntimeSummary(requestedRuntimeSelection, results);
113
+ const runtimePerformanceSummary = buildRuntimePerformanceSummary(results);
114
+ log("\nSummary");
115
+ log(`passed: ${summary.passed}`);
116
+ log(`failed: ${summary.failed}`);
117
+ log(`skipped: ${summary.skipped}`);
118
+ for (const runtime of requestedRuntimeSelection) {
119
+ const currentRuntimeSummary = runtimeSummary[runtime];
120
+ log(`${runtime}: passed=${currentRuntimeSummary.passed} failed=${currentRuntimeSummary.failed} skipped=${currentRuntimeSummary.skipped}`);
121
+ const performance = runtimePerformanceSummary[runtime];
122
+ log(`${runtime}: avg=${performance.avgDurationMs}ms p50=${performance.p50DurationMs}ms p95=${performance.p95DurationMs}ms min=${performance.minDurationMs}ms max=${performance.maxDurationMs}ms`);
123
+ }
124
+ await mkdir(dirname(reportPath), { recursive: true });
125
+ await writeTextFile(reportPath, JSON.stringify({
126
+ generatedAt: new Date().toISOString(),
127
+ endpoint,
128
+ apiUrl,
129
+ projectId: projectId ?? null,
130
+ runtimes: requestedRuntimeSelection,
131
+ writeEvals: runWriteEvals,
132
+ requestedCaseIds: [...resolvedRequestedCaseIds],
133
+ requestedCaseTags: [...requestedCaseTags],
134
+ requestedCaseSetId,
135
+ caseMetadata: Object.fromEntries(cases.map((testCase) => [testCase.id, testCase.metadata ?? { tags: [] }])),
136
+ selectedCaseTagSummary,
137
+ results,
138
+ summary,
139
+ runtimeSummary,
140
+ runtimePerformanceSummary,
141
+ }, null, 2));
142
+ log(`report: ${reportPath}`);
143
+ return summary.failed > 0 ? 1 : 0;
144
+ }
@@ -0,0 +1,15 @@
1
+ import { type AgentServiceConfigInput } from "../../service/config.js";
2
+ /** Public API contract for live eval environment. */
3
+ export interface LiveEvalEnvironment {
4
+ endpoint: string;
5
+ authToken: string;
6
+ apiUrl: string;
7
+ projectId: string | undefined;
8
+ branchId: string | undefined;
9
+ model: string | undefined;
10
+ }
11
+ /** Default value for live eval endpoint. */
12
+ export declare const DEFAULT_LIVE_EVAL_ENDPOINT = "http://127.0.0.1:3001/api/ag-ui";
13
+ /** Resolves live eval environment. */
14
+ export declare function resolveLiveEvalEnvironment(env?: AgentServiceConfigInput): LiveEvalEnvironment;
15
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/testing/live-evals/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,uBAAuB,EAA2B,MAAM,yBAAyB,CAAC;AAEhG,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,4CAA4C;AAC5C,eAAO,MAAM,0BAA0B,oCAAoC,CAAC;AAE5E,sCAAsC;AACtC,wBAAgB,0BAA0B,CACxC,GAAG,GAAE,uBAA4B,GAChC,mBAAmB,CAerB"}
@@ -0,0 +1,20 @@
1
+ import { parseAgentServiceConfig } from "../../service/config.js";
2
+ /** Default value for live eval endpoint. */
3
+ export const DEFAULT_LIVE_EVAL_ENDPOINT = "http://127.0.0.1:3001/api/ag-ui";
4
+ /** Resolves live eval environment. */
5
+ export function resolveLiveEvalEnvironment(env = {}) {
6
+ return {
7
+ endpoint: typeof env.AG_UI_EVAL_ENDPOINT === "string"
8
+ ? env.AG_UI_EVAL_ENDPOINT
9
+ : DEFAULT_LIVE_EVAL_ENDPOINT,
10
+ authToken: typeof env.VERYFRONT_TOKEN === "string" ? env.VERYFRONT_TOKEN : "",
11
+ apiUrl: typeof env.VERYFRONT_API_URL === "string"
12
+ ? env.VERYFRONT_API_URL
13
+ : parseAgentServiceConfig(env).VERYFRONT_API_URL,
14
+ projectId: typeof env.AG_UI_EVAL_PROJECT_ID === "string"
15
+ ? env.AG_UI_EVAL_PROJECT_ID
16
+ : undefined,
17
+ branchId: typeof env.AG_UI_EVAL_BRANCH_ID === "string" ? env.AG_UI_EVAL_BRANCH_ID : undefined,
18
+ model: typeof env.AG_UI_EVAL_MODEL === "string" ? env.AG_UI_EVAL_MODEL : undefined,
19
+ };
20
+ }
@@ -0,0 +1,15 @@
1
+ import { Buffer } from "node:buffer";
2
+ import type { AgUiSseProgressSnapshot as EvalProgressSnapshot } from "../../index.js";
3
+ /** Create plain text pdf. */
4
+ export declare function createPlainTextPdf(lines: string[]): Buffer;
5
+ /** Builds progress line. */
6
+ export declare function buildProgressLine(input: {
7
+ caseId: string;
8
+ startedAt: number;
9
+ progress: EvalProgressSnapshot;
10
+ }): string;
11
+ /** Builds failure suffix. */
12
+ export declare function buildFailureSuffix(progress: EvalProgressSnapshot): string;
13
+ /** Contains ordered subsequence helper. */
14
+ export declare function containsOrderedSubsequence(haystack: string[], needle: string[]): boolean;
15
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/testing/live-evals/formatting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,uBAAuB,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAStF,6BAA6B;AAC7B,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CA4C1D;AAED,4BAA4B;AAC5B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,oBAAoB,CAAC;CAChC,GAAG,MAAM,CAcT;AAED,6BAA6B;AAC7B,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAUzE;AAED,2CAA2C;AAC3C,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAcT"}
@@ -0,0 +1,75 @@
1
+ import { Buffer } from "node:buffer";
2
+ function escapePdfText(input) {
3
+ return input.replaceAll("\\", "\\\\").replaceAll("(", "\\(").replaceAll(")", "\\)");
4
+ }
5
+ /** Create plain text pdf. */
6
+ export function createPlainTextPdf(lines) {
7
+ const contentLines = [
8
+ "BT",
9
+ "/F1 18 Tf",
10
+ "72 720 Td",
11
+ `(${escapePdfText(lines[0] ?? "Untitled")}) Tj`,
12
+ "/F1 12 Tf",
13
+ ...lines.slice(1).flatMap((line) => ["0 -20 Td", `(${escapePdfText(line)}) Tj`]),
14
+ "ET",
15
+ ];
16
+ const contentStream = contentLines.join("\n");
17
+ const objects = [
18
+ "<< /Type /Catalog /Pages 2 0 R >>",
19
+ "<< /Type /Pages /Kids [3 0 R] /Count 1 >>",
20
+ "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>",
21
+ `<< /Length ${Buffer.byteLength(contentStream, "utf8")} >>\nstream\n${contentStream}\nendstream`,
22
+ "<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>",
23
+ ];
24
+ let pdf = "%PDF-1.4\n";
25
+ const offsets = [0];
26
+ objects.forEach((objectBody, index) => {
27
+ offsets.push(Buffer.byteLength(pdf, "utf8"));
28
+ pdf += `${index + 1} 0 obj\n${objectBody}\nendobj\n`;
29
+ });
30
+ const xrefOffset = Buffer.byteLength(pdf, "utf8");
31
+ pdf += `xref\n0 ${objects.length + 1}\n`;
32
+ pdf += "0000000000 65535 f \n";
33
+ offsets.slice(1).forEach((offset) => {
34
+ pdf += `${offset.toString().padStart(10, "0")} 00000 n \n`;
35
+ });
36
+ pdf += `trailer\n<< /Root 1 0 R /Size ${objects.length + 1} >>\nstartxref\n${xrefOffset}\n%%EOF\n`;
37
+ return Buffer.from(pdf, "utf8");
38
+ }
39
+ /** Builds progress line. */
40
+ export function buildProgressLine(input) {
41
+ const elapsedSeconds = Math.max(1, Math.round((Date.now() - input.startedAt) / 1000));
42
+ const lastEvent = input.progress.lastEventType ?? "none";
43
+ const lastTool = input.progress.lastToolCallName
44
+ ? ` tool=${input.progress.lastToolCallName}`
45
+ : "";
46
+ const toolSummary = input.progress.toolStarts.length > 0
47
+ ? ` tools=${input.progress.toolStarts.join(",")}`
48
+ : "";
49
+ const textSummary = input.progress.textLength > 0 ? ` text=${input.progress.textLength}ch` : "";
50
+ return `[progress] ${input.caseId} ${elapsedSeconds}s events=${input.progress.eventCount} last=${lastEvent}${lastTool}${toolSummary}${textSummary}`;
51
+ }
52
+ /** Builds failure suffix. */
53
+ export function buildFailureSuffix(progress) {
54
+ const details = [
55
+ `events=${progress.eventCount}`,
56
+ `last=${progress.lastEventType ?? "none"}`,
57
+ progress.lastToolCallName ? `tool=${progress.lastToolCallName}` : null,
58
+ progress.toolStarts.length > 0 ? `tools=${progress.toolStarts.join(",")}` : null,
59
+ progress.textLength > 0 ? `text=${progress.textLength}ch` : null,
60
+ ].filter((value) => value !== null);
61
+ return details.length > 0 ? ` Progress: ${details.join(" ")}` : "";
62
+ }
63
+ /** Contains ordered subsequence helper. */
64
+ export function containsOrderedSubsequence(haystack, needle) {
65
+ let cursor = 0;
66
+ for (const value of haystack) {
67
+ if (value === needle[cursor]) {
68
+ cursor += 1;
69
+ }
70
+ if (cursor === needle.length) {
71
+ return true;
72
+ }
73
+ }
74
+ return cursor === needle.length;
75
+ }
@@ -0,0 +1,12 @@
1
+ export { type LiveEvalCliCaseFactoryInput, type LiveEvalCliCaseGroups, runLiveEvalCli, type RunLiveEvalCliInput, } from "./cli-runner.js";
2
+ export { DEFAULT_LIVE_EVAL_ENDPOINT, type LiveEvalEnvironment, resolveLiveEvalEnvironment, } from "./environment.js";
3
+ export { cancelLiveEvalInputRequest, createLiveEvalApiClient, createLiveEvalConversation, createLiveEvalProjectUploadFixture, createLiveEvalRelease, deleteLiveEvalConversation, deleteLiveEvalProjectFile, getLiveEvalProjectFile, listOpenLiveEvalInputRequests, type LiveEvalApiClient, type LiveEvalApiContext, type LiveEvalConversationInput, type LiveEvalCreateConversationInput, type LiveEvalCreateReleaseInput, type LiveEvalInputRequestInput, type LiveEvalInputRequestRecord, type LiveEvalInputResponseValues, type LiveEvalProjectFileInput, type LiveEvalProjectUploadFixtureInput, type LiveEvalRequestTimeoutInput, type LiveEvalSubmitInputResponseInput, type LiveEvalWaitForOpenInputRequestInput, submitLiveEvalInputResponse, waitForOpenLiveEvalInputRequest, } from "./api-client.js";
4
+ export { buildFailureSuffix, buildProgressLine, containsOrderedSubsequence, createPlainTextPdf, } from "./formatting.js";
5
+ export { evaluateRuntimeConfidenceEnv, printRuntimeConfidencePreflight, type RuntimeConfidencePreflightResult, } from "./preflight.js";
6
+ export { buildRuntimePerformanceSummary, type LiveEvalResultForPerformance, type LiveEvalRuntime, type RuntimePerformanceSummary, } from "./performance.js";
7
+ export { buildLiveEvalCaseMetadata, type BuildLiveEvalCaseMetadataInput, DEFAULT_LIVE_EVAL_AREA_TAG_RULES, DEFAULT_LIVE_EVAL_OPTIONAL_JUDGE_CASE_PREFIXES, type LiveEvalCaseMetadataOptions, type LiveEvalCaseSurface, type LiveEvalCaseTagRule, withLiveEvalMetadata, } from "./metadata.js";
8
+ export { buildLiveEvalRequestBody, type BuildLiveEvalRequestBodyInput, type LiveEvalRequestBody, } from "./request.js";
9
+ export { buildLiveEvalCaseTagSummary, buildLiveEvalRuntimeSummary, buildLiveEvalStatusSummary, hasEveryLiveEvalTag, type LiveEvalCaseMetadata, type LiveEvalCaseSelectionInput, type LiveEvalResultForReport, resolveLiveEvalRequestedCaseIds, selectLiveEvalCases, } from "./report.js";
10
+ export { createFailedEvalResult, createPassedEvalResult, createSkippedEvalResult, type LiveEvalResultRecord, } from "./result.js";
11
+ export { containsSkillLoad, countStepStartedEvents, createLiveEvalCaseSupport, hasFinished, type LiveEvalCase, type LiveEvalContext, type LiveEvalProjectFile, type LiveEvalProjectFileReaderInput, type LiveEvalRunnerConfig, liveEvalRunnerInternals, type PreparedLiveEvalInput, } from "./runner.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/agent/testing/live-evals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,KAAK,mBAAmB,EACxB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,kCAAkC,EAClC,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,6BAA6B,EAC7B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,iCAAiC,EACtC,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,KAAK,gCAAgC,GACtC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,8BAA8B,EAC9B,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,yBAAyB,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,KAAK,8BAA8B,EACnC,gCAAgC,EAChC,8CAA8C,EAC9C,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,EACxB,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,+BAA+B,EAC/B,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,oBAAoB,EACzB,uBAAuB,EACvB,KAAK,qBAAqB,GAC3B,MAAM,aAAa,CAAC"}