From 42fed5713e3ffae8020f2a2374d5147bf5367067 Mon Sep 17 00:00:00 2001 From: anatolii burtsev Date: Fri, 5 Sep 2025 06:01:30 -0700 Subject: [PATCH] feat: execution filter by agentflow name (#5117) * feat: Add agentflow name filter to executions page - Add agentflow name text field to executions filter UI - Implement backend filtering with case-insensitive partial matching - Add database index on chat_flow.name for improved query performance - Support filtering executions by agentflow name across all database types * chore: Fix linting issues and remove screenshot - Apply prettier formatting to migration files - Fix formatting in executions service - Remove accidentally committed screenshot file --- .../src/controllers/executions/index.ts | 1 + .../1755748356008-AddChatFlowNameIndex.ts | 13 +++++++++++++ .../src/database/migrations/mariadb/index.ts | 4 +++- .../1755748356008-AddChatFlowNameIndex.ts | 13 +++++++++++++ .../src/database/migrations/mysql/index.ts | 4 +++- .../1755748356008-AddChatFlowNameIndex.ts | 13 +++++++++++++ .../src/database/migrations/postgres/index.ts | 4 +++- .../1755748356008-AddChatFlowNameIndex.ts | 13 +++++++++++++ .../src/database/migrations/sqlite/index.ts | 4 +++- .../server/src/services/executions/index.ts | 5 ++++- .../ui/src/views/agentexecutions/index.jsx | 19 ++++++++++++++++++- 11 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 packages/server/src/database/migrations/mariadb/1755748356008-AddChatFlowNameIndex.ts create mode 100644 packages/server/src/database/migrations/mysql/1755748356008-AddChatFlowNameIndex.ts create mode 100644 packages/server/src/database/migrations/postgres/1755748356008-AddChatFlowNameIndex.ts create mode 100644 packages/server/src/database/migrations/sqlite/1755748356008-AddChatFlowNameIndex.ts diff --git a/packages/server/src/controllers/executions/index.ts b/packages/server/src/controllers/executions/index.ts index 7e3d80ae..074b0efa 100644 --- a/packages/server/src/controllers/executions/index.ts +++ b/packages/server/src/controllers/executions/index.ts @@ -47,6 +47,7 @@ const getAllExecutions = async (req: Request, res: Response, next: NextFunction) // Flow and session filters if (req.query.agentflowId) filters.agentflowId = req.query.agentflowId as string + if (req.query.agentflowName) filters.agentflowName = req.query.agentflowName as string if (req.query.sessionId) filters.sessionId = req.query.sessionId as string // State filter diff --git a/packages/server/src/database/migrations/mariadb/1755748356008-AddChatFlowNameIndex.ts b/packages/server/src/database/migrations/mariadb/1755748356008-AddChatFlowNameIndex.ts new file mode 100644 index 00000000..62c74f16 --- /dev/null +++ b/packages/server/src/database/migrations/mariadb/1755748356008-AddChatFlowNameIndex.ts @@ -0,0 +1,13 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddChatFlowNameIndex1755748356008 implements MigrationInterface { + name = 'AddChatFlowNameIndex1755748356008' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE INDEX \`IDX_chatflow_name\` ON \`chat_flow\` (\`name\`)`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX \`IDX_chatflow_name\` ON \`chat_flow\``) + } +} diff --git a/packages/server/src/database/migrations/mariadb/index.ts b/packages/server/src/database/migrations/mariadb/index.ts index 059fc865..55cfb420 100644 --- a/packages/server/src/database/migrations/mariadb/index.ts +++ b/packages/server/src/database/migrations/mariadb/index.ts @@ -37,6 +37,7 @@ import { FixOpenSourceAssistantTable1743758056188 } from './1743758056188-FixOpe import { AddErrorToEvaluationRun1744964560174 } from './1744964560174-AddErrorToEvaluationRun' import { ModifyExecutionDataColumnType1747902489801 } from './1747902489801-ModifyExecutionDataColumnType' import { ModifyChatflowType1755066758601 } from './1755066758601-ModifyChatflowType' +import { AddChatFlowNameIndex1755748356008 } from './1755748356008-AddChatFlowNameIndex' import { AddAuthTables1720230151482 } from '../../../enterprise/database/migrations/mariadb/1720230151482-AddAuthTables' import { AddWorkspace1725437498242 } from '../../../enterprise/database/migrations/mariadb/1725437498242-AddWorkspace' @@ -100,5 +101,6 @@ export const mariadbMigrations = [ AddErrorToEvaluationRun1744964560174, ExecutionLinkWorkspaceId1746862866554, ModifyExecutionDataColumnType1747902489801, - ModifyChatflowType1755066758601 + ModifyChatflowType1755066758601, + AddChatFlowNameIndex1755748356008 ] diff --git a/packages/server/src/database/migrations/mysql/1755748356008-AddChatFlowNameIndex.ts b/packages/server/src/database/migrations/mysql/1755748356008-AddChatFlowNameIndex.ts new file mode 100644 index 00000000..62c74f16 --- /dev/null +++ b/packages/server/src/database/migrations/mysql/1755748356008-AddChatFlowNameIndex.ts @@ -0,0 +1,13 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddChatFlowNameIndex1755748356008 implements MigrationInterface { + name = 'AddChatFlowNameIndex1755748356008' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE INDEX \`IDX_chatflow_name\` ON \`chat_flow\` (\`name\`)`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX \`IDX_chatflow_name\` ON \`chat_flow\``) + } +} diff --git a/packages/server/src/database/migrations/mysql/index.ts b/packages/server/src/database/migrations/mysql/index.ts index 4dd9070c..8fb9804b 100644 --- a/packages/server/src/database/migrations/mysql/index.ts +++ b/packages/server/src/database/migrations/mysql/index.ts @@ -38,6 +38,7 @@ import { AddErrorToEvaluationRun1744964560174 } from './1744964560174-AddErrorTo import { FixErrorsColumnInEvaluationRun1746437114935 } from './1746437114935-FixErrorsColumnInEvaluationRun' import { ModifyExecutionDataColumnType1747902489801 } from './1747902489801-ModifyExecutionDataColumnType' import { ModifyChatflowType1755066758601 } from './1755066758601-ModifyChatflowType' +import { AddChatFlowNameIndex1755748356008 } from './1755748356008-AddChatFlowNameIndex' import { AddAuthTables1720230151482 } from '../../../enterprise/database/migrations/mysql/1720230151482-AddAuthTables' import { AddWorkspace1720230151484 } from '../../../enterprise/database/migrations/mysql/1720230151484-AddWorkspace' @@ -102,5 +103,6 @@ export const mysqlMigrations = [ FixErrorsColumnInEvaluationRun1746437114935, ExecutionLinkWorkspaceId1746862866554, ModifyExecutionDataColumnType1747902489801, - ModifyChatflowType1755066758601 + ModifyChatflowType1755066758601, + AddChatFlowNameIndex1755748356008 ] diff --git a/packages/server/src/database/migrations/postgres/1755748356008-AddChatFlowNameIndex.ts b/packages/server/src/database/migrations/postgres/1755748356008-AddChatFlowNameIndex.ts new file mode 100644 index 00000000..75ebae63 --- /dev/null +++ b/packages/server/src/database/migrations/postgres/1755748356008-AddChatFlowNameIndex.ts @@ -0,0 +1,13 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddChatFlowNameIndex1755748356008 implements MigrationInterface { + name = 'AddChatFlowNameIndex1755748356008' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE INDEX "IDX_chatflow_name" ON "chat_flow" ("name")`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "IDX_chatflow_name"`) + } +} diff --git a/packages/server/src/database/migrations/postgres/index.ts b/packages/server/src/database/migrations/postgres/index.ts index 89f7eee7..f254427d 100644 --- a/packages/server/src/database/migrations/postgres/index.ts +++ b/packages/server/src/database/migrations/postgres/index.ts @@ -37,6 +37,7 @@ import { FixOpenSourceAssistantTable1743758056188 } from './1743758056188-FixOpe import { AddErrorToEvaluationRun1744964560174 } from './1744964560174-AddErrorToEvaluationRun' import { ModifyExecutionSessionIdFieldType1748450230238 } from './1748450230238-ModifyExecutionSessionIdFieldType' import { ModifyChatflowType1755066758601 } from './1755066758601-ModifyChatflowType' +import { AddChatFlowNameIndex1755748356008 } from './1755748356008-AddChatFlowNameIndex' import { AddAuthTables1720230151482 } from '../../../enterprise/database/migrations/postgres/1720230151482-AddAuthTables' import { AddWorkspace1720230151484 } from '../../../enterprise/database/migrations/postgres/1720230151484-AddWorkspace' @@ -100,5 +101,6 @@ export const postgresMigrations = [ AddErrorToEvaluationRun1744964560174, ExecutionLinkWorkspaceId1746862866554, ModifyExecutionSessionIdFieldType1748450230238, - ModifyChatflowType1755066758601 + ModifyChatflowType1755066758601, + AddChatFlowNameIndex1755748356008 ] diff --git a/packages/server/src/database/migrations/sqlite/1755748356008-AddChatFlowNameIndex.ts b/packages/server/src/database/migrations/sqlite/1755748356008-AddChatFlowNameIndex.ts new file mode 100644 index 00000000..75ebae63 --- /dev/null +++ b/packages/server/src/database/migrations/sqlite/1755748356008-AddChatFlowNameIndex.ts @@ -0,0 +1,13 @@ +import { MigrationInterface, QueryRunner } from 'typeorm' + +export class AddChatFlowNameIndex1755748356008 implements MigrationInterface { + name = 'AddChatFlowNameIndex1755748356008' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE INDEX "IDX_chatflow_name" ON "chat_flow" ("name")`) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX "IDX_chatflow_name"`) + } +} diff --git a/packages/server/src/database/migrations/sqlite/index.ts b/packages/server/src/database/migrations/sqlite/index.ts index b62d888f..b611f7a3 100644 --- a/packages/server/src/database/migrations/sqlite/index.ts +++ b/packages/server/src/database/migrations/sqlite/index.ts @@ -35,6 +35,7 @@ import { AddExecutionEntity1738090872625 } from './1738090872625-AddExecutionEnt import { FixOpenSourceAssistantTable1743758056188 } from './1743758056188-FixOpenSourceAssistantTable' import { AddErrorToEvaluationRun1744964560174 } from './1744964560174-AddErrorToEvaluationRun' import { ModifyChatflowType1755066758601 } from './1755066758601-ModifyChatflowType' +import { AddChatFlowNameIndex1755748356008 } from './1755748356008-AddChatFlowNameIndex' import { AddAuthTables1720230151482 } from '../../../enterprise/database/migrations/sqlite/1720230151482-AddAuthTables' import { AddWorkspace1720230151484 } from '../../../enterprise/database/migrations/sqlite/1720230151484-AddWorkspace' @@ -96,5 +97,6 @@ export const sqliteMigrations = [ FixOpenSourceAssistantTable1743758056188, AddErrorToEvaluationRun1744964560174, ExecutionLinkWorkspaceId1746862866554, - ModifyChatflowType1755066758601 + ModifyChatflowType1755066758601, + AddChatFlowNameIndex1755748356008 ] diff --git a/packages/server/src/services/executions/index.ts b/packages/server/src/services/executions/index.ts index f54ee322..062337aa 100644 --- a/packages/server/src/services/executions/index.ts +++ b/packages/server/src/services/executions/index.ts @@ -11,6 +11,7 @@ import { getRunningExpressApp } from '../../utils/getRunningExpressApp' export interface ExecutionFilters { id?: string agentflowId?: string + agentflowName?: string sessionId?: string state?: ExecutionState startDate?: Date @@ -65,7 +66,7 @@ const getPublicExecutionById = async (executionId: string): Promise => { try { const appServer = getRunningExpressApp() - const { id, agentflowId, sessionId, state, startDate, endDate, page = 1, limit = 12, workspaceId } = filters + const { id, agentflowId, agentflowName, sessionId, state, startDate, endDate, page = 1, limit = 12, workspaceId } = filters // Handle UUID fields properly using raw parameters to avoid type conversion issues // This uses the query builder instead of direct objects for compatibility with UUID fields @@ -78,6 +79,8 @@ const getAllExecutions = async (filters: ExecutionFilters = {}): Promise<{ data: if (id) queryBuilder.andWhere('execution.id = :id', { id }) if (agentflowId) queryBuilder.andWhere('execution.agentflowId = :agentflowId', { agentflowId }) + if (agentflowName) + queryBuilder.andWhere('LOWER(agentflow.name) LIKE LOWER(:agentflowName)', { agentflowName: `%${agentflowName}%` }) if (sessionId) queryBuilder.andWhere('execution.sessionId = :sessionId', { sessionId }) if (state) queryBuilder.andWhere('execution.state = :state', { state }) if (workspaceId) queryBuilder.andWhere('execution.workspaceId = :workspaceId', { workspaceId }) diff --git a/packages/ui/src/views/agentexecutions/index.jsx b/packages/ui/src/views/agentexecutions/index.jsx index ccc18b36..0f3663cd 100644 --- a/packages/ui/src/views/agentexecutions/index.jsx +++ b/packages/ui/src/views/agentexecutions/index.jsx @@ -68,6 +68,7 @@ const AgentExecutions = () => { startDate: null, endDate: null, agentflowId: '', + agentflowName: '', sessionId: '' }) @@ -132,6 +133,7 @@ const AgentExecutions = () => { } if (filters.agentflowId) params.agentflowId = filters.agentflowId + if (filters.agentflowName) params.agentflowName = filters.agentflowName if (filters.sessionId) params.sessionId = filters.sessionId getAllExecutions.request(params) @@ -143,6 +145,7 @@ const AgentExecutions = () => { startDate: null, endDate: null, agentflowId: '', + agentflowName: '', sessionId: '' }) setCurrentPage(1) @@ -312,6 +315,20 @@ const AgentExecutions = () => { } /> + + handleFilterChange('agentflowName', e.target.value)} + size='small' + sx={{ + '& .MuiOutlinedInput-notchedOutline': { + borderColor: borderColor + } + }} + /> + { }} /> - +