Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
31ecd59
updated based on feature flag
mdshamoon Apr 7, 2026
a6f2b0b
fixed test
mdshamoon Apr 8, 2026
40ea75d
fixed test
mdshamoon Apr 8, 2026
2fee22d
fixed test
mdshamoon Apr 8, 2026
a203bde
Merge branch 'master' into issue/4948
mdshamoon Apr 8, 2026
6fbcfb7
added assistants
mdshamoon Apr 8, 2026
0f90527
Merge remote-tracking branch 'origin/issue/4948' into issue/4948
mdshamoon Apr 8, 2026
07efd4e
added better tests
mdshamoon Apr 8, 2026
401f549
fix: assistant list UX improvements
mdshamoon Apr 8, 2026
0fe7e62
added better tests
mdshamoon Apr 8, 2026
21a082d
added better tests
mdshamoon Apr 8, 2026
133966f
Merge remote-tracking branch 'origin/issue/4948' into issue/4963
mdshamoon Apr 8, 2026
99eb43f
Merge branch 'master' into issue/4963
mdshamoon Apr 8, 2026
e2bb6f4
fixe dtrst
mdshamoon Apr 9, 2026
bbca7c0
Merge remote-tracking branch 'origin/issue/4963' into issue/4963
mdshamoon Apr 9, 2026
15f6984
ficed filer
mdshamoon Apr 9, 2026
1bbb122
Merge branch 'master' into issue/4963
mdshamoon Apr 9, 2026
b1a692b
feat: split AssistantOptions into KnowledgeBaseOptions for new assist…
mdshamoon Apr 10, 2026
3e32740
fix: add missing i18n strings for KnowledgeBaseOptions
mdshamoon Apr 10, 2026
2911005
Merge remote-tracking branch 'origin/master' into issue/4963
mdshamoon Apr 10, 2026
46ca002
fix: restore AssistantOptions to legacy design for old assistant UI
mdshamoon Apr 10, 2026
baa096d
added fixes in Knowledge base
mdshamoon Apr 10, 2026
c461526
merged to master
mdshamoon Apr 10, 2026
f32dd06
Merge branch 'master' into issue/4963
priyanshu6238 Apr 10, 2026
b19216d
fix test cases
mdshamoon Apr 13, 2026
2050034
Merge remote-tracking branch 'origin/issue/4963' into issue/4963
mdshamoon Apr 13, 2026
0800067
added test for knwoledge base
mdshamoon Apr 13, 2026
3f09c73
Merge branch 'master' into issue/4963
priyanshu6238 Apr 13, 2026
4c2ba8f
fix: test case
priyanshu6238 Apr 13, 2026
d624aa0
fix: test case
priyanshu6238 Apr 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 35 additions & 9 deletions src/containers/Assistants/AssistantDetail/AssistantDetail.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ const notificationSpy = vi.spyOn(Notification, 'setNotification');
const renderAssistantDetail = (mocks: any = ASSISTANT_DETAIL_MOCKS, assistantId = '1') =>
render(
<MockedProvider mocks={mocks}>
<MemoryRouter initialEntries={[`/assistant-new/${assistantId}`]}>
<MemoryRouter initialEntries={[`/assistants/${assistantId}`]}>
<Routes>
<Route path="/assistant-new/:assistantId" element={<AssistantDetail />} />
<Route path="/assistants-new" element={<div data-testid="assistants-page" />} />
<Route path="/assistants/:assistantId" element={<AssistantDetail />} />
<Route path="/assistants" element={<div data-testid="assistants-page" />} />
</Routes>
</MemoryRouter>
</MockedProvider>
Expand All @@ -32,10 +32,10 @@ const renderAssistantDetail = (mocks: any = ASSISTANT_DETAIL_MOCKS, assistantId
const renderCreateMode = (mocks: any = []) =>
render(
<MockedProvider mocks={mocks}>
<MemoryRouter initialEntries={['/assistant-new/add']}>
<MemoryRouter initialEntries={['/assistants/add']}>
<Routes>
<Route path="/assistant-new/:assistantId" element={<AssistantDetail />} />
<Route path="/assistants-new" element={<div data-testid="assistants-page" />} />
<Route path="/assistants/:assistantId" element={<AssistantDetail />} />
<Route path="/assistants" element={<div data-testid="assistants-page" />} />
</Routes>
</MemoryRouter>
</MockedProvider>
Expand Down Expand Up @@ -165,7 +165,7 @@ test('create mode shows Cancel and Save buttons', async () => {
});
});

test('cancel button in create mode navigates to /assistants-new', async () => {
test('cancel button in create mode navigates to /assistants', async () => {
renderCreateMode();

await waitFor(() => {
Expand Down Expand Up @@ -283,6 +283,32 @@ test('Leave button in unsaved changes modal closes the modal', async () => {
});
});

test('Leave button switches to the pending version', async () => {
renderAssistantDetail();

await waitFor(() => {
expect(screen.getByText('Assistant-405db438 / Version 1')).toBeInTheDocument();
});

// Modify form to trigger unsaved changes
const textareas = screen.getAllByRole('textbox');
fireEvent.change(textareas[0], { target: { value: 'Changed' } });

// Click version 2 card — should open modal
fireEvent.click(screen.getAllByTestId('versionCard')[0]);

await waitFor(() => {
expect(screen.getByTestId('version-switch-leave')).toBeInTheDocument();
});

fireEvent.click(screen.getByTestId('version-switch-leave'));

await waitFor(() => {
expect(screen.queryByTestId('version-switch-leave')).not.toBeInTheDocument();
expect(screen.getByText('Assistant-405db438 / Version 2')).toBeInTheDocument();
});
});

test('save button in edit mode triggers notification on success', async () => {
renderAssistantDetail(ASSISTANT_DETAIL_SAVE_MOCKS);

Expand Down Expand Up @@ -319,9 +345,9 @@ test('create mode save navigates to the new assistant page', async () => {
render(
<MockedProvider
mocks={[createAssistantSuccessMock, getAssistant('99')]}>
<MemoryRouter initialEntries={['/assistant-new/add']}>
<MemoryRouter initialEntries={['/assistants/add']}>
<Routes>
<Route path="/assistant-new/:assistantId" element={<AssistantDetail />} />
<Route path="/assistants/:assistantId" element={<AssistantDetail />} />
</Routes>
</MemoryRouter>
</MockedProvider>
Expand Down
8 changes: 4 additions & 4 deletions src/containers/Assistants/AssistantDetail/AssistantDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export const AssistantDetail = () => {

useEffect(() => {
if (!assistantId) {
navigate('/assistants-new');
navigate('/assistants');
}
}, [assistantId]);

Expand All @@ -62,7 +62,7 @@ export const AssistantDetail = () => {

const handleSaved = (newId?: string) => {
if (isCreateMode && newId) {
navigate(`/assistant-new/${newId}`);
navigate(`/assistants/${newId}`);
return;
}
setHasUnsavedChanges(false);
Expand Down Expand Up @@ -93,7 +93,7 @@ export const AssistantDetail = () => {
<div className={styles.Page} data-testid="assistantDetailContainer">
<Heading
formTitle={isCreateMode ? t('Create New Assistant') : (assistantData?.name ?? '')}
backLink="/assistants-new"
backLink="/assistants"
/>

{!isCreateMode && assistantData?.assistantId && (
Expand All @@ -118,7 +118,7 @@ export const AssistantDetail = () => {
vectorStore={null}
newVersionInProgress={false}
onSaved={handleSaved}
onCancel={() => navigate('/assistants-new')}
onCancel={() => navigate('/assistants')}
createMode
/>
</div>
Expand Down
19 changes: 17 additions & 2 deletions src/containers/Assistants/AssistantDetail/ConfigEditor.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { vi } from 'vitest';

import * as Notification from 'common/notification';
import {
ASSISTANT_DETAIL_SAVE_MOCKS,
CONFIG_EDITOR_SAVE_MOCKS,
createAssistantConfigMock,
createAssistantErrorMock,
mockVersions,
Expand Down Expand Up @@ -206,7 +206,7 @@ describe('ConfigEditor — edit mode', () => {
});

it('calls updateAssistant mutation and shows notification on save', async () => {
renderEdit({}, ASSISTANT_DETAIL_SAVE_MOCKS);
renderEdit({}, CONFIG_EDITOR_SAVE_MOCKS);

const textareas = screen.getAllByRole('textbox');
const instructionsField = textareas.find((el) => el.getAttribute('name') === 'instructions');
Expand Down Expand Up @@ -248,6 +248,21 @@ describe('ConfigEditor — edit mode', () => {
});
});

describe('ConfigEditor — settings parsing', () => {
beforeEach(() => vi.clearAllMocks());

it('populates temperature correctly when settings is a JSON string', () => {
renderEdit({
version: {
...mockVersion,
settings: JSON.stringify({ temperature: 0.7 }),
},
});

expect(screen.getByRole('sliderDisplay')).toHaveValue(0.7);
});
});

describe('ConfigEditor — expand instructions modal', () => {
beforeEach(() => vi.clearAllMocks());

Expand Down
11 changes: 4 additions & 7 deletions src/containers/Assistants/AssistantDetail/ConfigEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export const ConfigEditor = ({
enableReinitialize: false,
onSubmit: (values) => {
const payload: Record<string, any> = {
name: assistantName,
instructions: values.instructions,
model: values.model?.label,
temperature: values.temperature,
Expand Down Expand Up @@ -145,7 +146,8 @@ export const ConfigEditor = ({
useEffect(() => {
if (!version) return;
const modelValue = version.model ? { id: version.model, label: version.model } : modelOptions[0];
const settings = version.settings ?? {};
const rawSettings = version.settings ?? {};
const settings = typeof rawSettings === 'string' ? JSON.parse(rawSettings) : rawSettings;

formik.resetForm({
values: {
Expand Down Expand Up @@ -340,7 +342,7 @@ export const ConfigEditor = ({
data-testid="saveVersionButton"
onClick={formik.submitForm}
loading={savingChanges || creating}
disabled={newVersionInProgress || savingChanges || creating}
disabled={newVersionInProgress || savingChanges || creating || !hasUnsavedChanges}
>
{t('Save')}
</Button>
Expand Down Expand Up @@ -372,11 +374,6 @@ export const ConfigEditor = ({
<Field key={field.name} {...field} />
</div>
))}
{!createMode && (
<span className={styles.NoEvals} data-testid="noEvalsLink">
{t('No evals run. Start New Eval >')}
</span>
)}
</div>
</form>

Expand Down
16 changes: 16 additions & 0 deletions src/containers/Assistants/AssistantList/AssistantList.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,27 @@
color: #1f2937;
}

.DisplayIdRow {
display: flex;
align-items: center;
gap: 2px;
}

.DisplayId {
font-size: 0.75rem;
color: #6b7280;
}

.CopyButton {
padding: 2px !important;
color: #6b7280;

svg {
width: 12px;
height: 12px;
}
}

.VersionBadge {
color: #374151;
}
Expand Down
12 changes: 6 additions & 6 deletions src/containers/Assistants/AssistantList/AssistantList.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@
const renderAssistantList = (mocks: any[] = [filterAssistantsMock, countAssistantsMock]) =>
render(
<MockedProvider mocks={mocks}>
<MemoryRouter initialEntries={['/assistants-new']}>
<MemoryRouter initialEntries={['/assistants']}>
<Routes>
<Route path="/assistants-new" element={<AssistantList />} />
<Route path="/assistant-new/add" element={<div data-testid="create-page" />} />
<Route path="/assistant-new/:id" element={<div data-testid="edit-page" />} />
<Route path="/assistants" element={<AssistantList />} />
<Route path="/assistants/add" element={<div data-testid="create-page" />} />
<Route path="/assistants/:id" element={<div data-testid="edit-page" />} />
</Routes>
</MemoryRouter>
</MockedProvider>
Expand All @@ -37,7 +37,7 @@
test('renders assistant rows with name and live version', async () => {
renderAssistantList();

await waitFor(() => {

Check failure on line 40 in src/containers/Assistants/AssistantList/AssistantList.test.tsx

View workflow job for this annotation

GitHub Actions / CI

src/containers/Assistants/AssistantList/AssistantList.test.tsx > renders assistant rows with name and live version

TestingLibraryElementError: Unable to find an element with the text: Assistant-1. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. Ignored nodes: comments, script, style <body> <div /> </body> Ignored nodes: comments, script, style <html> <head> <meta content="" name="emotion-insertion-point" /> </head> <body> <div /> </body> </html>... ❯ waitForWrapper node_modules/@testing-library/dom/dist/wait-for.js:163:27 ❯ src/containers/Assistants/AssistantList/AssistantList.test.tsx:40:9
expect(screen.getByText('Assistant-1')).toBeInTheDocument();
expect(screen.getByText('Version 3')).toBeInTheDocument();
expect(screen.getByText('Assistant-2')).toBeInTheDocument();
Expand All @@ -48,29 +48,29 @@
test('renders assistant display ID below name', async () => {
renderAssistantList();

await waitFor(() => {

Check failure on line 51 in src/containers/Assistants/AssistantList/AssistantList.test.tsx

View workflow job for this annotation

GitHub Actions / CI

src/containers/Assistants/AssistantList/AssistantList.test.tsx > renders assistant display ID below name

TestingLibraryElementError: Unable to find an element with the text: asst_abc123. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. Ignored nodes: comments, script, style <body> <div /> </body> Ignored nodes: comments, script, style <html> <head> <meta content="" name="emotion-insertion-point" /> </head> <body> <div /> </body> </html>... ❯ waitForWrapper node_modules/@testing-library/dom/dist/wait-for.js:163:27 ❯ src/containers/Assistants/AssistantList/AssistantList.test.tsx:51:9
expect(screen.getByText('asst_abc123')).toBeInTheDocument();
});
});

test('Create New Assistant button navigates to /assistant-new/add', async () => {
test('Create New Assistant button navigates to /assistants/add', async () => {
renderAssistantList();

await waitFor(() => {
expect(screen.getByText('Create New Assistant')).toBeInTheDocument();
});

fireEvent.click(screen.getByText('Create New Assistant'));

Check failure on line 63 in src/containers/Assistants/AssistantList/AssistantList.test.tsx

View workflow job for this annotation

GitHub Actions / CI

src/containers/Assistants/AssistantList/AssistantList.test.tsx > Create New Assistant button navigates to /assistants/add

TestingLibraryElementError: Unable to find an element with the text: Create New Assistant. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible. Ignored nodes: comments, script, style <body> <div /> </body> ❯ Object.getElementError node_modules/@testing-library/dom/dist/config.js:37:19 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:76:38 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:52:17 ❯ node_modules/@testing-library/dom/dist/query-helpers.js:95:19 ❯ src/containers/Assistants/AssistantList/AssistantList.test.tsx:63:26

await waitFor(() => {
expect(screen.getByTestId('create-page')).toBeInTheDocument();
});
});

test('edit icon navigates to /assistant-new/:id', async () => {
test('edit icon navigates to /assistants/:id', async () => {
renderAssistantList();

await waitFor(() => {

Check failure on line 73 in src/containers/Assistants/AssistantList/AssistantList.test.tsx

View workflow job for this annotation

GitHub Actions / CI

src/containers/Assistants/AssistantList/AssistantList.test.tsx > edit icon navigates to /assistants/:id

TestingLibraryElementError: Unable to find an element by: [data-testid="edit-icon"] Ignored nodes: comments, script, style <body> <div /> </body> Ignored nodes: comments, script, style <html> <head> <meta content="" name="emotion-insertion-point" /> </head> <body> <div /> </body> </html>... ❯ waitForWrapper node_modules/@testing-library/dom/dist/wait-for.js:163:27 ❯ src/containers/Assistants/AssistantList/AssistantList.test.tsx:73:9
expect(screen.getAllByTestId('edit-icon')).toHaveLength(2);
});

Expand All @@ -84,7 +84,7 @@
test('clone icon opens confirmation dialog', async () => {
renderAssistantList();

await waitFor(() => {

Check failure on line 87 in src/containers/Assistants/AssistantList/AssistantList.test.tsx

View workflow job for this annotation

GitHub Actions / CI

src/containers/Assistants/AssistantList/AssistantList.test.tsx > clone icon opens confirmation dialog

TestingLibraryElementError: Unable to find an element by: [data-testid="copy-icon"] Ignored nodes: comments, script, style <body> <div /> </body> Ignored nodes: comments, script, style <html> <head> <meta content="" name="emotion-insertion-point" /> </head> <body> <div /> </body> </html>... ❯ waitForWrapper node_modules/@testing-library/dom/dist/wait-for.js:163:27 ❯ src/containers/Assistants/AssistantList/AssistantList.test.tsx:87:9
expect(screen.getAllByTestId('copy-icon')).toHaveLength(2);
});

Expand All @@ -100,7 +100,7 @@
test('clone dialog cancel closes without calling API', async () => {
renderAssistantList([filterAssistantsMock, countAssistantsMock]);

await waitFor(() => {

Check failure on line 103 in src/containers/Assistants/AssistantList/AssistantList.test.tsx

View workflow job for this annotation

GitHub Actions / CI

src/containers/Assistants/AssistantList/AssistantList.test.tsx > clone dialog cancel closes without calling API

TestingLibraryElementError: Unable to find an element by: [data-testid="copy-icon"] Ignored nodes: comments, script, style <body> <div /> </body> Ignored nodes: comments, script, style <html> <head> <meta content="" name="emotion-insertion-point" /> </head> <body> <div /> </body> </html>... ❯ waitForWrapper node_modules/@testing-library/dom/dist/wait-for.js:163:27 ❯ src/containers/Assistants/AssistantList/AssistantList.test.tsx:103:9
expect(screen.getAllByTestId('copy-icon')).toHaveLength(2);
});

Expand All @@ -120,7 +120,7 @@
test('clone non-legacy assistant passes versionId to API', async () => {
renderAssistantList([filterAssistantsMock, countAssistantsMock, cloneAssistantFromListMock]);

await waitFor(() => {

Check failure on line 123 in src/containers/Assistants/AssistantList/AssistantList.test.tsx

View workflow job for this annotation

GitHub Actions / CI

src/containers/Assistants/AssistantList/AssistantList.test.tsx > clone non-legacy assistant passes versionId to API

TestingLibraryElementError: Unable to find an element by: [data-testid="copy-icon"] Ignored nodes: comments, script, style <body> <div /> </body> Ignored nodes: comments, script, style <html> <head> <meta content="" name="emotion-insertion-point" /> </head> <body> <div /> </body> </html>... ❯ waitForWrapper node_modules/@testing-library/dom/dist/wait-for.js:163:27 ❯ src/containers/Assistants/AssistantList/AssistantList.test.tsx:123:9
expect(screen.getAllByTestId('copy-icon')).toHaveLength(2);
});

Expand All @@ -141,7 +141,7 @@
test('clone legacy assistant does not pass versionId to API', async () => {
renderAssistantList([filterAssistantsMock, countAssistantsMock, cloneLegacyAssistantFromListMock]);

await waitFor(() => {

Check failure on line 144 in src/containers/Assistants/AssistantList/AssistantList.test.tsx

View workflow job for this annotation

GitHub Actions / CI

src/containers/Assistants/AssistantList/AssistantList.test.tsx > clone legacy assistant does not pass versionId to API

TestingLibraryElementError: Unable to find an element by: [data-testid="copy-icon"] Ignored nodes: comments, script, style <body> <div /> </body> Ignored nodes: comments, script, style <html> <head> <meta content="" name="emotion-insertion-point" /> </head> <body> <div /> </body> </html>... ❯ waitForWrapper node_modules/@testing-library/dom/dist/wait-for.js:163:27 ❯ src/containers/Assistants/AssistantList/AssistantList.test.tsx:144:9
expect(screen.getAllByTestId('copy-icon')).toHaveLength(2);
});

Expand All @@ -162,7 +162,7 @@
test('clone API returns errors shows error message', async () => {
renderAssistantList([filterAssistantsMock, countAssistantsMock, cloneAssistantFromListErrorMock]);

await waitFor(() => {

Check failure on line 165 in src/containers/Assistants/AssistantList/AssistantList.test.tsx

View workflow job for this annotation

GitHub Actions / CI

src/containers/Assistants/AssistantList/AssistantList.test.tsx > clone API returns errors shows error message

TestingLibraryElementError: Unable to find an element by: [data-testid="copy-icon"] Ignored nodes: comments, script, style <body> <div /> </body> Ignored nodes: comments, script, style <html> <head> <meta content="" name="emotion-insertion-point" /> </head> <body> <div /> </body> </html>... ❯ waitForWrapper node_modules/@testing-library/dom/dist/wait-for.js:163:27 ❯ src/containers/Assistants/AssistantList/AssistantList.test.tsx:165:9
expect(screen.getAllByTestId('copy-icon')).toHaveLength(2);
});

Expand Down
31 changes: 26 additions & 5 deletions src/containers/Assistants/AssistantList/AssistantList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,13 @@ import { useMutation } from '@apollo/client';
import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';

import { IconButton, Tooltip } from '@mui/material';

import EditIcon from 'assets/images/icons/Edit.svg?react';
import CopyIcon from 'assets/images/icons/Settings/Copy.svg?react';

import { copyToClipboard } from 'common/utils';

import { FILTER_ASSISTANTS, GET_ASSISTANTS_COUNT } from 'graphql/queries/Assistant';
import { CLONE_ASSISTANT, DELETE_ASSISTANT } from 'graphql/mutations/Assistant';
import { List } from 'containers/List/List';
Expand All @@ -22,7 +26,22 @@ dayjs.extend(relativeTime);
const getAssistantName = (name: string, assistantDisplayId: string) => (
<div className={styles.NameCell}>
<span className={styles.Name}>{name}</span>
<span className={styles.DisplayId}>{assistantDisplayId}</span>
<span className={styles.DisplayIdRow}>
<Tooltip title="Copy assistant ID" placement="top">
<IconButton
size="small"
className={styles.CopyButton}
onClick={(e) => {
e.stopPropagation();
copyToClipboard(assistantDisplayId);
}}
data-testid="copyAssistantId"
>
<CopyIcon />
</IconButton>
</Tooltip>
<span className={styles.DisplayId}>{assistantDisplayId}</span>
</span>
</div>
);

Expand Down Expand Up @@ -60,7 +79,7 @@ export const AssistantList = () => {
const [cloneAssistant, { loading: cloning }] = useMutation(CLONE_ASSISTANT);

const handleEdit = (id: string) => {
navigate(`/assistant-new/${id}`);
navigate(`/assistants/${id}`);
};

const handleCloneClick = (_id: string, item: any) => {
Expand Down Expand Up @@ -104,7 +123,7 @@ export const AssistantList = () => {
const columnNames = [
{ name: 'name', label: t('Assistant Name') },
{ label: t('Live Version') },
{ label: t('Last Updated') },
{ name: 'updated_at', label: t('Last Updated'), sort: true, order: 'desc' },
{ label: t('Actions') },
];

Expand Down Expand Up @@ -140,14 +159,16 @@ export const AssistantList = () => {
dialogMessage={t("You won't be able to use this assistant.")}
{...queries}
{...columnAttributes}
searchParameter={['name']}
searchParameter={['name', 'assistantId']}
additionalAction={additionalAction}
button={{
show: true,
label: t('Create New Assistant'),
action: () => navigate('/assistant-new/add'),
action: () => navigate('/assistants/add'),
}}
editSupport={false}
deleteModifier={{ variables: (id: string) => ({ deleteAssistantId: id }) }}
sortConfig={{ sortBy: 'updated_at', sortOrder: 'desc' }}
/>

{cloneDialogOpen && selectedAssistant && (
Expand Down
Loading
Loading