improvement(execution): trigger manual execution using mock payloads (#1863)

* fix(err-message): manual run message

* make external triggers start workflow manually too

* improvement(execution): trigger manual execution using mock payloads

* remove redundant code and update generate mock value func

* cleanup code, add to docs

* fix multi trigger injection

* address greptile comments
This commit is contained in:
Vikhyath Mondreti
2025-11-08 20:34:53 -08:00
committed by GitHub
parent 142d3aadb8
commit 75ce8882c8
62 changed files with 457 additions and 3512 deletions

View File

@@ -39,3 +39,15 @@ Use the Start block for everything originating from the editor, deploy-to-API, o
> Deployments power every trigger. Update the workflow, redeploy, and all trigger entry points pick up the new snapshot. Learn more in [Execution → Deployment Snapshots](/execution).
## Manual Execution Priority
When you click **Run** in the editor, Sim automatically selects which trigger to execute based on the following priority order:
1. **Start Block** (highest priority)
2. **Schedule Triggers**
3. **External Triggers** (webhooks, integrations like Slack, Gmail, Airtable, etc.)
If your workflow has multiple triggers, the highest priority trigger will be executed. For example, if you have both a Start block and a Webhook trigger, clicking Run will execute the Start block.
**External triggers with mock payloads**: When external triggers (webhooks and integrations) are executed manually, Sim automatically generates mock payloads based on the trigger's expected data structure. This ensures downstream blocks can resolve variables correctly during testing.

View File

@@ -29,6 +29,7 @@ const ExecuteWorkflowSchema = z.object({
stream: z.boolean().optional(),
useDraftState: z.boolean().optional(),
input: z.any().optional(),
startBlockId: z.string().optional(),
})
export const runtime = 'nodejs'

View File

@@ -1,13 +1,11 @@
import { useEffect, useState } from 'react'
import { Info } from 'lucide-react'
import { Tooltip } from '@/components/emcn'
import { GmailIcon } from '@/components/icons'
import {
Badge,
Button,
Checkbox,
Label,
Notice,
Select,
SelectContent,
SelectItem,
@@ -16,7 +14,6 @@ import {
Skeleton,
} from '@/components/ui'
import { createLogger } from '@/lib/logs/console/logger'
import { JSONView } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components'
import { ConfigSection } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel-new/components/editor/components/sub-block/components/webhook/components'
const logger = createLogger('GmailConfig')
@@ -56,76 +53,6 @@ const formatLabelName = (label: GmailLabel): string => {
return formattedName
}
const getExampleEmailEvent = (includeRawEmail: boolean) => {
const baseExample = {
email: {
id: '18e0ffabd5b5a0f4',
threadId: '18e0ffabd5b5a0f4',
subject: 'Monthly Report - April 2025',
from: 'sender@example.com',
to: 'recipient@example.com',
cc: 'team@example.com',
date: '2025-05-10T10:15:23.000Z',
bodyText:
'Hello,\n\nPlease find attached the monthly report for April 2025.\n\nBest regards,\nSender',
bodyHtml:
'<div><p>Hello,</p><p>Please find attached the monthly report for April 2025.</p><p>Best regards,<br>Sender</p></div>',
labels: ['INBOX', 'IMPORTANT'],
hasAttachments: true,
attachments: [
{
filename: 'report-april-2025.pdf',
mimeType: 'application/pdf',
size: 2048576,
},
],
},
timestamp: '2025-05-10T10:15:30.123Z',
}
if (includeRawEmail) {
return {
...baseExample,
rawEmail: {
id: '18e0ffabd5b5a0f4',
threadId: '18e0ffabd5b5a0f4',
labelIds: ['INBOX', 'IMPORTANT'],
snippet: 'Hello, Please find attached the monthly report...',
historyId: '123456',
internalDate: '1715337323000',
payload: {
partId: '',
mimeType: 'multipart/mixed',
filename: '',
headers: [
{ name: 'From', value: 'sender@example.com' },
{ name: 'To', value: 'recipient@example.com' },
{ name: 'Subject', value: 'Monthly Report - April 2025' },
{ name: 'Date', value: 'Fri, 10 May 2025 10:15:23 +0000' },
{ name: 'Message-ID', value: '<abc123@example.com>' },
],
body: { size: 0 },
parts: [
{
partId: '0',
mimeType: 'text/plain',
filename: '',
headers: [{ name: 'Content-Type', value: 'text/plain; charset=UTF-8' }],
body: {
size: 85,
data: 'SGVsbG8sDQoNClBsZWFzZSBmaW5kIGF0dGFjaGVkIHRoZSBtb250aGx5IHJlcG9ydA==',
},
},
],
},
sizeEstimate: 4156,
},
}
}
return baseExample
}
interface GmailConfigProps {
selectedLabels: string[]
setSelectedLabels: (labels: string[]) => void
@@ -364,17 +291,6 @@ export function GmailConfig({
</div>
</div>
</ConfigSection>
<Notice
variant='default'
className='border-slate-200 bg-white dark:border-border dark:bg-background'
icon={<GmailIcon className='mt-0.5 mr-3.5 h-5 w-5 flex-shrink-0 text-red-500' />}
title='Gmail Event Payload Example'
>
<div className='overflow-wrap-anywhere mt-2 whitespace-normal break-normal font-mono text-sm'>
<JSONView data={getExampleEmailEvent(includeRawEmail)} />
</div>
</Notice>
</div>
)
}

View File

@@ -1,7 +1,6 @@
import { useEffect, useState } from 'react'
import { Info } from 'lucide-react'
import { Tooltip } from '@/components/emcn'
import { OutlookIcon } from '@/components/icons'
import {
Badge,
Button,
@@ -16,7 +15,6 @@ import {
Skeleton,
} from '@/components/ui'
import { createLogger } from '@/lib/logs/console/logger'
import { JSONView } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components'
import { ConfigSection } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel-new/components/editor/components/sub-block/components/webhook/components'
const logger = createLogger('OutlookConfig')
@@ -40,70 +38,6 @@ const TOOLTIPS = {
}
// Generate example payload for Outlook
const generateOutlookExamplePayload = (includeRawEmail: boolean) => {
const baseExample: any = {
email: {
id: 'AAMkAGVmMDEzMTM4LTZmYWUtNDdkNC1hMDZiLTU1OGY5OTZhYmY4OABGAAAAAAAiQ8W967B7TKBjgx9rVEURBwAiIsqMbYjsT5e-T4KzowKTAAAAAAEMAAAiIsqMbYjsT5e-T4KzowKTAAAYbvZDAAA=',
conversationId:
'AAQkAGVmMDEzMTM4LTZmYWUtNDdkNC1hMDZiLTU1OGY5OTZhYmY4OAAQAOH_y8jLzUGIn-HVkHUBrEE=',
subject: 'Monthly Report - January 2024',
from: 'sender@company.com',
to: 'recipient@company.com',
cc: '',
date: '2024-01-15T10:30:00Z',
bodyText: 'Hello, Please find attached the monthly report for January 2024.',
bodyHtml: '<p>Hello,</p><p>Please find attached the monthly report for January 2024.</p>',
hasAttachments: true,
isRead: false,
folderId: 'inbox',
},
timestamp: '2024-01-15T10:30:15.123Z',
}
if (includeRawEmail) {
baseExample.rawEmail = {
id: 'AAMkAGVmMDEzMTM4LTZmYWUtNDdkNC1hMDZiLTU1OGY5OTZhYmY4OABGAAAAAAAiQ8W967B7TKBjgx9rVEURBwAiIsqMbYjsT5e-T4KzowKTAAAAAAEMAAAiIsqMbYjsT5e-T4KzowKTAAAYbvZDAAA=',
conversationId:
'AAQkAGVmMDEzMTM4LTZmYWUtNDdkNC1hMDZiLTU1OGY5OTZhYmY4OAAQAOH_y8jLzUGIn-HVkHUBrEE=',
subject: 'Monthly Report - January 2024',
bodyPreview: 'Hello, Please find attached the monthly report for January 2024.',
body: {
contentType: 'html',
content: '<p>Hello,</p><p>Please find attached the monthly report for January 2024.</p>',
},
from: {
emailAddress: {
name: 'John Doe',
address: 'sender@company.com',
},
},
toRecipients: [
{
emailAddress: {
name: 'Jane Smith',
address: 'recipient@company.com',
},
},
],
ccRecipients: [],
bccRecipients: [],
receivedDateTime: '2024-01-15T10:30:00Z',
sentDateTime: '2024-01-15T10:29:45Z',
hasAttachments: true,
isRead: false,
isDraft: false,
importance: 'normal',
parentFolderId: 'inbox',
internetMessageId: '<message-id@company.com>',
webLink: 'https://outlook.office365.com/owa/?ItemID=...',
createdDateTime: '2024-01-15T10:30:00Z',
lastModifiedDateTime: '2024-01-15T10:30:15Z',
changeKey: 'CQAAABYAAAAiIsqMbYjsT5e-T4KzowKTAAAYbvZE',
}
}
return baseExample
}
interface OutlookConfigProps {
selectedLabels: string[]
@@ -368,16 +302,6 @@ export function OutlookConfig({
</div>
</div>
</ConfigSection>
<ConfigSection>
<div className='mb-3 flex items-center gap-2'>
<OutlookIcon className='h-4 w-4' />
<h3 className='font-medium text-sm'>Outlook Event Payload Example</h3>
</div>
<div className='rounded-md border bg-muted/50 p-3'>
<JSONView data={generateOutlookExamplePayload(includeRawEmail)} />
</div>
</ConfigSection>
</div>
)
}

View File

@@ -1,6 +1,3 @@
import { SlackIcon } from '@/components/icons'
import { Notice } from '@/components/ui'
import { JSONView } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components'
import {
ConfigSection,
InstructionsSection,
@@ -23,24 +20,6 @@ interface SlackConfigProps {
webhookUrl: string
}
const exampleEvent = JSON.stringify(
{
type: 'event_callback',
event: {
type: 'message',
channel: 'C0123456789',
user: 'U0123456789',
text: 'Hello from Slack!',
ts: '1234567890.123456',
},
team_id: 'T0123456789',
event_id: 'Ev0123456789',
event_time: 1234567890,
},
null,
2
)
export function SlackConfig({
signingSecret,
setSigningSecret,
@@ -144,20 +123,6 @@ export function SlackConfig({
<li>Save changes in both Slack and here.</li>
</ol>
</InstructionsSection>
<Notice
variant='default'
className='border-slate-200 bg-white dark:border-border dark:bg-background'
icon={
<SlackIcon className='mt-0.5 mr-3.5 h-5 w-5 flex-shrink-0 text-[#611f69] dark:text-[#e01e5a]' />
}
title='Slack Event Payload Example'
>
Your workflow will receive a payload similar to this when a subscribed event occurs:
<div className='overflow-wrap-anywhere mt-2 whitespace-normal break-normal font-mono text-sm'>
<JSONView data={JSON.parse(exampleEvent)} />
</div>
</Notice>
</div>
)
}

View File

@@ -3,18 +3,21 @@ import { v4 as uuidv4 } from 'uuid'
import { createLogger } from '@/lib/logs/console/logger'
import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans'
import { processStreamingBlockLogs } from '@/lib/tokenization'
import {
extractTriggerMockPayload,
selectBestTrigger,
triggerNeedsMockPayload,
} from '@/lib/workflows/trigger-utils'
import { resolveStartCandidates, StartBlockPath, TriggerUtils } from '@/lib/workflows/triggers'
import type { BlockLog, ExecutionResult, StreamingExecution } from '@/executor/types'
import { useExecutionStream } from '@/hooks/use-execution-stream'
import { Serializer, WorkflowValidationError } from '@/serializer'
import { WorkflowValidationError } from '@/serializer'
import { useExecutionStore } from '@/stores/execution/store'
import { useVariablesStore } from '@/stores/panel/variables/store'
import { useEnvironmentStore } from '@/stores/settings/environment/store'
import { useTerminalConsoleStore } from '@/stores/terminal'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { mergeSubblockState } from '@/stores/workflows/utils'
import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils'
import { filterEdgesFromTriggerBlocks } from '../utils/workflow-execution-utils'
import { useCurrentWorkflow } from './use-current-workflow'
const logger = createLogger('useWorkflowExecution')
@@ -700,73 +703,6 @@ export function useWorkflowExecution() {
{} as typeof mergedStates
)
const currentBlockStates = Object.entries(filteredStates).reduce(
(acc, [id, block]) => {
acc[id] = Object.entries(block.subBlocks).reduce(
(subAcc, [key, subBlock]) => {
subAcc[key] = subBlock.value
return subAcc
},
{} as Record<string, any>
)
return acc
},
{} as Record<string, Record<string, any>>
)
// Get workspaceId from workflow metadata
const workspaceId = activeWorkflowId ? workflows[activeWorkflowId]?.workspaceId : undefined
// Get environment variables with workspace precedence
const personalEnvVars = getAllVariables()
const personalEnvValues = Object.entries(personalEnvVars).reduce(
(acc, [key, variable]) => {
acc[key] = variable.value
return acc
},
{} as Record<string, string>
)
// Load workspace environment variables if workspaceId exists
let workspaceEnvValues: Record<string, string> = {}
if (workspaceId) {
try {
const workspaceData = await loadWorkspaceEnvironment(workspaceId)
workspaceEnvValues = workspaceData.workspace || {}
} catch (error) {
logger.warn('Failed to load workspace environment variables:', error)
}
}
// Merge with workspace taking precedence over personal
const envVarValues = { ...personalEnvValues, ...workspaceEnvValues }
// Get workflow variables
const workflowVars = activeWorkflowId ? getVariablesByWorkflowId(activeWorkflowId) : []
const workflowVariables = workflowVars.reduce(
(acc, variable) => {
acc[variable.id] = variable
return acc
},
{} as Record<string, any>
)
// Filter out edges between trigger blocks - triggers are independent entry points
const filteredEdges = filterEdgesFromTriggerBlocks(filteredStates, workflowEdges)
// Derive subflows from the current filtered graph to avoid stale state
const runtimeLoops = generateLoopBlocks(filteredStates)
const runtimeParallels = generateParallelBlocks(filteredStates)
// Create serialized workflow with validation enabled
const workflow = new Serializer().serializeWorkflow(
filteredStates,
filteredEdges,
runtimeLoops,
runtimeParallels,
true
)
// If this is a chat execution, get the selected outputs
let selectedOutputs: string[] | undefined
if (isExecutingFromChat && activeWorkflowId) {
@@ -804,19 +740,21 @@ export function useWorkflowExecution() {
startBlockId = startBlock.blockId
} else {
// Manual execution: detect and group triggers by paths
const candidates = resolveStartCandidates(filteredStates, {
execution: 'manual',
})
logger.info('Manual run start candidates:', {
count: candidates.length,
paths: candidates.map((candidate) => ({
path: candidate.path,
type: candidate.block.type,
name: candidate.block.name,
})),
})
if (candidates.length === 0) {
const error = new Error('Workflow requires at least one trigger block to execute')
logger.error('No trigger blocks found for manual run', {
allBlockTypes: Object.values(filteredStates).map((b) => b.type),
})
setIsExecuting(false)
throw error
}
// Check for multiple API triggers (still not allowed)
const apiCandidates = candidates.filter(
(candidate) => candidate.path === StartBlockPath.SPLIT_API
)
@@ -827,18 +765,16 @@ export function useWorkflowExecution() {
throw error
}
const selectedCandidate = apiCandidates[0] ?? candidates[0]
if (!selectedCandidate) {
const error = new Error('Manual run requires a Manual, Input Form, or API Trigger block')
logger.error('No manual/input or API triggers found for manual run')
setIsExecuting(false)
throw error
}
// Select the best trigger
// Priority: Start Block > Schedules > External Triggers > Legacy
const selectedTriggers = selectBestTrigger(candidates, workflowEdges)
// Execute the first/highest priority trigger
const selectedCandidate = selectedTriggers[0]
startBlockId = selectedCandidate.blockId
const selectedTrigger = selectedCandidate.block
// Validate outgoing connections for non-legacy triggers
if (selectedCandidate.path !== StartBlockPath.LEGACY_STARTER) {
const outgoingConnections = workflowEdges.filter((edge) => edge.source === startBlockId)
if (outgoingConnections.length === 0) {
@@ -850,30 +786,21 @@ export function useWorkflowExecution() {
}
}
if (
// Prepare input based on trigger type
if (triggerNeedsMockPayload(selectedCandidate)) {
const mockPayload = extractTriggerMockPayload(selectedCandidate)
finalWorkflowInput = mockPayload
} else if (
selectedCandidate.path === StartBlockPath.SPLIT_API ||
selectedCandidate.path === StartBlockPath.SPLIT_INPUT ||
selectedCandidate.path === StartBlockPath.UNIFIED
) {
const inputFormatValue = selectedTrigger.subBlocks?.inputFormat?.value
const testInput = extractTestValuesFromInputFormat(inputFormatValue)
if (Object.keys(testInput).length > 0) {
finalWorkflowInput = testInput
logger.info('Using trigger test values for manual run:', {
startBlockId,
testFields: Object.keys(testInput),
path: selectedCandidate.path,
})
}
}
logger.info('Trigger found for manual run:', {
startBlockId,
triggerType: selectedTrigger.type,
triggerName: selectedTrigger.name,
startPath: selectedCandidate.path,
})
}
// If we don't have a valid startBlockId at this point, throw an error
@@ -904,10 +831,12 @@ export function useWorkflowExecution() {
const activeBlocksSet = new Set<string>()
const streamedContent = new Map<string, string>()
// Execute the workflow
try {
await executionStream.execute({
workflowId: activeWorkflowId,
input: finalWorkflowInput,
startBlockId,
selectedOutputs,
triggerType: overrideTriggerType || 'manual',
useDraftState: true,

View File

@@ -1,16 +1,6 @@
/**
* Workflow execution utilities for client-side execution triggers
* This is now a thin wrapper around the server-side executor
*/
import type { Edge } from 'reactflow'
import { createLogger } from '@/lib/logs/console/logger'
import { TriggerUtils } from '@/lib/workflows/triggers'
import type { ExecutionResult, StreamingExecution } from '@/executor/types'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
const logger = createLogger('WorkflowExecutionUtils')
export interface WorkflowExecutionOptions {
workflowInput?: any
onStream?: (se: StreamingExecution) => Promise<void>
@@ -54,28 +44,3 @@ export async function executeWorkflowWithFullLogging(
const result = await response.json()
return result as ExecutionResult
}
/**
* Filter out all incoming edges to trigger blocks - triggers are independent entry points
* This ensures execution and UI only show edges that are actually connected in execution
* @param blocks - Record of blocks keyed by block ID
* @param edges - Array of edges to filter
* @returns Filtered array of edges
*/
export function filterEdgesFromTriggerBlocks(blocks: Record<string, any>, edges: Edge[]): Edge[] {
return edges.filter((edge) => {
const sourceBlock = blocks[edge.source]
const targetBlock = blocks[edge.target]
if (!sourceBlock || !targetBlock) {
return true
}
const targetIsTrigger = TriggerUtils.isTriggerBlock({
type: targetBlock.type,
triggerMode: targetBlock.triggerMode,
})
return !targetIsTrigger
})
}

View File

@@ -34,7 +34,6 @@ import {
useCurrentWorkflow,
useNodeUtilities,
} from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks'
import { filterEdgesFromTriggerBlocks } from '@/app/workspace/[workspaceId]/w/[workflowId]/utils/workflow-execution-utils'
import { getBlock } from '@/blocks'
import { useSocket } from '@/contexts/socket-context'
import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
@@ -226,9 +225,7 @@ const WorkflowContent = React.memo(() => {
// Combine existing edges with reconstructed deleted edges
edgesToFilter = [...edges, ...reconstructedEdges]
}
// Filter out edges between trigger blocks for consistent UI and execution behavior
return filterEdgesFromTriggerBlocks(blocks, edgesToFilter)
return edgesToFilter
}, [edges, isShowingDiff, isDiffReady, diffAnalysis, blocks])
// User permissions - get current user's specific permissions from context
@@ -601,6 +598,12 @@ const WorkflowContent = React.memo(() => {
if (isAutoConnectEnabled) {
const closestBlock = findClosestOutput(centerPosition)
if (closestBlock) {
// Container nodes are never triggers, but check if source is a trigger
const sourceBlockConfig = getBlock(closestBlock.type)
const isSourceTrigger =
sourceBlockConfig?.category === 'triggers' || sourceBlockConfig?.triggers?.enabled
// Container nodes can connect from triggers (they're not triggers themselves)
// Get appropriate source handle
const sourceHandle = determineSourceHandle(closestBlock)
@@ -660,18 +663,28 @@ const WorkflowContent = React.memo(() => {
const closestBlock = findClosestOutput(centerPosition)
logger.info('Closest block found:', closestBlock)
if (closestBlock) {
// Get appropriate source handle
const sourceHandle = determineSourceHandle(closestBlock)
// Don't create edges into trigger blocks
const targetBlockConfig = blockConfig
const isTargetTrigger =
targetBlockConfig?.category === 'triggers' || targetBlockConfig?.triggers?.enabled
autoConnectEdge = {
id: crypto.randomUUID(),
source: closestBlock.id,
target: id,
sourceHandle,
targetHandle: 'target',
type: 'workflowEdge',
if (!isTargetTrigger) {
const sourceHandle = determineSourceHandle(closestBlock)
autoConnectEdge = {
id: crypto.randomUUID(),
source: closestBlock.id,
target: id,
sourceHandle,
targetHandle: 'target',
type: 'workflowEdge',
}
logger.info('Auto-connect edge created:', autoConnectEdge)
} else {
logger.info('Skipping auto-connect into trigger block', {
target: type,
})
}
logger.info('Auto-connect edge created:', autoConnectEdge)
}
}
@@ -831,6 +844,7 @@ const WorkflowContent = React.memo(() => {
if (isAutoConnectEnabled) {
const closestBlock = findClosestOutput(position)
if (closestBlock) {
// Container nodes can connect from any block (they're never triggers)
const sourceHandle = determineSourceHandle(closestBlock)
autoConnectEdge = {
@@ -911,17 +925,24 @@ const WorkflowContent = React.memo(() => {
.sort((a, b) => a.distance - b.distance)[0]?.block
if (closestBlock) {
const sourceHandle = determineSourceHandle({
id: closestBlock.id,
type: closestBlock.type,
})
autoConnectEdge = {
id: crypto.randomUUID(),
source: closestBlock.id,
target: id,
sourceHandle,
targetHandle: 'target',
type: 'workflowEdge',
// Don't create edges into trigger blocks
const targetBlockConfig = getBlock(data.type)
const isTargetTrigger =
targetBlockConfig?.category === 'triggers' || targetBlockConfig?.triggers?.enabled
if (!isTargetTrigger) {
const sourceHandle = determineSourceHandle({
id: closestBlock.id,
type: closestBlock.type,
})
autoConnectEdge = {
id: crypto.randomUUID(),
source: closestBlock.id,
target: id,
sourceHandle,
targetHandle: 'target',
type: 'workflowEdge',
}
}
}
} else {
@@ -982,15 +1003,22 @@ const WorkflowContent = React.memo(() => {
if (isAutoConnectEnabled && data.type !== 'starter') {
const closestBlock = findClosestOutput(position)
if (closestBlock) {
const sourceHandle = determineSourceHandle(closestBlock)
// Don't create edges into trigger blocks
const targetBlockConfig = getBlock(data.type)
const isTargetTrigger =
targetBlockConfig?.category === 'triggers' || targetBlockConfig?.triggers?.enabled
autoConnectEdge = {
id: crypto.randomUUID(),
source: closestBlock.id,
target: id,
sourceHandle,
targetHandle: 'target',
type: 'workflowEdge',
if (!isTargetTrigger) {
const sourceHandle = determineSourceHandle(closestBlock)
autoConnectEdge = {
id: crypto.randomUUID(),
source: closestBlock.id,
target: id,
sourceHandle,
targetHandle: 'target',
type: 'workflowEdge',
}
}
}
}

View File

@@ -16,7 +16,6 @@ import {
} from '@/lib/workflows/db-helpers'
import { TriggerUtils } from '@/lib/workflows/triggers'
import { updateWorkflowRunCounts } from '@/lib/workflows/utils'
import { filterEdgesFromTriggerBlocks } from '@/app/workspace/[workspaceId]/w/[workflowId]/utils/workflow-execution-utils'
import { Executor } from '@/executor'
import type { ExecutionCallbacks, ExecutionSnapshot } from '@/executor/execution/snapshot'
import type { ExecutionResult } from '@/executor/types'
@@ -225,7 +224,8 @@ export async function executeWorkflowCore(
{} as Record<string, Record<string, any>>
)
const filteredEdges = filterEdgesFromTriggerBlocks(mergedStates, edges)
// Use edges directly - trigger-to-trigger edges are prevented at creation time
const filteredEdges = edges
// Check if this is a resume execution before trigger resolution
const resumeFromSnapshot = (metadata as any).resumeFromSnapshot === true

View File

@@ -1,6 +1,97 @@
import { TRIGGER_TYPES } from '@/lib/workflows/triggers'
import { createLogger } from '@/lib/logs/console/logger'
import { type StartBlockCandidate, StartBlockPath, TRIGGER_TYPES } from '@/lib/workflows/triggers'
import { getAllBlocks, getBlock } from '@/blocks'
import type { BlockConfig } from '@/blocks/types'
import { getTrigger } from '@/triggers'
const logger = createLogger('TriggerUtils')
/**
* Generates mock data based on the output type definition
*/
function generateMockValue(type: string, description?: string, fieldName?: string): any {
const name = fieldName || 'value'
switch (type) {
case 'string':
return `mock_${name}`
case 'number':
return 42
case 'boolean':
return true
case 'array':
return [
{
id: 'item_1',
name: 'Sample Item',
value: 'Sample Value',
},
]
case 'json':
case 'object':
return {
id: 'sample_id',
name: 'Sample Object',
status: 'active',
}
default:
return null
}
}
/**
* Recursively processes nested output structures
*/
function processOutputField(key: string, field: any, depth = 0, maxDepth = 10): any {
// Prevent infinite recursion
if (depth > maxDepth) {
return null
}
if (field && typeof field === 'object' && 'type' in field) {
return generateMockValue(field.type, field.description, key)
}
if (field && typeof field === 'object' && !Array.isArray(field)) {
const nestedObject: Record<string, any> = {}
for (const [nestedKey, nestedField] of Object.entries(field)) {
nestedObject[nestedKey] = processOutputField(nestedKey, nestedField, depth + 1, maxDepth)
}
return nestedObject
}
return null
}
/**
* Generates mock payload from outputs object
*/
function generateMockPayloadFromOutputs(outputs: Record<string, any>): Record<string, any> {
const mockPayload: Record<string, any> = {}
for (const [key, output] of Object.entries(outputs)) {
if (key === 'visualization') {
continue
}
mockPayload[key] = processOutputField(key, output)
}
return mockPayload
}
/**
* Generates a mock payload based on outputs definition
*/
export function generateMockPayloadFromOutputsDefinition(
outputs: Record<string, any>
): Record<string, any> {
return generateMockPayloadFromOutputs(outputs)
}
export interface TriggerInfo {
id: string
@@ -62,7 +153,10 @@ export function getAllTriggerBlocks(): TriggerInfo[] {
* Check if a block has trigger capability (contains trigger mode subblocks)
*/
export function hasTriggerCapability(block: BlockConfig): boolean {
return block.subBlocks.some((subBlock) => subBlock.mode === 'trigger')
return (
(block.triggers?.enabled === true && block.triggers.available.length > 0) ||
block.subBlocks.some((subBlock) => subBlock.mode === 'trigger')
)
}
/**
@@ -106,3 +200,200 @@ export function getTriggerDisplayName(blockType: string): string {
return block.name
}
/**
* Groups triggers by their immediate downstream blocks to identify disjoint paths
*/
export function groupTriggersByPath<
T extends { type: string; subBlocks?: Record<string, unknown> },
>(
candidates: StartBlockCandidate<T>[],
edges: Array<{ source: string; target: string }>
): Array<StartBlockCandidate<T>[]> {
if (candidates.length <= 1) {
return [candidates]
}
const groups: Array<StartBlockCandidate<T>[]> = []
const processed = new Set<string>()
// Build adjacency map (edges should already be filtered to exclude trigger-to-trigger)
const adjacency = new Map<string, string[]>()
for (const edge of edges) {
if (!adjacency.has(edge.source)) {
adjacency.set(edge.source, [])
}
adjacency.get(edge.source)!.push(edge.target)
}
// Group triggers that feed into the same immediate blocks
for (const trigger of candidates) {
if (processed.has(trigger.blockId)) continue
const immediateTargets = adjacency.get(trigger.blockId) || []
const targetSet = new Set(immediateTargets)
// Find all triggers with the same immediate targets
const group = candidates.filter((t) => {
if (processed.has(t.blockId)) return false
if (t.blockId === trigger.blockId) return true
const tTargets = adjacency.get(t.blockId) || []
// Different number of targets = different paths
if (immediateTargets.length !== tTargets.length) return false
// Check if all targets match
return tTargets.every((target) => targetSet.has(target))
})
group.forEach((t) => processed.add(t.blockId))
groups.push(group)
}
logger.info('Grouped triggers by path', {
groupCount: groups.length,
groups: groups.map((g) => ({
count: g.length,
triggers: g.map((t) => ({ id: t.blockId, type: t.block.type })),
})),
})
return groups
}
/**
* Selects the best trigger from a list of candidates based on priority
* Priority: Start Block > Schedules > External Triggers > Legacy
* If multiple disjoint paths exist, returns one trigger per path
*/
export function selectBestTrigger<T extends { type: string; subBlocks?: Record<string, unknown> }>(
candidates: StartBlockCandidate<T>[],
edges?: Array<{ source: string; target: string }>
): StartBlockCandidate<T>[] {
if (candidates.length === 0) {
throw new Error('No trigger candidates provided')
}
// If edges provided, group by path and select best from each group
if (edges) {
const groups = groupTriggersByPath(candidates, edges)
return groups.map((group) => selectBestFromGroup(group))
}
// Otherwise just select the single best trigger
return [selectBestFromGroup(candidates)]
}
/**
* Selects the best trigger from a group based on priority
*/
function selectBestFromGroup<T extends { type: string; subBlocks?: Record<string, unknown> }>(
candidates: StartBlockCandidate<T>[]
): StartBlockCandidate<T> {
if (candidates.length === 1) {
return candidates[0]
}
// Sort by priority (lower number = higher priority)
const sorted = [...candidates].sort((a, b) => {
const getPriority = (trigger: StartBlockCandidate<T>): number => {
// Start block - highest priority
if (trigger.path === StartBlockPath.UNIFIED) return 0
if (trigger.path === StartBlockPath.LEGACY_STARTER) return 1
// For external triggers, differentiate schedules from webhooks
if (trigger.path === StartBlockPath.EXTERNAL_TRIGGER) {
if (trigger.block.type === 'schedule') return 2
return 3 // Webhooks and other external triggers
}
// Other trigger types
if (trigger.path === StartBlockPath.SPLIT_API) return 4
if (trigger.path === StartBlockPath.SPLIT_INPUT) return 5
if (trigger.path === StartBlockPath.SPLIT_MANUAL) return 6
if (trigger.path === StartBlockPath.SPLIT_CHAT) return 7
return 99 // Unknown
}
return getPriority(a) - getPriority(b)
})
const selected = sorted[0]
logger.info('Selected best trigger from group', {
selectedId: selected.blockId,
selectedType: selected.block.type,
selectedPath: selected.path,
groupSize: candidates.length,
})
return selected
}
/**
* Checks if a trigger needs mock payload (external triggers/webhooks, but not schedules)
*/
export function triggerNeedsMockPayload<T extends { type: string }>(
trigger: StartBlockCandidate<T>
): boolean {
// Only webhooks and external integrations need mock payloads
// Schedules run normally without mock data
return trigger.path === StartBlockPath.EXTERNAL_TRIGGER && trigger.block.type !== 'schedule'
}
/**
* Extracts or generates mock payload for external trigger execution
*/
export function extractTriggerMockPayload<
T extends { type: string; subBlocks?: Record<string, unknown> },
>(trigger: StartBlockCandidate<T>): any {
const subBlocks = trigger.block.subBlocks as Record<string, any> | undefined
// Determine the trigger ID
let triggerId: string
// Check for selectedTriggerId (multi-trigger blocks like Linear, Jira)
if (typeof subBlocks?.selectedTriggerId?.value === 'string') {
triggerId = subBlocks.selectedTriggerId.value
} else {
// For single-trigger blocks, get from block config
const blockConfig = getBlock(trigger.block.type)
if (blockConfig?.triggers?.available?.length === 1) {
triggerId = blockConfig.triggers.available[0]
} else {
// Fallback to block type (for blocks that are themselves triggers like schedule)
triggerId = trigger.block.type
}
}
try {
const triggerConfig = getTrigger(triggerId)
if (!triggerConfig || !triggerConfig.outputs) {
logger.warn('No trigger config or outputs found', {
triggerId,
blockId: trigger.blockId,
})
return {}
}
const payload = generateMockPayloadFromOutputsDefinition(triggerConfig.outputs)
logger.info('Generated mock payload from trigger outputs', {
triggerId,
blockId: trigger.blockId,
topLevelKeys: Object.keys(payload ?? {}),
})
return payload
} catch (error) {
logger.error('Failed to generate mock payload from trigger outputs', {
triggerId,
blockId: trigger.blockId,
error: error instanceof Error ? error.message : String(error),
})
return {}
}
}

View File

@@ -37,6 +37,7 @@ const EXECUTION_PRIORITIES: Record<StartExecutionKind, StartBlockPath[]> = {
StartBlockPath.SPLIT_INPUT,
StartBlockPath.SPLIT_MANUAL,
StartBlockPath.LEGACY_STARTER,
StartBlockPath.EXTERNAL_TRIGGER,
],
api: [
StartBlockPath.UNIFIED,
@@ -108,8 +109,20 @@ export function classifyStartBlockType(
export function classifyStartBlock<T extends BlockWithType>(block: T): StartBlockPath | null {
const blockWithMetadata = block as BlockWithMetadata
const category = blockWithMetadata.category
const triggerModeEnabled = Boolean(blockWithMetadata.triggers?.enabled)
// Try to get metadata from the block itself first
let category = blockWithMetadata.category
let triggerModeEnabled = Boolean(blockWithMetadata.triggers?.enabled)
// If not available on the block, fetch from registry
if (!category || triggerModeEnabled === undefined) {
const blockConfig = getBlock(block.type)
if (blockConfig) {
category = category || blockConfig.category
triggerModeEnabled = triggerModeEnabled || Boolean(blockConfig.triggers?.enabled)
}
}
return classifyStartBlockType(block.type, { category, triggerModeEnabled })
}
@@ -150,7 +163,8 @@ function supportsExecution(path: StartBlockPath, execution: StartExecutionKind):
return (
path === StartBlockPath.SPLIT_API ||
path === StartBlockPath.SPLIT_INPUT ||
path === StartBlockPath.SPLIT_MANUAL
path === StartBlockPath.SPLIT_MANUAL ||
path === StartBlockPath.EXTERNAL_TRIGGER
)
}

View File

@@ -73,58 +73,6 @@ export const airtableWebhookTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'airtable_webhook',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
webhook: {
id: 'achAbCdEfGhIjKlMn',
},
timestamp: '2023-01-01T00:00:00.000Z',
base: {
id: 'appXXXXXXXXXXXXXX',
},
table: {
id: 'tblXXXXXXXXXXXXXX',
},
changedTablesById: {
tblXXXXXXXXXXXXXX: {
changedRecordsById: {
recXXXXXXXXXXXXXX: {
current: {
id: 'recXXXXXXXXXXXXXX',
createdTime: '2023-01-01T00:00:00.000Z',
fields: {
Name: 'Sample Record',
Status: 'Active',
},
},
previous: {
id: 'recXXXXXXXXXXXXXX',
createdTime: '2023-01-01T00:00:00.000Z',
fields: {
Name: 'Sample Record',
Status: 'Inactive',
},
},
},
},
createdRecordsById: {},
destroyedRecordIds: [],
},
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -82,32 +82,6 @@ export const genericWebhookTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'generic_webhook',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
event: 'user.created',
id: 'evt_1234567890',
data: {
user: {
id: 'user_123',
email: 'user@example.com',
name: 'John Doe',
},
},
timestamp: '2023-01-01T12:00:00Z',
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {},

View File

@@ -111,73 +111,6 @@ export const githubIssueClosedTrigger: TriggerConfig = {
value: 'github_issue_closed',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'closed',
issue: {
id: 1234567890,
number: 123,
title: 'Bug: Application crashes on startup',
body: 'When I try to start the application, it immediately crashes with error code 500.',
state: 'closed',
state_reason: 'completed',
html_url: 'https://github.com/owner/repo/issues/123',
user: {
login: 'octocat',
id: 1,
avatar_url: 'https://github.com/images/error/octocat_happy.gif',
html_url: 'https://github.com/octocat',
user_type: 'User',
},
labels: [
{
name: 'bug',
color: 'd73a4a',
},
],
assignees: [],
created_at: '2025-01-15T10:30:00Z',
updated_at: '2025-01-15T14:20:00Z',
closed_at: '2025-01-15T14:20:00Z',
},
repository: {
id: 123456,
name: 'repo-name',
full_name: 'owner/repo-name',
html_url: 'https://github.com/owner/repo-name',
repo_description: 'A sample repository',
private: false,
owner: {
login: 'owner',
id: 7890,
avatar_url: 'https://github.com/images/error/owner.gif',
owner_type: 'User',
},
},
sender: {
login: 'maintainer',
id: 2,
avatar_url: 'https://github.com/images/error/maintainer.gif',
user_type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_issue_closed',
},
},
],
outputs: {

View File

@@ -112,68 +112,6 @@ export const githubIssueCommentTrigger: TriggerConfig = {
value: 'github_issue_comment',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'created',
issue: {
number: 123,
title: 'Bug: Application crashes on startup',
state: 'open',
html_url: 'https://github.com/owner/repo/issues/123',
user: {
login: 'octocat',
id: 1,
avatar_url: 'https://github.com/images/error/octocat_happy.gif',
user_type: 'User',
},
},
comment: {
id: 987654321,
body: 'I can confirm this bug. It happens on my machine too.',
html_url: 'https://github.com/owner/repo/issues/123#issuecomment-987654321',
user: {
login: 'commenter',
id: 3,
avatar_url: 'https://github.com/images/error/commenter.gif',
user_type: 'User',
},
created_at: '2025-01-15T11:00:00Z',
updated_at: '2025-01-15T11:00:00Z',
},
repository: {
id: 123456,
name: 'repo-name',
full_name: 'owner/repo-name',
html_url: 'https://github.com/owner/repo-name',
owner: {
login: 'owner',
id: 7890,
owner_type: 'User',
},
},
sender: {
login: 'commenter',
id: 3,
user_type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_issue_comment',
},
},
],
outputs: {

View File

@@ -132,71 +132,6 @@ export const githubIssueOpenedTrigger: TriggerConfig = {
value: 'github_issue_opened',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'opened',
issue: {
id: 1234567890,
number: 123,
title: 'Bug: Application crashes on startup',
body: 'When I try to start the application, it immediately crashes with error code 500.',
state: 'open',
html_url: 'https://github.com/owner/repo/issues/123',
user: {
login: 'octocat',
id: 1,
avatar_url: 'https://github.com/images/error/octocat_happy.gif',
html_url: 'https://github.com/octocat',
user_type: 'User',
},
labels: [
{
name: 'bug',
color: 'd73a4a',
},
],
assignees: [],
created_at: '2025-01-15T10:30:00Z',
updated_at: '2025-01-15T10:30:00Z',
},
repository: {
id: 123456,
name: 'repo-name',
full_name: 'owner/repo-name',
html_url: 'https://github.com/owner/repo-name',
repo_description: 'A sample repository',
private: false,
owner: {
login: 'owner',
id: 7890,
avatar_url: 'https://github.com/images/error/owner.gif',
owner_type: 'User',
},
},
sender: {
login: 'octocat',
id: 1,
avatar_url: 'https://github.com/images/error/octocat_happy.gif',
user_type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_issue_opened',
},
},
],
outputs: {

View File

@@ -112,95 +112,6 @@ export const githubPRClosedTrigger: TriggerConfig = {
value: 'github_pr_closed',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'closed',
number: 42,
pull_request: {
id: 1234567890,
number: 42,
title: 'Add new feature',
body: 'This PR adds a new feature that improves performance.',
state: 'closed',
merged: false,
draft: false,
html_url: 'https://github.com/owner/repo/pull/42',
diff_url: 'https://github.com/owner/repo/pull/42.diff',
patch_url: 'https://github.com/owner/repo/pull/42.patch',
user: {
login: 'developer',
id: 5,
avatar_url: 'https://github.com/images/error/developer.gif',
html_url: 'https://github.com/developer',
user_type: 'User',
},
head: {
ref: 'feature-branch',
sha: 'abc123def456',
repo: {
name: 'repo-name',
full_name: 'owner/repo-name',
},
},
base: {
ref: 'main',
sha: '789ghi012jkl',
repo: {
name: 'repo-name',
full_name: 'owner/repo-name',
},
},
additions: 245,
deletions: 67,
changed_files: 12,
labels: [],
assignees: [],
requested_reviewers: [
{
login: 'reviewer1',
id: 6,
},
],
created_at: '2025-01-15T12:00:00Z',
updated_at: '2025-01-15T14:30:00Z',
closed_at: '2025-01-15T14:30:00Z',
},
repository: {
id: 123456,
name: 'repo-name',
full_name: 'owner/repo-name',
html_url: 'https://github.com/owner/repo-name',
repo_description: 'A sample repository',
private: false,
owner: {
login: 'owner',
id: 7890,
owner_type: 'User',
},
},
sender: {
login: 'developer',
id: 5,
user_type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_pr_closed',
},
},
],
outputs: {

View File

@@ -112,95 +112,6 @@ export const githubPRCommentTrigger: TriggerConfig = {
value: 'github_pr_comment',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'created',
issue: {
id: 1234567890,
number: 42,
title: 'Add new feature',
body: 'This PR adds a new feature that improves performance.',
state: 'open',
html_url: 'https://github.com/owner/repo/issues/42',
user: {
login: 'developer',
id: 5,
node_id: 'MDQ6VXNlcjU=',
avatar_url: 'https://github.com/images/error/developer.gif',
html_url: 'https://github.com/developer',
type: 'User',
},
labels: [],
assignees: [],
pull_request: {
url: 'https://api.github.com/repos/owner/repo/pulls/42',
html_url: 'https://github.com/owner/repo/pull/42',
diff_url: 'https://github.com/owner/repo/pull/42.diff',
patch_url: 'https://github.com/owner/repo/pull/42.patch',
},
created_at: '2025-01-15T12:00:00Z',
updated_at: '2025-01-15T12:15:00Z',
},
comment: {
id: 987654321,
node_id: 'MDEyOklzc3VlQ29tbWVudDk4NzY1NDMyMQ==',
url: 'https://api.github.com/repos/owner/repo/issues/comments/987654321',
html_url: 'https://github.com/owner/repo/issues/42#issuecomment-987654321',
body: 'Great work! This looks good to me.',
user: {
login: 'reviewer',
id: 6,
node_id: 'MDQ6VXNlcjY=',
avatar_url: 'https://github.com/images/error/reviewer.gif',
html_url: 'https://github.com/reviewer',
type: 'User',
},
created_at: '2025-01-15T12:15:00Z',
updated_at: '2025-01-15T12:15:00Z',
},
repository: {
id: 123456,
node_id: 'MDEwOlJlcG9zaXRvcnkxMjM0NTY=',
name: 'repo-name',
full_name: 'owner/repo-name',
html_url: 'https://github.com/owner/repo-name',
description: 'A sample repository',
private: false,
owner: {
login: 'owner',
id: 7890,
node_id: 'MDQ6VXNlcjc4OTA=',
avatar_url: 'https://github.com/images/error/owner.gif',
html_url: 'https://github.com/owner',
type: 'User',
},
},
sender: {
login: 'reviewer',
id: 6,
node_id: 'MDQ6VXNlcjY=',
avatar_url: 'https://github.com/images/error/reviewer.gif',
html_url: 'https://github.com/reviewer',
type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_pr_comment',
},
},
],
outputs: {

View File

@@ -111,103 +111,6 @@ export const githubPRMergedTrigger: TriggerConfig = {
value: 'github_pr_merged',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'closed',
number: 42,
pull_request: {
id: 1234567890,
number: 42,
title: 'Add new feature',
body: 'This PR adds a new feature that improves performance.',
state: 'closed',
merged: true,
merge_commit_sha: 'mno345pqr678',
merged_at: '2025-01-15T13:30:00Z',
merged_by: {
login: 'maintainer',
id: 8,
avatar_url: 'https://github.com/images/error/maintainer.gif',
html_url: 'https://github.com/maintainer',
user_type: 'User',
},
draft: false,
html_url: 'https://github.com/owner/repo/pull/42',
diff_url: 'https://github.com/owner/repo/pull/42.diff',
patch_url: 'https://github.com/owner/repo/pull/42.patch',
user: {
login: 'developer',
id: 5,
avatar_url: 'https://github.com/images/error/developer.gif',
html_url: 'https://github.com/developer',
user_type: 'User',
},
head: {
ref: 'feature-branch',
sha: 'abc123def456',
repo: {
name: 'repo-name',
full_name: 'owner/repo-name',
},
},
base: {
ref: 'main',
sha: '789ghi012jkl',
repo: {
name: 'repo-name',
full_name: 'owner/repo-name',
},
},
additions: 245,
deletions: 67,
changed_files: 12,
labels: [],
assignees: [],
requested_reviewers: [
{
login: 'reviewer1',
id: 6,
},
],
created_at: '2025-01-15T12:00:00Z',
updated_at: '2025-01-15T13:30:00Z',
},
repository: {
id: 123456,
name: 'repo-name',
full_name: 'owner/repo-name',
html_url: 'https://github.com/owner/repo-name',
repo_description: 'A sample repository',
private: false,
owner: {
login: 'owner',
id: 7890,
owner_type: 'User',
},
},
sender: {
login: 'developer',
id: 5,
user_type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_pr_merged',
},
},
],
outputs: {

View File

@@ -111,94 +111,6 @@ export const githubPROpenedTrigger: TriggerConfig = {
value: 'github_pr_opened',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'opened',
number: 42,
pull_request: {
id: 1234567890,
number: 42,
title: 'Add new feature',
body: 'This PR adds a new feature that improves performance.',
state: 'open',
merged: false,
draft: false,
html_url: 'https://github.com/owner/repo/pull/42',
diff_url: 'https://github.com/owner/repo/pull/42.diff',
patch_url: 'https://github.com/owner/repo/pull/42.patch',
user: {
login: 'developer',
id: 5,
avatar_url: 'https://github.com/images/error/developer.gif',
html_url: 'https://github.com/developer',
user_type: 'User',
},
head: {
ref: 'feature-branch',
sha: 'abc123def456',
repo: {
name: 'repo-name',
full_name: 'owner/repo-name',
},
},
base: {
ref: 'main',
sha: '789ghi012jkl',
repo: {
name: 'repo-name',
full_name: 'owner/repo-name',
},
},
additions: 245,
deletions: 67,
changed_files: 12,
labels: [],
assignees: [],
requested_reviewers: [
{
login: 'reviewer1',
id: 6,
},
],
created_at: '2025-01-15T12:00:00Z',
updated_at: '2025-01-15T12:00:00Z',
},
repository: {
id: 123456,
name: 'repo-name',
full_name: 'owner/repo-name',
html_url: 'https://github.com/owner/repo-name',
repo_description: 'A sample repository',
private: false,
owner: {
login: 'owner',
id: 7890,
owner_type: 'User',
},
},
sender: {
login: 'developer',
id: 5,
user_type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_pr_opened',
},
},
],
outputs: {

View File

@@ -112,109 +112,6 @@ export const githubPRReviewedTrigger: TriggerConfig = {
value: 'github_pr_reviewed',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'submitted',
review: {
id: 80,
node_id: 'MDE3OlB1bGxSZXF1ZXN0UmV2aWV3ODA=',
user: {
login: 'reviewer',
id: 6,
node_id: 'MDQ6VXNlcjY=',
avatar_url: 'https://github.com/images/error/reviewer.gif',
html_url: 'https://github.com/reviewer',
type: 'User',
},
body: 'This looks great! Nice work.',
state: 'approved',
html_url: 'https://github.com/owner/repo/pull/42#pullrequestreview-80',
submitted_at: '2025-01-15T14:00:00Z',
commit_id: 'abc123def456',
author_association: 'COLLABORATOR',
},
pull_request: {
id: 1234567890,
number: 42,
node_id: 'MDExOlB1bGxSZXF1ZXN0MQ==',
title: 'Add new feature',
body: 'This PR adds a new feature that improves performance.',
state: 'open',
merged: false,
draft: false,
html_url: 'https://github.com/owner/repo/pull/42',
diff_url: 'https://github.com/owner/repo/pull/42.diff',
patch_url: 'https://github.com/owner/repo/pull/42.patch',
user: {
login: 'developer',
id: 5,
node_id: 'MDQ6VXNlcjU=',
avatar_url: 'https://github.com/images/error/developer.gif',
html_url: 'https://github.com/developer',
type: 'User',
},
head: {
ref: 'feature-branch',
sha: 'abc123def456',
repo: {
name: 'repo-name',
full_name: 'owner/repo-name',
},
},
base: {
ref: 'main',
sha: '789ghi012jkl',
repo: {
name: 'repo-name',
full_name: 'owner/repo-name',
},
},
created_at: '2025-01-15T12:00:00Z',
updated_at: '2025-01-15T14:00:00Z',
},
repository: {
id: 123456,
node_id: 'MDEwOlJlcG9zaXRvcnkxMjM0NTY=',
name: 'repo-name',
full_name: 'owner/repo-name',
html_url: 'https://github.com/owner/repo-name',
description: 'A sample repository',
private: false,
owner: {
login: 'owner',
id: 7890,
node_id: 'MDQ6VXNlcjc4OTA=',
avatar_url: 'https://github.com/images/error/owner.gif',
html_url: 'https://github.com/owner',
type: 'User',
},
},
sender: {
login: 'reviewer',
id: 6,
node_id: 'MDQ6VXNlcjY=',
avatar_url: 'https://github.com/images/error/reviewer.gif',
html_url: 'https://github.com/reviewer',
type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_pr_reviewed',
},
},
],
outputs: {

View File

@@ -111,138 +111,6 @@ export const githubPushTrigger: TriggerConfig = {
value: 'github_push',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
ref: 'refs/heads/main',
before: '0000000000000000000000000000000000000000',
after: 'abc123def456789ghi012jkl345mno678pqr901',
created: true,
deleted: false,
forced: false,
base_ref: null,
compare: 'https://github.com/owner/repo-name/compare/0000000000000000...abc123def456',
commits: [
{
id: 'abc123def456789ghi012jkl345mno678pqr901',
tree_id: 'tree123abc456def789ghi012jkl345mno678',
distinct: true,
message: 'Add new feature to improve performance',
timestamp: '2025-01-15T12:00:00Z',
url: 'https://github.com/owner/repo-name/commit/abc123def456789ghi012jkl345mno678pqr901',
author: {
name: 'Developer Name',
email: 'developer@example.com',
username: 'developer',
},
committer: {
name: 'Developer Name',
email: 'developer@example.com',
username: 'developer',
},
added: ['src/features/new-feature.ts'],
removed: [],
modified: ['src/index.ts', 'README.md'],
},
{
id: 'def456ghi789jkl012mno345pqr678stu901vwx',
tree_id: 'tree456def789ghi012jkl345mno678pqr901',
distinct: true,
message: 'Update documentation',
timestamp: '2025-01-15T12:15:00Z',
url: 'https://github.com/owner/repo-name/commit/def456ghi789jkl012mno345pqr678stu901vwx',
author: {
name: 'Developer Name',
email: 'developer@example.com',
username: 'developer',
},
committer: {
name: 'Developer Name',
email: 'developer@example.com',
username: 'developer',
},
added: [],
removed: [],
modified: ['docs/API.md'],
},
],
head_commit: {
id: 'def456ghi789jkl012mno345pqr678stu901vwx',
tree_id: 'tree456def789ghi012jkl345mno678pqr901',
distinct: true,
message: 'Update documentation',
timestamp: '2025-01-15T12:15:00Z',
url: 'https://github.com/owner/repo-name/commit/def456ghi789jkl012mno345pqr678stu901vwx',
author: {
name: 'Developer Name',
email: 'developer@example.com',
username: 'developer',
},
committer: {
name: 'Developer Name',
email: 'developer@example.com',
username: 'developer',
},
added: [],
removed: [],
modified: ['docs/API.md'],
},
pusher: {
name: 'developer',
email: 'developer@example.com',
},
repository: {
id: 123456,
node_id: 'MDEwOlJlcG9zaXRvcnkxMjM0NTY=',
name: 'repo-name',
full_name: 'owner/repo-name',
private: false,
html_url: 'https://github.com/owner/repo-name',
repo_description: 'A sample repository for demonstrating push events',
fork: false,
url: 'https://api.github.com/repos/owner/repo-name',
homepage: 'https://example.com',
size: 1024,
stargazers_count: 42,
watchers_count: 42,
language: 'TypeScript',
forks_count: 5,
open_issues_count: 3,
default_branch: 'main',
owner: {
login: 'owner',
id: 7890,
node_id: 'MDQ6VXNlcjc4OTA=',
avatar_url: 'https://github.com/images/error/owner.gif',
html_url: 'https://github.com/owner',
owner_type: 'User',
},
},
sender: {
login: 'developer',
id: 5,
node_id: 'MDQ6VXNlcjU=',
avatar_url: 'https://github.com/images/error/developer.gif',
html_url: 'https://github.com/developer',
user_type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_push',
},
},
],
outputs: {

View File

@@ -111,238 +111,6 @@ export const githubReleasePublishedTrigger: TriggerConfig = {
value: 'github_release_published',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'published',
release: {
id: 123456789,
node_id: 'RE_kwDOABCDEF4HFGijkl',
tag_name: 'v1.0.0',
target_commitish: 'main',
name: 'v1.0.0 - Initial Release',
body: 'This is the first stable release of our project.\n\n## Features\n- Feature A\n- Feature B\n- Feature C\n\n## Bug Fixes\n- Fixed issue #123\n- Fixed issue #456',
draft: false,
prerelease: false,
created_at: '2025-01-15T10:00:00Z',
published_at: '2025-01-15T12:00:00Z',
url: 'https://api.github.com/repos/owner/repo-name/releases/123456789',
html_url: 'https://github.com/owner/repo-name/releases/tag/v1.0.0',
assets_url: 'https://api.github.com/repos/owner/repo-name/releases/123456789/assets',
upload_url:
'https://uploads.github.com/repos/owner/repo-name/releases/123456789/assets{?name,label}',
tarball_url: 'https://api.github.com/repos/owner/repo-name/tarball/v1.0.0',
zipball_url: 'https://api.github.com/repos/owner/repo-name/zipball/v1.0.0',
discussion_url: 'https://github.com/owner/repo-name/discussions/100',
author: {
login: 'releasemanager',
id: 12345,
node_id: 'MDQ6VXNlcjEyMzQ1',
avatar_url: 'https://avatars.githubusercontent.com/u/12345?v=4',
gravatar_id: '',
url: 'https://api.github.com/users/releasemanager',
html_url: 'https://github.com/releasemanager',
followers_url: 'https://api.github.com/users/releasemanager/followers',
following_url: 'https://api.github.com/users/releasemanager/following{/other_user}',
gists_url: 'https://api.github.com/users/releasemanager/gists{/gist_id}',
starred_url: 'https://api.github.com/users/releasemanager/starred{/owner}{/repo}',
subscriptions_url: 'https://api.github.com/users/releasemanager/subscriptions',
organizations_url: 'https://api.github.com/users/releasemanager/orgs',
repos_url: 'https://api.github.com/users/releasemanager/repos',
events_url: 'https://api.github.com/users/releasemanager/events{/privacy}',
received_events_url: 'https://api.github.com/users/releasemanager/received_events',
user_type: 'User',
site_admin: false,
},
assets: [
{
id: 987654321,
node_id: 'RA_kwDOABCDEF4DcXYZ',
name: 'release-v1.0.0-linux-amd64.tar.gz',
label: 'Linux AMD64 Binary',
content_type: 'application/gzip',
state: 'uploaded',
size: 15728640,
download_count: 42,
created_at: '2025-01-15T11:30:00Z',
updated_at: '2025-01-15T11:30:00Z',
browser_download_url:
'https://github.com/owner/repo-name/releases/download/v1.0.0/release-v1.0.0-linux-amd64.tar.gz',
url: 'https://api.github.com/repos/owner/repo-name/releases/assets/987654321',
uploader: {
login: 'releasemanager',
id: 12345,
node_id: 'MDQ6VXNlcjEyMzQ1',
avatar_url: 'https://avatars.githubusercontent.com/u/12345?v=4',
html_url: 'https://github.com/releasemanager',
user_type: 'User',
},
},
{
id: 987654322,
node_id: 'RA_kwDOABCDEF4DcXYa',
name: 'release-v1.0.0-darwin-amd64.tar.gz',
label: 'macOS AMD64 Binary',
content_type: 'application/gzip',
state: 'uploaded',
size: 14680064,
download_count: 28,
created_at: '2025-01-15T11:30:00Z',
updated_at: '2025-01-15T11:30:00Z',
browser_download_url:
'https://github.com/owner/repo-name/releases/download/v1.0.0/release-v1.0.0-darwin-amd64.tar.gz',
url: 'https://api.github.com/repos/owner/repo-name/releases/assets/987654322',
uploader: {
login: 'releasemanager',
id: 12345,
node_id: 'MDQ6VXNlcjEyMzQ1',
avatar_url: 'https://avatars.githubusercontent.com/u/12345?v=4',
html_url: 'https://github.com/releasemanager',
user_type: 'User',
},
},
],
},
repository: {
id: 123456,
node_id: 'R_kgDOABCDEF',
name: 'repo-name',
full_name: 'owner/repo-name',
private: false,
html_url: 'https://github.com/owner/repo-name',
repo_description: 'A sample repository for demonstrating GitHub release webhooks',
fork: false,
url: 'https://api.github.com/repos/owner/repo-name',
archive_url: 'https://api.github.com/repos/owner/repo-name/{archive_format}{/ref}',
assignees_url: 'https://api.github.com/repos/owner/repo-name/assignees{/user}',
blobs_url: 'https://api.github.com/repos/owner/repo-name/git/blobs{/sha}',
branches_url: 'https://api.github.com/repos/owner/repo-name/branches{/branch}',
collaborators_url:
'https://api.github.com/repos/owner/repo-name/collaborators{/collaborator}',
comments_url: 'https://api.github.com/repos/owner/repo-name/comments{/number}',
commits_url: 'https://api.github.com/repos/owner/repo-name/commits{/sha}',
compare_url: 'https://api.github.com/repos/owner/repo-name/compare/{base}...{head}',
contents_url: 'https://api.github.com/repos/owner/repo-name/contents/{+path}',
contributors_url: 'https://api.github.com/repos/owner/repo-name/contributors',
deployments_url: 'https://api.github.com/repos/owner/repo-name/deployments',
downloads_url: 'https://api.github.com/repos/owner/repo-name/downloads',
events_url: 'https://api.github.com/repos/owner/repo-name/events',
forks_url: 'https://api.github.com/repos/owner/repo-name/forks',
git_commits_url: 'https://api.github.com/repos/owner/repo-name/git/commits{/sha}',
git_refs_url: 'https://api.github.com/repos/owner/repo-name/git/refs{/sha}',
git_tags_url: 'https://api.github.com/repos/owner/repo-name/git/tags{/sha}',
hooks_url: 'https://api.github.com/repos/owner/repo-name/hooks',
issue_comment_url:
'https://api.github.com/repos/owner/repo-name/issues/comments{/number}',
issue_events_url: 'https://api.github.com/repos/owner/repo-name/issues/events{/number}',
issues_url: 'https://api.github.com/repos/owner/repo-name/issues{/number}',
keys_url: 'https://api.github.com/repos/owner/repo-name/keys{/key_id}',
labels_url: 'https://api.github.com/repos/owner/repo-name/labels{/name}',
languages_url: 'https://api.github.com/repos/owner/repo-name/languages',
merges_url: 'https://api.github.com/repos/owner/repo-name/merges',
milestones_url: 'https://api.github.com/repos/owner/repo-name/milestones{/number}',
notifications_url:
'https://api.github.com/repos/owner/repo-name/notifications{?since,all,participating}',
pulls_url: 'https://api.github.com/repos/owner/repo-name/pulls{/number}',
releases_url: 'https://api.github.com/repos/owner/repo-name/releases{/id}',
stargazers_url: 'https://api.github.com/repos/owner/repo-name/stargazers',
statuses_url: 'https://api.github.com/repos/owner/repo-name/statuses/{sha}',
subscribers_url: 'https://api.github.com/repos/owner/repo-name/subscribers',
subscription_url: 'https://api.github.com/repos/owner/repo-name/subscription',
tags_url: 'https://api.github.com/repos/owner/repo-name/tags',
teams_url: 'https://api.github.com/repos/owner/repo-name/teams',
trees_url: 'https://api.github.com/repos/owner/repo-name/git/trees{/sha}',
homepage: 'https://example.com',
size: 1024,
stargazers_count: 350,
watchers_count: 350,
language: 'TypeScript',
has_issues: true,
has_projects: true,
has_downloads: true,
has_wiki: true,
has_pages: false,
forks_count: 42,
mirror_url: null,
archived: false,
disabled: false,
open_issues_count: 12,
license: {
key: 'mit',
name: 'MIT License',
spdx_id: 'MIT',
url: 'https://api.github.com/licenses/mit',
node_id: 'MDc6TGljZW5zZTEz',
},
allow_forking: true,
is_template: false,
topics: ['javascript', 'typescript', 'nodejs'],
visibility: 'public',
forks: 42,
open_issues: 12,
watchers: 350,
default_branch: 'main',
created_at: '2020-01-01T00:00:00Z',
updated_at: '2025-01-15T12:00:00Z',
pushed_at: '2025-01-15T11:45:00Z',
owner: {
login: 'owner',
id: 7890,
node_id: 'MDQ6VXNlcjc4OTA=',
avatar_url: 'https://avatars.githubusercontent.com/u/7890?v=4',
gravatar_id: '',
url: 'https://api.github.com/users/owner',
html_url: 'https://github.com/owner',
followers_url: 'https://api.github.com/users/owner/followers',
following_url: 'https://api.github.com/users/owner/following{/other_user}',
gists_url: 'https://api.github.com/users/owner/gists{/gist_id}',
starred_url: 'https://api.github.com/users/owner/starred{/owner}{/repo}',
subscriptions_url: 'https://api.github.com/users/owner/subscriptions',
organizations_url: 'https://api.github.com/users/owner/orgs',
repos_url: 'https://api.github.com/users/owner/repos',
events_url: 'https://api.github.com/users/owner/events{/privacy}',
received_events_url: 'https://api.github.com/users/owner/received_events',
owner_type: 'User',
site_admin: false,
},
},
sender: {
login: 'releasemanager',
id: 12345,
node_id: 'MDQ6VXNlcjEyMzQ1',
avatar_url: 'https://avatars.githubusercontent.com/u/12345?v=4',
gravatar_id: '',
url: 'https://api.github.com/users/releasemanager',
html_url: 'https://github.com/releasemanager',
followers_url: 'https://api.github.com/users/releasemanager/followers',
following_url: 'https://api.github.com/users/releasemanager/following{/other_user}',
gists_url: 'https://api.github.com/users/releasemanager/gists{/gist_id}',
starred_url: 'https://api.github.com/users/releasemanager/starred{/owner}{/repo}',
subscriptions_url: 'https://api.github.com/users/releasemanager/subscriptions',
organizations_url: 'https://api.github.com/users/releasemanager/orgs',
repos_url: 'https://api.github.com/users/releasemanager/repos',
events_url: 'https://api.github.com/users/releasemanager/events{/privacy}',
received_events_url: 'https://api.github.com/users/releasemanager/received_events',
user_type: 'User',
site_admin: false,
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_release_published',
},
},
],
outputs: {

View File

@@ -108,60 +108,6 @@ export const githubWebhookTrigger: TriggerConfig = {
value: 'github_webhook',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'opened',
number: 1,
pull_request: {
id: 1,
number: 1,
state: 'open',
title: 'Update README',
user: {
login: 'octocat',
id: 1,
},
body: 'This is a pretty simple change that we need to pull into main.',
head: {
ref: 'feature-branch',
sha: 'abc123',
},
base: {
ref: 'main',
sha: 'def456',
},
},
repository: {
id: 35129377,
name: 'public-repo',
full_name: 'baxterthehacker/public-repo',
owner: {
login: 'baxterthehacker',
id: 6752317,
},
},
sender: {
login: 'baxterthehacker',
id: 6752317,
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_webhook',
},
},
],
outputs: {

View File

@@ -112,133 +112,6 @@ export const githubWorkflowRunTrigger: TriggerConfig = {
value: 'github_workflow_run',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'completed',
workflow_run: {
id: 30433642,
node_id: 'MDEyOldvcmtmbG93IFJ1bjI2OTI4OQ==',
name: 'Build',
workflow_id: 159038,
run_number: 562,
run_attempt: 1,
event: 'push',
status: 'completed',
conclusion: 'success',
head_branch: 'master',
head_sha: 'acb5820ced9479c074f688cc328bf03f341a511d',
path: '.github/workflows/build.yml',
display_title: 'Update README',
run_started_at: '2020-01-22T19:33:08Z',
created_at: '2020-01-22T19:33:08Z',
updated_at: '2020-01-22T19:33:08Z',
html_url: 'https://github.com/octo-org/octo-repo/actions/runs/30433642',
check_suite_id: 42,
check_suite_node_id: 'MDEwOkNoZWNrU3VpdGU0Mg==',
url: 'https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642',
actor: {
login: 'octocat',
id: 1,
node_id: 'MDQ6VXNlcjE=',
avatar_url: 'https://github.com/images/error/octocat_happy.gif',
html_url: 'https://github.com/octocat',
type: 'User',
},
triggering_actor: {
login: 'octocat',
id: 1,
node_id: 'MDQ6VXNlcjE=',
avatar_url: 'https://github.com/images/error/octocat_happy.gif',
html_url: 'https://github.com/octocat',
type: 'User',
},
repository: {
id: 1296269,
node_id: 'MDEwOlJlcG9zaXRvcnkxMjk2MjY5',
name: 'Hello-World',
full_name: 'octocat/Hello-World',
private: false,
},
head_repository: {
id: 1296269,
node_id: 'MDEwOlJlcG9zaXRvcnkxMjk2MjY5',
name: 'Hello-World',
full_name: 'octocat/Hello-World',
private: false,
},
head_commit: {
id: 'acb5820ced9479c074f688cc328bf03f341a511d',
tree_id: 'd23f6eedb1e1b34603681f77168dc1c4',
message: 'Update README.md',
timestamp: '2020-01-22T19:33:05Z',
author: {
name: 'Octo Cat',
email: 'octocat@github.com',
},
committer: {
name: 'GitHub',
email: 'noreply@github.com',
},
},
pull_requests: [],
referenced_workflows: [],
},
workflow: {
id: 159038,
node_id: 'MDg6V29ya2Zsb3cxNTkwMzg=',
name: 'Build',
path: '.github/workflows/build.yml',
state: 'active',
created_at: '2020-01-08T23:48:37.000-08:00',
updated_at: '2020-01-08T23:50:21.000-08:00',
url: 'https://api.github.com/repos/octo-org/octo-repo/actions/workflows/159038',
html_url:
'https://github.com/octo-org/octo-repo/blob/master/.github/workflows/build.yml',
badge_url: 'https://github.com/octo-org/octo-repo/workflows/Build/badge.svg',
},
repository: {
id: 1296269,
node_id: 'MDEwOlJlcG9zaXRvcnkxMjk2MjY5',
name: 'Hello-World',
full_name: 'octocat/Hello-World',
html_url: 'https://github.com/octocat/Hello-World',
description: 'This your first repo!',
private: false,
owner: {
login: 'octocat',
id: 1,
node_id: 'MDQ6VXNlcjE=',
avatar_url: 'https://github.com/images/error/octocat_happy.gif',
html_url: 'https://github.com/octocat',
type: 'User',
},
},
sender: {
login: 'octocat',
id: 1,
node_id: 'MDQ6VXNlcjE=',
avatar_url: 'https://github.com/images/error/octocat_happy.gif',
html_url: 'https://github.com/octocat',
type: 'User',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'github_workflow_run',
},
},
],
outputs: {

View File

@@ -125,39 +125,6 @@ export const gmailPollingTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'gmail_poller',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
email: {
id: '18e0ffabd5b5a0f4',
threadId: '18e0ffabd5b5a0f4',
subject: 'Monthly Report - April 2025',
from: 'sender@example.com',
to: 'recipient@example.com',
cc: 'team@example.com',
date: '2025-05-10T10:15:23.000Z',
bodyText:
'Hello,\n\nPlease find attached the monthly report for April 2025.\n\nBest regards,\nSender',
bodyHtml:
'<div><p>Hello,</p><p>Please find attached the monthly report for April 2025.</p><p>Best regards,<br>Sender</p></div>',
labels: ['INBOX', 'IMPORTANT'],
hasAttachments: true,
attachments: [],
},
timestamp: '2025-05-10T10:15:30.123Z',
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -151,33 +151,6 @@ export const googleFormsWebhookTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'google_forms_webhook',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
provider: 'google_forms',
formId: '1FAIpQLSdEXAMPLE',
responseId: 'R_12345',
createTime: '2025-01-01T12:00:00.000Z',
lastSubmittedTime: '2025-01-01T12:00:00.000Z',
answers: {
'What is your name?': 'Ada Lovelace',
Languages: ['TypeScript', 'Python'],
'Subscribed?': true,
},
raw: { any: 'original payload from Apps Script if included' },
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -1,20 +1,59 @@
import { generateMockPayloadFromOutputsDefinition } from '@/lib/workflows/trigger-utils'
import type { SubBlockConfig } from '@/blocks/types'
import { TRIGGER_REGISTRY } from '@/triggers/registry'
import type { TriggerConfig } from '@/triggers/types'
/**
* Gets a trigger config and injects samplePayload subblock with condition
* The condition assumes the trigger will be used in a multi-trigger block
*/
export function getTrigger(triggerId: string): TriggerConfig {
const trigger = TRIGGER_REGISTRY[triggerId]
if (!trigger) {
throw new Error(`Trigger not found: ${triggerId}`)
}
return trigger
const clonedTrigger = { ...trigger, subBlocks: [...trigger.subBlocks] }
// Inject samplePayload for webhooks/pollers with condition
if (trigger.webhook || trigger.id.includes('webhook') || trigger.id.includes('poller')) {
const samplePayloadExists = clonedTrigger.subBlocks.some((sb) => sb.id === 'samplePayload')
if (!samplePayloadExists && trigger.outputs) {
const mockPayload = generateMockPayloadFromOutputsDefinition(trigger.outputs)
const generatedPayload = JSON.stringify(mockPayload, null, 2)
const samplePayloadSubBlock: SubBlockConfig = {
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: generatedPayload,
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: trigger.id,
},
}
clonedTrigger.subBlocks.push(samplePayloadSubBlock)
}
}
return clonedTrigger
}
export function getTriggersByProvider(provider: string): TriggerConfig[] {
return Object.values(TRIGGER_REGISTRY).filter((trigger) => trigger.provider === provider)
return Object.values(TRIGGER_REGISTRY)
.filter((trigger) => trigger.provider === provider)
.map((trigger) => getTrigger(trigger.id))
}
export function getAllTriggers(): TriggerConfig[] {
return Object.values(TRIGGER_REGISTRY)
return Object.keys(TRIGGER_REGISTRY).map((triggerId) => getTrigger(triggerId))
}
export function getTriggerIds(): string[] {

View File

@@ -78,81 +78,6 @@ export const jiraIssueCommentedTrigger: TriggerConfig = {
value: 'jira_issue_commented',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
timestamp: 1234567890000,
webhookEvent: 'comment_created',
issue: {
id: '10001',
key: 'PROJ-123',
self: 'https://your-domain.atlassian.net/rest/api/2/issue/10001',
fields: {
summary: 'Bug needs investigation',
status: {
name: 'In Progress',
id: '10001',
statusCategory: {
key: 'indeterminate',
name: 'In Progress',
},
},
priority: {
name: 'High',
id: '2',
},
assignee: {
displayName: 'John Doe',
accountId: '557058:a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6',
emailAddress: 'john.doe@example.com',
},
reporter: {
displayName: 'Jane Smith',
accountId: '557058:b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7',
emailAddress: 'jane.smith@example.com',
},
project: {
key: 'PROJ',
name: 'Project Name',
id: '10000',
},
issuetype: {
name: 'Bug',
id: '10004',
},
created: '2024-01-15T10:30:00.000+0000',
updated: '2024-01-15T15:45:00.000+0000',
labels: ['backend', 'urgent'],
},
},
comment: {
id: '10050',
body: 'I found the root cause. The issue is in the authentication service.',
author: {
displayName: 'John Doe',
accountId: '557058:a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6',
emailAddress: 'john.doe@example.com',
},
created: '2024-01-15T15:45:00.000+0000',
updated: '2024-01-15T15:45:00.000+0000',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'jira_issue_commented',
},
},
],
outputs: buildCommentOutputs(),

View File

@@ -87,71 +87,6 @@ export const jiraIssueCreatedTrigger: TriggerConfig = {
value: 'jira_issue_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
timestamp: 1234567890000,
webhookEvent: 'jira:issue_created',
issue_event_type_name: 'issue_created',
issue: {
id: '10001',
key: 'PROJ-123',
self: 'https://your-domain.atlassian.net/rest/api/2/issue/10001',
fields: {
summary: 'New bug reported in production',
status: {
name: 'To Do',
id: '10000',
statusCategory: {
key: 'new',
name: 'To Do',
},
},
priority: {
name: 'High',
id: '2',
},
assignee: {
displayName: 'John Doe',
accountId: '557058:a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6',
emailAddress: 'john.doe@example.com',
},
reporter: {
displayName: 'Jane Smith',
accountId: '557058:b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7',
emailAddress: 'jane.smith@example.com',
},
project: {
key: 'PROJ',
name: 'Project Name',
id: '10000',
},
issuetype: {
name: 'Bug',
id: '10004',
},
created: '2024-01-15T10:30:00.000+0000',
updated: '2024-01-15T10:30:00.000+0000',
labels: ['backend', 'urgent'],
},
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'jira_issue_created',
},
},
],
outputs: buildIssueOutputs(),

View File

@@ -78,71 +78,6 @@ export const jiraIssueDeletedTrigger: TriggerConfig = {
value: 'jira_issue_deleted',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
timestamp: 1234567890000,
webhookEvent: 'jira:issue_deleted',
issue_event_type_name: 'issue_deleted',
issue: {
id: '10001',
key: 'PROJ-123',
self: 'https://your-domain.atlassian.net/rest/api/2/issue/10001',
fields: {
summary: 'Duplicate issue - deleted',
status: {
name: 'Done',
id: '10002',
statusCategory: {
key: 'done',
name: 'Done',
},
},
priority: {
name: 'Low',
id: '4',
},
assignee: {
displayName: 'John Doe',
accountId: '557058:a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6',
emailAddress: 'john.doe@example.com',
},
reporter: {
displayName: 'Jane Smith',
accountId: '557058:b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7',
emailAddress: 'jane.smith@example.com',
},
project: {
key: 'PROJ',
name: 'Project Name',
id: '10000',
},
issuetype: {
name: 'Bug',
id: '10004',
},
created: '2024-01-15T10:30:00.000+0000',
updated: '2024-01-15T17:00:00.000+0000',
labels: ['duplicate'],
},
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'jira_issue_deleted',
},
},
],
outputs: buildIssueOutputs(),

View File

@@ -92,84 +92,6 @@ export const jiraIssueUpdatedTrigger: TriggerConfig = {
value: 'jira_issue_updated',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
timestamp: 1234567890000,
webhookEvent: 'jira:issue_updated',
issue_event_type_name: 'issue_updated',
issue: {
id: '10001',
key: 'PROJ-123',
self: 'https://your-domain.atlassian.net/rest/api/2/issue/10001',
fields: {
summary: 'Bug fix in progress',
status: {
name: 'In Progress',
id: '10001',
statusCategory: {
key: 'indeterminate',
name: 'In Progress',
},
},
priority: {
name: 'High',
id: '2',
},
assignee: {
displayName: 'John Doe',
accountId: '557058:a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6',
emailAddress: 'john.doe@example.com',
},
reporter: {
displayName: 'Jane Smith',
accountId: '557058:b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7',
emailAddress: 'jane.smith@example.com',
},
project: {
key: 'PROJ',
name: 'Project Name',
id: '10000',
},
issuetype: {
name: 'Bug',
id: '10004',
},
created: '2024-01-15T10:30:00.000+0000',
updated: '2024-01-15T14:25:00.000+0000',
labels: ['backend', 'urgent'],
},
},
changelog: {
id: '12345',
items: [
{
field: 'status',
fieldtype: 'jira',
from: '10000',
fromString: 'To Do',
to: '10001',
toString: 'In Progress',
},
],
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'jira_issue_updated',
},
},
],
outputs: buildIssueUpdatedOutputs(),

View File

@@ -65,71 +65,6 @@ export const jiraWebhookTrigger: TriggerConfig = {
value: 'jira_webhook',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
timestamp: 1234567890000,
webhookEvent: 'jira:issue_created',
issue_event_type_name: 'issue_created',
issue: {
id: '10001',
key: 'PROJ-123',
self: 'https://your-domain.atlassian.net/rest/api/2/issue/10001',
fields: {
summary: 'Sample issue title',
status: {
name: 'To Do',
id: '10000',
statusCategory: {
key: 'new',
name: 'To Do',
},
},
priority: {
name: 'Medium',
id: '3',
},
assignee: {
displayName: 'John Doe',
accountId: '557058:a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6',
emailAddress: 'john.doe@example.com',
},
reporter: {
displayName: 'Jane Smith',
accountId: '557058:b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7',
emailAddress: 'jane.smith@example.com',
},
project: {
key: 'PROJ',
name: 'Project Name',
id: '10000',
},
issuetype: {
name: 'Task',
id: '10002',
},
created: '2024-01-15T10:30:00.000+0000',
updated: '2024-01-15T10:30:00.000+0000',
labels: ['backend', 'bug'],
},
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'jira_webhook',
},
},
],
outputs: {

View File

@@ -78,82 +78,6 @@ export const jiraWorklogCreatedTrigger: TriggerConfig = {
value: 'jira_worklog_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
timestamp: 1234567890000,
webhookEvent: 'worklog_created',
issue: {
id: '10001',
key: 'PROJ-123',
self: 'https://your-domain.atlassian.net/rest/api/2/issue/10001',
fields: {
summary: 'Implement new feature',
status: {
name: 'In Progress',
id: '10001',
statusCategory: {
key: 'indeterminate',
name: 'In Progress',
},
},
priority: {
name: 'Medium',
id: '3',
},
assignee: {
displayName: 'John Doe',
accountId: '557058:a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6',
emailAddress: 'john.doe@example.com',
},
reporter: {
displayName: 'Jane Smith',
accountId: '557058:b2c3d4e5-6f7g-8h9i-0j1k-l2m3n4o5p6q7',
emailAddress: 'jane.smith@example.com',
},
project: {
key: 'PROJ',
name: 'Project Name',
id: '10000',
},
issuetype: {
name: 'Task',
id: '10002',
},
created: '2024-01-15T10:30:00.000+0000',
updated: '2024-01-15T16:20:00.000+0000',
labels: ['feature', 'sprint-1'],
},
},
worklog: {
id: '10200',
author: {
displayName: 'John Doe',
accountId: '557058:a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6',
emailAddress: 'john.doe@example.com',
},
timeSpent: '3h 30m',
timeSpentSeconds: 12600,
comment: 'Completed initial implementation and testing',
started: '2024-01-15T13:00:00.000+0000',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'jira_worklog_created',
},
},
],
outputs: buildWorklogOutputs(),

View File

@@ -61,48 +61,6 @@ export const linearCommentCreatedTrigger: TriggerConfig = {
value: 'linear_comment_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'create',
type: 'Comment',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T13:00:00.000Z',
actor: {
id: 'user_234',
type: 'user',
name: 'Jane Smith',
},
data: {
id: 'comment_xyz789',
body: 'I think we should also add support for Microsoft SSO in this implementation.',
url: 'https://linear.app/acme/issue/ENG-123#comment-xyz789',
issueId: 'issue_abc123',
userId: 'user_234',
editedAt: null,
createdAt: '2025-11-06T13:00:00.000Z',
updatedAt: '2025-11-06T13:00:00.000Z',
archivedAt: null,
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_comment_created',
},
},
],
outputs: buildCommentOutputs(),

View File

@@ -61,53 +61,6 @@ export const linearCommentUpdatedTrigger: TriggerConfig = {
value: 'linear_comment_updated',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'update',
type: 'Comment',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937900000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T13:05:00.000Z',
actor: {
id: 'user_234',
type: 'user',
name: 'Jane Smith',
},
data: {
id: 'comment_xyz789',
body: 'I think we should also add support for Microsoft SSO and Apple Sign-In in this implementation.',
url: 'https://linear.app/acme/issue/ENG-123#comment-xyz789',
issueId: 'issue_abc123',
userId: 'user_234',
editedAt: '2025-11-06T13:05:00.000Z',
createdAt: '2025-11-06T13:00:00.000Z',
updatedAt: '2025-11-06T13:05:00.000Z',
archivedAt: null,
},
updatedFrom: {
body: 'I think we should also add support for Microsoft SSO in this implementation.',
editedAt: null,
updatedAt: '2025-11-06T13:00:00.000Z',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_comment_updated',
},
},
],
outputs: buildCommentOutputs(),

View File

@@ -61,50 +61,6 @@ export const linearCustomerRequestCreatedTrigger: TriggerConfig = {
value: 'linear_customer_request_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'create',
type: 'CustomerNeed',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T12:00:00.000Z',
actor: {
id: 'user_123',
name: 'John Doe',
type: 'user',
},
data: {
id: 'customer_need_abc123',
body: 'We need a feature to export data in CSV format',
priority: 1,
customerId: 'customer_456',
issueId: 'issue_789',
projectId: 'project_567',
creatorId: 'user_123',
url: 'https://linear.app/acme/customer-needs/customer_need_abc123',
createdAt: '2025-11-06T12:00:00.000Z',
updatedAt: '2025-11-06T12:00:00.000Z',
archivedAt: null,
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_customer_request_created',
},
},
],
outputs: buildCustomerRequestOutputs(),

View File

@@ -61,54 +61,6 @@ export const linearCustomerRequestUpdatedTrigger: TriggerConfig = {
value: 'linear_customer_request_updated',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'update',
type: 'CustomerNeed',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T12:00:00.000Z',
actor: {
id: 'user_123',
name: 'John Doe',
type: 'user',
},
data: {
id: 'customer_need_abc123',
body: 'We need a feature to export data in CSV and JSON formats',
priority: 1,
customerId: 'customer_456',
issueId: 'issue_789',
projectId: 'project_567',
creatorId: 'user_123',
url: 'https://linear.app/acme/customer-needs/customer_need_abc123',
createdAt: '2025-11-06T12:00:00.000Z',
updatedAt: '2025-11-06T12:15:00.000Z',
archivedAt: null,
},
updatedFrom: {
body: 'We need a feature to export data in CSV format',
updatedAt: '2025-11-06T12:00:00.000Z',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_customer_request_updated',
},
},
],
outputs: buildCustomerRequestOutputs(),

View File

@@ -61,55 +61,6 @@ export const linearCycleCreatedTrigger: TriggerConfig = {
value: 'linear_cycle_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'create',
type: 'Cycle',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T09:00:00.000Z',
actor: {
id: 'user_123',
type: 'user',
name: 'John Doe',
},
data: {
id: 'cycle_890',
number: 12,
name: 'Cycle 12',
description: 'November 2025 sprint',
teamId: 'team_456',
startsAt: '2025-11-04T00:00:00.000Z',
endsAt: '2025-11-17T23:59:59.000Z',
completedAt: null,
archivedAt: null,
autoArchivedAt: null,
createdAt: '2025-11-06T09:00:00.000Z',
updatedAt: '2025-11-06T09:00:00.000Z',
progress: 0,
scopeHistory: [],
completedScopeHistory: [],
inProgressScopeHistory: [],
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_cycle_created',
},
},
],
outputs: buildCycleOutputs(),

View File

@@ -61,60 +61,6 @@ export const linearCycleUpdatedTrigger: TriggerConfig = {
value: 'linear_cycle_updated',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'update',
type: 'Cycle',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730997600000,
organizationId: 'org_abc123',
createdAt: '2025-11-18T00:00:00.000Z',
actor: {
id: 'user_123',
type: 'user',
name: 'John Doe',
},
data: {
id: 'cycle_890',
number: 12,
name: 'Cycle 12',
description: 'November 2025 sprint - Completed successfully!',
teamId: 'team_456',
startsAt: '2025-11-04T00:00:00.000Z',
endsAt: '2025-11-17T23:59:59.000Z',
completedAt: '2025-11-18T00:00:00.000Z',
archivedAt: null,
autoArchivedAt: null,
createdAt: '2025-11-06T09:00:00.000Z',
updatedAt: '2025-11-18T00:00:00.000Z',
progress: 1,
scopeHistory: [5, 8, 8],
completedScopeHistory: [0, 3, 8],
inProgressScopeHistory: [2, 3, 0],
},
updatedFrom: {
description: 'November 2025 sprint',
completedAt: null,
updatedAt: '2025-11-06T09:00:00.000Z',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_cycle_updated',
},
},
],
outputs: buildCycleOutputs(),

View File

@@ -70,70 +70,6 @@ export const linearIssueCreatedTrigger: TriggerConfig = {
value: 'linear_issue_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'create',
type: 'Issue',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T12:00:00.000Z',
actor: {
id: 'user_123',
type: 'user',
name: 'John Doe',
},
data: {
id: 'issue_abc123',
title: 'Implement user authentication',
description: 'Add OAuth2 authentication flow for user login',
identifier: 'ENG-123',
number: 123,
priority: 2,
estimate: 5,
sortOrder: 1000.5,
teamId: 'team_456',
stateId: 'state_789',
assigneeId: 'user_234',
creatorId: 'user_123',
projectId: 'project_567',
cycleId: 'cycle_890',
parentId: null,
labelIds: ['label_111', 'label_222'],
subscriberIds: ['user_123', 'user_234'],
url: 'https://linear.app/acme/issue/ENG-123',
branchName: 'eng-123-implement-user-authentication',
customerTicketCount: 2,
dueDate: '2025-11-15',
snoozedUntilAt: null,
archivedAt: null,
canceledAt: null,
completedAt: null,
startedAt: null,
triagedAt: '2025-11-06T12:00:00.000Z',
createdAt: '2025-11-06T12:00:00.000Z',
updatedAt: '2025-11-06T12:00:00.000Z',
autoArchivedAt: null,
autoClosedAt: null,
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_issue_created',
},
},
],
outputs: buildIssueOutputs(),

View File

@@ -61,70 +61,6 @@ export const linearIssueRemovedTrigger: TriggerConfig = {
value: 'linear_issue_removed',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'remove',
type: 'Issue',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T15:00:00.000Z',
actor: {
id: 'user_123',
type: 'user',
name: 'John Doe',
},
data: {
id: 'issue_abc123',
title: 'Implement user authentication',
description: 'Add OAuth2 authentication flow for user login with Google and GitHub',
identifier: 'ENG-123',
number: 123,
priority: 1,
estimate: 8,
sortOrder: 1000.5,
teamId: 'team_456',
stateId: 'state_started',
assigneeId: 'user_234',
creatorId: 'user_123',
projectId: 'project_567',
cycleId: 'cycle_890',
parentId: null,
labelIds: ['label_111', 'label_222', 'label_333'],
subscriberIds: ['user_123', 'user_234', 'user_345'],
url: 'https://linear.app/acme/issue/ENG-123',
branchName: 'eng-123-implement-user-authentication',
customerTicketCount: 3,
dueDate: '2025-11-15',
snoozedUntilAt: null,
archivedAt: '2025-11-06T15:00:00.000Z',
canceledAt: null,
completedAt: null,
startedAt: '2025-11-06T12:30:00.000Z',
triagedAt: '2025-11-06T12:00:00.000Z',
createdAt: '2025-11-06T12:00:00.000Z',
updatedAt: '2025-11-06T15:00:00.000Z',
autoArchivedAt: null,
autoClosedAt: null,
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_issue_removed',
},
},
],
outputs: buildIssueOutputs(),

View File

@@ -61,79 +61,6 @@ export const linearIssueUpdatedTrigger: TriggerConfig = {
value: 'linear_issue_updated',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'update',
type: 'Issue',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T12:30:00.000Z',
actor: {
id: 'user_234',
type: 'user',
name: 'Jane Smith',
},
data: {
id: 'issue_abc123',
title: 'Implement user authentication',
description: 'Add OAuth2 authentication flow for user login with Google and GitHub',
identifier: 'ENG-123',
number: 123,
priority: 1,
estimate: 8,
sortOrder: 1000.5,
teamId: 'team_456',
stateId: 'state_started',
assigneeId: 'user_234',
creatorId: 'user_123',
projectId: 'project_567',
cycleId: 'cycle_890',
parentId: null,
labelIds: ['label_111', 'label_222', 'label_333'],
subscriberIds: ['user_123', 'user_234', 'user_345'],
url: 'https://linear.app/acme/issue/ENG-123',
branchName: 'eng-123-implement-user-authentication',
customerTicketCount: 3,
dueDate: '2025-11-15',
snoozedUntilAt: null,
archivedAt: null,
canceledAt: null,
completedAt: null,
startedAt: '2025-11-06T12:30:00.000Z',
triagedAt: '2025-11-06T12:00:00.000Z',
createdAt: '2025-11-06T12:00:00.000Z',
updatedAt: '2025-11-06T12:30:00.000Z',
autoArchivedAt: null,
autoClosedAt: null,
},
updatedFrom: {
priority: 2,
estimate: 5,
stateId: 'state_789',
assigneeId: 'user_123',
description: 'Add OAuth2 authentication flow for user login',
startedAt: null,
updatedAt: '2025-11-06T12:00:00.000Z',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_issue_updated',
},
},
],
outputs: buildIssueOutputs(),

View File

@@ -61,50 +61,6 @@ export const linearLabelCreatedTrigger: TriggerConfig = {
value: 'linear_label_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'create',
type: 'IssueLabel',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T11:00:00.000Z',
actor: {
id: 'user_123',
type: 'user',
name: 'John Doe',
},
data: {
id: 'label_333',
name: 'security',
description: 'Security-related issues',
color: '#ff0000',
teamId: 'team_456',
creatorId: 'user_123',
isGroup: false,
parentId: null,
archivedAt: null,
createdAt: '2025-11-06T11:00:00.000Z',
updatedAt: '2025-11-06T11:00:00.000Z',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_label_created',
},
},
],
outputs: buildLabelOutputs(),

View File

@@ -61,55 +61,6 @@ export const linearLabelUpdatedTrigger: TriggerConfig = {
value: 'linear_label_updated',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'update',
type: 'IssueLabel',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730938800000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T11:20:00.000Z',
actor: {
id: 'user_234',
type: 'user',
name: 'Jane Smith',
},
data: {
id: 'label_333',
name: 'security',
description: 'Security and vulnerability-related issues',
color: '#ff3333',
teamId: 'team_456',
creatorId: 'user_123',
isGroup: false,
parentId: null,
archivedAt: null,
createdAt: '2025-11-06T11:00:00.000Z',
updatedAt: '2025-11-06T11:20:00.000Z',
},
updatedFrom: {
description: 'Security-related issues',
color: '#ff0000',
updatedAt: '2025-11-06T11:00:00.000Z',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_label_updated',
},
},
],
outputs: buildLabelOutputs(),

View File

@@ -61,65 +61,6 @@ export const linearProjectCreatedTrigger: TriggerConfig = {
value: 'linear_project_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'create',
type: 'Project',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T10:00:00.000Z',
actor: {
id: 'user_123',
type: 'user',
name: 'John Doe',
},
data: {
id: 'project_567',
name: 'Q4 Authentication Improvements',
description: 'Comprehensive authentication and security improvements for Q4 2025',
icon: '🔐',
color: '#4285F4',
state: 'planned',
slugId: 'q4-auth',
url: 'https://linear.app/acme/project/q4-auth',
leadId: 'user_123',
creatorId: 'user_123',
memberIds: ['user_123', 'user_234', 'user_345'],
teamIds: ['team_456'],
priority: 1,
sortOrder: 100.5,
startDate: '2025-10-01',
targetDate: '2025-12-31',
startedAt: null,
completedAt: null,
canceledAt: null,
archivedAt: null,
createdAt: '2025-11-06T10:00:00.000Z',
updatedAt: '2025-11-06T10:00:00.000Z',
progress: 0,
scope: 0,
statusId: 'status_planned',
bodyData: null,
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_project_created',
},
},
],
outputs: buildProjectOutputs(),

View File

@@ -61,48 +61,6 @@ export const linearProjectUpdateCreatedTrigger: TriggerConfig = {
value: 'linear_project_update_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'create',
type: 'ProjectUpdate',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T16:00:00.000Z',
actor: {
id: 'user_234',
type: 'user',
name: 'Jane Smith',
},
data: {
id: 'update_pqr456',
body: 'Great progress this week! We completed the OAuth2 implementation and started on SSO integration. All tests passing.',
url: 'https://linear.app/acme/project/q4-auth/updates/pqr456',
projectId: 'project_567',
userId: 'user_234',
health: 'onTrack',
editedAt: null,
createdAt: '2025-11-06T16:00:00.000Z',
updatedAt: '2025-11-06T16:00:00.000Z',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_project_update_created',
},
},
],
outputs: buildProjectUpdateOutputs(),

View File

@@ -61,74 +61,6 @@ export const linearProjectUpdatedTrigger: TriggerConfig = {
value: 'linear_project_updated',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'update',
type: 'Project',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730940000000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T14:00:00.000Z',
actor: {
id: 'user_234',
type: 'user',
name: 'Jane Smith',
},
data: {
id: 'project_567',
name: 'Q4 Authentication Improvements',
description:
'Comprehensive authentication and security improvements for Q4 2025, including SSO integration',
icon: '🔐',
color: '#4285F4',
state: 'started',
slugId: 'q4-auth',
url: 'https://linear.app/acme/project/q4-auth',
leadId: 'user_234',
creatorId: 'user_123',
memberIds: ['user_123', 'user_234', 'user_345', 'user_456'],
teamIds: ['team_456', 'team_789'],
priority: 0,
sortOrder: 100.5,
startDate: '2025-10-01',
targetDate: '2025-12-31',
startedAt: '2025-11-06T14:00:00.000Z',
completedAt: null,
canceledAt: null,
archivedAt: null,
createdAt: '2025-11-06T10:00:00.000Z',
updatedAt: '2025-11-06T14:00:00.000Z',
progress: 0.35,
scope: 8,
statusId: 'status_in_progress',
bodyData: null,
},
updatedFrom: {
description: 'Comprehensive authentication and security improvements for Q4 2025',
state: 'planned',
leadId: 'user_123',
priority: 1,
startedAt: null,
updatedAt: '2025-11-06T10:00:00.000Z',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_project_updated',
},
},
],
outputs: buildProjectOutputs(),

View File

@@ -64,44 +64,6 @@ export const linearWebhookTrigger: TriggerConfig = {
value: 'linear_webhook',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
action: 'create',
type: 'Issue',
webhookId: '550e8400-e29b-41d4-a716-446655440000',
webhookTimestamp: 1730937600000,
organizationId: 'org_abc123',
createdAt: '2025-11-06T12:00:00.000Z',
actor: {
id: 'user_123',
type: 'user',
name: 'John Doe',
},
data: {
id: 'entity_id',
// ... entity-specific fields
},
updatedFrom: {
// ... previous values (only present on update actions)
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'linear_webhook',
},
},
],
outputs: {

View File

@@ -82,32 +82,6 @@ export const microsoftTeamsChatSubscriptionTrigger: TriggerConfig = {
value: 'microsoftteams_chat_subscription',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
message_id: '1708709741557',
chat_id: '19:abcxyz@unq.gbl.spaces',
from_name: 'Adele Vance',
text: 'Hello from Teams!',
created_at: '2025-01-01T10:00:00Z',
attachments: [],
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'microsoftteams_chat_subscription',
},
},
],
outputs: {

View File

@@ -86,40 +86,6 @@ export const microsoftTeamsWebhookTrigger: TriggerConfig = {
value: 'microsoftteams_webhook',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
type: 'message',
id: '1234567890',
timestamp: '2023-01-01T00:00:00.000Z',
localTimestamp: '2023-01-01T00:00:00.000Z',
serviceUrl: 'https://smba.trafficmanager.net/amer/',
channelId: 'msteams',
from: {
id: '29:1234567890abcdef',
name: 'John Doe',
},
conversation: {
id: '19:meeting_abcdef@thread.v2',
},
text: 'Hello Sim Bot!',
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'microsoftteams_webhook',
},
},
],
outputs: {

View File

@@ -115,42 +115,6 @@ export const outlookPollingTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'outlook_poller',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
email: {
id: 'AAMkADg1OWUyZjg4LWJkNGYtNDFhYy04OGVjLWVkM2VhY2YzYTcwZgBGAAAAAACE3bU',
conversationId: 'AAQkADg1OWUyZjg4LWJkNGYtNDFhYy04OGVjLWVkM2VhY2YzYTcwZgAQAErzGBJV',
subject: 'Quarterly Business Review - Q1 2025',
from: 'manager@company.com',
to: 'team@company.com',
cc: 'stakeholders@company.com',
date: '2025-05-10T14:30:00Z',
bodyText:
'Hi Team,\n\nPlease find attached the Q1 2025 business review document. We need to discuss the results in our next meeting.\n\nBest regards,\nManager',
bodyHtml:
'<div><p>Hi Team,</p><p>Please find attached the Q1 2025 business review document. We need to discuss the results in our next meeting.</p><p>Best regards,<br>Manager</p></div>',
hasAttachments: true,
attachments: [],
isRead: false,
folderId: 'AQMkADg1OWUyZjg4LWJkNGYtNDFhYy04OGVjAC4AAAJzE3bU',
messageId: 'AAMkADg1OWUyZjg4LWJkNGYtNDFhYy04OGVjLWVkM2VhY2YzYTcwZgBGAAAAAACE3bU',
threadId: 'AAQkADg1OWUyZjg4LWJkNGYtNDFhYy04OGVjLWVkM2VhY2YzYTcwZgAQAErzGBJV',
},
timestamp: '2025-05-10T14:30:15.123Z',
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -57,35 +57,6 @@ export const slackWebhookTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'slack_webhook',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
type: 'event_callback',
event: {
type: 'app_mention',
channel: 'C0123456789',
user: 'U0123456789',
text: '<@U0BOTUSER123> Hello from Slack!',
ts: '1234567890.123456',
thread_ts: '1234567890.000000',
channel_type: 'channel',
},
team_id: 'T0123456789',
event_id: 'Ev0123456789',
event_time: 1234567890,
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -193,51 +193,6 @@ export const stripeWebhookTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'stripe_webhook',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
id: 'evt_1234567890abcdef',
object: 'event',
api_version: '2023-10-16',
created: 1677649261,
type: 'payment_intent.succeeded',
livemode: false,
data: {
object: {
id: 'pi_1234567890abcdef',
object: 'payment_intent',
amount: 2500,
amount_capturable: 0,
amount_received: 2500,
currency: 'usd',
customer: 'cus_1234567890abcdef',
description: 'Example payment',
metadata: {
order_id: '6735',
},
payment_method: 'pm_1234567890abcdef',
receipt_email: 'customer@example.com',
status: 'succeeded',
},
},
pending_webhooks: 1,
request: {
id: 'req_1234567890abcdef',
idempotency_key: '00000000-0000-0000-0000-000000000000',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -53,50 +53,6 @@ export const telegramWebhookTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'telegram_webhook',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
update_id: 123456789,
message: {
message_id: 123,
from: {
id: 987654321,
is_bot: false,
first_name: 'John',
last_name: 'Doe',
username: 'johndoe',
language_code: 'en',
},
chat: {
id: 987654321,
first_name: 'John',
last_name: 'Doe',
username: 'johndoe',
type: 'private',
},
date: 1234567890,
text: 'Hello from Telegram!',
entities: [
{
offset: 0,
length: 5,
type: 'bold',
},
],
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -75,39 +75,6 @@ export const twilioVoiceWebhookTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'twilio_voice_webhook',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
CallSid: 'CA_NOT_A_REAL_SID',
AccountSid: 'AC_NOT_A_REAL_SID',
From: '+14155551234',
To: '+14155556789',
CallStatus: 'ringing',
ApiVersion: '2010-04-01',
Direction: 'inbound',
ForwardedFrom: '',
CallerName: 'John Doe',
FromCity: 'SAN FRANCISCO',
FromState: 'CA',
FromZip: '94105',
FromCountry: 'US',
ToCity: 'SAN FRANCISCO',
ToState: 'CA',
ToZip: '94105',
ToCountry: 'US',
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -87,155 +87,6 @@ export const typeformWebhookTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'typeform_webhook',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
event_id: '01HQZYX5K2F4G8H9J0K1L2M3N4',
event_type: 'form_response',
form_response: {
form_id: 'ABC123',
token: 'def456ghi789jkl012',
submitted_at: '2025-01-15T10:30:00Z',
landed_at: '2025-01-15T10:28:45Z',
calculated: {
score: 85,
},
variables: [
{
key: 'score',
type: 'number',
number: 4,
},
{
key: 'name',
type: 'text',
text: 'typeform',
},
],
hidden: {
utm_source: 'newsletter',
utm_campaign: 'spring_2025',
},
answers: [
{
type: 'text',
text: 'John Doe',
field: {
id: 'abc123',
type: 'short_text',
ref: 'name_field',
},
},
{
type: 'email',
email: 'john@example.com',
field: {
id: 'def456',
type: 'email',
ref: 'email_field',
},
},
{
type: 'choice',
choice: {
id: 'meFVw3iGRxZB',
label: 'Very Satisfied',
ref: 'ed7f4756-c28f-4374-bb65-bfe5e3235c0c',
},
field: {
id: 'ghi789',
type: 'multiple_choice',
ref: 'satisfaction_field',
},
},
{
type: 'choices',
choices: {
ids: ['eXnU3oA141Cg', 'aTZmZGYV6liX', 'bCdEfGhIjKlM'],
labels: ['TypeScript', 'Python', 'Go'],
refs: [
'238d1802-9921-4687-a37b-5e50f56ece8e',
'd867c542-1e72-4619-908f-aaae38cabb61',
'f123g456-h789-i012-j345-k678l901m234',
],
},
field: {
id: 'jkl012',
type: 'multiple_choice',
ref: 'languages_field',
},
},
{
type: 'number',
number: 5,
field: {
id: 'mno345',
type: 'number',
ref: 'rating_field',
},
},
{
type: 'boolean',
boolean: true,
field: {
id: 'pqr678',
type: 'yes_no',
ref: 'subscribe_field',
},
},
{
type: 'date',
date: '2025-01-20',
field: {
id: 'stu901',
type: 'date',
ref: 'appointment_field',
},
},
],
definition: {
id: 'ABC123',
title: 'Customer Feedback Survey',
fields: [
{
id: 'abc123',
title: 'What is your name?',
type: 'short_text',
ref: 'name_field',
},
{
id: 'def456',
title: 'What is your email?',
type: 'email',
ref: 'email_field',
},
],
endings: [
{
id: 'end123',
title: 'Thank you!',
type: 'thankyou_screen',
},
],
},
ending: {
id: 'end123',
ref: '01GRC8GR2017M6WW347T86VV39',
},
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -87,44 +87,6 @@ export const webflowCollectionItemChangedTrigger: TriggerConfig = {
value: 'webflow_collection_item_changed',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
siteId: '68f9666057aa8abaa9b0b668',
workspaceId: '68f96081e7018465432953b5',
collectionId: '68f9666257aa8abaa9b0b6d6',
payload: {
id: '68fa8445de250e147cd95cfd',
cmsLocaleId: '68f9666257aa8abaa9b0b6c9',
lastPublished: '2024-01-15T14:45:00.000Z',
lastUpdated: '2024-01-15T14:45:00.000Z',
createdOn: '2024-01-15T10:30:00.000Z',
isArchived: false,
isDraft: false,
fieldData: {
name: 'Updated Blog Post',
slug: 'updated-blog-post',
'post-summary': 'This blog post has been updated',
featured: true,
},
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'webflow_collection_item_changed',
},
},
],
outputs: {

View File

@@ -100,44 +100,6 @@ export const webflowCollectionItemCreatedTrigger: TriggerConfig = {
value: 'webflow_collection_item_created',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
siteId: '68f9666057aa8abaa9b0b668',
workspaceId: '68f96081e7018465432953b5',
collectionId: '68f9666257aa8abaa9b0b6d6',
payload: {
id: '68fa8445de250e147cd95cfd',
cmsLocaleId: '68f9666257aa8abaa9b0b6c9',
lastPublished: '2024-01-15T10:30:00.000Z',
lastUpdated: '2024-01-15T10:30:00.000Z',
createdOn: '2024-01-15T10:30:00.000Z',
isArchived: false,
isDraft: false,
fieldData: {
name: 'Sample Blog Post',
slug: 'sample-blog-post',
'post-summary': 'This is a sample blog post created in the collection',
featured: false,
},
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'webflow_collection_item_created',
},
},
],
outputs: {

View File

@@ -88,33 +88,6 @@ export const webflowCollectionItemDeletedTrigger: TriggerConfig = {
value: 'webflow_collection_item_deleted',
},
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
siteId: '68f9666057aa8abaa9b0b668',
workspaceId: '68f96081e7018465432953b5',
collectionId: '68f9666257aa8abaa9b0b6d6',
payload: {
id: '68fa8445de250e147cd95cfd',
deletedOn: '2024-01-15T16:20:00.000Z',
},
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
condition: {
field: 'selectedTriggerId',
value: 'webflow_collection_item_deleted',
},
},
],
outputs: {

View File

@@ -67,41 +67,6 @@ export const webflowFormSubmissionTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'webflow_form_submission',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
siteId: '68f9666057aa8abaa9b0b668',
workspaceId: '68f96081e7018465432953b5',
name: 'Contact Form',
id: '68fa8445de250e147cd95cfd',
submittedAt: '2024-01-15T12:00:00.000Z',
data: {
name: 'John Doe',
email: 'john@example.com',
message: 'I would like more information about your services.',
'consent-checkbox': 'true',
},
schema: {
fields: [
{ name: 'name', type: 'text' },
{ name: 'email', type: 'email' },
{ name: 'message', type: 'textarea' },
],
},
formElementId: '68f9666257aa8abaa9b0b6e2',
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {

View File

@@ -59,59 +59,6 @@ export const whatsappWebhookTrigger: TriggerConfig = {
mode: 'trigger',
triggerId: 'whatsapp_webhook',
},
{
id: 'samplePayload',
title: 'Event Payload Example',
type: 'code',
language: 'json',
defaultValue: JSON.stringify(
{
object: 'whatsapp_business_account',
entry: [
{
id: '1234567890123456',
changes: [
{
value: {
messaging_product: 'whatsapp',
metadata: {
display_phone_number: '15551234567',
phone_number_id: '1234567890123456',
},
contacts: [
{
profile: {
name: 'John Doe',
},
wa_id: '15555551234',
},
],
messages: [
{
from: '15555551234',
id: 'wamid.HBgNMTU1NTU1NTEyMzQVAgASGBQzQTdBNjg4QjU2NjZCMzY4ODE2AA==',
timestamp: '1234567890',
text: {
body: 'Hello from WhatsApp!',
},
type: 'text',
},
],
},
field: 'messages',
},
],
},
],
},
null,
2
),
readOnly: true,
collapsible: true,
defaultCollapsed: true,
mode: 'trigger',
},
],
outputs: {