@iblai/iblai-js 1.26.3 → 1.26.4

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.
@@ -0,0 +1,396 @@
1
+ import { Locator, Page } from '@playwright/test';
2
+ /**
3
+ * Evals tab helpers — Playwright bindings for the `AgentEvaluationTab`
4
+ * component from `@iblai/web-containers` (edit-mentor modal > Evals tab),
5
+ * including the embedded tenant Benchmarks management dialog.
6
+ *
7
+ * All UI strings below mirror `AGENT_EVALUATION_TAB_LABELS` from
8
+ * `@iblai/web-containers/next` plus the `benchmarks*` i18n namespaces. If a
9
+ * consumer renames a label via the `labels` prop, override these constants
10
+ * per spec — don't edit this file.
11
+ *
12
+ * Every dialog spawned by this tab carries an explicit `aria-label` on its
13
+ * `DialogContent` (see `dialogName` entries). Helpers ALWAYS resolve the
14
+ * dialog once via `[role="dialog"][aria-label="…"]` — the attribute selector,
15
+ * not the role accessible name, because a visible `DialogTitle` makes Radix's
16
+ * `aria-labelledby` win the accessible-name computation — and then resolve
17
+ * every in-dialog control from that scoped locator. This matters here more
18
+ * than usual:
19
+ * - the toolbar "New Evaluation" / "Manage benchmarks" buttons share their
20
+ * text with the dialog titles they open;
21
+ * - the LLM-judge dialog's title AND submit button both read "Evaluate";
22
+ * - dialogs nest three deep (Manage benchmarks → benchmark items → add
23
+ * Q&A), and the add-Q&A dialog has Manual / CSV Upload sub-tabs whose
24
+ * footers each have their own Cancel button.
25
+ *
26
+ * The helpers assume the Edit Mentor dialog is already open. Call
27
+ * `switchToEvaluationTab(page)` first; from then on, every helper accepts
28
+ * either the `Page` or a scoping `Locator`.
29
+ */
30
+ export declare const EVALS_LABELS: {
31
+ readonly tabName: "Evals";
32
+ readonly header: {
33
+ readonly title: "Evals";
34
+ readonly description: "Run this agent against a benchmark and score the responses.";
35
+ };
36
+ readonly benchmarkPicker: {
37
+ readonly placeholder: "Select a benchmark";
38
+ readonly searchPlaceholder: "Search benchmarks...";
39
+ readonly empty: "No benchmarks found";
40
+ /** `data-testid` on the combobox trigger button (its text is the selected benchmark, so it has no stable accessible name). */
41
+ readonly triggerTestId: "benchmark-combobox";
42
+ /** `data-testid` on the dropdown panel (rendered inline, not in a portal). */
43
+ readonly dropdownTestId: "benchmark-combobox-dropdown";
44
+ };
45
+ readonly actions: {
46
+ readonly newExperiment: "New Evaluation";
47
+ readonly manageBenchmarks: "Manage benchmarks";
48
+ readonly viewResults: "View results";
49
+ readonly evaluate: "New review";
50
+ readonly exportCsv: "Export CSV";
51
+ readonly checkStatus: "Check status";
52
+ readonly delete: "Delete";
53
+ };
54
+ readonly checkStatusToast: {
55
+ readonly pending: "Evaluation is still running";
56
+ readonly completed: "Evaluation completed";
57
+ readonly failed: "Evaluation failed";
58
+ };
59
+ readonly emptyBenchmarks: "No benchmarks yet. Use \"Manage benchmarks\" above to create one.";
60
+ readonly startDialog: {
61
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
62
+ readonly dialogName: "start-evaluation";
63
+ readonly experimentNameLabel: "Evaluation name";
64
+ readonly cancel: "Cancel";
65
+ readonly start: "Start Evaluation";
66
+ };
67
+ readonly manageBenchmarksDialog: {
68
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
69
+ readonly dialogName: "manage-benchmarks";
70
+ readonly searchAriaLabel: "Search benchmarks";
71
+ readonly newBenchmark: "New Benchmark";
72
+ readonly empty: "No benchmarks found";
73
+ };
74
+ readonly createBenchmarkDialog: {
75
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
76
+ readonly dialogName: "create-benchmark";
77
+ readonly nameLabel: "Name";
78
+ readonly descriptionLabel: "Description";
79
+ readonly cancel: "Cancel";
80
+ readonly create: "Create";
81
+ };
82
+ readonly benchmarkItemsDialog: {
83
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
84
+ readonly dialogName: "benchmark-items";
85
+ readonly addItems: "Add Q&A";
86
+ readonly deleteItemAriaLabel: "Delete Q&A";
87
+ readonly empty: "No Q&A in this benchmark yet";
88
+ };
89
+ readonly addItemsDialog: {
90
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
91
+ readonly dialogName: "add-benchmark-items";
92
+ readonly manualTab: "Manual";
93
+ readonly csvTab: "CSV Upload";
94
+ readonly questionLabel: "Question";
95
+ readonly answerLabel: "Answer";
96
+ readonly addRow: "Add row";
97
+ readonly removeRowAriaLabel: "Remove row";
98
+ readonly add: "Add";
99
+ readonly csvFileLabel: "CSV file";
100
+ readonly upload: "Upload";
101
+ readonly cancel: "Cancel";
102
+ };
103
+ readonly deleteItemDialog: {
104
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
105
+ readonly dialogName: "delete-benchmark-item";
106
+ readonly delete: "Delete";
107
+ readonly cancel: "Cancel";
108
+ };
109
+ readonly detailDialog: {
110
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
111
+ readonly dialogName: "evaluation-detail";
112
+ readonly refreshAriaLabel: "Refresh";
113
+ readonly newReview: "New review";
114
+ readonly waitingHint: "Waiting for the evaluation to produce traces. This page auto-refreshes.";
115
+ readonly noScoresHint: "No scores yet";
116
+ readonly scoreNameLabel: "Score name";
117
+ readonly scoreValueLabel: "Value";
118
+ readonly scoreCommentLabel: "Comment";
119
+ readonly addScore: "Add";
120
+ readonly removeScoreAriaLabel: "Remove score";
121
+ readonly reviewsHeading: "Reviews";
122
+ readonly reviewDetailsAriaLabel: "Toggle review details";
123
+ readonly reviewStatus: {
124
+ readonly pending: "Queued";
125
+ readonly running: "Running";
126
+ readonly completed: "Complete";
127
+ readonly failed: "Failed";
128
+ };
129
+ };
130
+ readonly judgeDialog: {
131
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
132
+ readonly dialogName: "llm-judge";
133
+ readonly criteriaLabel: "Criteria";
134
+ readonly scoreNameLabel: "Score name";
135
+ readonly maxConcurrencyLabel: "Max concurrency";
136
+ readonly selectorAriaLabel: "LLM Model Selector";
137
+ readonly cancel: "Cancel";
138
+ readonly submit: "Evaluate";
139
+ };
140
+ readonly llmPickerDialog: {
141
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
142
+ readonly dialogName: "evaluate-llm-picker";
143
+ readonly searchPlaceholder: "Search providers...";
144
+ /** Title of the follow-up model-selection modal (llm-tab's `LLMProviderModal`, no aria-label of its own). */
145
+ readonly modelDialogTitle: "LLM Selection";
146
+ };
147
+ readonly deleteDialog: {
148
+ /** `aria-label` on the dialog's `DialogContent` — scopes in-dialog locators. */
149
+ readonly dialogName: "delete-evaluation";
150
+ readonly cancel: "Cancel";
151
+ readonly confirm: "Delete";
152
+ };
153
+ };
154
+ /** Status badge text in the runs table (component upper-cases the raw status). */
155
+ export type EvalRunStatus = 'COMPLETED' | 'FAILED' | 'PENDING' | 'IN_PROGRESS';
156
+ /** Status pill states on a review row inside the detail dialog. */
157
+ export type EvalReviewStatus = keyof typeof EVALS_LABELS.detailDialog.reviewStatus;
158
+ /**
159
+ * Check whether the Evals tab is rendered in the Edit Mentor dialog.
160
+ * Returns false instead of throwing so callers can guard permission-gated
161
+ * tabs.
162
+ */
163
+ export declare function isEvaluationTabVisible(page: Page): Promise<boolean>;
164
+ /**
165
+ * Switch to the Evals tab. Assumes the Edit Mentor dialog is open. Waits
166
+ * for the toolbar "Manage benchmarks" button (unique to this pane) before
167
+ * returning, so callers can rely on the panel being interactive.
168
+ */
169
+ export declare function switchToEvaluationTab(page: Page): Promise<void>;
170
+ /** Locator for the benchmark combobox trigger. Its text is the selected benchmark name. */
171
+ export declare function getBenchmarkCombobox(scope: Page | Locator): Locator;
172
+ /** Locator for the combobox dropdown panel (rendered inline under the trigger, not in a portal). */
173
+ export declare function getBenchmarkComboboxDropdown(scope: Page | Locator): Locator;
174
+ /** Locator for the toolbar "New Evaluation" button (opens the start dialog). */
175
+ export declare function getNewEvaluationButton(scope: Page | Locator): Locator;
176
+ /** Locator for the toolbar "Manage benchmarks" button (opens the benchmarks dialog). */
177
+ export declare function getManageBenchmarksButton(scope: Page | Locator): Locator;
178
+ /** Assert the currently selected benchmark shown on the combobox trigger. */
179
+ export declare function expectSelectedBenchmark(scope: Page | Locator, benchmarkName: string): Promise<void>;
180
+ /**
181
+ * Open the benchmark combobox, optionally filter via its search input, and
182
+ * pick a benchmark by exact name. Waits for the dropdown to close and the
183
+ * trigger to reflect the selection.
184
+ */
185
+ export declare function selectBenchmark(scope: Page | Locator, benchmarkName: string, opts?: {
186
+ search?: boolean;
187
+ }): Promise<void>;
188
+ /** Assert the "no benchmarks yet" empty notice is shown in the tab body. */
189
+ export declare function expectNoBenchmarksNotice(scope: Page | Locator): Promise<void>;
190
+ /**
191
+ * Locator for an evaluation run's table row, matched by an exact cell so a
192
+ * run whose name is a substring of another ("smoke" vs "smoke-2") can't
193
+ * cross-match.
194
+ */
195
+ export declare function getRunRow(scope: Page | Locator, runName: string): Locator;
196
+ export declare function expectRunInTable(scope: Page | Locator, runName: string): Promise<void>;
197
+ export declare function expectRunNotInTable(scope: Page | Locator, runName: string): Promise<void>;
198
+ /** Assert the status badge on a run's row (badge text is upper-cased by the UI). */
199
+ export declare function expectRunStatus(scope: Page | Locator, runName: string, status: EvalRunStatus): Promise<void>;
200
+ /** Assert the empty-state row shown when the selected benchmark has no runs for this agent. */
201
+ export declare function expectRunsTableEmpty(scope: Page | Locator, benchmarkName: string): Promise<void>;
202
+ /**
203
+ * Open the three-dots actions menu on a run's row. The trigger carries
204
+ * `aria-label="Actions for <runName>"`, so it can't collide with other rows.
205
+ * Returns the menu locator (Radix portals it outside the table — page scope).
206
+ */
207
+ export declare function openRunActionsMenu(scope: Page | Locator, runName: string): Promise<Locator>;
208
+ /**
209
+ * Row action: "View results" — opens the evaluation detail dialog.
210
+ * Only enabled once the run is COMPLETED. Returns the scoped detail dialog.
211
+ */
212
+ export declare function openRunResults(scope: Page | Locator, runName: string): Promise<Locator>;
213
+ /**
214
+ * Row action: "New review" — opens the LLM-judge dialog for the run.
215
+ * Only enabled once the run is COMPLETED. Returns the scoped judge dialog.
216
+ */
217
+ export declare function openNewReviewForRun(scope: Page | Locator, runName: string): Promise<Locator>;
218
+ /**
219
+ * Row action: "Check status" — triggers a fresh status fetch and waits for
220
+ * the outcome toast. Returns which toast appeared. The menu stays open by
221
+ * design (the item prevents default), so we close it with Escape.
222
+ */
223
+ export declare function checkRunStatus(scope: Page | Locator, runName: string): Promise<'pending' | 'completed' | 'failed'>;
224
+ /**
225
+ * Row action: "Export CSV" — waits for the browser download and returns its
226
+ * suggested filename (`<benchmark>_<run>_results.csv`).
227
+ */
228
+ export declare function exportRunCsv(scope: Page | Locator, runName: string): Promise<string>;
229
+ /** Locator for the "New Evaluation" dialog. Scoped by aria-label — its title text collides with the toolbar button that opens it. */
230
+ export declare function getStartEvaluationDialog(scope: Page | Locator): Locator;
231
+ /** Open the start dialog via the toolbar button and wait for it to be interactive. */
232
+ export declare function openStartEvaluationDialog(scope: Page | Locator): Promise<Locator>;
233
+ /**
234
+ * End-to-end: open the "New Evaluation" dialog, optionally name the run,
235
+ * submit, and wait for the dialog to close. When `name` is omitted the
236
+ * backend auto-generates one.
237
+ */
238
+ export declare function startEvaluation(scope: Page | Locator, opts?: {
239
+ name?: string;
240
+ }): Promise<void>;
241
+ /** Cancel out of the start dialog and wait for it to close. */
242
+ export declare function cancelStartEvaluation(scope: Page | Locator): Promise<void>;
243
+ /** Locator for the "Delete Evaluation" confirm dialog. */
244
+ export declare function getDeleteEvaluationDialog(scope: Page | Locator): Locator;
245
+ /**
246
+ * Delete a run from its row actions menu and confirm in the follow-up
247
+ * dialog. The confirm button ("Delete") shares its name with the menu item
248
+ * that opened the dialog, so the confirm click MUST stay dialog-scoped.
249
+ */
250
+ export declare function deleteEvaluation(scope: Page | Locator, runName: string): Promise<void>;
251
+ /** Open the delete confirm from the row menu, then cancel out of it. */
252
+ export declare function cancelDeleteEvaluation(scope: Page | Locator, runName: string): Promise<void>;
253
+ /**
254
+ * Locator for the LLM-judge dialog. Scoped by aria-label — its title AND its
255
+ * submit button both read "Evaluate", and it can be stacked on top of the
256
+ * evaluation-detail dialog.
257
+ */
258
+ export declare function getLlmJudgeDialog(scope: Page | Locator): Locator;
259
+ /** Locator for the judge dialog's LLM provider-picker dialog (stacked above it). */
260
+ export declare function getLlmPickerDialog(scope: Page | Locator): Locator;
261
+ /**
262
+ * Inside the judge dialog: pick the judging LLM. Opens the provider picker,
263
+ * optionally filters, clicks the provider card, then picks the model in the
264
+ * follow-up "LLM Selection" modal (llm-tab's `LLMProviderModal`; matched by
265
+ * title text since it has no aria-label). Both pickers close on selection.
266
+ */
267
+ export declare function selectJudgeLlm(scope: Page | Locator, providerName: string, modelName: string): Promise<void>;
268
+ /**
269
+ * Fill and submit the LLM-judge dialog (assumes it is already open — see
270
+ * `openNewReviewForRun` / `openNewReviewFromDetail`). Waits for the dialog
271
+ * to close on success.
272
+ */
273
+ export declare function submitLlmJudge(scope: Page | Locator, opts: {
274
+ criteria: string;
275
+ scoreName: string;
276
+ provider: string;
277
+ model: string;
278
+ maxConcurrency?: number;
279
+ }): Promise<void>;
280
+ /** Cancel out of the judge dialog and wait for it to close. */
281
+ export declare function cancelLlmJudge(scope: Page | Locator): Promise<void>;
282
+ /** Locator for the evaluation-detail dialog. Its title is the run name (dynamic), hence the aria-label hook. */
283
+ export declare function getEvaluationDetailDialog(scope: Page | Locator): Locator;
284
+ /** Click the detail dialog's refresh icon button (aria-label "Refresh"). */
285
+ export declare function refreshEvaluationDetail(scope: Page | Locator): Promise<void>;
286
+ /** Open the LLM-judge dialog from the detail dialog's "New review" CTA. Returns the judge dialog. */
287
+ export declare function openNewReviewFromDetail(scope: Page | Locator): Promise<Locator>;
288
+ /** Assert the detail dialog is still waiting for traces (auto-refreshing hint). */
289
+ export declare function expectDetailWaitingForTraces(scope: Page | Locator): Promise<void>;
290
+ /**
291
+ * Locator for a trace's expand/collapse row inside the detail dialog,
292
+ * matched by (part of) its question text.
293
+ */
294
+ export declare function getTraceRow(scope: Page | Locator, questionText: string): Locator;
295
+ /** Expand a trace by its question text so its outputs and scores are visible. */
296
+ export declare function expandTrace(scope: Page | Locator, questionText: string): Promise<void>;
297
+ /**
298
+ * Add a manual score to the currently expanded trace. `value` must be
299
+ * between 0 and 1 (the UI rejects anything else with an error toast).
300
+ */
301
+ export declare function addManualScore(scope: Page | Locator, opts: {
302
+ name: string;
303
+ value: number;
304
+ comment?: string;
305
+ }): Promise<void>;
306
+ /** Assert a score chip with the given name is visible on the expanded trace. */
307
+ export declare function expectTraceScore(scope: Page | Locator, scoreName: string): Promise<void>;
308
+ /**
309
+ * Remove a score chip from the expanded trace. The chip's trash button
310
+ * carries `aria-label="Remove score"`; we scope through the chip matched by
311
+ * score name so multiple chips can't cross-match.
312
+ */
313
+ export declare function removeTraceScore(scope: Page | Locator, scoreName: string): Promise<void>;
314
+ /**
315
+ * Locator for a review row's expand toggle in the detail dialog's Reviews
316
+ * list. All toggles share the "Toggle review details" aria-label, so the
317
+ * row is disambiguated by the score name it displays.
318
+ */
319
+ export declare function getReviewRow(scope: Page | Locator, scoreName: string): Locator;
320
+ /** Assert a review with the given score name appears in the Reviews list. */
321
+ export declare function expectReviewInList(scope: Page | Locator, scoreName: string): Promise<void>;
322
+ /** Assert a review row's status pill (Queued / Running / Complete / Failed). */
323
+ export declare function expectReviewStatus(scope: Page | Locator, scoreName: string, status: EvalReviewStatus): Promise<void>;
324
+ /** Expand a review row to show its criteria and produced scores. */
325
+ export declare function expandReview(scope: Page | Locator, scoreName: string): Promise<void>;
326
+ /** Close the detail dialog via Escape and wait for it to be gone. */
327
+ export declare function closeEvaluationDetailDialog(scope: Page | Locator): Promise<void>;
328
+ /** Locator for the "Manage benchmarks" dialog. Scoped by aria-label — its title collides with the toolbar button that opens it. */
329
+ export declare function getManageBenchmarksDialog(scope: Page | Locator): Locator;
330
+ /** Open the Manage benchmarks dialog from the toolbar and wait for its table UI. Returns the scoped dialog. */
331
+ export declare function openManageBenchmarksDialog(scope: Page | Locator): Promise<Locator>;
332
+ /** Type into the benchmarks search input (aria-label "Search benchmarks") inside the manage dialog. */
333
+ export declare function searchBenchmarks(scope: Page | Locator, query: string): Promise<void>;
334
+ /** Assert a benchmark appears in the manage dialog's table. */
335
+ export declare function expectBenchmarkListed(scope: Page | Locator, benchmarkName: string): Promise<void>;
336
+ /** Locator for the "New Benchmark" dialog. Scoped by aria-label — its title collides with the button that opens it. */
337
+ export declare function getCreateBenchmarkDialog(scope: Page | Locator): Locator;
338
+ /**
339
+ * Create a benchmark from inside the manage dialog: open "New Benchmark",
340
+ * fill the form, submit, and wait for both the dialog to close and the new
341
+ * row to appear.
342
+ */
343
+ export declare function createBenchmark(scope: Page | Locator, opts: {
344
+ name: string;
345
+ description?: string;
346
+ }): Promise<void>;
347
+ /** Locator for a benchmark's items dialog (Q&A list). Its title is the benchmark name (dynamic), hence the aria-label hook. */
348
+ export declare function getBenchmarkItemsDialog(scope: Page | Locator): Locator;
349
+ /**
350
+ * Open a benchmark's Q&A items dialog from its row's eye button
351
+ * (`aria-label="View items in <name>"`). Returns the scoped items dialog.
352
+ */
353
+ export declare function openBenchmarkItems(scope: Page | Locator, benchmarkName: string): Promise<Locator>;
354
+ /** Assert a Q&A item (matched by its question text) is listed in the items dialog. */
355
+ export declare function expectQaItemListed(scope: Page | Locator, questionText: string): Promise<void>;
356
+ /** Locator for the "Add Q&A" dialog (Manual / CSV Upload sub-tabs). */
357
+ export declare function getAddItemsDialog(scope: Page | Locator): Locator;
358
+ /** Open the "Add Q&A" dialog from the items dialog. Returns the scoped add dialog. */
359
+ export declare function openAddItemsDialog(scope: Page | Locator): Promise<Locator>;
360
+ /**
361
+ * Switch to a sub-tab INSIDE the Add Q&A dialog. The tab query must stay
362
+ * dialog-scoped: the edit-mentor modal behind it has its own `role="tab"`
363
+ * strip, and an unscoped `getByRole('tab')` can cross-match. Returns the
364
+ * active tabpanel so callers interact only with that sub-tab's controls
365
+ * (each panel has its own footer with its own Cancel/submit buttons).
366
+ */
367
+ export declare function switchToAddItemsSubTab(scope: Page | Locator, subTab: 'manual' | 'csv'): Promise<Locator>;
368
+ /**
369
+ * Add Q&A pairs via the Manual sub-tab. Fills one row per pair (clicking
370
+ * "Add row" as needed), submits, and waits for the dialog to close. Row
371
+ * inputs are matched by label WITHIN each row container so the Question /
372
+ * Answer labels of sibling rows can't collide.
373
+ */
374
+ export declare function addQaPairsManually(scope: Page | Locator, pairs: Array<{
375
+ question: string;
376
+ answer?: string;
377
+ }>): Promise<void>;
378
+ /**
379
+ * Upload Q&A pairs via the CSV Upload sub-tab. `csvPath` is a path on the
380
+ * test machine; the file needs `input` (required) and `expected_output`
381
+ * (optional) columns. Waits for the dialog to close on success.
382
+ */
383
+ export declare function uploadQaCsv(scope: Page | Locator, csvPath: string): Promise<void>;
384
+ /** Locator for the Q&A delete-confirm dialog. */
385
+ export declare function getDeleteQaItemDialog(scope: Page | Locator): Locator;
386
+ /**
387
+ * Delete a Q&A item by its question text: click the row's trash button
388
+ * (`aria-label="Delete Q&A"`) and confirm. The confirm "Delete" button must
389
+ * stay scoped to the confirm dialog — the items dialog's rows keep their
390
+ * own delete buttons mounted behind it.
391
+ */
392
+ export declare function deleteQaItem(scope: Page | Locator, questionText: string): Promise<void>;
393
+ /** Close the benchmark items dialog via Escape and wait for it to be gone. */
394
+ export declare function closeBenchmarkItemsDialog(scope: Page | Locator): Promise<void>;
395
+ /** Close the Manage benchmarks dialog via Escape and wait for it to be gone. */
396
+ export declare function closeManageBenchmarksDialog(scope: Page | Locator): Promise<void>;
@@ -33,6 +33,7 @@ export { billingPlanSection, billingCreditsSection, billingAutoRechargeSection,
33
33
  export type { BillingAutoRechargeStatus } from './billing-tab-helpers';
34
34
  export { TASKS_LABELS, isTasksTabVisible, switchToTasksTab, getScheduleTaskButton, getSearchInput, getTaskRow, expectTotalTasks, expectCompletedTasks, expectFailedTasks, expectTasksEmpty, expectTaskInList, expectTaskNotInList, selectTaskInList, expectTaskStatus, searchTasks, openScheduleTaskDialog, scheduleTask, expectScheduleStartTimeInPastError, deleteTask, expectLogsForTask, expectNoLogsForSelectedTask, openFirstLogDetails, expectLogDetailsStatus, } from './tasks-tab-helpers';
35
35
  export type { TaskRepeat, TaskStatus } from './tasks-tab-helpers';
36
+ export * from './evaluation-tab-helpers';
36
37
  export * from './lti-tab-helpers';
37
38
  export { createPlaywrightConfig, generateProjectConfig, generateBrowserSetupProjects, getBrowserKey, } from './playwright-config';
38
39
  export type { PlatformConfig, CreatePlaywrightConfigOptions } from './playwright-config';