refactored code to use hasstartblock from the tirgger utils

This commit is contained in:
priyanshu.solanki
2025-12-17 18:03:01 -07:00
parent cfbe4a4790
commit f2450d3c26
5 changed files with 67 additions and 133 deletions

View File

@@ -6,7 +6,7 @@ import { createLogger } from '@/lib/logs/console/logger'
import { getParsedBody, withMcpAuth } from '@/lib/mcp/middleware'
import { createMcpErrorResponse, createMcpSuccessResponse } from '@/lib/mcp/utils'
import { sanitizeToolName } from '@/lib/mcp/workflow-tool-schema'
import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils'
import { hasValidStartBlock } from '@/lib/workflows/triggers/trigger-utils'
const logger = createLogger('WorkflowMcpToolsAPI')
@@ -16,36 +16,6 @@ interface RouteParams {
id: string
}
/**
* Check if a workflow has a valid start block that can accept inputs
*/
async function hasValidStartBlock(workflowId: string): Promise<boolean> {
try {
const normalizedData = await loadWorkflowFromNormalizedTables(workflowId)
if (!normalizedData?.blocks) {
return false
}
// Look for a start block
const startBlock = Object.values(normalizedData.blocks).find((block: any) => {
const blockType = block?.type
return (
blockType === 'starter' ||
blockType === 'start' ||
blockType === 'start_trigger' ||
blockType === 'api' ||
blockType === 'api_trigger' ||
blockType === 'input_trigger'
)
})
return !!startBlock
} catch (error) {
logger.warn('Error checking for start block:', error)
return false
}
}
/**
* GET - List all tools for a workflow MCP server
*/

View File

