{"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 AgentShield middleware with all features\n */\nexport function createEnhancedAgentShieldMiddleware(config: EnhancedMiddlewareConfig = {}) {\n  // Initialize storage adapter\n  let storageAdapter: StorageAdapter | null = null;\n  let storageInitPromise: Promise<StorageAdapter> | null = null;\n  \n  const getStorage = async () => {\n    if (storageAdapter) return storageAdapter;\n    if (storageInitPromise) return storageInitPromise;\n    \n    storageInitPromise = createStorageAdapter(config.storage).then(adapter => {\n      storageAdapter = adapter;\n      return adapter;\n    });\n    \n    return storageInitPromise;\n  };\n  \n  // Initialize detector with lazy loading (try WASM first if available)\n  let detector: AgentDetector | null = null;\n  let detectorInitPromise: Promise<void> | null = null;\n  \n  const getDetector = async () => {\n    if (detector) return detector;\n    if (detectorInitPromise) {\n      await detectorInitPromise;\n      return detector!;\n    }\n    \n    detectorInitPromise = (async () => {\n      // For Express, we always use the standard AgentDetector\n      // which includes WASM support internally\n      detector = new AgentDetector();\n    })();\n    \n    await detectorInitPromise;\n    return detector!;\n  };\n  \n  // Session manager\n  const sessionManager = new SessionManager();\n  const sessionTrackingEnabled = config.sessionTracking?.enabled !== false;\n  \n  // Return the middleware function\n  return async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n    const pathname = req.path;\n    \n    // Check if path should be skipped\n    if (config.skipPaths?.some(path => pathname.startsWith(path))) {\n      return next();\n    }\n    \n    // Extract request context\n    const userAgent = req.get('user-agent');\n    const ipAddress = req.ip || req.get('x-forwarded-for') || req.socket.remoteAddress;\n    \n    const context = {\n      userAgent: userAgent || '',\n      ipAddress: ipAddress || '',\n      headers: req.headers as Record<string, string>,\n      url: req.originalUrl,\n      method: req.method,\n      timestamp: new Date(),\n    };\n    \n    try {\n      // Run detection with lazy-loaded detector\n      const activeDetector = await getDetector();\n      let result = await activeDetector.analyze(context);\n      \n      // If WASM didn't detect anything, try pattern detection\n      if (!result.isAgent || result.confidence < 0.3) {\n        const patternResult = detectSuspiciousPatterns(req);\n        \n        if (patternResult.confidence > result.confidence) {\n          // Pattern detection found something WASM missed\n          result = {\n            ...result,\n            isAgent: patternResult.confidence > 0.3,\n            confidence: patternResult.confidence,\n            reasons: patternResult.reasons,\n            detectedAgent: patternResult.detectedAgent,\n            verificationMethod: 'pattern',\n            confidenceLevel: \n              patternResult.confidence >= 0.8 ? 'high' :\n              patternResult.confidence >= 0.5 ? 'medium' : 'low',\n          };\n        }\n      }\n      \n      // Apply WASM confidence boost if applicable\n      let finalConfidence = result.confidence;\n      let verificationMethod = result.verificationMethod || 'pattern';\n      \n      if (result.isAgent) {\n        const reasons = (result as any).reasons || [];\n        \n        if (config.enableWasm !== false && finalConfidence >= 0.85 && finalConfidence < 1.0) {\n          finalConfidence = getWasmConfidenceBoost(result.confidence, reasons);\n          verificationMethod = getVerificationMethod(finalConfidence, reasons);\n        }\n      }\n      \n      // Store detection info in request for later use\n      (req as any).agentShield = {\n        detected: result.isAgent,\n        confidence: finalConfidence,\n        agent: result.detectedAgent,\n        verificationMethod,\n      };\n      \n      // Handle high-confidence detection\n      if (result.isAgent && finalConfidence >= (config.confidenceThreshold ?? 0.7)) {\n        // Store event if storage is configured and session tracking is enabled\n        if (sessionTrackingEnabled) {\n          const storage = await getStorage();\n          const sessionId = sessionManager.generateSessionId(ipAddress || undefined, userAgent || undefined);\n          \n          // Create event\n          const event: AgentDetectionEvent = {\n            eventId: `agent_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`,\n            sessionId,\n            timestamp: new Date().toISOString(),\n            agentType: result.detectedAgent?.type || 'unknown',\n            agentName: result.detectedAgent?.name || 'Unknown',\n            confidence: finalConfidence,\n            path: req.originalUrl,\n            ...(userAgent && { userAgent }),\n            ...(ipAddress && { ipAddress }),\n            method: req.method,\n            detectionReasons: (result as any).reasons || [],\n            verificationMethod,\n            detectionDetails: {\n              patterns: (result.detectedAgent as any)?.patterns,\n              behaviors: (result.detectedAgent as any)?.behaviors,\n              fingerprintMatches: (result.detectedAgent as any)?.fingerprints,\n            },\n          };\n          \n          // Store event\n          try {\n            await storage.storeEvent(event);\n            \n            // Get or create session\n            let session = await storage.getSession(sessionId);\n            \n            if (session) {\n              // Update existing session\n              session.lastSeen = event.timestamp;\n              session.eventCount++;\n              if (!session.paths.includes(req.originalUrl)) {\n                session.paths.push(req.originalUrl);\n              }\n              session.averageConfidence = \n                (session.averageConfidence * (session.eventCount - 1) + finalConfidence) / \n                session.eventCount;\n              if (!session.verificationMethods.includes(verificationMethod)) {\n                session.verificationMethods.push(verificationMethod);\n              }\n            } else {\n              // Create new session\n              session = {\n                sessionId,\n                ...(ipAddress && { ipAddress }),\n                ...(userAgent && { userAgent }),\n                agentType: result.detectedAgent?.type || 'unknown',\n                agentName: result.detectedAgent?.name || 'Unknown',\n                firstSeen: event.timestamp,\n                lastSeen: event.timestamp,\n                eventCount: 1,\n                paths: [req.originalUrl],\n                averageConfidence: finalConfidence,\n                verificationMethods: [verificationMethod],\n              };\n            }\n            \n            if (session) {\n              await storage.storeSession(session);\n            }\n          } catch (error) {\n            console.error('[AgentShield] Failed to store event:', error);\n          }\n        }\n        \n        // Call custom handler if provided\n        if (config.onDetection) {\n          await config.onDetection(result, req);\n        }\n        \n        // Set response headers\n        res.setHeader('x-agentshield-detected', 'true');\n        res.setHeader('x-agentshield-confidence', String(Math.round(finalConfidence * 100)));\n        res.setHeader('x-agentshield-agent', result.detectedAgent?.name || 'Unknown');\n        res.setHeader('x-agentshield-verification', verificationMethod);\n        \n        // Add custom headers for high confidence\n        if (finalConfidence > 0.9) {\n          res.setHeader('x-ai-visitor', 'true');\n          res.setHeader('x-ai-confidence', finalConfidence.toString());\n          res.setHeader('x-ai-verification', verificationMethod);\n        }\n        \n        // Handle based on configuration\n        switch (config.onAgentDetected) {\n          case 'block': {\n            const { status = 403, message = 'Access denied: AI agent detected' } = \n              config.blockedResponse || {};\n            \n            res.status(status).json({\n              error: message,\n              detected: true,\n              confidence: finalConfidence,\n            });\n            return;\n          }\n          \n          case 'log':\n            console.log(`[AgentShield] 🤖 AI Agent detected (${verificationMethod}):`, {\n              agent: result.detectedAgent?.name,\n              confidence: `${(finalConfidence * 100).toFixed(0)}%`,\n              path: req.originalUrl,\n              verification: verificationMethod,\n            });\n            break;\n          \n          case 'allow':\n          default:\n            // Continue processing\n            break;\n        }\n      }\n      \n      // Continue to next middleware\n      next();\n    } catch (error) {\n      console.error('[AgentShield] Error during detection:', error);\n      // Don't block on errors\n      next();\n    }\n  };\n}\n\n/**\n * Export storage types for user access\n */\nexport type { StorageAdapter, StorageConfig, AgentDetectionEvent, AgentSession } from './storage/types';","/**\n * @fileoverview AgentShield Express Middleware\n * @version 0.1.0\n * @license MIT OR Apache-2.0\n */\n\nexport * from './middleware';\nexport * from './types';\nexport * from './session-helper';\n\n// Export enhanced middleware with built-in features\nexport { \n  createEnhancedAgentShieldMiddleware,\n  type EnhancedMiddlewareConfig,\n  type StorageAdapter,\n  type StorageConfig,\n  type AgentDetectionEvent,\n  type AgentSession,\n} from './enhanced-middleware';\n\n// Export storage adapters for advanced users\nexport { \n  MemoryStorageAdapter,\n  RedisStorageAdapter,\n  createStorageAdapter,\n} from './storage';\n\n/**\n * Library version\n */\nexport const VERSION = '0.1.0';\n"]}