Add get current workflow version tool (#17177)

This is required so an agent can easily understand what version should
be updated from the workflow show page.
This commit is contained in:
Thomas Trompette
2026-01-15 17:59:11 +01:00
committed by GitHub
parent 8413c6f3dd
commit 0fa8098c50
2 changed files with 121 additions and 0 deletions
@@ -23,6 +23,7 @@ import { createCreateWorkflowVersionStepTool } from 'src/modules/workflow/workfl
import { createDeactivateWorkflowVersionTool } from 'src/modules/workflow/workflow-tools/tools/deactivate-workflow-version.tool';
import { createDeleteWorkflowVersionEdgeTool } from 'src/modules/workflow/workflow-tools/tools/delete-workflow-version-edge.tool';
import { createDeleteWorkflowVersionStepTool } from 'src/modules/workflow/workflow-tools/tools/delete-workflow-version-step.tool';
import { createGetWorkflowCurrentVersionTool } from 'src/modules/workflow/workflow-tools/tools/get-workflow-current-version.tool';
import { createUpdateWorkflowVersionPositionsTool } from 'src/modules/workflow/workflow-tools/tools/update-workflow-version-positions.tool';
import { createUpdateWorkflowVersionStepTool } from 'src/modules/workflow/workflow-tools/tools/update-workflow-version-step.tool';
import { type WorkflowToolDependencies } from 'src/modules/workflow/workflow-tools/types/workflow-tool-dependencies.type';
@@ -106,6 +107,10 @@ export class WorkflowToolWorkspaceService {
this.deps,
context,
);
const getWorkflowCurrentVersion = createGetWorkflowCurrentVersionTool(
this.deps,
context,
);
return {
[createCompleteWorkflow.name]: createCompleteWorkflow,
@@ -119,6 +124,7 @@ export class WorkflowToolWorkspaceService {
[activateWorkflowVersion.name]: activateWorkflowVersion,
[deactivateWorkflowVersion.name]: deactivateWorkflowVersion,
[computeStepOutputSchema.name]: computeStepOutputSchema,
[getWorkflowCurrentVersion.name]: getWorkflowCurrentVersion,
};
}
@@ -0,0 +1,115 @@
import { isDefined } from 'twenty-shared/utils';
import { z } from 'zod';
import { buildSystemAuthContext } from 'src/engine/twenty-orm/utils/build-system-auth-context.util';
import {
WorkflowVersionStatus,
type WorkflowVersionWorkspaceEntity,
} from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity';
import { type WorkflowWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow.workspace-entity';
import {
type WorkflowToolContext,
type WorkflowToolDependencies,
} from 'src/modules/workflow/workflow-tools/types/workflow-tool-dependencies.type';
const getWorkflowCurrentVersionSchema = z.object({
workflowId: z
.string()
.describe('The ID of the workflow to get the current version for'),
});
type GetWorkflowCurrentVersionInput = z.infer<
typeof getWorkflowCurrentVersionSchema
>;
export const createGetWorkflowCurrentVersionTool = (
deps: Pick<WorkflowToolDependencies, 'globalWorkspaceOrmManager'>,
context: WorkflowToolContext,
) => ({
name: 'get_workflow_current_version' as const,
description:
'Get the current version of a workflow. Returns the draft version if one exists, otherwise the last published version.',
inputSchema: getWorkflowCurrentVersionSchema,
execute: async (parameters: GetWorkflowCurrentVersionInput) => {
try {
const authContext = buildSystemAuthContext(context.workspaceId);
return await deps.globalWorkspaceOrmManager.executeInWorkspaceContext(
authContext,
async () => {
const workflowRepository =
await deps.globalWorkspaceOrmManager.getRepository<WorkflowWorkspaceEntity>(
context.workspaceId,
'workflow',
{ shouldBypassPermissionChecks: true },
);
const workflow = await workflowRepository.findOne({
where: { id: parameters.workflowId },
});
if (!isDefined(workflow)) {
return {
success: false,
error: `Workflow ${parameters.workflowId} not found`,
};
}
const workflowVersionRepository =
await deps.globalWorkspaceOrmManager.getRepository<WorkflowVersionWorkspaceEntity>(
context.workspaceId,
'workflowVersion',
{ shouldBypassPermissionChecks: true },
);
const versions = await workflowVersionRepository.find({
where: [
{
workflowId: parameters.workflowId,
status: WorkflowVersionStatus.DRAFT,
},
{
workflowId: parameters.workflowId,
status: WorkflowVersionStatus.ACTIVE,
},
],
});
const draftVersion = versions.find(
(version) => version.status === WorkflowVersionStatus.DRAFT,
);
const activeVersion = versions.find(
(version) => version.status === WorkflowVersionStatus.ACTIVE,
);
const currentVersion = draftVersion ?? activeVersion;
if (!isDefined(currentVersion)) {
return {
success: false,
error: `Workflow ${parameters.workflowId} has no draft or active version`,
};
}
return {
success: true,
workflowVersion: {
id: currentVersion.id,
name: currentVersion.name,
status: currentVersion.status,
trigger: currentVersion.trigger,
steps: currentVersion.steps,
workflowId: currentVersion.workflowId,
},
};
},
);
} catch (error) {
return {
success: false,
error: error.message,
message: `Failed to get workflow current version: ${error.message}`,
};
}
},
});