@@ -5,6 +5,10 @@ import { generateRequestId } from '@/lib/core/utils/request'
import { createLogger } from '@/lib/logs/console/logger'
import { deployWorkflow, loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils'
import { validateWorkflowPermissions } from '@/lib/workflows/utils'
import {
hasValidStartBlock,
isValidStartBlockType,
} from '@/lib/workflows/triggers/trigger-utils'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
const logger = createLogger('WorkflowDeployAPI')
@@ -24,15 +28,7 @@ async function generateMcpToolSchema(workflowId: string): Promise<Record<string,
// Find the start block
const startBlock = Object.values(normalizedData.blocks).find((block: any) => {
const blockType = block?.type
return (
blockType === 'starter' ||
blockType === 'start' ||
blockType === 'start_trigger' ||
blockType === 'api' ||
blockType === 'api_trigger' ||
blockType === 'input_trigger'
)
return isValidStartBlockType(block?.type)
}) as any
if (!startBlock?.subBlocks?.inputFormat?.value) {
@@ -88,35 +84,6 @@ async function generateMcpToolSchema(workflowId: string): Promise<Record<string,
}
}
/**
* Check if a workflow has a valid start block
*/
async function hasValidStartBlock(workflowId: string): Promise<boolean> {
try {
const normalizedData = await loadWorkflowFromNormalizedTables(workflowId)
if (!normalizedData?.blocks) {
return false
}
const startBlock = Object.values(normalizedData.blocks).find((block: any) => {
const blockType = block?.type
return (
blockType === 'starter' ||
blockType === 'start' ||
blockType === 'start_trigger' ||
blockType === 'api' ||
blockType === 'api_trigger' ||
blockType === 'input_trigger'
)
})
return !!startBlock
} catch (error) {
logger.warn('Error checking for start block:', error)
return false
}
}
/**
* Update all MCP tools that reference this workflow with the latest parameter schema.
* If the workflow no longer has a start block, remove all MCP tools.

View File

@@ -4,6 +4,10 @@ import type { NextRequest } from 'next/server'
import { generateRequestId } from '@/lib/core/utils/request'
import { createLogger } from '@/lib/logs/console/logger'
import { validateWorkflowPermissions } from '@/lib/workflows/utils'
import {
hasValidStartBlockInState,
isValidStartBlockType,
} from '@/lib/workflows/triggers/trigger-utils'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
const logger = createLogger('WorkflowActivateDeploymentAPI')
@@ -22,15 +26,7 @@ function generateMcpToolSchemaFromState(state: any): Record<string, unknown> {
// Find the start block in the deployed state
const startBlock = Object.values(state.blocks).find((block: any) => {
const blockType = block?.type
return (
blockType === 'starter' ||
blockType === 'start' ||
blockType === 'start_trigger' ||
blockType === 'api' ||
blockType === 'api_trigger' ||
blockType === 'input_trigger'
)
return isValidStartBlockType(block?.type)
}) as any
if (!startBlock?.subBlocks?.inputFormat?.value) {
@@ -86,29 +82,6 @@ function generateMcpToolSchemaFromState(state: any): Record<string, unknown> {
}
}
/**
* Check if a version state has a valid start block
*/
function hasValidStartBlockInState(state: any): boolean {
if (!state?.blocks) {
return false
}
const startBlock = Object.values(state.blocks).find((block: any) => {
const blockType = block?.type
return (
blockType === 'starter' ||
blockType === 'start' ||
blockType === 'start_trigger' ||
blockType === 'api' ||
blockType === 'api_trigger' ||
blockType === 'input_trigger'
)
})
return !!startBlock
}
/**
* Sync MCP tools when activating a deployment version.
* If the version has no start block, remove all MCP tools.

View File

@@ -6,6 +6,10 @@ import { generateRequestId } from '@/lib/core/utils/request'
import { createLogger } from '@/lib/logs/console/logger'
import { saveWorkflowToNormalizedTables } from '@/lib/workflows/persistence/utils'
import { validateWorkflowPermissions } from '@/lib/workflows/utils'
import {
hasValidStartBlockInState,
isValidStartBlockType,
} from '@/lib/workflows/triggers/trigger-utils'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
const logger = createLogger('RevertToDeploymentVersionAPI')
@@ -24,15 +28,7 @@ function generateMcpToolSchemaFromState(state: any): Record<string, unknown> {
// Find the start block in the deployed state
const startBlock = Object.values(state.blocks).find((block: any) => {
const blockType = block?.type
return (
blockType === 'starter' ||
blockType === 'start' ||
blockType === 'start_trigger' ||
blockType === 'api' ||
blockType === 'api_trigger' ||
blockType === 'input_trigger'
)
return isValidStartBlockType(block?.type)
}) as any
if (!startBlock?.subBlocks?.inputFormat?.value) {
@@ -88,29 +84,6 @@ function generateMcpToolSchemaFromState(state: any): Record<string, unknown> {
}
}
/**
* Check if a version state has a valid start block
*/
function hasValidStartBlockInState(state: any): boolean {
if (!state?.blocks) {
return false
}
const startBlock = Object.values(state.blocks).find((block: any) => {
const blockType = block?.type
return (
blockType === 'starter' ||
blockType === 'start' ||
blockType === 'start_trigger' ||
blockType === 'api' ||
blockType === 'api_trigger' ||
blockType === 'input_trigger'
)
})
return !!startBlock
}
/**
* Sync MCP tools when reverting to a deployment version.
* If the version has no start block, remove all MCP tools.

View File

@@ -7,9 +7,60 @@ import {
import { getAllBlocks, getBlock } from '@/blocks'
import type { BlockConfig } from '@/blocks/types'
import { getTrigger } from '@/triggers'
import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils'
const logger = createLogger('TriggerUtils')
/**
* Valid start block types that can trigger a workflow
*/
export const VALID_START_BLOCK_TYPES = [
'starter',
'start',
'start_trigger',
'api',
'api_trigger',
'input_trigger',
] as const
export type ValidStartBlockType = (typeof VALID_START_BLOCK_TYPES)[number]
/**
* Check if a block type is a valid start block type
*/
export function isValidStartBlockType(blockType: string): blockType is ValidStartBlockType {
return VALID_START_BLOCK_TYPES.includes(blockType as ValidStartBlockType)
}
/**
* Check if a workflow state has a valid start block
*/
export function hasValidStartBlockInState(state: any): boolean {
if (!state?.blocks) {
return false
}
const startBlock = Object.values(state.blocks).find((block: any) => {
const blockType = block?.type
return isValidStartBlockType(blockType)
})
return !!startBlock
}
/**
* Check if a workflow has a valid start block by loading from database
*/
export async function hasValidStartBlock(workflowId: string): Promise<boolean> {
try {
const normalizedData = await loadWorkflowFromNormalizedTables(workflowId)
return hasValidStartBlockInState(normalizedData)
} catch (error) {
logger.warn('Error checking for start block:', error)
return false
}
}
/**
* Generates mock data based on the output type definition
*/