@usetransactional/cli 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +4 -4
- package/dist/bin.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/config.ts","../src/lib/client.ts","../src/lib/auth.ts","../src/output/index.ts","../src/prompts/index.ts","../src/commands/auth.ts","../src/commands/email.ts","../src/commands/config.ts","../src/commands/mcp.ts","../src/index.ts","../src/bin.ts"],"names":["path","os","chalk","ora","Command","fs2","printHeading","platform","fs3","program"],"mappings":";;;;;;;;;;;;AAeA,IAAM,UAAA,GAAkBA,KAAA,CAAA,IAAA,CAAQC,GAAA,CAAA,OAAA,EAAQ,EAAG,gBAAgB,CAAA;AAC3D,IAAM,WAAA,GAAmBD,KAAA,CAAA,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AACvD,IAAM,gBAAA,GAAwBA,KAAA,CAAA,IAAA,CAAK,UAAA,EAAY,kBAAkB,CAAA;AAEjE,IAAM,cAAA,GAA4B;AAAA,EAChC,MAAA,EAAQ,kCAAA;AAAA,EACR,MAAA,EAAQ,8BAAA;AAAA,EACR,YAAA,EAAc,OAAA;AAAA,EACd,KAAA,EAAO;AACT,CAAA;AAGA,IAAI,aAAA,GAA2B,EAAE,GAAG,cAAA,EAAe;AACnD,IAAI,kBAAA,GAA+C,IAAA;AASnD,SAAS,eAAA,GAAwB;AAC/B,EAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,IAAG,aAAU,UAAA,EAAY,EAAE,WAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAAA,EAC3D;AACF;AASO,SAAS,UAAA,GAAwB;AACtC,EAAA,eAAA,EAAgB;AAEhB,EAAA,IAAO,EAAA,CAAA,UAAA,CAAW,WAAW,CAAA,EAAG;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAa,EAAA,CAAA,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AACpD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,MAAA,aAAA,GAAgB,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,IACjD,CAAA,CAAA,MAAQ;AACN,MAAA,aAAA,GAAgB,EAAE,GAAG,cAAA,EAAe;AAAA,IACtC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,aAAA,GAAgB,EAAE,GAAG,cAAA,EAAe;AAAA,EACtC;AAGA,EAAA,IAAI,OAAA,CAAQ,IAAI,qBAAA,EAAuB;AACrC,IAAA,aAAA,CAAc,MAAA,GAAS,QAAQ,GAAA,CAAI,qBAAA;AAAA,EACrC;AACA,EAAA,IAAI,OAAA,CAAQ,IAAI,qBAAA,EAAuB;AACrC,IAAA,aAAA,CAAc,MAAA,GAAS,QAAQ,GAAA,CAAI,qBAAA;AAAA,EACrC;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,IAAY,OAAA,CAAQ,IAAI,sBAAA,EAAwB;AAC9D,IAAA,aAAA,CAAc,KAAA,GAAQ,KAAA;AAAA,EACxB;AAEA,EAAA,OAAO,aAAA;AACT;AAKO,SAAS,WAAW,MAAA,EAAkC;AAC3D,EAAA,eAAA,EAAgB;AAChB,EAAA,aAAA,GAAgB,EAAE,GAAG,aAAA,EAAe,GAAG,MAAA,EAAO;AAE9C,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,OAAM,GAAI,aAAA;AAChD,EAAG,EAAA,CAAA,aAAA,CAAc,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAM,EAAG,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,IAC9F,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAKO,SAAS,SAAA,GAAuB;AACrC,EAAA,OAAO,aAAA;AACT;AAKO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,aAAA,CAAc,MAAA;AACvB;AAKO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,aAAA,CAAc,MAAA;AACvB;AAKO,SAAS,eAAA,GAAgC;AAC9C,EAAA,OAAO,aAAA,CAAc,YAAA;AACvB;AAKO,SAAS,cAAA,GAA0B;AACxC,EAAA,OAAO,aAAA,CAAc,KAAA;AACvB;AASO,SAAS,eAAA,GAAqC;AACnD,EAAA,eAAA,EAAgB;AAEhB,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,OAAO,kBAAA;AAAA,EACT;AAEA,EAAA,IAAO,EAAA,CAAA,UAAA,CAAW,gBAAgB,CAAA,EAAG;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAa,EAAA,CAAA,YAAA,CAAa,gBAAA,EAAkB,OAAO,CAAA;AACzD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGjC,MAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AAExB,QAAA,kBAAA,GAAqB;AAAA,UACnB,OAAA,EAAS,CAAA;AAAA,UACT,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,qBAAqB,MAAA,CAAO;AAAA,SAC9B;AACA,QAAA,eAAA,CAAgB,kBAAkB,CAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,kBAAA,GAAqB,MAAA;AAAA,MACvB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,kBAAA,GAAqB;AAAA,QACnB,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,kBAAA,GAAqB;AAAA,MACnB,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,OAAO,kBAAA;AACT;AAKO,SAAS,gBAAgB,WAAA,EAAsC;AACpE,EAAA,eAAA,EAAgB;AAChB,EAAA,kBAAA,GAAqB,WAAA;AACrB,EAAG,iBAAc,gBAAA,EAAkB,IAAA,CAAK,UAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,IACvE,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAKO,SAAS,sBAAA,GAA6C;AAC3D,EAAA,MAAM,cAAc,eAAA,EAAgB;AACpC,EAAA,OAAO,WAAA,CAAY,mBAAA;AACrB;AAKO,SAAS,uBAAuB,OAAA,EAAuB;AAC5D,EAAA,MAAM,cAAc,eAAA,EAAgB;AACpC,EAAA,WAAA,CAAY,mBAAA,GAAsB,OAAA;AAClC,EAAA,eAAA,CAAgB,WAAW,CAAA;AAC7B;AAKO,SAAS,QAAA,GAA+B;AAC7C,EAAA,MAAM,cAAc,eAAA,EAAgB;AAGpC,EAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA,CAAY,aAAa,IAAI,IAAA,CAAK,YAAY,SAAS,CAAA,mBAAI,IAAI,IAAA,EAAK,EAAG;AACzE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,WAAA,CAAY,KAAA;AACrB;AAKO,SAAS,UAAA,CAAW,OAAe,gBAAA,EAAgC;AACxE,EAAA,MAAM,cAAc,eAAA,EAAgB;AACpC,EAAA,WAAA,CAAY,KAAA,GAAQ,KAAA;AACpB,EAAA,WAAA,CAAY,SAAA,GAAY,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,GAAI,gBAAA,GAAmB,GAAI,CAAA,CAAE,WAAA,EAAY;AACnF,EAAA,eAAA,CAAgB,WAAW,CAAA;AAC7B;AAKO,SAAS,UAAA,GAAsB;AACpC,EAAA,OAAO,CAAC,CAAC,QAAA,EAAS;AACpB;AAKO,SAAS,gBAAA,GAAyB;AACvC,EAAA,eAAA,EAAgB;AAChB,EAAA,kBAAA,GAAqB;AAAA,IACnB,OAAA,EAAS;AAAA,GACX;AACA,EAAA,IAAO,EAAA,CAAA,UAAA,CAAW,gBAAgB,CAAA,EAAG;AACnC,IAAG,cAAW,gBAAgB,CAAA;AAAA,EAChC;AACF;AAKO,SAAS,cAAc,IAAA,EAA0D;AACtF,EAAA,MAAM,cAAc,eAAA,EAAgB;AACpC,EAAA,WAAA,CAAY,IAAA,GAAO,IAAA;AACnB,EAAA,eAAA,CAAgB,WAAW,CAAA;AAC7B;AAaO,SAAS,mBAAmB,OAAA,EAAuB;AACxD,EAAA,sBAAA,CAAuB,OAAO,CAAA;AAChC;AAKO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,OAAO,gBAAA;AACT;AAKO,SAAS,UAAA,GAAwB;AACtC,EAAA,OAAO,UAAA,EAAW;AACpB;;;AClRO,IAAM,YAAN,MAAgB;AAAA,EACb,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EAER,YAAY,OAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,SAAS,SAAA,EAAU;AACxB,IAAA,IAAA,CAAK,QAAQ,QAAA,EAAS;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,WAAW,sBAAA,EAAuB;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,GAAqC;AAC3C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KAChB;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAA,CAAQ,qBAAqB,IAAI,IAAA,CAAK,OAAA;AAAA,IACxC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CAASA,OAAc,MAAA,EAA0C;AACvE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAIA,KAAAA,EAAM,KAAK,MAAM,CAAA;AAErC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,MAAA,EACAA,KAAAA,EACA,OAAA,EAI2B;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAASA,KAAAA,EAAM,SAAS,MAAM,CAAA;AAC/C,MAAA,MAAM,IAAA,GAAoB;AAAA,QACxB,MAAA;AAAA,QACA,OAAA,EAAS,KAAK,UAAA;AAAW,OAC3B;AAEA,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AAGtC,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,MACzB;AAGA,MAAA,IAAI,IAAA;AACJ,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,MAAA,IAAI,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC7C,QAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,MAC7B;AAGA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,aAAA,GAAgB,IAAA;AACtB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,MAAM,aAAA,CAAc,KAAA,EAAO,IAAA,IAAQ,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,CAAA;AAAA,YAC1D,OAAA,EAAS,aAAA,CAAc,KAAA,EAAO,OAAA,IAAW,QAAA,CAAS,UAAA;AAAA,YAClD,OAAA,EAAS,cAAc,KAAA,EAAO;AAAA;AAChC,SACF;AAAA,MACF;AAIA,MAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAO,KAAqB,IAAA,EAAK;AAAA,MAC3D;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAgB;AAAA,IAC1C,SAAS,GAAA,EAAK;AAEZ,MAAA,IAAI,eAAe,KAAA,EAAO;AACxB,QAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EAAG;AACxC,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,oBAAA;AAAA,cACN,OAAA,EAAS,CAAA,4DAAA;AAAA;AACX,WACF;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,eAAA;AAAA,YACN,SAAS,GAAA,CAAI;AAAA;AACf,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,eAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAOA,KAAAA,EAAc,MAAA,EAA6D;AACtF,IAAA,OAAO,KAAK,OAAA,CAAW,KAAA,EAAOA,KAAAA,EAAM,EAAE,QAAQ,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAQA,KAAAA,EAAc,IAAA,EAA2C;AACrE,IAAA,OAAO,KAAK,OAAA,CAAW,MAAA,EAAQA,KAAAA,EAAM,EAAE,MAAM,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAOA,KAAAA,EAAc,IAAA,EAA2C;AACpE,IAAA,OAAO,KAAK,OAAA,CAAW,KAAA,EAAOA,KAAAA,EAAM,EAAE,MAAM,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAASA,KAAAA,EAAc,IAAA,EAA2C;AACtE,IAAA,OAAO,KAAK,OAAA,CAAW,OAAA,EAASA,KAAAA,EAAM,EAAE,MAAM,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAiBA,KAAAA,EAAyC;AAC9D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,QAAA,EAAUA,KAAI,CAAA;AAAA,EACvC;AACF,CAAA;AAKO,SAAS,aAAa,OAAA,EAA6B;AACxD,EAAA,OAAO,IAAI,UAAU,OAAO,CAAA;AAC9B;AC3IA,eAAe,iBAAA,CACb,cAA6B,KAAA,EACA;AAC7B,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,gBAAA,CAAA,EAAoB;AAAA,IACxD,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,kBAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,MACnB,WAAA;AAAA,MACA,UAAA,EAAY;AAAA,QACV,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,QAAA,IAAY,SAAA;AAAA,QACpC,QAAQ,OAAA,CAAQ,QAAA;AAAA,QAChB,WAAW,OAAA,CAAQ,OAAA;AAAA,QACnB,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,QAAA,IAAY,SAAA;AAAA,QAClC,aAAA,EAAe;AAAA;AACjB,KACD;AAAA,GACF,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,SAAA,GAAa,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAGzD,IAAA,MAAM,QAAA,GAAW,OAAO,SAAA,CAAU,KAAA,KAAU,WACxC,SAAA,CAAU,KAAA,GACV,SAAA,CAAU,KAAA,EAAO,OAAA,IAAW,2BAAA;AAChC,IAAA,MAAM,IAAI,MAAM,QAAQ,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,SAAS,IAAA,EAAK;AACvB;AAMA,eAAe,YAAA,CACb,UAAA,EACA,QAAA,EACA,SAAA,EACA,MAAA,EACwB;AACxB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,SAAA,GAAY,YAAY,SAAA,GAAY,GAAA;AAE1C,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,EAAW;AAC7B,IAAA,IAAI,QAAQ,MAAA,EAAO;AAEnB,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,UAAA,CAAA,EAAc;AAAA,MAClD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,YAAY;AAAA,KACpC,CAAA;AAED,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,OAAO,SAAS,IAAA,EAAK;AAAA,IACvB;AAEA,IAAA,MAAM,SAAA,GAAa,MAAM,QAAA,CAAS,IAAA,EAAK;AAGvC,IAAA,QAAQ,UAAU,KAAA;AAAO,MACvB,KAAK,uBAAA;AAEH,QAAA;AAAA,MACF,KAAK,WAAA;AAEH,QAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,CAAA,EAAG,EAAE,CAAA;AACpC,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD,KAAK,eAAA;AACH,QAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,MACzC;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,iBAAA,IAAqB,cAAc,CAAA;AAAA;AAIjE,IAAA,MAAM,IAAI,QAAQ,CAAC,OAAA,KAAY,WAAW,OAAA,EAAS,QAAA,GAAW,GAAI,CAAC,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AACtD;AAKA,eAAsB,KAAA,CACpB,WAAA,GAA6B,KAAA,EAC7B,SAAA,EAUA;AACA,EAAA,IAAI;AAEF,IAAA,MAAM,kBAAA,GAAqB,MAAM,iBAAA,CAAkB,WAAW,CAAA;AAC9D,IAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAU,SAAA,EAAW,UAAS,GAAI,kBAAA;AAGtD,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,MAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAA;AAGrE,IAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,MAAA,SAAA,CAAU,YAAA,CAAa,UAAU,eAAe,CAAA;AAAA,IAClD;AAGA,IAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,MAAA,SAAA,CAAU,aAAA,EAAc;AAAA,IAC1B;AACA,IAAA,MAAM,KAAK,eAAe,CAAA;AAG1B,IAAA,MAAM,gBAAgB,MAAM,YAAA;AAAA,MAC1B,UAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAGA,IAAA,UAAA,CAAW,aAAA,CAAc,KAAA,EAAO,aAAA,CAAc,SAAS,CAAA;AACvD,IAAA,aAAA,CAAc;AAAA,MACZ,EAAA,EAAI,cAAc,IAAA,CAAK,EAAA;AAAA,MACvB,KAAA,EAAO,cAAc,IAAA,CAAK,KAAA;AAAA,MAC1B,IAAA,EAAM,cAAc,IAAA,CAAK;AAAA,KAC1B,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,MAAM,aAAA,CAAc,IAAA;AAAA,QACpB,eAAe,aAAA,CAAc;AAAA;AAC/B,KACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,cAAA;AAAA,QACN,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA;AAChD,KACF;AAAA,EACF;AACF;AAKO,SAAS,MAAA,GAAe;AAC7B,EAAA,gBAAA,EAAiB;AACnB;AAKA,eAAsB,OAAO,OAAA,EAA0D;AACrF,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,EAAA,OAAO,MAAA,CAAO,IAAoB,aAAa,CAAA;AACjD;AAKA,eAAsB,iBAAA,GAAgE;AACpF,EAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,EAAA,OAAO,MAAA,CAAO,IAAwB,oBAAoB,CAAA;AAC5D;ACnOO,SAAS,YAAA,CAAa,MAAe,MAAA,EAA+B;AACzE,EAAA,MAAM,YAAA,GAAe,UAAU,eAAA,EAAgB;AAE/C,EAAA,QAAQ,YAAA;AAAc,IACpB,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,IACrC,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,IAC5B,KAAK,OAAA;AAAA,IACL;AACE,MAAA,OAAO,cAAc,IAAI,CAAA;AAAA;AAE/B;AAKA,SAAS,cAAc,IAAA,EAAuB;AAC5C,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM;AAAA,MACtB,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAO,cAAA,EAAe,GAAIE,MAAA,CAAM,IAAA,CAAK,CAAC,CAAA,GAAI,CAAE,CAAA;AAAA,MAC/D,KAAA,EAAO;AAAA,QACL,MAAM,cAAA,EAAe,GAAI,CAAC,MAAM,IAAI,EAAC;AAAA,QACrC,QAAQ,cAAA,EAAe,GAAI,CAAC,MAAM,IAAI;AAAC;AACzC,KACD,CAAA;AAED,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,YAAa,GAAA,CAAgC,GAAG,CAAC,CAAC,CAAC,CAAA;AAAA,IACrF;AAEA,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AAEA,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM;AAAA,MACtB,KAAA,EAAO;AAAA,QACL,QAAQ,cAAA,EAAe,GAAI,CAAC,MAAM,IAAI;AAAC;AACzC,KACD,CAAA;AAED,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,MAAM,eAAe,cAAA,EAAe,GAAIA,MAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AAC1D,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,YAAY,GAAG,WAAA,CAAY,KAAK,GAAG,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AAEA,EAAA,OAAO,OAAO,IAAI,CAAA;AACpB;AAKA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,cAAA,EAAe,GAAIA,MAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,IAAI,gBAAe,EAAG;AACpB,MAAA,OAAO,QAAQA,MAAA,CAAM,KAAA,CAAM,KAAK,CAAA,GAAIA,MAAA,CAAM,IAAI,IAAI,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,QAAQ,KAAA,GAAQ,IAAA;AAAA,EACzB;AAEA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC3B;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAKO,SAAS,aAAa,OAAA,EAAuB;AAClD,EAAA,IAAI,gBAAe,EAAG;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAA,CAAM,KAAA,CAAM,QAAG,GAAG,OAAO,CAAA;AAAA,EACvC,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,OAAO,CAAA;AAAA,EAC7B;AACF;AAKO,SAAS,UAAA,CAAW,SAAiB,OAAA,EAAwB;AAClE,EAAA,IAAI,gBAAe,EAAG;AACpB,IAAA,OAAA,CAAQ,KAAA,CAAMA,MAAA,CAAM,GAAA,CAAI,QAAG,GAAG,OAAO,CAAA;AAGrC,EACF,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAA,CAAM,WAAW,OAAO,CAAA;AAGhC,EACF;AACF;AA0CO,SAAS,aAAA,CAAc,KAAa,KAAA,EAAsB;AAC/D,EAAA,MAAM,cAAA,GAAiB,YAAY,KAAK,CAAA;AACxC,EAAA,IAAI,gBAAe,EAAG;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAGA,MAAA,CAAM,IAAA,CAAK,MAAM,GAAG,CAAC,CAAA,CAAA,EAAI,cAAc,CAAA,CAAE,CAAA;AAAA,EAC1D,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,cAAc,CAAA,CAAE,CAAA;AAAA,EACzC;AACF;AAKO,SAAS,KAAA,CAAM,MAAe,MAAA,EAA6B;AAChE,EAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,IAAA,EAAM,MAAM,CAAC,CAAA;AACxC;ACjLA,eAAsB,mBAAmB,aAAA,EAAoD;AAC3F,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,SAAS,MAAA,CAA4B;AAAA,IAC7D;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,yBAAA;AAAA,MACT,OAAA,EAAS,aAAA,CAAc,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QACnC,IAAA,EAAM,GAAG,GAAA,CAAI,IAAI,KAAK,GAAA,CAAI,IAAI,CAAA,IAAA,EAAO,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,QAC7C,OAAO,GAAA,CAAI;AAAA,OACb,CAAE;AAAA;AACJ,GACD,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAKA,eAAsB,OAAA,CAAQ,OAAA,EAAiB,YAAA,GAAe,KAAA,EAAyB;AACrF,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,SAAS,MAAA,CAA+B;AAAA,IAClE;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,OAAA;AAAA,MACA,OAAA,EAAS;AAAA;AACX,GACD,CAAA;AAED,EAAA,OAAO,SAAA;AACT;;;ACjBO,SAAS,kBAAA,GAA8B;AAC5C,EAAA,OAAO,IAAI,OAAA,CAAQ,OAAO,CAAA,CACvB,WAAA,CAAY,iCAAiC,CAAA,CAC7C,MAAA,CAAO,OAAA,EAAS,0BAA0B,EAC1C,MAAA,CAAO,aAAA,EAAe,2CAA2C,CAAA,CACjE,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,IAAI,UAAA,EAAW,IAAK,CAAC,OAAA,CAAQ,KAAA,EAAO;AAClC,MAAA,MAAM,aAAa,sBAAA,EAAuB;AAC1C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,SAAA,CAAU,CAAA,yCAAA,EAA4C,UAAU,CAAA,CAAE,CAAA;AAAA,MACpE,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,kFAAkF,CAAA;AAAA,MAC9F;AACA,MAAA,SAAA,CAAU,uDAAuD,CAAA;AACjE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAUC,IAAA,EAAI;AAEpB,IAAA,MAAM,SAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,GAAM,QAAQ,KAAA,EAAO;AAAA,MACtD,YAAA,EAAc,CAAC,QAAA,EAAU,eAAA,KAAoB;AAC3C,QAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,QAAA,OAAA,CAAQ,GAAA,CAAID,MAAAA,CAAM,IAAA,CAAK,6BAA6B,CAAC,CAAA;AACrD,QAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,QAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAeA,MAAAA,CAAM,IAAA,CAAK,eAAe,CAAC,CAAA,CAAE,CAAA;AACxD,QAAA,OAAA,CAAQ,GAAA,CAAI,kCAAkCA,MAAAA,CAAM,IAAA,CAAK,OAAO,cAAA,CAAe,QAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAC3F,QAAA,OAAA,CAAQ,IAAI,CAAA,sCAAA,CAAwC,CAAA;AACpD,QAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,MACd,CAAA;AAAA,MACA,eAAe,MAAM;AACnB,QAAA,OAAA,CAAQ,MAAM,oBAAoB,CAAA;AAClC,QAAA,OAAA,CAAQ,QAAQ,gBAAgB,CAAA;AAChC,QAAA,OAAA,CAAQ,MAAM,8BAA8B,CAAA;AAAA,MAC9C,CAAA;AAAA,MACA,WAAW,MAAM;AAAA,MAEjB;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAC3B,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,yBAAyB,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,IAAA,YAAA,CAAa,mBAAmB,CAAA;AAChC,IAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,IAAA,aAAA,CAAc,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAG5C,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACxC,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAA,SAAA,CAAU,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,iBAAA,CAAmB,CAAA;AACnF,MAAA,SAAA,CAAU,4FAA4F,CAAA;AAAA,IACxG;AAAA,EACF,CAAC,CAAA;AACL;AAKA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,mBAAA,GAA+B;AAC7C,EAAA,OAAO,IAAI,QAAQ,QAAQ,CAAA,CACxB,YAAY,gCAAgC,CAAA,CAC5C,OAAO,YAAY;AAClB,IAAA,IAAI,CAAC,YAAW,EAAG;AACjB,MAAA,SAAA,CAAU,wBAAwB,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,EAAO;AACP,IAAA,YAAA,CAAa,oCAAoC,CAAA;AAAA,EACnD,CAAC,CAAA;AACL;AAKO,SAAS,mBAAA,GAA+B;AAC7C,EAAA,OAAO,IAAI,OAAA,CAAQ,QAAQ,CAAA,CACxB,WAAA,CAAY,yCAAyC,CAAA,CACrD,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,EAC9C,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,IAAI,CAAC,YAAW,EAAG;AACjB,MAAA,UAAA,CAAW,2DAA2D,CAAA;AACtE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAEvC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,yBAAyB,CAAA;AAC7D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,OAAA,KAAY,MAAA,CAAO,IAAA;AAC/C,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAA,YAAA,CAAa,MAAM,CAAA;AACnB,MAAA,aAAA,CAAc,IAAA,EAAM,KAAK,EAAE,CAAA;AAC3B,MAAA,aAAA,CAAc,OAAA,EAAS,KAAK,KAAK,CAAA;AACjC,MAAA,IAAI,IAAA,CAAK,IAAA,EAAM,aAAA,CAAc,MAAA,EAAQ,KAAK,IAAI,CAAA;AAE9C,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAA,YAAA,CAAa,cAAc,CAAA;AAC3B,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,YAAA,CAAa,EAAE,CAAC,CAAA;AAC3C,QAAA,aAAA,CAAc,MAAA,EAAQ,aAAa,IAAI,CAAA;AACvC,QAAA,aAAA,CAAc,MAAA,EAAQ,aAAa,IAAI,CAAA;AACvC,QAAA,aAAA,CAAc,MAAA,EAAQ,aAAa,IAAI,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,6EAA6E,CAAA;AAAA,MACzF;AAEA,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAA;AACtC,MAAA,aAAA,CAAc,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAClC,MAAA,aAAA,CAAc,SAAA,EAAW,QAAQ,SAAS,CAAA;AAC1C,MAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,aAAA,CAAc,SAAA,EAAW,QAAQ,SAAS,CAAA;AAAA,IACnE;AAAA,EACF,CAAC,CAAA;AACL;AAKO,SAAS,mBAAA,GAA+B;AAC7C,EAAA,OAAO,IAAI,OAAA,CAAQ,QAAQ,CAAA,CACxB,WAAA,CAAY,0DAA0D,CAAA,CACtE,QAAA,CAAS,QAAA,EAAU,gCAAgC,CAAA,CACnD,MAAA,CAAO,OAAO,IAAA,KAAkB;AAC/B,IAAA,IAAI,CAAC,YAAW,EAAG;AACjB,MAAA,UAAA,CAAW,2DAA2D,CAAA;AACtE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAGA,IAAA,MAAM,OAAA,GAAUC,IAAA,CAAI,2BAA2B,CAAA,CAAE,KAAA,EAAM;AACvD,IAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,EAAkB;AAE3C,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,WAAW,IAAA,EAAM;AAC3C,MAAA,OAAA,CAAQ,KAAK,+BAA+B,CAAA;AAC5C,MAAA,UAAA,CAAW,UAAA,CAAW,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACvD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,OAAO,UAAA,CAAW,IAAA;AACxB,IAAA,OAAA,CAAQ,IAAA,EAAK;AAEb,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,UAAA,CAAW,yBAAyB,CAAA;AACpC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,UAAA,GAAa,IAAA;AAEjB,IAAA,IAAI,CAAC,UAAA,EAAY;AAEf,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,UAAA,GAAa,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AACrB,QAAA,SAAA,CAAU,CAAA,iCAAA,EAAoC,UAAU,CAAA,CAAE,CAAA;AAAA,MAC5D,CAAA,MAAO;AACL,QAAA,UAAA,GAAa,MAAM,mBAAmB,IAAI,CAAA;AAAA,MAC5C;AAAA,IACF;AAGA,IAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AACvD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,UAAA,CAAW,CAAA,cAAA,EAAiB,UAAU,CAAA,YAAA,CAAc,CAAA;AACpD,MAAA,SAAA,CAAU,2BAAA,GAA8B,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC1E,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,kBAAA,CAAmB,UAAU,CAAA;AAC7B,IAAA,YAAA,CAAa,CAAA,0BAAA,EAA6B,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3E,CAAC,CAAA;AACL;AAKO,SAAS,iBAAA,GAA6B;AAC3C,EAAA,MAAM,SAAS,IAAI,OAAA,CAAQ,KAAK,CAAA,CAC7B,YAAY,sBAAsB,CAAA;AAGrC,EAAA,MAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,2CAA2C,CAAA,CACvD,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,IAAI,CAAC,YAAW,EAAG;AACjB,MAAA,UAAA,CAAW,2DAA2D,CAAA;AACtE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,OAAA,GAAUA,IAAA,CAAI,2BAA2B,CAAA,CAAE,KAAA,EAAM;AACvD,IAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,EAAkB;AAEvC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,OAAA,CAAQ,KAAK,+BAA+B,CAAA;AAC5C,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,aAAa,sBAAA,EAAuB;AAE1C,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,SAAA,CAAU,yBAAyB,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MAClC,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,GAAA,CAAI,IAAA,KAAS,UAAA,GAAa,GAAA,GAAM;AAAA,KAC3C,CAAE,CAAA;AAEF,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,UAAU,MAAM,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,QAAQ,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAA,SAAA,CAAU,CAAA,sBAAA,EAAyB,UAAA,IAAc,iBAAiB,CAAA,CAAE,CAAA;AAAA,IACtE;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,MAAA,CACG,OAAA,CAAQ,KAAK,CAAA,CACb,WAAA,CAAY,+CAA+C,CAAA,CAC3D,QAAA,CAAS,QAAA,EAAU,0BAA0B,CAAA,CAC7C,MAAA,CAAO,OAAO,IAAA,KAAiB;AAC9B,IAAA,IAAI,CAAC,YAAW,EAAG;AACjB,MAAA,UAAA,CAAW,2DAA2D,CAAA;AACtE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAGA,IAAA,MAAM,OAAA,GAAUA,IAAA,CAAI,2BAA2B,CAAA,CAAE,KAAA,EAAM;AACvD,IAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,EAAkB;AAEvC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,OAAA,CAAQ,KAAK,+BAA+B,CAAA;AAC5C,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACnD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AACrC,MAAA,UAAA,CAAW,CAAA,cAAA,EAAiB,IAAI,CAAA,YAAA,CAAc,CAAA;AAC9C,MAAA,SAAA,CAAU,8DAA8D,CAAA;AACxE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,YAAA,CAAa,CAAA,wBAAA,EAA2B,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9D,CAAC,CAAA;AAGH,EAAA,MAAA,CACG,QAAQ,SAAS,CAAA,CACjB,YAAY,+BAA+B,CAAA,CAC3C,OAAO,MAAM;AACZ,IAAA,MAAM,aAAa,sBAAA,EAAuB;AAC1C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,aAAA,CAAc,wBAAwB,UAAU,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,6EAA6E,CAAA;AAAA,IACzF;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAO,MAAA;AACT;AAIA,SAAS,UAAU,OAAA,EAAuB;AACxC,EAAA,IAAI,gBAAe,EAAG;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAID,MAAAA,CAAM,IAAA,CAAK,QAAG,GAAG,OAAO,CAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,EAC/B;AACF;AAEA,SAAS,aAAa,KAAA,EAAqB;AACzC,EAAA,IAAI,gBAAe,EAAG;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACzC,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,EAChC;AACF;ACxTO,SAAS,kBAAA,GAA8B;AAC5C,EAAA,MAAM,WAAW,IAAIE,OAAAA,CAAQ,OAAO,CAAA,CAAE,YAAY,2BAA2B,CAAA;AAG7E,EAAA,QAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,qBAAqB,CAAA,CACjC,cAAA,CAAe,oBAAA,EAAsB,sBAAsB,CAAA,CAC3D,cAAA,CAAe,kBAAA,EAAoB,yBAAyB,EAC5D,MAAA,CAAO,sBAAA,EAAwB,eAAe,CAAA,CAC9C,MAAA,CAAO,kBAAA,EAAoB,WAAW,CAAA,CACtC,OAAO,kBAAA,EAAoB,iBAAiB,CAAA,CAC5C,MAAA,CAAO,iBAAA,EAAmB,aAAa,CAAA,CACvC,MAAA,CAAO,4BAA4B,gBAAgB,CAAA,CACnD,MAAA,CAAO,gBAAA,EAAkB,uBAAuB,CAAA,CAChD,MAAA,CAAO,eAAA,EAAiB,iCAAiC,CAAA,CACzD,MAAA,CAAO,gBAAA,EAAkB,kCAAkC,CAAA,CAC3D,MAAA,CAAO,oBAAA,EAAsB,kBAAkB,EAC/C,MAAA,CAAO,aAAA,EAAe,aAAa,CAAA,CACnC,MAAA,CAAO,eAAA,EAAiB,WAAW,CAAA,CACnC,OAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,OAAA,GAAUD,IAAAA,CAAI,kBAAkB,CAAA,CAAE,KAAA,EAAM;AAE9C,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAgC;AAAA,QACpC,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,UAAU,OAAA,CAAQ,IAAA;AAAA,QAClB,UAAU,OAAA,CAAQ,IAAA;AAAA,QAClB,YAAY,OAAA,CAAQ,QAAA,GAAW,SAAS,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,GAAI,KAAA,CAAA;AAAA,QAChE,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,eAAe,OAAA,CAAQ,KAAA,GAAQ,KAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAA;AAAA,QAC3D,EAAA,EAAI,OAAA,CAAQ,EAAA,GAAK,OAAA,CAAQ,GAAG,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,KAAA,CAAA;AAAA,QACtE,GAAA,EAAK,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,KAAA,CAAA;AAAA,QACzE,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,UAAU,OAAA,CAAQ,MAAA,GAAS,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,GAAI,KAAA;AAAA,OAC5D;AAEA,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAsB,UAAU,WAAW,CAAA;AAEvE,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,QAAA,OAAA,CAAQ,KAAK,sBAAsB,CAAA;AACnC,QAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,OAAA,CAAQ,QAAQ,0BAA0B,CAAA;AAE1C,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,KAAA,CAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACjD,QAAA,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAClC,QAAA,aAAA,CAAc,cAAA,EAAgB,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,MACvD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAK,sBAAsB,CAAA;AACnC,MAAA,UAAA,CAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAC/D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,QAAA,CACG,OAAA,CAAQ,cAAc,CAAA,CACtB,WAAA,CAAY,oCAAoC,CAAA,CAChD,MAAA,CAAO,aAAa,0BAA0B,CAAA,CAC9C,OAAO,kBAAA,EAAoB,mBAAmB,EAC9C,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,IAAA,EAAc,OAAA,KAAY;AACvC,IAAA,YAAA,EAAa;AAGb,IAAA,IAAI,CAAIE,EAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACxB,MAAA,UAAA,CAAW,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,CAAA;AACpC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAaA,EAAA,CAAA,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAC7C,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,UAAA,CAAW,8BAA8B,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAC/F,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1B,MAAA,UAAA,CAAW,6CAA6C,CAAA;AACxD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,YAAA,CAAa,CAAA,UAAA,EAAa,MAAA,CAAO,MAAM,CAAA,iBAAA,CAAmB,CAAA;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAUF,IAAAA,CAAI,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA,UAAA,CAAY,EAAE,KAAA,EAAM;AAEhE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAwB,gBAAgB,EAAE,QAAA,EAAU,QAAQ,CAAA;AAExF,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,QAAA,OAAA,CAAQ,KAAK,6BAA6B,CAAA;AAC1C,QAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAEA,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAEjE,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,KAAA,CAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,MAC3B;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAK,6BAA6B,CAAA;AAC1C,MAAA,UAAA,CAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAC/D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,MAAM,YAAY,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAA,CAAE,YAAY,wBAAwB,CAAA;AAEpF,EAAA,SAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,sBAAsB,CAAA,CAClC,MAAA,CAAO,eAAA,EAAiB,qBAAqB,CAAA,CAC7C,MAAA,CAAO,mBAAA,EAAqB,4CAA4C,CAAA,CACxE,MAAA,CAAO,aAAA,EAAe,aAAA,EAAe,IAAI,CAAA,CACzC,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,CAAqB,YAAA,EAAc;AAAA,MAC7D,UAAU,OAAA,CAAQ,MAAA,GAAS,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,GAAI,MAAA;AAAA,MAC1D,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,KAAA,EAAO,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE;AAAA,KAClC,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,0BAA0B,CAAA;AAC9D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACnC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,KAAA,EAAO,EAAE,KAAA,IAAS,GAAA;AAAA,QAClB,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,SAAS,CAAA,CAAE;AAAA,OACb,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,IAAI,CAAA;AAAA,IACZ;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,QAAQ,UAAU,CAAA,CAClB,WAAA,CAAY,sBAAsB,EAClC,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,OAAO,QAAA,EAAU,gBAAgB,EACjC,MAAA,CAAO,OAAO,IAAY,OAAA,KAAY;AACrC,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,GAAA,CAAmB,CAAA,WAAA,EAAc,EAAE,CAAA,CAAE,CAAA;AAEjE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,wBAAwB,CAAA;AAC5D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,KAAA,CAAM,MAAA,CAAO,IAAA,EAAM,OAAA,CAAQ,IAAA,GAAO,SAAS,MAAS,CAAA;AAAA,EACtD,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,uBAAuB,CAAA,CACnC,eAAe,eAAA,EAAiB,eAAe,CAAA,CAC/C,cAAA,CAAe,uBAAuB,eAAe,CAAA,CACrD,eAAe,eAAA,EAAiB,WAAW,EAC3C,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,OAAO,kBAAA,EAAoB,WAAW,EACtC,MAAA,CAAO,kBAAA,EAAoB,iBAAiB,CAAA,CAC5C,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,EAC9C,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,sBAAsB,CAAA,CAAE,KAAA,EAAM;AAElD,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAoB,YAAA,EAAc;AAAA,MAC5D,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAAA,MACrC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,UAAU,OAAA,CAAQ,IAAA;AAAA,MAClB,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,mBAAmB,CAAA;AAEnC,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAClC,MAAA,aAAA,CAAc,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACxC;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,QAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,mBAAmB,EAC/B,MAAA,CAAO,eAAA,EAAiB,eAAe,CAAA,CACvC,OAAO,qBAAA,EAAuB,eAAe,CAAA,CAC7C,MAAA,CAAO,mBAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,kBAAA,EAAoB,WAAW,CAAA,CACtC,MAAA,CAAO,kBAAA,EAAoB,iBAAiB,EAC5C,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,OAAO,QAAA,EAAU,gBAAgB,EACjC,MAAA,CAAO,OAAO,IAAY,OAAA,KAAY;AACrC,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,sBAAsB,CAAA,CAAE,KAAA,EAAM;AAElD,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,KAAA,CAAqB,CAAA,WAAA,EAAc,EAAE,CAAA,CAAA,EAAI;AAAA,MACnE,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,UAAU,OAAA,CAAQ,IAAA;AAAA,MAClB,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,mBAAmB,CAAA;AAEnC,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,mBAAmB,CAAA,CAC/B,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,OAAO,IAAY,OAAA,KAAY;AACrC,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,eAAe,MAAM,OAAA,CAAQ,CAAA,yCAAA,EAA4C,EAAE,KAAK,KAAK,CAAA;AAC3F,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,sBAAsB,CAAA,CAAE,KAAA,EAAM;AAElD,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,MAAA,CAAO,CAAA,WAAA,EAAc,EAAE,CAAA,CAAE,CAAA;AAErD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,mBAAmB,CAAA;AAAA,EACrC,CAAC,CAAA;AAGH,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,CAAE,YAAY,sBAAsB,CAAA;AAE9E,EAAA,OAAA,CACG,QAAQ,MAAM,CAAA,CACd,WAAA,CAAY,oBAAoB,EAChC,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,OAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,CAAoD,UAAU,CAAA;AAE1F,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,wBAAwB,CAAA;AAC5D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC3C,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,QAAQ,CAAA,CAAE,IAAA;AAAA,QACV,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,YAAA,EAAc,CAAA,CAAE,YAAA,GAAe,KAAA,GAAQ,IAAA;AAAA,QACvC,WAAA,EAAa,CAAA,CAAE,WAAA,GAAc,KAAA,GAAQ;AAAA,OACvC,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,IAAI,CAAA;AAAA,IACZ;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,cAAc,CAAA,CACtB,WAAA,CAAY,cAAc,EAC1B,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,OAAO,QAAA,EAAU,gBAAgB,EACjC,MAAA,CAAO,OAAO,QAAgB,OAAA,KAAY;AACzC,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,kBAAkB,CAAA,CAAE,KAAA,EAAM;AAE9C,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,KAA2B,UAAA,EAAY,EAAE,QAAQ,CAAA;AAE7E,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,OAAA,CAAQ,KAAK,sBAAsB,CAAA;AACnC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,eAAe,CAAA;AAE/B,IAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY;AAC3C,MAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAK,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAC/B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACpC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,iBAAiB,EAC7B,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,OAAO,QAAA,EAAU,gBAAgB,EACjC,MAAA,CAAO,OAAO,IAAY,OAAA,KAAY;AACrC,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,qBAAqB,CAAA,CAAE,KAAA,EAAM;AAEjD,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,IAAA,CAAkB,CAAA,SAAA,EAAY,EAAE,CAAA,OAAA,CAAS,CAAA;AAErE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AACzC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,UAAA,EAAY;AACrC,MAAA,OAAA,CAAQ,QAAQ,kBAAkB,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,0BAA0B,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,MAAA,MAAM,SAAA,GAAY,CAAC,QAAA,KAAsB,QAAA,GAAW,QAAA,GAAW,QAAA;AAC/D,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,SAAA,CAAU,OAAO,IAAA,CAAK,YAAY,CAAC,CAAA,KAAA,CAAO,CAAA;AAC3D,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,SAAA,CAAU,OAAO,IAAA,CAAK,WAAW,CAAC,CAAA,IAAA,CAAM,CAAA;AACzD,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,SAAA,CAAU,OAAO,IAAA,CAAK,kBAAkB,CAAC,CAAA,YAAA,CAAc,CAAA;AACxE,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,SAAA,CAAU,OAAO,IAAA,CAAK,aAAa,CAAC,CAAA,MAAA,CAAQ,CAAA;AAC7D,MAAA,IAAI,MAAA,CAAO,KAAK,iBAAA,EAAmB;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,OAAA,EAAY,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA,CAAE,CAAA;AAAA,MACzD;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,iBAAiB,CAAA,CAC7B,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,OAAO,IAAY,OAAA,KAAY;AACrC,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,eAAe,MAAM,OAAA,CAAQ,CAAA,uCAAA,EAA0C,EAAE,KAAK,KAAK,CAAA;AACzF,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,oBAAoB,CAAA,CAAE,KAAA,EAAM;AAEhD,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,MAAA,CAAO,CAAA,SAAA,EAAY,EAAE,CAAA,CAAE,CAAA;AAEnD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,KAAK,yBAAyB,CAAA;AACtC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,iBAAiB,CAAA;AAAA,EACnC,CAAC,CAAA;AAGH,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,CAAE,YAAY,sBAAsB,CAAA;AAE9E,EAAA,OAAA,CACG,QAAQ,MAAM,CAAA,CACd,WAAA,CAAY,oBAAoB,EAChC,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,OAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,CAAoD,UAAU,CAAA;AAE1F,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,wBAAwB,CAAA;AAC5D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,MAAM,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC3C,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,IAAA,EAAM,EAAE,IAAA,IAAQ,GAAA;AAAA,QAChB,QAAQ,CAAA,CAAE;AAAA,OACZ,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,IAAI,CAAA;AAAA,IACZ;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,qBAAqB,EACjC,MAAA,CAAO,eAAA,EAAiB,aAAa,CAAA,CACrC,OAAO,kBAAA,EAAoB,mBAAmB,EAC9C,MAAA,CAAO,OAAO,WAAmB,OAAA,KAAY;AAC5C,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,kBAAkB,CAAA,CAAE,KAAA,EAAM;AAE9C,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAkB,UAAA,EAAY;AAAA,MACxD,KAAA,EAAO,SAAA;AAAA,MACP,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,OAAA,CAAQ,KAAK,sBAAsB,CAAA;AACnC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,uDAAuD,CAAA;AAAA,EACzE,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,wBAAwB,CAAA,CACpC,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,OAAO,IAAY,OAAA,KAAY;AACrC,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,eAAe,MAAM,OAAA,CAAQ,CAAA,uCAAA,EAA0C,EAAE,KAAK,KAAK,CAAA;AACzF,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,oBAAoB,CAAA,CAAE,KAAA,EAAM;AAEhD,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,MAAA,CAAO,CAAA,SAAA,EAAY,EAAE,CAAA,CAAE,CAAA;AAEnD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,KAAK,yBAAyB,CAAA;AACtC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,iBAAiB,CAAA;AAAA,EACnC,CAAC,CAAA;AAGH,EAAA,MAAM,eAAe,QAAA,CAAS,OAAA,CAAQ,cAAc,CAAA,CAAE,YAAY,2BAA2B,CAAA;AAE7F,EAAA,YAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,yBAAyB,CAAA,CACrC,MAAA,CAAO,oBAAoB,mBAAmB,CAAA,CAC9C,OAAO,eAAA,EAAiB,qBAAqB,EAC7C,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,OAAA,CAAQ,MAAM,CAAA;AAAA,IACvC;AACA,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,IAAA,MAAM,GAAA,GAAM,WAAA,GAAc,CAAA,cAAA,EAAiB,WAAW,CAAA,CAAA,GAAK,eAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,CAAsD,GAAG,CAAA;AAErF,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,6BAA6B,CAAA;AACjE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,SAAS,CAAA,CAAE;AAAA,OACb,CAAE,CAAA;AACF,MAAA,KAAA,CAAM,IAAI,CAAA;AAAA,IACZ;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,YAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,+BAA+B,CAAA,CAC3C,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,cAAA,CAAe,eAAA,EAAiB,iCAAiC,EACjE,MAAA,CAAO,mBAAA,EAAqB,uEAAA,EAAyE,QAAQ,CAAA,CAC7G,MAAA,CAAO,iBAAA,EAAmB,gBAAgB,CAAA,CAC1C,MAAA,CAAO,OAAO,SAAA,EAAmB,OAAA,KAAY;AAC5C,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,+BAA+B,CAAA,CAAE,KAAA,EAAM;AAE3D,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAuB,eAAA,EAAiB;AAAA,MAClE,KAAA,EAAO,SAAA;AAAA,MACP,QAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAAA,MACrC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,kCAAkC,CAAA;AAAA,EACpD,CAAC,CAAA;AAEH,EAAA,YAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,0BAA0B,CAAA,CACtC,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,OAAO,IAAY,OAAA,KAAY;AACrC,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,eAAe,MAAM,OAAA;AAAA,MACzB,gDAAgD,EAAE,CAAA,CAAA,CAAA;AAAA,MAClD;AAAA,KACF;AACA,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAUA,IAAAA,CAAI,mCAAmC,CAAA,CAAE,KAAA,EAAM;AAE/D,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,MAAA,CAAO,CAAA,cAAA,EAAiB,EAAE,CAAA,CAAE,CAAA;AAExD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,KAAK,8BAA8B,CAAA;AAC3C,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAe,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,QAAQ,sBAAsB,CAAA;AAAA,EACxC,CAAC,CAAA;AAGH,EAAA,QAAA,CACG,OAAA,CAAQ,OAAO,CAAA,CACf,WAAA,CAAY,sBAAsB,CAAA,CAClC,MAAA,CAAO,mBAAA,EAAqB,2BAAA,EAA6B,MAAM,CAAA,CAC/D,MAAA,CAAO,eAAA,EAAiB,qBAAqB,CAAA,CAC7C,MAAA,CAAO,eAAA,EAAiB,qBAAqB,CAAA,CAC7C,MAAA,CAAO,kBAAA,EAAoB,mBAAmB,CAAA,CAC9C,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,GAAA,CAAgB,iBAAA,EAAmB;AAAA,MAC7D,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,UAAU,OAAA,CAAQ,MAAA,GAAS,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,GAAI,MAAA;AAAA,MAC1D,UAAU,OAAA,CAAQ,MAAA,GAAS,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,GAAI;AAAA,KAC3D,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,IAAA,EAAM;AACnC,MAAA,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,qBAAqB,CAAA;AACzD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,kBAAA,EAAuB,KAAK,MAAM,CAAA;AAAA,CAAK,CAAA;AACnD,MAAA,aAAA,CAAc,MAAA,EAAQ,KAAK,IAAI,CAAA;AAC/B,MAAA,aAAA,CAAc,WAAA,EAAa,KAAK,SAAS,CAAA;AACzC,MAAA,aAAA,CAAc,SAAA,EAAW,KAAK,OAAO,CAAA;AACrC,MAAA,aAAA,CAAc,YAAA,EAAc,KAAK,UAAU,CAAA;AAC3C,MAAA,aAAA,CAAc,QAAA,EAAU,KAAK,MAAM,CAAA;AACnC,MAAA,aAAA,CAAc,SAAA,EAAW,KAAK,OAAO,CAAA;AACrC,MAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AACtB,MAAA,aAAA,CAAc,eAAA,EAAiB,IAAI,IAAA,CAAK,YAAA,GAAe,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AACzE,MAAA,aAAA,CAAc,WAAA,EAAa,IAAI,IAAA,CAAK,QAAA,GAAW,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AACjE,MAAA,aAAA,CAAc,YAAA,EAAc,IAAI,IAAA,CAAK,SAAA,GAAY,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AACnE,MAAA,aAAA,CAAc,aAAA,EAAe,IAAI,IAAA,CAAK,UAAA,GAAa,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AACrE,MAAA,aAAA,CAAc,gBAAA,EAAkB,IAAI,IAAA,CAAK,aAAA,GAAgB,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7E;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,YAAA,GAAqB;AAC5B,EAAA,IAAI,CAAC,YAAW,EAAG;AACjB,IAAA,UAAA,CAAW,2DAA2D,CAAA;AACtE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AC7pBO,SAAS,mBAAA,GAA+B;AAC7C,EAAA,MAAM,YAAY,IAAIC,OAAAA,CAAQ,QAAQ,CAAA,CAAE,YAAY,0BAA0B,CAAA;AAE9E,EAAA,SAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,4BAA4B,CAAA,CACxC,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,CAAC,OAAA,KAAY;AACnB,IAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,KAAA,CAAM,QAAQ,MAAM,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAAE,cAAa,uBAAuB,CAAA;AACpC,MAAA,aAAA,CAAc,SAAA,EAAW,OAAO,MAAM,CAAA;AACtC,MAAA,aAAA,CAAc,SAAA,EAAW,OAAO,MAAM,CAAA;AACtC,MAAA,aAAA,CAAc,eAAA,EAAiB,OAAO,YAAY,CAAA;AAClD,MAAA,aAAA,CAAc,OAAA,EAAS,MAAA,CAAO,KAAA,GAAQ,SAAA,GAAY,UAAU,CAAA;AAC5D,MAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,MAAAA,cAAa,gBAAgB,CAAA;AAC7B,MAAA,aAAA,CAAc,kBAAA,EAAoB,cAAc,CAAA;AAChD,MAAA,aAAA,CAAc,kBAAA,EAAoB,oBAAoB,CAAA;AAAA,IACxD;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,OAAA,CAAQ,mBAAmB,CAAA,CAC3B,WAAA,CAAY,2BAA2B,CAAA,CACvC,MAAA,CAAO,CAAC,GAAA,EAAa,KAAA,KAAkB;AACtC,IAAA,MAAM,SAAA,GAAY,CAAC,QAAA,EAAU,QAAA,EAAU,gBAAgB,OAAO,CAAA;AAE9D,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAE,CAAA;AACnC,MAAA,OAAA,CAAQ,MAAM,CAAA,YAAA,EAAe,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACnD,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAGA,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,MAAM,YAAA,GAA+B,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAC7D,MAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,KAAqB,CAAA,EAAG;AACjD,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAK,CAAA,CAAE,CAAA;AAC/C,QAAA,OAAA,CAAQ,MAAM,CAAA,eAAA,EAAkB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACzD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAM,cAAc,CAAC,MAAA,EAAQ,SAAS,KAAA,EAAO,IAAA,EAAM,KAAK,GAAG,CAAA;AAC3D,MAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG;AAC9C,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAC7C,QAAA,OAAA,CAAQ,MAAM,CAAA,yBAAA,CAA2B,CAAA;AACzC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,GAA+B,KAAA;AACnC,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,UAAA,GAAa,CAAC,QAAQ,KAAA,EAAO,GAAG,EAAE,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AAAA,IAChE;AAEA,IAAA,UAAA,CAAW,EAAE,CAAC,GAAG,GAAG,YAAY,CAAA;AAChC,IAAA,YAAA,CAAa,CAAA,IAAA,EAAO,GAAG,CAAA,GAAA,EAAM,UAAU,CAAA,CAAE,CAAA;AAAA,EAC3C,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,2BAA2B,CAAA,CACvC,MAAA,CAAO,CAAC,GAAA,KAAgB;AACvB,IAAA,MAAM,SAAS,SAAA,EAAU;AACzB,IAAA,MAAM,KAAA,GAAQ,OAAO,GAA0B,CAAA;AAE/C,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAE,CAAA;AACnC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,EACnB,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,QAAQ,OAAO,CAAA,CACf,YAAY,iCAAiC,CAAA,CAC7C,OAAO,MAAM;AACZ,IAAA,UAAA,CAAW;AAAA,MACT,MAAA,EAAQ,kCAAA;AAAA,MACR,MAAA,EAAQ,8BAAA;AAAA,MACR,YAAA,EAAc,OAAA;AAAA,MACd,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,YAAA,CAAa,iCAAiC,CAAA;AAAA,EAChD,CAAC,CAAA;AAEH,EAAA,SAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,+BAA+B,CAAA,CAC3C,OAAO,MAAM;AACZ,IAAA,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,YAAA,EAAc,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,kBAAA,EAAoB,CAAA;AAAA,EACvD,CAAC,CAAA;AAEH,EAAA,OAAO,SAAA;AACT;AAGA,SAASA,cAAa,KAAA,EAAqB;AACzC,EAAA,IAAI,gBAAe,EAAG;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAIJ,MAAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACzC,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,EAChC;AACF;ACjFA,SAAS,0BAAA,GAAqC;AAC5C,EAAA,MAAMK,YAAc,GAAA,CAAA,QAAA,EAAS;AAC7B,EAAA,MAAM,UAAa,GAAA,CAAA,OAAA,EAAQ;AAE3B,EAAA,IAAIA,cAAa,QAAA,EAAU;AACzB,IAAA,OAAY,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,qBAAA,EAAuB,UAAU,4BAA4B,CAAA;AAAA,EACpG,CAAA,MAAA,IAAWA,cAAa,OAAA,EAAS;AAC/B,IAAA,OAAY,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,UAAU,4BAA4B,CAAA;AAAA,EACxF,CAAA,MAAO;AAEL,IAAA,OAAY,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,4BAA4B,CAAA;AAAA,EAC7E;AACF;AAKA,SAAS,uBAAA,GAAkC;AACzC,EAAA,MAAM,UAAa,GAAA,CAAA,OAAA,EAAQ;AAC3B,EAAA,OAAY,KAAA,CAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC1C;AAKA,SAAS,eAAA,GAA0B;AACjC,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,IAAI,OAAO,QAAA,CAAS,WAAW,KAAK,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA,EAAG;AAChE,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,MAAA;AAAA,EACrC;AAEA,EAAA,OAAO,OAAA,CAAQ,IAAI,cAAA,IAAkB,sCAAA;AACvC;AAKA,SAAS,eAAkB,QAAA,EAA4B;AACrD,EAAA,IAAI;AACF,IAAA,IAAI,CAAIC,EAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,OAAA,GAAaA,EAAA,CAAA,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,eAAA,CAAgB,UAAkB,MAAA,EAAuB;AAChE,EAAA,MAAM,GAAA,GAAW,cAAQ,QAAQ,CAAA;AACjC,EAAA,IAAI,CAAIA,EAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,IAAGA,EAAA,CAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACvC;AACA,EAAGA,EAAA,CAAA,aAAA,CAAc,UAAU,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AACnE;AAgBA,SAAS,aAAa,OAAA,EAAuB;AAC3C,EAAA,IAAI,gBAAe,EAAG;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAIN,MAAAA,CAAM,MAAA,CAAO,QAAG,GAAG,OAAO,CAAA;AAAA,EACxC,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,EAC/B;AACF;AASO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,MAAM,SAAS,IAAIE,OAAAA,CAAQ,KAAK,CAAA,CAAE,YAAY,0CAA0C,CAAA;AAGxF,EAAA,MAAA,CACG,QAAQ,OAAO,CAAA,CACf,YAAY,6BAA6B,CAAA,CACzC,OAAO,MAAM;AACZ,IAAA,MAAM,SAAS,eAAA,EAAgB;AAE/B,IAAA,OAAA,CAAQ,IAAI,8CAAuC,CAAA;AACnD,IAAA,OAAA,CAAQ,IAAI,yDAAyD,CAAA;AACrE,IAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AAEzD,IAAA,OAAA,CAAQ,GAAA,CAAIF,MAAAA,CAAM,IAAA,CAAK,iBAAiB,CAAC,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,MAAAA,CAAM,IAAA,CAAK,MAAM,CAAC;AAAA,CAAI,CAAA;AAEvC,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAE1C,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,SAAA,CAAU,6CAA6C,CAAC,CAAA;AAC1E,IAAA,OAAA,CAAQ,IAAI,qEAA2D,CAAA;AACvE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiBA,MAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,MAAA,EAAQ,EAAE,CAAC,CAAC,CAAA,CAAE,CAAA;AACrE,IAAA,OAAA,CAAQ,IAAI,4DAA4D,CAAA;AAExE,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,SAAA,CAAU,sCAAsC,CAAC,CAAA;AACnE,IAAA,OAAA,CAAQ,IAAI,6DAA6D,CAAA;AAEzE,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,SAAA,CAAU,gBAAgB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AAEtE,IAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,IAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAC9D,IAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,IAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AAAA,EACzE,CAAC,CAAA;AAGH,EAAA,MAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,+BAA+B,EAC3C,MAAA,CAAO,mBAAA,EAAqB,qCAAA,EAAuC,gBAAgB,EACnF,MAAA,CAAO,QAAA,EAAU,oBAAoB,CAAA,CACrC,MAAA,CAAO,CAAC,OAAA,KAAY;AACnB,IAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AAEvB,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,WAAW,aAAA,EAAe;AAE5B,MAAA,MAAA,GAAS;AAAA,QACP,UAAA,EAAY;AAAA,UACV,aAAA,EAAe;AAAA,YACb,IAAA,EAAM,MAAA;AAAA,YACN,GAAA,EAAK;AAAA;AACP;AACF,OACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAA,GAAS;AAAA,QACP,UAAA,EAAY;AAAA,UACV,aAAA,EAAe;AAAA,YACb,OAAA,EAAS,KAAA;AAAA,YACT,MAAM,CAAC,YAAA,EAAc,OAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC;AAAA;AACjD;AACF,OACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,iCAA0B,CAAA;AACtC,MAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,MAAM;AAAA,CAAI,CAAA;AACjC,MAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAEnB,MAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,QAAA,MAAM,aAAa,0BAAA,EAA2B;AAC9C,QAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,UAAU;AAAA,CAAI,CAAA;AAC1C,QAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,MAAA,CAAO,0CAA0C,CAAC,CAAA;AACpE,QAAA,OAAA,CAAQ,IAAI,iDAAiD,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,MAAM,aAAa,uBAAA,EAAwB;AAC3C,QAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,UAAU;AAAA,CAAI,CAAA;AAAA,MAC5C;AAEA,MAAA,OAAA,CAAQ,IAAI,oDAAoD,CAAA;AAAA,IAClE;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,MAAA,CACG,QAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,qDAAqD,EACjE,MAAA,CAAO,mBAAA,EAAqB,2CAAA,EAA6C,MAAM,EAC/E,MAAA,CAAO,SAAA,EAAW,yCAAyC,CAAA,CAC3D,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,IAAA,MAAM,SAAS,eAAA,EAAgB;AAE/B,IAAA,OAAA,CAAQ,IAAI,6DAAsD,CAAA;AAElE,IAAA,MAAM,OAAA,GAAU,WAAW,MAAA,GAAS,CAAC,kBAAkB,aAAa,CAAA,GAAI,CAAC,MAAM,CAAA;AAC/E,IAAA,IAAI,YAAA,GAAe,KAAA;AACnB,IAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI;AACF,QAAA,IAAI,MAAM,gBAAA,EAAkB;AAC1B,UAAA,MAAM,aAAa,0BAAA,EAA2B;AAC9C,UAAA,MAAM,iBAAiB,cAAA,CAAoC,UAAU,KAAK,EAAE,UAAA,EAAY,EAAC,EAAE;AAG3F,UAAA,IAAI,cAAA,CAAe,UAAA,EAAY,aAAA,IAAiB,CAAC,QAAQ,KAAA,EAAO;AAC9D,YAAA,YAAA,CAAa,CAAA,6DAAA,CAA+D,CAAA;AAC5E,YAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,UAAU;AAAA,CAAI,CAAA;AACvC,YAAA,UAAA,GAAa,IAAA;AACb,YAAA;AAAA,UACF;AAGA,UAAA,cAAA,CAAe,UAAA,GAAa;AAAA,YAC1B,GAAG,cAAA,CAAe,UAAA;AAAA,YAClB,aAAA,EAAe;AAAA,cACb,OAAA,EAAS,KAAA;AAAA,cACT,MAAM,CAAC,YAAA,EAAc,OAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC;AAAA;AACjD,WACF;AAEA,UAAA,eAAA,CAAgB,YAAY,cAAc,CAAA;AAC1C,UAAA,YAAA,CAAa,CAAA,gCAAA,CAAkC,CAAA;AAC/C,UAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,UAAU;AAAA,CAAI,CAAA;AACvC,UAAA,YAAA,GAAe,IAAA;AAAA,QAEjB,CAAA,MAAA,IAAW,MAAM,aAAA,EAAe;AAC9B,UAAA,MAAM,aAAa,uBAAA,EAAwB;AAC3C,UAAA,MAAM,cAAA,GAAiB,cAAA,CAAiC,UAAU,CAAA,IAAK,EAAC;AAGxE,UAAA,IAAI,cAAA,CAAe,UAAA,EAAY,aAAA,IAAiB,CAAC,QAAQ,KAAA,EAAO;AAC9D,YAAA,YAAA,CAAa,CAAA,0DAAA,CAA4D,CAAA;AACzE,YAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,UAAU;AAAA,CAAI,CAAA;AACvC,YAAA,UAAA,GAAa,IAAA;AACb,YAAA;AAAA,UACF;AAGA,UAAA,cAAA,CAAe,UAAA,GAAa;AAAA,YAC1B,GAAG,cAAA,CAAe,UAAA;AAAA,YAClB,aAAA,EAAe;AAAA,cACb,IAAA,EAAM,MAAA;AAAA,cACN,GAAA,EAAK;AAAA;AACP,WACF;AAEA,UAAA,eAAA,CAAgB,YAAY,cAAc,CAAA;AAC1C,UAAA,YAAA,CAAa,CAAA,6BAAA,CAA+B,CAAA;AAC5C,UAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,UAAU;AAAA,CAAI,CAAA;AACvC,UAAA,YAAA,GAAe,IAAA;AAAA,QACjB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,UAAA,CAAW,CAAA,kBAAA,EAAqB,CAAC,CAAA,SAAA,EAAY,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,MACrG;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAIA,MAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACrC,MAAA,OAAA,CAAQ,IAAI,iDAAiD,CAAA;AAC7D,MAAA,OAAA,CAAQ,IAAI,2EAA2E,CAAA;AACvF,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB,WAAW,UAAA,EAAY;AACrB,MAAA,OAAA,CAAQ,IAAI,8DAA8D,CAAA;AAAA,IAC5E;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,MAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,0DAA0D,CAAA,CACtE,MAAA,CAAO,mBAAA,EAAqB,2CAAA,EAA6C,MAAM,CAAA,CAC/E,MAAA,CAAO,CAAC,OAAA,KAAY;AACnB,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,IAAA,MAAM,OAAA,GAAU,WAAW,MAAA,GAAS,CAAC,kBAAkB,aAAa,CAAA,GAAI,CAAC,MAAM,CAAA;AAE/E,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,UAAUC,IAAAA,CAAI,CAAA,yBAAA,EAA4B,CAAC,CAAA,GAAA,CAAK,EAAE,KAAA,EAAM;AAE9D,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,CAAA,KAAM,gBAAA,GAAmB,0BAAA,KAA+B,uBAAA,EAAwB;AAEnG,QAAA,IAAI,CAAIK,EAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,GAAA,EAAM,CAAC,CAAA,cAAA,CAAgB,CAAA;AACpC,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,eAAuD,UAAU,CAAA;AAChF,QAAA,IAAI,CAAC,MAAA,EAAQ,UAAA,EAAY,aAAA,EAAe;AACtC,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,CAAC,CAAA,CAAA,CAAG,CAAA;AACpD,UAAA;AAAA,QACF;AAEA,QAAA,OAAO,OAAO,UAAA,CAAW,aAAA;AACzB,QAAA,eAAA,CAAgB,YAAY,MAAM,CAAA;AAClC,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAE,CAAA;AAAA,MACrC,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iBAAA,EAAoB,CAAC,CAAA,OAAA,CAAS,CAAA;AAC3C,QAAA,UAAA,CAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAAA,MACjE;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,YAAA,CAAa,wDAAwD,CAAA;AAAA,EACvE,CAAC,CAAA;AAGH,EAAA,MAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,yBAAyB,CAAA,CACrC,OAAO,YAAY;AAClB,IAAA,MAAM,OAAA,GAAUL,IAAAA,CAAI,wBAAwB,CAAA,CAAE,KAAA,EAAM;AAEpD,IAAA,MAAM,MAAA,GAAS,eAAA,EAAgB,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAEnD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,OAAA,CAAS,CAAA;AAE/C,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,OAAA,CAAQ,QAAQ,uBAAuB,CAAA;AACvC,QAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAC5B,QAAA,KAAA,CAAM,IAAI,CAAA;AAGV,QAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAChC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iBAAA,EAAoB,MAAM,CAAA,cAAA,CAAgB,CAAA;AACtD,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,MAAM,CAAA,UAAA,CAAY,CAAA;AAC1C,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,MAAM,CAAA,qCAAA,CAAuC,CAAA;AAAA,MAC7F,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MACvD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAK,iCAAiC,CAAA;AAC9C,MAAA,UAAA,CAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA;AAAA,IACjE;AAAA,EACF,CAAC,CAAA;AAGH,EAAA,MAAA,CACG,QAAQ,OAAO,CAAA,CACf,YAAY,0BAA0B,CAAA,CACtC,OAAO,MAAM;AACZ,IAAA,OAAA,CAAQ,IAAI,mCAA4B,CAAA;AAExC,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO;AAAA,QAC1B,EAAE,IAAA,EAAM,0BAAA,EAA4B,IAAA,EAAM,qBAAA,EAAsB;AAAA,QAChE,EAAE,IAAA,EAAM,2BAAA,EAA6B,IAAA,EAAM,sBAAA,EAAuB;AAAA,QAClE,EAAE,IAAA,EAAM,2BAAA,EAA6B,IAAA,EAAM,sBAAA,EAAuB;AAAA,QAClE,EAAE,IAAA,EAAM,8BAAA,EAAgC,IAAA,EAAM,gBAAA,EAAiB;AAAA,QAC/D,EAAE,IAAA,EAAM,6BAAA,EAA+B,IAAA,EAAM,sBAAA,EAAuB;AAAA,QACpE,EAAE,IAAA,EAAM,gCAAA,EAAkC,IAAA,EAAM,iBAAA,EAAkB;AAAA,QAClE,EAAE,IAAA,EAAM,4BAAA,EAA8B,IAAA,EAAM,cAAA,EAAe;AAAA,QAC3D,EAAE,IAAA,EAAM,2BAAA,EAA6B,IAAA,EAAM,YAAA,EAAa;AAAA,QACxD,EAAE,IAAA,EAAM,4BAAA,EAA8B,IAAA,EAAM,cAAA,EAAe;AAAA,QAC3D,EAAE,IAAA,EAAM,iCAAA,EAAmC,IAAA,EAAM,mBAAA;AAAoB,OACvE,EAAC;AAAA,MACD,EAAE,QAAA,EAAU,cAAA,EAAgB,KAAA,EAAO;AAAA,QACjC,EAAE,IAAA,EAAM,sBAAA,EAAwB,IAAA,EAAM,mBAAA,EAAoB;AAAA,QAC1D,EAAE,IAAA,EAAM,yBAAA,EAA2B,IAAA,EAAM,oBAAA,EAAqB;AAAA,QAC9D,EAAE,IAAA,EAAM,2BAAA,EAA6B,IAAA,EAAM,qBAAA,EAAsB;AAAA,QACjE,EAAE,IAAA,EAAM,6BAAA,EAA+B,IAAA,EAAM,eAAA,EAAgB;AAAA,QAC7D,EAAE,IAAA,EAAM,+BAAA,EAAiC,IAAA,EAAM,gBAAA,EAAiB;AAAA,QAChE,EAAE,IAAA,EAAM,4BAAA,EAA8B,IAAA,EAAM,cAAA;AAAe,OAC7D,EAAC;AAAA,MACD,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO;AAAA,QAC5B,EAAE,IAAA,EAAM,6BAAA,EAA+B,IAAA,EAAM,WAAA,EAAY;AAAA,QACzD,EAAE,IAAA,EAAM,gCAAA,EAAkC,IAAA,EAAM,eAAA,EAAgB;AAAA,QAChE,EAAE,IAAA,EAAM,4BAAA,EAA8B,IAAA,EAAM,kBAAA;AAAmB,OACjE;AAAC,KACH;AAEA,IAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAA,CAAA,CAAG,CAAA;AACnC,MAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,IACd;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAO,MAAA;AACT;;;AC5ZA,UAAA,EAAW;AAKJ,SAAS,aAAA,GAAyB;AACvC,EAAA,MAAMM,QAAAA,GAAU,IAAIL,OAAAA,EAAQ;AAE5B,EAAAK,QAAAA,CACG,KAAK,eAAe,CAAA,CACpB,YAAY,4DAA4D,CAAA,CACxE,QAAQ,OAAO,CAAA;AAGlB,EAAAA,QAAAA,CAAQ,UAAA,CAAW,kBAAA,EAAoB,CAAA;AACvC,EAAAA,QAAAA,CAAQ,UAAA,CAAW,mBAAA,EAAqB,CAAA;AACxC,EAAAA,QAAAA,CAAQ,UAAA,CAAW,mBAAA,EAAqB,CAAA;AACxC,EAAAA,QAAAA,CAAQ,UAAA,CAAW,mBAAA,EAAqB,CAAA;AACxC,EAAAA,QAAAA,CAAQ,UAAA,CAAW,iBAAA,EAAmB,CAAA;AAGtC,EAAAA,QAAAA,CAAQ,UAAA,CAAW,kBAAA,EAAoB,CAAA;AAGvC,EAAAA,QAAAA,CAAQ,UAAA,CAAW,mBAAA,EAAqB,CAAA;AAGxC,EAAAA,QAAAA,CAAQ,UAAA,CAAW,gBAAA,EAAkB,CAAA;AAErC,EAAA,OAAOA,QAAAA;AACT;;;ACxCA,IAAM,UAAU,aAAA,EAAc;AAC9B,OAAA,CAAQ,KAAA,CAAM,QAAQ,IAAI,CAAA","file":"bin.js","sourcesContent":["/**\n * CLI Configuration\n *\n * Manages CLI configuration settings including API URLs and output preferences.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport type { CliConfig, OutputFormat, StoredCredentials } from './types';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst CONFIG_DIR = path.join(os.homedir(), '.transactional');\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json');\n\nconst DEFAULT_CONFIG: CliConfig = {\n apiUrl: 'https://api.usetransactional.com',\n webUrl: 'https://usetransactional.com',\n outputFormat: 'table',\n color: true,\n};\n\n// In-memory state\nlet currentConfig: CliConfig = { ...DEFAULT_CONFIG };\nlet currentCredentials: StoredCredentials | null = null;\n\n// =============================================================================\n// DIRECTORY MANAGEMENT\n// =============================================================================\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n// =============================================================================\n// CONFIG FILE\n// =============================================================================\n\n/**\n * Load configuration from file\n */\nexport function loadConfig(): CliConfig {\n ensureConfigDir();\n\n if (fs.existsSync(CONFIG_FILE)) {\n try {\n const content = fs.readFileSync(CONFIG_FILE, 'utf-8');\n const loaded = JSON.parse(content) as Partial<CliConfig>;\n currentConfig = { ...DEFAULT_CONFIG, ...loaded };\n } catch {\n currentConfig = { ...DEFAULT_CONFIG };\n }\n } else {\n currentConfig = { ...DEFAULT_CONFIG };\n }\n\n // Apply environment overrides\n if (process.env.TRANSACTIONAL_API_URL) {\n currentConfig.apiUrl = process.env.TRANSACTIONAL_API_URL;\n }\n if (process.env.TRANSACTIONAL_WEB_URL) {\n currentConfig.webUrl = process.env.TRANSACTIONAL_WEB_URL;\n }\n if (process.env.NO_COLOR || process.env.TRANSACTIONAL_NO_COLOR) {\n currentConfig.color = false;\n }\n\n return currentConfig;\n}\n\n/**\n * Save configuration to file\n */\nexport function saveConfig(config: Partial<CliConfig>): void {\n ensureConfigDir();\n currentConfig = { ...currentConfig, ...config };\n\n const { apiUrl, webUrl, outputFormat, color } = currentConfig;\n fs.writeFileSync(CONFIG_FILE, JSON.stringify({ apiUrl, webUrl, outputFormat, color }, null, 2), {\n mode: 0o600,\n });\n}\n\n/**\n * Get the current configuration\n */\nexport function getConfig(): CliConfig {\n return currentConfig;\n}\n\n/**\n * Get the API URL\n */\nexport function getApiUrl(): string {\n return currentConfig.apiUrl;\n}\n\n/**\n * Get the Web URL\n */\nexport function getWebUrl(): string {\n return currentConfig.webUrl;\n}\n\n/**\n * Get the output format\n */\nexport function getOutputFormat(): OutputFormat {\n return currentConfig.outputFormat;\n}\n\n/**\n * Check if color output is enabled\n */\nexport function isColorEnabled(): boolean {\n return currentConfig.color;\n}\n\n// =============================================================================\n// CREDENTIALS FILE\n// =============================================================================\n\n/**\n * Load credentials from file\n */\nexport function loadCredentials(): StoredCredentials {\n ensureConfigDir();\n\n if (currentCredentials) {\n return currentCredentials;\n }\n\n if (fs.existsSync(CREDENTIALS_FILE)) {\n try {\n const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');\n const loaded = JSON.parse(content) as StoredCredentials;\n\n // Migrate from version 1 (per-org tokens) to version 2 (user token)\n if (loaded.version === 1) {\n // Clear old per-org tokens - user needs to re-login\n currentCredentials = {\n version: 2,\n user: loaded.user,\n currentOrganization: loaded.currentOrganization,\n };\n saveCredentials(currentCredentials);\n } else {\n currentCredentials = loaded;\n }\n } catch {\n currentCredentials = {\n version: 2,\n };\n }\n } else {\n currentCredentials = {\n version: 2,\n };\n }\n\n return currentCredentials;\n}\n\n/**\n * Save credentials to file\n */\nexport function saveCredentials(credentials: StoredCredentials): void {\n ensureConfigDir();\n currentCredentials = credentials;\n fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), {\n mode: 0o600,\n });\n}\n\n/**\n * Get the current organization slug\n */\nexport function getCurrentOrganization(): string | undefined {\n const credentials = loadCredentials();\n return credentials.currentOrganization;\n}\n\n/**\n * Set the current organization\n */\nexport function setCurrentOrganization(orgSlug: string): void {\n const credentials = loadCredentials();\n credentials.currentOrganization = orgSlug;\n saveCredentials(credentials);\n}\n\n/**\n * Get the stored user token\n */\nexport function getToken(): string | undefined {\n const credentials = loadCredentials();\n\n // Check if token exists\n if (!credentials.token) {\n return undefined;\n }\n\n // Check if token is expired\n if (credentials.expiresAt && new Date(credentials.expiresAt) < new Date()) {\n return undefined;\n }\n\n return credentials.token;\n}\n\n/**\n * Store the user token\n */\nexport function storeToken(token: string, expiresInSeconds: number): void {\n const credentials = loadCredentials();\n credentials.token = token;\n credentials.expiresAt = new Date(Date.now() + expiresInSeconds * 1000).toISOString();\n saveCredentials(credentials);\n}\n\n/**\n * Check if user is logged in\n */\nexport function isLoggedIn(): boolean {\n return !!getToken();\n}\n\n/**\n * Clear all credentials (logout)\n */\nexport function clearCredentials(): void {\n ensureConfigDir();\n currentCredentials = {\n version: 2,\n };\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n }\n}\n\n/**\n * Store user info\n */\nexport function storeUserInfo(user: { id: string; email: string; name?: string }): void {\n const credentials = loadCredentials();\n credentials.user = user;\n saveCredentials(credentials);\n}\n\n/**\n * Get stored user info\n */\nexport function getUserInfo(): { id: string; email: string; name?: string } | undefined {\n const credentials = loadCredentials();\n return credentials.user;\n}\n\n/**\n * Switch to a different organization (just updates local selection)\n */\nexport function switchOrganization(orgSlug: string): void {\n setCurrentOrganization(orgSlug);\n}\n\n/**\n * Get config directory path\n */\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\n/**\n * Get credentials file path\n */\nexport function getCredentialsFile(): string {\n return CREDENTIALS_FILE;\n}\n\n/**\n * Initialize config (call on CLI start)\n */\nexport function initConfig(): CliConfig {\n return loadConfig();\n}\n","/**\n * HTTP API Client\n *\n * Self-contained HTTP client for making API requests.\n * Uses native fetch and requires no external dependencies.\n */\n\nimport { getApiUrl, getToken, getCurrentOrganization } from './config';\nimport type { CommandResult, ApiErrorResponse } from './types';\n\n// =============================================================================\n// API CLIENT CLASS\n// =============================================================================\n\n/**\n * HTTP API client for making authenticated requests\n * All API requests go to the Hono API server (apiUrl)\n */\nexport class ApiClient {\n private apiUrl: string;\n private token: string | undefined;\n private orgSlug: string | undefined;\n\n constructor(orgSlug?: string) {\n this.apiUrl = getApiUrl();\n this.token = getToken();\n this.orgSlug = orgSlug || getCurrentOrganization();\n }\n\n /**\n * Get headers for API requests\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'transactional-cli/0.1.0',\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n // Include organization context in headers\n if (this.orgSlug) {\n headers['X-Organization-Slug'] = this.orgSlug;\n }\n\n return headers;\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const url = new URL(path, this.apiUrl);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Make an HTTP request\n */\n private async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, unknown>;\n }\n ): Promise<CommandResult<T>> {\n try {\n const url = this.buildUrl(path, options?.params);\n const init: RequestInit = {\n method,\n headers: this.getHeaders(),\n };\n\n if (options?.body) {\n init.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, init);\n\n // Handle no content responses\n if (response.status === 204) {\n return { success: true };\n }\n\n // Parse response body\n let data: unknown;\n const contentType = response.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n\n // Handle error responses\n if (!response.ok) {\n const errorResponse = data as ApiErrorResponse;\n return {\n success: false,\n error: {\n code: errorResponse.error?.code || `HTTP_${response.status}`,\n message: errorResponse.error?.message || response.statusText,\n details: errorResponse.error?.details,\n },\n };\n }\n\n // Handle successful responses\n // API returns { data: T } or just T depending on endpoint\n if (data && typeof data === 'object' && 'data' in data) {\n return { success: true, data: (data as { data: T }).data };\n }\n\n return { success: true, data: data as T };\n } catch (err) {\n // Handle network errors\n if (err instanceof Error) {\n if (err.message.includes('ECONNREFUSED')) {\n return {\n success: false,\n error: {\n code: 'CONNECTION_REFUSED',\n message: `Cannot connect to API server. Check your network connection.`,\n },\n };\n }\n\n return {\n success: false,\n error: {\n code: 'NETWORK_ERROR',\n message: err.message,\n },\n };\n }\n\n return {\n success: false,\n error: {\n code: 'UNKNOWN_ERROR',\n message: 'An unknown error occurred',\n },\n };\n }\n }\n\n /**\n * GET request\n */\n async get<T>(path: string, params?: Record<string, unknown>): Promise<CommandResult<T>> {\n return this.request<T>('GET', path, { params });\n }\n\n /**\n * POST request\n */\n async post<T>(path: string, body?: unknown): Promise<CommandResult<T>> {\n return this.request<T>('POST', path, { body });\n }\n\n /**\n * PUT request\n */\n async put<T>(path: string, body?: unknown): Promise<CommandResult<T>> {\n return this.request<T>('PUT', path, { body });\n }\n\n /**\n * PATCH request\n */\n async patch<T>(path: string, body?: unknown): Promise<CommandResult<T>> {\n return this.request<T>('PATCH', path, { body });\n }\n\n /**\n * DELETE request\n */\n async delete<T = void>(path: string): Promise<CommandResult<T>> {\n return this.request<T>('DELETE', path);\n }\n}\n\n/**\n * Get an API client for the current or specified organization\n */\nexport function getApiClient(orgSlug?: string): ApiClient {\n return new ApiClient(orgSlug);\n}\n\n/**\n * Check if the user is authenticated for API calls\n */\nexport function isAuthenticated(): boolean {\n return !!getToken();\n}\n","/**\n * Authentication\n *\n * Handles device authorization flow for CLI login.\n * No local server needed - CLI polls the API until user authorizes.\n */\n\nimport open from 'open';\nimport {\n getApiUrl,\n getWebUrl,\n storeToken,\n storeUserInfo,\n clearCredentials,\n getCurrentOrganization,\n setCurrentOrganization,\n} from './config';\nimport { getApiClient } from './client';\nimport type { CommandResult, WhoamiResponse, OrganizationInfo } from './types';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n userCode: string;\n expiresIn: number;\n interval: number;\n}\n\ninterface TokenResponse {\n token: string;\n tokenType: string;\n expiresIn: number;\n user: {\n id: string;\n name?: string;\n email: string;\n };\n organizations: Array<{\n id: number;\n role: string;\n }>;\n}\n\ninterface TokenErrorResponse {\n error: string;\n error_description: string;\n}\n\n// =============================================================================\n// DEVICE AUTHORIZATION FLOW\n// =============================================================================\n\n/**\n * Request a device code from the API\n * Uses apiUrl since device-code endpoint is on the Hono API server\n */\nasync function requestDeviceCode(\n sessionType: 'CLI' | 'MCP' = 'CLI'\n): Promise<DeviceCodeResponse> {\n const apiUrl = getApiUrl();\n\n const response = await fetch(`${apiUrl}/cli/device-code`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'transactional-cli/0.1.0',\n },\n body: JSON.stringify({\n sessionType,\n clientInfo: {\n deviceName: process.env.HOSTNAME || 'Unknown',\n osName: process.platform,\n osVersion: process.version,\n hostname: process.env.HOSTNAME || 'Unknown',\n clientVersion: '0.1.0',\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string | { code?: string; message?: string }\n };\n const errorMsg = typeof errorData.error === 'string'\n ? errorData.error\n : errorData.error?.message || 'Failed to get device code';\n throw new Error(errorMsg);\n }\n\n return response.json() as Promise<DeviceCodeResponse>;\n}\n\n/**\n * Poll for token using device code\n * Uses apiUrl since token endpoint is on the Hono API server\n */\nasync function pollForToken(\n deviceCode: string,\n interval: number,\n expiresIn: number,\n onPoll?: () => void\n): Promise<TokenResponse> {\n const apiUrl = getApiUrl();\n const startTime = Date.now();\n const expiresAt = startTime + expiresIn * 1000;\n\n while (Date.now() < expiresAt) {\n if (onPoll) onPoll();\n\n const response = await fetch(`${apiUrl}/cli/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'transactional-cli/0.1.0',\n },\n body: JSON.stringify({ deviceCode }),\n });\n\n if (response.ok) {\n return response.json() as Promise<TokenResponse>;\n }\n\n const errorData = (await response.json()) as TokenErrorResponse;\n\n // Check error type\n switch (errorData.error) {\n case 'authorization_pending':\n // User hasn't authorized yet, keep polling\n break;\n case 'slow_down':\n // Polling too fast, increase interval\n interval = Math.min(interval + 5, 60);\n break;\n case 'expired_token':\n throw new Error('Login timed out. Please try again.');\n case 'access_denied':\n throw new Error('Authorization denied.');\n default:\n throw new Error(errorData.error_description || 'Login failed');\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, interval * 1000));\n }\n\n throw new Error('Login timed out. Please try again.');\n}\n\n/**\n * Perform device authorization login flow\n */\nexport async function login(\n sessionType: 'CLI' | 'MCP' = 'CLI',\n callbacks?: {\n onDeviceCode?: (userCode: string, verificationUrl: string) => void;\n onBrowserOpen?: () => void;\n onPolling?: () => void;\n }\n): Promise<\n CommandResult<{\n user: { id: string; email: string; name?: string };\n organizations: Array<{ id: number; role: string }>;\n }>\n> {\n try {\n // Step 1: Request device code\n const deviceCodeResponse = await requestDeviceCode(sessionType);\n const { deviceCode, userCode, expiresIn, interval } = deviceCodeResponse;\n\n // Build verification URL using CLI's configured webUrl\n const webUrl = getWebUrl();\n const verificationUrl = `${webUrl}/cli/authorize?user_code=${userCode}`;\n\n // Notify about the user code\n if (callbacks?.onDeviceCode) {\n callbacks.onDeviceCode(userCode, verificationUrl);\n }\n\n // Step 2: Open browser\n if (callbacks?.onBrowserOpen) {\n callbacks.onBrowserOpen();\n }\n await open(verificationUrl);\n\n // Step 3: Poll for token\n const tokenResponse = await pollForToken(\n deviceCode,\n interval,\n expiresIn,\n callbacks?.onPolling\n );\n\n // Step 4: Store credentials\n storeToken(tokenResponse.token, tokenResponse.expiresIn);\n storeUserInfo({\n id: tokenResponse.user.id,\n email: tokenResponse.user.email,\n name: tokenResponse.user.name,\n });\n\n return {\n success: true,\n data: {\n user: tokenResponse.user,\n organizations: tokenResponse.organizations,\n },\n };\n } catch (err) {\n return {\n success: false,\n error: {\n code: 'LOGIN_FAILED',\n message: err instanceof Error ? err.message : 'Login failed',\n },\n };\n }\n}\n\n/**\n * Logout - clear all credentials\n */\nexport function logout(): void {\n clearCredentials();\n}\n\n/**\n * Get current user and organization info (whoami)\n */\nexport async function whoami(orgSlug?: string): Promise<CommandResult<WhoamiResponse>> {\n const client = getApiClient(orgSlug);\n return client.get<WhoamiResponse>('/cli/whoami');\n}\n\n/**\n * List all organizations the user has access to\n */\nexport async function listOrganizations(): Promise<CommandResult<OrganizationInfo[]>> {\n const client = getApiClient();\n return client.get<OrganizationInfo[]>('/cli/organizations');\n}\n\n/**\n * Set the current organization for CLI commands\n */\nexport function useOrganization(orgSlug: string): void {\n setCurrentOrganization(orgSlug);\n}\n\n/**\n * Get the current organization slug\n */\nexport function getOrganization(): string | undefined {\n return getCurrentOrganization();\n}\n","/**\n * CLI Output Formatting\n *\n * Functions for formatting and displaying CLI output.\n */\n\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport yaml from 'yaml';\nimport { getOutputFormat, isColorEnabled } from '../lib/config';\nimport type { OutputFormat } from '../lib/types';\n\n/**\n * Format data based on the output format setting\n */\nexport function formatOutput(data: unknown, format?: OutputFormat): string {\n const outputFormat = format || getOutputFormat();\n\n switch (outputFormat) {\n case 'json':\n return JSON.stringify(data, null, 2);\n case 'yaml':\n return yaml.stringify(data);\n case 'table':\n default:\n return formatAsTable(data);\n }\n}\n\n/**\n * Format data as a table\n */\nfunction formatAsTable(data: unknown): string {\n if (!data) {\n return 'No data';\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return 'No results';\n }\n\n // Get columns from first item\n const columns = Object.keys(data[0]);\n const table = new Table({\n head: columns.map((c) => (isColorEnabled() ? chalk.bold(c) : c)),\n style: {\n head: isColorEnabled() ? ['cyan'] : [],\n border: isColorEnabled() ? ['gray'] : [],\n },\n });\n\n for (const row of data) {\n table.push(columns.map((col) => formatValue((row as Record<string, unknown>)[col])));\n }\n\n return table.toString();\n }\n\n if (typeof data === 'object') {\n const table = new Table({\n style: {\n border: isColorEnabled() ? ['gray'] : [],\n },\n });\n\n for (const [key, value] of Object.entries(data)) {\n const formattedKey = isColorEnabled() ? chalk.bold(key) : key;\n table.push({ [formattedKey]: formatValue(value) });\n }\n\n return table.toString();\n }\n\n return String(data);\n}\n\n/**\n * Format a single value for table display\n */\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return isColorEnabled() ? chalk.gray('-') : '-';\n }\n\n if (typeof value === 'boolean') {\n if (isColorEnabled()) {\n return value ? chalk.green('Yes') : chalk.red('No');\n }\n return value ? 'Yes' : 'No';\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value)) {\n return value.join(', ');\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n\n/**\n * Print success message\n */\nexport function printSuccess(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.green('✓'), message);\n } else {\n console.log('[OK]', message);\n }\n}\n\n/**\n * Print error message\n */\nexport function printError(message: string, details?: string): void {\n if (isColorEnabled()) {\n console.error(chalk.red('✗'), message);\n if (details) {\n console.error(chalk.gray(details));\n }\n } else {\n console.error('[ERROR]', message);\n if (details) {\n console.error(details);\n }\n }\n}\n\n/**\n * Print warning message\n */\nexport function printWarning(message: string): void {\n if (isColorEnabled()) {\n console.warn(chalk.yellow('⚠'), message);\n } else {\n console.warn('[WARN]', message);\n }\n}\n\n/**\n * Print info message\n */\nexport function printInfo(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.blue('ℹ'), message);\n } else {\n console.log('[INFO]', message);\n }\n}\n\n/**\n * Print a heading\n */\nexport function printHeading(title: string): void {\n if (isColorEnabled()) {\n console.log();\n console.log(chalk.bold.underline(title));\n console.log();\n } else {\n console.log();\n console.log(`=== ${title} ===`);\n console.log();\n }\n}\n\n/**\n * Print a key-value pair\n */\nexport function printKeyValue(key: string, value: unknown): void {\n const formattedValue = formatValue(value);\n if (isColorEnabled()) {\n console.log(`${chalk.gray(key + ':')} ${formattedValue}`);\n } else {\n console.log(`${key}: ${formattedValue}`);\n }\n}\n\n/**\n * Print data with automatic format detection\n */\nexport function print(data: unknown, format?: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n","/**\n * CLI Prompts\n *\n * Interactive prompts for CLI user input.\n */\n\nimport inquirer from 'inquirer';\nimport type { OrganizationInfo } from '../lib/types';\n\n/**\n * Prompt user to select an organization\n */\nexport async function selectOrganization(organizations: OrganizationInfo[]): Promise<string> {\n const { orgSlug } = await inquirer.prompt<{ orgSlug: string }>([\n {\n type: 'list',\n name: 'orgSlug',\n message: 'Select an organization:',\n choices: organizations.map((org) => ({\n name: `${org.name} (${org.slug}) - ${org.role}`,\n value: org.slug,\n })),\n },\n ]);\n\n return orgSlug;\n}\n\n/**\n * Prompt for confirmation\n */\nexport async function confirm(message: string, defaultValue = false): Promise<boolean> {\n const { confirmed } = await inquirer.prompt<{ confirmed: boolean }>([\n {\n type: 'confirm',\n name: 'confirmed',\n message,\n default: defaultValue,\n },\n ]);\n\n return confirmed;\n}\n\n/**\n * Prompt for text input\n */\nexport async function input(\n message: string,\n options?: {\n default?: string;\n required?: boolean;\n validate?: (value: string) => boolean | string;\n }\n): Promise<string> {\n const { value } = await inquirer.prompt<{ value: string }>([\n {\n type: 'input',\n name: 'value',\n message,\n default: options?.default,\n validate: (inp: string) => {\n if (options?.required && !inp.trim()) {\n return 'This field is required';\n }\n if (options?.validate) {\n return options.validate(inp);\n }\n return true;\n },\n },\n ]);\n\n return value;\n}\n\n/**\n * Prompt for password/secret input\n */\nexport async function password(\n message: string,\n options?: {\n required?: boolean;\n validate?: (value: string) => boolean | string;\n }\n): Promise<string> {\n const { value } = await inquirer.prompt<{ value: string }>([\n {\n type: 'password',\n name: 'value',\n message,\n mask: '*',\n validate: (inp: string) => {\n if (options?.required && !inp.trim()) {\n return 'This field is required';\n }\n if (options?.validate) {\n return options.validate(inp);\n }\n return true;\n },\n },\n ]);\n\n return value;\n}\n\n/**\n * Prompt for selection from a list\n */\nexport async function select<T extends string>(\n message: string,\n choices: { name: string; value: T }[]\n): Promise<T> {\n const { value } = await inquirer.prompt<{ value: T }>([\n {\n type: 'list',\n name: 'value',\n message,\n choices,\n },\n ]);\n\n return value;\n}\n\n/**\n * Prompt for multiple selection from a list\n */\nexport async function multiSelect<T extends string>(\n message: string,\n choices: { name: string; value: T; checked?: boolean }[]\n): Promise<T[]> {\n const { values } = await inquirer.prompt<{ values: T[] }>([\n {\n type: 'checkbox',\n name: 'values',\n message,\n choices,\n },\n ]);\n\n return values;\n}\n\n/**\n * Prompt for email input\n */\nexport async function emailInput(\n message: string,\n options?: { default?: string; required?: boolean }\n): Promise<string> {\n return input(message, {\n ...options,\n validate: (value) => {\n if (!value && !options?.required) {\n return true;\n }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return 'Please enter a valid email address';\n }\n return true;\n },\n });\n}\n\n/**\n * Prompt for editor input (opens editor for multiline content)\n */\nexport async function editor(\n message: string,\n options?: { default?: string }\n): Promise<string> {\n const { value } = await inquirer.prompt<{ value: string }>([\n {\n type: 'editor',\n name: 'value',\n message,\n default: options?.default,\n },\n ]);\n\n return value;\n}\n","/**\n * Auth Commands\n *\n * Commands for authentication: login, logout, whoami, switch org.\n */\n\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport {\n login,\n logout,\n whoami,\n listOrganizations,\n isLoggedIn,\n getCurrentOrganization,\n switchOrganization,\n isColorEnabled,\n} from '../lib';\nimport { printSuccess, printError, printKeyValue, print } from '../output';\nimport { selectOrganization } from '../prompts';\n\n/**\n * Create the login command\n */\nexport function createLoginCommand(): Command {\n return new Command('login')\n .description('Authenticate with Transactional')\n .option('--mcp', 'Login for MCP server use')\n .option('-f, --force', 'Force new login even if already logged in')\n .action(async (options) => {\n if (isLoggedIn() && !options.force) {\n const currentOrg = getCurrentOrganization();\n if (currentOrg) {\n printInfo(`Already logged in. Current organization: ${currentOrg}`);\n } else {\n printInfo('Already logged in. Use \"transactional org use <slug>\" to select an organization.');\n }\n printInfo('Use \"transactional login --force\" to get a new token.');\n return;\n }\n\n const spinner = ora();\n\n const result = await login(options.mcp ? 'MCP' : 'CLI', {\n onDeviceCode: (userCode, verificationUrl) => {\n console.log();\n console.log(chalk.bold('To complete authentication:'));\n console.log();\n console.log(` 1. Visit: ${chalk.cyan(verificationUrl)}`);\n console.log(` 2. Verify this code matches: ${chalk.bold.yellow(formatUserCode(userCode))}`);\n console.log(` 3. Click \"Authorize\" in your browser`);\n console.log();\n },\n onBrowserOpen: () => {\n spinner.start('Opening browser...');\n spinner.succeed('Browser opened');\n spinner.start('Waiting for authorization...');\n },\n onPolling: () => {\n // Could add a dot or similar to show activity\n },\n });\n\n if (!result.success || !result.data) {\n spinner.fail('Login failed');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Authorization received!');\n console.log();\n printSuccess('Login successful!');\n console.log();\n printKeyValue('User', result.data.user.email);\n\n // Prompt to select an organization\n if (result.data.organizations.length > 0) {\n console.log();\n printInfo(`You have access to ${result.data.organizations.length} organization(s).`);\n printInfo('Use \"transactional org list\" to see them, or \"transactional org use <slug>\" to select one.');\n }\n });\n}\n\n/**\n * Format user code for display (XXXX-XXXX)\n */\nfunction formatUserCode(code: string): string {\n if (code.length === 8) {\n return `${code.slice(0, 4)}-${code.slice(4)}`;\n }\n return code;\n}\n\n/**\n * Create the logout command\n */\nexport function createLogoutCommand(): Command {\n return new Command('logout')\n .description('Log out from all organizations')\n .action(async () => {\n if (!isLoggedIn()) {\n printInfo('You are not logged in.');\n return;\n }\n\n logout();\n printSuccess('Logged out from all organizations.');\n });\n}\n\n/**\n * Create the whoami command\n */\nexport function createWhoamiCommand(): Command {\n return new Command('whoami')\n .description('Show current user and organization info')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n\n const result = await whoami(options.org);\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to get user info');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n const { user, organization, session } = result.data;\n console.log();\n printHeading('User');\n printKeyValue('ID', user.id);\n printKeyValue('Email', user.email);\n if (user.name) printKeyValue('Name', user.name);\n\n console.log();\n printHeading('Organization');\n if (organization) {\n printKeyValue('ID', String(organization.id));\n printKeyValue('Name', organization.name);\n printKeyValue('Slug', organization.slug);\n printKeyValue('Role', organization.role);\n } else {\n printInfo('No organization selected. Use \"transactional org use <slug>\" to select one.');\n }\n\n console.log();\n printHeading('Session');\n printKeyValue('ID', String(session.id));\n printKeyValue('Type', session.type);\n printKeyValue('Created', session.createdAt);\n if (session.expiresAt) printKeyValue('Expires', session.expiresAt);\n }\n });\n}\n\n/**\n * Create the switch command (alias for org use)\n */\nexport function createSwitchCommand(): Command {\n return new Command('switch')\n .description('Switch to a different organization (alias for \"org use\")')\n .argument('[slug]', 'Organization slug to switch to')\n .action(async (slug?: string) => {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n\n // Fetch organizations from API\n const spinner = ora('Fetching organizations...').start();\n const orgsResult = await listOrganizations();\n\n if (!orgsResult.success || !orgsResult.data) {\n spinner.fail('Failed to fetch organizations');\n printError(orgsResult.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n const orgs = orgsResult.data;\n spinner.stop();\n\n if (orgs.length === 0) {\n printError('No organizations found.');\n process.exit(1);\n }\n\n let targetSlug = slug;\n\n if (!targetSlug) {\n // Show organization picker\n if (orgs.length === 1) {\n targetSlug = orgs[0].slug;\n printInfo(`Only one organization available: ${targetSlug}`);\n } else {\n targetSlug = await selectOrganization(orgs);\n }\n }\n\n // Verify the slug is valid\n const validOrg = orgs.find((o) => o.slug === targetSlug);\n if (!validOrg) {\n printError(`Organization \"${targetSlug}\" not found.`);\n printInfo('Available organizations: ' + orgs.map((o) => o.slug).join(', '));\n process.exit(1);\n }\n\n switchOrganization(targetSlug);\n printSuccess(`Switched to organization: ${validOrg.name} (${targetSlug})`);\n });\n}\n\n/**\n * Create the org command with subcommands\n */\nexport function createOrgsCommand(): Command {\n const orgCmd = new Command('org')\n .description('Manage organizations');\n\n // org list\n orgCmd\n .command('list')\n .description('List all organizations you have access to')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n\n const spinner = ora('Fetching organizations...').start();\n const result = await listOrganizations();\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to fetch organizations');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.stop();\n const orgs = result.data;\n const currentOrg = getCurrentOrganization();\n\n if (orgs.length === 0) {\n printInfo('No organizations found.');\n return;\n }\n\n const orgInfos = orgs.map((org) => ({\n slug: org.slug,\n name: org.name,\n role: org.role,\n current: org.slug === currentOrg ? '*' : '',\n }));\n\n if (options.json) {\n print(orgInfos, 'json');\n } else {\n print(orgInfos);\n console.log();\n printInfo(`Current organization: ${currentOrg || '(none selected)'}`);\n }\n });\n\n // org use <slug>\n orgCmd\n .command('use')\n .description('Set the current organization for CLI commands')\n .argument('<slug>', 'Organization slug to use')\n .action(async (slug: string) => {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n\n // Verify the org exists\n const spinner = ora('Verifying organization...').start();\n const result = await listOrganizations();\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to verify organization');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n const org = result.data.find((o) => o.slug === slug);\n if (!org) {\n spinner.fail('Organization not found');\n printError(`Organization \"${slug}\" not found.`);\n printInfo('Use \"transactional org list\" to see available organizations.');\n process.exit(1);\n }\n\n spinner.stop();\n switchOrganization(slug);\n printSuccess(`Now using organization: ${org.name} (${slug})`);\n });\n\n // org current\n orgCmd\n .command('current')\n .description('Show the current organization')\n .action(() => {\n const currentOrg = getCurrentOrganization();\n if (currentOrg) {\n printKeyValue('Current organization', currentOrg);\n } else {\n printInfo('No organization selected. Use \"transactional org use <slug>\" to select one.');\n }\n });\n\n return orgCmd;\n}\n\n// Helper functions\n\nfunction printInfo(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.blue('ℹ'), message);\n } else {\n console.log('[INFO]', message);\n }\n}\n\nfunction printHeading(title: string): void {\n if (isColorEnabled()) {\n console.log(chalk.bold.underline(title));\n } else {\n console.log(`=== ${title} ===`);\n }\n}\n","/**\n * Email Commands\n *\n * Commands for email operations: send, batch, templates, domains, senders, suppressions, stats.\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport ora from 'ora';\nimport { getApiClient, isLoggedIn } from '../lib';\nimport { printSuccess, printError, print, printKeyValue } from '../output';\nimport { confirm } from '../prompts';\nimport type {\n EmailSendOptions,\n EmailSendResult,\n EmailTemplate,\n EmailDomain,\n DomainCreateResponse,\n EmailSender,\n EmailSuppression,\n EmailStats,\n} from '../lib/types';\n\n/**\n * Create the email command\n */\nexport function createEmailCommand(): Command {\n const emailCmd = new Command('email').description('Email management commands');\n\n // Send command\n emailCmd\n .command('send')\n .description('Send a single email')\n .requiredOption('-f, --from <email>', 'Sender email address')\n .requiredOption('-t, --to <email>', 'Recipient email address')\n .option('-s, --subject <text>', 'Email subject')\n .option('--html <content>', 'HTML body')\n .option('--text <content>', 'Plain text body')\n .option('--template <id>', 'Template ID')\n .option('--template-alias <alias>', 'Template alias')\n .option('--model <json>', 'Template model (JSON)')\n .option('--cc <emails>', 'CC recipients (comma-separated)')\n .option('--bcc <emails>', 'BCC recipients (comma-separated)')\n .option('--reply-to <email>', 'Reply-to address')\n .option('--tag <tag>', 'Message tag')\n .option('--stream <id>', 'Stream ID')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const spinner = ora('Sending email...').start();\n\n try {\n const sendOptions: EmailSendOptions = {\n from: options.from,\n to: options.to,\n subject: options.subject,\n htmlBody: options.html,\n textBody: options.text,\n templateId: options.template ? parseInt(options.template, 10) : undefined,\n templateAlias: options.templateAlias,\n templateModel: options.model ? JSON.parse(options.model) : undefined,\n cc: options.cc ? options.cc.split(',').map((e: string) => e.trim()) : undefined,\n bcc: options.bcc ? options.bcc.split(',').map((e: string) => e.trim()) : undefined,\n replyTo: options.replyTo,\n tag: options.tag,\n streamId: options.stream ? parseInt(options.stream, 10) : undefined,\n };\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailSendResult>('/email', sendOptions);\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to send email');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Email sent successfully!');\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n printKeyValue('Message ID', result.data.messageId);\n printKeyValue('To', result.data.to);\n printKeyValue('Submitted At', result.data.submittedAt);\n }\n } catch (err) {\n spinner.fail('Failed to send email');\n printError(err instanceof Error ? err.message : 'Unknown error');\n process.exit(1);\n }\n });\n\n // Batch command\n emailCmd\n .command('batch <file>')\n .description('Send batch emails from a JSON file')\n .option('--dry-run', 'Validate without sending')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (file: string, options) => {\n requireLogin();\n\n // Read file\n if (!fs.existsSync(file)) {\n printError(`File not found: ${file}`);\n process.exit(1);\n }\n\n let emails;\n try {\n const content = fs.readFileSync(file, 'utf-8');\n emails = JSON.parse(content);\n } catch (err) {\n printError(`Failed to parse JSON file: ${err instanceof Error ? err.message : 'Unknown error'}`);\n process.exit(1);\n }\n\n if (!Array.isArray(emails)) {\n printError('File must contain an array of email objects');\n process.exit(1);\n }\n\n if (options.dryRun) {\n printSuccess(`Validated ${emails.length} emails (dry run)`);\n return;\n }\n\n const spinner = ora(`Sending ${emails.length} emails...`).start();\n\n try {\n const client = getApiClient(options.org);\n const result = await client.post<EmailSendResult[]>('/email/batch', { messages: emails });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to send batch emails');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed(`Sent ${result.data.length} emails successfully!`);\n\n if (options.json) {\n print(result.data, 'json');\n }\n } catch (err) {\n spinner.fail('Failed to send batch emails');\n printError(err instanceof Error ? err.message : 'Unknown error');\n process.exit(1);\n }\n });\n\n // Templates subcommand\n const templates = emailCmd.command('templates').description('Manage email templates');\n\n templates\n .command('list')\n .description('List email templates')\n .option('--server <id>', 'Filter by server ID')\n .option('--status <status>', 'Filter by status (DRAFT, ACTIVE, ARCHIVED)')\n .option('--limit <n>', 'Max results', '50')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<EmailTemplate[]>('/templates', {\n serverId: options.server ? parseInt(options.server, 10) : undefined,\n status: options.status,\n limit: parseInt(options.limit, 10),\n });\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to list templates');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n const data = result.data.map((t) => ({\n id: t.id,\n name: t.name,\n alias: t.alias || '-',\n status: t.status,\n updated: t.updatedAt,\n }));\n print(data);\n }\n });\n\n templates\n .command('get <id>')\n .description('Get template details')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<EmailTemplate>(`/templates/${id}`);\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to get template');\n process.exit(1);\n }\n\n print(result.data, options.json ? 'json' : undefined);\n });\n\n templates\n .command('create')\n .description('Create a new template')\n .requiredOption('--name <name>', 'Template name')\n .requiredOption('--subject <subject>', 'Email subject')\n .requiredOption('--server <id>', 'Server ID')\n .option('--alias <alias>', 'Template alias')\n .option('--html <content>', 'HTML body')\n .option('--text <content>', 'Plain text body')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const spinner = ora('Creating template...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailTemplate>('/templates', {\n name: options.name,\n subject: options.subject,\n serverId: parseInt(options.server, 10),\n alias: options.alias,\n htmlBody: options.html,\n textBody: options.text,\n });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to create template');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Template created!');\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n printKeyValue('ID', result.data.id);\n printKeyValue('Name', result.data.name);\n }\n });\n\n templates\n .command('update <id>')\n .description('Update a template')\n .option('--name <name>', 'Template name')\n .option('--subject <subject>', 'Email subject')\n .option('--alias <alias>', 'Template alias')\n .option('--html <content>', 'HTML body')\n .option('--text <content>', 'Plain text body')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options) => {\n requireLogin();\n\n const spinner = ora('Updating template...').start();\n\n const client = getApiClient(options.org);\n const result = await client.patch<EmailTemplate>(`/templates/${id}`, {\n name: options.name,\n subject: options.subject,\n alias: options.alias,\n htmlBody: options.html,\n textBody: options.text,\n });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to update template');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Template updated!');\n\n if (options.json) {\n print(result.data, 'json');\n }\n });\n\n templates\n .command('delete <id>')\n .description('Delete a template')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (id: string, options) => {\n requireLogin();\n\n const shouldDelete = await confirm(`Are you sure you want to delete template ${id}?`, false);\n if (!shouldDelete) {\n return;\n }\n\n const spinner = ora('Deleting template...').start();\n\n const client = getApiClient(options.org);\n const result = await client.delete(`/templates/${id}`);\n\n if (!result.success) {\n spinner.fail('Failed to delete template');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Template deleted!');\n });\n\n // Domains subcommand\n const domains = emailCmd.command('domains').description('Manage email domains');\n\n domains\n .command('list')\n .description('List email domains')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<{ totalCount: number; domains: EmailDomain[] }>('/domains');\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to list domains');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data.domains, 'json');\n } else {\n const data = result.data.domains.map((d) => ({\n id: d.id,\n domain: d.name,\n status: d.status,\n dkimVerified: d.dkimVerified ? 'Yes' : 'No',\n spfVerified: d.spfVerified ? 'Yes' : 'No',\n }));\n print(data);\n }\n });\n\n domains\n .command('add <domain>')\n .description('Add a domain')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (domain: string, options) => {\n requireLogin();\n\n const spinner = ora('Adding domain...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<DomainCreateResponse>('/domains', { domain });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to add domain');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Domain added!');\n\n console.log('\\nDNS Records to configure:');\n for (const record of result.data.dnsRecords) {\n console.log(`\\n${record.type}:`);\n console.log(` Name: ${record.name}`);\n console.log(` Value: ${record.value}`);\n }\n\n if (options.json) {\n print(result.data, 'json');\n }\n });\n\n domains\n .command('verify <id>')\n .description('Verify a domain')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options) => {\n requireLogin();\n\n const spinner = ora('Verifying domain...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailDomain>(`/domains/${id}/verify`);\n\n if (!result.success || !result.data) {\n spinner.fail('Domain verification failed');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n if (result.data.status === 'VERIFIED') {\n spinner.succeed('Domain verified!');\n } else {\n spinner.info('Verification in progress');\n console.log('\\nVerification Status:');\n const checkmark = (verified: boolean) => verified ? '\\u2713' : '\\u2717';\n console.log(` ${checkmark(result.data.dkimVerified)} DKIM`);\n console.log(` ${checkmark(result.data.spfVerified)} SPF`);\n console.log(` ${checkmark(result.data.returnPathVerified)} Return-Path`);\n console.log(` ${checkmark(result.data.dmarcVerified)} DMARC`);\n if (result.data.verificationError) {\n console.log(`\\nError: ${result.data.verificationError}`);\n }\n }\n\n if (options.json) {\n print(result.data, 'json');\n }\n });\n\n domains\n .command('delete <id>')\n .description('Delete a domain')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (id: string, options) => {\n requireLogin();\n\n const shouldDelete = await confirm(`Are you sure you want to delete domain ${id}?`, false);\n if (!shouldDelete) {\n return;\n }\n\n const spinner = ora('Deleting domain...').start();\n\n const client = getApiClient(options.org);\n const result = await client.delete(`/domains/${id}`);\n\n if (!result.success) {\n spinner.fail('Failed to delete domain');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Domain deleted!');\n });\n\n // Senders subcommand\n const senders = emailCmd.command('senders').description('Manage email senders');\n\n senders\n .command('list')\n .description('List email senders')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<{ totalCount: number; senders: EmailSender[] }>('/senders');\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to list senders');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data.senders, 'json');\n } else {\n const data = result.data.senders.map((s) => ({\n id: s.id,\n email: s.email,\n name: s.name || '-',\n status: s.status,\n }));\n print(data);\n }\n });\n\n senders\n .command('add <email>')\n .description('Add an email sender')\n .option('--name <name>', 'Sender name')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (emailAddr: string, options) => {\n requireLogin();\n\n const spinner = ora('Adding sender...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailSender>('/senders', {\n email: emailAddr,\n name: options.name,\n });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to add sender');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Sender added! Check your email for verification link.');\n });\n\n senders\n .command('delete <id>')\n .description('Delete an email sender')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (id: string, options) => {\n requireLogin();\n\n const shouldDelete = await confirm(`Are you sure you want to delete sender ${id}?`, false);\n if (!shouldDelete) {\n return;\n }\n\n const spinner = ora('Deleting sender...').start();\n\n const client = getApiClient(options.org);\n const result = await client.delete(`/senders/${id}`);\n\n if (!result.success) {\n spinner.fail('Failed to delete sender');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Sender deleted!');\n });\n\n // Suppressions subcommand\n const suppressions = emailCmd.command('suppressions').description('Manage email suppressions');\n\n suppressions\n .command('list')\n .description('List email suppressions')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--server <id>', 'Filter by server ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const params = new URLSearchParams();\n if (options.server) {\n params.set('serverId', options.server);\n }\n const queryString = params.toString();\n const url = queryString ? `/suppressions?${queryString}` : '/suppressions';\n const result = await client.get<{ data: EmailSuppression[]; totalCount: number }>(url);\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to list suppressions');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data.data, 'json');\n } else {\n const data = result.data.data.map((s) => ({\n id: s.id,\n email: s.email,\n reason: s.reason,\n created: s.createdAt,\n }));\n print(data);\n }\n });\n\n suppressions\n .command('add <email>')\n .description('Add email to suppression list')\n .option('-o, --org <slug>', 'Organization slug')\n .requiredOption('--server <id>', 'Server ID to add suppression to')\n .option('--reason <reason>', 'Suppression reason (HARD_BOUNCE, SPAM_COMPLAINT, MANUAL, UNSUBSCRIBE)', 'MANUAL')\n .option('--notes <notes>', 'Optional notes')\n .action(async (emailAddr: string, options) => {\n requireLogin();\n\n const spinner = ora('Adding to suppression list...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailSuppression>('/suppressions', {\n email: emailAddr,\n serverId: parseInt(options.server, 10),\n reason: options.reason,\n notes: options.notes,\n });\n\n if (!result.success) {\n spinner.fail('Failed to add suppression');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Email added to suppression list!');\n });\n\n suppressions\n .command('remove <id>')\n .description('Remove suppression by ID')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (id: string, options) => {\n requireLogin();\n\n const shouldRemove = await confirm(\n `Are you sure you want to remove suppression #${id}?`,\n false\n );\n if (!shouldRemove) {\n return;\n }\n\n const spinner = ora('Removing from suppression list...').start();\n\n const client = getApiClient(options.org);\n const result = await client.delete(`/suppressions/${id}`);\n\n if (!result.success) {\n spinner.fail('Failed to remove suppression');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Suppression removed!');\n });\n\n // Stats command\n emailCmd\n .command('stats')\n .description('Get email statistics')\n .option('--period <period>', 'Period (day, week, month)', 'week')\n .option('--server <id>', 'Filter by server ID')\n .option('--stream <id>', 'Filter by stream ID')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<EmailStats>('/stats/outbound', {\n period: options.period,\n serverId: options.server ? parseInt(options.server, 10) : undefined,\n streamId: options.stream ? parseInt(options.stream, 10) : undefined,\n });\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to get stats');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n const data = result.data;\n console.log(`\\nEmail Statistics (${data.period})\\n`);\n printKeyValue('Sent', data.sent);\n printKeyValue('Delivered', data.delivered);\n printKeyValue('Bounced', data.bounced);\n printKeyValue('Complaints', data.complained);\n printKeyValue('Opened', data.opened);\n printKeyValue('Clicked', data.clicked);\n console.log('\\nRates:');\n printKeyValue('Delivery Rate', `${(data.deliveryRate * 100).toFixed(2)}%`);\n printKeyValue('Open Rate', `${(data.openRate * 100).toFixed(2)}%`);\n printKeyValue('Click Rate', `${(data.clickRate * 100).toFixed(2)}%`);\n printKeyValue('Bounce Rate', `${(data.bounceRate * 100).toFixed(2)}%`);\n printKeyValue('Complaint Rate', `${(data.complaintRate * 100).toFixed(4)}%`);\n }\n });\n\n return emailCmd;\n}\n\n/**\n * Require user to be logged in\n */\nfunction requireLogin(): void {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n}\n","/**\n * Config Commands\n *\n * Commands for managing CLI configuration.\n */\n\nimport { Command } from 'commander';\nimport { getConfig, saveConfig, getConfigDir, getCredentialsFile, isColorEnabled } from '../lib';\nimport { printSuccess, printKeyValue, print } from '../output';\nimport chalk from 'chalk';\nimport type { OutputFormat } from '../lib/types';\n\n/**\n * Create the config command\n */\nexport function createConfigCommand(): Command {\n const configCmd = new Command('config').description('Manage CLI configuration');\n\n configCmd\n .command('show')\n .description('Show current configuration')\n .option('--json', 'Output as JSON')\n .action((options) => {\n const config = getConfig();\n\n if (options.json) {\n print(config, 'json');\n } else {\n console.log();\n printHeading('Current Configuration');\n printKeyValue('API URL', config.apiUrl);\n printKeyValue('Web URL', config.webUrl);\n printKeyValue('Output Format', config.outputFormat);\n printKeyValue('Color', config.color ? 'enabled' : 'disabled');\n console.log();\n printHeading('File Locations');\n printKeyValue('Config Directory', getConfigDir());\n printKeyValue('Credentials File', getCredentialsFile());\n }\n });\n\n configCmd\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action((key: string, value: string) => {\n const validKeys = ['apiUrl', 'webUrl', 'outputFormat', 'color'];\n\n if (!validKeys.includes(key)) {\n console.error(`Invalid key: ${key}`);\n console.error(`Valid keys: ${validKeys.join(', ')}`);\n process.exit(1);\n }\n\n // Validate values\n if (key === 'outputFormat') {\n const validFormats: OutputFormat[] = ['table', 'json', 'yaml'];\n if (!validFormats.includes(value as OutputFormat)) {\n console.error(`Invalid output format: ${value}`);\n console.error(`Valid formats: ${validFormats.join(', ')}`);\n process.exit(1);\n }\n }\n\n if (key === 'color') {\n const validColors = ['true', 'false', 'yes', 'no', '1', '0'];\n if (!validColors.includes(value.toLowerCase())) {\n console.error(`Invalid color value: ${value}`);\n console.error(`Valid values: true, false`);\n process.exit(1);\n }\n }\n\n // Convert value types\n let typedValue: string | boolean = value;\n if (key === 'color') {\n typedValue = ['true', 'yes', '1'].includes(value.toLowerCase());\n }\n\n saveConfig({ [key]: typedValue });\n printSuccess(`Set ${key} = ${typedValue}`);\n });\n\n configCmd\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n const config = getConfig();\n const value = config[key as keyof typeof config];\n\n if (value === undefined) {\n console.error(`Unknown key: ${key}`);\n process.exit(1);\n }\n\n console.log(value);\n });\n\n configCmd\n .command('reset')\n .description('Reset configuration to defaults')\n .action(() => {\n saveConfig({\n apiUrl: 'https://api.usetransactional.com',\n webUrl: 'https://usetransactional.com',\n outputFormat: 'table',\n color: true,\n });\n printSuccess('Configuration reset to defaults');\n });\n\n configCmd\n .command('path')\n .description('Show configuration file paths')\n .action(() => {\n console.log('Config Directory:', getConfigDir());\n console.log('Credentials File:', getCredentialsFile());\n });\n\n return configCmd;\n}\n\n// Helper function\nfunction printHeading(title: string): void {\n if (isColorEnabled()) {\n console.log(chalk.bold.underline(title));\n } else {\n console.log(`=== ${title} ===`);\n }\n}\n","/**\n * MCP Commands\n *\n * Commands for setting up MCP (Model Context Protocol) integration.\n * Supports Claude Desktop (paid and free tiers) and Claude Code.\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { getApiUrl, getWebUrl, getCurrentOrganization, isColorEnabled } from '../lib';\nimport { printSuccess, printError, print } from '../output';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface McpServerConfig {\n type: 'http';\n url: string;\n}\n\ninterface McpServerConfigWithCommand {\n command: string;\n args: string[];\n}\n\ninterface ClaudeDesktopConfig {\n mcpServers?: Record<string, McpServerConfig | McpServerConfigWithCommand>;\n}\n\ninterface ClaudeCodeConfig {\n mcpServers?: Record<string, McpServerConfig>;\n}\n\ntype InstallTarget = 'claude-desktop' | 'claude-code' | 'both';\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Get Claude Desktop config path based on platform\n */\nfunction getClaudeDesktopConfigPath(): string {\n const platform = os.platform();\n const homeDir = os.homedir();\n\n if (platform === 'darwin') {\n return path.join(homeDir, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n } else if (platform === 'win32') {\n return path.join(homeDir, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json');\n } else {\n // Linux\n return path.join(homeDir, '.config', 'claude', 'claude_desktop_config.json');\n }\n}\n\n/**\n * Get Claude Code config path\n */\nfunction getClaudeCodeConfigPath(): string {\n const homeDir = os.homedir();\n return path.join(homeDir, '.claude.json');\n}\n\n/**\n * Get the MCP server URL\n */\nfunction getMcpServerUrl(): string {\n const apiUrl = getApiUrl();\n // MCP server is at the /mcp endpoint on the API, or separate domain in production\n if (apiUrl.includes('localhost') || apiUrl.includes('127.0.0.1')) {\n return apiUrl.replace(/\\/$/, '') + '/mcp';\n }\n // In production, MCP has its own subdomain\n return process.env.MCP_SERVER_URL || 'https://mcp.usetransactional.com/mcp';\n}\n\n/**\n * Read and parse a JSON config file\n */\nfunction readJsonConfig<T>(filePath: string): T | null {\n try {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Write a JSON config file\n */\nfunction writeJsonConfig(filePath: string, config: unknown): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + '\\n');\n}\n\n/**\n * Print info message\n */\nfunction printInfo(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.blue('ℹ'), message);\n } else {\n console.log('[INFO]', message);\n }\n}\n\n/**\n * Print warning message\n */\nfunction printWarning(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.yellow('⚠'), message);\n } else {\n console.log('[WARN]', message);\n }\n}\n\n// =============================================================================\n// COMMANDS\n// =============================================================================\n\n/**\n * Create the mcp command\n */\nexport function createMcpCommand(): Command {\n const mcpCmd = new Command('mcp').description('MCP (Model Context Protocol) integration');\n\n // Setup command - shows instructions\n mcpCmd\n .command('setup')\n .description('Show MCP setup instructions')\n .action(() => {\n const mcpUrl = getMcpServerUrl();\n\n console.log('\\n📡 Transactional MCP Server Setup\\n');\n console.log('The MCP server allows Claude and other AI assistants to');\n console.log('interact with your Transactional account.\\n');\n\n console.log(chalk.bold('MCP Server URL:'));\n console.log(` ${chalk.cyan(mcpUrl)}\\n`);\n\n console.log(chalk.bold('Setup Options:\\n'));\n\n console.log(chalk.underline('1. Claude Desktop (Pro/Max/Team/Enterprise)'));\n console.log(' Go to Settings → Integrations → Add Custom Integration');\n console.log(` Enter URL: ${chalk.cyan(mcpUrl.replace('/mcp', ''))}`);\n console.log(' Claude will handle OAuth authorization automatically.\\n');\n\n console.log(chalk.underline('2. Claude Desktop (Free/JSON Config)'));\n console.log(' Run: transactional mcp install --target claude-desktop\\n');\n\n console.log(chalk.underline('3. Claude Code'));\n console.log(' Run: transactional mcp install --target claude-code\\n');\n\n console.log(chalk.bold('Available Commands:'));\n console.log(' transactional mcp install Install MCP config');\n console.log(' transactional mcp uninstall Remove MCP config');\n console.log(' transactional mcp status Check MCP server status');\n console.log(' transactional mcp tools List available MCP tools\\n');\n });\n\n // Config command - outputs config JSON\n mcpCmd\n .command('config')\n .description('Show MCP server configuration')\n .option('--target <target>', 'Target: claude-desktop, claude-code', 'claude-desktop')\n .option('--json', 'Output as raw JSON')\n .action((options) => {\n const mcpUrl = getMcpServerUrl();\n const target = options.target as InstallTarget;\n\n let config: ClaudeDesktopConfig | ClaudeCodeConfig;\n\n if (target === 'claude-code') {\n // Claude Code uses URL-based config (OAuth handled by Claude)\n config = {\n mcpServers: {\n transactional: {\n type: 'http',\n url: mcpUrl,\n },\n },\n };\n } else {\n // Claude Desktop (JSON config) uses mcp-remote for OAuth support\n config = {\n mcpServers: {\n transactional: {\n command: 'npx',\n args: ['mcp-remote', mcpUrl.replace('/mcp', '')],\n },\n },\n };\n }\n\n if (options.json) {\n console.log(JSON.stringify(config, null, 2));\n } else {\n console.log('\\n📋 MCP Configuration\\n');\n console.log(`Target: ${target}\\n`);\n console.log('```json');\n console.log(JSON.stringify(config, null, 2));\n console.log('```\\n');\n\n if (target === 'claude-desktop') {\n const configPath = getClaudeDesktopConfigPath();\n console.log(`Config file: ${configPath}\\n`);\n console.log(chalk.yellow('Note: Uses mcp-remote for OAuth support.'));\n console.log('Install mcp-remote: npm install -g mcp-remote\\n');\n } else {\n const configPath = getClaudeCodeConfigPath();\n console.log(`Config file: ${configPath}\\n`);\n }\n\n console.log('Run \"transactional mcp install\" to auto-install.\\n');\n }\n });\n\n // Install command - auto-install to Claude Desktop or Claude Code\n mcpCmd\n .command('install')\n .description('Install MCP config to Claude Desktop or Claude Code')\n .option('--target <target>', 'Target: claude-desktop, claude-code, both', 'both')\n .option('--force', 'Overwrite existing transactional config')\n .action(async (options) => {\n const target = options.target as InstallTarget;\n const mcpUrl = getMcpServerUrl();\n\n console.log('\\n📡 Installing Transactional MCP configuration...\\n');\n\n const targets = target === 'both' ? ['claude-desktop', 'claude-code'] : [target];\n let anyInstalled = false;\n let anySkipped = false;\n\n for (const t of targets) {\n try {\n if (t === 'claude-desktop') {\n const configPath = getClaudeDesktopConfigPath();\n const existingConfig = readJsonConfig<ClaudeDesktopConfig>(configPath) || { mcpServers: {} };\n\n // Check if transactional already exists\n if (existingConfig.mcpServers?.transactional && !options.force) {\n printWarning(`Claude Desktop: Already configured. Use --force to overwrite.`);\n console.log(` Config: ${configPath}\\n`);\n anySkipped = true;\n continue;\n }\n\n // Use mcp-remote for OAuth support\n existingConfig.mcpServers = {\n ...existingConfig.mcpServers,\n transactional: {\n command: 'npx',\n args: ['mcp-remote', mcpUrl.replace('/mcp', '')],\n },\n };\n\n writeJsonConfig(configPath, existingConfig);\n printSuccess(`Claude Desktop: Config installed`);\n console.log(` Config: ${configPath}\\n`);\n anyInstalled = true;\n\n } else if (t === 'claude-code') {\n const configPath = getClaudeCodeConfigPath();\n const existingConfig = readJsonConfig<ClaudeCodeConfig>(configPath) || {};\n\n // Check if transactional already exists\n if (existingConfig.mcpServers?.transactional && !options.force) {\n printWarning(`Claude Code: Already configured. Use --force to overwrite.`);\n console.log(` Config: ${configPath}\\n`);\n anySkipped = true;\n continue;\n }\n\n // Claude Code supports URL-based OAuth with HTTP transport\n existingConfig.mcpServers = {\n ...existingConfig.mcpServers,\n transactional: {\n type: 'http',\n url: mcpUrl,\n },\n };\n\n writeJsonConfig(configPath, existingConfig);\n printSuccess(`Claude Code: Config installed`);\n console.log(` Config: ${configPath}\\n`);\n anyInstalled = true;\n }\n } catch (err) {\n printError(`Failed to install ${t} config: ${err instanceof Error ? err.message : 'Unknown error'}`);\n }\n }\n\n if (anyInstalled) {\n console.log(chalk.bold('Next steps:'));\n console.log('1. Restart Claude Desktop/Code to apply changes');\n console.log('2. When you use a Transactional tool, Claude will prompt you to authorize');\n console.log('');\n } else if (anySkipped) {\n console.log('To force reinstall, run: transactional mcp install --force\\n');\n }\n });\n\n // Uninstall command\n mcpCmd\n .command('uninstall')\n .description('Remove MCP config from Claude Desktop and/or Claude Code')\n .option('--target <target>', 'Target: claude-desktop, claude-code, both', 'both')\n .action((options) => {\n const target = options.target as InstallTarget;\n const targets = target === 'both' ? ['claude-desktop', 'claude-code'] : [target];\n\n for (const t of targets) {\n const spinner = ora(`Removing MCP config from ${t}...`).start();\n\n try {\n const configPath = t === 'claude-desktop' ? getClaudeDesktopConfigPath() : getClaudeCodeConfigPath();\n\n if (!fs.existsSync(configPath)) {\n spinner.info(`No ${t} config found.`);\n continue;\n }\n\n const config = readJsonConfig<ClaudeDesktopConfig | ClaudeCodeConfig>(configPath);\n if (!config?.mcpServers?.transactional) {\n spinner.info(`Transactional not configured in ${t}.`);\n continue;\n }\n\n delete config.mcpServers.transactional;\n writeJsonConfig(configPath, config);\n spinner.succeed(`Removed from ${t}`);\n } catch (err) {\n spinner.fail(`Failed to remove ${t} config`);\n printError(err instanceof Error ? err.message : 'Unknown error');\n }\n }\n\n console.log('');\n printWarning('Please restart Claude Desktop/Code to apply changes.\\n');\n });\n\n // Status command\n mcpCmd\n .command('status')\n .description('Check MCP server status')\n .action(async () => {\n const spinner = ora('Checking MCP server...').start();\n\n const mcpUrl = getMcpServerUrl().replace('/mcp', '');\n\n try {\n const response = await fetch(`${mcpUrl}/health`);\n\n if (response.ok) {\n const data = await response.json();\n spinner.succeed('MCP server is running');\n console.log('\\nServer info:');\n print(data);\n\n // Also check OAuth metadata\n console.log('\\nOAuth endpoints:');\n console.log(` Authorization: ${mcpUrl}/mcp/authorize`);\n console.log(` Token: ${mcpUrl}/mcp/token`);\n console.log(` Protected Resource Metadata: ${mcpUrl}/.well-known/oauth-protected-resource`);\n } else {\n spinner.fail(`MCP server returned ${response.status}`);\n }\n } catch (err) {\n spinner.fail('Could not connect to MCP server');\n printError(err instanceof Error ? err.message : 'Unknown error');\n }\n });\n\n // Tools command - list available tools\n mcpCmd\n .command('tools')\n .description('List available MCP tools')\n .action(() => {\n console.log('\\n🔧 Available MCP Tools\\n');\n\n const tools = [\n { category: 'Email', tools: [\n { name: 'transactional_email_send', desc: 'Send a single email' },\n { name: 'transactional_email_batch', desc: 'Send multiple emails' },\n { name: 'transactional_email_stats', desc: 'Get email statistics' },\n { name: 'transactional_templates_list', desc: 'List templates' },\n { name: 'transactional_templates_get', desc: 'Get template details' },\n { name: 'transactional_templates_create', desc: 'Create template' },\n { name: 'transactional_domains_list', desc: 'List domains' },\n { name: 'transactional_domains_add', desc: 'Add domain' },\n { name: 'transactional_senders_list', desc: 'List senders' },\n { name: 'transactional_suppressions_list', desc: 'List suppressions' },\n ]},\n { category: 'Organization', tools: [\n { name: 'transactional_whoami', desc: 'Current user info' },\n { name: 'transactional_orgs_list', desc: 'List organizations' },\n { name: 'transactional_orgs_switch', desc: 'Switch organization' },\n { name: 'transactional_api_keys_list', desc: 'List API keys' },\n { name: 'transactional_api_keys_create', desc: 'Create API key' },\n { name: 'transactional_members_list', desc: 'List members' },\n ]},\n { category: 'Billing', tools: [\n { name: 'transactional_billing_usage', desc: 'Get usage' },\n { name: 'transactional_billing_invoices', desc: 'List invoices' },\n { name: 'transactional_billing_plan', desc: 'Get plan details' },\n ]},\n ];\n\n for (const category of tools) {\n console.log(`${category.category}:`);\n for (const tool of category.tools) {\n console.log(` ${tool.name.padEnd(35)} ${tool.desc}`);\n }\n console.log();\n }\n });\n\n return mcpCmd;\n}\n","/**\n * Transactional CLI\n *\n * Main CLI entry point with Commander.js setup.\n */\n\nimport { Command } from 'commander';\nimport { initConfig } from './lib';\nimport {\n createLoginCommand,\n createLogoutCommand,\n createWhoamiCommand,\n createSwitchCommand,\n createOrgsCommand,\n createEmailCommand,\n createConfigCommand,\n createMcpCommand,\n} from './commands';\n\n// Initialize configuration on import\ninitConfig();\n\n/**\n * Create the CLI program\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('transactional')\n .description('CLI for Transactional - manage email, SMS, forms, and more')\n .version('0.1.2');\n\n // Auth commands\n program.addCommand(createLoginCommand());\n program.addCommand(createLogoutCommand());\n program.addCommand(createWhoamiCommand());\n program.addCommand(createSwitchCommand());\n program.addCommand(createOrgsCommand());\n\n // Email commands\n program.addCommand(createEmailCommand());\n\n // Config commands\n program.addCommand(createConfigCommand());\n\n // MCP commands\n program.addCommand(createMcpCommand());\n\n return program;\n}\n\n// Export library functions for programmatic use\nexport * from './lib';\nexport * from './commands';\nexport * from './output';\nexport * from './prompts';\n","#!/usr/bin/env node\n\n/**\n * Transactional CLI Binary\n *\n * Entry point for the CLI executable.\n */\n\nimport { createProgram } from './index';\n\nconst program = createProgram();\nprogram.parse(process.argv);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/config.ts","../src/lib/client.ts","../src/lib/auth.ts","../src/output/index.ts","../src/prompts/index.ts","../src/commands/auth.ts","../src/commands/email.ts","../src/commands/config.ts","../src/commands/mcp.ts","../src/index.ts","../src/bin.ts"],"names":["path","os","chalk","ora","Command","fs2","printHeading","platform","fs3","program"],"mappings":"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","file":"bin.js","sourcesContent":["/**\n * CLI Configuration\n *\n * Manages CLI configuration settings including API URLs and output preferences.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport type { CliConfig, OutputFormat, StoredCredentials } from './types';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst CONFIG_DIR = path.join(os.homedir(), '.transactional');\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\nconst CREDENTIALS_FILE = path.join(CONFIG_DIR, 'credentials.json');\n\nconst DEFAULT_CONFIG: CliConfig = {\n apiUrl: 'https://api.usetransactional.com',\n webUrl: 'https://usetransactional.com',\n outputFormat: 'table',\n color: true,\n};\n\n// In-memory state\nlet currentConfig: CliConfig = { ...DEFAULT_CONFIG };\nlet currentCredentials: StoredCredentials | null = null;\n\n// =============================================================================\n// DIRECTORY MANAGEMENT\n// =============================================================================\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureConfigDir(): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n// =============================================================================\n// CONFIG FILE\n// =============================================================================\n\n/**\n * Load configuration from file\n */\nexport function loadConfig(): CliConfig {\n ensureConfigDir();\n\n if (fs.existsSync(CONFIG_FILE)) {\n try {\n const content = fs.readFileSync(CONFIG_FILE, 'utf-8');\n const loaded = JSON.parse(content) as Partial<CliConfig>;\n currentConfig = { ...DEFAULT_CONFIG, ...loaded };\n } catch {\n currentConfig = { ...DEFAULT_CONFIG };\n }\n } else {\n currentConfig = { ...DEFAULT_CONFIG };\n }\n\n // Apply environment overrides\n if (process.env.TRANSACTIONAL_API_URL) {\n currentConfig.apiUrl = process.env.TRANSACTIONAL_API_URL;\n }\n if (process.env.TRANSACTIONAL_WEB_URL) {\n currentConfig.webUrl = process.env.TRANSACTIONAL_WEB_URL;\n }\n if (process.env.NO_COLOR || process.env.TRANSACTIONAL_NO_COLOR) {\n currentConfig.color = false;\n }\n\n return currentConfig;\n}\n\n/**\n * Save configuration to file\n */\nexport function saveConfig(config: Partial<CliConfig>): void {\n ensureConfigDir();\n currentConfig = { ...currentConfig, ...config };\n\n const { apiUrl, webUrl, outputFormat, color } = currentConfig;\n fs.writeFileSync(CONFIG_FILE, JSON.stringify({ apiUrl, webUrl, outputFormat, color }, null, 2), {\n mode: 0o600,\n });\n}\n\n/**\n * Get the current configuration\n */\nexport function getConfig(): CliConfig {\n return currentConfig;\n}\n\n/**\n * Get the API URL\n */\nexport function getApiUrl(): string {\n return currentConfig.apiUrl;\n}\n\n/**\n * Get the Web URL\n */\nexport function getWebUrl(): string {\n return currentConfig.webUrl;\n}\n\n/**\n * Get the output format\n */\nexport function getOutputFormat(): OutputFormat {\n return currentConfig.outputFormat;\n}\n\n/**\n * Check if color output is enabled\n */\nexport function isColorEnabled(): boolean {\n return currentConfig.color;\n}\n\n// =============================================================================\n// CREDENTIALS FILE\n// =============================================================================\n\n/**\n * Load credentials from file\n */\nexport function loadCredentials(): StoredCredentials {\n ensureConfigDir();\n\n if (currentCredentials) {\n return currentCredentials;\n }\n\n if (fs.existsSync(CREDENTIALS_FILE)) {\n try {\n const content = fs.readFileSync(CREDENTIALS_FILE, 'utf-8');\n const loaded = JSON.parse(content) as StoredCredentials;\n\n // Migrate from version 1 (per-org tokens) to version 2 (user token)\n if (loaded.version === 1) {\n // Clear old per-org tokens - user needs to re-login\n currentCredentials = {\n version: 2,\n user: loaded.user,\n currentOrganization: loaded.currentOrganization,\n };\n saveCredentials(currentCredentials);\n } else {\n currentCredentials = loaded;\n }\n } catch {\n currentCredentials = {\n version: 2,\n };\n }\n } else {\n currentCredentials = {\n version: 2,\n };\n }\n\n return currentCredentials;\n}\n\n/**\n * Save credentials to file\n */\nexport function saveCredentials(credentials: StoredCredentials): void {\n ensureConfigDir();\n currentCredentials = credentials;\n fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), {\n mode: 0o600,\n });\n}\n\n/**\n * Get the current organization slug\n */\nexport function getCurrentOrganization(): string | undefined {\n const credentials = loadCredentials();\n return credentials.currentOrganization;\n}\n\n/**\n * Set the current organization\n */\nexport function setCurrentOrganization(orgSlug: string): void {\n const credentials = loadCredentials();\n credentials.currentOrganization = orgSlug;\n saveCredentials(credentials);\n}\n\n/**\n * Get the stored user token\n */\nexport function getToken(): string | undefined {\n const credentials = loadCredentials();\n\n // Check if token exists\n if (!credentials.token) {\n return undefined;\n }\n\n // Check if token is expired\n if (credentials.expiresAt && new Date(credentials.expiresAt) < new Date()) {\n return undefined;\n }\n\n return credentials.token;\n}\n\n/**\n * Store the user token\n */\nexport function storeToken(token: string, expiresInSeconds: number): void {\n const credentials = loadCredentials();\n credentials.token = token;\n credentials.expiresAt = new Date(Date.now() + expiresInSeconds * 1000).toISOString();\n saveCredentials(credentials);\n}\n\n/**\n * Check if user is logged in\n */\nexport function isLoggedIn(): boolean {\n return !!getToken();\n}\n\n/**\n * Clear all credentials (logout)\n */\nexport function clearCredentials(): void {\n ensureConfigDir();\n currentCredentials = {\n version: 2,\n };\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n }\n}\n\n/**\n * Store user info\n */\nexport function storeUserInfo(user: { id: string; email: string; name?: string }): void {\n const credentials = loadCredentials();\n credentials.user = user;\n saveCredentials(credentials);\n}\n\n/**\n * Get stored user info\n */\nexport function getUserInfo(): { id: string; email: string; name?: string } | undefined {\n const credentials = loadCredentials();\n return credentials.user;\n}\n\n/**\n * Switch to a different organization (just updates local selection)\n */\nexport function switchOrganization(orgSlug: string): void {\n setCurrentOrganization(orgSlug);\n}\n\n/**\n * Get config directory path\n */\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\n/**\n * Get credentials file path\n */\nexport function getCredentialsFile(): string {\n return CREDENTIALS_FILE;\n}\n\n/**\n * Initialize config (call on CLI start)\n */\nexport function initConfig(): CliConfig {\n return loadConfig();\n}\n","/**\n * HTTP API Client\n *\n * Self-contained HTTP client for making API requests.\n * Uses native fetch and requires no external dependencies.\n */\n\nimport { getApiUrl, getToken, getCurrentOrganization } from './config';\nimport type { CommandResult, ApiErrorResponse } from './types';\n\n// =============================================================================\n// API CLIENT CLASS\n// =============================================================================\n\n/**\n * HTTP API client for making authenticated requests\n * All API requests go to the Hono API server (apiUrl)\n */\nexport class ApiClient {\n private apiUrl: string;\n private token: string | undefined;\n private orgSlug: string | undefined;\n\n constructor(orgSlug?: string) {\n this.apiUrl = getApiUrl();\n this.token = getToken();\n this.orgSlug = orgSlug || getCurrentOrganization();\n }\n\n /**\n * Get headers for API requests\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': '@usetransactional/cli/0.1.0',\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n // Include organization context in headers\n if (this.orgSlug) {\n headers['X-Organization-Slug'] = this.orgSlug;\n }\n\n return headers;\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const url = new URL(path, this.apiUrl);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Make an HTTP request\n */\n private async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n params?: Record<string, unknown>;\n }\n ): Promise<CommandResult<T>> {\n try {\n const url = this.buildUrl(path, options?.params);\n const init: RequestInit = {\n method,\n headers: this.getHeaders(),\n };\n\n if (options?.body) {\n init.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, init);\n\n // Handle no content responses\n if (response.status === 204) {\n return { success: true };\n }\n\n // Parse response body\n let data: unknown;\n const contentType = response.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n\n // Handle error responses\n if (!response.ok) {\n const errorResponse = data as ApiErrorResponse;\n return {\n success: false,\n error: {\n code: errorResponse.error?.code || `HTTP_${response.status}`,\n message: errorResponse.error?.message || response.statusText,\n details: errorResponse.error?.details,\n },\n };\n }\n\n // Handle successful responses\n // API returns { data: T } or just T depending on endpoint\n if (data && typeof data === 'object' && 'data' in data) {\n return { success: true, data: (data as { data: T }).data };\n }\n\n return { success: true, data: data as T };\n } catch (err) {\n // Handle network errors\n if (err instanceof Error) {\n if (err.message.includes('ECONNREFUSED')) {\n return {\n success: false,\n error: {\n code: 'CONNECTION_REFUSED',\n message: `Cannot connect to API server. Check your network connection.`,\n },\n };\n }\n\n return {\n success: false,\n error: {\n code: 'NETWORK_ERROR',\n message: err.message,\n },\n };\n }\n\n return {\n success: false,\n error: {\n code: 'UNKNOWN_ERROR',\n message: 'An unknown error occurred',\n },\n };\n }\n }\n\n /**\n * GET request\n */\n async get<T>(path: string, params?: Record<string, unknown>): Promise<CommandResult<T>> {\n return this.request<T>('GET', path, { params });\n }\n\n /**\n * POST request\n */\n async post<T>(path: string, body?: unknown): Promise<CommandResult<T>> {\n return this.request<T>('POST', path, { body });\n }\n\n /**\n * PUT request\n */\n async put<T>(path: string, body?: unknown): Promise<CommandResult<T>> {\n return this.request<T>('PUT', path, { body });\n }\n\n /**\n * PATCH request\n */\n async patch<T>(path: string, body?: unknown): Promise<CommandResult<T>> {\n return this.request<T>('PATCH', path, { body });\n }\n\n /**\n * DELETE request\n */\n async delete<T = void>(path: string): Promise<CommandResult<T>> {\n return this.request<T>('DELETE', path);\n }\n}\n\n/**\n * Get an API client for the current or specified organization\n */\nexport function getApiClient(orgSlug?: string): ApiClient {\n return new ApiClient(orgSlug);\n}\n\n/**\n * Check if the user is authenticated for API calls\n */\nexport function isAuthenticated(): boolean {\n return !!getToken();\n}\n","/**\n * Authentication\n *\n * Handles device authorization flow for CLI login.\n * No local server needed - CLI polls the API until user authorizes.\n */\n\nimport open from 'open';\nimport {\n getApiUrl,\n getWebUrl,\n storeToken,\n storeUserInfo,\n clearCredentials,\n getCurrentOrganization,\n setCurrentOrganization,\n} from './config';\nimport { getApiClient } from './client';\nimport type { CommandResult, WhoamiResponse, OrganizationInfo } from './types';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface DeviceCodeResponse {\n deviceCode: string;\n userCode: string;\n expiresIn: number;\n interval: number;\n}\n\ninterface TokenResponse {\n token: string;\n tokenType: string;\n expiresIn: number;\n user: {\n id: string;\n name?: string;\n email: string;\n };\n organizations: Array<{\n id: number;\n role: string;\n }>;\n}\n\ninterface TokenErrorResponse {\n error: string;\n error_description: string;\n}\n\n// =============================================================================\n// DEVICE AUTHORIZATION FLOW\n// =============================================================================\n\n/**\n * Request a device code from the API\n * Uses apiUrl since device-code endpoint is on the Hono API server\n */\nasync function requestDeviceCode(\n sessionType: 'CLI' | 'MCP' = 'CLI'\n): Promise<DeviceCodeResponse> {\n const apiUrl = getApiUrl();\n\n const response = await fetch(`${apiUrl}/cli/device-code`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': '@usetransactional/cli/0.1.0',\n },\n body: JSON.stringify({\n sessionType,\n clientInfo: {\n deviceName: process.env.HOSTNAME || 'Unknown',\n osName: process.platform,\n osVersion: process.version,\n hostname: process.env.HOSTNAME || 'Unknown',\n clientVersion: '0.1.0',\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string | { code?: string; message?: string }\n };\n const errorMsg = typeof errorData.error === 'string'\n ? errorData.error\n : errorData.error?.message || 'Failed to get device code';\n throw new Error(errorMsg);\n }\n\n return response.json() as Promise<DeviceCodeResponse>;\n}\n\n/**\n * Poll for token using device code\n * Uses apiUrl since token endpoint is on the Hono API server\n */\nasync function pollForToken(\n deviceCode: string,\n interval: number,\n expiresIn: number,\n onPoll?: () => void\n): Promise<TokenResponse> {\n const apiUrl = getApiUrl();\n const startTime = Date.now();\n const expiresAt = startTime + expiresIn * 1000;\n\n while (Date.now() < expiresAt) {\n if (onPoll) onPoll();\n\n const response = await fetch(`${apiUrl}/cli/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': '@usetransactional/cli/0.1.0',\n },\n body: JSON.stringify({ deviceCode }),\n });\n\n if (response.ok) {\n return response.json() as Promise<TokenResponse>;\n }\n\n const errorData = (await response.json()) as TokenErrorResponse;\n\n // Check error type\n switch (errorData.error) {\n case 'authorization_pending':\n // User hasn't authorized yet, keep polling\n break;\n case 'slow_down':\n // Polling too fast, increase interval\n interval = Math.min(interval + 5, 60);\n break;\n case 'expired_token':\n throw new Error('Login timed out. Please try again.');\n case 'access_denied':\n throw new Error('Authorization denied.');\n default:\n throw new Error(errorData.error_description || 'Login failed');\n }\n\n // Wait before next poll\n await new Promise((resolve) => setTimeout(resolve, interval * 1000));\n }\n\n throw new Error('Login timed out. Please try again.');\n}\n\n/**\n * Perform device authorization login flow\n */\nexport async function login(\n sessionType: 'CLI' | 'MCP' = 'CLI',\n callbacks?: {\n onDeviceCode?: (userCode: string, verificationUrl: string) => void;\n onBrowserOpen?: () => void;\n onPolling?: () => void;\n }\n): Promise<\n CommandResult<{\n user: { id: string; email: string; name?: string };\n organizations: Array<{ id: number; role: string }>;\n }>\n> {\n try {\n // Step 1: Request device code\n const deviceCodeResponse = await requestDeviceCode(sessionType);\n const { deviceCode, userCode, expiresIn, interval } = deviceCodeResponse;\n\n // Build verification URL using CLI's configured webUrl\n const webUrl = getWebUrl();\n const verificationUrl = `${webUrl}/cli/authorize?user_code=${userCode}`;\n\n // Notify about the user code\n if (callbacks?.onDeviceCode) {\n callbacks.onDeviceCode(userCode, verificationUrl);\n }\n\n // Step 2: Open browser\n if (callbacks?.onBrowserOpen) {\n callbacks.onBrowserOpen();\n }\n await open(verificationUrl);\n\n // Step 3: Poll for token\n const tokenResponse = await pollForToken(\n deviceCode,\n interval,\n expiresIn,\n callbacks?.onPolling\n );\n\n // Step 4: Store credentials\n storeToken(tokenResponse.token, tokenResponse.expiresIn);\n storeUserInfo({\n id: tokenResponse.user.id,\n email: tokenResponse.user.email,\n name: tokenResponse.user.name,\n });\n\n return {\n success: true,\n data: {\n user: tokenResponse.user,\n organizations: tokenResponse.organizations,\n },\n };\n } catch (err) {\n return {\n success: false,\n error: {\n code: 'LOGIN_FAILED',\n message: err instanceof Error ? err.message : 'Login failed',\n },\n };\n }\n}\n\n/**\n * Logout - clear all credentials\n */\nexport function logout(): void {\n clearCredentials();\n}\n\n/**\n * Get current user and organization info (whoami)\n */\nexport async function whoami(orgSlug?: string): Promise<CommandResult<WhoamiResponse>> {\n const client = getApiClient(orgSlug);\n return client.get<WhoamiResponse>('/cli/whoami');\n}\n\n/**\n * List all organizations the user has access to\n */\nexport async function listOrganizations(): Promise<CommandResult<OrganizationInfo[]>> {\n const client = getApiClient();\n return client.get<OrganizationInfo[]>('/cli/organizations');\n}\n\n/**\n * Set the current organization for CLI commands\n */\nexport function useOrganization(orgSlug: string): void {\n setCurrentOrganization(orgSlug);\n}\n\n/**\n * Get the current organization slug\n */\nexport function getOrganization(): string | undefined {\n return getCurrentOrganization();\n}\n","/**\n * CLI Output Formatting\n *\n * Functions for formatting and displaying CLI output.\n */\n\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport yaml from 'yaml';\nimport { getOutputFormat, isColorEnabled } from '../lib/config';\nimport type { OutputFormat } from '../lib/types';\n\n/**\n * Format data based on the output format setting\n */\nexport function formatOutput(data: unknown, format?: OutputFormat): string {\n const outputFormat = format || getOutputFormat();\n\n switch (outputFormat) {\n case 'json':\n return JSON.stringify(data, null, 2);\n case 'yaml':\n return yaml.stringify(data);\n case 'table':\n default:\n return formatAsTable(data);\n }\n}\n\n/**\n * Format data as a table\n */\nfunction formatAsTable(data: unknown): string {\n if (!data) {\n return 'No data';\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return 'No results';\n }\n\n // Get columns from first item\n const columns = Object.keys(data[0]);\n const table = new Table({\n head: columns.map((c) => (isColorEnabled() ? chalk.bold(c) : c)),\n style: {\n head: isColorEnabled() ? ['cyan'] : [],\n border: isColorEnabled() ? ['gray'] : [],\n },\n });\n\n for (const row of data) {\n table.push(columns.map((col) => formatValue((row as Record<string, unknown>)[col])));\n }\n\n return table.toString();\n }\n\n if (typeof data === 'object') {\n const table = new Table({\n style: {\n border: isColorEnabled() ? ['gray'] : [],\n },\n });\n\n for (const [key, value] of Object.entries(data)) {\n const formattedKey = isColorEnabled() ? chalk.bold(key) : key;\n table.push({ [formattedKey]: formatValue(value) });\n }\n\n return table.toString();\n }\n\n return String(data);\n}\n\n/**\n * Format a single value for table display\n */\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return isColorEnabled() ? chalk.gray('-') : '-';\n }\n\n if (typeof value === 'boolean') {\n if (isColorEnabled()) {\n return value ? chalk.green('Yes') : chalk.red('No');\n }\n return value ? 'Yes' : 'No';\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value)) {\n return value.join(', ');\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n\n/**\n * Print success message\n */\nexport function printSuccess(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.green('✓'), message);\n } else {\n console.log('[OK]', message);\n }\n}\n\n/**\n * Print error message\n */\nexport function printError(message: string, details?: string): void {\n if (isColorEnabled()) {\n console.error(chalk.red('✗'), message);\n if (details) {\n console.error(chalk.gray(details));\n }\n } else {\n console.error('[ERROR]', message);\n if (details) {\n console.error(details);\n }\n }\n}\n\n/**\n * Print warning message\n */\nexport function printWarning(message: string): void {\n if (isColorEnabled()) {\n console.warn(chalk.yellow('⚠'), message);\n } else {\n console.warn('[WARN]', message);\n }\n}\n\n/**\n * Print info message\n */\nexport function printInfo(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.blue('ℹ'), message);\n } else {\n console.log('[INFO]', message);\n }\n}\n\n/**\n * Print a heading\n */\nexport function printHeading(title: string): void {\n if (isColorEnabled()) {\n console.log();\n console.log(chalk.bold.underline(title));\n console.log();\n } else {\n console.log();\n console.log(`=== ${title} ===`);\n console.log();\n }\n}\n\n/**\n * Print a key-value pair\n */\nexport function printKeyValue(key: string, value: unknown): void {\n const formattedValue = formatValue(value);\n if (isColorEnabled()) {\n console.log(`${chalk.gray(key + ':')} ${formattedValue}`);\n } else {\n console.log(`${key}: ${formattedValue}`);\n }\n}\n\n/**\n * Print data with automatic format detection\n */\nexport function print(data: unknown, format?: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n","/**\n * CLI Prompts\n *\n * Interactive prompts for CLI user input.\n */\n\nimport inquirer from 'inquirer';\nimport type { OrganizationInfo } from '../lib/types';\n\n/**\n * Prompt user to select an organization\n */\nexport async function selectOrganization(organizations: OrganizationInfo[]): Promise<string> {\n const { orgSlug } = await inquirer.prompt<{ orgSlug: string }>([\n {\n type: 'list',\n name: 'orgSlug',\n message: 'Select an organization:',\n choices: organizations.map((org) => ({\n name: `${org.name} (${org.slug}) - ${org.role}`,\n value: org.slug,\n })),\n },\n ]);\n\n return orgSlug;\n}\n\n/**\n * Prompt for confirmation\n */\nexport async function confirm(message: string, defaultValue = false): Promise<boolean> {\n const { confirmed } = await inquirer.prompt<{ confirmed: boolean }>([\n {\n type: 'confirm',\n name: 'confirmed',\n message,\n default: defaultValue,\n },\n ]);\n\n return confirmed;\n}\n\n/**\n * Prompt for text input\n */\nexport async function input(\n message: string,\n options?: {\n default?: string;\n required?: boolean;\n validate?: (value: string) => boolean | string;\n }\n): Promise<string> {\n const { value } = await inquirer.prompt<{ value: string }>([\n {\n type: 'input',\n name: 'value',\n message,\n default: options?.default,\n validate: (inp: string) => {\n if (options?.required && !inp.trim()) {\n return 'This field is required';\n }\n if (options?.validate) {\n return options.validate(inp);\n }\n return true;\n },\n },\n ]);\n\n return value;\n}\n\n/**\n * Prompt for password/secret input\n */\nexport async function password(\n message: string,\n options?: {\n required?: boolean;\n validate?: (value: string) => boolean | string;\n }\n): Promise<string> {\n const { value } = await inquirer.prompt<{ value: string }>([\n {\n type: 'password',\n name: 'value',\n message,\n mask: '*',\n validate: (inp: string) => {\n if (options?.required && !inp.trim()) {\n return 'This field is required';\n }\n if (options?.validate) {\n return options.validate(inp);\n }\n return true;\n },\n },\n ]);\n\n return value;\n}\n\n/**\n * Prompt for selection from a list\n */\nexport async function select<T extends string>(\n message: string,\n choices: { name: string; value: T }[]\n): Promise<T> {\n const { value } = await inquirer.prompt<{ value: T }>([\n {\n type: 'list',\n name: 'value',\n message,\n choices,\n },\n ]);\n\n return value;\n}\n\n/**\n * Prompt for multiple selection from a list\n */\nexport async function multiSelect<T extends string>(\n message: string,\n choices: { name: string; value: T; checked?: boolean }[]\n): Promise<T[]> {\n const { values } = await inquirer.prompt<{ values: T[] }>([\n {\n type: 'checkbox',\n name: 'values',\n message,\n choices,\n },\n ]);\n\n return values;\n}\n\n/**\n * Prompt for email input\n */\nexport async function emailInput(\n message: string,\n options?: { default?: string; required?: boolean }\n): Promise<string> {\n return input(message, {\n ...options,\n validate: (value) => {\n if (!value && !options?.required) {\n return true;\n }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return 'Please enter a valid email address';\n }\n return true;\n },\n });\n}\n\n/**\n * Prompt for editor input (opens editor for multiline content)\n */\nexport async function editor(\n message: string,\n options?: { default?: string }\n): Promise<string> {\n const { value } = await inquirer.prompt<{ value: string }>([\n {\n type: 'editor',\n name: 'value',\n message,\n default: options?.default,\n },\n ]);\n\n return value;\n}\n","/**\n * Auth Commands\n *\n * Commands for authentication: login, logout, whoami, switch org.\n */\n\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport {\n login,\n logout,\n whoami,\n listOrganizations,\n isLoggedIn,\n getCurrentOrganization,\n switchOrganization,\n isColorEnabled,\n} from '../lib';\nimport { printSuccess, printError, printKeyValue, print } from '../output';\nimport { selectOrganization } from '../prompts';\n\n/**\n * Create the login command\n */\nexport function createLoginCommand(): Command {\n return new Command('login')\n .description('Authenticate with Transactional')\n .option('--mcp', 'Login for MCP server use')\n .option('-f, --force', 'Force new login even if already logged in')\n .action(async (options) => {\n if (isLoggedIn() && !options.force) {\n const currentOrg = getCurrentOrganization();\n if (currentOrg) {\n printInfo(`Already logged in. Current organization: ${currentOrg}`);\n } else {\n printInfo('Already logged in. Use \"transactional org use <slug>\" to select an organization.');\n }\n printInfo('Use \"transactional login --force\" to get a new token.');\n return;\n }\n\n const spinner = ora();\n\n const result = await login(options.mcp ? 'MCP' : 'CLI', {\n onDeviceCode: (userCode, verificationUrl) => {\n console.log();\n console.log(chalk.bold('To complete authentication:'));\n console.log();\n console.log(` 1. Visit: ${chalk.cyan(verificationUrl)}`);\n console.log(` 2. Verify this code matches: ${chalk.bold.yellow(formatUserCode(userCode))}`);\n console.log(` 3. Click \"Authorize\" in your browser`);\n console.log();\n },\n onBrowserOpen: () => {\n spinner.start('Opening browser...');\n spinner.succeed('Browser opened');\n spinner.start('Waiting for authorization...');\n },\n onPolling: () => {\n // Could add a dot or similar to show activity\n },\n });\n\n if (!result.success || !result.data) {\n spinner.fail('Login failed');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Authorization received!');\n console.log();\n printSuccess('Login successful!');\n console.log();\n printKeyValue('User', result.data.user.email);\n\n // Prompt to select an organization\n if (result.data.organizations.length > 0) {\n console.log();\n printInfo(`You have access to ${result.data.organizations.length} organization(s).`);\n printInfo('Use \"transactional org list\" to see them, or \"transactional org use <slug>\" to select one.');\n }\n });\n}\n\n/**\n * Format user code for display (XXXX-XXXX)\n */\nfunction formatUserCode(code: string): string {\n if (code.length === 8) {\n return `${code.slice(0, 4)}-${code.slice(4)}`;\n }\n return code;\n}\n\n/**\n * Create the logout command\n */\nexport function createLogoutCommand(): Command {\n return new Command('logout')\n .description('Log out from all organizations')\n .action(async () => {\n if (!isLoggedIn()) {\n printInfo('You are not logged in.');\n return;\n }\n\n logout();\n printSuccess('Logged out from all organizations.');\n });\n}\n\n/**\n * Create the whoami command\n */\nexport function createWhoamiCommand(): Command {\n return new Command('whoami')\n .description('Show current user and organization info')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n\n const result = await whoami(options.org);\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to get user info');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n const { user, organization, session } = result.data;\n console.log();\n printHeading('User');\n printKeyValue('ID', user.id);\n printKeyValue('Email', user.email);\n if (user.name) printKeyValue('Name', user.name);\n\n console.log();\n printHeading('Organization');\n if (organization) {\n printKeyValue('ID', String(organization.id));\n printKeyValue('Name', organization.name);\n printKeyValue('Slug', organization.slug);\n printKeyValue('Role', organization.role);\n } else {\n printInfo('No organization selected. Use \"transactional org use <slug>\" to select one.');\n }\n\n console.log();\n printHeading('Session');\n printKeyValue('ID', String(session.id));\n printKeyValue('Type', session.type);\n printKeyValue('Created', session.createdAt);\n if (session.expiresAt) printKeyValue('Expires', session.expiresAt);\n }\n });\n}\n\n/**\n * Create the switch command (alias for org use)\n */\nexport function createSwitchCommand(): Command {\n return new Command('switch')\n .description('Switch to a different organization (alias for \"org use\")')\n .argument('[slug]', 'Organization slug to switch to')\n .action(async (slug?: string) => {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n\n // Fetch organizations from API\n const spinner = ora('Fetching organizations...').start();\n const orgsResult = await listOrganizations();\n\n if (!orgsResult.success || !orgsResult.data) {\n spinner.fail('Failed to fetch organizations');\n printError(orgsResult.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n const orgs = orgsResult.data;\n spinner.stop();\n\n if (orgs.length === 0) {\n printError('No organizations found.');\n process.exit(1);\n }\n\n let targetSlug = slug;\n\n if (!targetSlug) {\n // Show organization picker\n if (orgs.length === 1) {\n targetSlug = orgs[0].slug;\n printInfo(`Only one organization available: ${targetSlug}`);\n } else {\n targetSlug = await selectOrganization(orgs);\n }\n }\n\n // Verify the slug is valid\n const validOrg = orgs.find((o) => o.slug === targetSlug);\n if (!validOrg) {\n printError(`Organization \"${targetSlug}\" not found.`);\n printInfo('Available organizations: ' + orgs.map((o) => o.slug).join(', '));\n process.exit(1);\n }\n\n switchOrganization(targetSlug);\n printSuccess(`Switched to organization: ${validOrg.name} (${targetSlug})`);\n });\n}\n\n/**\n * Create the org command with subcommands\n */\nexport function createOrgsCommand(): Command {\n const orgCmd = new Command('org')\n .description('Manage organizations');\n\n // org list\n orgCmd\n .command('list')\n .description('List all organizations you have access to')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n\n const spinner = ora('Fetching organizations...').start();\n const result = await listOrganizations();\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to fetch organizations');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.stop();\n const orgs = result.data;\n const currentOrg = getCurrentOrganization();\n\n if (orgs.length === 0) {\n printInfo('No organizations found.');\n return;\n }\n\n const orgInfos = orgs.map((org) => ({\n slug: org.slug,\n name: org.name,\n role: org.role,\n current: org.slug === currentOrg ? '*' : '',\n }));\n\n if (options.json) {\n print(orgInfos, 'json');\n } else {\n print(orgInfos);\n console.log();\n printInfo(`Current organization: ${currentOrg || '(none selected)'}`);\n }\n });\n\n // org use <slug>\n orgCmd\n .command('use')\n .description('Set the current organization for CLI commands')\n .argument('<slug>', 'Organization slug to use')\n .action(async (slug: string) => {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n\n // Verify the org exists\n const spinner = ora('Verifying organization...').start();\n const result = await listOrganizations();\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to verify organization');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n const org = result.data.find((o) => o.slug === slug);\n if (!org) {\n spinner.fail('Organization not found');\n printError(`Organization \"${slug}\" not found.`);\n printInfo('Use \"transactional org list\" to see available organizations.');\n process.exit(1);\n }\n\n spinner.stop();\n switchOrganization(slug);\n printSuccess(`Now using organization: ${org.name} (${slug})`);\n });\n\n // org current\n orgCmd\n .command('current')\n .description('Show the current organization')\n .action(() => {\n const currentOrg = getCurrentOrganization();\n if (currentOrg) {\n printKeyValue('Current organization', currentOrg);\n } else {\n printInfo('No organization selected. Use \"transactional org use <slug>\" to select one.');\n }\n });\n\n return orgCmd;\n}\n\n// Helper functions\n\nfunction printInfo(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.blue('ℹ'), message);\n } else {\n console.log('[INFO]', message);\n }\n}\n\nfunction printHeading(title: string): void {\n if (isColorEnabled()) {\n console.log(chalk.bold.underline(title));\n } else {\n console.log(`=== ${title} ===`);\n }\n}\n","/**\n * Email Commands\n *\n * Commands for email operations: send, batch, templates, domains, senders, suppressions, stats.\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport ora from 'ora';\nimport { getApiClient, isLoggedIn } from '../lib';\nimport { printSuccess, printError, print, printKeyValue } from '../output';\nimport { confirm } from '../prompts';\nimport type {\n EmailSendOptions,\n EmailSendResult,\n EmailTemplate,\n EmailDomain,\n DomainCreateResponse,\n EmailSender,\n EmailSuppression,\n EmailStats,\n} from '../lib/types';\n\n/**\n * Create the email command\n */\nexport function createEmailCommand(): Command {\n const emailCmd = new Command('email').description('Email management commands');\n\n // Send command\n emailCmd\n .command('send')\n .description('Send a single email')\n .requiredOption('-f, --from <email>', 'Sender email address')\n .requiredOption('-t, --to <email>', 'Recipient email address')\n .option('-s, --subject <text>', 'Email subject')\n .option('--html <content>', 'HTML body')\n .option('--text <content>', 'Plain text body')\n .option('--template <id>', 'Template ID')\n .option('--template-alias <alias>', 'Template alias')\n .option('--model <json>', 'Template model (JSON)')\n .option('--cc <emails>', 'CC recipients (comma-separated)')\n .option('--bcc <emails>', 'BCC recipients (comma-separated)')\n .option('--reply-to <email>', 'Reply-to address')\n .option('--tag <tag>', 'Message tag')\n .option('--stream <id>', 'Stream ID')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const spinner = ora('Sending email...').start();\n\n try {\n const sendOptions: EmailSendOptions = {\n from: options.from,\n to: options.to,\n subject: options.subject,\n htmlBody: options.html,\n textBody: options.text,\n templateId: options.template ? parseInt(options.template, 10) : undefined,\n templateAlias: options.templateAlias,\n templateModel: options.model ? JSON.parse(options.model) : undefined,\n cc: options.cc ? options.cc.split(',').map((e: string) => e.trim()) : undefined,\n bcc: options.bcc ? options.bcc.split(',').map((e: string) => e.trim()) : undefined,\n replyTo: options.replyTo,\n tag: options.tag,\n streamId: options.stream ? parseInt(options.stream, 10) : undefined,\n };\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailSendResult>('/email', sendOptions);\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to send email');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Email sent successfully!');\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n printKeyValue('Message ID', result.data.messageId);\n printKeyValue('To', result.data.to);\n printKeyValue('Submitted At', result.data.submittedAt);\n }\n } catch (err) {\n spinner.fail('Failed to send email');\n printError(err instanceof Error ? err.message : 'Unknown error');\n process.exit(1);\n }\n });\n\n // Batch command\n emailCmd\n .command('batch <file>')\n .description('Send batch emails from a JSON file')\n .option('--dry-run', 'Validate without sending')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (file: string, options) => {\n requireLogin();\n\n // Read file\n if (!fs.existsSync(file)) {\n printError(`File not found: ${file}`);\n process.exit(1);\n }\n\n let emails;\n try {\n const content = fs.readFileSync(file, 'utf-8');\n emails = JSON.parse(content);\n } catch (err) {\n printError(`Failed to parse JSON file: ${err instanceof Error ? err.message : 'Unknown error'}`);\n process.exit(1);\n }\n\n if (!Array.isArray(emails)) {\n printError('File must contain an array of email objects');\n process.exit(1);\n }\n\n if (options.dryRun) {\n printSuccess(`Validated ${emails.length} emails (dry run)`);\n return;\n }\n\n const spinner = ora(`Sending ${emails.length} emails...`).start();\n\n try {\n const client = getApiClient(options.org);\n const result = await client.post<EmailSendResult[]>('/email/batch', { messages: emails });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to send batch emails');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed(`Sent ${result.data.length} emails successfully!`);\n\n if (options.json) {\n print(result.data, 'json');\n }\n } catch (err) {\n spinner.fail('Failed to send batch emails');\n printError(err instanceof Error ? err.message : 'Unknown error');\n process.exit(1);\n }\n });\n\n // Templates subcommand\n const templates = emailCmd.command('templates').description('Manage email templates');\n\n templates\n .command('list')\n .description('List email templates')\n .option('--server <id>', 'Filter by server ID')\n .option('--status <status>', 'Filter by status (DRAFT, ACTIVE, ARCHIVED)')\n .option('--limit <n>', 'Max results', '50')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<EmailTemplate[]>('/templates', {\n serverId: options.server ? parseInt(options.server, 10) : undefined,\n status: options.status,\n limit: parseInt(options.limit, 10),\n });\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to list templates');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n const data = result.data.map((t) => ({\n id: t.id,\n name: t.name,\n alias: t.alias || '-',\n status: t.status,\n updated: t.updatedAt,\n }));\n print(data);\n }\n });\n\n templates\n .command('get <id>')\n .description('Get template details')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<EmailTemplate>(`/templates/${id}`);\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to get template');\n process.exit(1);\n }\n\n print(result.data, options.json ? 'json' : undefined);\n });\n\n templates\n .command('create')\n .description('Create a new template')\n .requiredOption('--name <name>', 'Template name')\n .requiredOption('--subject <subject>', 'Email subject')\n .requiredOption('--server <id>', 'Server ID')\n .option('--alias <alias>', 'Template alias')\n .option('--html <content>', 'HTML body')\n .option('--text <content>', 'Plain text body')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const spinner = ora('Creating template...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailTemplate>('/templates', {\n name: options.name,\n subject: options.subject,\n serverId: parseInt(options.server, 10),\n alias: options.alias,\n htmlBody: options.html,\n textBody: options.text,\n });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to create template');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Template created!');\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n printKeyValue('ID', result.data.id);\n printKeyValue('Name', result.data.name);\n }\n });\n\n templates\n .command('update <id>')\n .description('Update a template')\n .option('--name <name>', 'Template name')\n .option('--subject <subject>', 'Email subject')\n .option('--alias <alias>', 'Template alias')\n .option('--html <content>', 'HTML body')\n .option('--text <content>', 'Plain text body')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options) => {\n requireLogin();\n\n const spinner = ora('Updating template...').start();\n\n const client = getApiClient(options.org);\n const result = await client.patch<EmailTemplate>(`/templates/${id}`, {\n name: options.name,\n subject: options.subject,\n alias: options.alias,\n htmlBody: options.html,\n textBody: options.text,\n });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to update template');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Template updated!');\n\n if (options.json) {\n print(result.data, 'json');\n }\n });\n\n templates\n .command('delete <id>')\n .description('Delete a template')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (id: string, options) => {\n requireLogin();\n\n const shouldDelete = await confirm(`Are you sure you want to delete template ${id}?`, false);\n if (!shouldDelete) {\n return;\n }\n\n const spinner = ora('Deleting template...').start();\n\n const client = getApiClient(options.org);\n const result = await client.delete(`/templates/${id}`);\n\n if (!result.success) {\n spinner.fail('Failed to delete template');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Template deleted!');\n });\n\n // Domains subcommand\n const domains = emailCmd.command('domains').description('Manage email domains');\n\n domains\n .command('list')\n .description('List email domains')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<{ totalCount: number; domains: EmailDomain[] }>('/domains');\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to list domains');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data.domains, 'json');\n } else {\n const data = result.data.domains.map((d) => ({\n id: d.id,\n domain: d.name,\n status: d.status,\n dkimVerified: d.dkimVerified ? 'Yes' : 'No',\n spfVerified: d.spfVerified ? 'Yes' : 'No',\n }));\n print(data);\n }\n });\n\n domains\n .command('add <domain>')\n .description('Add a domain')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (domain: string, options) => {\n requireLogin();\n\n const spinner = ora('Adding domain...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<DomainCreateResponse>('/domains', { domain });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to add domain');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Domain added!');\n\n console.log('\\nDNS Records to configure:');\n for (const record of result.data.dnsRecords) {\n console.log(`\\n${record.type}:`);\n console.log(` Name: ${record.name}`);\n console.log(` Value: ${record.value}`);\n }\n\n if (options.json) {\n print(result.data, 'json');\n }\n });\n\n domains\n .command('verify <id>')\n .description('Verify a domain')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (id: string, options) => {\n requireLogin();\n\n const spinner = ora('Verifying domain...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailDomain>(`/domains/${id}/verify`);\n\n if (!result.success || !result.data) {\n spinner.fail('Domain verification failed');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n if (result.data.status === 'VERIFIED') {\n spinner.succeed('Domain verified!');\n } else {\n spinner.info('Verification in progress');\n console.log('\\nVerification Status:');\n const checkmark = (verified: boolean) => verified ? '\\u2713' : '\\u2717';\n console.log(` ${checkmark(result.data.dkimVerified)} DKIM`);\n console.log(` ${checkmark(result.data.spfVerified)} SPF`);\n console.log(` ${checkmark(result.data.returnPathVerified)} Return-Path`);\n console.log(` ${checkmark(result.data.dmarcVerified)} DMARC`);\n if (result.data.verificationError) {\n console.log(`\\nError: ${result.data.verificationError}`);\n }\n }\n\n if (options.json) {\n print(result.data, 'json');\n }\n });\n\n domains\n .command('delete <id>')\n .description('Delete a domain')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (id: string, options) => {\n requireLogin();\n\n const shouldDelete = await confirm(`Are you sure you want to delete domain ${id}?`, false);\n if (!shouldDelete) {\n return;\n }\n\n const spinner = ora('Deleting domain...').start();\n\n const client = getApiClient(options.org);\n const result = await client.delete(`/domains/${id}`);\n\n if (!result.success) {\n spinner.fail('Failed to delete domain');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Domain deleted!');\n });\n\n // Senders subcommand\n const senders = emailCmd.command('senders').description('Manage email senders');\n\n senders\n .command('list')\n .description('List email senders')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<{ totalCount: number; senders: EmailSender[] }>('/senders');\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to list senders');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data.senders, 'json');\n } else {\n const data = result.data.senders.map((s) => ({\n id: s.id,\n email: s.email,\n name: s.name || '-',\n status: s.status,\n }));\n print(data);\n }\n });\n\n senders\n .command('add <email>')\n .description('Add an email sender')\n .option('--name <name>', 'Sender name')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (emailAddr: string, options) => {\n requireLogin();\n\n const spinner = ora('Adding sender...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailSender>('/senders', {\n email: emailAddr,\n name: options.name,\n });\n\n if (!result.success || !result.data) {\n spinner.fail('Failed to add sender');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Sender added! Check your email for verification link.');\n });\n\n senders\n .command('delete <id>')\n .description('Delete an email sender')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (id: string, options) => {\n requireLogin();\n\n const shouldDelete = await confirm(`Are you sure you want to delete sender ${id}?`, false);\n if (!shouldDelete) {\n return;\n }\n\n const spinner = ora('Deleting sender...').start();\n\n const client = getApiClient(options.org);\n const result = await client.delete(`/senders/${id}`);\n\n if (!result.success) {\n spinner.fail('Failed to delete sender');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Sender deleted!');\n });\n\n // Suppressions subcommand\n const suppressions = emailCmd.command('suppressions').description('Manage email suppressions');\n\n suppressions\n .command('list')\n .description('List email suppressions')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--server <id>', 'Filter by server ID')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const params = new URLSearchParams();\n if (options.server) {\n params.set('serverId', options.server);\n }\n const queryString = params.toString();\n const url = queryString ? `/suppressions?${queryString}` : '/suppressions';\n const result = await client.get<{ data: EmailSuppression[]; totalCount: number }>(url);\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to list suppressions');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data.data, 'json');\n } else {\n const data = result.data.data.map((s) => ({\n id: s.id,\n email: s.email,\n reason: s.reason,\n created: s.createdAt,\n }));\n print(data);\n }\n });\n\n suppressions\n .command('add <email>')\n .description('Add email to suppression list')\n .option('-o, --org <slug>', 'Organization slug')\n .requiredOption('--server <id>', 'Server ID to add suppression to')\n .option('--reason <reason>', 'Suppression reason (HARD_BOUNCE, SPAM_COMPLAINT, MANUAL, UNSUBSCRIBE)', 'MANUAL')\n .option('--notes <notes>', 'Optional notes')\n .action(async (emailAddr: string, options) => {\n requireLogin();\n\n const spinner = ora('Adding to suppression list...').start();\n\n const client = getApiClient(options.org);\n const result = await client.post<EmailSuppression>('/suppressions', {\n email: emailAddr,\n serverId: parseInt(options.server, 10),\n reason: options.reason,\n notes: options.notes,\n });\n\n if (!result.success) {\n spinner.fail('Failed to add suppression');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Email added to suppression list!');\n });\n\n suppressions\n .command('remove <id>')\n .description('Remove suppression by ID')\n .option('-o, --org <slug>', 'Organization slug')\n .action(async (id: string, options) => {\n requireLogin();\n\n const shouldRemove = await confirm(\n `Are you sure you want to remove suppression #${id}?`,\n false\n );\n if (!shouldRemove) {\n return;\n }\n\n const spinner = ora('Removing from suppression list...').start();\n\n const client = getApiClient(options.org);\n const result = await client.delete(`/suppressions/${id}`);\n\n if (!result.success) {\n spinner.fail('Failed to remove suppression');\n printError(result.error?.message || 'Unknown error');\n process.exit(1);\n }\n\n spinner.succeed('Suppression removed!');\n });\n\n // Stats command\n emailCmd\n .command('stats')\n .description('Get email statistics')\n .option('--period <period>', 'Period (day, week, month)', 'week')\n .option('--server <id>', 'Filter by server ID')\n .option('--stream <id>', 'Filter by stream ID')\n .option('-o, --org <slug>', 'Organization slug')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n requireLogin();\n\n const client = getApiClient(options.org);\n const result = await client.get<EmailStats>('/stats/outbound', {\n period: options.period,\n serverId: options.server ? parseInt(options.server, 10) : undefined,\n streamId: options.stream ? parseInt(options.stream, 10) : undefined,\n });\n\n if (!result.success || !result.data) {\n printError(result.error?.message || 'Failed to get stats');\n process.exit(1);\n }\n\n if (options.json) {\n print(result.data, 'json');\n } else {\n const data = result.data;\n console.log(`\\nEmail Statistics (${data.period})\\n`);\n printKeyValue('Sent', data.sent);\n printKeyValue('Delivered', data.delivered);\n printKeyValue('Bounced', data.bounced);\n printKeyValue('Complaints', data.complained);\n printKeyValue('Opened', data.opened);\n printKeyValue('Clicked', data.clicked);\n console.log('\\nRates:');\n printKeyValue('Delivery Rate', `${(data.deliveryRate * 100).toFixed(2)}%`);\n printKeyValue('Open Rate', `${(data.openRate * 100).toFixed(2)}%`);\n printKeyValue('Click Rate', `${(data.clickRate * 100).toFixed(2)}%`);\n printKeyValue('Bounce Rate', `${(data.bounceRate * 100).toFixed(2)}%`);\n printKeyValue('Complaint Rate', `${(data.complaintRate * 100).toFixed(4)}%`);\n }\n });\n\n return emailCmd;\n}\n\n/**\n * Require user to be logged in\n */\nfunction requireLogin(): void {\n if (!isLoggedIn()) {\n printError('Not logged in. Use \"transactional login\" to authenticate.');\n process.exit(1);\n }\n}\n","/**\n * Config Commands\n *\n * Commands for managing CLI configuration.\n */\n\nimport { Command } from 'commander';\nimport { getConfig, saveConfig, getConfigDir, getCredentialsFile, isColorEnabled } from '../lib';\nimport { printSuccess, printKeyValue, print } from '../output';\nimport chalk from 'chalk';\nimport type { OutputFormat } from '../lib/types';\n\n/**\n * Create the config command\n */\nexport function createConfigCommand(): Command {\n const configCmd = new Command('config').description('Manage CLI configuration');\n\n configCmd\n .command('show')\n .description('Show current configuration')\n .option('--json', 'Output as JSON')\n .action((options) => {\n const config = getConfig();\n\n if (options.json) {\n print(config, 'json');\n } else {\n console.log();\n printHeading('Current Configuration');\n printKeyValue('API URL', config.apiUrl);\n printKeyValue('Web URL', config.webUrl);\n printKeyValue('Output Format', config.outputFormat);\n printKeyValue('Color', config.color ? 'enabled' : 'disabled');\n console.log();\n printHeading('File Locations');\n printKeyValue('Config Directory', getConfigDir());\n printKeyValue('Credentials File', getCredentialsFile());\n }\n });\n\n configCmd\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action((key: string, value: string) => {\n const validKeys = ['apiUrl', 'webUrl', 'outputFormat', 'color'];\n\n if (!validKeys.includes(key)) {\n console.error(`Invalid key: ${key}`);\n console.error(`Valid keys: ${validKeys.join(', ')}`);\n process.exit(1);\n }\n\n // Validate values\n if (key === 'outputFormat') {\n const validFormats: OutputFormat[] = ['table', 'json', 'yaml'];\n if (!validFormats.includes(value as OutputFormat)) {\n console.error(`Invalid output format: ${value}`);\n console.error(`Valid formats: ${validFormats.join(', ')}`);\n process.exit(1);\n }\n }\n\n if (key === 'color') {\n const validColors = ['true', 'false', 'yes', 'no', '1', '0'];\n if (!validColors.includes(value.toLowerCase())) {\n console.error(`Invalid color value: ${value}`);\n console.error(`Valid values: true, false`);\n process.exit(1);\n }\n }\n\n // Convert value types\n let typedValue: string | boolean = value;\n if (key === 'color') {\n typedValue = ['true', 'yes', '1'].includes(value.toLowerCase());\n }\n\n saveConfig({ [key]: typedValue });\n printSuccess(`Set ${key} = ${typedValue}`);\n });\n\n configCmd\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n const config = getConfig();\n const value = config[key as keyof typeof config];\n\n if (value === undefined) {\n console.error(`Unknown key: ${key}`);\n process.exit(1);\n }\n\n console.log(value);\n });\n\n configCmd\n .command('reset')\n .description('Reset configuration to defaults')\n .action(() => {\n saveConfig({\n apiUrl: 'https://api.usetransactional.com',\n webUrl: 'https://usetransactional.com',\n outputFormat: 'table',\n color: true,\n });\n printSuccess('Configuration reset to defaults');\n });\n\n configCmd\n .command('path')\n .description('Show configuration file paths')\n .action(() => {\n console.log('Config Directory:', getConfigDir());\n console.log('Credentials File:', getCredentialsFile());\n });\n\n return configCmd;\n}\n\n// Helper function\nfunction printHeading(title: string): void {\n if (isColorEnabled()) {\n console.log(chalk.bold.underline(title));\n } else {\n console.log(`=== ${title} ===`);\n }\n}\n","/**\n * MCP Commands\n *\n * Commands for setting up MCP (Model Context Protocol) integration.\n * Supports Claude Desktop (paid and free tiers) and Claude Code.\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { getApiUrl, getWebUrl, getCurrentOrganization, isColorEnabled } from '../lib';\nimport { printSuccess, printError, print } from '../output';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface McpServerConfig {\n type: 'http';\n url: string;\n}\n\ninterface McpServerConfigWithCommand {\n command: string;\n args: string[];\n}\n\ninterface ClaudeDesktopConfig {\n mcpServers?: Record<string, McpServerConfig | McpServerConfigWithCommand>;\n}\n\ninterface ClaudeCodeConfig {\n mcpServers?: Record<string, McpServerConfig>;\n}\n\ntype InstallTarget = 'claude-desktop' | 'claude-code' | 'both';\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Get Claude Desktop config path based on platform\n */\nfunction getClaudeDesktopConfigPath(): string {\n const platform = os.platform();\n const homeDir = os.homedir();\n\n if (platform === 'darwin') {\n return path.join(homeDir, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');\n } else if (platform === 'win32') {\n return path.join(homeDir, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json');\n } else {\n // Linux\n return path.join(homeDir, '.config', 'claude', 'claude_desktop_config.json');\n }\n}\n\n/**\n * Get Claude Code config path\n */\nfunction getClaudeCodeConfigPath(): string {\n const homeDir = os.homedir();\n return path.join(homeDir, '.claude.json');\n}\n\n/**\n * Get the MCP server URL\n */\nfunction getMcpServerUrl(): string {\n const apiUrl = getApiUrl();\n // MCP server is at the /mcp endpoint on the API, or separate domain in production\n if (apiUrl.includes('localhost') || apiUrl.includes('127.0.0.1')) {\n return apiUrl.replace(/\\/$/, '') + '/mcp';\n }\n // In production, MCP has its own subdomain\n return process.env.MCP_SERVER_URL || 'https://mcp.usetransactional.com/mcp';\n}\n\n/**\n * Read and parse a JSON config file\n */\nfunction readJsonConfig<T>(filePath: string): T | null {\n try {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Write a JSON config file\n */\nfunction writeJsonConfig(filePath: string, config: unknown): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + '\\n');\n}\n\n/**\n * Print info message\n */\nfunction printInfo(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.blue('ℹ'), message);\n } else {\n console.log('[INFO]', message);\n }\n}\n\n/**\n * Print warning message\n */\nfunction printWarning(message: string): void {\n if (isColorEnabled()) {\n console.log(chalk.yellow('⚠'), message);\n } else {\n console.log('[WARN]', message);\n }\n}\n\n// =============================================================================\n// COMMANDS\n// =============================================================================\n\n/**\n * Create the mcp command\n */\nexport function createMcpCommand(): Command {\n const mcpCmd = new Command('mcp').description('MCP (Model Context Protocol) integration');\n\n // Setup command - shows instructions\n mcpCmd\n .command('setup')\n .description('Show MCP setup instructions')\n .action(() => {\n const mcpUrl = getMcpServerUrl();\n\n console.log('\\n📡 Transactional MCP Server Setup\\n');\n console.log('The MCP server allows Claude and other AI assistants to');\n console.log('interact with your Transactional account.\\n');\n\n console.log(chalk.bold('MCP Server URL:'));\n console.log(` ${chalk.cyan(mcpUrl)}\\n`);\n\n console.log(chalk.bold('Setup Options:\\n'));\n\n console.log(chalk.underline('1. Claude Desktop (Pro/Max/Team/Enterprise)'));\n console.log(' Go to Settings → Integrations → Add Custom Integration');\n console.log(` Enter URL: ${chalk.cyan(mcpUrl.replace('/mcp', ''))}`);\n console.log(' Claude will handle OAuth authorization automatically.\\n');\n\n console.log(chalk.underline('2. Claude Desktop (Free/JSON Config)'));\n console.log(' Run: transactional mcp install --target claude-desktop\\n');\n\n console.log(chalk.underline('3. Claude Code'));\n console.log(' Run: transactional mcp install --target claude-code\\n');\n\n console.log(chalk.bold('Available Commands:'));\n console.log(' transactional mcp install Install MCP config');\n console.log(' transactional mcp uninstall Remove MCP config');\n console.log(' transactional mcp status Check MCP server status');\n console.log(' transactional mcp tools List available MCP tools\\n');\n });\n\n // Config command - outputs config JSON\n mcpCmd\n .command('config')\n .description('Show MCP server configuration')\n .option('--target <target>', 'Target: claude-desktop, claude-code', 'claude-desktop')\n .option('--json', 'Output as raw JSON')\n .action((options) => {\n const mcpUrl = getMcpServerUrl();\n const target = options.target as InstallTarget;\n\n let config: ClaudeDesktopConfig | ClaudeCodeConfig;\n\n if (target === 'claude-code') {\n // Claude Code uses URL-based config (OAuth handled by Claude)\n config = {\n mcpServers: {\n transactional: {\n type: 'http',\n url: mcpUrl,\n },\n },\n };\n } else {\n // Claude Desktop (JSON config) uses mcp-remote for OAuth support\n config = {\n mcpServers: {\n transactional: {\n command: 'npx',\n args: ['mcp-remote', mcpUrl.replace('/mcp', '')],\n },\n },\n };\n }\n\n if (options.json) {\n console.log(JSON.stringify(config, null, 2));\n } else {\n console.log('\\n📋 MCP Configuration\\n');\n console.log(`Target: ${target}\\n`);\n console.log('```json');\n console.log(JSON.stringify(config, null, 2));\n console.log('```\\n');\n\n if (target === 'claude-desktop') {\n const configPath = getClaudeDesktopConfigPath();\n console.log(`Config file: ${configPath}\\n`);\n console.log(chalk.yellow('Note: Uses mcp-remote for OAuth support.'));\n console.log('Install mcp-remote: npm install -g mcp-remote\\n');\n } else {\n const configPath = getClaudeCodeConfigPath();\n console.log(`Config file: ${configPath}\\n`);\n }\n\n console.log('Run \"transactional mcp install\" to auto-install.\\n');\n }\n });\n\n // Install command - auto-install to Claude Desktop or Claude Code\n mcpCmd\n .command('install')\n .description('Install MCP config to Claude Desktop or Claude Code')\n .option('--target <target>', 'Target: claude-desktop, claude-code, both', 'both')\n .option('--force', 'Overwrite existing transactional config')\n .action(async (options) => {\n const target = options.target as InstallTarget;\n const mcpUrl = getMcpServerUrl();\n\n console.log('\\n📡 Installing Transactional MCP configuration...\\n');\n\n const targets = target === 'both' ? ['claude-desktop', 'claude-code'] : [target];\n let anyInstalled = false;\n let anySkipped = false;\n\n for (const t of targets) {\n try {\n if (t === 'claude-desktop') {\n const configPath = getClaudeDesktopConfigPath();\n const existingConfig = readJsonConfig<ClaudeDesktopConfig>(configPath) || { mcpServers: {} };\n\n // Check if transactional already exists\n if (existingConfig.mcpServers?.transactional && !options.force) {\n printWarning(`Claude Desktop: Already configured. Use --force to overwrite.`);\n console.log(` Config: ${configPath}\\n`);\n anySkipped = true;\n continue;\n }\n\n // Use mcp-remote for OAuth support\n existingConfig.mcpServers = {\n ...existingConfig.mcpServers,\n transactional: {\n command: 'npx',\n args: ['mcp-remote', mcpUrl.replace('/mcp', '')],\n },\n };\n\n writeJsonConfig(configPath, existingConfig);\n printSuccess(`Claude Desktop: Config installed`);\n console.log(` Config: ${configPath}\\n`);\n anyInstalled = true;\n\n } else if (t === 'claude-code') {\n const configPath = getClaudeCodeConfigPath();\n const existingConfig = readJsonConfig<ClaudeCodeConfig>(configPath) || {};\n\n // Check if transactional already exists\n if (existingConfig.mcpServers?.transactional && !options.force) {\n printWarning(`Claude Code: Already configured. Use --force to overwrite.`);\n console.log(` Config: ${configPath}\\n`);\n anySkipped = true;\n continue;\n }\n\n // Claude Code supports URL-based OAuth with HTTP transport\n existingConfig.mcpServers = {\n ...existingConfig.mcpServers,\n transactional: {\n type: 'http',\n url: mcpUrl,\n },\n };\n\n writeJsonConfig(configPath, existingConfig);\n printSuccess(`Claude Code: Config installed`);\n console.log(` Config: ${configPath}\\n`);\n anyInstalled = true;\n }\n } catch (err) {\n printError(`Failed to install ${t} config: ${err instanceof Error ? err.message : 'Unknown error'}`);\n }\n }\n\n if (anyInstalled) {\n console.log(chalk.bold('Next steps:'));\n console.log('1. Restart Claude Desktop/Code to apply changes');\n console.log('2. When you use a Transactional tool, Claude will prompt you to authorize');\n console.log('');\n } else if (anySkipped) {\n console.log('To force reinstall, run: transactional mcp install --force\\n');\n }\n });\n\n // Uninstall command\n mcpCmd\n .command('uninstall')\n .description('Remove MCP config from Claude Desktop and/or Claude Code')\n .option('--target <target>', 'Target: claude-desktop, claude-code, both', 'both')\n .action((options) => {\n const target = options.target as InstallTarget;\n const targets = target === 'both' ? ['claude-desktop', 'claude-code'] : [target];\n\n for (const t of targets) {\n const spinner = ora(`Removing MCP config from ${t}...`).start();\n\n try {\n const configPath = t === 'claude-desktop' ? getClaudeDesktopConfigPath() : getClaudeCodeConfigPath();\n\n if (!fs.existsSync(configPath)) {\n spinner.info(`No ${t} config found.`);\n continue;\n }\n\n const config = readJsonConfig<ClaudeDesktopConfig | ClaudeCodeConfig>(configPath);\n if (!config?.mcpServers?.transactional) {\n spinner.info(`Transactional not configured in ${t}.`);\n continue;\n }\n\n delete config.mcpServers.transactional;\n writeJsonConfig(configPath, config);\n spinner.succeed(`Removed from ${t}`);\n } catch (err) {\n spinner.fail(`Failed to remove ${t} config`);\n printError(err instanceof Error ? err.message : 'Unknown error');\n }\n }\n\n console.log('');\n printWarning('Please restart Claude Desktop/Code to apply changes.\\n');\n });\n\n // Status command\n mcpCmd\n .command('status')\n .description('Check MCP server status')\n .action(async () => {\n const spinner = ora('Checking MCP server...').start();\n\n const mcpUrl = getMcpServerUrl().replace('/mcp', '');\n\n try {\n const response = await fetch(`${mcpUrl}/health`);\n\n if (response.ok) {\n const data = await response.json();\n spinner.succeed('MCP server is running');\n console.log('\\nServer info:');\n print(data);\n\n // Also check OAuth metadata\n console.log('\\nOAuth endpoints:');\n console.log(` Authorization: ${mcpUrl}/mcp/authorize`);\n console.log(` Token: ${mcpUrl}/mcp/token`);\n console.log(` Protected Resource Metadata: ${mcpUrl}/.well-known/oauth-protected-resource`);\n } else {\n spinner.fail(`MCP server returned ${response.status}`);\n }\n } catch (err) {\n spinner.fail('Could not connect to MCP server');\n printError(err instanceof Error ? err.message : 'Unknown error');\n }\n });\n\n // Tools command - list available tools\n mcpCmd\n .command('tools')\n .description('List available MCP tools')\n .action(() => {\n console.log('\\n🔧 Available MCP Tools\\n');\n\n const tools = [\n { category: 'Email', tools: [\n { name: 'transactional_email_send', desc: 'Send a single email' },\n { name: 'transactional_email_batch', desc: 'Send multiple emails' },\n { name: 'transactional_email_stats', desc: 'Get email statistics' },\n { name: 'transactional_templates_list', desc: 'List templates' },\n { name: 'transactional_templates_get', desc: 'Get template details' },\n { name: 'transactional_templates_create', desc: 'Create template' },\n { name: 'transactional_domains_list', desc: 'List domains' },\n { name: 'transactional_domains_add', desc: 'Add domain' },\n { name: 'transactional_senders_list', desc: 'List senders' },\n { name: 'transactional_suppressions_list', desc: 'List suppressions' },\n ]},\n { category: 'Organization', tools: [\n { name: 'transactional_whoami', desc: 'Current user info' },\n { name: 'transactional_orgs_list', desc: 'List organizations' },\n { name: 'transactional_orgs_switch', desc: 'Switch organization' },\n { name: 'transactional_api_keys_list', desc: 'List API keys' },\n { name: 'transactional_api_keys_create', desc: 'Create API key' },\n { name: 'transactional_members_list', desc: 'List members' },\n ]},\n { category: 'Billing', tools: [\n { name: 'transactional_billing_usage', desc: 'Get usage' },\n { name: 'transactional_billing_invoices', desc: 'List invoices' },\n { name: 'transactional_billing_plan', desc: 'Get plan details' },\n ]},\n ];\n\n for (const category of tools) {\n console.log(`${category.category}:`);\n for (const tool of category.tools) {\n console.log(` ${tool.name.padEnd(35)} ${tool.desc}`);\n }\n console.log();\n }\n });\n\n return mcpCmd;\n}\n","/**\n * Transactional CLI\n *\n * Main CLI entry point with Commander.js setup.\n */\n\nimport { Command } from 'commander';\nimport { initConfig } from './lib';\nimport {\n createLoginCommand,\n createLogoutCommand,\n createWhoamiCommand,\n createSwitchCommand,\n createOrgsCommand,\n createEmailCommand,\n createConfigCommand,\n createMcpCommand,\n} from './commands';\n\n// Initialize configuration on import\ninitConfig();\n\n/**\n * Create the CLI program\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('transactional')\n .description('CLI for Transactional - manage email, SMS, forms, and more')\n .version('0.1.3');\n\n // Auth commands\n program.addCommand(createLoginCommand());\n program.addCommand(createLogoutCommand());\n program.addCommand(createWhoamiCommand());\n program.addCommand(createSwitchCommand());\n program.addCommand(createOrgsCommand());\n\n // Email commands\n program.addCommand(createEmailCommand());\n\n // Config commands\n program.addCommand(createConfigCommand());\n\n // MCP commands\n program.addCommand(createMcpCommand());\n\n return program;\n}\n\n// Export library functions for programmatic use\nexport * from './lib';\nexport * from './commands';\nexport * from './output';\nexport * from './prompts';\n","#!/usr/bin/env node\n\n/**\n * Transactional CLI Binary\n *\n * Entry point for the CLI executable.\n */\n\nimport { createProgram } from './index';\n\nconst program = createProgram();\nprogram.parse(process.argv);\n"]}
|