@iblai/iblai-js 2.5.0 → 2.5.5

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 (33) hide show
  1. package/dist/data-layer/playwright/index.d.ts +4 -2
  2. package/dist/data-layer/playwright/lti-tab-helpers.d.ts +36 -1
  3. package/dist/data-layer/playwright/memory-admin-helpers.d.ts +153 -0
  4. package/dist/data-layer/playwright/memory-test-helpers.d.ts +8 -7
  5. package/dist/data-layer/playwright/voice-tab-helpers.d.ts +32 -0
  6. package/dist/playwright/index.cjs +550 -26
  7. package/dist/playwright/index.cjs.map +1 -1
  8. package/dist/playwright/index.d.ts +231 -10
  9. package/dist/playwright/index.esm.js +521 -27
  10. package/dist/playwright/index.esm.js.map +1 -1
  11. package/dist/playwright/playwright/index.d.ts +4 -2
  12. package/dist/playwright/playwright/lti-tab-helpers.d.ts +36 -1
  13. package/dist/playwright/playwright/memory-admin-helpers.d.ts +153 -0
  14. package/dist/playwright/playwright/memory-test-helpers.d.ts +8 -7
  15. package/dist/playwright/playwright/voice-tab-helpers.d.ts +32 -0
  16. package/dist/security/playwright/index.d.ts +4 -2
  17. package/dist/security/playwright/lti-tab-helpers.d.ts +36 -1
  18. package/dist/security/playwright/memory-admin-helpers.d.ts +153 -0
  19. package/dist/security/playwright/memory-test-helpers.d.ts +8 -7
  20. package/dist/security/playwright/voice-tab-helpers.d.ts +32 -0
  21. package/dist/web-containers/playwright/index.d.ts +4 -2
  22. package/dist/web-containers/playwright/lti-tab-helpers.d.ts +36 -1
  23. package/dist/web-containers/playwright/memory-admin-helpers.d.ts +153 -0
  24. package/dist/web-containers/playwright/memory-test-helpers.d.ts +8 -7
  25. package/dist/web-containers/playwright/voice-tab-helpers.d.ts +32 -0
  26. package/dist/web-containers/source/index.esm.js +12524 -11248
  27. package/dist/web-containers/source/next/index.esm.js +1740 -444
  28. package/dist/web-utils/playwright/index.d.ts +4 -2
  29. package/dist/web-utils/playwright/lti-tab-helpers.d.ts +36 -1
  30. package/dist/web-utils/playwright/memory-admin-helpers.d.ts +153 -0
  31. package/dist/web-utils/playwright/memory-test-helpers.d.ts +8 -7
  32. package/dist/web-utils/playwright/voice-tab-helpers.d.ts +32 -0
  33. package/package.json +4 -4
@@ -1617,19 +1617,20 @@ async function openAddMemoryDialog(page) {
1617
1617
  return dialog;
1618
1618
  }
1619
1619
  /**
1620
- * Toggle a memory setting switch and verify the state changes.
1621
- * Returns the new checked state.
1620
+ * Toggle a memory setting switch and verify the state changes. Completion is
1621
+ * gated on `aria-checked` flipping — which only happens once the settings
1622
+ * mutation resolves — rather than on timing. Returns the new checked state.
1622
1623
  */
1623
1624
  async function toggleMemorySwitch(page, switchName) {
1624
1625
  const switchEl = page.getByRole('switch', { name: switchName });
1625
1626
  await expect(switchEl).toBeVisible({ timeout: 10000 });
1626
1627
  const wasChecked = await switchEl.isChecked();
1627
1628
  await switchEl.click();
1628
- // Wait for API response
1629
- await page.waitForTimeout(1000);
1630
- const isNowChecked = await switchEl.isChecked();
1631
- logger.info(`Toggled "${switchName}" from ${wasChecked} to ${isNowChecked}`);
1632
- return isNowChecked;
1629
+ await expect(switchEl).toHaveAttribute('aria-checked', String(!wasChecked), {
1630
+ timeout: 15000,
1631
+ });
1632
+ logger.info(`Toggled "${switchName}" from ${wasChecked} to ${!wasChecked}`);
1633
+ return !wasChecked;
1633
1634
  }
1634
1635
  /**
1635
1636
  * Add a memory via the Add Memory dialog.
@@ -1649,32 +1650,47 @@ async function addMemory(page, content) {
1649
1650
  logger.info(`Added memory: "${content}"`);
1650
1651
  }
1651
1652
  /**
1652
- * Delete the first visible memory in the list.
1653
- * Hovers to reveal the delete button, then clicks it.
1653
+ * Delete a memory row via its three-dots menu: opens the menu, clicks
1654
+ * Delete, and confirms in the Delete Memory dialog. The confirmation dialog
1655
+ * is resolved into its own Locator first (topmost dialog matching the
1656
+ * title), and completion is gated on it closing after the mutation resolves.
1657
+ */
1658
+ async function deleteMemoryRow(page, memoryRow) {
1659
+ const menuTrigger = memoryRow.getByRole('button', { name: /^Memory actions:/ });
1660
+ await expect(menuTrigger).toBeVisible({ timeout: 5000 });
1661
+ await menuTrigger.click();
1662
+ // The menu portals to <body>; only one dropdown menu is ever open at once.
1663
+ const deleteItem = page.getByRole('menuitem', { name: 'Delete', exact: true });
1664
+ await expect(deleteItem).toBeVisible({ timeout: 5000 });
1665
+ await deleteItem.click();
1666
+ // Deleting asks for confirmation; the dialog stacks on top of everything.
1667
+ const confirmDialog = page.getByRole('dialog').filter({ hasText: 'Delete Memory' }).last();
1668
+ await expect(confirmDialog).toBeVisible({ timeout: 5000 });
1669
+ await confirmDialog.getByRole('button', { name: 'Delete', exact: true }).click();
1670
+ await expect(confirmDialog).toBeHidden({ timeout: 15000 });
1671
+ }
1672
+ /**
1673
+ * Delete the first visible memory in the list through its three-dots menu,
1674
+ * confirming in the Delete Memory dialog.
1654
1675
  */
1655
1676
  async function deleteFirstMemory(page) {
1656
- const deleteButton = page.locator('button[aria-label^="Delete memory:"]').first();
1657
- await expect(deleteButton).toBeVisible({ timeout: 5000 });
1658
- await deleteButton.hover();
1659
- await deleteButton.click();
1660
- // Wait for delete action to complete
1661
- await page.waitForTimeout(2000);
1677
+ const memoryRow = page.getByTestId('memory-row').first();
1678
+ await expect(memoryRow).toBeVisible({ timeout: 5000 });
1679
+ await deleteMemoryRow(page, memoryRow);
1662
1680
  logger.info('Memory deleted successfully');
1663
1681
  }
1664
1682
  /**
1665
- * Delete a specific memory by matching its content text.
1666
- * Finds the memory item containing the text, hovers to reveal
1667
- * the delete button, and clicks it.
1683
+ * Delete a specific memory by matching its content text through its
1684
+ * three-dots menu, confirming in the Delete Memory dialog. Completion is
1685
+ * gated on the row leaving the list after the refetch.
1668
1686
  */
1669
1687
  async function deleteMemoryByContent(page, content) {
1670
- // Find the memory row containing this text
1671
- const memoryRow = page.locator('.group').filter({ hasText: content }).first();
1688
+ const memoryRow = page.getByTestId('memory-row').filter({ hasText: content }).first();
1672
1689
  await expect(memoryRow).toBeVisible({ timeout: 5000 });
1673
- const deleteButton = memoryRow.locator('button[aria-label^="Delete memory:"]');
1674
- await deleteButton.hover();
1675
- await deleteButton.click();
1676
- // Wait for delete to complete and item to be removed
1677
- await expect(memoryRow.getByText(content)).not.toBeVisible({ timeout: 10000 });
1690
+ await deleteMemoryRow(page, memoryRow);
1691
+ await expect(page.getByTestId('memory-row').filter({ hasText: content })).toBeHidden({
1692
+ timeout: 15000,
1693
+ });
1678
1694
  logger.info(`Deleted memory: "${content}"`);
1679
1695
  }
