From 824d13dd041f24ffaf194015eabec16335d178e4 Mon Sep 17 00:00:00 2001 From: Ilango Rajagopal Date: Tue, 19 May 2026 20:13:20 +0530 Subject: [PATCH 1/3] add: new executions:update permissions and apply it to PUT /api/v1/executions endpoint --- packages/server/src/enterprise/rbac/Permissions.ts | 1 + packages/server/src/routes/executions/index.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/server/src/enterprise/rbac/Permissions.ts b/packages/server/src/enterprise/rbac/Permissions.ts index 1fb9e6fccbf..9ba33a88e2e 100644 --- a/packages/server/src/enterprise/rbac/Permissions.ts +++ b/packages/server/src/enterprise/rbac/Permissions.ts @@ -88,6 +88,7 @@ export class Permissions { const executionsCategory = new PermissionCategory('executions') executionsCategory.addPermission(new Permission('executions:view', 'View', true, true, true)) + executionsCategory.addPermission(new Permission('executions:update', 'Update', true, true, true)) executionsCategory.addPermission(new Permission('executions:delete', 'Delete', true, true, true)) this.categories.push(executionsCategory) diff --git a/packages/server/src/routes/executions/index.ts b/packages/server/src/routes/executions/index.ts index 6106613a19c..1b9458f625c 100644 --- a/packages/server/src/routes/executions/index.ts +++ b/packages/server/src/routes/executions/index.ts @@ -8,7 +8,7 @@ router.get('/', checkAnyPermission('executions:view'), executionController.getAl router.get(['/', '/:id'], checkAnyPermission('executions:view'), executionController.getExecutionById) // PUT -router.put(['/', '/:id'], executionController.updateExecution) +router.put(['/', '/:id'], checkAnyPermission('executions:update'), executionController.updateExecution) // DELETE - single execution or multiple executions router.delete('/:id', checkAnyPermission('executions:delete'), executionController.deleteExecutions) From 1e3a71cfd687cf25ec83a56b7c26ab64fc66aaad Mon Sep 17 00:00:00 2001 From: Ilango Rajagopal Date: Tue, 19 May 2026 20:19:19 +0530 Subject: [PATCH 2/3] add: executions:update permissions check in UI --- .../agentexecutions/ExecutionDetails.jsx | 67 ++++++++++--------- .../agentexecutions/ShareExecutionDialog.jsx | 9 ++- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/packages/ui/src/views/agentexecutions/ExecutionDetails.jsx b/packages/ui/src/views/agentexecutions/ExecutionDetails.jsx index c89a1130f01..720dfd763bc 100644 --- a/packages/ui/src/views/agentexecutions/ExecutionDetails.jsx +++ b/packages/ui/src/views/agentexecutions/ExecutionDetails.jsx @@ -49,6 +49,9 @@ import executionsApi from '@/api/executions' // Hooks import useApi from '@/hooks/useApi' +// RBAC +import { Available } from '@/ui-component/rbac/available' + const getIconColor = (status) => { switch (status) { case 'FINISHED': @@ -768,39 +771,43 @@ export const ExecutionDetails = ({ open, isPublic, execution, metadata, onClose, )} {!isPublic && !localMetadata.isPublic && ( - - ) : ( - - ) - } - variant='outlined' - label={updateExecutionApi.loading ? 'Updating...' : 'Share'} - className={'button'} - onClick={() => onSharePublicly()} - disabled={updateExecutionApi.loading} - /> + + + ) : ( + + ) + } + variant='outlined' + label={updateExecutionApi.loading ? 'Updating...' : 'Share'} + className={'button'} + onClick={() => onSharePublicly()} + disabled={updateExecutionApi.loading} + /> + )} {!isPublic && localMetadata.isPublic && ( - - ) : ( - - ) - } - variant='outlined' - label={updateExecutionApi.loading ? 'Updating...' : 'Public'} - className={'button'} - onClick={() => setShowShareDialog(true)} - disabled={updateExecutionApi.loading} - /> + + + ) : ( + + ) + } + variant='outlined' + label={updateExecutionApi.loading ? 'Updating...' : 'Public'} + className={'button'} + onClick={() => setShowShareDialog(true)} + disabled={updateExecutionApi.loading} + /> + )} diff --git a/packages/ui/src/views/agentexecutions/ShareExecutionDialog.jsx b/packages/ui/src/views/agentexecutions/ShareExecutionDialog.jsx index b35635f7c28..6a3dbebf1cb 100644 --- a/packages/ui/src/views/agentexecutions/ShareExecutionDialog.jsx +++ b/packages/ui/src/views/agentexecutions/ShareExecutionDialog.jsx @@ -14,6 +14,7 @@ import { enqueueSnackbar as enqueueSnackbarAction, closeSnackbar as closeSnackba // API import executionsApi from '@/api/executions' import useApi from '@/hooks/useApi' +import { Available } from '@/ui-component/rbac/available' const ShareExecutionDialog = ({ show, executionId, onClose, onUnshare }) => { const portalElement = document.getElementById('portal') @@ -104,9 +105,11 @@ const ShareExecutionDialog = ({ show, executionId, onClose, onUnshare }) => { {/* Actions */} - + + + From a4d93416811039a9268cd01eae689a8bf731ef37 Mon Sep 17 00:00:00 2001 From: Ilango Rajagopal Date: Tue, 19 May 2026 20:30:49 +0530 Subject: [PATCH 3/3] fix: review feedback --- .../agentexecutions/ExecutionDetails.jsx | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/packages/ui/src/views/agentexecutions/ExecutionDetails.jsx b/packages/ui/src/views/agentexecutions/ExecutionDetails.jsx index 720dfd763bc..e89b4c81067 100644 --- a/packages/ui/src/views/agentexecutions/ExecutionDetails.jsx +++ b/packages/ui/src/views/agentexecutions/ExecutionDetails.jsx @@ -791,23 +791,21 @@ export const ExecutionDetails = ({ open, isPublic, execution, metadata, onClose, )} {!isPublic && localMetadata.isPublic && ( - - - ) : ( - - ) - } - variant='outlined' - label={updateExecutionApi.loading ? 'Updating...' : 'Public'} - className={'button'} - onClick={() => setShowShareDialog(true)} - disabled={updateExecutionApi.loading} - /> - + + ) : ( + + ) + } + variant='outlined' + label={updateExecutionApi.loading ? 'Updating...' : 'Public'} + className={'button'} + onClick={() => setShowShareDialog(true)} + disabled={updateExecutionApi.loading} + /> )}