@kya-os/agentshield-express
Version:
Express.js middleware for AgentShield AI agent detection
1 lines • 59.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/middleware.ts","../src/session-helper.ts","../src/storage/memory-adapter.ts","../src/storage/redis-adapter.ts","../src/storage/index.ts","../src/enhanced-middleware.ts","../src/index.ts"],"names":["agentShield","AgentDetector"],"mappings":";;;AAeO,SAAS,2BAAA,CACd,MAAA,GAA2C,EAAC,EACrB;AACvB,EAAA,MAAM,QAAA,GAAW,IAAI,aAAA,CAAc,MAAM,CAAA;AAEzC,EAAA,MAAM;AAAA,IACJ,eAAA,GAAkB,KAAA;AAAA,IAClB,WAAA;AAAA,IACA,YAAY,EAAC;AAAA,IACb,eAAA,GAAkB;AAAA,MAChB,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS,yCAAA;AAAA,MACT,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB;AAChD,GACF,GAAI,MAAA;AAEJ,EAAA,OAAO,OACL,GAAA,EACA,GAAA,EACA,IAAA,KACkB;AAClB,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,CAAK,CAAA,OAAA,KAAW;AAC3C,QAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,UAAA,OAAO,IAAI,IAAA,KAAS,OAAA;AAAA,QACtB;AACA,QAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAAA,MAC9B,CAAC,CAAA;AAED,MAAA,IAAI,UAAA,EAAY;AACd,QAAC,IAA2B,WAAA,GAAc;AAAA,UACxC,MAAA,EAAQ;AAAA,YACN,OAAA,EAAS,KAAA;AAAA,YACT,UAAA,EAAY,CAAA;AAAA,YACZ,eAAA,EAAiB,KAAA;AAAA,YACjB,OAAA,EAAS,CAAC,cAAc,CAAA;AAAA,YACxB,SAAA,sBAAe,IAAA;AAAK,WACtB;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AACA,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAGA,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,SAAA,EAAW,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA;AAAA,QAC/B,SAAA,EAAW,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,UAAA,CAAW,aAAA;AAAA,QACpC,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,KAAK,GAAA,CAAI,GAAA;AAAA,QACT,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAA,sBAAe,IAAA;AAAK,OACtB;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AAG7C,MAAC,IAA2B,WAAA,GAAc;AAAA,QACxC,MAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACX;AAGA,MAAA,IACE,OAAO,OAAA,IACP,MAAA,CAAO,UAAA,KAAe,MAAA,CAAO,uBAAuB,GAAA,CAAA,EACpD;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,WAAA,CAAY,GAAA,EAAK,GAAA,EAAK,MAAM,CAAA;AAAA,QACpC;AAGA,QAAA,QAAQ,eAAA;AAAiB,UACvB,KAAK,OAAA;AACH,YAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,cAAA,MAAA,CAAO,OAAA,CAAQ,eAAA,CAAgB,OAAO,CAAA,CAAE,OAAA;AAAA,gBACtC,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChB,kBAAA,GAAA,CAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,gBAC1B;AAAA,eACF;AAAA,YACF;AACA,YAAA,GAAA,CAAI,MAAA,CAAO,eAAA,CAAgB,MAAM,CAAA,CAAE,IAAA,CAAK;AAAA,cACtC,OAAO,eAAA,CAAgB,OAAA;AAAA,cACvB,QAAA,EAAU,IAAA;AAAA,cACV,YAAY,MAAA,CAAO,UAAA;AAAA,cACnB,WAAW,MAAA,CAAO;AAAA,aACnB,CAAA;AACD,YAAA;AAAA,UAEF,KAAK,KAAA;AACH,YAAA,OAAA,CAAQ,KAAK,6BAAA,EAA+B;AAAA,cAC1C,WAAW,OAAA,CAAQ,SAAA;AAAA,cACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,cACnB,YAAY,MAAA,CAAO,UAAA;AAAA,cACnB,SAAS,MAAA,CAAO;AAAA,aACjB,CAAA;AACD,YAAA;AAAA,UAEF,KAAK,OAAA;AAAA,UACL;AAEE,YAAA;AAAA;AACJ,MACF;AAEA,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACpD,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA;AACF;AAKO,SAAS,WAAA,CACd,MAAA,GAA2C,EAAC,EACrB;AACvB,EAAA,OAAO,4BAA4B,MAAM,CAAA;AAC3C;;;ACtHO,IAAM,wBAAN,MAA4B;AAAA,EAChB,UAAA,GAAa,uBAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,MAAM,GAAA,EAAkC;AACtC,IAAA,IAAI;AAEF,MAAA,IAAI,IAAI,OAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAC/C,QAAA,IAAI;AACF,UAAA,MAAM,UAAU,MAAA,CAAO,IAAA;AAAA,YACrB,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,YAC3B;AAAA,YACA,QAAA,EAAS;AACX,UAAA,MAAM,OAAA,GAAuB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAG/C,UAAA,IAAI,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,EAAG;AAChC,YAAA,OAAO,OAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAGA,MAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,GAAA,CAAI,uBAAuB,CAAA;AACrD,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,UAAuB,IAAA,CAAK,KAAA;AAAA,YAChC,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,QAAQ,EAAE,QAAA;AAAS,WAChD;AACA,UAAA,IAAI,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,EAAG;AAChC,YAAA,OAAO,OAAA;AAAA,UACT;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,KAAe,MAAA,EAA+B;AAClD,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAErB,MAAA,MAAM,OAAA,GAAuB;AAAA,QAC3B,EAAA,EAAI,KAAK,UAAA,EAAW;AAAA,QACpB,KAAA,EAAO,MAAA,CAAO,aAAA,EAAe,IAAA,IAAQ,SAAA;AAAA,QACrC,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,UAAA,EAAY,KAAK,GAAA,EAAI;AAAA,QACrB,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AAAA,OACxB;AAEA,MAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,IAAA,CAAK,UAAU,OAAO,CAAC,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AAGtE,MAAA,IAAI,IAAI,MAAA,EAAQ;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,OAAA,EAAS;AAAA,UACnC,QAAA,EAAU,IAAA;AAAA,UACV,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA;AAAA,UACjC,QAAA,EAAU,KAAA;AAAA,UACV,MAAA,EAAQ;AAAA;AAAA,SACT,CAAA;AAAA,MACH;AAGA,MAAA,GAAA,CAAI,SAAA,CAAU,yBAAyB,OAAO,CAAA;AAC9C,MAAA,GAAA,CAAI,SAAA,CAAU,6BAAA,EAA+B,OAAA,CAAQ,KAAK,CAAA;AAC1D,MAAA,GAAA,CAAI,SAAA,CAAU,0BAAA,EAA4B,OAAA,CAAQ,EAAE,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,OAAA,CAAQ,IAAI,iBAAA,EAAmB;AACjC,QAAA,OAAA,CAAQ,IAAA,CAAK,yCAAyC,KAAK,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,GAAqB;AAC3B,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACjE;AACF;AAKO,SAAS,mBAAA,CACd,YACA,MAAA,EACU;AACV,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,qBAAA,EAAsB;AAE1C,EAAA,OAAO,eAAgB,GAAA,EAAc,GAAA,EAAe,IAAA,EAAgB;AAElE,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAEjC,IAAA,IAAI,OAAA,EAAS;AAEX,MAAC,IAAY,WAAA,GAAc;AAAA,QACzB,GAAI,GAAA,CAAY,WAAA;AAAA,QAChB,OAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,OAAA,EAAS,IAAA;AAAA,UACT,YAAY,OAAA,CAAQ,UAAA;AAAA,UACpB,aAAA,EAAe,EAAE,IAAA,EAAM,OAAA,CAAQ,KAAA,EAAM;AAAA,UACrC,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,kBAAA,EAAoB;AAAA;AACtB,OACF;AAGA,MAAA,GAAA,CAAI,SAAA,CAAU,0BAA0B,MAAM,CAAA;AAC9C,MAAA,GAAA,CAAI,SAAA,CAAU,qBAAA,EAAuB,OAAA,CAAQ,KAAK,CAAA;AAClD,MAAA,GAAA,CAAI,SAAA,CAAU,yBAAyB,WAAW,CAAA;AAAA,IACpD;AAGA,IAAA,MAAM,cAAc,GAAA,CAAI,GAAA;AACxB,IAAA,GAAA,CAAI,GAAA,GAAM,YAAa,IAAA,EAAa;AAElC,MAAA,MAAMA,eAAe,GAAA,CAAY,WAAA;AACjC,MAAA,IAAIA,YAAAA,EAAa,MAAA,EAAQ,OAAA,IAAW,CAACA,aAAY,OAAA,EAAS;AACxD,QAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAKA,YAAAA,CAAY,MAAM,CAAA;AAAA,MACvC;AAEA,MAAA,OAAO,WAAA,CAAY,KAAA,CAAM,GAAA,EAAK,IAAW,CAAA;AAAA,IAC3C,CAAA;AAEA,IAAA,UAAA,CAAW,GAAA,EAAK,KAAK,IAAI,CAAA;AAAA,EAC3B,CAAA;AACF;;;AC1JO,IAAM,uBAAN,MAAqD;AAAA,EAClD,MAAA,uBAAiD,GAAA,EAAI;AAAA,EACrD,QAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,gBAAuC,EAAC;AAAA,EACxC,mBAAA,GAAsB,GAAA;AAAA,EACtB,iBAAA,GAAoB,GAAA;AAAA,EAE5B,MAAM,WAAW,KAAA,EAA2C;AAE1D,IAAA,MAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,IAAI,KAAA,CAAM,SAAS,KAAK,EAAC;AAC3D,IAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AAGxB,IAAA,IAAI,aAAA,CAAc,MAAA,GAAS,IAAA,CAAK,mBAAA,EAAqB;AACnD,MAAA,aAAA,CAAc,KAAA,EAAM;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,aAAa,CAAA;AAG9C,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,KAAK,CAAA;AAG7B,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,IAAA,CAAK,iBAAA,EAAmB;AACtD,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,OAAA,EAAsC;AACvD,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,SAAA,CAAU,SAAA,EAAmB,KAAA,EAAgD;AACjF,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,KAAK,EAAC;AAC9C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,SAAA,EAAiD;AAChE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAAA,EACzC;AAAA,EAEA,MAAM,eAAA,CAAgB,KAAA,GAAgB,EAAA,EAAoC;AACxE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,iBAAA,CAAkB,KAAA,GAAgB,EAAA,EAA6B;AACnE,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAGlD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,MAAM,QAAQ,IAAI,IAAA,CAAK,CAAA,CAAE,QAAQ,EAAE,OAAA,EAAQ;AAC3C,MAAA,MAAM,QAAQ,IAAI,IAAA,CAAK,CAAA,CAAE,QAAQ,EAAE,OAAA,EAAQ;AAC3C,MAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,QAAQ,MAAA,EAA6B;AACzC,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,EAAQ;AAG9B,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,SAAQ,EAAG;AACvD,MAAA,MAAM,WAAW,MAAA,CAAO,MAAA;AAAA,QAAO,OAC7B,IAAI,IAAA,CAAK,EAAE,SAAS,CAAA,CAAE,SAAQ,IAAK;AAAA,OACrC;AAEA,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AAAA,MACrC;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,OAAO,KAAK,IAAA,CAAK,QAAA,CAAS,SAAQ,EAAG;AAC1D,MAAA,IAAI,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA,KAAY,MAAA,EAAQ;AACjD,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAAA,MAChC;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,aAAA,CAAc,MAAA;AAAA,MAAO,OAC7C,IAAI,IAAA,CAAK,EAAE,SAAS,CAAA,CAAE,SAAQ,IAAK;AAAA,KACrC;AAAA,EACF;AACF;;;AC9EO,IAAM,sBAAN,MAAoD;AAAA,EAIzD,WAAA,CACU,KAAA,EACR,GAAA,GAAc,KAAA,EACd;AAFQ,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGR,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EARQ,MAAA,GAAS,cAAA;AAAA,EACT,GAAA;AAAA,EASA,MAAA,CAAO,MAAc,EAAA,EAAoB;AAC/C,IAAA,OAAO,GAAG,IAAA,CAAK,MAAM,CAAA,EAAG,IAAI,IAAI,EAAE,CAAA,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,WAAW,KAAA,EAA2C;AAC1D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAM,OAAO,CAAA;AACnD,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,MAAM,SAAS,CAAA;AACtE,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,QAAA,CAAA;AAGlC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG,EAAE,EAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA;AAGtE,IAAA,MAAM,YAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,OAAA,EAAQ;AACpD,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,gBAAA,EAAkB,SAAA,EAAW,MAAM,OAAO,CAAA;AAChE,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,gBAAA,EAAkB,KAAK,GAAG,CAAA;AAGlD,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,WAAA,EAAa,SAAA,EAAW,MAAM,OAAO,CAAA;AAG3D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAK,KAAK,GAAA,GAAM,GAAA;AAChD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,WAAA,EAAa,gBAAgB,SAAS,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,aAAa,OAAA,EAAsC;AACvD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,QAAQ,SAAS,CAAA;AAC3D,IAAA,MAAM,iBAAA,GAAoB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,eAAA,CAAA;AAGxC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG,EAAE,EAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA;AAG1E,IAAA,MAAM,YAAY,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,OAAA,EAAQ;AACrD,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,SAAA,EAAW,QAAQ,SAAS,CAAA;AAAA,EACvE;AAAA,EAEA,MAAM,SAAA,CAAU,SAAA,EAAmB,KAAA,EAAgD;AACjF,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,SAAS,CAAA;AAGhE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA;AAAA,MAChC,gBAAA;AAAA,MACA,CAAA;AAAA,MACA,KAAA,GAAQ,QAAQ,CAAA,GAAI;AAAA,KACtB;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,SAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA;AAC7C,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,QAAQ,CAAA;AAC/C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MACnC;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,SAAA,EAAiD;AAChE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,SAAS,CAAA;AACnD,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,UAAU,CAAA;AAEnD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,MAAM,WAAW,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,eAAA,CAAgB,KAAA,GAAgB,EAAA,EAAoC;AACxE,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,QAAA,CAAA;AAGlC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,KAAA,CAAM,UAAU,WAAA,EAAa,CAAA,EAAG,QAAQ,CAAC,CAAA;AAErE,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,SAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,YAAY,SAAA,EAAW;AAE3B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA;AAC7C,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,QAAQ,CAAA;AAC/C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MACnC;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAA,CAAkB,KAAA,GAAgB,EAAA,EAA6B;AACnE,IAAA,MAAM,iBAAA,GAAoB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,eAAA,CAAA;AAGxC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,KAAA,CAAM,UAAU,iBAAA,EAAmB,CAAA,EAAG,QAAQ,CAAC,CAAA;AAE7E,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,WAA2B,EAAC;AAClC,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,SAAS,CAAA;AACnD,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,UAAU,CAAA;AACnD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,MAAA,EAA6B;AAEzC,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,EAAQ;AAC9B,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,QAAA,CAAA;AAClC,IAAA,MAAM,iBAAA,GAAoB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,eAAA,CAAA;AAGxC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,WAAA,EAAa,QAAQ,SAAS,CAAA;AAGpD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,iBAAA,EAAmB,QAAQ,SAAS,CAAA;AAAA,EAC5D;AACF;;;ACzJA,eAAsB,qBAAqB,MAAA,EAAiD;AAC1F,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AACvC,IAAA,OAAO,IAAI,oBAAA,EAAqB;AAAA,EAClC;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,MAAA,EAAQ;AAC7C,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,OAAA,IAAW,MAAA,CAAO,KAAA,EAAO;AAE3C,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,gBAAgB,CAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM;AAAA,QACtB,GAAA,EAAK,OAAO,KAAA,CAAM,GAAA;AAAA,QAClB,KAAA,EAAO,OAAO,KAAA,CAAM;AAAA,OACrB,CAAA;AACD,MAAA,OAAO,IAAI,mBAAA,CAAoB,KAAA,EAAc,MAAA,CAAO,GAAG,CAAA;AAAA,IACzD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,6EAA6E,KAAK,CAAA;AAC/F,MAAA,OAAO,IAAI,oBAAA,EAAqB;AAAA,IAClC;AAAA,EACF;AAGA,EAAA,OAAO,IAAI,oBAAA,EAAqB;AAClC;;;AC0BA,IAAM,iBAAN,MAAqB;AAAA,EACX,mBAAA,uBAA0B,GAAA,EAAoB;AAAA,EAEtD,iBAAA,CAAkB,WAAoB,SAAA,EAA4B;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,GAAA,IAAO,CAAA,GAAI,KAAK,GAAA,CAAK,CAAA;AACnD,IAAA,MAAM,UAAU,CAAA,EAAG,SAAA,IAAa,SAAS,CAAA,CAAA,EAAI,aAAa,SAAS,CAAA,CAAA;AACnE,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAE1C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA;AAC3D,IAAA,MAAM,sBAAA,GAAyB,CAAC,YAAA,IAAgB,GAAA,GAAM,YAAA,GAAe,GAAA;AAErE,IAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AAG3C,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,IAAA,GAAO,GAAA,EAAK;AACvC,MAAA,MAAM,SAAS,GAAA,GAAM,GAAA;AACrB,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,IAAA,CAAK,mBAAA,CAAoB,SAAQ,EAAG;AAC5D,QAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,UAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,GAAG,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,sBAAA,GACT,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GACnB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AAGhC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC9B,MAAA,IAAA,GAAA,CAAQ,IAAA,IAAQ,KAAK,IAAA,GAAO,IAAA;AAC5B,MAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,IAChB;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA,CAAE,SAAA,CAAU,GAAG,EAAE,CAAA;AAAA,EACtE;AACF,CAAA;AAKA,SAAS,qBAAA,CACP,UAAA,EACA,OAAA,GAAoB,EAAC,EACb;AAER,EAAA,IAAI,OAAA,CAAQ,IAAA;AAAA,IAAK,CAAA,CAAA,KACf,EAAE,QAAA,CAAS,iBAAiB,KAC5B,CAAC,CAAA,CAAE,SAAS,2BAA2B;AAAA,GACzC,EAAG;AACD,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,UAAA,GAAa,CAAA,EAAK;AAC1C,IAAA,OAAO,eAAA;AAAA,EACT;AAGA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,sBAAA,CACP,cAAA,EACA,OAAA,GAAoB,EAAC,EACb;AAER,EAAA,IAAI,OAAA,CAAQ,IAAA;AAAA,IAAK,CAAA,CAAA,KACf,EAAE,QAAA,CAAS,iBAAiB,KAC5B,CAAC,CAAA,CAAE,SAAS,2BAA2B;AAAA,GACzC,EAAG;AACD,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,GAAA,EAAK,GAAG,CAAA;AAAA,EAC3C;AAGA,EAAA,OAAO,cAAA;AACT;AAKA,SAAS,yBAAyB,GAAA,EAIhC;AACA,EAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,EAAA,MAAM,oBAA4C,EAAC;AAGnD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,iBAAA,CAAkB,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,KAAA;AAAA,EACzC;AAEA,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,YAAY,CAAA,IAAK,EAAA;AACrD,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,EAAY,CAAE,SAAS,QAAQ,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,WAAA,EAAY,CAAE,SAAS,SAAS,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,EAAY,CAAE,SAAS,QAAQ,CAAA;AAC3D,EAAA,MAAM,YAAA,GAAe,aAAa,UAAA,IAAc,SAAA;AAGhD,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,iBAAA,CAAkB,WAAW,CAAA;AAClD,EAAA,MAAM,kBAAA,GAAqB,CAAC,CAAC,iBAAA,CAAkB,gBAAgB,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,iBAAA,CAAkB,QAAQ,CAAA;AAC/C,EAAA,MAAM,iBAAA,GAAoB,CAAC,CAAC,iBAAA,CAAkB,iBAAiB,CAAA;AAE/D,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,aAAA;AAGJ,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,iBAAiB,EAAC;AACxB,IAAA,IAAI,CAAC,UAAA,IAAc,SAAA,EAAW,cAAA,CAAe,KAAK,WAAW,CAAA;AAC7D,IAAA,IAAI,CAAC,kBAAA,EAAoB,cAAA,CAAe,IAAA,CAAK,aAAa,CAAA;AAC1D,IAAA,IAAI,CAAC,iBAAA,EAAmB,cAAA,CAAe,IAAA,CAAK,iBAAiB,CAAA;AAC7D,IAAA,IAAI,CAAC,UAAA,EAAY,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AAE9C,IAAA,IAAI,cAAA,CAAe,UAAU,CAAA,EAAG;AAE9B,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AACzC,MAAA,OAAA,CAAQ,KAAK,CAAA,QAAA,EAAW,cAAA,CAAe,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AAGlD,MAAA,IAAI,SAAA,IAAa,CAAC,UAAA,EAAY;AAE5B,QAAA,aAAA,GAAgB,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,YAAA,EAAa;AAAA,MAC3D,CAAA,MAAO;AACL,QAAA,aAAA,GAAgB,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,kBAAA,EAAmB;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAkB,iBAAiB,CAAA;AACzD,EAAA,MAAM,KAAK,GAAA,CAAI,EAAA,IAAM,eAAe,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChD,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,KAAK,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,MACtC,KAAK,CAAC,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,MAC1C,OAAO,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAO,MAAM;AAAA,KAC5C;AAEA,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AACjE,MAAA,IAAI,SAAS,IAAA,CAAK,CAAA,MAAA,KAAU,GAAG,UAAA,CAAW,MAAM,CAAC,CAAA,EAAG;AAClD,QAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAG,CAAA;AACrC,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAE,CAAA;AACzC,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA,CAAE,MAAA;AACnD,EAAA,IAAI,WAAA,GAAc,KAAK,YAAA,EAAc;AACnC,IAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAG,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,WAAW,CAAA,CAAE,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,IAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,IAAA,EAAM,IAAI,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAI,aAAA,IAAiB,EAAE,aAAA;AAAc,GACvC;AACF;AAKO,SAAS,mCAAA,CAAoC,MAAA,GAAmC,EAAC,EAAG;AAEzF,EAAA,IAAI,cAAA,GAAwC,IAAA;AAC5C,EAAA,IAAI,kBAAA,GAAqD,IAAA;AAEzD,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,gBAAgB,OAAO,cAAA;AAC3B,IAAA,IAAI,oBAAoB,OAAO,kBAAA;AAE/B,IAAA,kBAAA,GAAqB,oBAAA,CAAqB,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,CAAA,OAAA,KAAW;AACxE,MAAA,cAAA,GAAiB,OAAA;AACjB,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAO,kBAAA;AAAA,EACT,CAAA;AAGA,EAAA,IAAI,QAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,mBAAA,GAA4C,IAAA;AAEhD,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI,UAAU,OAAO,QAAA;AACrB,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,MAAM,mBAAA;AACN,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,mBAAA,GAAA,CAAuB,YAAY;AAGjC,MAAA,QAAA,GAAW,IAAIC,aAAAA,EAAc;AAAA,IAC/B,CAAA,GAAG;AAEH,IAAA,MAAM,mBAAA;AACN,IAAA,OAAO,QAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,EAAe;AAC1C,EAAA,MAAM,sBAAA,GAAyB,MAAA,CAAO,eAAA,EAAiB,OAAA,KAAY,KAAA;AAGnE,EAAA,OAAO,OAAO,GAAA,EAAc,GAAA,EAAe,IAAA,KAAsC;AAC/E,IAAA,MAAM,WAAW,GAAA,CAAI,IAAA;AAGrB,IAAA,IAAI,MAAA,CAAO,WAAW,IAAA,CAAK,CAAA,IAAA,KAAQ,SAAS,UAAA,CAAW,IAAI,CAAC,CAAA,EAAG;AAC7D,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAGA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,IAAI,EAAA,IAAM,GAAA,CAAI,IAAI,iBAAiB,CAAA,IAAK,IAAI,MAAA,CAAO,aAAA;AAErE,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,WAAW,SAAA,IAAa,EAAA;AAAA,MACxB,WAAW,SAAA,IAAa,EAAA;AAAA,MACxB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,KAAK,GAAA,CAAI,WAAA;AAAA,MACT,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,MAAM,WAAA,EAAY;AACzC,MAAA,IAAI,MAAA,GAAS,MAAM,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA;AAGjD,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,aAAa,GAAA,EAAK;AAC9C,QAAA,MAAM,aAAA,GAAgB,yBAAyB,GAAG,CAAA;AAElD,QAAA,IAAI,aAAA,CAAc,UAAA,GAAa,MAAA,CAAO,UAAA,EAAY;AAEhD,UAAA,MAAA,GAAS;AAAA,YACP,GAAG,MAAA;AAAA,YACH,OAAA,EAAS,cAAc,UAAA,GAAa,GAAA;AAAA,YACpC,YAAY,aAAA,CAAc,UAAA;AAAA,YAC1B,SAAS,aAAA,CAAc,OAAA;AAAA,YACvB,eAAe,aAAA,CAAc,aAAA;AAAA,YAC7B,kBAAA,EAAoB,SAAA;AAAA,YACpB,eAAA,EACE,cAAc,UAAA,IAAc,GAAA,GAAM,SAClC,aAAA,CAAc,UAAA,IAAc,MAAM,QAAA,GAAW;AAAA,WACjD;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,kBAAkB,MAAA,CAAO,UAAA;AAC7B,MAAA,IAAI,kBAAA,GAAqB,OAAO,kBAAA,IAAsB,SAAA;AAEtD,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAM,OAAA,GAAW,MAAA,CAAe,OAAA,IAAW,EAAC;AAE5C,QAAA,IAAI,OAAO,UAAA,KAAe,KAAA,IAAS,eAAA,IAAmB,IAAA,IAAQ,kBAAkB,CAAA,EAAK;AACnF,UAAA,eAAA,GAAkB,sBAAA,CAAuB,MAAA,CAAO,UAAA,EAAY,OAAO,CAAA;AACnE,UAAA,kBAAA,GAAqB,qBAAA,CAAsB,iBAAiB,OAAO,CAAA;AAAA,QACrE;AAAA,MACF;AAGA,MAAC,IAAY,WAAA,GAAc;AAAA,QACzB,UAAU,MAAA,CAAO,OAAA;AAAA,QACjB,UAAA,EAAY,eAAA;AAAA,QACZ,OAAO,MAAA,CAAO,aAAA;AAAA,QACd;AAAA,OACF;AAGA,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,eAAA,KAAoB,MAAA,CAAO,uBAAuB,GAAA,CAAA,EAAM;AAE5E,QAAA,IAAI,sBAAA,EAAwB;AAC1B,UAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAW;AACjC,UAAA,MAAM,YAAY,cAAA,CAAe,iBAAA,CAAkB,SAAA,IAAa,KAAA,CAAA,EAAW,aAAa,KAAA,CAAS,CAAA;AAGjG,UAAA,MAAM,KAAA,GAA6B;AAAA,YACjC,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,YAC3E,SAAA;AAAA,YACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,SAAA,EAAW,MAAA,CAAO,aAAA,EAAe,IAAA,IAAQ,SAAA;AAAA,YACzC,SAAA,EAAW,MAAA,CAAO,aAAA,EAAe,IAAA,IAAQ,SAAA;AAAA,YACzC,UAAA,EAAY,eAAA;AAAA,YACZ,MAAM,GAAA,CAAI,WAAA;AAAA,YACV,GAAI,SAAA,IAAa,EAAE,SAAA,EAAU;AAAA,YAC7B,GAAI,SAAA,IAAa,EAAE,SAAA,EAAU;AAAA,YAC7B,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,gBAAA,EAAmB,MAAA,CAAe,OAAA,IAAW,EAAC;AAAA,YAC9C,kBAAA;AAAA,YACA,gBAAA,EAAkB;AAAA,cAChB,QAAA,EAAW,OAAO,aAAA,EAAuB,QAAA;AAAA,cACzC,SAAA,EAAY,OAAO,aAAA,EAAuB,SAAA;AAAA,cAC1C,kBAAA,EAAqB,OAAO,aAAA,EAAuB;AAAA;AACrD,WACF;AAGA,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,CAAQ,WAAW,KAAK,CAAA;AAG9B,YAAA,IAAI,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA;AAEhD,YAAA,IAAI,OAAA,EAAS;AAEX,cAAA,OAAA,CAAQ,WAAW,KAAA,CAAM,SAAA;AACzB,cAAA,OAAA,CAAQ,UAAA,EAAA;AACR,cAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA,EAAG;AAC5C,gBAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA;AAAA,cACpC;AACA,cAAA,OAAA,CAAQ,qBACL,OAAA,CAAQ,iBAAA,IAAqB,QAAQ,UAAA,GAAa,CAAA,CAAA,GAAK,mBACxD,OAAA,CAAQ,UAAA;AACV,cAAA,IAAI,CAAC,OAAA,CAAQ,mBAAA,CAAoB,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC7D,gBAAA,OAAA,CAAQ,mBAAA,CAAoB,KAAK,kBAAkB,CAAA;AAAA,cACrD;AAAA,YACF,CAAA,MAAO;AAEL,cAAA,OAAA,GAAU;AAAA,gBACR,SAAA;AAAA,gBACA,GAAI,SAAA,IAAa,EAAE,SAAA,EAAU;AAAA,gBAC7B,GAAI,SAAA,IAAa,EAAE,SAAA,EAAU;AAAA,gBAC7B,SAAA,EAAW,MAAA,CAAO,aAAA,EAAe,IAAA,IAAQ,SAAA;AAAA,gBACzC,SAAA,EAAW,MAAA,CAAO,aAAA,EAAe,IAAA,IAAQ,SAAA;AAAA,gBACzC,WAAW,KAAA,CAAM,SAAA;AAAA,gBACjB,UAAU,KAAA,CAAM,SAAA;AAAA,gBAChB,UAAA,EAAY,CAAA;AAAA,gBACZ,KAAA,EAAO,CAAC,GAAA,CAAI,WAAW,CAAA;AAAA,gBACvB,iBAAA,EAAmB,eAAA;AAAA,gBACnB,mBAAA,EAAqB,CAAC,kBAAkB;AAAA,eAC1C;AAAA,YACF;AAEA,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,MAAM,OAAA,CAAQ,aAAa,OAAO,CAAA;AAAA,YACpC;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,UAC7D;AAAA,QACF;AAGA,QAAA,IAAI,OAAO,WAAA,EAAa;AACtB,UAAA,MAAM,MAAA,CAAO,WAAA,CAAY,MAAA,EAAQ,GAAG,CAAA;AAAA,QACtC;AAGA,QAAA,GAAA,CAAI,SAAA,CAAU,0BAA0B,MAAM,CAAA;AAC9C,QAAA,GAAA,CAAI,SAAA,CAAU,4BAA4B,MAAA,CAAO,IAAA,CAAK,MAAM,eAAA,GAAkB,GAAG,CAAC,CAAC,CAAA;AACnF,QAAA,GAAA,CAAI,SAAA,CAAU,qBAAA,EAAuB,MAAA,CAAO,aAAA,EAAe,QAAQ,SAAS,CAAA;AAC5E,QAAA,GAAA,CAAI,SAAA,CAAU,8BAA8B,kBAAkB,CAAA;AAG9D,QAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,UAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,MAAM,CAAA;AACpC,UAAA,GAAA,CAAI,SAAA,CAAU,iBAAA,EAAmB,eAAA,CAAgB,QAAA,EAAU,CAAA;AAC3D,UAAA,GAAA,CAAI,SAAA,CAAU,qBAAqB,kBAAkB,CAAA;AAAA,QACvD;AAGA,QAAA,QAAQ,OAAO,eAAA;AAAiB,UAC9B,KAAK,OAAA,EAAS;AACZ,YAAA,MAAM,EAAE,SAAS,GAAA,EAAK,OAAA,GAAU,oCAAmC,GACjE,MAAA,CAAO,mBAAmB,EAAC;AAE7B,YAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,CAAK;AAAA,cACtB,KAAA,EAAO,OAAA;AAAA,cACP,QAAA,EAAU,IAAA;AAAA,cACV,UAAA,EAAY;AAAA,aACb,CAAA;AACD,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,KAAA;AACH,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAAuC,kBAAkB,CAAA,EAAA,CAAA,EAAM;AAAA,cACzE,KAAA,EAAO,OAAO,aAAA,EAAe,IAAA;AAAA,cAC7B,YAAY,CAAA,EAAA,CAAI,eAAA,GAAkB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,cACjD,MAAM,GAAA,CAAI,WAAA;AAAA,cACV,YAAA,EAAc;AAAA,aACf,CAAA;AACD,YAAA;AAAA,UAEF,KAAK,OAAA;AAAA,UACL;AAEE,YAAA;AAAA;AACJ,MACF;AAGA,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAE5D,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA;AACF;;;ACndO,IAAM,OAAA,GAAU","file":"index.mjs","sourcesContent":["/**\n * Express middleware for AgentShield\n */\n\nimport type { Request, Response, NextFunction } from 'express';\nimport { AgentDetector } from '@kya-os/agentshield';\nimport type {\n ExpressMiddlewareConfig,\n AgentShieldRequest,\n AgentShieldMiddleware,\n} from './types';\n\n/**\n * Create AgentShield middleware for Express\n */\nexport function createAgentShieldMiddleware(\n config: Partial<ExpressMiddlewareConfig> = {}\n): AgentShieldMiddleware {\n const detector = new AgentDetector(config);\n\n const {\n onAgentDetected = 'log',\n onDetection,\n skipPaths = [],\n blockedResponse = {\n status: 403,\n message: 'Access denied: Automated agent detected',\n headers: { 'Content-Type': 'application/json' },\n },\n } = config;\n\n return async (\n req: Request,\n res: Response,\n next: NextFunction\n ): Promise<void> => {\n try {\n // Check if path should be skipped\n const shouldSkip = skipPaths.some(pattern => {\n if (typeof pattern === 'string') {\n return req.path === pattern;\n }\n return pattern.test(req.path);\n });\n\n if (shouldSkip) {\n (req as AgentShieldRequest).agentShield = {\n result: {\n isAgent: false,\n confidence: 0,\n confidenceLevel: 'low',\n reasons: ['Path skipped'],\n timestamp: new Date(),\n },\n skipped: true,\n };\n return next();\n }\n\n // Prepare request context\n const context = {\n userAgent: req.get('User-Agent'),\n ipAddress: req.ip || req.connection.remoteAddress,\n headers: req.headers as Record<string, string>,\n url: req.url,\n method: req.method,\n body: req.body,\n timestamp: new Date(),\n };\n\n // Analyze request\n const result = await detector.analyze(context);\n\n // Attach result to request\n (req as AgentShieldRequest).agentShield = {\n result,\n skipped: false,\n };\n\n // Handle detection result\n if (\n result.isAgent &&\n result.confidence >= (config.confidenceThreshold ?? 0.7)\n ) {\n // Call custom detection handler if provided\n if (onDetection) {\n await onDetection(req, res, result);\n }\n\n // Handle based on configuration\n switch (onAgentDetected) {\n case 'block':\n if (blockedResponse.headers) {\n Object.entries(blockedResponse.headers).forEach(\n ([key, value]) => {\n res.setHeader(key, value);\n }\n );\n }\n res.status(blockedResponse.status).json({\n error: blockedResponse.message,\n detected: true,\n confidence: result.confidence,\n timestamp: result.timestamp,\n });\n return;\n\n case 'log':\n console.warn('AgentShield: Agent detected', {\n ipAddress: context.ipAddress,\n userAgent: context.userAgent,\n confidence: result.confidence,\n reasons: result.reasons,\n });\n break;\n\n case 'allow':\n default:\n // Continue processing\n break;\n }\n }\n\n next();\n } catch (error) {\n console.error('AgentShield middleware error:', error);\n next(); // Continue on error to avoid breaking the application\n }\n };\n}\n\n/**\n * Convenience function for basic setup\n */\nexport function agentShield(\n config: Partial<ExpressMiddlewareConfig> = {}\n): AgentShieldMiddleware {\n return createAgentShieldMiddleware(config);\n}\n","/**\n * Session tracking helper for Express\n * Provides graceful degradation of session tracking for non-Next.js environments\n */\n\nimport type { Request, Response } from 'express';\nimport type { DetectionResult } from '@kya-os/agentshield';\n\nexport interface SessionData {\n id: string;\n agent: string;\n confidence: number;\n detectedAt: number;\n expires: number;\n}\n\n/**\n * Express-compatible session tracker\n * Uses cookies when available, falls back to headers\n */\nexport class ExpressSessionTracker {\n private readonly cookieName = '__agentshield_session';\n\n /**\n * Check for existing session from Express request\n */\n check(req: Request): SessionData | null {\n try {\n // Try cookie-based session first\n if (req.cookies && req.cookies[this.cookieName]) {\n try {\n const decoded = Buffer.from(\n req.cookies[this.cookieName],\n 'base64'\n ).toString();\n const session: SessionData = JSON.parse(decoded);\n\n // Check expiration\n if (session.expires > Date.now()) {\n return session;\n }\n } catch {\n // Invalid session data\n }\n }\n\n // Try header-based session (for clients that don't support cookies)\n const sessionHeader = req.get('X-AgentShield-Session');\n if (sessionHeader) {\n try {\n const session: SessionData = JSON.parse(\n Buffer.from(sessionHeader, 'base64').toString()\n );\n if (session.expires > Date.now()) {\n return session;\n }\n } catch {\n // Invalid session data\n }\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Track a new session in Express response\n */\n track(res: Response, result: DetectionResult): void {\n try {\n if (!result.isAgent) return;\n\n const session: SessionData = {\n id: this.generateId(),\n agent: result.detectedAgent?.name || 'unknown',\n confidence: result.confidence,\n detectedAt: Date.now(),\n expires: Date.now() + 3600000, // 1 hour\n };\n\n const encoded = Buffer.from(JSON.stringify(session)).toString('base64');\n\n // Set cookie if cookie-parser is available\n if (res.cookie) {\n res.cookie(this.cookieName, encoded, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 3600000, // 1 hour in milliseconds\n });\n }\n\n // Always set header as fallback\n res.setHeader('X-AgentShield-Session', encoded);\n res.setHeader('X-AgentShield-Session-Agent', session.agent);\n res.setHeader('X-AgentShield-Session-Id', session.id);\n } catch (error) {\n // Fail gracefully\n if (process.env.DEBUG_AGENTSHIELD) {\n console.warn('AgentShield: Failed to track session:', error);\n }\n }\n }\n\n /**\n * Generate a simple ID without crypto dependency\n */\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Helper to add session tracking to Express middleware\n */\nexport function withSessionTracking(\n middleware: Function,\n config?: { enabled?: boolean }\n): Function {\n if (!config?.enabled) {\n return middleware;\n }\n\n const tracker = new ExpressSessionTracker();\n\n return async function (req: Request, res: Response, next: Function) {\n // Check for existing session\n const session = tracker.check(req);\n\n if (session) {\n // Attach session to request\n (req as any).agentShield = {\n ...(req as any).agentShield,\n session,\n result: {\n isAgent: true,\n confidence: session.confidence,\n detectedAgent: { name: session.agent },\n timestamp: new Date(),\n verificationMethod: 'session',\n },\n };\n\n // Set response headers\n res.setHeader('X-AgentShield-Detected', 'true');\n res.setHeader('X-AgentShield-Agent', session.agent);\n res.setHeader('X-AgentShield-Session', 'continued');\n }\n\n // Call original middleware\n const originalEnd = res.end;\n res.end = function (...args: any[]) {\n // Track new sessions before sending response\n const agentShield = (req as any).agentShield;\n if (agentShield?.result?.isAgent && !agentShield.session) {\n tracker.track(res, agentShield.result);\n }\n\n return originalEnd.apply(res, args as any);\n };\n\n middleware(req, res, next);\n };\n}\n","/**\n * In-memory storage adapter for Express\n * Useful for development and testing\n */\n\nimport type { \n StorageAdapter, \n AgentDetectionEvent, \n AgentSession \n} from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private events: Map<string, AgentDetectionEvent[]> = new Map();\n private sessions: Map<string, AgentSession> = new Map();\n private eventTimeline: AgentDetectionEvent[] = [];\n private maxEventsPerSession = 100;\n private maxTimelineEvents = 1000;\n \n async storeEvent(event: AgentDetectionEvent): Promise<void> {\n // Add to session events\n const sessionEvents = this.events.get(event.sessionId) || [];\n sessionEvents.push(event);\n \n // Limit events per session\n if (sessionEvents.length > this.maxEventsPerSession) {\n sessionEvents.shift();\n }\n \n this.events.set(event.sessionId, sessionEvents);\n \n // Add to timeline\n this.eventTimeline.push(event);\n \n // Limit timeline size\n if (this.eventTimeline.length > this.maxTimelineEvents) {\n this.eventTimeline.shift();\n }\n }\n \n async storeSession(session: AgentSession): Promise<void> {\n this.sessions.set(session.sessionId, session);\n }\n \n async getEvents(sessionId: string, limit?: number): Promise<AgentDetectionEvent[]> {\n const events = this.events.get(sessionId) || [];\n if (limit) {\n return events.slice(-limit);\n }\n return events;\n }\n \n async getSession(sessionId: string): Promise<AgentSession | null> {\n return this.sessions.get(sessionId) || null;\n }\n \n async getRecentEvents(limit: number = 50): Promise<AgentDetectionEvent[]> {\n return this.eventTimeline.slice(-limit);\n }\n \n async getActiveSessions(limit: number = 50): Promise<AgentSession[]> {\n const sessions = Array.from(this.sessions.values());\n \n // Sort by last seen (most recent first)\n sessions.sort((a, b) => {\n const timeA = new Date(a.lastSeen).getTime();\n const timeB = new Date(b.lastSeen).getTime();\n return timeB - timeA;\n });\n \n return sessions.slice(0, limit);\n }\n \n async cleanup(before: Date): Promise<void> {\n const cutoff = before.getTime();\n \n // Clean up old events\n for (const [sessionId, events] of this.events.entries()) {\n const filtered = events.filter(e => \n new Date(e.timestamp).getTime() >= cutoff\n );\n \n if (filtered.length === 0) {\n this.events.delete(sessionId);\n } else {\n this.events.set(sessionId, filtered);\n }\n }\n \n // Clean up old sessions\n for (const [sessionId, session] of this.sessions.entries()) {\n if (new Date(session.lastSeen).getTime() < cutoff) {\n this.sessions.delete(sessionId);\n }\n }\n \n // Clean up timeline\n this.eventTimeline = this.eventTimeline.filter(e =>\n new Date(e.timestamp).getTime() >= cutoff\n );\n }\n}","/**\n * Redis storage adapter for Express\n * Provides persistent storage for production environments\n */\n\nimport type { \n StorageAdapter, \n AgentDetectionEvent, \n AgentSession \n} from './types';\n\ninterface RedisClient {\n set(key: string, value: any, options?: { ex?: number }): Promise<string>;\n get(key: string): Promise<any>;\n zadd(key: string, ...args: any[]): Promise<number>;\n zrange(key: string, start: number, stop: number): Promise<string[]>;\n zrevrange(key: string, start: number, stop: number): Promise<string[]>;\n expire(key: string, seconds: number): Promise<number>;\n del(key: string): Promise<number>;\n keys(pattern: string): Promise<string[]>;\n}\n\nexport class RedisStorageAdapter implements StorageAdapter {\n private prefix = 'agentshield:';\n private ttl: number;\n \n constructor(\n private redis: RedisClient,\n ttl: number = 86400 // 24 hours default\n ) {\n this.ttl = ttl;\n }\n \n private getKey(type: string, id: string): string {\n return `${this.prefix}${type}:${id}`;\n }\n \n async storeEvent(event: AgentDetectionEvent): Promise<void> {\n const eventKey = this.getKey('event', event.eventId);\n const sessionEventsKey = this.getKey('session_events', event.sessionId);\n const timelineKey = `${this.prefix}timeline`;\n \n // Store event data\n await this.redis.set(eventKey, JSON.stringify(event), { ex: this.ttl });\n \n // Add to session events (sorted set)\n const timestamp = new Date(event.timestamp).getTime();\n await this.redis.zadd(sessionEventsKey, timestamp, event.eventId);\n await this.redis.expire(sessionEventsKey, this.ttl);\n \n // Add to global timeline\n await this.redis.zadd(timelineKey, timestamp, event.eventId);\n \n // Trim timeline to keep only recent events\n const timelineCutoff = Date.now() - (this.ttl * 1000);\n await this.redis.zadd(timelineKey, timelineCutoff, 'cleanup');\n }\n \n async storeSession(session: AgentSession): Promise<void> {\n const sessionKey = this.getKey('session', session.sessionId);\n const activeSessionsKey = `${this.prefix}active_sessions`;\n \n // Store session data\n await this.redis.set(sessionKey, JSON.stringify(session), { ex: this.ttl });\n \n // Add to active sessions sorted set\n const timestamp = new Date(session.lastSeen).getTime();\n await this.redis.zadd(activeSessionsKey, timestamp, session.sessionId);\n }\n \n async getEvents(sessionId: string, limit?: number): Promise<AgentDetectionEvent[]> {\n const sessionEventsKey = this.getKey('session_events', sessionId);\n \n // Get event IDs from sorted set (most recent first)\n const eventIds = await this.redis.zrevrange(\n sessionEventsKey, \n 0, \n limit ? limit - 1 : -1\n );\n \n if (eventIds.length === 0) {\n return [];\n }\n \n // Fetch event data\n const events: AgentDetectionEvent[] = [];\n for (const eventId of eventIds) {\n const eventKey = this.getKey('event', eventId);\n const eventData = await this.redis.get(eventKey);\n if (eventData) {\n events.push(JSON.parse(eventData));\n }\n }\n \n return events;\n }\n \n async getSession(sessionId: string): Promise<AgentSession | null> {\n const sessionKey = this.getKey('session', sessionId);\n const sessionData = await this.redis.get(sessionKey);\n \n if (!sessionData) {\n return null;\n }\n \n return JSON.parse(sessionData);\n }\n \n async getRecentEvents(limit: number = 50): Promise<AgentDetectionEvent[]> {\n const timelineKey = `${this.prefix}timeline`;\n \n // Get recent event IDs\n const eventIds = await this.redis.zrevrange(timelineKey, 0, limit - 1);\n \n if (eventIds.length === 0) {\n return [];\n }\n \n // Fetch event data\n const events: AgentDetectionEvent[] = [];\n for (const eventId of eventIds) {\n if (eventId === 'cleanup') continue; // Skip cleanup marker\n \n const eventKey = this.getKey('event', eventId);\n const eventData = await this.redis.get(eventKey);\n if (eventData) {\n events.push(JSON.parse(eventData));\n }\n }\n \n return events;\n }\n \n async getActiveSessions(limit: number = 50): Promise<AgentSession[]> {\n const activeSessionsKey = `${this.prefix}active_sessions`;\n \n // Get recent session IDs\n const sessionIds = await this.redis.zrevrange(activeSessionsKey, 0, limit - 1);\n \n if (sessionIds.length === 0) {\n return [];\n }\n \n // Fetch session data\n const sessions: AgentSession[] = [];\n for (const sessionId of sessionIds) {\n const sessionKey = this.getKey('session', sessionId);\n const sessionData = await this.redis.get(sessionKey);\n if (sessionData) {\n sessions.push(JSON.parse(sessionData));\n }\n }\n \n return sessions;\n }\n \n async cleanup(before: Date): Promise<void> {\n // Redis handles TTL automatically, but we can clean up sorted sets\n const cutoff = before.getTime();\n const timelineKey = `${this.prefix}timeline`;\n const activeSessionsKey = `${this.prefix}active_sessions`;\n \n // Remove old entries from timeline\n await this.redis.zadd(timelineKey, cutoff, 'cleanup');\n \n // Remove old entries from active sessions\n await this.redis.zadd(activeSessionsKey, cutoff, 'cleanup');\n }\n}","/**\n * Storage adapter exports and factory for Express\n */\n\nexport * from './types';\nexport { MemoryStorageAdapter } from './memory-adapter';\nexport { RedisStorageAdapter } from './redis-adapter';\n\nimport type { StorageAdapter, StorageConfig } from './types';\nimport { MemoryStorageAdapter } from './memory-adapter';\nimport { RedisStorageAdapter } from './redis-adapter';\n\n/**\n * Create a storage adapter based on configuration\n */\nexport async function createStorageAdapter(config?: StorageConfig): Promise<StorageAdapter> {\n if (!config || config.type === 'memory') {\n return new MemoryStorageAdapter();\n }\n \n if (config.type === 'custom' && config.custom) {\n return config.custom;\n }\n \n if (config.type === 'redis' && config.redis) {\n // Dynamically import Redis client\n try {\n // @ts-ignore - Optional peer dependency\n const { Redis } = await import('@upstash/redis');\n const redis = new Redis({\n url: config.redis.url,\n token: config.redis.token,\n });\n return new RedisStorageAdapter(redis as any, config.ttl);\n } catch (error) {\n console.warn('[AgentShield] Failed to initialize Redis storage, falling back to memory:', error);\n return new MemoryStorageAdapter();\n }\n }\n \n // Default to memory storage\n return new MemoryStorageAdapter();\n}","/**\n * Enhanced Express middleware with all features built-in\n */\n\nimport type { Request, Response, NextFunction } from 'express';\nimport { AgentDetector } from '@kya-os/agentshield';\nimport { createStorageAdapter } from './storage';\nimport type { \n StorageAdapter, \n StorageConfig, \n AgentDetectionEvent\n} from './storage/types';\nimport type { DetectionResult } from '@kya-os/agentshield';\n\n/**\n * Enhanced configuration with built-in features\n */\nexport interface EnhancedMiddlewareConfig {\n /**\n * Storage configuration\n */\n storage?: StorageConfig;\n \n /**\n * Session tracking configuration\n */\n sessionTracking?: {\n enabled?: boolean;\n ttl?: number;\n };\n \n /**\n * Paths to skip detection\n */\n skipPaths?: string[];\n \n /**\n * Action when agent detected\n */\n onAgentDetected?: 'block' | 'log' | 'allow';\n \n /**\n * Custom handler for agent detection\n */\n onDetection?: (result: DetectionResult, req: Request) => void | Promise<void>;\n \n /**\n * Confidence threshold\n */\n confidenceThreshold?: number;\n \n /**\n * Response when blocking\n */\n blockedResponse?: {\n status?: number;\n message?: string;\n };\n \n /**\n * Enable WASM (if available)\n */\n enableWasm?: boolean;\n}\n\n/**\n * Session tracking helper\n */\nclass SessionManager {\n private sessionLastActivity = new Map<string, number>();\n \n generateSessionId(ipAddress?: string, userAgent?: string): string {\n const now = Date.now();\n const timeWindow = Math.floor(now / (5 * 60 * 1000)); // 5-minute windows\n const baseKey = `${ipAddress || 'unknown'}:${userAgent || 'unknown'}`;\n const windowKey = `${baseKey}:${timeWindow}`;\n \n const lastActivity = this.sessionLastActivity.get(windowKey);\n const shouldCreateNewSession = !lastActivity || now - lastActivity > 30000;\n \n this.sessionLastActivity.set(windowKey, now);\n \n // Clean up old entries\n if (this.sessionLastActivity.size > 100) {\n const cutoff = now - 600000;\n for (const [key, time] of this.sessionLastActivity.entries()) {\n if (time < cutoff) {\n this.sessionLastActivity.delete(key);\n }\n }\n }\n \n const data = shouldCreateNewSession \n ? `${windowKey}:${now}` \n : `${windowKey}:${lastActivity}`;\n \n // Simple hash\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n \n return Math.abs(hash).toString(16).padStart(12, '0').substring(0, 12);\n }\n}\n\n/**\n * Get verification method based on detection\n */\nfunction getVerificationMethod(\n confidence: number,\n reasons: string[] = []\n): string {\n // Check for signature verification\n if (reasons.some(r => \n r.includes('signature_agent') && \n !r.includes('signature_headers_present')\n )) {\n return 'signature';\n }\n \n // Check for WASM enhancement\n if (confidence >= 0.85 && confidence < 1.0) {\n return 'wasm-enhanced';\n }\n \n // Default to pattern matching\n return 'pattern';\n}\n\n/**\n * Apply WASM confidence boost for enhanced detection\n */\nfunction getWasmConfidenceBoost(\n baseConfidence: number,\n reasons: string[] = []\n): number {\n // If signature verification succeeded, always return 100%\n if (reasons.some(r => \n r.includes('signature_agent') && \n !r.includes('signature_headers_present')\n )) {\n return 1.0;\n }\n \n // For high-confidence pattern detection, boost to 95%\n if (baseConfidence >= 0.85) {\n return 0.95;\n }\n \n // For medium-high confidence, apply smaller boost\n if (baseConfidence >= 0.7) {\n return Math.min(baseConfidence * 1.1, 0.9);\n }\n \n // No boost for lower confidence\n return baseConfidence;\n}\n\n/**\n * Pattern detection for suspicious browser-like requests\n */\nfunction detectSuspiciousPatterns(req: Request): {\n confidence: number;\n reasons: string[];\n detectedAgent?: { type: string; name: string };\n} {\n const headers = req.headers as Record<string, string>;\n const normalizedHeaders: Record<string, string> = {};\n \n // Normalize headers to lowercase\n for (const [key, value] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = value;\n }\n \n const userAgent = normalizedHeaders['user-agent'] || '';\n const hasChrome = userAgent.toLowerCase().includes('chrome');\n const hasFirefox = userAgent.toLowerCase().includes('firefox');\n const hasSafari = userAgent.toLowerCase().includes('safari');\n const hasBrowserUA = hasChrome || hasFirefox || hasSafari;\n \n // Check for browser-specific headers that real browsers send\n const hasSecChUa = !!normalizedHeaders['sec-ch-ua'];\n const hasSecFetchHeaders = !!normalizedHeaders['sec-fetch-site'];\n const hasCookies = !!normalizedHeaders['cookie'];\n const hasAcceptLanguage = !!normalizedHeaders['accept-language'];\n \n const reasons: string[] = [];\n let confidence = 0;\n let detectedAgent: { type: string; name: string } | undefined;\n \n // Pattern 1: Browser UA but missing critical browser headers (like Perplexity)\n if (hasBrowserUA) {\n const missingHeaders = [];\n if (!hasSecChUa && hasChrome) missingHeaders.push('sec-ch-ua');\n if (!hasSecFetchHeaders) missingHeaders.push('sec-fetch-*');\n if (!hasAcceptLanguage) missingHeaders.push('accept-language');\n if (!hasCookies) missingHeaders.push('cookies');\n \n if (missingHeaders.length >= 2) {\n // Multiple missing headers = likely AI agent masquerading\n confidence = 0.85;\n reasons.push('browser_ua_missing_headers');\n reasons.push(`missing:${missingHeaders.join(',')}`);\n \n // Try to identify which agent based on patterns\n if (hasChrome && !hasSecChUa) {\n // Perplexity often uses Chrome UA without Sec-CH-UA\n detectedAgent = { type: 'perplexity', name: 'Perplexity' };\n } else {\n detectedAgent = { type: 'unknown', name: 'Unknown AI Agent' };\n }\n }\n }\n \n // Pattern 2: Check for cloud provider IPs\n const xForwardedFor = normalizedHeaders['x-forwarded-for'];\n const ip = req.ip || xForwardedFor?.split(',')[0];\n if (ip) {\n const cloudProviders = {\n aws: ['54.', '52.', '35.', '18.', '3.'],\n gcp: ['35.', '34.', '104.', '107.', '108.'],\n azure: ['13.', '20.', '40.', '52.', '104.'],\n };\n \n for (const [provider, prefixes] of Object.entries(cloudProviders)) {\n if (prefixes.some(prefix => ip.startsWith(prefix))) {\n confidence = Math.max(confidence, 0.4);\n reasons.push(`cloud_provider:${provider}`);\n break;\n }\n }\n }\n \n // Pattern 3: Minimal headers (bots often send very few headers)\n const headerCount = Object.keys(normalizedHeaders).length;\n if (headerCount < 8 && hasBrowserUA) {\n confidence = Math.max(confidence, 0.6);\n reasons.push(`minimal_headers:${headerCount}`);\n }\n \n // Boost confidence for multiple signals\n if (reasons.length >= 3) {\n confidence = Math.min(confidence * 1.15, 0.95);\n }\n \n return { \n confidence, \n reasons, \n ...(detectedAgent && { detectedAgent })\n };\n}\n\n/**\n * Create enhanced Agen