1680
1696
  /**
@@ -1712,6 +1728,356 @@ async function verifyMemoryNotExists(page, content) {
1712
1728
  logger.info(`Verified memory removed: "${content}"`);
1713
1729
  }
1714
1730
 
1731
+ /**
1732
+ * Tenant-settings **Memory** tab helpers — Playwright bindings for the memory
1733
+ * administration UI from `@iblai/web-containers` (`MemoryAdminTab`):
1734
+ *
1735
+ * - the **Global** sub-tab: tenant users table with server-side search, and a
1736
+ * per-user popup (`user-memories-modal`) hosting the shared memories list
1737
+ * plus the user's two memory setting switches, and
1738
+ * - the **Agent** sub-tab: agents table with the shared agent autocomplete
1739
+ * filter, and a per-agent popup (`agent-memories-modal`) hosting the same
1740
+ * `ManageMemories` editor the agent settings modal renders.
1741
+ *
1742
+ * Selector policy (flakiness-proof by construction):
1743
+ * - Dialog-first scoping: every popup is resolved into a Locator variable
1744
+ * first (`openUserMemoriesPopup` / `openAgentMemoriesPopup` return it) and
1745
+ * all sub-elements are queried from that variable — never a bare page-wide
1746
+ * match that could hit same-named elements in nested portals. The popups
1747
+ * stack ON TOP of the tenant settings dialog, and the add/edit/delete
1748
+ * dialogs stack on top of the popups, so three dialogs can be open at once;
1749
+ * the innermost ones are resolved by content filter + `.last()` (stacked
1750
+ * Radix dialogs portal to the end of `<body>` in mount order, making the
1751
+ * last match the one on top).
1752
+ * - Stable hooks only: `data-testid`, role + accessible name (aria-labels).
1753
+ * No CSS class or structural selectors.
1754
+ * - No `waitForTimeout` / `networkidle`. Progress is gated on UI state that
1755
+ * only exists after the awaited transition: a section testid rendering, a
1756
+ * dialog closing after its mutation resolves, a row appearing or
1757
+ * disappearing after the list refetch, a switch's `aria-checked` flipping.
1758
+ */
1759
+ const MEMORY_ADMIN_LABELS = {
1760
+ /** Tenant settings rail item name. */
1761
+ tabName: 'Memory',
1762
+ subTabs: {
1763
+ global: 'Global',
1764
+ agent: 'Agent',
1765
+ },
1766
+ /** Add button inside the user memories popup (shared list styling). */
1767
+ addMemoryButton: 'Add Memory',
1768
+ menu: {
1769
+ /** aria-label prefix of a memory row's three-dots trigger. */
1770
+ actionsAriaPrefix: 'Memory actions:',
1771
+ edit: 'Edit',
1772
+ delete: 'Delete',
1773
+ },
1774
+ dialogs: {
1775
+ add: 'Add Memory',
1776
+ edit: 'Edit Memory',
1777
+ deleteConfirm: 'Delete Memory',
1778
+ },
1779
+ /**
1780
+ * Switch accessible-name prefixes. The full names carry the current state
1781
+ * ("Auto memory capture enabled"), so helpers match on the prefix.
1782
+ */
1783
+ switches: {
1784
+ autoCapture: /^Auto memory capture/,
1785
+ useMemory: /^Use memory in responses/,
1786
+ },
1787
+ };
1788
+ const UI_TIMEOUT$2 = 10000;
1789
+ const MUTATION_TIMEOUT$2 = 15000;
1790
+ // ---------------------------------------------------------------------------
1791
+ // Sections and rows
1792
+ // ---------------------------------------------------------------------------
1793
+ /** The Global sub-tab's body (users table + search). */
1794
+ function memoryAdminGlobalSection(page) {
1795
+ return page.getByTestId('memory-admin-global-section');
1796
+ }
1797
+ /** The Agent sub-tab's body (agents table + autocomplete filter). */
1798
+ function memoryAdminAgentSection(page) {
1799
+ return page.getByTestId('memory-admin-agent-section');
1800
+ }
1801
+ /** A users-table row for the given username. */
1802
+ function memoryAdminUserRow(page, username) {
1803
+ return memoryAdminGlobalSection(page).getByTestId(`memory-admin-user-row-${username}`);
1804
+ }
1805
+ /** An agents-table row for the given agent unique_id. */
1806
+ function memoryAdminAgentRow(page, mentorUniqueId) {
1807
+ return memoryAdminAgentSection(page).getByTestId(`memory-admin-agent-row-${mentorUniqueId}`);
1808
+ }
1809
+ /**
1810
+ * A memory row inside an open popup, found by (part of) its content text.
1811
+ * `scope` is the popup Locator returned by `openUserMemoriesPopup`.
1812
+ */
1813
+ function memoryRowByContent(scope, content) {
1814
+ return scope.getByTestId('memory-row').filter({ hasText: content });
1815
+ }
1816
+ // ---------------------------------------------------------------------------
1817
+ // Tab navigation
1818
+ // ---------------------------------------------------------------------------
1819
+ /**
1820
+ * Returns false when the Memory rail item isn't rendered in the tenant
1821
+ * settings dialog (non-admin viewer).
1822
+ */
1823
+ async function isTenantMemoryTabVisible(page) {
1824
+ const railItem = page
1825
+ .getByRole('button', { name: MEMORY_ADMIN_LABELS.tabName, exact: true })
1826
+ .first();
1827
+ try {
1828
+ await expect(railItem).toBeVisible({ timeout: 5000 });
1829
+ return true;
1830
+ }
1831
+ catch (_a) {
1832
+ return false;
1833
+ }
1834
+ }
1835
+ /**
1836
+ * Open the Memory tab from the tenant settings rail. Assumes the tenant
1837
+ * settings dialog is already open. Completion is gated on the Global sub-tab
1838
+ * trigger rendering (it appears once the memsearch status check resolves).
1839
+ */
1840
+ async function switchToTenantMemoryTab(page) {
1841
+ // Desktop and mobile rails both render the item; the first match is the
1842
+ // desktop one, which is the visible rail on desktop viewports.
1843
+ const railItem = page
1844
+ .getByRole('button', { name: MEMORY_ADMIN_LABELS.tabName, exact: true })
1845
+ .first();
1846
+ await expect(railItem).toBeVisible({ timeout: UI_TIMEOUT$2 });
1847
+ await railItem.click();
1848
+ await expect(page.getByTestId('memory-admin-sub-tab-global')).toBeVisible({
1849
+ timeout: UI_TIMEOUT$2,
1850
+ });
1851
+ logger.info('Switched to tenant Memory tab');
1852
+ }
1853
+ /**
1854
+ * Switch between the Memory tab's Global / Agent sub-tabs. Completion is
1855
+ * gated on the target section's testid rendering.
1856
+ */
1857
+ async function switchToMemoryAdminSubTab(page, subTab) {
1858
+ const trigger = page.getByTestId(`memory-admin-sub-tab-${subTab}`);
1859
+ await expect(trigger).toBeVisible({ timeout: UI_TIMEOUT$2 });
1860
+ await trigger.click();
1861
+ const section = subTab === 'global' ? memoryAdminGlobalSection(page) : memoryAdminAgentSection(page);
1862
+ await expect(section).toBeVisible({ timeout: UI_TIMEOUT$2 });
1863
+ logger.info(`Switched to Memory "${subTab}" sub-tab`);
1864
+ }
1865
+ // ---------------------------------------------------------------------------
1866
+ // Global sub-tab: users table + per-user popup
1867
+ // ---------------------------------------------------------------------------
1868
+ /**
1869
+ * Search the users table and gate on the expected user's row appearing.
1870
+ * Terms shorter than three characters search as empty (the Management tab's
1871
+ * debounce contract), so pass at least three characters.
1872
+ */
1873
+ async function searchMemoryAdminUsers(page, term, expectedUsername) {
1874
+ const input = memoryAdminGlobalSection(page).getByTestId('memory-admin-users-search');
1875
+ await expect(input).toBeVisible({ timeout: UI_TIMEOUT$2 });
1876
+ await input.fill(term);
1877
+ await expect(memoryAdminUserRow(page, expectedUsername)).toBeVisible({
1878
+ timeout: MUTATION_TIMEOUT$2,
1879
+ });
1880
+ logger.info(`Searched memory users for "${term}"`);
1881
+ }
1882
+ /**
1883
+ * Open the global memories popup for a user's row and return the popup's
1884
+ * Locator — pass it as the `popup` argument of every helper below so their
1885
+ * queries stay pinned to the popup instead of the dialogs underneath.
1886
+ * Completion is gated on the popup's list state rendering (rows, the empty
1887
+ * state, or the loading skeletons resolving into either).
1888
+ */
1889
+ async function openUserMemoriesPopup(page, username) {
1890
+ const viewButton = memoryAdminUserRow(page, username).getByTestId(`memory-admin-user-view-${username}`);
1891
+ await expect(viewButton).toBeVisible({ timeout: UI_TIMEOUT$2 });
1892
+ await viewButton.click();
1893
+ const popup = page.getByTestId('user-memories-modal');
1894
+ await expect(popup).toBeVisible({ timeout: UI_TIMEOUT$2 });
1895
+ await expect(popup.getByTestId('memories-list').or(popup.getByTestId('memories-list-empty'))).toBeVisible({ timeout: MUTATION_TIMEOUT$2 });
1896
+ logger.info(`Opened global memories popup for "${username}"`);
1897
+ return popup;
1898
+ }
1899
+ /** Close the user memories popup (Escape) and gate on it disappearing. */
1900
+ async function closeUserMemoriesPopup(page) {
1901
+ const popup = page.getByTestId('user-memories-modal');
1902
+ await expect(popup).toBeVisible({ timeout: UI_TIMEOUT$2 });
1903
+ await page.keyboard.press('Escape');
1904
+ await expect(popup).toBeHidden({ timeout: UI_TIMEOUT$2 });
1905
+ }
1906
+ /**
1907
+ * The innermost open dialog whose text matches `title`. Stacked Radix
1908
+ * dialogs portal to the end of `<body>` in mount order, so `.last()` is the
1909
+ * one on top — required here because the add/edit/delete dialogs open above
1910
+ * the popup, which itself sits above the tenant settings dialog.
1911
+ */
1912
+ function topDialogByTitle(page, title) {
1913
+ return page.getByRole('dialog').filter({ hasText: title }).last();
1914
+ }
1915
+ /** Open a memory row's three-dots menu and click one of its actions. */
1916
+ async function clickMemoryRowAction(page, row, action) {
1917
+ const trigger = row.getByRole('button', {
1918
+ name: new RegExp(`^${MEMORY_ADMIN_LABELS.menu.actionsAriaPrefix}`),
1919
+ });
1920
+ await expect(trigger).toBeVisible({ timeout: UI_TIMEOUT$2 });
1921
+ await trigger.click();
1922
+ // The menu portals to <body>; only one dropdown menu is ever open at once.
1923
+ const item = page.getByRole('menuitem', { name: action, exact: true });
1924
+ await expect(item).toBeVisible({ timeout: UI_TIMEOUT$2 });
1925
+ await item.click();
1926
+ }
1927
+ /**
1928
+ * Add a global memory for the popup's user: opens the Add Memory dialog,
1929
+ * fills the content (minimum 10 characters), saves, and gates on the dialog
1930
+ * closing and the new row appearing in the popup's list.
1931
+ */
1932
+ async function addUserGlobalMemory(page, popup, content) {
1933
+ const addButton = popup.getByTestId('user-memories-add');
1934
+ await expect(addButton).toBeVisible({ timeout: UI_TIMEOUT$2 });
1935
+ await addButton.click();
1936
+ const dialog = topDialogByTitle(page, MEMORY_ADMIN_LABELS.dialogs.add);
1937
+ await expect(dialog).toBeVisible({ timeout: UI_TIMEOUT$2 });
1938
+ await dialog.locator('#memory-content').fill(content);
1939
+ const saveButton = dialog.getByRole('button', { name: 'Save Memory', exact: true });
1940
+ await expect(saveButton).toBeEnabled({ timeout: UI_TIMEOUT$2 });
1941
+ await saveButton.click();
1942
+ await expect(dialog).toBeHidden({ timeout: MUTATION_TIMEOUT$2 });
1943
+ await expect(memoryRowByContent(popup, content)).toBeVisible({ timeout: MUTATION_TIMEOUT$2 });
1944
+ logger.info(`Added global memory: "${content}"`);
1945
+ }
1946
+ /**
1947
+ * Edit a global memory found by its current content: three-dots → Edit,
1948
+ * replace the content, save, and gate on the dialog closing and the updated
1949
+ * row appearing in the popup's list.
1950
+ */
1951
+ async function editUserGlobalMemory(page, popup, currentContent, newContent) {
1952
+ const row = memoryRowByContent(popup, currentContent);
1953
+ await expect(row).toBeVisible({ timeout: UI_TIMEOUT$2 });
1954
+ await clickMemoryRowAction(page, row, MEMORY_ADMIN_LABELS.menu.edit);
1955
+ const dialog = topDialogByTitle(page, MEMORY_ADMIN_LABELS.dialogs.edit);
1956
+ await expect(dialog).toBeVisible({ timeout: UI_TIMEOUT$2 });
1957
+ await dialog.locator('#edit-memory-content').fill(newContent);
1958
+ const saveButton = dialog.getByRole('button', { name: 'Save Memory', exact: true });
1959
+ await expect(saveButton).toBeEnabled({ timeout: UI_TIMEOUT$2 });
1960
+ await saveButton.click();
1961
+ await expect(dialog).toBeHidden({ timeout: MUTATION_TIMEOUT$2 });
1962
+ await expect(memoryRowByContent(popup, newContent)).toBeVisible({ timeout: MUTATION_TIMEOUT$2 });
1963
+ logger.info(`Edited global memory to: "${newContent}"`);
1964
+ }
1965
+ /**
1966
+ * Delete a global memory found by its content: three-dots → Delete, confirm
1967
+ * in the Delete Memory dialog, and gate on the confirmation closing and the
1968
+ * row leaving the popup's list.
1969
+ */
1970
+ async function deleteUserGlobalMemory(page, popup, content) {
1971
+ const row = memoryRowByContent(popup, content);
1972
+ await expect(row).toBeVisible({ timeout: UI_TIMEOUT$2 });
1973
+ await clickMemoryRowAction(page, row, MEMORY_ADMIN_LABELS.menu.delete);
1974
+ const confirmDialog = topDialogByTitle(page, MEMORY_ADMIN_LABELS.dialogs.deleteConfirm);
1975
+ await expect(confirmDialog).toBeVisible({ timeout: UI_TIMEOUT$2 });
1976
+ await confirmDialog.getByRole('button', { name: 'Delete', exact: true }).click();
1977
+ await expect(confirmDialog).toBeHidden({ timeout: MUTATION_TIMEOUT$2 });
1978
+ await expect(memoryRowByContent(popup, content)).toBeHidden({ timeout: MUTATION_TIMEOUT$2 });
1979
+ logger.info(`Deleted global memory: "${content}"`);
1980
+ }
1981
+ /**
1982
+ * Toggle one of the user's memory setting switches inside the popup and
1983
+ * gate on its `aria-checked` state flipping (which only happens after the
1984
+ * settings mutation resolves and the query refetches). Returns the new
1985
+ * checked state.
1986
+ */
1987
+ async function toggleUserMemoryAdminSetting(page, popup, setting) {
1988
+ const switchEl = popup.getByRole('switch', { name: MEMORY_ADMIN_LABELS.switches[setting] });
1989
+ await expect(switchEl).toBeVisible({ timeout: UI_TIMEOUT$2 });
1990
+ const wasChecked = await switchEl.isChecked();
1991
+ await switchEl.click();
1992
+ await expect(switchEl).toHaveAttribute('aria-checked', String(!wasChecked), {
1993
+ timeout: MUTATION_TIMEOUT$2,
1994
+ });
1995
+ logger.info(`Toggled memory setting "${setting}" from ${wasChecked} to ${!wasChecked}`);
1996
+ return !wasChecked;
1997
+ }
1998
+ // ---------------------------------------------------------------------------
1999
+ // Agent sub-tab: agents table + per-agent popup
2000
+ // ---------------------------------------------------------------------------
2001
+ /**
2002
+ * Filter the agents table to one agent via the autocomplete: types the name,
2003
+ * clicks the matching option, and gates on the selected chip rendering.
2004
+ */
2005
+ async function filterAgentMemories(page, agentName) {
2006
+ const section = memoryAdminAgentSection(page);
2007
+ const input = section.getByTestId('agent-memories-filter-input');
2008
+ await expect(input).toBeVisible({ timeout: UI_TIMEOUT$2 });
2009
+ await input.fill(agentName);
2010
+ const option = section
2011
+ .getByTestId('agent-memories-filter-results')
2012
+ .getByRole('button', { name: agentName, exact: true });
2013
+ await expect(option).toBeVisible({ timeout: MUTATION_TIMEOUT$2 });
2014
+ await option.click();
2015
+ await expect(section.getByTestId('agent-memories-filter-selected')).toBeVisible({
2016
+ timeout: UI_TIMEOUT$2,
2017
+ });
2018
+ logger.info(`Filtered agent memories to "${agentName}"`);
2019
+ }
2020
+ /** Clear the agents autocomplete filter (back to the full agents list). */
2021
+ async function clearAgentMemoriesFilter(page) {
2022
+ const section = memoryAdminAgentSection(page);
2023
+ const clearButton = section.getByTestId('agent-memories-filter-clear');
2024
+ await expect(clearButton).toBeVisible({ timeout: UI_TIMEOUT$2 });
2025
+ await clearButton.click();
2026
+ await expect(section.getByTestId('agent-memories-filter-input')).toBeVisible({
2027
+ timeout: UI_TIMEOUT$2,
2028
+ });
2029
+ }
2030
+ /**
2031
+ * Open the memories popup for an agent's row and return the popup's Locator
2032
+ * — pass it as the `popup` argument of `addAgentMemoryFromPopup` and scope
2033
+ * any further queries to it. Completion is gated on the `ManageMemories`
2034
+ * editor rendering its user filter combobox.
2035
+ */
2036
+ async function openAgentMemoriesPopup(page, mentorUniqueId) {
2037
+ const viewButton = memoryAdminAgentRow(page, mentorUniqueId).getByTestId(`memory-admin-agent-view-${mentorUniqueId}`);
2038
+ await expect(viewButton).toBeVisible({ timeout: UI_TIMEOUT$2 });
2039
+ await viewButton.click();
2040
+ const popup = page.getByTestId('agent-memories-modal');
2041
+ await expect(popup).toBeVisible({ timeout: UI_TIMEOUT$2 });
2042
+ await expect(popup.getByRole('combobox').first()).toBeVisible({ timeout: MUTATION_TIMEOUT$2 });
2043
+ logger.info(`Opened agent memories popup for "${mentorUniqueId}"`);
2044
+ return popup;
2045
+ }
2046
+ /** Close the agent memories popup (Escape) and gate on it disappearing. */
2047
+ async function closeAgentMemoriesPopup(page) {
2048
+ const popup = page.getByTestId('agent-memories-modal');
2049
+ await expect(popup).toBeVisible({ timeout: UI_TIMEOUT$2 });
2050
+ await page.keyboard.press('Escape');
2051
+ await expect(popup).toBeHidden({ timeout: UI_TIMEOUT$2 });
2052
+ }
2053
+ /**
2054
+ * Add an agent memory through the popup's `ManageMemories` editor: opens its
2055
+ * Add Memory dialog, optionally picks a category, fills the content (minimum
2056
+ * 10 characters), saves, and gates on the dialog closing and the content
2057
+ * appearing in the popup.
2058
+ */
2059
+ async function addAgentMemoryFromPopup(page, popup, content, categoryName) {
2060
+ const addButton = popup.getByRole('button', { name: MEMORY_ADMIN_LABELS.addMemoryButton });
2061
+ await expect(addButton).toBeVisible({ timeout: UI_TIMEOUT$2 });
2062
+ await addButton.click();
2063
+ const dialog = topDialogByTitle(page, MEMORY_ADMIN_LABELS.dialogs.add);
2064
+ await expect(dialog).toBeVisible({ timeout: UI_TIMEOUT$2 });
2065
+ if (categoryName) {
2066
+ await dialog.getByRole('combobox').click();
2067
+ // Radix Select portals its listbox to <body>; one is open at a time.
2068
+ const option = page.getByRole('option', { name: categoryName, exact: true });
2069
+ await expect(option).toBeVisible({ timeout: UI_TIMEOUT$2 });
2070
+ await option.click();
2071
+ }
2072
+ await dialog.getByRole('textbox').fill(content);
2073
+ const saveButton = dialog.getByRole('button', { name: 'Save', exact: true });
2074
+ await expect(saveButton).toBeEnabled({ timeout: UI_TIMEOUT$2 });
2075
+ await saveButton.click();
2076
+ await expect(dialog).toBeHidden({ timeout: MUTATION_TIMEOUT$2 });
2077
+ await expect(popup.getByText(content)).toBeVisible({ timeout: MUTATION_TIMEOUT$2 });
2078
+ logger.info(`Added agent memory: "${content}"`);
2079
+ }
2080
+
1715
2081
  // ============================
