@clocknext/sdk 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +44 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +218 -55
- package/dist/index.d.ts +218 -55
- package/dist/index.js +44 -18
- package/dist/index.js.map +1 -1
- package/package.json +13 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/queue.ts","../src/flusher.ts","../src/errors.ts","../src/retry.ts","../src/http.ts","../src/resources/credits.ts","../src/resources/customers.ts","../src/resources/invoices.ts","../src/resources/outcomes.ts","../src/resources/payments.ts","../src/resources/plans.ts","../src/resources/portal.ts","../src/resources/purchases.ts","../src/idempotency.ts","../src/resources/signals.ts","../src/resources/units.ts","../src/resources/webhooks.ts","../src/resources/workspace.ts","../src/client.ts"],"names":["message"],"mappings":";AAEA,IAAM,gBAAA,GAAmB,gCAAA;AAGzB,SAAS,GAAA,CAAI,KAAA,EAA2B,QAAA,EAAkB,GAAA,EAAqB;AAC7E,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,KAAA,IAAS,GAAA,GACnE,KAAA,GACA,QAAA;AACN;AAGO,SAAS,cAAc,MAAA,EAAyC;AACrE,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,OAAO,MAAA,CAAO,WAAW,QAAA,EAAU;AACvD,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,SAAA,GACJ,MAAA,CAAO,KAAA,KACN,OAAO,UAAA,CAAW,KAAA,KAAU,UAAA,GACxB,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,GACjC,MAAA,CAAA;AACN,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,UAAU,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAAA,IAChE,IAAA,EAAM,OAAO,IAAA,IAAQ,OAAA;AAAA,IACrB,SAAA,EAAW,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,KAAQ,CAAC,CAAA;AAAA,IAC1C,KAAA,EAAO;AAAA,MACL,SAAS,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,MACzC,eAAe,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,aAAA,EAAe,KAAM,CAAC,CAAA;AAAA,MACvD,gBAAgB,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,cAAA,EAAgB,GAAG,CAAC,CAAA;AAAA,MACtD,cAAc,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,YAAA,EAAc,KAAQ,CAAC;AAAA,KACzD;AAAA,IACA,KAAA,EAAO;AAAA,MACL,aAAa,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,WAAA,EAAa,GAAG,CAAC,CAAA;AAAA,MAChD,aAAa,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,WAAA,EAAa,KAAK,CAAC,CAAA;AAAA,MAClD,YAAY,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,UAAA,EAAY,KAAQ,CAAC;AAAA,KACrD;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,EAAC;AAAA,IAC1B,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO;AAAA,GACjB;AACF;;;AC5BO,IAAM,gBAAN,MAA0C;AAAA,EACvC,QAAwB,EAAC;AAAA,EAEjC,KAAK,IAAA,EAA0B;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,KAAK,CAAA,EAA2B;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,EAC/B;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA;AAAA,EACpB;AACF,CAAA;;;AC1BO,IAAM,UAAN,MAAc;AAAA,EAMnB,WAAA,CACmB,WACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAFgB,SAAA;AAAA,EACA,GAAA;AAAA,EAPF,KAAA,GAAoB,IAAI,aAAA,EAAc;AAAA,EAC/C,KAAA,GAA8C,IAAA;AAAA,EAC9C,QAAA,GAAiC,IAAA;AAAA,EACjC,MAAA,GAAS,KAAA;AAAA;AAAA,EAQjB,QAAQ,IAAA,EAA0B;AAChC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,aAAa,CAAA;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,KAAA,CAAM,IAAA,MAAU,IAAA,CAAK,GAAA,CAAI,MAAM,YAAA,EAAc;AACpD,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,+CAA0C,CAAA;AACjE,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,YAAY,CAAA;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,IAAK,IAAA,CAAK,IAAI,KAAA,CAAM,OAAA,EAAS,KAAK,IAAA,CAAK,KAAA,EAAM;AAAA,cACvD,GAAA,EAAI;AAAA,EAChB;AAAA;AAAA,EAGQ,GAAA,GAAY;AAClB,IAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,MAAA,EAAQ;AAC/B,IAAA,IAAA,CAAK,KAAA,GAAQ,WAAW,MAAM;AAC5B,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,KAAK,KAAK,KAAA,EAAM;AAAA,IAClB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,aAAa,CAAA;AAE/B,IAAC,IAAA,CAAK,MAAiC,KAAA,IAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAuB;AACrB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AACA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,KAAA,EAAM,CAAE,QAAQ,MAAM;AACzC,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAc,KAAA,GAAuB;AACnC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,GAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,IAAA,CAAK,GAAA,CAAI,MAAM,cAAc,CAAA;AAC1D,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AACrE,MAAA,IAAA,IAAQ,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAAA,IAClC;AACA,IAAA,IAAI,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA,EAGA,MAAc,KAAK,IAAA,EAAsC;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,QAC3B,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,eAAA;AAAA,QACN,MAAM,IAAA,CAAK,IAAA;AAAA;AAAA,QAEX,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AACrC,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ,aAAa,CAAA;AAC5C,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,MAAM,KAAK,KAAA,EAAM;AAAA,EACnB;AACF,CAAA;;;ACjGO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA;AAAA,EAE/B,MAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EAET,WAAA,CACE,OAAA,EACA,IAAA,GAAiD,EAAC,EAClD;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,OAAO,GAAA,CAAA,MAAA,CAAW,IAAA;AACvB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,KAAA;AAEnC,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAGO,IAAM,SAAA,GAAN,cAAwB,cAAA,CAAe;AAAC;AAGxC,IAAM,eAAA,GAAN,cAA8B,cAAA,CAAe;AAAC;AAG9C,IAAM,aAAA,GAAN,cAA4B,cAAA,CAAe;AAAC;AAG5C,IAAM,SAAA,GAAN,cAAwB,cAAA,CAAe;AAAC;AAGxC,IAAM,cAAA,GAAN,cAA6B,cAAA,CAAe;AAAC;AAG7C,IAAM,aAAA,GAAN,cAA4B,cAAA,CAAe;AAAC;AAG5C,IAAM,cAAA,GAAN,cAA6B,cAAA,CAAe;AAAA,EACxC,YAAA;AAAA,EACT,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAkC,EAAC,EAAG;AACjE,IAAA,KAAA,CAAM,SAAS,EAAE,MAAA,EAAQ,GAAA,EAAK,SAAA,EAAW,MAAM,CAAA;AAC/C,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AAAA,EAC3B;AACF;AAGO,IAAM,WAAA,GAAN,cAA0B,cAAA,CAAe;AAAC;AAG1C,IAAM,YAAA,GAAN,cAA2B,cAAA,CAAe;AAAA,EAC/C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EACpC;AACF;AAOO,SAAS,iBAAA,CACd,MAAA,EACA,OAAA,EACA,YAAA,EACgB;AAChB,EAAA,MAAM,GAAA,GAAM,OAAA,IAAW,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAA,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,EAAE,MAAA,EAAO;AAEtB,EAAA,IAAI,WAAW,GAAA,EAAK,OAAO,IAAI,eAAA,CAAgB,KAAK,IAAI,CAAA;AACxD,EAAA,IAAI,WAAW,GAAA,EAAK,OAAO,IAAI,SAAA,CAAU,KAAK,IAAI,CAAA;AAClD,EAAA,IAAI,WAAW,GAAA,EAAK,OAAO,IAAI,aAAA,CAAc,KAAK,IAAI,CAAA;AAGtD,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,IAAI,cAAA,CAAe,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,CAAA;AAC/E,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,IAAI,aAAA,CAAc,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,CAAA;AAC9E,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,GAAG,CAAA,GAC3B,IAAI,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA,GAC5B,IAAI,SAAA,CAAU,GAAA,EAAK,IAAI,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,IAAI,eAAe,GAAA,EAAK,EAAE,cAAc,CAAA;AACnE,EAAA,IAAI,MAAA,IAAU,GAAA,EAAK,OAAO,IAAI,WAAA,CAAY,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,CAAA;AAC3E,EAAA,OAAO,IAAI,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA;AACrC;;;AC7EO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,OAAO,KAAA,YAAiB,kBAAkB,KAAA,CAAM,SAAA;AAClD;AAGO,SAAS,gBAAgB,OAAA,EAAsC;AACpE,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AACvC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA;AACnB,IAAA,IAAI,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,GAAG,OAAO,CAAA;AAAA,EAC3C;AACA,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,IAAA,GAAO,OAAO,EAAE,CAAA;AACtB,IAAA,IAAI,MAAA,CAAO,SAAS,IAAI,CAAA,SAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,GAAI,CAAA;AACzD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,eACd,OAAA,EACA,IAAA,EACA,YAAA,EACA,IAAA,GAAqB,KAAK,MAAA,EAClB;AACR,EAAA,IAAI,gBAAgB,IAAA,EAAM,OAAO,KAAK,GAAA,CAAI,YAAA,EAAc,KAAK,UAAU,CAAA;AACvE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAC,CAAA;AACnE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,UAAU,CAAA;AAE5C,EAAA,OAAO,KAAK,KAAA,CAAM,MAAA,IAAU,GAAA,GAAM,IAAA,KAAS,GAAA,CAAI,CAAA;AACjD;AAEO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;AC9CA,IAAM,WAAA,GACqC,OAAA,CAAkB;AAsBtD,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,GAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAsB;AAAA,EAAtB,GAAA;AAAA,EAE7B,MAAM,QAAqB,IAAA,EAAkC;AAC3D,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAI/C,IAAA,MAAM,UAAA,GACJ,KAAK,MAAA,KAAW,KAAA,IAChB,KAAK,MAAA,KAAW,KAAA,IAChB,KAAK,MAAA,KAAW,QAAA;AAClB,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,IAAS,UAAA;AACjC,IAAA,MAAM,WAAA,GAAc,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,MAAM,WAAA,GAAc,CAAA;AAE9D,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,OAAA,EAAA;AACA,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,MACrC,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,QAAA,GAAW,OAAA,GAAU,WAAA,IAAe,WAAA,CAAY,KAAK,CAAA;AAC3D,QAAA,IAAI,CAAC,UAAU,MAAM,KAAA;AACrB,QAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,cAAA,GAAiB,KAAA,CAAM,YAAA,GAAe,MAAA;AACzD,QAAA,MAAM,UAAU,cAAA,CAAe,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,OAAO,YAAY,CAAA;AACpE,QAAA,IAAA,CAAK,IAAI,OAAA,GAAU,EAAE,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAC9C,QAAA,IAAA,CAAK,IAAI,MAAA,CAAO,KAAA;AAAA,UACd,qBAAqB,OAAO,CAAA,CAAA,EAAI,WAAA,GAAc,CAAC,OAAO,OAAO,CAAA,EAAA,CAAA;AAAA,UAC7D,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SAC3C;AACA,QAAA,MAAM,MAAM,OAAO,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,IAAA,CAAQ,GAAA,EAAa,IAAA,EAAkC;AACnE,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,IAAI,SAAS,CAAA;AAErE,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK;AAAA,QAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC1B,IAAA,EAAM,KAAK,IAAA,KAAS,KAAA,CAAA,GAAY,SAAY,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,QACpE,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAMA,QAAAA,GACJ,WAAW,MAAA,CAAO,OAAA,GACd,cAAc,IAAA,CAAK,IAAI,CAAA,iBAAA,EAAoB,IAAA,CAAK,GAAA,CAAI,SAAS,QAC7D,CAAA,sBAAA,EAAyB,IAAA,CAAK,IAAI,CAAA,EAAA,EAChC,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,CAAA;AACN,MAAA,MAAM,IAAI,aAAaA,QAAO,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,IAAI,IAAA,GAAgB,MAAA;AACpB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACxB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAKA,IAAA,MAAM,GAAA,GAAO,QAAQ,EAAC;AACtB,IAAA,MAAM,QAAQ,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,cAAA,IAAkB,GAAA;AAE3E,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,SAAS,GAAA,CAAI,YAAA;AAGnB,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,MAAA,EAAQ,MAAA,KAAW,SAAA,EAAW;AAC1C,QAAA,OAAS,GAAA,CAAI,UAA6B,EAAC;AAAA,MAC7C;AACA,MAAA,MAAMA,QAAAA,GACJ,MAAA,EAAQ,OAAA,IAAW,CAAA,2BAAA,EAA8B,IAAI,MAAM,CAAA,CAAA,CAAA;AAC7D,MAAA,MAAM,kBAAkB,GAAA,CAAI,MAAA,EAAQA,UAAS,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,IAC3E;AAGA,IAAA,MAAM,QAAA,GAAW,GAAA;AACjB,IAAA,IAAI,GAAA,CAAI,EAAA,IAAM,QAAA,CAAS,EAAA,KAAO,KAAA,EAAO;AACnC,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,MAAM,UACJ,QAAA,CAAS,KAAA,IAAS,IAAA,IAAQ,CAAA,2BAAA,EAA8B,IAAI,MAAM,CAAA,CAAA,CAAA;AACpE,IAAA,MAAM,kBAAkB,GAAA,CAAI,MAAA,EAAQ,SAAS,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,EAC3E;AAAA,EAEQ,QAAQ,IAAA,EAA8C;AAC5D,IAAA,MAAM,CAAA,GAA4B;AAAA,MAChC,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,CAAA;AAAA,MACxC,YAAA,EAAc,oBAAoB,WAAW,CAAA;AAAA,KAC/C;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,CAAA,CAAE,cAAc,CAAA,GAAI,kBAAA;AACjD,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEQ,QAAA,CACN,MACA,KAAA,EACQ;AAER,IAAA,IAAI,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,GAAG,IAAI,CAAA,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,QAAA,IAAI,CAAA,KAAM,UAAa,CAAA,KAAM,EAAA,SAAW,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC1D;AACA,MAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,MAAA,IAAI,EAAA,EAAI,GAAA,IAAO,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAA;;;AChJO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,MAAA,GAA+B,EAAC,EAAsB;AAC/D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA+B;AAAA,MAC9D,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,iBAAA;AAAA,MACN,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,KAAW,SAAY,MAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAE,KAClF,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,KAAA,EAAyC;AACpD,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,iBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAI,EAAA,EAAmC;AAC3C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAkC;AAAA,MACjE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KAChD,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,EAAA,EAAY,KAAA,EAAyC;AAChE,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MAC/C,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,EAAA,EAAY,QAAA,EAAoC;AAC9D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA4B;AAAA,MAC3D,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MAC/C,IAAA,EAAM,EAAE,QAAA;AAAS,KAClB,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KAChD,CAAA;AAAA,EACH;AACF,CAAA;;;AC1CO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,MAAM,OAAO,KAAA,EAAkD;AAC7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAmC;AAAA,MAClE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,mBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,IAAA,CAAK,MAAA,GAIP,EAAC,EAA0B;AAC7B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAqC;AAAA,MACpE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,mBAAA;AAAA,MACN,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,GAAG,MAAA,CAAO,CAAA,EAAG,MAAA,EAAQ,MAAA,CAAO,MAAA;AAAO,KAClE,CAAA;AACD,IAAA,OAAO,EAAE,SAAA,EAAW,GAAA,CAAI,SAAA,EAAW,UAAA,EAAY,IAAI,UAAA,EAAW;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,OAAA,CAAQ,MAAA,GAAyC,EAAC,EAEvD;AACA,IAAA,IAAI,MAAA;AACJ,IAAA,GAAG;AACD,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,QAAQ,CAAA;AAClD,MAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA;AACtC,MAAA,MAAA,GAAS,KAAK,UAAA,IAAc,MAAA;AAAA,IAC9B,CAAA,QAAS,MAAA;AAAA,EACX;AAAA;AAAA,EAGA,MAAM,IAAI,EAAA,EAAkC;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAmC;AAAA,MAClE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KAClD,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,EAAA,EACA,KAAA,EACsB;AACtB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAmC;AAAA,MAClE,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MACjD,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KAClD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,EAAA,EAAY,MAAA,GAA6B,EAAC,EAAuB;AAC3E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAkC;AAAA,MACjE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,MAAA,CAAA;AAAA,MACjD,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA;AAAM,KAC9B,CAAA;AACD,IAAA,OAAO,EAAE,UAAU,GAAA,CAAI,QAAA,EAAU,QAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK;AAAA,EACtE;AAAA;AAAA,EAGA,SAAS,EAAA,EAAuC;AAC9C,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAA0B;AAAA,MAC9C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,SAAA;AAAA,KAClD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,KAAK,EAAA,EAAmC;AACtC,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAsB;AAAA,MAC1C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,KAAA;AAAA,KAClD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAA,CACE,EAAA,EACA,MAAA,GAAmC,EAAC,EACV;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAyB;AAAA,MAC7C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAA;AAAA,MACjD,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA;AAAM,KAC9B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,EAAA,EAA+B;AAC/C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA+B;AAAA,MAC9D,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA;AAAA,KAClD,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,EAAA,EAAY,KAAA,EAAwC;AAClE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA4B;AAAA,MAC3D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAA;AAAA,MACjD,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,YAAA,CACJ,EAAA,EACA,QAAA,EACA,KAAA,EACiB;AACjB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA4B;AAAA,MAC3D,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,qBAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,SAAA,EAAY,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA;AAAA,MACzF,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,YAAA,CAAa,EAAA,EAAY,QAAA,EAAiC;AAC9D,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,qBAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,SAAA,EAAY,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAAA,KAC1F,CAAA;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,EAAA,EAAY,MAAA,GAA6B,EAAC,EAAwB;AACvE,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAoB;AAAA,MACxC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA;AAAA,MACjD,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA;AAAM,KAC9B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CACJ,EAAA,EACA,KAAA,EACiE;AACjE,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAGnB;AAAA,MACD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA;AAAA,MACjD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CAAa,EAAA,EAAY,KAAA,EAAyC;AACtE,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,eAAA,CAAA;AAAA,MACjD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aAAA,CACJ,EAAA,EACA,KAAA,EACgC;AAChC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA+B;AAAA,MAC9D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,gBAAA,CAAA;AAAA,MACjD,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,EAAE,SAAA,EAAW,GAAA,CAAI,SAAA,EAAU;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,UAAA,CACJ,EAAA,EACA,KAAA,EACgC;AAChC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA+B;AAAA,MAC9D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,aAAA,CAAA;AAAA,MACjD,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,EAAE,SAAA,EAAW,GAAA,CAAI,SAAA,EAAU;AAAA,EACpC;AACF,CAAA;;;AC7OO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CACJ,MAAA,GAA0E,EAAC,EAChD;AAC3B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAwC;AAAA,MACvE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,kBAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,OAAO,MAAA,CAAO;AAAA;AAChB,KACD,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA;AAAA,EAGA,IAAI,EAAA,EAAoC;AACtC,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAuB;AAAA,MAC3C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,EAAA,EAA8B;AACpC,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAiB;AAAA,MACrC,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA,SAAA;AAAA,KACjD,CAAA;AAAA,EACH;AACF,CAAA;;;ACrCO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,MAAA,GAA+B,EAAC,EAAuB;AAChE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAiC;AAAA,MAChE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,kBAAA;AAAA,MACN,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,KAAW,SAAY,MAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAE,KAClF,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,KAAA,EAA6C;AACxD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA8B;AAAA,MAC7D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,kBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAoC;AAAA,MACnE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KACjD,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,EAAA,EAAY,KAAA,EAA6C;AACpE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA8B;AAAA,MAC7D,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MAChD,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,EAAA,EAAY,QAAA,EAAkC;AAC5D,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MAChD,IAAA,EAAM,EAAE,QAAA;AAAS,KAClB,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KACjD,CAAA;AAAA,EACH;AACF,CAAA;;;AChEO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CACJ,MAAA,GAAkD,EAAC,EAC5B;AACvB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAoC;AAAA,MACnE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,kBAAA;AAAA,MACN,OAAO,EAAE,UAAA,EAAY,OAAO,UAAA,EAAY,KAAA,EAAO,OAAO,KAAA;AAAM,KAC7D,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA;AAAA,EAGA,IAAI,EAAA,EAAoC;AACtC,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAuB;AAAA,MAC3C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KACjD,CAAA;AAAA,EACH;AACF,CAAA;;;AChBO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,MAAA,GAA+B,EAAC,EAAoB;AAC7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA2B;AAAA,MAC1D,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,eAAA;AAAA,MACN,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,KAAW,SAAY,MAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAE,KAClF,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,KAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,KAAA,EAAuC;AAClD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAwB;AAAA,MACvD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,eAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,IAAI,EAAA,EAAiC;AACzC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA8B;AAAA,MAC7D,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,cAAA,EAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KAC9C,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,EAAA,EAAY,KAAA,EAAuC;AAC9D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAwB;AAAA,MACvD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,cAAA,EAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MAC7C,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,EAAA,EAAY,QAAA,EAAkC;AAC5D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAwB;AAAA,MACvD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,cAAA,EAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MAC7C,IAAA,EAAM,EAAE,QAAA;AAAS,KAClB,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,cAAA,EAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KAC9C,CAAA;AAAA,EACH;AACF,CAAA;;;AC/DO,IAAM,SAAN,MAAa;AAAA,EAClB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA,EAE7B,MAAM,YAAY,KAAA,EAA+C;AAC/D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAE/B;AAAA,MACA,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,sBAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,aAAa,KAAA,CAAM;AAAA;AACrB,KACD,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AACF,CAAA;;;ACjBO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CACJ,MAAA,GAA2E,EAAC,EACvD;AACrB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAmC;AAAA,MAClE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,mBAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,OAAO,MAAA,CAAO;AAAA;AAChB,KACD,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,SAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,KAAA,EAA+C;AAC1D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAgC;AAAA,MAC/D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,mBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,IAAI,EAAA,EAAqC;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAsC;AAAA,MACrE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KAClD,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CACJ,EAAA,EACA,WAAA,EACA,IAAA,GAAiC,EAAC,EACC;AACnC,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAkC;AAAA,MACtD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MACjD,IAAA,EAAM,EAAE,WAAA,EAAa,WAAA,EAAa,KAAK,WAAA;AAAY,KACpD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA;AAAA,KAClD,CAAA;AAAA,EACH;AACF,CAAA;;;ACpDO,SAAS,MAAA,GAAiB;AAC/B,EAAA,MAAM,IAAK,UAAA,CAA0D,MAAA;AACrE,EAAA,IAAI,OAAO,CAAA,EAAG,UAAA,KAAe,UAAA,EAAY,OAAO,EAAE,UAAA,EAAW;AAG7D,EAAA,OAAO,sCAAA,CAAuC,OAAA,CAAQ,OAAA,EAAS,CAAC,EAAA,KAAO;AACrE,IAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,EAAA,KAAO,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACvC,IAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACtB,CAAC,CAAA;AACH;;;ACfO,SAAS,aAAa,MAAA,EAAyC;AACpE,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAO,MAAA,CAAO;AAAA,GAChB;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA;AACxC,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA;AAIxC,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,EAAA,IAAA,CAAK,cAAc,CAAA,CAAE,KAAA;AACrB,EAAA,IAAA,CAAK,eAAe,CAAA,CAAE,MAAA;AACtB,EAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,IAAA,CAAK,cAAc,CAAA,CAAE,KAAA;AAG1C,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,SAAS,SAAA,EAAW;AACzD,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AAAA,EACzB;AAGA,EAAA,IAAI,MAAA,CAAO,cAAA,EAAgB,IAAA,CAAK,cAAA,GAAiB,MAAA,CAAO,cAAA;AACxD,EAAA,OAAO,IAAA;AACT;AASO,IAAM,UAAN,MAAc;AAAA,EACnB,WAAA,CACmB,SAAA,EACA,OAAA,EACA,GAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAHgB,SAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EAGnB,MAAM,KAAA,CACJ,MAAA,EACA,IAAA,GAA2B,EAAC,EACN;AACtB,IAAA,MAAM,IAAA,GAAO,aAAa,MAAM,CAAA;AAKhC,IAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,EAAM,IAAA,CAAK,iBAAiB,MAAA,EAAO;AAE9D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAI,IAAA,KAAS,MAAA;AAC/C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,EAAE,IAAA,EAAM,QAAQ,CAAA;AACrC,MAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,IACxB;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAE9B;AAAA,MACD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,eAAA;AAAA,MACN,IAAA;AAAA;AAAA,MAEA,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,QAAA,EAAU,IAAI,QAAA,IAAY;AAAA,KAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,MAAA,EAAoD;AAC/D,IAAA,MAAM,IAAA,GAAO,aAAa,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAG9B;AAAA,MACD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,eAAA;AAAA,MACN,IAAA;AAAA;AAAA,MAEA,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,OAAO,IAAI,QAAA,IAAY,IAAA;AAAA,EACzB;AAAA;AAAA,EAGA,MAAA,CAAO,OAAoB,IAAA,EAAiD;AAC1E,IAAA,OAAO,IAAA,CAAK,MAAM,EAAE,GAAG,OAAO,IAAA,EAAM,QAAA,IAAY,IAAI,CAAA;AAAA,EACtD;AAAA;AAAA,EAGA,MAAA,CAAO,OAAoB,IAAA,EAAiD;AAC1E,IAAA,OAAO,IAAA,CAAK,MAAM,EAAE,GAAG,OAAO,IAAA,EAAM,QAAA,IAAY,IAAI,CAAA;AAAA,EACtD;AAAA;AAAA,EAGA,OAAA,CACE,OACA,IAAA,EACsB;AACtB,IAAA,OAAO,IAAA,CAAK,MAAM,EAAE,GAAG,OAAO,IAAA,EAAM,SAAA,IAAa,IAAI,CAAA;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,KAAK,MAAA,EAGY;AACrB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAkC;AAAA,MACjE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,eAAA;AAAA,MACN,OAAO,EAAE,UAAA,EAAY,OAAO,UAAA,EAAY,KAAA,EAAO,OAAO,KAAA;AAAM,KAC7D,CAAA;AACD,IAAA,OAAO,EAAE,UAAU,GAAA,CAAI,QAAA,EAAU,QAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAK,KAAA,EAAmE;AAC5E,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAgD;AAAA,MACpE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,eAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,GAAI,MAAM,MAAA,GAAS,EAAE,QAAQ,KAAA,CAAM,MAAA,KAAW;AAAC,OACjD;AAAA;AAAA,MAEA,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,UAAU,MAAA,EAGiB;AACzB,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAuB;AAAA,MAC3C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,eAAA;AAAA,MACN,OAAO,EAAE,UAAA,EAAY,OAAO,UAAA,EAAY,KAAA,EAAO,OAAO,KAAA;AAAM,KAC7D,CAAA;AAAA,EACH;AACF,CAAA;;;AC9JO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,MAAA,GAA+B,EAAC,EAAoB;AAC7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA2B;AAAA,MAC1D,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,uBAAA;AAAA,MACN,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,KAAW,SAAY,MAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAE,KAClF,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,KAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,KAAA,EAAuC;AAClD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAwB;AAAA,MACvD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,uBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,IAAI,EAAA,EAAiC;AACzC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA8B;AAAA,MAC7D,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KACtD,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,EAAA,EAAY,KAAA,EAAuC;AAC9D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAwB;AAAA,MACvD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MACrD,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,EAAA,EAAY,QAAA,EAAkC;AAC5D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAwB;AAAA,MACvD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,MACrD,IAAA,EAAM,EAAE,QAAA;AAAS,KAClB,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KACtD,CAAA;AAAA,EACH;AACF,CAAA;;;ACjEO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,GAA2B;AAC/B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAiC;AAAA,MAChE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,KAAA,EAA6C;AACxD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA8B;AAAA,MAC7D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,kBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,OAAO,IAAA,EAAoC;AAC/C,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,KACnD,CAAA;AAAA,EACH;AACF,CAAA;;;AC5BO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA,EAAvB,SAAA;AAAA;AAAA,EAG7B,EAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAA2B;AAAA,MAC/C,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA,EAIA,MAAM,MAAA,CAAO,MAAA,GAA+B,EAAC,EAAqB;AAChE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAA6B;AAAA,MAC5D,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,QACL,QAAQ,MAAA,CAAO,MAAA,KAAW,SAAY,MAAA,GAAY,MAAA,CAAO,OAAO,MAAM;AAAA;AACxE,KACD,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AACF,CAAA;;;ACGO,IAAM,YAAN,MAAgB;AAAA;AAAA,EAEZ,OAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EAEQ,GAAA;AAAA,EACA,OAAA;AAAA,EAEjB,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,GAAA,GAAM,cAAc,MAAM,CAAA;AAE/B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,IAAA,CAAK,IAAI,MAAA,CAAO,IAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AACxC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,SAAA,EAAW,KAAK,GAAG,CAAA;AAC9C,IAAA,IAAA,CAAK,UAAU,IAAI,OAAA,CAAQ,WAAW,IAAA,CAAK,OAAA,EAAS,KAAK,GAAG,CAAA;AAC5D,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,SAAS,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,SAAS,CAAA;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,SAAS,CAAA;AAChC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,SAAS,CAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,SAAS,CAAA;AAAA,EAC1C;AAAA;AAAA,EAGA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA;AAAA,EAGA,KAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EAC5B;AAAA;AAAA,EAGA,KAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EAC5B;AACF","file":"index.js","sourcesContent":["import type { ClockNextConfig, FetchLike, ResolvedConfig } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://payments.clocknext.com\";\n\n/** Use `value` only if it's a finite number `>= min`; otherwise fall back. */\nfunction num(value: number | undefined, fallback: number, min: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= min\n ? value\n : fallback;\n}\n\n/** Applies defaults and validates required config. */\nexport function resolveConfig(config: ClockNextConfig): ResolvedConfig {\n if (!config.apiKey || typeof config.apiKey !== \"string\") {\n throw new Error(\"ClockNext: `apiKey` is required.\");\n }\n\n const fetchImpl: FetchLike | undefined =\n config.fetch ??\n (typeof globalThis.fetch === \"function\"\n ? (globalThis.fetch.bind(globalThis) as FetchLike)\n : undefined);\n if (!fetchImpl) {\n throw new Error(\n \"ClockNext: no global `fetch` found. Use Node 18+, or pass a `fetch` implementation.\",\n );\n }\n\n return {\n apiKey: config.apiKey,\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\"),\n mode: config.mode ?? \"async\",\n timeoutMs: num(config.timeoutMs, 10_000, 1),\n batch: {\n maxSize: num(config.batch?.maxSize, 20, 1),\n maxIntervalMs: num(config.batch?.maxIntervalMs, 2000, 0),\n maxConcurrency: num(config.batch?.maxConcurrency, 5, 1),\n maxQueueSize: num(config.batch?.maxQueueSize, 10_000, 1),\n },\n retry: {\n maxAttempts: num(config.retry?.maxAttempts, 5, 1),\n baseDelayMs: num(config.retry?.baseDelayMs, 200, 0),\n maxDelayMs: num(config.retry?.maxDelayMs, 10_000, 0),\n },\n fetch: fetchImpl,\n logger: config.logger ?? {},\n onError: config.onError,\n onFlush: config.onFlush,\n onRetry: config.onRetry,\n onDrop: config.onDrop,\n };\n}\n","import type { Signal } from \"./types.js\";\n\n/** One buffered, wire-ready signal awaiting a background flush. */\nexport interface QueuedSignal {\n /** The exact JSON body to POST to /api/v1/usage. */\n body: Record<string, unknown>;\n /** The original signal — passed to onError/onDrop hooks. */\n signal: Signal;\n}\n\n/**\n * Internal buffer seam. Currently in-memory only — this interface exists so a\n * durable (disk/Redis/SQLite) implementation can be slotted in later without\n * touching the Flusher. It is NOT part of the public API and is not yet\n * injectable; don't rely on it externally.\n */\nexport interface QueueStore {\n push(item: QueuedSignal): void;\n /** Remove and return up to `n` items (FIFO). */\n take(n: number): QueuedSignal[];\n size(): number;\n}\n\nexport class InMemoryQueue implements QueueStore {\n private items: QueuedSignal[] = [];\n\n push(item: QueuedSignal): void {\n this.items.push(item);\n }\n\n take(n: number): QueuedSignal[] {\n return this.items.splice(0, n);\n }\n\n size(): number {\n return this.items.length;\n }\n}\n","import type { Transport } from \"./http.js\";\nimport { InMemoryQueue, type QueueStore, type QueuedSignal } from \"./queue.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/**\n * Background send engine for async-mode signals. Buffers wire-ready signals and\n * flushes them when the buffer reaches `maxSize` OR every `maxIntervalMs`,\n * whichever comes first — the Segment/Amberflo pattern. The Transport owns\n * retries; `close()` drains and awaits in-flight sends so a serverless process\n * can flush before it freezes.\n */\nexport class Flusher {\n private readonly queue: QueueStore = new InMemoryQueue();\n private timer: ReturnType<typeof setTimeout> | null = null;\n private draining: Promise<void> | null = null;\n private closed = false;\n\n constructor(\n private readonly transport: Transport,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n /** Buffer one signal. Drops (with onDrop) when closed or the queue is full. */\n enqueue(item: QueuedSignal): void {\n if (this.closed) {\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return;\n }\n if (this.queue.size() >= this.cfg.batch.maxQueueSize) {\n this.cfg.logger.warn?.(\"[clocknext] queue full — dropping signal\");\n this.cfg.onDrop?.(item.signal, \"queue_full\");\n return;\n }\n this.queue.push(item);\n if (this.queue.size() >= this.cfg.batch.maxSize) void this.flush();\n else this.arm();\n }\n\n /** Arm the interval timer if it isn't already running. */\n private arm(): void {\n if (this.timer || this.closed) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flush();\n }, this.cfg.batch.maxIntervalMs);\n // Don't keep the event loop alive just for the flush timer.\n (this.timer as { unref?: () => void }).unref?.();\n }\n\n /**\n * Send everything currently buffered. Overlapping calls share the single\n * in-progress drain, so total in-flight sends never exceed `maxConcurrency`.\n */\n flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (!this.draining) {\n this.draining = this.drain().finally(() => {\n this.draining = null;\n });\n }\n return this.draining;\n }\n\n /** Drain the buffer in concurrency-bounded waves until it's empty. */\n private async drain(): Promise<void> {\n let sent = 0;\n while (this.queue.size() > 0) {\n const wave = this.queue.take(this.cfg.batch.maxConcurrency);\n const results = await Promise.all(wave.map((item) => this.send(item)));\n sent += results.filter(Boolean).length;\n }\n if (sent > 0) this.cfg.onFlush?.(sent);\n }\n\n /** Send one item; never throws — failures surface via onError/onDrop. */\n private async send(item: QueuedSignal): Promise<boolean> {\n try {\n await this.transport.request({\n method: \"POST\",\n path: \"/api/v1/usage\",\n body: item.body,\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n return true;\n } catch (error) {\n this.cfg.onError?.(error, item.signal);\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return false;\n }\n }\n\n get size(): number {\n return this.queue.size();\n }\n\n /** Flush remaining signals, then refuse further enqueues. */\n async close(): Promise<void> {\n this.closed = true;\n await this.flush();\n }\n}\n","/**\n * Typed error hierarchy. The server returns `{ ok: false, error }` with a\n * meaningful HTTP status; we map that status to a class so callers can branch\n * on the *kind* of failure (e.g. allowance exhausted ⇒ upsell; network ⇒ ignore,\n * it's queued) rather than string-matching messages.\n */\n\nexport class ClockNextError extends Error {\n /** HTTP status, when the failure came from a server response. */\n readonly status?: number;\n /** Whether the SDK considers this failure worth retrying. */\n readonly retryable: boolean;\n\n constructor(\n message: string,\n opts: { status?: number; retryable?: boolean } = {},\n ) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.retryable = opts.retryable ?? false;\n // Restore prototype chain for instanceof across transpile targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 — missing / invalid / expired API key. */\nexport class AuthError extends ClockNextError {}\n\n/** 400 — malformed request / schema validation failure. */\nexport class ValidationError extends ClockNextError {}\n\n/** 404 — unknown customer (also returned for cross-org access). */\nexport class NotFoundError extends ClockNextError {}\n\n/** 422 — no active plan, meter not in plan, model not enabled, member missing. */\nexport class PlanError extends ClockNextError {}\n\n/** 422 — insufficient credits / units / outcomes for the call. */\nexport class AllowanceError extends ClockNextError {}\n\n/** 409 — conflict. */\nexport class ConflictError extends ClockNextError {}\n\n/** 429 — rate limited. */\nexport class RateLimitError extends ClockNextError {\n readonly retryAfterMs?: number;\n constructor(message: string, opts: { retryAfterMs?: number } = {}) {\n super(message, { status: 429, retryable: true });\n this.retryAfterMs = opts.retryAfterMs;\n }\n}\n\n/** 5xx — server-side error. */\nexport class ServerError extends ClockNextError {}\n\n/** fetch threw / request timed out — request never completed. */\nexport class NetworkError extends ClockNextError {\n constructor(message: string) {\n super(message, { retryable: true });\n }\n}\n\n/**\n * Maps a server response (status + parsed `error` message) to a typed error.\n * 422 is split into AllowanceError vs PlanError by sniffing the message, since\n * the server uses the same status for both.\n */\nexport function errorFromResponse(\n status: number,\n message: string,\n retryAfterMs?: number,\n): ClockNextError {\n const msg = message || `Request failed with status ${status}.`;\n const opts = { status };\n\n if (status === 400) return new ValidationError(msg, opts);\n if (status === 401) return new AuthError(msg, opts);\n if (status === 404) return new NotFoundError(msg, opts);\n // 408 Request Timeout — transient; the request never produced a result, so\n // a retry is safe.\n if (status === 408) return new ClockNextError(msg, { ...opts, retryable: true });\n if (status === 409) return new ConflictError(msg, { ...opts, retryable: true });\n if (status === 422) {\n return /insufficient/i.test(msg)\n ? new AllowanceError(msg, opts)\n : new PlanError(msg, opts);\n }\n if (status === 429) return new RateLimitError(msg, { retryAfterMs });\n if (status >= 500) return new ServerError(msg, { ...opts, retryable: true });\n return new ClockNextError(msg, opts);\n}\n","import { ClockNextError } from \"./errors.js\";\n\n/**\n * Retry classification + backoff. Mirrors the convergent industry policy\n * (Stripe / Stainless clients): retry transient transport failures\n * (network, timeout, 408/409/429/5xx); never retry deterministic 4xx\n * (400/401/404 and 422 validation/plan/allowance). Exponential backoff with\n * equal jitter, honoring a server `Retry-After`. The Transport additionally\n * gates retries by request safety (GET/DELETE, or a write that explicitly\n * opts in).\n */\n\n/** Whether an error should be retried. NetworkError/Server/RateLimit/Conflict\n * carry `retryable: true`; everything else is permanent. */\nexport function isRetryable(error: unknown): boolean {\n return error instanceof ClockNextError && error.retryable;\n}\n\n/** Parses `Retry-After` (seconds or HTTP-date) and `retry-after-ms` headers. */\nexport function parseRetryAfter(headers: Headers): number | undefined {\n const ms = headers.get(\"retry-after-ms\");\n if (ms) {\n const n = Number(ms);\n if (Number.isFinite(n) && n >= 0) return n;\n }\n const ra = headers.get(\"retry-after\");\n if (ra) {\n const secs = Number(ra);\n if (Number.isFinite(secs)) return Math.max(0, secs * 1000);\n const date = Date.parse(ra);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n }\n return undefined;\n}\n\n/**\n * Backoff for a given attempt (1-based). Exponential `base * 2^(attempt-1)`,\n * capped at `maxDelayMs`, with equal jitter (×[0.5, 1.0]). A server-provided\n * `retryAfterMs` overrides the computed value.\n */\nexport function computeBackoff(\n attempt: number,\n opts: { baseDelayMs: number; maxDelayMs: number },\n retryAfterMs?: number,\n rand: () => number = Math.random,\n): number {\n if (retryAfterMs != null) return Math.min(retryAfterMs, opts.maxDelayMs);\n const raw = opts.baseDelayMs * Math.pow(2, Math.max(0, attempt - 1));\n const capped = Math.min(raw, opts.maxDelayMs);\n // Equal jitter: a random point in [0.5, 1.0] of the capped delay.\n return Math.round(capped * (0.5 + rand() * 0.5));\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { NetworkError, RateLimitError, errorFromResponse } from \"./errors.js\";\nimport { computeBackoff, isRetryable, parseRetryAfter, sleep } from \"./retry.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/**\n * Injected from package.json at build time (see tsup `define`) so it can't\n * drift. Falls back to a dev marker when run un-bundled (tests, ts-node).\n */\ndeclare const __SDK_VERSION__: string | undefined;\nconst SDK_VERSION =\n typeof __SDK_VERSION__ !== \"undefined\" ? __SDK_VERSION__ : \"0.0.0-dev\";\n\ninterface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n path: string;\n query?: Record<string, string | number | undefined>;\n body?: unknown;\n /**\n * Whether this call may be auto-retried on a transient failure. Defaults to\n * method-based safety: reads (GET), idempotent replaces (PUT), and DELETE are\n * replay-safe. Non-idempotent writes (POST/PATCH) default to NOT retried so a\n * transient failure can't duplicate the write; callers that tolerate a retry\n * opt in explicitly.\n */\n retry?: boolean;\n}\n\n/**\n * The single HTTP seam. Builds the authenticated request, enforces a timeout,\n * unwraps the `{ ok, ... }` envelope, maps failures to typed errors, and retries\n * transient ones with backoff + jitter.\n */\nexport class Transport {\n constructor(private readonly cfg: ResolvedConfig) {}\n\n async request<T = unknown>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n // Reads, idempotent PUT replaces, and DELETE are replay-safe by default;\n // non-idempotent writes are retried only when the caller opts in (e.g.\n // best-effort metering signals).\n const replaySafe =\n opts.method === \"GET\" ||\n opts.method === \"PUT\" ||\n opts.method === \"DELETE\";\n const allowRetry = opts.retry ?? replaySafe;\n const maxAttempts = allowRetry ? this.cfg.retry.maxAttempts : 1;\n\n let attempt = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n attempt++;\n try {\n return await this.once<T>(url, opts);\n } catch (error) {\n const canRetry = attempt < maxAttempts && isRetryable(error);\n if (!canRetry) throw error;\n const retryAfterMs =\n error instanceof RateLimitError ? error.retryAfterMs : undefined;\n const delayMs = computeBackoff(attempt, this.cfg.retry, retryAfterMs);\n this.cfg.onRetry?.({ attempt, delayMs, error });\n this.cfg.logger.debug?.(\n `[clocknext] retry ${attempt}/${maxAttempts - 1} in ${delayMs}ms`,\n error instanceof Error ? error.message : error,\n );\n await sleep(delayMs);\n }\n }\n }\n\n /** One attempt: fetch + timeout + envelope/status handling. */\n private async once<T>(url: string, opts: RequestOptions): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.cfg.timeoutMs);\n\n let res: Response;\n try {\n res = await this.cfg.fetch(url, {\n method: opts.method,\n headers: this.headers(opts),\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n signal: controller.signal,\n });\n } catch (err) {\n const message =\n controller.signal.aborted\n ? `Request to ${opts.path} timed out after ${this.cfg.timeoutMs}ms.`\n : `Network error calling ${opts.path}: ${\n err instanceof Error ? err.message : String(err)\n }`;\n throw new NetworkError(message);\n } finally {\n clearTimeout(timer);\n }\n\n const text = await res.text();\n let json: unknown = undefined;\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n // Non-JSON body — only an error if the status is also bad.\n }\n }\n\n // Two envelope shapes coexist during the v1 migration:\n // new: { statusCode, statusDetail: { status, message }, result }\n // old: { ok: boolean, error?, ...payload }\n const obj = (json ?? {}) as Record<string, unknown>;\n const isNew = typeof obj === \"object\" && obj !== null && \"statusDetail\" in obj;\n\n if (isNew) {\n const detail = obj.statusDetail as\n | { status?: string; message?: string }\n | undefined;\n if (res.ok && detail?.status === \"SUCCESS\") {\n return ((obj.result as T | undefined) ?? ({} as T));\n }\n const message =\n detail?.message ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(res.status, message, parseRetryAfter(res.headers));\n }\n\n // Old envelope.\n const envelope = obj as { ok?: boolean; error?: string };\n if (res.ok && envelope.ok !== false) {\n return envelope as T;\n }\n const message =\n envelope.error ?? text ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(res.status, message, parseRetryAfter(res.headers));\n }\n\n private headers(opts: RequestOptions): Record<string, string> {\n const h: Record<string, string> = {\n Authorization: `Bearer ${this.cfg.apiKey}`,\n \"User-Agent\": `clocknext-sdk-js/${SDK_VERSION}`,\n };\n if (opts.body !== undefined) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | undefined>,\n ): string {\n // baseUrl already has trailing slashes stripped in resolveConfig.\n let url = `${this.cfg.baseUrl}${path}`;\n if (query) {\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== \"\") params.set(k, String(v));\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n }\n return url;\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateCreditInput,\n Credit,\n CreditDetail,\n UpdateCreditInput,\n} from \"../types.js\";\n\n/**\n * The `credits` resource — manage the org's credit *types* (the catalog). A\n * credit's stable `agentKey` is what you pass to `signals.credit()` when\n * recording usage against it. `/api/v1/credits`.\n */\nexport class Credits {\n constructor(private readonly transport: Transport) {}\n\n /** List credit types. Pass `{ active: true }` to only return active ones. */\n async list(params: { active?: boolean } = {}): Promise<Credit[]> {\n const res = await this.transport.request<{ credits: Credit[] }>({\n method: \"GET\",\n path: \"/api/v1/credits\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.credits;\n }\n\n /** Create a credit type. `POST /api/v1/credits`. */\n async create(input: CreateCreditInput): Promise<void> {\n await this.transport.request({\n method: \"POST\",\n path: \"/api/v1/credits\",\n body: input,\n });\n }\n\n /** Fetch one credit type with usage stats. `GET /api/v1/credits/:id`. */\n async get(id: string): Promise<CreditDetail> {\n const res = await this.transport.request<{ credit: CreditDetail }>({\n method: \"GET\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n return res.credit;\n }\n\n /** Update a credit type's definition. `PATCH /api/v1/credits/:id`. */\n async update(id: string, input: UpdateCreditInput): Promise<void> {\n await this.transport.request({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: input,\n });\n }\n\n /** Activate or deactivate a credit type. */\n async setActive(id: string, isActive: boolean): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.credit;\n }\n\n /** Delete a credit type. Refused while a customer is linked to it. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n AddMemberInput,\n ApiCustomer,\n CreateCustomerInput,\n CreditAdjustInput,\n CustomerBalances,\n CustomerList,\n CustomerPlan,\n CustomerProfileInput,\n CustomerRevenue,\n Member,\n OutcomeAdjustInput,\n RevenueRange,\n UnitAdjustInput,\n UpdateMemberInput,\n UsageList,\n WalletEntryInput,\n WalletList,\n WalletTransaction,\n} from \"../types.js\";\n\n/**\n * The `customers` resource — full CRUD over the org's customers plus the\n * read-only insight endpoints (usage / balances / plan / revenue). Every call\n * is scoped to the API key's organisation server-side; a customer in another\n * org resolves as a NotFoundError.\n */\nexport class Customers {\n constructor(private readonly transport: Transport) {}\n\n /** Create a customer. `POST /api/v1/customers`. */\n async create(input: CreateCustomerInput): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"POST\",\n path: \"/api/v1/customers\",\n body: input,\n });\n return res.customer;\n }\n\n /** List customers, most-recent first (cursor-paginated). `GET /api/v1/customers`. */\n async list(params: {\n limit?: number;\n q?: string;\n cursor?: string;\n } = {}): Promise<CustomerList> {\n const res = await this.transport.request<CustomerList & { ok: true }>({\n method: \"GET\",\n path: \"/api/v1/customers\",\n query: { limit: params.limit, q: params.q, cursor: params.cursor },\n });\n return { customers: res.customers, nextCursor: res.nextCursor };\n }\n\n /**\n * Async iterator over ALL customers, transparently following the cursor.\n * `for await (const c of cnk.customers.iterate()) { … }`\n */\n async *iterate(params: { limit?: number; q?: string } = {}): AsyncGenerator<\n ApiCustomer\n > {\n let cursor: string | undefined;\n do {\n const page = await this.list({ ...params, cursor });\n for (const c of page.customers) yield c;\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n }\n\n /** Fetch one customer. `GET /api/v1/customers/:id`. */\n async get(id: string): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n return res.customer;\n }\n\n /** Update a customer (partial). `PATCH /api/v1/customers/:id`. */\n async update(\n id: string,\n input: CustomerProfileInput,\n ): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"PATCH\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.customer;\n }\n\n /** Delete a customer (members, invitations, usage logs cascade). */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n }\n\n /** A customer's usage history. `GET /api/v1/customers/:id/usage`. */\n async usage(id: string, params: { limit?: number } = {}): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/usage`,\n query: { limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\n }\n\n /** Wallet / credit / outcome / unit balances. `GET …/:id/balances`. */\n balances(id: string): Promise<CustomerBalances> {\n return this.transport.request<CustomerBalances>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/balances`,\n });\n }\n\n /** The customer's current plan. `GET …/:id/plan`. */\n plan(id: string): Promise<CustomerPlan> {\n return this.transport.request<CustomerPlan>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/plan`,\n });\n }\n\n /** Revenue / cost / profit / margin over a window. `GET …/:id/revenue`. */\n revenue(\n id: string,\n params: { range?: RevenueRange } = {},\n ): Promise<CustomerRevenue> {\n return this.transport.request<CustomerRevenue>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/revenue`,\n query: { range: params.range },\n });\n }\n\n // --- Members -------------------------------------------------------------\n\n /** List a customer's members. `GET …/:id/members`. */\n async listMembers(id: string): Promise<Member[]> {\n const res = await this.transport.request<{ members: Member[] }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members`,\n });\n return res.members;\n }\n\n /** Add a member to a customer. Duplicate `employeeId` → ConflictError. */\n async addMember(id: string, input: AddMemberInput): Promise<Member> {\n const res = await this.transport.request<{ member: Member }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members`,\n body: input,\n });\n return res.member;\n }\n\n /** Update a member's profile (role is fixed). `PATCH …/:id/members/:memberId`. */\n async updateMember(\n id: string,\n memberId: string,\n input: UpdateMemberInput,\n ): Promise<Member> {\n const res = await this.transport.request<{ member: Member }>({\n method: \"PATCH\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n body: input,\n });\n return res.member;\n }\n\n /** Remove a member from a customer. `DELETE …/:id/members/:memberId`. */\n async removeMember(id: string, memberId: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n });\n }\n\n // --- Wallet & billing config --------------------------------------------\n\n /** The customer's wallet balance + transactions. `GET …/:id/wallet`. */\n wallet(id: string, params: { limit?: number } = {}): Promise<WalletList> {\n return this.transport.request<WalletList>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/wallet`,\n query: { limit: params.limit },\n });\n }\n\n /**\n * Record a manual wallet entry (top-up or deduction). `amount` is always\n * positive; the sign comes from `type`. `POST …/:id/wallet`.\n */\n async addWalletEntry(\n id: string,\n input: WalletEntryInput,\n ): Promise<{ transaction: WalletTransaction; balanceUsd: number }> {\n return this.transport.request<{\n transaction: WalletTransaction;\n balanceUsd: number;\n }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/wallet`,\n body: input,\n });\n }\n\n // Note: a customer's currency is set through `update(id, { currencyCode })`\n // (PATCH …/:id) — there is no separate currency endpoint. Credit-type\n // assignment has no public API.\n\n // --- Balance adjustments -------------------------------------------------\n\n /** Grant or claw back a credit balance. `POST …/:id/credits/adjust`. */\n async adjustCredit(id: string, input: CreditAdjustInput): Promise<void> {\n await this.transport.request({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/credits/adjust`,\n body: input,\n });\n }\n\n /** Grant or claw back an outcome balance. Returns the remaining balance. */\n async adjustOutcome(\n id: string,\n input: OutcomeAdjustInput,\n ): Promise<{ remaining: number }> {\n const res = await this.transport.request<{ remaining: number }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/outcomes/adjust`,\n body: input,\n });\n return { remaining: res.remaining };\n }\n\n /** Grant or claw back a unit balance. Returns the remaining balance. */\n async adjustUnit(\n id: string,\n input: UnitAdjustInput,\n ): Promise<{ remaining: number }> {\n const res = await this.transport.request<{ remaining: number }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/units/adjust`,\n body: input,\n });\n return { remaining: res.remaining };\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n InvoiceDetail,\n InvoiceListRow,\n InvoiceStatus,\n PayLink,\n} from \"../types.js\";\n\n/**\n * The `invoices` resource — read-only. Invoices are generated by the billing\n * engine from purchases; you list them, read one, or mint a hosted pay link for\n * an OPEN invoice. `/api/v1/invoices`.\n */\nexport class Invoices {\n constructor(private readonly transport: Transport) {}\n\n /** List invoices, most-recent first. Filter by customer and/or status. */\n async list(\n params: { customerId?: string; status?: InvoiceStatus; limit?: number } = {},\n ): Promise<InvoiceListRow[]> {\n const res = await this.transport.request<{ invoices: InvoiceListRow[] }>({\n method: \"GET\",\n path: \"/api/v1/invoices\",\n query: {\n customerId: params.customerId,\n status: params.status,\n limit: params.limit,\n },\n });\n return res.invoices;\n }\n\n /** Fetch one full invoice + its plan snapshot. `GET /api/v1/invoices/:id`. */\n get(id: string): Promise<InvoiceDetail> {\n return this.transport.request<InvoiceDetail>({\n method: \"GET\",\n path: `/api/v1/invoices/${encodeURIComponent(id)}`,\n });\n }\n\n /**\n * Mint a hosted pay link for an OPEN invoice. PAID/VOID invoices are rejected\n * with a `ConflictError`. `GET /api/v1/invoices/:id/pay-link`.\n */\n payLink(id: string): Promise<PayLink> {\n return this.transport.request<PayLink>({\n method: \"GET\",\n path: `/api/v1/invoices/${encodeURIComponent(id)}/pay-link`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateOutcomeInput,\n Outcome,\n OutcomeDetail,\n UpdateOutcomeInput,\n} from \"../types.js\";\n\n/**\n * The `outcomes` resource — manage the org's outcome *types* (the catalog). An\n * outcome is a multi-step workflow; each step has a stable `agentKey` you pass\n * to `signals.outcome()`. `/api/v1/outcomes`.\n */\nexport class Outcomes {\n constructor(private readonly transport: Transport) {}\n\n /** List outcome types. Pass `{ active: true }` to only return active ones. */\n async list(params: { active?: boolean } = {}): Promise<Outcome[]> {\n const res = await this.transport.request<{ outcomes: Outcome[] }>({\n method: \"GET\",\n path: \"/api/v1/outcomes\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.outcomes;\n }\n\n /** Create an outcome type with its steps. `POST /api/v1/outcomes`. */\n async create(input: CreateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"POST\",\n path: \"/api/v1/outcomes\",\n body: input,\n });\n return res.outcome;\n }\n\n /** Fetch one outcome type with steps + stats. `GET /api/v1/outcomes/:id`. */\n async get(id: string): Promise<OutcomeDetail> {\n const res = await this.transport.request<{ outcome: OutcomeDetail }>({\n method: \"GET\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\n return res.outcome;\n }\n\n /** Update an outcome type's definition. `PATCH /api/v1/outcomes/:id`. */\n async update(id: string, input: UpdateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.outcome;\n }\n\n /** Activate or deactivate an outcome type. */\n async setActive(id: string, isActive: boolean): Promise<void> {\n await this.transport.request({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n }\n\n /** Delete an outcome type. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { PaymentDetail, PaymentRow } from \"../types.js\";\n\n/**\n * The `payments` resource — read-only. A payment is a PAID invoice; the `id`\n * used here is that underlying invoice id. `/api/v1/payments`.\n */\nexport class Payments {\n constructor(private readonly transport: Transport) {}\n\n /** List payments (paid invoices), most-recent first. Filter by customer. */\n async list(\n params: { customerId?: string; limit?: number } = {},\n ): Promise<PaymentRow[]> {\n const res = await this.transport.request<{ payments: PaymentRow[] }>({\n method: \"GET\",\n path: \"/api/v1/payments\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n return res.payments;\n }\n\n /** Fetch one payment + its plan snapshot. `GET /api/v1/payments/:id`. */\n get(id: string): Promise<PaymentDetail> {\n return this.transport.request<PaymentDetail>({\n method: \"GET\",\n path: `/api/v1/payments/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreatePlanInput,\n Plan,\n PlanDetail,\n UpdatePlanInput,\n} from \"../types.js\";\n\n/**\n * The `plans` resource — define and manage the billing plans customers\n * subscribe to. Each plan is a set of entitlement components (wallet / credit /\n * outcome / unit / flat) billed on a cycle. `/api/v1/plans`.\n */\nexport class Plans {\n constructor(private readonly transport: Transport) {}\n\n /** List plans, oldest-first. Pass `{ active: true }` to only return active plans. */\n async list(params: { active?: boolean } = {}): Promise<Plan[]> {\n const res = await this.transport.request<{ plans: Plan[] }>({\n method: \"GET\",\n path: \"/api/v1/plans\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.plans;\n }\n\n /** Create a plan. `POST /api/v1/plans`. */\n async create(input: CreatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"POST\",\n path: \"/api/v1/plans\",\n body: input,\n });\n return res.plan;\n }\n\n /** Fetch one plan with aggregate subscriber/invoice stats. `GET /api/v1/plans/:id`. */\n async get(id: string): Promise<PlanDetail> {\n const res = await this.transport.request<{ plan: PlanDetail }>({\n method: \"GET\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\n return res.plan;\n }\n\n /** Replace a plan's definition (components + settings). `PATCH /api/v1/plans/:id`. */\n async update(id: string, input: UpdatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.plan;\n }\n\n /** Activate or deactivate a plan without rewriting it. */\n async setActive(id: string, isActive: boolean): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.plan;\n }\n\n /** Delete a plan. Refused once any customer has purchased it. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { PortalToken, PortalTokenInput } from \"../types.js\";\n\n/**\n * The `portal` resource — mint a short-lived embed token for one of your\n * customers, then render `<iframe src=\".../portal/embed?token=<token>\">`. The\n * HS256 signing secret never leaves ClockNext; your backend only needs its API\n * key. `POST /api/v1/portal/token`.\n */\nexport class Portal {\n constructor(private readonly transport: Transport) {}\n\n async createToken(input: PortalTokenInput): Promise<PortalToken> {\n const res = await this.transport.request<\n { token: string; expiresAt: number; expiresIn: number }\n >({\n method: \"POST\",\n path: \"/api/v1/portal/token\",\n body: {\n customerId: input.customerId,\n ttlSeconds: input.ttlSeconds,\n memberEmail: input.memberEmail,\n },\n });\n return {\n token: res.token,\n expiresAt: res.expiresAt,\n expiresIn: res.expiresIn,\n };\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreatePurchaseInput,\n Purchase,\n PurchaseDetail,\n PurchaseStatus,\n} from \"../types.js\";\n\n/**\n * The `purchases` resource — a purchase is a customer's subscription to a plan.\n * Creating one auto-cancels the customer's existing scheduled/active purchase\n * (this is also how you \"change plan\"). `/api/v1/purchases`.\n */\nexport class Purchases {\n constructor(private readonly transport: Transport) {}\n\n /** List purchases, most-recent first. Filter by customer and/or status. */\n async list(\n params: { customerId?: string; status?: PurchaseStatus; limit?: number } = {},\n ): Promise<Purchase[]> {\n const res = await this.transport.request<{ purchases: Purchase[] }>({\n method: \"GET\",\n path: \"/api/v1/purchases\",\n query: {\n customerId: params.customerId,\n status: params.status,\n limit: params.limit,\n },\n });\n return res.purchases;\n }\n\n /** Subscribe a customer to a plan. `POST /api/v1/purchases`. */\n async create(input: CreatePurchaseInput): Promise<Purchase> {\n const res = await this.transport.request<{ purchase: Purchase }>({\n method: \"POST\",\n path: \"/api/v1/purchases\",\n body: input,\n });\n return res.purchase;\n }\n\n /** Fetch one purchase. `GET /api/v1/purchases/:id`. */\n async get(id: string): Promise<PurchaseDetail> {\n const res = await this.transport.request<{ purchase: PurchaseDetail }>({\n method: \"GET\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}`,\n });\n return res.purchase;\n }\n\n /**\n * Turn automatic billing on or off for a purchase. When pausing, an optional\n * `pauseReason` is recorded. `PATCH /api/v1/purchases/:id`.\n */\n async setAutoPayment(\n id: string,\n autoPayment: boolean,\n opts: { pauseReason?: string } = {},\n ): Promise<{ autoPayment: boolean }> {\n return this.transport.request<{ autoPayment: boolean }>({\n method: \"PATCH\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}`,\n body: { autoPayment, pauseReason: opts.pauseReason },\n });\n }\n\n /** Cancel a purchase (voids any open invoice). `POST /api/v1/purchases/:id/cancel`. */\n async cancel(id: string): Promise<void> {\n await this.transport.request({\n method: \"POST\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}/cancel`,\n });\n }\n}\n","/**\n * Idempotency-key generation for usage signals.\n *\n * Every signal carries an idempotency key so that a retry — whether a\n * Transport-level replay of one send, or a re-flush of the buffered body — is\n * deduplicated on the server instead of recording a second, double-billed\n * event. The server keys `RawUsageLog` on `(organizationId, idempotencyKey)`\n * and replays the original result on a repeat.\n *\n * The key is generated ONCE, before the signal is buffered or sent, and the\n * same key rides every retry of that signal (see ARCHITECTURE AD-4). A caller\n * may instead supply their own key on the signal — a stable id for the logical\n * event — to also dedup across process restarts / at-least-once redelivery,\n * which an in-memory auto-generated key cannot survive.\n */\n\n/**\n * A fresh idempotency key. A UUID v4 when the runtime exposes Web Crypto\n * (Node ≥ 18, browsers, edge runtimes), with a non-cryptographic fallback for\n * exotic runtimes that lack it. The value is opaque to the server — only its\n * uniqueness matters, not its randomness quality.\n */\nexport function newKey(): string {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (typeof c?.randomUUID === \"function\") return c.randomUUID();\n // Fallback: an RFC-4122-shaped v4 from Math.random. Uniqueness (not security)\n // is all that's required for deduplication.\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n const v = ch === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import type { Transport } from \"../http.js\";\nimport type { Flusher } from \"../flusher.js\";\nimport { newKey } from \"../idempotency.js\";\nimport type {\n CreditInput,\n OutcomeInput,\n ResolvedConfig,\n SerializedUsageLog,\n Signal,\n TrackResult,\n UnitInput,\n UnitUsageList,\n UsageList,\n WalletInput,\n} from \"../types.js\";\n\n/** Builds the `POST /api/v1/usage` body from a typed Signal. */\nexport function signalToWire(signal: Signal): Record<string, unknown> {\n const body: Record<string, unknown> = {\n customerId: signal.customerId,\n type: signal.type,\n model: signal.model,\n };\n if (signal.member) body.member = signal.member;\n if (signal.custom) body.custom = signal.custom;\n\n // `tokens` is required, so input/output are always sent. `cacheTokens` is\n // optional — sent only when provided (the server defaults it to 0).\n const t = signal.tokens;\n body.inputTokens = t.input;\n body.outputTokens = t.output;\n if (t.cache != null) body.cacheTokens = t.cache;\n\n // credit + outcome both resolve their target via the stable `agentKey`.\n if (signal.type === \"credit\" || signal.type === \"outcome\") {\n body.agentKey = signal.agentKey;\n }\n // A caller-supplied idempotency key is forwarded verbatim; `track()` fills in\n // an auto-generated one when none was given.\n if (signal.idempotencyKey) body.idempotencyKey = signal.idempotencyKey;\n return body;\n}\n\n/**\n * The `signals` resource: record usage signals and read them back.\n *\n * In async mode (default), `track()` buffers the signal and returns immediately\n * with `{ queued: true }`. Pass `{ wait: true }` (or construct the client in\n * `sync` mode) to await the send and receive the computed `usageLog`.\n */\nexport class Signals {\n constructor(\n private readonly transport: Transport,\n private readonly flusher: Flusher,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n async track(\n signal: Signal,\n opts: { wait?: boolean } = {},\n ): Promise<TrackResult> {\n const body = signalToWire(signal);\n // Assign the idempotency key ONCE, here — before the signal is buffered or\n // sent — so the SAME key rides every retry (Transport-level replay AND a\n // re-flush of the buffered body). That is what makes a retried signal\n // dedup server-side instead of double-recording (see idempotency.ts, AD-4).\n if (body.idempotencyKey == null) body.idempotencyKey = newKey();\n\n const sendNow = opts.wait || this.cfg.mode === \"sync\";\n if (!sendNow) {\n this.flusher.enqueue({ body, signal });\n return { queued: true };\n }\n\n const res = await this.transport.request<{\n usageLog?: TrackResult[\"usageLog\"];\n }>({\n method: \"POST\",\n path: \"/api/v1/usage\",\n body,\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n return {\n queued: false,\n usageLog: res.usageLog ?? null,\n };\n }\n\n /**\n * Validate + price a signal WITHOUT recording it (server `dryRun`). Returns\n * the projected usage log so an integration can preflight before sending real\n * traffic — no inbox row, wallet / outcome writes, or webhooks fire.\n */\n async verify(signal: Signal): Promise<SerializedUsageLog | null> {\n const body = signalToWire(signal);\n body.dryRun = true;\n const res = await this.transport.request<{\n dryRun: boolean;\n usageLog: SerializedUsageLog | null;\n }>({\n method: \"POST\",\n path: \"/api/v1/usage\",\n body,\n // A dry run writes nothing, so it is always safe to retry.\n retry: true,\n });\n return res.usageLog ?? null;\n }\n\n /** Meter a named credit. */\n credit(input: CreditInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"credit\" }, opts);\n }\n\n /** Debit the customer's wallet at model cost. */\n wallet(input: WalletInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"wallet\" }, opts);\n }\n\n /** Advance one step of an outcome workflow. */\n outcome(\n input: OutcomeInput,\n opts?: { wait?: boolean },\n ): Promise<TrackResult> {\n return this.track({ ...input, type: \"outcome\" }, opts);\n }\n\n /** Recent usage logs + totals for a customer. `GET /api/v1/usage`. */\n async list(params: {\n customerId: string;\n limit?: number;\n }): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: \"/api/v1/usage\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\n }\n\n /**\n * Record one unit-metered event (a fixed-price meter with no tokens),\n * addressed to a catalog unit by its `agentKey`. Sent immediately — unit\n * events are not buffered. `POST /api/v1/units`.\n */\n async unit(input: UnitInput): Promise<{ unitUsage: Record<string, unknown> }> {\n return this.transport.request<{ unitUsage: Record<string, unknown> }>({\n method: \"POST\",\n path: \"/api/v1/units\",\n body: {\n customerId: input.customerId,\n agentKey: input.agentKey,\n ...(input.member ? { member: input.member } : {}),\n },\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n }\n\n /** A customer's unit balances + recent unit events. `GET /api/v1/units`. */\n unitUsage(params: {\n customerId: string;\n limit?: number;\n }): Promise<UnitUsageList> {\n return this.transport.request<UnitUsageList>({\n method: \"GET\",\n path: \"/api/v1/units\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateUnitInput,\n Unit,\n UnitDetail,\n UpdateUnitInput,\n} from \"../types.js\";\n\n/**\n * The `units` resource — manage the org's unit *types* (the catalog): named,\n * quantity-priced meters (FLAT / SLAB / VOLUME). Record consumption against a\n * unit with `signals.unit()`. `/api/v1/units-catalog`.\n */\nexport class Units {\n constructor(private readonly transport: Transport) {}\n\n /** List unit types. Pass `{ active: true }` to only return active ones. */\n async list(params: { active?: boolean } = {}): Promise<Unit[]> {\n const res = await this.transport.request<{ units: Unit[] }>({\n method: \"GET\",\n path: \"/api/v1/units-catalog\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.units;\n }\n\n /** Create a unit type. `POST /api/v1/units-catalog`. */\n async create(input: CreateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"POST\",\n path: \"/api/v1/units-catalog\",\n body: input,\n });\n return res.unit;\n }\n\n /** Fetch one unit type with stats. `GET /api/v1/units-catalog/:id`. */\n async get(id: string): Promise<UnitDetail> {\n const res = await this.transport.request<{ unit: UnitDetail }>({\n method: \"GET\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n });\n return res.unit;\n }\n\n /** Update a unit type's definition. `PATCH /api/v1/units-catalog/:id`. */\n async update(id: string, input: UpdateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.unit;\n }\n\n /** Activate or deactivate a unit type. */\n async setActive(id: string, isActive: boolean): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.unit;\n }\n\n /** Delete a unit type. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { ThresholdKind, UpsertWebhookInput, Webhook } from \"../types.js\";\n\n/**\n * The `webhooks` resource — threshold alerts. At most one webhook per kind\n * (CREDIT / OUTCOME / WALLET); posting a kind again upserts it. `/api/v1/webhooks`.\n */\nexport class Webhooks {\n constructor(private readonly transport: Transport) {}\n\n /** List configured webhooks. `GET /api/v1/webhooks`. */\n async list(): Promise<Webhook[]> {\n const res = await this.transport.request<{ webhooks: Webhook[] }>({\n method: \"GET\",\n path: \"/api/v1/webhooks\",\n });\n return res.webhooks;\n }\n\n /** Create or replace the webhook for a kind. `POST /api/v1/webhooks`. */\n async upsert(input: UpsertWebhookInput): Promise<Webhook> {\n const res = await this.transport.request<{ webhook: Webhook }>({\n method: \"POST\",\n path: \"/api/v1/webhooks\",\n body: input,\n });\n return res.webhook;\n }\n\n /** Delete the webhook for a kind (idempotent). `DELETE /api/v1/webhooks/:kind`. */\n async delete(kind: ThresholdKind): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/webhooks/${encodeURIComponent(kind)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { Model, WorkspaceIdentity } from \"../types.js\";\n\n/**\n * The `workspace` resource — read-only introspection of the org behind the API\n * key. Grounds an integration (which workspace, and is it `sandbox` or `live`?)\n * and lists the models it may meter against. `/api/v1/me`, `/api/v1/models`.\n */\nexport class Workspace {\n constructor(private readonly transport: Transport) {}\n\n /** Identify the org + key behind the request, incl. `sandbox` | `live`. */\n me(): Promise<WorkspaceIdentity> {\n return this.transport.request<WorkspaceIdentity>({\n method: \"GET\",\n path: \"/api/v1/me\",\n });\n }\n\n /** The org's enabled models with live prices. `{ active: true }` returns only\n * the models that can be metered right now. */\n async models(params: { active?: boolean } = {}): Promise<Model[]> {\n const res = await this.transport.request<{ models: Model[] }>({\n method: \"GET\",\n path: \"/api/v1/models\",\n query: {\n active: params.active === undefined ? undefined : String(params.active),\n },\n });\n return res.models;\n }\n}\n","import { resolveConfig } from \"./config.js\";\nimport { Flusher } from \"./flusher.js\";\nimport { Transport } from \"./http.js\";\nimport { Credits } from \"./resources/credits.js\";\nimport { Customers } from \"./resources/customers.js\";\nimport { Invoices } from \"./resources/invoices.js\";\nimport { Outcomes } from \"./resources/outcomes.js\";\nimport { Payments } from \"./resources/payments.js\";\nimport { Plans } from \"./resources/plans.js\";\nimport { Portal } from \"./resources/portal.js\";\nimport { Purchases } from \"./resources/purchases.js\";\nimport { Signals } from \"./resources/signals.js\";\nimport { Units } from \"./resources/units.js\";\nimport { Webhooks } from \"./resources/webhooks.js\";\nimport { Workspace } from \"./resources/workspace.js\";\nimport type { ClockNextConfig, ResolvedConfig } from \"./types.js\";\n\n/**\n * The ClockNext client.\n *\n * ```ts\n * const cnk = new ClockNext({ apiKey: process.env.CLOCKNEXT_API_KEY! });\n *\n * await cnk.signals.credit({\n * customerId: \"cus_123\",\n * model: \"gpt-4o\", // catalog model id\n * agentKey: \"api_credit\", // the credit's stable agent key\n * tokens: { input: 1200, output: 340 },\n * });\n *\n * // before a serverless function returns / on shutdown:\n * await cnk.flush();\n * ```\n */\nexport class ClockNext {\n /** Record + read usage signals (credit / wallet / outcome / unit). */\n readonly signals: Signals;\n /** Manage customers, their members, wallet, and balances. */\n readonly customers: Customers;\n /** Define and manage billing plans. */\n readonly plans: Plans;\n /** Subscribe customers to plans (purchases). */\n readonly purchases: Purchases;\n /** Read invoices and mint hosted pay links. */\n readonly invoices: Invoices;\n /** Read payments (paid invoices). */\n readonly payments: Payments;\n /** Manage the credit-type catalog. */\n readonly credits: Credits;\n /** Manage the outcome-type catalog. */\n readonly outcomes: Outcomes;\n /** Manage the unit-type catalog. */\n readonly units: Units;\n /** Configure threshold webhooks. */\n readonly webhooks: Webhooks;\n /** Mint customer-portal embed tokens. */\n readonly portal: Portal;\n /** Identify the workspace (sandbox/live) + list its models. `/me`, `/models`. */\n readonly workspace: Workspace;\n\n private readonly cfg: ResolvedConfig;\n private readonly flusher: Flusher;\n\n constructor(config: ClockNextConfig) {\n this.cfg = resolveConfig(config);\n\n if (typeof window !== \"undefined\") {\n this.cfg.logger.warn?.(\n \"[clocknext] Running in a browser exposes your secret API key. Use this SDK only on a server/backend.\",\n );\n }\n\n const transport = new Transport(this.cfg);\n this.flusher = new Flusher(transport, this.cfg);\n this.signals = new Signals(transport, this.flusher, this.cfg);\n this.customers = new Customers(transport);\n this.plans = new Plans(transport);\n this.purchases = new Purchases(transport);\n this.invoices = new Invoices(transport);\n this.payments = new Payments(transport);\n this.credits = new Credits(transport);\n this.outcomes = new Outcomes(transport);\n this.units = new Units(transport);\n this.webhooks = new Webhooks(transport);\n this.portal = new Portal(transport);\n this.workspace = new Workspace(transport);\n }\n\n /** Number of signals currently buffered (async mode). */\n get pending(): number {\n return this.flusher.size;\n }\n\n /** Force-send all buffered signals now. Await before a serverless return. */\n flush(): Promise<void> {\n return this.flusher.flush();\n }\n\n /** Flush and stop the background timer. Call on graceful shutdown. */\n close(): Promise<void> {\n return this.flusher.close();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/queue.ts","../src/flusher.ts","../src/errors.ts","../src/retry.ts","../src/http.ts","../src/resources/credits.ts","../src/resources/customers.ts","../src/resources/invoices.ts","../src/resources/outcomes.ts","../src/resources/payments.ts","../src/resources/plans.ts","../src/resources/portal.ts","../src/resources/purchases.ts","../src/idempotency.ts","../src/resources/signals.ts","../src/resources/units.ts","../src/resources/webhooks.ts","../src/resources/workspace.ts","../src/client.ts"],"names":["message"],"mappings":"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","file":"index.js","sourcesContent":["import type { ClockNextConfig, FetchLike, ResolvedConfig } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://payments.clocknext.com\";\n\n/** Use `value` only if it's a finite number `>= min`; otherwise fall back. */\nfunction num(value: number | undefined, fallback: number, min: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= min\n ? value\n : fallback;\n}\n\n/** Applies defaults and validates required config. */\nexport function resolveConfig(config: ClockNextConfig): ResolvedConfig {\n if (!config.apiKey || typeof config.apiKey !== \"string\") {\n throw new Error(\"ClockNext: `apiKey` is required.\");\n }\n\n const fetchImpl: FetchLike | undefined =\n config.fetch ??\n (typeof globalThis.fetch === \"function\"\n ? (globalThis.fetch.bind(globalThis) as FetchLike)\n : undefined);\n if (!fetchImpl) {\n throw new Error(\n \"ClockNext: no global `fetch` found. Use Node 18+, or pass a `fetch` implementation.\",\n );\n }\n\n return {\n apiKey: config.apiKey,\n baseUrl: (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\"),\n mode: config.mode ?? \"async\",\n timeoutMs: num(config.timeoutMs, 10_000, 1),\n batch: {\n maxSize: num(config.batch?.maxSize, 20, 1),\n maxIntervalMs: num(config.batch?.maxIntervalMs, 2000, 0),\n maxConcurrency: num(config.batch?.maxConcurrency, 5, 1),\n maxQueueSize: num(config.batch?.maxQueueSize, 10_000, 1),\n },\n retry: {\n maxAttempts: num(config.retry?.maxAttempts, 5, 1),\n baseDelayMs: num(config.retry?.baseDelayMs, 200, 0),\n maxDelayMs: num(config.retry?.maxDelayMs, 10_000, 0),\n },\n fetch: fetchImpl,\n logger: config.logger ?? {},\n onError: config.onError,\n onFlush: config.onFlush,\n onRetry: config.onRetry,\n onDrop: config.onDrop,\n };\n}\n","import type { Signal } from \"./types.js\";\n\n/** One buffered, wire-ready signal awaiting a background flush. */\nexport interface QueuedSignal {\n /** The exact JSON body to POST to /api/v1/usage. */\n body: Record<string, unknown>;\n /** The original signal — passed to onError/onDrop hooks. */\n signal: Signal;\n}\n\n/**\n * Internal buffer seam. Currently in-memory only — this interface exists so a\n * durable (disk/Redis/SQLite) implementation can be slotted in later without\n * touching the Flusher. It is NOT part of the public API and is not yet\n * injectable; don't rely on it externally.\n */\nexport interface QueueStore {\n push(item: QueuedSignal): void;\n /** Remove and return up to `n` items (FIFO). */\n take(n: number): QueuedSignal[];\n size(): number;\n}\n\nexport class InMemoryQueue implements QueueStore {\n private items: QueuedSignal[] = [];\n\n push(item: QueuedSignal): void {\n this.items.push(item);\n }\n\n take(n: number): QueuedSignal[] {\n return this.items.splice(0, n);\n }\n\n size(): number {\n return this.items.length;\n }\n}\n","import type { Transport } from \"./http.js\";\nimport { InMemoryQueue, type QueueStore, type QueuedSignal } from \"./queue.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/**\n * Background send engine for async-mode signals. Buffers wire-ready signals and\n * flushes them when the buffer reaches `maxSize` OR every `maxIntervalMs`,\n * whichever comes first — the Segment/Amberflo pattern. The Transport owns\n * retries; `close()` drains and awaits in-flight sends so a serverless process\n * can flush before it freezes.\n */\nexport class Flusher {\n private readonly queue: QueueStore = new InMemoryQueue();\n private timer: ReturnType<typeof setTimeout> | null = null;\n private draining: Promise<void> | null = null;\n private closed = false;\n\n constructor(\n private readonly transport: Transport,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n /** Buffer one signal. Drops (with onDrop) when closed or the queue is full. */\n enqueue(item: QueuedSignal): void {\n if (this.closed) {\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return;\n }\n if (this.queue.size() >= this.cfg.batch.maxQueueSize) {\n this.cfg.logger.warn?.(\"[clocknext] queue full — dropping signal\");\n this.cfg.onDrop?.(item.signal, \"queue_full\");\n return;\n }\n this.queue.push(item);\n if (this.queue.size() >= this.cfg.batch.maxSize) void this.flush();\n else this.arm();\n }\n\n /** Arm the interval timer if it isn't already running. */\n private arm(): void {\n if (this.timer || this.closed) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flush();\n }, this.cfg.batch.maxIntervalMs);\n // Don't keep the event loop alive just for the flush timer.\n (this.timer as { unref?: () => void }).unref?.();\n }\n\n /**\n * Send everything currently buffered. Overlapping calls share the single\n * in-progress drain, so total in-flight sends never exceed `maxConcurrency`.\n */\n flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (!this.draining) {\n this.draining = this.drain().finally(() => {\n this.draining = null;\n });\n }\n return this.draining;\n }\n\n /** Drain the buffer in concurrency-bounded waves until it's empty. */\n private async drain(): Promise<void> {\n let sent = 0;\n while (this.queue.size() > 0) {\n const wave = this.queue.take(this.cfg.batch.maxConcurrency);\n const results = await Promise.all(wave.map((item) => this.send(item)));\n sent += results.filter(Boolean).length;\n }\n if (sent > 0) this.cfg.onFlush?.(sent);\n }\n\n /** Send one item; never throws — failures surface via onError/onDrop. */\n private async send(item: QueuedSignal): Promise<boolean> {\n try {\n await this.transport.request({\n method: \"POST\",\n path: \"/api/v1/usage\",\n body: item.body,\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n return true;\n } catch (error) {\n this.cfg.onError?.(error, item.signal);\n this.cfg.onDrop?.(item.signal, \"send_failed\");\n return false;\n }\n }\n\n get size(): number {\n return this.queue.size();\n }\n\n /** Flush remaining signals, then refuse further enqueues. */\n async close(): Promise<void> {\n this.closed = true;\n await this.flush();\n }\n}\n","/**\n * Typed error hierarchy. The server returns `{ ok: false, error }` with a\n * meaningful HTTP status; we map that status to a class so callers can branch\n * on the *kind* of failure (e.g. allowance exhausted ⇒ upsell; network ⇒ ignore,\n * it's queued) rather than string-matching messages.\n */\n\nexport class ClockNextError extends Error {\n /** HTTP status, when the failure came from a server response. */\n readonly status?: number;\n /** Whether the SDK considers this failure worth retrying. */\n readonly retryable: boolean;\n\n constructor(\n message: string,\n opts: { status?: number; retryable?: boolean } = {},\n ) {\n super(message);\n this.name = new.target.name;\n this.status = opts.status;\n this.retryable = opts.retryable ?? false;\n // Restore prototype chain for instanceof across transpile targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 — missing / invalid / expired API key. */\nexport class AuthError extends ClockNextError {}\n\n/** 400 — malformed request / schema validation failure. */\nexport class ValidationError extends ClockNextError {}\n\n/** 404 — unknown customer (also returned for cross-org access). */\nexport class NotFoundError extends ClockNextError {}\n\n/** 422 — no active plan, meter not in plan, model not enabled, member missing. */\nexport class PlanError extends ClockNextError {}\n\n/** 422 — insufficient credits / units / outcomes for the call. */\nexport class AllowanceError extends ClockNextError {}\n\n/** 409 — conflict. */\nexport class ConflictError extends ClockNextError {}\n\n/** 429 — rate limited. */\nexport class RateLimitError extends ClockNextError {\n readonly retryAfterMs?: number;\n constructor(message: string, opts: { retryAfterMs?: number } = {}) {\n super(message, { status: 429, retryable: true });\n this.retryAfterMs = opts.retryAfterMs;\n }\n}\n\n/** 5xx — server-side error. */\nexport class ServerError extends ClockNextError {}\n\n/** fetch threw / request timed out — request never completed. */\nexport class NetworkError extends ClockNextError {\n constructor(message: string) {\n super(message, { retryable: true });\n }\n}\n\n/**\n * Maps a server response (status + parsed `error` message) to a typed error.\n * 422 is split into AllowanceError vs PlanError by sniffing the message, since\n * the server uses the same status for both.\n */\nexport function errorFromResponse(\n status: number,\n message: string,\n retryAfterMs?: number,\n): ClockNextError {\n const msg = message || `Request failed with status ${status}.`;\n const opts = { status };\n\n if (status === 400) return new ValidationError(msg, opts);\n if (status === 401) return new AuthError(msg, opts);\n if (status === 404) return new NotFoundError(msg, opts);\n // 408 Request Timeout — transient; the request never produced a result, so\n // a retry is safe.\n if (status === 408) return new ClockNextError(msg, { ...opts, retryable: true });\n if (status === 409) return new ConflictError(msg, { ...opts, retryable: true });\n if (status === 422) {\n return /insufficient/i.test(msg)\n ? new AllowanceError(msg, opts)\n : new PlanError(msg, opts);\n }\n if (status === 429) return new RateLimitError(msg, { retryAfterMs });\n if (status >= 500) return new ServerError(msg, { ...opts, retryable: true });\n return new ClockNextError(msg, opts);\n}\n","import { ClockNextError } from \"./errors.js\";\n\n/**\n * Retry classification + backoff. Mirrors the convergent industry policy\n * (Stripe / Stainless clients): retry transient transport failures\n * (network, timeout, 408/409/429/5xx); never retry deterministic 4xx\n * (400/401/404 and 422 validation/plan/allowance). Exponential backoff with\n * equal jitter, honoring a server `Retry-After`. The Transport additionally\n * gates retries by request safety (GET/DELETE, or a write that explicitly\n * opts in).\n */\n\n/** Whether an error should be retried. NetworkError/Server/RateLimit/Conflict\n * carry `retryable: true`; everything else is permanent. */\nexport function isRetryable(error: unknown): boolean {\n return error instanceof ClockNextError && error.retryable;\n}\n\n/** Parses `Retry-After` (seconds or HTTP-date) and `retry-after-ms` headers. */\nexport function parseRetryAfter(headers: Headers): number | undefined {\n const ms = headers.get(\"retry-after-ms\");\n if (ms) {\n const n = Number(ms);\n if (Number.isFinite(n) && n >= 0) return n;\n }\n const ra = headers.get(\"retry-after\");\n if (ra) {\n const secs = Number(ra);\n if (Number.isFinite(secs)) return Math.max(0, secs * 1000);\n const date = Date.parse(ra);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n }\n return undefined;\n}\n\n/**\n * Backoff for a given attempt (1-based). Exponential `base * 2^(attempt-1)`,\n * capped at `maxDelayMs`, with equal jitter (×[0.5, 1.0]). A server-provided\n * `retryAfterMs` overrides the computed value.\n */\nexport function computeBackoff(\n attempt: number,\n opts: { baseDelayMs: number; maxDelayMs: number },\n retryAfterMs?: number,\n rand: () => number = Math.random,\n): number {\n if (retryAfterMs != null) return Math.min(retryAfterMs, opts.maxDelayMs);\n const raw = opts.baseDelayMs * Math.pow(2, Math.max(0, attempt - 1));\n const capped = Math.min(raw, opts.maxDelayMs);\n // Equal jitter: a random point in [0.5, 1.0] of the capped delay.\n return Math.round(capped * (0.5 + rand() * 0.5));\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { NetworkError, RateLimitError, errorFromResponse } from \"./errors.js\";\nimport { computeBackoff, isRetryable, parseRetryAfter, sleep } from \"./retry.js\";\nimport type { ResolvedConfig } from \"./types.js\";\n\n/**\n * Injected from package.json at build time (see tsup `define`) so it can't\n * drift. Falls back to a dev marker when run un-bundled (tests, ts-node).\n */\ndeclare const __SDK_VERSION__: string | undefined;\nconst SDK_VERSION =\n typeof __SDK_VERSION__ !== \"undefined\" ? __SDK_VERSION__ : \"0.0.0-dev\";\n\ninterface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\";\n path: string;\n query?: Record<string, string | number | undefined>;\n body?: unknown;\n /**\n * Whether this call may be auto-retried on a transient failure. Defaults to\n * method-based safety: reads (GET), idempotent replaces (PUT), and DELETE are\n * replay-safe. Non-idempotent writes (POST/PATCH) default to NOT retried so a\n * transient failure can't duplicate the write; callers that tolerate a retry\n * opt in explicitly.\n */\n retry?: boolean;\n}\n\n/**\n * The single HTTP seam. Builds the authenticated request, enforces a timeout,\n * unwraps the `{ ok, ... }` envelope, maps failures to typed errors, and retries\n * transient ones with backoff + jitter.\n */\nexport class Transport {\n constructor(private readonly cfg: ResolvedConfig) {}\n\n async request<T = unknown>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n // Reads, idempotent PUT replaces, and DELETE are replay-safe by default;\n // non-idempotent writes are retried only when the caller opts in (e.g.\n // best-effort metering signals).\n const replaySafe =\n opts.method === \"GET\" ||\n opts.method === \"PUT\" ||\n opts.method === \"DELETE\";\n const allowRetry = opts.retry ?? replaySafe;\n const maxAttempts = allowRetry ? this.cfg.retry.maxAttempts : 1;\n\n let attempt = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n attempt++;\n try {\n return await this.once<T>(url, opts);\n } catch (error) {\n const canRetry = attempt < maxAttempts && isRetryable(error);\n if (!canRetry) throw error;\n const retryAfterMs =\n error instanceof RateLimitError ? error.retryAfterMs : undefined;\n const delayMs = computeBackoff(attempt, this.cfg.retry, retryAfterMs);\n this.cfg.onRetry?.({ attempt, delayMs, error });\n this.cfg.logger.debug?.(\n `[clocknext] retry ${attempt}/${maxAttempts - 1} in ${delayMs}ms`,\n error instanceof Error ? error.message : error,\n );\n await sleep(delayMs);\n }\n }\n }\n\n /** One attempt: fetch + timeout + envelope/status handling. */\n private async once<T>(url: string, opts: RequestOptions): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.cfg.timeoutMs);\n\n let res: Response;\n try {\n res = await this.cfg.fetch(url, {\n method: opts.method,\n headers: this.headers(opts),\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n signal: controller.signal,\n });\n } catch (err) {\n const message =\n controller.signal.aborted\n ? `Request to ${opts.path} timed out after ${this.cfg.timeoutMs}ms.`\n : `Network error calling ${opts.path}: ${\n err instanceof Error ? err.message : String(err)\n }`;\n throw new NetworkError(message);\n } finally {\n clearTimeout(timer);\n }\n\n const text = await res.text();\n let json: unknown = undefined;\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n // Non-JSON body — only an error if the status is also bad.\n }\n }\n\n // Two envelope shapes coexist during the v1 migration:\n // new: { statusCode, statusDetail: { status, message }, result }\n // old: { ok: boolean, error?, ...payload }\n const obj = (json ?? {}) as Record<string, unknown>;\n const isNew = typeof obj === \"object\" && obj !== null && \"statusDetail\" in obj;\n\n if (isNew) {\n const detail = obj.statusDetail as\n | { status?: string; message?: string }\n | undefined;\n if (res.ok && detail?.status === \"SUCCESS\") {\n return ((obj.result as T | undefined) ?? ({} as T));\n }\n const message =\n detail?.message ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(res.status, message, parseRetryAfter(res.headers));\n }\n\n // Old envelope.\n const envelope = obj as { ok?: boolean; error?: string };\n if (res.ok && envelope.ok !== false) {\n return envelope as T;\n }\n const message =\n envelope.error ?? text ?? `Request failed with status ${res.status}.`;\n throw errorFromResponse(res.status, message, parseRetryAfter(res.headers));\n }\n\n private headers(opts: RequestOptions): Record<string, string> {\n const h: Record<string, string> = {\n Authorization: `Bearer ${this.cfg.apiKey}`,\n \"User-Agent\": `clocknext-sdk-js/${SDK_VERSION}`,\n };\n if (opts.body !== undefined) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | undefined>,\n ): string {\n // baseUrl already has trailing slashes stripped in resolveConfig.\n let url = `${this.cfg.baseUrl}${path}`;\n if (query) {\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== \"\") params.set(k, String(v));\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n }\n return url;\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateCreditInput,\n Credit,\n CreditDetail,\n UpdateCreditInput,\n} from \"../types.js\";\n\n/**\n * The `credits` resource — manage the org's credit *types* (the catalog). A\n * credit's stable `agentKey` is what you pass to `signals.credit()` when\n * recording usage against it. `/api/v1/credits`.\n */\nexport class Credits {\n constructor(private readonly transport: Transport) {}\n\n /** List credit types. Pass `{ active: true }` to only return active ones. */\n async list(params: { active?: boolean } = {}): Promise<Credit[]> {\n const res = await this.transport.request<{ credits: Credit[] }>({\n method: \"GET\",\n path: \"/api/v1/credits\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.credits;\n }\n\n /** Create a credit type; returns the created credit. `POST /api/v1/credits`. */\n async create(input: CreateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"POST\",\n path: \"/api/v1/credits\",\n body: input,\n });\n return res.credit;\n }\n\n /** Fetch one credit type with usage stats. `GET /api/v1/credits/:id`. */\n async get(id: string): Promise<CreditDetail> {\n const res = await this.transport.request<{ credit: CreditDetail }>({\n method: \"GET\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n return res.credit;\n }\n\n /** Update a credit type's definition; returns the updated credit. `PATCH /api/v1/credits/:id`. */\n async update(id: string, input: UpdateCreditInput): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.credit;\n }\n\n /** Activate or deactivate a credit type. */\n async setActive(id: string, isActive: boolean): Promise<Credit> {\n const res = await this.transport.request<{ credit: Credit }>({\n method: \"PATCH\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.credit;\n }\n\n /** Delete a credit type. Refused while a customer is linked to it. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/credits/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n AddMemberInput,\n ApiCustomer,\n CreateCustomerInput,\n CreditAdjustInput,\n CreditBalance,\n CustomerBalances,\n CustomerList,\n CustomerPlan,\n CustomerProfileInput,\n Member,\n OutcomeAdjustInput,\n OutcomeBalance,\n UnitAdjustInput,\n UnitBalance,\n UpdateMemberInput,\n UsageList,\n WalletEntryInput,\n WalletList,\n WalletTransaction,\n} from \"../types.js\";\n\n/**\n * The `customers` resource — full CRUD over the org's customers plus the\n * read-only insight endpoints (usage / balances / plan). Every call is scoped\n * to the API key's organisation server-side; a customer in another org\n * resolves as a NotFoundError.\n */\nexport class Customers {\n constructor(private readonly transport: Transport) {}\n\n /** Create a customer. `POST /api/v1/customers`. */\n async create(input: CreateCustomerInput): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"POST\",\n path: \"/api/v1/customers\",\n body: input,\n });\n return res.customer;\n }\n\n /** List customers, most-recent first (cursor-paginated). `GET /api/v1/customers`. */\n async list(params: {\n limit?: number;\n q?: string;\n cursor?: string;\n } = {}): Promise<CustomerList> {\n const res = await this.transport.request<CustomerList & { ok: true }>({\n method: \"GET\",\n path: \"/api/v1/customers\",\n query: { limit: params.limit, q: params.q, cursor: params.cursor },\n });\n return { customers: res.customers, nextCursor: res.nextCursor };\n }\n\n /**\n * Async iterator over ALL customers, transparently following the cursor.\n * `for await (const c of cnk.customers.iterate()) { … }`\n */\n async *iterate(params: { limit?: number; q?: string } = {}): AsyncGenerator<\n ApiCustomer\n > {\n let cursor: string | undefined;\n do {\n const page = await this.list({ ...params, cursor });\n for (const c of page.customers) yield c;\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n }\n\n /** Fetch one customer. `GET /api/v1/customers/:id`. */\n async get(id: string): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n return res.customer;\n }\n\n /** Update a customer (partial). `PATCH /api/v1/customers/:id`. */\n async update(\n id: string,\n input: CustomerProfileInput,\n ): Promise<ApiCustomer> {\n const res = await this.transport.request<{ customer: ApiCustomer }>({\n method: \"PATCH\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.customer;\n }\n\n /** Delete a customer (members, invitations, usage logs cascade). */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/customers/${encodeURIComponent(id)}`,\n });\n }\n\n /** A customer's usage history. `GET /api/v1/usage?customerId=`. */\n async usage(id: string, params: { limit?: number } = {}): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: `/api/v1/usage`,\n query: { customerId: id, limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\n }\n\n /** Wallet / credit / outcome / unit balances. `GET …/:id/balances`. */\n balances(id: string): Promise<CustomerBalances> {\n return this.transport.request<CustomerBalances>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/balances`,\n });\n }\n\n /**\n * One credit balance for a customer, matched by `creditId` or `creditName`;\n * `null` when the customer has no plan or no matching credit. Convenience\n * over `balances()` + `Array.find` — it fetches the FULL balances under the\n * hood (there is no server-side scoped read), so prefer `balances()` when you\n * need several rows from the same customer.\n */\n async creditBalance(\n customerId: string,\n match: { creditId?: string; creditName?: string },\n ): Promise<CreditBalance | null> {\n const { credits } = await this.balances(customerId);\n return (\n credits.find(\n (c) =>\n (match.creditId != null && c.creditId === match.creditId) ||\n (match.creditName != null && c.creditName === match.creditName),\n ) ?? null\n );\n }\n\n /** One outcome balance for a customer, matched by `outcomeId` or\n * `outcomeName`; `null` when absent. See {@link creditBalance} for the\n * fetch-then-filter caveat. */\n async outcomeBalance(\n customerId: string,\n match: { outcomeId?: string; outcomeName?: string },\n ): Promise<OutcomeBalance | null> {\n const { outcomes } = await this.balances(customerId);\n return (\n outcomes.find(\n (o) =>\n (match.outcomeId != null && o.outcomeId === match.outcomeId) ||\n (match.outcomeName != null && o.outcomeName === match.outcomeName),\n ) ?? null\n );\n }\n\n /** One unit balance for a customer, matched by `unitId` or `unitName`;\n * `null` when absent. See {@link creditBalance} for the fetch-then-filter\n * caveat. */\n async unitBalance(\n customerId: string,\n match: { unitId?: string; unitName?: string },\n ): Promise<UnitBalance | null> {\n const { units } = await this.balances(customerId);\n return (\n units.find(\n (u) =>\n (match.unitId != null && u.unitId === match.unitId) ||\n (match.unitName != null && u.unitName === match.unitName),\n ) ?? null\n );\n }\n\n /** The customer's current plan. `GET …/:id/plan`. */\n plan(id: string): Promise<CustomerPlan> {\n return this.transport.request<CustomerPlan>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/plan`,\n });\n }\n\n // --- Members -------------------------------------------------------------\n\n /** List a customer's members. `GET …/:id/members`. */\n async listMembers(id: string): Promise<Member[]> {\n const res = await this.transport.request<{ members: Member[] }>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members`,\n });\n return res.members;\n }\n\n /** Add a member to a customer. Duplicate `employeeId` → ConflictError. */\n async addMember(id: string, input: AddMemberInput): Promise<Member> {\n const res = await this.transport.request<{ member: Member }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members`,\n body: input,\n });\n return res.member;\n }\n\n /** Update a member's profile (role is fixed). `PATCH …/:id/members/:memberId`. */\n async updateMember(\n id: string,\n memberId: string,\n input: UpdateMemberInput,\n ): Promise<Member> {\n const res = await this.transport.request<{ member: Member }>({\n method: \"PATCH\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n body: input,\n });\n return res.member;\n }\n\n /** Remove a member from a customer. `DELETE …/:id/members/:memberId`. */\n async removeMember(id: string, memberId: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n });\n }\n\n // --- Wallet & billing config --------------------------------------------\n\n /** The customer's wallet balance + transactions. `GET …/:id/wallet`. */\n wallet(id: string, params: { limit?: number } = {}): Promise<WalletList> {\n return this.transport.request<WalletList>({\n method: \"GET\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/wallet`,\n query: { limit: params.limit },\n });\n }\n\n /**\n * Record a manual wallet entry (top-up or deduction). `amount` is always\n * positive; the sign comes from `type`. `POST …/:id/wallet`.\n */\n async addWalletEntry(\n id: string,\n input: WalletEntryInput,\n ): Promise<{ transaction: WalletTransaction; balanceUsd: number }> {\n return this.transport.request<{\n transaction: WalletTransaction;\n balanceUsd: number;\n }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/wallet`,\n body: input,\n });\n }\n\n // Note: a customer's currency is set through `update(id, { currencyCode })`\n // (PATCH …/:id) — there is no separate currency endpoint. Credit-type\n // assignment has no public API.\n\n // --- Balance adjustments -------------------------------------------------\n\n /** Grant or claw back a credit balance. `POST …/:id/credits/adjust`. */\n async adjustCredit(id: string, input: CreditAdjustInput): Promise<void> {\n await this.transport.request({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/credits/adjust`,\n body: input,\n });\n }\n\n /** Grant or claw back an outcome balance. Returns the remaining balance. */\n async adjustOutcome(\n id: string,\n input: OutcomeAdjustInput,\n ): Promise<{ remaining: number }> {\n const res = await this.transport.request<{ remaining: number }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/outcomes/adjust`,\n body: input,\n });\n return { remaining: res.remaining };\n }\n\n /** Grant or claw back a unit balance. Returns the remaining balance. */\n async adjustUnit(\n id: string,\n input: UnitAdjustInput,\n ): Promise<{ remaining: number }> {\n const res = await this.transport.request<{ remaining: number }>({\n method: \"POST\",\n path: `/api/v1/customers/${encodeURIComponent(id)}/units/adjust`,\n body: input,\n });\n return { remaining: res.remaining };\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n InvoiceDetail,\n InvoiceListRow,\n InvoiceStatus,\n PayLink,\n} from \"../types.js\";\n\n/**\n * The `invoices` resource — read-only. Invoices are generated by the billing\n * engine from purchases; you list them, read one, or mint a hosted pay link for\n * an OPEN invoice. `/api/v1/invoices`.\n */\nexport class Invoices {\n constructor(private readonly transport: Transport) {}\n\n /** List invoices, most-recent first. Filter by customer and/or status. */\n async list(\n params: { customerId?: string; status?: InvoiceStatus; limit?: number } = {},\n ): Promise<InvoiceListRow[]> {\n const res = await this.transport.request<{ invoices: InvoiceListRow[] }>({\n method: \"GET\",\n path: \"/api/v1/invoices\",\n query: {\n customerId: params.customerId,\n status: params.status,\n limit: params.limit,\n },\n });\n return res.invoices;\n }\n\n /** Fetch one full invoice + its plan snapshot. `GET /api/v1/invoices/:id`. */\n get(id: string): Promise<InvoiceDetail> {\n return this.transport.request<InvoiceDetail>({\n method: \"GET\",\n path: `/api/v1/invoices/${encodeURIComponent(id)}`,\n });\n }\n\n /**\n * Mint a hosted pay link for an OPEN invoice. PAID/VOID invoices are rejected\n * with a `ConflictError`. `GET /api/v1/invoices/:id/pay-link`.\n */\n payLink(id: string): Promise<PayLink> {\n return this.transport.request<PayLink>({\n method: \"GET\",\n path: `/api/v1/invoices/${encodeURIComponent(id)}/pay-link`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateOutcomeInput,\n Outcome,\n OutcomeDetail,\n UpdateOutcomeInput,\n} from \"../types.js\";\n\n/**\n * The `outcomes` resource — manage the org's outcome *types* (the catalog). An\n * outcome is a multi-step workflow; each step has a stable `agentKey` you pass\n * to `signals.outcome()`. `/api/v1/outcomes`.\n */\nexport class Outcomes {\n constructor(private readonly transport: Transport) {}\n\n /** List outcome types. Pass `{ active: true }` to only return active ones. */\n async list(params: { active?: boolean } = {}): Promise<Outcome[]> {\n const res = await this.transport.request<{ outcomes: Outcome[] }>({\n method: \"GET\",\n path: \"/api/v1/outcomes\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.outcomes;\n }\n\n /** Create an outcome type with its steps. `POST /api/v1/outcomes`. */\n async create(input: CreateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"POST\",\n path: \"/api/v1/outcomes\",\n body: input,\n });\n return res.outcome;\n }\n\n /** Fetch one outcome type with steps + stats. `GET /api/v1/outcomes/:id`. */\n async get(id: string): Promise<OutcomeDetail> {\n const res = await this.transport.request<{ outcome: OutcomeDetail }>({\n method: \"GET\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\n return res.outcome;\n }\n\n /** Update an outcome type's definition. `PATCH /api/v1/outcomes/:id`. */\n async update(id: string, input: UpdateOutcomeInput): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.outcome;\n }\n\n /** Activate or deactivate an outcome type; returns the updated outcome. */\n async setActive(id: string, isActive: boolean): Promise<Outcome> {\n const res = await this.transport.request<{ outcome: Outcome }>({\n method: \"PATCH\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.outcome;\n }\n\n /** Delete an outcome type. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/outcomes/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { PaymentDetail, PaymentRow } from \"../types.js\";\n\n/**\n * The `payments` resource — read-only. A payment is a PAID invoice; the `id`\n * used here is that underlying invoice id. `/api/v1/payments`.\n */\nexport class Payments {\n constructor(private readonly transport: Transport) {}\n\n /** List payments (paid invoices), most-recent first. Filter by customer. */\n async list(\n params: { customerId?: string; limit?: number } = {},\n ): Promise<PaymentRow[]> {\n const res = await this.transport.request<{ payments: PaymentRow[] }>({\n method: \"GET\",\n path: \"/api/v1/payments\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n return res.payments;\n }\n\n /** Fetch one payment + its plan snapshot. `GET /api/v1/payments/:id`. */\n get(id: string): Promise<PaymentDetail> {\n return this.transport.request<PaymentDetail>({\n method: \"GET\",\n path: `/api/v1/payments/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreatePlanInput,\n Plan,\n PlanDetail,\n UpdatePlanInput,\n} from \"../types.js\";\n\n/**\n * The `plans` resource — define and manage the billing plans customers\n * subscribe to. Each plan is a set of entitlement components (wallet / credit /\n * outcome / unit / flat) billed on a cycle. `/api/v1/plans`.\n */\nexport class Plans {\n constructor(private readonly transport: Transport) {}\n\n /** List plans, oldest-first. Pass `{ active: true }` to only return active plans. */\n async list(params: { active?: boolean } = {}): Promise<Plan[]> {\n const res = await this.transport.request<{ plans: Plan[] }>({\n method: \"GET\",\n path: \"/api/v1/plans\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.plans;\n }\n\n /** Create a plan. `POST /api/v1/plans`. */\n async create(input: CreatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"POST\",\n path: \"/api/v1/plans\",\n body: input,\n });\n return res.plan;\n }\n\n /** Fetch one plan with aggregate subscriber/invoice stats. `GET /api/v1/plans/:id`. */\n async get(id: string): Promise<PlanDetail> {\n const res = await this.transport.request<{ plan: PlanDetail }>({\n method: \"GET\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\n return res.plan;\n }\n\n /** Replace a plan's definition (components + settings). `PATCH /api/v1/plans/:id`. */\n async update(id: string, input: UpdatePlanInput): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.plan;\n }\n\n /** Activate or deactivate a plan without rewriting it. */\n async setActive(id: string, isActive: boolean): Promise<Plan> {\n const res = await this.transport.request<{ plan: Plan }>({\n method: \"PATCH\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.plan;\n }\n\n /** Delete a plan. Refused once any customer has purchased it. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/plans/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { PortalToken, PortalTokenInput } from \"../types.js\";\n\n/**\n * The `portal` resource — mint a short-lived embed token for one of your\n * customers, then render `<iframe src=\".../portal/embed?token=<token>\">`. The\n * HS256 signing secret never leaves ClockNext; your backend only needs its API\n * key. `POST /api/v1/portal/token`.\n */\nexport class Portal {\n constructor(private readonly transport: Transport) {}\n\n async createToken(input: PortalTokenInput): Promise<PortalToken> {\n const res = await this.transport.request<\n { token: string; expiresAt: number; expiresIn: number }\n >({\n method: \"POST\",\n path: \"/api/v1/portal/token\",\n body: {\n customerId: input.customerId,\n ttlSeconds: input.ttlSeconds,\n memberEmail: input.memberEmail,\n },\n });\n return {\n token: res.token,\n expiresAt: res.expiresAt,\n expiresIn: res.expiresIn,\n };\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreatePurchaseInput,\n Purchase,\n PurchaseDetail,\n PurchaseStatus,\n} from \"../types.js\";\n\n/**\n * The `purchases` resource — a purchase is a customer's subscription to a plan.\n * Creating one auto-cancels the customer's existing scheduled/active purchase\n * (this is also how you \"change plan\"). `/api/v1/purchases`.\n */\nexport class Purchases {\n constructor(private readonly transport: Transport) {}\n\n /** List purchases, most-recent first. Filter by customer and/or status. */\n async list(\n params: { customerId?: string; status?: PurchaseStatus; limit?: number } = {},\n ): Promise<Purchase[]> {\n const res = await this.transport.request<{ purchases: Purchase[] }>({\n method: \"GET\",\n path: \"/api/v1/purchases\",\n query: {\n customerId: params.customerId,\n status: params.status,\n limit: params.limit,\n },\n });\n return res.purchases;\n }\n\n /** Subscribe a customer to a plan. `POST /api/v1/purchases`. */\n async create(input: CreatePurchaseInput): Promise<Purchase> {\n const res = await this.transport.request<{ purchase: Purchase }>({\n method: \"POST\",\n path: \"/api/v1/purchases\",\n body: input,\n });\n return res.purchase;\n }\n\n /** Fetch one purchase. `GET /api/v1/purchases/:id`. */\n async get(id: string): Promise<PurchaseDetail> {\n const res = await this.transport.request<{ purchase: PurchaseDetail }>({\n method: \"GET\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}`,\n });\n return res.purchase;\n }\n\n /**\n * Turn automatic billing on or off for a purchase. When pausing, an optional\n * `pauseReason` is recorded. `PATCH /api/v1/purchases/:id`.\n */\n async setAutoPayment(\n id: string,\n autoPayment: boolean,\n opts: { pauseReason?: string } = {},\n ): Promise<{ autoPayment: boolean }> {\n return this.transport.request<{ autoPayment: boolean }>({\n method: \"PATCH\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}`,\n body: { autoPayment, pauseReason: opts.pauseReason },\n });\n }\n\n /** Cancel a purchase (voids any open invoice). `POST /api/v1/purchases/:id/cancel`. */\n async cancel(id: string): Promise<void> {\n await this.transport.request({\n method: \"POST\",\n path: `/api/v1/purchases/${encodeURIComponent(id)}/cancel`,\n });\n }\n}\n","/**\n * Idempotency-key generation for usage signals.\n *\n * Every signal carries an idempotency key so that a retry — whether a\n * Transport-level replay of one send, or a re-flush of the buffered body — is\n * deduplicated on the server instead of recording a second, double-billed\n * event. The server keys `RawUsageLog` on `(organizationId, idempotencyKey)`\n * and replays the original result on a repeat.\n *\n * The key is generated ONCE, before the signal is buffered or sent, and the\n * same key rides every retry of that signal (see ARCHITECTURE AD-4). A caller\n * may instead supply their own key on the signal — a stable id for the logical\n * event — to also dedup across process restarts / at-least-once redelivery,\n * which an in-memory auto-generated key cannot survive.\n */\n\n/**\n * A fresh idempotency key. A UUID v4 when the runtime exposes Web Crypto\n * (Node ≥ 18, browsers, edge runtimes), with a non-cryptographic fallback for\n * exotic runtimes that lack it. The value is opaque to the server — only its\n * uniqueness matters, not its randomness quality.\n */\nexport function newKey(): string {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (typeof c?.randomUUID === \"function\") return c.randomUUID();\n // Fallback: an RFC-4122-shaped v4 from Math.random. Uniqueness (not security)\n // is all that's required for deduplication.\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n const v = ch === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import type { Transport } from \"../http.js\";\nimport type { Flusher } from \"../flusher.js\";\nimport { newKey } from \"../idempotency.js\";\nimport type {\n CreditInput,\n OutcomeInput,\n ResolvedConfig,\n SerializedUnitUsage,\n SerializedUsageLog,\n Signal,\n TrackResult,\n UnitInput,\n UnitUsageList,\n UsageList,\n WalletInput,\n} from \"../types.js\";\n\n/** Builds the `POST /api/v1/usage` body from a typed Signal. */\nexport function signalToWire(signal: Signal): Record<string, unknown> {\n const body: Record<string, unknown> = {\n customerId: signal.customerId,\n type: signal.type,\n model: signal.model,\n };\n if (signal.member) body.member = signal.member;\n if (signal.custom) body.custom = signal.custom;\n\n // `tokens` is required, so input/output are always sent. `cacheTokens` is\n // optional — sent only when provided (the server defaults it to 0).\n const t = signal.tokens;\n body.inputTokens = t.input;\n body.outputTokens = t.output;\n if (t.cache != null) body.cacheTokens = t.cache;\n\n // credit + outcome both resolve their target via the stable `agentKey`.\n if (signal.type === \"credit\" || signal.type === \"outcome\") {\n body.agentKey = signal.agentKey;\n }\n // A caller-supplied idempotency key is forwarded verbatim; `track()` fills in\n // an auto-generated one when none was given.\n if (signal.idempotencyKey) body.idempotencyKey = signal.idempotencyKey;\n return body;\n}\n\n/**\n * The `signals` resource: record usage signals and read them back.\n *\n * In async mode (default), `track()` buffers the signal and returns immediately\n * with `{ queued: true }`. Pass `{ wait: true }` (or construct the client in\n * `sync` mode) to await the send and receive the computed `usageLog`.\n */\nexport class Signals {\n constructor(\n private readonly transport: Transport,\n private readonly flusher: Flusher,\n private readonly cfg: ResolvedConfig,\n ) {}\n\n async track(\n signal: Signal,\n opts: { wait?: boolean } = {},\n ): Promise<TrackResult> {\n const body = signalToWire(signal);\n // Assign the idempotency key ONCE, here — before the signal is buffered or\n // sent — so the SAME key rides every retry (Transport-level replay AND a\n // re-flush of the buffered body). That is what makes a retried signal\n // dedup server-side instead of double-recording (see idempotency.ts, AD-4).\n if (body.idempotencyKey == null) body.idempotencyKey = newKey();\n\n const sendNow = opts.wait || this.cfg.mode === \"sync\";\n if (!sendNow) {\n this.flusher.enqueue({ body, signal });\n return { queued: true };\n }\n\n const res = await this.transport.request<{\n usageLog?: TrackResult[\"usageLog\"];\n }>({\n method: \"POST\",\n path: \"/api/v1/usage\",\n body,\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n return {\n queued: false,\n usageLog: res.usageLog ?? null,\n };\n }\n\n /**\n * Validate + price a signal WITHOUT recording it (server `dryRun`). Returns\n * the projected usage log so an integration can preflight before sending real\n * traffic — no inbox row, wallet / outcome writes, or webhooks fire.\n */\n async verify(signal: Signal): Promise<SerializedUsageLog | null> {\n const body = signalToWire(signal);\n body.dryRun = true;\n const res = await this.transport.request<{\n dryRun: boolean;\n usageLog: SerializedUsageLog | null;\n }>({\n method: \"POST\",\n path: \"/api/v1/usage\",\n body,\n // A dry run writes nothing, so it is always safe to retry.\n retry: true,\n });\n return res.usageLog ?? null;\n }\n\n /** Meter a named credit. */\n credit(input: CreditInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"credit\" }, opts);\n }\n\n /** Debit the customer's wallet at model cost. */\n wallet(input: WalletInput, opts?: { wait?: boolean }): Promise<TrackResult> {\n return this.track({ ...input, type: \"wallet\" }, opts);\n }\n\n /** Advance one step of an outcome workflow. */\n outcome(\n input: OutcomeInput,\n opts?: { wait?: boolean },\n ): Promise<TrackResult> {\n return this.track({ ...input, type: \"outcome\" }, opts);\n }\n\n /** Recent usage logs + totals for a customer. `GET /api/v1/usage`. */\n async list(params: {\n customerId: string;\n limit?: number;\n }): Promise<UsageList> {\n const res = await this.transport.request<UsageList & { ok: true }>({\n method: \"GET\",\n path: \"/api/v1/usage\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n return { customer: res.customer, totals: res.totals, logs: res.logs };\n }\n\n /**\n * Record one unit-metered event (a fixed-price meter with no tokens),\n * addressed to a catalog unit by its `agentKey`. Sent immediately — unit\n * events are not buffered. `POST /api/v1/units`.\n */\n async unit(input: UnitInput): Promise<{ unitUsage: SerializedUnitUsage }> {\n return this.transport.request<{ unitUsage: SerializedUnitUsage }>({\n method: \"POST\",\n path: \"/api/v1/units\",\n body: {\n customerId: input.customerId,\n agentKey: input.agentKey,\n ...(input.member ? { member: input.member } : {}),\n },\n // Best-effort metering opts into retries on transient failures.\n retry: true,\n });\n }\n\n /** A customer's unit balances + recent unit events. `GET /api/v1/units`. */\n unitUsage(params: {\n customerId: string;\n limit?: number;\n }): Promise<UnitUsageList> {\n return this.transport.request<UnitUsageList>({\n method: \"GET\",\n path: \"/api/v1/units\",\n query: { customerId: params.customerId, limit: params.limit },\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type {\n CreateUnitInput,\n Unit,\n UnitDetail,\n UpdateUnitInput,\n} from \"../types.js\";\n\n/**\n * The `units` resource — manage the org's unit *types* (the catalog): named,\n * quantity-priced meters (FLAT / SLAB / VOLUME). Record consumption against a\n * unit with `signals.unit()`. `/api/v1/units-catalog`.\n */\nexport class Units {\n constructor(private readonly transport: Transport) {}\n\n /** List unit types. Pass `{ active: true }` to only return active ones. */\n async list(params: { active?: boolean } = {}): Promise<Unit[]> {\n const res = await this.transport.request<{ units: Unit[] }>({\n method: \"GET\",\n path: \"/api/v1/units-catalog\",\n query: { active: params.active === undefined ? undefined : String(params.active) },\n });\n return res.units;\n }\n\n /** Create a unit type. `POST /api/v1/units-catalog`. */\n async create(input: CreateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"POST\",\n path: \"/api/v1/units-catalog\",\n body: input,\n });\n return res.unit;\n }\n\n /** Fetch one unit type with stats. `GET /api/v1/units-catalog/:id`. */\n async get(id: string): Promise<UnitDetail> {\n const res = await this.transport.request<{ unit: UnitDetail }>({\n method: \"GET\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n });\n return res.unit;\n }\n\n /** Update a unit type's definition. `PATCH /api/v1/units-catalog/:id`. */\n async update(id: string, input: UpdateUnitInput): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n body: input,\n });\n return res.unit;\n }\n\n /** Activate or deactivate a unit type. */\n async setActive(id: string, isActive: boolean): Promise<Unit> {\n const res = await this.transport.request<{ unit: Unit }>({\n method: \"PATCH\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n body: { isActive },\n });\n return res.unit;\n }\n\n /** Delete a unit type. */\n async delete(id: string): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/units-catalog/${encodeURIComponent(id)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { ThresholdKind, UpsertWebhookInput, Webhook } from \"../types.js\";\n\n/**\n * The `webhooks` resource — threshold alerts. At most one webhook per kind\n * (CREDIT / OUTCOME / WALLET); posting a kind again upserts it. `/api/v1/webhooks`.\n */\nexport class Webhooks {\n constructor(private readonly transport: Transport) {}\n\n /** List configured webhooks. `GET /api/v1/webhooks`. */\n async list(): Promise<Webhook[]> {\n const res = await this.transport.request<{ webhooks: Webhook[] }>({\n method: \"GET\",\n path: \"/api/v1/webhooks\",\n });\n return res.webhooks;\n }\n\n /** Create or replace the webhook for a kind. `POST /api/v1/webhooks`. */\n async upsert(input: UpsertWebhookInput): Promise<Webhook> {\n const res = await this.transport.request<{ webhook: Webhook }>({\n method: \"POST\",\n path: \"/api/v1/webhooks\",\n body: input,\n });\n return res.webhook;\n }\n\n /** Delete the webhook for a kind (idempotent). `DELETE /api/v1/webhooks/:kind`. */\n async delete(kind: ThresholdKind): Promise<void> {\n await this.transport.request({\n method: \"DELETE\",\n path: `/api/v1/webhooks/${encodeURIComponent(kind)}`,\n });\n }\n}\n","import type { Transport } from \"../http.js\";\nimport type { Model, WorkspaceIdentity } from \"../types.js\";\n\n/**\n * The `workspace` resource — read-only introspection of the org behind the API\n * key. Grounds an integration (which workspace, and is it `sandbox` or `live`?)\n * and lists the models it may meter against. `/api/v1/me`, `/api/v1/models`.\n */\nexport class Workspace {\n constructor(private readonly transport: Transport) {}\n\n /** Identify the org + key behind the request, incl. `sandbox` | `live`. */\n me(): Promise<WorkspaceIdentity> {\n return this.transport.request<WorkspaceIdentity>({\n method: \"GET\",\n path: \"/api/v1/me\",\n });\n }\n\n /** The org's enabled models with live prices. `{ active: true }` returns only\n * the models that can be metered right now. */\n async models(params: { active?: boolean } = {}): Promise<Model[]> {\n const res = await this.transport.request<{ models: Model[] }>({\n method: \"GET\",\n path: \"/api/v1/models\",\n query: {\n active: params.active === undefined ? undefined : String(params.active),\n },\n });\n return res.models;\n }\n}\n","import { resolveConfig } from \"./config.js\";\nimport { Flusher } from \"./flusher.js\";\nimport { Transport } from \"./http.js\";\nimport { Credits } from \"./resources/credits.js\";\nimport { Customers } from \"./resources/customers.js\";\nimport { Invoices } from \"./resources/invoices.js\";\nimport { Outcomes } from \"./resources/outcomes.js\";\nimport { Payments } from \"./resources/payments.js\";\nimport { Plans } from \"./resources/plans.js\";\nimport { Portal } from \"./resources/portal.js\";\nimport { Purchases } from \"./resources/purchases.js\";\nimport { Signals } from \"./resources/signals.js\";\nimport { Units } from \"./resources/units.js\";\nimport { Webhooks } from \"./resources/webhooks.js\";\nimport { Workspace } from \"./resources/workspace.js\";\nimport type { ClockNextConfig, ResolvedConfig } from \"./types.js\";\n\n/**\n * The ClockNext client.\n *\n * ```ts\n * const cnk = new ClockNext({ apiKey: process.env.CLOCKNEXT_API_KEY! });\n *\n * await cnk.signals.credit({\n * customerId: \"cus_123\",\n * model: \"gpt-4o\", // catalog model id\n * agentKey: \"api_credit\", // the credit's stable agent key\n * tokens: { input: 1200, output: 340 },\n * });\n *\n * // before a serverless function returns / on shutdown:\n * await cnk.flush();\n * ```\n */\nexport class ClockNext {\n /** Record + read usage signals (credit / wallet / outcome / unit). */\n readonly signals: Signals;\n /** Manage customers, their members, wallet, and balances. */\n readonly customers: Customers;\n /** Define and manage billing plans. */\n readonly plans: Plans;\n /** Subscribe customers to plans (purchases). */\n readonly purchases: Purchases;\n /** Read invoices and mint hosted pay links. */\n readonly invoices: Invoices;\n /** Read payments (paid invoices). */\n readonly payments: Payments;\n /** Manage the credit-type catalog. */\n readonly credits: Credits;\n /** Manage the outcome-type catalog. */\n readonly outcomes: Outcomes;\n /** Manage the unit-type catalog. */\n readonly units: Units;\n /** Configure threshold webhooks. */\n readonly webhooks: Webhooks;\n /** Mint customer-portal embed tokens. */\n readonly portal: Portal;\n /** Identify the workspace (sandbox/live) + list its models. `/me`, `/models`. */\n readonly workspace: Workspace;\n\n private readonly cfg: ResolvedConfig;\n private readonly flusher: Flusher;\n\n constructor(config: ClockNextConfig) {\n this.cfg = resolveConfig(config);\n\n if (typeof window !== \"undefined\") {\n this.cfg.logger.warn?.(\n \"[clocknext] Running in a browser exposes your secret API key. Use this SDK only on a server/backend.\",\n );\n }\n\n const transport = new Transport(this.cfg);\n this.flusher = new Flusher(transport, this.cfg);\n this.signals = new Signals(transport, this.flusher, this.cfg);\n this.customers = new Customers(transport);\n this.plans = new Plans(transport);\n this.purchases = new Purchases(transport);\n this.invoices = new Invoices(transport);\n this.payments = new Payments(transport);\n this.credits = new Credits(transport);\n this.outcomes = new Outcomes(transport);\n this.units = new Units(transport);\n this.webhooks = new Webhooks(transport);\n this.portal = new Portal(transport);\n this.workspace = new Workspace(transport);\n }\n\n /** Number of signals currently buffered (async mode). */\n get pending(): number {\n return this.flusher.size;\n }\n\n /** Force-send all buffered signals now. Await before a serverless return. */\n flush(): Promise<void> {\n return this.flusher.flush();\n }\n\n /** Flush and stop the background timer. Call on graceful shutdown. */\n close(): Promise<void> {\n return this.flusher.close();\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clocknext/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Official ClockNext SDK — record usage signals and manage plans, purchases, invoices, customers, and billing from your backend.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -9,9 +9,14 @@
|
|
|
9
9
|
"types": "./dist/index.d.ts",
|
|
10
10
|
"exports": {
|
|
11
11
|
".": {
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
"import": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./dist/index.d.cts",
|
|
18
|
+
"default": "./dist/index.cjs"
|
|
19
|
+
}
|
|
15
20
|
}
|
|
16
21
|
},
|
|
17
22
|
"files": [
|
|
@@ -31,7 +36,8 @@
|
|
|
31
36
|
"typecheck": "tsc --noEmit",
|
|
32
37
|
"test": "vitest run",
|
|
33
38
|
"test:watch": "vitest",
|
|
34
|
-
"
|
|
39
|
+
"lint:pkg": "publint --strict && attw --pack",
|
|
40
|
+
"prepublishOnly": "npm run build && npm run lint:pkg"
|
|
35
41
|
},
|
|
36
42
|
"keywords": [
|
|
37
43
|
"clocknext",
|
|
@@ -42,7 +48,9 @@
|
|
|
42
48
|
"billing"
|
|
43
49
|
],
|
|
44
50
|
"devDependencies": {
|
|
51
|
+
"@arethetypeswrong/cli": "^0.18.5",
|
|
45
52
|
"@types/node": "^20.14.0",
|
|
53
|
+
"publint": "^0.3.22",
|
|
46
54
|
"tsup": "^8.3.0",
|
|
47
55
|
"typescript": "^5.6.0",
|
|
48
56
|
"vitest": "^2.1.0"
|