blockintel-gate-sdk 0.3.1 → 0.3.2
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/README.md +5 -3
- package/dist/index.cjs +552 -66
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +200 -4
- package/dist/index.d.ts +200 -4
- package/dist/index.js +552 -67
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/crypto.ts","../src/utils/canonicalJson.ts","../src/auth/HmacSigner.ts","../src/auth/ApiKeyAuth.ts","../src/types/errors.ts","../src/http/retry.ts","../src/http/HttpClient.ts","../src/utils/time.ts","../src/stepup/stepup.ts","../src/circuit/CircuitBreaker.ts","../src/metrics/MetricsCollector.ts","../src/kms/wrapAwsSdkV3KmsClient.ts","../src/provenance/ProvenanceProvider.ts","../src/client/GateClient.ts"],"names":["crypto","GateErrorCode","uuidv4"],"mappings":";;;;;;;;;;;;AASA,eAAsB,UAAA,CAAW,QAAgB,OAAA,EAAkC;AAMjF,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAA,EAAQ;AAIlD,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AACrC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAE1C,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MAC9B,KAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,MAChC,KAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAEA,IAAA,MAAM,YAAY,MAAM,MAAA,CAAO,OAAO,IAAA,CAAK,MAAA,EAAQ,KAAK,WAAW,CAAA;AACnE,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAW,SAAS,CAAC,CAAA;AACtD,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EACtE;AAGA,EAAA,IAAI,OAAO,cAAY,WAAA,EAAa;AAClC,IAAA,MAAMA,OAAAA,GAAS,UAAQ,QAAQ,CAAA;AAE/B,IAAA,MAAM,IAAA,GAAOA,OAAAA,CAAO,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA;AAC/C,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,MAAM,CAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AACjE;;;AC9BO,SAAS,iBAAiB,GAAA,EAAsB;AACrD,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAO,QAAQ,SAAA,EAAW;AACvD,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,QAAQ,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAAI,CAAC,CAAA;AACtD,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC9B,MAAA,MAAM,KAAA,GAAS,IAAgC,GAAG,CAAA;AAClD,MAAA,MAAM,cAAA,GAAiB,iBAAiB,KAAK,CAAA;AAC7C,MAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,IAAI,cAAc,CAAA,CAAA;AAAA,IACjD,CAAC,CAAA;AACD,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EAC5B;AAGA,EAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3B;AAKA,eAAsB,UAAU,KAAA,EAAgC;AAC9D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAA,EAAQ;AAClD,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AACjC,IAAA,MAAM,aAAa,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AAC7D,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAW,UAAU,CAAC,CAAA;AACvD,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EACtE;AAIA,EAAA,IAAI,OAAO,cAAY,WAAA,EAAa;AAClC,IAAA,MAAMA,OAAAA,GAAS,UAAQ,QAAQ,CAAA;AAC/B,IAAA,OAAOA,OAAAA,CAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,KAAA,EAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAC7D;;;ACvBO,IAAM,aAAN,MAAiB;AAAA,EACL,KAAA;AAAA,EACA,MAAA;AAAA,EAEjB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAErB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAA,EAOU;AAC1B,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,UAAU,WAAA,EAAa,SAAA,EAAW,MAAK,GAAI,MAAA;AAGjE,IAAA,MAAM,QAAA,GAAW,IAAA,GAAO,gBAAA,CAAiB,IAAI,CAAA,GAAI,EAAA;AACjD,IAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,QAAQ,CAAA;AAGzC,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,IAAA;AAAA,MACA,OAAO,WAAA,EAAY;AAAA,MACnB,IAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,CAAK,KAAA;AAAA,MACL,OAAO,WAAW,CAAA;AAAA,MAClB,SAAA;AAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI,CAAA;AAGX,IAAA,MAAM,SAAA,GAAY,MAAM,UAAA,CAAW,IAAA,CAAK,QAAQ,aAAa,CAAA;AAE7D,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,QAAA;AAAA,MACpB,iBAAiB,IAAA,CAAK,KAAA;AAAA,MACtB,qBAAA,EAAuB,OAAO,WAAW,CAAA;AAAA,MACzC,mBAAA,EAAqB,SAAA;AAAA,MACrB,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AACF,CAAA;;;AC7EO,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EAEjB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAErB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,MAAA,EAII;AAChB,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,SAAA,EAAU,GAAI,MAAA;AAE7C,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,kBAAA,EAAoB,QAAA;AAAA,MACpB,mBAAA,EAAqB,SAAA;AAAA,MACrB,qBAAA,EAAuB,OAAO,WAAW;AAAA,KAC3C;AAAA,EACF;AACF,CAAA;;;AC1CO,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,eAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,eAAA,wBAAA,CAAA,GAAyB,wBAAA;AACzB,EAAAA,eAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,qBAAA,CAAA,GAAsB,qBAAA;AACtB,EAAAA,eAAA,YAAA,CAAA,GAAa,YAAA;AAbH,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAmBL,IAAM,SAAA,GAAN,cAAwB,KAAA,CAAM;AAAA,EACnB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EAEhB,WAAA,CACE,IAAA,EACA,OAAA,EACA,OAAA,EAOA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAS,OAAA,EAAS,MAAA;AACvB,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA;AACxB,IAAA,IAAA,CAAK,YAAY,OAAA,EAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,gBAAgB,OAAA,EAAS,aAAA;AAC9B,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,IACvB;AACA,IAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAChD;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,eAAe,IAAA,CAAK;AAAA,KACtB;AAAA,EACF;AACF;AAMO,IAAM,wBAAA,GAAN,cAAuC,SAAA,CAAU;AAAA,EACtD,YAAY,SAAA,EAAoB;AAC9B,IAAA,KAAA;AAAA,MACE,wBAAA;AAAA,MACA,mHAAA;AAAA,MACA,EAAE,SAAA;AAAU,KACd;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;AAMO,IAAM,sBAAA,GAAN,cAAqC,SAAA,CAAU;AAAA,EACpC,SAAA;AAAA,EACA,UAAA;AAAA,EAEhB,WAAA,CACE,UAAA,EACA,SAAA,EACA,aAAA,EACA,SAAA,EACA;AACA,IAAA,KAAA;AAAA,MACE,SAAA;AAAA,MACA,wBAAwB,UAAU,CAAA,CAAA;AAAA,MAClC,EAAE,aAAA,EAAe,SAAA,EAAW,SAAS,EAAE,UAAA,EAAY,WAAU;AAAE,KACjE;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AACF;AAMO,IAAM,0BAAA,GAAN,cAAyC,SAAA,CAAU;AAAA,EACxD,WAAA,CAAY,SAAiB,SAAA,EAAoB;AAC/C,IAAA,KAAA,CAAM,qBAAA,4BAAmC,OAAA,EAAS,EAAE,SAAA,EAAW,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AAAA,EACd;AACF;AAMO,IAAM,mBAAA,GAAN,cAAkC,SAAA,CAAU;AAAA,EACjD,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB,SAAA,EAAoB;AAC/D,IAAA,KAAA;AAAA,MACE,MAAA,KAAW,MAAM,cAAA,sBAA6B,WAAA;AAAA,MAC9C,OAAA;AAAA,MACA,EAAE,QAAQ,SAAA;AAAU,KACtB;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAMO,IAAM,6BAAA,GAAN,cAA4C,SAAA,CAAU;AAAA,EAC3C,eAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EAEhB,WAAA,CACE,eAAA,EACA,SAAA,EACA,WAAA,EACA,SAAA,EACA;AACA,IAAA,KAAA;AAAA,MACE,wBAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA,QACE,SAAA;AAAA,QACA,OAAA,EAAS,EAAE,eAAA,EAAiB,SAAA,EAAW,WAAA;AAAY;AACrD,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,+BAAA;AACZ,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AACF;;;ACvJA,IAAM,qBAAA,GAAgD;AAAA,EACpD,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY,GAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;AAKO,SAAS,kBAAkB,MAAA,EAAyB;AAEzD,EAAA,OAAO,MAAA,KAAW,GAAA,IAAQ,MAAA,IAAU,GAAA,IAAO,MAAA,GAAS,GAAA;AACtD;AAKO,SAAS,iBAAiB,KAAA,EAAyB;AAExD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAC1C,IAAA,OACE,OAAA,CAAQ,SAAS,SAAS,CAAA,IAC1B,QAAQ,QAAA,CAAS,SAAS,CAAA,IAC1B,OAAA,CAAQ,QAAA,CAAS,YAAY,KAC7B,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,IAC/B,OAAA,CAAQ,SAAS,WAAW,CAAA,IAC5B,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA;AAAA,EAEjC;AACA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,qBAAA,CACd,SACA,OAAA,EACQ;AACR,EAAA,MAAM,gBAAA,GAAmB,QAAQ,WAAA,GAAc,IAAA,CAAK,IAAI,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAC,CAAA;AACnF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,gBAAA;AACrC,EAAA,MAAM,QAAQ,gBAAA,GAAmB,MAAA;AACjC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,OAAA,CAAQ,UAAU,CAAA;AAC3C;AAKA,SAAS,qBAAqB,KAAA,EAAyB;AACrD,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,EAAO;AACzD,IAAA,MAAM,SAAA,GAAY,KAAA;AAElB,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,cAAA,IAAkB,SAAA,CAAU,SAAS,cAAA,EAAgB;AAC1E,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAA,CAAU,MAAA,IAAU,iBAAA,CAAkB,SAAA,CAAU,MAAM,CAAA,EAAG;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,gBAAA,CACpB,EAAA,EACA,OAAA,GAAwB,EAAC,EACb;AACZ,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,qBAAA,EAAuB,GAAG,OAAA,EAAQ;AACpD,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,aAAa,OAAA,EAAA,EAAW;AAC5D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAGZ,MAAA,IAAI,OAAA,IAAW,KAAK,WAAA,EAAa;AAC/B,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,iBAAiB,QAAA,IAAY,CAAC,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA,EAAG;AACjE,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,WAAA,GACH,KAAA,YAAiB,QAAA,IAAY,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA,IAC5D,gBAAA,CAAiB,KAAK,CAAA,IACtB,oBAAA,CAAqB,KAAK,CAAA;AAE5B,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,OAAA,EAAS,IAAI,CAAA;AACjD,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,MAAM,SAAA;AACR;;;ACzFO,IAAM,aAAN,MAAiB;AAAA,EACL,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EAEjB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,IAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,2BAAA;AACrC,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAG3B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAGA,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,aAAa,YAAA,EAAc;AAC3E,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,IAAK,CAAC,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AAC/E,QAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,OAAA,EAAqC;AACpD,IAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,OAAA,GAAU,EAAC,EAAG,IAAA,EAAM,WAAU,GAAI,OAAA;AAExD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,IAAI,CAAA,CAAA;AAGlC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AAErE,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,QACrB,YAAY;AACV,UAAA,MAAM,YAAA,GAA4B;AAAA,YAChC,MAAA;AAAA,YACA,OAAA,EAAS;AAAA,cACP,GAAG,OAAA;AAAA,cACH,cAAc,IAAA,CAAK,SAAA;AAAA,cACnB,cAAA,EAAgB;AAAA,aAClB;AAAA,YACA,QAAQ,UAAA,CAAW;AAAA,WACrB;AAEA,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,YAAA,CAAa,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzC;AAEA,UAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,YAAY,CAAA;AAGzC,UAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5C,YAAA,MAAM,GAAA;AAAA,UACR;AAGA,UAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC7C,YAAA,MAAM,GAAA;AAAA,UACR;AAEA,UAAA,OAAO,GAAA;AAAA,QACT,CAAA;AAAA,QACA;AAAA,UACE,GAAG,IAAA,CAAK;AAAA;AAAA;AAEV,OACF;AAEA,MAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,MAAA,IAAI,IAAA;AACJ,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAEvD,MAAA,IAAI,WAAA,IAAe,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC3D,QAAA,IAAI;AACF,UAAA,IAAA,GAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,QAC9B,SAAS,UAAA,EAAY;AACnB,UAAA,MAAM,IAAI,SAAA;AAAA,YAAA,kBAAA;AAAA,YAER,+BAAA;AAAA,YACA;AAAA,cACE,QAAQ,QAAA,CAAS,MAAA;AAAA,cACjB,SAAA;AAAA,cACA,KAAA,EAAO,UAAA,YAAsB,KAAA,GAAQ,UAAA,GAAa,KAAA;AAAA;AACpD,WACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,kBAAA;AAAA,UAER,4BAA4B,WAAW,CAAA,CAAA;AAAA,UACvC;AAAA,YACE,QAAQ,QAAA,CAAS,MAAA;AAAA,YACjB,SAAS,EAAE,IAAA,EAAM,KAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,YACxC;AAAA;AACF,SACF;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA;AACxD,QAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,KAAA,CAAA;AAElE,QAAA,MAAM,IAAI,UAAU,SAAA,EAAW,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAA,EAAI;AAAA,UAChF,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,aAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,SAAA,CAAA,SAAA,gBAAiC,CAAA,sBAAA,EAAyB,IAAA,CAAK,SAAS,CAAA,EAAA,CAAA,EAAM;AAAA,UACtF;AAAA,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA;AACrD,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,MAAA;AAE/D,QAAA,IAAI,OAAA;AACJ,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA,EAAK;AAC9B,UAAA,IAAI;AACF,YAAA,OAAA,GAAU,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,UAC3B,CAAA,CAAA,MAAQ;AACN,YAAA,OAAA,GAAU,EAAE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,UAC3C;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,MAAM,IAAI,UAAU,SAAA,EAAW,CAAA,KAAA,EAAQ,MAAM,MAAM,CAAA,EAAA,EAAK,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI;AAAA,UAC1E,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,aAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,eAAA;AAAA,UAER,kBAAkB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,UACxE;AAAA,YACE,SAAA;AAAA,YACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA;AAC1C,SACF;AAAA,MACF;AAGA,MAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,IAAI,SAAA;AAAA,QAAA,eAAA;AAAA,QAER,qBAAqB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QAC3E;AAAA,UACE,SAAA;AAAA,UACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA;AAC1C,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAA,EAA+B;AACvD,IAAA,IAAI,WAAW,GAAA,EAAK,OAAA,cAAA;AACpB,IAAA,IAAI,WAAW,GAAA,EAAK,OAAA,WAAA;AACpB,IAAA,IAAI,WAAW,GAAA,EAAK,OAAA,WAAA;AACpB,IAAA,IAAI,WAAW,GAAA,EAAK,OAAA,cAAA;AACpB,IAAA,IAAI,MAAA,IAAU,GAAA,IAAO,MAAA,GAAS,GAAA,EAAK,OAAA,cAAA;AACnC,IAAA,OAAA,eAAA;AAAA,EACF;AACF,CAAA;;;AC7NO,SAAS,KAAA,GAAgB;AAC9B,EAAA,OAAO,KAAK,GAAA,EAAI;AAClB;AAKO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACrC;AAKO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3C;AAKO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACTA,IAAM,2BAAA,GAA8B,GAAA;AACpC,IAAM,mBAAA,GAAsB,IAAA;AAC5B,IAAM,uBAAA,GAA0B,GAAA;AAChC,IAAM,uBAAA,GAA0B,GAAA;AAChC,IAAM,2BAAA,GAA8B,GAAA;AAK7B,IAAM,eAAN,MAAmB;AAAA,EACP,UAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EAEjB,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,2BAAA;AACrD,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,mBAAA;AACrC,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,uBAAA;AAC7C,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,uBAAA;AAC7C,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,2BAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,SAAA,EAAkD;AAChE,IAAA,MAAM,IAAA,GAAO,mCAAmC,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAC,CAAA,WAAA,EAAc,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA;AAE5H,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAQxC;AAAA,QACA,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,MAAM,QAAA,GAAiC;AAAA,QACrC,QAAQ,WAAA,CAAY,MAAA;AAAA,QACpB,QAAA,EAAU,WAAA,CAAY,SAAA,IAAa,WAAA,CAAY,QAAA;AAAA,QAC/C,SAAA,EAAW,WAAA,CAAY,UAAA,IAAc,WAAA,CAAY,SAAA;AAAA,QACjD,UAAU,WAAA,CAAY,QAAA;AAAA,QACtB,WAAA,EAAa,WAAA,CAAY,YAAA,IAAgB,WAAA,CAAY,WAAA;AAAA,QACrD,aAAA,EAAe,WAAA,CAAY,cAAA,IAAkB,WAAA,CAAY,aAAA;AAAA,QACzD,WAAA,EAAa,WAAA,CAAY,aAAA,IAAiB,WAAA,CAAY,WAAA;AAAA,QACtD,KAAK,WAAA,CAAY;AAAA,OACnB;AAGA,MAAA,MAAM,MAAM,eAAA,EAAgB;AAC5B,MAAA,IAAI,QAAA,CAAS,GAAA,KAAQ,KAAA,CAAA,IAAa,QAAA,CAAS,OAAO,GAAA,EAAK;AACrD,QAAA,OAAO;AAAA,UACL,GAAG,QAAA;AAAA,UACH,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,CAAM,IAAA,KAAA,WAAA,kBAAkC;AACxE,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,WAAA;AAAA,UAER,8BAA8B,SAAS,CAAA,CAAA;AAAA,UACvC,EAAE,SAAA;AAAU,SACd;AAAA,MACF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CACJ,SAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,IAAA,CAAK,SAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,iBAAA;AAE/C,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,iBAAA;AAAA,UAER,kCAAkC,SAAS,CAAA,EAAA,CAAA;AAAA,UAC3C,EAAE,SAAA;AAAU,SACd;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAG7C,QAAA,MAAM,MAAM,eAAA,EAAgB;AAC5B,QAAA,IAAI,MAAA,CAAO,GAAA,KAAQ,KAAA,CAAA,IAAa,MAAA,CAAO,OAAO,GAAA,EAAK;AACjD,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,SAAA;AAAA,YACR,SAAA;AAAA,YACA,SAAA;AAAA,YACA,eAAe,MAAA,CAAO;AAAA,WACxB;AAAA,QACF;AAGA,QAAA,IACE,MAAA,CAAO,WAAW,UAAA,IAClB,MAAA,CAAO,WAAW,QAAA,IAClB,MAAA,CAAO,WAAW,SAAA,EAClB;AACA,UAAA,OAAO;AAAA,YACL,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,SAAA;AAAA,YACA,SAAA;AAAA,YACA,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,aAAa,MAAA,CAAO,WAAA;AAAA,YACpB,eAAe,MAAA,CAAO;AAAA,WACxB;AAAA,QACF;AAGA,QAAA,MAAM,MAAM,UAAU,CAAA;AAAA,MACxB,SAAS,KAAA,EAAO;AAEd,QAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,CAAM,IAAA,KAAA,WAAA,kBAAkC;AACxE,UAAA,MAAM,KAAA;AAAA,QACR;AAIA,QAAA,MAAM,WAAA,GAAc,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,CAAA;AAC9C,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,MAAM,IAAI,SAAA;AAAA,YAAA,iBAAA;AAAA,YAER,kCAAkC,SAAS,CAAA,EAAA,CAAA;AAAA,YAC3C,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA;AAAU,WACjE;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,WAAW,CAAC,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAAA,EAA6B;AACpC,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AACA,IAAA,OAAO,KAAA,CAAM,UAAA,EAAY,IAAA,CAAK,aAAA,EAAe,KAAK,aAAa,CAAA;AAAA,EACjE;AACF,CAAA;;;ACvKO,IAAM,iBAAN,MAAqB;AAAA,EAClB,KAAA,GAAsB,QAAA;AAAA,EACtB,QAAA,GAAW,CAAA;AAAA,EACX,SAAA,GAAY,CAAA;AAAA,EACZ,eAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA,EAEL,aAAA;AAAA,EACA,UAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,4BAAA,IAAgC,CAAA;AAC5D,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,GAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,EAAA,EAAkC;AAEjD,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,eAAA,GAC9B,GAAA,GAAM,KAAK,eAAA,GACX,QAAA;AAEJ,MAAA,IAAI,oBAAA,IAAwB,KAAK,UAAA,EAAY;AAC3C,QAAA,IAAA,CAAK,KAAA,GAAQ,WAAA;AACb,QAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,uBAAA;AAAA,UACR,CAAA,0CAAA,EAA6C,IAAA,CAAK,UAAA,GAAa,oBAAoB,CAAA,EAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AACxB,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,SAAA,EAAA;AACL,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,EAAI;AAEhC,IAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa;AAE9B,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,MAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,IAClB,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU;AAElC,MAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,QAAA,EAAA;AACL,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,EAAI;AAEhC,IAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa;AAE9B,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,MAAA,IAAA,CAAK,WAAA,EAAA;AAAA,IACP,WAAW,IAAA,CAAK,KAAA,KAAU,YAAY,IAAA,CAAK,QAAA,IAAY,KAAK,aAAA,EAAe;AAEzE,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,MAAA,IAAA,CAAK,WAAA,EAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAoC;AAClC,IAAA,OAAO;AAAA,MACL,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AACF,CAAA;AAKO,IAAM,uBAAA,GAAN,cAAsC,KAAA,CAAM;AAAA,EACjD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF,CAAA;;;AClHO,IAAM,mBAAN,MAAuB;AAAA,EACpB,aAAA,GAAgB,CAAA;AAAA,EAChB,YAAA,GAAe,CAAA;AAAA,EACf,YAAA,GAAe,CAAA;AAAA,EACf,WAAA,GAAc,CAAA;AAAA,EACd,aAAA,GAAgB,CAAA;AAAA,EAChB,WAAA,GAAc,CAAA;AAAA,EACd,uBAAA,GAA0B,CAAA;AAAA,EAC1B,YAAsB,EAAC;AAAA,EAEd,UAAA,GAAa,GAAA;AAAA;AAAA,EACb,QAAuB,EAAC;AAAA;AAAA;AAAA;AAAA,EAKzC,aAAA,CAAc,UAAiD,SAAA,EAAyB;AACtF,IAAA,IAAA,CAAK,aAAA,EAAA;AAEL,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,IAAA,CAAK,YAAA,EAAA;AAAA,IACP,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,MAAA,IAAA,CAAK,YAAA,EAAA;AAAA,IACP,CAAA,MAAA,IAAW,aAAa,iBAAA,EAAmB;AACzC,MAAA,IAAA,CAAK,WAAA,EAAA;AAAA,IACP;AAGA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,SAAS,CAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AAC3C,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAEA,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,aAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,WAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAA,GAAiC;AAC/B,IAAA,IAAA,CAAK,uBAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,yBAAyB,IAAA,CAAK,uBAAA;AAAA,MAC9B,SAAA,EAAW,CAAC,GAAG,IAAA,CAAK,SAAS;AAAA;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,OAAO,CAAA;AAAA,MACd,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,uBAAA,GAA0B,CAAA;AAC/B,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACpB;AACF,CAAA;ACvCO,SAAS,aAAA,CACd,SAAA,EACA,UAAA,EACA,OAAA,GAAgC,EAAC,EACf;AAClB,EAAA,MAAM,cAAA,GAAiD;AAAA,IACrD,IAAA,EAAM,QAAQ,IAAA,IAAQ,SAAA;AAAA,IACtB,UAAA,EAAY,OAAA,CAAQ,UAAA,KAAe,MAAM;AAAA,IAAC,CAAA,CAAA;AAAA,IAC1C,eAAA,EAAiB,QAAQ,eAAA,IAAmB;AAAA,GAC9C;AAGA,EAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,SAAA,EAAW;AAAA,IACnC,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,MAAA,IAAI,SAAS,MAAA,EAAQ;AAEnB,QAAA,OAAO,eAAgB,OAAA,EAAc;AAEnC,UAAA,IAAI,WAAW,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,aAAA,EAAe;AAChF,YAAA,OAAO,MAAM,iBAAA;AAAA,cACX,OAAA;AAAA,cACA,MAAA;AAAA,cACA,UAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAGA,UAAA,OAAO,MAAO,MAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAAA,QAC3C,CAAA;AAAA,MACF;AAGA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AAGD,EAAA,OAAA,CAAQ,eAAA,GAAkB,SAAA;AAC1B,EAAA,OAAA,CAAQ,WAAA,GAAc,UAAA;AACtB,EAAA,OAAA,CAAQ,eAAA,GAAkB,cAAA;AAE1B,EAAA,OAAO,OAAA;AACT;AAUA,SAAS,uBAAuB,OAAA,EAO9B;AAGA,EAAA,MAAM,OAAA,GAAW,OAAA,CAAgB,KAAA,EAAO,OAAA,IAAY,OAAA,CAAgB,OAAA;AACpE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AACA,EAAA,MAAM,gBAAgB,OAAA,YAAmB,MAAA,GACrC,OAAA,GACA,MAAA,CAAO,KAAK,OAAc,CAAA;AAC9B,EAAA,MAAM,WAAA,GAAc,WAAW,QAAQ,CAAA,CAAE,OAAO,aAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAE3E,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,MAAA;AAAA;AAAA,IACX,WAAA,EAAa,WAAA;AAAA,IACb,QAAA,EAAU;AAAA;AAAA,GACZ;AACF;AAKA,eAAe,iBAAA,CACb,OAAA,EACA,cAAA,EACA,UAAA,EACA,OAAA,EACc;AAEd,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,eAAA,CAAgB,OAAO,CAAA;AAIhD,EAAA,MAAM,QAAA,GAAY,OAAA,CAAgB,KAAA,EAAO,KAAA,IAAU,QAAgB,KAAA,IAAS,SAAA;AAG5E,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,QAAA;AAAA,IACA,cAAA,EAAgB;AAAA;AAAA,GAClB;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,QAAA,CAAS;AAAA,MACzC,QAAA;AAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,OAAA,CAAQ,WAAW,OAAA,EAAS,EAAE,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AAE3D,IAAA,IAAI,OAAA,CAAQ,SAAS,SAAA,EAAW;AAE9B,MAAA,OAAO,MAAM,cAAA,CAAe,IAAA,CAAK,IAAI,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IAC3D;AAGA,IAAA,OAAO,MAAM,cAAA,CAAe,IAAA,CAAK,IAAI,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,EAC3D,SAAS,KAAA,EAAY;AAEnB,IAAA,IAAI,iBAAiB,sBAAA,EAAwB;AAC3C,MAAA,OAAA,CAAQ,WAAW,OAAA,EAAS,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA;AACxD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI,iBAAiB,6BAAA,EAA+B;AAClD,MAAA,OAAA,CAAQ,WAAW,iBAAA,EAAmB,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA;AAClE,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;;;ACjMO,IAAM,qBAAN,MAAyB;AAAA;AAAA;AAAA;AAAA,EAI9B,OAAO,aAAA,GAAmC;AACxC,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,CAAI,gBAAA;AACzB,IAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,oBAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,CAAI,eAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,CAAI,iBAAA;AAC1B,IAAA,MAAM,gBAAA,GAAmB,QAAQ,GAAA,CAAI,sBAAA;AACrC,IAAA,MAAM,iBAAA,GAAoB,QAAQ,GAAA,CAAI,uBAAA;AACtC,IAAA,MAAM,kBAAA,GAAqB,QAAQ,GAAA,CAAI,wBAAA;AACvC,IAAA,MAAM,cAAA,GAAiB,QAAQ,GAAA,CAAI,oBAAA;AAGnC,IAAA,IAAI,CAAC,QAAQ,CAAC,QAAA,IAAY,CAAC,GAAA,IAAO,CAAC,KAAA,IAAS,CAAC,gBAAA,EAAkB;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,aAAyB,EAAC;AAEhC,IAAA,IAAI,IAAA,aAAiB,IAAA,GAAO,IAAA;AAC5B,IAAA,IAAI,QAAA,aAAqB,QAAA,GAAW,QAAA;AACpC,IAAA,IAAI,GAAA,aAAgB,GAAA,GAAM,GAAA;AAC1B,IAAA,IAAI,KAAA,aAAkB,KAAA,GAAQ,KAAA;AAG9B,IAAA,IAAI,gBAAA,IAAoB,iBAAA,IAAqB,kBAAA,IAAsB,cAAA,EAAgB;AACjF,MAAA,UAAA,CAAW,WAAA,GAAc;AAAA,QACvB,KAAA,EAAO,gBAAA,KAAqB,MAAA,IAAU,gBAAA,KAAqB,GAAA;AAAA,QAC3D,MAAA,EAAQ,iBAAA;AAAA,QACR,OAAA,EAAS,kBAAA;AAAA,QACT,GAAA,EAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAA,GAAqB;AAC1B,IAAA,OAAO,CAAC,EACN,OAAA,CAAQ,GAAA,CAAI,oBACZ,OAAA,CAAQ,GAAA,CAAI,oBAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,sBAAA,CAAA;AAAA,EAEhB;AACF;;;ACjDO,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EAEjB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,QAC/B,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,QACnB,MAAA,EAAQ,OAAO,IAAA,CAAK;AAAA,OACrB,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,QAC/B,MAAA,EAAQ,OAAO,IAAA,CAAK;AAAA,OACrB,CAAA;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,MAC/B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAGD,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa;AAAA,QACnC,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,iBAAA,EAAmB,OAAO,MAAA,EAAQ,iBAAA;AAAA,QAClC,SAAA,EAAW,OAAO,MAAA,EAAQ;AAAA,OAC3B,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA;AAAA,IAChE;AAGA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,gBAAA,EAAiB;AACpC,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAA,CACJ,GAAA,EACA,IAAA,EACoC;AACpC,IAAA,MAAM,SAAA,GAAY,IAAA,EAAM,SAAA,IAAaC,EAAA,EAAO;AAC5C,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,WAAA,IAAe,KAAA,EAAM;AAC7C,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB,kBAAA;AAGjD,IAAA,MAAM,iBAAiB,YAAgD;AAErE,MAAA,MAAM,QAAA,GAAgB,EAAE,GAAG,GAAA,CAAI,QAAA,EAAS;AAExC,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,CAAC,QAAA,CAAS,SAAA,EAAW;AACtC,QAAA,QAAA,CAAS,YAAY,QAAA,CAAS,EAAA;AAC9B,QAAA,OAAO,QAAA,CAAS,EAAA;AAAA,MAClB;AAEA,MAAA,IAAI,CAAC,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,OAAA,EAAS;AAC/C,QAAA,QAAA,CAAS,aAAA,GAAgB,KAAA;AAAA,MAC3B;AAEA,MAAA,IAAI,QAAA,CAAS,IAAA,IAAQ,CAAC,QAAA,CAAS,WAAA,EAAa;AAC1C,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MAClB;AAGA,MAAA,MAAM,cAAA,GAAsB;AAAA,QAC1B,GAAG,GAAA,CAAI,cAAA;AAAA,QACP,gBAAgB,GAAA,CAAI,cAAA,EAAgB,cAAA,IAAkB,GAAA,CAAI,gBAAgB,QAAA,IAAY;AAAA,OACxF;AAGA,MAAA,MAAM,UAAA,GAAa,mBAAmB,aAAA,EAAc;AACpD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,cAAA,CAAe,MAAA,GAAS;AAAA,UACtB,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,UAAU,UAAA,CAAW,QAAA;AAAA,UACrB,KAAK,UAAA,CAAW,GAAA;AAAA,UAChB,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,aAAa,UAAA,CAAW;AAAA,SAC1B;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,GAAY;AAAA,QAChB,SAAA;AAAA,QACA,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,QACtB,WAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA;AAAA;AAAA,QAEA,GAAA,EAAK;AAAA,UACH,IAAA,EAAM,qBAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAGA,MAAA,IAAI,OAAA;AAEJ,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY;AAAA,UACpD,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,mBAAA;AAAA,UACN,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,UACtB,WAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,OAAA,GAAU,EAAE,GAAG,WAAA,EAAY;AAAA,MAC7B,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,UAAA,CAAW,aAAA,CAAc;AAAA,UAClD,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,UACtB,WAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,OAAA,GAAU,EAAE,GAAG,aAAA,EAAc;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,MAChD;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAavC;AAAA,QACD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAGD,MAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,CAAC,YAAY,IAAA,EAAM;AAC7C,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,kBAAA;AAAA,UAER,oEAAA;AAAA,UACA;AAAA,YACE,SAAA;AAAA,YACA,OAAA,EAAS;AAAA;AACX,SACF;AAAA,MACF;AAEA,MAAA,MAAM,eAAe,WAAA,CAAY,IAAA;AAGjC,MAAA,MAAM,MAAA,GAAoC;AAAA,QACxC,UAAU,YAAA,CAAa,QAAA;AAAA,QACvB,WAAA,EAAa,YAAA,CAAa,YAAA,IAAgB,YAAA,CAAa,eAAe,EAAC;AAAA,QACvE,aAAA,EAAe,YAAA,CAAa,cAAA,IAAkB,YAAA,CAAa,aAAA;AAAA,QAC3D,aAAA,EAAe,YAAA,CAAa,cAAA,IAAkB,YAAA,CAAa,aAAA;AAAA,QAC3D,MAAA,EAAQ,aAAa,OAAA,GACjB;AAAA,UACE,WAAW,YAAA,CAAa,OAAA,CAAQ,UAAA,KAAe,YAAA,CAAa,QAAQ,SAAA,IAAa,EAAA,CAAA;AAAA,UACjF,UAAA,EAAY,YAAA,CAAa,OAAA,CAAQ,WAAA,IAAe,aAAa,MAAA,EAAQ;AAAA,YAEvE,YAAA,CAAa;AAAA,OACnB;AAEA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,MAAA,IAAI,MAAA,CAAO,aAAa,OAAA,EAAS;AAE/B,QAAA,MAAM,SAAA,GAAa,aAAqB,WAAA,IAAe,SAAA;AACvD,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,WAAA,CAAY,CAAC,CAAA,IAAK,kBAAA;AAC5C,QAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAA,EAAS,SAAS,CAAA;AAC7C,QAAA,MAAM,IAAI,sBAAA,CAAuB,UAAA,EAAY,SAAA,EAAW,MAAA,CAAO,eAAe,SAAS,CAAA;AAAA,MACzF;AAEA,MAAA,IAAI,MAAA,CAAO,aAAa,iBAAA,EAAmB;AAEzC,QAAA,IAAI,KAAK,MAAA,CAAO,YAAA,IAAgB,IAAA,CAAK,YAAA,IAAgB,OAAO,MAAA,EAAQ;AAElE,UAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,MAAA,CAAO,SAAA,IAAa,SAAA;AACnD,UAAA,MAAM,WAAA,GAAe,aAAa,OAAA,EAAiB,aAAA;AACnD,UAAA,MAAM,YAAY,CAAA,gCAAA,EAAmC,IAAA,CAAK,MAAA,CAAO,QAAQ,cAAc,eAAe,CAAA,CAAA;AACtG,UAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,iBAAA,EAAmB,SAAS,CAAA;AACvD,UAAA,MAAM,IAAI,6BAAA,CAA8B,eAAA,EAAiB,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,QAC5F,CAAA,MAAO;AAEL,UAAA,MAAM,SAAA,GAAa,aAAqB,WAAA,IAAe,SAAA;AACvD,UAAA,MAAM,UAAA,GAAa,iBAAA;AACnB,UAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAA,EAAS,SAAS,CAAA;AAC7C,UAAA,MAAM,IAAI,sBAAA,CAAuB,UAAA,EAAY,SAAA,EAAW,MAAA,CAAO,eAAe,SAAS,CAAA;AAAA,QACzF;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAA,EAAS,SAAS,CAAA;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAGA,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,cAAc,CAAA;AAAA,MACzD;AACA,MAAA,OAAO,MAAM,cAAA,EAAe;AAAA,IAC9B,SAAS,KAAA,EAAY;AAInB,MAAA,IAAI,iBAAiB,uBAAA,EAAyB;AAC5C,QAAA,IAAA,CAAK,QAAQ,wBAAA,EAAyB;AACtC,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,OAAO,SAAS,CAAA;AACzE,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,OAAO,cAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAI,KAAA,YAAiB,SAAA,KAAc,KAAA,CAAM,IAAA,KAAA,cAAA,uBAAuC,MAAM,IAAA,KAAA,WAAA,iBAAA,EAAmC;AACvH,QAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,QAAA,MAAM,IAAI,mBAAA;AAAA,UACR,KAAA,CAAM,OAAA;AAAA,UACN,MAAM,MAAA,IAAU,GAAA;AAAA,UAChB;AAAA,SACF;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,CAAM,IAAA,KAAA,SAAA,gBAAgC;AACtE,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,OAAO,SAAS,CAAA;AACzE,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,OAAO,cAAA;AAAA,QACT;AACA,QAAA,MAAM,IAAI,0BAAA,CAA2B,CAAA,iBAAA,EAAoB,KAAA,CAAM,OAAO,IAAI,SAAS,CAAA;AAAA,MACrF;AAGA,MAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,CAAM,IAAA,KAAA,cAAA,qBAAqC;AAC3E,QAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,OAAO,SAAS,CAAA;AACzE,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,OAAO,cAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAI,KAAA,YAAiB,sBAAA,IAA0B,KAAA,YAAiB,6BAAA,EAA+B;AAC7F,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,IAAA,EACA,KAAA,EACA,SAAA,EACkC;AAClC,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAG/B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAE/B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAG/B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAyD;AACvD,IAAA,OAAO,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAA,GAA4E;AAC1E,IAAA,OAAO,IAAA,CAAK,cAAA,EAAgB,UAAA,EAAW,IAAK,IAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,IAAA,EAGY;AAChC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,wBAAA,CAAyB,IAAA,CAAK,SAAS,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,QAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa;AAAA,MAC9B,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA,iBAAA,EAAmB,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,iBAAA;AAAA,MACvC,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AAAA,KAChC,CAAA;AAED,IAAA,OAAO,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,IAAA,EAIK;AAC7B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,wBAAA,CAAyB,IAAA,CAAK,SAAS,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW;AAAA,MACrD,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,OAAO,MAAA,EAAQ,SAAA;AAAA,MACjD,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,OAAO,MAAA,EAAQ;AAAA,KACpD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,aAAA,CACE,WACA,OAAA,EACkB;AAClB,IAAA,OAAO,aAAA,CAAc,SAAA,EAAkB,IAAA,EAAM,OAAO,CAAA;AAAA,EACtD;AACF;AAKO,SAAS,iBAAiB,MAAA,EAAsC;AACrE,EAAA,OAAO,IAAI,WAAW,MAAM,CAAA;AAC9B","file":"index.js","sourcesContent":["/**\n * BlockIntel Gate SDK - Crypto Utilities\n * \n * HMAC-SHA256 implementation using Web Crypto API or Node.js crypto\n */\n\n/**\n * Compute HMAC-SHA256 signature\n */\nexport async function hmacSha256(secret: string, message: string): Promise<string> {\n // Hot Path uses base64 string directly in Node.js crypto.createHmac('sha256', secret)\n // This treats the base64 string as UTF-8 bytes\n // Bootstrap encrypts base64 string as UTF-8 bytes, Hot Path decrypts to base64 string\n // So we need to match this behavior: encode base64 string as UTF-8 bytes\n \n if (typeof crypto !== 'undefined' && crypto.subtle) {\n // Web Crypto API (Node 18+ or browser)\n // For Web Crypto, we need bytes, so encode the base64 string as UTF-8 bytes\n // This matches Node.js crypto.createHmac treating the base64 string as UTF-8\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret); // Encode base64 string as UTF-8 bytes\n const messageData = encoder.encode(message);\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', key, messageData);\n const hashArray = Array.from(new Uint8Array(signature));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n // Fallback for Node < 18\n if (typeof require !== 'undefined') {\n const crypto = require('crypto');\n // Use base64 string directly (matches Hot Path behavior)\n const hmac = crypto.createHmac('sha256', secret);\n hmac.update(message, 'utf8');\n return hmac.digest('hex');\n }\n\n throw new Error('HMAC-SHA256 not available in this environment');\n}\n\n","/**\n * BlockIntel Gate SDK - Canonical JSON Utilities\n * \n * Implements deterministic JSON serialization for HMAC signing.\n * Ensures stable key ordering and no whitespace.\n */\n\n/**\n * Sort object keys recursively and produce canonical JSON string\n * \n * Rules:\n * - All keys sorted alphabetically (case-sensitive)\n * - No whitespace between tokens\n * - UTF-8 encoding\n * - Stable ordering for arrays and nested objects\n */\nexport function canonicalizeJson(obj: unknown): string {\n if (obj === null || obj === undefined) {\n return 'null';\n }\n\n if (typeof obj === 'string') {\n return JSON.stringify(obj);\n }\n\n if (typeof obj === 'number' || typeof obj === 'boolean') {\n return String(obj);\n }\n\n if (Array.isArray(obj)) {\n const items = obj.map((item) => canonicalizeJson(item));\n return `[${items.join(',')}]`;\n }\n\n if (typeof obj === 'object') {\n const keys = Object.keys(obj).sort();\n const pairs = keys.map((key) => {\n const value = (obj as Record<string, unknown>)[key];\n const canonicalValue = canonicalizeJson(value);\n return `${JSON.stringify(key)}:${canonicalValue}`;\n });\n return `{${pairs.join(',')}}`;\n }\n\n // Fallback to JSON.stringify for any other type\n return JSON.stringify(obj);\n}\n\n/**\n * Compute SHA-256 hash of canonical JSON\n */\nexport async function sha256Hex(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n // Fallback for Node < 18 or environments without Web Crypto\n // In Node 18+, crypto.subtle is available globally\n if (typeof require !== 'undefined') {\n const crypto = require('crypto');\n return crypto.createHash('sha256').update(input, 'utf8').digest('hex');\n }\n\n throw new Error('SHA-256 not available in this environment');\n}\n\n","/**\n * BlockIntel Gate SDK - HMAC v1 Signer\n * \n * Implements canonical request signing for Gate Hot Path API.\n * \n * Signing Algorithm (v1):\n * 1. Create canonical signing string:\n * v1\\n\n * <HTTP_METHOD>\\n\n * <PATH>\\n\n * <TENANT_ID>\\n\n * <KEY_ID>\\n\n * <TIMESTAMP_MS>\\n\n * <REQUEST_ID_AS_NONCE>\\n\n * <SHA256_HEX_OF_BODY>\n * \n * 2. Compute HMAC-SHA256(secret, signingString) as hex\n * \n * 3. Include headers:\n * - X-GATE-TENANT-ID\n * - X-GATE-KEY-ID\n * - X-GATE-TIMESTAMP-MS\n * - X-GATE-REQUEST-ID (used as nonce in canonical string)\n * - X-GATE-SIGNATURE (hex string)\n */\n\nimport { hmacSha256 } from '../utils/crypto.js';\nimport { canonicalizeJson, sha256Hex } from '../utils/canonicalJson.js';\n\nexport interface HmacSignerConfig {\n keyId: string;\n secret: string;\n}\n\nexport interface SigningHeaders {\n 'X-GATE-TENANT-ID': string;\n 'X-GATE-KEY-ID': string;\n 'X-GATE-TIMESTAMP-MS': string;\n 'X-GATE-REQUEST-ID': string;\n 'X-GATE-SIGNATURE': string;\n}\n\n/**\n * HMAC v1 signer for Gate API requests\n */\nexport class HmacSigner {\n private readonly keyId: string;\n private readonly secret: string;\n\n constructor(config: HmacSignerConfig) {\n this.keyId = config.keyId;\n this.secret = config.secret;\n\n if (!this.secret || this.secret.length === 0) {\n throw new Error('HMAC secret cannot be empty');\n }\n }\n\n /**\n * Sign a request and return headers\n */\n async signRequest(params: {\n method: string;\n path: string;\n tenantId: string;\n timestampMs: number;\n requestId: string;\n body?: unknown;\n }): Promise<SigningHeaders> {\n const { method, path, tenantId, timestampMs, requestId, body } = params;\n\n // Canonicalize body\n const bodyJson = body ? canonicalizeJson(body) : '';\n const bodyHash = await sha256Hex(bodyJson);\n\n // Construct canonical signing string (matches Hot Path format)\n const signingString = [\n 'v1',\n method.toUpperCase(),\n path,\n tenantId,\n this.keyId,\n String(timestampMs),\n requestId, // Used as nonce in canonical string\n bodyHash,\n ].join('\\n');\n\n // Compute signature (returns hex)\n const signature = await hmacSha256(this.secret, signingString);\n\n return {\n 'X-GATE-TENANT-ID': tenantId,\n 'X-GATE-KEY-ID': this.keyId,\n 'X-GATE-TIMESTAMP-MS': String(timestampMs),\n 'X-GATE-REQUEST-ID': requestId,\n 'X-GATE-SIGNATURE': signature,\n };\n }\n}\n\n","/**\n * BlockIntel Gate SDK - API Key Authentication\n * \n * Simple API key authentication using X-API-KEY header.\n * Still includes tenant/request/timestamp headers for replay semantics.\n */\n\nexport interface ApiKeyAuthConfig {\n apiKey: string;\n}\n\nexport interface ApiKeyHeaders {\n 'X-API-KEY': string;\n 'X-GATE-TENANT-ID': string;\n 'X-GATE-REQUEST-ID': string;\n 'X-GATE-TIMESTAMP-MS': string;\n}\n\n/**\n * API Key authenticator for Gate API requests\n */\nexport class ApiKeyAuth {\n private readonly apiKey: string;\n\n constructor(config: ApiKeyAuthConfig) {\n this.apiKey = config.apiKey;\n\n if (!this.apiKey || this.apiKey.length === 0) {\n throw new Error('API key cannot be empty');\n }\n }\n\n /**\n * Create headers for API key authentication\n */\n createHeaders(params: {\n tenantId: string;\n timestampMs: number;\n requestId: string;\n }): ApiKeyHeaders {\n const { tenantId, timestampMs, requestId } = params;\n\n return {\n 'X-API-KEY': this.apiKey,\n 'X-GATE-TENANT-ID': tenantId,\n 'X-GATE-REQUEST-ID': requestId,\n 'X-GATE-TIMESTAMP-MS': String(timestampMs),\n };\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Error Types\n */\n\n/**\n * Gate error codes\n */\nexport enum GateErrorCode {\n NETWORK_ERROR = 'NETWORK_ERROR',\n TIMEOUT = 'TIMEOUT',\n NOT_FOUND = 'NOT_FOUND',\n UNAUTHORIZED = 'UNAUTHORIZED',\n FORBIDDEN = 'FORBIDDEN',\n RATE_LIMITED = 'RATE_LIMITED',\n SERVER_ERROR = 'SERVER_ERROR',\n INVALID_RESPONSE = 'INVALID_RESPONSE',\n STEP_UP_NOT_CONFIGURED = 'STEP_UP_NOT_CONFIGURED',\n STEP_UP_TIMEOUT = 'STEP_UP_TIMEOUT',\n BLOCKED = 'BLOCKED',\n SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE',\n AUTH_ERROR = 'AUTH_ERROR',\n}\n\n/**\n * Base Gate error class\n */\nexport class GateError extends Error {\n public readonly code: GateErrorCode;\n public readonly status?: number;\n public readonly details?: Record<string, unknown>;\n public readonly requestId?: string;\n public readonly correlationId?: string;\n\n constructor(\n code: GateErrorCode,\n message: string,\n options?: {\n status?: number;\n details?: Record<string, unknown>;\n requestId?: string;\n correlationId?: string;\n cause?: Error;\n }\n ) {\n super(message);\n this.name = 'GateError';\n this.code = code;\n this.status = options?.status;\n this.details = options?.details;\n this.requestId = options?.requestId;\n this.correlationId = options?.correlationId;\n if (options?.cause) {\n this.cause = options.cause;\n }\n Error.captureStackTrace(this, this.constructor);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n details: this.details,\n requestId: this.requestId,\n correlationId: this.correlationId,\n };\n }\n}\n\n/**\n * Step-up not configured error\n * Thrown when REQUIRE_STEP_UP is returned but SDK is not configured for step-up\n */\nexport class StepUpNotConfiguredError extends GateError {\n constructor(requestId?: string) {\n super(\n GateErrorCode.STEP_UP_NOT_CONFIGURED,\n 'Step-up is required but not configured in SDK. Enable step-up in client config or treat REQUIRE_STEP_UP as BLOCK.',\n { requestId }\n );\n this.name = 'StepUpNotConfiguredError';\n }\n}\n\n/**\n * Blocked error\n * Thrown when transaction is BLOCKED by Gate\n */\nexport class BlockIntelBlockedError extends GateError {\n public readonly receiptId?: string;\n public readonly reasonCode: string;\n\n constructor(\n reasonCode: string,\n receiptId?: string,\n correlationId?: string,\n requestId?: string\n ) {\n super(\n GateErrorCode.BLOCKED,\n `Transaction blocked: ${reasonCode}`,\n { correlationId, requestId, details: { reasonCode, receiptId } }\n );\n this.name = 'BlockIntelBlockedError';\n this.receiptId = receiptId;\n this.reasonCode = reasonCode;\n }\n}\n\n/**\n * Service unavailable error\n * Thrown when fail-safe mode is BLOCK_ON_TIMEOUT and service is unavailable\n */\nexport class BlockIntelUnavailableError extends GateError {\n constructor(message: string, requestId?: string) {\n super(GateErrorCode.SERVICE_UNAVAILABLE, message, { requestId });\n this.name = 'BlockIntelUnavailableError';\n }\n}\n\n/**\n * Auth error\n * Thrown on 401/403 - always fails CLOSED (never silently allows)\n */\nexport class BlockIntelAuthError extends GateError {\n constructor(message: string, status: number, requestId?: string) {\n super(\n status === 401 ? GateErrorCode.UNAUTHORIZED : GateErrorCode.FORBIDDEN,\n message,\n { status, requestId }\n );\n this.name = 'BlockIntelAuthError';\n }\n}\n\n/**\n * Step-up required error\n * Thrown when REQUIRE_STEP_UP is returned and step-up is enabled\n */\nexport class BlockIntelStepUpRequiredError extends GateError {\n public readonly stepUpRequestId: string;\n public readonly statusUrl?: string;\n public readonly expiresAtMs?: number;\n\n constructor(\n stepUpRequestId: string,\n statusUrl?: string,\n expiresAtMs?: number,\n requestId?: string\n ) {\n super(\n GateErrorCode.STEP_UP_NOT_CONFIGURED,\n 'Step-up approval required',\n {\n requestId,\n details: { stepUpRequestId, statusUrl, expiresAtMs },\n }\n );\n this.name = 'BlockIntelStepUpRequiredError';\n this.stepUpRequestId = stepUpRequestId;\n this.statusUrl = statusUrl;\n this.expiresAtMs = expiresAtMs;\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Retry Logic\n * \n * Exponential backoff with jitter for retryable requests.\n */\n\nexport interface RetryOptions {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n}\n\nconst DEFAULT_RETRY_OPTIONS: Required<RetryOptions> = {\n maxAttempts: 3,\n baseDelayMs: 100,\n maxDelayMs: 800,\n factor: 2,\n};\n\n/**\n * Determine if an HTTP status code is retryable\n */\nexport function isRetryableStatus(status: number): boolean {\n // Retry on 429 (rate limit) and 5xx (server errors)\n return status === 429 || (status >= 500 && status < 600);\n}\n\n/**\n * Determine if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n // Network errors, timeouts, connection errors\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('network') ||\n message.includes('timeout') ||\n message.includes('connection') ||\n message.includes('econnrefused') ||\n message.includes('enotfound') ||\n message.includes('econnreset')\n );\n }\n return false;\n}\n\n/**\n * Calculate delay with exponential backoff and jitter\n */\nexport function calculateBackoffDelay(\n attempt: number,\n options: Required<RetryOptions>\n): number {\n const exponentialDelay = options.baseDelayMs * Math.pow(options.factor, attempt - 1);\n const jitter = Math.random() * 0.3 * exponentialDelay; // 0-30% jitter\n const delay = exponentialDelay + jitter;\n return Math.min(delay, options.maxDelayMs);\n}\n\n/**\n * Check if an error is a GateError with retryable status\n */\nfunction isRetryableGateError(error: unknown): boolean {\n if (error && typeof error === 'object' && 'code' in error) {\n const gateError = error as { code: string; status?: number };\n // Retry on SERVER_ERROR or RATE_LIMITED codes\n if (gateError.code === 'SERVER_ERROR' || gateError.code === 'RATE_LIMITED') {\n return true;\n }\n // Also check status if available\n if (gateError.status && isRetryableStatus(gateError.status)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry if we've exhausted attempts\n if (attempt >= opts.maxAttempts) {\n break;\n }\n\n // Don't retry on non-retryable Response errors\n if (error instanceof Response && !isRetryableStatus(error.status)) {\n throw error;\n }\n\n // Check if it's a retryable error (Response, network error, or GateError with retryable status)\n const isRetryable =\n (error instanceof Response && isRetryableStatus(error.status)) ||\n isRetryableError(error) ||\n isRetryableGateError(error);\n\n if (!isRetryable) {\n throw error;\n }\n\n // Wait before retrying\n const delay = calculateBackoffDelay(attempt, opts);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n\n","/**\n * BlockIntel Gate SDK - HTTP Client\n * \n * Fetch wrapper with timeout, retry, and error handling.\n */\n\nimport { GateError, GateErrorCode } from '../types/errors.js';\nimport { retryWithBackoff, isRetryableStatus, isRetryableError } from './retry.js';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n timeoutMs?: number;\n userAgent?: string;\n retryOptions?: {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n };\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n requestId?: string;\n}\n\n/**\n * HTTP client with retry and timeout support\n */\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly userAgent: string;\n private readonly retryOptions: Parameters<typeof retryWithBackoff>[1];\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.timeoutMs = config.timeoutMs ?? 15000;\n this.userAgent = config.userAgent ?? 'blockintel-gate-sdk/0.1.0';\n this.retryOptions = config.retryOptions;\n\n // Validate baseUrl\n if (!this.baseUrl) {\n throw new Error('baseUrl is required');\n }\n\n // Validate HTTPS in production (allow http only for localhost)\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production') {\n if (!this.baseUrl.startsWith('https://') && !this.baseUrl.includes('localhost')) {\n throw new Error('baseUrl must use HTTPS in production (except localhost)');\n }\n }\n }\n\n /**\n * Make an HTTP request with retry and timeout\n */\n async request<T>(options: RequestOptions): Promise<T> {\n const { method, path, headers = {}, body, requestId } = options;\n\n const url = `${this.baseUrl}${path}`;\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const response = await retryWithBackoff(\n async () => {\n const fetchOptions: RequestInit = {\n method,\n headers: {\n ...headers,\n 'User-Agent': this.userAgent,\n 'Content-Type': 'application/json',\n },\n signal: controller.signal,\n };\n\n if (body) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n const res = await fetch(url, fetchOptions);\n\n // Throw Response for retryable errors so retry logic can handle it\n if (!res.ok && isRetryableStatus(res.status)) {\n throw res;\n }\n\n // Don't retry non-retryable status codes\n if (!res.ok && !isRetryableStatus(res.status)) {\n throw res;\n }\n\n return res;\n },\n {\n ...this.retryOptions,\n // Custom retry logic that handles Response objects\n }\n );\n\n clearTimeout(timeoutId);\n\n // Parse response\n let data: T;\n const contentType = response.headers.get('content-type');\n\n if (contentType && contentType.includes('application/json')) {\n try {\n data = (await response.json()) as T;\n } catch (parseError) {\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n 'Failed to parse JSON response',\n {\n status: response.status,\n requestId,\n cause: parseError instanceof Error ? parseError : undefined,\n }\n );\n }\n } else {\n const text = await response.text();\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n `Unexpected content type: ${contentType}`,\n {\n status: response.status,\n details: { body: text.substring(0, 200) },\n requestId,\n }\n );\n }\n\n // Check for errors\n if (!response.ok) {\n const errorCode = this.statusToErrorCode(response.status);\n const correlationId = response.headers.get('X-Correlation-ID') ?? undefined;\n\n throw new GateError(errorCode, `HTTP ${response.status}: ${response.statusText}`, {\n status: response.status,\n correlationId,\n requestId,\n details: data as Record<string, unknown>,\n });\n }\n\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Handle abort (timeout)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new GateError(GateErrorCode.TIMEOUT, `Request timeout after ${this.timeoutMs}ms`, {\n requestId,\n });\n }\n\n // Handle Response errors (non-ok responses)\n if (error instanceof Response) {\n const errorCode = this.statusToErrorCode(error.status);\n const correlationId = error.headers.get('X-Correlation-ID') ?? undefined;\n\n let details: Record<string, unknown> | undefined;\n try {\n const text = await error.text();\n try {\n details = JSON.parse(text);\n } catch {\n details = { body: text.substring(0, 200) };\n }\n } catch {\n // Ignore parsing errors\n }\n\n throw new GateError(errorCode, `HTTP ${error.status}: ${error.statusText}`, {\n status: error.status,\n correlationId,\n requestId,\n details,\n });\n }\n\n // Handle network errors\n if (isRetryableError(error)) {\n throw new GateError(\n GateErrorCode.NETWORK_ERROR,\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n {\n requestId,\n cause: error instanceof Error ? error : undefined,\n }\n );\n }\n\n // Re-throw GateError as-is\n if (error instanceof GateError) {\n throw error;\n }\n\n // Unknown error\n throw new GateError(\n GateErrorCode.NETWORK_ERROR,\n `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,\n {\n requestId,\n cause: error instanceof Error ? error : undefined,\n }\n );\n }\n }\n\n /**\n * Map HTTP status code to GateErrorCode\n */\n private statusToErrorCode(status: number): GateErrorCode {\n if (status === 401) return GateErrorCode.UNAUTHORIZED;\n if (status === 403) return GateErrorCode.FORBIDDEN;\n if (status === 404) return GateErrorCode.NOT_FOUND;\n if (status === 429) return GateErrorCode.RATE_LIMITED;\n if (status >= 500 && status < 600) return GateErrorCode.SERVER_ERROR;\n return GateErrorCode.NETWORK_ERROR;\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Time Utilities\n */\n\n/**\n * Get current timestamp in milliseconds\n */\nexport function nowMs(): number {\n return Date.now();\n}\n\n/**\n * Get current timestamp in seconds (epoch)\n */\nexport function nowEpochSeconds(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Clamp a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n","/**\n * BlockIntel Gate SDK - Step-Up Polling\n * \n * Polls Gate Hot Path step-up status endpoint until decision is reached.\n */\n\nimport { GateError, GateErrorCode } from '../types/errors.js';\nimport { StepUpStatusResponse, GateStepUpStatus, StepUpFinalResult } from '../types/contracts.js';\nimport { nowEpochSeconds, clamp, sleep } from '../utils/time.js';\nimport { HttpClient } from '../http/HttpClient.js';\n\nexport interface StepUpPollingConfig {\n httpClient: HttpClient;\n tenantId: string;\n pollingIntervalMs?: number;\n maxWaitMs?: number;\n ttlMinSeconds?: number;\n ttlMaxSeconds?: number;\n ttlDefaultSeconds?: number;\n}\n\nconst DEFAULT_POLLING_INTERVAL_MS = 250;\nconst DEFAULT_MAX_WAIT_MS = 15000;\nconst DEFAULT_TTL_MIN_SECONDS = 300;\nconst DEFAULT_TTL_MAX_SECONDS = 900;\nconst DEFAULT_TTL_DEFAULT_SECONDS = 600;\n\n/**\n * Step-up polling helper\n */\nexport class StepUpPoller {\n private readonly httpClient: HttpClient;\n private readonly tenantId: string;\n private readonly pollingIntervalMs: number;\n private readonly maxWaitMs: number;\n private readonly ttlMinSeconds: number;\n private readonly ttlMaxSeconds: number;\n private readonly ttlDefaultSeconds: number;\n\n constructor(config: StepUpPollingConfig) {\n this.httpClient = config.httpClient;\n this.tenantId = config.tenantId;\n this.pollingIntervalMs = config.pollingIntervalMs ?? DEFAULT_POLLING_INTERVAL_MS;\n this.maxWaitMs = config.maxWaitMs ?? DEFAULT_MAX_WAIT_MS;\n this.ttlMinSeconds = config.ttlMinSeconds ?? DEFAULT_TTL_MIN_SECONDS;\n this.ttlMaxSeconds = config.ttlMaxSeconds ?? DEFAULT_TTL_MAX_SECONDS;\n this.ttlDefaultSeconds = config.ttlDefaultSeconds ?? DEFAULT_TTL_DEFAULT_SECONDS;\n }\n\n /**\n * Get current step-up status\n */\n async getStatus(requestId: string): Promise<StepUpStatusResponse> {\n const path = `/defense/stepup/status?tenantId=${encodeURIComponent(this.tenantId)}&requestId=${encodeURIComponent(requestId)}`;\n\n try {\n // API returns snake_case, convert to camelCase\n const apiResponse = await this.httpClient.request<\n StepUpStatusResponse & {\n tenant_id?: string;\n request_id?: string;\n reason_codes?: string[];\n correlation_id?: string;\n expires_at_ms?: number;\n }\n >({\n method: 'GET',\n path,\n requestId,\n });\n\n const response: StepUpStatusResponse = {\n status: apiResponse.status,\n tenantId: apiResponse.tenant_id ?? apiResponse.tenantId,\n requestId: apiResponse.request_id ?? apiResponse.requestId,\n decision: apiResponse.decision,\n reasonCodes: apiResponse.reason_codes ?? apiResponse.reasonCodes,\n correlationId: apiResponse.correlation_id ?? apiResponse.correlationId,\n expiresAtMs: apiResponse.expires_at_ms ?? apiResponse.expiresAtMs,\n ttl: apiResponse.ttl,\n };\n\n // Check if expired based on TTL\n const now = nowEpochSeconds();\n if (response.ttl !== undefined && response.ttl <= now) {\n return {\n ...response,\n status: 'EXPIRED',\n };\n }\n\n return response;\n } catch (error) {\n if (error instanceof GateError && error.code === GateErrorCode.NOT_FOUND) {\n throw new GateError(\n GateErrorCode.NOT_FOUND,\n `Step-up request not found: ${requestId}`,\n { requestId }\n );\n }\n throw error;\n }\n }\n\n /**\n * Wait for step-up decision with polling\n * \n * Polls until status is APPROVED, DENIED, or EXPIRED, or timeout is reached.\n */\n async awaitDecision(\n requestId: string,\n options?: { maxWaitMs?: number; intervalMs?: number }\n ): Promise<StepUpFinalResult> {\n const startTime = Date.now();\n const maxWaitMs = options?.maxWaitMs ?? this.maxWaitMs;\n const intervalMs = options?.intervalMs ?? this.pollingIntervalMs;\n\n while (true) {\n const elapsedMs = Date.now() - startTime;\n\n // Check timeout\n if (elapsedMs >= maxWaitMs) {\n throw new GateError(\n GateErrorCode.STEP_UP_TIMEOUT,\n `Step-up decision timeout after ${maxWaitMs}ms`,\n { requestId }\n );\n }\n\n try {\n const status = await this.getStatus(requestId);\n\n // Check if expired\n const now = nowEpochSeconds();\n if (status.ttl !== undefined && status.ttl <= now) {\n return {\n status: 'EXPIRED',\n requestId,\n elapsedMs,\n correlationId: status.correlationId,\n };\n }\n\n // Check if decision reached\n if (\n status.status === 'APPROVED' ||\n status.status === 'DENIED' ||\n status.status === 'EXPIRED'\n ) {\n return {\n status: status.status,\n requestId,\n elapsedMs,\n decision: status.decision,\n reasonCodes: status.reasonCodes,\n correlationId: status.correlationId,\n };\n }\n\n // Status is PENDING, wait and poll again\n await sleep(intervalMs);\n } catch (error) {\n // If NOT_FOUND, throw immediately (don't retry)\n if (error instanceof GateError && error.code === GateErrorCode.NOT_FOUND) {\n throw error;\n }\n\n // For other errors, wait and retry\n // But still respect timeout\n const remainingMs = maxWaitMs - (Date.now() - startTime);\n if (remainingMs <= 0) {\n throw new GateError(\n GateErrorCode.STEP_UP_TIMEOUT,\n `Step-up decision timeout after ${maxWaitMs}ms`,\n { requestId, cause: error instanceof Error ? error : undefined }\n );\n }\n\n await sleep(Math.min(intervalMs, remainingMs));\n }\n }\n }\n\n /**\n * Clamp TTL to guardrails\n */\n clampTtl(ttlSeconds?: number): number {\n if (ttlSeconds === undefined) {\n return this.ttlDefaultSeconds;\n }\n return clamp(ttlSeconds, this.ttlMinSeconds, this.ttlMaxSeconds);\n }\n}\n\n","/**\n * Circuit Breaker for SDK\n * \n * Prevents cascading failures by opening the circuit after consecutive failures.\n */\n\nexport type CircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';\n\nexport interface CircuitBreakerConfig {\n tripAfterConsecutiveFailures?: number; // Default: 5\n coolDownMs?: number; // Default: 30000 (30 seconds)\n}\n\nexport interface CircuitBreakerMetrics {\n failures: number;\n successes: number;\n state: CircuitState;\n lastFailureTime?: number;\n lastSuccessTime?: number;\n tripsToOpen: number;\n}\n\n/**\n * Circuit Breaker implementation\n */\nexport class CircuitBreaker {\n private state: CircuitState = 'CLOSED';\n private failures = 0;\n private successes = 0;\n private lastFailureTime?: number;\n private lastSuccessTime?: number;\n private tripsToOpen = 0;\n \n private readonly tripThreshold: number;\n private readonly coolDownMs: number;\n\n constructor(config: CircuitBreakerConfig = {}) {\n this.tripThreshold = config.tripAfterConsecutiveFailures ?? 5;\n this.coolDownMs = config.coolDownMs ?? 30000; // 30 seconds\n }\n\n /**\n * Execute function with circuit breaker protection\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check if circuit should transition from OPEN to HALF_OPEN\n if (this.state === 'OPEN') {\n const now = Date.now();\n const timeSinceLastFailure = this.lastFailureTime \n ? now - this.lastFailureTime \n : Infinity;\n \n if (timeSinceLastFailure >= this.coolDownMs) {\n this.state = 'HALF_OPEN';\n this.failures = 0; // Reset failures for half-open probe\n } else {\n throw new CircuitBreakerOpenError(\n `Circuit breaker is OPEN. Will retry after ${this.coolDownMs - timeSinceLastFailure}ms`\n );\n }\n }\n\n try {\n const result = await fn();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n\n private onSuccess(): void {\n this.successes++;\n this.lastSuccessTime = Date.now();\n\n if (this.state === 'HALF_OPEN') {\n // Successful probe - close circuit\n this.state = 'CLOSED';\n this.failures = 0;\n } else if (this.state === 'CLOSED') {\n // Success in closed state - reset failure count\n this.failures = 0;\n }\n }\n\n private onFailure(): void {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.state === 'HALF_OPEN') {\n // Failed probe - open circuit again\n this.state = 'OPEN';\n this.tripsToOpen++;\n } else if (this.state === 'CLOSED' && this.failures >= this.tripThreshold) {\n // Too many failures - open circuit\n this.state = 'OPEN';\n this.tripsToOpen++;\n }\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): CircuitBreakerMetrics {\n return {\n failures: this.failures,\n successes: this.successes,\n state: this.state,\n lastFailureTime: this.lastFailureTime,\n lastSuccessTime: this.lastSuccessTime,\n tripsToOpen: this.tripsToOpen,\n };\n }\n\n /**\n * Reset circuit breaker to CLOSED state\n */\n reset(): void {\n this.state = 'CLOSED';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = undefined;\n this.lastSuccessTime = undefined;\n this.tripsToOpen = 0;\n }\n}\n\n/**\n * Circuit Breaker Open Error\n */\nexport class CircuitBreakerOpenError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CircuitBreakerOpenError';\n }\n}\n\n","/**\n * Metrics Collector for SDK\n * \n * Collects counters and latency metrics for observability.\n */\n\nexport interface Metrics {\n requestsTotal: number;\n allowedTotal: number;\n blockedTotal: number;\n stepupTotal: number;\n timeoutsTotal: number;\n errorsTotal: number;\n circuitBreakerOpenTotal: number;\n latencyMs: number[]; // Histogram samples\n}\n\nexport type MetricsHook = (metrics: Metrics) => void | Promise<void>;\n\n/**\n * Metrics Collector\n */\nexport class MetricsCollector {\n private requestsTotal = 0;\n private allowedTotal = 0;\n private blockedTotal = 0;\n private stepupTotal = 0;\n private timeoutsTotal = 0;\n private errorsTotal = 0;\n private circuitBreakerOpenTotal = 0;\n private latencyMs: number[] = [];\n\n private readonly maxSamples = 1000; // Keep last 1000 samples\n private readonly hooks: MetricsHook[] = [];\n\n /**\n * Record a request\n */\n recordRequest(decision: 'ALLOW' | 'BLOCK' | 'REQUIRE_STEP_UP', latencyMs: number): void {\n this.requestsTotal++;\n \n if (decision === 'ALLOW') {\n this.allowedTotal++;\n } else if (decision === 'BLOCK') {\n this.blockedTotal++;\n } else if (decision === 'REQUIRE_STEP_UP') {\n this.stepupTotal++;\n }\n\n // Add latency sample (keep rolling window)\n this.latencyMs.push(latencyMs);\n if (this.latencyMs.length > this.maxSamples) {\n this.latencyMs.shift(); // Remove oldest sample\n }\n\n this.emitMetrics();\n }\n\n /**\n * Record a timeout\n */\n recordTimeout(): void {\n this.timeoutsTotal++;\n this.errorsTotal++;\n this.emitMetrics();\n }\n\n /**\n * Record an error\n */\n recordError(): void {\n this.errorsTotal++;\n this.emitMetrics();\n }\n\n /**\n * Record circuit breaker open\n */\n recordCircuitBreakerOpen(): void {\n this.circuitBreakerOpenTotal++;\n this.emitMetrics();\n }\n\n /**\n * Get current metrics snapshot\n */\n getMetrics(): Metrics {\n return {\n requestsTotal: this.requestsTotal,\n allowedTotal: this.allowedTotal,\n blockedTotal: this.blockedTotal,\n stepupTotal: this.stepupTotal,\n timeoutsTotal: this.timeoutsTotal,\n errorsTotal: this.errorsTotal,\n circuitBreakerOpenTotal: this.circuitBreakerOpenTotal,\n latencyMs: [...this.latencyMs], // Copy array\n };\n }\n\n /**\n * Register a metrics hook (e.g., for Prometheus/OpenTelemetry export)\n */\n registerHook(hook: MetricsHook): void {\n this.hooks.push(hook);\n }\n\n /**\n * Emit metrics to all registered hooks\n */\n private emitMetrics(): void {\n const metrics = this.getMetrics();\n for (const hook of this.hooks) {\n try {\n hook(metrics);\n } catch (error) {\n // Don't throw - metrics hooks should not break SDK\n console.error('Error in metrics hook:', error);\n }\n }\n }\n\n /**\n * Reset all metrics\n */\n reset(): void {\n this.requestsTotal = 0;\n this.allowedTotal = 0;\n this.blockedTotal = 0;\n this.stepupTotal = 0;\n this.timeoutsTotal = 0;\n this.errorsTotal = 0;\n this.circuitBreakerOpenTotal = 0;\n this.latencyMs = [];\n }\n}\n\n","/**\n * BlockIntel Gate SDK - AWS SDK v3 KMS Wrapper\n * \n * Wraps AWS SDK v3 KMSClient to intercept SignCommand calls and enforce Gate policies.\n */\n\nimport { KMSClient, SignCommand, SignCommandInput } from '@aws-sdk/client-kms';\nimport { GateClient } from '../client/GateClient.js';\nimport { BlockIntelBlockedError, BlockIntelStepUpRequiredError } from '../types/errors.js';\nimport { createHash } from 'crypto';\n\n/**\n * KMS wrapper options\n */\nexport interface WrapKmsClientOptions {\n /**\n * Wrapper mode\n * - \"enforce\": Block if Gate denies, require step-up approval\n * - \"dry-run\": Evaluate but always allow KMS call (for testing)\n */\n mode?: 'enforce' | 'dry-run';\n\n /**\n * Callback invoked when a decision is made\n */\n onDecision?: (decision: 'ALLOW' | 'BLOCK' | 'REQUIRE_STEP_UP', details: any) => void;\n\n /**\n * Custom hook to extract transaction intent from SignCommand\n * If not provided, uses default extraction (minimal txIntent from message hash)\n */\n extractTxIntent?: (command: SignCommandInput) => {\n toAddress?: string;\n networkFamily?: 'EVM' | 'BTC' | 'SOL' | 'OTHER';\n chainId?: number;\n [key: string]: any;\n };\n}\n\n/**\n * Wrapped KMS client type (proxy that intercepts send calls)\n */\nexport interface WrappedKmsClient extends KMSClient {\n /**\n * Intercepted send method (overrides KMSClient.send)\n */\n send<T>(command: T): Promise<any>;\n\n /**\n * Original KMS client (for fallback or direct access)\n */\n _originalClient: KMSClient;\n\n /**\n * Gate client used for evaluation\n */\n _gateClient: GateClient;\n\n /**\n * Wrapper options\n */\n _wrapperOptions: Required<WrapKmsClientOptions>;\n}\n\n/**\n * Wrap AWS SDK v3 KMS client to intercept SignCommand calls\n * \n * @param kmsClient - AWS SDK v3 KMSClient instance\n * @param gateClient - Gate client for evaluation\n * @param options - Wrapper options\n * @returns Proxy object that intercepts send() calls\n * \n * @example\n * ```typescript\n * import { KMSClient } from '@aws-sdk/client-kms';\n * import { GateClient, wrapKmsClient } from 'blockintel-gate-sdk';\n * \n * const kms = new KMSClient({});\n * const gate = new GateClient({\n * baseUrl: process.env.GATE_BASE_URL!,\n * tenantId: process.env.GATE_TENANT_ID!,\n * auth: { mode: 'hmac', keyId: process.env.GATE_KEY_ID!, secret: process.env.GATE_HMAC_SECRET! },\n * });\n * \n * const protectedKms = wrapKmsClient(kms, gate);\n * \n * // Now calls to protectedKms.send(new SignCommand(...)) will be intercepted\n * const result = await protectedKms.send(new SignCommand({\n * KeyId: 'alias/my-key',\n * Message: Buffer.from('...'),\n * MessageType: 'RAW',\n * SigningAlgorithm: 'ECDSA_SHA_256',\n * }));\n * ```\n */\nexport function wrapKmsClient(\n kmsClient: KMSClient,\n gateClient: GateClient,\n options: WrapKmsClientOptions = {}\n): WrappedKmsClient {\n const defaultOptions: Required<WrapKmsClientOptions> = {\n mode: options.mode || 'enforce',\n onDecision: options.onDecision || (() => {}),\n extractTxIntent: options.extractTxIntent || defaultExtractTxIntent,\n };\n\n // Create proxy that intercepts send() calls\n const wrapped = new Proxy(kmsClient, {\n get(target, prop, receiver) {\n if (prop === 'send') {\n // Intercept send() method\n return async function (command: any) {\n // Check if this is a SignCommand\n if (command && command.constructor && command.constructor.name === 'SignCommand') {\n return await handleSignCommand(\n command,\n target as KMSClient,\n gateClient,\n defaultOptions\n );\n }\n\n // Not a SignCommand - pass through to original client\n return await (target as any).send(command);\n };\n }\n\n // All other properties pass through\n return Reflect.get(target, prop, receiver);\n },\n }) as WrappedKmsClient;\n\n // Attach metadata for introspection\n wrapped._originalClient = kmsClient;\n wrapped._gateClient = gateClient;\n wrapped._wrapperOptions = defaultOptions;\n\n return wrapped;\n}\n\n/**\n * Default transaction intent extraction from SignCommand\n * \n * Extracts minimal txIntent from KMS SignCommand:\n * - Uses Message hash as payloadHash\n * - Sets networkFamily to 'OTHER' (unknown)\n * - Sets signerId from KeyId\n */\nfunction defaultExtractTxIntent(command: SignCommandInput): {\n toAddress?: string;\n networkFamily?: 'EVM' | 'BTC' | 'SOL' | 'OTHER';\n chainId?: number;\n payloadHash?: string;\n dataHash?: string;\n [key: string]: any;\n} {\n // Compute SHA256 hash of message\n // SignCommand.Message can be accessed via input property or directly\n const message = (command as any).input?.Message ?? (command as any).Message;\n if (!message) {\n throw new Error('SignCommand missing required Message property');\n }\n const messageBuffer = message instanceof Buffer \n ? message \n : Buffer.from(message as any);\n const messageHash = createHash('sha256').update(messageBuffer).digest('hex');\n\n return {\n networkFamily: 'OTHER',\n toAddress: undefined, // Unknown from KMS message alone\n payloadHash: messageHash,\n dataHash: messageHash, // Backward compatibility\n };\n}\n\n/**\n * Handle intercepted SignCommand\n */\nasync function handleSignCommand(\n command: SignCommandInput,\n originalClient: KMSClient,\n gateClient: GateClient,\n options: Required<WrapKmsClientOptions>\n): Promise<any> {\n // Extract transaction intent\n const txIntent = options.extractTxIntent(command);\n\n // Extract signer ID from KeyId\n // SignCommand.KeyId can be accessed via input property or directly\n const signerId = (command as any).input?.KeyId ?? (command as any).KeyId ?? 'unknown';\n\n // Build signing context\n const signingContext = {\n signerId,\n actorPrincipal: 'kms-signer', // Default - can be customized via extractTxIntent\n };\n\n try {\n // Call Gate evaluate()\n const decision = await gateClient.evaluate({\n txIntent: txIntent as any, // Type assertion - txIntent may have extra fields\n signingContext,\n });\n\n // Decision is ALLOW (evaluate() doesn't throw)\n options.onDecision('ALLOW', { decision, signerId, command });\n\n if (options.mode === 'dry-run') {\n // Dry-run mode: evaluate but still allow\n return await originalClient.send(new SignCommand(command));\n }\n\n // Enforce mode: forward to real KMS\n return await originalClient.send(new SignCommand(command));\n } catch (error: any) {\n // Handle Gate errors\n if (error instanceof BlockIntelBlockedError) {\n options.onDecision('BLOCK', { error, signerId, command });\n throw error; // Re-throw to block KMS call\n }\n\n if (error instanceof BlockIntelStepUpRequiredError) {\n options.onDecision('REQUIRE_STEP_UP', { error, signerId, command });\n throw error; // Re-throw to prevent KMS call until step-up approved\n }\n\n // Other errors (network, auth, etc.) - re-throw\n throw error;\n }\n}\n\n","/**\n * Provenance Provider\n * \n * Provides provenance information (repo, workflow, attestation) from environment variables.\n * Used for CI/CD provenance enforcement in Gate.\n */\n\n/**\n * Provenance information extracted from environment\n */\nexport interface Provenance {\n repo?: string;\n workflow?: string;\n ref?: string;\n actor?: string;\n attestation?: {\n valid: boolean;\n issuer?: string;\n subject?: string;\n sha?: string;\n };\n}\n\n/**\n * Provenance Provider\n * \n * Reads provenance information from environment variables:\n * - GATE_CALLER_REPO\n * - GATE_CALLER_WORKFLOW\n * - GATE_CALLER_REF\n * - GATE_CALLER_ACTOR\n * - GATE_ATTESTATION_VALID\n * - GATE_ATTESTATION_ISSUER\n * - GATE_ATTESTATION_SUBJECT\n * - GATE_ATTESTATION_SHA\n */\nexport class ProvenanceProvider {\n /**\n * Get provenance from environment variables\n */\n static getProvenance(): Provenance | null {\n const repo = process.env.GATE_CALLER_REPO;\n const workflow = process.env.GATE_CALLER_WORKFLOW;\n const ref = process.env.GATE_CALLER_REF;\n const actor = process.env.GATE_CALLER_ACTOR;\n const attestationValid = process.env.GATE_ATTESTATION_VALID;\n const attestationIssuer = process.env.GATE_ATTESTATION_ISSUER;\n const attestationSubject = process.env.GATE_ATTESTATION_SUBJECT;\n const attestationSha = process.env.GATE_ATTESTATION_SHA;\n\n // If no provenance env vars are set, return null\n if (!repo && !workflow && !ref && !actor && !attestationValid) {\n return null;\n }\n\n const provenance: Provenance = {};\n\n if (repo) provenance.repo = repo;\n if (workflow) provenance.workflow = workflow;\n if (ref) provenance.ref = ref;\n if (actor) provenance.actor = actor;\n\n // Build attestation if any attestation env vars are set\n if (attestationValid || attestationIssuer || attestationSubject || attestationSha) {\n provenance.attestation = {\n valid: attestationValid === 'true' || attestationValid === '1',\n issuer: attestationIssuer,\n subject: attestationSubject,\n sha: attestationSha,\n };\n }\n\n return provenance;\n }\n\n /**\n * Check if provenance is enabled (env vars present)\n */\n static isEnabled(): boolean {\n return !!(\n process.env.GATE_CALLER_REPO ||\n process.env.GATE_CALLER_WORKFLOW ||\n process.env.GATE_ATTESTATION_VALID\n );\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Gate Client\n * \n * Main client for interacting with Gate Hot Path API.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { HmacSigner } from '../auth/HmacSigner.js';\nimport { ApiKeyAuth } from '../auth/ApiKeyAuth.js';\nimport { HttpClient } from '../http/HttpClient.js';\nimport { StepUpPoller } from '../stepup/stepup.js';\nimport {\n GateClientConfig,\n DefenseEvaluateRequestV2,\n DefenseEvaluateResponseV2,\n StepUpStatusResponse,\n StepUpFinalResult,\n} from '../types/contracts.js';\nimport {\n GateError,\n GateErrorCode,\n StepUpNotConfiguredError,\n BlockIntelBlockedError,\n BlockIntelUnavailableError,\n BlockIntelAuthError,\n BlockIntelStepUpRequiredError,\n} from '../types/errors.js';\nimport { CircuitBreaker, CircuitBreakerOpenError } from '../circuit/CircuitBreaker.js';\nimport { MetricsCollector } from '../metrics/MetricsCollector.js';\nimport { nowMs } from '../utils/time.js';\nimport { wrapKmsClient, WrapKmsClientOptions, WrappedKmsClient } from '../kms/wrapAwsSdkV3KmsClient.js';\nimport { ProvenanceProvider } from '../provenance/ProvenanceProvider.js';\n\n/**\n * Gate Client for Hot Path API\n */\nexport class GateClient {\n private readonly config: GateClientConfig;\n private readonly httpClient: HttpClient;\n private readonly hmacSigner?: HmacSigner;\n private readonly apiKeyAuth?: ApiKeyAuth;\n private readonly stepUpPoller?: StepUpPoller;\n private readonly circuitBreaker?: CircuitBreaker;\n private readonly metrics: MetricsCollector;\n\n constructor(config: GateClientConfig) {\n this.config = config;\n\n // Initialize auth\n if (config.auth.mode === 'hmac') {\n this.hmacSigner = new HmacSigner({\n keyId: config.auth.keyId,\n secret: config.auth.secret,\n });\n } else {\n this.apiKeyAuth = new ApiKeyAuth({\n apiKey: config.auth.apiKey,\n });\n }\n\n // Initialize HTTP client\n this.httpClient = new HttpClient({\n baseUrl: config.baseUrl,\n timeoutMs: config.timeoutMs,\n userAgent: config.userAgent,\n });\n\n // Initialize step-up poller if enabled\n if (config.enableStepUp) {\n this.stepUpPoller = new StepUpPoller({\n httpClient: this.httpClient,\n tenantId: config.tenantId,\n pollingIntervalMs: config.stepUp?.pollingIntervalMs,\n maxWaitMs: config.stepUp?.maxWaitMs,\n });\n }\n\n // Initialize circuit breaker if configured\n if (config.circuitBreaker) {\n this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);\n }\n\n // Initialize metrics collector\n this.metrics = new MetricsCollector();\n if (config.onMetrics) {\n this.metrics.registerHook(config.onMetrics);\n }\n }\n\n /**\n * Evaluate a transaction defense request\n * \n * Implements:\n * - Circuit breaker protection\n * - Fail-safe modes (ALLOW_ON_TIMEOUT, BLOCK_ON_TIMEOUT, BLOCK_ON_ANOMALY)\n * - Metrics collection\n * - Error handling (BLOCK → BlockIntelBlockedError, REQUIRE_STEP_UP → BlockIntelStepUpRequiredError)\n */\n async evaluate(\n req: DefenseEvaluateRequestV2,\n opts?: { requestId?: string }\n ): Promise<DefenseEvaluateResponseV2> {\n const requestId = opts?.requestId ?? uuidv4();\n const timestampMs = req.timestampMs ?? nowMs();\n const startTime = Date.now();\n const failSafeMode = this.config.failSafeMode ?? 'ALLOW_ON_TIMEOUT';\n\n // Wrap request with circuit breaker if enabled\n const executeRequest = async (): Promise<DefenseEvaluateResponseV2> => {\n // Transform txIntent: map 'to' to 'toAddress', add 'networkFamily' if missing\n const txIntent: any = { ...req.txIntent };\n // Map 'to' to 'toAddress' (Hot Path expects toAddress, not to)\n if (txIntent.to && !txIntent.toAddress) {\n txIntent.toAddress = txIntent.to;\n delete txIntent.to; // Remove 'to' to avoid duplicate fields in canonical JSON\n }\n // Infer networkFamily from chainId if not provided\n if (!txIntent.networkFamily && txIntent.chainId) {\n txIntent.networkFamily = 'EVM';\n }\n // Remove 'from' if present (Hot Path doesn't use it in v2 contract)\n if (txIntent.from && !txIntent.fromAddress) {\n delete txIntent.from;\n }\n \n // Ensure signingContext has actorPrincipal (required by Hot Path)\n const signingContext: any = {\n ...req.signingContext,\n actorPrincipal: req.signingContext?.actorPrincipal || req.signingContext?.signerId || 'unknown',\n };\n\n // Inject provenance from environment if available\n const provenance = ProvenanceProvider.getProvenance();\n if (provenance) {\n signingContext.caller = {\n repo: provenance.repo,\n workflow: provenance.workflow,\n ref: provenance.ref,\n actor: provenance.actor,\n attestation: provenance.attestation,\n };\n }\n \n // Prepare request body (Hot Path expects camelCase at top level)\n const body: any = {\n requestId: requestId,\n tenantId: this.config.tenantId,\n timestampMs: timestampMs,\n txIntent: txIntent,\n signingContext: signingContext,\n // Add SDK info (required by Hot Path validation)\n sdk: {\n name: 'blockintel-gate-sdk',\n version: '0.1.0',\n },\n };\n\n // Prepare headers (required headers are automatically added by ApiKeyAuth/HmacSigner)\n let headers: Record<string, string>;\n\n if (this.hmacSigner) {\n const hmacHeaders = await this.hmacSigner.signRequest({\n method: 'POST',\n path: '/defense/evaluate',\n tenantId: this.config.tenantId,\n timestampMs,\n requestId,\n body,\n });\n headers = { ...hmacHeaders };\n } else if (this.apiKeyAuth) {\n const apiKeyHeaders = this.apiKeyAuth.createHeaders({\n tenantId: this.config.tenantId,\n timestampMs,\n requestId,\n });\n headers = { ...apiKeyHeaders };\n } else {\n throw new Error('No authentication configured');\n }\n\n // Make request (API returns { success: true, data: { ... } } format)\n const apiResponse = await this.httpClient.request<{\n success: boolean;\n data?: DefenseEvaluateResponseV2 & {\n reason_codes?: string[];\n policy_version?: string;\n correlation_id?: string;\n step_up?: {\n request_id?: string;\n ttl_seconds?: number;\n expires_at_ms?: number;\n };\n };\n error?: any;\n }>({\n method: 'POST',\n path: '/defense/evaluate',\n headers,\n body,\n requestId,\n });\n\n // Extract data from wrapped response (Hot Path returns { success: true, data: { ... } })\n if (!apiResponse.success || !apiResponse.data) {\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n 'Invalid response format: expected { success: true, data: { ... } }',\n {\n requestId,\n details: apiResponse,\n }\n );\n }\n\n const responseData = apiResponse.data;\n\n // Convert snake_case to camelCase if needed\n const result: DefenseEvaluateResponseV2 = {\n decision: responseData.decision as 'ALLOW' | 'BLOCK' | 'REQUIRE_STEP_UP',\n reasonCodes: responseData.reason_codes ?? responseData.reasonCodes ?? [],\n policyVersion: responseData.policy_version ?? responseData.policyVersion,\n correlationId: responseData.correlation_id ?? responseData.correlationId,\n stepUp: responseData.step_up\n ? {\n requestId: responseData.step_up.request_id ?? (responseData.stepUp?.requestId ?? ''),\n ttlSeconds: responseData.step_up.ttl_seconds ?? responseData.stepUp?.ttlSeconds,\n }\n : responseData.stepUp,\n };\n\n const latencyMs = Date.now() - startTime;\n\n // Handle decision types\n if (result.decision === 'BLOCK') {\n // BLOCK → throw BlockIntelBlockedError\n const receiptId = (responseData as any).decision_id || requestId;\n const reasonCode = result.reasonCodes[0] || 'POLICY_VIOLATION';\n this.metrics.recordRequest('BLOCK', latencyMs);\n throw new BlockIntelBlockedError(reasonCode, receiptId, result.correlationId, requestId);\n }\n\n if (result.decision === 'REQUIRE_STEP_UP') {\n // REQUIRE_STEP_UP handling\n if (this.config.enableStepUp && this.stepUpPoller && result.stepUp) {\n // Step-up is enabled - throw BlockIntelStepUpRequiredError\n const stepUpRequestId = result.stepUp.requestId || requestId;\n const expiresAtMs = (responseData.step_up as any)?.expires_at_ms;\n const statusUrl = `/defense/stepup/status?tenantId=${this.config.tenantId}&requestId=${stepUpRequestId}`;\n this.metrics.recordRequest('REQUIRE_STEP_UP', latencyMs);\n throw new BlockIntelStepUpRequiredError(stepUpRequestId, statusUrl, expiresAtMs, requestId);\n } else {\n // Step-up not enabled - treat as BLOCK\n const receiptId = (responseData as any).decision_id || requestId;\n const reasonCode = 'STEPUP_REQUIRED';\n this.metrics.recordRequest('BLOCK', latencyMs);\n throw new BlockIntelBlockedError(reasonCode, receiptId, result.correlationId, requestId);\n }\n }\n\n // ALLOW - record metrics and return\n this.metrics.recordRequest('ALLOW', latencyMs);\n return result;\n };\n\n // Execute with circuit breaker if enabled\n try {\n if (this.circuitBreaker) {\n return await this.circuitBreaker.execute(executeRequest);\n }\n return await executeRequest();\n } catch (error: any) {\n const latencyMs = Date.now() - startTime;\n\n // Handle circuit breaker open\n if (error instanceof CircuitBreakerOpenError) {\n this.metrics.recordCircuitBreakerOpen();\n const failSafeResult = this.handleFailSafe(failSafeMode, error, requestId);\n if (failSafeResult) {\n return failSafeResult;\n }\n throw error;\n }\n\n // Handle auth failures (401/403) - always fail CLOSED (BLOCK)\n if (error instanceof GateError && (error.code === GateErrorCode.UNAUTHORIZED || error.code === GateErrorCode.FORBIDDEN)) {\n this.metrics.recordError();\n throw new BlockIntelAuthError(\n error.message,\n error.status || 401,\n requestId\n );\n }\n\n // Handle timeout errors\n if (error instanceof GateError && error.code === GateErrorCode.TIMEOUT) {\n this.metrics.recordTimeout();\n const failSafeResult = this.handleFailSafe(failSafeMode, error, requestId);\n if (failSafeResult) {\n return failSafeResult;\n }\n throw new BlockIntelUnavailableError(`Service timeout: ${error.message}`, requestId);\n }\n\n // Handle 5xx server errors - treat as timeout bucket for fail-safe\n if (error instanceof GateError && error.code === GateErrorCode.SERVER_ERROR) {\n this.metrics.recordError();\n const failSafeResult = this.handleFailSafe(failSafeMode, error, requestId);\n if (failSafeResult) {\n return failSafeResult;\n }\n throw error;\n }\n\n // Re-throw BlockIntelBlockedError and BlockIntelStepUpRequiredError as-is\n if (error instanceof BlockIntelBlockedError || error instanceof BlockIntelStepUpRequiredError) {\n throw error;\n }\n\n // Other errors - record and re-throw\n this.metrics.recordError();\n throw error;\n }\n }\n\n /**\n * Handle fail-safe modes for timeouts/errors\n */\n private handleFailSafe(\n mode: 'ALLOW_ON_TIMEOUT' | 'BLOCK_ON_TIMEOUT' | 'BLOCK_ON_ANOMALY',\n error: Error,\n requestId: string\n ): DefenseEvaluateResponseV2 | null {\n if (mode === 'ALLOW_ON_TIMEOUT') {\n // Trading bots: ALLOW on timeout with degraded flag\n // TODO: Attach header \"X-BlockIntel-Degraded: true\" to logs if possible\n return {\n decision: 'ALLOW',\n reasonCodes: ['FAIL_SAFE_ALLOW'],\n correlationId: requestId,\n };\n }\n\n if (mode === 'BLOCK_ON_TIMEOUT') {\n // Fail CLOSED - don't return, let error propagate\n return null;\n }\n\n if (mode === 'BLOCK_ON_ANOMALY') {\n // BLOCK only on explicit BLOCK/REQUIRE_STEP_UP decisions, not network hiccups\n // On timeout: ALLOW gracefully\n return {\n decision: 'ALLOW',\n reasonCodes: ['FAIL_SAFE_ALLOW'],\n correlationId: requestId,\n };\n }\n\n return null;\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): ReturnType<MetricsCollector['getMetrics']> {\n return this.metrics.getMetrics();\n }\n\n /**\n * Get circuit breaker metrics (if enabled)\n */\n getCircuitBreakerMetrics(): ReturnType<CircuitBreaker['getMetrics']> | null {\n return this.circuitBreaker?.getMetrics() || null;\n }\n\n /**\n * Get step-up status\n */\n async getStepUpStatus(args: {\n requestId: string;\n tenantId?: string;\n }): Promise<StepUpStatusResponse> {\n if (!this.stepUpPoller) {\n throw new StepUpNotConfiguredError(args.requestId);\n }\n\n const tenantId = args.tenantId ?? this.config.tenantId;\n const poller = new StepUpPoller({\n httpClient: this.httpClient,\n tenantId,\n pollingIntervalMs: this.config.stepUp?.pollingIntervalMs,\n maxWaitMs: this.config.stepUp?.maxWaitMs,\n });\n\n return poller.getStatus(args.requestId);\n }\n\n /**\n * Wait for step-up decision with polling\n */\n async awaitStepUpDecision(args: {\n requestId: string;\n maxWaitMs?: number;\n intervalMs?: number;\n }): Promise<StepUpFinalResult> {\n if (!this.stepUpPoller) {\n throw new StepUpNotConfiguredError(args.requestId);\n }\n\n return this.stepUpPoller.awaitDecision(args.requestId, {\n maxWaitMs: args.maxWaitMs ?? this.config.stepUp?.maxWaitMs,\n intervalMs: args.intervalMs ?? this.config.stepUp?.pollingIntervalMs,\n });\n }\n\n /**\n * Wrap AWS SDK v3 KMS client to intercept SignCommand calls\n * \n * @param kmsClient - AWS SDK v3 KMSClient instance\n * @param options - Wrapper options\n * @returns Wrapped KMS client that enforces Gate policies\n * \n * @example\n * ```typescript\n * import { KMSClient } from '@aws-sdk/client-kms';\n * \n * const kms = new KMSClient({});\n * const protectedKms = gateClient.wrapKmsClient(kms);\n * \n * // Now SignCommand calls will be intercepted and evaluated by Gate\n * const result = await protectedKms.send(new SignCommand({ ... }));\n * ```\n */\n wrapKmsClient<T extends typeof import('@aws-sdk/client-kms').KMSClient>(\n kmsClient: InstanceType<T>,\n options?: WrapKmsClientOptions\n ): WrappedKmsClient {\n return wrapKmsClient(kmsClient as any, this, options);\n }\n}\n\n/**\n * Create a Gate client instance\n */\nexport function createGateClient(config: GateClientConfig): GateClient {\n return new GateClient(config);\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/canonicalJson.ts","../src/utils/crypto.ts","../src/auth/HmacSigner.ts","../src/auth/ApiKeyAuth.ts","../src/types/errors.ts","../src/http/retry.ts","../src/http/HttpClient.ts","../src/utils/time.ts","../src/stepup/stepup.ts","../src/circuit/CircuitBreaker.ts","../src/metrics/MetricsCollector.ts","../src/kms/wrapAwsSdkV3KmsClient.ts","../src/provenance/ProvenanceProvider.ts","../src/heartbeat/HeartbeatManager.ts","../src/client/GateClient.ts"],"names":["sorted","crypto","GateErrorCode","uuidv4","startTime","canonicalizeJson"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * BlockIntel Gate SDK - Canonical JSON Utilities\n * \n * Implements deterministic JSON serialization for HMAC signing.\n * Ensures stable key ordering and no whitespace.\n */\n\n/**\n * Sort object keys recursively and produce canonical JSON string\n * \n * Matches Hot Path implementation: JSON.stringify(sorted object)\n * Rules:\n * - All keys sorted alphabetically (case-sensitive)\n * - Uses JSON.stringify for consistent formatting\n * - UTF-8 encoding\n * - Stable ordering for arrays and nested objects\n */\nexport function canonicalizeJson(obj: unknown): string {\n if (obj === null || obj === undefined) {\n return 'null';\n }\n\n // Deep clone to avoid mutating original (matches Hot Path)\n const cloned = JSON.parse(JSON.stringify(obj));\n \n // Recursively sort object keys (matches Hot Path sortKeys function)\n function sortKeys(item: unknown): unknown {\n if (Array.isArray(item)) {\n return item.map(sortKeys);\n }\n if (item !== null && typeof item === 'object') {\n const sorted: Record<string, unknown> = {};\n Object.keys(item).sort().forEach(key => {\n sorted[key] = sortKeys((item as Record<string, unknown>)[key]);\n });\n return sorted;\n }\n return item;\n }\n\n const sorted = sortKeys(cloned);\n return JSON.stringify(sorted);\n}\n\n/**\n * Compute SHA-256 hash of canonical JSON\n */\nexport async function sha256Hex(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n // Fallback for Node < 18 or environments without Web Crypto\n // In Node 18+, crypto.subtle is available globally\n if (typeof require !== 'undefined') {\n const crypto = require('crypto');\n return crypto.createHash('sha256').update(input, 'utf8').digest('hex');\n }\n\n throw new Error('SHA-256 not available in this environment');\n}\n\n","/**\n * BlockIntel Gate SDK - Crypto Utilities\n * \n * HMAC-SHA256 implementation using Web Crypto API or Node.js crypto\n */\n\n/**\n * Compute HMAC-SHA256 signature\n */\nexport async function hmacSha256(secret: string, message: string): Promise<string> {\n // Hot Path uses Node.js crypto.createHmac('sha256', secret) which treats the secret as UTF-8 string\n // Python SDK uses hmac.new(secret.encode('utf-8'), ...) which also treats secret as UTF-8 bytes\n // We must match this behavior exactly\n \n // Always use Node.js crypto module (not Web Crypto API) to match Hot Path behavior\n // Web Crypto API might have subtle differences in how it handles the secret\n if (typeof require !== 'undefined') {\n const crypto = require('crypto');\n // Use secret as UTF-8 string directly (matches Hot Path and Python SDK behavior)\n // Hot Path: crypto.createHmac('sha256', secret) where secret is a base64 string\n // Python: hmac.new(secret.encode('utf-8'), ...) where secret is base64 string encoded as UTF-8\n const hmac = crypto.createHmac('sha256', secret);\n hmac.update(message, 'utf8');\n const signatureHex = hmac.digest('hex');\n \n // Debug logging for signature computation\n console.error('[HMAC CRYPTO DEBUG] Signature computation:', JSON.stringify({\n secretLength: secret.length,\n messageLength: message.length,\n messagePreview: message.substring(0, 200) + '...',\n signatureLength: signatureHex.length,\n signaturePreview: signatureHex.substring(0, 16) + '...',\n }, null, 2));\n \n return signatureHex;\n }\n\n // Fallback for browser environments (should not be used in Node.js)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n // Web Crypto API (browser only)\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret); // Encode secret as UTF-8 bytes\n const messageData = encoder.encode(message);\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', key, messageData);\n const hashArray = Array.from(new Uint8Array(signature));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n throw new Error('HMAC-SHA256 not available in this environment');\n}\n\n","/**\n * BlockIntel Gate SDK - HMAC v1 Signer\n * \n * Implements canonical request signing for Gate Hot Path API.\n * \n * Signing Algorithm (v1):\n * 1. Create canonical signing string:\n * v1\\n\n * <HTTP_METHOD>\\n\n * <PATH>\\n\n * <TENANT_ID>\\n\n * <KEY_ID>\\n\n * <TIMESTAMP_MS>\\n\n * <REQUEST_ID_AS_NONCE>\\n\n * <SHA256_HEX_OF_BODY>\n * \n * 2. Compute HMAC-SHA256(secret, signingString) as hex\n * \n * 3. Include headers:\n * - X-GATE-TENANT-ID\n * - X-GATE-KEY-ID\n * - X-GATE-TIMESTAMP-MS\n * - X-GATE-REQUEST-ID (used as nonce in canonical string)\n * - X-GATE-SIGNATURE (hex string)\n */\n\nimport { hmacSha256 } from '../utils/crypto.js';\nimport { canonicalizeJson, sha256Hex } from '../utils/canonicalJson.js';\n\nexport interface HmacSignerConfig {\n keyId: string;\n secret: string;\n}\n\nexport interface SigningHeaders {\n 'X-GATE-TENANT-ID': string;\n 'X-GATE-KEY-ID': string;\n 'X-GATE-TIMESTAMP-MS': string;\n 'X-GATE-REQUEST-ID': string;\n 'X-GATE-SIGNATURE': string;\n}\n\n/**\n * HMAC v1 signer for Gate API requests\n */\nexport class HmacSigner {\n private readonly keyId: string;\n private readonly secret: string;\n\n constructor(config: HmacSignerConfig) {\n this.keyId = config.keyId;\n // Trim whitespace/newlines - ECS Secrets Manager injection might add trailing newline\n this.secret = config.secret.trim();\n\n if (!this.secret || this.secret.length === 0) {\n throw new Error('HMAC secret cannot be empty');\n }\n }\n\n /**\n * Sign a request and return headers\n */\n async signRequest(params: {\n method: string;\n path: string;\n tenantId: string;\n timestampMs: number;\n requestId: string;\n body?: unknown;\n }): Promise<SigningHeaders> {\n const { method, path, tenantId, timestampMs, requestId, body } = params;\n\n // Canonicalize body\n const bodyJson = body ? canonicalizeJson(body) : '';\n const bodyHash = await sha256Hex(bodyJson);\n\n // Construct canonical signing string (matches Hot Path format)\n const signingString = [\n 'v1',\n method.toUpperCase(),\n path,\n tenantId,\n this.keyId,\n String(timestampMs),\n requestId, // Used as nonce in canonical string\n bodyHash,\n ].join('\\n');\n\n // Debug logging - log canonical request for troubleshooting\n console.error('[HMAC SIGNER DEBUG] Canonical request string:', JSON.stringify({\n method: method.toUpperCase(),\n path,\n tenantId,\n keyId: this.keyId,\n timestampMs: String(timestampMs),\n requestId,\n bodyHash,\n signingStringLength: signingString.length,\n signingStringPreview: signingString.substring(0, 200) + '...',\n bodyJsonLength: bodyJson.length,\n bodyJsonPreview: bodyJson.substring(0, 200) + '...',\n }, null, 2));\n\n // Compute signature (returns hex)\n const signature = await hmacSha256(this.secret, signingString);\n \n // Debug logging - log signature computation\n console.error('[HMAC SIGNER DEBUG] Signature computed:', JSON.stringify({\n signatureLength: signature.length,\n signaturePreview: signature.substring(0, 16) + '...',\n secretLength: this.secret.length,\n secretPreview: this.secret.substring(0, 4) + '...' + this.secret.substring(this.secret.length - 4),\n }, null, 2));\n\n return {\n 'X-GATE-TENANT-ID': tenantId,\n 'X-GATE-KEY-ID': this.keyId,\n 'X-GATE-TIMESTAMP-MS': String(timestampMs),\n 'X-GATE-REQUEST-ID': requestId,\n 'X-GATE-SIGNATURE': signature,\n };\n }\n}\n\n","/**\n * BlockIntel Gate SDK - API Key Authentication\n * \n * Simple API key authentication using X-API-KEY header.\n * Still includes tenant/request/timestamp headers for replay semantics.\n */\n\nexport interface ApiKeyAuthConfig {\n apiKey: string;\n}\n\nexport interface ApiKeyHeaders {\n 'X-API-KEY': string;\n 'X-GATE-TENANT-ID': string;\n 'X-GATE-REQUEST-ID': string;\n 'X-GATE-TIMESTAMP-MS': string;\n}\n\n/**\n * API Key authenticator for Gate API requests\n */\nexport class ApiKeyAuth {\n private readonly apiKey: string;\n\n constructor(config: ApiKeyAuthConfig) {\n this.apiKey = config.apiKey;\n\n if (!this.apiKey || this.apiKey.length === 0) {\n throw new Error('API key cannot be empty');\n }\n }\n\n /**\n * Create headers for API key authentication\n */\n createHeaders(params: {\n tenantId: string;\n timestampMs: number;\n requestId: string;\n }): ApiKeyHeaders {\n const { tenantId, timestampMs, requestId } = params;\n\n return {\n 'X-API-KEY': this.apiKey,\n 'X-GATE-TENANT-ID': tenantId,\n 'X-GATE-REQUEST-ID': requestId,\n 'X-GATE-TIMESTAMP-MS': String(timestampMs),\n };\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Error Types\n */\n\n/**\n * Gate error codes\n */\nexport enum GateErrorCode {\n NETWORK_ERROR = 'NETWORK_ERROR',\n TIMEOUT = 'TIMEOUT',\n NOT_FOUND = 'NOT_FOUND',\n UNAUTHORIZED = 'UNAUTHORIZED',\n FORBIDDEN = 'FORBIDDEN',\n RATE_LIMITED = 'RATE_LIMITED',\n SERVER_ERROR = 'SERVER_ERROR',\n INVALID_RESPONSE = 'INVALID_RESPONSE',\n STEP_UP_NOT_CONFIGURED = 'STEP_UP_NOT_CONFIGURED',\n STEP_UP_TIMEOUT = 'STEP_UP_TIMEOUT',\n BLOCKED = 'BLOCKED',\n SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE',\n AUTH_ERROR = 'AUTH_ERROR',\n HEARTBEAT_MISSING = 'HEARTBEAT_MISSING',\n HEARTBEAT_EXPIRED = 'HEARTBEAT_EXPIRED',\n HEARTBEAT_INVALID = 'HEARTBEAT_INVALID',\n HEARTBEAT_MISMATCH = 'HEARTBEAT_MISMATCH',\n}\n\n/**\n * Base Gate error class\n */\nexport class GateError extends Error {\n public readonly code: GateErrorCode;\n public readonly status?: number;\n public readonly details?: Record<string, unknown>;\n public readonly requestId?: string;\n public readonly correlationId?: string;\n\n constructor(\n code: GateErrorCode,\n message: string,\n options?: {\n status?: number;\n details?: Record<string, unknown>;\n requestId?: string;\n correlationId?: string;\n cause?: Error;\n }\n ) {\n super(message);\n this.name = 'GateError';\n this.code = code;\n this.status = options?.status;\n this.details = options?.details;\n this.requestId = options?.requestId;\n this.correlationId = options?.correlationId;\n if (options?.cause) {\n this.cause = options.cause;\n }\n Error.captureStackTrace(this, this.constructor);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n details: this.details,\n requestId: this.requestId,\n correlationId: this.correlationId,\n };\n }\n}\n\n/**\n * Step-up not configured error\n * Thrown when REQUIRE_STEP_UP is returned but SDK is not configured for step-up\n */\nexport class StepUpNotConfiguredError extends GateError {\n constructor(requestId?: string) {\n super(\n GateErrorCode.STEP_UP_NOT_CONFIGURED,\n 'Step-up is required but not configured in SDK. Enable step-up in client config or treat REQUIRE_STEP_UP as BLOCK.',\n { requestId }\n );\n this.name = 'StepUpNotConfiguredError';\n }\n}\n\n/**\n * Blocked error\n * Thrown when transaction is BLOCKED by Gate\n */\nexport class BlockIntelBlockedError extends GateError {\n public readonly receiptId?: string;\n public readonly reasonCode: string;\n\n constructor(\n reasonCode: string,\n receiptId?: string,\n correlationId?: string,\n requestId?: string\n ) {\n super(\n GateErrorCode.BLOCKED,\n `Transaction blocked: ${reasonCode}`,\n { correlationId, requestId, details: { reasonCode, receiptId } }\n );\n this.name = 'BlockIntelBlockedError';\n this.receiptId = receiptId;\n this.reasonCode = reasonCode;\n }\n}\n\n/**\n * Service unavailable error\n * Thrown when fail-safe mode is BLOCK_ON_TIMEOUT and service is unavailable\n */\nexport class BlockIntelUnavailableError extends GateError {\n constructor(message: string, requestId?: string) {\n super(GateErrorCode.SERVICE_UNAVAILABLE, message, { requestId });\n this.name = 'BlockIntelUnavailableError';\n }\n}\n\n/**\n * Auth error\n * Thrown on 401/403 - always fails CLOSED (never silently allows)\n */\nexport class BlockIntelAuthError extends GateError {\n constructor(message: string, status: number, requestId?: string) {\n super(\n status === 401 ? GateErrorCode.UNAUTHORIZED : GateErrorCode.FORBIDDEN,\n message,\n { status, requestId }\n );\n this.name = 'BlockIntelAuthError';\n }\n}\n\n/**\n * Step-up required error\n * Thrown when REQUIRE_STEP_UP is returned and step-up is enabled\n */\nexport class BlockIntelStepUpRequiredError extends GateError {\n public readonly stepUpRequestId: string;\n public readonly statusUrl?: string;\n public readonly expiresAtMs?: number;\n\n constructor(\n stepUpRequestId: string,\n statusUrl?: string,\n expiresAtMs?: number,\n requestId?: string\n ) {\n super(\n GateErrorCode.STEP_UP_NOT_CONFIGURED,\n 'Step-up approval required',\n {\n requestId,\n details: { stepUpRequestId, statusUrl, expiresAtMs },\n }\n );\n this.name = 'BlockIntelStepUpRequiredError';\n this.stepUpRequestId = stepUpRequestId;\n this.statusUrl = statusUrl;\n this.expiresAtMs = expiresAtMs;\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Retry Logic\n * \n * Exponential backoff with jitter for retryable requests.\n */\n\nexport interface RetryOptions {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n}\n\nconst DEFAULT_RETRY_OPTIONS: Required<RetryOptions> = {\n maxAttempts: 3,\n baseDelayMs: 100,\n maxDelayMs: 800,\n factor: 2,\n};\n\n/**\n * Determine if an HTTP status code is retryable\n */\nexport function isRetryableStatus(status: number): boolean {\n // Retry on 429 (rate limit) and 5xx (server errors)\n return status === 429 || (status >= 500 && status < 600);\n}\n\n/**\n * Determine if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n // Network errors, timeouts, connection errors\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('network') ||\n message.includes('timeout') ||\n message.includes('connection') ||\n message.includes('econnrefused') ||\n message.includes('enotfound') ||\n message.includes('econnreset')\n );\n }\n return false;\n}\n\n/**\n * Calculate delay with exponential backoff and jitter\n */\nexport function calculateBackoffDelay(\n attempt: number,\n options: Required<RetryOptions>\n): number {\n const exponentialDelay = options.baseDelayMs * Math.pow(options.factor, attempt - 1);\n const jitter = Math.random() * 0.3 * exponentialDelay; // 0-30% jitter\n const delay = exponentialDelay + jitter;\n return Math.min(delay, options.maxDelayMs);\n}\n\n/**\n * Check if an error is a GateError with retryable status\n */\nfunction isRetryableGateError(error: unknown): boolean {\n if (error && typeof error === 'object' && 'code' in error) {\n const gateError = error as { code: string; status?: number };\n // Retry on SERVER_ERROR or RATE_LIMITED codes\n if (gateError.code === 'SERVER_ERROR' || gateError.code === 'RATE_LIMITED') {\n return true;\n }\n // Also check status if available\n if (gateError.status && isRetryableStatus(gateError.status)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry if we've exhausted attempts\n if (attempt >= opts.maxAttempts) {\n break;\n }\n\n // Don't retry on non-retryable Response errors\n if (error instanceof Response && !isRetryableStatus(error.status)) {\n throw error;\n }\n\n // Check if it's a retryable error (Response, network error, or GateError with retryable status)\n const isRetryable =\n (error instanceof Response && isRetryableStatus(error.status)) ||\n isRetryableError(error) ||\n isRetryableGateError(error);\n\n if (!isRetryable) {\n throw error;\n }\n\n // Wait before retrying\n const delay = calculateBackoffDelay(attempt, opts);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n\n","/**\n * BlockIntel Gate SDK - HTTP Client\n * \n * Fetch wrapper with timeout, retry, and error handling.\n */\n\nimport { GateError, GateErrorCode } from '../types/errors.js';\nimport { retryWithBackoff, isRetryableStatus, isRetryableError } from './retry.js';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n timeoutMs?: number;\n userAgent?: string;\n retryOptions?: {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n };\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n requestId?: string;\n}\n\n/**\n * HTTP client with retry and timeout support\n */\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly userAgent: string;\n private readonly retryOptions: Parameters<typeof retryWithBackoff>[1];\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.timeoutMs = config.timeoutMs ?? 15000;\n this.userAgent = config.userAgent ?? 'blockintel-gate-sdk/0.1.0';\n this.retryOptions = config.retryOptions;\n\n // Validate baseUrl\n if (!this.baseUrl) {\n throw new Error('baseUrl is required');\n }\n\n // Validate HTTPS in production (allow http only for localhost)\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production') {\n if (!this.baseUrl.startsWith('https://') && !this.baseUrl.includes('localhost')) {\n throw new Error('baseUrl must use HTTPS in production (except localhost)');\n }\n }\n }\n\n /**\n * Make an HTTP request with retry and timeout\n */\n async request<T>(options: RequestOptions): Promise<T> {\n const { method, path, headers = {}, body, requestId } = options;\n\n const url = `${this.baseUrl}${path}`;\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n // Store request details for error logging (outside retry callback)\n type RequestDetails = {\n headers: Record<string, string>;\n bodyLength: number;\n bodyPreview: string | null;\n };\n let requestDetailsForLogging: RequestDetails | null = null;\n let requestDetailsSet = false;\n\n try {\n const response = await retryWithBackoff(\n async () => {\n // Create headers object - ensure all header values are strings\n // Node.js fetch() may modify headers, so we need to be explicit\n const requestHeaders: Record<string, string> = {};\n \n // Copy all provided headers first\n for (const [key, value] of Object.entries(headers)) {\n requestHeaders[key] = String(value);\n }\n \n // Add required headers (these will override if already present)\n requestHeaders['User-Agent'] = this.userAgent;\n requestHeaders['Content-Type'] = 'application/json';\n \n const fetchOptions: RequestInit = {\n method,\n headers: requestHeaders,\n signal: controller.signal,\n };\n\n if (body) {\n // If body has __canonicalJson, use it directly (for HMAC signing consistency)\n if ((body as any).__canonicalJson) {\n fetchOptions.body = (body as any).__canonicalJson;\n delete (body as any).__canonicalJson; // Clean up\n } else {\n fetchOptions.body = JSON.stringify(body);\n }\n }\n\n // Debug logging: Log the exact request being sent\n // Convert headers to plain object for logging\n const logHeaders: Record<string, string> = {};\n if (fetchOptions.headers) {\n Object.entries(fetchOptions.headers).forEach(([key, value]) => {\n // Mask sensitive headers for logging\n if (key.toLowerCase().includes('signature') || key.toLowerCase().includes('secret')) {\n logHeaders[key] = String(value).substring(0, 8) + '...';\n } else {\n logHeaders[key] = String(value);\n }\n });\n }\n \n // Store for error logging\n const bodyStr = typeof fetchOptions.body === 'string' ? fetchOptions.body : null;\n const details: RequestDetails = {\n headers: logHeaders,\n bodyLength: bodyStr ? bodyStr.length : 0,\n bodyPreview: bodyStr ? bodyStr.substring(0, 300) : null,\n };\n requestDetailsForLogging = details;\n requestDetailsSet = true;\n \n // Use console.error to ensure it flushes in containers (stderr is unbuffered)\n console.error('[HTTP CLIENT DEBUG] Sending request:', JSON.stringify({\n url,\n method,\n headers: logHeaders,\n bodyLength: requestDetailsForLogging.bodyLength,\n bodyPreview: requestDetailsForLogging.bodyPreview,\n }, null, 2));\n\n const res = await fetch(url, fetchOptions);\n\n // Throw Response for retryable errors so retry logic can handle it\n if (!res.ok && isRetryableStatus(res.status)) {\n throw res;\n }\n\n // Don't retry non-retryable status codes\n if (!res.ok && !isRetryableStatus(res.status)) {\n throw res;\n }\n\n return res;\n },\n {\n ...this.retryOptions,\n // Custom retry logic that handles Response objects\n }\n );\n\n clearTimeout(timeoutId);\n\n // Parse response\n let data: T;\n const contentType = response.headers.get('content-type');\n\n // Debug logging - use console.error for unbuffered output\n console.error('[HTTP CLIENT DEBUG] Response received:', JSON.stringify({\n status: response.status,\n ok: response.ok,\n statusText: response.statusText,\n contentType,\n url: response.url,\n }, null, 2));\n\n if (contentType && contentType.includes('application/json')) {\n try {\n const jsonText = await response.text();\n console.error('[HTTP CLIENT DEBUG] Response body (first 500 chars):', jsonText.substring(0, 500));\n data = JSON.parse(jsonText) as T;\n console.error('[HTTP CLIENT DEBUG] Parsed JSON:', JSON.stringify({\n hasSuccess: typeof (data as any)?.success !== 'undefined',\n success: (data as any)?.success,\n hasData: typeof (data as any)?.data !== 'undefined',\n hasError: typeof (data as any)?.error !== 'undefined',\n }, null, 2));\n } catch (parseError) {\n console.error('[HTTP CLIENT DEBUG] JSON parse error:', parseError);\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n 'Failed to parse JSON response',\n {\n status: response.status,\n requestId,\n cause: parseError instanceof Error ? parseError : undefined,\n }\n );\n }\n } else {\n const text = await response.text();\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n `Unexpected content type: ${contentType}`,\n {\n status: response.status,\n details: { body: text.substring(0, 200) },\n requestId,\n }\n );\n }\n\n // Check for errors\n if (!response.ok) {\n // Log full response details for debugging\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n \n // Enhanced logging for 401 errors\n if (response.status === 401) {\n console.error('[HTTP CLIENT DEBUG] 401 UNAUTHORIZED - Full request details:', JSON.stringify({\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n requestMethod: method,\n requestPath: path,\n requestHeaders: requestDetailsForLogging ? (requestDetailsForLogging as RequestDetails).headers : {},\n responseHeaders: responseHeaders,\n responseData: data as Record<string, unknown>,\n bodyLength: requestDetailsForLogging ? (requestDetailsForLogging as RequestDetails).bodyLength : 0,\n bodyPreview: requestDetailsForLogging ? (requestDetailsForLogging as RequestDetails).bodyPreview : null,\n }, null, 2));\n } else {\n console.error('[HTTP CLIENT DEBUG] Response not OK:', JSON.stringify({\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n headers: responseHeaders,\n data: data as Record<string, unknown>,\n }, null, 2));\n }\n \n const errorCode = this.statusToErrorCode(response.status);\n const correlationId = response.headers.get('X-Correlation-ID') ?? undefined;\n\n throw new GateError(errorCode, `HTTP ${response.status}: ${response.statusText}`, {\n status: response.status,\n correlationId,\n requestId,\n details: data as Record<string, unknown>,\n });\n }\n\n console.error('[HTTP CLIENT DEBUG] Response OK, returning data');\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Handle abort (timeout)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new GateError(GateErrorCode.TIMEOUT, `Request timeout after ${this.timeoutMs}ms`, {\n requestId,\n });\n }\n\n // Handle Response errors (non-ok responses)\n if (error instanceof Response) {\n const errorCode = this.statusToErrorCode(error.status);\n const correlationId = error.headers.get('X-Correlation-ID') ?? undefined;\n\n let details: Record<string, unknown> | undefined;\n try {\n const text = await error.text();\n try {\n details = JSON.parse(text);\n } catch {\n details = { body: text.substring(0, 200) };\n }\n } catch {\n // Ignore parsing errors\n }\n\n throw new GateError(errorCode, `HTTP ${error.status}: ${error.statusText}`, {\n status: error.status,\n correlationId,\n requestId,\n details,\n });\n }\n\n // Handle network errors\n if (isRetryableError(error)) {\n throw new GateError(\n GateErrorCode.NETWORK_ERROR,\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n {\n requestId,\n cause: error instanceof Error ? error : undefined,\n }\n );\n }\n\n // Re-throw GateError as-is\n if (error instanceof GateError) {\n throw error;\n }\n\n // Unknown error\n throw new GateError(\n GateErrorCode.NETWORK_ERROR,\n `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,\n {\n requestId,\n cause: error instanceof Error ? error : undefined,\n }\n );\n }\n }\n\n /**\n * Map HTTP status code to GateErrorCode\n */\n private statusToErrorCode(status: number): GateErrorCode {\n if (status === 401) return GateErrorCode.UNAUTHORIZED;\n if (status === 403) return GateErrorCode.FORBIDDEN;\n if (status === 404) return GateErrorCode.NOT_FOUND;\n if (status === 429) return GateErrorCode.RATE_LIMITED;\n if (status >= 500 && status < 600) return GateErrorCode.SERVER_ERROR;\n return GateErrorCode.NETWORK_ERROR;\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Time Utilities\n */\n\n/**\n * Get current timestamp in milliseconds\n */\nexport function nowMs(): number {\n return Date.now();\n}\n\n/**\n * Get current timestamp in seconds (epoch)\n */\nexport function nowEpochSeconds(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Clamp a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n","/**\n * BlockIntel Gate SDK - Step-Up Polling\n * \n * Polls Gate Hot Path step-up status endpoint until decision is reached.\n */\n\nimport { GateError, GateErrorCode } from '../types/errors.js';\nimport { StepUpStatusResponse, GateStepUpStatus, StepUpFinalResult } from '../types/contracts.js';\nimport { nowEpochSeconds, clamp, sleep } from '../utils/time.js';\nimport { HttpClient } from '../http/HttpClient.js';\n\nexport interface StepUpPollingConfig {\n httpClient: HttpClient;\n tenantId: string;\n pollingIntervalMs?: number;\n maxWaitMs?: number;\n ttlMinSeconds?: number;\n ttlMaxSeconds?: number;\n ttlDefaultSeconds?: number;\n}\n\nconst DEFAULT_POLLING_INTERVAL_MS = 250;\nconst DEFAULT_MAX_WAIT_MS = 15000;\nconst DEFAULT_TTL_MIN_SECONDS = 300;\nconst DEFAULT_TTL_MAX_SECONDS = 900;\nconst DEFAULT_TTL_DEFAULT_SECONDS = 600;\n\n/**\n * Step-up polling helper\n */\nexport class StepUpPoller {\n private readonly httpClient: HttpClient;\n private readonly tenantId: string;\n private readonly pollingIntervalMs: number;\n private readonly maxWaitMs: number;\n private readonly ttlMinSeconds: number;\n private readonly ttlMaxSeconds: number;\n private readonly ttlDefaultSeconds: number;\n\n constructor(config: StepUpPollingConfig) {\n this.httpClient = config.httpClient;\n this.tenantId = config.tenantId;\n this.pollingIntervalMs = config.pollingIntervalMs ?? DEFAULT_POLLING_INTERVAL_MS;\n this.maxWaitMs = config.maxWaitMs ?? DEFAULT_MAX_WAIT_MS;\n this.ttlMinSeconds = config.ttlMinSeconds ?? DEFAULT_TTL_MIN_SECONDS;\n this.ttlMaxSeconds = config.ttlMaxSeconds ?? DEFAULT_TTL_MAX_SECONDS;\n this.ttlDefaultSeconds = config.ttlDefaultSeconds ?? DEFAULT_TTL_DEFAULT_SECONDS;\n }\n\n /**\n * Get current step-up status\n */\n async getStatus(requestId: string): Promise<StepUpStatusResponse> {\n const path = `/defense/stepup/status?tenantId=${encodeURIComponent(this.tenantId)}&requestId=${encodeURIComponent(requestId)}`;\n\n try {\n // API returns snake_case, convert to camelCase\n const apiResponse = await this.httpClient.request<\n StepUpStatusResponse & {\n tenant_id?: string;\n request_id?: string;\n reason_codes?: string[];\n correlation_id?: string;\n expires_at_ms?: number;\n }\n >({\n method: 'GET',\n path,\n requestId,\n });\n\n const response: StepUpStatusResponse = {\n status: apiResponse.status,\n tenantId: apiResponse.tenant_id ?? apiResponse.tenantId,\n requestId: apiResponse.request_id ?? apiResponse.requestId,\n decision: apiResponse.decision,\n reasonCodes: apiResponse.reason_codes ?? apiResponse.reasonCodes,\n correlationId: apiResponse.correlation_id ?? apiResponse.correlationId,\n expiresAtMs: apiResponse.expires_at_ms ?? apiResponse.expiresAtMs,\n ttl: apiResponse.ttl,\n };\n\n // Check if expired based on TTL\n const now = nowEpochSeconds();\n if (response.ttl !== undefined && response.ttl <= now) {\n return {\n ...response,\n status: 'EXPIRED',\n };\n }\n\n return response;\n } catch (error) {\n if (error instanceof GateError && error.code === GateErrorCode.NOT_FOUND) {\n throw new GateError(\n GateErrorCode.NOT_FOUND,\n `Step-up request not found: ${requestId}`,\n { requestId }\n );\n }\n throw error;\n }\n }\n\n /**\n * Wait for step-up decision with polling\n * \n * Polls until status is APPROVED, DENIED, or EXPIRED, or timeout is reached.\n */\n async awaitDecision(\n requestId: string,\n options?: { maxWaitMs?: number; intervalMs?: number }\n ): Promise<StepUpFinalResult> {\n const startTime = Date.now();\n const maxWaitMs = options?.maxWaitMs ?? this.maxWaitMs;\n const intervalMs = options?.intervalMs ?? this.pollingIntervalMs;\n\n while (true) {\n const elapsedMs = Date.now() - startTime;\n\n // Check timeout\n if (elapsedMs >= maxWaitMs) {\n throw new GateError(\n GateErrorCode.STEP_UP_TIMEOUT,\n `Step-up decision timeout after ${maxWaitMs}ms`,\n { requestId }\n );\n }\n\n try {\n const status = await this.getStatus(requestId);\n\n // Check if expired\n const now = nowEpochSeconds();\n if (status.ttl !== undefined && status.ttl <= now) {\n return {\n status: 'EXPIRED',\n requestId,\n elapsedMs,\n correlationId: status.correlationId,\n };\n }\n\n // Check if decision reached\n if (\n status.status === 'APPROVED' ||\n status.status === 'DENIED' ||\n status.status === 'EXPIRED'\n ) {\n return {\n status: status.status,\n requestId,\n elapsedMs,\n decision: status.decision,\n reasonCodes: status.reasonCodes,\n correlationId: status.correlationId,\n };\n }\n\n // Status is PENDING, wait and poll again\n await sleep(intervalMs);\n } catch (error) {\n // If NOT_FOUND, throw immediately (don't retry)\n if (error instanceof GateError && error.code === GateErrorCode.NOT_FOUND) {\n throw error;\n }\n\n // For other errors, wait and retry\n // But still respect timeout\n const remainingMs = maxWaitMs - (Date.now() - startTime);\n if (remainingMs <= 0) {\n throw new GateError(\n GateErrorCode.STEP_UP_TIMEOUT,\n `Step-up decision timeout after ${maxWaitMs}ms`,\n { requestId, cause: error instanceof Error ? error : undefined }\n );\n }\n\n await sleep(Math.min(intervalMs, remainingMs));\n }\n }\n }\n\n /**\n * Clamp TTL to guardrails\n */\n clampTtl(ttlSeconds?: number): number {\n if (ttlSeconds === undefined) {\n return this.ttlDefaultSeconds;\n }\n return clamp(ttlSeconds, this.ttlMinSeconds, this.ttlMaxSeconds);\n }\n}\n\n","/**\n * Circuit Breaker for SDK\n * \n * Prevents cascading failures by opening the circuit after consecutive failures.\n */\n\nexport type CircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';\n\nexport interface CircuitBreakerConfig {\n tripAfterConsecutiveFailures?: number; // Default: 5\n coolDownMs?: number; // Default: 30000 (30 seconds)\n}\n\nexport interface CircuitBreakerMetrics {\n failures: number;\n successes: number;\n state: CircuitState;\n lastFailureTime?: number;\n lastSuccessTime?: number;\n tripsToOpen: number;\n}\n\n/**\n * Circuit Breaker implementation\n */\nexport class CircuitBreaker {\n private state: CircuitState = 'CLOSED';\n private failures = 0;\n private successes = 0;\n private lastFailureTime?: number;\n private lastSuccessTime?: number;\n private tripsToOpen = 0;\n \n private readonly tripThreshold: number;\n private readonly coolDownMs: number;\n\n constructor(config: CircuitBreakerConfig = {}) {\n this.tripThreshold = config.tripAfterConsecutiveFailures ?? 5;\n this.coolDownMs = config.coolDownMs ?? 30000; // 30 seconds\n }\n\n /**\n * Execute function with circuit breaker protection\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check if circuit should transition from OPEN to HALF_OPEN\n if (this.state === 'OPEN') {\n const now = Date.now();\n const timeSinceLastFailure = this.lastFailureTime \n ? now - this.lastFailureTime \n : Infinity;\n \n if (timeSinceLastFailure >= this.coolDownMs) {\n this.state = 'HALF_OPEN';\n this.failures = 0; // Reset failures for half-open probe\n } else {\n throw new CircuitBreakerOpenError(\n `Circuit breaker is OPEN. Will retry after ${this.coolDownMs - timeSinceLastFailure}ms`\n );\n }\n }\n\n try {\n const result = await fn();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n\n private onSuccess(): void {\n this.successes++;\n this.lastSuccessTime = Date.now();\n\n if (this.state === 'HALF_OPEN') {\n // Successful probe - close circuit\n this.state = 'CLOSED';\n this.failures = 0;\n } else if (this.state === 'CLOSED') {\n // Success in closed state - reset failure count\n this.failures = 0;\n }\n }\n\n private onFailure(): void {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.state === 'HALF_OPEN') {\n // Failed probe - open circuit again\n this.state = 'OPEN';\n this.tripsToOpen++;\n } else if (this.state === 'CLOSED' && this.failures >= this.tripThreshold) {\n // Too many failures - open circuit\n this.state = 'OPEN';\n this.tripsToOpen++;\n }\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): CircuitBreakerMetrics {\n return {\n failures: this.failures,\n successes: this.successes,\n state: this.state,\n lastFailureTime: this.lastFailureTime,\n lastSuccessTime: this.lastSuccessTime,\n tripsToOpen: this.tripsToOpen,\n };\n }\n\n /**\n * Reset circuit breaker to CLOSED state\n */\n reset(): void {\n this.state = 'CLOSED';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = undefined;\n this.lastSuccessTime = undefined;\n this.tripsToOpen = 0;\n }\n}\n\n/**\n * Circuit Breaker Open Error\n */\nexport class CircuitBreakerOpenError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CircuitBreakerOpenError';\n }\n}\n\n","/**\n * Metrics Collector for SDK\n * \n * Collects counters and latency metrics for observability.\n */\n\nexport interface Metrics {\n requestsTotal: number;\n allowedTotal: number;\n blockedTotal: number;\n stepupTotal: number;\n timeoutsTotal: number;\n errorsTotal: number;\n circuitBreakerOpenTotal: number;\n wouldBlockTotal: number; // Shadow mode would-block count\n failOpenTotal: number; // Fail-open count\n latencyMs: number[]; // Histogram samples\n}\n\nexport type MetricsHook = (metrics: Metrics) => void | Promise<void>;\n\n/**\n * Metrics Collector\n */\nexport class MetricsCollector {\n private requestsTotal = 0;\n private allowedTotal = 0;\n private blockedTotal = 0;\n private stepupTotal = 0;\n private timeoutsTotal = 0;\n private errorsTotal = 0;\n private circuitBreakerOpenTotal = 0;\n private wouldBlockTotal = 0; // Shadow mode would-block count\n private failOpenTotal = 0; // Fail-open count\n private latencyMs: number[] = [];\n\n private readonly maxSamples = 1000; // Keep last 1000 samples\n private readonly hooks: MetricsHook[] = [];\n\n /**\n * Record a request\n */\n recordRequest(decision: 'ALLOW' | 'BLOCK' | 'REQUIRE_STEP_UP' | 'WOULD_BLOCK' | 'FAIL_OPEN', latencyMs: number): void {\n this.requestsTotal++;\n \n if (decision === 'ALLOW') {\n this.allowedTotal++;\n } else if (decision === 'BLOCK') {\n this.blockedTotal++;\n } else if (decision === 'REQUIRE_STEP_UP') {\n this.stepupTotal++;\n } else if (decision === 'WOULD_BLOCK') {\n this.wouldBlockTotal++;\n this.allowedTotal++; // Count as allowed (shadow mode)\n } else if (decision === 'FAIL_OPEN') {\n this.failOpenTotal++;\n this.allowedTotal++; // Count as allowed (fail-open)\n }\n\n // Add latency sample (keep rolling window)\n this.latencyMs.push(latencyMs);\n if (this.latencyMs.length > this.maxSamples) {\n this.latencyMs.shift(); // Remove oldest sample\n }\n\n this.emitMetrics();\n }\n\n /**\n * Record a timeout\n */\n recordTimeout(): void {\n this.timeoutsTotal++;\n this.errorsTotal++;\n this.emitMetrics();\n }\n\n /**\n * Record an error\n */\n recordError(): void {\n this.errorsTotal++;\n this.emitMetrics();\n }\n\n /**\n * Record circuit breaker open\n */\n recordCircuitBreakerOpen(): void {\n this.circuitBreakerOpenTotal++;\n this.emitMetrics();\n }\n\n /**\n * Get current metrics snapshot\n */\n getMetrics(): Metrics {\n return {\n requestsTotal: this.requestsTotal,\n allowedTotal: this.allowedTotal,\n blockedTotal: this.blockedTotal,\n stepupTotal: this.stepupTotal,\n timeoutsTotal: this.timeoutsTotal,\n errorsTotal: this.errorsTotal,\n circuitBreakerOpenTotal: this.circuitBreakerOpenTotal,\n wouldBlockTotal: this.wouldBlockTotal,\n failOpenTotal: this.failOpenTotal,\n latencyMs: [...this.latencyMs], // Copy array\n };\n }\n\n /**\n * Register a metrics hook (e.g., for Prometheus/OpenTelemetry export)\n */\n registerHook(hook: MetricsHook): void {\n this.hooks.push(hook);\n }\n\n /**\n * Emit metrics to all registered hooks\n */\n private emitMetrics(): void {\n const metrics = this.getMetrics();\n for (const hook of this.hooks) {\n try {\n hook(metrics);\n } catch (error) {\n // Don't throw - metrics hooks should not break SDK\n console.error('Error in metrics hook:', error);\n }\n }\n }\n\n /**\n * Reset all metrics\n */\n reset(): void {\n this.requestsTotal = 0;\n this.allowedTotal = 0;\n this.blockedTotal = 0;\n this.stepupTotal = 0;\n this.timeoutsTotal = 0;\n this.errorsTotal = 0;\n this.circuitBreakerOpenTotal = 0;\n this.wouldBlockTotal = 0;\n this.failOpenTotal = 0;\n this.latencyMs = [];\n }\n}\n\n","/**\n * BlockIntel Gate SDK - AWS SDK v3 KMS Wrapper\n * \n * Wraps AWS SDK v3 KMSClient to intercept SignCommand calls and enforce Gate policies.\n */\n\nimport { KMSClient, SignCommand, SignCommandInput } from '@aws-sdk/client-kms';\nimport { GateClient } from '../client/GateClient.js';\nimport { BlockIntelBlockedError, BlockIntelStepUpRequiredError } from '../types/errors.js';\nimport { createHash } from 'crypto';\n\n/**\n * KMS wrapper options\n */\nexport interface WrapKmsClientOptions {\n /**\n * Wrapper mode\n * - \"enforce\": Block if Gate denies, require step-up approval\n * - \"dry-run\": Evaluate but always allow KMS call (for testing)\n */\n mode?: 'enforce' | 'dry-run';\n\n /**\n * Callback invoked when a decision is made\n */\n onDecision?: (decision: 'ALLOW' | 'BLOCK' | 'REQUIRE_STEP_UP', details: any) => void;\n\n /**\n * Custom hook to extract transaction intent from SignCommand\n * If not provided, uses default extraction (minimal txIntent from message hash)\n */\n extractTxIntent?: (command: SignCommandInput) => {\n toAddress?: string;\n networkFamily?: 'EVM' | 'BTC' | 'SOL' | 'OTHER';\n chainId?: number;\n [key: string]: any;\n };\n}\n\n/**\n * Wrapped KMS client type (proxy that intercepts send calls)\n */\nexport interface WrappedKmsClient extends KMSClient {\n /**\n * Intercepted send method (overrides KMSClient.send)\n */\n send<T>(command: T): Promise<any>;\n\n /**\n * Original KMS client (for fallback or direct access)\n */\n _originalClient: KMSClient;\n\n /**\n * Gate client used for evaluation\n */\n _gateClient: GateClient;\n\n /**\n * Wrapper options\n */\n _wrapperOptions: Required<WrapKmsClientOptions>;\n}\n\n/**\n * Wrap AWS SDK v3 KMS client to intercept SignCommand calls\n * \n * @param kmsClient - AWS SDK v3 KMSClient instance\n * @param gateClient - Gate client for evaluation\n * @param options - Wrapper options\n * @returns Proxy object that intercepts send() calls\n * \n * @example\n * ```typescript\n * import { KMSClient } from '@aws-sdk/client-kms';\n * import { GateClient, wrapKmsClient } from 'blockintel-gate-sdk';\n * \n * const kms = new KMSClient({});\n * const gate = new GateClient({\n * baseUrl: process.env.GATE_BASE_URL!,\n * tenantId: process.env.GATE_TENANT_ID!,\n * auth: { mode: 'hmac', keyId: process.env.GATE_KEY_ID!, secret: process.env.GATE_HMAC_SECRET! },\n * });\n * \n * const protectedKms = wrapKmsClient(kms, gate);\n * \n * // Now calls to protectedKms.send(new SignCommand(...)) will be intercepted\n * const result = await protectedKms.send(new SignCommand({\n * KeyId: 'alias/my-key',\n * Message: Buffer.from('...'),\n * MessageType: 'RAW',\n * SigningAlgorithm: 'ECDSA_SHA_256',\n * }));\n * ```\n */\nexport function wrapKmsClient(\n kmsClient: KMSClient,\n gateClient: GateClient,\n options: WrapKmsClientOptions = {}\n): WrappedKmsClient {\n const defaultOptions: Required<WrapKmsClientOptions> = {\n mode: options.mode || 'enforce',\n onDecision: options.onDecision || (() => {}),\n extractTxIntent: options.extractTxIntent || defaultExtractTxIntent,\n };\n\n // Create proxy that intercepts send() calls\n const wrapped = new Proxy(kmsClient, {\n get(target, prop, receiver) {\n if (prop === 'send') {\n // Intercept send() method\n return async function (command: any) {\n // Check if this is a SignCommand\n if (command && command.constructor && command.constructor.name === 'SignCommand') {\n return await handleSignCommand(\n command,\n target as KMSClient,\n gateClient,\n defaultOptions\n );\n }\n\n // Not a SignCommand - pass through to original client\n return await (target as any).send(command);\n };\n }\n\n // All other properties pass through\n return Reflect.get(target, prop, receiver);\n },\n }) as WrappedKmsClient;\n\n // Attach metadata for introspection\n wrapped._originalClient = kmsClient;\n wrapped._gateClient = gateClient;\n wrapped._wrapperOptions = defaultOptions;\n\n return wrapped;\n}\n\n/**\n * Default transaction intent extraction from SignCommand\n * \n * Extracts minimal txIntent from KMS SignCommand:\n * - Uses Message hash as payloadHash\n * - Sets networkFamily to 'OTHER' (unknown)\n * - Sets signerId from KeyId\n */\nfunction defaultExtractTxIntent(command: SignCommandInput): {\n toAddress?: string;\n networkFamily?: 'EVM' | 'BTC' | 'SOL' | 'OTHER';\n chainId?: number;\n payloadHash?: string;\n dataHash?: string;\n [key: string]: any;\n} {\n // Compute SHA256 hash of message\n // SignCommand.Message can be accessed via input property or directly\n const message = (command as any).input?.Message ?? (command as any).Message;\n if (!message) {\n throw new Error('SignCommand missing required Message property');\n }\n const messageBuffer = message instanceof Buffer \n ? message \n : Buffer.from(message as any);\n const messageHash = createHash('sha256').update(messageBuffer).digest('hex');\n\n return {\n networkFamily: 'OTHER',\n toAddress: undefined, // Unknown from KMS message alone\n payloadHash: messageHash,\n dataHash: messageHash, // Backward compatibility\n };\n}\n\n/**\n * Handle intercepted SignCommand\n */\nasync function handleSignCommand(\n command: SignCommandInput,\n originalClient: KMSClient,\n gateClient: GateClient,\n options: Required<WrapKmsClientOptions>\n): Promise<any> {\n // Extract transaction intent\n const txIntent = options.extractTxIntent(command);\n\n // Extract signer ID from KeyId\n // SignCommand.KeyId can be accessed via input property or directly\n const signerId = (command as any).input?.KeyId ?? (command as any).KeyId ?? 'unknown';\n\n // CRITICAL: Check heartbeat before any Gate evaluation\n // Update heartbeat manager with actual signer_id from KeyId\n (gateClient as any).heartbeatManager.updateSignerId(signerId);\n \n const heartbeatToken = (gateClient as any).heartbeatManager.getToken();\n if (!heartbeatToken) {\n throw new BlockIntelBlockedError(\n 'HEARTBEAT_MISSING',\n undefined, // receiptId\n undefined, // correlationId\n undefined // requestId\n );\n }\n\n // Build signing context\n const signingContext = {\n signerId,\n actorPrincipal: 'kms-signer', // Default - can be customized via extractTxIntent\n heartbeatToken, // Attach heartbeat token\n };\n\n try {\n // Call Gate evaluate()\n const decision = await gateClient.evaluate({\n txIntent: txIntent as any, // Type assertion - txIntent may have extra fields\n signingContext,\n });\n\n // Decision is ALLOW (evaluate() doesn't throw)\n options.onDecision('ALLOW', { decision, signerId, command });\n\n if (options.mode === 'dry-run') {\n // Dry-run mode: evaluate but still allow\n return await originalClient.send(new SignCommand(command));\n }\n\n // Enforce mode: forward to real KMS\n return await originalClient.send(new SignCommand(command));\n } catch (error: any) {\n // Handle Gate errors\n if (error instanceof BlockIntelBlockedError) {\n options.onDecision('BLOCK', { error, signerId, command });\n throw error; // Re-throw to block KMS call\n }\n\n if (error instanceof BlockIntelStepUpRequiredError) {\n options.onDecision('REQUIRE_STEP_UP', { error, signerId, command });\n throw error; // Re-throw to prevent KMS call until step-up approved\n }\n\n // Other errors (network, auth, etc.) - re-throw\n throw error;\n }\n}\n\n","/**\n * Provenance Provider\n * \n * Provides provenance information (repo, workflow, attestation) from environment variables.\n * Used for CI/CD provenance enforcement in Gate.\n */\n\n/**\n * Provenance information extracted from environment\n */\nexport interface Provenance {\n repo?: string;\n workflow?: string;\n ref?: string;\n actor?: string;\n attestation?: {\n valid: boolean;\n issuer?: string;\n subject?: string;\n sha?: string;\n };\n}\n\n/**\n * Provenance Provider\n * \n * Reads provenance information from environment variables:\n * - GATE_CALLER_REPO\n * - GATE_CALLER_WORKFLOW\n * - GATE_CALLER_REF\n * - GATE_CALLER_ACTOR\n * - GATE_ATTESTATION_VALID\n * - GATE_ATTESTATION_ISSUER\n * - GATE_ATTESTATION_SUBJECT\n * - GATE_ATTESTATION_SHA\n */\nexport class ProvenanceProvider {\n /**\n * Get provenance from environment variables\n */\n static getProvenance(): Provenance | null {\n const repo = process.env.GATE_CALLER_REPO;\n const workflow = process.env.GATE_CALLER_WORKFLOW;\n const ref = process.env.GATE_CALLER_REF;\n const actor = process.env.GATE_CALLER_ACTOR;\n const attestationValid = process.env.GATE_ATTESTATION_VALID;\n const attestationIssuer = process.env.GATE_ATTESTATION_ISSUER;\n const attestationSubject = process.env.GATE_ATTESTATION_SUBJECT;\n const attestationSha = process.env.GATE_ATTESTATION_SHA;\n\n // If no provenance env vars are set, return null\n if (!repo && !workflow && !ref && !actor && !attestationValid) {\n return null;\n }\n\n const provenance: Provenance = {};\n\n if (repo) provenance.repo = repo;\n if (workflow) provenance.workflow = workflow;\n if (ref) provenance.ref = ref;\n if (actor) provenance.actor = actor;\n\n // Build attestation if any attestation env vars are set\n if (attestationValid || attestationIssuer || attestationSubject || attestationSha) {\n provenance.attestation = {\n valid: attestationValid === 'true' || attestationValid === '1',\n issuer: attestationIssuer,\n subject: attestationSubject,\n sha: attestationSha,\n };\n }\n\n return provenance;\n }\n\n /**\n * Check if provenance is enabled (env vars present)\n */\n static isEnabled(): boolean {\n return !!(\n process.env.GATE_CALLER_REPO ||\n process.env.GATE_CALLER_WORKFLOW ||\n process.env.GATE_ATTESTATION_VALID\n );\n }\n}\n\n","/**\n * Gate SDK - Heartbeat Manager\n * \n * Manages heartbeat token acquisition and validation.\n * Heartbeat tokens prove Gate is alive and enforcing policy.\n * Required for all signing operations.\n * \n * Features:\n * - Automatic refresh with jitter\n * - Exponential backoff on failures\n * - Client instance metadata tracking\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { HttpClient } from '../http/HttpClient.js';\nimport { GateError, GateErrorCode } from '../types/errors.js';\n\nexport interface HeartbeatToken {\n token: string;\n expiresAt: number; // Unix timestamp (seconds)\n jti?: string; // JWT ID (for reference)\n policyHash?: string; // Policy hash (for reference)\n}\n\nexport class HeartbeatManager {\n private readonly httpClient: HttpClient;\n private readonly tenantId: string;\n private signerId: string;\n private readonly environment: string;\n private readonly baseRefreshIntervalSeconds: number;\n private readonly clientInstanceId: string; // Unique per process\n private readonly sdkVersion: string; // SDK version for tracking\n\n private currentToken: HeartbeatToken | null = null;\n private refreshTimer: NodeJS.Timeout | null = null;\n private started = false;\n private consecutiveFailures = 0;\n private maxBackoffSeconds = 30; // Maximum backoff interval\n\n constructor(options: {\n httpClient: HttpClient;\n tenantId: string;\n signerId: string;\n environment?: string;\n refreshIntervalSeconds?: number;\n clientInstanceId?: string;\n sdkVersion?: string;\n }) {\n this.httpClient = options.httpClient;\n this.tenantId = options.tenantId;\n this.signerId = options.signerId;\n this.environment = options.environment ?? 'prod';\n this.baseRefreshIntervalSeconds = options.refreshIntervalSeconds ?? 10;\n \n // Generate unique client instance ID (once per process)\n this.clientInstanceId = options.clientInstanceId || uuidv4();\n \n // Get SDK version (from package.json or default)\n this.sdkVersion = options.sdkVersion || '1.0.0';\n }\n\n /**\n * Start background heartbeat refresher\n */\n start(): void {\n if (this.started) {\n return;\n }\n\n this.started = true;\n\n // Acquire initial heartbeat\n this.acquireHeartbeat().catch((error) => {\n // Log but don't fail - will retry in background\n console.error('[HEARTBEAT] Failed to acquire initial heartbeat:', error);\n });\n\n // Schedule next refresh with jitter\n this.scheduleNextRefresh();\n }\n\n /**\n * Schedule next refresh with jitter and backoff\n */\n private scheduleNextRefresh(): void {\n if (!this.started) {\n return;\n }\n\n // Calculate interval with jitter and backoff\n const baseInterval = this.baseRefreshIntervalSeconds * 1000;\n const jitter = Math.random() * 2000; // 0-2 seconds jitter\n const backoff = this.calculateBackoff();\n const interval = baseInterval + jitter + backoff;\n\n this.refreshTimer = setTimeout(() => {\n this.acquireHeartbeat()\n .then(() => {\n // Success - reset failure count\n this.consecutiveFailures = 0;\n this.scheduleNextRefresh();\n })\n .catch((error) => {\n // Failure - increment and retry\n this.consecutiveFailures++;\n console.error('[HEARTBEAT] Refresh failed (will retry):', error);\n this.scheduleNextRefresh();\n });\n }, interval);\n }\n\n /**\n * Calculate exponential backoff (capped at maxBackoffSeconds)\n */\n private calculateBackoff(): number {\n if (this.consecutiveFailures === 0) {\n return 0;\n }\n\n // Exponential backoff: 2^failures seconds, capped at maxBackoffSeconds\n const backoffSeconds = Math.min(\n Math.pow(2, this.consecutiveFailures) * 1000,\n this.maxBackoffSeconds * 1000\n );\n\n return backoffSeconds;\n }\n\n /**\n * Stop background heartbeat refresher\n */\n stop(): void {\n if (!this.started) {\n return;\n }\n\n this.started = false;\n\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /**\n * Get current heartbeat token if valid\n */\n getToken(): string | null {\n if (!this.currentToken) {\n return null;\n }\n\n // Check expiration (with 2 second buffer)\n const now = Math.floor(Date.now() / 1000);\n if (this.currentToken.expiresAt <= (now + 2)) {\n return null;\n }\n\n return this.currentToken.token;\n }\n\n /**\n * Check if current heartbeat token is valid\n */\n isValid(): boolean {\n return this.getToken() !== null;\n }\n\n /**\n * Update signer ID (called when signer is known)\n */\n updateSignerId(signerId: string): void {\n if (this.signerId !== signerId) {\n this.signerId = signerId;\n // Invalidate current token to force refresh with new signer_id\n this.currentToken = null;\n }\n }\n\n /**\n * Acquire a new heartbeat token from Control Plane\n * NEVER logs token value (security)\n */\n private async acquireHeartbeat(): Promise<void> {\n try {\n const response = await this.httpClient.request<{\n success: boolean;\n data?: {\n heartbeatToken: string;\n expiresAt: number;\n ttl?: number;\n policyHash?: string;\n jti?: string;\n };\n error?: {\n message: string;\n };\n }>({\n method: 'POST',\n path: '/api/v1/gate/heartbeat',\n body: {\n tenantId: this.tenantId,\n signerId: this.signerId,\n environment: this.environment,\n clientInstanceId: this.clientInstanceId,\n sdkVersion: this.sdkVersion,\n },\n });\n\n if (response.success && response.data) {\n const token = response.data.heartbeatToken;\n const expiresAt = response.data.expiresAt;\n\n if (!token || !expiresAt) {\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n 'Invalid heartbeat response: missing token or expiresAt'\n );\n }\n\n this.currentToken = {\n token,\n expiresAt,\n jti: response.data.jti,\n policyHash: response.data.policyHash,\n };\n\n // Log WITHOUT token value (security)\n console.log('[HEARTBEAT] Acquired heartbeat token', {\n expiresAt,\n jti: response.data.jti,\n policyHash: response.data.policyHash?.substring(0, 8) + '...',\n // DO NOT log token value\n });\n } else {\n const error = (response as any).error || {};\n throw new GateError(\n GateErrorCode.SERVER_ERROR,\n `Heartbeat acquisition failed: ${error.message || 'Unknown error'}`\n );\n }\n } catch (error: any) {\n // Log error but NEVER log token\n console.error('[HEARTBEAT] Failed to acquire heartbeat:', error.message || error);\n throw error;\n }\n }\n\n /**\n * Get client instance ID (for tracking)\n */\n getClientInstanceId(): string {\n return this.clientInstanceId;\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Gate Client\n * \n * Main client for interacting with Gate Hot Path API.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { HmacSigner } from '../auth/HmacSigner.js';\nimport { ApiKeyAuth } from '../auth/ApiKeyAuth.js';\nimport { HttpClient } from '../http/HttpClient.js';\nimport { StepUpPoller } from '../stepup/stepup.js';\nimport {\n GateClientConfig,\n DefenseEvaluateRequestV2,\n DefenseEvaluateResponseV2,\n StepUpStatusResponse,\n StepUpFinalResult,\n GateMode,\n ConnectionFailureStrategy,\n} from '../types/contracts.js';\nimport {\n GateError,\n GateErrorCode,\n StepUpNotConfiguredError,\n BlockIntelBlockedError,\n BlockIntelUnavailableError,\n BlockIntelAuthError,\n BlockIntelStepUpRequiredError,\n} from '../types/errors.js';\nimport { CircuitBreaker, CircuitBreakerOpenError } from '../circuit/CircuitBreaker.js';\nimport { MetricsCollector } from '../metrics/MetricsCollector.js';\nimport { nowMs } from '../utils/time.js';\nimport { wrapKmsClient, WrapKmsClientOptions, WrappedKmsClient } from '../kms/wrapAwsSdkV3KmsClient.js';\nimport { ProvenanceProvider } from '../provenance/ProvenanceProvider.js';\nimport { HeartbeatManager } from '../heartbeat/HeartbeatManager.js';\n\n/**\n * Gate Client for Hot Path API\n */\nexport class GateClient {\n private readonly config: GateClientConfig;\n private readonly httpClient: HttpClient;\n private readonly hmacSigner?: HmacSigner;\n private readonly apiKeyAuth?: ApiKeyAuth;\n private readonly stepUpPoller?: StepUpPoller;\n private readonly circuitBreaker?: CircuitBreaker;\n private readonly metrics: MetricsCollector;\n private readonly heartbeatManager: HeartbeatManager;\n private readonly mode: GateMode;\n private readonly onConnectionFailure: ConnectionFailureStrategy;\n\n constructor(config: GateClientConfig) {\n this.config = config;\n \n // Determine mode: env var > config > default (SHADOW for safety)\n const envMode = process.env.GATE_MODE as GateMode | undefined;\n this.mode = envMode || config.mode || 'SHADOW';\n \n // Determine connection failure strategy: config > default based on mode\n if (config.onConnectionFailure) {\n this.onConnectionFailure = config.onConnectionFailure;\n } else {\n // Default: FAIL_OPEN in SHADOW mode, FAIL_CLOSED in ENFORCE mode\n this.onConnectionFailure = this.mode === 'SHADOW' ? 'FAIL_OPEN' : 'FAIL_CLOSED';\n }\n\n // Initialize auth\n if (config.auth.mode === 'hmac') {\n this.hmacSigner = new HmacSigner({\n keyId: config.auth.keyId,\n secret: config.auth.secret,\n });\n } else {\n this.apiKeyAuth = new ApiKeyAuth({\n apiKey: config.auth.apiKey,\n });\n }\n\n // Initialize HTTP client\n this.httpClient = new HttpClient({\n baseUrl: config.baseUrl,\n timeoutMs: config.timeoutMs,\n userAgent: config.userAgent,\n });\n\n // Initialize step-up poller if enabled\n if (config.enableStepUp) {\n this.stepUpPoller = new StepUpPoller({\n httpClient: this.httpClient,\n tenantId: config.tenantId,\n pollingIntervalMs: config.stepUp?.pollingIntervalMs,\n maxWaitMs: config.stepUp?.maxWaitMs,\n });\n }\n\n // Initialize circuit breaker if configured\n if (config.circuitBreaker) {\n this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);\n }\n\n // Initialize metrics collector\n this.metrics = new MetricsCollector();\n if (config.onMetrics) {\n this.metrics.registerHook(config.onMetrics);\n }\n\n // Initialize heartbeat manager (skip in local mode)\n if (config.local) {\n console.warn('[GATE CLIENT] LOCAL MODE ENABLED - Auth, heartbeat, and break-glass are disabled');\n // @ts-ignore - heartbeatManager not needed in local mode\n this.heartbeatManager = null;\n } else {\n // Use control plane URL for heartbeat (different from hot path baseUrl)\n let controlPlaneUrl = config.baseUrl;\n if (controlPlaneUrl.includes('/defense')) {\n controlPlaneUrl = controlPlaneUrl.split('/defense')[0];\n }\n // Also try to get from config if explicitly set\n if ((config as any).controlPlaneUrl) {\n controlPlaneUrl = (config as any).controlPlaneUrl;\n }\n\n const heartbeatHttpClient = new HttpClient({\n baseUrl: controlPlaneUrl,\n timeoutMs: 5000, // 5s timeout for heartbeat\n userAgent: config.userAgent,\n });\n\n // Initialize heartbeat manager with configured signerId if provided\n // Otherwise, use placeholder - will be updated when signer is known from signing operations\n const initialSignerId = config.signerId ?? 'trading-bot-signer';\n this.heartbeatManager = new HeartbeatManager({\n httpClient: heartbeatHttpClient,\n tenantId: config.tenantId,\n signerId: initialSignerId,\n environment: (config as any).environment ?? 'prod',\n refreshIntervalSeconds: config.heartbeatRefreshIntervalSeconds ?? 10,\n });\n\n // Start heartbeat refresher (automatically sends heartbeats in background)\n this.heartbeatManager.start();\n }\n }\n\n /**\n * Evaluate a transaction defense request\n * \n * Implements:\n * - Shadow Mode (SHADOW: monitor-only, ENFORCE: enforce decisions)\n * - Connection failure strategy (FAIL_OPEN vs FAIL_CLOSED)\n * - Circuit breaker protection\n * - Fail-safe modes (ALLOW_ON_TIMEOUT, BLOCK_ON_TIMEOUT, BLOCK_ON_ANOMALY)\n * - Metrics collection\n * - Error handling (BLOCK → BlockIntelBlockedError, REQUIRE_STEP_UP → BlockIntelStepUpRequiredError)\n */\n async evaluate(\n req: DefenseEvaluateRequestV2,\n opts?: { requestId?: string }\n ): Promise<DefenseEvaluateResponseV2> {\n const requestId = opts?.requestId ?? uuidv4();\n const timestampMs = req.timestampMs ?? nowMs();\n const startTime = Date.now();\n const failSafeMode = this.config.failSafeMode ?? 'ALLOW_ON_TIMEOUT';\n \n // Determine mode for this request (request-level override > client-level > default)\n const requestMode: GateMode = (req as any).mode || this.mode;\n\n // Wrap request with circuit breaker if enabled\n const executeRequest = async (): Promise<DefenseEvaluateResponseV2> => {\n // Update heartbeat manager with signerId from signingContext if provided (skip in local mode)\n if (!this.config.local && this.heartbeatManager && req.signingContext?.signerId) {\n this.heartbeatManager.updateSignerId(req.signingContext.signerId);\n }\n\n // CRITICAL: Check heartbeat before any policy evaluation (skip in local mode)\n let heartbeatToken: string | null = null;\n if (!this.config.local && this.heartbeatManager) {\n // Wait up to 2 seconds for heartbeat to be acquired if not available yet\n heartbeatToken = this.heartbeatManager.getToken();\n if (!heartbeatToken) {\n // Wait for initial heartbeat acquisition (with timeout)\n const maxWaitMs = 2000;\n const startTime = Date.now();\n while (!heartbeatToken && (Date.now() - startTime) < maxWaitMs) {\n await new Promise(resolve => setTimeout(resolve, 50)); // Wait 50ms\n heartbeatToken = this.heartbeatManager.getToken();\n }\n }\n \n if (!heartbeatToken) {\n throw new GateError(\n GateErrorCode.HEARTBEAT_MISSING,\n 'Signing blocked: Heartbeat token is missing or expired. Gate must be alive and enforcing policy.'\n );\n }\n }\n\n // Transform txIntent: map 'to' to 'toAddress', add 'networkFamily' if missing\n const txIntent: any = { ...req.txIntent };\n // Map 'to' to 'toAddress' (Hot Path expects toAddress, not to)\n if (txIntent.to && !txIntent.toAddress) {\n txIntent.toAddress = txIntent.to;\n delete txIntent.to; // Remove 'to' to avoid duplicate fields in canonical JSON\n }\n // Infer networkFamily from chainId if not provided\n if (!txIntent.networkFamily && txIntent.chainId) {\n txIntent.networkFamily = 'EVM';\n }\n // Remove 'from' if present (Hot Path doesn't use it in v2 contract)\n if (txIntent.from && !txIntent.fromAddress) {\n delete txIntent.from;\n }\n \n // Use signingContext as-is (match Python SDK behavior)\n // Don't auto-add actorPrincipal - let it come from the request\n const signingContext: any = {\n ...req.signingContext,\n };\n \n // Only include heartbeatToken if it's valid (not null/undefined)\n // Including null/undefined would change the canonical JSON hash\n if (heartbeatToken) {\n signingContext.heartbeatToken = heartbeatToken;\n }\n\n // Inject provenance from environment if available\n const provenance = ProvenanceProvider.getProvenance();\n if (provenance) {\n signingContext.caller = {\n repo: provenance.repo,\n workflow: provenance.workflow,\n ref: provenance.ref,\n actor: provenance.actor,\n attestation: provenance.attestation,\n };\n }\n \n // Prepare request body (Hot Path expects camelCase at top level)\n // Note: tenantId is NOT in the body - it's only in headers for HMAC auth\n let body: any = {\n requestId: requestId,\n timestampMs: timestampMs,\n txIntent: txIntent,\n signingContext: signingContext,\n // Add SDK info (required by Hot Path validation)\n // Note: Must match Python SDK name for consistent canonical JSON\n sdk: {\n name: 'gate-sdk',\n version: '0.1.0',\n },\n // Add mode and connection failure strategy\n mode: requestMode,\n onConnectionFailure: this.onConnectionFailure,\n };\n \n // Add simulation flag if requested\n if (req.simulate === true) {\n body.simulate = true;\n }\n \n // Add break-glass token if configured (skip in local mode)\n if (!this.config.local && this.config.breakglassToken) {\n signingContext.breakglassToken = this.config.breakglassToken;\n }\n\n // Prepare headers (skip auth in local mode)\n let headers: Record<string, string> = {};\n \n if (this.config.local) {\n // Local mode: no auth headers, just basic headers\n headers = {\n 'Content-Type': 'application/json',\n };\n console.log('[GATE CLIENT] LOCAL MODE - Skipping authentication');\n } else if (this.hmacSigner) {\n // CRITICAL: For HMAC signing, the body sent in the HTTP request must match\n // the canonical JSON used for signing. The HmacSigner will canonicalize the body\n // internally, so we need to ensure the body we send matches what was canonicalized.\n // We pass the original body to HmacSigner (it will canonicalize it), then use\n // the same canonicalized result for the HTTP request.\n const { canonicalizeJson } = await import('../utils/canonicalJson.js');\n const canonicalBodyJson = canonicalizeJson(body);\n \n const hmacHeaders = await this.hmacSigner.signRequest({\n method: 'POST',\n path: '/defense/evaluate',\n tenantId: this.config.tenantId,\n timestampMs,\n requestId,\n body, // Pass original body - HmacSigner will canonicalize it internally\n });\n headers = { ...hmacHeaders };\n \n // CRITICAL: Use the canonical JSON string directly for HTTP request\n // This ensures the exact same string is sent that was used for signing\n // Store it as a special property that HttpClient will use\n (body as any).__canonicalJson = canonicalBodyJson;\n \n // Debug logging for authentication headers (mask signature)\n const debugHeaders: Record<string, string> = {};\n Object.entries(headers).forEach(([key, value]) => {\n if (key.toLowerCase().includes('signature')) {\n debugHeaders[key] = value.substring(0, 8) + '...';\n } else {\n debugHeaders[key] = value;\n }\n });\n console.error('[GATE CLIENT DEBUG] HMAC headers prepared:', JSON.stringify(debugHeaders, null, 2));\n } else if (this.apiKeyAuth) {\n const apiKeyHeaders = this.apiKeyAuth.createHeaders({\n tenantId: this.config.tenantId,\n timestampMs,\n requestId,\n });\n headers = { ...apiKeyHeaders };\n console.error('[GATE CLIENT DEBUG] API key headers prepared:', JSON.stringify(headers, null, 2));\n } else {\n throw new Error('No authentication configured');\n }\n\n // Make request (API returns { success: true, data: { ... } } format)\n const apiResponse = await this.httpClient.request<{\n success: boolean;\n data?: DefenseEvaluateResponseV2 & {\n reason_codes?: string[];\n policy_version?: string;\n correlation_id?: string;\n step_up?: {\n request_id?: string;\n ttl_seconds?: number;\n expires_at_ms?: number;\n };\n };\n error?: any;\n }>({\n method: 'POST',\n path: '/defense/evaluate',\n headers,\n body,\n requestId,\n });\n\n // Extract data from wrapped response (Hot Path returns { success: true, data: { ... } })\n // Fallback: if response is not wrapped, use it directly (for backward compatibility)\n let responseData: any;\n if (apiResponse.success === true && apiResponse.data) {\n // Wrapped format: { success: true, data: { ... } }\n responseData = apiResponse.data;\n } else if (apiResponse.success === false && apiResponse.error) {\n // Error format: { success: false, error: { ... } }\n const error = apiResponse.error;\n throw new GateError(\n error.code as GateErrorCode || GateErrorCode.SERVER_ERROR,\n error.message || 'Request failed',\n {\n status: error.status,\n correlationId: error.correlationId,\n requestId,\n details: error,\n }\n );\n } else if ((apiResponse as any).decision) {\n // Unwrapped format: { decision: ..., reasonCodes: ..., ... } (backward compatibility)\n responseData = apiResponse as any;\n } else {\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n 'Invalid response format: expected { success: true, data: { ... } } or unwrapped response',\n {\n requestId,\n details: apiResponse,\n }\n );\n }\n\n // Extract simulation results from metadata if present\n const metadata = responseData.metadata || {};\n const simulationData = metadata.simulation;\n \n // Convert snake_case to camelCase if needed\n const result: DefenseEvaluateResponseV2 = {\n decision: responseData.decision as 'ALLOW' | 'BLOCK' | 'REQUIRE_STEP_UP',\n reasonCodes: responseData.reason_codes ?? responseData.reasonCodes ?? [],\n policyVersion: responseData.policy_version ?? responseData.policyVersion,\n correlationId: responseData.correlation_id ?? responseData.correlationId,\n stepUp: responseData.step_up\n ? {\n requestId: responseData.step_up.request_id ?? (responseData.stepUp?.requestId ?? ''),\n ttlSeconds: responseData.step_up.ttl_seconds ?? responseData.stepUp?.ttlSeconds,\n }\n : responseData.stepUp,\n enforced: responseData.enforced ?? (requestMode === 'ENFORCE'),\n shadowWouldBlock: responseData.shadow_would_block ?? responseData.shadowWouldBlock ?? false,\n mode: responseData.mode ?? requestMode,\n ...(simulationData ? {\n simulation: {\n willRevert: simulationData.willRevert ?? simulationData.will_revert ?? false,\n gasUsed: simulationData.gasUsed ?? simulationData.gas_used,\n balanceChanges: simulationData.balanceChanges ?? simulationData.balance_changes,\n errorReason: simulationData.errorReason ?? simulationData.error_reason,\n },\n simulationLatencyMs: metadata.simulationLatencyMs ?? metadata.simulation_latency_ms,\n } : {}),\n };\n\n const latencyMs = Date.now() - startTime;\n\n // Handle decision types\n if (result.decision === 'BLOCK') {\n // In SHADOW mode, log but don't throw - always allow\n if (requestMode === 'SHADOW') {\n // Log shadow block event\n console.warn('[GATE SHADOW MODE] Would have blocked transaction', {\n requestId,\n reasonCodes: result.reasonCodes,\n correlationId: result.correlationId,\n tenantId: this.config.tenantId,\n signerId: req.signingContext?.signerId,\n });\n \n // Record metrics (always, not just when onMetrics hook is set)\n this.metrics.recordRequest('WOULD_BLOCK', latencyMs);\n \n // Return ALLOW with shadowWouldBlock flag\n return {\n ...result,\n decision: 'ALLOW',\n enforced: false,\n shadowWouldBlock: true,\n };\n }\n \n // ENFORCE mode: BLOCK → throw BlockIntelBlockedError\n const receiptId = (responseData as any).decision_id || requestId;\n const reasonCode = result.reasonCodes[0] || 'POLICY_VIOLATION';\n this.metrics.recordRequest('BLOCK', latencyMs);\n throw new BlockIntelBlockedError(reasonCode, receiptId, result.correlationId, requestId);\n }\n\n if (result.decision === 'REQUIRE_STEP_UP') {\n // REQUIRE_STEP_UP handling\n if (this.config.enableStepUp && this.stepUpPoller && result.stepUp) {\n // Step-up is enabled - throw BlockIntelStepUpRequiredError\n const stepUpRequestId = result.stepUp.requestId || requestId;\n const expiresAtMs = (responseData.step_up as any)?.expires_at_ms;\n const statusUrl = `/defense/stepup/status?tenantId=${this.config.tenantId}&requestId=${stepUpRequestId}`;\n this.metrics.recordRequest('REQUIRE_STEP_UP', latencyMs);\n throw new BlockIntelStepUpRequiredError(stepUpRequestId, statusUrl, expiresAtMs, requestId);\n } else {\n // Step-up not enabled - treat as BLOCK\n const receiptId = (responseData as any).decision_id || requestId;\n const reasonCode = 'STEPUP_REQUIRED';\n this.metrics.recordRequest('BLOCK', latencyMs);\n throw new BlockIntelBlockedError(reasonCode, receiptId, result.correlationId, requestId);\n }\n }\n\n // ALLOW - record metrics and return\n this.metrics.recordRequest('ALLOW', latencyMs);\n return result;\n };\n\n // Execute with circuit breaker if enabled\n try {\n if (this.circuitBreaker) {\n return await this.circuitBreaker.execute(executeRequest);\n }\n return await executeRequest();\n } catch (error: any) {\n const latencyMs = Date.now() - startTime;\n\n // Handle circuit breaker open\n if (error instanceof CircuitBreakerOpenError) {\n this.metrics.recordCircuitBreakerOpen();\n const failSafeResult = this.handleFailSafe(failSafeMode, error, requestId);\n if (failSafeResult) {\n return failSafeResult;\n }\n throw error;\n }\n\n // Handle auth failures (401/403) - always fail CLOSED (BLOCK)\n if (error instanceof GateError && (error.code === GateErrorCode.UNAUTHORIZED || error.code === GateErrorCode.FORBIDDEN)) {\n this.metrics.recordError();\n throw new BlockIntelAuthError(\n error.message,\n error.status || 401,\n requestId\n );\n }\n\n // Handle connection failures (timeout, network errors, 5xx)\n const isConnectionFailure = \n (error instanceof GateError && (error.code === GateErrorCode.TIMEOUT || error.code === GateErrorCode.SERVER_ERROR)) ||\n error instanceof BlockIntelUnavailableError ||\n (error as any)?.code === 'ECONNREFUSED' ||\n (error as any)?.code === 'ENOTFOUND' ||\n (error as any)?.code === 'ETIMEDOUT';\n \n if (isConnectionFailure) {\n this.metrics.recordTimeout();\n \n // Apply connection failure strategy\n if (this.onConnectionFailure === 'FAIL_OPEN') {\n // FAIL_OPEN: Allow transaction, log critical event\n console.error('[GATE CONNECTION FAILURE] FAIL_OPEN mode - allowing transaction', {\n requestId,\n error: error.message,\n tenantId: this.config.tenantId,\n mode: requestMode,\n });\n \n // Emit structured log for monitoring\n this.metrics.recordRequest('FAIL_OPEN', Date.now() - startTime);\n \n return {\n decision: 'ALLOW',\n reasonCodes: ['GATE_HOTPATH_UNAVAILABLE'],\n correlationId: requestId,\n enforced: false,\n mode: requestMode,\n };\n } else {\n // FAIL_CLOSED: Block transaction\n throw new BlockIntelUnavailableError(\n `Signing blocked: Gate hot path unreachable (fail-closed). ${error.message}`,\n requestId\n );\n }\n }\n\n // Handle timeout errors (legacy - for non-connection-failure timeouts)\n if (error instanceof GateError && error.code === GateErrorCode.TIMEOUT) {\n this.metrics.recordTimeout();\n const failSafeResult = this.handleFailSafe(failSafeMode, error, requestId);\n if (failSafeResult) {\n return failSafeResult;\n }\n throw new BlockIntelUnavailableError(`Service timeout: ${error.message}`, requestId);\n }\n\n // Handle 5xx server errors - treat as timeout bucket for fail-safe\n if (error instanceof GateError && error.code === GateErrorCode.SERVER_ERROR) {\n this.metrics.recordError();\n const failSafeResult = this.handleFailSafe(failSafeMode, error, requestId);\n if (failSafeResult) {\n return failSafeResult;\n }\n throw error;\n }\n\n // Re-throw BlockIntelBlockedError and BlockIntelStepUpRequiredError as-is\n if (error instanceof BlockIntelBlockedError || error instanceof BlockIntelStepUpRequiredError) {\n throw error;\n }\n\n // Other errors - record and re-throw\n this.metrics.recordError();\n throw error;\n }\n }\n\n /**\n * Handle fail-safe modes for timeouts/errors\n */\n private handleFailSafe(\n mode: 'ALLOW_ON_TIMEOUT' | 'BLOCK_ON_TIMEOUT' | 'BLOCK_ON_ANOMALY',\n error: Error,\n requestId: string\n ): DefenseEvaluateResponseV2 | null {\n if (mode === 'ALLOW_ON_TIMEOUT') {\n // Trading bots: ALLOW on timeout with degraded flag\n // TODO: Attach header \"X-BlockIntel-Degraded: true\" to logs if possible\n return {\n decision: 'ALLOW',\n reasonCodes: ['FAIL_SAFE_ALLOW'],\n correlationId: requestId,\n };\n }\n\n if (mode === 'BLOCK_ON_TIMEOUT') {\n // Fail CLOSED - don't return, let error propagate\n return null;\n }\n\n if (mode === 'BLOCK_ON_ANOMALY') {\n // BLOCK only on explicit BLOCK/REQUIRE_STEP_UP decisions, not network hiccups\n // On timeout: ALLOW gracefully\n return {\n decision: 'ALLOW',\n reasonCodes: ['FAIL_SAFE_ALLOW'],\n correlationId: requestId,\n };\n }\n\n return null;\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): ReturnType<MetricsCollector['getMetrics']> {\n return this.metrics.getMetrics();\n }\n\n /**\n * Get circuit breaker metrics (if enabled)\n */\n getCircuitBreakerMetrics(): ReturnType<CircuitBreaker['getMetrics']> | null {\n return this.circuitBreaker?.getMetrics() || null;\n }\n\n /**\n * Get step-up status\n */\n async getStepUpStatus(args: {\n requestId: string;\n tenantId?: string;\n }): Promise<StepUpStatusResponse> {\n if (!this.stepUpPoller) {\n throw new StepUpNotConfiguredError(args.requestId);\n }\n\n const tenantId = args.tenantId ?? this.config.tenantId;\n const poller = new StepUpPoller({\n httpClient: this.httpClient,\n tenantId,\n pollingIntervalMs: this.config.stepUp?.pollingIntervalMs,\n maxWaitMs: this.config.stepUp?.maxWaitMs,\n });\n\n return poller.getStatus(args.requestId);\n }\n\n /**\n * Wait for step-up decision with polling\n */\n async awaitStepUpDecision(args: {\n requestId: string;\n maxWaitMs?: number;\n intervalMs?: number;\n }): Promise<StepUpFinalResult> {\n if (!this.stepUpPoller) {\n throw new StepUpNotConfiguredError(args.requestId);\n }\n\n return this.stepUpPoller.awaitDecision(args.requestId, {\n maxWaitMs: args.maxWaitMs ?? this.config.stepUp?.maxWaitMs,\n intervalMs: args.intervalMs ?? this.config.stepUp?.pollingIntervalMs,\n });\n }\n\n /**\n * Wrap AWS SDK v3 KMS client to intercept SignCommand calls\n * \n * @param kmsClient - AWS SDK v3 KMSClient instance\n * @param options - Wrapper options\n * @returns Wrapped KMS client that enforces Gate policies\n * \n * @example\n * ```typescript\n * import { KMSClient } from '@aws-sdk/client-kms';\n * \n * const kms = new KMSClient({});\n * const protectedKms = gateClient.wrapKmsClient(kms);\n * \n * // Now SignCommand calls will be intercepted and evaluated by Gate\n * const result = await protectedKms.send(new SignCommand({ ... }));\n * ```\n */\n wrapKmsClient<T extends typeof import('@aws-sdk/client-kms').KMSClient>(\n kmsClient: InstanceType<T>,\n options?: WrapKmsClientOptions\n ): WrappedKmsClient {\n return wrapKmsClient(kmsClient as any, this, options);\n }\n}\n\n/**\n * Create a Gate client instance\n */\nexport function createGateClient(config: GateClientConfig): GateClient {\n return new GateClient(config);\n}\n\n"]}
|