From 85291dc96d5ed37144f13c0ca9359d0167198922 Mon Sep 17 00:00:00 2001 From: waleed Date: Mon, 6 Apr 2026 13:38:10 -0700 Subject: [PATCH] docs gen --- .../integrations/data/integrations.json | 247 +++++++++++++++++- apps/sim/blocks/blocks/servicenow.ts | 17 ++ apps/sim/triggers/registry.ts | 12 + .../servicenow/change_request_created.ts | 37 +++ .../servicenow/change_request_updated.ts | 37 +++ .../triggers/servicenow/incident_created.ts | 40 +++ .../triggers/servicenow/incident_updated.ts | 37 +++ apps/sim/triggers/servicenow/index.ts | 5 + apps/sim/triggers/servicenow/utils.ts | 126 +++++++++ apps/sim/triggers/servicenow/webhook.ts | 38 +++ 10 files changed, 585 insertions(+), 11 deletions(-) create mode 100644 apps/sim/triggers/servicenow/change_request_created.ts create mode 100644 apps/sim/triggers/servicenow/change_request_updated.ts create mode 100644 apps/sim/triggers/servicenow/incident_created.ts create mode 100644 apps/sim/triggers/servicenow/incident_updated.ts create mode 100644 apps/sim/triggers/servicenow/index.ts create mode 100644 apps/sim/triggers/servicenow/utils.ts create mode 100644 apps/sim/triggers/servicenow/webhook.ts diff --git a/apps/sim/app/(landing)/integrations/data/integrations.json b/apps/sim/app/(landing)/integrations/data/integrations.json index cb5d3cbdb41..2d38d323fb2 100644 --- a/apps/sim/app/(landing)/integrations/data/integrations.json +++ b/apps/sim/app/(landing)/integrations/data/integrations.json @@ -5264,8 +5264,49 @@ } ], "operationCount": 11, - "triggers": [], - "triggerCount": 0, + "triggers": [ + { + "id": "greenhouse_candidate_hired", + "name": "Greenhouse Candidate Hired", + "description": "Trigger workflow when a candidate is hired" + }, + { + "id": "greenhouse_new_application", + "name": "Greenhouse New Application", + "description": "Trigger workflow when a new application is submitted" + }, + { + "id": "greenhouse_candidate_stage_change", + "name": "Greenhouse Candidate Stage Change", + "description": "Trigger workflow when a candidate changes interview stages" + }, + { + "id": "greenhouse_candidate_rejected", + "name": "Greenhouse Candidate Rejected", + "description": "Trigger workflow when a candidate is rejected" + }, + { + "id": "greenhouse_offer_created", + "name": "Greenhouse Offer Created", + "description": "Trigger workflow when a new offer is created" + }, + { + "id": "greenhouse_job_created", + "name": "Greenhouse Job Created", + "description": "Trigger workflow when a new job is created" + }, + { + "id": "greenhouse_job_updated", + "name": "Greenhouse Job Updated", + "description": "Trigger workflow when a job is updated" + }, + { + "id": "greenhouse_webhook", + "name": "Greenhouse Webhook (All Events)", + "description": "Trigger workflow on any Greenhouse webhook event" + } + ], + "triggerCount": 8, "authType": "api-key", "category": "tools", "integrationType": "hr", @@ -5528,6 +5569,11 @@ "name": "HubSpot Contact Deleted", "description": "Trigger workflow when a contact is deleted in HubSpot" }, + { + "id": "hubspot_contact_merged", + "name": "HubSpot Contact Merged", + "description": "Trigger workflow when contacts are merged in HubSpot" + }, { "id": "hubspot_contact_privacy_deleted", "name": "HubSpot Contact Privacy Deleted", @@ -5538,6 +5584,11 @@ "name": "HubSpot Contact Property Changed", "description": "Trigger workflow when any property of a contact is updated in HubSpot" }, + { + "id": "hubspot_contact_restored", + "name": "HubSpot Contact Restored", + "description": "Trigger workflow when a deleted contact is restored in HubSpot" + }, { "id": "hubspot_company_created", "name": "HubSpot Company Created", @@ -5548,11 +5599,21 @@ "name": "HubSpot Company Deleted", "description": "Trigger workflow when a company is deleted in HubSpot" }, + { + "id": "hubspot_company_merged", + "name": "HubSpot Company Merged", + "description": "Trigger workflow when companies are merged in HubSpot" + }, { "id": "hubspot_company_property_changed", "name": "HubSpot Company Property Changed", "description": "Trigger workflow when any property of a company is updated in HubSpot" }, + { + "id": "hubspot_company_restored", + "name": "HubSpot Company Restored", + "description": "Trigger workflow when a deleted company is restored in HubSpot" + }, { "id": "hubspot_conversation_creation", "name": "HubSpot Conversation Creation", @@ -5588,11 +5649,21 @@ "name": "HubSpot Deal Deleted", "description": "Trigger workflow when a deal is deleted in HubSpot" }, + { + "id": "hubspot_deal_merged", + "name": "HubSpot Deal Merged", + "description": "Trigger workflow when deals are merged in HubSpot" + }, { "id": "hubspot_deal_property_changed", "name": "HubSpot Deal Property Changed", "description": "Trigger workflow when any property of a deal is updated in HubSpot" }, + { + "id": "hubspot_deal_restored", + "name": "HubSpot Deal Restored", + "description": "Trigger workflow when a deleted deal is restored in HubSpot" + }, { "id": "hubspot_ticket_created", "name": "HubSpot Ticket Created", @@ -5603,13 +5674,28 @@ "name": "HubSpot Ticket Deleted", "description": "Trigger workflow when a ticket is deleted in HubSpot" }, + { + "id": "hubspot_ticket_merged", + "name": "HubSpot Ticket Merged", + "description": "Trigger workflow when tickets are merged in HubSpot" + }, { "id": "hubspot_ticket_property_changed", "name": "HubSpot Ticket Property Changed", "description": "Trigger workflow when any property of a ticket is updated in HubSpot" + }, + { + "id": "hubspot_ticket_restored", + "name": "HubSpot Ticket Restored", + "description": "Trigger workflow when a deleted ticket is restored in HubSpot" + }, + { + "id": "hubspot_webhook", + "name": "HubSpot Webhook (All Events)", + "description": "Trigger workflow on any HubSpot webhook event" } ], - "triggerCount": 18, + "triggerCount": 27, "authType": "oauth", "category": "tools", "integrationType": "crm", @@ -9516,8 +9602,49 @@ } ], "operationCount": 8, - "triggers": [], - "triggerCount": 0, + "triggers": [ + { + "id": "resend_email_sent", + "name": "Resend Email Sent", + "description": "Trigger workflow when an email is sent" + }, + { + "id": "resend_email_delivered", + "name": "Resend Email Delivered", + "description": "Trigger workflow when an email is delivered" + }, + { + "id": "resend_email_bounced", + "name": "Resend Email Bounced", + "description": "Trigger workflow when an email bounces" + }, + { + "id": "resend_email_complained", + "name": "Resend Email Complained", + "description": "Trigger workflow when an email is marked as spam" + }, + { + "id": "resend_email_opened", + "name": "Resend Email Opened", + "description": "Trigger workflow when an email is opened" + }, + { + "id": "resend_email_clicked", + "name": "Resend Email Clicked", + "description": "Trigger workflow when a link in an email is clicked" + }, + { + "id": "resend_email_failed", + "name": "Resend Email Failed", + "description": "Trigger workflow when an email fails to send" + }, + { + "id": "resend_webhook", + "name": "Resend Webhook (All Events)", + "description": "Trigger workflow on any Resend webhook event" + } + ], + "triggerCount": 8, "authType": "none", "category": "tools", "integrationType": "email", @@ -10263,8 +10390,39 @@ } ], "operationCount": 35, - "triggers": [], - "triggerCount": 0, + "triggers": [ + { + "id": "salesforce_record_created", + "name": "Salesforce Record Created", + "description": "Trigger workflow when a Salesforce record is created" + }, + { + "id": "salesforce_record_updated", + "name": "Salesforce Record Updated", + "description": "Trigger workflow when a Salesforce record is updated" + }, + { + "id": "salesforce_record_deleted", + "name": "Salesforce Record Deleted", + "description": "Trigger workflow when a Salesforce record is deleted" + }, + { + "id": "salesforce_opportunity_stage_changed", + "name": "Salesforce Opportunity Stage Changed", + "description": "Trigger workflow when an opportunity stage changes" + }, + { + "id": "salesforce_case_status_changed", + "name": "Salesforce Case Status Changed", + "description": "Trigger workflow when a case status changes" + }, + { + "id": "salesforce_webhook", + "name": "Salesforce Webhook (All Events)", + "description": "Trigger workflow on any Salesforce webhook event" + } + ], + "triggerCount": 6, "authType": "oauth", "category": "tools", "integrationType": "crm", @@ -10484,8 +10642,34 @@ } ], "operationCount": 4, - "triggers": [], - "triggerCount": 0, + "triggers": [ + { + "id": "servicenow_incident_created", + "name": "ServiceNow Incident Created", + "description": "Trigger workflow when a new incident is created in ServiceNow" + }, + { + "id": "servicenow_incident_updated", + "name": "ServiceNow Incident Updated", + "description": "Trigger workflow when an incident is updated in ServiceNow" + }, + { + "id": "servicenow_change_request_created", + "name": "ServiceNow Change Request Created", + "description": "Trigger workflow when a new change request is created in ServiceNow" + }, + { + "id": "servicenow_change_request_updated", + "name": "ServiceNow Change Request Updated", + "description": "Trigger workflow when a change request is updated in ServiceNow" + }, + { + "id": "servicenow_webhook", + "name": "ServiceNow Webhook (All Events)", + "description": "Trigger workflow on any ServiceNow webhook event" + } + ], + "triggerCount": 5, "authType": "none", "category": "tools", "integrationType": "customer-support", @@ -12053,8 +12237,49 @@ } ], "operationCount": 50, - "triggers": [], - "triggerCount": 0, + "triggers": [ + { + "id": "vercel_deployment_created", + "name": "Vercel Deployment Created", + "description": "Trigger workflow when a new deployment is created" + }, + { + "id": "vercel_deployment_ready", + "name": "Vercel Deployment Ready", + "description": "Trigger workflow when a deployment is ready to serve traffic" + }, + { + "id": "vercel_deployment_error", + "name": "Vercel Deployment Error", + "description": "Trigger workflow when a deployment fails" + }, + { + "id": "vercel_deployment_canceled", + "name": "Vercel Deployment Canceled", + "description": "Trigger workflow when a deployment is canceled" + }, + { + "id": "vercel_project_created", + "name": "Vercel Project Created", + "description": "Trigger workflow when a new project is created" + }, + { + "id": "vercel_project_removed", + "name": "Vercel Project Removed", + "description": "Trigger workflow when a project is removed" + }, + { + "id": "vercel_domain_created", + "name": "Vercel Domain Created", + "description": "Trigger workflow when a domain is created" + }, + { + "id": "vercel_webhook", + "name": "Vercel Webhook (All Events)", + "description": "Trigger workflow on any Vercel webhook event" + } + ], + "triggerCount": 8, "authType": "api-key", "category": "tools", "integrationType": "developer-tools", diff --git a/apps/sim/blocks/blocks/servicenow.ts b/apps/sim/blocks/blocks/servicenow.ts index 14376584725..760365d11ec 100644 --- a/apps/sim/blocks/blocks/servicenow.ts +++ b/apps/sim/blocks/blocks/servicenow.ts @@ -2,6 +2,7 @@ import { ServiceNowIcon } from '@/components/icons' import type { BlockConfig } from '@/blocks/types' import { IntegrationType } from '@/blocks/types' import type { ServiceNowResponse } from '@/tools/servicenow/types' +import { getTrigger } from '@/triggers' export const ServiceNowBlock: BlockConfig = { type: 'servicenow', @@ -215,6 +216,12 @@ Output: {"state": "2", "assigned_to": "john.doe", "work_notes": "Assigned and st condition: { field: 'operation', value: 'servicenow_delete_record' }, required: true, }, + // Trigger SubBlocks + ...getTrigger('servicenow_incident_created').subBlocks, + ...getTrigger('servicenow_incident_updated').subBlocks, + ...getTrigger('servicenow_change_request_created').subBlocks, + ...getTrigger('servicenow_change_request_updated').subBlocks, + ...getTrigger('servicenow_webhook').subBlocks, ], tools: { access: [ @@ -262,4 +269,14 @@ Output: {"state": "2", "assigned_to": "john.doe", "work_notes": "Assigned and st success: { type: 'boolean', description: 'Operation success status' }, metadata: { type: 'json', description: 'Operation metadata' }, }, + triggers: { + enabled: true, + available: [ + 'servicenow_incident_created', + 'servicenow_incident_updated', + 'servicenow_change_request_created', + 'servicenow_change_request_updated', + 'servicenow_webhook', + ], + }, } diff --git a/apps/sim/triggers/registry.ts b/apps/sim/triggers/registry.ts index 59efc18cb2e..ffcdc594387 100644 --- a/apps/sim/triggers/registry.ts +++ b/apps/sim/triggers/registry.ts @@ -220,6 +220,13 @@ import { salesforceRecordUpdatedTrigger, salesforceWebhookTrigger, } from '@/triggers/salesforce' +import { + servicenowChangeRequestCreatedTrigger, + servicenowChangeRequestUpdatedTrigger, + servicenowIncidentCreatedTrigger, + servicenowIncidentUpdatedTrigger, + servicenowWebhookTrigger, +} from '@/triggers/servicenow' import { slackWebhookTrigger } from '@/triggers/slack' import { stripeWebhookTrigger } from '@/triggers/stripe' import { telegramWebhookTrigger } from '@/triggers/telegram' @@ -451,4 +458,9 @@ export const TRIGGER_REGISTRY: TriggerRegistry = { intercom_contact_created: intercomContactCreatedTrigger, intercom_user_created: intercomUserCreatedTrigger, intercom_webhook: intercomWebhookTrigger, + servicenow_incident_created: servicenowIncidentCreatedTrigger, + servicenow_incident_updated: servicenowIncidentUpdatedTrigger, + servicenow_change_request_created: servicenowChangeRequestCreatedTrigger, + servicenow_change_request_updated: servicenowChangeRequestUpdatedTrigger, + servicenow_webhook: servicenowWebhookTrigger, } diff --git a/apps/sim/triggers/servicenow/change_request_created.ts b/apps/sim/triggers/servicenow/change_request_created.ts new file mode 100644 index 00000000000..bd538158dd7 --- /dev/null +++ b/apps/sim/triggers/servicenow/change_request_created.ts @@ -0,0 +1,37 @@ +import { ServiceNowIcon } from '@/components/icons' +import { buildTriggerSubBlocks } from '@/triggers' +import { + buildChangeRequestOutputs, + buildServiceNowExtraFields, + servicenowSetupInstructions, + servicenowTriggerOptions, +} from '@/triggers/servicenow/utils' +import type { TriggerConfig } from '@/triggers/types' + +/** + * ServiceNow Change Request Created Trigger + */ +export const servicenowChangeRequestCreatedTrigger: TriggerConfig = { + id: 'servicenow_change_request_created', + name: 'ServiceNow Change Request Created', + provider: 'servicenow', + description: 'Trigger workflow when a new change request is created in ServiceNow', + version: '1.0.0', + icon: ServiceNowIcon, + + subBlocks: buildTriggerSubBlocks({ + triggerId: 'servicenow_change_request_created', + triggerOptions: servicenowTriggerOptions, + setupInstructions: servicenowSetupInstructions('Insert (record creation)'), + extraFields: buildServiceNowExtraFields('servicenow_change_request_created'), + }), + + outputs: buildChangeRequestOutputs(), + + webhook: { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, +} diff --git a/apps/sim/triggers/servicenow/change_request_updated.ts b/apps/sim/triggers/servicenow/change_request_updated.ts new file mode 100644 index 00000000000..f7148f90583 --- /dev/null +++ b/apps/sim/triggers/servicenow/change_request_updated.ts @@ -0,0 +1,37 @@ +import { ServiceNowIcon } from '@/components/icons' +import { buildTriggerSubBlocks } from '@/triggers' +import { + buildChangeRequestOutputs, + buildServiceNowExtraFields, + servicenowSetupInstructions, + servicenowTriggerOptions, +} from '@/triggers/servicenow/utils' +import type { TriggerConfig } from '@/triggers/types' + +/** + * ServiceNow Change Request Updated Trigger + */ +export const servicenowChangeRequestUpdatedTrigger: TriggerConfig = { + id: 'servicenow_change_request_updated', + name: 'ServiceNow Change Request Updated', + provider: 'servicenow', + description: 'Trigger workflow when a change request is updated in ServiceNow', + version: '1.0.0', + icon: ServiceNowIcon, + + subBlocks: buildTriggerSubBlocks({ + triggerId: 'servicenow_change_request_updated', + triggerOptions: servicenowTriggerOptions, + setupInstructions: servicenowSetupInstructions('Update (record modification)'), + extraFields: buildServiceNowExtraFields('servicenow_change_request_updated'), + }), + + outputs: buildChangeRequestOutputs(), + + webhook: { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, +} diff --git a/apps/sim/triggers/servicenow/incident_created.ts b/apps/sim/triggers/servicenow/incident_created.ts new file mode 100644 index 00000000000..e1e09300e92 --- /dev/null +++ b/apps/sim/triggers/servicenow/incident_created.ts @@ -0,0 +1,40 @@ +import { ServiceNowIcon } from '@/components/icons' +import { buildTriggerSubBlocks } from '@/triggers' +import { + buildIncidentOutputs, + buildServiceNowExtraFields, + servicenowSetupInstructions, + servicenowTriggerOptions, +} from '@/triggers/servicenow/utils' +import type { TriggerConfig } from '@/triggers/types' + +/** + * ServiceNow Incident Created Trigger + * + * This is the PRIMARY trigger - it includes the dropdown for selecting trigger type. + */ +export const servicenowIncidentCreatedTrigger: TriggerConfig = { + id: 'servicenow_incident_created', + name: 'ServiceNow Incident Created', + provider: 'servicenow', + description: 'Trigger workflow when a new incident is created in ServiceNow', + version: '1.0.0', + icon: ServiceNowIcon, + + subBlocks: buildTriggerSubBlocks({ + triggerId: 'servicenow_incident_created', + triggerOptions: servicenowTriggerOptions, + includeDropdown: true, + setupInstructions: servicenowSetupInstructions('Insert (record creation)'), + extraFields: buildServiceNowExtraFields('servicenow_incident_created'), + }), + + outputs: buildIncidentOutputs(), + + webhook: { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, +} diff --git a/apps/sim/triggers/servicenow/incident_updated.ts b/apps/sim/triggers/servicenow/incident_updated.ts new file mode 100644 index 00000000000..70c9914d6a6 --- /dev/null +++ b/apps/sim/triggers/servicenow/incident_updated.ts @@ -0,0 +1,37 @@ +import { ServiceNowIcon } from '@/components/icons' +import { buildTriggerSubBlocks } from '@/triggers' +import { + buildIncidentOutputs, + buildServiceNowExtraFields, + servicenowSetupInstructions, + servicenowTriggerOptions, +} from '@/triggers/servicenow/utils' +import type { TriggerConfig } from '@/triggers/types' + +/** + * ServiceNow Incident Updated Trigger + */ +export const servicenowIncidentUpdatedTrigger: TriggerConfig = { + id: 'servicenow_incident_updated', + name: 'ServiceNow Incident Updated', + provider: 'servicenow', + description: 'Trigger workflow when an incident is updated in ServiceNow', + version: '1.0.0', + icon: ServiceNowIcon, + + subBlocks: buildTriggerSubBlocks({ + triggerId: 'servicenow_incident_updated', + triggerOptions: servicenowTriggerOptions, + setupInstructions: servicenowSetupInstructions('Update (record modification)'), + extraFields: buildServiceNowExtraFields('servicenow_incident_updated'), + }), + + outputs: buildIncidentOutputs(), + + webhook: { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, +} diff --git a/apps/sim/triggers/servicenow/index.ts b/apps/sim/triggers/servicenow/index.ts new file mode 100644 index 00000000000..adb585ff29b --- /dev/null +++ b/apps/sim/triggers/servicenow/index.ts @@ -0,0 +1,5 @@ +export { servicenowChangeRequestCreatedTrigger } from './change_request_created' +export { servicenowChangeRequestUpdatedTrigger } from './change_request_updated' +export { servicenowIncidentCreatedTrigger } from './incident_created' +export { servicenowIncidentUpdatedTrigger } from './incident_updated' +export { servicenowWebhookTrigger } from './webhook' diff --git a/apps/sim/triggers/servicenow/utils.ts b/apps/sim/triggers/servicenow/utils.ts new file mode 100644 index 00000000000..78808ac871f --- /dev/null +++ b/apps/sim/triggers/servicenow/utils.ts @@ -0,0 +1,126 @@ +import type { SubBlockConfig } from '@/blocks/types' +import type { TriggerOutput } from '@/triggers/types' + +/** + * Shared trigger dropdown options for all ServiceNow triggers + */ +export const servicenowTriggerOptions = [ + { label: 'Incident Created', id: 'servicenow_incident_created' }, + { label: 'Incident Updated', id: 'servicenow_incident_updated' }, + { label: 'Change Request Created', id: 'servicenow_change_request_created' }, + { label: 'Change Request Updated', id: 'servicenow_change_request_updated' }, + { label: 'Generic Webhook (All Events)', id: 'servicenow_webhook' }, +] + +/** + * Generates setup instructions for ServiceNow webhooks. + * ServiceNow uses Business Rules with Outbound REST Messages for webhooks. + */ +export function servicenowSetupInstructions(eventType: string): string { + const instructions = [ + 'Note: You need admin or developer permissions in your ServiceNow instance to create Business Rules.', + 'Navigate to System Definition > Business Rules and create a new Business Rule.', + `Set the table (e.g., incident, change_request), set When to after, and check ${eventType}.`, + 'Check the Advanced checkbox to enable the script editor.', + `In the script, use RESTMessageV2 to POST the record data as JSON to the Webhook URL above. Example:
var r = new sn_ws.RESTMessageV2();\nr.setEndpoint("<webhook_url>");\nr.setHttpMethod("POST");\nr.setRequestHeader("Content-Type", "application/json");\nr.setRequestBody(JSON.stringify({\n sysId: current.sys_id + "",\n number: current.number + "",\n shortDescription: current.short_description + "",\n state: current.state + "",\n priority: current.priority + ""\n}));\nr.execute();`, + 'Activate the Business Rule and click "Save" above to activate your trigger.', + ] + + return instructions + .map( + (instruction, index) => + `
${index === 0 ? instruction : `${index}. ${instruction}`}
` + ) + .join('') +} + +/** + * Extra fields for ServiceNow triggers (table filter) + */ +export function buildServiceNowExtraFields(triggerId: string): SubBlockConfig[] { + return [ + { + id: 'tableName', + title: 'Table Name (Optional)', + type: 'short-input', + placeholder: 'e.g., incident, change_request', + description: 'Optionally filter to a specific ServiceNow table', + mode: 'trigger', + condition: { field: 'selectedTriggerId', value: triggerId }, + }, + ] +} + +/** + * Common record fields shared across ServiceNow trigger outputs + */ +function buildRecordOutputs(): Record { + return { + sysId: { type: 'string', description: 'Unique system ID of the record' }, + number: { type: 'string', description: 'Record number (e.g., INC0010001, CHG0010001)' }, + tableName: { type: 'string', description: 'ServiceNow table name' }, + shortDescription: { type: 'string', description: 'Short description of the record' }, + description: { type: 'string', description: 'Full description of the record' }, + state: { type: 'string', description: 'Current state of the record' }, + priority: { + type: 'string', + description: 'Priority level (1=Critical, 2=High, 3=Moderate, 4=Low)', + }, + assignedTo: { type: 'string', description: 'User assigned to this record' }, + assignmentGroup: { type: 'string', description: 'Group assigned to this record' }, + createdBy: { type: 'string', description: 'User who created the record' }, + createdOn: { type: 'string', description: 'When the record was created (ISO 8601)' }, + updatedBy: { type: 'string', description: 'User who last updated the record' }, + updatedOn: { type: 'string', description: 'When the record was last updated (ISO 8601)' }, + } +} + +/** + * Outputs for incident triggers + */ +export function buildIncidentOutputs(): Record { + return { + ...buildRecordOutputs(), + urgency: { type: 'string', description: 'Urgency level (1=High, 2=Medium, 3=Low)' }, + impact: { type: 'string', description: 'Impact level (1=High, 2=Medium, 3=Low)' }, + category: { type: 'string', description: 'Incident category' }, + subcategory: { type: 'string', description: 'Incident subcategory' }, + caller: { type: 'string', description: 'Caller/requester of the incident' }, + resolvedBy: { type: 'string', description: 'User who resolved the incident' }, + resolvedAt: { type: 'string', description: 'When the incident was resolved' }, + closeNotes: { type: 'string', description: 'Notes added when the incident was closed' }, + record: { type: 'json', description: 'Full incident record data' }, + } +} + +/** + * Outputs for change request triggers + */ +export function buildChangeRequestOutputs(): Record { + return { + ...buildRecordOutputs(), + type: { type: 'string', description: 'Change type (Normal, Standard, Emergency)' }, + risk: { type: 'string', description: 'Risk level of the change' }, + impact: { type: 'string', description: 'Impact level of the change' }, + approval: { type: 'string', description: 'Approval status' }, + startDate: { type: 'string', description: 'Planned start date' }, + endDate: { type: 'string', description: 'Planned end date' }, + category: { type: 'string', description: 'Change category' }, + record: { type: 'json', description: 'Full change request record data' }, + } +} + +/** + * Outputs for the generic webhook trigger (all events) + */ +export function buildServiceNowWebhookOutputs(): Record { + return { + ...buildRecordOutputs(), + eventType: { + type: 'string', + description: 'The type of event that triggered this workflow (e.g., insert, update, delete)', + }, + category: { type: 'string', description: 'Record category' }, + record: { type: 'json', description: 'Full record data from the webhook payload' }, + } +} diff --git a/apps/sim/triggers/servicenow/webhook.ts b/apps/sim/triggers/servicenow/webhook.ts new file mode 100644 index 00000000000..7cb1d19d5d7 --- /dev/null +++ b/apps/sim/triggers/servicenow/webhook.ts @@ -0,0 +1,38 @@ +import { ServiceNowIcon } from '@/components/icons' +import { buildTriggerSubBlocks } from '@/triggers' +import { + buildServiceNowExtraFields, + buildServiceNowWebhookOutputs, + servicenowSetupInstructions, + servicenowTriggerOptions, +} from '@/triggers/servicenow/utils' +import type { TriggerConfig } from '@/triggers/types' + +/** + * Generic ServiceNow Webhook Trigger + * Captures all ServiceNow webhook events + */ +export const servicenowWebhookTrigger: TriggerConfig = { + id: 'servicenow_webhook', + name: 'ServiceNow Webhook (All Events)', + provider: 'servicenow', + description: 'Trigger workflow on any ServiceNow webhook event', + version: '1.0.0', + icon: ServiceNowIcon, + + subBlocks: buildTriggerSubBlocks({ + triggerId: 'servicenow_webhook', + triggerOptions: servicenowTriggerOptions, + setupInstructions: servicenowSetupInstructions('Insert, Update, or Delete'), + extraFields: buildServiceNowExtraFields('servicenow_webhook'), + }), + + outputs: buildServiceNowWebhookOutputs(), + + webhook: { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, +}