@cronvello/sdk 0.1.4 → 0.2.1
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/CHANGELOG.md +53 -0
- package/README.md +145 -8
- package/dist/cli.cjs +1092 -8
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1088 -8
- package/dist/cli.js.map +1 -1
- package/dist/dev.cjs +1186 -0
- package/dist/dev.cjs.map +1 -0
- package/dist/dev.d.cts +318 -0
- package/dist/dev.d.ts +318 -0
- package/dist/dev.js +1173 -0
- package/dist/dev.js.map +1 -0
- package/dist/{dispatch-handler-DazGcFHz.d.cts → dispatch-handler-BoadpsL9.d.cts} +3 -4
- package/dist/{dispatch-handler-DazGcFHz.d.ts → dispatch-handler-BoadpsL9.d.ts} +3 -4
- package/dist/express.d.cts +1 -1
- package/dist/express.d.ts +1 -1
- package/dist/index.cjs +645 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -2
- package/dist/index.d.ts +25 -2
- package/dist/index.js +644 -7
- package/dist/index.js.map +1 -1
- package/dist/next.d.cts +1 -1
- package/dist/next.d.ts +1 -1
- package/docs/dashboard.png +0 -0
- package/package.json +16 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal/errors.ts","../src/internal/http.ts","../src/client/client.ts","../src/internal/cron.ts","../src/registry/verify.ts","../src/registry/dispatch.ts","../src/registry/reconcile.ts","../src/adapters/express.ts","../src/adapters/next.ts","../src/registry/define.ts","../src/registry/format.ts","../src/schedule/index.ts","../src/index.ts"],"names":["field","headerValue","defineCronvello"],"mappings":";AAKO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAEZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAGO,IAAM,iBAAA,GAAN,cAAgC,cAAA,CAAe;AAAA;AAAA,EAE3C,MAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,iBAAA;AAAA,EAET,YAAY,IAAA,EAOT;AACD,IAAA,KAAA,CAAM,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,EAAA,EAAK,KAAK,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,iBAAA;AAC9B,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AAAA,EAEA,IAAI,aAAA,GAAyB;AAC3B,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AAAA,EAEA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,IAAA,CAAK,MAAA,KAAW,GAAA;AAAA,EAChD;AAAA,EAEA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,MAAA,KAAW,GAAA;AAAA,EACzB;AACF;AAGO,IAAM,qBAAA,GAAN,cAAoC,cAAA,CAAe;AAAA,EAC/C,QAAA;AAAA,EACS,KAAA;AAAA,EAClB,WAAA,CAAY,UAAkB,KAAA,EAAgB;AAC5C,IAAA,KAAA,CAAM,yBAAyB,QAAQ,CAAA,EAAA,EAAK,QAAA,CAAS,KAAK,CAAC,CAAA,CAAE,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAGO,IAAM,oBAAA,GAAN,cAAmC,cAAA,CAAe;AAAA,EACvD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAEA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,IAAI,KAAA,YAAiB,KAAA,EAAO,OAAO,KAAA,CAAM,OAAA;AACzC,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;;;AC/BA,IAAM,gBAAA,uBAAuB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAEnD,IAAM,YAAN,MAAgB;AAAA,EACJ,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,IAAA,EAAwB;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAI,qBAAqB,oBAAoB,CAAA;AACrE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,qBAAqB,qBAAqB,CAAA;AACvE,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,IAAU,UAAA,CAAW,KAAA;AAChD,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,oBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC9C,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,IAAc,CAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,aAAA;AACjB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,cAAA,IAAkB,EAAC;AAC9C,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAAA,EACxB;AAAA,EAEA,MAAM,QAAW,IAAA,EAAkC;AACjD,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAC/C,IAAA,MAAM,WAAW,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,MACpC,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAG,IAAA,CAAK;AAAA,KACV;AACA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,OAAA,CAAQ,iBAAiB,IAAI,IAAA,CAAK,cAAA;AAE3D,IAAA,IAAI,SAAA;AACJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AAC3D,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,KAAW,IAAA,CAAK,WAAA,CAAY,KAAK,MAAM,CAAA;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,UACpC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAA;AAAA,UACA,GAAI,OAAA,KAAY,KAAA,CAAA,GAAY,EAAE,IAAA,EAAM,OAAA,KAAY,EAAC;AAAA,UACjD;AAAA,SACD,CAAA;AACD,QAAA,MAAA,EAAO;AACP,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,QAAA,IAAA,CAAK,SAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,YAAY,CAAA;AAElG,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,MAAM,MAAA,GAAS,IAAA,GAAO,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA;AAEvC,QAAA,IAAI,GAAA,CAAI,EAAA,EAAI,OAAO,cAAA,CAAe,MAAM,CAAA;AAExC,QAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,GAAA,EAAK,MAAM,CAAA;AAC9C,QAAA,IAAI,iBAAiB,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,OAAA,GAAU,KAAK,UAAA,EAAY;AACjE,UAAA,MAAM,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,UAAU,CAAC,CAAA;AAC7C,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,UAC1B,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,QAAA;AAAA,UACA,OAAA,EAAS,cAAA,CAAe,MAAM,CAAA,IAAK,CAAA,cAAA,CAAA;AAAA,UACnC,IAAA,EAAM,YAAY,MAAM,CAAA;AAAA,UACxB,IAAA,EAAM,MAAA;AAAA,UACN,GAAI,UAAA,KAAe,KAAA,CAAA,GAAY,EAAE,iBAAA,EAAmB,UAAA,KAAe;AAAC,SACrE,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,EAAO;AACP,QAAA,IAAI,GAAA,YAAe,mBAAmB,MAAM,GAAA;AAE5C,QAAA,SAAA,GAAY,GAAA;AACZ,QAAA,IAAI,OAAA,GAAU,KAAK,UAAA,EAAY;AAC7B,UAAA,MAAM,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA;AACjC,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAI,qBAAA,CAAsB,QAAA,EAAU,GAAG,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,qBAAA,CAAsB,QAAA,EAAU,SAAS,CAAA;AAAA,EACrD;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAAyC;AACtE,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,CAAA;AACvE,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAChC,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,KAAM,MAAS,CAAA,CACjC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAC9E,IAAA,OAAO,MAAA,CAAO,SAAS,CAAA,EAAG,IAAI,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,IAAA;AAAA,EACzD;AAAA,EAEQ,YAAY,QAAA,EAAqE;AACvF,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AACjE,IAAA,MAAM,eAAA,GAAkB,MAAM,UAAA,CAAW,KAAA,EAAM;AAC/C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,UAAA,CAAW,KAAA,EAAM;AAAA,oBACzB,gBAAA,CAAiB,OAAA,EAAS,iBAAiB,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACzE;AACA,IAAA,OAAO;AAAA,MACL,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,QAAQ,MAAM;AACZ,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,QAAA,EAAU,mBAAA,CAAoB,SAAS,eAAe,CAAA;AAAA,MACxD;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,OAAA,CAAQ,SAAiB,iBAAA,EAAoC;AACnE,IAAA,IAAI,sBAAsB,MAAA,EAAW,OAAO,KAAK,GAAA,CAAI,iBAAA,GAAoB,KAAM,GAAM,CAAA;AAErF,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,CAAA,IAAK,SAAS,GAAK,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,IAAI,CAAA;AAAA,EACxC;AACF,CAAA;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,SAAS,IAAA,EAAuB;AACvC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AASA,SAAS,eAAe,IAAA,EAAwB;AAC9C,EAAA,IACE,IAAA,KAAS,IAAA,IACT,OAAO,IAAA,KAAS,QAAA,IAChB,SAAA,IAAa,IAAA,IACb,OAAQ,IAAA,CAA8B,OAAA,KAAY,SAAA,IAClD,MAAA,IAAU,IAAA,EACV;AACA,IAAA,OAAQ,IAAA,CAA2B,IAAA;AAAA,EACrC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAe,IAAA,EAAmC;AACzD,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,EAAM;AACzD,IAAA,MAAM,IAAK,IAAA,CAA+B,OAAA;AAC1C,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,IAAA,EAAmC;AACtD,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,IAAK,IAAA,CAA4B,IAAA;AACvC,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CACP,KACA,IAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAC5C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,CAAA,GAAI,OAAO,MAAM,CAAA;AACvB,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,OAAQ,IAAA,CAAoD,IAAA;AAClE,IAAA,IAAI,QAAQ,OAAO,IAAA,CAAK,iBAAA,KAAsB,QAAA,SAAiB,IAAA,CAAK,iBAAA;AAAA,EACtE;AACA,EAAA,OAAO,MAAA;AACT;;;AClNO,IAAM,0BAAA,GAA6B;AAiBnC,IAAM,kBAAN,MAAsB;AAAA,EACV,SAAA;AAAA;AAAA,EAER,OAAA;AAAA;AAAA,EAGA,IAAA;AAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,OAAA;AAAA,EAET,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAA,EAAQ;AAC/B,MAAA,MAAM,IAAI,qBAAqB,yDAAoD,CAAA;AAAA,IACrF;AACA,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA,IAAW,0BAAA,EAA4B,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACjF,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,MAC7B,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,GAAI,QAAQ,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU,GAAI,EAAC;AAAA,MAC1E,GAAI,QAAQ,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAW,GAAI,EAAC;AAAA,MAC7E,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,OAAA,CAAQ,KAAA,KAAU,EAAC;AAAA,MAChD,GAAI,QAAQ,SAAA,GAAY,EAAE,WAAW,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,MAC5D,cAAA,EAAgB,EAAE,YAAA,EAAc,eAAA;AAAgB,KACjD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAA,CAAkB,MAAgC,IAAA,EAAwE;AACxH,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAQ;AAAA,MAC5B,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,cAAA;AAAA,MACN,IAAA;AAAA,MACA,GAAI,MAAM,cAAA,GAAiB,EAAE,gBAAgB,IAAA,CAAK,cAAA,KAAmB;AAAC,KACvE,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAW,MAAA,EAAgB,IAAA,EAAc,IAAA,EAA+H;AACtK,IAAA,OAAO,IAAA,CAAK,UAAU,OAAA,CAAW;AAAA,MAC/B,MAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAI,MAAM,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU,EAAC;AAAA,MAC3C,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,MACtD,GAAI,MAAM,cAAA,GAAiB,EAAE,gBAAgB,IAAA,CAAK,cAAA,KAAmB;AAAC,KACvE,CAAA;AAAA,EACH;AACF;AAEA,IAAM,eAAN,MAAmB;AAAA,EACjB,YAA6B,CAAA,EAAc;AAAd,IAAA,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,EAAe;AAAA,EAAf,CAAA;AAAA,EAE7B,IAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,YAAY,CAAA;AAAA,EAC3D;AAAA,EACA,IAAI,KAAA,EAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EACzE;AAAA,EACA,MAAA,CAAO,MAAqB,IAAA,EAAwD;AAClF,IAAA,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,UAAA,EAAY,IAAA,EAAM,GAAI,IAAA,EAAM,cAAA,GAAiB,EAAE,cAAA,EAAgB,IAAA,CAAK,gBAAe,GAAI,IAAK,CAAA;AAAA,EAC5I;AAAA,EACA,MAAA,CAAO,OAAe,IAAA,EAAyC;AAC7D,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,EACjF;AAAA,EACA,OAAO,KAAA,EAA8B;AACnC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EAC5E;AAAA,EACA,MAAM,KAAA,EAAmC;AACvC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,MAAA,CAAA,EAAU,CAAA;AAAA,EAChF;AAAA,EACA,KAAK,KAAA,EAAmC;AACtC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,KAAA,CAAA,EAAS,CAAA;AAAA,EAC/E;AAAA,EACA,UAAU,KAAA,EAAsC;AAC9C,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,MAAA,CAAA,EAAU,CAAA;AAAA,EAC/E;AAAA,EACA,UAAA,CAAW,KAAA,EAAe,IAAA,EAAsB,IAAA,EAAyD;AACvG,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,CAAQ,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,UAAU,IAAA,EAAM,GAAI,IAAA,EAAM,cAAA,GAAiB,EAAE,cAAA,EAAgB,KAAK,cAAA,EAAe,GAAI,EAAC,EAAI,CAAA;AAAA,EAChK;AACF,CAAA;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAClB,YAA6B,CAAA,EAAc;AAAd,IAAA,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,EAAe;AAAA,EAAf,CAAA;AAAA;AAAA,EAG7B,KAAK,KAAA,EAA+C;AAClD,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,WAAA,EAAa,GAAI,QAAQ,EAAE,KAAA,EAAsE,GAAI,IAAK,CAAA;AAAA,EACzJ;AAAA,EACA,IAAI,MAAA,EAAqC;AACvC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EAC3E;AAAA,EACA,MAAA,CAAO,QAAgB,IAAA,EAA2C;AAChE,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,EACnF;AAAA,EACA,OAAO,MAAA,EAA+B;AACpC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EAC9E;AAAA,EACA,MAAM,MAAA,EAAqC;AACzC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,MAAA,CAAA,EAAU,CAAA;AAAA,EAClF;AAAA,EACA,KAAK,MAAA,EAAqC;AACxC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,KAAA,CAAA,EAAS,CAAA;AAAA,EACjF;AAAA;AAAA,EAEA,OAAO,MAAA,EAAuC;AAC5C,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,IAAA,CAAA,EAAQ,CAAA;AAAA,EAChF;AAAA,EACA,QAAA,CAAS,QAAgB,KAAA,EAAsC;AAC7D,IAAA,OAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,CAAC,CAAA,KAAA,CAAA,EAAS,GAAI,KAAA,GAAQ,EAAE,OAAsE,GAAI,IAAK,CAAA;AAAA,EAC7K;AACF,CAAA;AAEA,IAAM,eAAN,MAAmB;AAAA,EACjB,YAA6B,CAAA,EAAc;AAAd,IAAA,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,EAAe;AAAA,EAAf,CAAA;AAAA;AAAA,EAG7B,KAAK,KAAA,EAA6C;AAChD,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,GAAI,QAAQ,EAAE,KAAA,EAAsE,GAAI,IAAK,CAAA;AAAA,EACxJ;AAAA,EACA,IAAI,KAAA,EAAmC;AACrC,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAA,SAAA,EAAY,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,EACzE;AACF,CAAA;AAEA,IAAM,kBAAN,MAAsB;AAAA,EACpB,YAA6B,CAAA,EAAc;AAAd,IAAA,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,EAAe;AAAA,EAAf,CAAA;AAAA,EAE7B,EAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,UAAU,CAAA;AAAA,EACzD;AAAA,EACA,KAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,EAAE,OAAA,CAAQ,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,aAAa,CAAA;AAAA,EAC5D;AACF,CAAA;AAEA,SAAS,IAAI,OAAA,EAAyB;AACpC,EAAA,OAAO,mBAAmB,OAAO,CAAA;AACnC;;;AC9LA,IAAM,MAAA,uBAAa,GAAA,CAAI;AAAA,EACrB,SAAA;AAAA,EAAW,WAAA;AAAA,EAAa,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,WAAA;AAAA,EAAa,SAAA;AAAA,EAAW;AACnF,CAAC,CAAA;AAED,IAAM,MAAA,GAAS,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAClG,IAAM,IAAA,GAAO,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAU7D,IAAM,IAAA,GAAoB;AAAA,EACxB,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,OAAO,QAAA,EAAS;AAAA,EACnC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,OAAO,MAAA,EAAO;AAAA,EACjC,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,OAAO,cAAA,EAAe;AAAA,EACzC,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,IAAI,KAAA,EAAO,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,EACjD,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,GAAG,KAAA,EAAO,IAAA,EAAM,OAAO,aAAA;AAAc;AACtD,CAAA;AACA,IAAM,UAAqB,EAAE,GAAA,EAAK,GAAG,GAAA,EAAK,EAAA,EAAI,OAAO,QAAA,EAAS;AASvD,SAAS,aAAa,IAAA,EAA8B;AACzD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,MAAK,EAAG;AAC5C,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,EACpD;AACA,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO,OAAO,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,IACnC,EAAE,KAAA,EAAO,IAAA,EAAK,GACd,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,oBAAA,EAAuB,OAAO,CAAA,+BAAA,CAAA,EAA6B;AAAA,EACxF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AACjC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG;AAC5C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,kEAAA,EAAqE,KAAA,CAAM,MAAM,MAAM,OAAO,CAAA,CAAA;AAAA,KACvG;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,KAAW,CAAA,GAAI,CAAC,OAAA,EAAS,GAAG,IAAI,CAAA,GAAI,IAAA;AACxD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,MAAM,aAAA,CAAc,KAAA,CAAM,CAAC,CAAA,EAAI,KAAA,CAAM,CAAC,CAAE,CAAA;AAC9C,IAAA,IAAI,KAAK,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA,QAAA,EAAW,KAAA,CAAM,CAAC,CAAA,CAAG,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAC,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,EAAG;AAAA,EAC5F;AACA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAEA,SAAS,aAAA,CAAcA,QAAe,IAAA,EAAgC;AAEpE,EAAA,KAAA,MAAW,IAAA,IAAQA,MAAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AACnC,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,CAAa,MAAc,IAAA,EAAgC;AAClE,EAAA,IAAI,IAAA,KAAS,IAAI,OAAO,iBAAA;AAExB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAC1B,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,IAAI,KAAK,MAAA,CAAO,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,CAAA,+BAAA,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,IAAA,KAAS,KAAK,OAAO,IAAA;AAEzB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC7B,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,KAAK,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,EAAG,IAAI,GAAG,IAAI,CAAA;AACjD,IAAA,MAAM,KAAK,YAAA,CAAa,IAAA,CAAK,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AAClD,IAAA,IAAI,EAAA,KAAO,IAAA,EAAM,OAAO,CAAA,CAAA,EAAI,KAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA,CAAA;AACxF,IAAA,IAAI,EAAA,KAAO,IAAA,EAAM,OAAO,CAAA,CAAA,EAAI,KAAK,KAAA,CAAM,IAAA,GAAO,CAAC,CAAC,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,KAAK,GAAG,CAAA,CAAA;AACzF,IAAA,IAAI,KAAK,EAAA,EAAI,OAAO,CAAA,YAAA,EAAe,EAAE,wBAAwB,EAAE,CAAA,CAAA;AAC/D,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,GAAA,EAAK;AAEtC,IAAA,OAAO,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA,KAAM,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAA,GAAK,IAAA;AAAA,EACnG;AACA,EAAA,OAAO,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA,KAAM,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,kBAAA,EAAqB,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAA,GAAK,IAAA;AACnG;AAGA,SAAS,YAAA,CAAa,OAAe,IAAA,EAAgC;AACnE,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACvB,IAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,IAAO,CAAA,IAAK,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AAAA,EAC9C;AACA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAClD,IAAA,IAAI,OAAO,CAAA,EAAG,OAAO,OAAO,IAAA,CAAK,KAAA,KAAU,UAAU,CAAA,GAAI,CAAA,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,eAAA,CAAgB,IAAA,EAAc,OAAA,GAAU,EAAA,EAAU;AAChE,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,6BAAA,EAA2B,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA;AAAA,EACxF;AACF;AAGO,SAAS,gBAAgB,EAAA,EAAqB;AACnD,EAAA,IAAI,CAAC,EAAA,IAAM,OAAO,EAAA,KAAO,UAAU,OAAO,KAAA;AAC1C,EAAA,IAAI;AACF,IAAA,IAAI,KAAK,cAAA,CAAe,OAAA,EAAS,EAAE,QAAA,EAAU,IAAI,CAAA;AACjD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AChIA,IAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAGzB,SAAS,YAAYC,YAAAA,EAAgD;AAC1E,EAAA,IAAI,CAACA,cAAa,OAAO,IAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAKA,YAAAA,CAAY,MAAM,CAAA;AACxD,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAG,MAAK,GAAI,IAAA;AACpC;AAOO,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAoB;AAC7D,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC3B,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,GAAG,MAAM,CAAA;AACzC,EAAA,IAAI,IAAA,GAAO,EAAA,CAAG,MAAA,GAAS,EAAA,CAAG,MAAA;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,IAAA,IAAA,CAAS,GAAG,CAAC,CAAA,IAAK,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;AAMA,eAAsB,cAAA,CAAe,SAAiB,MAAA,EAAiC;AACrF,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,IAC9B,KAAA;AAAA,IACA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,IACrB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,KAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAC,CAAA;AACzE,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAI,WAAW,GAAG,CAAC,EACvC,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,OAAO,UAAU,GAAG,CAAA,CAAA;AACtB;;;AC/BO,IAAM,cAA+B,EAAC;AA+CtC,SAAS,iBAAiB,KAAA,EAAoC;AACnE,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,IAAU,WAAA;AAC5B,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,MAAM,YAAA,GAAe,MAAM,YAAA,IAAgB,OAAA;AAG3C,EAAA,eAAe,aAAA,CAAc,KAAkB,GAAA,EAA4E;AACzH,IAAA,MAAM,SAAS,MAAM,KAAA,EAAO,UAAA,GAAa,EAAE,KAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,GAAA,CAAI,QAAQ,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,GAAG,GAAG,CAAA;AACzG,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,GAAG,CAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,MAAA,GAAA,CAAI,QAAQ,CAAA,iBAAA,EAAoB,GAAA,CAAI,GAAG,CAAA,eAAA,EAAkB,UAAU,CAAA,EAAA,CAAI,CAAA;AACvE,MAAA,MAAM,QAAA,CAAS,MAAM,KAAA,EAAO,YAAA,GAAe,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAI,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,GAAG,GAAG,CAAA;AACzG,MAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAAA,IAC9B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,KAAA,GAAQ,CAAA,iBAAA,EAAoB,GAAA,CAAI,GAAG,CAAA,UAAA,EAAa,KAAA,CAAM,OAAO,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,CAAA;AAC7F,MAAA,MAAM,QAAA,CAAS,MAAM,KAAA,EAAO,UAAA,GAAa,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAI,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,GAAG,GAAG,CAAA;AACtG,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,SAAS,aAAa,GAAA,EAAa,GAAA,EAAkB,GAAA,EAA6B,IAAA,EAA+B,SAAkB,MAAA,EAAiD;AAClL,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,QAAA,EAAU,OAAO,IAAA,CAAK,UAAU,CAAA,KAAM,QAAA,GAAY,IAAA,CAAK,UAAU,CAAA,GAAgB,GAAA,CAAI,MAAA,CAAO,QAAA,IAAY,EAAA;AAAA,MACxG,OAAA,EAAU,GAAA,CAAI,MAAA,CAAO,OAAA,IAAuC,EAAC;AAAA,MAC7D,IAAA;AAAA,MACA,OAAA,EAAS,GAAA,EAAK,OAAA,IAAW,EAAC;AAAA,MAC1B,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA,EAAQ,GAAA;AAAA,MACR,QAAQ,GAAA,EAAK;AAAA,KACf;AAAA,EACF;AAEA,EAAA,eAAe,OAAO,GAAA,EAAiD;AACrE,IAAA,IAAI,GAAA,CAAI,MAAA,CAAO,WAAA,EAAY,KAAM,MAAA,EAAQ;AACvC,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,sBAAsB,CAAA;AAAA,IAC7D;AAGA,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,gBAAgB,KAAA,EAAO,KAAA,CAAM,cAAc,CAAA,EAAG;AAC3D,MAAA,GAAA,CAAI,OAAO,4DAA4D,CAAA;AACvE,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,gBAAgB,CAAA;AAAA,IACvD;AAGA,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA,GAAI,YAAA,EAAc;AAC1C,MAAA,GAAA,CAAI,IAAA,GAAO,CAAA,4CAAA,EAA+C,YAAY,CAAA,MAAA,CAAQ,CAAA;AAC9E,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,qBAAqB,CAAA;AAAA,IAC5D;AAGA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,OAAA,GAAU,IAAA,CAAK,MAAM,GAAA,CAAI,OAAO,IAAI,EAAC;AACxD,MAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,QAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,8BAA8B,CAAA;AAAA,MACrE;AACA,MAAA,IAAA,GAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,qBAAqB,CAAA;AAAA,IAC5D;AAGA,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,KAAK,MAAM,QAAA,GAAY,IAAA,CAAK,KAAK,CAAA,GAAe,IAAA;AACxE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,KAAK,GAAA,EAAK,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,6BAA6B,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,CAAI,IAAA,GAAO,CAAA,sCAAA,EAAyC,GAAG,CAAA,CAAA,CAAG,CAAA;AAC1D,MAAA,OAAO,IAAA,CAAK,KAAK,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAA,EAAI,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,WAAW,CAAC,CAAA;AAC/C,IAAA,MAAM,UAAU,QAAA,KAAa,IAAA;AAC7B,IAAA,MAAM,MAAM,YAAA,CAAa,GAAA,EAAK,KAAK,GAAA,EAAK,IAAA,EAAM,SAAS,UAAU,CAAA;AAGjE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,GAAO,qBAAqB,GAAA,EAAK,GAAA,EAAK,UAAU,KAAA,CAAM,cAAA,EAAgB,KAAK,aAAa,CAAA;AAC9F,MAAA,IAAI,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA;AAErC,MAAA,OAAO,IAAA,CAAK,KAAK,EAAE,EAAA,EAAI,MAAM,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,aAAA,CAAc,KAAK,GAAG,CAAA;AAC/C,MAAA,OAAO,IAAA,CAAK,GAAA,EAAK,EAAE,EAAA,EAAI,IAAA,EAAM,KAAK,GAAA,EAAK,MAAA,EAAQ,MAAA,IAAU,IAAA,EAAM,CAAA;AAAA,IACjE,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAO,IAAA,CAAK,GAAA,EAAK,EAAE,EAAA,EAAI,OAAO,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,GAAG,CAAA;AAAA,IACnG;AAAA,EACF;AAEA,EAAA,eAAe,QAAA,CAAS,KAAa,OAAA,EAAqD;AACxF,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,GAAG,CAAA,UAAA,EAAa,CAAC,GAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA,IAAK,QAAQ,CAAA,CAAE,CAAA;AACzG,IAAA,MAAM,IAAA,GAAgC,EAAE,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,GAAI,OAAA,IAAW,EAAC,EAAG;AACpG,IAAA,MAAM,MAAM,YAAA,CAAa,GAAA,EAAK,KAAK,IAAA,EAAM,IAAA,EAAM,OAAO,OAAO,CAAA;AAC7D,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,aAAA,CAAc,KAAK,GAAG,CAAA;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,QAAQ,QAAA,EAAS;AAC5B;AAEA,eAAe,qBACb,GAAA,EACA,GAAA,EACA,QAAA,EACA,MAAA,EACA,KACA,aAAA,EACe;AACf,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,UAAA,EAAY,MAAA,KAAW,MAAM,aAAA,CAAc,KAAK,GAAG,CAAA;AAC3D,IAAA,OAAA,GAAU,EAAE,OAAO,QAAA,CAAS,KAAA,EAAO,SAAS,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,MAAA,IAAU,IAAA,EAAK;AAAA,EACvF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,GAAU;AAAA,MACR,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,OAAA,EAAS,KAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,KACxD;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,SAAS,uBAAA,IAA2B,qBAAA;AACnD,IAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,OAAA,EAAS,MAAM,CAAA;AACtD,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK;AAAA,MACpC,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,EAAE,cAAA,EAAgB,oBAAoB,CAAC,MAAM,GAAG,SAAA,EAAU;AAAA,MACnE,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,GAAA,CAAI,OAAO,CAAA,mCAAA,EAAsC,GAAA,CAAI,GAAG,CAAA,WAAA,EAAc,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IACpF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,KAAA,GAAQ,CAAA,gDAAA,EAAmD,GAAA,CAAI,GAAG,CAAA,CAAA,CAAA,EAAK;AAAA,MACzE,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,KACvD,CAAA;AAAA,EACH;AACF;AAGA,eAAe,QAAA,CAAS,IAA4C,GAAA,EAAqC;AACvG,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,EAAG;AAAA,EACX,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,IAAA,GAAO,uCAAuC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EACtG;AACF;AAGA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,IAAI,CAAC,GAAG,OAAO,CAAA;AACf,EAAA,IAAI,OAAO,gBAAgB,WAAA,EAAa,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA;AAC3E,EAAA,OAAO,CAAA,CAAE,MAAA;AACX;AAEA,SAAS,aAAa,KAAA,EAAyC;AAC7D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,IAAA;AAChD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,KAAK,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,CAAE,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,IAAA;AAC3E,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,EAAE,KAAK,CAAA;AAAA,IACZ,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,IAChB,GAAI,OAAO,CAAA,CAAE,yBAAyB,CAAA,KAAM,QAAA,GACxC,EAAE,uBAAA,EAAyB,CAAA,CAAE,yBAAyB,CAAA,EAAY,GAClE,EAAC;AAAA,IACL,GAAI,OAAO,CAAA,CAAE,WAAW,CAAA,KAAM,QAAA,GAAW,EAAE,SAAA,EAAW,CAAA,CAAE,WAAW,CAAA,EAAY,GAAI;AAAC,GACtF;AACF;AAEA,SAAS,IAAA,CAAK,QAAgB,IAAA,EAAiD;AAC7E,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AACxB;;;ACtNA,eAAsB,SAAA,CAAU,KAAA,EAAuB,OAAA,GAAuB,EAAC,EAA6B;AAC1G,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,aAAa,cAAA,EAAgB,eAAA,EAAiB,MAAK,GAAI,KAAA;AAChF,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AACjC,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,KAAA;AAG7C,EAAA,MAAM,EAAE,GAAA,EAAK,SAAA,EAAW,OAAA,EAAS,UAAA,EAAW,GAAI,MAAM,eAAA,CAAgB,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,cAAA,EAAgB,MAAM,CAAA;AACnH,EAAA,MAAM,KAAA,GAAQ,WAAW,EAAA,IAAM,WAAA;AAE/B,EAAA,MAAM,UAAiC,EAAC;AACxC,EAAA,MAAM,aAAA,GAAgB,SAAA,IAAa,CAAC,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,EAAE,CAAA,GAAI,EAAC;AAC9F,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAU,CAAC,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAG,CAAC,CAAA;AAGnD,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,OAAA,IAAW,IAAA;AACtC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAClC,IAAA,MAAM,UAAU,gBAAA,CAAiB,EAAE,KAAK,WAAA,EAA6B,iBAAiB,CAAA;AAEtF,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,QAAA,IAAY,CAAC,MAAA,EAAQ,MAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAC5F,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,EAAA,IAAM,IAAA,EAAM,MAAA,EAAQ,wBAAwB,CAAA;AAC9G,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAI,MAAA,IAAU,CAAC,SAAA,EAAW;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,GAAA,CAAI,KAAK,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,CAAA;AAC9D,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAA6B,EAAE,GAAG,OAAA,EAAS,aAAa,cAAA,EAAe;AAC7E,MAAA,MAAM,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,UAAU,EAAA,EAAI,UAAA,EAAY,EAAE,cAAA,EAAgB,aAAa,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,GAAG,IAAI,CAAA;AACzH,MAAA,MAAM,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,SAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACjE,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAc,GAAI,QAAA,CAAS,UAAU,OAAA,EAAS,EAAE,YAAA,EAAc,cAAA,EAAgB,CAAA;AAC7F,IAAA,MAAM,UAAA,GAAa,SAAS,MAAA,KAAW,UAAA;AAEvC,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,CAAC,UAAA,EAAY;AAC7C,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,WAAA,EAAa,MAAA,EAAQ,QAAA,CAAS,EAAA,EAAI,CAAA;AACvE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,CAAS,EAAA,EAAI,KAAK,CAAA;AAC1E,MAAA,IAAI,YAAY,MAAM,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,SAAS,EAAE,CAAA;AAAA,IACtD;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,MAAA,EAAQ,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,WAAA;AAAA,MAC/C,QAAQ,QAAA,CAAS,EAAA;AAAA,MACjB,GAAI,aAAA,CAAc,MAAA,GAAS,IAAI,EAAE,aAAA,KAAkB,EAAC;AAAA,MACpD,GAAI,UAAA,GAAa,EAAE,MAAA,EAAQ,cAAA,KAAmB;AAAC,KAChD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACjC,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,EAAE,CAAA;AAC9C,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,SAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,SAAA,CAAU,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AACtD;AAEA,eAAe,eAAA,CACb,MAAA,EACA,OAAA,EACA,WAAA,EACA,MAAA,EACsD;AACtD,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK;AACpC,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AACjD,EAAA,IAAI,OAAO,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,SAAS,KAAA,EAAM;AAC/C,EAAA,IAAI,QAAQ,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,SAAS,IAAA,EAAK;AAC9C,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAA,CAAK,MAAA;AAAA,IAChC,EAAE,MAAM,OAAA,EAAS,GAAI,cAAc,EAAE,WAAA,EAAY,GAAI,EAAC,EAAG;AAAA,IACzD,EAAE,cAAA,EAAgB,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA;AAAG,GACxC;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,OAAA,EAAS,IAAA,EAAK;AACvC;AAEA,SAAS,iBAAiB,IAAA,EAKP;AACjB,EAAA,MAAM,EAAE,GAAA,EAAK,WAAA,EAAa,eAAA,EAAgB,GAAI,IAAA;AAC9C,EAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,GAAI,GAAA,CAAI,OAAA,IAAW,EAAC,EAAI,CAAA;AAC3E,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,MAAM,GAAA,CAAI,GAAA;AAAA,IACV,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,QAAA,EAAU,IAAI,QAAA,IAAY,eAAA;AAAA,IAC1B,SAAA,EAAW,WAAA;AAAA,IACX,MAAA,EAAQ,MAAA;AAAA,IACR;AAAA,GACF;AACA,EAAA,IAAI,GAAA,CAAI,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,cAAc,GAAA,CAAI,WAAA;AAC1D,EAAA,IAAI,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AAClD,EAAA,IAAI,GAAA,CAAI,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA;AACxD,EAAA,IAAI,GAAA,CAAI,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,GAAA,CAAI,aAAA;AAC9D,EAAA,IAAI,GAAA,CAAI,iBAAA,KAAsB,MAAA,EAAW,IAAA,CAAK,oBAAoB,GAAA,CAAI,iBAAA;AACtE,EAAA,IAAI,GAAA,CAAI,mBAAA,KAAwB,MAAA,EAAW,IAAA,CAAK,sBAAsB,GAAA,CAAI,mBAAA;AAC1E,EAAA,IAAI,GAAA,CAAI,eAAA,KAAoB,MAAA,EAAW,IAAA,CAAK,kBAAkB,GAAA,CAAI,eAAA;AAClE,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAA,CACP,QAAA,EACA,OAAA,EACA,IAAA,EACoD;AACpD,EAAA,MAAM,QAAwB,EAAC;AAC/B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,GAAA,GAAM,CAAiCD,MAAAA,EAAU,KAAA,KAA6B;AAClF,IAAA,KAAA,CAAMA,MAAK,CAAA,GAAI,KAAA;AACf,IAAA,OAAA,CAAQ,KAAKA,MAAK,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,IAAI,SAAS,QAAA,KAAa,OAAA,CAAQ,UAAU,GAAA,CAAI,UAAA,EAAY,QAAQ,QAAQ,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,IAAa,QAAA,CAAS,QAAA,KAAa,QAAQ,QAAA,EAAU,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAC9G,EAAA,IAAI,SAAS,SAAA,KAAc,OAAA,CAAQ,WAAW,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAChF,EAAA,IAAI,QAAA,CAAS,YAAY,OAAA,CAAQ,MAAA,IAAU,SAAS,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAA,IAAU,MAAM,CAAA;AAC1F,EAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,WAAA,EAAa,OAAA,CAAQ,WAAW,CAAA,EAAG,GAAA,CAAI,aAAA,EAAe,OAAA,CAAQ,WAAA,IAAe,IAAI,CAAA;AAGzG,EAAA,IAAI,QAAQ,WAAA,KAAgB,MAAA,IAAA,CAAc,SAAS,WAAA,IAAe,MAAA,MAAe,QAAQ,WAAA,EAAa;AACpG,IAAA,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,IAAa,QAAA,CAAS,OAAA,KAAY,QAAQ,OAAA,EAAS,GAAA,CAAI,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AACzG,EAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,MAAA,IAAa,QAAA,CAAS,UAAA,KAAe,QAAQ,UAAA,EAAY,GAAA,CAAI,YAAA,EAAc,OAAA,CAAQ,UAAU,CAAA;AACxH,EAAA,IAAI,QAAQ,aAAA,KAAkB,MAAA,IAAa,QAAA,CAAS,aAAA,KAAkB,QAAQ,aAAA,EAAe;AAC3F,IAAA,GAAA,CAAI,eAAA,EAAiB,QAAQ,aAAa,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,QAAQ,iBAAA,KAAsB,MAAA,IAAa,QAAA,CAAS,iBAAA,KAAsB,QAAQ,iBAAA,EAAmB;AACvG,IAAA,GAAA,CAAI,mBAAA,EAAqB,QAAQ,iBAAiB,CAAA;AAAA,EACpD;AACA,EAAA,IAAI,QAAQ,mBAAA,KAAwB,MAAA,IAAa,QAAA,CAAS,mBAAA,KAAwB,QAAQ,mBAAA,EAAqB;AAC7G,IAAA,GAAA,CAAI,qBAAA,EAAuB,QAAQ,mBAAmB,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,OAAA,CAAQ,oBAAoB,MAAA,IAAa,CAAC,UAAU,QAAA,CAAS,eAAA,EAAiB,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC1G,IAAA,GAAA,CAAI,iBAAA,EAAmB,QAAQ,eAAkC,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,IAAA,CAAK,gBAAgB,CAAC,QAAA,CAAS,gBAAgB,GAAA,CAAI,aAAA,EAAe,KAAK,cAAc,CAAA;AAEzF,EAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,OAAA,EAAQ;AACzC;AAEA,SAAS,SAAA,CAAU,GAAkB,CAAA,EAAuC;AAC1E,EAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,SAAa,CAAA,IAAK,CAAA;AACxC,EAAA,IAAI;AACF,IAAA,OAAO,SAAA,CAAU,KAAK,KAAA,CAAM,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,CAAA,KAAM,CAAA;AAAA,EACf;AACF;AAEA,SAAS,SAAA,CAAU,GAAY,CAAA,EAAqB;AAClD,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,SAAa,CAAA,KAAM,CAAA;AACzC,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,UAAU,OAAO,KAAA;AAC3D,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,CAAW,EAAE,IAAA,EAAK;AACzC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,CAAW,EAAE,IAAA,EAAK;AACzC,EAAA,IAAI,EAAA,CAAG,MAAA,KAAW,EAAA,CAAG,MAAA,EAAQ,OAAO,KAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,IAAI,GAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,GAAG,OAAO,KAAA;AAC5B,IAAA,IAAI,CAAC,SAAA,CAAW,CAAA,CAA8B,EAAA,CAAG,CAAC,CAAE,CAAA,EAAI,CAAA,CAA8B,EAAA,CAAG,CAAC,CAAE,CAAC,GAAG,OAAO,KAAA;AAAA,EACzG;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAA,CACP,KAAA,EACA,OAAA,EACA,UAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqC,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,CAAC,CAAA,CAAE,MAAA;AAC1F,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB,SAAA,EAAW,MAAM,WAAW,CAAA;AAAA,IAC5B,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB,OAAA,EAAS,MAAM,SAAS,CAAA;AAAA,IACxB;AAAA,GACF;AACF;;;ACpNO,SAAS,eAAe,GAAA,EAA8C;AAC3E,EAAA,OAAO,OAAO,KAAK,GAAA,KAAQ;AACzB,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,GAAG,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO;AAAA,MAC9B,MAAA,EAAQ,IAAI,MAAA,IAAU,MAAA;AAAA,MACtB,aAAA,EAAe,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,eAAe,CAAC,CAAA;AAAA,MACvD,OAAA;AAAA,MACA,OAAA,EAAS,cAAA,CAAe,GAAA,CAAI,OAAO;AAAA,KACpC,CAAA;AACD,IAAA,GAAA,CAAI,OAAO,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,EAC5C,CAAA;AACF;AAEA,eAAe,SAAS,GAAA,EAA0C;AAChE,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AACvC,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACvF,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,EAAA,KAAO,UAAA,EAAY,OAAO,EAAA;AACzC,EAAA,OAAO,IAAI,OAAA,CAAgB,CAAC,OAAA,KAAY;AACtC,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,GAAA,CAAI,EAAA,CAAI,MAAA,EAAQ,CAAC,KAAA,KAAoB;AACnC,MAAA,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA,CAAO,SAAS,EAAE,CAAA;AAAA,IAChE,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAI,KAAA,EAAO,MAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AAClC,IAAA,GAAA,CAAI,EAAA,CAAI,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,EACtC,CAAC,CAAA;AACH;AAEA,SAAS,YAAY,KAAA,EAA0D;AAC7E,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACxC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,OAAA,EAAgF;AACtG,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC5C,IAAA,IAAI,MAAM,MAAA,EAAW;AACrB,IAAA,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,GAAA;AACT;;;AC7CO,SAAS,YAAY,GAAA,EAAwC;AAClE,EAAA,OAAO,OAAO,GAAA,KAAQ;AACpB,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAK;AAC/B,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,GAAU,CAAC,KAAA,EAAO,GAAA,KAAQ;AACpC,MAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,KAAA;AAAA,IAC/B,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,MAAA,CAAO;AAAA,MAC9B,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,aAAA,EAAe,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,IAAK,MAAA;AAAA,MACnD,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA,EAAG;AAAA,MAC/C,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC/C,CAAA;AAAA,EACH,CAAA;AACF;;;ACXA,IAAM,qBAAA,GAAwB,qBAAA;AAC9B,IAAM,iBAAA,GAAoB,eAAA;AAiCnB,SAAS,gBAAgB,MAAA,EAA0C;AACxE,EAAA,cAAA,CAAe,MAAM,CAAA;AAErB,EAAA,MAAM,QAAA,GAAW,OAAO,iBAAA,IAAqB,IAAA;AAC7C,EAAA,MAAM,eAAA,GAAkB,OAAO,QAAA,IAAY,iBAAA;AAC3C,EAAA,IAAI,QAAA,IAAY,CAAC,eAAA,CAAgB,eAAe,CAAA,EAAG;AACjD,IAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,sBAAA,EAAyB,eAAe,CAAA,6DAAA,CAA0D,CAAA;AAAA,EACnI;AAEA,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,MAAA,CAAO,YAAA,IAAgB,qBAAqB,CAAA;AAC/E,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ,YAAY,CAAA;AAEvD,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,IACjC,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAA,EAAS,OAAO,OAAA,IAAW,0BAAA;AAAA,IAC3B,GAAI,OAAO,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GAAI,EAAC;AAAA,IACxE,GAAI,OAAO,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,EAAY,MAAA,CAAO,UAAA,EAAW,GAAI,EAAC;AAAA,IAC3E,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU;AAAC,GAC/C,CAAA;AAED,EAAA,MAAM,aAAa,gBAAA,CAAiB;AAAA,IAClC,IAAA;AAAA,IACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU,EAAC;AAAA,IAC9C,GAAI,OAAO,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAa,GAAI;AAAC,GAClF,CAAA;AAED,EAAA,MAAM,GAAA,GAAoB;AAAA,IACxB,MAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,YAAA;AAAA,IACA,WAAA;AAAA,IAEA,MAAM,KAAK,OAAA,EAAiD;AAC1D,MAAA,MAAM,IAAA,GAAO,WAAW,EAAC;AAGzB,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,iBAAA;AAAA,YACvB,oBAAA,CAAqB,MAAA,EAAQ,WAAA,EAAa,eAAA,EAAiB,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAG,IAAI;AAAA,WACrF;AACA,UAAA,OAAO;AAAA,YACL,KAAA,EAAO,IAAI,GAAA,CAAI,EAAA;AAAA,YACf,OAAA,EAAS,IAAI,GAAA,CAAI,IAAA;AAAA,YACjB,YAAY,GAAA,CAAI,UAAA;AAAA,YAChB,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,WAAW,GAAA,CAAI,SAAA;AAAA,YACf,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cAC/B,KAAK,CAAA,CAAE,GAAA;AAAA,cACP,QAAQ,CAAA,CAAE,MAAA;AAAA,cACV,QAAQ,CAAA,CAAE,MAAA;AAAA,cACV,GAAI,EAAE,aAAA,GAAgB,EAAE,eAAe,CAAA,CAAE,aAAA,KAAkB;AAAC,aAC9D,CAAE,CAAA;AAAA,YACF,OAAO,GAAA,CAAI;AAAA,WACb;AAAA,QACF,SAAS,CAAA,EAAG;AAEV,UAAA,IAAI,EAAE,aAAa,iBAAA,CAAA,IAAuB,CAAA,CAAE,WAAW,GAAA,IAAO,CAAA,CAAE,MAAA,KAAW,GAAA,EAAM,MAAM,CAAA;AAAA,QACzF;AAAA,MACF;AACA,MAAA,OAAO,SAAA;AAAA,QACL;AAAA,UACE,MAAA;AAAA,UACA,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,WAAA;AAAA,UACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,UACvB,eAAA;AAAA,UACA,IAAA,EAAM,CAAC,GAAG,IAAA,CAAK,QAAQ;AAAA,SACzB;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,IAAI,GAAA,EAAoC;AAC5C,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,aAAA,EAAgB,GAAG,aAAa,CAAC,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC1G;AACA,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK;AAC1C,MAAA,MAAM,SAAA,GAAY,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAO,OAAO,CAAA;AAClE,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAO,CAAA,6CAAA,CAA0C,CAAA;AAAA,MACjG;AACA,MAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,UAAU,EAAE,CAAA;AACtD,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,GAAG,CAAA;AAC7C,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,GAAG,CAAA,2CAAA,CAAwC,CAAA;AAAA,MACpF;AACA,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAAA,IACpC,CAAA;AAAA,IAEA,SAAS,CAAC,GAAA,EAAa,YAAsC,UAAA,CAAW,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC7F,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,cAAA,EAAgB,MAAM,cAAA,CAAe,GAAG,CAAA;AAAA,IACxC,WAAA,EAAa,MAAM,WAAA,CAAY,GAAG,CAAA;AAAA,IAClC,MAAM,MAAM,CAAC,GAAG,IAAA,CAAK,MAAM;AAAA,GAC7B;AAEA,EAAA,OAAO,GAAA;AACT;AAAA,CAOO,CAAUE,gBAAAA,KAAV;AAQE,EAAA,SAAS,OAAA,CACd,QACA,GAAA,GAA0C,OAAO,YAAY,WAAA,GAAc,OAAA,CAAQ,GAAA,GAAM,EAAC,EAC5E;AACd,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,GAAA,CAAI,mBAAmB,CAAA;AACvD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,cAAA,IAAkB,GAAA,CAAI,2BAA2B,CAAA;AAC/E,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,IAAU,IAAI,mBAAmB,CAAA,IAAK,IAAI,YAAY,CAAA;AAC5E,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,GAAA,CAAI,mBAAmB,CAAA;AAEzD,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,CAAC,MAAA,IAAU,mBAAA;AAAA,MACX,CAAC,cAAA,IAAkB,2BAAA;AAAA,MACnB,CAAC,MAAA,IAAU;AAAA,KACb,CAAE,OAAO,OAAO,CAAA;AAChB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,mDAAA,EAAsD,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5G;AAEA,IAAA,OAAOA,gBAAAA,CAAgB;AAAA,MACrB,GAAG,MAAA;AAAA,MACH,MAAA;AAAA,MACA,cAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY;AAAC,KAC9B,CAAA;AAAA,EACH;AAzBO,EAAAA,gBAAAA,CAAS,OAAA,GAAA,OAAA;AAAA,CAAA,EARD,eAAA,KAAA,eAAA,GAAA,EAAA,CAAA,CAAA;AAoCjB,SAAS,eAAe,MAAA,EAAkC;AACxD,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,qBAAqB,2CAA2C,CAAA;AACvF,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAK,EAAG,MAAM,IAAI,oBAAA,CAAqB,wBAAwB,CAAA;AACtG,EAAA,IAAI,CAAC,OAAO,MAAA,IAAU,CAAC,gBAAgB,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAI,qBAAqB,wEAAwE,CAAA;AAAA,EACzG;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,qBAAqB,yCAAoC,CAAA;AACvF,EAAA,IAAI,CAAC,MAAA,CAAO,cAAA,IAAkB,MAAA,CAAO,cAAA,CAAe,SAAS,EAAA,EAAI;AAC/D,IAAA,MAAM,IAAI,qBAAqB,0FAA0F,CAAA;AAAA,EAC3H;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAM,MAAM,IAAI,qBAAqB,qBAAqB,CAAA;AACxE;AAEA,SAAS,aAAA,CAAc,OAA2B,QAAA,EAA6C;AAC7F,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,EAAA,MAAM,OAAA,GAA8D,KAAA,CAAM,OAAA,CAAQ,KAAK,IACnF,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,MAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAK,CAAE,CAAA,GACvD,MAAA,CAAO,OAAA,CAAQ,KAAK,EAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,MAAO,EAAE,GAAA,EAAK,QAAO,CAAE,CAAA;AAElE,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,MAAA,EAAO,IAAK,OAAA,EAAS;AACrC,IAAA,MAAM,OAAA,GAAA,CAAW,GAAA,IAAO,EAAA,EAAI,IAAA,EAAK;AACjC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,qBAAqB,kCAAkC,CAAA;AAC/E,IAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAK,MAAM,IAAI,oBAAA,CAAqB,CAAA,SAAA,EAAY,OAAO,CAAA,yBAAA,CAA2B,CAAA;AACvG,IAAA,IAAI,GAAA,CAAI,IAAI,OAAO,CAAA,QAAS,IAAI,oBAAA,CAAqB,CAAA,mBAAA,EAAsB,OAAO,CAAA,EAAA,CAAI,CAAA;AACtF,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,CAAO,YAAY,UAAA,EAAY;AACnD,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,OAAO,CAAA,gCAAA,CAAkC,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,MAAK,EAAG;AAC/C,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,OAAO,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAA;AAC9C,MAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,OAAO,CAAA,2BAAA,EAA8B,OAAO,QAAQ,CAAA,SAAA,EAAO,SAAA,CAAU,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MACtH;AACA,MAAA,IAAI,OAAO,QAAA,KAAa,MAAA,IAAa,CAAC,eAAA,CAAgB,MAAA,CAAO,QAAQ,CAAA,EAAG;AACtE,QAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,KAAA,EAAQ,OAAO,CAAA,2BAAA,EAA8B,MAAA,CAAO,QAAQ,CAAA,+BAAA,CAA4B,CAAA;AAAA,MACzH;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAI,OAAA,EAAS,EAAE,GAAA,EAAK,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC3C;AACA,EAAA,IAAI,IAAI,IAAA,KAAS,CAAA,EAAG,MAAM,IAAI,qBAAqB,+BAA+B,CAAA;AAClF,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GAAI,QAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAA;AACvG;AAEA,SAAS,OAAA,CAAQ,MAAc,IAAA,EAAsB;AACnD,EAAA,OAAO,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAA,CAAA;AAC3C;AAGA,SAAS,oBAAA,CACP,MAAA,EACA,WAAA,EACA,eAAA,EACA,MACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,KAAA,GAA6B,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACjD,IAAA,MAAM,MAAM,CAAA,CAAE,MAAA;AACd,IAAA,MAAM,IAAA,GAA0B;AAAA,MAC9B,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,SAAA,EAAW,WAAA;AAAA,MACX,aAAa,MAAA,CAAO,cAAA;AAAA,MACpB,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,IAAI,QAAA,IAAY,eAAA;AAAA,MAC1B,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,GAAI,GAAA,CAAI,OAAA,IAAW,EAAC,EAAI;AAAA,KACpE;AACA,IAAA,IAAI,GAAA,CAAI,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,cAAc,GAAA,CAAI,WAAA;AAC1D,IAAA,IAAI,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AAClD,IAAA,IAAI,GAAA,CAAI,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,GAAA,CAAI,UAAA;AACxD,IAAA,IAAI,GAAA,CAAI,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,GAAA,CAAI,aAAA;AAC9D,IAAA,IAAI,GAAA,CAAI,iBAAA,KAAsB,MAAA,EAAW,IAAA,CAAK,oBAAoB,GAAA,CAAI,iBAAA;AACtE,IAAA,IAAI,GAAA,CAAI,mBAAA,KAAwB,MAAA,EAAW,IAAA,CAAK,sBAAsB,GAAA,CAAI,mBAAA;AAC1E,IAAA,IAAI,GAAA,CAAI,eAAA,KAAoB,MAAA,EAAW,IAAA,CAAK,kBAAkB,GAAA,CAAI,eAAA;AAClE,IAAA,IAAI,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,GAAA,CAAI,OAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,KAAA;AAAA,IACA,KAAA,EAAO,KAAK,KAAA,IAAS,IAAA;AAAA,IACrB,YAAA,EAAc,KAAK,YAAA,IAAgB;AAAA,GACrC;AACF;;;ACnSA,IAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA;AAClC,IAAM,IAAA,GAAO;AAAA,EACX,KAAA,EAAO,GAAG,GAAG,CAAA,GAAA,CAAA;AAAA,EACb,GAAA,EAAK,GAAG,GAAG,CAAA,GAAA,CAAA;AAAA,EACX,IAAA,EAAM,GAAG,GAAG,CAAA,GAAA,CAAA;AAAA,EACZ,KAAA,EAAO,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA,EACb,MAAA,EAAQ,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA,EACd,GAAA,EAAK,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA,EACX,IAAA,EAAM,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA,EACZ,IAAA,EAAM,GAAG,GAAG,CAAA,IAAA;AACd,CAAA;AAIA,IAAM,KAAA,GAA+E;AAAA,EACnF,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,OAAA,EAAQ;AAAA,EACrC,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,QAAA,EAAS;AAAA,EACtC,SAAA,EAAW,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,MAAA,EAAO;AAAA,EACtC,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,KAAA,EAAM;AAAA,EACnC,OAAA,EAAS,EAAE,IAAA,EAAM,MAAA,EAAK,OAAO,MAAA;AAC/B,CAAA;AAGO,SAAS,gBAAA,CAAiB,MAAA,EAAyB,OAAA,GAAyB,EAAC,EAAW;AAC7F,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAc,QAAQ,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,GAAK,CAAA;AACxF,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,GAAS,YAAA,GAAe,QAAA;AAC7C,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,EAAG,MAAM,WAAA,EAAa,MAAM,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAA,CAAA,EAAK,MAAM,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,MAAA,CAAO,KAAK,CAAA,CAAA,CAAA,EAAK,MAAM,CAAC,CAAA;AAAA,GACrH;AAGA,EAAA,MAAM,QAAyC,CAAC,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,WAAW,WAAW,CAAA;AACvG,EAAA,MAAM,SAAS,CAAC,GAAG,OAAO,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AACnG,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA;AACxB,IAAA,MAAM,MAAA,GACJ,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAE,aAAA,CAAc,SAC/B,KAAA,CAAM,CAAA,EAAA,EAAK,CAAA,CAAE,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,EAAK,MAAM,CAAA,GAChD,CAAA,CAAE,MAAA,GACA,KAAA,CAAM,KAAK,CAAA,CAAE,MAAM,CAAA,CAAA,CAAA,EAAK,MAAM,CAAA,GAC9B,EAAA;AACR,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAA,CAAE,OAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAC,IAAI,CAAA,CAAE,GAAG,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,EAClG;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,MAAA,CAAO,OAAA,IAAW,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,QAAA,CAAA;AAAA,IACnC,MAAA,CAAO,OAAA,IAAW,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,QAAA,CAAA;AAAA,IACnC,MAAA,CAAO,SAAA,IAAa,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA,UAAA,CAAA;AAAA,IACvC,MAAA,CAAO,OAAA,IAAW,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,QAAA,CAAA;AAAA,IACnC,MAAA,CAAO,OAAA,IAAW,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,QAAA;AAAA,GACrC,CAAE,OAAO,OAAO,CAAA;AAChB,EAAA,MAAM,UAAU,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,YAAA;AAClD,EAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA,GAAa,KAAA,CAAM,2BAAA,EAA0B,MAAM,CAAA,GAAI,EAAA;AACpF,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAA,CAAM,OAAA,EAAS,MAAM,CAAC,CAAA,EAAG,aAAa,CAAA,CAAE,CAAA;AAExD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACpDA,IAAM,GAAA,GAA8B,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AAGtF,SAAS,KAAK,UAAA,EAA4B;AAC/C,EAAA,eAAA,CAAgB,YAAY,QAAQ,CAAA;AACpC,EAAA,OAAO,UAAA;AACT;AAQO,SAAS,MAAM,QAAA,EAA0B;AAC9C,EAAA,MAAM,CAAA,GAAI,mEAAA,CAAoE,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAClG,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,gDAAA,CAA6C,CAAA;AAChH,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACrB,EAAA,MAAM,OAAO,CAAA,CAAE,CAAC,CAAA,CAAG,WAAA,GAAc,CAAC,CAAA;AAClC,EAAA,IAAI,IAAI,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,CAAC,CAAA,CAAE,CAAA;AAE3E,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,IAAI,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAAsC,CAAC,CAAA,CAAE,CAAA;AACrE,IAAA,IAAA,GAAO,KAAK,CAAC,CAAA,UAAA,CAAA;AAAA,EACf,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,IAAA,IAAI,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,0DAAA,EAAwD,CAAC,CAAA,CAAE,CAAA;AACvF,IAAA,IAAA,GAAO,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,EACf,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,IAAA,IAAI,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,wDAAA,EAAsD,CAAC,CAAA,CAAE,CAAA;AACrF,IAAA,IAAA,GAAO,OAAO,CAAC,CAAA,MAAA,CAAA;AAAA,EACjB,CAAA,MAAO;AACL,IAAA,IAAI,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAmC,CAAC,CAAA,CAAE,CAAA;AAClE,IAAA,IAAA,GAAO,CAAA,KAAM,CAAA,GAAI,CAAA,SAAA,CAAA,GAAc,CAAA,MAAA,EAAS,CAAC,CAAA,IAAA,CAAA;AAAA,EAC3C;AACA,EAAA,eAAA,CAAgB,IAAA,EAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,EAAA,CAAI,CAAA;AAC5C,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,aAAa,CAAA,EAAmB;AAC9C,EAAA,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AACtB;AAGO,SAAS,WAAW,CAAA,EAAmB;AAC5C,EAAA,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AACtB;AAGO,SAAS,MAAA,CAAO,SAAS,CAAA,EAAW;AACzC,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAG,IAAI,QAAQ,CAAA;AACxC,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,QAAA,CAAU,CAAA;AAC7B;AAGO,SAAS,KAAA,CAAM,OAAO,OAAA,EAAiB;AAC5C,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,MAAA,CAAQ,CAAA;AACjC;AAGO,SAAS,MAAA,CAAO,GAAA,EAAc,IAAA,GAAO,OAAA,EAAiB;AAC3D,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,OAAO,IAAA,CAAK,GAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,KAAA,EAAQ,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAE,CAAA;AAC/C;AAGO,SAAS,OAAA,CAAQ,UAAA,EAAoB,IAAA,GAAO,OAAA,EAAiB;AAClE,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,EAAY,CAAA,EAAG,IAAI,cAAc,CAAA;AACnD,EAAA,OAAO,KAAK,CAAA,EAAG,EAAE,IAAI,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,IAAA,CAAM,CAAA;AACtC;AAGO,SAAS,QAAA,CAAS,OAAO,OAAA,EAAiB;AAC/C,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,QAAA,CAAU,CAAA;AACnC;AAGO,SAAS,QAAA,CAAS,OAAO,OAAA,EAAiB;AAC/C,EAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAG,GAAI,UAAU,IAAI,CAAA;AACjC,EAAA,OAAO,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,QAAA,CAAU,CAAA;AACnC;AAGO,IAAM,QAAA,GAAW;AAAA,EACtB,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,YAAA;AAAA,EAAc,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU;AACnF;AAEA,SAAS,UAAU,IAAA,EAA0C;AAC3D,EAAA,MAAM,CAAA,GAAI,qBAAA,CAAsB,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAChD,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiD,IAAI,CAAA,CAAA,CAAG,CAAA;AAChF,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AACtB,EAAA,IAAI,KAAK,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA0B,EAAE,CAAA,CAAE,CAAA;AAC3D,EAAA,IAAI,KAAK,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAA4B,EAAE,CAAA,CAAE,CAAA;AAC7D,EAAA,OAAO,EAAE,IAAI,EAAA,EAAG;AAClB;AAEA,SAAS,QAAQ,GAAA,EAAsB;AACrC,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,GAAA,GAAM,KAAK,GAAA,GAAM,CAAA,QAAS,IAAI,KAAA,CAAM,CAAA,mDAAA,EAAiD,GAAG,CAAA,CAAE,CAAA;AAC9F,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA;AAC/B,EAAA,IAAI,MAAM,MAAA,EAAW,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,GAAG,CAAA,qCAAA,CAAwB,CAAA;AACpF,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAa,KAAA,EAAuB;AAC7E,EAAA,IAAI,CAAC,OAAO,SAAA,CAAU,KAAK,KAAK,KAAA,GAAQ,GAAA,IAAO,QAAQ,GAAA,EAAK;AAC1D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,oBAAA,EAAuB,GAAG,CAAA,MAAA,EAAI,GAAG,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,KAAA;AACT;;;ACxCO,SAAS,sBAAA,CAAuB,QAAQ,EAAA,EAAY;AACzD,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,KAAK,CAAA;AAChC,EAAA,MAAA,CAAO,gBAAgB,GAAG,CAAA;AAC1B,EAAA,OAAO,MAAM,IAAA,CAAK,GAAG,CAAA,CAClB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA;AACZ","file":"index.js","sourcesContent":["/**\n * Error taxonomy for the SDK. Everything thrown by the public surface is a\n * `CronvelloError` (or subclass), so callers can `catch (e) { if (e instanceof CronvelloError) … }`.\n */\n\nexport class CronvelloError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloError\";\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A non-2xx response from the Cronvello API. */\nexport class CronvelloApiError extends CronvelloError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the API body, when present. */\n readonly code: string | undefined;\n /** The method + path that failed, e.g. `POST /v1/jobs`. */\n readonly endpoint: string;\n /** Parsed response body (best effort). */\n readonly body: unknown;\n /** Seconds to wait before retrying, parsed from `Retry-After` / rate-limit payload (429 only). */\n readonly retryAfterSeconds: number | undefined;\n\n constructor(args: {\n status: number;\n endpoint: string;\n message: string;\n code?: string;\n body?: unknown;\n retryAfterSeconds?: number;\n }) {\n super(`[${args.status}] ${args.endpoint}: ${args.message}`);\n this.name = \"CronvelloApiError\";\n this.status = args.status;\n this.code = args.code;\n this.endpoint = args.endpoint;\n this.body = args.body;\n this.retryAfterSeconds = args.retryAfterSeconds;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n}\n\n/** A network/transport failure (DNS, connection reset, timeout) before any HTTP status. */\nexport class CronvelloNetworkError extends CronvelloError {\n readonly endpoint: string;\n override readonly cause: unknown;\n constructor(endpoint: string, cause: unknown) {\n super(`Network error calling ${endpoint}: ${describe(cause)}`);\n this.name = \"CronvelloNetworkError\";\n this.endpoint = endpoint;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A misconfiguration caught before any network call (missing apiKey, bad URL, …). */\nexport class CronvelloConfigError extends CronvelloError {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloConfigError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nfunction describe(cause: unknown): string {\n if (cause instanceof Error) return cause.message;\n return String(cause);\n}\n","/**\n * Minimal HTTP transport over the global `fetch` (Node 20+). No axios, no node-fetch —\n * zero runtime dependencies. Adds bearer auth, JSON (de)serialization, typed error mapping,\n * bounded retries with backoff for transient failures, and optional idempotency keys.\n */\n\nimport {\n CronvelloApiError,\n CronvelloConfigError,\n CronvelloNetworkError,\n} from \"./errors.js\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n ok: boolean;\n status: number;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}>;\n\nexport interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n /** Per-request timeout in ms. Default 30_000. */\n timeoutMs?: number;\n /** Max retry attempts for 429/5xx/network errors. Default 2 (=> up to 3 tries). */\n maxRetries?: number;\n /** Override the fetch implementation (testing / custom agents). */\n fetch?: FetchLike;\n /** Extra headers sent on every request (e.g. a custom User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Telemetry hook — called once per completed attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Idempotency-Key header value — replays of the same key are de-duplicated server-side. */\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly onRequest: TransportOptions[\"onRequest\"];\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) throw new CronvelloConfigError(\"apiKey is required\");\n if (!opts.baseUrl) throw new CronvelloConfigError(\"baseUrl is required\");\n const resolvedFetch = opts.fetch ?? (globalThis.fetch as unknown as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new CronvelloConfigError(\n \"No global fetch found. Use Node 20+ or pass a `fetch` implementation in the client options.\",\n );\n }\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.maxRetries = opts.maxRetries ?? 2;\n this.fetchImpl = resolvedFetch;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.onRequest = opts.onRequest;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const endpoint = `${opts.method} ${opts.path}`;\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n ...this.defaultHeaders,\n };\n let payload: string | undefined;\n if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(opts.body);\n }\n if (opts.idempotencyKey) headers[\"idempotency-key\"] = opts.idempotencyKey;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const startedAt = Date.now();\n const { signal, cancel } = this.withTimeout(opts.signal);\n try {\n const res = await this.fetchImpl(url, {\n method: opts.method,\n headers,\n ...(payload !== undefined ? { body: payload } : {}),\n signal,\n });\n cancel();\n const durationMs = Date.now() - startedAt;\n this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });\n\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (res.ok) return unwrapEnvelope(parsed) as T;\n\n const retryAfter = parseRetryAfter(res, parsed);\n if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {\n await sleep(this.backoff(attempt, retryAfter));\n continue;\n }\n throw new CronvelloApiError({\n status: res.status,\n endpoint,\n message: extractMessage(parsed) ?? `Request failed`,\n code: extractCode(parsed),\n body: parsed,\n ...(retryAfter !== undefined ? { retryAfterSeconds: retryAfter } : {}),\n });\n } catch (err) {\n cancel();\n if (err instanceof CronvelloApiError) throw err;\n // Network/abort error — retry if attempts remain.\n lastError = err;\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt));\n continue;\n }\n throw new CronvelloNetworkError(endpoint, err);\n }\n }\n // Unreachable, but satisfies the type checker.\n throw new CronvelloNetworkError(endpoint, lastError);\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n if (!query) return base;\n const params = Object.entries(query)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n return params.length ? `${base}?${params.join(\"&\")}` : base;\n }\n\n private withTimeout(external?: AbortSignal): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const onExternalAbort = () => controller.abort();\n if (external) {\n if (external.aborted) controller.abort();\n else external.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n return {\n signal: controller.signal,\n cancel: () => {\n clearTimeout(timer);\n external?.removeEventListener(\"abort\", onExternalAbort);\n },\n };\n }\n\n private backoff(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds !== undefined) return Math.min(retryAfterSeconds * 1000, 30_000);\n // Exponential backoff with full jitter: base 300ms, capped at 5s.\n const base = Math.min(300 * 2 ** attempt, 5_000);\n return Math.floor(Math.random() * base);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/**\n * The Cronvello server wraps every successful `/v1` response in a `{ success, message, data }`\n * envelope, while the typed client methods are declared in terms of the inner payload. Unwrap\n * it here — centrally — so every resource method (and the high-level `sync()`) sees the data it\n * expects. Bodies that aren't enveloped (no boolean `success` + `data`) pass through unchanged,\n * so non-enveloped or future endpoints keep working.\n */\nfunction unwrapEnvelope(body: unknown): unknown {\n if (\n body !== null &&\n typeof body === \"object\" &&\n \"success\" in body &&\n typeof (body as { success: unknown }).success === \"boolean\" &&\n \"data\" in body\n ) {\n return (body as { data: unknown }).data;\n }\n return body;\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"message\" in body) {\n const m = (body as { message?: unknown }).message;\n if (typeof m === \"string\") return m;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"code\" in body) {\n const c = (body as { code?: unknown }).code;\n if (typeof c === \"string\") return c;\n }\n return undefined;\n}\n\nfunction parseRetryAfter(\n res: { headers: { get(name: string): string | null } },\n body: unknown,\n): number | undefined {\n const header = res.headers.get(\"retry-after\");\n if (header) {\n const n = Number(header);\n if (Number.isFinite(n)) return n;\n }\n if (body && typeof body === \"object\" && \"data\" in body) {\n const data = (body as { data?: { retryAfterSeconds?: unknown } }).data;\n if (data && typeof data.retryAfterSeconds === \"number\") return data.retryAfterSeconds;\n }\n return undefined;\n}\n","/**\n * Low-level, fully-typed client for the Cronvello public `/v1` API.\n *\n * This is the thin REST layer: one method per endpoint, request/response types straight\n * from the server contract. The high-level registry (`defineCronvello`) is built on top of\n * it. Use this directly when you need ad-hoc control beyond the registry model.\n */\n\nimport { Transport, type FetchLike } from \"../internal/http.js\";\nimport { CronvelloConfigError } from \"../internal/errors.js\";\nimport type {\n AccountRunsQuery,\n AccountTasksQuery,\n JobCreateBody,\n JobUpdateBody,\n MeResponse,\n PublicJob,\n PublicRun,\n PublicTask,\n RunNowResult,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RunsPage,\n RunsQuery,\n TaskCreateBody,\n TasksPage,\n TaskUpdateBody,\n UsageResponse,\n} from \"../internal/wire.js\";\n\n/** The production Cronvello API. Override `baseUrl` only for self-hosting or testing. */\nexport const CRONVELLO_DEFAULT_BASE_URL = \"https://api.cronvello.com\";\n\nexport interface CronvelloClientOptions {\n /** Account API key (`crn_live_…`). Required. */\n apiKey: string;\n /** API base URL. Defaults to https://api.cronvello.com. */\n baseUrl?: string;\n /** Per-request timeout in ms (default 30_000). */\n timeoutMs?: number;\n /** Retry attempts for 429/5xx/network errors (default 2). */\n maxRetries?: number;\n /** Custom fetch implementation (default: global fetch). */\n fetch?: FetchLike;\n /** Telemetry hook for every request attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport class CronvelloClient {\n private readonly transport: Transport;\n /** The resolved base URL in use. */\n readonly baseUrl: string;\n\n /** Job container operations. */\n readonly jobs: JobsResource;\n /** Scheduled task operations. */\n readonly tasks: TasksResource;\n /** Execution-history (run) operations. */\n readonly runs: RunsResource;\n /** Account identity + usage. */\n readonly account: AccountResource;\n\n constructor(options: CronvelloClientOptions) {\n if (!options || !options.apiKey) {\n throw new CronvelloConfigError(\"CronvelloClient requires an `apiKey` (crn_live_…).\");\n }\n this.baseUrl = (options.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.transport = new Transport({\n baseUrl: this.baseUrl,\n apiKey: options.apiKey,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.onRequest ? { onRequest: options.onRequest } : {}),\n defaultHeaders: { \"user-agent\": \"cronvello-sdk\" },\n });\n this.jobs = new JobsResource(this.transport);\n this.tasks = new TasksResource(this.transport);\n this.runs = new RunsResource(this.transport);\n this.account = new AccountResource(this.transport);\n }\n\n /**\n * Atomically reconcile a whole code registry server-side (`PUT /v1/registry`): one job\n * container + its tasks, created/updated/pruned/started in a single call. This is what\n * `defineCronvello().sync()` prefers; the high-level API builds the body for you.\n */\n reconcileRegistry(body: RegistryReconcileRequest, opts?: { idempotencyKey?: string }): Promise<RegistryReconcileResponse> {\n return this.transport.request({\n method: \"PUT\",\n path: \"/v1/registry\",\n body,\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n\n /**\n * Escape hatch for endpoints not yet wrapped by a typed method (heartbeat monitors,\n * maintenance windows, DLQ, notification channels, audit log, API-key self-service …).\n * `T` is the response shape you expect.\n */\n request<T>(method: string, path: string, opts?: { query?: Record<string, string | number | boolean | undefined>; body?: unknown; idempotencyKey?: string }): Promise<T> {\n return this.transport.request<T>({\n method,\n path,\n ...(opts?.query ? { query: opts.query } : {}),\n ...(opts?.body !== undefined ? { body: opts.body } : {}),\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n}\n\nclass JobsResource {\n constructor(private readonly t: Transport) {}\n\n list(): Promise<PublicJob[]> {\n return this.t.request({ method: \"GET\", path: \"/v1/jobs\" });\n }\n get(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}` });\n }\n create(body: JobCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: \"/v1/jobs\", body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n update(jobId: string, body: JobUpdateBody): Promise<PublicJob> {\n return this.t.request({ method: \"PATCH\", path: `/v1/jobs/${enc(jobId)}`, body });\n }\n delete(jobId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/jobs/${enc(jobId)}` });\n }\n start(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/start` });\n }\n stop(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/stop` });\n }\n listTasks(jobId: string): Promise<PublicTask[]> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}/tasks` });\n }\n createTask(jobId: string, body: TaskCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/tasks`, body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n}\n\nclass TasksResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated task table. */\n list(query?: AccountTasksQuery): Promise<TasksPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/tasks\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}` });\n }\n update(taskId: string, body: TaskUpdateBody): Promise<PublicTask> {\n return this.t.request({ method: \"PATCH\", path: `/v1/tasks/${enc(taskId)}`, body });\n }\n delete(taskId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/tasks/${enc(taskId)}` });\n }\n start(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/start` });\n }\n stop(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/stop` });\n }\n /** Trigger a one-off manual execution (does not change the schedule). */\n runNow(taskId: string): Promise<RunNowResult> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/run` });\n }\n listRuns(taskId: string, query?: RunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}/runs`, ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n}\n\nclass RunsResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated activity feed. */\n list(query?: AccountRunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/runs\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(runId: string): Promise<PublicRun> {\n return this.t.request({ method: \"GET\", path: `/v1/runs/${enc(runId)}` });\n }\n}\n\nclass AccountResource {\n constructor(private readonly t: Transport) {}\n\n me(): Promise<MeResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/me\" });\n }\n usage(): Promise<UsageResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/usage\" });\n }\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n","/**\n * Client-side cron + IANA-timezone validation.\n *\n * The goal is to catch *typos* at define/sync time with a clear message — not to re-implement the\n * server's scheduler. So the validator is deliberately permissive: it accepts the standard 5-field\n * crontab syntax (and an optional leading seconds field), the common `@macros`, names for months\n * and weekdays, and step/range/list combinations. Anything it cannot confidently reject is allowed\n * through, so a valid-but-unusual expression never blocks a deploy.\n */\n\nconst MACROS = new Set([\n \"@yearly\", \"@annually\", \"@monthly\", \"@weekly\", \"@daily\", \"@midnight\", \"@hourly\", \"@reboot\",\n]);\n\nconst MONTHS = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\", \"jul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"];\nconst DOWS = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\n\ninterface FieldSpec {\n min: number;\n max: number;\n names?: string[];\n label: string;\n}\n\n// Field order for a 5-part expression.\nconst FIVE: FieldSpec[] = [\n { min: 0, max: 59, label: \"minute\" },\n { min: 0, max: 23, label: \"hour\" },\n { min: 1, max: 31, label: \"day-of-month\" },\n { min: 1, max: 12, names: MONTHS, label: \"month\" },\n { min: 0, max: 7, names: DOWS, label: \"day-of-week\" }, // 0 and 7 are both Sunday\n];\nconst SECONDS: FieldSpec = { min: 0, max: 59, label: \"second\" };\n\nexport interface CronValidation {\n valid: boolean;\n /** Human-readable reason when invalid. */\n error?: string;\n}\n\n/** Validate a cron expression. Returns `{ valid, error? }` rather than throwing. */\nexport function validateCron(expr: string): CronValidation {\n if (typeof expr !== \"string\" || !expr.trim()) {\n return { valid: false, error: \"schedule is empty\" };\n }\n const trimmed = expr.trim();\n if (trimmed.startsWith(\"@\")) {\n return MACROS.has(trimmed.toLowerCase())\n ? { valid: true }\n : { valid: false, error: `unknown cron macro \"${trimmed}\" (try @daily, @hourly, …)` };\n }\n\n const parts = trimmed.split(/\\s+/);\n if (parts.length !== 5 && parts.length !== 6) {\n return {\n valid: false,\n error: `expected 5 fields (min hour dom month dow) or 6 with seconds, got ${parts.length}: \"${trimmed}\"`,\n };\n }\n\n const specs = parts.length === 6 ? [SECONDS, ...FIVE] : FIVE;\n for (let i = 0; i < parts.length; i++) {\n const err = validateField(parts[i]!, specs[i]!);\n if (err) return { valid: false, error: `invalid ${specs[i]!.label} \"${parts[i]}\": ${err}` };\n }\n return { valid: true };\n}\n\nfunction validateField(field: string, spec: FieldSpec): string | null {\n // A field is a comma-separated list of terms.\n for (const term of field.split(\",\")) {\n const err = validateTerm(term, spec);\n if (err) return err;\n }\n return null;\n}\n\nfunction validateTerm(term: string, spec: FieldSpec): string | null {\n if (term === \"\") return \"empty list item\";\n // step: <range-or-*>/<n>\n let step: string | undefined;\n let base = term;\n const slash = term.indexOf(\"/\");\n if (slash >= 0) {\n base = term.slice(0, slash);\n step = term.slice(slash + 1);\n if (!/^\\d+$/.test(step) || Number(step) === 0) return `step must be a positive integer`;\n }\n if (base === \"*\") return null;\n // range: a-b\n const dash = base.indexOf(\"-\");\n if (dash > 0) {\n const lo = resolveValue(base.slice(0, dash), spec);\n const hi = resolveValue(base.slice(dash + 1), spec);\n if (lo === null) return `\"${base.slice(0, dash)}\" is out of range ${spec.min}-${spec.max}`;\n if (hi === null) return `\"${base.slice(dash + 1)}\" is out of range ${spec.min}-${spec.max}`;\n if (lo > hi) return `range start ${lo} is greater than end ${hi}`;\n return null;\n }\n // single value (only meaningful with a step if it's the base of `n/step`, which crontab rejects;\n // but most parsers accept it, so we stay permissive).\n if (step !== undefined && base !== \"*\") {\n // e.g. \"5/10\" — accept the base as a start value.\n return resolveValue(base, spec) === null ? `\"${base}\" is out of range ${spec.min}-${spec.max}` : null;\n }\n return resolveValue(base, spec) === null ? `\"${base}\" is out of range ${spec.min}-${spec.max}` : null;\n}\n\n/** Resolve a numeric or named field value to its number, or null if out of range / unknown. */\nfunction resolveValue(token: string, spec: FieldSpec): number | null {\n if (/^\\d+$/.test(token)) {\n const n = Number(token);\n return n >= spec.min && n <= spec.max ? n : null;\n }\n if (spec.names) {\n const idx = spec.names.indexOf(token.toLowerCase());\n if (idx >= 0) return idx + (spec.label === \"month\" ? 1 : 0);\n }\n return null;\n}\n\n/** Throw a clear error if the cron expression is invalid. `context` is woven into the message. */\nexport function assertValidCron(expr: string, context = \"\"): void {\n const res = validateCron(expr);\n if (!res.valid) {\n throw new Error(`${context ? `${context}: ` : \"\"}invalid cron schedule — ${res.error}`);\n }\n}\n\n/** True if `tz` is a valid IANA timezone (uses the runtime's Intl database). \"UTC\" always passes. */\nexport function isValidTimeZone(tz: string): boolean {\n if (!tz || typeof tz !== \"string\") return false;\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: tz });\n return true;\n } catch {\n return false;\n }\n}\n\n/** Throw a clear error if the timezone is not a valid IANA zone. */\nexport function assertValidTimeZone(tz: string, context = \"\"): void {\n if (!isValidTimeZone(tz)) {\n throw new Error(`${context ? `${context}: ` : \"\"}invalid timezone \"${tz}\" (expected an IANA name like \"Europe/Berlin\" or \"UTC\")`);\n }\n}\n","/**\n * Authentication helpers for the dispatch handler.\n *\n * Inbound (Cronvello → app): a bearer token equal to the configured `dispatchSecret`.\n * We compare it in constant time to avoid leaking the secret through timing.\n *\n * Outbound (app → Cronvello, async_callback only): we sign the callback body with\n * HMAC-SHA256 (`sha256=<hex>`), matching node-cron's `webhook-hmac.service`.\n */\n\nconst encoder = new TextEncoder();\n\n/** Parse `Authorization: Bearer <token>` (scheme is case-insensitive). Returns the token or null. */\nexport function parseBearer(headerValue: string | undefined): string | null {\n if (!headerValue) return null;\n const match = /^bearer\\s+(.+)$/i.exec(headerValue.trim());\n return match ? match[1]!.trim() : null;\n}\n\n/**\n * Constant-time string comparison. Runs in time proportional to the longer input and never\n * short-circuits, so it does not reveal where two values diverge. No `node:crypto` dependency,\n * so it works on edge runtimes too.\n */\nexport function timingSafeEqual(a: string, b: string): boolean {\n const ab = encoder.encode(a);\n const bb = encoder.encode(b);\n const len = Math.max(ab.length, bb.length);\n let diff = ab.length ^ bb.length;\n for (let i = 0; i < len; i++) {\n diff |= (ab[i] ?? 0) ^ (bb[i] ?? 0);\n }\n return diff === 0;\n}\n\n/**\n * HMAC-SHA256 signature in node-cron's wire format: `sha256=<hex>`.\n * Uses WebCrypto (`crypto.subtle`), a global on Node 20+ and edge runtimes — no node:crypto.\n */\nexport async function signHmacSha256(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n const hex = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return `sha256=${hex}`;\n}\n","/**\n * Framework-neutral dispatch core.\n *\n * Cronvello fires a due task by POSTing to the app's dispatch URL with\n * Authorization: Bearer <dispatchSecret>\n * body: { job: \"<registry-key>\", schedule: \"<cron>\", ...payload, _callback?: {...} }\n *\n * This module verifies the bearer, selects the job by key, runs its handler, and returns a\n * response. The Express/Next adapters are thin shells that translate their request/response\n * objects to/from the neutral shapes below.\n */\n\nimport type { CronvelloHooks, CronvelloJobConfig, CronvelloJobContext, CronvelloLogger, CronvelloRunSource } from \"./types.js\";\nimport { parseBearer, signHmacSha256, timingSafeEqual } from \"./verify.js\";\n\nexport interface ResolvedJob {\n key: string;\n config: CronvelloJobConfig;\n}\n\n/** A logger that discards everything — used when the app configures none, so `ctx.logger` is always safe. */\nexport const NOOP_LOGGER: CronvelloLogger = {};\n\nexport interface DispatcherState {\n jobs: Map<string, ResolvedJob>;\n dispatchSecret: string;\n logger: CronvelloLogger | undefined;\n hooks?: CronvelloHooks | undefined;\n /** Reject inbound bodies larger than this many bytes (default 1 MiB). */\n maxBodyBytes?: number;\n}\n\nexport interface DispatchRequest {\n method: string;\n /** Value of the Authorization header, if any. */\n authorization: string | undefined;\n /** Raw request body as text. */\n rawBody: string;\n /** Lower-cased request headers. */\n headers: Record<string, string>;\n /** Abort signal for the inbound request, if the host provides one. */\n signal?: AbortSignal;\n /**\n * Optional serverless lifecycle hook (e.g. Vercel/Cloudflare `ctx.waitUntil`). When present,\n * async_callback background work is registered with it so the function stays alive until done.\n */\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\nexport interface DispatchResponse {\n status: number;\n body: Record<string, unknown>;\n}\n\n/** Async-callback metadata Cronvello injects into the request body. */\ninterface CallbackEnvelope {\n url: string;\n runId: string;\n expectedSignatureHeader?: string;\n timeoutMs?: number;\n}\n\nexport interface Dispatcher {\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Run a job's handler in-process (no HTTP, no auth) — powers `cronvello.trigger()`. */\n runLocal(key: string, payload?: Record<string, unknown>): Promise<unknown>;\n}\n\nexport function createDispatcher(state: DispatcherState): Dispatcher {\n const log = state.logger ?? NOOP_LOGGER;\n const hooks = state.hooks;\n const maxBodyBytes = state.maxBodyBytes ?? 1_048_576; // 1 MiB\n\n /** Run the handler with lifecycle hooks + timing. Hook failures never break the run. */\n async function invokeHandler(job: ResolvedJob, ctx: CronvelloJobContext): Promise<{ durationMs: number; result: unknown }> {\n await safeHook(() => hooks?.onJobStart?.({ key: job.key, source: ctx.source, isAsync: ctx.isAsync }), log);\n const startedAt = Date.now();\n try {\n const result = await job.config.handler(ctx);\n const durationMs = Date.now() - startedAt;\n log.debug?.(`[cronvello] job '${job.key}' completed in ${durationMs}ms`);\n await safeHook(() => hooks?.onJobSuccess?.({ key: job.key, source: ctx.source, durationMs, result }), log);\n return { durationMs, result };\n } catch (err) {\n const durationMs = Date.now() - startedAt;\n const error = err instanceof Error ? err : new Error(String(err));\n log.error?.(`[cronvello] job '${job.key}' failed: ${error.message}`, { error: error.message });\n await safeHook(() => hooks?.onJobError?.({ key: job.key, source: ctx.source, durationMs, error }), log);\n throw error;\n }\n }\n\n function buildContext(key: string, job: ResolvedJob, req: DispatchRequest | null, body: Record<string, unknown>, isAsync: boolean, source: CronvelloRunSource): CronvelloJobContext {\n return {\n key,\n schedule: typeof body[\"schedule\"] === \"string\" ? (body[\"schedule\"] as string) : (job.config.schedule ?? \"\"),\n payload: (job.config.payload as Record<string, unknown>) ?? {},\n body,\n headers: req?.headers ?? {},\n isAsync,\n source,\n logger: log,\n signal: req?.signal,\n };\n }\n\n async function handle(req: DispatchRequest): Promise<DispatchResponse> {\n if (req.method.toUpperCase() !== \"POST\") {\n return resp(405, { ok: false, error: \"Method not allowed\" });\n }\n\n // 1. Authenticate: bearer must equal the dispatch secret (constant-time).\n const token = parseBearer(req.authorization);\n if (!token || !timingSafeEqual(token, state.dispatchSecret)) {\n log.warn?.(\"[cronvello] dispatch rejected: bad or missing bearer token\");\n return resp(401, { ok: false, error: \"Unauthorized\" });\n }\n\n // 2. Guard body size before parsing (defence against oversized/abusive payloads).\n if (byteLength(req.rawBody) > maxBodyBytes) {\n log.warn?.(`[cronvello] dispatch rejected: body exceeds ${maxBodyBytes} bytes`);\n return resp(413, { ok: false, error: \"Payload too large\" });\n }\n\n // 3. Parse the body.\n let body: Record<string, unknown>;\n try {\n const parsed = req.rawBody ? JSON.parse(req.rawBody) : {};\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return resp(400, { ok: false, error: \"Body must be a JSON object\" });\n }\n body = parsed as Record<string, unknown>;\n } catch {\n return resp(400, { ok: false, error: \"Invalid JSON body\" });\n }\n\n // 4. Select the job by its registry key.\n const key = typeof body[\"job\"] === \"string\" ? (body[\"job\"] as string) : null;\n if (!key) {\n return resp(400, { ok: false, error: \"Missing 'job' key in body\" });\n }\n const job = state.jobs.get(key);\n if (!job) {\n log.warn?.(`[cronvello] dispatch for unknown job '${key}'`);\n return resp(404, { ok: false, error: `Unknown job: ${key}` });\n }\n\n const callback = readCallback(body[\"_callback\"]);\n const isAsync = callback !== null;\n const ctx = buildContext(key, job, req, body, isAsync, \"dispatch\");\n\n // 5a. Async path — acknowledge now, run in the background, post the result back.\n if (callback) {\n const work = runAndReportCallback(job, ctx, callback, state.dispatchSecret, log, invokeHandler);\n if (req.waitUntil) req.waitUntil(work);\n else void work; // fire-and-forget on long-running hosts\n return resp(202, { ok: true, job: key, accepted: true });\n }\n\n // 5b. Sync path — run inline; the result IS the HTTP response Cronvello records.\n try {\n const { result } = await invokeHandler(job, ctx);\n return resp(200, { ok: true, job: key, result: result ?? null });\n } catch (err) {\n // Non-2xx → Cronvello records a failure and retries per the task's maxRetries.\n return resp(500, { ok: false, job: key, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n async function runLocal(key: string, payload?: Record<string, unknown>): Promise<unknown> {\n const job = state.jobs.get(key);\n if (!job) throw new Error(`Unknown job '${key}'. Known: ${[...state.jobs.keys()].join(\", \") || \"(none)\"}`);\n const body: Record<string, unknown> = { job: key, schedule: job.config.schedule, ...(payload ?? {}) };\n const ctx = buildContext(key, job, null, body, false, \"local\");\n const { result } = await invokeHandler(job, ctx);\n return result;\n }\n\n return { handle, runLocal };\n}\n\nasync function runAndReportCallback(\n job: ResolvedJob,\n ctx: CronvelloJobContext,\n callback: CallbackEnvelope,\n secret: string,\n log: CronvelloLogger,\n invokeHandler: (job: ResolvedJob, ctx: CronvelloJobContext) => Promise<{ durationMs: number; result: unknown }>,\n): Promise<void> {\n let payload: Record<string, unknown>;\n try {\n const { durationMs, result } = await invokeHandler(job, ctx);\n payload = { runId: callback.runId, success: true, durationMs, result: result ?? null };\n } catch (err) {\n payload = {\n runId: callback.runId,\n success: false,\n durationMs: 0,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n try {\n const bodyStr = JSON.stringify(payload);\n const header = callback.expectedSignatureHeader || \"X-Webhook-Signature\";\n const signature = await signHmacSha256(bodyStr, secret);\n const res = await fetch(callback.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", [header]: signature },\n body: bodyStr,\n });\n if (!res.ok) {\n log.warn?.(`[cronvello] callback POST for job '${job.key}' returned ${res.status}`);\n }\n } catch (err) {\n log.error?.(`[cronvello] failed to deliver callback for job '${job.key}'`, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/** Run a lifecycle hook, swallowing any error it throws so observability never breaks a job. */\nasync function safeHook(fn: () => void | Promise<void> | undefined, log: CronvelloLogger): Promise<void> {\n try {\n await fn();\n } catch (err) {\n log.warn?.(`[cronvello] a lifecycle hook threw: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n/** Byte length of a UTF-8 string without allocating a Buffer when TextEncoder is available. */\nfunction byteLength(s: string): number {\n if (!s) return 0;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n return s.length;\n}\n\nfunction readCallback(value: unknown): CallbackEnvelope | null {\n if (!value || typeof value !== \"object\") return null;\n const v = value as Record<string, unknown>;\n if (typeof v[\"url\"] !== \"string\" || typeof v[\"runId\"] !== \"string\") return null;\n return {\n url: v[\"url\"] as string,\n runId: v[\"runId\"] as string,\n ...(typeof v[\"expectedSignatureHeader\"] === \"string\"\n ? { expectedSignatureHeader: v[\"expectedSignatureHeader\"] as string }\n : {}),\n ...(typeof v[\"timeoutMs\"] === \"number\" ? { timeoutMs: v[\"timeoutMs\"] as number } : {}),\n };\n}\n\nfunction resp(status: number, body: Record<string, unknown>): DispatchResponse {\n return { status, body };\n}\n","/**\n * Idempotent reconciliation of a code registry into Cronvello.\n *\n * Model: ONE Job container per app (named `appName`), and one Task per registry job. The\n * Task's `name` IS the registry key — the stable identity used for matching, so renaming a\n * job's display/description never breaks the link. On each `sync()` we:\n * 1. ensure the Job container exists,\n * 2. diff registry tasks against the container's current tasks,\n * 3. create missing, patch changed, (optionally) delete removed,\n * 4. start newly-created tasks (Cronvello creates them DISABLED).\n *\n * The container is fully SDK-managed: only tasks inside THIS app's Job are ever touched.\n */\n\nimport type { CronvelloClient } from \"../client/client.js\";\nimport type {\n PublicJob,\n PublicTask,\n SuccessCriteria,\n TaskCreateBody,\n TaskUpdateBody,\n} from \"../internal/wire.js\";\nimport type {\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./types.js\";\nimport type { ResolvedJob } from \"./dispatch.js\";\n\nexport interface ReconcileInput {\n client: CronvelloClient;\n appName: string;\n appDescription?: string;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n jobs: ResolvedJob[];\n}\n\nexport async function reconcile(input: ReconcileInput, options: SyncOptions = {}): Promise<ReconcileResult> {\n const { client, appName, dispatchUrl, dispatchSecret, defaultTimeZone, jobs } = input;\n const prune = options.prune ?? true;\n const dryRun = options.dryRun ?? false;\n const rotateSecret = options.rotateSecret ?? false;\n\n // 1. Ensure the Job container.\n const { job: container, created: jobCreated } = await ensureContainer(client, appName, input.appDescription, dryRun);\n const jobId = container?.id ?? \"(dry-run)\";\n\n const changes: ReconcileTaskChange[] = [];\n const existingTasks = container && !jobCreated ? await client.jobs.listTasks(container.id) : [];\n const byKey = new Map(existingTasks.map((t) => [t.name, t] as const));\n const registryKeys = new Set(jobs.map((j) => j.key));\n\n // 2. Reconcile each registry job.\n for (const job of jobs) {\n const enabled = job.config.enabled ?? true;\n const existing = byKey.get(job.key);\n const desired = buildDesiredTask({ job, dispatchUrl, dispatchSecret, defaultTimeZone });\n\n if (!enabled) {\n // Keep the task but make sure it is not scheduled.\n if (existing && existing.status === \"ACTIVE\" && !dryRun) await client.tasks.stop(existing.id);\n changes.push({ key: job.key, action: \"skipped\", taskId: existing?.id ?? null, reason: \"disabled in registry\" });\n continue;\n }\n\n if (!existing) {\n if (dryRun || !container) {\n changes.push({ key: job.key, action: \"created\", taskId: null });\n continue;\n }\n const createBody: TaskCreateBody = { ...desired, targetToken: dispatchSecret };\n const task = await client.jobs.createTask(container.id, createBody, { idempotencyKey: `cv-create-${appName}-${job.key}` });\n await client.tasks.start(task.id); // tasks are created DISABLED\n changes.push({ key: job.key, action: \"created\", taskId: task.id });\n continue;\n }\n\n // Existing task — compute the diff.\n const { patch, changedFields } = diffTask(existing, desired, { rotateSecret, dispatchSecret });\n const needsStart = existing.status === \"DISABLED\";\n\n if (changedFields.length === 0 && !needsStart) {\n changes.push({ key: job.key, action: \"unchanged\", taskId: existing.id });\n continue;\n }\n if (!dryRun) {\n if (changedFields.length > 0) await client.tasks.update(existing.id, patch);\n if (needsStart) await client.tasks.start(existing.id);\n }\n changes.push({\n key: job.key,\n action: changedFields.length > 0 ? \"updated\" : \"unchanged\",\n taskId: existing.id,\n ...(changedFields.length > 0 ? { changedFields } : {}),\n ...(needsStart ? { reason: \"re-activated\" } : {}),\n });\n }\n\n // 3. Prune tasks no longer in the registry.\n if (prune) {\n for (const task of existingTasks) {\n if (registryKeys.has(task.name)) continue;\n if (!dryRun) await client.tasks.delete(task.id);\n changes.push({ key: task.name, action: \"deleted\", taskId: task.id });\n }\n }\n\n return summarize(jobId, appName, jobCreated, changes);\n}\n\nasync function ensureContainer(\n client: CronvelloClient,\n appName: string,\n description: string | undefined,\n dryRun: boolean,\n): Promise<{ job: PublicJob | null; created: boolean }> {\n const jobs = await client.jobs.list();\n const found = jobs.find((j) => j.name === appName);\n if (found) return { job: found, created: false };\n if (dryRun) return { job: null, created: true };\n const created = await client.jobs.create(\n { name: appName, ...(description ? { description } : {}) },\n { idempotencyKey: `cv-job-${appName}` },\n );\n return { job: created, created: true };\n}\n\nfunction buildDesiredTask(args: {\n job: ResolvedJob;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n}): TaskCreateBody {\n const { job, dispatchUrl, defaultTimeZone } = args;\n const cfg = job.config;\n const requestBody = JSON.stringify({ job: job.key, ...(cfg.payload ?? {}) });\n const body: TaskCreateBody = {\n name: job.key,\n schedule: cfg.schedule,\n timeZone: cfg.timeZone ?? defaultTimeZone,\n targetUrl: dispatchUrl,\n method: \"POST\",\n requestBody,\n };\n if (cfg.description !== undefined) body.description = cfg.description;\n if (cfg.urgency !== undefined) body.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) body.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) body.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) body.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) body.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) body.successCriteria = cfg.successCriteria;\n return body;\n}\n\nfunction diffTask(\n existing: PublicTask,\n desired: TaskCreateBody,\n opts: { rotateSecret: boolean; dispatchSecret: string },\n): { patch: TaskUpdateBody; changedFields: string[] } {\n const patch: TaskUpdateBody = {};\n const changed: string[] = [];\n\n const set = <K extends keyof TaskUpdateBody>(field: K, value: TaskUpdateBody[K]) => {\n patch[field] = value;\n changed.push(field);\n };\n\n if (existing.schedule !== desired.schedule) set(\"schedule\", desired.schedule);\n if (desired.timeZone !== undefined && existing.timeZone !== desired.timeZone) set(\"timeZone\", desired.timeZone);\n if (existing.targetUrl !== desired.targetUrl) set(\"targetUrl\", desired.targetUrl);\n if (existing.method !== (desired.method ?? \"POST\")) set(\"method\", desired.method ?? \"POST\");\n if (!jsonEqual(existing.requestBody, desired.requestBody)) set(\"requestBody\", desired.requestBody ?? null);\n\n // Optional fields: only reconcile when the registry explicitly sets them.\n if (desired.description !== undefined && (existing.description ?? undefined) !== desired.description) {\n set(\"description\", desired.description);\n }\n if (desired.urgency !== undefined && existing.urgency !== desired.urgency) set(\"urgency\", desired.urgency);\n if (desired.maxRetries !== undefined && existing.maxRetries !== desired.maxRetries) set(\"maxRetries\", desired.maxRetries);\n if (desired.executionMode !== undefined && existing.executionMode !== desired.executionMode) {\n set(\"executionMode\", desired.executionMode);\n }\n if (desired.callbackTimeoutMs !== undefined && existing.callbackTimeoutMs !== desired.callbackTimeoutMs) {\n set(\"callbackTimeoutMs\", desired.callbackTimeoutMs);\n }\n if (desired.allowConcurrentRuns !== undefined && existing.allowConcurrentRuns !== desired.allowConcurrentRuns) {\n set(\"allowConcurrentRuns\", desired.allowConcurrentRuns);\n }\n if (desired.successCriteria !== undefined && !deepEqual(existing.successCriteria, desired.successCriteria)) {\n set(\"successCriteria\", desired.successCriteria as SuccessCriteria);\n }\n\n // The dispatch secret (targetToken) can't be read back — only (re)set it on demand or when absent.\n if (opts.rotateSecret || !existing.hasTargetToken) set(\"targetToken\", opts.dispatchSecret);\n\n return { patch, changedFields: changed };\n}\n\nfunction jsonEqual(a: string | null, b: string | null | undefined): boolean {\n if (a == null || b == null) return a == b;\n try {\n return deepEqual(JSON.parse(a), JSON.parse(b));\n } catch {\n return a === b;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n if (ak.length !== bk.length) return false;\n for (let i = 0; i < ak.length; i++) {\n if (ak[i] !== bk[i]) return false;\n if (!deepEqual((a as Record<string, unknown>)[ak[i]!], (b as Record<string, unknown>)[bk[i]!])) return false;\n }\n return true;\n}\n\nfunction summarize(\n jobId: string,\n jobName: string,\n jobCreated: boolean,\n changes: ReconcileTaskChange[],\n): ReconcileResult {\n const count = (a: ReconcileTaskChange[\"action\"]) => changes.filter((c) => c.action === a).length;\n return {\n jobId,\n jobName,\n jobCreated,\n created: count(\"created\"),\n updated: count(\"updated\"),\n unchanged: count(\"unchanged\"),\n deleted: count(\"deleted\"),\n skipped: count(\"skipped\"),\n changes,\n };\n}\n","/**\n * Express adapter. Zero dependency on `express` itself — the request/response are typed\n * structurally, so this works with Express 4/5 and any Connect-style middleware stack.\n *\n * import { defineCronvello } from \"@cronvello/sdk\";\n * import { expressHandler } from \"@cronvello/sdk/express\";\n *\n * app.post(\"/cronvello/dispatch\", express.json(), expressHandler(cronvello));\n * // …or simply: app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n *\n * Works with or without `express.json()` — if the body isn't pre-parsed, the raw stream is read.\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\nexport interface ExpressRequestLike {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: (chunk?: unknown) => void): void;\n}\n\nexport interface ExpressResponseLike {\n status(code: number): ExpressResponseLike;\n json(body: unknown): void;\n}\n\nexport type ExpressDispatchHandler = (req: ExpressRequestLike, res: ExpressResponseLike) => Promise<void>;\n\nexport function expressHandler(app: DispatchHandler): ExpressDispatchHandler {\n return async (req, res) => {\n const rawBody = await readBody(req);\n const result = await app.handle({\n method: req.method ?? \"POST\",\n authorization: headerValue(req.headers[\"authorization\"]),\n rawBody,\n headers: flattenHeaders(req.headers),\n });\n res.status(result.status).json(result.body);\n };\n}\n\nasync function readBody(req: ExpressRequestLike): Promise<string> {\n const body = req.body;\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\") return body;\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) return body.toString(\"utf8\");\n if (typeof body === \"object\") return JSON.stringify(body);\n }\n if (typeof req.on !== \"function\") return \"\";\n return new Promise<string>((resolve) => {\n let data = \"\";\n req.on!(\"data\", (chunk?: unknown) => {\n data += typeof chunk === \"string\" ? chunk : String(chunk ?? \"\");\n });\n req.on!(\"end\", () => resolve(data));\n req.on!(\"error\", () => resolve(data));\n });\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value;\n}\n\nfunction flattenHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(\", \") : v;\n }\n return out;\n}\n","/**\n * Next.js App Router adapter (Route Handlers). Zero dependency on `next` — uses the Web\n * Fetch `Request`/`Response` globals (Node 20+ and the edge runtime).\n *\n * // app/cronvello/dispatch/route.ts\n * import { cronvello } from \"@/lib/cronvello\";\n * import { nextHandler } from \"@cronvello/sdk/next\";\n * export const POST = nextHandler(cronvello);\n *\n * On serverless hosts, prefer the default sync execution mode so the work finishes within the\n * request. async_callback needs a host that keeps running after the response (see docs).\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\n/** Structural subset of the Web Fetch `Request` we rely on. */\nexport interface FetchRequestLike {\n method: string;\n headers: {\n get(name: string): string | null;\n forEach?(cb: (value: string, key: string) => void): void;\n };\n text(): Promise<string>;\n}\n\nexport type NextRouteHandler = (req: FetchRequestLike) => Promise<Response>;\n\nexport function nextHandler(app: DispatchHandler): NextRouteHandler {\n return async (req) => {\n const rawBody = await req.text();\n const headers: Record<string, string> = {};\n req.headers.forEach?.((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n const result = await app.handle({\n method: req.method,\n authorization: req.headers.get(\"authorization\") ?? undefined,\n rawBody,\n headers,\n });\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n","/**\n * `defineCronvello` — the high-level, code-first entry point.\n *\n * export const cronvello = defineCronvello({\n * appName: \"my-app\",\n * appUrl: process.env.APP_URL!,\n * apiKey: process.env.CRONVELLO_API_KEY!,\n * dispatchSecret: process.env.CRONVELLO_DISPATCH_SECRET!,\n * jobs: {\n * \"send-daily-digest\": { schedule: \"0 8 * * *\", handler: async () => { … } },\n * \"cleanup-temp\": { schedule: \"*\\/15 * * * *\", handler: async () => { … } },\n * },\n * });\n *\n * await cronvello.sync(); // reconcile the registry to Cronvello (idempotent)\n * app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n */\n\nimport { CronvelloClient, CRONVELLO_DEFAULT_BASE_URL } from \"../client/client.js\";\nimport { CronvelloApiError, CronvelloConfigError } from \"../internal/errors.js\";\nimport { validateCron, isValidTimeZone } from \"../internal/cron.js\";\nimport type { RegistryReconcileRequest, RegistryTaskInput, RunNowResult } from \"../internal/wire.js\";\nimport { createDispatcher, type DispatchRequest, type DispatchResponse, type ResolvedJob } from \"./dispatch.js\";\nimport { reconcile } from \"./reconcile.js\";\nimport { expressHandler, type ExpressDispatchHandler } from \"../adapters/express.js\";\nimport { nextHandler, type NextRouteHandler } from \"../adapters/next.js\";\nimport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobsInput,\n ReconcileResult,\n SyncOptions,\n} from \"./types.js\";\n\nconst DEFAULT_DISPATCH_PATH = \"/cronvello/dispatch\";\nconst DEFAULT_TIME_ZONE = \"Europe/Berlin\";\n\nexport interface CronvelloApp {\n /** The underlying low-level client for ad-hoc `/v1` calls. */\n readonly client: CronvelloClient;\n /** Resolved jobs, keyed by their stable registry key. */\n readonly jobs: ReadonlyMap<string, ResolvedJob>;\n /** The app identity / Job-container name. */\n readonly appName: string;\n /** Path the dispatch handler should be mounted at (e.g. \"/cronvello/dispatch\"). */\n readonly dispatchPath: string;\n /** Absolute URL Cronvello calls back (appUrl + dispatchPath). */\n readonly dispatchUrl: string;\n\n /** Reconcile the registry into Cronvello. Idempotent — safe to call on every boot/deploy. */\n sync(options?: SyncOptions): Promise<ReconcileResult>;\n /** Trigger one job immediately via Cronvello (manual run). Requires a prior `sync()`. */\n run(key: string): Promise<RunNowResult>;\n /**\n * Run a job's handler locally, in-process — no HTTP round-trip, no Cronvello, no deploy.\n * Perfect for unit tests and `npx cronvello dev`. Lifecycle hooks fire (`source: \"local\"`).\n */\n trigger(key: string, payload?: Record<string, unknown>): Promise<unknown>;\n /** Framework-neutral dispatch entry — used by the adapters. */\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Express/Connect request handler for the dispatch endpoint. */\n expressHandler(): ExpressDispatchHandler;\n /** Next.js App Router (Route Handler) for the dispatch endpoint. */\n nextHandler(): NextRouteHandler;\n /** The registry keys, for diagnostics. */\n keys(): string[];\n}\n\nexport function defineCronvello(config: CronvelloAppConfig): CronvelloApp {\n validateConfig(config);\n\n const validate = config.validateSchedules ?? true;\n const defaultTimeZone = config.timeZone ?? DEFAULT_TIME_ZONE;\n if (validate && !isValidTimeZone(defaultTimeZone)) {\n throw new CronvelloConfigError(`Invalid \\`timeZone\\` \"${defaultTimeZone}\" — expected an IANA name like \"Europe/Berlin\" or \"UTC\".`);\n }\n\n const jobs = normalizeJobs(config.jobs, validate);\n const dispatchPath = normalizePath(config.dispatchPath ?? DEFAULT_DISPATCH_PATH);\n const dispatchUrl = joinUrl(config.appUrl, dispatchPath);\n\n const client = new CronvelloClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL,\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),\n ...(config.fetch ? { fetch: config.fetch } : {}),\n });\n\n const dispatcher = createDispatcher({\n jobs,\n dispatchSecret: config.dispatchSecret,\n logger: config.logger,\n ...(config.hooks ? { hooks: config.hooks } : {}),\n ...(config.maxBodyBytes !== undefined ? { maxBodyBytes: config.maxBodyBytes } : {}),\n });\n\n const app: CronvelloApp = {\n client,\n jobs,\n appName: config.appName,\n dispatchPath,\n dispatchUrl,\n\n async sync(options?: SyncOptions): Promise<ReconcileResult> {\n const opts = options ?? {};\n // Prefer the atomic server-side reconcile (one round-trip). dryRun is only supported by\n // the local differ, so it always takes the client-side path.\n if (!opts.dryRun) {\n try {\n const res = await client.reconcileRegistry(\n buildRegistryRequest(config, dispatchUrl, defaultTimeZone, [...jobs.values()], opts),\n );\n return {\n jobId: res.job.id,\n jobName: res.job.name,\n jobCreated: res.jobCreated,\n created: res.created,\n updated: res.updated,\n unchanged: res.unchanged,\n deleted: res.deleted,\n skipped: res.skipped,\n changes: res.changes.map((c) => ({\n key: c.key,\n action: c.action,\n taskId: c.taskId,\n ...(c.changedFields ? { changedFields: c.changedFields } : {}),\n })),\n tasks: res.tasks,\n };\n } catch (e) {\n // Older server without /v1/registry → fall back to the client-side differ.\n if (!(e instanceof CronvelloApiError) || (e.status !== 404 && e.status !== 405)) throw e;\n }\n }\n return reconcile(\n {\n client,\n appName: config.appName,\n dispatchUrl,\n dispatchSecret: config.dispatchSecret,\n defaultTimeZone,\n jobs: [...jobs.values()],\n },\n opts,\n );\n },\n\n async run(key: string): Promise<RunNowResult> {\n if (!jobs.has(key)) {\n throw new CronvelloConfigError(`Unknown job '${key}'. Known: ${[...jobs.keys()].join(\", \") || \"(none)\"}`);\n }\n const containers = await client.jobs.list();\n const container = containers.find((j) => j.name === config.appName);\n if (!container) {\n throw new CronvelloConfigError(`App '${config.appName}' is not synced yet — call sync() first.`);\n }\n const tasks = await client.jobs.listTasks(container.id);\n const task = tasks.find((t) => t.name === key);\n if (!task) {\n throw new CronvelloConfigError(`Job '${key}' has no task yet — call sync() first.`);\n }\n return client.tasks.runNow(task.id);\n },\n\n trigger: (key: string, payload?: Record<string, unknown>) => dispatcher.runLocal(key, payload),\n handle: dispatcher.handle,\n expressHandler: () => expressHandler(app),\n nextHandler: () => nextHandler(app),\n keys: () => [...jobs.keys()],\n };\n\n return app;\n}\n\n/** Config for `defineCronvello.fromEnv` — the three secret fields become optional (read from env). */\nexport type CronvelloEnvConfig = Omit<CronvelloAppConfig, \"apiKey\" | \"dispatchSecret\" | \"appUrl\"> &\n Partial<Pick<CronvelloAppConfig, \"apiKey\" | \"dispatchSecret\" | \"appUrl\">>;\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace defineCronvello {\n /**\n * Build an app from environment variables, so you don't repeat the same reads in every service.\n * Reads `CRONVELLO_API_KEY`, `CRONVELLO_DISPATCH_SECRET`, `CRONVELLO_APP_URL` (or `PUBLIC_URL`),\n * and optionally `CRONVELLO_API_URL` (base URL). Anything passed explicitly overrides the env.\n *\n * export const cronvello = defineCronvello.fromEnv({ appName: \"my-app\", jobs: { … } });\n */\n export function fromEnv(\n config: CronvelloEnvConfig,\n env: Record<string, string | undefined> = typeof process !== \"undefined\" ? process.env : {},\n ): CronvelloApp {\n const apiKey = config.apiKey ?? env[\"CRONVELLO_API_KEY\"];\n const dispatchSecret = config.dispatchSecret ?? env[\"CRONVELLO_DISPATCH_SECRET\"];\n const appUrl = config.appUrl ?? env[\"CRONVELLO_APP_URL\"] ?? env[\"PUBLIC_URL\"];\n const baseUrl = config.baseUrl ?? env[\"CRONVELLO_API_URL\"];\n\n const missing = [\n !apiKey && \"CRONVELLO_API_KEY\",\n !dispatchSecret && \"CRONVELLO_DISPATCH_SECRET\",\n !appUrl && \"CRONVELLO_APP_URL (or PUBLIC_URL)\",\n ].filter(Boolean);\n if (missing.length) {\n throw new CronvelloConfigError(`defineCronvello.fromEnv() is missing required env: ${missing.join(\", \")}.`);\n }\n\n return defineCronvello({\n ...config,\n apiKey: apiKey!,\n dispatchSecret: dispatchSecret!,\n appUrl: appUrl!,\n ...(baseUrl ? { baseUrl } : {}),\n });\n }\n}\n\nfunction validateConfig(config: CronvelloAppConfig): void {\n if (!config) throw new CronvelloConfigError(\"defineCronvello requires a config object.\");\n if (!config.appName || !config.appName.trim()) throw new CronvelloConfigError(\"`appName` is required.\");\n if (!config.appUrl || !/^https?:\\/\\//i.test(config.appUrl)) {\n throw new CronvelloConfigError(\"`appUrl` must be an absolute http(s) URL (the public URL of THIS app).\");\n }\n if (!config.apiKey) throw new CronvelloConfigError(\"`apiKey` (crn_live_…) is required.\");\n if (!config.dispatchSecret || config.dispatchSecret.length < 16) {\n throw new CronvelloConfigError(\"`dispatchSecret` is required and must be at least 16 chars (use a random 32-byte value).\");\n }\n if (!config.jobs) throw new CronvelloConfigError(\"`jobs` is required.\");\n}\n\nfunction normalizeJobs(input: CronvelloJobsInput, validate: boolean): Map<string, ResolvedJob> {\n const map = new Map<string, ResolvedJob>();\n const entries: Array<{ key: string; config: CronvelloJobConfig }> = Array.isArray(input)\n ? input.map(({ key, ...rest }) => ({ key, config: rest }))\n : Object.entries(input).map(([key, config]) => ({ key, config }));\n\n for (const { key, config } of entries) {\n const trimmed = (key ?? \"\").trim();\n if (!trimmed) throw new CronvelloConfigError(\"Every job needs a non-empty key.\");\n if (trimmed.length > 255) throw new CronvelloConfigError(`Job key '${trimmed}' exceeds 255 characters.`);\n if (map.has(trimmed)) throw new CronvelloConfigError(`Duplicate job key '${trimmed}'.`);\n if (!config || typeof config.handler !== \"function\") {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a handler function.`);\n }\n if (!config.schedule || !config.schedule.trim()) {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a schedule.`);\n }\n if (validate) {\n const cronCheck = validateCron(config.schedule);\n if (!cronCheck.valid) {\n throw new CronvelloConfigError(`Job '${trimmed}' has an invalid schedule \"${config.schedule}\" — ${cronCheck.error}.`);\n }\n if (config.timeZone !== undefined && !isValidTimeZone(config.timeZone)) {\n throw new CronvelloConfigError(`Job '${trimmed}' has an invalid timeZone \"${config.timeZone}\" — expected an IANA name.`);\n }\n }\n map.set(trimmed, { key: trimmed, config });\n }\n if (map.size === 0) throw new CronvelloConfigError(\"At least one job is required.\");\n return map;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n return trimmed.startsWith(\"/\") ? trimmed.replace(/\\/+$/, \"\") || \"/\" : `/${trimmed.replace(/\\/+$/, \"\")}`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, \"\")}${path}`;\n}\n\n/** Build the PUT /v1/registry body from the registry jobs. */\nfunction buildRegistryRequest(\n config: CronvelloAppConfig,\n dispatchUrl: string,\n defaultTimeZone: string,\n jobs: ResolvedJob[],\n opts: SyncOptions,\n): RegistryReconcileRequest {\n const tasks: RegistryTaskInput[] = jobs.map((j) => {\n const cfg = j.config;\n const task: RegistryTaskInput = {\n key: j.key,\n schedule: cfg.schedule,\n targetUrl: dispatchUrl,\n targetToken: config.dispatchSecret,\n method: \"POST\",\n timeZone: cfg.timeZone ?? defaultTimeZone,\n requestBody: JSON.stringify({ job: j.key, ...(cfg.payload ?? {}) }),\n };\n if (cfg.description !== undefined) task.description = cfg.description;\n if (cfg.urgency !== undefined) task.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) task.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) task.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) task.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) task.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) task.successCriteria = cfg.successCriteria;\n if (cfg.enabled !== undefined) task.enabled = cfg.enabled;\n return task;\n });\n return {\n appName: config.appName,\n tasks,\n prune: opts.prune ?? true,\n rotateSecret: opts.rotateSecret ?? false,\n };\n}\n","/**\n * Render a `ReconcileResult` as a clean, human-readable summary — for boot logs, CI output, and\n * `npx cronvello sync`. Zero-dependency ANSI colouring, opt-in via `color: true`.\n */\n\nimport type { ReconcileResult, ReconcileTaskChange } from \"./types.js\";\n\nexport interface FormatOptions {\n /** Emit ANSI colour codes (default false — safe for log files). */\n color?: boolean;\n /** Label the summary as a preview (\"would …\") rather than an applied change. */\n dryRun?: boolean;\n}\n\nconst ESC = String.fromCharCode(27); // ANSI escape\nconst ANSI = {\n reset: `${ESC}[0m`,\n dim: `${ESC}[2m`,\n bold: `${ESC}[1m`,\n green: `${ESC}[32m`,\n yellow: `${ESC}[33m`,\n red: `${ESC}[31m`,\n cyan: `${ESC}[36m`,\n gray: `${ESC}[90m`,\n} as const;\n\ntype Color = keyof typeof ANSI;\n\nconst GLYPH: Record<ReconcileTaskChange[\"action\"], { sign: string; color: Color }> = {\n created: { sign: \"+\", color: \"green\" },\n updated: { sign: \"~\", color: \"yellow\" },\n unchanged: { sign: \"=\", color: \"gray\" },\n deleted: { sign: \"-\", color: \"red\" },\n skipped: { sign: \"·\", color: \"cyan\" },\n};\n\n/** Build the multi-line summary string. */\nexport function formatSyncResult(result: ReconcileResult, options: FormatOptions = {}): string {\n const paint = (s: string, c: Color) => (options.color ? `${ANSI[c]}${s}${ANSI.reset}` : s);\n const verb = options.dryRun ? \"would sync\" : \"synced\";\n const lines: string[] = [];\n\n lines.push(\n `${paint(\"Cronvello\", \"cyan\")} ${verb} ${paint(`\"${result.jobName}\"`, \"bold\")} ${paint(`(${result.jobId})`, \"gray\")}`,\n );\n\n // Per-task lines, in a stable, readable order.\n const order: ReconcileTaskChange[\"action\"][] = [\"created\", \"updated\", \"deleted\", \"skipped\", \"unchanged\"];\n const sorted = [...result.changes].sort((a, b) => order.indexOf(a.action) - order.indexOf(b.action));\n for (const c of sorted) {\n const g = GLYPH[c.action];\n const detail =\n c.changedFields && c.changedFields.length\n ? paint(` (${c.changedFields.join(\", \")})`, \"gray\")\n : c.reason\n ? paint(` (${c.reason})`, \"gray\")\n : \"\";\n lines.push(` ${paint(g.sign, g.color)} ${paint(c.action.padEnd(9), g.color)} ${c.key}${detail}`);\n }\n\n const tally = [\n result.created && `${result.created} created`,\n result.updated && `${result.updated} updated`,\n result.unchanged && `${result.unchanged} unchanged`,\n result.deleted && `${result.deleted} deleted`,\n result.skipped && `${result.skipped} skipped`,\n ].filter(Boolean);\n const summary = tally.length ? tally.join(\", \") : \"no changes\";\n const containerNote = result.jobCreated ? paint(\" · container created\", \"gray\") : \"\";\n lines.push(` ${paint(summary, \"bold\")}${containerNote}`);\n\n return lines.join(\"\\n\");\n}\n","/**\n * Human-friendly schedule builders. Each returns a plain cron string (so it drops straight into a\n * job's `schedule`), validated on the way out — a bad argument throws immediately with a clear\n * message instead of silently producing a wrong schedule.\n *\n * import { every, daily, weekly, hourly, cron } from \"@cronvello/sdk\";\n *\n * jobs: {\n * \"digest\": { schedule: daily(\"08:00\"), handler },\n * \"poll\": { schedule: every(\"15m\"), handler },\n * \"report\": { schedule: weekly(\"mon\", \"09:00\"),handler },\n * \"beat\": { schedule: hourly(), handler },\n * \"custom\": { schedule: cron(\"0 0 1 * *\"), handler },\n * }\n */\n\nimport { assertValidCron } from \"../internal/cron.js\";\n\nexport type Weekday = \"sun\" | \"mon\" | \"tue\" | \"wed\" | \"thu\" | \"fri\" | \"sat\" | 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nconst DOW: Record<string, number> = { sun: 0, mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6 };\n\n/** Validate a raw cron expression and return it unchanged. The explicit escape hatch. */\nexport function cron(expression: string): string {\n assertValidCron(expression, \"cron()\");\n return expression;\n}\n\n/**\n * A recurring interval expressed as `<n><unit>` where unit is `s`, `m`, `h`, or `d`.\n * every(\"30s\") → every 30 seconds every(\"15m\") → every 15 minutes\n * every(\"2h\") → every 2 hours every(\"1d\") → daily at midnight\n * Note: sub-hour intervals that don't divide evenly (e.g. 7m) restart each hour, matching cron.\n */\nexport function every(interval: string): string {\n const m = /^(\\d+)\\s*(s|sec|secs|m|min|mins|h|hr|hrs|hour|hours|d|day|days)$/i.exec(interval.trim());\n if (!m) throw new Error(`every(): cannot parse interval \"${interval}\" — use forms like \"30s\", \"15m\", \"2h\", \"1d\"`);\n const n = Number(m[1]);\n const unit = m[2]!.toLowerCase()[0]; // s | m | h | d\n if (n < 1) throw new Error(`every(): interval must be at least 1, got ${n}`);\n\n let expr: string;\n if (unit === \"s\") {\n if (n > 59) throw new Error(`every(): seconds must be 1–59, got ${n}`);\n expr = `*/${n} * * * * *`; // 6-field (seconds)\n } else if (unit === \"m\") {\n if (n > 59) throw new Error(`every(): minutes must be 1–59 (use \"1h\" for 60), got ${n}`);\n expr = `*/${n} * * * *`;\n } else if (unit === \"h\") {\n if (n > 23) throw new Error(`every(): hours must be 1–23 (use \"1d\" for 24), got ${n}`);\n expr = `0 */${n} * * *`;\n } else {\n if (n > 31) throw new Error(`every(): days must be 1–31, got ${n}`);\n expr = n === 1 ? `0 0 * * *` : `0 0 */${n} * *`;\n }\n assertValidCron(expr, `every(\"${interval}\")`);\n return expr;\n}\n\n/** Every N minutes (1–59). */\nexport function everyMinutes(n: number): string {\n return every(`${n}m`);\n}\n\n/** Every N hours (1–23). */\nexport function everyHours(n: number): string {\n return every(`${n}h`);\n}\n\n/** Once an hour, at the given minute past (default :00). */\nexport function hourly(minute = 0): string {\n const mm = field(minute, 0, 59, \"minute\");\n return cron(`${mm} * * * *`);\n}\n\n/** Once a day at \"HH:MM\" (24h, default midnight). */\nexport function daily(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * *`);\n}\n\n/** Once a week on `day` at \"HH:MM\". */\nexport function weekly(day: Weekday, time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * ${weekday(day)}`);\n}\n\n/** Once a month on `dayOfMonth` (1–31) at \"HH:MM\". */\nexport function monthly(dayOfMonth: number, time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n const dom = field(dayOfMonth, 1, 31, \"day-of-month\");\n return cron(`${mm} ${hh} ${dom} * *`);\n}\n\n/** Monday–Friday at \"HH:MM\". */\nexport function weekdays(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * 1-5`);\n}\n\n/** Saturday & Sunday at \"HH:MM\". */\nexport function weekends(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * 0,6`);\n}\n\n/** Namespace form for discoverability: `import { schedule } from \"@cronvello/sdk\"`. */\nexport const schedule = {\n cron, every, everyMinutes, everyHours, hourly, daily, weekly, monthly, weekdays, weekends,\n};\n\nfunction parseTime(time: string): { hh: number; mm: number } {\n const m = /^(\\d{1,2}):(\\d{2})$/.exec(time.trim());\n if (!m) throw new Error(`Expected a time like \"08:00\" or \"23:30\", got \"${time}\"`);\n const hh = Number(m[1]);\n const mm = Number(m[2]);\n if (hh > 23) throw new Error(`Hour must be 0–23, got ${hh}`);\n if (mm > 59) throw new Error(`Minute must be 0–59, got ${mm}`);\n return { hh, mm };\n}\n\nfunction weekday(day: Weekday): number {\n if (typeof day === \"number\") {\n if (day < 0 || day > 6) throw new Error(`Weekday number must be 0 (Sun) – 6 (Sat), got ${day}`);\n return day;\n }\n const n = DOW[day.toLowerCase()];\n if (n === undefined) throw new Error(`Unknown weekday \"${day}\" — use sun…sat or 0…6`);\n return n;\n}\n\nfunction field(value: number, min: number, max: number, label: string): number {\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${label} must be an integer ${min}–${max}, got ${value}`);\n }\n return value;\n}\n","/**\n * @cronvello/sdk — code-first cron jobs for Cronvello.\n *\n * Two layers, one package:\n * • High-level registry: `defineCronvello({ jobs })` → `.sync()` + `.expressHandler()` / `.nextHandler()`.\n * Define jobs in code; the SDK reconciles them to https://api.cronvello.com and runs them.\n * • Low-level client: `new CronvelloClient({ apiKey })` → typed access to the whole `/v1` API.\n */\n\n// ── High-level registry ────────────────────────────────────────────────────\nexport { defineCronvello, type CronvelloApp, type CronvelloEnvConfig } from \"./registry/define.js\";\nexport { formatSyncResult, type FormatOptions } from \"./registry/format.js\";\nexport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobConfigWithKey,\n CronvelloJobsInput,\n CronvelloJobContext,\n CronvelloJobHandler,\n CronvelloLogger,\n CronvelloHooks,\n CronvelloRunSource,\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./registry/types.js\";\nexport type { DispatchRequest, DispatchResponse } from \"./registry/dispatch.js\";\n\n// ── Schedule builders ──────────────────────────────────────────────────────\nexport {\n cron,\n every,\n everyMinutes,\n everyHours,\n hourly,\n daily,\n weekly,\n monthly,\n weekdays,\n weekends,\n schedule,\n type Weekday,\n} from \"./schedule/index.js\";\nexport { validateCron, isValidTimeZone, type CronValidation } from \"./internal/cron.js\";\n\n// ── Low-level client ───────────────────────────────────────────────────────\nexport {\n CronvelloClient,\n CRONVELLO_DEFAULT_BASE_URL,\n type CronvelloClientOptions,\n} from \"./client/client.js\";\n\n// ── Errors ─────────────────────────────────────────────────────────────────\nexport {\n CronvelloError,\n CronvelloApiError,\n CronvelloNetworkError,\n CronvelloConfigError,\n} from \"./internal/errors.js\";\n\n// ── Wire types ─────────────────────────────────────────────────────────────\nexport type {\n Urgency,\n ExecutionMode,\n HttpMethod,\n JobStatus,\n RunStatus,\n RunType,\n CallbackStatus,\n SuccessCriteria,\n PublicJob,\n PublicTask,\n PublicRun,\n JobCreateBody,\n JobUpdateBody,\n TaskCreateBody,\n TaskUpdateBody,\n RunsPage,\n TasksPage,\n RunNowResult,\n RegistryTaskInput,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RegistryReconcileChange,\n MeResponse,\n UsageResponse,\n Pagination,\n RunsQuery,\n AccountTasksQuery,\n AccountRunsQuery,\n} from \"./internal/wire.js\";\n\n/**\n * Generate a strong random dispatch secret (hex). Convenience for setup scripts:\n * node -e \"console.log(require('@cronvello/sdk').generateDispatchSecret())\"\n */\nexport function generateDispatchSecret(bytes = 32): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return Array.from(buf)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/errors.ts","../src/internal/http.ts","../src/client/client.ts","../src/internal/cron.ts","../src/registry/verify.ts","../src/registry/dispatch.ts","../src/registry/reconcile.ts","../src/adapters/express.ts","../src/adapters/next.ts","../src/internal/cron-schedule.ts","../src/dev/engine.ts","../src/registry/define.ts","../src/registry/format.ts","../src/schedule/index.ts","../src/index.ts"],"names":["field","headerValue","resolveValue","defineCronvello","sorted"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error taxonomy for the SDK. Everything thrown by the public surface is a\n * `CronvelloError` (or subclass), so callers can `catch (e) { if (e instanceof CronvelloError) … }`.\n */\n\nexport class CronvelloError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloError\";\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A non-2xx response from the Cronvello API. */\nexport class CronvelloApiError extends CronvelloError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the API body, when present. */\n readonly code: string | undefined;\n /** The method + path that failed, e.g. `POST /v1/jobs`. */\n readonly endpoint: string;\n /** Parsed response body (best effort). */\n readonly body: unknown;\n /** Seconds to wait before retrying, parsed from `Retry-After` / rate-limit payload (429 only). */\n readonly retryAfterSeconds: number | undefined;\n\n constructor(args: {\n status: number;\n endpoint: string;\n message: string;\n code?: string;\n body?: unknown;\n retryAfterSeconds?: number;\n }) {\n super(`[${args.status}] ${args.endpoint}: ${args.message}`);\n this.name = \"CronvelloApiError\";\n this.status = args.status;\n this.code = args.code;\n this.endpoint = args.endpoint;\n this.body = args.body;\n this.retryAfterSeconds = args.retryAfterSeconds;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isAuthError(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n}\n\n/** A network/transport failure (DNS, connection reset, timeout) before any HTTP status. */\nexport class CronvelloNetworkError extends CronvelloError {\n readonly endpoint: string;\n override readonly cause: unknown;\n constructor(endpoint: string, cause: unknown) {\n super(`Network error calling ${endpoint}: ${describe(cause)}`);\n this.name = \"CronvelloNetworkError\";\n this.endpoint = endpoint;\n this.cause = cause;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** A misconfiguration caught before any network call (missing apiKey, bad URL, …). */\nexport class CronvelloConfigError extends CronvelloError {\n constructor(message: string) {\n super(message);\n this.name = \"CronvelloConfigError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nfunction describe(cause: unknown): string {\n if (cause instanceof Error) return cause.message;\n return String(cause);\n}\n","/**\n * Minimal HTTP transport over the global `fetch` (Node 20+). No axios, no node-fetch —\n * zero runtime dependencies. Adds bearer auth, JSON (de)serialization, typed error mapping,\n * bounded retries with backoff for transient failures, and optional idempotency keys.\n */\n\nimport {\n CronvelloApiError,\n CronvelloConfigError,\n CronvelloNetworkError,\n} from \"./errors.js\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n ok: boolean;\n status: number;\n headers: { get(name: string): string | null };\n text(): Promise<string>;\n}>;\n\nexport interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n /** Per-request timeout in ms. Default 30_000. */\n timeoutMs?: number;\n /** Max retry attempts for 429/5xx/network errors. Default 2 (=> up to 3 tries). */\n maxRetries?: number;\n /** Override the fetch implementation (testing / custom agents). */\n fetch?: FetchLike;\n /** Extra headers sent on every request (e.g. a custom User-Agent). */\n defaultHeaders?: Record<string, string>;\n /** Telemetry hook — called once per completed attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Idempotency-Key header value — replays of the same key are de-duplicated server-side. */\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly onRequest: TransportOptions[\"onRequest\"];\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) throw new CronvelloConfigError(\"apiKey is required\");\n if (!opts.baseUrl) throw new CronvelloConfigError(\"baseUrl is required\");\n const resolvedFetch = opts.fetch ?? (globalThis.fetch as unknown as FetchLike | undefined);\n if (!resolvedFetch) {\n throw new CronvelloConfigError(\n \"No global fetch found. Use Node 20+ or pass a `fetch` implementation in the client options.\",\n );\n }\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.maxRetries = opts.maxRetries ?? 2;\n this.fetchImpl = resolvedFetch;\n this.defaultHeaders = opts.defaultHeaders ?? {};\n this.onRequest = opts.onRequest;\n }\n\n async request<T>(opts: RequestOptions): Promise<T> {\n const url = this.buildUrl(opts.path, opts.query);\n const endpoint = `${opts.method} ${opts.path}`;\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n ...this.defaultHeaders,\n };\n let payload: string | undefined;\n if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(opts.body);\n }\n if (opts.idempotencyKey) headers[\"idempotency-key\"] = opts.idempotencyKey;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const startedAt = Date.now();\n const { signal, cancel } = this.withTimeout(opts.signal);\n try {\n const res = await this.fetchImpl(url, {\n method: opts.method,\n headers,\n ...(payload !== undefined ? { body: payload } : {}),\n signal,\n });\n cancel();\n const durationMs = Date.now() - startedAt;\n this.onRequest?.({ method: opts.method, path: opts.path, status: res.status, attempt, durationMs });\n\n const text = await res.text();\n const parsed = text ? safeJson(text) : null;\n\n if (res.ok) return unwrapEnvelope(parsed) as T;\n\n const retryAfter = parseRetryAfter(res, parsed);\n if (RETRYABLE_STATUS.has(res.status) && attempt < this.maxRetries) {\n await sleep(this.backoff(attempt, retryAfter));\n continue;\n }\n throw new CronvelloApiError({\n status: res.status,\n endpoint,\n message: extractMessage(parsed) ?? `Request failed`,\n code: extractCode(parsed),\n body: parsed,\n ...(retryAfter !== undefined ? { retryAfterSeconds: retryAfter } : {}),\n });\n } catch (err) {\n cancel();\n if (err instanceof CronvelloApiError) throw err;\n // Network/abort error — retry if attempts remain.\n lastError = err;\n if (attempt < this.maxRetries) {\n await sleep(this.backoff(attempt));\n continue;\n }\n throw new CronvelloNetworkError(endpoint, err);\n }\n }\n // Unreachable, but satisfies the type checker.\n throw new CronvelloNetworkError(endpoint, lastError);\n }\n\n private buildUrl(path: string, query?: RequestOptions[\"query\"]): string {\n const base = `${this.baseUrl}${path.startsWith(\"/\") ? path : `/${path}`}`;\n if (!query) return base;\n const params = Object.entries(query)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n return params.length ? `${base}?${params.join(\"&\")}` : base;\n }\n\n private withTimeout(external?: AbortSignal): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n const onExternalAbort = () => controller.abort();\n if (external) {\n if (external.aborted) controller.abort();\n else external.addEventListener(\"abort\", onExternalAbort, { once: true });\n }\n return {\n signal: controller.signal,\n cancel: () => {\n clearTimeout(timer);\n external?.removeEventListener(\"abort\", onExternalAbort);\n },\n };\n }\n\n private backoff(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds !== undefined) return Math.min(retryAfterSeconds * 1000, 30_000);\n // Exponential backoff with full jitter: base 300ms, capped at 5s.\n const base = Math.min(300 * 2 ** attempt, 5_000);\n return Math.floor(Math.random() * base);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/**\n * The Cronvello server wraps every successful `/v1` response in a `{ success, message, data }`\n * envelope, while the typed client methods are declared in terms of the inner payload. Unwrap\n * it here — centrally — so every resource method (and the high-level `sync()`) sees the data it\n * expects. Bodies that aren't enveloped (no boolean `success` + `data`) pass through unchanged,\n * so non-enveloped or future endpoints keep working.\n */\nfunction unwrapEnvelope(body: unknown): unknown {\n if (\n body !== null &&\n typeof body === \"object\" &&\n \"success\" in body &&\n typeof (body as { success: unknown }).success === \"boolean\" &&\n \"data\" in body\n ) {\n return (body as { data: unknown }).data;\n }\n return body;\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"message\" in body) {\n const m = (body as { message?: unknown }).message;\n if (typeof m === \"string\") return m;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (body && typeof body === \"object\" && \"code\" in body) {\n const c = (body as { code?: unknown }).code;\n if (typeof c === \"string\") return c;\n }\n return undefined;\n}\n\nfunction parseRetryAfter(\n res: { headers: { get(name: string): string | null } },\n body: unknown,\n): number | undefined {\n const header = res.headers.get(\"retry-after\");\n if (header) {\n const n = Number(header);\n if (Number.isFinite(n)) return n;\n }\n if (body && typeof body === \"object\" && \"data\" in body) {\n const data = (body as { data?: { retryAfterSeconds?: unknown } }).data;\n if (data && typeof data.retryAfterSeconds === \"number\") return data.retryAfterSeconds;\n }\n return undefined;\n}\n","/**\n * Low-level, fully-typed client for the Cronvello public `/v1` API.\n *\n * This is the thin REST layer: one method per endpoint, request/response types straight\n * from the server contract. The high-level registry (`defineCronvello`) is built on top of\n * it. Use this directly when you need ad-hoc control beyond the registry model.\n */\n\nimport { Transport, type FetchLike } from \"../internal/http.js\";\nimport { CronvelloConfigError } from \"../internal/errors.js\";\nimport type {\n AccountRunsQuery,\n AccountTasksQuery,\n JobCreateBody,\n JobUpdateBody,\n MeResponse,\n PublicJob,\n PublicRun,\n PublicTask,\n RunNowResult,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RunsPage,\n RunsQuery,\n TaskCreateBody,\n TasksPage,\n TaskUpdateBody,\n UsageResponse,\n} from \"../internal/wire.js\";\n\n/** The production Cronvello API. Override `baseUrl` only for self-hosting or testing. */\nexport const CRONVELLO_DEFAULT_BASE_URL = \"https://api.cronvello.com\";\n\nexport interface CronvelloClientOptions {\n /** Account API key (`crn_live_…`). Required. */\n apiKey: string;\n /** API base URL. Defaults to https://api.cronvello.com. */\n baseUrl?: string;\n /** Per-request timeout in ms (default 30_000). */\n timeoutMs?: number;\n /** Retry attempts for 429/5xx/network errors (default 2). */\n maxRetries?: number;\n /** Custom fetch implementation (default: global fetch). */\n fetch?: FetchLike;\n /** Telemetry hook for every request attempt. */\n onRequest?: (info: { method: string; path: string; status: number; attempt: number; durationMs: number }) => void;\n}\n\nexport class CronvelloClient {\n private readonly transport: Transport;\n /** The resolved base URL in use. */\n readonly baseUrl: string;\n\n /** Job container operations. */\n readonly jobs: JobsResource;\n /** Scheduled task operations. */\n readonly tasks: TasksResource;\n /** Execution-history (run) operations. */\n readonly runs: RunsResource;\n /** Account identity + usage. */\n readonly account: AccountResource;\n\n constructor(options: CronvelloClientOptions) {\n if (!options || !options.apiKey) {\n throw new CronvelloConfigError(\"CronvelloClient requires an `apiKey` (crn_live_…).\");\n }\n this.baseUrl = (options.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.transport = new Transport({\n baseUrl: this.baseUrl,\n apiKey: options.apiKey,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.onRequest ? { onRequest: options.onRequest } : {}),\n defaultHeaders: { \"user-agent\": \"cronvello-sdk\" },\n });\n this.jobs = new JobsResource(this.transport);\n this.tasks = new TasksResource(this.transport);\n this.runs = new RunsResource(this.transport);\n this.account = new AccountResource(this.transport);\n }\n\n /**\n * Atomically reconcile a whole code registry server-side (`PUT /v1/registry`): one job\n * container + its tasks, created/updated/pruned/started in a single call. This is what\n * `defineCronvello().sync()` prefers; the high-level API builds the body for you.\n */\n reconcileRegistry(body: RegistryReconcileRequest, opts?: { idempotencyKey?: string }): Promise<RegistryReconcileResponse> {\n return this.transport.request({\n method: \"PUT\",\n path: \"/v1/registry\",\n body,\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n\n /**\n * Escape hatch for endpoints not yet wrapped by a typed method (heartbeat monitors,\n * maintenance windows, DLQ, notification channels, audit log, API-key self-service …).\n * `T` is the response shape you expect.\n */\n request<T>(method: string, path: string, opts?: { query?: Record<string, string | number | boolean | undefined>; body?: unknown; idempotencyKey?: string }): Promise<T> {\n return this.transport.request<T>({\n method,\n path,\n ...(opts?.query ? { query: opts.query } : {}),\n ...(opts?.body !== undefined ? { body: opts.body } : {}),\n ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}),\n });\n }\n}\n\nclass JobsResource {\n constructor(private readonly t: Transport) {}\n\n list(): Promise<PublicJob[]> {\n return this.t.request({ method: \"GET\", path: \"/v1/jobs\" });\n }\n get(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}` });\n }\n create(body: JobCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: \"/v1/jobs\", body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n update(jobId: string, body: JobUpdateBody): Promise<PublicJob> {\n return this.t.request({ method: \"PATCH\", path: `/v1/jobs/${enc(jobId)}`, body });\n }\n delete(jobId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/jobs/${enc(jobId)}` });\n }\n start(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/start` });\n }\n stop(jobId: string): Promise<PublicJob> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/stop` });\n }\n listTasks(jobId: string): Promise<PublicTask[]> {\n return this.t.request({ method: \"GET\", path: `/v1/jobs/${enc(jobId)}/tasks` });\n }\n createTask(jobId: string, body: TaskCreateBody, opts?: { idempotencyKey?: string }): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/jobs/${enc(jobId)}/tasks`, body, ...(opts?.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {}) });\n }\n}\n\nclass TasksResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated task table. */\n list(query?: AccountTasksQuery): Promise<TasksPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/tasks\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}` });\n }\n update(taskId: string, body: TaskUpdateBody): Promise<PublicTask> {\n return this.t.request({ method: \"PATCH\", path: `/v1/tasks/${enc(taskId)}`, body });\n }\n delete(taskId: string): Promise<null> {\n return this.t.request({ method: \"DELETE\", path: `/v1/tasks/${enc(taskId)}` });\n }\n start(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/start` });\n }\n stop(taskId: string): Promise<PublicTask> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/stop` });\n }\n /** Trigger a one-off manual execution (does not change the schedule). */\n runNow(taskId: string): Promise<RunNowResult> {\n return this.t.request({ method: \"POST\", path: `/v1/tasks/${enc(taskId)}/run` });\n }\n listRuns(taskId: string, query?: RunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: `/v1/tasks/${enc(taskId)}/runs`, ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n}\n\nclass RunsResource {\n constructor(private readonly t: Transport) {}\n\n /** Account-wide paginated activity feed. */\n list(query?: AccountRunsQuery): Promise<RunsPage> {\n return this.t.request({ method: \"GET\", path: \"/v1/runs\", ...(query ? { query: query as Record<string, string | number | boolean | undefined> } : {}) });\n }\n get(runId: string): Promise<PublicRun> {\n return this.t.request({ method: \"GET\", path: `/v1/runs/${enc(runId)}` });\n }\n}\n\nclass AccountResource {\n constructor(private readonly t: Transport) {}\n\n me(): Promise<MeResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/me\" });\n }\n usage(): Promise<UsageResponse> {\n return this.t.request({ method: \"GET\", path: \"/v1/usage\" });\n }\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n","/**\n * Client-side cron + IANA-timezone validation.\n *\n * The goal is to catch *typos* at define/sync time with a clear message — not to re-implement the\n * server's scheduler. So the validator is deliberately permissive: it accepts the standard 5-field\n * crontab syntax (and an optional leading seconds field), the common `@macros`, names for months\n * and weekdays, and step/range/list combinations. Anything it cannot confidently reject is allowed\n * through, so a valid-but-unusual expression never blocks a deploy.\n */\n\nconst MACROS = new Set([\n \"@yearly\", \"@annually\", \"@monthly\", \"@weekly\", \"@daily\", \"@midnight\", \"@hourly\", \"@reboot\",\n]);\n\nconst MONTHS = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\", \"jul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"];\nconst DOWS = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\n\ninterface FieldSpec {\n min: number;\n max: number;\n names?: string[];\n label: string;\n}\n\n// Field order for a 5-part expression.\nconst FIVE: FieldSpec[] = [\n { min: 0, max: 59, label: \"minute\" },\n { min: 0, max: 23, label: \"hour\" },\n { min: 1, max: 31, label: \"day-of-month\" },\n { min: 1, max: 12, names: MONTHS, label: \"month\" },\n { min: 0, max: 7, names: DOWS, label: \"day-of-week\" }, // 0 and 7 are both Sunday\n];\nconst SECONDS: FieldSpec = { min: 0, max: 59, label: \"second\" };\n\nexport interface CronValidation {\n valid: boolean;\n /** Human-readable reason when invalid. */\n error?: string;\n}\n\n/** Validate a cron expression. Returns `{ valid, error? }` rather than throwing. */\nexport function validateCron(expr: string): CronValidation {\n if (typeof expr !== \"string\" || !expr.trim()) {\n return { valid: false, error: \"schedule is empty\" };\n }\n const trimmed = expr.trim();\n if (trimmed.startsWith(\"@\")) {\n return MACROS.has(trimmed.toLowerCase())\n ? { valid: true }\n : { valid: false, error: `unknown cron macro \"${trimmed}\" (try @daily, @hourly, …)` };\n }\n\n const parts = trimmed.split(/\\s+/);\n if (parts.length !== 5 && parts.length !== 6) {\n return {\n valid: false,\n error: `expected 5 fields (min hour dom month dow) or 6 with seconds, got ${parts.length}: \"${trimmed}\"`,\n };\n }\n\n const specs = parts.length === 6 ? [SECONDS, ...FIVE] : FIVE;\n for (let i = 0; i < parts.length; i++) {\n const err = validateField(parts[i]!, specs[i]!);\n if (err) return { valid: false, error: `invalid ${specs[i]!.label} \"${parts[i]}\": ${err}` };\n }\n return { valid: true };\n}\n\nfunction validateField(field: string, spec: FieldSpec): string | null {\n // A field is a comma-separated list of terms.\n for (const term of field.split(\",\")) {\n const err = validateTerm(term, spec);\n if (err) return err;\n }\n return null;\n}\n\nfunction validateTerm(term: string, spec: FieldSpec): string | null {\n if (term === \"\") return \"empty list item\";\n // step: <range-or-*>/<n>\n let step: string | undefined;\n let base = term;\n const slash = term.indexOf(\"/\");\n if (slash >= 0) {\n base = term.slice(0, slash);\n step = term.slice(slash + 1);\n if (!/^\\d+$/.test(step) || Number(step) === 0) return `step must be a positive integer`;\n }\n if (base === \"*\") return null;\n // range: a-b\n const dash = base.indexOf(\"-\");\n if (dash > 0) {\n const lo = resolveValue(base.slice(0, dash), spec);\n const hi = resolveValue(base.slice(dash + 1), spec);\n if (lo === null) return `\"${base.slice(0, dash)}\" is out of range ${spec.min}-${spec.max}`;\n if (hi === null) return `\"${base.slice(dash + 1)}\" is out of range ${spec.min}-${spec.max}`;\n if (lo > hi) return `range start ${lo} is greater than end ${hi}`;\n return null;\n }\n // single value (only meaningful with a step if it's the base of `n/step`, which crontab rejects;\n // but most parsers accept it, so we stay permissive).\n if (step !== undefined && base !== \"*\") {\n // e.g. \"5/10\" — accept the base as a start value.\n return resolveValue(base, spec) === null ? `\"${base}\" is out of range ${spec.min}-${spec.max}` : null;\n }\n return resolveValue(base, spec) === null ? `\"${base}\" is out of range ${spec.min}-${spec.max}` : null;\n}\n\n/** Resolve a numeric or named field value to its number, or null if out of range / unknown. */\nfunction resolveValue(token: string, spec: FieldSpec): number | null {\n if (/^\\d+$/.test(token)) {\n const n = Number(token);\n return n >= spec.min && n <= spec.max ? n : null;\n }\n if (spec.names) {\n const idx = spec.names.indexOf(token.toLowerCase());\n if (idx >= 0) return idx + (spec.label === \"month\" ? 1 : 0);\n }\n return null;\n}\n\n/** Throw a clear error if the cron expression is invalid. `context` is woven into the message. */\nexport function assertValidCron(expr: string, context = \"\"): void {\n const res = validateCron(expr);\n if (!res.valid) {\n throw new Error(`${context ? `${context}: ` : \"\"}invalid cron schedule — ${res.error}`);\n }\n}\n\n/** True if `tz` is a valid IANA timezone (uses the runtime's Intl database). \"UTC\" always passes. */\nexport function isValidTimeZone(tz: string): boolean {\n if (!tz || typeof tz !== \"string\") return false;\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: tz });\n return true;\n } catch {\n return false;\n }\n}\n\n/** Throw a clear error if the timezone is not a valid IANA zone. */\nexport function assertValidTimeZone(tz: string, context = \"\"): void {\n if (!isValidTimeZone(tz)) {\n throw new Error(`${context ? `${context}: ` : \"\"}invalid timezone \"${tz}\" (expected an IANA name like \"Europe/Berlin\" or \"UTC\")`);\n }\n}\n","/**\n * Authentication helpers for the dispatch handler.\n *\n * Inbound (Cronvello → app): a bearer token equal to the configured `dispatchSecret`.\n * We compare it in constant time to avoid leaking the secret through timing.\n *\n * Outbound (app → Cronvello, async_callback only): we sign the callback body with\n * HMAC-SHA256 (`sha256=<hex>`), matching Cronvello's callback signature format.\n */\n\nconst encoder = new TextEncoder();\n\n/** Parse `Authorization: Bearer <token>` (scheme is case-insensitive). Returns the token or null. */\nexport function parseBearer(headerValue: string | undefined): string | null {\n if (!headerValue) return null;\n const match = /^bearer\\s+(.+)$/i.exec(headerValue.trim());\n return match ? match[1]!.trim() : null;\n}\n\n/**\n * Constant-time string comparison. Runs in time proportional to the longer input and never\n * short-circuits, so it does not reveal where two values diverge. No `node:crypto` dependency,\n * so it works on edge runtimes too.\n */\nexport function timingSafeEqual(a: string, b: string): boolean {\n const ab = encoder.encode(a);\n const bb = encoder.encode(b);\n const len = Math.max(ab.length, bb.length);\n let diff = ab.length ^ bb.length;\n for (let i = 0; i < len; i++) {\n diff |= (ab[i] ?? 0) ^ (bb[i] ?? 0);\n }\n return diff === 0;\n}\n\n/**\n * HMAC-SHA256 signature in Cronvello's wire format: `sha256=<hex>`.\n * Uses WebCrypto (`crypto.subtle`), a global on Node 20+ and edge runtimes — no node:crypto.\n */\nexport async function signHmacSha256(payload: string, secret: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n const hex = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return `sha256=${hex}`;\n}\n","/**\n * Framework-neutral dispatch core.\n *\n * Cronvello fires a due task by POSTing to the app's dispatch URL with\n * Authorization: Bearer <dispatchSecret>\n * body: { job: \"<registry-key>\", schedule: \"<cron>\", ...payload, _callback?: {...} }\n *\n * This module verifies the bearer, selects the job by key, runs its handler, and returns a\n * response. The Express/Next adapters are thin shells that translate their request/response\n * objects to/from the neutral shapes below.\n */\n\nimport type { CronvelloHooks, CronvelloJobConfig, CronvelloJobContext, CronvelloLogger, CronvelloRunSource } from \"./types.js\";\nimport { parseBearer, signHmacSha256, timingSafeEqual } from \"./verify.js\";\n\nexport interface ResolvedJob {\n key: string;\n config: CronvelloJobConfig;\n}\n\n/** A logger that discards everything — used when the app configures none, so `ctx.logger` is always safe. */\nexport const NOOP_LOGGER: CronvelloLogger = {};\n\nexport interface DispatcherState {\n jobs: Map<string, ResolvedJob>;\n dispatchSecret: string;\n logger: CronvelloLogger | undefined;\n hooks?: CronvelloHooks | undefined;\n /** Reject inbound bodies larger than this many bytes (default 1 MiB). */\n maxBodyBytes?: number;\n}\n\nexport interface DispatchRequest {\n method: string;\n /** Value of the Authorization header, if any. */\n authorization: string | undefined;\n /** Raw request body as text. */\n rawBody: string;\n /** Lower-cased request headers. */\n headers: Record<string, string>;\n /** Abort signal for the inbound request, if the host provides one. */\n signal?: AbortSignal;\n /**\n * Optional serverless lifecycle hook (e.g. Vercel/Cloudflare `ctx.waitUntil`). When present,\n * async_callback background work is registered with it so the function stays alive until done.\n */\n waitUntil?: (promise: Promise<unknown>) => void;\n}\n\nexport interface DispatchResponse {\n status: number;\n body: Record<string, unknown>;\n}\n\n/** Async-callback metadata Cronvello injects into the request body. */\ninterface CallbackEnvelope {\n url: string;\n runId: string;\n expectedSignatureHeader?: string;\n timeoutMs?: number;\n}\n\nexport interface Dispatcher {\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /**\n * Run a job's handler in-process (no HTTP, no auth) — powers `cronvello.trigger()` and the local\n * engine. An optional `signal` is surfaced to the handler as `ctx.signal`, which the local engine\n * aborts when a run exceeds its timeout.\n */\n runLocal(key: string, payload?: Record<string, unknown>, opts?: { signal?: AbortSignal }): Promise<unknown>;\n}\n\nexport function createDispatcher(state: DispatcherState): Dispatcher {\n const log = state.logger ?? NOOP_LOGGER;\n const hooks = state.hooks;\n const maxBodyBytes = state.maxBodyBytes ?? 1_048_576; // 1 MiB\n\n /** Run the handler with lifecycle hooks + timing. Hook failures never break the run. */\n async function invokeHandler(job: ResolvedJob, ctx: CronvelloJobContext): Promise<{ durationMs: number; result: unknown }> {\n await safeHook(() => hooks?.onJobStart?.({ key: job.key, source: ctx.source, isAsync: ctx.isAsync }), log);\n const startedAt = Date.now();\n try {\n const result = await job.config.handler(ctx);\n const durationMs = Date.now() - startedAt;\n log.debug?.(`[cronvello] job '${job.key}' completed in ${durationMs}ms`);\n await safeHook(() => hooks?.onJobSuccess?.({ key: job.key, source: ctx.source, durationMs, result }), log);\n return { durationMs, result };\n } catch (err) {\n const durationMs = Date.now() - startedAt;\n const error = err instanceof Error ? err : new Error(String(err));\n log.error?.(`[cronvello] job '${job.key}' failed: ${error.message}`, { error: error.message });\n await safeHook(() => hooks?.onJobError?.({ key: job.key, source: ctx.source, durationMs, error }), log);\n throw error;\n }\n }\n\n function buildContext(key: string, job: ResolvedJob, req: DispatchRequest | null, body: Record<string, unknown>, isAsync: boolean, source: CronvelloRunSource, signal?: AbortSignal): CronvelloJobContext {\n return {\n key,\n schedule: typeof body[\"schedule\"] === \"string\" ? (body[\"schedule\"] as string) : (job.config.schedule ?? \"\"),\n payload: (job.config.payload as Record<string, unknown>) ?? {},\n body,\n headers: req?.headers ?? {},\n isAsync,\n source,\n logger: log,\n signal: req?.signal ?? signal,\n };\n }\n\n async function handle(req: DispatchRequest): Promise<DispatchResponse> {\n if (req.method.toUpperCase() !== \"POST\") {\n return resp(405, { ok: false, error: \"Method not allowed\" });\n }\n\n // 1. Authenticate: bearer must equal the dispatch secret (constant-time).\n const token = parseBearer(req.authorization);\n if (!token || !timingSafeEqual(token, state.dispatchSecret)) {\n log.warn?.(\"[cronvello] dispatch rejected: bad or missing bearer token\");\n return resp(401, { ok: false, error: \"Unauthorized\" });\n }\n\n // 2. Guard body size before parsing (defence against oversized/abusive payloads).\n if (byteLength(req.rawBody) > maxBodyBytes) {\n log.warn?.(`[cronvello] dispatch rejected: body exceeds ${maxBodyBytes} bytes`);\n return resp(413, { ok: false, error: \"Payload too large\" });\n }\n\n // 3. Parse the body.\n let body: Record<string, unknown>;\n try {\n const parsed = req.rawBody ? JSON.parse(req.rawBody) : {};\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return resp(400, { ok: false, error: \"Body must be a JSON object\" });\n }\n body = parsed as Record<string, unknown>;\n } catch {\n return resp(400, { ok: false, error: \"Invalid JSON body\" });\n }\n\n // 4. Select the job by its registry key.\n const key = typeof body[\"job\"] === \"string\" ? (body[\"job\"] as string) : null;\n if (!key) {\n return resp(400, { ok: false, error: \"Missing 'job' key in body\" });\n }\n const job = state.jobs.get(key);\n if (!job) {\n log.warn?.(`[cronvello] dispatch for unknown job '${key}'`);\n return resp(404, { ok: false, error: `Unknown job: ${key}` });\n }\n\n const callback = readCallback(body[\"_callback\"]);\n const isAsync = callback !== null;\n const ctx = buildContext(key, job, req, body, isAsync, \"dispatch\");\n\n // 5a. Async path — acknowledge now, run in the background, post the result back.\n if (callback) {\n const work = runAndReportCallback(job, ctx, callback, state.dispatchSecret, log, invokeHandler);\n if (req.waitUntil) req.waitUntil(work);\n else void work; // fire-and-forget on long-running hosts\n return resp(202, { ok: true, job: key, accepted: true });\n }\n\n // 5b. Sync path — run inline; the result IS the HTTP response Cronvello records.\n try {\n const { result } = await invokeHandler(job, ctx);\n return resp(200, { ok: true, job: key, result: result ?? null });\n } catch (err) {\n // Non-2xx → Cronvello records a failure and retries per the task's maxRetries.\n return resp(500, { ok: false, job: key, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n async function runLocal(key: string, payload?: Record<string, unknown>, opts?: { signal?: AbortSignal }): Promise<unknown> {\n const job = state.jobs.get(key);\n if (!job) throw new Error(`Unknown job '${key}'. Known: ${[...state.jobs.keys()].join(\", \") || \"(none)\"}`);\n const body: Record<string, unknown> = { job: key, schedule: job.config.schedule, ...(payload ?? {}) };\n const ctx = buildContext(key, job, null, body, false, \"local\", opts?.signal);\n const { result } = await invokeHandler(job, ctx);\n return result;\n }\n\n return { handle, runLocal };\n}\n\nasync function runAndReportCallback(\n job: ResolvedJob,\n ctx: CronvelloJobContext,\n callback: CallbackEnvelope,\n secret: string,\n log: CronvelloLogger,\n invokeHandler: (job: ResolvedJob, ctx: CronvelloJobContext) => Promise<{ durationMs: number; result: unknown }>,\n): Promise<void> {\n let payload: Record<string, unknown>;\n try {\n const { durationMs, result } = await invokeHandler(job, ctx);\n payload = { runId: callback.runId, success: true, durationMs, result: result ?? null };\n } catch (err) {\n payload = {\n runId: callback.runId,\n success: false,\n durationMs: 0,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n\n try {\n const bodyStr = JSON.stringify(payload);\n const header = callback.expectedSignatureHeader || \"X-Webhook-Signature\";\n const signature = await signHmacSha256(bodyStr, secret);\n const res = await fetch(callback.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", [header]: signature },\n body: bodyStr,\n });\n if (!res.ok) {\n log.warn?.(`[cronvello] callback POST for job '${job.key}' returned ${res.status}`);\n }\n } catch (err) {\n log.error?.(`[cronvello] failed to deliver callback for job '${job.key}'`, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/** Run a lifecycle hook, swallowing any error it throws so observability never breaks a job. */\nasync function safeHook(fn: () => void | Promise<void> | undefined, log: CronvelloLogger): Promise<void> {\n try {\n await fn();\n } catch (err) {\n log.warn?.(`[cronvello] a lifecycle hook threw: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\n/** Byte length of a UTF-8 string without allocating a Buffer when TextEncoder is available. */\nfunction byteLength(s: string): number {\n if (!s) return 0;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(s).length;\n return s.length;\n}\n\nfunction readCallback(value: unknown): CallbackEnvelope | null {\n if (!value || typeof value !== \"object\") return null;\n const v = value as Record<string, unknown>;\n if (typeof v[\"url\"] !== \"string\" || typeof v[\"runId\"] !== \"string\") return null;\n return {\n url: v[\"url\"] as string,\n runId: v[\"runId\"] as string,\n ...(typeof v[\"expectedSignatureHeader\"] === \"string\"\n ? { expectedSignatureHeader: v[\"expectedSignatureHeader\"] as string }\n : {}),\n ...(typeof v[\"timeoutMs\"] === \"number\" ? { timeoutMs: v[\"timeoutMs\"] as number } : {}),\n };\n}\n\nfunction resp(status: number, body: Record<string, unknown>): DispatchResponse {\n return { status, body };\n}\n","/**\n * Idempotent reconciliation of a code registry into Cronvello.\n *\n * Model: ONE Job container per app (named `appName`), and one Task per registry job. The\n * Task's `name` IS the registry key — the stable identity used for matching, so renaming a\n * job's display/description never breaks the link. On each `sync()` we:\n * 1. ensure the Job container exists,\n * 2. diff registry tasks against the container's current tasks,\n * 3. create missing, patch changed, (optionally) delete removed,\n * 4. start newly-created tasks (Cronvello creates them DISABLED).\n *\n * The container is fully SDK-managed: only tasks inside THIS app's Job are ever touched.\n */\n\nimport type { CronvelloClient } from \"../client/client.js\";\nimport type {\n PublicJob,\n PublicTask,\n SuccessCriteria,\n TaskCreateBody,\n TaskUpdateBody,\n} from \"../internal/wire.js\";\nimport type {\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./types.js\";\nimport type { ResolvedJob } from \"./dispatch.js\";\n\nexport interface ReconcileInput {\n client: CronvelloClient;\n appName: string;\n appDescription?: string;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n jobs: ResolvedJob[];\n}\n\nexport async function reconcile(input: ReconcileInput, options: SyncOptions = {}): Promise<ReconcileResult> {\n const { client, appName, dispatchUrl, dispatchSecret, defaultTimeZone, jobs } = input;\n const prune = options.prune ?? true;\n const dryRun = options.dryRun ?? false;\n const rotateSecret = options.rotateSecret ?? false;\n\n // 1. Ensure the Job container.\n const { job: container, created: jobCreated } = await ensureContainer(client, appName, input.appDescription, dryRun);\n const jobId = container?.id ?? \"(dry-run)\";\n\n const changes: ReconcileTaskChange[] = [];\n const existingTasks = container && !jobCreated ? await client.jobs.listTasks(container.id) : [];\n const byKey = new Map(existingTasks.map((t) => [t.name, t] as const));\n const registryKeys = new Set(jobs.map((j) => j.key));\n\n // 2. Reconcile each registry job.\n for (const job of jobs) {\n const enabled = job.config.enabled ?? true;\n const existing = byKey.get(job.key);\n const desired = buildDesiredTask({ job, dispatchUrl, dispatchSecret, defaultTimeZone });\n\n if (!enabled) {\n // Keep the task but make sure it is not scheduled.\n if (existing && existing.status === \"ACTIVE\" && !dryRun) await client.tasks.stop(existing.id);\n changes.push({ key: job.key, action: \"skipped\", taskId: existing?.id ?? null, reason: \"disabled in registry\" });\n continue;\n }\n\n if (!existing) {\n if (dryRun || !container) {\n changes.push({ key: job.key, action: \"created\", taskId: null });\n continue;\n }\n const createBody: TaskCreateBody = { ...desired, targetToken: dispatchSecret };\n const task = await client.jobs.createTask(container.id, createBody, { idempotencyKey: `cv-create-${appName}-${job.key}` });\n await client.tasks.start(task.id); // tasks are created DISABLED\n changes.push({ key: job.key, action: \"created\", taskId: task.id });\n continue;\n }\n\n // Existing task — compute the diff.\n const { patch, changedFields } = diffTask(existing, desired, { rotateSecret, dispatchSecret });\n const needsStart = existing.status === \"DISABLED\";\n\n if (changedFields.length === 0 && !needsStart) {\n changes.push({ key: job.key, action: \"unchanged\", taskId: existing.id });\n continue;\n }\n if (!dryRun) {\n if (changedFields.length > 0) await client.tasks.update(existing.id, patch);\n if (needsStart) await client.tasks.start(existing.id);\n }\n changes.push({\n key: job.key,\n action: changedFields.length > 0 ? \"updated\" : \"unchanged\",\n taskId: existing.id,\n ...(changedFields.length > 0 ? { changedFields } : {}),\n ...(needsStart ? { reason: \"re-activated\" } : {}),\n });\n }\n\n // 3. Prune tasks no longer in the registry.\n if (prune) {\n for (const task of existingTasks) {\n if (registryKeys.has(task.name)) continue;\n if (!dryRun) await client.tasks.delete(task.id);\n changes.push({ key: task.name, action: \"deleted\", taskId: task.id });\n }\n }\n\n return summarize(jobId, appName, jobCreated, changes);\n}\n\nasync function ensureContainer(\n client: CronvelloClient,\n appName: string,\n description: string | undefined,\n dryRun: boolean,\n): Promise<{ job: PublicJob | null; created: boolean }> {\n const jobs = await client.jobs.list();\n const found = jobs.find((j) => j.name === appName);\n if (found) return { job: found, created: false };\n if (dryRun) return { job: null, created: true };\n const created = await client.jobs.create(\n { name: appName, ...(description ? { description } : {}) },\n { idempotencyKey: `cv-job-${appName}` },\n );\n return { job: created, created: true };\n}\n\nfunction buildDesiredTask(args: {\n job: ResolvedJob;\n dispatchUrl: string;\n dispatchSecret: string;\n defaultTimeZone: string;\n}): TaskCreateBody {\n const { job, dispatchUrl, defaultTimeZone } = args;\n const cfg = job.config;\n const requestBody = JSON.stringify({ job: job.key, ...(cfg.payload ?? {}) });\n const body: TaskCreateBody = {\n name: job.key,\n schedule: cfg.schedule,\n timeZone: cfg.timeZone ?? defaultTimeZone,\n targetUrl: dispatchUrl,\n method: \"POST\",\n requestBody,\n };\n if (cfg.description !== undefined) body.description = cfg.description;\n if (cfg.urgency !== undefined) body.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) body.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) body.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) body.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) body.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) body.successCriteria = cfg.successCriteria;\n return body;\n}\n\nfunction diffTask(\n existing: PublicTask,\n desired: TaskCreateBody,\n opts: { rotateSecret: boolean; dispatchSecret: string },\n): { patch: TaskUpdateBody; changedFields: string[] } {\n const patch: TaskUpdateBody = {};\n const changed: string[] = [];\n\n const set = <K extends keyof TaskUpdateBody>(field: K, value: TaskUpdateBody[K]) => {\n patch[field] = value;\n changed.push(field);\n };\n\n if (existing.schedule !== desired.schedule) set(\"schedule\", desired.schedule);\n if (desired.timeZone !== undefined && existing.timeZone !== desired.timeZone) set(\"timeZone\", desired.timeZone);\n if (existing.targetUrl !== desired.targetUrl) set(\"targetUrl\", desired.targetUrl);\n if (existing.method !== (desired.method ?? \"POST\")) set(\"method\", desired.method ?? \"POST\");\n if (!jsonEqual(existing.requestBody, desired.requestBody)) set(\"requestBody\", desired.requestBody ?? null);\n\n // Optional fields: only reconcile when the registry explicitly sets them.\n if (desired.description !== undefined && (existing.description ?? undefined) !== desired.description) {\n set(\"description\", desired.description);\n }\n if (desired.urgency !== undefined && existing.urgency !== desired.urgency) set(\"urgency\", desired.urgency);\n if (desired.maxRetries !== undefined && existing.maxRetries !== desired.maxRetries) set(\"maxRetries\", desired.maxRetries);\n if (desired.executionMode !== undefined && existing.executionMode !== desired.executionMode) {\n set(\"executionMode\", desired.executionMode);\n }\n if (desired.callbackTimeoutMs !== undefined && existing.callbackTimeoutMs !== desired.callbackTimeoutMs) {\n set(\"callbackTimeoutMs\", desired.callbackTimeoutMs);\n }\n if (desired.allowConcurrentRuns !== undefined && existing.allowConcurrentRuns !== desired.allowConcurrentRuns) {\n set(\"allowConcurrentRuns\", desired.allowConcurrentRuns);\n }\n if (desired.successCriteria !== undefined && !deepEqual(existing.successCriteria, desired.successCriteria)) {\n set(\"successCriteria\", desired.successCriteria as SuccessCriteria);\n }\n\n // The dispatch secret (targetToken) can't be read back — only (re)set it on demand or when absent.\n if (opts.rotateSecret || !existing.hasTargetToken) set(\"targetToken\", opts.dispatchSecret);\n\n return { patch, changedFields: changed };\n}\n\nfunction jsonEqual(a: string | null, b: string | null | undefined): boolean {\n if (a == null || b == null) return a == b;\n try {\n return deepEqual(JSON.parse(a), JSON.parse(b));\n } catch {\n return a === b;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n const ak = Object.keys(a as object).sort();\n const bk = Object.keys(b as object).sort();\n if (ak.length !== bk.length) return false;\n for (let i = 0; i < ak.length; i++) {\n if (ak[i] !== bk[i]) return false;\n if (!deepEqual((a as Record<string, unknown>)[ak[i]!], (b as Record<string, unknown>)[bk[i]!])) return false;\n }\n return true;\n}\n\nfunction summarize(\n jobId: string,\n jobName: string,\n jobCreated: boolean,\n changes: ReconcileTaskChange[],\n): ReconcileResult {\n const count = (a: ReconcileTaskChange[\"action\"]) => changes.filter((c) => c.action === a).length;\n return {\n jobId,\n jobName,\n jobCreated,\n created: count(\"created\"),\n updated: count(\"updated\"),\n unchanged: count(\"unchanged\"),\n deleted: count(\"deleted\"),\n skipped: count(\"skipped\"),\n changes,\n };\n}\n","/**\n * Express adapter. Zero dependency on `express` itself — the request/response are typed\n * structurally, so this works with Express 4/5 and any Connect-style middleware stack.\n *\n * import { defineCronvello } from \"@cronvello/sdk\";\n * import { expressHandler } from \"@cronvello/sdk/express\";\n *\n * app.post(\"/cronvello/dispatch\", express.json(), expressHandler(cronvello));\n * // …or simply: app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n *\n * Works with or without `express.json()` — if the body isn't pre-parsed, the raw stream is read.\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\nexport interface ExpressRequestLike {\n method?: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n on?(event: string, listener: (chunk?: unknown) => void): void;\n}\n\nexport interface ExpressResponseLike {\n status(code: number): ExpressResponseLike;\n json(body: unknown): void;\n}\n\nexport type ExpressDispatchHandler = (req: ExpressRequestLike, res: ExpressResponseLike) => Promise<void>;\n\nexport function expressHandler(app: DispatchHandler): ExpressDispatchHandler {\n return async (req, res) => {\n const rawBody = await readBody(req);\n const result = await app.handle({\n method: req.method ?? \"POST\",\n authorization: headerValue(req.headers[\"authorization\"]),\n rawBody,\n headers: flattenHeaders(req.headers),\n });\n res.status(result.status).json(result.body);\n };\n}\n\nasync function readBody(req: ExpressRequestLike): Promise<string> {\n const body = req.body;\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\") return body;\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(body)) return body.toString(\"utf8\");\n if (typeof body === \"object\") return JSON.stringify(body);\n }\n if (typeof req.on !== \"function\") return \"\";\n return new Promise<string>((resolve) => {\n let data = \"\";\n req.on!(\"data\", (chunk?: unknown) => {\n data += typeof chunk === \"string\" ? chunk : String(chunk ?? \"\");\n });\n req.on!(\"end\", () => resolve(data));\n req.on!(\"error\", () => resolve(data));\n });\n}\n\nfunction headerValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) return value[0];\n return value;\n}\n\nfunction flattenHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined) continue;\n out[k.toLowerCase()] = Array.isArray(v) ? v.join(\", \") : v;\n }\n return out;\n}\n","/**\n * Next.js App Router adapter (Route Handlers). Zero dependency on `next` — uses the Web\n * Fetch `Request`/`Response` globals (Node 20+ and the edge runtime).\n *\n * // app/cronvello/dispatch/route.ts\n * import { cronvello } from \"@/lib/cronvello\";\n * import { nextHandler } from \"@cronvello/sdk/next\";\n * export const POST = nextHandler(cronvello);\n *\n * On serverless hosts, prefer the default sync execution mode so the work finishes within the\n * request. async_callback needs a host that keeps running after the response (see docs).\n */\n\nimport type { DispatchHandler } from \"../registry/dispatch-handler.js\";\n\n/** Structural subset of the Web Fetch `Request` we rely on. */\nexport interface FetchRequestLike {\n method: string;\n headers: {\n get(name: string): string | null;\n forEach?(cb: (value: string, key: string) => void): void;\n };\n text(): Promise<string>;\n}\n\nexport type NextRouteHandler = (req: FetchRequestLike) => Promise<Response>;\n\nexport function nextHandler(app: DispatchHandler): NextRouteHandler {\n return async (req) => {\n const rawBody = await req.text();\n const headers: Record<string, string> = {};\n req.headers.forEach?.((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n const result = await app.handle({\n method: req.method,\n authorization: req.headers.get(\"authorization\") ?? undefined,\n rawBody,\n headers,\n });\n return new Response(JSON.stringify(result.body), {\n status: result.status,\n headers: { \"content-type\": \"application/json\" },\n });\n };\n}\n","/**\n * Cron schedule arithmetic for the local engine — next-occurrence, preview, and an upcoming-window\n * planner, all timezone-aware (IANA / DST) and **zero-dependency**.\n *\n * The cloud SDK only needs to *validate* a cron string (see `cron.ts`), because the server owns the\n * scheduler. The local engine has to actually *fire* jobs, so it needs the next time an expression\n * matches. This module is that calculator.\n *\n * How the timezone math works without a date library:\n * • A cron expression matches against **wall-clock** fields (the time a person reads off a clock in\n * the job's timezone), so the search is done on naive calendar fields and only converted to a\n * real epoch once a full match is found.\n * • To convert a wall-clock time in a zone to an absolute epoch we use the runtime's own IANA\n * database via `Intl.DateTimeFormat`: format a guess into the zone, measure the offset it\n * implies, and correct once. This is the standard offset-probe technique and it handles DST\n * transitions (a daily job at 04:00 stays at 04:00 local; the gap to the previous fire is 23h or\n * 25h across the spring/autumn switch).\n *\n * Supported syntax mirrors `validateCron`: 5-field crontab, an optional leading seconds field\n * (6 fields), the `@macros`, month/weekday names, and `*` / ranges / lists / steps. Day-of-month and\n * day-of-week combine with Vixie cron's OR semantics when both are restricted.\n */\n\nconst MACRO_EXPANSIONS: Record<string, string> = {\n \"@yearly\": \"0 0 1 1 *\",\n \"@annually\": \"0 0 1 1 *\",\n \"@monthly\": \"0 0 1 * *\",\n \"@weekly\": \"0 0 * * 0\",\n \"@daily\": \"0 0 * * *\",\n \"@midnight\": \"0 0 * * *\",\n \"@hourly\": \"0 * * * *\",\n};\n\nconst MONTH_NAMES = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\", \"jul\", \"aug\", \"sep\", \"oct\", \"nov\", \"dec\"];\nconst DOW_NAMES = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\n\ninterface FieldSpec {\n min: number;\n max: number;\n names?: string[];\n /** Offset added to a resolved name index (months are 1-based, weekdays 0-based). */\n nameOffset: number;\n /** Map an expanded value into its canonical form (used to fold weekday 7 → 0). */\n fold?: (v: number) => number;\n label: string;\n}\n\nconst SECOND_SPEC: FieldSpec = { min: 0, max: 59, nameOffset: 0, label: \"second\" };\nconst MINUTE_SPEC: FieldSpec = { min: 0, max: 59, nameOffset: 0, label: \"minute\" };\nconst HOUR_SPEC: FieldSpec = { min: 0, max: 23, nameOffset: 0, label: \"hour\" };\nconst DOM_SPEC: FieldSpec = { min: 1, max: 31, nameOffset: 0, label: \"day-of-month\" };\nconst MONTH_SPEC: FieldSpec = { min: 1, max: 12, names: MONTH_NAMES, nameOffset: 1, label: \"month\" };\nconst DOW_SPEC: FieldSpec = { min: 0, max: 7, names: DOW_NAMES, nameOffset: 0, fold: (v) => v % 7, label: \"day-of-week\" };\n\n/** A cron expression compiled into the set of values each field matches. */\nexport interface ParsedCron {\n /** Allowed seconds. For a 5-field expression this is `{0}`. */\n seconds: Set<number>;\n minutes: Set<number>;\n hours: Set<number>;\n daysOfMonth: Set<number>;\n months: Set<number>;\n /** Allowed weekdays, 0 = Sunday … 6 = Saturday (7 is folded to 0). */\n daysOfWeek: Set<number>;\n /** True when the day-of-month field was anything other than `*`/`?`. */\n domRestricted: boolean;\n /** True when the day-of-week field was anything other than `*`/`?`. */\n dowRestricted: boolean;\n /** True for `@reboot`, which has no scheduled next time (the engine fires it once at start). */\n reboot: boolean;\n}\n\n/** Parse a cron expression into matchable value-sets. Throws on a malformed expression. */\nexport function parseCron(expr: string): ParsedCron {\n if (typeof expr !== \"string\" || !expr.trim()) throw new Error(\"cron expression is empty\");\n let trimmed = expr.trim();\n\n if (trimmed.startsWith(\"@\")) {\n const macro = trimmed.toLowerCase();\n if (macro === \"@reboot\") {\n return {\n seconds: new Set([0]), minutes: new Set(), hours: new Set(), daysOfMonth: new Set(),\n months: new Set(), daysOfWeek: new Set(), domRestricted: false, dowRestricted: false, reboot: true,\n };\n }\n const expanded = MACRO_EXPANSIONS[macro];\n if (!expanded) throw new Error(`unknown cron macro \"${trimmed}\" (try @daily, @hourly, …)`);\n trimmed = expanded;\n }\n\n const parts = trimmed.split(/\\s+/);\n if (parts.length !== 5 && parts.length !== 6) {\n throw new Error(`expected 5 fields (min hour dom month dow) or 6 with seconds, got ${parts.length}: \"${trimmed}\"`);\n }\n\n const hasSeconds = parts.length === 6;\n const [secRaw, minRaw, hourRaw, domRaw, monthRaw, dowRaw] = hasSeconds\n ? parts\n : [\"0\", ...parts];\n\n return {\n seconds: expandField(secRaw!, SECOND_SPEC),\n minutes: expandField(minRaw!, MINUTE_SPEC),\n hours: expandField(hourRaw!, HOUR_SPEC),\n daysOfMonth: expandField(domRaw!, DOM_SPEC),\n months: expandField(monthRaw!, MONTH_SPEC),\n daysOfWeek: expandField(dowRaw!, DOW_SPEC),\n domRestricted: isRestricted(domRaw!),\n dowRestricted: isRestricted(dowRaw!),\n reboot: false,\n };\n}\n\nfunction isRestricted(field: string): boolean {\n const f = field.trim();\n return f !== \"*\" && f !== \"?\";\n}\n\n/** Expand one comma-separated field (`*`, ranges, lists, steps, names) into its value set. */\nfunction expandField(raw: string, spec: FieldSpec): Set<number> {\n const set = new Set<number>();\n for (const term of raw.split(\",\")) {\n if (term === \"\") throw new Error(`empty term in ${spec.label} field \"${raw}\"`);\n\n let base = term;\n let step = 1;\n const slash = term.indexOf(\"/\");\n if (slash >= 0) {\n base = term.slice(0, slash);\n const stepStr = term.slice(slash + 1);\n if (!/^\\d+$/.test(stepStr) || Number(stepStr) === 0) {\n throw new Error(`invalid step \"${stepStr}\" in ${spec.label} field \"${raw}\"`);\n }\n step = Number(stepStr);\n }\n\n let lo: number | null;\n let hi: number | null;\n if (base === \"*\" || base === \"?\") {\n lo = spec.min;\n hi = spec.max;\n } else {\n const dash = base.indexOf(\"-\");\n if (dash > 0) {\n lo = resolveValue(base.slice(0, dash), spec);\n hi = resolveValue(base.slice(dash + 1), spec);\n } else {\n lo = resolveValue(base, spec);\n // A bare value with a step (e.g. \"5/15\") runs from the value up to the field max.\n hi = step > 1 ? spec.max : lo;\n }\n }\n\n if (lo === null || hi === null) {\n throw new Error(`value out of range in ${spec.label} field \"${raw}\" (${spec.min}-${spec.max})`);\n }\n if (lo > hi) throw new Error(`range start ${lo} is greater than end ${hi} in ${spec.label} field \"${raw}\"`);\n\n for (let v = lo; v <= hi; v += step) set.add(spec.fold ? spec.fold(v) : v);\n }\n return set;\n}\n\n/** Resolve a numeric or named token to its number, or null when out of range / unknown. */\nfunction resolveValue(token: string, spec: FieldSpec): number | null {\n const t = token.trim();\n if (/^\\d+$/.test(t)) {\n const n = Number(t);\n return n >= spec.min && n <= spec.max ? n : null;\n }\n if (spec.names) {\n const idx = spec.names.indexOf(t.toLowerCase());\n if (idx >= 0) return idx + spec.nameOffset;\n }\n return null;\n}\n\n// ─── Next-occurrence search ──────────────────────────────────────────────────\n\nexport interface NextOccurrenceOptions {\n /** Search strictly after this instant (epoch ms or Date). Defaults to now. */\n from?: Date | number;\n /** IANA timezone the expression is read in. Defaults to \"UTC\". */\n timeZone?: string;\n}\n\n/** How many years ahead the search gives up after — a guard against impossible expressions. */\nconst SEARCH_HORIZON_YEARS = 5;\n\n/**\n * The next instant the expression fires, strictly after `from`, in the given timezone — or `null`\n * when nothing matches within {@link SEARCH_HORIZON_YEARS} (e.g. Feb-30). Throws for `@reboot`.\n */\nexport function nextOccurrence(expr: string | ParsedCron, opts: NextOccurrenceOptions = {}): Date | null {\n const parsed = typeof expr === \"string\" ? parseCron(expr) : expr;\n if (parsed.reboot) throw new Error(\"@reboot has no scheduled next occurrence (the engine fires it once at start)\");\n\n const tz = opts.timeZone ?? \"UTC\";\n const fromMs = opts.from === undefined ? Date.now() : typeof opts.from === \"number\" ? opts.from : opts.from.getTime();\n\n // Move strictly forward by at least one whole second, then search on wall-clock fields.\n const cursor = Math.floor(fromMs / 1000) * 1000 + 1000;\n const p = getZonedParts(cursor, tz);\n const startYear = p.y;\n\n const hourArr = sorted(parsed.hours);\n const minuteArr = sorted(parsed.minutes);\n const secondArr = sorted(parsed.seconds);\n\n let guard = 0;\n while (guard++ < 1_000_000) {\n if (p.y > startYear + SEARCH_HORIZON_YEARS) return null;\n\n if (!parsed.months.has(p.mo)) {\n bumpMonth(p);\n continue;\n }\n if (p.d > daysInMonth(p.y, p.mo)) {\n bumpMonth(p);\n continue;\n }\n if (!dayMatches(parsed, p.y, p.mo, p.d)) {\n bumpDay(p);\n continue;\n }\n const nh = firstAtLeast(hourArr, p.h);\n if (nh === null) {\n bumpDay(p);\n continue;\n }\n if (nh !== p.h) {\n p.h = nh;\n p.mi = 0;\n p.s = 0;\n }\n const nmi = firstAtLeast(minuteArr, p.mi);\n if (nmi === null) {\n p.h += 1;\n p.mi = 0;\n p.s = 0;\n continue;\n }\n if (nmi !== p.mi) {\n p.mi = nmi;\n p.s = 0;\n }\n const ns = firstAtLeast(secondArr, p.s);\n if (ns === null) {\n p.mi += 1;\n p.s = 0;\n continue;\n }\n p.s = ns;\n\n // Full wall-clock match — convert to a real epoch in the zone.\n const epoch = zonedWallToEpoch(p, tz);\n // Guard against a DST fold mapping the candidate back to or before `from`.\n if (epoch <= fromMs) {\n p.s += 1;\n continue;\n }\n return new Date(epoch);\n }\n throw new Error(`nextOccurrence: search exceeded its iteration bound for \"${typeof expr === \"string\" ? expr : \"(parsed)\"}\"`);\n}\n\n/** Whether a day satisfies the day-of-month / day-of-week fields, with Vixie OR semantics. */\nfunction dayMatches(parsed: ParsedCron, y: number, mo: number, d: number): boolean {\n const domOk = parsed.daysOfMonth.has(d);\n const dowOk = parsed.daysOfWeek.has(weekdayOf(y, mo, d));\n if (parsed.domRestricted && parsed.dowRestricted) return domOk || dowOk;\n if (parsed.domRestricted) return domOk;\n if (parsed.dowRestricted) return dowOk;\n return true;\n}\n\ninterface WallParts {\n y: number;\n mo: number;\n d: number;\n h: number;\n mi: number;\n s: number;\n}\n\nfunction bumpMonth(p: WallParts): void {\n p.mo += 1;\n if (p.mo > 12) {\n p.mo = 1;\n p.y += 1;\n }\n p.d = 1;\n p.h = 0;\n p.mi = 0;\n p.s = 0;\n}\n\nfunction bumpDay(p: WallParts): void {\n p.d += 1;\n p.h = 0;\n p.mi = 0;\n p.s = 0;\n}\n\nfunction sorted(set: Set<number>): number[] {\n return [...set].sort((a, b) => a - b);\n}\n\n/** Smallest array element ≥ `v` (array is sorted ascending), or null. */\nfunction firstAtLeast(arr: number[], v: number): number | null {\n for (const x of arr) if (x >= v) return x;\n return null;\n}\n\nfunction daysInMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month, 0)).getUTCDate();\n}\n\nfunction weekdayOf(year: number, month: number, day: number): number {\n return new Date(Date.UTC(year, month - 1, day)).getUTCDay();\n}\n\n// ─── Timezone conversion (Intl-based, zero-dependency) ───────────────────────\n\nconst FORMATTER_CACHE = new Map<string, Intl.DateTimeFormat>();\n\nfunction formatterFor(timeZone: string): Intl.DateTimeFormat {\n let fmt = FORMATTER_CACHE.get(timeZone);\n if (!fmt) {\n fmt = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n FORMATTER_CACHE.set(timeZone, fmt);\n }\n return fmt;\n}\n\n/** The wall-clock calendar fields a clock in `timeZone` shows at the given epoch. */\nfunction getZonedParts(epochMs: number, timeZone: string): WallParts {\n const parts = formatterFor(timeZone).formatToParts(new Date(epochMs));\n const m: Record<string, string> = {};\n for (const part of parts) if (part.type !== \"literal\") m[part.type] = part.value;\n let h = Number(m[\"hour\"]);\n if (h === 24) h = 0; // some runtimes render midnight as \"24\" under hour12:false\n return { y: Number(m[\"year\"]), mo: Number(m[\"month\"]), d: Number(m[\"day\"]), h, mi: Number(m[\"minute\"]), s: Number(m[\"second\"]) };\n}\n\n/** Offset (ms) the zone is ahead of UTC at the given instant. */\nfunction offsetAt(epochMs: number, timeZone: string): number {\n const p = getZonedParts(epochMs, timeZone);\n const asNaive = Date.UTC(p.y, p.mo - 1, p.d, p.h, p.mi, p.s);\n return asNaive - epochMs;\n}\n\n/** Convert wall-clock fields in `timeZone` to an absolute epoch, correcting for the zone's offset. */\nfunction zonedWallToEpoch(p: WallParts, timeZone: string): number {\n const asUTC = Date.UTC(p.y, p.mo - 1, p.d, p.h, p.mi, p.s);\n const o1 = offsetAt(asUTC, timeZone);\n let epoch = asUTC - o1;\n const o2 = offsetAt(epoch, timeZone);\n if (o2 !== o1) epoch = asUTC - o2;\n return epoch;\n}\n\n// ─── Preview & upcoming-window planning ──────────────────────────────────────\n\nexport interface PreviewOptions {\n /** Start the preview after this instant. Defaults to now. */\n from?: Date | number;\n /** IANA timezone. Defaults to the runtime's local zone. */\n timeZone?: string;\n /** How many fire times to return (default 5, capped at 100). */\n count?: number;\n}\n\n/** The next N times an expression fires — the engine of `cronvello preview`. */\nexport function previewSchedule(expr: string, opts: PreviewOptions = {}): Date[] {\n const parsed = parseCron(expr);\n const timeZone = opts.timeZone ?? localTimeZone();\n const count = Math.min(Math.max(Math.trunc(opts.count ?? 5), 1), 100);\n const out: Date[] = [];\n let from = opts.from === undefined ? Date.now() : typeof opts.from === \"number\" ? opts.from : opts.from.getTime();\n for (let i = 0; i < count; i++) {\n const next = nextOccurrence(parsed, { from, timeZone });\n if (!next) break;\n out.push(next);\n from = next.getTime();\n }\n return out;\n}\n\nexport interface UpcomingJob {\n key: string;\n schedule: string;\n timeZone: string;\n}\n\nexport interface UpcomingFire {\n key: string;\n time: Date;\n schedule: string;\n timeZone: string;\n}\n\nexport interface UpcomingOptions {\n /** Window start (defaults to now). */\n from?: Date | number;\n /** Window length in ms (defaults to 1 hour). */\n withinMs?: number;\n /** Cap per job so a per-second schedule can't flood the plan (default 50). */\n maxPerJob?: number;\n}\n\n/**\n * Every fire across a set of jobs within the next window, merged and sorted by time — what powers\n * `cronvello dev --dry-run`. Jobs whose schedule can't be parsed are skipped (a dev concern surfaced\n * elsewhere); `@reboot` jobs are skipped because they have no scheduled time.\n */\nexport function upcomingFires(jobs: UpcomingJob[], opts: UpcomingOptions = {}): UpcomingFire[] {\n const from = opts.from === undefined ? Date.now() : typeof opts.from === \"number\" ? opts.from : opts.from.getTime();\n const withinMs = opts.withinMs ?? 60 * 60 * 1000;\n const maxPerJob = Math.max(1, opts.maxPerJob ?? 50);\n const horizon = from + withinMs;\n\n const fires: UpcomingFire[] = [];\n for (const job of jobs) {\n let parsed: ParsedCron;\n try {\n parsed = parseCron(job.schedule);\n } catch {\n continue;\n }\n if (parsed.reboot) continue;\n let cursor = from;\n for (let i = 0; i < maxPerJob; i++) {\n const next = nextOccurrence(parsed, { from: cursor, timeZone: job.timeZone });\n if (!next || next.getTime() > horizon) break;\n fires.push({ key: job.key, time: next, schedule: job.schedule, timeZone: job.timeZone });\n cursor = next.getTime();\n }\n }\n fires.sort((a, b) => a.time.getTime() - b.time.getTime());\n return fires;\n}\n\n/** The runtime's local IANA zone, falling back to UTC if it can't be resolved. */\nexport function localTimeZone(): string {\n try {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\";\n } catch {\n return \"UTC\";\n }\n}\n","/**\n * The **local engine** — Cronvello running entirely on your machine, with no account, no cloud, and\n * no network. It is the piece that turns `@cronvello/sdk` from a thin client into a real cron tool:\n * give it your jobs and it computes each one's next fire time, runs the handler when it's due, and\n * enforces the production policies (overlap protection, per-run timeout, retry with backoff) locally\n * — exactly the guarantees the cloud gives you, on your laptop.\n *\n * Everything is driven through an injectable {@link EngineClock}, so the whole scheduler is\n * deterministic under test (a virtual clock can fast-forward days in microseconds) and uses the real\n * `setTimeout`/`Date.now` in production. The engine never touches the network.\n */\n\nimport { nextOccurrence } from \"../internal/cron-schedule.js\";\n\n/** The outcome of a single execution (which may have spanned several attempts). */\nexport type RunStatus = \"success\" | \"error\" | \"timed_out\" | \"skipped\";\n\n/** One job the engine should schedule. Derived from a `defineCronvello` registry, but standalone. */\nexport interface EngineJob {\n /** Stable registry key. */\n key: string;\n /** Cron expression (5- or 6-field, macros). `@reboot` fires once when the engine starts. */\n schedule: string;\n /** IANA timezone the schedule is read in. */\n timeZone: string;\n /** Abort a run that exceeds this many ms (the handler's `ctx.signal` aborts). 0/undefined = no limit. */\n timeoutMs?: number;\n /** Retries after the first failed attempt (default 0). */\n maxRetries?: number;\n /** Allow a fire while a previous run of the same job is still in flight (default false). */\n allowConcurrentRuns?: boolean;\n /** Optional human description (shown in the dev table). */\n description?: string;\n}\n\n/** A completed execution recorded in the in-memory history ring buffer. */\nexport interface RunRecord {\n key: string;\n source: \"local\";\n /** Epoch ms when the execution began. */\n startedAt: number;\n /** Epoch ms when it settled. */\n finishedAt: number;\n durationMs: number;\n status: RunStatus;\n /** How many attempts were made (1 + retries that ran). */\n attempts: number;\n /** Error message for a failed/timed-out run. */\n error?: string;\n /** The handler's return value for a successful run. */\n result?: unknown;\n}\n\n/** Lifecycle events the engine emits — the CLI renders them as a live feed. */\nexport type EngineEvent =\n | { type: \"engine-start\"; jobs: number; at: number }\n | { type: \"engine-stop\"; at: number }\n | { type: \"scheduled\"; key: string; at: number }\n | { type: \"fire\"; key: string; attempt: number; at: number }\n | { type: \"success\"; key: string; durationMs: number; attempts: number; result: unknown; at: number }\n | { type: \"error\"; key: string; durationMs: number; attempt: number; willRetry: boolean; error: string; at: number }\n | { type: \"timeout\"; key: string; durationMs: number; attempt: number; willRetry: boolean; at: number }\n | { type: \"retry\"; key: string; attempt: number; delayMs: number; at: number }\n | { type: \"skipped\"; key: string; reason: \"overlap\"; at: number };\n\n/** A snapshot of one job's scheduling state, for the dev table. */\nexport interface JobSnapshot {\n key: string;\n schedule: string;\n timeZone: string;\n description?: string;\n /** Next fire time, or null for `@reboot` / unschedulable jobs. */\n nextFire: Date | null;\n /** True while a run of this job is in flight. */\n running: boolean;\n}\n\n/**\n * The timer/clock seam. Production wires this to the global `setTimeout`/`Date.now`; tests inject a\n * virtual clock so scheduling is fully deterministic.\n */\nexport interface EngineClock {\n now(): number;\n setTimeout(fn: () => void, ms: number): unknown;\n clearTimeout(handle: unknown): void;\n}\n\n/** Runs a job's handler in-process (with lifecycle hooks). `signal` aborts on timeout. */\nexport type EngineRunner = (key: string, signal: AbortSignal) => Promise<unknown>;\n\nexport interface LocalEngineOptions {\n /** Timer source. Defaults to the real `setTimeout`/`Date.now`. */\n clock?: EngineClock;\n /** Receives every lifecycle event (for live rendering / metrics). */\n onEvent?: (event: EngineEvent) => void;\n /** Cap on the in-memory run history (default 100). Oldest records drop first. */\n historyLimit?: number;\n /** Backoff before retry attempt N (1-based: N=1 is the delay before the 2nd attempt). */\n backoff?: (attempt: number) => number;\n /** Install SIGINT/SIGTERM handlers that stop the engine cleanly (default false). */\n installSignalHandlers?: boolean;\n}\n\nconst DEFAULT_HISTORY_LIMIT = 100;\n/** Node's `setTimeout` overflows past ~24.8 days; clamp long waits and re-evaluate on wake. */\nconst MAX_TIMER_MS = 2 ** 31 - 1;\n\n/** Default retry backoff: 0.5s, 1s, 2s, 4s … capped at 30s. Deterministic (no jitter). */\nfunction defaultBackoff(attempt: number): number {\n return Math.min(30_000, 500 * 2 ** (attempt - 1));\n}\n\nconst realClock: EngineClock = {\n now: () => Date.now(),\n setTimeout: (fn, ms) => setTimeout(fn, ms),\n clearTimeout: (handle) => clearTimeout(handle as ReturnType<typeof setTimeout>),\n};\n\n/** A timeout that crossed its budget — distinguished from a handler error so we can label the run. */\nclass RunTimeoutError extends Error {\n constructor(key: string, ms: number) {\n super(`job '${key}' timed out after ${ms}ms`);\n this.name = \"RunTimeoutError\";\n }\n}\n\ninterface JobState {\n job: EngineJob;\n nextFire: number | null;\n timer: unknown;\n running: boolean;\n isReboot: boolean;\n}\n\n/**\n * Construct a local engine. Call {@link LocalEngine.start} to begin the loop and\n * {@link LocalEngine.stop} for a clean shutdown.\n */\nexport function createLocalEngine(jobs: EngineJob[], runner: EngineRunner, options: LocalEngineOptions = {}): LocalEngine {\n return new LocalEngine(jobs, runner, options);\n}\n\nexport class LocalEngine {\n private readonly clock: EngineClock;\n /** Every event listener. The constructor's `onEvent` is registered as one of them. */\n private readonly listeners = new Set<(event: EngineEvent) => void>();\n /** Run after the engine has drained, e.g. to close a dashboard server. */\n private readonly closeHooks: Array<() => void | Promise<void>> = [];\n private readonly historyLimit: number;\n private readonly backoff: (attempt: number) => number;\n private readonly runner: EngineRunner;\n private readonly states: JobState[];\n private readonly history: RunRecord[] = [];\n private readonly inFlight = new Set<Promise<unknown>>();\n private started = false;\n private stopped = false;\n private signalCleanup: (() => void) | null = null;\n\n constructor(jobs: EngineJob[], runner: EngineRunner, options: LocalEngineOptions = {}) {\n this.clock = options.clock ?? realClock;\n if (options.onEvent) this.listeners.add(options.onEvent);\n this.historyLimit = Math.max(1, options.historyLimit ?? DEFAULT_HISTORY_LIMIT);\n this.backoff = options.backoff ?? defaultBackoff;\n this.runner = runner;\n this.states = jobs.map((job) => ({\n job,\n nextFire: null,\n timer: null,\n running: false,\n isReboot: job.schedule.trim().toLowerCase() === \"@reboot\",\n }));\n\n if (options.installSignalHandlers) this.installSignalHandlers();\n }\n\n /**\n * Subscribe to every lifecycle event (in addition to the constructor's `onEvent`). Returns an\n * unsubscribe function. Used by the local dashboard to fan events out to many SSE clients without\n * disturbing the scheduler. A listener that throws is isolated — it can't break the loop.\n */\n subscribe(listener: (event: EngineEvent) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Register a hook to run once, after {@link stop} has drained in-flight runs — e.g. to close a\n * dashboard server so `engine.stop()` tears everything down together. Hooks are awaited.\n */\n onStop(hook: () => void | Promise<void>): this {\n this.closeHooks.push(hook);\n return this;\n }\n\n /** Deliver an event to every listener, isolating each so one bad listener can't stall the loop. */\n private emit(event: EngineEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch {\n // A listener (e.g. a dead SSE connection) must never break scheduling.\n }\n }\n }\n\n /** Begin scheduling. Idempotent — a second call is a no-op. */\n start(): this {\n if (this.started) return this;\n this.started = true;\n this.stopped = false;\n this.emit({ type: \"engine-start\", jobs: this.states.length, at: this.clock.now() });\n\n for (const state of this.states) {\n if (state.isReboot) {\n // `@reboot` runs once at startup and is never rescheduled.\n this.launch(state);\n } else {\n this.scheduleNext(state);\n }\n }\n return this;\n }\n\n /**\n * Stop scheduling and wait for in-flight runs to settle. After this resolves no further handlers\n * will start. Safe to call from a signal handler.\n */\n async stop(): Promise<void> {\n if (this.stopped) {\n await Promise.allSettled([...this.inFlight]);\n return;\n }\n this.stopped = true;\n for (const state of this.states) {\n if (state.timer !== null) {\n this.clock.clearTimeout(state.timer);\n state.timer = null;\n }\n }\n this.signalCleanup?.();\n this.signalCleanup = null;\n await Promise.allSettled([...this.inFlight]);\n // Tell subscribers we're done before tearing down anything they depend on (e.g. SSE clients\n // see `engine-stop`, then the dashboard server's close hook ends their connections).\n this.emit({ type: \"engine-stop\", at: this.clock.now() });\n for (const hook of this.closeHooks.splice(0)) {\n try {\n await hook();\n } catch {\n // A failing shutdown hook must not prevent the engine from stopping.\n }\n }\n }\n\n /** The run history, newest first (a copy — safe to keep). */\n runs(): RunRecord[] {\n return [...this.history].reverse();\n }\n\n /** History entries for one job, newest first. */\n runsFor(key: string): RunRecord[] {\n return this.runs().filter((r) => r.key === key);\n }\n\n /** Current scheduling state of every job, for the dev table. */\n snapshot(): JobSnapshot[] {\n return this.states.map((s) => ({\n key: s.job.key,\n schedule: s.job.schedule,\n timeZone: s.job.timeZone,\n ...(s.job.description !== undefined ? { description: s.job.description } : {}),\n nextFire: s.nextFire !== null ? new Date(s.nextFire) : null,\n running: s.running,\n }));\n }\n\n /** The jobs this engine manages (read-only view). */\n jobs(): readonly EngineJob[] {\n return this.states.map((s) => s.job);\n }\n\n /** Number of runs currently in flight. */\n get activeRuns(): number {\n return this.inFlight.size;\n }\n\n // ── Scheduling ─────────────────────────────────────────────────────────────\n\n private scheduleNext(state: JobState): void {\n if (this.stopped) return;\n const now = this.clock.now();\n let next: Date | null;\n try {\n next = nextOccurrence(state.job.schedule, { from: now, timeZone: state.job.timeZone });\n } catch {\n // An unschedulable expression (e.g. a typo that slipped past define-time validation) simply\n // never fires locally; leave nextFire null so it shows as \"—\" in the table.\n state.nextFire = null;\n return;\n }\n if (!next) {\n state.nextFire = null;\n return;\n }\n state.nextFire = next.getTime();\n const delay = Math.max(0, Math.min(state.nextFire - now, MAX_TIMER_MS));\n state.timer = this.clock.setTimeout(() => this.onDue(state), delay);\n this.emit({ type: \"scheduled\", key: state.job.key, at: state.nextFire });\n }\n\n private onDue(state: JobState): void {\n state.timer = null;\n if (this.stopped) return;\n const now = this.clock.now();\n\n // Woke early because the wait was clamped (very distant fire) — just re-arm the timer.\n if (state.nextFire !== null && now < state.nextFire) {\n const delay = Math.max(0, Math.min(state.nextFire - now, MAX_TIMER_MS));\n state.timer = this.clock.setTimeout(() => this.onDue(state), delay);\n return;\n }\n\n if (state.running && !state.job.allowConcurrentRuns) {\n this.emit({ type: \"skipped\", key: state.job.key, reason: \"overlap\", at: now });\n this.record({\n key: state.job.key,\n source: \"local\",\n startedAt: now,\n finishedAt: now,\n durationMs: 0,\n status: \"skipped\",\n attempts: 0,\n });\n } else {\n this.launch(state);\n }\n // Keep the schedule ticking regardless of whether this fire ran or was skipped.\n this.scheduleNext(state);\n }\n\n /**\n * Run a job once, right now, by key — the local equivalent of \"run now\" in the cloud. Goes through\n * the exact same execution path as a scheduled fire (overlap protection, timeout, retry/backoff,\n * history + events), so a manual run shows up in the feed just like any other. Resolves with the\n * resulting {@link RunRecord}. Throws for an unknown key or after the engine has stopped.\n */\n async trigger(key: string): Promise<RunRecord> {\n if (this.stopped) throw new Error(\"cannot trigger a job on a stopped engine\");\n const state = this.states.find((s) => s.job.key === key);\n if (!state) throw new Error(`unknown job '${key}'`);\n\n if (state.running && !state.job.allowConcurrentRuns) {\n const now = this.clock.now();\n const skipped: RunRecord = { key, source: \"local\", startedAt: now, finishedAt: now, durationMs: 0, status: \"skipped\", attempts: 0 };\n this.emit({ type: \"skipped\", key, reason: \"overlap\", at: now });\n this.record(skipped);\n return skipped;\n }\n return this.launch(state);\n }\n\n /**\n * The run history as newline-delimited JSON (NDJSON), oldest run first — one record per line, the\n * natural shape for piping to a file or another tool. No trailing newline.\n */\n toNdjson(): string {\n return this.history.map((r) => JSON.stringify(r)).join(\"\\n\");\n }\n\n /** Start an execution and track it so {@link stop} can await it. Resolves with the run's record. */\n private launch(state: JobState): Promise<RunRecord> {\n const promise = this.execute(state);\n const tracked = promise.finally(() => {\n this.inFlight.delete(tracked);\n });\n this.inFlight.add(tracked);\n return tracked;\n }\n\n // ── Execution with timeout + retry/backoff ──────────────────────────────────\n\n private async execute(state: JobState): Promise<RunRecord> {\n const job = state.job;\n state.running = true;\n const startedAt = this.clock.now();\n const maxRetries = Math.max(0, job.maxRetries ?? 0);\n\n let attempt = 0;\n let status: RunStatus = \"error\";\n let error: string | undefined;\n let result: unknown;\n\n while (!this.stopped) {\n attempt++;\n this.emit({ type: \"fire\", key: job.key, attempt, at: this.clock.now() });\n try {\n result = await this.runOnce(job);\n status = \"success\";\n this.emit({ type: \"success\", key: job.key, durationMs: this.clock.now() - startedAt, attempts: attempt, result, at: this.clock.now() });\n error = undefined;\n break;\n } catch (err) {\n const timedOut = err instanceof RunTimeoutError;\n status = timedOut ? \"timed_out\" : \"error\";\n error = err instanceof Error ? err.message : String(err);\n const willRetry = attempt <= maxRetries && !this.stopped;\n const at = this.clock.now();\n if (timedOut) {\n this.emit({ type: \"timeout\", key: job.key, durationMs: at - startedAt, attempt, willRetry, at });\n } else {\n this.emit({ type: \"error\", key: job.key, durationMs: at - startedAt, attempt, willRetry, error, at });\n }\n if (!willRetry) break;\n const delayMs = this.backoff(attempt);\n this.emit({ type: \"retry\", key: job.key, attempt: attempt + 1, delayMs, at });\n await this.sleep(delayMs);\n }\n }\n\n const finishedAt = this.clock.now();\n const record: RunRecord = {\n key: job.key,\n source: \"local\",\n startedAt,\n finishedAt,\n durationMs: finishedAt - startedAt,\n status,\n attempts: attempt,\n ...(error !== undefined ? { error } : {}),\n ...(status === \"success\" ? { result } : {}),\n };\n this.record(record);\n state.running = false;\n return record;\n }\n\n /** A single attempt: run the handler, racing it against the per-job timeout. */\n private runOnce(job: EngineJob): Promise<unknown> {\n const controller = new AbortController();\n const handlerPromise = this.runner(job.key, controller.signal);\n const timeoutMs = job.timeoutMs;\n if (!timeoutMs || timeoutMs <= 0) return handlerPromise;\n\n return new Promise<unknown>((resolve, reject) => {\n let settled = false;\n const timer = this.clock.setTimeout(() => {\n if (settled) return;\n settled = true;\n controller.abort();\n reject(new RunTimeoutError(job.key, timeoutMs));\n }, timeoutMs);\n handlerPromise.then(\n (value) => {\n if (settled) return;\n settled = true;\n this.clock.clearTimeout(timer);\n resolve(value);\n },\n (err) => {\n if (settled) return;\n settled = true;\n this.clock.clearTimeout(timer);\n reject(err);\n },\n );\n });\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => this.clock.setTimeout(resolve, ms));\n }\n\n private record(record: RunRecord): void {\n this.history.push(record);\n if (this.history.length > this.historyLimit) this.history.shift();\n }\n\n private installSignalHandlers(): void {\n const handler = (): void => {\n void this.stop().then(() => process.exit(0));\n };\n process.once(\"SIGINT\", handler);\n process.once(\"SIGTERM\", handler);\n this.signalCleanup = () => {\n process.removeListener(\"SIGINT\", handler);\n process.removeListener(\"SIGTERM\", handler);\n };\n }\n}\n","/**\n * `defineCronvello` — the high-level, code-first entry point.\n *\n * export const cronvello = defineCronvello({\n * appName: \"my-app\",\n * appUrl: process.env.APP_URL!,\n * apiKey: process.env.CRONVELLO_API_KEY!,\n * dispatchSecret: process.env.CRONVELLO_DISPATCH_SECRET!,\n * jobs: {\n * \"send-daily-digest\": { schedule: \"0 8 * * *\", handler: async () => { … } },\n * \"cleanup-temp\": { schedule: \"*\\/15 * * * *\", handler: async () => { … } },\n * },\n * });\n *\n * await cronvello.sync(); // reconcile the registry to Cronvello (idempotent)\n * app.post(cronvello.dispatchPath, express.json(), cronvello.expressHandler());\n */\n\nimport { CronvelloClient, CRONVELLO_DEFAULT_BASE_URL } from \"../client/client.js\";\nimport { CronvelloApiError, CronvelloConfigError } from \"../internal/errors.js\";\nimport { validateCron, isValidTimeZone } from \"../internal/cron.js\";\nimport type { RegistryReconcileRequest, RegistryTaskInput, RunNowResult } from \"../internal/wire.js\";\nimport { createDispatcher, type DispatchRequest, type DispatchResponse, type ResolvedJob } from \"./dispatch.js\";\nimport { reconcile } from \"./reconcile.js\";\nimport { expressHandler, type ExpressDispatchHandler } from \"../adapters/express.js\";\nimport { nextHandler, type NextRouteHandler } from \"../adapters/next.js\";\nimport { createLocalEngine, type EngineJob, type LocalEngine, type LocalEngineOptions } from \"../dev/engine.js\";\nimport type { DashboardOptions } from \"../dev/dashboard.js\";\nimport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobsInput,\n ReconcileResult,\n SyncOptions,\n} from \"./types.js\";\n\nconst DEFAULT_DISPATCH_PATH = \"/cronvello/dispatch\";\nconst DEFAULT_TIME_ZONE = \"Europe/Berlin\";\n\nexport interface CronvelloApp {\n /** The underlying low-level client for ad-hoc `/v1` calls. */\n readonly client: CronvelloClient;\n /** Resolved jobs, keyed by their stable registry key. */\n readonly jobs: ReadonlyMap<string, ResolvedJob>;\n /** The app identity / Job-container name. */\n readonly appName: string;\n /** Path the dispatch handler should be mounted at (e.g. \"/cronvello/dispatch\"). */\n readonly dispatchPath: string;\n /** Absolute URL Cronvello calls back (appUrl + dispatchPath). */\n readonly dispatchUrl: string;\n\n /** Reconcile the registry into Cronvello. Idempotent — safe to call on every boot/deploy. */\n sync(options?: SyncOptions): Promise<ReconcileResult>;\n /** Trigger one job immediately via Cronvello (manual run). Requires a prior `sync()`. */\n run(key: string): Promise<RunNowResult>;\n /**\n * Run a job's handler locally, in-process — no HTTP round-trip, no Cronvello, no deploy.\n * Perfect for unit tests and `npx cronvello dev`. Lifecycle hooks fire (`source: \"local\"`).\n */\n trigger(key: string, payload?: Record<string, unknown>): Promise<unknown>;\n /** Framework-neutral dispatch entry — used by the adapters. */\n handle(req: DispatchRequest): Promise<DispatchResponse>;\n /** Express/Connect request handler for the dispatch endpoint. */\n expressHandler(): ExpressDispatchHandler;\n /** Next.js App Router (Route Handler) for the dispatch endpoint. */\n nextHandler(): NextRouteHandler;\n /**\n * Start the **local engine** — run your jobs on this machine with no account, no cloud, no\n * network. Each job's next fire time is computed from its schedule (timezone/DST-aware) and its\n * handler runs locally, with overlap protection, per-run timeout, and retry/backoff enforced just\n * like the cloud. Returns the engine handle (history, snapshot, `stop()`); powers `cronvello dev`.\n *\n * Pass `autoStart: false` to construct the engine without starting it (the CLI does this to render\n * the job table first). Existing `sync()` / dispatch paths are untouched.\n */\n dev(options?: DevOptions): LocalEngine;\n /** The registry keys, for diagnostics. */\n keys(): string[];\n}\n\n/** Options for {@link CronvelloApp.dev}. */\nexport interface DevOptions extends LocalEngineOptions {\n /** Start the scheduler immediately (default true). Set false to start it yourself later. */\n autoStart?: boolean;\n /**\n * Also start the local web dashboard alongside the engine. `true` uses the defaults\n * (`http://127.0.0.1:4747`); pass an object to set `port`/`host`. `engine.stop()` closes it too.\n * The dashboard module is loaded lazily, so it never weighs down the main bundle.\n */\n dashboard?: boolean | DashboardOptions;\n}\n\nexport function defineCronvello(config: CronvelloAppConfig): CronvelloApp {\n validateConfig(config);\n\n const validate = config.validateSchedules ?? true;\n const defaultTimeZone = config.timeZone ?? DEFAULT_TIME_ZONE;\n if (validate && !isValidTimeZone(defaultTimeZone)) {\n throw new CronvelloConfigError(`Invalid \\`timeZone\\` \"${defaultTimeZone}\" — expected an IANA name like \"Europe/Berlin\" or \"UTC\".`);\n }\n\n const jobs = normalizeJobs(config.jobs, validate);\n const dispatchPath = normalizePath(config.dispatchPath ?? DEFAULT_DISPATCH_PATH);\n const dispatchUrl = joinUrl(config.appUrl, dispatchPath);\n\n const client = new CronvelloClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? CRONVELLO_DEFAULT_BASE_URL,\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n ...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),\n ...(config.fetch ? { fetch: config.fetch } : {}),\n });\n\n const dispatcher = createDispatcher({\n jobs,\n dispatchSecret: config.dispatchSecret,\n logger: config.logger,\n ...(config.hooks ? { hooks: config.hooks } : {}),\n ...(config.maxBodyBytes !== undefined ? { maxBodyBytes: config.maxBodyBytes } : {}),\n });\n\n const app: CronvelloApp = {\n client,\n jobs,\n appName: config.appName,\n dispatchPath,\n dispatchUrl,\n\n async sync(options?: SyncOptions): Promise<ReconcileResult> {\n const opts = options ?? {};\n // Prefer the atomic server-side reconcile (one round-trip). dryRun is only supported by\n // the local differ, so it always takes the client-side path.\n if (!opts.dryRun) {\n try {\n const res = await client.reconcileRegistry(\n buildRegistryRequest(config, dispatchUrl, defaultTimeZone, [...jobs.values()], opts),\n );\n return {\n jobId: res.job.id,\n jobName: res.job.name,\n jobCreated: res.jobCreated,\n created: res.created,\n updated: res.updated,\n unchanged: res.unchanged,\n deleted: res.deleted,\n skipped: res.skipped,\n changes: res.changes.map((c) => ({\n key: c.key,\n action: c.action,\n taskId: c.taskId,\n ...(c.changedFields ? { changedFields: c.changedFields } : {}),\n })),\n tasks: res.tasks,\n };\n } catch (e) {\n // Older server without /v1/registry → fall back to the client-side differ.\n if (!(e instanceof CronvelloApiError) || (e.status !== 404 && e.status !== 405)) throw e;\n }\n }\n return reconcile(\n {\n client,\n appName: config.appName,\n dispatchUrl,\n dispatchSecret: config.dispatchSecret,\n defaultTimeZone,\n jobs: [...jobs.values()],\n },\n opts,\n );\n },\n\n async run(key: string): Promise<RunNowResult> {\n if (!jobs.has(key)) {\n throw new CronvelloConfigError(`Unknown job '${key}'. Known: ${[...jobs.keys()].join(\", \") || \"(none)\"}`);\n }\n const containers = await client.jobs.list();\n const container = containers.find((j) => j.name === config.appName);\n if (!container) {\n throw new CronvelloConfigError(`App '${config.appName}' is not synced yet — call sync() first.`);\n }\n const tasks = await client.jobs.listTasks(container.id);\n const task = tasks.find((t) => t.name === key);\n if (!task) {\n throw new CronvelloConfigError(`Job '${key}' has no task yet — call sync() first.`);\n }\n return client.tasks.runNow(task.id);\n },\n\n trigger: (key: string, payload?: Record<string, unknown>) => dispatcher.runLocal(key, payload),\n handle: dispatcher.handle,\n expressHandler: () => expressHandler(app),\n nextHandler: () => nextHandler(app),\n\n dev(options?: DevOptions): LocalEngine {\n const { autoStart = true, dashboard, ...engineOptions } = options ?? {};\n const engineJobs = buildEngineJobs([...jobs.values()], defaultTimeZone);\n const runner = (key: string, signal: AbortSignal) => dispatcher.runLocal(key, undefined, { signal });\n const engine = createLocalEngine(engineJobs, runner, engineOptions);\n if (autoStart) engine.start();\n if (dashboard) {\n const dashboardOptions = dashboard === true ? {} : dashboard;\n // Load lazily via the package's own `/dev` subpath. The non-literal specifier keeps the\n // bundler from inlining the dashboard (and its HTML) into the main `.` entry, so the cloud\n // client stays small; Node self-resolves it at runtime only when a dashboard is requested.\n const devSubpath = \"@cronvello/sdk/dev\";\n void (import(devSubpath) as Promise<typeof import(\"../dev/dashboard.js\")>)\n .then(({ startDashboard }) => startDashboard(engine, dashboardOptions))\n .then((handle) => {\n engine.onStop(() => handle.close());\n console.log(`Cronvello dashboard → ${handle.url}`);\n })\n .catch((err: Error) => console.error(`Cronvello dashboard failed to start: ${err.message}`));\n }\n return engine;\n },\n\n keys: () => [...jobs.keys()],\n };\n\n return app;\n}\n\n/** Map resolved registry jobs to the local engine's job shape (skipping disabled jobs). */\nfunction buildEngineJobs(jobs: ResolvedJob[], defaultTimeZone: string): EngineJob[] {\n const engineJobs: EngineJob[] = [];\n for (const { key, config } of jobs) {\n if (config.enabled === false) continue;\n const job: EngineJob = {\n key,\n schedule: config.schedule,\n timeZone: config.timeZone ?? defaultTimeZone,\n allowConcurrentRuns: config.allowConcurrentRuns ?? false,\n maxRetries: config.maxRetries ?? 0,\n };\n // `callbackTimeoutMs` is the cloud's per-run budget; reuse it as the local execution timeout.\n if (config.callbackTimeoutMs !== undefined) job.timeoutMs = config.callbackTimeoutMs;\n if (config.description !== undefined) job.description = config.description;\n engineJobs.push(job);\n }\n return engineJobs;\n}\n\n/** Config for `defineCronvello.fromEnv` — the three secret fields become optional (read from env). */\nexport type CronvelloEnvConfig = Omit<CronvelloAppConfig, \"apiKey\" | \"dispatchSecret\" | \"appUrl\"> &\n Partial<Pick<CronvelloAppConfig, \"apiKey\" | \"dispatchSecret\" | \"appUrl\">>;\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace defineCronvello {\n /**\n * Build an app from environment variables, so you don't repeat the same reads in every service.\n * Reads `CRONVELLO_API_KEY`, `CRONVELLO_DISPATCH_SECRET`, `CRONVELLO_APP_URL` (or `PUBLIC_URL`),\n * and optionally `CRONVELLO_API_URL` (base URL). Anything passed explicitly overrides the env.\n *\n * export const cronvello = defineCronvello.fromEnv({ appName: \"my-app\", jobs: { … } });\n */\n export function fromEnv(\n config: CronvelloEnvConfig,\n env: Record<string, string | undefined> = typeof process !== \"undefined\" ? process.env : {},\n ): CronvelloApp {\n const apiKey = config.apiKey ?? env[\"CRONVELLO_API_KEY\"];\n const dispatchSecret = config.dispatchSecret ?? env[\"CRONVELLO_DISPATCH_SECRET\"];\n const appUrl = config.appUrl ?? env[\"CRONVELLO_APP_URL\"] ?? env[\"PUBLIC_URL\"];\n const baseUrl = config.baseUrl ?? env[\"CRONVELLO_API_URL\"];\n\n const missing = [\n !apiKey && \"CRONVELLO_API_KEY\",\n !dispatchSecret && \"CRONVELLO_DISPATCH_SECRET\",\n !appUrl && \"CRONVELLO_APP_URL (or PUBLIC_URL)\",\n ].filter(Boolean);\n if (missing.length) {\n throw new CronvelloConfigError(`defineCronvello.fromEnv() is missing required env: ${missing.join(\", \")}.`);\n }\n\n return defineCronvello({\n ...config,\n apiKey: apiKey!,\n dispatchSecret: dispatchSecret!,\n appUrl: appUrl!,\n ...(baseUrl ? { baseUrl } : {}),\n });\n }\n}\n\nfunction validateConfig(config: CronvelloAppConfig): void {\n if (!config) throw new CronvelloConfigError(\"defineCronvello requires a config object.\");\n if (!config.appName || !config.appName.trim()) throw new CronvelloConfigError(\"`appName` is required.\");\n if (!config.appUrl || !/^https?:\\/\\//i.test(config.appUrl)) {\n throw new CronvelloConfigError(\"`appUrl` must be an absolute http(s) URL (the public URL of THIS app).\");\n }\n if (!config.apiKey) throw new CronvelloConfigError(\"`apiKey` (crn_live_…) is required.\");\n if (!config.dispatchSecret || config.dispatchSecret.length < 16) {\n throw new CronvelloConfigError(\"`dispatchSecret` is required and must be at least 16 chars (use a random 32-byte value).\");\n }\n if (!config.jobs) throw new CronvelloConfigError(\"`jobs` is required.\");\n}\n\nfunction normalizeJobs(input: CronvelloJobsInput, validate: boolean): Map<string, ResolvedJob> {\n const map = new Map<string, ResolvedJob>();\n const entries: Array<{ key: string; config: CronvelloJobConfig }> = Array.isArray(input)\n ? input.map(({ key, ...rest }) => ({ key, config: rest }))\n : Object.entries(input).map(([key, config]) => ({ key, config }));\n\n for (const { key, config } of entries) {\n const trimmed = (key ?? \"\").trim();\n if (!trimmed) throw new CronvelloConfigError(\"Every job needs a non-empty key.\");\n if (trimmed.length > 255) throw new CronvelloConfigError(`Job key '${trimmed}' exceeds 255 characters.`);\n if (map.has(trimmed)) throw new CronvelloConfigError(`Duplicate job key '${trimmed}'.`);\n if (!config || typeof config.handler !== \"function\") {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a handler function.`);\n }\n if (!config.schedule || !config.schedule.trim()) {\n throw new CronvelloConfigError(`Job '${trimmed}' is missing a schedule.`);\n }\n if (validate) {\n const cronCheck = validateCron(config.schedule);\n if (!cronCheck.valid) {\n throw new CronvelloConfigError(`Job '${trimmed}' has an invalid schedule \"${config.schedule}\" — ${cronCheck.error}.`);\n }\n if (config.timeZone !== undefined && !isValidTimeZone(config.timeZone)) {\n throw new CronvelloConfigError(`Job '${trimmed}' has an invalid timeZone \"${config.timeZone}\" — expected an IANA name.`);\n }\n }\n map.set(trimmed, { key: trimmed, config });\n }\n if (map.size === 0) throw new CronvelloConfigError(\"At least one job is required.\");\n return map;\n}\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n return trimmed.startsWith(\"/\") ? trimmed.replace(/\\/+$/, \"\") || \"/\" : `/${trimmed.replace(/\\/+$/, \"\")}`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, \"\")}${path}`;\n}\n\n/** Build the PUT /v1/registry body from the registry jobs. */\nfunction buildRegistryRequest(\n config: CronvelloAppConfig,\n dispatchUrl: string,\n defaultTimeZone: string,\n jobs: ResolvedJob[],\n opts: SyncOptions,\n): RegistryReconcileRequest {\n const tasks: RegistryTaskInput[] = jobs.map((j) => {\n const cfg = j.config;\n const task: RegistryTaskInput = {\n key: j.key,\n schedule: cfg.schedule,\n targetUrl: dispatchUrl,\n targetToken: config.dispatchSecret,\n method: \"POST\",\n timeZone: cfg.timeZone ?? defaultTimeZone,\n requestBody: JSON.stringify({ job: j.key, ...(cfg.payload ?? {}) }),\n };\n if (cfg.description !== undefined) task.description = cfg.description;\n if (cfg.urgency !== undefined) task.urgency = cfg.urgency;\n if (cfg.maxRetries !== undefined) task.maxRetries = cfg.maxRetries;\n if (cfg.executionMode !== undefined) task.executionMode = cfg.executionMode;\n if (cfg.callbackTimeoutMs !== undefined) task.callbackTimeoutMs = cfg.callbackTimeoutMs;\n if (cfg.allowConcurrentRuns !== undefined) task.allowConcurrentRuns = cfg.allowConcurrentRuns;\n if (cfg.successCriteria !== undefined) task.successCriteria = cfg.successCriteria;\n if (cfg.enabled !== undefined) task.enabled = cfg.enabled;\n return task;\n });\n return {\n appName: config.appName,\n tasks,\n prune: opts.prune ?? true,\n rotateSecret: opts.rotateSecret ?? false,\n };\n}\n","/**\n * Render a `ReconcileResult` as a clean, human-readable summary — for boot logs, CI output, and\n * `npx cronvello sync`. Zero-dependency ANSI colouring, opt-in via `color: true`.\n */\n\nimport type { ReconcileResult, ReconcileTaskChange } from \"./types.js\";\n\nexport interface FormatOptions {\n /** Emit ANSI colour codes (default false — safe for log files). */\n color?: boolean;\n /** Label the summary as a preview (\"would …\") rather than an applied change. */\n dryRun?: boolean;\n}\n\nconst ESC = String.fromCharCode(27); // ANSI escape\nconst ANSI = {\n reset: `${ESC}[0m`,\n dim: `${ESC}[2m`,\n bold: `${ESC}[1m`,\n green: `${ESC}[32m`,\n yellow: `${ESC}[33m`,\n red: `${ESC}[31m`,\n cyan: `${ESC}[36m`,\n gray: `${ESC}[90m`,\n} as const;\n\ntype Color = keyof typeof ANSI;\n\nconst GLYPH: Record<ReconcileTaskChange[\"action\"], { sign: string; color: Color }> = {\n created: { sign: \"+\", color: \"green\" },\n updated: { sign: \"~\", color: \"yellow\" },\n unchanged: { sign: \"=\", color: \"gray\" },\n deleted: { sign: \"-\", color: \"red\" },\n skipped: { sign: \"·\", color: \"cyan\" },\n};\n\n/** Build the multi-line summary string. */\nexport function formatSyncResult(result: ReconcileResult, options: FormatOptions = {}): string {\n const paint = (s: string, c: Color) => (options.color ? `${ANSI[c]}${s}${ANSI.reset}` : s);\n const verb = options.dryRun ? \"would sync\" : \"synced\";\n const lines: string[] = [];\n\n lines.push(\n `${paint(\"Cronvello\", \"cyan\")} ${verb} ${paint(`\"${result.jobName}\"`, \"bold\")} ${paint(`(${result.jobId})`, \"gray\")}`,\n );\n\n // Per-task lines, in a stable, readable order.\n const order: ReconcileTaskChange[\"action\"][] = [\"created\", \"updated\", \"deleted\", \"skipped\", \"unchanged\"];\n const sorted = [...result.changes].sort((a, b) => order.indexOf(a.action) - order.indexOf(b.action));\n for (const c of sorted) {\n const g = GLYPH[c.action];\n const detail =\n c.changedFields && c.changedFields.length\n ? paint(` (${c.changedFields.join(\", \")})`, \"gray\")\n : c.reason\n ? paint(` (${c.reason})`, \"gray\")\n : \"\";\n lines.push(` ${paint(g.sign, g.color)} ${paint(c.action.padEnd(9), g.color)} ${c.key}${detail}`);\n }\n\n const tally = [\n result.created && `${result.created} created`,\n result.updated && `${result.updated} updated`,\n result.unchanged && `${result.unchanged} unchanged`,\n result.deleted && `${result.deleted} deleted`,\n result.skipped && `${result.skipped} skipped`,\n ].filter(Boolean);\n const summary = tally.length ? tally.join(\", \") : \"no changes\";\n const containerNote = result.jobCreated ? paint(\" · container created\", \"gray\") : \"\";\n lines.push(` ${paint(summary, \"bold\")}${containerNote}`);\n\n return lines.join(\"\\n\");\n}\n","/**\n * Human-friendly schedule builders. Each returns a plain cron string (so it drops straight into a\n * job's `schedule`), validated on the way out — a bad argument throws immediately with a clear\n * message instead of silently producing a wrong schedule.\n *\n * import { every, daily, weekly, hourly, cron } from \"@cronvello/sdk\";\n *\n * jobs: {\n * \"digest\": { schedule: daily(\"08:00\"), handler },\n * \"poll\": { schedule: every(\"15m\"), handler },\n * \"report\": { schedule: weekly(\"mon\", \"09:00\"),handler },\n * \"beat\": { schedule: hourly(), handler },\n * \"custom\": { schedule: cron(\"0 0 1 * *\"), handler },\n * }\n */\n\nimport { assertValidCron } from \"../internal/cron.js\";\n\nexport type Weekday = \"sun\" | \"mon\" | \"tue\" | \"wed\" | \"thu\" | \"fri\" | \"sat\" | 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nconst DOW: Record<string, number> = { sun: 0, mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6 };\n\n/** Validate a raw cron expression and return it unchanged. The explicit escape hatch. */\nexport function cron(expression: string): string {\n assertValidCron(expression, \"cron()\");\n return expression;\n}\n\n/**\n * A recurring interval expressed as `<n><unit>` where unit is `s`, `m`, `h`, or `d`.\n * every(\"30s\") → every 30 seconds every(\"15m\") → every 15 minutes\n * every(\"2h\") → every 2 hours every(\"1d\") → daily at midnight\n * Note: sub-hour intervals that don't divide evenly (e.g. 7m) restart each hour, matching cron.\n */\nexport function every(interval: string): string {\n const m = /^(\\d+)\\s*(s|sec|secs|m|min|mins|h|hr|hrs|hour|hours|d|day|days)$/i.exec(interval.trim());\n if (!m) throw new Error(`every(): cannot parse interval \"${interval}\" — use forms like \"30s\", \"15m\", \"2h\", \"1d\"`);\n const n = Number(m[1]);\n const unit = m[2]!.toLowerCase()[0]; // s | m | h | d\n if (n < 1) throw new Error(`every(): interval must be at least 1, got ${n}`);\n\n let expr: string;\n if (unit === \"s\") {\n if (n > 59) throw new Error(`every(): seconds must be 1–59, got ${n}`);\n expr = `*/${n} * * * * *`; // 6-field (seconds)\n } else if (unit === \"m\") {\n if (n > 59) throw new Error(`every(): minutes must be 1–59 (use \"1h\" for 60), got ${n}`);\n expr = `*/${n} * * * *`;\n } else if (unit === \"h\") {\n if (n > 23) throw new Error(`every(): hours must be 1–23 (use \"1d\" for 24), got ${n}`);\n expr = `0 */${n} * * *`;\n } else {\n if (n > 31) throw new Error(`every(): days must be 1–31, got ${n}`);\n expr = n === 1 ? `0 0 * * *` : `0 0 */${n} * *`;\n }\n assertValidCron(expr, `every(\"${interval}\")`);\n return expr;\n}\n\n/** Every N minutes (1–59). */\nexport function everyMinutes(n: number): string {\n return every(`${n}m`);\n}\n\n/** Every N hours (1–23). */\nexport function everyHours(n: number): string {\n return every(`${n}h`);\n}\n\n/** Once an hour, at the given minute past (default :00). */\nexport function hourly(minute = 0): string {\n const mm = field(minute, 0, 59, \"minute\");\n return cron(`${mm} * * * *`);\n}\n\n/** Once a day at \"HH:MM\" (24h, default midnight). */\nexport function daily(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * *`);\n}\n\n/** Once a week on `day` at \"HH:MM\". */\nexport function weekly(day: Weekday, time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * ${weekday(day)}`);\n}\n\n/** Once a month on `dayOfMonth` (1–31) at \"HH:MM\". */\nexport function monthly(dayOfMonth: number, time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n const dom = field(dayOfMonth, 1, 31, \"day-of-month\");\n return cron(`${mm} ${hh} ${dom} * *`);\n}\n\n/** Monday–Friday at \"HH:MM\". */\nexport function weekdays(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * 1-5`);\n}\n\n/** Saturday & Sunday at \"HH:MM\". */\nexport function weekends(time = \"00:00\"): string {\n const { hh, mm } = parseTime(time);\n return cron(`${mm} ${hh} * * 0,6`);\n}\n\n/** Namespace form for discoverability: `import { schedule } from \"@cronvello/sdk\"`. */\nexport const schedule = {\n cron, every, everyMinutes, everyHours, hourly, daily, weekly, monthly, weekdays, weekends,\n};\n\nfunction parseTime(time: string): { hh: number; mm: number } {\n const m = /^(\\d{1,2}):(\\d{2})$/.exec(time.trim());\n if (!m) throw new Error(`Expected a time like \"08:00\" or \"23:30\", got \"${time}\"`);\n const hh = Number(m[1]);\n const mm = Number(m[2]);\n if (hh > 23) throw new Error(`Hour must be 0–23, got ${hh}`);\n if (mm > 59) throw new Error(`Minute must be 0–59, got ${mm}`);\n return { hh, mm };\n}\n\nfunction weekday(day: Weekday): number {\n if (typeof day === \"number\") {\n if (day < 0 || day > 6) throw new Error(`Weekday number must be 0 (Sun) – 6 (Sat), got ${day}`);\n return day;\n }\n const n = DOW[day.toLowerCase()];\n if (n === undefined) throw new Error(`Unknown weekday \"${day}\" — use sun…sat or 0…6`);\n return n;\n}\n\nfunction field(value: number, min: number, max: number, label: string): number {\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${label} must be an integer ${min}–${max}, got ${value}`);\n }\n return value;\n}\n","/**\n * @cronvello/sdk — code-first cron jobs for Cronvello.\n *\n * Two layers, one package:\n * • High-level registry: `defineCronvello({ jobs })` → `.sync()` + `.expressHandler()` / `.nextHandler()`.\n * Define jobs in code; the SDK reconciles them to https://api.cronvello.com and runs them.\n * • Low-level client: `new CronvelloClient({ apiKey })` → typed access to the whole `/v1` API.\n */\n\n// ── High-level registry ────────────────────────────────────────────────────\nexport { defineCronvello, type CronvelloApp, type CronvelloEnvConfig } from \"./registry/define.js\";\nexport { formatSyncResult, type FormatOptions } from \"./registry/format.js\";\nexport type {\n CronvelloAppConfig,\n CronvelloJobConfig,\n CronvelloJobConfigWithKey,\n CronvelloJobsInput,\n CronvelloJobContext,\n CronvelloJobHandler,\n CronvelloLogger,\n CronvelloHooks,\n CronvelloRunSource,\n ReconcileResult,\n ReconcileTaskChange,\n SyncOptions,\n} from \"./registry/types.js\";\nexport type { DispatchRequest, DispatchResponse } from \"./registry/dispatch.js\";\n\n// ── Schedule builders ──────────────────────────────────────────────────────\nexport {\n cron,\n every,\n everyMinutes,\n everyHours,\n hourly,\n daily,\n weekly,\n monthly,\n weekdays,\n weekends,\n schedule,\n type Weekday,\n} from \"./schedule/index.js\";\nexport { validateCron, isValidTimeZone, type CronValidation } from \"./internal/cron.js\";\n\n// ── Schedule preview (pure, no account) ─────────────────────────────────────\n// The local engine itself lives under the `@cronvello/sdk/dev` subpath; these two pure helpers are\n// surfaced here too because reasoning about *when* a schedule fires is useful everywhere.\nexport {\n nextOccurrence,\n previewSchedule,\n type NextOccurrenceOptions,\n type PreviewOptions,\n} from \"./internal/cron-schedule.js\";\n\n// ── Low-level client ───────────────────────────────────────────────────────\nexport {\n CronvelloClient,\n CRONVELLO_DEFAULT_BASE_URL,\n type CronvelloClientOptions,\n} from \"./client/client.js\";\n\n// ── Errors ─────────────────────────────────────────────────────────────────\nexport {\n CronvelloError,\n CronvelloApiError,\n CronvelloNetworkError,\n CronvelloConfigError,\n} from \"./internal/errors.js\";\n\n// ── Wire types ─────────────────────────────────────────────────────────────\nexport type {\n Urgency,\n ExecutionMode,\n HttpMethod,\n JobStatus,\n RunStatus,\n RunType,\n CallbackStatus,\n SuccessCriteria,\n PublicJob,\n PublicTask,\n PublicRun,\n JobCreateBody,\n JobUpdateBody,\n TaskCreateBody,\n TaskUpdateBody,\n RunsPage,\n TasksPage,\n RunNowResult,\n RegistryTaskInput,\n RegistryReconcileRequest,\n RegistryReconcileResponse,\n RegistryReconcileChange,\n MeResponse,\n UsageResponse,\n Pagination,\n RunsQuery,\n AccountTasksQuery,\n AccountRunsQuery,\n} from \"./internal/wire.js\";\n\n/**\n * Generate a strong random dispatch secret (hex). Convenience for setup scripts:\n * node -e \"console.log(require('@cronvello/sdk').generateDispatchSecret())\"\n */\nexport function generateDispatchSecret(bytes = 32): string {\n const buf = new Uint8Array(bytes);\n crypto.getRandomValues(buf);\n return Array.from(buf)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n"]}
|