Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 36 additions & 5 deletions apps/sim/executor/utils/start-block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,13 @@ export function buildResolutionFromBlock(block: SerializedBlock): ExecutorStartR
return null
}

const path = classifyStartBlockType(type)
const category = block.metadata?.category
const triggerModeEnabled = block.config?.params?.triggerMode === true

const path = classifyStartBlockType(type, {
category,
triggerModeEnabled,
})
if (!path) {
return null
}
Expand Down Expand Up @@ -342,11 +348,11 @@ function buildManualTriggerOutput(
finalInput: unknown,
workflowInput: unknown
): NormalizedBlockOutput {
const finalObject = isPlainObject(finalInput) ? finalInput : undefined
const finalObject = isPlainObject(finalInput)
? (finalInput as Record<string, unknown>)
: undefined

const output: NormalizedBlockOutput = finalObject
? { ...(finalObject as Record<string, unknown>) }
: { input: finalInput }
const output: NormalizedBlockOutput = finalObject ? { ...finalObject } : { input: finalInput }

if (!Object.hasOwn(output, 'input')) {
output.input = getRawInputCandidate(workflowInput)
Expand All @@ -355,6 +361,28 @@ function buildManualTriggerOutput(
return mergeFilesIntoOutput(output, workflowInput)
}

function buildIntegrationTriggerOutput(
finalInput: unknown,
workflowInput: unknown
): NormalizedBlockOutput {
const base: NormalizedBlockOutput = isPlainObject(workflowInput)
? ({ ...(workflowInput as Record<string, unknown>) } as NormalizedBlockOutput)
: {}

if (isPlainObject(finalInput)) {
Object.assign(base, finalInput as Record<string, unknown>)
base.input = { ...(finalInput as Record<string, unknown>) }
} else if (!Object.hasOwn(base, 'input')) {
base.input = finalInput
}

if (!Object.hasOwn(base, 'input')) {
base.input = getRawInputCandidate(workflowInput)
}

return mergeFilesIntoOutput(base, workflowInput)
}

function extractSubBlocks(block: SerializedBlock): Record<string, unknown> | undefined {
const metadata = block.metadata
if (!metadata || typeof metadata !== 'object') {
Expand Down Expand Up @@ -398,6 +426,9 @@ export function buildStartBlockOutput(options: StartBlockOutputOptions): Normali
case StartBlockPath.SPLIT_MANUAL:
return buildManualTriggerOutput(finalInput, workflowInput)

case StartBlockPath.EXTERNAL_TRIGGER:
return buildIntegrationTriggerOutput(finalInput, workflowInput)

case StartBlockPath.LEGACY_STARTER:
return buildLegacyStarterOutput(
finalInput,
Expand Down
21 changes: 19 additions & 2 deletions apps/sim/lib/workflows/triggers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export enum StartBlockPath {
SPLIT_API = 'legacy_api_trigger',
SPLIT_CHAT = 'legacy_chat_trigger',
SPLIT_MANUAL = 'legacy_manual_trigger',
EXTERNAL_TRIGGER = 'external_trigger',
}

type StartExecutionKind = 'chat' | 'manual' | 'api'
Expand Down Expand Up @@ -66,7 +67,15 @@ export interface StartBlockCandidate<T extends BlockWithType> {
path: StartBlockPath
}

export function classifyStartBlockType(type: string): StartBlockPath | null {
type ClassifyStartOptions = {
category?: string
triggerModeEnabled?: boolean
}

export function classifyStartBlockType(
type: string,
opts?: ClassifyStartOptions
): StartBlockPath | null {
switch (type) {
case TRIGGER_TYPES.START:
return StartBlockPath.UNIFIED
Expand All @@ -80,13 +89,21 @@ export function classifyStartBlockType(type: string): StartBlockPath | null {
return StartBlockPath.SPLIT_CHAT
case TRIGGER_TYPES.MANUAL:
return StartBlockPath.SPLIT_MANUAL
case TRIGGER_TYPES.WEBHOOK:
case TRIGGER_TYPES.SCHEDULE:
return StartBlockPath.EXTERNAL_TRIGGER
default:
if (opts?.category === 'triggers' || opts?.triggerModeEnabled) {
return StartBlockPath.EXTERNAL_TRIGGER
}
return null
}
}

export function classifyStartBlock<T extends BlockWithType>(block: T): StartBlockPath | null {
return classifyStartBlockType(block.type)
const category = (block as any)?.category as string | undefined
const triggerModeEnabled = Boolean((block as any)?.triggers?.enabled)
return classifyStartBlockType(block.type, { category, triggerModeEnabled })
}

export function isLegacyStartPath(path: StartBlockPath): boolean {
Expand Down