From 893ff5a74068474efc4b157223c02ae05c5e8628 Mon Sep 17 00:00:00 2001 From: Marco Beretta <81851188+berry-13@users.noreply.github.com> Date: Sat, 14 Dec 2024 01:36:19 +0100 Subject: [PATCH 1/4] feat: Implement agent duplication functionality and update related components --- api/models/schema/roleSchema.js | 4 ++ api/server/controllers/agents/v1.js | 38 ++++++++++++++ api/server/routes/agents/v1.js | 10 ++++ client/src/components/Nav/NavToggle.tsx | 2 +- .../SidePanel/Agents/AdminSettings.tsx | 6 ++- .../SidePanel/Agents/AgentConfig.tsx | 24 +++++++-- .../SidePanel/Agents/AgentPanel.tsx | 10 ++-- .../SidePanel/Agents/AgentSelect.tsx | 4 +- .../SidePanel/Agents/DuplicateAgent.tsx | 50 +++++++++++++++++++ client/src/components/ui/Button.tsx | 2 +- client/src/data-provider/mutations.ts | 31 ++++++++++++ client/src/localization/languages/Eng.ts | 3 ++ packages/data-provider/src/data-service.ts | 8 +++ packages/data-provider/src/roles.ts | 3 ++ packages/data-provider/src/types/mutations.ts | 9 ++++ 15 files changed, 189 insertions(+), 15 deletions(-) create mode 100644 client/src/components/SidePanel/Agents/DuplicateAgent.tsx diff --git a/api/models/schema/roleSchema.js b/api/models/schema/roleSchema.js index 36e9d3f7b6e..f9435900f4f 100644 --- a/api/models/schema/roleSchema.js +++ b/api/models/schema/roleSchema.js @@ -41,6 +41,10 @@ const roleSchema = new mongoose.Schema({ type: Boolean, default: true, }, + [Permissions.DUPLICATE]: { + type: Boolean, + default: false, + }, }, [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: { diff --git a/api/server/controllers/agents/v1.js b/api/server/controllers/agents/v1.js index 5212e9795b6..c940a469515 100644 --- a/api/server/controllers/agents/v1.js +++ b/api/server/controllers/agents/v1.js @@ -173,6 +173,43 @@ const updateAgentHandler = async (req, res) => { } }; +/** + * Duplicates an Agent based on the provided ID. + * @route POST /Agents/:id/duplicate + * @param {object} req - Express Request + * @param {object} req.params - Request params + * @param {string} req.params.id - Agent identifier. + * @returns {Agent} 201 - success response - application/json + */ +const duplicateAgentHandler = async (req, res) => { + try { + const id = req.params.id; + const { id: userId } = req.user; + + const agent = await getAgent({ id }); + if (!agent) { + return res.status(404).json({ error: 'Agent not found' }); + } + + const { name, description, instructions, tools, provider, model } = agent; + const newAgent = await createAgent({ + id: `agent_${nanoid()}`, + author: userId, + name: `${name} (Copy)`, + description, + instructions, + tools, + provider, + model, + }); + + return res.status(201).json(newAgent); + } catch (error) { + logger.error('[/Agents/:id/duplicate] Error duplicating Agent', error); + res.status(500).json({ error: error.message }); + } +}; + /** * Deletes an Agent based on the provided ID. * @route DELETE /Agents/:id @@ -292,6 +329,7 @@ module.exports = { createAgent: createAgentHandler, getAgent: getAgentHandler, updateAgent: updateAgentHandler, + duplicateAgent: duplicateAgentHandler, deleteAgent: deleteAgentHandler, getListAgents: getListAgentsHandler, uploadAgentAvatar: uploadAgentAvatarHandler, diff --git a/api/server/routes/agents/v1.js b/api/server/routes/agents/v1.js index 2a275c12044..b268aeadf02 100644 --- a/api/server/routes/agents/v1.js +++ b/api/server/routes/agents/v1.js @@ -14,6 +14,8 @@ const checkAgentCreate = generateCheckAccess(PermissionTypes.AGENTS, [ Permissions.CREATE, ]); +const checkAgentDuplicate = generateCheckAccess(PermissionTypes.AGENTS, [Permissions.DUPLICATE]); + const checkGlobalAgentShare = generateCheckAccess( PermissionTypes.AGENTS, [Permissions.USE, Permissions.CREATE], @@ -62,6 +64,14 @@ router.get('/:id', checkAgentAccess, v1.getAgent); */ router.patch('/:id', checkGlobalAgentShare, v1.updateAgent); +/** + * Duplicates an agent. + * @route POST /agents/:id/duplicate + * @param {string} req.params.id - Agent identifier. + * @returns {Agent} 201 - Success response - application/json + */ +router.post('/:id/duplicate', checkAgentDuplicate, v1.duplicateAgent); + /** * Deletes an agent. * @route DELETE /agents/:id diff --git a/client/src/components/Nav/NavToggle.tsx b/client/src/components/Nav/NavToggle.tsx index 23b4f0285c2..c082c70f25d 100644 --- a/client/src/components/Nav/NavToggle.tsx +++ b/client/src/components/Nav/NavToggle.tsx @@ -1,4 +1,4 @@ -import { useLocalize, useLocalStorage } from '~/hooks'; +import { useLocalize } from '~/hooks'; import { TooltipAnchor } from '~/components/ui'; import { cn } from '~/utils'; diff --git a/client/src/components/SidePanel/Agents/AdminSettings.tsx b/client/src/components/SidePanel/Agents/AdminSettings.tsx index 5b0408c6161..a7c190e51ea 100644 --- a/client/src/components/SidePanel/Agents/AdminSettings.tsx +++ b/client/src/components/SidePanel/Agents/AdminSettings.tsx @@ -115,6 +115,10 @@ const AdminSettings = () => { agentPerm: Permissions.USE, label: localize('com_ui_agents_allow_use'), }, + { + agentPerm: Permissions.DUPLICATE, + label: localize('com_ui_agents_allow_duplicate'), + }, ]; const onSubmit = (data: FormValues) => { @@ -142,7 +146,7 @@ const AdminSettings = () => { + )} {!canEditAgent && ( diff --git a/client/src/components/SidePanel/Agents/AgentSelect.tsx b/client/src/components/SidePanel/Agents/AgentSelect.tsx index e8aabc2c6d9..df01c68f2d1 100644 --- a/client/src/components/SidePanel/Agents/AgentSelect.tsx +++ b/client/src/components/SidePanel/Agents/AgentSelect.tsx @@ -185,8 +185,8 @@ export default function AgentSelect({ hasAgentValue ? 'text-gray-500' : '', )} className={cn( - 'mt-1 rounded-md dark:border-gray-700 dark:bg-gray-850', - 'z-50 flex h-[40px] w-full flex-none items-center justify-center px-4 hover:cursor-pointer hover:border-green-500 focus:border-gray-400', + 'rounded-md dark:border-gray-700 dark:bg-gray-850', + 'max-w z-50 flex h-[40px] w-full flex-none items-center justify-center truncate px-4 hover:cursor-pointer hover:border-green-500 focus:border-gray-400', )} renderOption={() => ( diff --git a/client/src/components/SidePanel/Agents/DuplicateAgent.tsx b/client/src/components/SidePanel/Agents/DuplicateAgent.tsx new file mode 100644 index 00000000000..c978d123a74 --- /dev/null +++ b/client/src/components/SidePanel/Agents/DuplicateAgent.tsx @@ -0,0 +1,50 @@ +import { CopyIcon } from 'lucide-react'; +import { useDuplicateAgentMutation } from '~/data-provider'; +import { cn, removeFocusOutlines } from '~/utils'; +import { useToastContext } from '~/Providers'; +import { useLocalize } from '~/hooks'; + +export default function DuplicateButton({ agent_id }: { agent_id: string }) { + const localize = useLocalize(); + const { showToast } = useToastContext(); + + const duplicateAgent = useDuplicateAgentMutation({ + onSuccess: () => { + showToast({ + message: localize('com_ui_agent_duplicated'), + status: 'success', + }); + }, + onError: (error) => { + console.error(error); + showToast({ + message: localize('com_ui_agent_duplicate_error'), + status: 'error', + }); + }, + }); + + if (!agent_id) { + return null; + } + + const handleDuplicate = () => { + duplicateAgent.mutate({ agent_id }); + }; + + return ( + + ); +} diff --git a/client/src/components/ui/Button.tsx b/client/src/components/ui/Button.tsx index 9b6a6aaf5c0..e86c261ac8f 100644 --- a/client/src/components/ui/Button.tsx +++ b/client/src/components/ui/Button.tsx @@ -4,7 +4,7 @@ import { cva, type VariantProps } from 'class-variance-authority'; import { cn } from '~/utils'; const buttonVariants = cva( - 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', + 'inline-flex items-center justify-center whitespace-nowrap rounded-lg text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', { variants: { variant: { diff --git a/client/src/data-provider/mutations.ts b/client/src/data-provider/mutations.ts index eb4b5dd8c9a..63205bdbe57 100644 --- a/client/src/data-provider/mutations.ts +++ b/client/src/data-provider/mutations.ts @@ -1135,6 +1135,37 @@ export const useUpdateAgentMutation = ( ); }; +/** + * Hook for duplicating an agent + */ +export const useDuplicateAgentMutation = ( + options?: t.DuplicateAgentMutationOptions, +): UseMutationResult => { + const queryClient = useQueryClient(); + return useMutation((params: t.DuplicateAgentBody) => dataService.duplicateAgent(params), { + onMutate: (variables) => options?.onMutate?.(variables), + onError: (error, variables, context) => options?.onError?.(error, variables, context), + onSuccess: (newAgent, variables, context) => { + const listRes = queryClient.getQueryData([ + QueryKeys.agents, + defaultOrderQuery, + ]); + + if (!listRes) { + options?.onSuccess?.(newAgent, variables, context); + return; + } + + const currentAgents: t.Agent[] = [newAgent, ...listRes.data]; + + queryClient.setQueryData([QueryKeys.agents, defaultOrderQuery], { + ...listRes, + data: currentAgents, + }); + options?.onSuccess?.(newAgent, variables, context); + }, + }); +}; /** * Hook for deleting an agent */ diff --git a/client/src/localization/languages/Eng.ts b/client/src/localization/languages/Eng.ts index 4b6f1185094..758aee67abb 100644 --- a/client/src/localization/languages/Eng.ts +++ b/client/src/localization/languages/Eng.ts @@ -361,6 +361,7 @@ export default { com_ui_agents_allow_share_global: 'Allow sharing Agents to all users', com_ui_agents_allow_use: 'Allow using Agents', com_ui_agents_allow_create: 'Allow creating Agents', + com_ui_agents_allow_duplicate: 'Allow duplicating shared Agents', com_ui_prompt_already_shared_to_all: 'This prompt is already shared to all users', com_ui_description_placeholder: 'Optional: Enter a description to display for the prompt', com_ui_command_placeholder: 'Optional: Enter a command for the prompt or name will be used.', @@ -425,6 +426,8 @@ export default { com_ui_no_bookmarks: 'it seems like you have no bookmarks yet. Click on a chat and add a new one', com_ui_no_conversation_id: 'No conversation ID found', com_ui_add_multi_conversation: 'Add multi-conversation', + com_ui_duplicate: 'Duplicate', + com_ui_duplicate_agent_confirm: 'Are you sure you want to duplicate this agent?', com_auth_error_login: 'Unable to login with the information provided. Please check your credentials and try again.', com_auth_error_login_rl: diff --git a/packages/data-provider/src/data-service.ts b/packages/data-provider/src/data-service.ts index d0c6a80818f..ef6b8a5f3cd 100644 --- a/packages/data-provider/src/data-service.ts +++ b/packages/data-provider/src/data-service.ts @@ -428,6 +428,14 @@ export const updateAgent = ({ ); }; +export const duplicateAgent = ({ agent_id }: m.DuplicateAgentBody): Promise => { + return request.post( + endpoints.agents({ + path: `${agent_id}/duplicate`, + }), + ); +}; + export const deleteAgent = ({ agent_id }: m.DeleteAgentBody): Promise => { return request.delete( endpoints.agents({ diff --git a/packages/data-provider/src/roles.ts b/packages/data-provider/src/roles.ts index 1a0d53f3cec..a03fbab6d50 100644 --- a/packages/data-provider/src/roles.ts +++ b/packages/data-provider/src/roles.ts @@ -47,6 +47,7 @@ export enum Permissions { READ = 'READ', READ_AUTHOR = 'READ_AUTHOR', SHARE = 'SHARE', + DUPLICATE = 'DUPLICATE', } export const promptPermissionsSchema = z.object({ @@ -64,6 +65,7 @@ export const agentPermissionsSchema = z.object({ [Permissions.SHARED_GLOBAL]: z.boolean().default(false), [Permissions.USE]: z.boolean().default(true), [Permissions.CREATE]: z.boolean().default(true), + [Permissions.DUPLICATE]: z.boolean().default(false), // [Permissions.SHARE]: z.boolean().default(false), }); @@ -101,6 +103,7 @@ const defaultRolesSchema = z.object({ [Permissions.SHARED_GLOBAL]: z.boolean().default(true), [Permissions.USE]: z.boolean().default(true), [Permissions.CREATE]: z.boolean().default(true), + [Permissions.DUPLICATE]: z.boolean().default(true), // [Permissions.SHARE]: z.boolean().default(true), }), [PermissionTypes.MULTI_CONVO]: multiConvoPermissionsSchema.extend({ diff --git a/packages/data-provider/src/types/mutations.ts b/packages/data-provider/src/types/mutations.ts index f5d867d7252..08ad011a8df 100644 --- a/packages/data-provider/src/types/mutations.ts +++ b/packages/data-provider/src/types/mutations.ts @@ -126,6 +126,15 @@ export type UpdateAgentVariables = { export type UpdateAgentMutationOptions = MutationOptions; +export type DuplicateAgentBody = { + agent_id: string; +}; + +export type DuplicateAgentMutationOptions = MutationOptions< + void, + Pick +>; + export type DeleteAgentBody = { agent_id: string; }; From 984e2694db169aaf322cb098ba9d75b7c65224dc Mon Sep 17 00:00:00 2001 From: Marco Beretta <81851188+berry-13@users.noreply.github.com> Date: Sat, 14 Dec 2024 01:41:42 +0100 Subject: [PATCH 2/4] refactor: remove tooltip test from DeleteButton (agent) --- .../src/components/SidePanel/Agents/AgentConfig.tsx | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/client/src/components/SidePanel/Agents/AgentConfig.tsx b/client/src/components/SidePanel/Agents/AgentConfig.tsx index 6718301aa1b..bd2e2f9604b 100644 --- a/client/src/components/SidePanel/Agents/AgentConfig.tsx +++ b/client/src/components/SidePanel/Agents/AgentConfig.tsx @@ -413,15 +413,10 @@ export default function AgentConfig({ {user?.role === SystemRoles.ADMIN && } {/* Context Button */}
- - } + {(agent?.author === user?.id || user?.role === SystemRoles.ADMIN) && hasAccessToShareAgents && ( From 6e9c0b5dab9db3fb63c9aa832e0a639058de2871 Mon Sep 17 00:00:00 2001 From: Marco Beretta <81851188+berry-13@users.noreply.github.com> Date: Sun, 15 Dec 2024 01:37:52 +0100 Subject: [PATCH 3/4] feat: Enhance agent duplication functionality to include action handling --- api/server/controllers/agents/v1.js | 46 +++++++++++++++- .../SidePanel/Agents/AgentConfig.tsx | 2 +- .../SidePanel/Agents/AgentPanelSkeleton.tsx | 52 +++++++++++-------- client/src/data-provider/mutations.ts | 24 +++++---- packages/data-provider/src/data-service.ts | 4 +- packages/data-provider/src/types/mutations.ts | 2 +- 6 files changed, 92 insertions(+), 38 deletions(-) diff --git a/api/server/controllers/agents/v1.js b/api/server/controllers/agents/v1.js index c940a469515..efe3f7aecfc 100644 --- a/api/server/controllers/agents/v1.js +++ b/api/server/controllers/agents/v1.js @@ -1,6 +1,12 @@ const fs = require('fs').promises; const { nanoid } = require('nanoid'); -const { FileContext, Constants, Tools, SystemRoles } = require('librechat-data-provider'); +const { + FileContext, + Constants, + Tools, + SystemRoles, + actionDelimiter, +} = require('librechat-data-provider'); const { getAgent, createAgent, @@ -10,6 +16,7 @@ const { } = require('~/models/Agent'); const { uploadImageBuffer, filterFile } = require('~/server/services/Files/process'); const { getStrategyFunctions } = require('~/server/services/Files/strategies'); +const { updateAction, getActions } = require('~/models/Action'); const { getProjectByName } = require('~/models/Project'); const { updateAgentProjects } = require('~/models/Agent'); const { deleteFileByFilter } = require('~/models/File'); @@ -201,9 +208,44 @@ const duplicateAgentHandler = async (req, res) => { tools, provider, model, + actions: [], }); - return res.status(201).json(newAgent); + const originalActions = await getActions({ agent_id: id }, true); + let actionsData = []; + + if (originalActions && originalActions.length > 0) { + const newActions = []; + + for (const action of originalActions) { + const newActionId = nanoid(); + const [domain] = action.action_id.split(actionDelimiter); + + await updateAction( + { action_id: newActionId }, + { + metadata: action.metadata, + agent_id: newAgent.id, + user: userId, + }, + ); + + newActions.push(`${domain}${actionDelimiter}${newActionId}`); + actionsData.push({ + id: newActionId, + metadata: action.metadata, + domain, + }); + } + + await updateAgent({ id: newAgent.id }, { actions: newActions }); + } + + const finalAgent = await getAgent({ id: newAgent.id }); + return res.status(201).json({ + agent: finalAgent, + actions: actionsData, + }); } catch (error) { logger.error('[/Agents/:id/duplicate] Error duplicating Agent', error); res.status(500).json({ error: error.message }); diff --git a/client/src/components/SidePanel/Agents/AgentConfig.tsx b/client/src/components/SidePanel/Agents/AgentConfig.tsx index bd2e2f9604b..54fd0843689 100644 --- a/client/src/components/SidePanel/Agents/AgentConfig.tsx +++ b/client/src/components/SidePanel/Agents/AgentConfig.tsx @@ -18,12 +18,12 @@ import { useToastContext, useFileMapContext } from '~/Providers'; import { icons } from '~/components/Chat/Menus/Endpoints/Icons'; import Action from '~/components/SidePanel/Builder/Action'; import { ToolSelectDialog } from '~/components/Tools'; -import { Spinner, TooltipAnchor } from '~/components'; import DuplicateAgent from './DuplicateAgent'; import { processAgentOption } from '~/utils'; import AdminSettings from './AdminSettings'; import DeleteButton from './DeleteButton'; import AgentAvatar from './AgentAvatar'; +import { Spinner } from '~/components'; import FileSearch from './FileSearch'; import ShareAgent from './ShareAgent'; import AgentTool from './AgentTool'; diff --git a/client/src/components/SidePanel/Agents/AgentPanelSkeleton.tsx b/client/src/components/SidePanel/Agents/AgentPanelSkeleton.tsx index a5575c972f7..1e67e8d1c8a 100644 --- a/client/src/components/SidePanel/Agents/AgentPanelSkeleton.tsx +++ b/client/src/components/SidePanel/Agents/AgentPanelSkeleton.tsx @@ -6,8 +6,8 @@ export default function AgentPanelSkeleton() {
{/* Agent Select and Button */}
- - + +
@@ -17,52 +17,60 @@ export default function AgentPanelSkeleton() {
{/* Name */} - - - + + +
{/* Description */}
- - + +
{/* Instructions */}
- - + +
{/* Model and Provider */}
- - + +
{/* Capabilities */}
- - - + + + + +
{/* Tools & Actions */}
- - - + + +
- - + +
+ {/* Admin Settings */} +
+ +
+ {/* Bottom Buttons */}
- - - + + + +
diff --git a/client/src/data-provider/mutations.ts b/client/src/data-provider/mutations.ts index 63205bdbe57..798a4ab0042 100644 --- a/client/src/data-provider/mutations.ts +++ b/client/src/data-provider/mutations.ts @@ -1140,32 +1140,34 @@ export const useUpdateAgentMutation = ( */ export const useDuplicateAgentMutation = ( options?: t.DuplicateAgentMutationOptions, -): UseMutationResult => { +): UseMutationResult<{ agent: t.Agent; actions: t.Action[] }, Error, t.DuplicateAgentBody> => { const queryClient = useQueryClient(); return useMutation((params: t.DuplicateAgentBody) => dataService.duplicateAgent(params), { onMutate: (variables) => options?.onMutate?.(variables), onError: (error, variables, context) => options?.onError?.(error, variables, context), - onSuccess: (newAgent, variables, context) => { + onSuccess: ({ agent, actions }, variables, context) => { const listRes = queryClient.getQueryData([ QueryKeys.agents, defaultOrderQuery, ]); - if (!listRes) { - options?.onSuccess?.(newAgent, variables, context); - return; + if (listRes) { + const currentAgents = [agent, ...JSON.parse(JSON.stringify(listRes.data))]; + queryClient.setQueryData([QueryKeys.agents, defaultOrderQuery], { + ...listRes, + data: currentAgents, + }); } - const currentAgents: t.Agent[] = [newAgent, ...listRes.data]; - - queryClient.setQueryData([QueryKeys.agents, defaultOrderQuery], { - ...listRes, - data: currentAgents, + queryClient.setQueryData([QueryKeys.actions], (prev) => { + return prev ? [...prev, ...actions] : actions; }); - options?.onSuccess?.(newAgent, variables, context); + + return options?.onSuccess?.(agent, variables, context); }, }); }; + /** * Hook for deleting an agent */ diff --git a/packages/data-provider/src/data-service.ts b/packages/data-provider/src/data-service.ts index ef6b8a5f3cd..1abddac4d4b 100644 --- a/packages/data-provider/src/data-service.ts +++ b/packages/data-provider/src/data-service.ts @@ -428,7 +428,9 @@ export const updateAgent = ({ ); }; -export const duplicateAgent = ({ agent_id }: m.DuplicateAgentBody): Promise => { +export const duplicateAgent = ({ + agent_id, +}: m.DuplicateAgentBody): Promise<{ agent: a.Agent; actions: a.Action[] }> => { return request.post( endpoints.agents({ path: `${agent_id}/duplicate`, diff --git a/packages/data-provider/src/types/mutations.ts b/packages/data-provider/src/types/mutations.ts index 08ad011a8df..bbe5016b9de 100644 --- a/packages/data-provider/src/types/mutations.ts +++ b/packages/data-provider/src/types/mutations.ts @@ -131,7 +131,7 @@ export type DuplicateAgentBody = { }; export type DuplicateAgentMutationOptions = MutationOptions< - void, + Agent, Pick >; From d98537622ddb37aa9c068f9c94271599c01bf9ce Mon Sep 17 00:00:00 2001 From: Marco Beretta <81851188+berry-13@users.noreply.github.com> Date: Sun, 15 Dec 2024 23:19:17 +0100 Subject: [PATCH 4/4] feat: Update duplicate agent mutation to include actions and improve agent selection handling --- api/server/controllers/agents/v1.js | 5 +- .../SidePanel/Agents/AgentPanel.tsx | 5 +- client/src/data-provider/mutations.ts | 50 ++++++++++++------- client/src/localization/languages/Eng.ts | 2 + packages/data-provider/src/types/mutations.ts | 2 +- 5 files changed, 42 insertions(+), 22 deletions(-) diff --git a/api/server/controllers/agents/v1.js b/api/server/controllers/agents/v1.js index efe3f7aecfc..d6458731059 100644 --- a/api/server/controllers/agents/v1.js +++ b/api/server/controllers/agents/v1.js @@ -221,6 +221,8 @@ const duplicateAgentHandler = async (req, res) => { const newActionId = nanoid(); const [domain] = action.action_id.split(actionDelimiter); + const fullActionId = `${domain}${actionDelimiter}${newActionId}`; + await updateAction( { action_id: newActionId }, { @@ -230,9 +232,10 @@ const duplicateAgentHandler = async (req, res) => { }, ); - newActions.push(`${domain}${actionDelimiter}${newActionId}`); + newActions.push(fullActionId); actionsData.push({ id: newActionId, + action_id: fullActionId, metadata: action.metadata, domain, }); diff --git a/client/src/components/SidePanel/Agents/AgentPanel.tsx b/client/src/components/SidePanel/Agents/AgentPanel.tsx index 8bb02167632..70ae82eb42d 100644 --- a/client/src/components/SidePanel/Agents/AgentPanel.tsx +++ b/client/src/components/SidePanel/Agents/AgentPanel.tsx @@ -229,7 +229,10 @@ export default function AgentPanel({