{"version":3,"sources":["../src/workflow.ts"],"names":["AsyncLocalStorage","trace","getActiveSpan"],"mappings":";;;;;;AA0OA,IAAM,cAAA,uBAAqB,OAAA,EAUzB;AASF,IAAM,sBAAA,GAAyB,IAAIA,6BAAA,EAAmC;AAiC/D,SAAS,cACd,MAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,CAAA,SAAA,EAAY,MAAA,CAAO,IAAI,CAAA,CAAA;AAExC,EAAA,OAAO,CACL,SAAA,KAC2C;AAC3C,IAAA,OAAOC,uBAAA,CAAsB,QAAA,EAAU,CAAC,OAAA,KAAY;AAClD,MAAA,OAAO,UAAU,IAAA,KAAgB;AAE/B,QAAA,MAAM,UAAA,GACJ,OAAO,MAAA,CAAO,UAAA,KAAe,UAAA,GACzB,OAAO,UAAA,CAAW,GAAG,IAAI,CAAA,GACzB,MAAA,CAAO,UAAA;AAGb,QAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,OAAA,EAAS,MAAA,CAAO,MAAM,UAAU,CAAA;AAGlE,QAAA,GAAA,CAAI,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,IAAI,CAAA;AAC7C,QAAA,GAAA,CAAI,YAAA,CAAa,eAAe,UAAU,CAAA;AAC1C,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,GAAA,CAAI,YAAA,CAAa,kBAAA,EAAoB,MAAA,CAAO,OAAO,CAAA;AAAA,QACrD;AACA,QAAA,GAAA,CAAI,YAAA,CAAa,mBAAmB,SAAS,CAAA;AAG7C,QAAA,IAAI,OAAO,UAAA,EAAY;AACrB,UAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAC5D,YAAA,IAAI,UAAU,MAAA,EAAW;AACvB,cAAA,GAAA,CAAI,YAAA,CAAa,KAAK,KAAkC,CAAA;AAAA,YAC1D;AAAA,UACF;AAAA,QACF;AAIA,QAAA,OAAO,sBAAA,CAAuB,GAAA,CAAI,GAAA,EAAK,YAAY;AACjD,UAAA,IAAI;AAEF,YAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,YAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAG,IAAI,CAAA;AAGnC,YAAA,GAAA,CAAI,kBAAkB,WAAW,CAAA;AACjC,YAAA,MAAA,CAAO,UAAA,GAAa,KAAK,MAAM,CAAA;AAE/B,YAAA,OAAO,MAAA;AAAA,UACT,SAAS,KAAA,EAAO;AAEd,YAAA,GAAA,CAAI,kBAAkB,QAAQ,CAAA;AAC9B,YAAA,MAAA,CAAO,QAAA,GAAW,KAAK,KAAc,CAAA;AAGrC,YAAA,MAAM,QAAQ,gBAAA,EAAiB;AAC/B,YAAA,IAAI,KAAA,IAAS,KAAA,CAAM,aAAA,CAAc,IAAA,GAAO,CAAA,EAAG;AACzC,cAAA,GAAA,CAAI,kBAAkB,cAAc,CAAA;AACpC,cAAA,MAAA,CAAO,iBAAiB,GAAG,CAAA;AAE3B,cAAA,IAAI;AACF,gBAAA,MAAM,GAAA,CAAI,WAAW,KAAc,CAAA;AACnC,gBAAA,GAAA,CAAI,kBAAkB,aAAa,CAAA;AAAA,cACrC,SAAS,iBAAA,EAAmB;AAC1B,gBAAA,GAAA,CAAI,kBAAkB,qBAAqB,CAAA;AAC3C,gBAAA,GAAA,CAAI,YAAA;AAAA,kBACF,6BAAA;AAAA,kBACA,OAAO,iBAAiB;AAAA,iBAC1B;AAAA,cACF;AAAA,YACF;AAEA,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AAwBO,SAAS,UACd,MAAA,EACA;AACA,EAAA,OAAO,CACL,EAAA,KAC2C;AAC3C,IAAA,MAAM,QAAA,GAAW,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAA;AAEpC,IAAA,OAAOA,uBAAA,CAAsB,QAAA,EAAU,CAAC,OAAA,KAAY;AAClD,MAAA,OAAO,UAAU,IAAA,KAAgB;AAE/B,QAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,QAAA,EAAS,IAAK,IAAA;AAGzD,QAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,OAAA,EAAS,MAAA,EAAQ,WAAW,CAAA;AAG1D,QAAA,GAAA,CAAI,YAAA,CAAa,oBAAA,EAAsB,MAAA,CAAO,IAAI,CAAA;AAClD,QAAA,GAAA,CAAI,YAAA,CAAa,qBAAA,EAAuB,GAAA,CAAI,YAAA,EAAc,CAAA;AAC1D,QAAA,GAAA,CAAI,YAAA,CAAa,wBAAwB,SAAS,CAAA;AAElD,QAAA,IAAI,OAAO,WAAA,EAAa;AACtB,UAAA,GAAA,CAAI,YAAA,CAAa,2BAAA,EAA6B,MAAA,CAAO,WAAW,CAAA;AAAA,QAClE;AAEA,QAAA,IAAI,OAAO,UAAA,EAAY;AACrB,UAAA,GAAA,CAAI,YAAA,CAAa,4BAA4B,IAAI,CAAA;AAAA,QACnD;AAGA,QAAA,IAAI,OAAO,UAAA,EAAY;AACrB,UAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAC5D,YAAA,IAAI,UAAU,MAAA,EAAW;AACvB,cAAA,GAAA,CAAI,YAAA,CAAa,KAAK,KAAkC,CAAA;AAAA,YAC1D;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,YAAA,CAAa,GAAA,EAAK,MAAA,EAAQ,WAAW,CAAA;AAG3C,QAAA,IAAI,MAAA,CAAO,cAAc,WAAA,EAAa;AACpC,UAAA,WAAA,CAAY,oBAAA,CAAqB,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,UAAU,CAAA;AAAA,QACjE;AAGA,QAAA,IAAI,SAAA;AACJ,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,EAAO,WAAA,IAAe,CAAA;AAEjD,QAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,WAAA,EAAa,OAAA,EAAA,EAAW;AACvD,UAAA,IAAI;AACF,YAAA,IAAI,UAAU,CAAA,EAAG;AACf,cAAA,GAAA,CAAI,YAAA,CAAa,+BAA+B,OAAO,CAAA;AACvD,cAAA,GAAA,CAAI,SAAS,YAAA,EAAc;AAAA,gBACzB,uBAAA,EAAyB,OAAA;AAAA,gBACzB,4BAAA,EAA8B;AAAA,eAC/B,CAAA;AAGD,cAAA,IAAI,MAAA,CAAO,OAAO,SAAA,EAAW;AAC3B,gBAAA,MAAM,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,SAAA,GAAY,OAAO,CAAA;AAAA,cAC9C;AAAA,YACF;AAEA,YAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA;AAG/B,YAAA,GAAA,CAAI,YAAA,CAAa,wBAAwB,WAAW,CAAA;AACpD,YAAA,GAAA,CAAI,QAAA,EAAS;AACb,YAAA,MAAA,CAAO,aAAa,GAAG,CAAA;AAEvB,YAAA,OAAO,MAAA;AAAA,UACT,SAAS,KAAA,EAAO;AACd,YAAA,SAAA,GAAY,KAAA;AAEZ,YAAA,IAAI,UAAU,WAAA,EAAa;AACzB,cAAA,GAAA,CAAI,SAAS,sBAAA,EAAwB;AAAA,gBACnC,qBAAA,EAAuB,OAAO,KAAK,CAAA;AAAA,gBACnC,uBAAA,EAAyB;AAAA,eAC1B,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAGA,QAAA,GAAA,CAAI,YAAA,CAAa,wBAAwB,QAAQ,CAAA;AACjD,QAAA,GAAA,CAAI,YAAA,CAAa,qBAAA,EAAuB,MAAA,CAAO,SAAS,CAAC,CAAA;AACzD,QAAA,MAAA,CAAO,QAAA,GAAW,KAAK,SAAU,CAAA;AAEjC,QAAA,MAAM,SAAA;AAAA,MACR,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AASA,SAAS,qBAAA,CACP,OAAA,EACA,YAAA,EACA,UAAA,EACiB;AAEjB,EAAA,MAAM,OAAOC,+BAAA,EAAc;AAC3B,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,UAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,sBAAW,GAAA,EAA0B;AAAA,IACrC,WAAA,EAAa,CAAA;AAAA,IACb,aAAA,sBAAmB,GAAA;AAAoD,GACzE;AAEA,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,cAAA,CAAe,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IAEH,aAAA,GAAwB;AACtB,MAAA,OAAO,UAAA;AAAA,IACT,CAAA;AAAA,IAEA,eAAA,GAA0B;AACxB,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAAA,IAEA,SAAA,GAA4B;AAC1B,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IACf,CAAA;AAAA,IAEA,aAAa,QAAA,EAAwB;AACnC,MAAA,IAAI,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACnC,MAAA,IAAI,CAAC,IAAA,EAAM;AAGT,QAAA,IAAA,GAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,OAAO,KAAA,CAAM,WAAA,EAAA;AAAA,UACb,MAAA,EAAQ,SAAA;AAAA,UACR,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AACA,QAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAAA,MAChC;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,KAAK,GAAA,EAAI;AAGxB,MAAA,MAAM,cAAcA,+BAAA,EAAc;AAClC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAA,CAAK,WAAA,GAAc,YAAY,WAAA,EAAY;AAAA,MAC7C;AAAA,IACF,CAAA;AAAA,IAEA,gBAAgB,QAAA,EAAuC;AACrD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACrC,QAAA,OAAO,MAAM,WAAA,IAAe,IAAA;AAAA,MAC9B;AAGA,MAAA,IAAI,QAAA,GAAgC,IAAA;AACpC,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,EAAO,EAAG;AACvC,QAAA,IACE,IAAA,CAAK,WAAW,WAAA,KACf,CAAC,YAAY,IAAA,CAAK,KAAA,GAAQ,SAAS,KAAA,CAAA,EACpC;AACA,UAAA,QAAA,GAAW,IAAA;AAAA,QACb;AAAA,MACF;AAEA,MAAA,OAAO,UAAU,WAAA,IAAe,IAAA;AAAA,IAClC,CAAA;AAAA,IAEA,iBAAA,GAA8B;AAC5B,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,MAAM,KAAA,EAAO;AACtC,QAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AAC/B,UAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,QACrB;AAAA,MACF;AACA,MAAA,OAAO,SAAA,CAAU,QAAA;AAAA,QACf,CAAC,CAAA,EAAG,CAAA,KAAA,CACD,KAAA,CAAM,MAAM,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,IAAS,MAAM,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,KAAA,IAAS,CAAA;AAAA,OACrE;AAAA,IACF,CAAA;AAAA,IAEA,oBAAA,CACE,UACA,OAAA,EACM;AACN,MAAA,KAAA,CAAM,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AAAA,IAC3C,CAAA;AAAA,IAEA,MAAM,WAAW,KAAA,EAA6B;AAE5C,MAAA,MAAM,iBAAA,GAAoB,CAAC,GAAG,KAAA,CAAM,cAAc,OAAA,EAAS,EAAE,UAAA,EAAW;AAExE,MAAA,KAAA,MAAW,CAAC,QAAA,EAAU,OAAO,CAAA,IAAK,iBAAA,EAAmB;AACnD,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACrC,QAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,WAAA,EAAa;AACvC,UAAA,IAAI;AACF,YAAA,OAAA,CAAQ,SAAS,sBAAA,EAAwB;AAAA,cACvC,oBAAA,EAAsB;AAAA,aACvB,CAAA;AAED,YAAA,MAAM,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AAEpC,YAAA,IAAA,CAAK,kBAAA,CAAmB,UAAU,IAAI,CAAA;AACtC,YAAA,IAAA,CAAK,MAAA,GAAS,aAAA;AAAA,UAChB,SAAS,iBAAA,EAAmB;AAC1B,YAAA,IAAA,CAAK,kBAAA;AAAA,cACH,QAAA;AAAA,cACA,KAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA,MAAM,iBAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,kBAAA,CACE,QAAA,EACA,OAAA,EACA,KAAA,EACM;AACN,MAAA,OAAA,CAAQ,SAAS,wBAAA,EAA0B;AAAA,QACzC,oBAAA,EAAsB,QAAA;AAAA,QACtB,+BAAA,EAAiC,OAAA;AAAA,QACjC,GAAI,KAAA,IAAS,EAAE,6BAAA,EAA+B,MAAA,CAAO,KAAK,CAAA;AAAE,OAC7D,CAAA;AAED,MAAA,OAAA,CAAQ,YAAA;AAAA,QACN,yBAAyB,QAAQ,CAAA,CAAA;AAAA,QACjC,UAAU,SAAA,GAAY;AAAA,OACxB;AAAA,IACF,CAAA;AAAA,IAEA,kBAAkB,MAAA,EAA8B;AAC9C,MAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,MAAA,OAAA,CAAQ,YAAA,CAAa,mBAAmB,MAAM,CAAA;AAE9C,MAAA,OAAA,CAAQ,SAAS,yBAAA,EAA2B;AAAA,QAC1C,iBAAA,EAAmB;AAAA,OACpB,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAKA,SAAS,iBAAA,CACP,OAAA,EACA,MAAA,EACA,WAAA,EACa;AAEb,EAAA,IAAI,SAAA,GAAY,OAAO,KAAA,IAAS,CAAA;AAChC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,OAAOA,+BAAA,EAAc;AAC3B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AACrC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,SAAA,GAAY,MAAA,CAAO,SAAS,KAAA,CAAM,WAAA,EAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,SAASA,+BAAA,EAAc;AAC7B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AACvC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM;AAAA,UAC3B,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,KAAA,EAAO,SAAA;AAAA,UACP,MAAA,EAAQ,SAAA;AAAA,UACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,YAAY,MAAA,CAAO;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IAEH,WAAA,GAAsB;AACpB,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA;AAAA,IAEA,YAAA,GAAuB;AACrB,MAAA,OAAO,SAAA;AAAA,IACT,CAAA;AAAA,IAEA,QAAA,GAAiB;AACf,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,CAAY,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,MACtC;AAAA,IACF,CAAA;AAAA,IAEA,KAAK,MAAA,EAAuB;AAC1B,MAAA,OAAA,CAAQ,YAAA,CAAa,wBAAwB,SAAS,CAAA;AACtD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAA,CAAQ,YAAA,CAAa,6BAA6B,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,OAAA,CAAQ,SAAS,cAAA,EAAgB;AAAA,QAC/B,sBAAsB,MAAA,CAAO,IAAA;AAAA,QAC7B,GAAI,MAAA,IAAU,EAAE,2BAAA,EAA6B,MAAA;AAAO,OACrD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,kBAAA,GAA6C;AAC3C,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,GACF;AACF;AASA,SAAS,gBAAA,GAAmB;AAC1B,EAAA,MAAM,OAAOA,+BAAA,EAAc;AAC3B,EAAA,OAAO,IAAA,GAAO,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAC3C;AAKA,eAAe,YAAA,CACb,GAAA,EACA,MAAA,EACA,WAAA,EACe;AACf,EAAA,IAAI,CAAC,WAAA,EAAa;AAElB,EAAA,MAAM,QAAgB,EAAC;AAGvB,EAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,IAAA,MAAM,eAAA,GAAkB,YAAY,eAAA,EAAgB;AACpD,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,OAAA,EAAS,eAAA;AAAA,QACT,UAAA,EAAY;AAAA,UACV,oBAAA,EAAsB;AAAA;AACxB,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,IACzC,MAAA,CAAO,MAAA,GACP,CAAC,MAAA,CAAO,MAAM,CAAA;AAElB,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,eAAA,CAAgB,QAAQ,CAAA;AACxD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,OAAA,EAAS,WAAA;AAAA,UACT,UAAA,EAAY;AAAA,YACV,oBAAA,EAAsB,YAAA;AAAA,YACtB,oBAAA,EAAsB;AAAA;AACxB,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,GAAA,CAAI,SAAS,KAAK,CAAA;AAAA,EACpB;AACF;AAKA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAYO,SAAS,yBAAA,GAAoD;AAClE,EAAA,OAAO,sBAAA,CAAuB,UAAS,IAAK,IAAA;AAC9C;AAQO,SAAS,YAAA,GAAwB;AACtC,EAAA,OAAO,sBAAA,CAAuB,UAAS,KAAM,MAAA;AAC/C","file":"chunk-6YGUN7IY.cjs","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\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport type { Attributes, Link, SpanContext } from '@opentelemetry/api';\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 = new 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              ctx.addEvent('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              ctx.addEvent('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            baseCtx.addEvent('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      baseCtx.addEvent('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      baseCtx.addEvent('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      baseCtx.addEvent('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"]}