{"version":3,"file":"workflow.cjs","names":["nodeAsyncHooks","trace","getActiveSpan"],"sources":["../src/workflow.ts"],"sourcesContent":["/**\n * Workflow and Saga tracing helpers\n *\n * Provides specialized tracing for multi-step workflows and sagas with\n * automatic step linking, compensation tracking, and workflow correlation.\n *\n * @example Simple workflow\n * ```typescript\n * import { traceWorkflow, traceStep } from 'autotel/workflow';\n *\n * export const processOrder = traceWorkflow({\n *   name: 'OrderFulfillment',\n *   workflowId: (order) => order.id,\n * })(ctx => async (order: Order) => {\n *   await validateOrder(order);\n *   await chargePayment(order);\n *   await shipOrder(order);\n * });\n * ```\n *\n * @example Saga with compensation\n * ```typescript\n * import { traceWorkflow, traceStep } from 'autotel/workflow';\n *\n * export const orderSaga = traceWorkflow({\n *   name: 'OrderSaga',\n *   workflowId: () => generateUUID(),\n * })(ctx => async (order: Order) => {\n *\n *   const reserveStep = traceStep({\n *     name: 'ReserveInventory',\n *     compensate: async () => {\n *       await releaseInventory(order.items);\n *     },\n *   })(async () => {\n *     await inventoryService.reserve(order.items);\n *   });\n *   await reserveStep();\n *\n *   const paymentStep = traceStep({\n *     name: 'ProcessPayment',\n *     linkToPrevious: true,\n *     compensate: async () => {\n *       await refundPayment(order.paymentId);\n *     },\n *   })(async () => {\n *     await paymentService.charge(order);\n *   });\n *   await paymentStep();\n * });\n * ```\n *\n * @module\n */\n\n// namespace import for browser-bundler compat — see node-require.ts\nimport * as nodeAsyncHooks from 'node:async_hooks';\nimport type { Attributes, Link, SpanContext } from '@opentelemetry/api';\nimport { emitCorrelatedEvent } from './correlated-events';\nimport { trace } from './functional';\nimport type { TraceContext } from './trace-context';\nimport { getActiveSpan } from './trace-helpers';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Workflow status\n */\nexport type WorkflowStatus =\n  | 'pending'\n  | 'running'\n  | 'completed'\n  | 'failed'\n  | 'compensating'\n  | 'compensated'\n  | 'compensation_failed';\n\n/**\n * Step status\n */\nexport type StepStatus =\n  | 'pending'\n  | 'running'\n  | 'completed'\n  | 'failed'\n  | 'skipped'\n  | 'compensated';\n\n/**\n * Configuration for workflow tracing\n */\nexport interface WorkflowConfig<TArgs extends unknown[] = unknown[]> {\n  /** Workflow name (e.g., 'OrderFulfillment', 'UserOnboarding') */\n  name: string;\n\n  /**\n   * Function to extract or generate workflow ID\n   * Can be static string, function of args, or generator\n   */\n  workflowId: string | ((...args: TArgs) => string);\n\n  /** Optional workflow version */\n  version?: string;\n\n  /** Additional attributes */\n  attributes?: Attributes;\n\n  /** Callback on workflow completion */\n  onComplete?: (ctx: WorkflowContext, result: unknown) => void;\n\n  /** Callback on workflow failure */\n  onFailed?: (ctx: WorkflowContext, error: Error) => void;\n\n  /** Callback on compensation start */\n  onCompensating?: (ctx: WorkflowContext) => void;\n}\n\n/**\n * Configuration for workflow step tracing\n */\nexport interface StepConfig {\n  /** Step name */\n  name: string;\n\n  /** Optional step description */\n  description?: string;\n\n  /** Step index (auto-assigned if not provided) */\n  index?: number;\n\n  /** Link to previous step span */\n  linkToPrevious?: boolean;\n\n  /** Link to specific step(s) by name */\n  linkTo?: string | string[];\n\n  /** Additional attributes */\n  attributes?: Attributes;\n\n  /** Compensation handler for saga rollback */\n  compensate?: (error: Error) => Promise<void> | void;\n\n  /** Whether this step is idempotent */\n  idempotent?: boolean;\n\n  /** Retry configuration */\n  retry?: {\n    maxAttempts: number;\n    backoffMs?: number;\n  };\n\n  /** Callback on step completion */\n  onComplete?: (ctx: StepContext) => void;\n\n  /** Callback on step failure */\n  onFailed?: (ctx: StepContext, error: Error) => void;\n}\n\n/**\n * Step metadata stored for linking and compensation\n */\ninterface StepMetadata {\n  name: string;\n  index: number;\n  status: StepStatus;\n  spanContext?: SpanContext;\n  compensate?: (error: Error) => Promise<void> | void;\n  startTime: number;\n  endTime?: number;\n}\n\n/**\n * Extended trace context for workflows\n */\nexport interface WorkflowContext extends TraceContext {\n  /** Get the workflow ID */\n  getWorkflowId(): string;\n\n  /** Get workflow name */\n  getWorkflowName(): string;\n\n  /** Get current workflow status */\n  getStatus(): WorkflowStatus;\n\n  /** Mark step as completed and store for linking */\n  completeStep(stepName: string): void;\n\n  /** Get previous step's span context for linking */\n  getPreviousStep(stepName?: string): SpanContext | null;\n\n  /** Get all completed steps */\n  getCompletedSteps(): string[];\n\n  /** Register a compensation handler */\n  registerCompensation(\n    stepName: string,\n    handler: (error: Error) => Promise<void> | void,\n  ): void;\n\n  /** Trigger compensation for all registered steps */\n  compensate(error: Error): Promise<void>;\n\n  /** Record compensation result */\n  recordCompensation(stepName: string, success: boolean, error?: Error): void;\n\n  /** Set workflow status */\n  setWorkflowStatus(status: WorkflowStatus): void;\n}\n\n/**\n * Extended trace context for workflow steps\n */\nexport interface StepContext extends TraceContext {\n  /** Get step name */\n  getStepName(): string;\n\n  /** Get step index */\n  getStepIndex(): number;\n\n  /** Mark this step as completed */\n  complete(): void;\n\n  /** Skip this step */\n  skip(reason?: string): void;\n\n  /** Get workflow context */\n  getWorkflowContext(): WorkflowContext | null;\n}\n\n// ============================================================================\n// Storage\n// ============================================================================\n\n// Store workflow state in a WeakMap keyed by span\nconst workflowStates = new WeakMap<\n  object,\n  {\n    workflowId: string;\n    workflowName: string;\n    status: WorkflowStatus;\n    steps: Map<string, StepMetadata>;\n    stepCounter: number;\n    compensations: Map<string, (error: Error) => Promise<void> | void>;\n  }\n>();\n\n/**\n * AsyncLocalStorage for workflow context (async-safe)\n *\n * This replaces the previous module-level variable which was NOT safe for\n * concurrent workflows. AsyncLocalStorage ensures each async execution chain\n * has its own isolated workflow context.\n */\nconst workflowContextStorage =\n  new nodeAsyncHooks.AsyncLocalStorage<WorkflowContext>();\n\n// ============================================================================\n// Workflow Helper\n// ============================================================================\n\n/**\n * Create a traced workflow function\n *\n * Wraps business logic in a workflow span with automatic step tracking,\n * correlation via workflow ID, and compensation support.\n *\n * @param config - Workflow configuration\n * @returns Factory function that wraps your workflow logic\n *\n * @example Order fulfillment workflow\n * ```typescript\n * export const fulfillOrder = traceWorkflow({\n *   name: 'OrderFulfillment',\n *   workflowId: (order) => order.id,\n *   version: '2.0',\n * })(ctx => async (order: Order) => {\n *   ctx.setAttribute('order.total', order.total);\n *\n *   await validateOrder(order);\n *   await processPayment(order);\n *   await fulfillItems(order);\n *   await notifyCustomer(order);\n *\n *   return { success: true, orderId: order.id };\n * });\n * ```\n */\nexport function traceWorkflow<TArgs extends unknown[], TReturn>(\n  config: WorkflowConfig<TArgs>,\n) {\n  const spanName = `workflow.${config.name}`;\n\n  return (\n    fnFactory: (ctx: WorkflowContext) => (...args: TArgs) => Promise<TReturn>,\n  ): ((...args: TArgs) => Promise<TReturn>) => {\n    return trace<TArgs, TReturn>(spanName, (baseCtx) => {\n      return async (...args: TArgs) => {\n        // Generate or extract workflow ID\n        const workflowId =\n          typeof config.workflowId === 'function'\n            ? config.workflowId(...args)\n            : config.workflowId;\n\n        // Create workflow context\n        const ctx = createWorkflowContext(baseCtx, config.name, workflowId);\n\n        // Set workflow attributes\n        ctx.setAttribute('workflow.name', config.name);\n        ctx.setAttribute('workflow.id', workflowId);\n        if (config.version) {\n          ctx.setAttribute('workflow.version', config.version);\n        }\n        ctx.setAttribute('workflow.status', 'running');\n\n        // Set custom attributes\n        if (config.attributes) {\n          for (const [key, value] of Object.entries(config.attributes)) {\n            if (value !== undefined) {\n              ctx.setAttribute(key, value as string | number | boolean);\n            }\n          }\n        }\n\n        // Run workflow in AsyncLocalStorage context for async-safety\n        // This ensures concurrent workflows have isolated contexts\n        return workflowContextStorage.run(ctx, async () => {\n          try {\n            // Execute workflow\n            const userFn = fnFactory(ctx);\n            const result = await userFn(...args);\n\n            // Mark as completed\n            ctx.setWorkflowStatus('completed');\n            config.onComplete?.(ctx, result);\n\n            return result;\n          } catch (error) {\n            // Mark as failed\n            ctx.setWorkflowStatus('failed');\n            config.onFailed?.(ctx, error as Error);\n\n            // Check if we have compensations to run\n            const state = getWorkflowState();\n            if (state && state.compensations.size > 0) {\n              ctx.setWorkflowStatus('compensating');\n              config.onCompensating?.(ctx);\n\n              try {\n                await ctx.compensate(error as Error);\n                ctx.setWorkflowStatus('compensated');\n              } catch (compensationError) {\n                ctx.setWorkflowStatus('compensation_failed');\n                ctx.setAttribute(\n                  'workflow.compensation.error',\n                  String(compensationError),\n                );\n              }\n            }\n\n            throw error;\n          }\n        });\n      };\n    });\n  };\n}\n\n/**\n * Create a traced workflow step\n *\n * Wraps step logic with automatic linking to previous steps,\n * compensation registration, and status tracking.\n *\n * @param config - Step configuration\n * @returns Factory function that wraps your step logic\n *\n * @example Step with compensation\n * ```typescript\n * const chargePayment = traceStep({\n *   name: 'ChargePayment',\n *   linkToPrevious: true,\n *   compensate: async (error) => {\n *     await paymentService.refund(paymentId);\n *   },\n * })(async (amount: number) => {\n *   return await paymentService.charge(amount);\n * });\n * ```\n */\nexport function traceStep<TArgs extends unknown[], TReturn>(\n  config: StepConfig,\n) {\n  return (\n    fn: (...args: TArgs) => Promise<TReturn>,\n  ): ((...args: TArgs) => Promise<TReturn>) => {\n    const spanName = `step.${config.name}`;\n\n    return trace<TArgs, TReturn>(spanName, (baseCtx) => {\n      return async (...args: TArgs) => {\n        // Get workflow context from AsyncLocalStorage (async-safe)\n        const workflowCtx = workflowContextStorage.getStore() ?? null;\n\n        // Create step context\n        const ctx = createStepContext(baseCtx, config, workflowCtx);\n\n        // Set step attributes\n        ctx.setAttribute('workflow.step.name', config.name);\n        ctx.setAttribute('workflow.step.index', ctx.getStepIndex());\n        ctx.setAttribute('workflow.step.status', 'running');\n\n        if (config.description) {\n          ctx.setAttribute('workflow.step.description', config.description);\n        }\n\n        if (config.idempotent) {\n          ctx.setAttribute('workflow.step.idempotent', true);\n        }\n\n        // Set custom attributes\n        if (config.attributes) {\n          for (const [key, value] of Object.entries(config.attributes)) {\n            if (value !== undefined) {\n              ctx.setAttribute(key, value as string | number | boolean);\n            }\n          }\n        }\n\n        // Link to previous steps\n        await addStepLinks(ctx, config, workflowCtx);\n\n        // Register compensation if provided\n        if (config.compensate && workflowCtx) {\n          workflowCtx.registerCompensation(config.name, config.compensate);\n        }\n\n        // Execute with optional retry\n        let lastError: Error | undefined;\n        const maxAttempts = config.retry?.maxAttempts ?? 1;\n\n        for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n          try {\n            if (attempt > 1) {\n              ctx.setAttribute('workflow.step.retry_attempt', attempt);\n              emitCorrelatedEvent(ctx, 'step_retry', {\n                'workflow.step.attempt': attempt,\n                'workflow.step.max_attempts': maxAttempts,\n              });\n\n              // Backoff\n              if (config.retry?.backoffMs) {\n                await sleep(config.retry.backoffMs * attempt);\n              }\n            }\n\n            const result = await fn(...args);\n\n            // Mark as completed\n            ctx.setAttribute('workflow.step.status', 'completed');\n            ctx.complete();\n            config.onComplete?.(ctx);\n\n            return result;\n          } catch (error) {\n            lastError = error as Error;\n\n            if (attempt < maxAttempts) {\n              emitCorrelatedEvent(ctx, 'step_retry_scheduled', {\n                'workflow.step.error': String(error),\n                'workflow.step.attempt': attempt,\n              });\n            }\n          }\n        }\n\n        // All attempts failed\n        ctx.setAttribute('workflow.step.status', 'failed');\n        ctx.setAttribute('workflow.step.error', String(lastError));\n        config.onFailed?.(ctx, lastError!);\n\n        throw lastError;\n      };\n    });\n  };\n}\n\n// ============================================================================\n// Context Creation\n// ============================================================================\n\n/**\n * Create workflow-extended context\n */\nfunction createWorkflowContext(\n  baseCtx: TraceContext,\n  workflowName: string,\n  workflowId: string,\n): WorkflowContext {\n  // Initialize state\n  const span = getActiveSpan();\n  const state = {\n    workflowId,\n    workflowName,\n    status: 'running' as WorkflowStatus,\n    steps: new Map<string, StepMetadata>(),\n    stepCounter: 0,\n    compensations: new Map<string, (error: Error) => Promise<void> | void>(),\n  };\n\n  if (span) {\n    workflowStates.set(span, state);\n  }\n\n  return {\n    ...baseCtx,\n\n    getWorkflowId(): string {\n      return workflowId;\n    },\n\n    getWorkflowName(): string {\n      return workflowName;\n    },\n\n    getStatus(): WorkflowStatus {\n      return state.status;\n    },\n\n    completeStep(stepName: string): void {\n      let step = state.steps.get(stepName);\n      if (!step) {\n        // Auto-create step entry for manually managed steps\n        // (when using registerCompensation without traceStep)\n        step = {\n          name: stepName,\n          index: state.stepCounter++,\n          status: 'pending',\n          startTime: Date.now(),\n        };\n        state.steps.set(stepName, step);\n      }\n      step.status = 'completed';\n      step.endTime = Date.now();\n\n      // Capture span context for linking\n      const currentSpan = getActiveSpan();\n      if (currentSpan) {\n        step.spanContext = currentSpan.spanContext();\n      }\n    },\n\n    getPreviousStep(stepName?: string): SpanContext | null {\n      if (stepName) {\n        const step = state.steps.get(stepName);\n        return step?.spanContext ?? null;\n      }\n\n      // Get last completed step\n      let lastStep: StepMetadata | null = null;\n      for (const step of state.steps.values()) {\n        if (\n          step.status === 'completed' &&\n          (!lastStep || step.index > lastStep.index)\n        ) {\n          lastStep = step;\n        }\n      }\n\n      return lastStep?.spanContext ?? null;\n    },\n\n    getCompletedSteps(): string[] {\n      const completed: string[] = [];\n      for (const [name, step] of state.steps) {\n        if (step.status === 'completed') {\n          completed.push(name);\n        }\n      }\n      return completed.toSorted(\n        (a, b) =>\n          (state.steps.get(a)?.index ?? 0) - (state.steps.get(b)?.index ?? 0),\n      );\n    },\n\n    registerCompensation(\n      stepName: string,\n      handler: (error: Error) => Promise<void> | void,\n    ): void {\n      state.compensations.set(stepName, handler);\n    },\n\n    async compensate(error: Error): Promise<void> {\n      // Execute compensations in reverse order\n      const compensationOrder = [...state.compensations.entries()].toReversed();\n\n      for (const [stepName, handler] of compensationOrder) {\n        const step = state.steps.get(stepName);\n        if (step && step.status === 'completed') {\n          try {\n            emitCorrelatedEvent(baseCtx, 'compensation_started', {\n              'workflow.step.name': stepName,\n            });\n\n            await Promise.resolve(handler(error));\n\n            this.recordCompensation(stepName, true);\n            step.status = 'compensated';\n          } catch (compensationError) {\n            this.recordCompensation(\n              stepName,\n              false,\n              compensationError as Error,\n            );\n            throw compensationError;\n          }\n        }\n      }\n    },\n\n    recordCompensation(\n      stepName: string,\n      success: boolean,\n      error?: Error,\n    ): void {\n      emitCorrelatedEvent(baseCtx, 'compensation_completed', {\n        'workflow.step.name': stepName,\n        'workflow.compensation.success': success,\n        ...(error && { 'workflow.compensation.error': String(error) }),\n      });\n\n      baseCtx.setAttribute(\n        `workflow.compensation.${stepName}`,\n        success ? 'success' : 'failed',\n      );\n    },\n\n    setWorkflowStatus(status: WorkflowStatus): void {\n      state.status = status;\n      baseCtx.setAttribute('workflow.status', status);\n\n      emitCorrelatedEvent(baseCtx, 'workflow_status_changed', {\n        'workflow.status': status,\n      });\n    },\n  };\n}\n\n/**\n * Create step-extended context\n */\nfunction createStepContext(\n  baseCtx: TraceContext,\n  config: StepConfig,\n  workflowCtx: WorkflowContext | null,\n): StepContext {\n  // Determine step index\n  let stepIndex = config.index ?? 0;\n  if (workflowCtx) {\n    const span = getActiveSpan();\n    if (span) {\n      const state = workflowStates.get(span);\n      if (state) {\n        stepIndex = config.index ?? state.stepCounter++;\n      }\n    }\n  }\n\n  // Register step metadata\n  if (workflowCtx) {\n    const wfSpan = getActiveSpan();\n    if (wfSpan) {\n      const state = workflowStates.get(wfSpan);\n      if (state) {\n        state.steps.set(config.name, {\n          name: config.name,\n          index: stepIndex,\n          status: 'running',\n          startTime: Date.now(),\n          compensate: config.compensate,\n        });\n      }\n    }\n  }\n\n  return {\n    ...baseCtx,\n\n    getStepName(): string {\n      return config.name;\n    },\n\n    getStepIndex(): number {\n      return stepIndex;\n    },\n\n    complete(): void {\n      if (workflowCtx) {\n        workflowCtx.completeStep(config.name);\n      }\n    },\n\n    skip(reason?: string): void {\n      baseCtx.setAttribute('workflow.step.status', 'skipped');\n      if (reason) {\n        baseCtx.setAttribute('workflow.step.skip_reason', reason);\n      }\n      emitCorrelatedEvent(baseCtx, 'step_skipped', {\n        'workflow.step.name': config.name,\n        ...(reason && { 'workflow.step.skip_reason': reason }),\n      });\n    },\n\n    getWorkflowContext(): WorkflowContext | null {\n      return workflowCtx;\n    },\n  };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get workflow state from context\n */\nfunction getWorkflowState() {\n  const span = getActiveSpan();\n  return span ? workflowStates.get(span) : null;\n}\n\n/**\n * Add links to previous steps\n */\nasync function addStepLinks(\n  ctx: StepContext,\n  config: StepConfig,\n  workflowCtx: WorkflowContext | null,\n): Promise<void> {\n  if (!workflowCtx) return;\n\n  const links: Link[] = [];\n\n  // Link to previous step\n  if (config.linkToPrevious) {\n    const prevSpanContext = workflowCtx.getPreviousStep();\n    if (prevSpanContext) {\n      links.push({\n        context: prevSpanContext,\n        attributes: {\n          'workflow.link.type': 'sequence',\n        },\n      });\n    }\n  }\n\n  // Link to specific steps\n  if (config.linkTo) {\n    const stepNames = Array.isArray(config.linkTo)\n      ? config.linkTo\n      : [config.linkTo];\n\n    for (const stepName of stepNames) {\n      const spanContext = workflowCtx.getPreviousStep(stepName);\n      if (spanContext) {\n        links.push({\n          context: spanContext,\n          attributes: {\n            'workflow.link.type': 'dependency',\n            'workflow.link.step': stepName,\n          },\n        });\n      }\n    }\n  }\n\n  // Add all links\n  if (links.length > 0) {\n    ctx.addLinks(links);\n  }\n}\n\n/**\n * Sleep utility for retry backoff\n */\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ============================================================================\n// Convenience Exports\n// ============================================================================\n\n/**\n * Get current workflow context (if inside a workflow)\n *\n * Uses AsyncLocalStorage to ensure async-safety when multiple\n * workflows are running concurrently.\n */\nexport function getCurrentWorkflowContext(): WorkflowContext | null {\n  return workflowContextStorage.getStore() ?? null;\n}\n\n/**\n * Check if currently executing inside a workflow\n *\n * Uses AsyncLocalStorage to ensure async-safety when multiple\n * workflows are running concurrently.\n */\nexport function isInWorkflow(): boolean {\n  return workflowContextStorage.getStore() !== undefined;\n}\n"],"mappings":"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"}