{"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":["ValidationError","UnsupportedFeatureError","assertNever","CloudApiProvider","Dialog360Provider","WatiProvider"],"mappings":";;;;;;;;AA+BO,IAAM,iBAAN,MAAqB;AAAA,EACT,OAAA;AAAA;AAAA,EAGR,QAAA;AAAA;AAAA,EAGA,OAAA;AAAA;AAAA,EAGA,KAAA;AAAA;AAAA,EAGA,OAAA;AAAA;AAAA,EAGA,QAAA;AAAA;AAAA,EAGA,GAAA;AAAA,EAET,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,IAAA;AACxB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,gBAAA,CAAiB,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,gBAAA,CAAiB,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,iBAAA,CAAkB,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,YAAA,CAAa,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,SAAS,OAAA,EAAmC;AAC1C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAQ,OAAA,IAAU;AAAA,EACzB;AACF;AAMA,IAAM,mBAAN,MAAuB;AAAA,EACJ,OAAA;AAAA;AAAA,EAGR,WAAA;AAAA,EAET,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,oBAAA,CAAqB,OAAO,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,KAAK,OAAA,EAA+C;AACxD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,IAAA,CAAK,EAAA,EAAY,IAAA,EAAc,OAAA,EAA4C;AAC/E,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,MAAA;AAAA,MACN,EAAA;AAAA,MACA,IAAA,EAAM,EAAE,IAAA,EAAM,UAAA,EAAY,SAAS,UAAA,EAAW;AAAA,MAC9C,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,EAAA,EACA,IAAA,EACqB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,UAAA;AAAA,MACN,EAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,EAAA,EAAY,MAAA,EAAqB,OAAA,EAAoD;AAC/F,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,OAAA;AAAA,MACN,EAAA;AAAA,MACA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,SAAS,OAAA,EAAQ;AAAA,MAC9C,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,EAAA,EAAY,MAAA,EAAqB,OAAA,EAAoD;AAC/F,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,OAAA;AAAA,MACN,EAAA;AAAA,MACA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,SAAS,OAAA,EAAQ;AAAA,MAC9C,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,EAAA,EAAY,MAAA,EAAqB,OAAA,EAAqD;AAChG,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,OAAA;AAAA,MACN,EAAA;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,EAAA,EAAY,MAAA,EAAqB,OAAA,EAAgD;AAC9F,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,UAAA;AAAA,MACN,EAAA;AAAA,MACA,QAAA,EAAU,EAAE,GAAG,MAAA,EAAQ,SAAS,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,QAAA,EAAS;AAAA,MAC9E,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAA,CAAQ,EAAA,EAAY,MAAA,EAAqB,OAAA,EAAqD;AAClG,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,SAAA;AAAA,MACN,EAAA;AAAA,MACA,OAAA,EAAS,MAAA;AAAA,MACT,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,EAAA,EAAY,GAAA,EAAsB,OAAA,EAAqD;AACpG,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,UAAA;AAAA,MACN,EAAA;AAAA,MACA,QAAA,EAAU,GAAA;AAAA,MACV,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,EAAA,EAAY,QAAA,EAA4B,OAAA,EAAqD;AAC1G,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,UAAA;AAAA,MACN,EAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAA,CAAS,EAAA,EAAY,SAAA,EAAmB,KAAA,EAAoC;AAChF,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,UAAA;AAAA,MACN,EAAA;AAAA,MACA,QAAA,EAAU,EAAE,SAAA,EAAW,KAAA;AAAM,KAC9B,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,WAAW,SAAA,EAAkC;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA;AAAA,EAC1C;AACF,CAAA;AAMA,IAAM,uBAAN,MAA2B;AAAA,EACR,OAAA;AAAA,EAEjB,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,OAAA,CACJ,EAAA,EACA,IAAA,EACA,SACA,OAAA,EACqB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,oBAAA;AAAA,MACN,EAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAA,CACJ,EAAA,EACA,IAAA,EACA,UAAA,EACA,UACA,OAAA,EACqB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,kBAAA;AAAA,MACN,EAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,GAAI,OAAA,EAAS,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAQ,EAAE,GAAI;AAAC,KACvE,CAAA;AAAA,EACH;AACF,CAAA;AAMA,IAAM,iBAAN,MAAqB;AAAA,EACF,OAAA;AAAA,EAEjB,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,OAAO,MAAA,EAAiD;AAC5D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,MAAM,OAAO,OAAA,EAA0C;AACrD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,SAAS,YAAA,EAAoD;AACjE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,YAAY,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,OAAO,OAAA,EAAgC;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAAA,EACzC;AACF,CAAA;AAMA,IAAM,mBAAN,MAAuB;AAAA,EACJ,OAAA;AAAA,EAEjB,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,IAAA,EAA+B;AACnC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,IAAA,EAAc,SAAA,EAAqC;AAC9D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,sBAAA,CAAuB,IAAA,EAAM,SAAS,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,KAAA,EAA8C;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,2BAAA,EAA6B;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,2BAAA,CAA4B,KAAK,CAAA;AAAA,EACvD;AACF,CAAA;AAMA,IAAM,eAAN,MAAmB;AAAA,EACA,OAAA;AAAA,EAEjB,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,IAAA,CAAK,EAAA,EAAY,IAAA,EAAc,OAAA,EAA8C;AACjF,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAIA,iCAAA,CAAgB;AAAA,QACxB,OAAA,EAAS,oCAAA;AAAA,QACT,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA,OACxB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,UAAA,GAAkC;AAAA,MACtC,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,CAAA;AAAE,KAChE;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,KAAA,EAAO;AAE5B,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,YAAY,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,SAAS;AAAA,OAC7C,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,CAAY;AAAA,MAC9B,IAAA,EAAM,UAAA;AAAA,MACN,EAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,MAAM,OAAA,CAAQ,QAAA;AAAA,QACd,QAAA,EAAU,QAAQ,QAAA,IAAY,OAAA;AAAA,QAC9B;AAAA;AACF,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAMA,IAAM,oBAAN,MAAwB;AAAA,EACL,OAAA;AAAA,EAEjB,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,IAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe;AAC/B,MAAA,MAAM,IAAIC,yCAAA,CAAwB;AAAA,QAChC,OAAA,EAAS,uDAAA;AAAA,QACT,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA,OACxB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,QAAQ,aAAA,EAAc;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,OAAO,KAAA,EAA+C;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB;AAChC,MAAA,MAAM,IAAIA,yCAAA,CAAwB;AAAA,QAChC,OAAA,EAAS,qDAAA;AAAA,QACT,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA,OACxB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,KAAK,CAAA;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,OAAO,IAAA,EAA6B;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB;AAChC,MAAA,MAAM,IAAIA,yCAAA,CAAwB;AAAA,QAChC,OAAA,EAAS,qDAAA;AAAA,QACT,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA,OACxB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,CAAe,IAAI,CAAA;AAAA,EACzC;AACF,CAAA;;;ACnYO,SAAS,eAAe,MAAA,EAA8C;AAC3E,EAAA,sBAAA,CAAuB,MAAM,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,cAAc,MAAM,CAAA;AACpC,EAAA,OAAO,IAAI,eAAe,OAAO,CAAA;AACnC;AAWO,SAAS,0BAA0B,OAAA,EAAkD;AAC1F,EAAA,OAAO,IAAI,eAAe,OAAO,CAAA;AACnC;AAMA,SAAS,qBAAqB,MAAA,EAA6C;AACzE,EAAA,OAAO;AAAA,IACL,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,oBAAoB,MAAA,CAAO;AAAA,GAC7B;AACF;AAGA,SAAS,uBAAuB,MAAA,EAAoC;AAClE,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,EAAgB,KAAA,KAAwB;AAC5D,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,MAAK,EAAG;AAC9C,MAAA,MAAM,IAAID,iCAAA,CAAgB;AAAA,QACxB,OAAA,EAAS,CAAA,EAAG,MAAA,CAAO,QAAQ,iCAAiC,KAAK,CAAA,CAAA,CAAA;AAAA,QACjE,UAAU,MAAA,CAAO;AAAA,OAClB,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,QAAQ,OAAO,QAAA;AAAU,IACvB,KAAK,WAAA;AACH,MAAA,YAAA,CAAa,MAAA,CAAO,eAAe,eAAe,CAAA;AAClD,MAAA,YAAA,CAAa,MAAA,CAAO,aAAa,aAAa,CAAA;AAC9C,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,YAAA,CAAa,MAAA,CAAO,QAAQ,QAAQ,CAAA;AACpC,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,YAAA,CAAa,MAAA,CAAO,QAAQ,QAAQ,CAAA;AACpC,MAAA,YAAA,CAAa,MAAA,CAAO,SAAS,SAAS,CAAA;AACtC,MAAA,YAAA,CAAa,MAAA,CAAO,eAAe,eAAe,CAAA;AAClD,MAAA;AAAA,IACF;AACE,MAAAE,6BAAA,CAAY,MAAM,CAAA;AAAA;AAExB;AAEA,SAAS,cAAc,MAAA,EAAuD;AAC5E,EAAA,MAAM,OAAA,GAAU,qBAAqB,MAAM,CAAA;AAE3C,EAAA,QAAQ,OAAO,QAAA;AAAU,IACvB,KAAK,WAAA;AACH,MAAA,OAAO,IAAIC,kCAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAE7C,KAAK,WAAA;AACH,MAAA,OAAO,IAAIC,mCAAA,CAAkB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAE9C,KAAK,MAAA;AACH,MAAA,OAAO,IAAIC,8BAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AAAA,IAEzC;AACE,MAAA,OAAOH,8BAAY,MAAM,CAAA;AAAA;AAE/B","file":"index.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// WhatsAppClient — the consumer-facing orchestrator\n//\n// Wraps a WhatsAppProviderAdapter with a namespace API:\n//   wa.message.text(...)\n//   wa.media.upload(...)\n//   wa.webhook.parse(...)\n//   wa.template.list()\n// ---------------------------------------------------------------------------\n\nimport type { WhatsAppProviderAdapter, ProviderFeature } from './types/provider.js'\nimport type { SendResult, MediaSource } from './types/common.js'\nimport type {\n  OutboundMessage,\n  TextOptions,\n  MediaMessageOptions,\n  DocumentOptions,\n  InteractiveOptions,\n  LocationPayload,\n  ContactPayload,\n  ButtonDef,\n  SectionDef,\n  TemplateComponent,\n  InteractiveHeader,\n  OtpSendOptions,\n} from './types/messages.js'\nimport type { MediaUpload, MediaUploadResult, MediaUrlResult, MediaDownloadResult } from './types/media.js'\nimport type { Template, CreateTemplateInput } from './types/templates.js'\nimport type { WebhookEvent } from './types/webhooks.js'\nimport { UnsupportedFeatureError, ValidationError } from './core/errors.js'\n\nexport class WhatsAppClient {\n  private readonly adapter: WhatsAppProviderAdapter\n\n  /** Which provider is active */\n  readonly provider: string\n\n  /** Message operations */\n  readonly message: MessageNamespace\n\n  /** Media operations */\n  readonly media: MediaNamespace\n\n  /** Webhook operations */\n  readonly webhook: WebhookNamespace\n\n  /** Template operations */\n  readonly template: TemplateNamespace\n\n  /** One-time-password (authentication template) helper */\n  readonly otp: OtpNamespace\n\n  constructor(adapter: WhatsAppProviderAdapter) {\n    this.adapter = adapter\n    this.provider = adapter.name\n    this.message = new MessageNamespace(adapter)\n    this.media = new MediaNamespace(adapter)\n    this.webhook = new WebhookNamespace(adapter)\n    this.template = new TemplateNamespace(adapter)\n    this.otp = new OtpNamespace(adapter)\n  }\n\n  /** Check if the current provider supports a specific feature */\n  supports(feature: ProviderFeature): boolean {\n    return this.adapter.supports(feature)\n  }\n\n  /**\n   * Release resources held by the client (the rate limiter's pending timer and\n   * any queued waiters). Call when you're done with a client you won't reuse —\n   * e.g. a per-request client on an edge runtime. Safe to call more than once.\n   *\n   * ```ts\n   * const wa = createWhatsApp({ ... })\n   * try {\n   *   await wa.message.text(to, 'hi')\n   * } finally {\n   *   wa.destroy()\n   * }\n   * ```\n   */\n  destroy(): void {\n    this.adapter.destroy?.()\n  }\n}\n\n// ---------------------------------------------------------------------------\n// message.*\n// ---------------------------------------------------------------------------\n\nclass MessageNamespace {\n  private readonly adapter: WhatsAppProviderAdapter\n\n  /** Interactive message sub-namespace */\n  readonly interactive: InteractiveNamespace\n\n  constructor(adapter: WhatsAppProviderAdapter) {\n    this.adapter = adapter\n    this.interactive = new InteractiveNamespace(adapter)\n  }\n\n  /** Send any outbound message (low-level — prefer the typed shorthand methods) */\n  async send(message: OutboundMessage): Promise<SendResult> {\n    return this.adapter.sendMessage(message)\n  }\n\n  /** Send a text message */\n  async text(to: string, body: string, options?: TextOptions): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'text',\n      to,\n      text: { body, previewUrl: options?.previewUrl },\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n\n  /** Send a template message */\n  async template(\n    to: string,\n    tmpl: { name: string; language: string; components?: TemplateComponent[] },\n  ): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'template',\n      to,\n      template: tmpl,\n    })\n  }\n\n  /** Send an image message */\n  async image(to: string, source: MediaSource, options?: MediaMessageOptions): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'image',\n      to,\n      image: { ...source, caption: options?.caption },\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n\n  /** Send a video message */\n  async video(to: string, source: MediaSource, options?: MediaMessageOptions): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'video',\n      to,\n      video: { ...source, caption: options?.caption },\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n\n  /** Send an audio message */\n  async audio(to: string, source: MediaSource, options?: { replyTo?: string }): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'audio',\n      to,\n      audio: source,\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n\n  /** Send a document message */\n  async document(to: string, source: MediaSource, options?: DocumentOptions): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'document',\n      to,\n      document: { ...source, caption: options?.caption, filename: options?.filename },\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n\n  /** Send a sticker message */\n  async sticker(to: string, source: MediaSource, options?: { replyTo?: string }): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'sticker',\n      to,\n      sticker: source,\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n\n  /** Send a location message */\n  async location(to: string, loc: LocationPayload, options?: { replyTo?: string }): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'location',\n      to,\n      location: loc,\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n\n  /** Send contact card(s) */\n  async contacts(to: string, contacts: ContactPayload[], options?: { replyTo?: string }): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'contacts',\n      to,\n      contacts,\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n\n  /** Send a reaction to a message */\n  async reaction(to: string, messageId: string, emoji: string): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'reaction',\n      to,\n      reaction: { messageId, emoji },\n    })\n  }\n\n  /** Mark a message as read */\n  async markAsRead(messageId: string): Promise<void> {\n    return this.adapter.markAsRead(messageId)\n  }\n}\n\n// ---------------------------------------------------------------------------\n// message.interactive.*\n// ---------------------------------------------------------------------------\n\nclass InteractiveNamespace {\n  private readonly adapter: WhatsAppProviderAdapter\n\n  constructor(adapter: WhatsAppProviderAdapter) {\n    this.adapter = adapter\n  }\n\n  /** Send a message with reply buttons (max 3) */\n  async buttons(\n    to: string,\n    body: string,\n    buttons: ButtonDef[],\n    options?: InteractiveOptions,\n  ): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'interactive.button',\n      to,\n      body,\n      buttons,\n      header: options?.header,\n      footer: options?.footer,\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n\n  /** Send a list message with sections (max 10 sections) */\n  async list(\n    to: string,\n    body: string,\n    buttonText: string,\n    sections: SectionDef[],\n    options?: Omit<InteractiveOptions, 'header'> & { header?: string },\n  ): Promise<SendResult> {\n    return this.adapter.sendMessage({\n      type: 'interactive.list',\n      to,\n      body,\n      buttonText,\n      sections,\n      header: options?.header,\n      footer: options?.footer,\n      ...(options?.replyTo ? { context: { messageId: options.replyTo } } : {}),\n    })\n  }\n}\n\n// ---------------------------------------------------------------------------\n// media.*\n// ---------------------------------------------------------------------------\n\nclass MediaNamespace {\n  private readonly adapter: WhatsAppProviderAdapter\n\n  constructor(adapter: WhatsAppProviderAdapter) {\n    this.adapter = adapter\n  }\n\n  /** Upload media to the provider */\n  async upload(params: MediaUpload): Promise<MediaUploadResult> {\n    return this.adapter.uploadMedia(params)\n  }\n\n  /** Get the download URL for a media item */\n  async getUrl(mediaId: string): Promise<MediaUrlResult> {\n    return this.adapter.getMediaUrl(mediaId)\n  }\n\n  /** Download media as a ReadableStream — pipe directly to R2/S3 */\n  async download(mediaIdOrUrl: string): Promise<MediaDownloadResult> {\n    return this.adapter.downloadMedia(mediaIdOrUrl)\n  }\n\n  /** Delete a previously uploaded media item */\n  async delete(mediaId: string): Promise<void> {\n    return this.adapter.deleteMedia(mediaId)\n  }\n}\n\n// ---------------------------------------------------------------------------\n// webhook.*\n// ---------------------------------------------------------------------------\n\nclass WebhookNamespace {\n  private readonly adapter: WhatsAppProviderAdapter\n\n  constructor(adapter: WhatsAppProviderAdapter) {\n    this.adapter = adapter\n  }\n\n  /** Parse a raw webhook payload into normalized events */\n  parse(body: unknown): WebhookEvent[] {\n    return this.adapter.parseWebhook(body)\n  }\n\n  /** Verify the cryptographic signature of a webhook payload */\n  async verify(body: string, signature: string): Promise<boolean> {\n    return this.adapter.verifyWebhookSignature(body, signature)\n  }\n\n  /**\n   * Handle the webhook verification challenge (GET request from Meta).\n   * Returns the challenge string to respond with, or null if invalid.\n   */\n  handleChallenge(query: Record<string, string>): string | null {\n    if (!this.adapter.handleVerificationChallenge) {\n      return null\n    }\n    return this.adapter.handleVerificationChallenge(query)\n  }\n}\n\n// ---------------------------------------------------------------------------\n// otp.*\n// ---------------------------------------------------------------------------\n\nclass OtpNamespace {\n  private readonly adapter: WhatsAppProviderAdapter\n\n  constructor(adapter: WhatsAppProviderAdapter) {\n    this.adapter = adapter\n  }\n\n  /**\n   * Send a one-time password using an approved AUTHENTICATION template.\n   *\n   * Builds the correct auth-template payload — the code is placed in the body\n   * and (by default) in the copy-code / one-tap autofill button — so callers\n   * don't have to assemble template components by hand.\n   *\n   * @example\n   * ```ts\n   * await wa.otp.send('+966501234567', '123456', { template: 'login_code' })\n   * ```\n   */\n  async send(to: string, code: string, options: OtpSendOptions): Promise<SendResult> {\n    const trimmed = code.trim()\n    if (!trimmed) {\n      throw new ValidationError({\n        message: 'otp.send requires a non-empty code',\n        provider: this.adapter.name,\n      })\n    }\n\n    const components: TemplateComponent[] = [\n      { type: 'body', parameters: [{ type: 'text', text: trimmed }] },\n    ]\n    if (options.button !== false) {\n      // Auth templates carry the code again in the URL/copy-code button.\n      components.push({\n        type: 'button',\n        sub_type: 'url',\n        index: 0,\n        parameters: [{ type: 'text', text: trimmed }],\n      })\n    }\n\n    return this.adapter.sendMessage({\n      type: 'template',\n      to,\n      template: {\n        name: options.template,\n        language: options.language ?? 'en_US',\n        components,\n      },\n    })\n  }\n}\n\n// ---------------------------------------------------------------------------\n// template.*\n// ---------------------------------------------------------------------------\n\nclass TemplateNamespace {\n  private readonly adapter: WhatsAppProviderAdapter\n\n  constructor(adapter: WhatsAppProviderAdapter) {\n    this.adapter = adapter\n  }\n\n  /** List all message templates */\n  async list(): Promise<Template[]> {\n    if (!this.adapter.listTemplates) {\n      throw new UnsupportedFeatureError({\n        message: 'Template management is not supported by this provider',\n        provider: this.adapter.name,\n      })\n    }\n    return this.adapter.listTemplates()\n  }\n\n  /** Create a new message template */\n  async create(input: CreateTemplateInput): Promise<Template> {\n    if (!this.adapter.createTemplate) {\n      throw new UnsupportedFeatureError({\n        message: 'Template creation is not supported by this provider',\n        provider: this.adapter.name,\n      })\n    }\n    return this.adapter.createTemplate(input)\n  }\n\n  /** Delete a message template by name */\n  async delete(name: string): Promise<void> {\n    if (!this.adapter.deleteTemplate) {\n      throw new UnsupportedFeatureError({\n        message: 'Template deletion is not supported by this provider',\n        provider: this.adapter.name,\n      })\n    }\n    return this.adapter.deleteTemplate(name)\n  }\n}\n","// ---------------------------------------------------------------------------\n// waflow — Public API\n//\n// Usage:\n//   import { createWhatsApp } from 'waflow'\n//\n//   const wa = createWhatsApp({\n//     provider: 'cloud-api',\n//     phoneNumberId: '...',\n//     accessToken: '...',\n//   })\n//\n//   await wa.message.text('+966501234567', 'Hello!')\n// ---------------------------------------------------------------------------\n\nimport type { CreateWhatsAppConfig, ProviderConfig, ClientOptions } from './types/config.js'\nimport type { WhatsAppProviderAdapter } from './types/provider.js'\nimport { WhatsAppClient } from './client.js'\nimport { CloudApiProvider } from './providers/cloud-api/index.js'\nimport { Dialog360Provider } from './providers/360dialog/index.js'\nimport { WatiProvider } from './providers/wati/index.js'\nimport { assertNever } from './utils/assert.js'\nimport { ValidationError } from './core/errors.js'\n\n/**\n * Create a new WhatsApp client configured for a specific provider.\n *\n * Switch providers by changing the `provider` field in the config.\n * All other code (message.*, media.*, webhook.*) stays identical.\n *\n * @example\n * ```ts\n * const wa = createWhatsApp({\n *   provider: 'cloud-api',\n *   phoneNumberId: process.env.WA_PHONE_ID,\n *   accessToken: process.env.WA_TOKEN,\n * })\n *\n * await wa.message.text('+966501234567', 'Hello!')\n * ```\n */\nexport function createWhatsApp(config: CreateWhatsAppConfig): WhatsAppClient {\n  validateProviderConfig(config)\n  const adapter = createAdapter(config)\n  return new WhatsAppClient(adapter)\n}\n\n/**\n * Create a WhatsApp client from a custom adapter.\n * Use this when implementing your own provider.\n *\n * @example\n * ```ts\n * const wa = createWhatsAppFromAdapter(new MyCustomProvider(config))\n * ```\n */\nexport function createWhatsAppFromAdapter(adapter: WhatsAppProviderAdapter): WhatsAppClient {\n  return new WhatsAppClient(adapter)\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nfunction extractClientOptions(config: CreateWhatsAppConfig): ClientOptions {\n  return {\n    logger: config.logger,\n    retry: config.retry,\n    rateLimit: config.rateLimit,\n    timeout: config.timeout,\n    hooks: config.hooks,\n    includeRawResponse: config.includeRawResponse,\n  }\n}\n\n/** Fail fast with a clear error when required credentials are missing. */\nfunction validateProviderConfig(config: CreateWhatsAppConfig): void {\n  const requireField = (value: unknown, field: string): void => {\n    if (typeof value !== 'string' || !value.trim()) {\n      throw new ValidationError({\n        message: `${config.provider} config requires a non-empty \"${field}\"`,\n        provider: config.provider,\n      })\n    }\n  }\n\n  switch (config.provider) {\n    case 'cloud-api':\n      requireField(config.phoneNumberId, 'phoneNumberId')\n      requireField(config.accessToken, 'accessToken')\n      break\n    case '360dialog':\n      requireField(config.apiKey, 'apiKey')\n      break\n    case 'wati':\n      requireField(config.apiKey, 'apiKey')\n      requireField(config.baseUrl, 'baseUrl')\n      requireField(config.channelNumber, 'channelNumber')\n      break\n    default:\n      assertNever(config)\n  }\n}\n\nfunction createAdapter(config: CreateWhatsAppConfig): WhatsAppProviderAdapter {\n  const options = extractClientOptions(config)\n\n  switch (config.provider) {\n    case 'cloud-api':\n      return new CloudApiProvider(config, options)\n\n    case '360dialog':\n      return new Dialog360Provider(config, options)\n\n    case 'wati':\n      return new WatiProvider(config, options)\n\n    default:\n      return assertNever(config)\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports — everything available from 'waflow'\n// ---------------------------------------------------------------------------\n\n// Client\nexport { WhatsAppClient } from './client.js'\n\n// Providers (for direct instantiation or extension)\nexport { CloudApiProvider } from './providers/cloud-api/index.js'\nexport { Dialog360Provider } from './providers/360dialog/index.js'\nexport { WatiProvider } from './providers/wati/index.js'\n\n// Errors\nexport {\n  WhatsAppError,\n  AuthenticationError,\n  RateLimitError,\n  ValidationError,\n  MediaError,\n  TemplateError,\n  ProviderError,\n  UnsupportedFeatureError,\n  NetworkError,\n  TimeoutError,\n  WebhookVerificationError,\n} from './core/errors.js'\n\n// Types\nexport type * from './types/index.js'\n\n// Logger\nexport type { Logger } from './core/logger.js'\nexport { noopLogger } from './core/logger.js'\n"]}