{"version":3,"sources":["../../../src/experimental/workflows/workflow.ts"],"names":["WorkflowError","FrameworkError","constructor","message","extra","errors","context","run","isRetryable","isFatal","Workflow","Serializable","START","SELF","PREV","NEXT","END","emitter","steps","startStep","input","Map","undefined","Emitter","root","child","namespace","toCamelCase","name","filter","Boolean","creator","getSteps","Array","from","keys","schemas","pick","addStep","step","_addStep","addStrictStep","schema","schemaOrStep","stepOrEmpty","trim","ValueError","has","stepOrFlow","set","handler","asStep","setStart","state","options","RunContext","enter","signal","params","runContext","parse","result","handlers","abort","reason","next","findStep","start","current","get","push","emit","stepInput","parseAsync","catch","err","shallowCopy","response","update","at","error","outputSchema","delStep","delete","overrides","ctx","mappedInput","mappedOutput","output","index","indexOf","prev","createSnapshot","omit","loadSnapshot","snapshot","Object","assign","z","any"],"mappings":";;;;;;;;;;;;AA0FO,MAAMA,sBAIHC,yBAAAA,CAAAA;EA9FV;;;AA+FEC,EAAAA,WAAAA,CAAYC,SAAiBC,KAA2D,EAAA;AACtF,IAAMD,KAAAA,CAAAA,OAAAA,EAASC,OAAOC,MAAQ,EAAA;MAC5BC,OAASF,EAAAA,KAAAA,EAAOG,OAAO,EAAC;MACxBC,WAAa,EAAA,KAAA;MACbC,OAAS,EAAA;KACX,CAAA;AACF;AACF;AAEO,MAAMC,iBAIHC,6BAAAA,CAAAA;EA5GV;;;;AA6GE,EAAA,OAAuBC,KAAQ,GAAA,WAAA;AAC/B,EAAA,OAAuBC,IAAO,GAAA,UAAA;AAC9B,EAAA,OAAuBC,IAAO,GAAA,UAAA;AAC9B,EAAA,OAAuBC,IAAO,GAAA,UAAA;AAC9B,EAAA,OAAuBC,GAAM,GAAA,SAAA;AAEbC,EAAAA,OAAAA;AAEGC,EAAAA,KAAAA;AACTC,EAAAA,SAAAA;AAEVjB,EAAAA,WAAAA,CAA+BkB,KAAmC,EAAA;AAChE,IAAK,KAAA,EAAA,EAAA,IADwBA,CAAAA,KAAAA,GAAAA,KAAAA,EAAAA,IAAAA,CAHZF,wBAAYG,IAAAA,GAAAA,EAAAA,EAAAA,IAAAA,CACrBF,SAA+BG,GAAAA,MAAAA;AAIvC,IAAKL,IAAAA,CAAAA,OAAAA,GAAUM,mBAAQC,CAAAA,IAAAA,CAAKC,KAAM,CAAA;MAChCC,SAAW,EAAA;AAAC,QAAA,UAAA;QAAYC,kBAAYP,CAAAA,KAAAA,EAAOQ,QAAQ,EAAA;AAAKC,OAAAA,CAAAA,MAAAA,CAAOC,OAAAA,CAAAA;MAC/DC,OAAS,EAAA;KACX,CAAA;AACF;EAEAC,QAAW,GAAA;AACT,IAAA,OAAOC,KAAMC,CAAAA,IAAAA,CAAK,IAAKhB,CAAAA,KAAAA,CAAMiB,MAAI,CAAA;AACnC;AAEA,EAAA,IAAIP,IAAO,GAAA;AACT,IAAO,OAAA,IAAA,CAAKR,MAAMQ,IAAQ,IAAA,EAAA;AAC5B;AAEA,EAAA,IAAIQ,OAAU,GAAA;AACZ,IAAOC,OAAAA,WAAAA,CAAK,KAAKjB,KAAO,EAAA;AAAC,MAAA,QAAA;AAAU,MAAA;AAAe,KAAA,CAAA;AACpD;AAUAkB,EAAAA,OAAAA,CACEV,MACAW,IACsC,EAAA;AACtC,IAAO,OAAA,IAAA,CAAKC,QAASZ,CAAAA,IAAAA,EAAMW,IAAAA,CAAAA;AAC7B;EAYAE,aACEb,CAAAA,IAAAA,EACAc,QACAH,IACsC,EAAA;AACtC,IAAA,OAAO,IAAKC,CAAAA,QAAAA,CAASZ,IAAMc,EAAAA,MAAAA,EAAQH,IAAAA,CAAAA;AACrC;EAEUC,QACRZ,CAAAA,IAAAA,EACAe,cACAC,WACsC,EAAA;AACtC,IAAI,IAAA,CAAChB,IAAKiB,CAAAA,IAAAA,EAAQ,EAAA;AAChB,MAAM,MAAA,IAAIC,sBAAW,CAA4B,0BAAA,CAAA,CAAA;AACnD;AACA,IAAA,IAAI,IAAK5B,CAAAA,KAAAA,CAAM6B,GAAInB,CAAAA,IAAAA,CAAO,EAAA;AACxB,MAAA,MAAM,IAAIkB,qBAAAA,CAAW,CAASlB,MAAAA,EAAAA,IAAAA,CAAuB,iBAAA,CAAA,CAAA;AACvD;AACA,IAAIA,IAAAA,IAAAA,KAASlB,SAASM,GAAK,EAAA;AACzB,MAAA,MAAM,IAAI8B,qBAAAA,CAAW,CAAalB,UAAAA,EAAAA,IAAAA,CAAuB,iBAAA,CAAA,CAAA;AAC3D;AAEA,IAAA,MAAMc,MAAUC,GAAAA,YAAAA,IAAgBC,WAAcD,GAAAA,YAAAA,GAAe,KAAKvB,KAAMsB,CAAAA,MAAAA;AACxE,IAAA,MAAMM,aAAaJ,WAAeD,IAAAA,YAAAA;AAElC,IAAKzB,IAAAA,CAAAA,KAAAA,CAAM+B,IAAIrB,IAAM,EAAA;AACnBc,MAAAA,MAAAA;AACAQ,MAAAA,OAAAA,EAASF,sBAAsBtC,QAAWsC,GAAAA,UAAAA,CAAWG,MAAO,CAAA,EAAC,CAAKH,GAAAA;KACpE,CAAA;AAEA,IAAO,OAAA,IAAA;AACT;AAEAI,EAAAA,QAAAA,CAASxB,IAAa,EAAA;AACpB,IAAA,IAAA,CAAKT,SAAYS,GAAAA,IAAAA;AACjB,IAAO,OAAA,IAAA;AACT;EAEArB,GAAI8C,CAAAA,KAAAA,EAAwBC,OAAqC,GAAA,EAAI,EAAA;AACnE,IAAOC,OAAAA,sBAAAA,CAAWC,MAChB,IACA,EAAA;AAAEC,MAAAA,MAAAA,EAAQH,OAASG,EAAAA,MAAAA;MAAQC,MAAQ,EAAA;AAACL,QAAAA,KAAAA;AAAOC,QAAAA;;AAAkB,KAAA,EAC7D,OAAOK,UAAAA,KAAAA;AACL,MAAA,MAAMpD,GAA2C,GAAA;AAC/CW,QAAAA,KAAAA,EAAO,EAAA;AACPmC,QAAAA,KAAAA,EAAO,IAAKjC,CAAAA,KAAAA,CAAMsB,MAAOkB,CAAAA,KAAAA,CAAMP,KAAAA,CAAAA;QAC/BQ,MAAQvC,EAAAA;AACV,OAAA;AACA,MAAA,MAAMwC,QAA8C,GAAA;AAClD5C,QAAAA,KAAAA,EAAOX,GAAIW,CAAAA,KAAAA;AACXuC,QAAAA,MAAAA,EAAQE,UAAWF,CAAAA,MAAAA;AACnBM,QAAAA,KAAAA,kBAAQC,MAAAA,CAAAA,CAAAA,MAAAA,KAAWL,UAAWI,CAAAA,KAAAA,CAAMC,MAAAA,CAA7B,EAAA,OAAA;AACT,OAAA;AAEA,MAAA,IAAIC,IACF,GAAA,IAAA,CAAKC,QAASZ,CAAAA,OAAAA,EAASa,SAAS,IAAKhD,CAAAA,SAAAA,IAAa,IAAKa,CAAAA,QAAAA,EAAW,CAAA,CAAA,CAAE,CAAA,CAAEoC,WACtE1D,QAASM,CAAAA,GAAAA;AAEX,MAAOiD,OAAAA,IAAAA,IAAQA,IAASvD,KAAAA,QAAAA,CAASM,GAAK,EAAA;AACpC,QAAA,MAAMuB,IAAO,GAAA,IAAA,CAAKrB,KAAMmD,CAAAA,GAAAA,CAAIJ,IAAAA,CAAAA;AAC5B,QAAA,IAAI,CAAC1B,IAAM,EAAA;AACT,UAAA,MAAM,IAAIvC,aAAAA,CAAc,CAASiE,MAAAA,EAAAA,IAAAA,CAAwB,gBAAA,CAAA,EAAA;AAAE1D,YAAAA;WAAI,CAAA;AACjE;AACAA,QAAAA,GAAAA,CAAIW,MAAMoD,IAAK,CAAA;UAAE1C,IAAMqC,EAAAA,IAAAA;AAAMZ,UAAAA,KAAAA,EAAO9C,GAAI8C,CAAAA;SAAM,CAAA;AAC9C,QAAMM,MAAAA,UAAAA,CAAW1C,OAAQsD,CAAAA,IAAAA,CAAK,OAAS,EAAA;AAAEhE,UAAAA,GAAAA;UAAKgC,IAAM0B,EAAAA;SAAK,CAAA;AACzD,QAAI,IAAA;AACF,UAAMO,MAAAA,SAAAA,GAAY,MAAMjC,IAAAA,CAAKG,MAAO+B,CAAAA,UAAAA,CAAWlE,IAAI8C,KAAK,CAAA,CAAEqB,KAAM,CAAA,CAACC,GAAAA,KAAAA;AAC/D,YAAA,MAAM,IAAI3E,aAAAA,CACR,CAASiE,MAAAA,EAAAA,IAAAA,CACT,oFAAA,CAAA,EAAA;AAAE1D,cAAAA,GAAAA,EAAKqE,sBAAYrE,GAAAA,CAAAA;cAAMF,MAAQ,EAAA;AAACsE,gBAAAA;;aAAK,CAAA;WAE3C,CAAA;AACA,UAAA,MAAME,QAAW,GAAA,MAAMtC,IAAKW,CAAAA,OAAAA,CAAQsB,WAAWV,QAAAA,CAAAA;AAC/C,UAAA,IAAIe,SAASC,MAAQ,EAAA;AACnBvE,YAAAA,GAAAA,CAAI8C,KAAQ,GAAA;AAAE,cAAA,GAAG9C,GAAI8C,CAAAA,KAAAA;AAAO,cAAA,GAAGwB,QAASC,CAAAA;AAAO,aAAA;AACjD;AACA,UAAMnB,MAAAA,UAAAA,CAAW1C,OAAQsD,CAAAA,IAAAA,CAAK,SAAW,EAAA;AACvChE,YAAAA,GAAAA,EAAKqE,sBAAYrE,GAAAA,CAAAA;AACjBsE,YAAAA,QAAAA;YACAtC,IAAM0B,EAAAA;WACR,CAAA;AAEA,UAAIY,IAAAA,QAAAA,CAASZ,IAASvD,KAAAA,QAAAA,CAASE,KAAO,EAAA;AACpCqD,YAAAA,IAAAA,GAAO1D,GAAIW,CAAAA,KAAAA,CAAM6D,EAAG,CAAA,CAAA,CAAInD,EAAAA,IAAAA;WACfiD,MAAAA,IAAAA,QAAAA,CAASZ,IAASvD,KAAAA,QAAAA,CAASI,IAAM,EAAA;AAC1CmD,YAAAA,IAAAA,GAAO1D,GAAIW,CAAAA,KAAAA,CAAM6D,EAAG,CAAA,CAAA,CAAC,CAAInD,EAAAA,IAAAA;WAChBiD,MAAAA,IAAAA,QAAAA,CAASZ,IAASvD,KAAAA,QAAAA,CAASG,IAAM,EAAA;AAC1CoD,YAAAA,IAAAA,GAAO1D,GAAIW,CAAAA,KAAAA,CAAM6D,EAAG,CAAA,CAAA,CAAC,CAAInD,EAAAA,IAAAA;AAC3B,WAAA,MAAA,IAAW,CAACiD,QAASZ,CAAAA,IAAAA,IAAQY,QAASZ,CAAAA,IAAAA,KAASvD,SAASK,IAAM,EAAA;AAC5DkD,YAAAA,IAAAA,GAAO,IAAKC,CAAAA,QAAAA,CAASD,IAAAA,CAAAA,CAAMA,QAAQvD,QAASM,CAAAA,GAAAA;WACvC,MAAA;AACLiD,YAAAA,IAAAA,GAAOY,QAASZ,CAAAA,IAAAA;AAClB;AACF,SAAA,CAAA,OAASe,KAAO,EAAA;AACd,UAAMrB,MAAAA,UAAAA,CAAW1C,OAAQsD,CAAAA,IAAAA,CAAK,OAAS,EAAA;AACrChE,YAAAA,GAAAA,EAAKqE,sBAAYrE,GAAAA,CAAAA;YACjBgC,IAAM0B,EAAAA,IAAAA;AACNe,YAAAA;WACF,CAAA;AACA,UAAMA,MAAAA,KAAAA;AACR;AACF;AAEAzE,MAAAA,GAAAA,CAAIsD,MAAS,GAAA,MAAA,CAAO,IAAKzC,CAAAA,KAAAA,CAAM6D,gBAAgB,IAAK7D,CAAAA,KAAAA,CAAMsB,MACvD+B,EAAAA,UAAAA,CAAWlE,GAAI8C,CAAAA,KAAK,CACpBqB,CAAAA,KAAAA,CAAM,CAACC,GAAAA,KAAAA;AACN,QAAM,MAAA,IAAI3E,cACR,CACA,kFAAA,CAAA,EAAA;AAAEO,UAAAA,GAAAA,EAAKqE,sBAAYrE,GAAAA,CAAAA;UAAMF,MAAQ,EAAA;AAACsE,YAAAA;;SAAK,CAAA;OAE3C,CAAA;AACF,MAAOpE,OAAAA,GAAAA;KACT,CAAA;AAEJ;AAEA2E,EAAAA,OAAAA,CAAyBtD,IAAuD,EAAA;AAC9E,IAAI,IAAA,IAAA,CAAKT,cAAcS,IAAM,EAAA;AAC3B,MAAA,IAAA,CAAKT,SAAYG,GAAAA,MAAAA;AACnB;AACA,IAAKJ,IAAAA,CAAAA,KAAAA,CAAMiE,OAAOvD,IAAAA,CAAAA;AAClB,IAAO,OAAA,IAAA;AACT;AAEAuB,EAAAA,MAAAA,CAIEiC,SAK+C,EAAA;AAC/C,IAAO,OAAA,OAAOhE,OAAOiE,GAAAA,KAAAA;AACnB,MAAA,MAAMC,cAAcF,SAAWhE,EAAAA,KAAAA,GAAQgE,SAAUhE,CAAAA,KAAAA,CAAMA,KAAAA,CAASA,GAAAA,KAAAA;AAChE,MAAA,MAAMyC,MAAS,GAAA,MAAM,IAAKtD,CAAAA,GAAAA,CAAI+E,WAAa,EAAA;AAAEnB,QAAAA,KAAAA,EAAOiB,SAAWjB,EAAAA,KAAAA;AAAOV,QAAAA,MAAAA,EAAQ4B,GAAI5B,CAAAA;OAAO,CAAA;AACzF,MAAM8B,MAAAA,YAAAA,GAAeH,WAAWI,MAASJ,GAAAA,SAAAA,CAAUI,OAAO3B,MAAOR,CAAAA,KAAK,IAAIQ,MAAOR,CAAAA,KAAAA;AAEjF,MAAO,OAAA;QACLyB,MAAQS,EAAAA,YAAAA;AACRtB,QAAAA,IAAAA,EAAMmB,SAAWnB,EAAAA;AACnB,OAAA;AACF,KAAA;AACF;AAEUC,EAAAA,QAAAA,CAASE,OAAgB,EAAA;AACjC,IAAMlD,MAAAA,KAAAA,GAAQ,KAAKc,QAAQ,EAAA;AAC3B,IAAMyD,MAAAA,KAAAA,GAAQvE,KAAMwE,CAAAA,OAAAA,CAAQtB,OAAAA,CAAAA;AAC5B,IAAO,OAAA;MACLuB,IAAMzE,EAAAA,KAAAA,CAAMuE,QAAQ,CAAA,CAAA;AACpBrB,MAAAA,OAAAA,EAASlD,MAAMuE,KAAAA,CAAAA;MACfxB,IAAM/C,EAAAA,KAAAA,CAAMuE,QAAQ,CAAA;AACtB,KAAA;AACF;EAEAG,cAAiB,GAAA;AACf,IAAO,OAAA;MACLxE,KAAOyE,EAAAA,WAAAA,CAAK,KAAKzE,KAAO,EAAA;AAAC,QAAA,QAAA;AAAU,QAAA;AAAe,OAAA,CAAA;AAClDH,MAAAA,OAAAA,EAAS,IAAKA,CAAAA,OAAAA;AACdE,MAAAA,SAAAA,EAAW,IAAKA,CAAAA,SAAAA;AAChBD,MAAAA,KAAAA,EAAO,IAAKA,CAAAA;AACd,KAAA;AACF;AAEA4E,EAAAA,YAAAA,CAAaC,QAAkD,EAAA;AAC7DC,IAAOC,MAAAA,CAAAA,MAAAA,CAAO,MAAMF,QAAAA,CAAAA;AACpB,IAAK3E,IAAAA,CAAAA,KAAAA,CAAMsB,MAAWwD,KAAAA,KAAAA,CAAEC,GAAG,EAAA;AAC3B,IAAK/E,IAAAA,CAAAA,KAAAA,CAAM6D,YAAiBiB,KAAAA,KAAAA,CAAEC,GAAG,EAAA;AACnC;AACF","file":"workflow.cjs","sourcesContent":["/**\n * Copyright 2025 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { z, ZodSchema } from \"zod\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { Callback, Emitter } from \"@/emitter/emitter.js\";\nimport { RunContext } from \"@/context.js\";\nimport { omit, pick, toCamelCase } from \"remeda\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { FrameworkError, ValueError } from \"@/errors.js\";\n\nexport interface WorkflowStepResponse<T extends ZodSchema, K extends string> {\n  update?: Partial<z.output<T>>;\n  next?: FlowStepName<K>;\n}\n\nexport interface WorkflowRun<T extends ZodSchema, T2 extends ZodSchema, K extends string> {\n  result: z.output<T2>;\n  steps: WorkflowStepRes<T, K>[];\n  state: z.output<T>;\n}\n\nexport interface WorkflowRunOptions<K extends string> {\n  start?: K;\n  signal?: AbortSignal;\n}\n\nexport interface WorkflowStepDef<T extends ZodSchema, K extends string> {\n  schema: T;\n  handler: WorkflowStepHandler<T, K>;\n}\n\nexport interface WorkflowStepRes<T extends ZodSchema, K extends string> {\n  name: K;\n  state: z.output<T>;\n}\n\nexport interface WorkflowRunContext<T extends ZodSchema, K extends string> {\n  steps: WorkflowStepRes<T, K>[];\n  signal: AbortSignal;\n  abort: (reason?: Error) => void;\n}\n\nexport type WorkflowStepHandler<T extends ZodSchema, K extends string> = (\n  state: z.output<T>,\n  context: WorkflowRunContext<T, K>,\n) => Promise<WorkflowStepResponse<T, K>> | WorkflowStepResponse<T, K>;\n\nexport interface WorkflowEvents<T extends ZodSchema, T2 extends ZodSchema, K extends string> {\n  start: Callback<{ step: K; run: WorkflowRun<T, T2, K> }>;\n  error: Callback<{\n    step: K;\n    error: Error;\n    run: WorkflowRun<T, T2, K>;\n  }>;\n  success: Callback<{\n    step: K;\n    response: WorkflowStepResponse<T, K>;\n    run: WorkflowRun<T, T2, K>;\n  }>;\n}\n\ninterface FlowInput<TS extends ZodSchema, TS2 extends ZodSchema = TS> {\n  name?: string;\n  schema: TS;\n  outputSchema?: TS2;\n}\n\ntype RunStep<K extends string> = K | typeof Workflow.END;\ntype ReservedStep =\n  | typeof Workflow.START\n  | typeof Workflow.NEXT\n  | typeof Workflow.PREV\n  | typeof Workflow.END\n  | typeof Workflow.SELF;\nexport type FlowStepName<K extends string> = K | ReservedStep;\n\nexport class WorkflowError<\n  T extends ZodSchema,\n  T2 extends ZodSchema,\n  K extends string,\n> extends FrameworkError {\n  constructor(message: string, extra?: { run?: WorkflowRun<T, T2, K>; errors?: Error[] }) {\n    super(message, extra?.errors, {\n      context: extra?.run ?? {},\n      isRetryable: false,\n      isFatal: true,\n    });\n  }\n}\n\nexport class Workflow<\n  TInput extends ZodSchema,\n  TOutput extends ZodSchema = TInput,\n  TKeys extends string = string,\n> extends Serializable {\n  public static readonly START = \"__start__\";\n  public static readonly SELF = \"__self__\";\n  public static readonly PREV = \"__prev__\";\n  public static readonly NEXT = \"__next__\";\n  public static readonly END = \"__end__\";\n\n  public readonly emitter: Emitter<WorkflowEvents<TInput, TOutput, TKeys>>;\n\n  protected readonly steps = new Map<string, WorkflowStepDef<TInput, TKeys>>();\n  protected startStep: TKeys | undefined = undefined;\n\n  constructor(protected readonly input: FlowInput<TInput, TOutput>) {\n    super();\n    this.emitter = Emitter.root.child({\n      namespace: [\"workflow\", toCamelCase(input?.name ?? \"\")].filter(Boolean),\n      creator: this,\n    });\n  }\n\n  getSteps() {\n    return Array.from(this.steps.keys()) as TKeys[];\n  }\n\n  get name() {\n    return this.input.name ?? \"\";\n  }\n\n  get schemas() {\n    return pick(this.input, [\"schema\", \"outputSchema\"]);\n  }\n\n  addStep<L extends string>(\n    name: L,\n    handler: WorkflowStepHandler<TInput | TOutput, TKeys>,\n  ): Workflow<TInput, TOutput, L | TKeys>;\n  addStep<L extends string, TFlow extends AnyWorkflowFlow>(\n    name: L,\n    flow: Workflow.pipeable<this, TFlow>,\n  ): Workflow<TInput, TOutput, L | TKeys>;\n  addStep<L extends string>(\n    name: L,\n    step: WorkflowStepHandler<TInput | TOutput, TKeys> | AnyWorkflowFlow,\n  ): Workflow<TInput, TOutput, L | TKeys> {\n    return this._addStep(name, step);\n  }\n\n  addStrictStep<L extends string, TI2 extends ZodSchema>(\n    name: L,\n    schema: TI2,\n    handler: WorkflowStepHandler<TI2, TKeys>,\n  ): Workflow<TInput, TOutput, L | TKeys>;\n  addStrictStep<L extends string, TI2 extends ZodSchema, TFlow extends AnyWorkflowFlow>(\n    name: L,\n    schema: TI2,\n    flow: Workflow.pipeable<Workflow<TI2, TOutput, TKeys>, TFlow>,\n  ): Workflow<TInput, TOutput, L | TKeys>;\n  addStrictStep<L extends string, TI2 extends ZodSchema>(\n    name: L,\n    schema: TI2,\n    step: WorkflowStepHandler<TI2, TKeys> | AnyWorkflowFlow,\n  ): Workflow<TInput, TOutput, L | TKeys> {\n    return this._addStep(name, schema, step);\n  }\n\n  protected _addStep<TI2 extends ZodSchema = TInput, L extends string = TKeys>(\n    name: L,\n    schemaOrStep: TI2 | WorkflowStepHandler<TInput, TKeys> | AnyWorkflowFlow,\n    stepOrEmpty?: WorkflowStepHandler<TI2, TKeys> | AnyWorkflowFlow,\n  ): Workflow<TInput, TOutput, L | TKeys> {\n    if (!name.trim()) {\n      throw new ValueError(`Step name cannot be empty!`);\n    }\n    if (this.steps.has(name)) {\n      throw new ValueError(`Step '${name}' already exists!`);\n    }\n    if (name === Workflow.END) {\n      throw new ValueError(`The name '${name}' cannot be used!`);\n    }\n\n    const schema = (schemaOrStep && stepOrEmpty ? schemaOrStep : this.input.schema) as TInput;\n    const stepOrFlow = stepOrEmpty || schemaOrStep;\n\n    this.steps.set(name, {\n      schema,\n      handler: stepOrFlow instanceof Workflow ? stepOrFlow.asStep({}) : stepOrFlow,\n    } as WorkflowStepDef<TInput, TKeys>);\n\n    return this as unknown as Workflow<TInput, TOutput, L | TKeys>;\n  }\n\n  setStart(name: TKeys) {\n    this.startStep = name;\n    return this;\n  }\n\n  run(state: z.input<TInput>, options: WorkflowRunOptions<TKeys> = {}) {\n    return RunContext.enter(\n      this,\n      { signal: options?.signal, params: [state, options] as const },\n      async (runContext): Promise<WorkflowRun<TInput, TOutput, TKeys>> => {\n        const run: WorkflowRun<TInput, TOutput, TKeys> = {\n          steps: [],\n          state: this.input.schema.parse(state),\n          result: undefined as z.output<TOutput>,\n        };\n        const handlers: WorkflowRunContext<TInput, TKeys> = {\n          steps: run.steps,\n          signal: runContext.signal,\n          abort: (reason) => runContext.abort(reason),\n        };\n\n        let next: RunStep<TKeys> =\n          this.findStep(options?.start || this.startStep || this.getSteps()[0]).current ??\n          Workflow.END;\n\n        while (next && next !== Workflow.END) {\n          const step = this.steps.get(next);\n          if (!step) {\n            throw new WorkflowError(`Step '${next}' was not found.`, { run });\n          }\n          run.steps.push({ name: next, state: run.state });\n          await runContext.emitter.emit(\"start\", { run, step: next });\n          try {\n            const stepInput = await step.schema.parseAsync(run.state).catch((err: Error) => {\n              throw new WorkflowError(\n                `Step '${next}' cannot be executed because the provided input doesn't adhere to the step's schema.`,\n                { run: shallowCopy(run), errors: [err] },\n              );\n            });\n            const response = await step.handler(stepInput, handlers);\n            if (response.update) {\n              run.state = { ...run.state, ...response.update };\n            }\n            await runContext.emitter.emit(\"success\", {\n              run: shallowCopy(run),\n              response,\n              step: next,\n            });\n\n            if (response.next === Workflow.START) {\n              next = run.steps.at(0)?.name!;\n            } else if (response.next === Workflow.PREV) {\n              next = run.steps.at(-2)?.name!;\n            } else if (response.next === Workflow.SELF) {\n              next = run.steps.at(-1)?.name!;\n            } else if (!response.next || response.next === Workflow.NEXT) {\n              next = this.findStep(next).next || Workflow.END;\n            } else {\n              next = response.next;\n            }\n          } catch (error) {\n            await runContext.emitter.emit(\"error\", {\n              run: shallowCopy(run),\n              step: next as TKeys,\n              error,\n            });\n            throw error;\n          }\n        }\n\n        run.result = await (this.input.outputSchema ?? this.input.schema)\n          .parseAsync(run.state)\n          .catch((err) => {\n            throw new WorkflowError(\n              `Workflow has ended but it's state does not adhere to the workflow's output schema.`,\n              { run: shallowCopy(run), errors: [err] },\n            );\n          });\n        return run;\n      },\n    );\n  }\n\n  delStep<L extends TKeys>(name: L): Workflow<TInput, TOutput, Exclude<TKeys, L>> {\n    if (this.startStep === name) {\n      this.startStep = undefined;\n    }\n    this.steps.delete(name);\n    return this as unknown as Workflow<TInput, TOutput, Exclude<TKeys, L>>;\n  }\n\n  asStep<\n    TInput2 extends ZodSchema = TInput,\n    TOutput2 extends ZodSchema = TOutput,\n    TKeys2 extends string = TKeys,\n  >(overrides: {\n    input?: (input: z.output<TInput2>) => z.output<TInput> | z.input<TInput>;\n    output?: (output: z.output<TOutput>) => z.output<TOutput2> | z.input<TOutput2>;\n    start?: TKeys;\n    next?: FlowStepName<TKeys2>;\n  }): WorkflowStepHandler<TInput2, TKeys | TKeys2> {\n    return async (input, ctx) => {\n      const mappedInput = overrides?.input ? overrides.input(input) : input;\n      const result = await this.run(mappedInput, { start: overrides?.start, signal: ctx.signal });\n      const mappedOutput = overrides?.output ? overrides.output(result.state) : result.state;\n\n      return {\n        update: mappedOutput,\n        next: overrides?.next,\n      };\n    };\n  }\n\n  protected findStep(current: TKeys) {\n    const steps = this.getSteps();\n    const index = steps.indexOf(current);\n    return {\n      prev: steps[index - 1],\n      current: steps[index],\n      next: steps[index + 1],\n    };\n  }\n\n  createSnapshot() {\n    return {\n      input: omit(this.input, [\"schema\", \"outputSchema\"]),\n      emitter: this.emitter,\n      startStep: this.startStep,\n      steps: this.steps,\n    };\n  }\n\n  loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n    Object.assign(this, snapshot);\n    this.input.schema ??= z.any() as unknown as TInput;\n    this.input.outputSchema ??= z.any() as unknown as TOutput;\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Workflow {\n  export type pipeable<T extends AnyWorkflowFlow, T2 extends AnyWorkflowFlow> =\n    Workflow.state<T> extends Workflow.input<T2> ? T2 : never;\n  export type input<T> = T extends Workflow<infer A, any, any> ? z.input<A> : never;\n  export type state<T> = T extends Workflow<infer A, any, any> ? z.output<A> : never;\n  export type output<T> = T extends Workflow<any, infer A, any> ? z.output<A> : never;\n  export type run<T> = T extends Workflow<infer A, infer B, infer C> ? WorkflowRun<A, B, C> : never;\n}\n\nexport type AnyWorkflowFlow = Workflow<any, any, any>;\n"]}