1716
2082
  // Navigation Helpers
1717
2083
  // ============================
@@ -3863,6 +4229,14 @@ const VOICE_LABELS = {
3863
4229
  openai: 'OpenAI Voice',
3864
4230
  google: 'Google Voice',
3865
4231
  },
4232
+ voiceInstructions: {
4233
+ label: 'Voice Instructions',
4234
+ presets: {
4235
+ warm: 'Warm and encouraging',
4236
+ calm: 'Calm and measured',
4237
+ energetic: 'Energetic and upbeat',
4238
+ },
4239
+ },
3866
4240
  saveVoiceButton: /save voice settings|saving…/i,
3867
4241
  // The "Save" button reads "Save" when no config exists yet and
3868
4242
  // "Save changes" once one does. Helpers match both via a regex.
@@ -4074,6 +4448,62 @@ async function previewVoice(scope, voiceName) {
4074
4448
  await expect(previewBtn).toBeVisible({ timeout: 10000 });
4075
4449
  await previewBtn.click();
4076
4450
  }
4451
+ /**
4452
+ * Open the "Voice Instructions" editor modal from its prompt card on the
4453
+ * Voice sub-tab. The card is only rendered when the OpenAI or Google
4454
+ * provider is selected. Mirrors the Prompts / Screen share card pattern:
4455
+ * an "Edit <label>" button popping the rich-text modal.
4456
+ */
4457
+ async function openVoiceInstructionsEditor(scope) {
4458
+ const btn = scope.getByRole('button', { name: `Edit ${VOICE_LABELS.voiceInstructions.label}` });
4459
+ await expect(btn).toBeVisible({ timeout: 10000 });
4460
+ await btn.click();
4461
+ await expect(asPage$5(scope).getByText(`Edit ${VOICE_LABELS.voiceInstructions.label}`)).toBeVisible({ timeout: 10000 });
4462
+ logger.info('Opened voice-instructions editor');
4463
+ }
4464
+ /**
4465
+ * Replace the "Voice Instructions" text via the editor modal and confirm.
4466
+ * The new value is written to local form state; call `saveVoiceSettings`
4467
+ * afterwards to persist. Pass an empty string to clear the stored
4468
+ * instructions (saving then sends `""`).
4469
+ */
4470
+ async function setVoiceInstructions(scope, text) {
4471
+ await openVoiceInstructionsEditor(scope);
4472
+ const page = asPage$5(scope);
4473
+ const editor = page.getByRole('dialog').locator('[contenteditable="true"]').first();
4474
+ await expect(editor).toBeVisible({ timeout: 10000 });
4475
+ await editor.click();
4476
+ await page.keyboard.press('ControlOrMeta+A');
4477
+ await page.keyboard.press('Delete');
4478
+ if (text)
4479
+ await editor.pressSequentially(text);
4480
+ // The modal's Save button — scope to dialog so we don't grab the
4481
+ // outer tab's Save.
4482
+ await page
4483
+ .getByRole('dialog')
4484
+ .getByRole('button', { name: /^save$/i })
4485
+ .click();
4486
+ await expect(page.getByRole('dialog')).toBeHidden({ timeout: 10000 });
4487
+ logger.info(`Voice instructions set (${text.length} chars)`);
4488
+ }
4489
+ /**
4490
+ * Assert the voice-instructions prompt card shows the given text.
4491
+ */
4492
+ async function expectVoiceInstructionsValue(scope, text) {
4493
+ await expect(scope.getByTestId('voice-instructions-card')).toContainText(text, {
4494
+ timeout: 10000,
4495
+ });
4496
+ }
4497
+ /**
4498
+ * Click one of the example preset chips under the voice-instructions
4499
+ * textarea; the chip's canned text replaces the textarea content.
4500
+ */
4501
+ async function applyVoiceInstructionsPreset(scope, preset) {
4502
+ const chip = scope.getByTestId(`voice-instructions-preset-${preset}`);
4503
+ await expect(chip).toBeVisible({ timeout: 10000 });
4504
+ await chip.click();
4505
+ logger.info(`Applied voice-instructions preset "${preset}"`);
4506
+ }
4077
4507
  /**
4078
4508
  * Click the Save button on the Voice sub-tab. Asserts the button is
4079
4509
  * enabled first (a no-op on a pristine form would be a test bug).
@@ -6735,6 +7165,14 @@ const LTI_LABELS = {
6735
7165
  keys: 'No LTI keys yet.',
6736
7166
  tools: 'No LTI tools yet.',
6737
7167
  },
7168
+ /** Badge text for the async-create link status. */
7169
+ status: {
7170
+ pending: 'Pending',
7171
+ building: 'Building',
7172
+ ready: 'Ready',
7173
+ failed: 'Failed',
7174
+ },
7175
+ retry: 'Retry',
6738
7176
  };
