mirror of
https://github.com/simstudioai/sim.git
synced 2026-04-06 03:00:16 -04:00
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:
committed by
GitHub
parent
142d3aadb8
commit
75ce8882c8
@@ -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.
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {},
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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[] {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user