@xtr-dev/payload-automation 0.0.34 → 0.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -763,12 +763,6 @@ export class WorkflowExecutor {
763
763
  /**
764
764
  * Find and execute workflows triggered by a collection operation
765
765
  */ async executeTriggeredWorkflows(collection, operation, doc, previousDoc, req) {
766
- console.log('🚨 EXECUTOR: executeTriggeredWorkflows called!');
767
- console.log('🚨 EXECUTOR: Collection =', collection);
768
- console.log('🚨 EXECUTOR: Operation =', operation);
769
- console.log('🚨 EXECUTOR: Doc ID =', doc?.id);
770
- console.log('🚨 EXECUTOR: Has payload?', !!this.payload);
771
- console.log('🚨 EXECUTOR: Has logger?', !!this.logger);
772
766
  this.logger.info({
773
767
  collection,
774
768
  operation,
@@ -788,24 +782,11 @@ export class WorkflowExecutor {
788
782
  for (const workflow of workflows.docs){
789
783
  // Check if this workflow has a matching trigger
790
784
  const triggers = workflow.triggers;
791
- this.logger.info({
785
+ this.logger.debug({
792
786
  workflowId: workflow.id,
793
787
  workflowName: workflow.name,
794
- triggerCount: triggers?.length || 0,
795
- triggers: triggers?.map((t)=>({
796
- type: t.type,
797
- parameters: t.parameters,
798
- collection: t.parameters?.collection,
799
- collectionSlug: t.parameters?.collectionSlug,
800
- operation: t.parameters?.operation,
801
- // Debug matching criteria
802
- typeMatch: t.type === 'collection-trigger',
803
- collectionMatch: t.parameters?.collection === collection || t.parameters?.collectionSlug === collection,
804
- operationMatch: t.parameters?.operation === operation
805
- })),
806
- targetCollection: collection,
807
- targetOperation: operation
808
- }, 'Checking workflow triggers with detailed matching info');
788
+ triggerCount: triggers?.length || 0
789
+ }, 'Checking workflow triggers');
809
790
  const matchingTriggers = triggers?.filter((trigger)=>trigger.type === 'collection-trigger' && (trigger.parameters?.collection === collection || trigger.parameters?.collectionSlug === collection) && trigger.parameters?.operation === operation) || [];
810
791
  this.logger.info({
811
792
  workflowId: workflow.id,
@@ -840,18 +821,13 @@ export class WorkflowExecutor {
840
821
  };
841
822
  // Check trigger condition if present
842
823
  if (trigger.condition) {
843
- this.logger.info({
824
+ this.logger.debug({
844
825
  collection,
845
826
  operation,
846
827
  condition: trigger.condition,
847
- docId: doc?.id,
848
- docFields: doc ? Object.keys(doc) : [],
849
- previousDocId: previousDoc?.id,
850
828
  workflowId: workflow.id,
851
- workflowName: workflow.name,
852
- docStatus: doc?.status,
853
- previousDocStatus: previousDoc?.status
854
- }, 'Evaluating trigger condition before execution');
829
+ workflowName: workflow.name
830
+ }, 'Evaluating trigger condition');
855
831
  const conditionMet = this.evaluateCondition(trigger.condition, context);
856
832
  if (!conditionMet) {
857
833
  this.logger.info({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/workflow-executor.ts"],"sourcesContent":["import type { Payload, PayloadRequest } from 'payload'\n\n// We need to reference the generated types dynamically since they're not available at build time\n// Using generic types and casting where necessary\nexport type PayloadWorkflow = {\n id: number\n name: string\n description?: string | null\n triggers?: Array<{\n type?: string | null\n condition?: string | null\n parameters?: {\n collectionSlug?: string | null\n operation?: string | null\n webhookPath?: string | null\n cronExpression?: string | null\n timezone?: string | null\n global?: string | null\n globalOperation?: string | null\n [key: string]: unknown\n } | null\n [key: string]: unknown\n }> | null\n steps?: Array<{\n step?: string | null\n name?: string | null\n input?: unknown\n dependencies?: string[] | null\n condition?: string | null\n [key: string]: unknown\n }> | null\n [key: string]: unknown\n}\n\nimport { JSONPath } from 'jsonpath-plus'\n\n// Helper type to extract workflow step data from the generated types\nexport type WorkflowStep = NonNullable<PayloadWorkflow['steps']>[0] & {\n name: string // Ensure name is always present for our execution logic\n}\n\n// Helper type to extract workflow trigger data from the generated types \nexport type WorkflowTrigger = NonNullable<PayloadWorkflow['triggers']>[0] & {\n type: string // Ensure type is always present for our execution logic\n}\n\nexport interface ExecutionContext {\n steps: Record<string, {\n error?: string\n input: unknown\n output: unknown\n state: 'failed' | 'pending' | 'running' | 'succeeded'\n _startTime?: number\n executionInfo?: {\n completed: boolean\n success: boolean\n executedAt: string\n duration: number\n failureReason?: string\n }\n errorDetails?: {\n stepId: string\n errorType: string\n duration: number\n attempts: number\n finalError: string\n context: {\n url?: string\n method?: string\n timeout?: number\n statusCode?: number\n headers?: Record<string, string>\n [key: string]: any\n }\n timestamp: string\n }\n }>\n trigger: {\n collection?: string\n data?: unknown\n doc?: unknown\n headers?: Record<string, string>\n operation?: string\n path?: string\n previousDoc?: unknown\n req?: PayloadRequest\n triggeredAt?: string\n type: string\n user?: {\n collection?: string\n email?: string\n id?: string\n }\n }\n}\n\nexport class WorkflowExecutor {\n constructor(\n private payload: Payload,\n private logger: Payload['logger']\n ) {}\n\n /**\n * Evaluate a step condition using JSONPath\n */\n private evaluateStepCondition(condition: string, context: ExecutionContext): boolean {\n return this.evaluateCondition(condition, context)\n }\n\n /**\n * Execute a single workflow step\n */\n private async executeStep(\n step: WorkflowStep,\n stepIndex: number,\n context: ExecutionContext,\n req: PayloadRequest,\n workflowRunId?: number | string\n ): Promise<void> {\n const stepName = step.name || 'step-' + stepIndex\n\n this.logger.info({\n hasStep: 'step' in step,\n step: JSON.stringify(step),\n stepName\n }, 'Executing step')\n\n // Check step condition if present\n if (step.condition) {\n this.logger.debug({\n condition: step.condition,\n stepName,\n availableSteps: Object.keys(context.steps),\n completedSteps: Object.entries(context.steps)\n .filter(([_, s]) => s.state === 'succeeded')\n .map(([name]) => name),\n triggerType: context.trigger?.type\n }, 'Evaluating step condition')\n\n const conditionMet = this.evaluateStepCondition(step.condition, context)\n\n if (!conditionMet) {\n this.logger.info({\n condition: step.condition,\n stepName,\n contextSnapshot: JSON.stringify({\n stepOutputs: Object.entries(context.steps).reduce((acc, [name, step]) => {\n acc[name] = { state: step.state, hasOutput: !!step.output }\n return acc\n }, {} as Record<string, any>),\n triggerData: context.trigger?.data ? 'present' : 'absent'\n })\n }, 'Step condition not met, skipping')\n\n // Mark step as completed but skipped\n context.steps[stepName] = {\n error: undefined,\n input: undefined,\n output: { reason: 'Condition not met', skipped: true },\n state: 'succeeded'\n }\n\n // Update workflow run context if needed\n if (workflowRunId) {\n await this.updateWorkflowRunContext(workflowRunId, context, req)\n }\n\n return\n }\n\n this.logger.info({\n condition: step.condition,\n stepName,\n contextSnapshot: JSON.stringify({\n stepOutputs: Object.entries(context.steps).reduce((acc, [name, step]) => {\n acc[name] = { state: step.state, hasOutput: !!step.output }\n return acc\n }, {} as Record<string, any>),\n triggerData: context.trigger?.data ? 'present' : 'absent'\n })\n }, 'Step condition met, proceeding with execution')\n }\n\n // Initialize step context\n context.steps[stepName] = {\n error: undefined,\n input: undefined,\n output: undefined,\n state: 'running',\n _startTime: Date.now() // Track execution start time for independent duration tracking\n }\n\n // Move taskSlug declaration outside try block so it's accessible in catch\n const taskSlug = step.step // Use the 'step' field for task type\n\n try {\n // Extract input data from step - PayloadCMS flattens inputSchema fields to step level\n const inputFields: Record<string, unknown> = {}\n \n // Get all fields except the core step fields\n const coreFields = ['step', 'name', 'dependencies', 'condition']\n for (const [key, value] of Object.entries(step)) {\n if (!coreFields.includes(key)) {\n inputFields[key] = value\n }\n }\n \n // Resolve input data using JSONPath\n const resolvedInput = this.resolveStepInput(inputFields, context)\n context.steps[stepName].input = resolvedInput\n\n if (!taskSlug) {\n throw new Error(`Step ${stepName} is missing a task type`)\n }\n\n this.logger.info({\n hasInput: !!resolvedInput,\n hasReq: !!req,\n stepName,\n taskSlug\n }, 'Queueing task')\n\n const job = await this.payload.jobs.queue({\n input: resolvedInput,\n req,\n task: taskSlug\n })\n\n // Run the specific job immediately and wait for completion\n this.logger.info({ jobId: job.id }, 'Running job immediately using runByID')\n const runResults = await this.payload.jobs.runByID({\n id: job.id,\n req\n })\n \n this.logger.info({ \n jobId: job.id,\n runResult: runResults,\n hasResult: !!runResults\n }, 'Job run completed')\n\n // Give a small delay to ensure job is fully processed\n await new Promise(resolve => setTimeout(resolve, 100))\n\n // Get the job result\n const completedJob = await this.payload.findByID({\n id: job.id,\n collection: 'payload-jobs',\n req\n })\n\n this.logger.info({\n jobId: job.id,\n totalTried: completedJob.totalTried,\n hasError: completedJob.hasError,\n taskStatus: completedJob.taskStatus ? Object.keys(completedJob.taskStatus) : 'null'\n }, 'Retrieved job results')\n\n const taskStatus = completedJob.taskStatus?.[completedJob.taskSlug]?.[completedJob.totalTried]\n const isComplete = taskStatus?.complete === true\n const hasError = completedJob.hasError || !isComplete\n\n // Extract error information from job if available\n let errorMessage: string | undefined\n if (hasError) {\n // Try to get error from the latest log entry\n if (completedJob.log && completedJob.log.length > 0) {\n const latestLog = completedJob.log[completedJob.log.length - 1]\n errorMessage = latestLog.error?.message || latestLog.error\n }\n\n // Fallback to top-level error\n if (!errorMessage && completedJob.error) {\n errorMessage = completedJob.error.message || completedJob.error\n }\n\n // Try to get error from task output if available\n if (!errorMessage && taskStatus?.output?.error) {\n errorMessage = taskStatus.output.error\n }\n \n // Check if task handler returned with state='failed'\n if (!errorMessage && taskStatus?.state === 'failed') {\n errorMessage = 'Task handler returned a failed state'\n // Try to get more specific error from output\n if (taskStatus.output?.error) {\n errorMessage = taskStatus.output.error\n }\n }\n\n // Check for network errors in the job data\n if (!errorMessage && completedJob.result) {\n const result = completedJob.result\n if (result.error) {\n errorMessage = result.error\n }\n }\n\n // Final fallback to generic message with more detail\n if (!errorMessage) {\n const jobDetails = {\n taskSlug,\n hasError: completedJob.hasError,\n taskStatus: taskStatus?.complete,\n totalTried: completedJob.totalTried\n }\n errorMessage = `Task ${taskSlug} failed without detailed error information. Job details: ${JSON.stringify(jobDetails)}`\n }\n }\n\n const result: {\n error: string | undefined\n output: unknown\n state: 'failed' | 'succeeded'\n } = {\n error: errorMessage,\n output: taskStatus?.output || {},\n state: isComplete ? 'succeeded' : 'failed'\n }\n\n // Store the output and error\n context.steps[stepName].output = result.output\n context.steps[stepName].state = result.state\n if (result.error) {\n context.steps[stepName].error = result.error\n }\n\n // Independent execution tracking (not dependent on PayloadCMS task status)\n context.steps[stepName].executionInfo = {\n completed: true, // Step execution completed (regardless of success/failure)\n success: result.state === 'succeeded',\n executedAt: new Date().toISOString(),\n duration: Date.now() - (context.steps[stepName]._startTime || Date.now())\n }\n\n // For failed steps, try to extract detailed error information from the job logs\n // This approach is more reliable than external storage and persists with the workflow\n if (result.state === 'failed') {\n const errorDetails = this.extractErrorDetailsFromJob(completedJob, context.steps[stepName], stepName)\n if (errorDetails) {\n context.steps[stepName].errorDetails = errorDetails\n \n this.logger.info({\n stepName,\n errorType: errorDetails.errorType,\n duration: errorDetails.duration,\n attempts: errorDetails.attempts\n }, 'Extracted detailed error information for failed step')\n }\n }\n\n this.logger.debug({context}, 'Step execution context')\n\n if (result.state !== 'succeeded') {\n throw new Error(result.error || `Step ${stepName} failed`)\n }\n\n this.logger.info({\n output: result.output,\n stepName\n }, 'Step completed')\n\n // Update workflow run with current step results if workflowRunId is provided\n if (workflowRunId) {\n await this.updateWorkflowRunContext(workflowRunId, context, req)\n }\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n context.steps[stepName].state = 'failed'\n context.steps[stepName].error = errorMessage\n\n // Independent execution tracking for failed steps\n context.steps[stepName].executionInfo = {\n completed: true, // Execution attempted and completed (even if it failed)\n success: false,\n executedAt: new Date().toISOString(),\n duration: Date.now() - (context.steps[stepName]._startTime || Date.now()),\n failureReason: errorMessage\n }\n\n this.logger.error({\n error: errorMessage,\n input: context.steps[stepName].input,\n stepName,\n taskSlug\n }, 'Step execution failed')\n\n // Update workflow run with current step results if workflowRunId is provided\n if (workflowRunId) {\n try {\n await this.updateWorkflowRunContext(workflowRunId, context, req)\n } catch (updateError) {\n this.logger.error({\n error: updateError instanceof Error ? updateError.message : 'Unknown error',\n stepName\n }, 'Failed to update workflow run context after step failure')\n }\n }\n\n throw error\n }\n }\n\n /**\n * Resolve step execution order based on dependencies\n */\n private resolveExecutionOrder(steps: WorkflowStep[]): WorkflowStep[][] {\n const stepMap = new Map<string, WorkflowStep>()\n const dependencyGraph = new Map<string, string[]>()\n const indegree = new Map<string, number>()\n\n // Build the step map and dependency graph\n for (const step of steps) {\n const stepName = step.name || `step-${steps.indexOf(step)}`\n const dependencies = step.dependencies || []\n\n stepMap.set(stepName, { ...step, name: stepName, dependencies })\n dependencyGraph.set(stepName, dependencies)\n indegree.set(stepName, dependencies.length)\n }\n\n // Topological sort to determine execution batches\n const executionBatches: WorkflowStep[][] = []\n const processed = new Set<string>()\n\n while (processed.size < steps.length) {\n const currentBatch: WorkflowStep[] = []\n\n // Find all steps with no remaining dependencies\n for (const [stepName, inDegree] of indegree.entries()) {\n if (inDegree === 0 && !processed.has(stepName)) {\n const step = stepMap.get(stepName)\n if (step) {\n currentBatch.push(step)\n }\n }\n }\n\n if (currentBatch.length === 0) {\n throw new Error('Circular dependency detected in workflow steps')\n }\n\n executionBatches.push(currentBatch)\n\n // Update indegrees for next iteration\n for (const step of currentBatch) {\n processed.add(step.name)\n\n // Reduce indegree for steps that depend on completed steps\n for (const [otherStepName, dependencies] of dependencyGraph.entries()) {\n if (dependencies.includes(step.name) && !processed.has(otherStepName)) {\n indegree.set(otherStepName, (indegree.get(otherStepName) || 0) - 1)\n }\n }\n }\n }\n\n return executionBatches\n }\n\n /**\n * Resolve step input using JSONPath expressions\n */\n private resolveStepInput(config: Record<string, unknown>, context: ExecutionContext): Record<string, unknown> {\n const resolved: Record<string, unknown> = {}\n\n this.logger.debug({\n configKeys: Object.keys(config),\n contextSteps: Object.keys(context.steps),\n triggerType: context.trigger?.type\n }, 'Starting step input resolution')\n\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === 'string' && value.startsWith('$')) {\n // This is a JSONPath expression\n this.logger.debug({\n key,\n jsonPath: value,\n availableSteps: Object.keys(context.steps),\n hasTriggerData: !!context.trigger?.data,\n hasTriggerDoc: !!context.trigger?.doc\n }, 'Resolving JSONPath expression')\n\n try {\n const result = JSONPath({\n json: context,\n path: value,\n wrap: false\n })\n \n this.logger.debug({\n key,\n jsonPath: value,\n result: JSON.stringify(result).substring(0, 200),\n resultType: Array.isArray(result) ? 'array' : typeof result\n }, 'JSONPath resolved successfully')\n \n resolved[key] = result\n } catch (error) {\n this.logger.warn({\n error: error instanceof Error ? error.message : 'Unknown error',\n key,\n path: value,\n contextSnapshot: JSON.stringify(context).substring(0, 500)\n }, 'Failed to resolve JSONPath')\n resolved[key] = value // Keep original value if resolution fails\n }\n } else if (typeof value === 'object' && value !== null) {\n // Recursively resolve nested objects\n this.logger.debug({\n key,\n nestedKeys: Object.keys(value as Record<string, unknown>)\n }, 'Recursively resolving nested object')\n \n resolved[key] = this.resolveStepInput(value as Record<string, unknown>, context)\n } else {\n // Keep literal values as-is\n resolved[key] = value\n }\n }\n\n this.logger.debug({\n resolvedKeys: Object.keys(resolved),\n originalKeys: Object.keys(config)\n }, 'Step input resolution completed')\n\n return resolved\n }\n\n /**\n * Safely serialize an object, handling circular references and non-serializable values\n */\n private safeSerialize(obj: unknown): unknown {\n const seen = new WeakSet()\n \n const serialize = (value: unknown): unknown => {\n if (value === null || typeof value !== 'object') {\n return value\n }\n \n if (seen.has(value as object)) {\n return '[Circular Reference]'\n }\n \n seen.add(value as object)\n \n if (Array.isArray(value)) {\n return value.map(serialize)\n }\n \n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n try {\n // Skip non-serializable properties that are likely internal database objects\n if (key === 'table' || key === 'schema' || key === '_' || key === '__') {\n continue\n }\n result[key] = serialize(val)\n } catch {\n // Skip properties that can't be accessed or serialized\n result[key] = '[Non-serializable]'\n }\n }\n \n return result\n }\n \n return serialize(obj)\n }\n\n /**\n * Extracts detailed error information from job logs and input\n */\n private extractErrorDetailsFromJob(job: any, stepContext: any, stepName: string) {\n try {\n // Get error information from multiple sources\n const input = stepContext.input || {}\n const logs = job.log || []\n const latestLog = logs[logs.length - 1]\n \n // Extract error message from job error or log\n const errorMessage = job.error?.message || latestLog?.error?.message || 'Unknown error'\n \n // For timeout scenarios, check if it's a timeout based on duration and timeout setting\n let errorType = this.classifyErrorType(errorMessage)\n \n // Special handling for HTTP timeouts - if task failed and duration exceeds timeout, it's likely a timeout\n if (errorType === 'unknown' && input.timeout && stepContext.executionInfo?.duration) {\n const timeoutMs = parseInt(input.timeout) || 30000\n const actualDuration = stepContext.executionInfo.duration\n \n // If execution duration is close to or exceeds timeout, classify as timeout\n if (actualDuration >= (timeoutMs * 0.9)) { // 90% of timeout threshold\n errorType = 'timeout'\n this.logger.debug({\n timeoutMs,\n actualDuration,\n stepName\n }, 'Classified error as timeout based on duration analysis')\n }\n }\n \n // Calculate duration from execution info if available\n const duration = stepContext.executionInfo?.duration || 0\n \n // Extract attempt count from logs\n const attempts = job.totalTried || 1\n \n return {\n stepId: `${stepName}-${Date.now()}`,\n errorType,\n duration,\n attempts,\n finalError: errorMessage,\n context: {\n url: input.url,\n method: input.method,\n timeout: input.timeout,\n statusCode: latestLog?.output?.status,\n headers: input.headers\n },\n timestamp: new Date().toISOString()\n }\n } catch (error) {\n this.logger.warn({\n error: error instanceof Error ? error.message : 'Unknown error',\n stepName\n }, 'Failed to extract error details from job')\n return null\n }\n }\n\n /**\n * Classifies error types based on error messages\n */\n private classifyErrorType(errorMessage: string): string {\n if (errorMessage.includes('timeout') || errorMessage.includes('ETIMEDOUT')) {\n return 'timeout'\n }\n if (errorMessage.includes('ENOTFOUND') || errorMessage.includes('getaddrinfo')) {\n return 'dns'\n }\n if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('ECONNRESET')) {\n return 'connection'\n }\n if (errorMessage.includes('network') || errorMessage.includes('fetch')) {\n return 'network'\n }\n return 'unknown'\n }\n\n /**\n * Update workflow run with current context\n */\n private async updateWorkflowRunContext(\n workflowRunId: number | string,\n context: ExecutionContext,\n req: PayloadRequest\n ): Promise<void> {\n const serializeContext = () => ({\n steps: this.safeSerialize(context.steps),\n trigger: {\n type: context.trigger.type,\n collection: context.trigger.collection,\n data: this.safeSerialize(context.trigger.data),\n doc: this.safeSerialize(context.trigger.doc),\n operation: context.trigger.operation,\n previousDoc: this.safeSerialize(context.trigger.previousDoc),\n triggeredAt: context.trigger.triggeredAt,\n user: context.trigger.req?.user\n }\n })\n\n await this.payload.update({\n id: workflowRunId,\n collection: 'workflow-runs',\n data: {\n context: serializeContext()\n },\n req\n })\n }\n\n /**\n * Evaluate a condition using JSONPath and comparison operators\n */\n public evaluateCondition(condition: string, context: ExecutionContext): boolean {\n this.logger.debug({\n condition,\n contextKeys: Object.keys(context),\n triggerType: context.trigger?.type,\n triggerData: context.trigger?.data,\n triggerDoc: context.trigger?.doc ? 'present' : 'absent'\n }, 'Starting condition evaluation')\n\n try {\n // Check if this is a comparison expression\n const comparisonMatch = condition.match(/^(.+?)\\s*(==|!=|>|<|>=|<=)\\s*(.+)$/)\n \n if (comparisonMatch) {\n const [, leftExpr, operator, rightExpr] = comparisonMatch\n \n // Evaluate left side (should be JSONPath)\n const leftValue = this.resolveJSONPathValue(leftExpr.trim(), context)\n \n // Parse right side (could be string, number, boolean, or JSONPath)\n const rightValue = this.parseConditionValue(rightExpr.trim(), context)\n \n this.logger.debug({\n condition,\n leftExpr: leftExpr.trim(),\n leftValue,\n operator,\n rightExpr: rightExpr.trim(),\n rightValue,\n leftType: typeof leftValue,\n rightType: typeof rightValue\n }, 'Evaluating comparison condition')\n \n // Perform comparison\n let result: boolean\n switch (operator) {\n case '==':\n result = leftValue === rightValue\n break\n case '!=':\n result = leftValue !== rightValue\n break\n case '>':\n result = Number(leftValue) > Number(rightValue)\n break\n case '<':\n result = Number(leftValue) < Number(rightValue)\n break\n case '>=':\n result = Number(leftValue) >= Number(rightValue)\n break\n case '<=':\n result = Number(leftValue) <= Number(rightValue)\n break\n default:\n throw new Error(`Unknown comparison operator: ${operator}`)\n }\n \n this.logger.debug({\n condition,\n result,\n leftValue,\n rightValue,\n operator\n }, 'Comparison condition evaluation completed')\n \n return result\n } else {\n // Treat as simple JSONPath boolean evaluation\n const result = JSONPath({\n json: context,\n path: condition,\n wrap: false\n })\n\n this.logger.debug({\n condition,\n result,\n resultType: Array.isArray(result) ? 'array' : typeof result,\n resultLength: Array.isArray(result) ? result.length : undefined\n }, 'JSONPath boolean evaluation result')\n\n // Handle different result types\n let finalResult: boolean\n if (Array.isArray(result)) {\n finalResult = result.length > 0 && Boolean(result[0])\n } else {\n finalResult = Boolean(result)\n }\n\n this.logger.debug({\n condition,\n finalResult,\n originalResult: result\n }, 'Boolean condition evaluation completed')\n\n return finalResult\n }\n } catch (error) {\n this.logger.warn({\n condition,\n error: error instanceof Error ? error.message : 'Unknown error',\n errorStack: error instanceof Error ? error.stack : undefined\n }, 'Failed to evaluate condition')\n\n // If condition evaluation fails, assume false\n return false\n }\n }\n \n /**\n * Resolve a JSONPath value from the context\n */\n private resolveJSONPathValue(expr: string, context: ExecutionContext): any {\n if (expr.startsWith('$')) {\n const result = JSONPath({\n json: context,\n path: expr,\n wrap: false\n })\n // Return first result if array, otherwise the result itself\n return Array.isArray(result) && result.length > 0 ? result[0] : result\n }\n return expr\n }\n \n /**\n * Parse a condition value (string literal, number, boolean, or JSONPath)\n */\n private parseConditionValue(expr: string, context: ExecutionContext): any {\n // Handle string literals\n if ((expr.startsWith('\"') && expr.endsWith('\"')) || (expr.startsWith(\"'\") && expr.endsWith(\"'\"))) {\n return expr.slice(1, -1) // Remove quotes\n }\n \n // Handle boolean literals\n if (expr === 'true') return true\n if (expr === 'false') return false\n \n // Handle number literals\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return Number(expr)\n }\n \n // Handle JSONPath expressions\n if (expr.startsWith('$')) {\n return this.resolveJSONPathValue(expr, context)\n }\n \n // Return as string if nothing else matches\n return expr\n }\n\n /**\n * Execute a workflow with the given context\n */\n async execute(workflow: PayloadWorkflow, context: ExecutionContext, req: PayloadRequest): Promise<void> {\n this.logger.info({\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Starting workflow execution')\n\n const serializeContext = () => ({\n steps: this.safeSerialize(context.steps),\n trigger: {\n type: context.trigger.type,\n collection: context.trigger.collection,\n data: this.safeSerialize(context.trigger.data),\n doc: this.safeSerialize(context.trigger.doc),\n operation: context.trigger.operation,\n previousDoc: this.safeSerialize(context.trigger.previousDoc),\n triggeredAt: context.trigger.triggeredAt,\n user: context.trigger.req?.user\n }\n })\n\n this.logger.info({\n workflowId: workflow.id,\n workflowName: workflow.name,\n contextSummary: {\n triggerType: context.trigger.type,\n triggerCollection: context.trigger.collection,\n triggerOperation: context.trigger.operation,\n hasDoc: !!context.trigger.doc,\n userEmail: context.trigger.req?.user?.email\n }\n }, 'About to create workflow run record')\n\n // Create a workflow run record\n let workflowRun;\n try {\n workflowRun = await this.payload.create({\n collection: 'workflow-runs',\n data: {\n context: serializeContext(),\n startedAt: new Date().toISOString(),\n status: 'running',\n triggeredBy: context.trigger.req?.user?.email || 'system',\n workflow: workflow.id,\n workflowVersion: 1 // Default version since generated type doesn't have _version field\n },\n req\n })\n\n this.logger.info({\n workflowRunId: workflowRun.id,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Workflow run record created successfully')\n } catch (error) {\n this.logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n errorStack: error instanceof Error ? error.stack : undefined,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Failed to create workflow run record')\n throw error\n }\n\n try {\n // Resolve execution order based on dependencies\n const executionBatches = this.resolveExecutionOrder(workflow.steps as WorkflowStep[] || [])\n\n this.logger.info({\n batchSizes: executionBatches.map(batch => batch.length),\n totalBatches: executionBatches.length\n }, 'Resolved step execution order')\n\n // Execute each batch in sequence, but steps within each batch in parallel\n for (let batchIndex = 0; batchIndex < executionBatches.length; batchIndex++) {\n const batch = executionBatches[batchIndex]\n\n this.logger.info({\n batchIndex,\n stepCount: batch.length,\n stepNames: batch.map(s => s.name)\n }, 'Executing batch')\n\n // Execute all steps in this batch in parallel\n const batchPromises = batch.map((step, stepIndex) =>\n this.executeStep(step, stepIndex, context, req, workflowRun.id)\n )\n\n // Wait for all steps in the current batch to complete\n await Promise.all(batchPromises)\n\n this.logger.info({\n batchIndex,\n stepCount: batch.length\n }, 'Batch completed')\n }\n\n // Update workflow run as completed\n await this.payload.update({\n id: workflowRun.id,\n collection: 'workflow-runs',\n data: {\n completedAt: new Date().toISOString(),\n context: serializeContext(),\n status: 'completed'\n },\n req\n })\n\n this.logger.info({\n runId: workflowRun.id,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Workflow execution completed')\n\n } catch (error) {\n // Update workflow run as failed\n await this.payload.update({\n id: workflowRun.id,\n collection: 'workflow-runs',\n data: {\n completedAt: new Date().toISOString(),\n context: serializeContext(),\n error: error instanceof Error ? error.message : 'Unknown error',\n status: 'failed'\n },\n req\n })\n\n this.logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n runId: workflowRun.id,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Workflow execution failed')\n\n throw error\n }\n }\n\n /**\n * Find and execute workflows triggered by a collection operation\n */\n async executeTriggeredWorkflows(\n collection: string,\n operation: 'create' | 'delete' | 'read' | 'update',\n doc: unknown,\n previousDoc: unknown,\n req: PayloadRequest\n ): Promise<void> {\n console.log('🚨 EXECUTOR: executeTriggeredWorkflows called!')\n console.log('🚨 EXECUTOR: Collection =', collection)\n console.log('🚨 EXECUTOR: Operation =', operation)\n console.log('🚨 EXECUTOR: Doc ID =', (doc as any)?.id)\n console.log('🚨 EXECUTOR: Has payload?', !!this.payload)\n console.log('🚨 EXECUTOR: Has logger?', !!this.logger)\n \n this.logger.info({\n collection,\n operation,\n docId: (doc as any)?.id\n }, 'executeTriggeredWorkflows called')\n \n try {\n // Find workflows with matching triggers\n const workflows = await this.payload.find({\n collection: 'workflows',\n depth: 2, // Include steps and triggers\n limit: 100,\n req\n })\n \n this.logger.info({\n workflowCount: workflows.docs.length\n }, 'Found workflows to check')\n\n for (const workflow of workflows.docs) {\n // Check if this workflow has a matching trigger\n const triggers = workflow.triggers as Array<{\n condition?: string\n type: string\n parameters?: {\n collection?: string\n collectionSlug?: string\n operation?: string\n [key: string]: any\n }\n }>\n \n this.logger.info({\n workflowId: workflow.id,\n workflowName: workflow.name,\n triggerCount: triggers?.length || 0,\n triggers: triggers?.map(t => ({\n type: t.type,\n parameters: t.parameters,\n collection: t.parameters?.collection,\n collectionSlug: t.parameters?.collectionSlug,\n operation: t.parameters?.operation,\n // Debug matching criteria\n typeMatch: t.type === 'collection-trigger',\n collectionMatch: (t.parameters?.collection === collection || t.parameters?.collectionSlug === collection),\n operationMatch: t.parameters?.operation === operation\n })),\n targetCollection: collection,\n targetOperation: operation\n }, 'Checking workflow triggers with detailed matching info')\n\n const matchingTriggers = triggers?.filter(trigger =>\n trigger.type === 'collection-trigger' &&\n (trigger.parameters?.collection === collection || trigger.parameters?.collectionSlug === collection) &&\n trigger.parameters?.operation === operation\n ) || []\n \n this.logger.info({\n workflowId: workflow.id,\n workflowName: workflow.name,\n matchingTriggerCount: matchingTriggers.length,\n targetCollection: collection,\n targetOperation: operation\n }, 'Matching triggers found')\n\n for (const trigger of matchingTriggers) {\n this.logger.info({\n workflowId: workflow.id,\n workflowName: workflow.name,\n triggerDetails: {\n type: trigger.type,\n collection: trigger.parameters?.collection,\n collectionSlug: trigger.parameters?.collectionSlug,\n operation: trigger.parameters?.operation,\n hasCondition: !!trigger.condition\n }\n }, 'Processing matching trigger - about to execute workflow')\n\n // Create execution context for condition evaluation\n const context: ExecutionContext = {\n steps: {},\n trigger: {\n type: 'collection',\n collection,\n doc,\n operation,\n previousDoc,\n req\n }\n }\n\n // Check trigger condition if present\n if (trigger.condition) {\n this.logger.info({\n collection,\n operation,\n condition: trigger.condition,\n docId: (doc as any)?.id,\n docFields: doc ? Object.keys(doc) : [],\n previousDocId: (previousDoc as any)?.id,\n workflowId: workflow.id,\n workflowName: workflow.name,\n docStatus: (doc as any)?.status,\n previousDocStatus: (previousDoc as any)?.status\n }, 'Evaluating trigger condition before execution')\n\n const conditionMet = this.evaluateCondition(trigger.condition, context)\n\n if (!conditionMet) {\n this.logger.info({\n collection,\n condition: trigger.condition,\n operation,\n workflowId: workflow.id,\n workflowName: workflow.name,\n docSnapshot: JSON.stringify(doc).substring(0, 200)\n }, 'Trigger condition not met, skipping workflow')\n continue\n }\n\n this.logger.info({\n collection,\n condition: trigger.condition,\n operation,\n workflowId: workflow.id,\n workflowName: workflow.name,\n docSnapshot: JSON.stringify(doc).substring(0, 200)\n }, 'Trigger condition met')\n }\n\n this.logger.info({\n collection,\n operation,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Triggering workflow')\n\n // Execute the workflow\n await this.execute(workflow as PayloadWorkflow, context, req)\n }\n }\n } catch (error) {\n this.logger.error({ error: error instanceof Error ? error.message : 'Unknown error' }, 'Workflow execution failed')\n this.logger.error({\n collection,\n error: error instanceof Error ? error.message : 'Unknown error',\n operation\n }, 'Failed to execute triggered workflows')\n }\n }\n}\n"],"names":["JSONPath","WorkflowExecutor","payload","logger","evaluateStepCondition","condition","context","evaluateCondition","executeStep","step","stepIndex","req","workflowRunId","stepName","name","info","hasStep","JSON","stringify","debug","availableSteps","Object","keys","steps","completedSteps","entries","filter","_","s","state","map","triggerType","trigger","type","conditionMet","contextSnapshot","stepOutputs","reduce","acc","hasOutput","output","triggerData","data","error","undefined","input","reason","skipped","updateWorkflowRunContext","_startTime","Date","now","taskSlug","inputFields","coreFields","key","value","includes","resolvedInput","resolveStepInput","Error","hasInput","hasReq","job","jobs","queue","task","jobId","id","runResults","runByID","runResult","hasResult","Promise","resolve","setTimeout","completedJob","findByID","collection","totalTried","hasError","taskStatus","isComplete","complete","errorMessage","log","length","latestLog","message","result","jobDetails","executionInfo","completed","success","executedAt","toISOString","duration","errorDetails","extractErrorDetailsFromJob","errorType","attempts","failureReason","updateError","resolveExecutionOrder","stepMap","Map","dependencyGraph","indegree","indexOf","dependencies","set","executionBatches","processed","Set","size","currentBatch","inDegree","has","get","push","add","otherStepName","config","resolved","configKeys","contextSteps","startsWith","jsonPath","hasTriggerData","hasTriggerDoc","doc","json","path","wrap","substring","resultType","Array","isArray","warn","nestedKeys","resolvedKeys","originalKeys","safeSerialize","obj","seen","WeakSet","serialize","val","stepContext","logs","classifyErrorType","timeout","timeoutMs","parseInt","actualDuration","stepId","finalError","url","method","statusCode","status","headers","timestamp","serializeContext","operation","previousDoc","triggeredAt","user","update","contextKeys","triggerDoc","comparisonMatch","match","leftExpr","operator","rightExpr","leftValue","resolveJSONPathValue","trim","rightValue","parseConditionValue","leftType","rightType","Number","resultLength","finalResult","Boolean","originalResult","errorStack","stack","expr","endsWith","slice","test","execute","workflow","workflowId","workflowName","contextSummary","triggerCollection","triggerOperation","hasDoc","userEmail","email","workflowRun","create","startedAt","triggeredBy","workflowVersion","batchSizes","batch","totalBatches","batchIndex","stepCount","stepNames","batchPromises","all","completedAt","runId","executeTriggeredWorkflows","console","docId","workflows","find","depth","limit","workflowCount","docs","triggers","triggerCount","t","parameters","collectionSlug","typeMatch","collectionMatch","operationMatch","targetCollection","targetOperation","matchingTriggers","matchingTriggerCount","triggerDetails","hasCondition","docFields","previousDocId","docStatus","previousDocStatus","docSnapshot"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/core/workflow-executor.ts"],"sourcesContent":["import type { Payload, PayloadRequest } from 'payload'\n\n// We need to reference the generated types dynamically since they're not available at build time\n// Using generic types and casting where necessary\nexport type PayloadWorkflow = {\n id: number\n name: string\n description?: string | null\n triggers?: Array<{\n type?: string | null\n condition?: string | null\n parameters?: {\n collectionSlug?: string | null\n operation?: string | null\n webhookPath?: string | null\n cronExpression?: string | null\n timezone?: string | null\n global?: string | null\n globalOperation?: string | null\n [key: string]: unknown\n } | null\n [key: string]: unknown\n }> | null\n steps?: Array<{\n step?: string | null\n name?: string | null\n input?: unknown\n dependencies?: string[] | null\n condition?: string | null\n [key: string]: unknown\n }> | null\n [key: string]: unknown\n}\n\nimport { JSONPath } from 'jsonpath-plus'\n\n// Helper type to extract workflow step data from the generated types\nexport type WorkflowStep = NonNullable<PayloadWorkflow['steps']>[0] & {\n name: string // Ensure name is always present for our execution logic\n}\n\n// Helper type to extract workflow trigger data from the generated types \nexport type WorkflowTrigger = NonNullable<PayloadWorkflow['triggers']>[0] & {\n type: string // Ensure type is always present for our execution logic\n}\n\nexport interface ExecutionContext {\n steps: Record<string, {\n error?: string\n input: unknown\n output: unknown\n state: 'failed' | 'pending' | 'running' | 'succeeded'\n _startTime?: number\n executionInfo?: {\n completed: boolean\n success: boolean\n executedAt: string\n duration: number\n failureReason?: string\n }\n errorDetails?: {\n stepId: string\n errorType: string\n duration: number\n attempts: number\n finalError: string\n context: {\n url?: string\n method?: string\n timeout?: number\n statusCode?: number\n headers?: Record<string, string>\n [key: string]: any\n }\n timestamp: string\n }\n }>\n trigger: {\n collection?: string\n data?: unknown\n doc?: unknown\n headers?: Record<string, string>\n operation?: string\n path?: string\n previousDoc?: unknown\n req?: PayloadRequest\n triggeredAt?: string\n type: string\n user?: {\n collection?: string\n email?: string\n id?: string\n }\n }\n}\n\nexport class WorkflowExecutor {\n constructor(\n private payload: Payload,\n private logger: Payload['logger']\n ) {}\n\n /**\n * Evaluate a step condition using JSONPath\n */\n private evaluateStepCondition(condition: string, context: ExecutionContext): boolean {\n return this.evaluateCondition(condition, context)\n }\n\n /**\n * Execute a single workflow step\n */\n private async executeStep(\n step: WorkflowStep,\n stepIndex: number,\n context: ExecutionContext,\n req: PayloadRequest,\n workflowRunId?: number | string\n ): Promise<void> {\n const stepName = step.name || 'step-' + stepIndex\n\n this.logger.info({\n hasStep: 'step' in step,\n step: JSON.stringify(step),\n stepName\n }, 'Executing step')\n\n // Check step condition if present\n if (step.condition) {\n this.logger.debug({\n condition: step.condition,\n stepName,\n availableSteps: Object.keys(context.steps),\n completedSteps: Object.entries(context.steps)\n .filter(([_, s]) => s.state === 'succeeded')\n .map(([name]) => name),\n triggerType: context.trigger?.type\n }, 'Evaluating step condition')\n\n const conditionMet = this.evaluateStepCondition(step.condition, context)\n\n if (!conditionMet) {\n this.logger.info({\n condition: step.condition,\n stepName,\n contextSnapshot: JSON.stringify({\n stepOutputs: Object.entries(context.steps).reduce((acc, [name, step]) => {\n acc[name] = { state: step.state, hasOutput: !!step.output }\n return acc\n }, {} as Record<string, any>),\n triggerData: context.trigger?.data ? 'present' : 'absent'\n })\n }, 'Step condition not met, skipping')\n\n // Mark step as completed but skipped\n context.steps[stepName] = {\n error: undefined,\n input: undefined,\n output: { reason: 'Condition not met', skipped: true },\n state: 'succeeded'\n }\n\n // Update workflow run context if needed\n if (workflowRunId) {\n await this.updateWorkflowRunContext(workflowRunId, context, req)\n }\n\n return\n }\n\n this.logger.info({\n condition: step.condition,\n stepName,\n contextSnapshot: JSON.stringify({\n stepOutputs: Object.entries(context.steps).reduce((acc, [name, step]) => {\n acc[name] = { state: step.state, hasOutput: !!step.output }\n return acc\n }, {} as Record<string, any>),\n triggerData: context.trigger?.data ? 'present' : 'absent'\n })\n }, 'Step condition met, proceeding with execution')\n }\n\n // Initialize step context\n context.steps[stepName] = {\n error: undefined,\n input: undefined,\n output: undefined,\n state: 'running',\n _startTime: Date.now() // Track execution start time for independent duration tracking\n }\n\n // Move taskSlug declaration outside try block so it's accessible in catch\n const taskSlug = step.step // Use the 'step' field for task type\n\n try {\n // Extract input data from step - PayloadCMS flattens inputSchema fields to step level\n const inputFields: Record<string, unknown> = {}\n \n // Get all fields except the core step fields\n const coreFields = ['step', 'name', 'dependencies', 'condition']\n for (const [key, value] of Object.entries(step)) {\n if (!coreFields.includes(key)) {\n inputFields[key] = value\n }\n }\n \n // Resolve input data using JSONPath\n const resolvedInput = this.resolveStepInput(inputFields, context)\n context.steps[stepName].input = resolvedInput\n\n if (!taskSlug) {\n throw new Error(`Step ${stepName} is missing a task type`)\n }\n\n this.logger.info({\n hasInput: !!resolvedInput,\n hasReq: !!req,\n stepName,\n taskSlug\n }, 'Queueing task')\n\n const job = await this.payload.jobs.queue({\n input: resolvedInput,\n req,\n task: taskSlug\n })\n\n // Run the specific job immediately and wait for completion\n this.logger.info({ jobId: job.id }, 'Running job immediately using runByID')\n const runResults = await this.payload.jobs.runByID({\n id: job.id,\n req\n })\n \n this.logger.info({ \n jobId: job.id,\n runResult: runResults,\n hasResult: !!runResults\n }, 'Job run completed')\n\n // Give a small delay to ensure job is fully processed\n await new Promise(resolve => setTimeout(resolve, 100))\n\n // Get the job result\n const completedJob = await this.payload.findByID({\n id: job.id,\n collection: 'payload-jobs',\n req\n })\n\n this.logger.info({\n jobId: job.id,\n totalTried: completedJob.totalTried,\n hasError: completedJob.hasError,\n taskStatus: completedJob.taskStatus ? Object.keys(completedJob.taskStatus) : 'null'\n }, 'Retrieved job results')\n\n const taskStatus = completedJob.taskStatus?.[completedJob.taskSlug]?.[completedJob.totalTried]\n const isComplete = taskStatus?.complete === true\n const hasError = completedJob.hasError || !isComplete\n\n // Extract error information from job if available\n let errorMessage: string | undefined\n if (hasError) {\n // Try to get error from the latest log entry\n if (completedJob.log && completedJob.log.length > 0) {\n const latestLog = completedJob.log[completedJob.log.length - 1]\n errorMessage = latestLog.error?.message || latestLog.error\n }\n\n // Fallback to top-level error\n if (!errorMessage && completedJob.error) {\n errorMessage = completedJob.error.message || completedJob.error\n }\n\n // Try to get error from task output if available\n if (!errorMessage && taskStatus?.output?.error) {\n errorMessage = taskStatus.output.error\n }\n \n // Check if task handler returned with state='failed'\n if (!errorMessage && taskStatus?.state === 'failed') {\n errorMessage = 'Task handler returned a failed state'\n // Try to get more specific error from output\n if (taskStatus.output?.error) {\n errorMessage = taskStatus.output.error\n }\n }\n\n // Check for network errors in the job data\n if (!errorMessage && completedJob.result) {\n const result = completedJob.result\n if (result.error) {\n errorMessage = result.error\n }\n }\n\n // Final fallback to generic message with more detail\n if (!errorMessage) {\n const jobDetails = {\n taskSlug,\n hasError: completedJob.hasError,\n taskStatus: taskStatus?.complete,\n totalTried: completedJob.totalTried\n }\n errorMessage = `Task ${taskSlug} failed without detailed error information. Job details: ${JSON.stringify(jobDetails)}`\n }\n }\n\n const result: {\n error: string | undefined\n output: unknown\n state: 'failed' | 'succeeded'\n } = {\n error: errorMessage,\n output: taskStatus?.output || {},\n state: isComplete ? 'succeeded' : 'failed'\n }\n\n // Store the output and error\n context.steps[stepName].output = result.output\n context.steps[stepName].state = result.state\n if (result.error) {\n context.steps[stepName].error = result.error\n }\n\n // Independent execution tracking (not dependent on PayloadCMS task status)\n context.steps[stepName].executionInfo = {\n completed: true, // Step execution completed (regardless of success/failure)\n success: result.state === 'succeeded',\n executedAt: new Date().toISOString(),\n duration: Date.now() - (context.steps[stepName]._startTime || Date.now())\n }\n\n // For failed steps, try to extract detailed error information from the job logs\n // This approach is more reliable than external storage and persists with the workflow\n if (result.state === 'failed') {\n const errorDetails = this.extractErrorDetailsFromJob(completedJob, context.steps[stepName], stepName)\n if (errorDetails) {\n context.steps[stepName].errorDetails = errorDetails\n \n this.logger.info({\n stepName,\n errorType: errorDetails.errorType,\n duration: errorDetails.duration,\n attempts: errorDetails.attempts\n }, 'Extracted detailed error information for failed step')\n }\n }\n\n this.logger.debug({context}, 'Step execution context')\n\n if (result.state !== 'succeeded') {\n throw new Error(result.error || `Step ${stepName} failed`)\n }\n\n this.logger.info({\n output: result.output,\n stepName\n }, 'Step completed')\n\n // Update workflow run with current step results if workflowRunId is provided\n if (workflowRunId) {\n await this.updateWorkflowRunContext(workflowRunId, context, req)\n }\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n context.steps[stepName].state = 'failed'\n context.steps[stepName].error = errorMessage\n\n // Independent execution tracking for failed steps\n context.steps[stepName].executionInfo = {\n completed: true, // Execution attempted and completed (even if it failed)\n success: false,\n executedAt: new Date().toISOString(),\n duration: Date.now() - (context.steps[stepName]._startTime || Date.now()),\n failureReason: errorMessage\n }\n\n this.logger.error({\n error: errorMessage,\n input: context.steps[stepName].input,\n stepName,\n taskSlug\n }, 'Step execution failed')\n\n // Update workflow run with current step results if workflowRunId is provided\n if (workflowRunId) {\n try {\n await this.updateWorkflowRunContext(workflowRunId, context, req)\n } catch (updateError) {\n this.logger.error({\n error: updateError instanceof Error ? updateError.message : 'Unknown error',\n stepName\n }, 'Failed to update workflow run context after step failure')\n }\n }\n\n throw error\n }\n }\n\n /**\n * Resolve step execution order based on dependencies\n */\n private resolveExecutionOrder(steps: WorkflowStep[]): WorkflowStep[][] {\n const stepMap = new Map<string, WorkflowStep>()\n const dependencyGraph = new Map<string, string[]>()\n const indegree = new Map<string, number>()\n\n // Build the step map and dependency graph\n for (const step of steps) {\n const stepName = step.name || `step-${steps.indexOf(step)}`\n const dependencies = step.dependencies || []\n\n stepMap.set(stepName, { ...step, name: stepName, dependencies })\n dependencyGraph.set(stepName, dependencies)\n indegree.set(stepName, dependencies.length)\n }\n\n // Topological sort to determine execution batches\n const executionBatches: WorkflowStep[][] = []\n const processed = new Set<string>()\n\n while (processed.size < steps.length) {\n const currentBatch: WorkflowStep[] = []\n\n // Find all steps with no remaining dependencies\n for (const [stepName, inDegree] of indegree.entries()) {\n if (inDegree === 0 && !processed.has(stepName)) {\n const step = stepMap.get(stepName)\n if (step) {\n currentBatch.push(step)\n }\n }\n }\n\n if (currentBatch.length === 0) {\n throw new Error('Circular dependency detected in workflow steps')\n }\n\n executionBatches.push(currentBatch)\n\n // Update indegrees for next iteration\n for (const step of currentBatch) {\n processed.add(step.name)\n\n // Reduce indegree for steps that depend on completed steps\n for (const [otherStepName, dependencies] of dependencyGraph.entries()) {\n if (dependencies.includes(step.name) && !processed.has(otherStepName)) {\n indegree.set(otherStepName, (indegree.get(otherStepName) || 0) - 1)\n }\n }\n }\n }\n\n return executionBatches\n }\n\n /**\n * Resolve step input using JSONPath expressions\n */\n private resolveStepInput(config: Record<string, unknown>, context: ExecutionContext): Record<string, unknown> {\n const resolved: Record<string, unknown> = {}\n\n this.logger.debug({\n configKeys: Object.keys(config),\n contextSteps: Object.keys(context.steps),\n triggerType: context.trigger?.type\n }, 'Starting step input resolution')\n\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === 'string' && value.startsWith('$')) {\n // This is a JSONPath expression\n this.logger.debug({\n key,\n jsonPath: value,\n availableSteps: Object.keys(context.steps),\n hasTriggerData: !!context.trigger?.data,\n hasTriggerDoc: !!context.trigger?.doc\n }, 'Resolving JSONPath expression')\n\n try {\n const result = JSONPath({\n json: context,\n path: value,\n wrap: false\n })\n \n this.logger.debug({\n key,\n jsonPath: value,\n result: JSON.stringify(result).substring(0, 200),\n resultType: Array.isArray(result) ? 'array' : typeof result\n }, 'JSONPath resolved successfully')\n \n resolved[key] = result\n } catch (error) {\n this.logger.warn({\n error: error instanceof Error ? error.message : 'Unknown error',\n key,\n path: value,\n contextSnapshot: JSON.stringify(context).substring(0, 500)\n }, 'Failed to resolve JSONPath')\n resolved[key] = value // Keep original value if resolution fails\n }\n } else if (typeof value === 'object' && value !== null) {\n // Recursively resolve nested objects\n this.logger.debug({\n key,\n nestedKeys: Object.keys(value as Record<string, unknown>)\n }, 'Recursively resolving nested object')\n \n resolved[key] = this.resolveStepInput(value as Record<string, unknown>, context)\n } else {\n // Keep literal values as-is\n resolved[key] = value\n }\n }\n\n this.logger.debug({\n resolvedKeys: Object.keys(resolved),\n originalKeys: Object.keys(config)\n }, 'Step input resolution completed')\n\n return resolved\n }\n\n /**\n * Safely serialize an object, handling circular references and non-serializable values\n */\n private safeSerialize(obj: unknown): unknown {\n const seen = new WeakSet()\n \n const serialize = (value: unknown): unknown => {\n if (value === null || typeof value !== 'object') {\n return value\n }\n \n if (seen.has(value as object)) {\n return '[Circular Reference]'\n }\n \n seen.add(value as object)\n \n if (Array.isArray(value)) {\n return value.map(serialize)\n }\n \n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n try {\n // Skip non-serializable properties that are likely internal database objects\n if (key === 'table' || key === 'schema' || key === '_' || key === '__') {\n continue\n }\n result[key] = serialize(val)\n } catch {\n // Skip properties that can't be accessed or serialized\n result[key] = '[Non-serializable]'\n }\n }\n \n return result\n }\n \n return serialize(obj)\n }\n\n /**\n * Extracts detailed error information from job logs and input\n */\n private extractErrorDetailsFromJob(job: any, stepContext: any, stepName: string) {\n try {\n // Get error information from multiple sources\n const input = stepContext.input || {}\n const logs = job.log || []\n const latestLog = logs[logs.length - 1]\n \n // Extract error message from job error or log\n const errorMessage = job.error?.message || latestLog?.error?.message || 'Unknown error'\n \n // For timeout scenarios, check if it's a timeout based on duration and timeout setting\n let errorType = this.classifyErrorType(errorMessage)\n \n // Special handling for HTTP timeouts - if task failed and duration exceeds timeout, it's likely a timeout\n if (errorType === 'unknown' && input.timeout && stepContext.executionInfo?.duration) {\n const timeoutMs = parseInt(input.timeout) || 30000\n const actualDuration = stepContext.executionInfo.duration\n \n // If execution duration is close to or exceeds timeout, classify as timeout\n if (actualDuration >= (timeoutMs * 0.9)) { // 90% of timeout threshold\n errorType = 'timeout'\n this.logger.debug({\n timeoutMs,\n actualDuration,\n stepName\n }, 'Classified error as timeout based on duration analysis')\n }\n }\n \n // Calculate duration from execution info if available\n const duration = stepContext.executionInfo?.duration || 0\n \n // Extract attempt count from logs\n const attempts = job.totalTried || 1\n \n return {\n stepId: `${stepName}-${Date.now()}`,\n errorType,\n duration,\n attempts,\n finalError: errorMessage,\n context: {\n url: input.url,\n method: input.method,\n timeout: input.timeout,\n statusCode: latestLog?.output?.status,\n headers: input.headers\n },\n timestamp: new Date().toISOString()\n }\n } catch (error) {\n this.logger.warn({\n error: error instanceof Error ? error.message : 'Unknown error',\n stepName\n }, 'Failed to extract error details from job')\n return null\n }\n }\n\n /**\n * Classifies error types based on error messages\n */\n private classifyErrorType(errorMessage: string): string {\n if (errorMessage.includes('timeout') || errorMessage.includes('ETIMEDOUT')) {\n return 'timeout'\n }\n if (errorMessage.includes('ENOTFOUND') || errorMessage.includes('getaddrinfo')) {\n return 'dns'\n }\n if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('ECONNRESET')) {\n return 'connection'\n }\n if (errorMessage.includes('network') || errorMessage.includes('fetch')) {\n return 'network'\n }\n return 'unknown'\n }\n\n /**\n * Update workflow run with current context\n */\n private async updateWorkflowRunContext(\n workflowRunId: number | string,\n context: ExecutionContext,\n req: PayloadRequest\n ): Promise<void> {\n const serializeContext = () => ({\n steps: this.safeSerialize(context.steps),\n trigger: {\n type: context.trigger.type,\n collection: context.trigger.collection,\n data: this.safeSerialize(context.trigger.data),\n doc: this.safeSerialize(context.trigger.doc),\n operation: context.trigger.operation,\n previousDoc: this.safeSerialize(context.trigger.previousDoc),\n triggeredAt: context.trigger.triggeredAt,\n user: context.trigger.req?.user\n }\n })\n\n await this.payload.update({\n id: workflowRunId,\n collection: 'workflow-runs',\n data: {\n context: serializeContext()\n },\n req\n })\n }\n\n /**\n * Evaluate a condition using JSONPath and comparison operators\n */\n public evaluateCondition(condition: string, context: ExecutionContext): boolean {\n this.logger.debug({\n condition,\n contextKeys: Object.keys(context),\n triggerType: context.trigger?.type,\n triggerData: context.trigger?.data,\n triggerDoc: context.trigger?.doc ? 'present' : 'absent'\n }, 'Starting condition evaluation')\n\n try {\n // Check if this is a comparison expression\n const comparisonMatch = condition.match(/^(.+?)\\s*(==|!=|>|<|>=|<=)\\s*(.+)$/)\n \n if (comparisonMatch) {\n const [, leftExpr, operator, rightExpr] = comparisonMatch\n \n // Evaluate left side (should be JSONPath)\n const leftValue = this.resolveJSONPathValue(leftExpr.trim(), context)\n \n // Parse right side (could be string, number, boolean, or JSONPath)\n const rightValue = this.parseConditionValue(rightExpr.trim(), context)\n \n this.logger.debug({\n condition,\n leftExpr: leftExpr.trim(),\n leftValue,\n operator,\n rightExpr: rightExpr.trim(),\n rightValue,\n leftType: typeof leftValue,\n rightType: typeof rightValue\n }, 'Evaluating comparison condition')\n \n // Perform comparison\n let result: boolean\n switch (operator) {\n case '==':\n result = leftValue === rightValue\n break\n case '!=':\n result = leftValue !== rightValue\n break\n case '>':\n result = Number(leftValue) > Number(rightValue)\n break\n case '<':\n result = Number(leftValue) < Number(rightValue)\n break\n case '>=':\n result = Number(leftValue) >= Number(rightValue)\n break\n case '<=':\n result = Number(leftValue) <= Number(rightValue)\n break\n default:\n throw new Error(`Unknown comparison operator: ${operator}`)\n }\n \n this.logger.debug({\n condition,\n result,\n leftValue,\n rightValue,\n operator\n }, 'Comparison condition evaluation completed')\n \n return result\n } else {\n // Treat as simple JSONPath boolean evaluation\n const result = JSONPath({\n json: context,\n path: condition,\n wrap: false\n })\n\n this.logger.debug({\n condition,\n result,\n resultType: Array.isArray(result) ? 'array' : typeof result,\n resultLength: Array.isArray(result) ? result.length : undefined\n }, 'JSONPath boolean evaluation result')\n\n // Handle different result types\n let finalResult: boolean\n if (Array.isArray(result)) {\n finalResult = result.length > 0 && Boolean(result[0])\n } else {\n finalResult = Boolean(result)\n }\n\n this.logger.debug({\n condition,\n finalResult,\n originalResult: result\n }, 'Boolean condition evaluation completed')\n\n return finalResult\n }\n } catch (error) {\n this.logger.warn({\n condition,\n error: error instanceof Error ? error.message : 'Unknown error',\n errorStack: error instanceof Error ? error.stack : undefined\n }, 'Failed to evaluate condition')\n\n // If condition evaluation fails, assume false\n return false\n }\n }\n \n /**\n * Resolve a JSONPath value from the context\n */\n private resolveJSONPathValue(expr: string, context: ExecutionContext): any {\n if (expr.startsWith('$')) {\n const result = JSONPath({\n json: context,\n path: expr,\n wrap: false\n })\n // Return first result if array, otherwise the result itself\n return Array.isArray(result) && result.length > 0 ? result[0] : result\n }\n return expr\n }\n \n /**\n * Parse a condition value (string literal, number, boolean, or JSONPath)\n */\n private parseConditionValue(expr: string, context: ExecutionContext): any {\n // Handle string literals\n if ((expr.startsWith('\"') && expr.endsWith('\"')) || (expr.startsWith(\"'\") && expr.endsWith(\"'\"))) {\n return expr.slice(1, -1) // Remove quotes\n }\n \n // Handle boolean literals\n if (expr === 'true') return true\n if (expr === 'false') return false\n \n // Handle number literals\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return Number(expr)\n }\n \n // Handle JSONPath expressions\n if (expr.startsWith('$')) {\n return this.resolveJSONPathValue(expr, context)\n }\n \n // Return as string if nothing else matches\n return expr\n }\n\n /**\n * Execute a workflow with the given context\n */\n async execute(workflow: PayloadWorkflow, context: ExecutionContext, req: PayloadRequest): Promise<void> {\n this.logger.info({\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Starting workflow execution')\n\n const serializeContext = () => ({\n steps: this.safeSerialize(context.steps),\n trigger: {\n type: context.trigger.type,\n collection: context.trigger.collection,\n data: this.safeSerialize(context.trigger.data),\n doc: this.safeSerialize(context.trigger.doc),\n operation: context.trigger.operation,\n previousDoc: this.safeSerialize(context.trigger.previousDoc),\n triggeredAt: context.trigger.triggeredAt,\n user: context.trigger.req?.user\n }\n })\n\n this.logger.info({\n workflowId: workflow.id,\n workflowName: workflow.name,\n contextSummary: {\n triggerType: context.trigger.type,\n triggerCollection: context.trigger.collection,\n triggerOperation: context.trigger.operation,\n hasDoc: !!context.trigger.doc,\n userEmail: context.trigger.req?.user?.email\n }\n }, 'About to create workflow run record')\n\n // Create a workflow run record\n let workflowRun;\n try {\n workflowRun = await this.payload.create({\n collection: 'workflow-runs',\n data: {\n context: serializeContext(),\n startedAt: new Date().toISOString(),\n status: 'running',\n triggeredBy: context.trigger.req?.user?.email || 'system',\n workflow: workflow.id,\n workflowVersion: 1 // Default version since generated type doesn't have _version field\n },\n req\n })\n\n this.logger.info({\n workflowRunId: workflowRun.id,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Workflow run record created successfully')\n } catch (error) {\n this.logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n errorStack: error instanceof Error ? error.stack : undefined,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Failed to create workflow run record')\n throw error\n }\n\n try {\n // Resolve execution order based on dependencies\n const executionBatches = this.resolveExecutionOrder(workflow.steps as WorkflowStep[] || [])\n\n this.logger.info({\n batchSizes: executionBatches.map(batch => batch.length),\n totalBatches: executionBatches.length\n }, 'Resolved step execution order')\n\n // Execute each batch in sequence, but steps within each batch in parallel\n for (let batchIndex = 0; batchIndex < executionBatches.length; batchIndex++) {\n const batch = executionBatches[batchIndex]\n\n this.logger.info({\n batchIndex,\n stepCount: batch.length,\n stepNames: batch.map(s => s.name)\n }, 'Executing batch')\n\n // Execute all steps in this batch in parallel\n const batchPromises = batch.map((step, stepIndex) =>\n this.executeStep(step, stepIndex, context, req, workflowRun.id)\n )\n\n // Wait for all steps in the current batch to complete\n await Promise.all(batchPromises)\n\n this.logger.info({\n batchIndex,\n stepCount: batch.length\n }, 'Batch completed')\n }\n\n // Update workflow run as completed\n await this.payload.update({\n id: workflowRun.id,\n collection: 'workflow-runs',\n data: {\n completedAt: new Date().toISOString(),\n context: serializeContext(),\n status: 'completed'\n },\n req\n })\n\n this.logger.info({\n runId: workflowRun.id,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Workflow execution completed')\n\n } catch (error) {\n // Update workflow run as failed\n await this.payload.update({\n id: workflowRun.id,\n collection: 'workflow-runs',\n data: {\n completedAt: new Date().toISOString(),\n context: serializeContext(),\n error: error instanceof Error ? error.message : 'Unknown error',\n status: 'failed'\n },\n req\n })\n\n this.logger.error({\n error: error instanceof Error ? error.message : 'Unknown error',\n runId: workflowRun.id,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Workflow execution failed')\n\n throw error\n }\n }\n\n /**\n * Find and execute workflows triggered by a collection operation\n */\n async executeTriggeredWorkflows(\n collection: string,\n operation: 'create' | 'delete' | 'read' | 'update',\n doc: unknown,\n previousDoc: unknown,\n req: PayloadRequest\n ): Promise<void> {\n \n this.logger.info({\n collection,\n operation,\n docId: (doc as any)?.id\n }, 'executeTriggeredWorkflows called')\n \n try {\n // Find workflows with matching triggers\n const workflows = await this.payload.find({\n collection: 'workflows',\n depth: 2, // Include steps and triggers\n limit: 100,\n req\n })\n \n this.logger.info({\n workflowCount: workflows.docs.length\n }, 'Found workflows to check')\n\n for (const workflow of workflows.docs) {\n // Check if this workflow has a matching trigger\n const triggers = workflow.triggers as Array<{\n condition?: string\n type: string\n parameters?: {\n collection?: string\n collectionSlug?: string\n operation?: string\n [key: string]: any\n }\n }>\n \n this.logger.debug({\n workflowId: workflow.id,\n workflowName: workflow.name,\n triggerCount: triggers?.length || 0\n }, 'Checking workflow triggers')\n\n const matchingTriggers = triggers?.filter(trigger =>\n trigger.type === 'collection-trigger' &&\n (trigger.parameters?.collection === collection || trigger.parameters?.collectionSlug === collection) &&\n trigger.parameters?.operation === operation\n ) || []\n \n this.logger.info({\n workflowId: workflow.id,\n workflowName: workflow.name,\n matchingTriggerCount: matchingTriggers.length,\n targetCollection: collection,\n targetOperation: operation\n }, 'Matching triggers found')\n\n for (const trigger of matchingTriggers) {\n this.logger.info({\n workflowId: workflow.id,\n workflowName: workflow.name,\n triggerDetails: {\n type: trigger.type,\n collection: trigger.parameters?.collection,\n collectionSlug: trigger.parameters?.collectionSlug,\n operation: trigger.parameters?.operation,\n hasCondition: !!trigger.condition\n }\n }, 'Processing matching trigger - about to execute workflow')\n\n // Create execution context for condition evaluation\n const context: ExecutionContext = {\n steps: {},\n trigger: {\n type: 'collection',\n collection,\n doc,\n operation,\n previousDoc,\n req\n }\n }\n\n // Check trigger condition if present\n if (trigger.condition) {\n this.logger.debug({\n collection,\n operation,\n condition: trigger.condition,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Evaluating trigger condition')\n\n const conditionMet = this.evaluateCondition(trigger.condition, context)\n\n if (!conditionMet) {\n this.logger.info({\n collection,\n condition: trigger.condition,\n operation,\n workflowId: workflow.id,\n workflowName: workflow.name,\n docSnapshot: JSON.stringify(doc).substring(0, 200)\n }, 'Trigger condition not met, skipping workflow')\n continue\n }\n\n this.logger.info({\n collection,\n condition: trigger.condition,\n operation,\n workflowId: workflow.id,\n workflowName: workflow.name,\n docSnapshot: JSON.stringify(doc).substring(0, 200)\n }, 'Trigger condition met')\n }\n\n this.logger.info({\n collection,\n operation,\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Triggering workflow')\n\n // Execute the workflow\n await this.execute(workflow as PayloadWorkflow, context, req)\n }\n }\n } catch (error) {\n this.logger.error({ error: error instanceof Error ? error.message : 'Unknown error' }, 'Workflow execution failed')\n this.logger.error({\n collection,\n error: error instanceof Error ? error.message : 'Unknown error',\n operation\n }, 'Failed to execute triggered workflows')\n }\n }\n}\n"],"names":["JSONPath","WorkflowExecutor","payload","logger","evaluateStepCondition","condition","context","evaluateCondition","executeStep","step","stepIndex","req","workflowRunId","stepName","name","info","hasStep","JSON","stringify","debug","availableSteps","Object","keys","steps","completedSteps","entries","filter","_","s","state","map","triggerType","trigger","type","conditionMet","contextSnapshot","stepOutputs","reduce","acc","hasOutput","output","triggerData","data","error","undefined","input","reason","skipped","updateWorkflowRunContext","_startTime","Date","now","taskSlug","inputFields","coreFields","key","value","includes","resolvedInput","resolveStepInput","Error","hasInput","hasReq","job","jobs","queue","task","jobId","id","runResults","runByID","runResult","hasResult","Promise","resolve","setTimeout","completedJob","findByID","collection","totalTried","hasError","taskStatus","isComplete","complete","errorMessage","log","length","latestLog","message","result","jobDetails","executionInfo","completed","success","executedAt","toISOString","duration","errorDetails","extractErrorDetailsFromJob","errorType","attempts","failureReason","updateError","resolveExecutionOrder","stepMap","Map","dependencyGraph","indegree","indexOf","dependencies","set","executionBatches","processed","Set","size","currentBatch","inDegree","has","get","push","add","otherStepName","config","resolved","configKeys","contextSteps","startsWith","jsonPath","hasTriggerData","hasTriggerDoc","doc","json","path","wrap","substring","resultType","Array","isArray","warn","nestedKeys","resolvedKeys","originalKeys","safeSerialize","obj","seen","WeakSet","serialize","val","stepContext","logs","classifyErrorType","timeout","timeoutMs","parseInt","actualDuration","stepId","finalError","url","method","statusCode","status","headers","timestamp","serializeContext","operation","previousDoc","triggeredAt","user","update","contextKeys","triggerDoc","comparisonMatch","match","leftExpr","operator","rightExpr","leftValue","resolveJSONPathValue","trim","rightValue","parseConditionValue","leftType","rightType","Number","resultLength","finalResult","Boolean","originalResult","errorStack","stack","expr","endsWith","slice","test","execute","workflow","workflowId","workflowName","contextSummary","triggerCollection","triggerOperation","hasDoc","userEmail","email","workflowRun","create","startedAt","triggeredBy","workflowVersion","batchSizes","batch","totalBatches","batchIndex","stepCount","stepNames","batchPromises","all","completedAt","runId","executeTriggeredWorkflows","docId","workflows","find","depth","limit","workflowCount","docs","triggers","triggerCount","matchingTriggers","parameters","collectionSlug","matchingTriggerCount","targetCollection","targetOperation","triggerDetails","hasCondition","docSnapshot"],"mappings":"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"}
@@ -113,7 +113,7 @@ export const workflowsPlugin = (pluginOptions)=>(config)=>{
113
113
  // CRITICAL: Modify existing collection configs BEFORE PayloadCMS processes them
114
114
  // This is the ONLY time we can add hooks that will actually work
115
115
  const logger = getConfigLogger();
116
- logger.info('Attempting to modify collection configs before PayloadCMS initialization...');
116
+ logger.debug('Modifying collection configs...');
117
117
  if (config.collections && pluginOptions.collectionTriggers) {
118
118
  for (const [triggerSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)){
119
119
  if (!triggerConfig) {
@@ -246,10 +246,8 @@ export const workflowsPlugin = (pluginOptions)=>(config)=>{
246
246
  // Log collection trigger configuration
247
247
  logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${pluginOptions.steps?.length || 0} steps`);
248
248
  // Create workflow executor instance
249
- console.log('🚨 CREATING WORKFLOW EXECUTOR INSTANCE');
249
+ logger.debug('Creating workflow executor instance');
250
250
  const executor = new WorkflowExecutor(payload, logger);
251
- console.log('🚨 EXECUTOR CREATED:', typeof executor);
252
- console.log('🚨 EXECUTOR METHODS:', Object.getOwnPropertyNames(Object.getPrototypeOf(executor)));
253
251
  // Register executor with proper dependency injection
254
252
  setWorkflowExecutor(executor, logger);
255
253
  // Hooks are now registered during config phase - just log status
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type {Config} from 'payload'\n\nimport type {CollectionTriggerConfigCrud, WorkflowsPluginConfig} from \"./config-types.js\"\n\nimport {createWorkflowCollection} from '../collections/Workflow.js'\nimport {WorkflowRunsCollection} from '../collections/WorkflowRuns.js'\nimport {WorkflowExecutor} from '../core/workflow-executor.js'\nimport {generateCronTasks, registerCronJobs} from './cron-scheduler.js'\nimport {initCollectionHooks} from \"./init-collection-hooks.js\"\nimport {initGlobalHooks} from \"./init-global-hooks.js\"\nimport {initStepTasks} from \"./init-step-tasks.js\"\nimport {initWebhookEndpoint} from \"./init-webhook.js\"\nimport {initWorkflowHooks} from './init-workflow-hooks.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\n\nexport {getLogger} from './logger.js'\n\n// Improved executor registry with proper error handling and logging\ninterface ExecutorRegistry {\n executor: null | WorkflowExecutor\n isInitialized: boolean\n logger: any | null\n}\n\nconst executorRegistry: ExecutorRegistry = {\n executor: null,\n isInitialized: false,\n logger: null\n}\n\nconst setWorkflowExecutor = (executor: WorkflowExecutor, logger: any) => {\n executorRegistry.executor = executor\n executorRegistry.logger = logger\n executorRegistry.isInitialized = true\n\n logger.info('Workflow executor initialized and registered successfully')\n}\n\nconst getExecutorRegistry = (): ExecutorRegistry => {\n return executorRegistry\n}\n\n// Helper function to create failed workflow runs for tracking errors\nconst createFailedWorkflowRun = async (args: any, errorMessage: string, logger: any) => {\n try {\n // Only create failed workflow runs if we have enough context\n if (!args?.req?.payload || !args?.collection?.slug) {\n return\n }\n\n // Find workflows that should have been triggered\n const workflows = await args.req.payload.find({\n collection: 'workflows',\n limit: 10,\n req: args.req,\n where: {\n 'triggers.collectionSlug': {\n equals: args.collection.slug\n },\n 'triggers.operation': {\n equals: args.operation\n },\n 'triggers.type': {\n equals: 'collection-trigger'\n }\n }\n })\n\n // Create failed workflow runs for each matching workflow\n for (const workflow of workflows.docs) {\n await args.req.payload.create({\n collection: 'workflow-runs',\n data: {\n completedAt: new Date().toISOString(),\n context: {\n steps: {},\n trigger: {\n type: 'collection',\n collection: args.collection.slug,\n doc: args.doc,\n operation: args.operation,\n previousDoc: args.previousDoc,\n triggeredAt: new Date().toISOString()\n }\n },\n error: `Hook execution failed: ${errorMessage}`,\n inputs: {},\n logs: [{\n level: 'error',\n message: `Hook execution failed: ${errorMessage}`,\n timestamp: new Date().toISOString()\n }],\n outputs: {},\n startedAt: new Date().toISOString(),\n status: 'failed',\n steps: [],\n triggeredBy: args?.req?.user?.email || 'system',\n workflow: workflow.id,\n workflowVersion: 1\n },\n req: args.req\n })\n }\n\n if (workflows.docs.length > 0) {\n logger.info({\n errorMessage,\n workflowCount: workflows.docs.length\n }, 'Created failed workflow runs for hook execution error')\n }\n\n } catch (error) {\n // Don't let workflow run creation failures break the original operation\n logger.warn({\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 'Failed to create failed workflow run record')\n }\n}\n\nconst applyCollectionsConfig = <T extends string>(pluginOptions: WorkflowsPluginConfig<T>, config: Config) => {\n // Add workflow collections\n if (!config.collections) {\n config.collections = []\n }\n\n config.collections.push(\n createWorkflowCollection(pluginOptions),\n WorkflowRunsCollection\n )\n}\n\n// Removed config-phase hook registration - user collections don't exist during config phase\n\n\nexport const workflowsPlugin =\n <TSlug extends string>(pluginOptions: WorkflowsPluginConfig<TSlug>) =>\n (config: Config): Config => {\n // If the plugin is disabled, return config unchanged\n if (pluginOptions.enabled === false) {\n return config\n }\n\n applyCollectionsConfig<TSlug>(pluginOptions, config)\n\n // CRITICAL: Modify existing collection configs BEFORE PayloadCMS processes them\n // This is the ONLY time we can add hooks that will actually work\n const logger = getConfigLogger()\n logger.info('Attempting to modify collection configs before PayloadCMS initialization...')\n\n if (config.collections && pluginOptions.collectionTriggers) {\n for (const [triggerSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {continue}\n\n // Find the collection config that matches\n const collectionIndex = config.collections.findIndex(c => c.slug === triggerSlug)\n if (collectionIndex === -1) {\n logger.warn(`Collection '${triggerSlug}' not found in config.collections`)\n continue\n }\n\n const collection = config.collections[collectionIndex]\n logger.debug(`Found collection '${triggerSlug}' - modifying its hooks...`)\n\n // Initialize hooks if needed\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks.afterChange) {\n collection.hooks.afterChange = []\n }\n\n // Create a reliable hook function with proper dependency injection\n const automationHook = Object.assign(\n async function payloadAutomationHook(args: any) {\n const registry = getExecutorRegistry()\n\n // Use proper logger if available, fallback to args.req.payload.logger\n const logger = registry.logger || args?.req?.payload?.logger || console\n\n try {\n logger.info({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n hookType: 'automation',\n operation: args?.operation\n }, 'Collection automation hook triggered')\n\n if (!registry.isInitialized) {\n logger.warn('Workflow executor not yet initialized, attempting lazy initialization')\n \n try {\n // Try to create executor if we have a payload instance\n if (args.req?.payload) {\n logger.info('Creating workflow executor via lazy initialization')\n const { WorkflowExecutor } = await import('../core/workflow-executor.js')\n const executor = new WorkflowExecutor(args.req.payload, logger)\n setWorkflowExecutor(executor, logger)\n logger.info('Lazy initialization successful')\n } else {\n logger.error('Cannot lazy initialize - no payload instance available')\n await createFailedWorkflowRun(args, 'Workflow executor not initialized and lazy initialization failed - no payload instance', logger)\n return undefined\n }\n } catch (error) {\n logger.error('Lazy initialization failed:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n await createFailedWorkflowRun(args, `Workflow executor lazy initialization failed: ${errorMessage}`, logger)\n return undefined\n }\n }\n\n // Re-check registry after potential lazy initialization\n const updatedRegistry = getExecutorRegistry()\n if (!updatedRegistry.executor) {\n logger.error('Workflow executor is null despite being marked as initialized')\n // Create a failed workflow run to track this issue\n await createFailedWorkflowRun(args, 'Executor not available after initialization', logger)\n return undefined\n }\n\n logger.debug('Executing triggered workflows...')\n await updatedRegistry.executor.executeTriggeredWorkflows(\n args.collection.slug,\n args.operation,\n args.doc,\n args.previousDoc,\n args.req\n )\n\n logger.info({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n operation: args?.operation\n }, 'Workflow execution completed successfully')\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n\n logger.error({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n error: errorMessage,\n errorStack: error instanceof Error ? error.stack : undefined,\n operation: args?.operation\n }, 'Hook execution failed')\n\n // Create a failed workflow run to track this error\n try {\n await createFailedWorkflowRun(args, errorMessage, logger)\n } catch (createError) {\n logger.error({\n error: createError instanceof Error ? createError.message : 'Unknown error'\n }, 'Failed to create workflow run for hook error')\n }\n\n // Don't throw to prevent breaking the original operation\n }\n\n return undefined\n },\n {\n __isAutomationHook: true,\n __version: '0.0.22'\n }\n )\n\n // Add the hook to the collection config\n collection.hooks.afterChange.push(automationHook)\n logger.debug(`Added automation hook to '${triggerSlug}' - hook count: ${collection.hooks.afterChange.length}`)\n }\n }\n\n if (!config.jobs) {\n config.jobs = {tasks: []}\n }\n\n const configLogger = getConfigLogger()\n configLogger.debug(`Configuring workflow plugin with ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers`)\n\n // Generate cron tasks for workflows with cron triggers\n generateCronTasks(config)\n\n for (const step of pluginOptions.steps) {\n if (!config.jobs?.tasks?.find(task => task.slug === step.slug)) {\n configLogger.debug(`Registering task: ${step.slug}`)\n config.jobs?.tasks?.push(step)\n } else {\n configLogger.debug(`Task ${step.slug} already registered, skipping`)\n }\n }\n\n // Initialize webhook endpoint\n initWebhookEndpoint(config, pluginOptions.webhookPrefix || 'webhook')\n\n // Set up onInit to register collection hooks and initialize features\n const incomingOnInit = config.onInit\n config.onInit = async (payload) => {\n configLogger.info(`onInit called - collections: ${Object.keys(payload.collections).length}`)\n\n // Execute any existing onInit functions first\n if (incomingOnInit) {\n configLogger.debug('Executing existing onInit function')\n await incomingOnInit(payload)\n }\n\n // Initialize the logger with the payload instance\n const logger = initializeLogger(payload)\n logger.info('Logger initialized with payload instance')\n\n // Log collection trigger configuration\n logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${pluginOptions.steps?.length || 0} steps`)\n\n // Create workflow executor instance\n console.log('🚨 CREATING WORKFLOW EXECUTOR INSTANCE')\n const executor = new WorkflowExecutor(payload, logger)\n console.log('🚨 EXECUTOR CREATED:', typeof executor)\n console.log('🚨 EXECUTOR METHODS:', Object.getOwnPropertyNames(Object.getPrototypeOf(executor)))\n\n // Register executor with proper dependency injection\n setWorkflowExecutor(executor, logger)\n\n // Hooks are now registered during config phase - just log status\n logger.info('Hooks were registered during config phase - executor now available')\n\n logger.info('Initializing global hooks...')\n initGlobalHooks(payload, logger, executor)\n\n logger.info('Initializing workflow hooks...')\n initWorkflowHooks(payload, logger)\n\n logger.info('Initializing step tasks...')\n initStepTasks(pluginOptions, payload, logger)\n\n // Register cron jobs for workflows with cron triggers\n logger.info('Registering cron jobs...')\n await registerCronJobs(payload, logger)\n\n logger.info('Plugin initialized successfully - all hooks registered')\n }\n\n return config\n }\n"],"names":["createWorkflowCollection","WorkflowRunsCollection","WorkflowExecutor","generateCronTasks","registerCronJobs","initGlobalHooks","initStepTasks","initWebhookEndpoint","initWorkflowHooks","getConfigLogger","initializeLogger","getLogger","executorRegistry","executor","isInitialized","logger","setWorkflowExecutor","info","getExecutorRegistry","createFailedWorkflowRun","args","errorMessage","req","payload","collection","slug","workflows","find","limit","where","equals","operation","workflow","docs","create","data","completedAt","Date","toISOString","context","steps","trigger","type","doc","previousDoc","triggeredAt","error","inputs","logs","level","message","timestamp","outputs","startedAt","status","triggeredBy","user","email","id","workflowVersion","length","workflowCount","warn","Error","applyCollectionsConfig","pluginOptions","config","collections","push","workflowsPlugin","enabled","collectionTriggers","triggerSlug","triggerConfig","Object","entries","collectionIndex","findIndex","c","debug","hooks","afterChange","automationHook","assign","payloadAutomationHook","registry","console","docId","hookType","undefined","String","updatedRegistry","executeTriggeredWorkflows","errorStack","stack","createError","__isAutomationHook","__version","jobs","tasks","configLogger","keys","step","task","webhookPrefix","incomingOnInit","onInit","log","getOwnPropertyNames","getPrototypeOf"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/plugin/index.ts"],"sourcesContent":["import type {Config} from 'payload'\n\nimport type {CollectionTriggerConfigCrud, WorkflowsPluginConfig} from \"./config-types.js\"\n\nimport {createWorkflowCollection} from '../collections/Workflow.js'\nimport {WorkflowRunsCollection} from '../collections/WorkflowRuns.js'\nimport {WorkflowExecutor} from '../core/workflow-executor.js'\nimport {generateCronTasks, registerCronJobs} from './cron-scheduler.js'\nimport {initCollectionHooks} from \"./init-collection-hooks.js\"\nimport {initGlobalHooks} from \"./init-global-hooks.js\"\nimport {initStepTasks} from \"./init-step-tasks.js\"\nimport {initWebhookEndpoint} from \"./init-webhook.js\"\nimport {initWorkflowHooks} from './init-workflow-hooks.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\n\nexport {getLogger} from './logger.js'\n\n// Improved executor registry with proper error handling and logging\ninterface ExecutorRegistry {\n executor: null | WorkflowExecutor\n isInitialized: boolean\n logger: any | null\n}\n\nconst executorRegistry: ExecutorRegistry = {\n executor: null,\n isInitialized: false,\n logger: null\n}\n\nconst setWorkflowExecutor = (executor: WorkflowExecutor, logger: any) => {\n executorRegistry.executor = executor\n executorRegistry.logger = logger\n executorRegistry.isInitialized = true\n\n logger.info('Workflow executor initialized and registered successfully')\n}\n\nconst getExecutorRegistry = (): ExecutorRegistry => {\n return executorRegistry\n}\n\n// Helper function to create failed workflow runs for tracking errors\nconst createFailedWorkflowRun = async (args: any, errorMessage: string, logger: any) => {\n try {\n // Only create failed workflow runs if we have enough context\n if (!args?.req?.payload || !args?.collection?.slug) {\n return\n }\n\n // Find workflows that should have been triggered\n const workflows = await args.req.payload.find({\n collection: 'workflows',\n limit: 10,\n req: args.req,\n where: {\n 'triggers.collectionSlug': {\n equals: args.collection.slug\n },\n 'triggers.operation': {\n equals: args.operation\n },\n 'triggers.type': {\n equals: 'collection-trigger'\n }\n }\n })\n\n // Create failed workflow runs for each matching workflow\n for (const workflow of workflows.docs) {\n await args.req.payload.create({\n collection: 'workflow-runs',\n data: {\n completedAt: new Date().toISOString(),\n context: {\n steps: {},\n trigger: {\n type: 'collection',\n collection: args.collection.slug,\n doc: args.doc,\n operation: args.operation,\n previousDoc: args.previousDoc,\n triggeredAt: new Date().toISOString()\n }\n },\n error: `Hook execution failed: ${errorMessage}`,\n inputs: {},\n logs: [{\n level: 'error',\n message: `Hook execution failed: ${errorMessage}`,\n timestamp: new Date().toISOString()\n }],\n outputs: {},\n startedAt: new Date().toISOString(),\n status: 'failed',\n steps: [],\n triggeredBy: args?.req?.user?.email || 'system',\n workflow: workflow.id,\n workflowVersion: 1\n },\n req: args.req\n })\n }\n\n if (workflows.docs.length > 0) {\n logger.info({\n errorMessage,\n workflowCount: workflows.docs.length\n }, 'Created failed workflow runs for hook execution error')\n }\n\n } catch (error) {\n // Don't let workflow run creation failures break the original operation\n logger.warn({\n error: error instanceof Error ? error.message : 'Unknown error'\n }, 'Failed to create failed workflow run record')\n }\n}\n\nconst applyCollectionsConfig = <T extends string>(pluginOptions: WorkflowsPluginConfig<T>, config: Config) => {\n // Add workflow collections\n if (!config.collections) {\n config.collections = []\n }\n\n config.collections.push(\n createWorkflowCollection(pluginOptions),\n WorkflowRunsCollection\n )\n}\n\n// Removed config-phase hook registration - user collections don't exist during config phase\n\n\nexport const workflowsPlugin =\n <TSlug extends string>(pluginOptions: WorkflowsPluginConfig<TSlug>) =>\n (config: Config): Config => {\n // If the plugin is disabled, return config unchanged\n if (pluginOptions.enabled === false) {\n return config\n }\n\n applyCollectionsConfig<TSlug>(pluginOptions, config)\n\n // CRITICAL: Modify existing collection configs BEFORE PayloadCMS processes them\n // This is the ONLY time we can add hooks that will actually work\n const logger = getConfigLogger()\n logger.debug('Modifying collection configs...')\n\n if (config.collections && pluginOptions.collectionTriggers) {\n for (const [triggerSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {continue}\n\n // Find the collection config that matches\n const collectionIndex = config.collections.findIndex(c => c.slug === triggerSlug)\n if (collectionIndex === -1) {\n logger.warn(`Collection '${triggerSlug}' not found in config.collections`)\n continue\n }\n\n const collection = config.collections[collectionIndex]\n logger.debug(`Found collection '${triggerSlug}' - modifying its hooks...`)\n\n // Initialize hooks if needed\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks.afterChange) {\n collection.hooks.afterChange = []\n }\n\n // Create a reliable hook function with proper dependency injection\n const automationHook = Object.assign(\n async function payloadAutomationHook(args: any) {\n const registry = getExecutorRegistry()\n\n // Use proper logger if available, fallback to args.req.payload.logger\n const logger = registry.logger || args?.req?.payload?.logger || console\n\n try {\n logger.info({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n hookType: 'automation',\n operation: args?.operation\n }, 'Collection automation hook triggered')\n\n if (!registry.isInitialized) {\n logger.warn('Workflow executor not yet initialized, attempting lazy initialization')\n \n try {\n // Try to create executor if we have a payload instance\n if (args.req?.payload) {\n logger.info('Creating workflow executor via lazy initialization')\n const { WorkflowExecutor } = await import('../core/workflow-executor.js')\n const executor = new WorkflowExecutor(args.req.payload, logger)\n setWorkflowExecutor(executor, logger)\n logger.info('Lazy initialization successful')\n } else {\n logger.error('Cannot lazy initialize - no payload instance available')\n await createFailedWorkflowRun(args, 'Workflow executor not initialized and lazy initialization failed - no payload instance', logger)\n return undefined\n }\n } catch (error) {\n logger.error('Lazy initialization failed:', error)\n const errorMessage = error instanceof Error ? error.message : String(error)\n await createFailedWorkflowRun(args, `Workflow executor lazy initialization failed: ${errorMessage}`, logger)\n return undefined\n }\n }\n\n // Re-check registry after potential lazy initialization\n const updatedRegistry = getExecutorRegistry()\n if (!updatedRegistry.executor) {\n logger.error('Workflow executor is null despite being marked as initialized')\n // Create a failed workflow run to track this issue\n await createFailedWorkflowRun(args, 'Executor not available after initialization', logger)\n return undefined\n }\n\n logger.debug('Executing triggered workflows...')\n await updatedRegistry.executor.executeTriggeredWorkflows(\n args.collection.slug,\n args.operation,\n args.doc,\n args.previousDoc,\n args.req\n )\n\n logger.info({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n operation: args?.operation\n }, 'Workflow execution completed successfully')\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n\n logger.error({\n collection: args?.collection?.slug,\n docId: args?.doc?.id,\n error: errorMessage,\n errorStack: error instanceof Error ? error.stack : undefined,\n operation: args?.operation\n }, 'Hook execution failed')\n\n // Create a failed workflow run to track this error\n try {\n await createFailedWorkflowRun(args, errorMessage, logger)\n } catch (createError) {\n logger.error({\n error: createError instanceof Error ? createError.message : 'Unknown error'\n }, 'Failed to create workflow run for hook error')\n }\n\n // Don't throw to prevent breaking the original operation\n }\n\n return undefined\n },\n {\n __isAutomationHook: true,\n __version: '0.0.22'\n }\n )\n\n // Add the hook to the collection config\n collection.hooks.afterChange.push(automationHook)\n logger.debug(`Added automation hook to '${triggerSlug}' - hook count: ${collection.hooks.afterChange.length}`)\n }\n }\n\n if (!config.jobs) {\n config.jobs = {tasks: []}\n }\n\n const configLogger = getConfigLogger()\n configLogger.debug(`Configuring workflow plugin with ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers`)\n\n // Generate cron tasks for workflows with cron triggers\n generateCronTasks(config)\n\n for (const step of pluginOptions.steps) {\n if (!config.jobs?.tasks?.find(task => task.slug === step.slug)) {\n configLogger.debug(`Registering task: ${step.slug}`)\n config.jobs?.tasks?.push(step)\n } else {\n configLogger.debug(`Task ${step.slug} already registered, skipping`)\n }\n }\n\n // Initialize webhook endpoint\n initWebhookEndpoint(config, pluginOptions.webhookPrefix || 'webhook')\n\n // Set up onInit to register collection hooks and initialize features\n const incomingOnInit = config.onInit\n config.onInit = async (payload) => {\n configLogger.info(`onInit called - collections: ${Object.keys(payload.collections).length}`)\n\n // Execute any existing onInit functions first\n if (incomingOnInit) {\n configLogger.debug('Executing existing onInit function')\n await incomingOnInit(payload)\n }\n\n // Initialize the logger with the payload instance\n const logger = initializeLogger(payload)\n logger.info('Logger initialized with payload instance')\n\n // Log collection trigger configuration\n logger.info(`Plugin configuration: ${Object.keys(pluginOptions.collectionTriggers || {}).length} collection triggers, ${pluginOptions.steps?.length || 0} steps`)\n\n // Create workflow executor instance\n logger.debug('Creating workflow executor instance')\n const executor = new WorkflowExecutor(payload, logger)\n\n // Register executor with proper dependency injection\n setWorkflowExecutor(executor, logger)\n\n // Hooks are now registered during config phase - just log status\n logger.info('Hooks were registered during config phase - executor now available')\n\n logger.info('Initializing global hooks...')\n initGlobalHooks(payload, logger, executor)\n\n logger.info('Initializing workflow hooks...')\n initWorkflowHooks(payload, logger)\n\n logger.info('Initializing step tasks...')\n initStepTasks(pluginOptions, payload, logger)\n\n // Register cron jobs for workflows with cron triggers\n logger.info('Registering cron jobs...')\n await registerCronJobs(payload, logger)\n\n logger.info('Plugin initialized successfully - all hooks registered')\n }\n\n return config\n }\n"],"names":["createWorkflowCollection","WorkflowRunsCollection","WorkflowExecutor","generateCronTasks","registerCronJobs","initGlobalHooks","initStepTasks","initWebhookEndpoint","initWorkflowHooks","getConfigLogger","initializeLogger","getLogger","executorRegistry","executor","isInitialized","logger","setWorkflowExecutor","info","getExecutorRegistry","createFailedWorkflowRun","args","errorMessage","req","payload","collection","slug","workflows","find","limit","where","equals","operation","workflow","docs","create","data","completedAt","Date","toISOString","context","steps","trigger","type","doc","previousDoc","triggeredAt","error","inputs","logs","level","message","timestamp","outputs","startedAt","status","triggeredBy","user","email","id","workflowVersion","length","workflowCount","warn","Error","applyCollectionsConfig","pluginOptions","config","collections","push","workflowsPlugin","enabled","debug","collectionTriggers","triggerSlug","triggerConfig","Object","entries","collectionIndex","findIndex","c","hooks","afterChange","automationHook","assign","payloadAutomationHook","registry","console","docId","hookType","undefined","String","updatedRegistry","executeTriggeredWorkflows","errorStack","stack","createError","__isAutomationHook","__version","jobs","tasks","configLogger","keys","step","task","webhookPrefix","incomingOnInit","onInit"],"mappings":"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"}
@@ -29,13 +29,6 @@ export function initCollectionHooks(pluginOptions, payload, logger, executor) {
29
29
  collection.config.hooks.afterChange = collection.config.hooks.afterChange || [];
30
30
  collection.config.hooks.afterChange.push(async (change)=>{
31
31
  const operation = change.operation;
32
- // AGGRESSIVE LOGGING - this should ALWAYS appear
33
- console.log('🚨 AUTOMATION PLUGIN HOOK CALLED! 🚨');
34
- console.log('Collection:', change.collection.slug);
35
- console.log('Operation:', operation);
36
- console.log('Doc ID:', change.doc?.id);
37
- console.log('Has executor?', !!executor);
38
- console.log('Executor type:', typeof executor);
39
32
  logger.info({
40
33
  slug: change.collection.slug,
41
34
  operation,
@@ -43,19 +36,16 @@ export function initCollectionHooks(pluginOptions, payload, logger, executor) {
43
36
  previousDocId: change.previousDoc?.id,
44
37
  hasExecutor: !!executor,
45
38
  executorType: typeof executor
46
- }, 'AUTOMATION PLUGIN: Collection hook triggered');
39
+ }, 'Collection automation hook triggered');
47
40
  try {
48
- console.log('🚨 About to call executeTriggeredWorkflows');
49
41
  // Execute workflows for this trigger
50
42
  await executor.executeTriggeredWorkflows(change.collection.slug, operation, change.doc, change.previousDoc, change.req);
51
- console.log('🚨 executeTriggeredWorkflows completed without error');
52
43
  logger.info({
53
44
  slug: change.collection.slug,
54
45
  operation,
55
46
  docId: change.doc?.id
56
- }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows completed successfully');
47
+ }, 'Workflow execution completed successfully');
57
48
  } catch (error) {
58
- console.log('🚨 AUTOMATION PLUGIN ERROR:', error);
59
49
  logger.error({
60
50
  slug: change.collection.slug,
61
51
  operation,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugin/init-collection-hooks.ts"],"sourcesContent":["import type {Payload} from \"payload\"\nimport type {Logger} from \"pino\"\n\nimport type { WorkflowExecutor } from \"../core/workflow-executor.js\"\nimport type {CollectionTriggerConfigCrud, WorkflowsPluginConfig} from \"./config-types.js\"\n\nexport function initCollectionHooks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor) {\n \n if (!pluginOptions.collectionTriggers || Object.keys(pluginOptions.collectionTriggers).length === 0) {\n logger.warn('No collection triggers configured in plugin options')\n return\n }\n\n logger.info({\n configuredCollections: Object.keys(pluginOptions.collectionTriggers),\n availableCollections: Object.keys(payload.collections)\n }, 'Starting collection hook registration')\n\n // Add hooks to configured collections\n for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {\n logger.debug({collectionSlug}, 'Skipping collection with falsy trigger config')\n continue\n }\n\n const collection = payload.collections[collectionSlug as T]\n const crud: CollectionTriggerConfigCrud = triggerConfig === true ? {\n create: true,\n delete: true,\n read: true,\n update: true,\n } : triggerConfig\n\n if (!collection.config.hooks) {\n collection.config.hooks = {} as typeof collection.config.hooks\n }\n\n if (crud.update || crud.create) {\n collection.config.hooks.afterChange = collection.config.hooks.afterChange || []\n collection.config.hooks.afterChange.push(async (change) => {\n const operation = change.operation as 'create' | 'update'\n \n // AGGRESSIVE LOGGING - this should ALWAYS appear\n console.log('🚨 AUTOMATION PLUGIN HOOK CALLED! 🚨')\n console.log('Collection:', change.collection.slug)\n console.log('Operation:', operation)\n console.log('Doc ID:', change.doc?.id)\n console.log('Has executor?', !!executor)\n console.log('Executor type:', typeof executor)\n \n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n previousDocId: change.previousDoc?.id,\n hasExecutor: !!executor,\n executorType: typeof executor\n }, 'AUTOMATION PLUGIN: Collection hook triggered')\n\n try {\n console.log('🚨 About to call executeTriggeredWorkflows')\n \n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n operation,\n change.doc,\n change.previousDoc,\n change.req\n )\n \n console.log('🚨 executeTriggeredWorkflows completed without error')\n \n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id\n }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows completed successfully')\n } catch (error) {\n console.log('🚨 AUTOMATION PLUGIN ERROR:', error)\n \n logger.error({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined\n }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows failed')\n // Don't re-throw to avoid breaking other hooks\n }\n })\n }\n\n if (crud.read) {\n collection.config.hooks.afterRead = collection.config.hooks.afterRead || []\n collection.config.hooks.afterRead.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'read',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'read',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (crud.delete) {\n collection.config.hooks.afterDelete = collection.config.hooks.afterDelete || []\n collection.config.hooks.afterDelete.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'delete',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'delete',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (collection) {\n logger.info({\n collectionSlug,\n hooksRegistered: {\n afterChange: crud.update || crud.create,\n afterRead: crud.read,\n afterDelete: crud.delete\n }\n }, 'Collection hooks registered successfully')\n } else {\n logger.error({\n collectionSlug,\n availableCollections: Object.keys(payload.collections)\n }, 'Collection not found for trigger configuration - check collection slug spelling')\n }\n }\n}\n"],"names":["initCollectionHooks","pluginOptions","payload","logger","executor","collectionTriggers","Object","keys","length","warn","info","configuredCollections","availableCollections","collections","collectionSlug","triggerConfig","entries","debug","collection","crud","create","delete","read","update","config","hooks","afterChange","push","change","operation","console","log","slug","doc","id","docId","previousDocId","previousDoc","hasExecutor","executorType","executeTriggeredWorkflows","req","error","Error","message","stack","undefined","afterRead","afterDelete","hooksRegistered"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/plugin/init-collection-hooks.ts"],"sourcesContent":["import type {Payload} from \"payload\"\nimport type {Logger} from \"pino\"\n\nimport type { WorkflowExecutor } from \"../core/workflow-executor.js\"\nimport type {CollectionTriggerConfigCrud, WorkflowsPluginConfig} from \"./config-types.js\"\n\nexport function initCollectionHooks<T extends string>(pluginOptions: WorkflowsPluginConfig<T>, payload: Payload, logger: Payload['logger'], executor: WorkflowExecutor) {\n \n if (!pluginOptions.collectionTriggers || Object.keys(pluginOptions.collectionTriggers).length === 0) {\n logger.warn('No collection triggers configured in plugin options')\n return\n }\n\n logger.info({\n configuredCollections: Object.keys(pluginOptions.collectionTriggers),\n availableCollections: Object.keys(payload.collections)\n }, 'Starting collection hook registration')\n\n // Add hooks to configured collections\n for (const [collectionSlug, triggerConfig] of Object.entries(pluginOptions.collectionTriggers)) {\n if (!triggerConfig) {\n logger.debug({collectionSlug}, 'Skipping collection with falsy trigger config')\n continue\n }\n\n const collection = payload.collections[collectionSlug as T]\n const crud: CollectionTriggerConfigCrud = triggerConfig === true ? {\n create: true,\n delete: true,\n read: true,\n update: true,\n } : triggerConfig\n\n if (!collection.config.hooks) {\n collection.config.hooks = {} as typeof collection.config.hooks\n }\n\n if (crud.update || crud.create) {\n collection.config.hooks.afterChange = collection.config.hooks.afterChange || []\n collection.config.hooks.afterChange.push(async (change) => {\n const operation = change.operation as 'create' | 'update'\n \n \n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n previousDocId: change.previousDoc?.id,\n hasExecutor: !!executor,\n executorType: typeof executor\n }, 'Collection automation hook triggered')\n\n try {\n \n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n operation,\n change.doc,\n change.previousDoc,\n change.req\n )\n \n \n logger.info({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id\n }, 'Workflow execution completed successfully')\n } catch (error) {\n \n logger.error({\n slug: change.collection.slug,\n operation,\n docId: change.doc?.id,\n error: error instanceof Error ? error.message : 'Unknown error',\n stack: error instanceof Error ? error.stack : undefined\n }, 'AUTOMATION PLUGIN: executeTriggeredWorkflows failed')\n // Don't re-throw to avoid breaking other hooks\n }\n })\n }\n\n if (crud.read) {\n collection.config.hooks.afterRead = collection.config.hooks.afterRead || []\n collection.config.hooks.afterRead.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'read',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'read',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (crud.delete) {\n collection.config.hooks.afterDelete = collection.config.hooks.afterDelete || []\n collection.config.hooks.afterDelete.push(async (change) => {\n logger.debug({\n slug: change.collection.slug,\n operation: 'delete',\n }, 'Collection hook triggered')\n\n // Execute workflows for this trigger\n await executor.executeTriggeredWorkflows(\n change.collection.slug,\n 'delete',\n change.doc,\n undefined,\n change.req\n )\n })\n }\n\n if (collection) {\n logger.info({\n collectionSlug,\n hooksRegistered: {\n afterChange: crud.update || crud.create,\n afterRead: crud.read,\n afterDelete: crud.delete\n }\n }, 'Collection hooks registered successfully')\n } else {\n logger.error({\n collectionSlug,\n availableCollections: Object.keys(payload.collections)\n }, 'Collection not found for trigger configuration - check collection slug spelling')\n }\n }\n}\n"],"names":["initCollectionHooks","pluginOptions","payload","logger","executor","collectionTriggers","Object","keys","length","warn","info","configuredCollections","availableCollections","collections","collectionSlug","triggerConfig","entries","debug","collection","crud","create","delete","read","update","config","hooks","afterChange","push","change","operation","slug","docId","doc","id","previousDocId","previousDoc","hasExecutor","executorType","executeTriggeredWorkflows","req","error","Error","message","stack","undefined","afterRead","afterDelete","hooksRegistered"],"mappings":"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"}
@@ -4,8 +4,7 @@ export function initWebhookEndpoint(config, webhookPrefix = 'webhook') {
4
4
  const logger = getConfigLogger();
5
5
  // Ensure the prefix starts with a slash
6
6
  const normalizedPrefix = webhookPrefix.startsWith('/') ? webhookPrefix : `/${webhookPrefix}`;
7
- logger.debug(`Adding webhook endpoint to config with prefix: ${normalizedPrefix}`);
8
- logger.debug('Current config.endpoints length:', config.endpoints?.length || 0);
7
+ logger.debug(`Adding webhook endpoint: ${normalizedPrefix}`);
9
8
  // Define webhook endpoint
10
9
  const webhookEndpoint = {
11
10
  handler: async (req)=>{
@@ -155,7 +154,7 @@ export function initWebhookEndpoint(config, webhookPrefix = 'webhook') {
155
154
  webhookEndpoint
156
155
  ];
157
156
  logger.debug(`Webhook endpoint added at path: ${webhookEndpoint.path}`);
158
- logger.debug('New config.endpoints length:', config.endpoints.length);
157
+ logger.debug('Webhook endpoint added');
159
158
  } else {
160
159
  logger.debug(`Webhook endpoint already exists at path: ${webhookEndpoint.path}`);
161
160
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugin/init-webhook.ts"],"sourcesContent":["import type {Config, PayloadRequest} from 'payload'\n\nimport {type PayloadWorkflow, WorkflowExecutor} from '../core/workflow-executor.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\n\nexport function initWebhookEndpoint(config: Config, webhookPrefix = 'webhook'): void {\n const logger = getConfigLogger()\n // Ensure the prefix starts with a slash\n const normalizedPrefix = webhookPrefix.startsWith('/') ? webhookPrefix : `/${webhookPrefix}`\n logger.debug(`Adding webhook endpoint to config with prefix: ${normalizedPrefix}`)\n logger.debug('Current config.endpoints length:', config.endpoints?.length || 0)\n\n // Define webhook endpoint\n const webhookEndpoint = {\n handler: async (req: PayloadRequest) => {\n const {path} = req.routeParams as { path: string }\n const webhookData = req.body || {}\n\n logger.debug('Webhook endpoint handler called, path: ' + path)\n\n try {\n // Find workflows with matching webhook triggers\n const workflows = await req.payload.find({\n collection: 'workflows',\n depth: 2,\n limit: 100,\n req,\n where: {\n 'triggers.type': {\n equals: 'webhook-trigger'\n },\n 'triggers.webhookPath': {\n equals: path\n }\n }\n })\n\n if (workflows.docs.length === 0) {\n return new Response(\n JSON.stringify({error: 'No workflows found for this webhook path'}),\n {\n headers: {'Content-Type': 'application/json'},\n status: 404\n }\n )\n }\n\n // Create a workflow executor for this request\n const logger = initializeLogger(req.payload)\n const executor = new WorkflowExecutor(req.payload, logger)\n\n const executionPromises = workflows.docs.map(async (workflow) => {\n try {\n // Create execution context for the webhook trigger\n const context = {\n steps: {},\n trigger: {\n type: 'webhook',\n data: webhookData,\n headers: Object.fromEntries(req.headers?.entries() || []),\n path,\n req\n }\n }\n\n // Find the matching trigger and check its condition if present\n const triggers = workflow.triggers as Array<{\n condition?: string\n type: string\n parameters?: {\n webhookPath?: string\n [key: string]: any\n }\n }>\n\n const matchingTrigger = triggers?.find(trigger =>\n trigger.type === 'webhook-trigger' &&\n trigger.parameters?.webhookPath === path\n )\n\n // Check trigger condition if present\n if (matchingTrigger?.condition) {\n logger.debug({\n condition: matchingTrigger.condition,\n path,\n webhookData: JSON.stringify(webhookData).substring(0, 200),\n headers: Object.keys(context.trigger.headers || {}),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Evaluating webhook trigger condition')\n\n const conditionMet = executor.evaluateCondition(matchingTrigger.condition, context)\n\n if (!conditionMet) {\n logger.info({\n condition: matchingTrigger.condition,\n path,\n webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Webhook trigger condition not met, skipping workflow')\n\n return { reason: 'Condition not met', status: 'skipped', workflowId: workflow.id }\n }\n\n logger.info({\n condition: matchingTrigger.condition,\n path,\n webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Webhook trigger condition met')\n }\n\n // Execute the workflow\n await executor.execute(workflow as PayloadWorkflow, context, req)\n\n return { status: 'triggered', workflowId: workflow.id }\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Unknown error',\n status: 'failed',\n workflowId: workflow.id\n }\n }\n })\n\n const results = await Promise.allSettled(executionPromises)\n const resultsData = results.map((result, index) => {\n const baseResult = { workflowId: workflows.docs[index].id }\n if (result.status === 'fulfilled') {\n return { ...baseResult, ...result.value }\n } else {\n return { ...baseResult, error: result.reason, status: 'failed' }\n }\n })\n\n return new Response(\n JSON.stringify({\n message: `Triggered ${workflows.docs.length} workflow(s)`,\n results: resultsData\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n status: 200\n }\n )\n\n } catch (error) {\n return new Response(\n JSON.stringify({\n details: error instanceof Error ? error.message : 'Unknown error',\n error: 'Failed to process webhook'\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n status: 500\n }\n )\n }\n },\n method: 'post' as const,\n path: `${normalizedPrefix}/:path`\n }\n\n // Check if the webhook endpoint already exists to avoid duplicates\n const existingEndpoint = config.endpoints?.find(endpoint =>\n endpoint.path === webhookEndpoint.path && endpoint.method === webhookEndpoint.method\n )\n\n if (!existingEndpoint) {\n // Combine existing endpoints with the webhook endpoint\n config.endpoints = [...(config.endpoints || []), webhookEndpoint]\n logger.debug(`Webhook endpoint added at path: ${webhookEndpoint.path}`)\n logger.debug('New config.endpoints length:', config.endpoints.length)\n } else {\n logger.debug(`Webhook endpoint already exists at path: ${webhookEndpoint.path}`)\n }\n}\n"],"names":["WorkflowExecutor","getConfigLogger","initializeLogger","initWebhookEndpoint","config","webhookPrefix","logger","normalizedPrefix","startsWith","debug","endpoints","length","webhookEndpoint","handler","req","path","routeParams","webhookData","body","workflows","payload","find","collection","depth","limit","where","equals","docs","Response","JSON","stringify","error","headers","status","executor","executionPromises","map","workflow","context","steps","trigger","type","data","Object","fromEntries","entries","triggers","matchingTrigger","parameters","webhookPath","condition","substring","keys","workflowId","id","workflowName","name","conditionMet","evaluateCondition","info","webhookDataSnapshot","reason","execute","Error","message","results","Promise","allSettled","resultsData","result","index","baseResult","value","details","method","existingEndpoint","endpoint"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/plugin/init-webhook.ts"],"sourcesContent":["import type {Config, PayloadRequest} from 'payload'\n\nimport {type PayloadWorkflow, WorkflowExecutor} from '../core/workflow-executor.js'\nimport {getConfigLogger, initializeLogger} from './logger.js'\n\nexport function initWebhookEndpoint(config: Config, webhookPrefix = 'webhook'): void {\n const logger = getConfigLogger()\n // Ensure the prefix starts with a slash\n const normalizedPrefix = webhookPrefix.startsWith('/') ? webhookPrefix : `/${webhookPrefix}`\n logger.debug(`Adding webhook endpoint: ${normalizedPrefix}`)\n\n // Define webhook endpoint\n const webhookEndpoint = {\n handler: async (req: PayloadRequest) => {\n const {path} = req.routeParams as { path: string }\n const webhookData = req.body || {}\n\n logger.debug('Webhook endpoint handler called, path: ' + path)\n\n try {\n // Find workflows with matching webhook triggers\n const workflows = await req.payload.find({\n collection: 'workflows',\n depth: 2,\n limit: 100,\n req,\n where: {\n 'triggers.type': {\n equals: 'webhook-trigger'\n },\n 'triggers.webhookPath': {\n equals: path\n }\n }\n })\n\n if (workflows.docs.length === 0) {\n return new Response(\n JSON.stringify({error: 'No workflows found for this webhook path'}),\n {\n headers: {'Content-Type': 'application/json'},\n status: 404\n }\n )\n }\n\n // Create a workflow executor for this request\n const logger = initializeLogger(req.payload)\n const executor = new WorkflowExecutor(req.payload, logger)\n\n const executionPromises = workflows.docs.map(async (workflow) => {\n try {\n // Create execution context for the webhook trigger\n const context = {\n steps: {},\n trigger: {\n type: 'webhook',\n data: webhookData,\n headers: Object.fromEntries(req.headers?.entries() || []),\n path,\n req\n }\n }\n\n // Find the matching trigger and check its condition if present\n const triggers = workflow.triggers as Array<{\n condition?: string\n type: string\n parameters?: {\n webhookPath?: string\n [key: string]: any\n }\n }>\n\n const matchingTrigger = triggers?.find(trigger =>\n trigger.type === 'webhook-trigger' &&\n trigger.parameters?.webhookPath === path\n )\n\n // Check trigger condition if present\n if (matchingTrigger?.condition) {\n logger.debug({\n condition: matchingTrigger.condition,\n path,\n webhookData: JSON.stringify(webhookData).substring(0, 200),\n headers: Object.keys(context.trigger.headers || {}),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Evaluating webhook trigger condition')\n\n const conditionMet = executor.evaluateCondition(matchingTrigger.condition, context)\n\n if (!conditionMet) {\n logger.info({\n condition: matchingTrigger.condition,\n path,\n webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Webhook trigger condition not met, skipping workflow')\n\n return { reason: 'Condition not met', status: 'skipped', workflowId: workflow.id }\n }\n\n logger.info({\n condition: matchingTrigger.condition,\n path,\n webhookDataSnapshot: JSON.stringify(webhookData).substring(0, 200),\n workflowId: workflow.id,\n workflowName: workflow.name\n }, 'Webhook trigger condition met')\n }\n\n // Execute the workflow\n await executor.execute(workflow as PayloadWorkflow, context, req)\n\n return { status: 'triggered', workflowId: workflow.id }\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Unknown error',\n status: 'failed',\n workflowId: workflow.id\n }\n }\n })\n\n const results = await Promise.allSettled(executionPromises)\n const resultsData = results.map((result, index) => {\n const baseResult = { workflowId: workflows.docs[index].id }\n if (result.status === 'fulfilled') {\n return { ...baseResult, ...result.value }\n } else {\n return { ...baseResult, error: result.reason, status: 'failed' }\n }\n })\n\n return new Response(\n JSON.stringify({\n message: `Triggered ${workflows.docs.length} workflow(s)`,\n results: resultsData\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n status: 200\n }\n )\n\n } catch (error) {\n return new Response(\n JSON.stringify({\n details: error instanceof Error ? error.message : 'Unknown error',\n error: 'Failed to process webhook'\n }),\n {\n headers: { 'Content-Type': 'application/json' },\n status: 500\n }\n )\n }\n },\n method: 'post' as const,\n path: `${normalizedPrefix}/:path`\n }\n\n // Check if the webhook endpoint already exists to avoid duplicates\n const existingEndpoint = config.endpoints?.find(endpoint =>\n endpoint.path === webhookEndpoint.path && endpoint.method === webhookEndpoint.method\n )\n\n if (!existingEndpoint) {\n // Combine existing endpoints with the webhook endpoint\n config.endpoints = [...(config.endpoints || []), webhookEndpoint]\n logger.debug(`Webhook endpoint added at path: ${webhookEndpoint.path}`)\n logger.debug('Webhook endpoint added')\n } else {\n logger.debug(`Webhook endpoint already exists at path: ${webhookEndpoint.path}`)\n }\n}\n"],"names":["WorkflowExecutor","getConfigLogger","initializeLogger","initWebhookEndpoint","config","webhookPrefix","logger","normalizedPrefix","startsWith","debug","webhookEndpoint","handler","req","path","routeParams","webhookData","body","workflows","payload","find","collection","depth","limit","where","equals","docs","length","Response","JSON","stringify","error","headers","status","executor","executionPromises","map","workflow","context","steps","trigger","type","data","Object","fromEntries","entries","triggers","matchingTrigger","parameters","webhookPath","condition","substring","keys","workflowId","id","workflowName","name","conditionMet","evaluateCondition","info","webhookDataSnapshot","reason","execute","Error","message","results","Promise","allSettled","resultsData","result","index","baseResult","value","details","method","existingEndpoint","endpoints","endpoint"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xtr-dev/payload-automation",
3
- "version": "0.0.34",
3
+ "version": "0.0.35",
4
4
  "description": "PayloadCMS Automation Plugin - Comprehensive workflow automation system with visual workflow building, execution tracking, and step types",
5
5
  "license": "MIT",
6
6
  "type": "module",