6739
7177
  /** data-testid values rendered by the LTI components. */
6740
7178
  const LTI_TEST_IDS = {
@@ -6753,6 +7191,9 @@ const LTI_TEST_IDS = {
6753
7191
  row: 'lti-link-row',
6754
7192
  modal: 'lti-link-modal',
6755
7193
  nameInput: 'lti-link-name-input',
7194
+ status: 'lti-link-status',
7195
+ retryButton: 'lti-link-retry-button',
7196
+ refreshButton: 'lti-links-refresh-button',
6756
7197
  },
6757
7198
  keys: {
6758
7199
  section: 'lti-keys-section',
@@ -6899,7 +7340,12 @@ async function submitLinkModal(scope) {
6899
7340
  await submit.click();
6900
7341
  await expect(getLinkModal(scope)).toBeHidden({ timeout: 15000 });
6901
7342
  }
6902
- /** Full create-link flow. */
7343
+ /**
7344
+ * Full create-link flow. Creation is asynchronous on the backend (202 +
7345
+ * celery build): the modal closes immediately and the row appears with a
7346
+ * Pending/Building status badge. Follow with `waitForLinkReady` before
7347
+ * asserting on `target_link_uri` or editing the link.
7348
+ */
6903
7349
  async function createLink(scope, name) {
6904
7350
  await openCreateLinkModal(scope);
6905
7351
  await fillLinkName(scope, name);
@@ -6925,6 +7371,54 @@ async function expectLinkNotInList(scope, name) {
6925
7371
  async function expectLinkTargetUri(scope, name, targetUri) {
6926
7372
  await expect(getLinkRow(scope, name)).toContainText(targetUri, { timeout: 10000 });
6927
7373
  }
7374
+ function getLinkStatusBadge(scope, name) {
7375
+ return getLinkRow(scope, name).getByTestId(LTI_TEST_IDS.links.status);
7376
+ }
7377
+ async function expectLinkStatus(scope, name, status) {
7378
+ await expect(getLinkStatusBadge(scope, name)).toHaveAttribute('data-status', status, {
7379
+ timeout: 10000,
7380
+ });
7381
+ }
7382
+ /** The Refresh button shown in the Links header while a build is in flight. */
7383
+ function getLinksRefreshButton(scope) {
7384
+ return getLinksSection(scope).getByTestId(LTI_TEST_IDS.links.refreshButton);
7385
+ }
7386
+ /** Manually refresh the links list (visible only while a build is in flight). */
7387
+ async function refreshLinks(scope) {
7388
+ await getLinksRefreshButton(scope).click();
7389
+ }
7390
+ /**
7391
+ * Wait for the async link build to finish (`ready`). The build creates an edX
7392
+ * course via celery, so allow a generous timeout (default 3 minutes). The UI
7393
+ * does not auto-poll — this helper clicks the header Refresh button every few
7394
+ * seconds until the row's badge reports `ready` (throws if it turns `failed`).
7395
+ */
7396
+ async function waitForLinkReady(scope, name, timeoutMs = 180000) {
7397
+ const badge = getLinkStatusBadge(scope, name);
7398
+ const deadline = Date.now() + timeoutMs;
7399
+ for (;;) {
7400
+ const status = await badge.getAttribute('data-status');
7401
+ if (status === 'ready')
7402
+ break;
7403
+ if (status === 'failed') {
7404
+ throw new Error(`LTI link build failed: ${name}`);
7405
+ }
7406
+ if (Date.now() >= deadline) {
7407
+ throw new Error(`Timed out waiting for LTI link to be ready: ${name} (last: ${status})`);
7408
+ }
7409
+ await asPage$1(scope).waitForTimeout(5000);
7410
+ await refreshLinks(scope);
7411
+ }
7412
+ logger.info(`LTI link ready: ${name}`);
7413
+ }
7414
+ /**
7415
+ * Retry a failed link build via the row's Retry button (deletes the failed
7416
+ * entity and re-posts the original payload).
7417
+ */
7418
+ async function retryFailedLink(scope, name) {
7419
+ await getLinkRow(scope, name).getByTestId(LTI_TEST_IDS.links.retryButton).click();
7420
+ logger.info(`Retried LTI link: ${name}`);
7421
+ }
6928
7422
  // ═══════════════════════════════════════════════════════════════════════
6929
7423
  // Sub-tab 2 — Keys
6930
7424
  // ═══════════════════════════════════════════════════════════════════════
@@ -7848,5 +8342,5 @@ function createPlaywrightConfig(options) {
7848
8342
  });
7849
8343
  }
7850
8344
 
7851
- export { AuthFlowBuilder, CHAT_PRIVACY_LABELS, CustomReporter, EVALS_LABELS, GRADER_LABELS, LTI_LABELS, LTI_TEST_IDS, MailsacClient, PRIVACY_LABELS, SCREENSHARE_LABELS, SPEND_LIMITS_LABELS, SUPPORT_LABELS, TASKS_LABELS, VOICE_LABELS, addGraderCriterion, addManualScore, addMemory, addQaPairsManually, addSkillToAgent, addTextResource, addUserSpendLimit, addUserSpendLimitFromTenantBilling, agentLimitsRow, agentLimitsSection, archiveFirstMemory, archiveMemoryByContent, billingAutoRechargeSection, billingCreditsSection, billingPlanSection, buildReportUrl, canChatWithEmbedMentor, cancelDeleteEvaluation, cancelDeleteInstance, cancelDeleteSkill, cancelDisconnectInstance, cancelEnableChatPrivacyMidSession, cancelKeyDelete, cancelLlmJudge, cancelNewInstanceDialog, cancelStartEvaluation, checkAdminStatus, checkRunStatus, clearAgentLimitsFilter, clearDateRangeFilter, clearGradeResultOverride, clearInstanceSearch, clearUserFilter, clickBackHome, clickBillingAddCredits, clickBillingManageBilling, clickBillingManageUsage, clickBillingUpgrade, clickChatPrivacyToggle, clickDownloadAgain, clickManualDownloadLink, clickSetSpendLimitForFilteredAgent, closeAgentLimitsPopup, closeBenchmarkItemsDialog, closeCreditBalanceDropdown, closeEvaluationDetailDialog, closeKeyDetail, closeManageBenchmarksDialog, closeWithEsc, confirmEnableChatPrivacyMidSession, confirmKeyDelete, connectToInstance, copyEndpoint, createAgentSpendLimitViaFilter, createAuthSetup, createBenchmark, createEnvConfig, createInstance, createKey, createLink, createPlaywrightConfig, createSkill, createSupportTicketViaChatAndVerify, createTool, creditBalancePanel, creditBalancePlanBadge, creditBalanceTrigger, deleteAgentSpendLimit, deleteAgentSpendLimitFromTenantBilling, deleteEvaluation, deleteFirstMemory, deleteGraderCriterion, deleteInstance, deleteKey, deleteMemoryByContent, deleteQaItem, deleteResource, deleteSkill, deleteTask, deleteUserSpendLimit, deleteWorkspaceSpendLimit, disableSkill, disableSupport, disconnectInstance, editAgentPrompt, editGraderCriterion, editInstance, editLink, editSkill, editTextResource, editTool, editUserSpendLimit, enableSkill, enableSupport, expandReview, expandTrace, expectAgentLimitsRowContent, expectAllEndpointsVisible, expectBenchmarkListed, expectBillingAutoRechargeSection, expectBillingCreditsSection, expectBillingPlanSection, expectBillingTabForCurrentPlan, expectBillingTabForFreePlan, expectBillingTabForPremiumPlan, expectBillingTabForTrialPlan, expectCallConfigVisible, expectCallConfigVoiceTriggerShows, expectChatPrivacyConfirmDialogOpen, expectChatPrivacyLocked, expectChatPrivacySource, expectChatPrivacyState, expectChatPrivacyToggleVisible, expectCompletedTasks, expectCreditBalanceForCurrentPlan, expectCreditBalancePanelForFreePlan, expectCreditBalancePanelForPremiumPlan, expectCreditBalancePanelForTrialPlan, expectCreditBalanceVisibilityForTenant, expectDetailWaitingForTraces, expectEndpointUrl, expectEntitySelected, expectFailedTasks, expectGradeResultRow, expectGraderMisconfiguredWarning, expectGraderTotalPoints, expectKeyDeleteError, expectKeyInList, expectKeyNotInList, expectKeysEmpty, expectLastCriterionDeleteDisabled, expectLinkInList, expectLinkNotInList, expectLinkTargetUri, expectLinksEmpty, expectLogDetailsStatus, expectLogsForTask, expectLtiHeader, expectMentorVoiceTriggerShows, expectMessageInConversation, expectNoAccessibilityViolations, expectNoAccessibilityViolationsOnDialogs, expectNoBenchmarksNotice, expectNoLogsForSelectedTask, expectNoRepliesYet, expectNoTickets, expectOutputFilterEnabled, expectPrivacyFieldsHidden, expectPrivacyFieldsVisible, expectPrivateModeSelected, expectPrivateModeTabReady, expectQaItemListed, expectReviewInList, expectReviewStatus, expectRunInTable, expectRunNotInTable, expectRunStatus, expectRunsTableEmpty, expectScheduleStartTimeInPastError, expectScreenShareDisabledHint, expectSelectedBenchmark, expectSttSelectDisabled, expectTaskInList, expectTaskNotInList, expectTaskStatus, expectTasksEmpty, expectTenantChatPrivacyEnabled, expectTenantChatPrivacyVisible, expectTicketClosedNotice, expectTicketDescriptionContains, expectTicketInList, expectTicketStatusInList, expectToolInList, expectToolNotInList, expectToolsEmpty, expectTotalTasks, expectTraceScore, expectTtsSelectDisabled, expectVoiceProviderSelected, expectVoiceVisible, expectWorkspaceActualSpendStats, expectWorkspaceSpendStats, exportRunCsv, fillLinkName, fillToolForm, filterAgentLimits, filterByAction, filterByActionAndVerify, filterByActor, filterByActorAndVerify, filterByDateRange, filterGradeResultsByEmail, filterTicketsByStatus, filterTicketsByUser, generateBrowserSetupProjects, generateProjectConfig, getAddItemsDialog, getAuditLogRowCount, getAvailableActors, getBenchmarkCombobox, getBenchmarkComboboxDropdown, getBenchmarkItemsDialog, getBillingAutoRechargeStatus, getBillingPlanLabel, getBrowserKey, getCallConfigForm, getChatInput, getChatPrivacyConfirmDialog, getChatPrivacyToggle, getCreateBenchmarkDialog, getCreateKeyButton, getCreateLinkButton, getCreateToolButton, getCreditBalancePlanLabel, getCreditBalanceRemaining, getCurrentModel, getCurrentTenantShowPaywall, getDeleteEvaluationDialog, getDeleteQaItemDialog, getEditAgentDialog, getEndpoint, getEndpointCopyButton, getEndpointUrl, getEntityChip, getEvaluationDetailDialog, getInstanceHealthLabel, getInstanceRowCount, getInstanceStatusLabel, getKeyActionsTrigger, getKeyCreateModal, getKeyCreateNameInput, getKeyDeleteModal, getKeyDetailModal, getKeyDetailNameInput, getKeyPublicJwkField, getKeyPublicKeyField, getKeyRow, getKeysEmptyState, getKeysSection, getLinkCopyTargetUriButton, getLinkEditButton, getLinkModal, getLinkNameInput, getLinkRow, getLinksEmptyState, getLinksSection, getLlmJudgeDialog, getLlmPickerDialog, getLtiSubTab, getManageBenchmarksButton, getManageBenchmarksDialog, getMemoryCount, getMentorIdFromUrl, getNewEvaluationButton, getOutputFilterSwitch, getPaginationInfo, getPrivateModeCard, getReplyComposer, getReviewRow, getRunRow, getScheduleTaskButton, getSearchInput, getSkillRowCount, getStartEvaluationDialog, getStatusFilter, getSupportInfoBox, getSupportTabTrigger, getSupportToggle, getTaskRow, getTenantChatPrivacyRow, getTenantChatPrivacySwitch, getTicketDescription, getTicketDetail, getTicketList, getTicketRow, getTicketRowByIndex, getToolEditButton, getToolKeySelect, getToolModal, getToolRow, getToolsEmptyState, getToolsSection, getTraceRow, getUserFilter, getVoiceProviderCard, getVoiceRow, goToFirstPage, goToLastPage, goToNextPage, goToPage, goToPreviousPage, goToSkillsListPage, graderTabBody, inviteUserTest, isEvaluationTabVisible, isFirefox, isGraderTabVisible, isGradingEnabled, isJSON, isLtiTabVisible, isMemoryTabVisible, isOnFirstPage, isOnLastPage, isPrivacyTabVisible, isPrivateModeTabVisible, isSandboxTabVisible, isScreenShareTabVisible, isSkillEnabled, isSpendLimitsTabVisible, isSupportEnabled, isSupportTabVisible, isTasksTabVisible, isVoiceTabVisible, logger, loginWithEmailAndPassword, loginWithMicrosoftIdp, navigateToAccountComponent, navigateToAuditLog, navigateToAuditLogAndWaitForData, navigateToDataReports, navigateToReportDownload, openAddItemsDialog, openAddMemoryDialog, openAgentLimitsManage, openAgentPromptEditModal, openBenchmarkItems, openCallConfigVoicePicker, openCreateKeyModal, openCreateLinkModal, openCreateToolModal, openCreditBalanceDropdown, openEditInstanceDialog, openEditLinkModal, openEditSkillDialog, openEditToolModal, openFirstLogDetails, openInstanceActionsMenu, openKeyActionsMenu, openKeyDelete, openKeyDetail, openLLMProviderPicker, openManageBenchmarksDialog, openMentorVoicePicker, openNewInstanceDialog, openNewReviewForRun, openNewReviewFromDetail, openNewSkillDialog, openRunActionsMenu, openRunResults, openScheduleTaskDialog, openScreenSharePromptEditor, openSkillActionsMenu, openSlashSkillPicker, openStartEvaluationDialog, openTicket, overrideGradeResult, parseReportUrlParams, previewCallConfigVoiceInline, previewMentorVoiceInline, previewVoice, pushConfiguration, readEndpointUrl, readKeyPublicJwk, readKeyPublicKey, refreshEvaluationDetail, refreshTickets, reliableClick, reliableFill, removeSkillFromAgent, removeTraceScore, renameKey, replyToTicket, requestSupportTicketViaChat, resetCallConfig, retry, runConnectedInstanceChecks, runInstanceChecks, safeWaitForURL, saveCallConfig, saveGraderConfig, saveScreenSharePrompts, saveVoiceSettings, scheduleTask, searchBenchmarks, searchInstances, searchTasks, searchVoices, selectBenchmark, selectCallMode, selectDateFromCalendar, selectJudgeLlm, selectLLMModel, selectLlmProvider, selectPrivacyAction, selectPrivateMode, selectSlashSkill, selectSttProvider, selectTaskInList, selectToolKeySetMode, selectToolSigningKey, selectTtsProvider, selectVoice, selectVoiceProvider, sendAgentChatMessage, setAgentLimitsRowEnabled, setAgentSpendLimit, setAgentSpendLimitFromTenantBilling, setBlockMessage, setCallLanguage, setCatalogSkillEnabled, setEnableVideo, setEntitySelected, setGradingEnabled, setOutputFilterEnabled, setScreenSharePrompt, setSupportEnabled, setTenantChatPrivacyEnabled, setTicketStatus, setUseFunctionCallingEnabled, setUserSpendLimitEnabled, setWorkspaceSpendLimit, setupSandboxInstance, shouldAddNewRowWhenClickingAddRowButton, shouldAllowEditingCellValuesInCSVEditor, shouldCancelCombiningReports, shouldCloseCSVEditorWhenClickingCloseButton, shouldCloseCSVEditorWithoutSavingWhenClickingCancel, shouldCombineRecommendationReports, shouldDirectlyDownloadChatHistoryReportWithoutCSVEditor, shouldDisableOtherDownloadButtonsWhileGeneratingReport, shouldDisplayCSVInEditableTableFormat, shouldDisplayReportCards, shouldHaveCombinedReportDataTestIds, shouldOpenCSVEditorDialog, shouldOpenCSVEditorForUserMetadataReport, shouldSaveEditedCSVAndTriggerDownload, shouldShowCombiningReportsDialog, shouldVerifyCSVEditorDialogAccessibility, signUpWithEmailAndPassword, spendLimitsTabBody, startEvaluation, submitLinkModal, submitLlmJudge, submitToolModal, switchToAddItemsSubTab, switchToAgentLimits, switchToAgentSkillsSubTab, switchToAvailableSkillsSubTab, switchToEvaluationTab, switchToGraderSubTab, switchToGraderTab, switchToLtiSubTab, switchToLtiTab, switchToMemoryTab, switchToPlanAndCredits, switchToPrivacyTab, switchToPrivateModeTab, switchToSandboxTab, switchToScreenShareTab, switchToSkillResourcesSubTab, switchToSkillsTab, switchToSpendLimitsSubTab, switchToSpendLimitsTab, switchToSupportTab, switchToTasksTab, switchToVoiceSubTab, switchToVoiceTab, switchToWorkspaceSpendLimits, teardownSandboxInstance, test, toggleAutoPush, toggleMemorySwitch, toggleSkill, toolFields, uploadAssetResource, uploadQaCsv, userSpendLimitRow, verifyAgentConfigPromptsVisible, verifyAgentSkillsEmptyState, verifyAuditLogEmptyState, verifyAuditLogEntryStructure, verifyAuditLogGenericError, verifyAuditLogLoading, verifyAuditLogPermissionError, verifyAuditLogTableVisible, verifyConnectDisabledForUnhealthy, verifyConnectedInstanceCard, verifyCurrentPage, verifyDonePhase, verifyDownloadingPhase, verifyErrorPhase, verifyInstanceTableEmpty, verifyInstanceTableVisible, verifyMemoryExists, verifyMemoryNotExists, verifyMemoryTabMemoriesList, verifyMemoryTabSettings, verifyPreparingPhase, verifySkillAdded, verifySkillVisible, verifySkillsEmptyState, verifySkillsTabVisible, waitForAgentChatResponse, waitForAuditLogDataLoaded, waitForBillingTabReady, waitForCreditBalanceLoaded, waitForDialogReady, waitForElementStable, waitForPageLoad, waitForPageReady, waitForReportDownload, waitForTicketInList, workspaceSpendLimitSection };
8345
+ export { AuthFlowBuilder, CHAT_PRIVACY_LABELS, CustomReporter, EVALS_LABELS, GRADER_LABELS, LTI_LABELS, LTI_TEST_IDS, MEMORY_ADMIN_LABELS, MailsacClient, PRIVACY_LABELS, SCREENSHARE_LABELS, SPEND_LIMITS_LABELS, SUPPORT_LABELS, TASKS_LABELS, VOICE_LABELS, addAgentMemoryFromPopup, addGraderCriterion, addManualScore, addMemory, addQaPairsManually, addSkillToAgent, addTextResource, addUserGlobalMemory, addUserSpendLimit, addUserSpendLimitFromTenantBilling, agentLimitsRow, agentLimitsSection, applyVoiceInstructionsPreset, archiveFirstMemory, archiveMemoryByContent, billingAutoRechargeSection, billingCreditsSection, billingPlanSection, buildReportUrl, canChatWithEmbedMentor, cancelDeleteEvaluation, cancelDeleteInstance, cancelDeleteSkill, cancelDisconnectInstance, cancelEnableChatPrivacyMidSession, cancelKeyDelete, cancelLlmJudge, cancelNewInstanceDialog, cancelStartEvaluation, checkAdminStatus, checkRunStatus, clearAgentLimitsFilter, clearAgentMemoriesFilter, clearDateRangeFilter, clearGradeResultOverride, clearInstanceSearch, clearUserFilter, clickBackHome, clickBillingAddCredits, clickBillingManageBilling, clickBillingManageUsage, clickBillingUpgrade, clickChatPrivacyToggle, clickDownloadAgain, clickManualDownloadLink, clickSetSpendLimitForFilteredAgent, closeAgentLimitsPopup, closeAgentMemoriesPopup, closeBenchmarkItemsDialog, closeCreditBalanceDropdown, closeEvaluationDetailDialog, closeKeyDetail, closeManageBenchmarksDialog, closeUserMemoriesPopup, closeWithEsc, confirmEnableChatPrivacyMidSession, confirmKeyDelete, connectToInstance, copyEndpoint, createAgentSpendLimitViaFilter, createAuthSetup, createBenchmark, createEnvConfig, createInstance, createKey, createLink, createPlaywrightConfig, createSkill, createSupportTicketViaChatAndVerify, createTool, creditBalancePanel, creditBalancePlanBadge, creditBalanceTrigger, deleteAgentSpendLimit, deleteAgentSpendLimitFromTenantBilling, deleteEvaluation, deleteFirstMemory, deleteGraderCriterion, deleteInstance, deleteKey, deleteMemoryByContent, deleteQaItem, deleteResource, deleteSkill, deleteTask, deleteUserGlobalMemory, deleteUserSpendLimit, deleteWorkspaceSpendLimit, disableSkill, disableSupport, disconnectInstance, editAgentPrompt, editGraderCriterion, editInstance, editLink, editSkill, editTextResource, editTool, editUserGlobalMemory, editUserSpendLimit, enableSkill, enableSupport, expandReview, expandTrace, expectAgentLimitsRowContent, expectAllEndpointsVisible, expectBenchmarkListed, expectBillingAutoRechargeSection, expectBillingCreditsSection, expectBillingPlanSection, expectBillingTabForCurrentPlan, expectBillingTabForFreePlan, expectBillingTabForPremiumPlan, expectBillingTabForTrialPlan, expectCallConfigVisible, expectCallConfigVoiceTriggerShows, expectChatPrivacyConfirmDialogOpen, expectChatPrivacyLocked, expectChatPrivacySource, expectChatPrivacyState, expectChatPrivacyToggleVisible, expectCompletedTasks, expectCreditBalanceForCurrentPlan, expectCreditBalancePanelForFreePlan, expectCreditBalancePanelForPremiumPlan, expectCreditBalancePanelForTrialPlan, expectCreditBalanceVisibilityForTenant, expectDetailWaitingForTraces, expectEndpointUrl, expectEntitySelected, expectFailedTasks, expectGradeResultRow, expectGraderMisconfiguredWarning, expectGraderTotalPoints, expectKeyDeleteError, expectKeyInList, expectKeyNotInList, expectKeysEmpty, expectLastCriterionDeleteDisabled, expectLinkInList, expectLinkNotInList, expectLinkStatus, expectLinkTargetUri, expectLinksEmpty, expectLogDetailsStatus, expectLogsForTask, expectLtiHeader, expectMentorVoiceTriggerShows, expectMessageInConversation, expectNoAccessibilityViolations, expectNoAccessibilityViolationsOnDialogs, expectNoBenchmarksNotice, expectNoLogsForSelectedTask, expectNoRepliesYet, expectNoTickets, expectOutputFilterEnabled, expectPrivacyFieldsHidden, expectPrivacyFieldsVisible, expectPrivateModeSelected, expectPrivateModeTabReady, expectQaItemListed, expectReviewInList, expectReviewStatus, expectRunInTable, expectRunNotInTable, expectRunStatus, expectRunsTableEmpty, expectScheduleStartTimeInPastError, expectScreenShareDisabledHint, expectSelectedBenchmark, expectSttSelectDisabled, expectTaskInList, expectTaskNotInList, expectTaskStatus, expectTasksEmpty, expectTenantChatPrivacyEnabled, expectTenantChatPrivacyVisible, expectTicketClosedNotice, expectTicketDescriptionContains, expectTicketInList, expectTicketStatusInList, expectToolInList, expectToolNotInList, expectToolsEmpty, expectTotalTasks, expectTraceScore, expectTtsSelectDisabled, expectVoiceInstructionsValue, expectVoiceProviderSelected, expectVoiceVisible, expectWorkspaceActualSpendStats, expectWorkspaceSpendStats, exportRunCsv, fillLinkName, fillToolForm, filterAgentLimits, filterAgentMemories, filterByAction, filterByActionAndVerify, filterByActor, filterByActorAndVerify, filterByDateRange, filterGradeResultsByEmail, filterTicketsByStatus, filterTicketsByUser, generateBrowserSetupProjects, generateProjectConfig, getAddItemsDialog, getAuditLogRowCount, getAvailableActors, getBenchmarkCombobox, getBenchmarkComboboxDropdown, getBenchmarkItemsDialog, getBillingAutoRechargeStatus, getBillingPlanLabel, getBrowserKey, getCallConfigForm, getChatInput, getChatPrivacyConfirmDialog, getChatPrivacyToggle, getCreateBenchmarkDialog, getCreateKeyButton, getCreateLinkButton, getCreateToolButton, getCreditBalancePlanLabel, getCreditBalanceRemaining, getCurrentModel, getCurrentTenantShowPaywall, getDeleteEvaluationDialog, getDeleteQaItemDialog, getEditAgentDialog, getEndpoint, getEndpointCopyButton, getEndpointUrl, getEntityChip, getEvaluationDetailDialog, getInstanceHealthLabel, getInstanceRowCount, getInstanceStatusLabel, getKeyActionsTrigger, getKeyCreateModal, getKeyCreateNameInput, getKeyDeleteModal, getKeyDetailModal, getKeyDetailNameInput, getKeyPublicJwkField, getKeyPublicKeyField, getKeyRow, getKeysEmptyState, getKeysSection, getLinkCopyTargetUriButton, getLinkEditButton, getLinkModal, getLinkNameInput, getLinkRow, getLinksEmptyState, getLinksRefreshButton, getLinksSection, getLlmJudgeDialog, getLlmPickerDialog, getLtiSubTab, getManageBenchmarksButton, getManageBenchmarksDialog, getMemoryCount, getMentorIdFromUrl, getNewEvaluationButton, getOutputFilterSwitch, getPaginationInfo, getPrivateModeCard, getReplyComposer, getReviewRow, getRunRow, getScheduleTaskButton, getSearchInput, getSkillRowCount, getStartEvaluationDialog, getStatusFilter, getSupportInfoBox, getSupportTabTrigger, getSupportToggle, getTaskRow, getTenantChatPrivacyRow, getTenantChatPrivacySwitch, getTicketDescription, getTicketDetail, getTicketList, getTicketRow, getTicketRowByIndex, getToolEditButton, getToolKeySelect, getToolModal, getToolRow, getToolsEmptyState, getToolsSection, getTraceRow, getUserFilter, getVoiceProviderCard, getVoiceRow, goToFirstPage, goToLastPage, goToNextPage, goToPage, goToPreviousPage, goToSkillsListPage, graderTabBody, inviteUserTest, isEvaluationTabVisible, isFirefox, isGraderTabVisible, isGradingEnabled, isJSON, isLtiTabVisible, isMemoryTabVisible, isOnFirstPage, isOnLastPage, isPrivacyTabVisible, isPrivateModeTabVisible, isSandboxTabVisible, isScreenShareTabVisible, isSkillEnabled, isSpendLimitsTabVisible, isSupportEnabled, isSupportTabVisible, isTasksTabVisible, isTenantMemoryTabVisible, isVoiceTabVisible, logger, loginWithEmailAndPassword, loginWithMicrosoftIdp, memoryAdminAgentRow, memoryAdminAgentSection, memoryAdminGlobalSection, memoryAdminUserRow, memoryRowByContent, navigateToAccountComponent, navigateToAuditLog, navigateToAuditLogAndWaitForData, navigateToDataReports, navigateToReportDownload, openAddItemsDialog, openAddMemoryDialog, openAgentLimitsManage, openAgentMemoriesPopup, openAgentPromptEditModal, openBenchmarkItems, openCallConfigVoicePicker, openCreateKeyModal, openCreateLinkModal, openCreateToolModal, openCreditBalanceDropdown, openEditInstanceDialog, openEditLinkModal, openEditSkillDialog, openEditToolModal, openFirstLogDetails, openInstanceActionsMenu, openKeyActionsMenu, openKeyDelete, openKeyDetail, openLLMProviderPicker, openManageBenchmarksDialog, openMentorVoicePicker, openNewInstanceDialog, openNewReviewForRun, openNewReviewFromDetail, openNewSkillDialog, openRunActionsMenu, openRunResults, openScheduleTaskDialog, openScreenSharePromptEditor, openSkillActionsMenu, openSlashSkillPicker, openStartEvaluationDialog, openTicket, openUserMemoriesPopup, openVoiceInstructionsEditor, overrideGradeResult, parseReportUrlParams, previewCallConfigVoiceInline, previewMentorVoiceInline, previewVoice, pushConfiguration, readEndpointUrl, readKeyPublicJwk, readKeyPublicKey, refreshEvaluationDetail, refreshLinks, refreshTickets, reliableClick, reliableFill, removeSkillFromAgent, removeTraceScore, renameKey, replyToTicket, requestSupportTicketViaChat, resetCallConfig, retry, retryFailedLink, runConnectedInstanceChecks, runInstanceChecks, safeWaitForURL, saveCallConfig, saveGraderConfig, saveScreenSharePrompts, saveVoiceSettings, scheduleTask, searchBenchmarks, searchInstances, searchMemoryAdminUsers, searchTasks, searchVoices, selectBenchmark, selectCallMode, selectDateFromCalendar, selectJudgeLlm, selectLLMModel, selectLlmProvider, selectPrivacyAction, selectPrivateMode, selectSlashSkill, selectSttProvider, selectTaskInList, selectToolKeySetMode, selectToolSigningKey, selectTtsProvider, selectVoice, selectVoiceProvider, sendAgentChatMessage, setAgentLimitsRowEnabled, setAgentSpendLimit, setAgentSpendLimitFromTenantBilling, setBlockMessage, setCallLanguage, setCatalogSkillEnabled, setEnableVideo, setEntitySelected, setGradingEnabled, setOutputFilterEnabled, setScreenSharePrompt, setSupportEnabled, setTenantChatPrivacyEnabled, setTicketStatus, setUseFunctionCallingEnabled, setUserSpendLimitEnabled, setVoiceInstructions, setWorkspaceSpendLimit, setupSandboxInstance, shouldAddNewRowWhenClickingAddRowButton, shouldAllowEditingCellValuesInCSVEditor, shouldCancelCombiningReports, shouldCloseCSVEditorWhenClickingCloseButton, shouldCloseCSVEditorWithoutSavingWhenClickingCancel, shouldCombineRecommendationReports, shouldDirectlyDownloadChatHistoryReportWithoutCSVEditor, shouldDisableOtherDownloadButtonsWhileGeneratingReport, shouldDisplayCSVInEditableTableFormat, shouldDisplayReportCards, shouldHaveCombinedReportDataTestIds, shouldOpenCSVEditorDialog, shouldOpenCSVEditorForUserMetadataReport, shouldSaveEditedCSVAndTriggerDownload, shouldShowCombiningReportsDialog, shouldVerifyCSVEditorDialogAccessibility, signUpWithEmailAndPassword, spendLimitsTabBody, startEvaluation, submitLinkModal, submitLlmJudge, submitToolModal, switchToAddItemsSubTab, switchToAgentLimits, switchToAgentSkillsSubTab, switchToAvailableSkillsSubTab, switchToEvaluationTab, switchToGraderSubTab, switchToGraderTab, switchToLtiSubTab, switchToLtiTab, switchToMemoryAdminSubTab, switchToMemoryTab, switchToPlanAndCredits, switchToPrivacyTab, switchToPrivateModeTab, switchToSandboxTab, switchToScreenShareTab, switchToSkillResourcesSubTab, switchToSkillsTab, switchToSpendLimitsSubTab, switchToSpendLimitsTab, switchToSupportTab, switchToTasksTab, switchToTenantMemoryTab, switchToVoiceSubTab, switchToVoiceTab, switchToWorkspaceSpendLimits, teardownSandboxInstance, test, toggleAutoPush, toggleMemorySwitch, toggleSkill, toggleUserMemoryAdminSetting, toolFields, uploadAssetResource, uploadQaCsv, userSpendLimitRow, verifyAgentConfigPromptsVisible, verifyAgentSkillsEmptyState, verifyAuditLogEmptyState, verifyAuditLogEntryStructure, verifyAuditLogGenericError, verifyAuditLogLoading, verifyAuditLogPermissionError, verifyAuditLogTableVisible, verifyConnectDisabledForUnhealthy, verifyConnectedInstanceCard, verifyCurrentPage, verifyDonePhase, verifyDownloadingPhase, verifyErrorPhase, verifyInstanceTableEmpty, verifyInstanceTableVisible, verifyMemoryExists, verifyMemoryNotExists, verifyMemoryTabMemoriesList, verifyMemoryTabSettings, verifyPreparingPhase, verifySkillAdded, verifySkillVisible, verifySkillsEmptyState, verifySkillsTabVisible, waitForAgentChatResponse, waitForAuditLogDataLoaded, waitForBillingTabReady, waitForCreditBalanceLoaded, waitForDialogReady, waitForElementStable, waitForLinkReady, waitForPageLoad, waitForPageReady, waitForReportDownload, waitForTicketInList, workspaceSpendLimitSection };
7852
8346
  //# sourceMappingURL=index.esm.js.map