{"version":3,"file":"index.cjs","names":["step","collectedHandlers: Partial<TriggerHandlers<TConfig>>","builder: any","instance: ISdk | undefined","fs","step","config: TConfig","SpanStatusCode","Logger","step: StepWithHandler","step","triggerInfo: TriggerInfo","motiaRequest: MotiaHttpArgs<unknown>","triggerConfig: ApiTriggerConfig","motiaRequest: MotiaApiRequest<unknown>","triggerConfig: QueueTriggerConfig","triggerConfig: CronTriggerConfig","triggerConfig: Record<string, any>","triggerConfig: StreamTriggerConfig","stream","input: MotiaStreamAuthInput","SpanStatusCode","enqueue: Enqueuer<EnqueueData>","queue","path","z"],"sources":["../src/guards.ts","../src/multi-trigger.ts","../src/new/build/loader.ts","../src/new/iii.ts","../src/new/build/generate-index.ts","../src/new/setup-step-endpoint.ts","../src/new/stream.ts","../src/new/logger.ts","../src/new/build/utils.ts","../src/new/state.ts","../src/new/enqueue.ts","../src/step.ts","../src/triggers.ts","../src/types.ts"],"sourcesContent":["import type { Step, TriggerConfig } from './types'\n\n// Type aliases to avoid deep type instantiation\ntype ApiTriggerType = Extract<TriggerConfig, { type: 'http' }>\ntype QueueTriggerType = Extract<TriggerConfig, { type: 'queue' }>\ntype CronTriggerType = Extract<TriggerConfig, { type: 'cron' }>\ntype StateTriggerType = Extract<TriggerConfig, { type: 'state' }>\ntype StreamTriggerType = Extract<TriggerConfig, { type: 'stream' }>\n\nexport const isApiTrigger = (trigger: TriggerConfig): trigger is ApiTriggerType => trigger.type === 'http'\n\nexport const isQueueTrigger = (trigger: TriggerConfig): trigger is QueueTriggerType => trigger.type === 'queue'\n\nexport const isCronTrigger = (trigger: TriggerConfig): trigger is CronTriggerType => trigger.type === 'cron'\n\nexport const isStateTrigger = (trigger: TriggerConfig): trigger is StateTriggerType => trigger.type === 'state'\n\nexport const isStreamTrigger = (trigger: TriggerConfig): trigger is StreamTriggerType => trigger.type === 'stream'\n\nexport const getApiTriggers = (step: Step): ApiTriggerType[] => step.config.triggers.filter(isApiTrigger)\n\nexport const getQueueTriggers = (step: Step): QueueTriggerType[] => step.config.triggers.filter(isQueueTrigger)\n\nexport const getCronTriggers = (step: Step): CronTriggerType[] => step.config.triggers.filter(isCronTrigger)\n\nexport const getStateTriggers = (step: Step): StateTriggerType[] => step.config.triggers.filter(isStateTrigger)\n\nexport const getStreamTriggers = (step: Step): StreamTriggerType[] => step.config.triggers.filter(isStreamTrigger)\n","import type {\n  ExtractApiInput,\n  ExtractQueueInput,\n  ExtractStateInput,\n  ExtractStreamInput,\n  FlowContext,\n  Handlers,\n  StepConfig,\n} from './types'\n\ntype StepDefinition<TConfig extends StepConfig> = {\n  config: TConfig\n  handler: Handlers<TConfig>\n}\n\ntype InferHandlerInput<TConfig extends StepConfig> = TConfig extends StepConfig\n  ? Parameters<Handlers<TConfig>>[0]\n  : never\n\ntype TriggerHandlers<TConfig extends StepConfig> = {\n  queue?: (\n    input: ExtractQueueInput<InferHandlerInput<TConfig>>,\n    ctx: Omit<FlowContext<any, any>, 'match'>,\n  ) => Promise<void>\n  http?: (\n    request: ExtractApiInput<InferHandlerInput<TConfig>>,\n    ctx: Omit<FlowContext<any, any>, 'match'>,\n  ) => Promise<any>\n  cron?: (ctx: Omit<FlowContext<any, any>, 'match'>) => Promise<void>\n  state?: (\n    input: ExtractStateInput<InferHandlerInput<TConfig>>,\n    ctx: Omit<FlowContext<any, any>, 'match'>,\n  ) => Promise<any>\n  stream?: (\n    input: ExtractStreamInput<InferHandlerInput<TConfig>>,\n    ctx: Omit<FlowContext<any, any>, 'match'>,\n  ) => Promise<any>\n}\n\ntype MultiTriggerStepBuilder<TConfig extends StepConfig> = {\n  config: TConfig\n  handlers: (handlers: TriggerHandlers<TConfig>) => StepDefinition<TConfig>\n\n  // Chainable methods\n  onQueue: (\n    handler: TriggerHandlers<TConfig>['queue'],\n  ) => MultiTriggerStepBuilder<TConfig> & { handlers: () => StepDefinition<TConfig> }\n  onHttp: (\n    handler: TriggerHandlers<TConfig>['http'],\n  ) => MultiTriggerStepBuilder<TConfig> & { handlers: () => StepDefinition<TConfig> }\n  onCron: (\n    handler: TriggerHandlers<TConfig>['cron'],\n  ) => MultiTriggerStepBuilder<TConfig> & { handlers: () => StepDefinition<TConfig> }\n  onState: (\n    handler: TriggerHandlers<TConfig>['state'],\n  ) => MultiTriggerStepBuilder<TConfig> & { handlers: () => StepDefinition<TConfig> }\n  onStream: (\n    handler: TriggerHandlers<TConfig>['stream'],\n  ) => MultiTriggerStepBuilder<TConfig> & { handlers: () => StepDefinition<TConfig> }\n}\n\nexport function multiTriggerStep<const TConfig extends StepConfig>(config: TConfig): MultiTriggerStepBuilder<TConfig> {\n  const collectedHandlers: Partial<TriggerHandlers<TConfig>> = {}\n\n  const createUnifiedHandler = (): Handlers<TConfig> => {\n    return (async (input: any, ctx: any) => {\n      if (ctx.trigger.type === 'queue' && collectedHandlers.queue) {\n        return collectedHandlers.queue(input, ctx)\n      }\n      if (ctx.trigger.type === 'http' && collectedHandlers.http) {\n        return collectedHandlers.http(input, ctx)\n      }\n      if (ctx.trigger.type === 'cron' && collectedHandlers.cron) {\n        return collectedHandlers.cron(ctx)\n      }\n      if (ctx.trigger.type === 'state' && collectedHandlers.state) {\n        return collectedHandlers.state(input, ctx)\n      }\n      if (ctx.trigger.type === 'stream' && collectedHandlers.stream) {\n        return collectedHandlers.stream(input, ctx)\n      }\n\n      ctx.logger.warn(`No handler defined for trigger type: ${ctx.trigger.type}`, {\n        availableHandlers: Object.keys(collectedHandlers),\n        triggerType: ctx.trigger.type,\n      })\n\n      throw new Error(\n        `No handler defined for trigger type: ${ctx.trigger.type}. Available handlers: ${Object.keys(collectedHandlers).join(', ')}`,\n      )\n    }) as Handlers<TConfig>\n  }\n\n  const builder: any = {\n    config,\n\n    onQueue(handler: TriggerHandlers<TConfig>['queue']) {\n      collectedHandlers.queue = handler\n      return {\n        ...builder,\n        handlers: () => ({ config, handler: createUnifiedHandler() }),\n      }\n    },\n\n    onHttp(handler: TriggerHandlers<TConfig>['http']) {\n      collectedHandlers.http = handler\n      return {\n        ...builder,\n        handlers: () => ({ config, handler: createUnifiedHandler() }),\n      }\n    },\n\n    onCron(handler: TriggerHandlers<TConfig>['cron']) {\n      collectedHandlers.cron = handler\n      return {\n        ...builder,\n        handlers: () => ({ config, handler: createUnifiedHandler() }),\n      }\n    },\n\n    onState(handler: TriggerHandlers<TConfig>['state']) {\n      collectedHandlers.state = handler\n      return {\n        ...builder,\n        handlers: () => ({ config, handler: createUnifiedHandler() }),\n      }\n    },\n\n    onStream(handler: TriggerHandlers<TConfig>['stream']) {\n      collectedHandlers.stream = handler\n      return {\n        ...builder,\n        handlers: () => ({ config, handler: createUnifiedHandler() }),\n      }\n    },\n\n    handlers(h?: TriggerHandlers<TConfig>) {\n      if (h) {\n        Object.assign(collectedHandlers, h)\n      }\n      return { config, handler: createUnifiedHandler() }\n    },\n  }\n\n  return builder\n}\n","import * as esbuild from 'esbuild'\nimport fs from 'fs'\nimport { glob } from 'glob'\nimport os from 'os'\nimport path from 'path'\nimport { pathToFileURL } from 'url'\nimport { v5 as uuidv5 } from 'uuid'\nimport type { Step } from '../../types'\nimport type { Stream } from '../../types-stream'\n\nexport interface LoadedStep {\n  id: string\n  config: Step['config']\n  filePath: string\n  handler: unknown\n}\n\nexport interface LoadedStream {\n  id: string\n  config: Stream['config']\n  filePath: string\n}\n\nexport interface LoadedFiles {\n  steps: LoadedStep[]\n  streams: Record<string, LoadedStream>\n}\n\nexport const STEP_NAMESPACE = '7f1c3ff2-9b00-4d0a-bdd7-efb8bca49d4f'\nexport const generateStepId = (filePath: string): string => {\n  return uuidv5(filePath, STEP_NAMESPACE)\n}\n\nexport const loadStepsAndStreams = async (): Promise<LoadedFiles> => {\n  const stepFiles = await glob('**/*.step.{ts,js}', {\n    cwd: process.cwd(),\n    ignore: ['node_modules/**', 'dist/**'],\n  })\n  const streamFiles = await glob('**/*.stream.{ts,js}', {\n    cwd: process.cwd(),\n    ignore: ['node_modules/**', 'dist/**'],\n  })\n\n  const steps = await Promise.all(stepFiles.map((f) => loadFile(f, 'step')))\n  const streamResults = await Promise.all(streamFiles.map((f) => loadFile(f, 'stream')))\n\n  return {\n    steps: steps.filter(Boolean) as LoadedStep[],\n    streams: Object.fromEntries(streamResults.filter(Boolean).map((s) => [s?.config?.name, s as LoadedStream])),\n  }\n}\n\nconst loadFile = async (file: string, type: 'step' | 'stream'): Promise<LoadedStep | LoadedStream | null> => {\n  try {\n    const result = await esbuild.build({\n      entryPoints: [file],\n      bundle: true,\n      platform: 'node',\n      format: 'esm',\n      write: false,\n      external: [],\n    })\n\n    const tempFile = path.join(os.tmpdir(), `motia-${type}-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`)\n    fs.writeFileSync(tempFile, result.outputFiles[0].text)\n\n    const module = await import(pathToFileURL(tempFile).href)\n    fs.unlinkSync(tempFile)\n\n    if (type === 'step') {\n      return { config: module.config, filePath: file, handler: module.handler, id: generateStepId(file) }\n    } else {\n      return { config: module.config, filePath: file, id: generateStepId(file) }\n    }\n  } catch (_error) {\n    return null\n  }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport type { InitOptions, ISdk } from 'iii-sdk'\nimport { registerWorker } from 'iii-sdk'\n\ntype OtelConfig = NonNullable<InitOptions['otel']>\n\nconst engineWsUrl = process.env.III_URL ?? 'ws://localhost:49134'\n\nfunction readProjectName(): string | undefined {\n  const maxDepth = 1\n  let dir = process.cwd()\n  for (let i = 0; i <= maxDepth; i++) {\n    const pkgPath = join(dir, 'package.json')\n    if (existsSync(pkgPath)) {\n      try {\n        const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n        if (typeof pkg.name === 'string' && pkg.name) {\n          return pkg.name\n        }\n      } catch {\n        // ignore\n      }\n    }\n    const parent = dirname(dir)\n    if (parent === dir) break\n    dir = parent\n  }\n  return undefined\n}\n\nconst createIII = (otelConfig?: Partial<OtelConfig>) => {\n  return registerWorker(engineWsUrl, {\n    otel: {\n      enabled: true,\n      serviceName: 'motia',\n      ...otelConfig,\n    },\n    telemetry: {\n      framework: 'motia',\n      project_name: readProjectName(),\n    },\n  })\n}\n\nlet instance: ISdk | undefined\n\nexport const getInstance = (): ISdk => {\n  if (!instance) {\n    instance = createIII()\n  }\n  return instance\n}\n\nexport const initIII = (otelConfig?: Partial<OtelConfig>) => {\n  instance = createIII(otelConfig)\n  return instance\n}\n","import { existsSync, readFileSync } from 'fs'\nimport { globSync } from 'glob'\nimport path from 'path'\n\nconst toRelativePosix = (file: string): string => {\n  return './' + path.relative(process.cwd(), file).replace(/\\\\/g, '/')\n}\n\nexport const getStreamFilesFromDir = (dir: string): string[] => {\n  if (!existsSync(dir)) {\n    return []\n  }\n  return globSync('**/*.stream.{ts,js}', { absolute: true, cwd: dir }).map(toRelativePosix)\n}\n\nexport const getStepFilesFromDir = (dir: string): string[] => {\n  if (!existsSync(dir)) {\n    return []\n  }\n  return globSync('**/*.step.{ts,js}', { absolute: true, cwd: dir }).map(toRelativePosix)\n}\n\nconst toSnakeCaseConst = (filePath: string) => {\n  // Get file path relative to cwd to not have disk-specific prefixes\n  let relPath = path.relative(process.cwd(), filePath).replace(/\\\\/g, '/')\n  // Remove extension\n  relPath = relPath.replace(/\\.[^/.]+$/, '')\n  // Replace invalid JS identifier chars with underscore\n  let identifier = relPath.replace(/[^a-zA-Z0-9]+/g, '_')\n  // Remove leading/trailing underscores\n  identifier = identifier.replace(/^_+|_+$/g, '')\n  // To lower case\n  return identifier.toLowerCase()\n}\n\nexport const generateIndex = () => {\n  const motiaConfigPath = path.join(process.cwd(), 'motia.config.ts')\n  const hasMotiaConfig = existsSync(motiaConfigPath)\n  const motiaConfigContent = hasMotiaConfig ? readFileSync(motiaConfigPath, 'utf8') : ''\n  const hasAuthenticateStream = motiaConfigContent.includes('export const authenticateStream')\n  const hasOtelConfig = motiaConfigContent.includes('export const otel')\n\n  const streamsFiles = [\n    ...getStreamFilesFromDir(path.join(process.cwd(), 'streams')),\n    ...getStreamFilesFromDir(path.join(process.cwd(), 'src')),\n    ...getStreamFilesFromDir(path.join(process.cwd(), 'steps')),\n  ]\n\n  const streams = streamsFiles.map((file) => {\n    const constName = toSnakeCaseConst(file)\n\n    return {\n      importStatement: `import * as ${constName} from '${file}';`,\n      content: `motia.addStream(${constName}.config, '${file}')`,\n    }\n  })\n\n  const stepFiles = [\n    ...getStepFilesFromDir(path.join(process.cwd(), 'steps')),\n    ...getStepFilesFromDir(path.join(process.cwd(), 'src')),\n  ]\n\n  const steps = stepFiles.map((file) => {\n    const constName = toSnakeCaseConst(file)\n\n    return {\n      importStatement: `import * as ${constName} from '${file}';`,\n      content: `motia.addStep(${constName}.config, '${file}', ${constName}.handler, '${file}');`,\n    }\n  })\n\n  return [\n    \"import { Motia, initIII } from 'motia'\",\n    hasMotiaConfig ? `import * as motiaConfig from './motia.config';` : '// No motia.config.ts found',\n\n    ...streams.map((stream) => stream.importStatement),\n    ...steps.map((step) => step.importStatement),\n    '',\n    hasOtelConfig ? 'initIII(motiaConfig.otel);' : 'initIII();',\n    'const motia = new Motia();',\n    ...streams.map((stream) => stream.content),\n\n    '',\n    ...steps.map((step) => step.content),\n\n    hasMotiaConfig && hasAuthenticateStream\n      ? `motia.authenticateStream = motiaConfig.authenticateStream;`\n      : '// No authenticateStream found in motia.config.ts',\n\n    'motia.initialize();',\n  ].join('\\n')\n}\n","import fs from 'fs/promises'\nimport type { ISdk } from 'iii-sdk'\nimport path from 'path'\nimport { getStepFilesFromDir } from './build/generate-index'\nimport { generateStepId } from './build/loader'\n\nconst getFeatures = async (filePath: string) => {\n  const stat = await fs.stat(`${filePath}-features.json`).catch(() => null)\n\n  if (!stat || stat.isDirectory()) {\n    return []\n  }\n\n  try {\n    const content = await fs.readFile(`${filePath}-features.json`, 'utf8')\n    return JSON.parse(content)\n  } catch {\n    return []\n  }\n}\n\nexport function setupStepEndpoint(iii: ISdk): void {\n  const function_id = 'motia_step_get'\n\n  iii.registerFunction({ id: function_id }, async (req) => {\n    const id = req.path_params.stepId\n\n    const stepFiles = [\n      ...getStepFilesFromDir(path.join(process.cwd(), 'steps')),\n      ...getStepFilesFromDir(path.join(process.cwd(), 'src')),\n    ]\n    const step = stepFiles.find((step) => generateStepId(step) === id)\n\n    if (!step) {\n      return {\n        status_code: 404,\n        body: { error: 'Step not found' },\n      }\n    }\n\n    try {\n      const content = await fs.readFile(step, 'utf8')\n      const features = await getFeatures(step.replace(`${path.sep}src${path.sep}`, `${path.sep}tutorial${path.sep}`))\n\n      return {\n        status_code: 200,\n        body: { id, content, features },\n      }\n    } catch (error) {\n      console.error('Error reading step file:', error)\n      return {\n        status_code: 500,\n        body: { error: 'Failed to read step file' },\n      }\n    }\n  })\n\n  iii.registerTrigger({\n    type: 'http',\n    function_id,\n    config: { api_path: '__motia/step/:stepId', http_method: 'GET', description: 'Get a step' },\n  })\n}\n","import type { StreamSetResult, UpdateOp } from 'iii-sdk/stream'\nimport { SpanStatusCode, withSpan } from 'iii-sdk/telemetry'\nimport type { InferSchema } from '../types'\nimport type { StateStreamEvent, StateStreamEventChannel, StreamConfig } from '../types-stream'\nimport { getInstance } from './iii'\n\ntype InferStreamData<TConfig extends StreamConfig> = StreamConfig extends TConfig\n  ? unknown\n  : InferSchema<TConfig['schema']>\n\nexport class Stream<TConfig extends StreamConfig = StreamConfig> {\n  constructor(readonly config: TConfig) {}\n\n  async get(groupId: string, itemId: string): Promise<InferStreamData<TConfig> | null> {\n    return withSpan('stream::get', {}, async (span) => {\n      span.setAttribute('motia.stream.name', this.config.name)\n      span.setAttribute('motia.stream.group_id', groupId)\n      span.setAttribute('motia.stream.item_id', itemId)\n      try {\n        return (await getInstance().trigger({\n          function_id: 'stream::get',\n          payload: { stream_name: this.config.name, group_id: groupId, item_id: itemId },\n        })) as InferStreamData<TConfig> | null\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async set(\n    groupId: string,\n    itemId: string,\n    data: InferStreamData<TConfig>,\n  ): Promise<StreamSetResult<InferStreamData<TConfig>>> {\n    return withSpan('stream::set', {}, async (span) => {\n      span.setAttribute('motia.stream.name', this.config.name)\n      span.setAttribute('motia.stream.group_id', groupId)\n      span.setAttribute('motia.stream.item_id', itemId)\n      try {\n        return (await getInstance().trigger({\n          function_id: 'stream::set',\n          payload: { stream_name: this.config.name, group_id: groupId, item_id: itemId, data },\n        })) as StreamSetResult<InferStreamData<TConfig>>\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async delete(groupId: string, itemId: string): Promise<void> {\n    return withSpan('stream::delete', {}, async (span) => {\n      span.setAttribute('motia.stream.name', this.config.name)\n      span.setAttribute('motia.stream.group_id', groupId)\n      span.setAttribute('motia.stream.item_id', itemId)\n      try {\n        return (await getInstance().trigger({\n          function_id: 'stream::delete',\n          payload: { stream_name: this.config.name, group_id: groupId, item_id: itemId },\n        })) as void\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async list(groupId: string): Promise<InferStreamData<TConfig>[]> {\n    return withSpan('stream::list', {}, async (span) => {\n      span.setAttribute('motia.stream.name', this.config.name)\n      span.setAttribute('motia.stream.group_id', groupId)\n      try {\n        return (await getInstance().trigger({\n          function_id: 'stream::list',\n          payload: { stream_name: this.config.name, group_id: groupId },\n        })) as InferStreamData<TConfig>[]\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async update(groupId: string, itemId: string, ops: UpdateOp[]): Promise<StreamSetResult<InferStreamData<TConfig>>> {\n    return withSpan('stream::update', {}, async (span) => {\n      span.setAttribute('motia.stream.name', this.config.name)\n      span.setAttribute('motia.stream.group_id', groupId)\n      span.setAttribute('motia.stream.item_id', itemId)\n      try {\n        return (await getInstance().trigger({\n          function_id: 'stream::update',\n          payload: { stream_name: this.config.name, group_id: groupId, item_id: itemId, ops },\n        })) as StreamSetResult<InferStreamData<TConfig>>\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async listGroups(): Promise<string[]> {\n    return withSpan('stream::list_groups', {}, async (span) => {\n      span.setAttribute('motia.stream.name', this.config.name)\n      try {\n        return (await getInstance().trigger({\n          function_id: 'stream::list_groups',\n          payload: { stream_name: this.config.name },\n        })) as string[]\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async send<T>(channel: StateStreamEventChannel, event: StateStreamEvent<T>): Promise<void> {\n    return withSpan('stream::send', {}, async (span) => {\n      span.setAttribute('motia.stream.name', this.config.name)\n      span.setAttribute('motia.stream.group_id', channel.groupId)\n      if (channel.id) span.setAttribute('motia.stream.item_id', channel.id)\n      try {\n        await getInstance().trigger({\n          function_id: 'stream::send',\n          payload: {\n            stream_name: this.config.name,\n            group_id: channel.groupId,\n            id: channel.id,\n            type: event.type,\n            data: event.data,\n          },\n        })\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n}\n","import { Logger } from 'iii-sdk'\n\nexport const logger = new Logger()\n","import type {\n  ApiRequest as IIIApiRequest,\n  ApiResponse as IIIApiResponse,\n  HttpRequest as IIIHttpRequest,\n  HttpResponse as IIIHttpResponse,\n} from 'iii-sdk'\nimport { http as iiiHttp, Logger } from 'iii-sdk'\nimport type { StreamAuthInput, StreamJoinLeaveEvent } from 'iii-sdk/stream'\nimport { currentTraceId } from 'iii-sdk/telemetry'\nimport { isApiTrigger, isCronTrigger, isQueueTrigger, isStateTrigger, isStreamTrigger } from '../../guards'\nimport type {\n  ApiMiddleware,\n  ApiResponse,\n  ExtractApiInput,\n  ExtractDataPayload,\n  ExtractQueueInput,\n  ExtractStateInput,\n  ExtractStreamInput,\n  FlowContext,\n  MatchHandlers,\n  ApiRequest as MotiaApiRequest,\n  MotiaHttpArgs,\n  QueueConfig,\n  Step,\n  StepConfig,\n  StepHandler,\n  TriggerConfig,\n  TriggerInfo,\n} from '../../types'\nimport type { AuthenticateStream, StreamAuthInput as MotiaStreamAuthInput, StreamConfig } from '../../types-stream'\nimport { getInstance } from '../iii'\nimport { setupStepEndpoint } from '../setup-step-endpoint'\nimport { Stream } from '../stream'\nimport { logger } from '../logger'\n\ntype StepWithHandler = Step & { handler: StepHandler<unknown> }\n\ntype TriggerConfigBase = {\n  metadata: StepConfig & { filePath: string }\n  condition_function_id?: string\n}\n\ntype ApiTriggerConfig = TriggerConfigBase & {\n  api_path: string\n  http_method: string\n}\n\ntype QueueTriggerConfig = TriggerConfigBase & {\n  topic: string\n  queue_config?: Partial<QueueConfig>\n}\n\ntype CronTriggerConfig = TriggerConfigBase & {\n  expression: string\n}\n\nconst composeMiddleware = <TRequestBody = unknown, TEnqueueData = never>(\n  ...middlewares: ApiMiddleware<TRequestBody, TEnqueueData>[]\n) => {\n  return async (\n    args: MotiaHttpArgs<TRequestBody>,\n    ctx: FlowContext<TEnqueueData, MotiaHttpArgs<TRequestBody>>,\n    handler: () => Promise<ApiResponse | void>,\n  ): Promise<ApiResponse | void> => {\n    const composedHandler = middlewares.reduceRight<() => Promise<ApiResponse | void>>(\n      (nextHandler, middleware) => () => middleware(args, ctx, nextHandler),\n      handler,\n    )\n\n    return composedHandler()\n  }\n}\n\nconst flowContext = <EnqueueData, TInput = unknown>(\n  trigger: TriggerInfo,\n  input?: TInput,\n): FlowContext<EnqueueData, TInput> => {\n  const traceId = currentTraceId() ?? crypto.randomUUID()\n  const context: FlowContext<EnqueueData, TInput> = {\n    traceId,\n    trigger,\n\n    is: {\n      queue: (inp: TInput): inp is ExtractQueueInput<TInput> => trigger.type === 'queue',\n      http: (inp: TInput): inp is ExtractApiInput<TInput> => trigger.type === 'http',\n      cron: (inp: TInput): inp is never => trigger.type === 'cron',\n      state: (inp: TInput): inp is ExtractStateInput<TInput> => trigger.type === 'state',\n      stream: (inp: TInput): inp is ExtractStreamInput<TInput> => trigger.type === 'stream',\n    },\n\n    getData: (): ExtractDataPayload<TInput> => {\n      if (trigger.type === 'http') {\n        return (input as Extract<TInput, MotiaHttpArgs>).request.body as ExtractDataPayload<TInput>\n      }\n      return input as ExtractDataPayload<TInput>\n    },\n\n    match: async <TResult = unknown>(\n      handlers: MatchHandlers<TInput, EnqueueData, TResult>,\n    ): Promise<TResult | undefined> => {\n      if (trigger.type === 'queue' && handlers.queue) {\n        await handlers.queue(input as ExtractQueueInput<TInput>)\n        return undefined\n      }\n      if (trigger.type === 'http' && handlers.http) {\n        return await handlers.http(input as ExtractApiInput<TInput>)\n      }\n      if (trigger.type === 'cron' && handlers.cron) {\n        await handlers.cron()\n        return undefined\n      }\n      if (trigger.type === 'state' && handlers.state) {\n        return await handlers.state(input as ExtractStateInput<TInput>)\n      }\n      if (trigger.type === 'stream' && handlers.stream) {\n        return await handlers.stream(input as ExtractStreamInput<TInput>)\n      }\n      if (handlers.default) {\n        return await handlers.default(input as TInput)\n      }\n\n      logger.warn(`No handler matched for trigger type: ${trigger.type}`, {\n        availableHandlers: Object.keys(handlers).filter((k) => k !== 'default'),\n        triggerType: trigger.type,\n      })\n\n      throw new Error(\n        `No handler matched for trigger type: ${trigger.type}. Available handlers: ${Object.keys(handlers).join(', ')}`,\n      )\n    },\n  }\n\n  return context\n}\n\nfunction getTriggerSuffix(trigger: TriggerConfig): string {\n  if (isApiTrigger(trigger)) return `http(${trigger.method} ${trigger.path})`\n  if (isCronTrigger(trigger)) return `cron(${trigger.expression})`\n  if (isQueueTrigger(trigger)) return `queue(${trigger.topic})`\n  if (isStreamTrigger(trigger)) return `stream(${trigger.streamName})`\n  if (isStateTrigger(trigger)) return 'state'\n  return 'unknown'\n}\n\nexport class Motia {\n  public streams: Record<string, Stream> = {}\n  private authenticateStream: AuthenticateStream | undefined\n\n  public addStep(config: StepConfig, stepPath: string, handler: StepHandler<unknown>, filePath: string) {\n    const step: StepWithHandler = { config, handler, filePath: stepPath }\n    const metadata = { ...step.config, filePath }\n\n    const seenSuffixes = new Set<string>()\n\n    step.config.triggers.forEach((trigger: TriggerConfig, index: number) => {\n      let triggerSuffix = getTriggerSuffix(trigger)\n      if (seenSuffixes.has(triggerSuffix)) {\n        triggerSuffix = `${triggerSuffix}-${index}`\n      }\n      seenSuffixes.add(triggerSuffix)\n      const function_id = `steps::${step.config.name}::trigger::${triggerSuffix}`\n\n      if (isApiTrigger(trigger)) {\n        getInstance().registerFunction(\n          { id: function_id, metadata },\n          // biome-ignore lint/suspicious/noConfusingVoidType: void is necessary here\n          iiiHttp(async (req: IIIHttpRequest, res: IIIHttpResponse): Promise<void | IIIApiResponse> => {\n            const triggerInfo: TriggerInfo = { type: 'http', index }\n            const motiaRequest: MotiaHttpArgs<unknown> = {\n              request: {\n                pathParams: req.path_params || {},\n                queryParams: req.query_params || {},\n                body: req.body,\n                headers: req.headers || {},\n                method: req.method,\n                requestBody: req.request_body,\n              },\n              response: res,\n            }\n            const context = flowContext(triggerInfo, motiaRequest)\n            const middlewares = Array.isArray(trigger?.middleware) ? trigger.middleware : []\n\n            if (middlewares.length > 0) {\n              const composed = composeMiddleware(...middlewares)\n              const result = await composed(motiaRequest, context, () =>\n                step.handler(motiaRequest, context as FlowContext),\n              )\n\n              if (result) {\n                return {\n                  status_code: result.status,\n                  body: result.body,\n                  headers: result.headers,\n                }\n              }\n            } else {\n              const result = await step.handler(motiaRequest, context as FlowContext)\n\n              if (result) {\n                return {\n                  status_code: result.status,\n                  body: result.body,\n                  headers: result.headers,\n                }\n              }\n            }\n          }),\n        )\n\n        const apiPath = trigger.path.startsWith('/') ? trigger.path.substring(1) : trigger.path\n        const triggerConfig: ApiTriggerConfig = {\n          api_path: apiPath,\n          http_method: trigger.method,\n          metadata,\n        }\n\n        if (trigger.condition) {\n          const conditionPath = `${function_id}::conditions::${index}`\n\n          getInstance().registerFunction(\n            { id: conditionPath },\n            async (req: IIIApiRequest<unknown>): Promise<unknown> => {\n              const triggerInfo: TriggerInfo = { type: 'http', index }\n              const motiaRequest: MotiaApiRequest<unknown> = {\n                pathParams: req.path_params || {},\n                queryParams: req.query_params || {},\n                body: req.body,\n                headers: req.headers || {},\n              }\n\n              return trigger.condition?.(motiaRequest, flowContext(triggerInfo, motiaRequest))\n            },\n          )\n\n          triggerConfig.condition_function_id = conditionPath\n        }\n\n        getInstance().registerTrigger({\n          type: 'http',\n          function_id,\n          config: triggerConfig,\n        })\n      } else if (isQueueTrigger(trigger)) {\n        getInstance().registerFunction({ id: function_id, metadata }, async (req) => {\n          const triggerInfo: TriggerInfo = { type: 'queue', index }\n          const context = flowContext(triggerInfo, req)\n          return step.handler(req, context)\n        })\n\n        const triggerConfig: QueueTriggerConfig = {\n          topic: trigger.topic,\n          metadata: { ...metadata },\n          ...(trigger.config ? { queue_config: trigger.config } : {}),\n        }\n\n        if (trigger.condition) {\n          const conditionPath = `${function_id}::conditions::${index}`\n\n          getInstance().registerFunction({ id: conditionPath }, async (input: unknown) => {\n            const triggerInfo: TriggerInfo = { type: 'queue', index }\n\n            return trigger.condition?.(input, flowContext(triggerInfo, input))\n          })\n\n          triggerConfig.condition_function_id = conditionPath\n        }\n\n        getInstance().registerTrigger({\n          type: 'queue',\n          function_id,\n          config: triggerConfig,\n        })\n      } else if (isCronTrigger(trigger)) {\n        getInstance().registerFunction({ id: function_id, metadata }, async (_req): Promise<unknown> => {\n          const triggerInfo: TriggerInfo = { type: 'cron', index }\n          return step.handler(undefined, flowContext(triggerInfo))\n        })\n\n        const triggerConfig: CronTriggerConfig = {\n          expression: trigger.expression,\n          metadata,\n        }\n\n        if (trigger.condition) {\n          const conditionPath = `${function_id}::conditions::${index}`\n\n          getInstance().registerFunction({ id: conditionPath }, async () => {\n            const triggerInfo: TriggerInfo = { type: 'cron', index }\n            return trigger.condition?.(undefined, flowContext(triggerInfo))\n          })\n\n          triggerConfig.condition_function_id = conditionPath\n        }\n\n        getInstance().registerTrigger({\n          type: 'cron',\n          function_id,\n          config: triggerConfig,\n        })\n      } else if (isStateTrigger(trigger)) {\n        getInstance().registerFunction({ id: function_id, metadata }, async (req) => {\n          const triggerInfo: TriggerInfo = { type: 'state', index }\n          const context = flowContext(triggerInfo, req)\n          return step.handler(req, context)\n        })\n\n        // biome-ignore lint/suspicious/noExplicitAny: needed for trigger config\n        const triggerConfig: Record<string, any> = { metadata }\n\n        if (trigger.condition) {\n          const conditionPath = `${function_id}::conditions::${index}`\n\n          getInstance().registerFunction({ id: conditionPath }, async (input) => {\n            const triggerInfo: TriggerInfo = { type: 'state', index }\n            return trigger.condition?.(input, flowContext(triggerInfo, input))\n          })\n\n          triggerConfig.condition_function_id = conditionPath\n        }\n\n        getInstance().registerTrigger({\n          type: 'state',\n          function_id,\n          config: triggerConfig,\n        })\n      } else if (isStreamTrigger(trigger)) {\n        getInstance().registerFunction({ id: function_id, metadata }, async (req) => {\n          const triggerInfo: TriggerInfo = { type: 'stream', index }\n          const context = flowContext(triggerInfo, req)\n          return step.handler(req, context)\n        })\n\n        type StreamTriggerConfig = {\n          metadata: StepConfig\n          stream_name: string\n          group_id?: string\n          item_id?: string\n          condition_function_id?: string\n        }\n\n        const triggerConfig: StreamTriggerConfig = {\n          metadata,\n          stream_name: trigger.streamName,\n          group_id: trigger.groupId,\n          item_id: trigger.itemId,\n        }\n\n        if (trigger.condition) {\n          const conditionPath = `${function_id}::conditions::${index}`\n\n          getInstance().registerFunction({ id: conditionPath }, async (input) => {\n            const triggerInfo: TriggerInfo = { type: 'stream', index }\n            return trigger.condition?.(input, flowContext(triggerInfo, input))\n          })\n\n          triggerConfig.condition_function_id = conditionPath\n        }\n\n        getInstance().registerTrigger({\n          type: 'stream',\n          function_id,\n          config: triggerConfig,\n        })\n      }\n    })\n  }\n\n  public addStream(config: StreamConfig, _streamPath: string) {\n    this.streams[config.name] = new Stream(config)\n  }\n\n  public initialize() {\n    const hasJoin = Object.values(this.streams).some((stream) => stream.config.onJoin)\n    const hasLeave = Object.values(this.streams).some((stream) => stream.config.onLeave)\n\n    setupStepEndpoint(getInstance())\n\n    if (this.authenticateStream) {\n      const function_id = 'motia::stream::authenticate'\n\n      getInstance().registerFunction({ id: function_id }, async (req: StreamAuthInput) => {\n        if (this.authenticateStream) {\n          const triggerInfo: TriggerInfo = { type: 'queue' }\n          const context = flowContext(triggerInfo)\n          const input: MotiaStreamAuthInput = {\n            headers: req.headers,\n            path: req.path,\n            queryParams: req.query_params,\n            addr: req.addr,\n          }\n\n          return this.authenticateStream(input, context)\n        }\n      })\n    }\n\n    if (hasJoin) {\n      const function_id = 'motia::stream::join'\n\n      getInstance().registerFunction({ id: function_id }, async (req: StreamJoinLeaveEvent) => {\n        const { stream_name, group_id, id, context: authContext } = req\n        const stream = this.streams[stream_name]\n        const triggerInfo: TriggerInfo = { type: 'queue' }\n        const context = flowContext(triggerInfo)\n\n        if (stream?.config.onJoin) {\n          return stream.config.onJoin({ groupId: group_id, id }, context, authContext)\n        }\n      })\n\n      getInstance().registerTrigger({\n        type: 'stream:join',\n        function_id,\n        config: {},\n      })\n    }\n\n    if (hasLeave) {\n      const function_id = 'motia::stream::leave'\n\n      getInstance().registerFunction({ id: function_id }, async (req: StreamJoinLeaveEvent) => {\n        const { stream_name, group_id, id, context: authContext } = req\n        const stream = this.streams[stream_name]\n        const triggerInfo: TriggerInfo = { type: 'queue' }\n        const context = flowContext(triggerInfo)\n\n        if (stream?.config.onLeave) {\n          await stream.config.onLeave({ groupId: group_id, id }, context, authContext)\n        }\n      })\n\n      getInstance().registerTrigger({\n        type: 'stream:leave',\n        function_id,\n        config: {},\n      })\n    }\n  }\n}\n","import type { StreamSetResult, UpdateOp } from 'iii-sdk/stream'\nimport { SpanStatusCode, withSpan } from 'iii-sdk/telemetry'\nimport type { InternalStateManager } from '../types'\nimport { getInstance } from './iii'\n\nexport class StateManager implements InternalStateManager {\n  async get<T>(scope: string, key: string): Promise<T | null> {\n    return withSpan('state::get', {}, async (span) => {\n      span.setAttribute('motia.state.scope', scope)\n      span.setAttribute('motia.state.key', key)\n      try {\n        return (await getInstance().trigger({ function_id: 'state::get', payload: { scope, key } })) as T | null\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async set<T>(scope: string, key: string, value: T): Promise<StreamSetResult<T> | null> {\n    return withSpan('state::set', {}, async (span) => {\n      span.setAttribute('motia.state.scope', scope)\n      span.setAttribute('motia.state.key', key)\n      try {\n        return (await getInstance().trigger({\n          function_id: 'state::set',\n          payload: { scope, key, value },\n        })) as StreamSetResult<T> | null\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async delete<T>(scope: string, key: string): Promise<T | null> {\n    return withSpan('state::delete', {}, async (span) => {\n      span.setAttribute('motia.state.scope', scope)\n      span.setAttribute('motia.state.key', key)\n      try {\n        return (await getInstance().trigger({ function_id: 'state::delete', payload: { scope, key } })) as T | null\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async list<T>(scope: string): Promise<T[]> {\n    return withSpan('state::list', {}, async (span) => {\n      span.setAttribute('motia.state.scope', scope)\n      try {\n        return (await getInstance().trigger({ function_id: 'state::list', payload: { scope } })) as T[]\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async listGroups(): Promise<string[]> {\n    return withSpan('state::list_groups', {}, async (span) => {\n      try {\n        return (await getInstance().trigger({ function_id: 'state::list_groups', payload: {} })) as string[]\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async update<T>(scope: string, key: string, ops: UpdateOp[]): Promise<StreamSetResult<T> | null> {\n    return withSpan('state::update', {}, async (span) => {\n      span.setAttribute('motia.state.scope', scope)\n      span.setAttribute('motia.state.key', key)\n      try {\n        return (await getInstance().trigger({ function_id: 'state::update', payload: { scope, key, ops } })) as StreamSetResult<T> | null\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n\n  async clear(scope: string): Promise<void> {\n    return withSpan('state::clear', {}, async (span) => {\n      span.setAttribute('motia.state.scope', scope)\n      try {\n        const items = await this.list<{ id: string }>(scope)\n\n        for (const item of items) {\n          await this.delete(scope, item.id)\n        }\n      } catch (err) {\n        span.setStatus({ code: SpanStatusCode.ERROR, message: String(err) })\n        span.recordException(err as Error)\n        throw err\n      }\n    })\n  }\n}\n\nexport const stateManager = new StateManager()\n","import type { EnqueueData, Enqueuer } from '../types'\nimport { getInstance } from './iii'\n\nexport const enqueue: Enqueuer<EnqueueData> = async (queue: EnqueueData): Promise<void> => {\n  await getInstance().trigger({\n    function_id: 'enqueue',\n    payload: queue,\n  })\n}\n","import type { Handlers, StepConfig } from './types'\n\ntype StepDefinition<TConfig extends StepConfig> = {\n  config: TConfig\n  handler: Handlers<TConfig>\n}\n\ntype StepBuilder<TConfig extends StepConfig> = {\n  config: TConfig\n  handle: (handler: Handlers<TConfig>) => StepDefinition<TConfig>\n}\n\nexport function step<TConfig extends StepConfig>(config: TConfig, handler: Handlers<TConfig>): StepDefinition<TConfig>\n\nexport function step<TConfig extends StepConfig>(config: TConfig): StepBuilder<TConfig>\n\nexport function step<TConfig extends StepConfig>(\n  config: TConfig,\n  handler?: Handlers<TConfig>,\n): StepDefinition<TConfig> | StepBuilder<TConfig> {\n  if (handler) {\n    return { config, handler }\n  }\n  return {\n    config,\n    handle: (h: Handlers<TConfig>) => ({ config, handler: h }),\n  }\n}\n","import type {\n  ApiMiddleware,\n  ApiRouteMethod,\n  ApiTrigger,\n  CronTrigger,\n  QueryParam,\n  QueueConfig,\n  QueueTrigger,\n  StateTrigger,\n  StepSchemaInput,\n  StreamTrigger,\n  TriggerCondition,\n} from './types'\n\ntype ApiOptions<TSchema extends StepSchemaInput | undefined = undefined> = {\n  bodySchema?: TSchema\n  responseSchema?: Record<number, StepSchemaInput>\n  queryParams?: readonly QueryParam[]\n  // biome-ignore lint/suspicious/noExplicitAny: we need to define this type to avoid type errors\n  middleware?: readonly ApiMiddleware<any, any, any>[]\n}\n\ntype QueueOptions<TSchema extends StepSchemaInput | undefined = undefined> = {\n  input?: TSchema\n  config?: Partial<QueueConfig>\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: we need any to accept all schema types\nexport function http<TOptions extends ApiOptions<any> | undefined = undefined>(\n  method: ApiRouteMethod,\n  path: string,\n  options?: TOptions,\n  condition?: TriggerCondition,\n): ApiTrigger<TOptions extends ApiOptions<infer S> ? S : undefined> {\n  // biome-ignore lint/suspicious/noExplicitAny: runtime return is correct, cast needed for flexible type\n  return { type: 'http', method, path, ...options, condition } as any\n}\n\n/** @deprecated Use http() instead. Will be removed in a future version. */\nexport function api<TOptions extends ApiOptions<any> | undefined = undefined>(\n  method: ApiRouteMethod,\n  path: string,\n  options?: TOptions,\n  condition?: TriggerCondition,\n): ApiTrigger<TOptions extends ApiOptions<infer S> ? S : undefined> {\n  return http(method, path, options, condition)\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: we need any to accept all schema types\nexport function queue<TOptions extends QueueOptions<any> | undefined = undefined>(\n  topic: string,\n  options?: TOptions,\n  condition?: TriggerCondition,\n): QueueTrigger<TOptions extends QueueOptions<infer S> ? S : undefined> {\n  // biome-ignore lint/suspicious/noExplicitAny: runtime return is correct, cast needed for flexible type\n  return { type: 'queue', topic, ...options, condition } as any\n}\n\nexport function cron(expression: string, condition?: TriggerCondition): CronTrigger {\n  return { type: 'cron', expression, condition }\n}\n\nexport function state(condition?: TriggerCondition): StateTrigger {\n  return { type: 'state', condition }\n}\n\ntype StreamOptions = {\n  groupId?: string\n  itemId?: string\n  condition?: TriggerCondition\n}\n\nexport function stream(streamName: string, optionsOrCondition?: StreamOptions | TriggerCondition): StreamTrigger {\n  if (typeof optionsOrCondition === 'function') {\n    return { type: 'stream', streamName, condition: optionsOrCondition }\n  }\n  const { groupId, itemId, condition } = optionsOrCondition ?? {}\n  return { type: 'stream', streamName, groupId, itemId, condition }\n}\n","import type { ChannelReader, Logger } from 'iii-sdk'\nimport type { StreamSetResult, UpdateOp } from 'iii-sdk/stream'\nimport type { FromSchema } from 'json-schema-to-ts'\nimport type { ZodType } from 'zod'\nimport * as z from 'zod'\nimport type { JsonSchema } from './types/schema.types'\n\n// biome-ignore lint/suspicious/noExplicitAny: we need to define this type to avoid type errors\nexport type ZodInput = ZodType<any, any, any>\n\nexport type TypedJsonSchema<T = unknown> = JsonSchema & { readonly __phantomType?: T }\n\nexport type StepSchemaInput = ZodInput | JsonSchema | TypedJsonSchema<unknown>\n\nexport function jsonSchema<T extends z.ZodType>(schema: T): TypedJsonSchema<z.output<T>> {\n  return z.toJSONSchema(schema, { target: 'draft-7' }) as TypedJsonSchema<z.output<T>>\n}\n\nexport type InternalStateManager = {\n  get<T>(groupId: string, key: string): Promise<T | null>\n  set<T>(groupId: string, key: string, value: T): Promise<StreamSetResult<T> | null>\n  update<T>(groupId: string, key: string, ops: UpdateOp[]): Promise<StreamSetResult<T> | null>\n  delete<T>(groupId: string, key: string): Promise<T | null>\n  list<T>(groupId: string): Promise<T[]>\n  clear(groupId: string): Promise<void>\n}\n\nexport type EnqueueData<T = unknown> = { topic: string; data: T; messageGroupId?: string }\nexport type Enqueuer<TData> = (event: TData) => Promise<void>\n\nexport type ExtractQueueInput<TInput> = Exclude<Exclude<Exclude<TInput, ApiRequest>, MotiaHttpArgs>, undefined>\nexport type ExtractApiInput<TInput> = Extract<TInput, ApiRequest | MotiaHttpArgs>\nexport type ExtractStateInput<TInput> = Extract<TInput, StateTriggerInput<unknown>>\nexport type ExtractStreamInput<TInput> = Extract<TInput, StreamTriggerInput<unknown>>\nexport type ExtractDataPayload<TInput> =\n  TInput extends ApiRequest<infer TBody>\n    ? TBody\n    : TInput extends MotiaHttpArgs<infer TBody>\n      ? TBody\n      : TInput extends undefined\n        ? undefined\n        : TInput\n\nexport type MatchHandlers<TInput, _TEnqueueData, TResult> = {\n  queue?: (input: ExtractQueueInput<TInput>) => Promise<void>\n\n  http?: (request: ExtractApiInput<TInput>) => Promise<TResult>\n\n  cron?: () => Promise<void>\n\n  state?: (input: ExtractStateInput<TInput>) => Promise<TResult>\n\n  stream?: (input: ExtractStreamInput<TInput>) => Promise<TResult>\n\n  default?: (input: TInput) => Promise<TResult | undefined>\n}\n\nexport interface FlowContext<TEnqueueData = never, TInput = unknown> {\n  traceId: string\n  trigger: TriggerInfo\n\n  is: {\n    queue: (input: TInput) => input is ExtractQueueInput<TInput>\n    http: (input: TInput) => input is ExtractApiInput<TInput>\n    cron: (input: TInput) => input is never\n    state: (input: TInput) => input is ExtractStateInput<TInput>\n    stream: (input: TInput) => input is ExtractStreamInput<TInput>\n  }\n\n  /**\n   * Extracts the data payload from the input, regardless of trigger type.\n   * Useful when multiple triggers (e.g., queue and API) share the same data schema.\n   *\n   * - For API triggers: returns `request.body`\n   * - For queue triggers: returns the queue data directly\n   * - For cron triggers: returns `undefined`\n   *\n   * @example\n   * ```ts\n   * // When queue and API triggers have the same schema\n   * const orderData = ctx.getData() // Works for both triggers\n   * ```\n   */\n  getData: () => ExtractDataPayload<TInput>\n\n  // biome-ignore lint/suspicious/noExplicitAny: we need to define this type to avoid type errors\n  match: <TResult = any>(handlers: MatchHandlers<TInput, TEnqueueData, TResult>) => Promise<TResult | undefined>\n}\n\nexport type Enqueue = string | { topic: string; label?: string; conditional?: boolean }\n\ntype TriggerType = 'http' | 'queue' | 'cron' | 'state' | 'stream'\n\nexport type TriggerInfo = {\n  type: TriggerType\n  index?: number\n  path?: string\n  method?: string\n  topic?: string\n  expression?: string\n}\n\ntype QueueTriggerInput<T> = T\n\ntype ApiTriggerInput<T> = ApiRequest<T>\n\ntype CronTriggerInput = undefined\n\nexport type StateTriggerInput<T> = {\n  type: 'state'\n  group_id: string\n  item_id: string\n  old_value?: T\n  new_value?: T\n}\n\nexport type StreamEvent<TData> =\n  | { type: 'create'; data: TData }\n  | { type: 'update'; data: TData }\n  | { type: 'delete'; data: TData }\n\nexport type StreamTriggerInput<T> = {\n  type: 'stream'\n  timestamp: number\n  streamName: string\n  groupId: string\n  id: string\n  event: StreamEvent<T>\n}\n\nexport type TriggerInput<T> =\n  | QueueTriggerInput<T>\n  | ApiTriggerInput<T>\n  | CronTriggerInput\n  | StateTriggerInput<T>\n  | StreamTriggerInput<T>\n\nexport type TriggerCondition<TInput = unknown> = (\n  input: TriggerInput<TInput>,\n  ctx: FlowContext<never, TriggerInput<TInput>>,\n) => boolean | Promise<boolean>\n\nexport type HandlerConfig = {\n  ram: number\n  cpu?: number\n  timeout: number\n}\n\nexport type QueueConfig = {\n  type: 'fifo' | 'standard'\n  maxRetries: number\n  visibilityTimeout: number\n  delaySeconds: number\n  concurrency?: number\n  backoffType?: string\n  backoffDelayMs?: number\n}\n\nexport type ApiRouteMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD'\n\nexport type ApiMiddleware<TBody = unknown, TEnqueueData = never> = (\n  req: MotiaHttpArgs<TBody>,\n  ctx: FlowContext<TEnqueueData, MotiaHttpArgs<TBody>>,\n  next: () => Promise<ApiResponse | void>,\n) => Promise<ApiResponse | void>\n\nexport interface QueryParam {\n  name: string\n  description: string\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: we need any to allow trigger assignment to TriggerConfig\nexport type StateTrigger<TSchema extends StepSchemaInput | undefined = any> = {\n  type: 'state'\n  condition?: TriggerCondition<InferSchema<TSchema>>\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: we need any to allow trigger assignment to TriggerConfig\nexport type StreamTrigger<TSchema extends StepSchemaInput | undefined = any> = {\n  type: 'stream'\n  streamName: string\n  groupId?: string\n  itemId?: string\n  condition?: TriggerCondition<InferSchema<TSchema>>\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: we need any to allow trigger assignment to TriggerConfig\nexport type QueueTrigger<TSchema extends StepSchemaInput | undefined = any> = {\n  type: 'queue'\n  topic: string\n  input?: TSchema\n  condition?: TriggerCondition<TSchema extends ZodInput ? z.infer<TSchema> : unknown>\n  config?: Partial<QueueConfig>\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: we need any to allow trigger assignment to TriggerConfig\nexport type ApiTrigger<TSchema extends StepSchemaInput | undefined = any> = {\n  type: 'http'\n  path: string\n  method: ApiRouteMethod\n  bodySchema?: TSchema\n  responseSchema?: Record<number, StepSchemaInput>\n  queryParams?: readonly QueryParam[]\n  // biome-ignore lint/suspicious/noExplicitAny: we need to define this type to avoid type errors\n  middleware?: readonly ApiMiddleware<any, any>[]\n  condition?: TriggerCondition<TSchema extends ZodInput ? z.infer<TSchema> : unknown>\n}\n\nexport type CronTrigger = {\n  type: 'cron'\n  expression: string\n  input?: never\n  condition?: TriggerCondition\n}\n\nexport type TriggerConfig = QueueTrigger | ApiTrigger | CronTrigger | StateTrigger | StreamTrigger\n\nexport type StepConfig = {\n  name: string\n  description?: string\n  triggers: readonly TriggerConfig[]\n  enqueues?: readonly Enqueue[]\n  virtualEnqueues?: readonly Enqueue[]\n  virtualSubscribes?: readonly string[]\n  flows?: readonly string[]\n  includeFiles?: readonly string[]\n}\n\nexport type MotiaHttpResponse = {\n  status: (statusCode: number) => void\n  headers: (headers: Record<string, string>) => void\n  stream: NodeJS.WritableStream\n  close: () => void\n}\n\nexport interface ApiRequest<TBody = unknown> {\n  pathParams: Record<string, string>\n  queryParams: Record<string, string | string[]>\n  body: TBody\n  headers: Record<string, string | string[]>\n}\n\nexport interface MotiaHttpRequest<TBody = unknown> {\n  pathParams: Record<string, string>\n  queryParams: Record<string, string | string[]>\n  body: TBody\n  headers: Record<string, string | string[]>\n  method: string\n  requestBody: ChannelReader\n}\n\nexport interface MotiaHttpArgs<TBody = unknown> {\n  request: MotiaHttpRequest<TBody>\n  response: MotiaHttpResponse\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: we need to define this type to avoid type errors\nexport type ApiResponse<TStatus extends number = number, TBody = any> = {\n  status: TStatus\n  headers?: Record<string, string>\n  body: TBody\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: we need to define this type to avoid type errors\nexport type StepHandler<TInput = any, TEnqueueData = never> = (\n  input: TriggerInput<TInput>,\n  ctx: FlowContext<TEnqueueData, TriggerInput<TInput>>,\n) => Promise<ApiResponse | void>\n\nexport type Event<TData = unknown> = {\n  topic: string\n  data: TData\n  traceId: string\n  flows?: string[]\n  logger: Logger\n  messageGroupId?: string\n}\n\nexport type Handler<TData = unknown> = (event: Event<TData>) => Promise<void>\n\nexport type SubscribeConfig<TData> = {\n  queue: string\n  handlerName: string\n  filePath: string\n  handler: Handler<TData>\n}\n\nexport type UnsubscribeConfig = {\n  filePath: string\n  queue: string\n}\n\nexport type Step = { filePath: string; config: StepConfig }\n\nexport type Flow = {\n  name: string\n  description?: string\n  steps: Step[]\n}\n\n// biome-ignore lint/suspicious/noEmptyInterface: we need to define this interface to avoid type errors\nexport interface Streams {}\n\n// biome-ignore lint/suspicious/noEmptyInterface: we need to define this interface to avoid type errors\nexport interface Enqueues {}\n\nexport type InferSchema<T, TFallback = unknown> =\n  T extends TypedJsonSchema<infer O>\n    ? O\n    : T extends ZodInput\n      ? z.infer<T>\n      : T extends { readonly type: string }\n        ? FromSchema<T & { type: any }>\n        : T extends { readonly anyOf: readonly any[] }\n          ? FromSchema<T & { anyOf: any }>\n          : T extends { readonly allOf: readonly any[] }\n            ? FromSchema<T & { allOf: any }>\n            : T extends { readonly oneOf: readonly any[] }\n              ? FromSchema<T & { oneOf: any }>\n              : T extends undefined\n                ? unknown\n                : TFallback\n\ntype InferBodySchema<S> = S extends ZodInput ? z.infer<S> : S extends StepSchemaInput ? InferSchema<S> : unknown\n\ntype TriggerToInput<TTrigger> = TTrigger extends { type: 'queue'; input?: infer S }\n  ? S extends ZodInput\n    ? z.infer<S>\n    : S extends StepSchemaInput\n      ? InferSchema<S>\n      : unknown\n  : TTrigger extends { type: 'http'; bodySchema?: infer S }\n    ? MotiaHttpArgs<InferBodySchema<S>>\n    : TTrigger extends { type: 'state' }\n      ? StateTriggerInput<unknown>\n      : TTrigger extends { type: 'stream' }\n        ? StreamTriggerInput<unknown>\n        : TTrigger extends { type: 'cron' }\n          ? undefined\n          : never\n\ntype InferHandlerInput<TConfig extends StepConfig> = TriggerToInput<TConfig['triggers'][number]>\n\n// biome-ignore lint/suspicious/noConfusingVoidType: we need to define this type to avoid type errors\ntype InferReturnType = Promise<ApiResponse | void>\n\ntype EnqueueTopic<T extends string> = T extends keyof Enqueues ? Enqueues[T] : unknown\n\ntype NormalizeEnqueue<E> = E extends string\n  ? { topic: E }\n  : E extends { topic: infer T extends string }\n    ? { topic: T }\n    : never\n\ntype EnqueueElement<E> =\n  NormalizeEnqueue<E> extends { topic: infer T extends string } ? { topic: T; data: EnqueueTopic<T> } : never\n\ntype InferEnqueues<T> = T extends { enqueues: readonly unknown[] } ? EnqueueElement<T['enqueues'][number]> : never\n\nexport type Handlers<TConfig extends StepConfig> = (\n  input: InferHandlerInput<TConfig>,\n  ctx: FlowContext<InferEnqueues<TConfig>, InferHandlerInput<TConfig>>,\n) => InferReturnType\n"],"mappings":"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"}