@candoa/workflows
Version:
Type-safe workflow SDK for Candoa with Copilot-friendly syntax. Define chat workflows with triggers, actions, and type safety.
1 lines • 23.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/workflow.ts","../src/database-utils.ts","../src/actions.ts","../src/index.ts"],"sourcesContent":["import type {\n WorkflowConfig,\n WorkflowDefinition,\n WorkflowBuilder,\n WorkflowWithTrigger,\n TriggerType,\n WorkflowAction,\n} from './types'\n\n/**\n * Implementation of the workflow builder with trigger support\n */\nclass WorkflowWithTriggerImpl implements WorkflowWithTrigger {\n constructor(\n private name: string,\n private config: WorkflowConfig,\n private triggerType: TriggerType,\n ) {}\n\n /**\n * Defines the actions to execute when the trigger fires\n * @param actions List of workflow actions to execute in sequence\n * @returns Complete workflow definition\n */\n use(...actions: WorkflowAction[]): WorkflowDefinition {\n return {\n name: this.name,\n config: this.config,\n trigger: {\n type: this.triggerType,\n },\n actions,\n }\n }\n}\n\n/**\n * Implementation of the main workflow builder\n */\nclass WorkflowBuilderImpl implements WorkflowBuilder {\n constructor(\n private name: string,\n private config: WorkflowConfig = {},\n ) {}\n\n /**\n * Defines the trigger that will start this workflow\n * @param trigger The event type that triggers this workflow\n * @returns Builder with trigger set, ready for actions\n */\n on(trigger: TriggerType): WorkflowWithTrigger {\n return new WorkflowWithTriggerImpl(this.name, this.config, trigger)\n }\n}\n\n/**\n * Creates a new workflow with the specified name and optional configuration\n *\n * @example\n * ```typescript\n * import { workflow, collectFirstName, saveToContact } from \"@candoa/workflows\";\n *\n * export default workflow(\"welcome-new-user\", {\n * description: \"Collects the user's first name when they start a chat\"\n * })\n * .on(\"chat.started\")\n * .use(\n * collectFirstName({ prompt: \"Hi! What's your first name?\" }),\n * saveToContact({ field: \"firstName\", value: \"{{firstName}}\" })\n * );\n * ```\n *\n * @param name Unique identifier for the workflow\n * @param config Optional workflow configuration including description\n * @returns Workflow builder for chaining .on() and .use() methods\n */\nexport function workflow(\n name: string,\n config: WorkflowConfig = {},\n): WorkflowBuilder {\n return new WorkflowBuilderImpl(name, config)\n}\n\n/**\n * Type-safe helper for creating custom trigger conditions\n */\nexport function createTrigger<T extends Record<string, any>>(\n type: TriggerType,\n conditions?: T,\n): { type: TriggerType; conditions?: T } {\n return { type, conditions }\n}\n\n/**\n * Validates a workflow definition for common issues\n * @param workflowDef The workflow definition to validate\n * @returns Array of validation errors, empty if valid\n */\nexport function validateWorkflow(workflowDef: WorkflowDefinition): string[] {\n const errors: string[] = []\n\n if (!workflowDef.name || workflowDef.name.trim().length === 0) {\n errors.push('Workflow name is required')\n }\n\n if (!workflowDef.trigger?.type) {\n errors.push('Workflow trigger is required')\n }\n\n if (!workflowDef.actions || workflowDef.actions.length === 0) {\n errors.push('Workflow must have at least one action')\n }\n\n // Validate action types\n workflowDef.actions?.forEach((action, index) => {\n if (!action.type) {\n errors.push(`Action at index ${index} is missing type`)\n }\n if (!action.params) {\n errors.push(`Action at index ${index} is missing params`)\n }\n })\n\n return errors\n}\n\n/**\n * Converts a workflow definition to a JSON-serializable format for storage\n * This matches the `workflowData` field structure in your database schema\n * @param workflowDef The workflow definition to serialize\n * @returns JSON-safe object ready for database storage in the `workflowData` field\n */\nexport function serializeWorkflow(\n workflowDef: WorkflowDefinition,\n): Record<string, any> {\n return {\n name: workflowDef.name,\n description: workflowDef.config.description,\n trigger: workflowDef.trigger,\n actions: workflowDef.actions,\n version: '1.0',\n createdAt: new Date().toISOString(),\n // Add fields that would be useful for the Candoa platform\n enabled: true,\n metadata: {\n sdk_version: '0.1.0',\n triggers_count: 1,\n actions_count: workflowDef.actions.length,\n },\n }\n}\n","// Database integration utilities for Candoa workflows\n// These functions help integrate the SDK with your database schema\n\nimport type { WorkflowDefinition } from './types'\n\n// Workflow data type for database storage - local to this package\nexport interface WorkflowData {\n name: string\n description?: string\n trigger: {\n type:\n | 'chat.started'\n | 'chat.ended'\n | 'message.received'\n | 'intent.detected'\n | 'sentiment.negative'\n | 'payment.failed'\n | 'user.signup'\n | 'custom.event'\n conditions?: Record<string, any>\n }\n actions: Array<{\n type: string\n params: Record<string, any>\n }>\n metadata: {\n version: string\n enabled: boolean\n sdk_version: string\n triggers_count: number\n actions_count: number\n last_executed: string | null\n execution_count: number\n success_count: number\n error_count: number\n integrations: {\n handoff: boolean\n contacts: boolean\n conversations: boolean\n tasks: boolean\n emails: boolean\n }\n access_levels: string[]\n created_at: string\n }\n}\n\n/**\n * Prepares workflow data for insertion into the database\n * Matches the schema: workflows table with workflowData JSON field\n */\nexport function prepareWorkflowForDatabase(\n workflowDef: WorkflowDefinition,\n projectId: string,\n): {\n name: string\n workflowData: WorkflowData\n projectId: string\n} {\n return {\n name: workflowDef.name,\n projectId,\n workflowData: {\n // Core workflow definition\n name: workflowDef.name,\n description: workflowDef.config.description,\n trigger: workflowDef.trigger,\n actions: workflowDef.actions,\n\n // Metadata for the platform\n metadata: {\n version: '1.0',\n enabled: true,\n sdk_version: '0.1.0',\n\n // Analytics fields\n triggers_count: 1,\n actions_count: workflowDef.actions.length,\n\n // Execution tracking\n last_executed: null,\n execution_count: 0,\n success_count: 0,\n error_count: 0,\n\n // Integration settings\n integrations: {\n handoff: true, // Integrates with automated handoff\n contacts: true, // Can create/update contacts\n conversations: true, // Works with conversation system\n tasks: true, // Can create tasks\n emails: true, // Can send emails\n },\n\n // Permissions\n access_levels: ['AI_AGENT', 'AI_COPILOT'],\n\n // Created timestamp\n created_at: new Date().toISOString(),\n },\n },\n }\n}\n\n/**\n * Extract workflow execution context from conversation and contact data\n * This provides the template variables for workflow execution\n */\nexport function buildWorkflowContext(params: {\n conversationId?: string\n contactData?: {\n id?: string\n name?: string\n email?: string\n phoneNumber?: string\n firstName?: string\n lastName?: string\n company?: string\n }\n messageHistory?: Array<{\n role: string\n content: string\n createdAt: Date\n }>\n triggerData?: Record<string, any>\n}): Record<string, any> {\n const {\n conversationId,\n contactData = {},\n messageHistory = [],\n triggerData = {},\n } = params\n\n return {\n // Conversation context\n conversationId: conversationId || '',\n conversation_history_count: messageHistory.length,\n user_questions_count: messageHistory.filter(\n (msg) => msg.role === 'user' && msg.content.includes('?'),\n ).length,\n\n // Contact context (matches your contact schema)\n contactId: contactData.id || '',\n firstName: contactData.firstName || contactData.name?.split(' ')[0] || '',\n lastName: contactData.lastName || contactData.name?.split(' ')[1] || '',\n email: contactData.email || '',\n phone: contactData.phoneNumber || '',\n company: contactData.company || '',\n\n // Trigger-specific context\n ...triggerData,\n\n // Timestamp context\n timestamp: new Date().toISOString(),\n date: new Date().toLocaleDateString(),\n time: new Date().toLocaleTimeString(),\n }\n}\n\n/**\n * Validate that a workflow is compatible with Candoa's systems\n */\nexport function validateWorkflowCompatibility(\n workflowDef: WorkflowDefinition,\n): {\n isValid: boolean\n warnings: string[]\n errors: string[]\n} {\n const warnings: string[] = []\n const errors: string[] = []\n\n // Check trigger compatibility\n const supportedTriggers = [\n 'chat.started',\n 'chat.ended',\n 'message.received',\n 'intent.detected',\n 'sentiment.negative',\n 'payment.failed',\n 'user.signup',\n 'custom.event',\n ]\n\n if (!supportedTriggers.includes(workflowDef.trigger.type)) {\n errors.push(`Unsupported trigger type: ${workflowDef.trigger.type}`)\n }\n\n // Check action compatibility\n const supportedActions = [\n 'collect_first_name',\n 'collect_last_name',\n 'collect_email',\n 'save_to_contact',\n 'send_message',\n 'send_email',\n 'handoff_to_human',\n 'create_task',\n 'add_tags',\n 'wait',\n 'set_variable',\n 'conditional',\n ]\n\n for (const action of workflowDef.actions) {\n if (!supportedActions.includes(action.type)) {\n warnings.push(`Action type '${action.type}' may not be fully supported`)\n }\n\n // Check for required parameters\n if (action.type === 'save_to_contact') {\n const validFields = ['firstName', 'lastName', 'email', 'phone', 'company']\n const field = action.params.field\n if (!validFields.includes(field)) {\n errors.push(\n `Invalid contact field '${field}'. Valid fields: ${validFields.join(', ')}`,\n )\n }\n }\n }\n\n // Performance warnings\n if (workflowDef.actions.length > 20) {\n warnings.push(\n 'Workflow has many actions - consider breaking it into smaller workflows',\n )\n }\n\n const hasWait = workflowDef.actions.some((action) => action.type === 'wait')\n if (hasWait) {\n warnings.push(\n 'Workflow contains wait actions - ensure your system supports delayed execution',\n )\n }\n\n return {\n isValid: errors.length === 0,\n warnings,\n errors,\n }\n}\n\n/**\n * Extract metrics from workflow execution for analytics\n */\nexport function extractWorkflowMetrics(\n workflowDef: WorkflowDefinition,\n executionResult: {\n success: boolean\n error?: string\n executionTime: number\n actionsCompleted: number\n },\n): {\n workflow_name: string\n trigger_type: string\n actions_count: number\n actions_completed: number\n execution_time_ms: number\n success: boolean\n error?: string\n timestamp: string\n} {\n return {\n workflow_name: workflowDef.name,\n trigger_type: workflowDef.trigger.type,\n actions_count: workflowDef.actions.length,\n actions_completed: executionResult.actionsCompleted,\n execution_time_ms: executionResult.executionTime,\n success: executionResult.success,\n error: executionResult.error,\n timestamp: new Date().toISOString(),\n }\n}\n\n/**\n * Helper to update workflow execution statistics in the database\n */\nexport function updateWorkflowStats(\n currentWorkflowData: WorkflowData,\n wasSuccessful: boolean,\n): WorkflowData {\n return {\n ...currentWorkflowData,\n metadata: {\n ...currentWorkflowData.metadata,\n last_executed: new Date().toISOString(),\n execution_count: (currentWorkflowData.metadata.execution_count || 0) + 1,\n success_count: wasSuccessful\n ? (currentWorkflowData.metadata.success_count || 0) + 1\n : currentWorkflowData.metadata.success_count || 0,\n error_count: !wasSuccessful\n ? (currentWorkflowData.metadata.error_count || 0) + 1\n : currentWorkflowData.metadata.error_count || 0,\n },\n }\n}\n","import type {\n WorkflowAction,\n CollectFirstNameParams,\n SaveToContactParams,\n SendMessageParams,\n SetVariableParams,\n ConditionalParams,\n} from './types'\n\n/**\n * Collects the user's first name with a custom prompt\n * @param params Configuration for collecting first name\n * @returns Workflow action for collecting first name\n */\nexport function collectFirstName(\n params: CollectFirstNameParams,\n): WorkflowAction {\n return {\n type: 'collect_first_name',\n params: {\n prompt: params.prompt,\n errorMessage:\n params.errorMessage ||\n \"I didn't catch that. Could you please tell me your first name?\",\n maxRetries: params.maxRetries || 3,\n },\n }\n}\n\n/**\n * Collects the user's last name with a custom prompt\n */\nexport function collectLastName(params: {\n prompt: string\n errorMessage?: string\n maxRetries?: number\n}): WorkflowAction {\n return {\n type: 'collect_last_name',\n params: {\n prompt: params.prompt,\n errorMessage:\n params.errorMessage || 'Could you please tell me your last name?',\n maxRetries: params.maxRetries || 3,\n },\n }\n}\n\n/**\n * Collects the user's email address with validation\n */\nexport function collectEmail(params: {\n prompt: string\n errorMessage?: string\n maxRetries?: number\n}): WorkflowAction {\n return {\n type: 'collect_email',\n params: {\n prompt: params.prompt,\n errorMessage:\n params.errorMessage || 'Please provide a valid email address.',\n maxRetries: params.maxRetries || 3,\n },\n }\n}\n\n/**\n * Saves data to a contact field\n * @param params Field and value to save\n * @returns Workflow action for saving to contact\n */\nexport function saveToContact(params: SaveToContactParams): WorkflowAction {\n return {\n type: 'save_to_contact',\n params,\n }\n}\n\n/**\n * Sends a message to the user\n * @param params Message content and optional delay\n * @returns Workflow action for sending message\n */\nexport function sendMessage(params: SendMessageParams): WorkflowAction {\n return {\n type: 'send_message',\n params: {\n message: params.message,\n delay: params.delay || 0,\n },\n }\n}\n\n/**\n * Sets a workflow variable for later use\n * @param params Variable name and value\n * @returns Workflow action for setting variable\n */\nexport function setVariable(params: SetVariableParams): WorkflowAction {\n return {\n type: 'set_variable',\n params,\n }\n}\n\n/**\n * Creates a conditional action based on a condition\n * @param params Condition and actions to execute\n * @returns Workflow action for conditional logic\n */\nexport function conditional(params: ConditionalParams): WorkflowAction {\n return {\n type: 'conditional',\n params,\n }\n}\n\n/**\n * Waits for a specified amount of time\n */\nexport function wait(params: {\n duration: number\n unit?: 'seconds' | 'minutes' | 'hours'\n}): WorkflowAction {\n return {\n type: 'wait',\n params: {\n duration: params.duration,\n unit: params.unit || 'seconds',\n },\n }\n}\n\n/**\n * Triggers a handoff to human agent\n */\nexport function handoffToHuman(params: { reason?: string }): WorkflowAction {\n return {\n type: 'handoff_to_human',\n params: {\n reason: params.reason || 'User requested human assistance',\n },\n }\n}\n\n/**\n * Sends an email notification\n */\nexport function sendEmail(params: {\n to: string\n subject: string\n body: string\n template?: string\n}): WorkflowAction {\n return {\n type: 'send_email',\n params,\n }\n}\n\n/**\n * Creates a task or ticket in the system\n */\nexport function createTask(params: {\n title: string\n description?: string\n assignee?: string\n}): WorkflowAction {\n return {\n type: 'create_task',\n params: {\n title: params.title,\n description: params.description || '',\n assignee: params.assignee || '',\n },\n }\n}\n\n/**\n * Adds tags to the conversation or contact\n */\nexport function addTags(params: {\n tags: string[]\n target?: 'conversation' | 'contact'\n}): WorkflowAction {\n return {\n type: 'add_tags',\n params: {\n tags: params.tags,\n target: params.target || 'conversation',\n },\n }\n}\n","// Main workflow builder and utilities\nexport {\n workflow,\n createTrigger,\n validateWorkflow,\n serializeWorkflow,\n} from './workflow'\n\n// Database integration utilities\nexport {\n prepareWorkflowForDatabase,\n buildWorkflowContext,\n validateWorkflowCompatibility,\n extractWorkflowMetrics,\n updateWorkflowStats,\n type WorkflowData,\n} from './database-utils'\n\n// Pre-built actions for common use cases\nexport {\n collectFirstName,\n collectLastName,\n collectEmail,\n saveToContact,\n sendMessage,\n setVariable,\n conditional,\n wait,\n handoffToHuman,\n sendEmail,\n createTask,\n addTags,\n} from './actions'\n\n// Type definitions for TypeScript users\nexport type {\n WorkflowConfig,\n TriggerType,\n TemplateVariable,\n ActionParams,\n WorkflowAction,\n WorkflowDefinition,\n WorkflowBuilder,\n WorkflowWithTrigger,\n CollectFirstNameParams,\n SaveToContactParams,\n SendMessageParams,\n SetVariableParams,\n ConditionalParams,\n} from './types'\n\n// Version and metadata\nexport const version = '0.1.0'\nexport const name = '@candoa/workflows'\n"],"mappings":"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","names":["name"]}