{"version":3,"sources":["../../src/context/types.ts","../../src/context/TokenCounter.ts","../../src/context/ContextManager.ts"],"names":["MessageImportance","result"],"mappings":";AAyBO,IAAK,iBAAA,qBAAAA,kBAAAA,KAAL;AACL,EAAAA,mBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,mBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,mBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,mBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,mBAAA,KAAA,CAAA,GAAM,KAAA;AALI,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AA+FL,IAAM,kBAAA,GAAgD;AAAA,EAC3D,OAAA,EAAS,IAAA;AAAA,EACT,WAAA,EAAa,KAAA;AAAA,EACb,aAAA,EAAe,KAAA;AAAA,EACf,QAAA,EAAU,KAAA;AAAA,EACV,eAAA,EAAiB,IAAA;AAAA,EACjB,mBAAA,EAAqB,KAAA;AAAA,EACrB,eAAA,EAAiB,GAAA;AAAA,EACjB,iBAAA,EAAmB,GAAA;AAAA,EACnB,gBAAA,EAAkB,GAAA;AAAA,EAClB,mBAAA,EAAqB,GAAA;AAAA,EACrB,kBAAA,EAAoB;AACtB;AAKO,IAAM,kBAAA,GAA6C;AAAA,EACxD,OAAA,EAAS,aAAA;AAAA,EACT,WAAA,EAAa,aAAA;AAAA,EACb,aAAA,EAAe,aAAA;AAAA,EACf,QAAA,EAAU,YAAA;AAAA,EACV,eAAA,EAAiB,aAAA;AAAA,EACjB,mBAAA,EAAqB,aAAA;AAAA,EACrB,eAAA,EAAiB,aAAA;AAAA,EACjB,iBAAA,EAAmB,aAAA;AAAA,EACnB,gBAAA,EAAkB,aAAA;AAAA,EAClB,mBAAA,EAAqB,aAAA;AAAA,EACrB,kBAAA,EAAoB;AACtB;;;ACzIA,IAAI,cAAA,GAAmD,IAAA;AACvD,IAAI,qBAAA,GAAwB,KAAA;AAM5B,eAAe,YAAA,GAA0D;AACvE,EAAA,IAAI,qBAAA,EAAuB;AACzB,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,qBAAA,GAAwB,IAAA;AAExB,EAAA,IAAI;AAEF,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,QAAQ,QAAA,IAAY,OAAA,CAAQ,SAAS,IAAA,EAAM;AAC/E,MAAA,cAAA,GAAiB,MAAM,OAAO,UAAU,CAAA;AACxC,MAAA,OAAO,cAAA;AAAA,IACT;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,MAAM,sDAAsD,CAAA;AAAA,EACtE;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,IAAM,uBAAN,MAA2B;AAAA,EAA3B,WAAA,GAAA;AACE,IAAA,IAAA,CAAiB,eAAA,GAAkB,CAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKnC,kBAAkB,IAAA,EAAsB;AACtC,IAAA,IAAI,CAAC,MAAM,OAAO,CAAA;AAClB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,eAAe,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,OAAA,EAAqC;AACtD,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,CAAA;AAAA,MACT,YAAA,EAAc,CAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAGA,IAAA,IAAI,MAAA,GAAS,CAAA;AAGb,IAAA,SAAA,CAAU,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAA,CAAK,MAAA,GAAS,KAAK,eAAe,CAAA;AACrE,IAAA,MAAA,IAAU,SAAA,CAAU,IAAA;AAGpB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA,CAAU,IAAA,GAAO,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAA,GAAS,IAAA,CAAK,eAAe,CAAA,GAAI,CAAA;AACzE,MAAA,MAAA,IAAU,SAAA,CAAU,IAAA;AAAA,IACtB;AAGA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,OAAO,CAAA;AAC1D,MAAA,MAAA,IAAU,SAAA,CAAU,OAAA;AAAA,IACtB;AAGA,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,cAAc,IAAI,CAAA;AAChE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,cAAc,SAAS,CAAA;AACrE,MAAA,SAAA,CAAU,YAAA,GAAe,SAAS,MAAA,GAAS,CAAA;AAC3C,MAAA,MAAA,IAAU,SAAA,CAAU,YAAA;AAAA,IACtB;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACvD,MAAA,KAAA,MAAW,QAAA,IAAY,QAAQ,UAAA,EAAY;AACzC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,EAAE,CAAA;AACjD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,IAAI,CAAA;AACrD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,SAAS,IAAI,CAAA;AAC5D,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,SAAS,SAAS,CAAA;AACjE,QAAA,SAAA,CAAU,SAAA,IAAa,MAAA,GAAS,QAAA,GAAW,MAAA,GAAS,MAAA,GAAS,CAAA;AAAA,MAC/D;AACA,MAAA,MAAA,IAAU,SAAA,CAAU,SAAA;AAAA,IACtB;AAGA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,MAAA,IAAU,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,YAAY,CAAA,GAAI,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,UAAA,EAAY,CAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAMO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,QAAA,uBAAiC,GAAA,EAAI;AAC7C,IAAA,IAAA,CAAQ,aAAA,GAAgB,KAAA;AACxB,IAAA,IAAA,CAAQ,eAAA,GAAkB,IAAI,oBAAA,EAAqB;AACnD,IAAA,IAAA,CAAQ,WAAA,GAAoC,IAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAK5C,MAAc,IAAA,GAAsB;AAClC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,eAAe,YAAY;AAC9B,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AACpC,MAAA,IAAA,CAAK,gBAAgB,QAAA,KAAa,IAAA;AAAA,IACpC,CAAA,GAAG;AAEH,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,KAAA,EAAuB;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,IAAiB,CAAC,cAAA,EAAgB;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,KAAK,CAAA,IAAK,aAAA;AAElD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,YAAY,CAAA,EAAG;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,cAAA,CAAe,kBAAA,CAAmB,KAAY,CAAA;AAC9D,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AAEd,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,cAAA,CAAe,kBAAA,CAAmB,OAAc,CAAA;AAChE,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA;AAAA,QACzC,SAAS,CAAA,EAAG;AACV,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,YAAY,CAAA,IAAK,IAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,MAAc,KAAA,EAA0B;AACxD,IAAA,IAAI,CAAC,MAAM,OAAO,CAAA;AAElB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CAAmB,SAAyB,KAAA,EAA8B;AACxE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAEzC,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,kBAAA,CAAmB,OAAO,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,OAAA,EAAS,CAAA;AAAA,MACT,YAAA,EAAc,CAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAGA,IAAA,IAAI,MAAA,GAAS,CAAA;AAGb,IAAA,SAAA,CAAU,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,MAAA;AAC9C,IAAA,MAAA,IAAU,SAAA,CAAU,IAAA;AAGpB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA,CAAU,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,EAAE,MAAA,GAAS,CAAA;AACvD,MAAA,MAAA,IAAU,SAAA,CAAU,IAAA;AAAA,IACtB;AAGA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,SAAA,CAAU,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA;AACpD,MAAA,MAAA,IAAU,SAAA,CAAU,OAAA;AAAA,IACtB;AAGA,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,aAAA,CAAc,IAAI,CAAA,CAAE,MAAA;AAC1D,MAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,aAAA,CAAc,SAAS,CAAA,CAAE,MAAA;AAC/D,MAAA,SAAA,CAAU,YAAA,GAAe,SAAS,MAAA,GAAS,CAAA;AAC3C,MAAA,MAAA,IAAU,SAAA,CAAU,YAAA;AAAA,IACtB;AAGA,IAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACvD,MAAA,KAAA,MAAW,QAAA,IAAY,QAAQ,UAAA,EAAY;AACzC,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA;AAC3C,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAE,MAAA;AAC/C,QAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,CAAE,MAAA;AACtD,QAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,CAAE,MAAA;AAC3D,QAAA,SAAA,CAAU,SAAA,IAAa,MAAA,GAAS,QAAA,GAAW,MAAA,GAAS,MAAA,GAAS,CAAA;AAAA,MAC/D;AACA,MAAA,MAAA,IAAU,SAAA,CAAU,SAAA;AAAA,IACtB;AAGA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,YAAY,EAAE,MAAA,GAAS,CAAA;AAAA,IAC1D;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,UAAA,EAAY,CAAA;AAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,CAAoB,UAA4B,KAAA,EAA0B;AACxE,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,KAAA,IAAS,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,KAAK,CAAA,CAAE,MAAA;AAAA,IACnD;AAEA,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,CACE,QAAA,EACA,SAAA,EACA,KAAA,EACQ;AACR,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,KAAK,CAAA;AACrD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,IAAI,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CACE,QAAA,EACA,UAAA,EACA,SAAA,EACA,KAAA,EACS;AACT,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,KAAK,CAAA;AAC9D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,kBAAA,CAAmB,UAAA,EAAY,KAAK,CAAA,CAAE,MAAA;AAC7D,IAAA,OAAO,gBAAgB,SAAA,GAAY,SAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,CACE,QAAA,EACA,SAAA,EACA,KAAA,EACA,UAAmB,IAAA,EACX;AACR,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,MAAM,kBAAkB,OAAA,GAAU,CAAC,GAAG,QAAQ,CAAA,CAAE,SAAQ,GAAI,QAAA;AAE5D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AAC/C,MAAA,MAAM,OAAA,GAAU,gBAAgB,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,KAAK,CAAA,CAAE,MAAA;AAC9D,MAAA,WAAA,IAAe,aAAA;AAEf,MAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,QAAA,OAAO,OAAA,GAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,CAAA;AAAA,MACzC;AAAA,IACF;AAEA,IAAA,OAAO,OAAA,GAAU,IAAI,QAAA,CAAS,MAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AAC5C,QAAA,IAAI,OAAA,IAAW,OAAO,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AACjD,UAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAA4B;AAChC,IAAA,MAAM,KAAK,IAAA,EAAK;AAChB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AACF;AAKO,IAAM,YAAA,GAAe,IAAI,YAAA;;;ACnVhC,IAAM,sBAAN,MAAwD;AAAA,EAAxD,WAAA,GAAA;AACE,IAAA,IAAA,CAAA,IAAA,GAAO,cAAA;AAAA,EAAA;AAAA,EAEP,QAAA,CACE,QAAA,EACA,SAAA,EACA,cAAA,EACA,MAAA,EACkB;AAClB,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AACjC,IAAA,MAAM,SAA2B,EAAC;AAClC,IAAA,MAAM,sBAAA,GAAyB,OAAO,sBAAA,IAA0B,IAAA;AAChE,IAAA,MAAM,mBAAA,GAAsB,OAAO,mBAAA,IAAuB,CAAA;AAG1D,IAAA,MAAM,cAAA,GAAiB,sBAAA,GACnB,QAAA,CAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,GAC1C,EAAC;AACL,IAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAGhE,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,cAAc,CAAA;AAG7B,IAAA,IAAI,UAAA,GAAa,OAAA,CAAQ,mBAAA,CAAoB,cAAA,EAAgB,OAAO,KAAK,CAAA;AAGzE,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,CAAM,CAAC,mBAAmB,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,mBAAA,CAAoB,cAAA,EAAgB,OAAO,KAAK,CAAA;AAG7E,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,CAAC,mBAAmB,CAAA;AAGlE,IAAA,KAAA,IAAS,IAAI,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACnD,MAAA,MAAM,OAAA,GAAU,eAAe,CAAC,CAAA;AAChC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,gBAAgB,OAAA,CAAQ,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA;AAExE,MAAA,IAAI,UAAA,GAAa,aAAA,GAAgB,YAAA,IAAgB,SAAA,EAAW;AAC1D,QAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,QAAA,UAAA,IAAc,aAAA;AAAA,MAChB;AAAA,IACF;AAGA,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,cAAc,CAAA;AAE7B,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAGhB,IAAA,MAAM,kBAAkB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAChE,IAAA,OAAO,CAAC,GAAG,cAAA,EAAgB,GAAG,gBAAgB,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC3D,MAAA,OAAO,SAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,IACjD,CAAC,CAAC,CAAA;AAAA,EACJ;AACF,CAAA;AAMA,IAAM,wBAAN,MAA0D;AAAA,EAA1D,WAAA,GAAA;AACE,IAAA,IAAA,CAAA,IAAA,GAAO,gBAAA;AAAA,EAAA;AAAA,EAEP,QAAA,CACE,QAAA,EACA,SAAA,EACA,cAAA,EACA,MAAA,EACkB;AAClB,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AACjC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,mBAAA,EAAqB,SAAA,IAAa,CAAA;AAC3D,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,mBAAA,EAAqB,QAAA,IAAY,CAAA;AAGzD,IAAA,MAAM,cAAA,GAAkB,MAAA,CAAO,sBAAA,IAA0B,IAAA,GACrD,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,GAC1C,EAAC;AACL,IAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAGhE,IAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACtD,IAAA,MAAM,YAAA,GAAe,aAAA,CAAc,KAAA,CAAM,CAAC,QAAQ,CAAA;AAGlD,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,cAAA,EAAgB,GAAG,aAAa,CAAA;AAErD,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3B,QAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,MACnB;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,GAAS,QAAA;AACb,IAAA,IAAI,UAAA,GAAa,OAAA,CAAQ,mBAAA,CAAoB,MAAA,EAAQ,OAAO,KAAK,CAAA;AAEjE,IAAA,OAAO,aAAa,SAAA,IAAa,MAAA,CAAO,MAAA,GAAS,cAAA,CAAe,SAAS,CAAA,EAAG;AAE1E,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,GAAS,IAAA,CAAK,KAAA;AAAA,QAAA,CAC9C,MAAA,CAAO,MAAA,GAAS,cAAA,CAAe,MAAA,IAAU;AAAA,OAC5C;AACA,MAAA,MAAA,CAAO,MAAA,CAAO,aAAa,CAAC,CAAA;AAC5B,MAAA,UAAA,GAAa,OAAA,CAAQ,mBAAA,CAAoB,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAMA,IAAM,0BAAN,MAA4D;AAAA,EAA5D,WAAA,GAAA;AACE,IAAA,IAAA,CAAA,IAAA,GAAO,kBAAA;AAAA,EAAA;AAAA,EAEP,QAAA,CACE,QAAA,EACA,SAAA,EACA,cAAA,EACA,MAAA,EACkB;AAClB,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AACjC,IAAA,MAAM,eAAA,GAAkB;AAAA,MAAA,QAAA;AAAA,MAAA,UAAA;AAAA,MAAA,MAAA;AAAA,MAAA,QAAA;AAAA,MAAA,KAAA;AAAA,KAMxB;AAGA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAyC;AAC7D,IAAA,KAAA,MAAW,cAAc,eAAA,EAAiB;AACxC,MAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,EAAE,CAAA;AAAA,IAC5B;AAGA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,KACzB,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAA,QAAA,gBAAA,QAAA,cAAA;AAInB,MAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA;AAAA,IACvC;AAGA,IAAA,MAAM,SAA2B,EAAC;AAClC,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,KAAA,MAAW,cAAc,eAAA,EAAiB;AACxC,MAAA,MAAM,oBAAA,GAAuB,OAAA,CAAQ,GAAA,CAAI,UAAU,KAAK,EAAC;AAEzD,MAAA,KAAA,MAAW,WAAW,oBAAA,EAAsB;AAC1C,QAAA,MAAM,gBAAgB,OAAA,CAAQ,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA;AAExE,QAAA,IAAI,UAAA,GAAa,iBAAiB,SAAA,EAAW;AAC3C,UAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,UAAA,UAAA,IAAc,aAAA;AAAA,QAChB,CAAA,MAAA,IAAW,wCAA2C,UAAA,KAAA,UAAA,iBAA2C;AAE/F,UAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,UAAA,UAAA,IAAc,aAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAGhB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EACxE;AACF,CAAA;AAMA,IAAM,wBAAN,MAA0D;AAAA,EAA1D,WAAA,GAAA;AACE,IAAA,IAAA,CAAA,IAAA,GAAO,gBAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKC,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AACzD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA;AAElC,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,MAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,MAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,MAAA,EAAW;AAC9C,MAAA,UAAA,IAAc,IAAA,GAAO,IAAA;AACrB,MAAA,KAAA,IAAS,IAAA,GAAO,IAAA;AAChB,MAAA,KAAA,IAAS,IAAA,GAAO,IAAA;AAAA,IAClB;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAK,KAAK,CAAA;AACtD,IAAA,OAAO,WAAA,KAAgB,CAAA,GAAI,CAAA,GAAI,UAAA,GAAa,WAAA;AAAA,EAC9C;AAAA,EAEA,QAAA,CACE,QAAA,EACA,SAAA,EACA,cAAA,EACA,MAAA,EACkB;AAClB,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AACjC,IAAA,MAAM,sBAAA,GAAyB,OAAO,sBAAA,IAA0B,IAAA;AAChE,IAAA,MAAM,mBAAA,GAAsB,OAAO,mBAAA,IAAuB,CAAA;AAG1D,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,SAAA,IAAa,CAAA,CAAE,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAEhF,IAAA,IAAI,CAAC,aAAA,EAAe;AAElB,MAAA,MAAM,QAAA,GAAW,IAAI,mBAAA,EAAoB;AACzC,MAAA,OAAO,QAAA,CAAS,QAAA,CAAS,QAAA,EAAU,SAAA,EAAW,gBAAgB,MAAM,CAAA;AAAA,IACtE;AAGA,IAAA,MAAM,cAAA,GAAiB,sBAAA,GACnB,QAAA,CAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,GAC1C,EAAC;AACL,IAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAGhE,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,CAAM,CAAC,mBAAmB,CAAA;AAC/D,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,CAAC,mBAAmB,CAAA;AAGlE,IAAA,MAAM,gBAAA,GAAmB,cAAA,CACtB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,CACzB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAU,CAAA;AAE1B,IAAA,IAAI,YAAA,GAAgC,IAAA;AACpC,IAAA,IAAI,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAK,gBAAA,CAAiB,CAAC,CAAA,EAAG;AACtD,MAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,CAAC,CAAA,CAAE,MAAA;AAC5C,MAAA,YAAA,GAAe,IAAI,KAAA,CAAM,eAAe,CAAA,CAAE,KAAK,CAAC,CAAA;AAEhD,MAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,QAAA,IAAI,CAAC,SAAA,EAAW;AAChB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,UAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,UAAA,MAAM,MAAA,GAAS,aAAa,CAAC,CAAA;AAC7B,UAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AAC7C,YAAA,YAAA,CAAa,CAAC,IAAI,MAAA,GAAS,GAAA;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAEA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,MAAA,GAAS,aAAa,CAAC,CAAA;AAC7B,QAAA,IAAI,WAAW,MAAA,EAAW;AACxB,UAAA,YAAA,CAAa,CAAC,CAAA,GAAI,MAAA,GAAS,gBAAA,CAAiB,MAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,GAAA,CAAI,CAAC,OAAA,KAAY;AACrD,MAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,MAAA,IAAI,YAAA,IAAgB,QAAQ,SAAA,EAAW;AACrC,QAAA,cAAA,GAAiB,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,SAAA,EAAW,YAAY,CAAA;AAAA,MACxE;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,cAAA,EAAe;AAAA,IAC1C,CAAC,CAAA;AAGD,IAAA,cAAA,CAAe,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAG/C,IAAA,MAAM,MAAA,GAA2B,CAAC,GAAG,cAAc,CAAA;AACnD,IAAA,IAAI,UAAA,GAAa,OAAA,CAAQ,mBAAA,CAAoB,cAAA,EAAgB,OAAO,KAAK,CAAA;AACzE,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,mBAAA,CAAoB,cAAA,EAAgB,OAAO,KAAK,CAAA;AAG7E,IAAA,KAAA,MAAW,EAAE,OAAA,EAAQ,IAAK,cAAA,EAAgB;AACxC,MAAA,MAAM,gBAAgB,OAAA,CAAQ,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA;AAExE,MAAA,IAAI,UAAA,GAAa,aAAA,GAAgB,YAAA,IAAgB,SAAA,EAAW;AAC1D,QAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,QAAA,UAAA,IAAc,aAAA;AAAA,MAChB;AAAA,IACF;AAGA,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,cAAc,CAAA;AAE7B,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAGhB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EACxE;AACF,CAAA;AAKO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,cAAA,EAAgB,GAAA;AAAA,MAChB,sBAAA,EAAwB,IAAA;AAAA,MACxB,mBAAA,EAAqB,CAAA;AAAA,MACrB,gBAAA,EAAkB,GAAA;AAAA,MAClB,kBAAA,EAAoB,cAAA;AAAA,MACpB,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,EAAa;AAGhC,IAAA,IAAA,CAAK,UAAA,uBAAiB,GAAA,EAAgC;AACtD,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,cAAA,EAAgB,IAAI,qBAAqB,CAAA;AAC7D,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,gBAAA,EAAkB,IAAI,uBAAuB,CAAA;AACjE,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,kBAAA,EAAoB,IAAI,yBAAyB,CAAA;AACrE,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,gBAAA,EAAkB,IAAI,uBAAuB,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAAA,EAAwC;AACpD,IAAA,MAAM,gBAAgB,IAAA,CAAK,OAAA,CAAQ,oBAAoB,QAAA,EAAU,IAAA,CAAK,OAAO,KAAK,CAAA;AAClF,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,GAAA;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,SAAA;AAE9B,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,aAAA;AAAA,MACb,aAAA;AAAA,MACA,cAAA,EAAgB,CAAA;AAAA;AAAA,MAChB,iBAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,gBAAgB,cAAc;AAAA,KACzE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAA,EAAqC;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AACzC,IAAA,MAAM,YAAY,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,OAAO,cAAA,IAAkB,GAAA,CAAA;AACzE,IAAA,OAAO,MAAM,WAAA,GAAc,SAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,QAAA,EAAqC;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AACzC,IAAA,MAAM,YAAY,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,OAAO,cAAA,IAAkB,GAAA,CAAA;AACzE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,gBAAA,IAAoB,GAAA;AAClD,IAAA,OAAO,KAAA,CAAM,eAAe,SAAA,GAAY,SAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,QAAA,EAA8C;AACrD,IAAA,MAAM,YAAY,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,OAAO,cAAA,IAAkB,GAAA,CAAA;AACzE,IAAA,MAAM,gBAAgB,IAAA,CAAK,OAAA,CAAQ,oBAAoB,QAAA,EAAU,IAAA,CAAK,OAAO,KAAK,CAAA;AAGlF,IAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,KAAK,MAAA,CAAO,kBAAA,KAAuB,QAAA,IAAY,IAAA,CAAK,OAAO,kBAAA,EAAoB;AAEjF,MAAA,MAAMC,OAAAA,GAAS,IAAA,CAAK,MAAA,CAAO,kBAAA,CAAmB,UAAU,SAAS,CAAA;AACjE,MAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,QAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,MAAM,CAACA,OAAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AAC1D,QAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,OAAA,EAASA,OAAM,CAAA;AAAA,MACxC;AACA,MAAA,OAAOA,OAAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,QAAA,GAAW,KAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,sBAAsB,cAAc,CAAA;AAAA,IACjF;AAGA,IAAA,MAAM,SAAS,QAAA,CAAS,QAAA,CAAS,UAAU,SAAA,EAAW,aAAA,EAAe,KAAK,MAAM,CAAA;AAGhF,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,MAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,CAAC,MAAM,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AAC1D,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,MAAM,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,UACA,UAAA,EACkB;AAClB,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,QAAA,EAAU,UAAU,CAAA;AAGhD,IAAA,IAAI,KAAK,kBAAA,CAAmB,eAAe,CAAA,IAAK,IAAA,CAAK,OAAO,SAAA,EAAW;AACrE,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,eAAe,CAAA;AAChD,MAAA,IAAA,CAAK,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,eAAe,CAAA,EAAG;AACzC,MAAA,OAAO,IAAA,CAAK,SAAS,eAAe,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,eAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CACE,UACA,WAAA,EACkB;AAClB,IAAA,IAAI,MAAA,GAAS,QAAA;AAEb,IAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA4B;AAC1B,IAAA,OAAO,kBAAA,CAAmB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,IAAK,IAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAsC;AACjD,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAA,EAAoC;AACnD,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,EACvB;AACF","file":"index.mjs","sourcesContent":["/**\n * Context truncation types and interfaces\n */\n\nimport type { TokenCount } from '../types/common.d';\n\n/**\n * Supported AI models for token counting\n */\nexport type ModelType =\n  | 'gpt-4'\n  | 'gpt-4-32k'\n  | 'gpt-4-turbo'\n  | 'gpt-4o'\n  | 'gpt-3.5-turbo'\n  | 'gpt-3.5-turbo-16k'\n  | 'claude-3-opus'\n  | 'claude-3-sonnet'\n  | 'claude-3-haiku'\n  | 'claude-3-5-sonnet'\n  | 'claude-3-5-haiku';\n\n/**\n * Message importance levels\n */\nexport enum MessageImportance {\n  SYSTEM = 'system',\n  CRITICAL = 'critical',\n  HIGH = 'high',\n  NORMAL = 'normal',\n  LOW = 'low'\n}\n\n/**\n * Truncation strategy types\n */\nexport type TruncationStrategyType =\n  | 'oldest-first'\n  | 'least-relevant'\n  | 'sliding-window'\n  | 'importance-based'\n  | 'custom';\n\n/**\n * Message structure for context management\n */\nexport interface ContextMessage {\n  role: 'system' | 'user' | 'assistant' | 'function' | 'tool';\n  content: string | null;\n  name?: string;\n  function_call?: {\n    name: string;\n    arguments: string;\n  };\n  tool_calls?: Array<{\n    id: string;\n    type: 'function';\n    function: {\n      name: string;\n      arguments: string;\n    };\n  }>;\n  tool_call_id?: string;\n  importance?: MessageImportance;\n  metadata?: Record<string, any>;\n  embedding?: number[];\n}\n\n/**\n * Token usage information\n */\nexport interface TokenUsage {\n  totalTokens: number;\n  messageTokens: number;\n  overheadTokens: number;\n  remainingTokens: number;\n}\n\n/**\n * Context configuration\n */\nexport interface ContextConfig {\n  model: ModelType;\n  maxTokens: number;\n  reservedTokens?: number;\n  truncationStrategy?: TruncationStrategyType;\n  preserveSystemMessages?: boolean;\n  preserveRecentCount?: number;\n  slidingWindowConfig?: {\n    keepFirst: number;\n    keepLast: number;\n  };\n  warningThreshold?: number;\n  onWarning?: (usage: TokenUsage) => void;\n  onTruncate?: (removed: ContextMessage[], remaining: ContextMessage[]) => void;\n  customTruncationFn?: (messages: ContextMessage[], maxTokens: number) => ContextMessage[];\n}\n\n/**\n * Truncation strategy interface\n */\nexport interface TruncationStrategy {\n  name: TruncationStrategyType;\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[];\n}\n\n/**\n * Token counter result\n * Re-export from common types for backwards compatibility\n */\nexport type { TokenCount };\n\n/**\n * Model token limits mapping\n */\nexport const MODEL_TOKEN_LIMITS: Record<ModelType, number> = {\n  'gpt-4': 8192,\n  'gpt-4-32k': 32768,\n  'gpt-4-turbo': 128000,\n  'gpt-4o': 128000,\n  'gpt-3.5-turbo': 4096,\n  'gpt-3.5-turbo-16k': 16384,\n  'claude-3-opus': 200000,\n  'claude-3-sonnet': 200000,\n  'claude-3-haiku': 200000,\n  'claude-3-5-sonnet': 200000,\n  'claude-3-5-haiku': 200000,\n};\n\n/**\n * Model encoding mapping for tiktoken\n */\nexport const MODEL_ENCODING_MAP: Record<string, string> = {\n  'gpt-4': 'cl100k_base',\n  'gpt-4-32k': 'cl100k_base',\n  'gpt-4-turbo': 'cl100k_base',\n  'gpt-4o': 'o200k_base',\n  'gpt-3.5-turbo': 'cl100k_base',\n  'gpt-3.5-turbo-16k': 'cl100k_base',\n  'claude-3-opus': 'cl100k_base',\n  'claude-3-sonnet': 'cl100k_base',\n  'claude-3-haiku': 'cl100k_base',\n  'claude-3-5-sonnet': 'cl100k_base',\n  'claude-3-5-haiku': 'cl100k_base',\n};\n","/**\n * Token counting utilities using tiktoken (Node.js) or fallback approximation (browser)\n */\n\nimport {\n  ContextMessage,\n  ModelType,\n  TokenCount,\n  MODEL_ENCODING_MAP,\n} from './types';\n\n// Lazy-loaded tiktoken (only in Node.js environments)\nlet tiktokenModule: typeof import('tiktoken') | null = null;\nlet tiktokenLoadAttempted = false;\n\n/**\n * Attempt to load tiktoken (Node.js only)\n * Returns null in browser environments\n */\nasync function loadTiktoken(): Promise<typeof import('tiktoken') | null> {\n  if (tiktokenLoadAttempted) {\n    return tiktokenModule;\n  }\n\n  tiktokenLoadAttempted = true;\n\n  try {\n    // Check if we're in a Node.js environment\n    if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n      tiktokenModule = await import('tiktoken');\n      return tiktokenModule;\n    }\n  } catch (error) {\n    // Silently fail in browser environments or if tiktoken is not installed\n    console.debug('tiktoken not available, using fallback token counter');\n  }\n\n  return null;\n}\n\n/**\n * Browser-compatible approximate token counter\n * Uses character-based estimation (approximately 4 chars per token)\n */\nclass FallbackTokenCounter {\n  private readonly CHARS_PER_TOKEN = 4;\n\n  /**\n   * Count tokens in a string (approximate)\n   */\n  countStringTokens(text: string): number {\n    if (!text) return 0;\n    return Math.ceil(text.length / this.CHARS_PER_TOKEN);\n  }\n\n  /**\n   * Count tokens in a message with estimated breakdown\n   */\n  countMessageTokens(message: ContextMessage): TokenCount {\n    const breakdown = {\n      role: 0,\n      name: 0,\n      content: 0,\n      functionCall: 0,\n      toolCalls: 0,\n    };\n\n    // Every message has overhead (start, role, end tokens)\n    let tokens = 3;\n\n    // Role tokens\n    breakdown.role = Math.ceil(message.role.length / this.CHARS_PER_TOKEN);\n    tokens += breakdown.role;\n\n    // Name tokens\n    if (message.name) {\n      breakdown.name = Math.ceil(message.name.length / this.CHARS_PER_TOKEN) + 1;\n      tokens += breakdown.name;\n    }\n\n    // Content tokens\n    if (message.content) {\n      breakdown.content = this.countStringTokens(message.content);\n      tokens += breakdown.content;\n    }\n\n    // Function call tokens\n    if (message.function_call) {\n      const fnName = this.countStringTokens(message.function_call.name);\n      const fnArgs = this.countStringTokens(message.function_call.arguments);\n      breakdown.functionCall = fnName + fnArgs + 3;\n      tokens += breakdown.functionCall;\n    }\n\n    // Tool calls tokens\n    if (message.tool_calls && message.tool_calls.length > 0) {\n      for (const toolCall of message.tool_calls) {\n        const toolId = this.countStringTokens(toolCall.id);\n        const toolType = this.countStringTokens(toolCall.type);\n        const fnName = this.countStringTokens(toolCall.function.name);\n        const fnArgs = this.countStringTokens(toolCall.function.arguments);\n        breakdown.toolCalls += toolId + toolType + fnName + fnArgs + 5;\n      }\n      tokens += breakdown.toolCalls;\n    }\n\n    // Tool call response overhead\n    if (message.tool_call_id) {\n      tokens += this.countStringTokens(message.tool_call_id) + 2;\n    }\n\n    return {\n      tokens,\n      characters: 0,\n      breakdown,\n    };\n  }\n}\n\n/**\n * TokenCounter class for accurate token counting\n * Automatically uses tiktoken in Node.js or fallback in browsers\n */\nexport class TokenCounter {\n  private encoders: Map<string, any> = new Map();\n  private tiktokenReady = false;\n  private fallbackCounter = new FallbackTokenCounter();\n  private initPromise: Promise<void> | null = null;\n\n  /**\n   * Initialize tiktoken (lazy loading)\n   */\n  private async init(): Promise<void> {\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n\n    this.initPromise = (async () => {\n      const tiktoken = await loadTiktoken();\n      this.tiktokenReady = tiktoken !== null;\n    })();\n\n    return this.initPromise;\n  }\n\n  /**\n   * Get or create encoder for a model (sync - uses fallback if tiktoken not ready)\n   */\n  private getEncoderSync(model: ModelType): any {\n    if (!this.tiktokenReady || !tiktokenModule) {\n      return null;\n    }\n\n    const encodingName = MODEL_ENCODING_MAP[model] || 'cl100k_base';\n\n    if (!this.encoders.has(encodingName)) {\n      try {\n        const encoder = tiktokenModule.encoding_for_model(model as any);\n        this.encoders.set(encodingName, encoder);\n      } catch (error) {\n        // Fallback to cl100k_base if model-specific encoding fails\n        try {\n          const encoder = tiktokenModule.encoding_for_model('gpt-4' as any);\n          this.encoders.set(encodingName, encoder);\n        } catch (e) {\n          return null;\n        }\n      }\n    }\n\n    return this.encoders.get(encodingName) || null;\n  }\n\n  /**\n   * Count tokens in a string\n   */\n  countStringTokens(text: string, model: ModelType): number {\n    if (!text) return 0;\n\n    const encoder = this.getEncoderSync(model);\n    if (!encoder) {\n      // Use fallback\n      return this.fallbackCounter.countStringTokens(text);\n    }\n\n    return encoder.encode(text).length;\n  }\n\n  /**\n   * Count tokens in a message with detailed breakdown\n   */\n  countMessageTokens(message: ContextMessage, model: ModelType): TokenCount {\n    const encoder = this.getEncoderSync(model);\n\n    if (!encoder) {\n      // Use fallback counter\n      return this.fallbackCounter.countMessageTokens(message);\n    }\n\n    const breakdown = {\n      role: 0,\n      name: 0,\n      content: 0,\n      functionCall: 0,\n      toolCalls: 0,\n    };\n\n    // Every message follows <|start|>{role/name}\\n{content}<|end|>\\n\n    let tokens = 3; // start, role, end tokens\n\n    // Role tokens\n    breakdown.role = encoder.encode(message.role).length;\n    tokens += breakdown.role;\n\n    // Name tokens\n    if (message.name) {\n      breakdown.name = encoder.encode(message.name).length + 1; // +1 for name prefix\n      tokens += breakdown.name;\n    }\n\n    // Content tokens\n    if (message.content) {\n      breakdown.content = encoder.encode(message.content).length;\n      tokens += breakdown.content;\n    }\n\n    // Function call tokens (legacy format)\n    if (message.function_call) {\n      const fnName = encoder.encode(message.function_call.name).length;\n      const fnArgs = encoder.encode(message.function_call.arguments).length;\n      breakdown.functionCall = fnName + fnArgs + 3; // +3 for structure tokens\n      tokens += breakdown.functionCall;\n    }\n\n    // Tool calls tokens\n    if (message.tool_calls && message.tool_calls.length > 0) {\n      for (const toolCall of message.tool_calls) {\n        const toolId = encoder.encode(toolCall.id).length;\n        const toolType = encoder.encode(toolCall.type).length;\n        const fnName = encoder.encode(toolCall.function.name).length;\n        const fnArgs = encoder.encode(toolCall.function.arguments).length;\n        breakdown.toolCalls += toolId + toolType + fnName + fnArgs + 5; // +5 for structure tokens\n      }\n      tokens += breakdown.toolCalls;\n    }\n\n    // Tool call response overhead\n    if (message.tool_call_id) {\n      tokens += encoder.encode(message.tool_call_id).length + 2;\n    }\n\n    return {\n      tokens,\n      characters: 0, // Not tracked in this implementation\n      breakdown,\n    };\n  }\n\n  /**\n   * Count tokens for an array of messages\n   */\n  countMessagesTokens(messages: ContextMessage[], model: ModelType): number {\n    let total = 0;\n    for (const message of messages) {\n      total += this.countMessageTokens(message, model).tokens;\n    }\n    // Add overhead for message list\n    total += 3; // every reply is primed with <|start|>assistant<|message|>\n    return total;\n  }\n\n  /**\n   * Estimate tokens remaining after adding a message\n   */\n  estimateRemainingTokens(\n    messages: ContextMessage[],\n    maxTokens: number,\n    model: ModelType\n  ): number {\n    const used = this.countMessagesTokens(messages, model);\n    return Math.max(0, maxTokens - used);\n  }\n\n  /**\n   * Check if adding a message would exceed token limit\n   */\n  wouldExceedLimit(\n    messages: ContextMessage[],\n    newMessage: ContextMessage,\n    maxTokens: number,\n    model: ModelType\n  ): boolean {\n    const currentTokens = this.countMessagesTokens(messages, model);\n    const newTokens = this.countMessageTokens(newMessage, model).tokens;\n    return currentTokens + newTokens > maxTokens;\n  }\n\n  /**\n   * Find the index where messages would exceed token limit\n   */\n  findTokenLimitIndex(\n    messages: ContextMessage[],\n    maxTokens: number,\n    model: ModelType,\n    fromEnd: boolean = true\n  ): number {\n    let totalTokens = 3; // base overhead\n    const messagesToCheck = fromEnd ? [...messages].reverse() : messages;\n\n    for (let i = 0; i < messagesToCheck.length; i++) {\n      const message = messagesToCheck[i];\n      if (!message) continue;\n      const messageTokens = this.countMessageTokens(message, model).tokens;\n      totalTokens += messageTokens;\n\n      if (totalTokens > maxTokens) {\n        return fromEnd ? messages.length - i : i;\n      }\n    }\n\n    return fromEnd ? 0 : messages.length;\n  }\n\n  /**\n   * Free encoder resources\n   */\n  dispose(): void {\n    if (this.tiktokenReady) {\n      for (const encoder of this.encoders.values()) {\n        if (encoder && typeof encoder.free === 'function') {\n          encoder.free();\n        }\n      }\n    }\n    this.encoders.clear();\n  }\n\n  /**\n   * Check if tiktoken is available\n   */\n  isTiktokenAvailable(): boolean {\n    return this.tiktokenReady;\n  }\n\n  /**\n   * Preload tiktoken (optional, for better performance)\n   * Call this early in Node.js environments to ensure tiktoken is ready\n   */\n  async preload(): Promise<boolean> {\n    await this.init();\n    return this.tiktokenReady;\n  }\n}\n\n/**\n * Singleton instance for easy access\n */\nexport const tokenCounter = new TokenCounter();\n","/**\n * Context Manager with automatic truncation\n */\n\nimport { TokenCounter } from './TokenCounter';\nimport {\n  ContextMessage,\n  ContextConfig,\n  TokenUsage,\n  TruncationStrategy,\n  MessageImportance,\n  MODEL_TOKEN_LIMITS,\n} from './types';\n\n/**\n * Oldest-first truncation strategy\n * Removes oldest messages first while preserving system messages\n */\nclass OldestFirstStrategy implements TruncationStrategy {\n  name = 'oldest-first' as const;\n\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    _currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[] {\n    const counter = new TokenCounter();\n    const result: ContextMessage[] = [];\n    const preserveSystemMessages = config.preserveSystemMessages ?? true;\n    const preserveRecentCount = config.preserveRecentCount ?? 1;\n\n    // Separate system messages and regular messages\n    const systemMessages = preserveSystemMessages\n      ? messages.filter((m) => m.role === 'system')\n      : [];\n    const otherMessages = messages.filter((m) => m.role !== 'system');\n\n    // Always include system messages\n    result.push(...systemMessages);\n\n    // Calculate tokens used by system messages\n    let tokensUsed = counter.countMessagesTokens(systemMessages, config.model);\n\n    // Preserve recent messages\n    const recentMessages = otherMessages.slice(-preserveRecentCount);\n    const recentTokens = counter.countMessagesTokens(recentMessages, config.model);\n\n    // Add messages from end, skipping those we'll add as recent\n    const middleMessages = otherMessages.slice(0, -preserveRecentCount);\n\n    // Add middle messages from newest to oldest until we hit limit\n    for (let i = middleMessages.length - 1; i >= 0; i--) {\n      const message = middleMessages[i];\n      if (!message) continue;\n      const messageTokens = counter.countMessageTokens(message, config.model).tokens;\n\n      if (tokensUsed + messageTokens + recentTokens <= maxTokens) {\n        result.push(message);\n        tokensUsed += messageTokens;\n      }\n    }\n\n    // Add recent messages at the end\n    result.push(...recentMessages);\n\n    counter.dispose();\n\n    // Restore original order (system messages are already at start)\n    const nonSystemResult = result.filter((m) => m.role !== 'system');\n    return [...systemMessages, ...nonSystemResult.sort((a, b) => {\n      return messages.indexOf(a) - messages.indexOf(b);\n    })];\n  }\n}\n\n/**\n * Sliding window truncation strategy\n * Keeps first N and last M messages\n */\nclass SlidingWindowStrategy implements TruncationStrategy {\n  name = 'sliding-window' as const;\n\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    _currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[] {\n    const counter = new TokenCounter();\n    const keepFirst = config.slidingWindowConfig?.keepFirst ?? 1;\n    const keepLast = config.slidingWindowConfig?.keepLast ?? 5;\n\n    // Separate system messages\n    const systemMessages = (config.preserveSystemMessages ?? true)\n      ? messages.filter((m) => m.role === 'system')\n      : [];\n    const otherMessages = messages.filter((m) => m.role !== 'system');\n\n    // Get first and last messages\n    const firstMessages = otherMessages.slice(0, keepFirst);\n    const lastMessages = otherMessages.slice(-keepLast);\n\n    // Combine and deduplicate\n    const combined = [...systemMessages, ...firstMessages];\n\n    for (const msg of lastMessages) {\n      if (!combined.includes(msg)) {\n        combined.push(msg);\n      }\n    }\n\n    // If still over limit, trim from the middle\n    let result = combined;\n    let tokensUsed = counter.countMessagesTokens(result, config.model);\n\n    while (tokensUsed > maxTokens && result.length > systemMessages.length + 2) {\n      // Remove from middle (after first, before last)\n      const middleIndex = systemMessages.length + Math.floor(\n        (result.length - systemMessages.length) / 2\n      );\n      result.splice(middleIndex, 1);\n      tokensUsed = counter.countMessagesTokens(result, config.model);\n    }\n\n    counter.dispose();\n    return result;\n  }\n}\n\n/**\n * Importance-based truncation strategy\n * Preserves messages based on importance level\n */\nclass ImportanceBasedStrategy implements TruncationStrategy {\n  name = 'importance-based' as const;\n\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    _currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[] {\n    const counter = new TokenCounter();\n    const importanceOrder = [\n      MessageImportance.SYSTEM,\n      MessageImportance.CRITICAL,\n      MessageImportance.HIGH,\n      MessageImportance.NORMAL,\n      MessageImportance.LOW,\n    ];\n\n    // Group messages by importance\n    const grouped = new Map<MessageImportance, ContextMessage[]>();\n    for (const importance of importanceOrder) {\n      grouped.set(importance, []);\n    }\n\n    // Classify messages\n    for (const message of messages) {\n      const importance = message.importance ?? (\n        message.role === 'system'\n          ? MessageImportance.SYSTEM\n          : MessageImportance.NORMAL\n      );\n      grouped.get(importance)?.push(message);\n    }\n\n    // Add messages by importance until we hit the limit\n    const result: ContextMessage[] = [];\n    let tokensUsed = 0;\n\n    for (const importance of importanceOrder) {\n      const messagesOfImportance = grouped.get(importance) ?? [];\n\n      for (const message of messagesOfImportance) {\n        const messageTokens = counter.countMessageTokens(message, config.model).tokens;\n\n        if (tokensUsed + messageTokens <= maxTokens) {\n          result.push(message);\n          tokensUsed += messageTokens;\n        } else if (importance === MessageImportance.SYSTEM || importance === MessageImportance.CRITICAL) {\n          // Always include system and critical messages, even if over limit\n          result.push(message);\n          tokensUsed += messageTokens;\n        }\n      }\n    }\n\n    counter.dispose();\n\n    // Restore original order\n    return result.sort((a, b) => messages.indexOf(a) - messages.indexOf(b));\n  }\n}\n\n/**\n * Least relevant truncation strategy (using embeddings if available)\n * Falls back to oldest-first if no embeddings\n */\nclass LeastRelevantStrategy implements TruncationStrategy {\n  name = 'least-relevant' as const;\n\n  /**\n   * Calculate cosine similarity between two vectors\n   */\n  private cosineSimilarity(a: number[], b: number[]): number {\n    if (a.length !== b.length) return 0;\n\n    let dotProduct = 0;\n    let normA = 0;\n    let normB = 0;\n\n    for (let i = 0; i < a.length; i++) {\n      const aVal = a[i];\n      const bVal = b[i];\n      if (aVal === undefined || bVal === undefined) continue;\n      dotProduct += aVal * bVal;\n      normA += aVal * aVal;\n      normB += bVal * bVal;\n    }\n\n    const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n    return denominator === 0 ? 0 : dotProduct / denominator;\n  }\n\n  truncate(\n    messages: ContextMessage[],\n    maxTokens: number,\n    _currentTokens: number,\n    config: ContextConfig\n  ): ContextMessage[] {\n    const counter = new TokenCounter();\n    const preserveSystemMessages = config.preserveSystemMessages ?? true;\n    const preserveRecentCount = config.preserveRecentCount ?? 2;\n\n    // Check if we have embeddings\n    const hasEmbeddings = messages.some((m) => m.embedding && m.embedding.length > 0);\n\n    if (!hasEmbeddings) {\n      // Fallback to oldest-first strategy\n      const strategy = new OldestFirstStrategy();\n      return strategy.truncate(messages, maxTokens, _currentTokens, config);\n    }\n\n    // Separate messages\n    const systemMessages = preserveSystemMessages\n      ? messages.filter((m) => m.role === 'system')\n      : [];\n    const otherMessages = messages.filter((m) => m.role !== 'system');\n\n    // Get recent messages (to preserve and use as context for relevance)\n    const recentMessages = otherMessages.slice(-preserveRecentCount);\n    const middleMessages = otherMessages.slice(0, -preserveRecentCount);\n\n    // Calculate average embedding of recent messages\n    const recentEmbeddings = recentMessages\n      .filter((m) => m.embedding)\n      .map((m) => m.embedding!);\n\n    let avgEmbedding: number[] | null = null;\n    if (recentEmbeddings.length > 0 && recentEmbeddings[0]) {\n      const embeddingLength = recentEmbeddings[0].length;\n      avgEmbedding = new Array(embeddingLength).fill(0);\n\n      for (const embedding of recentEmbeddings) {\n        if (!embedding) continue;\n        for (let i = 0; i < embeddingLength; i++) {\n          const val = embedding[i];\n          const avgVal = avgEmbedding[i];\n          if (val !== undefined && avgVal !== undefined) {\n            avgEmbedding[i] = avgVal + val;\n          }\n        }\n      }\n\n      for (let i = 0; i < embeddingLength; i++) {\n        const avgVal = avgEmbedding[i];\n        if (avgVal !== undefined) {\n          avgEmbedding[i] = avgVal / recentEmbeddings.length;\n        }\n      }\n    }\n\n    // Score messages by relevance to recent context\n    const scoredMessages = middleMessages.map((message) => {\n      let relevanceScore = 0;\n\n      if (avgEmbedding && message.embedding) {\n        relevanceScore = this.cosineSimilarity(message.embedding, avgEmbedding);\n      }\n\n      return { message, score: relevanceScore };\n    });\n\n    // Sort by relevance (highest first)\n    scoredMessages.sort((a, b) => b.score - a.score);\n\n    // Build result with most relevant messages\n    const result: ContextMessage[] = [...systemMessages];\n    let tokensUsed = counter.countMessagesTokens(systemMessages, config.model);\n    const recentTokens = counter.countMessagesTokens(recentMessages, config.model);\n\n    // Add most relevant messages until we hit limit\n    for (const { message } of scoredMessages) {\n      const messageTokens = counter.countMessageTokens(message, config.model).tokens;\n\n      if (tokensUsed + messageTokens + recentTokens <= maxTokens) {\n        result.push(message);\n        tokensUsed += messageTokens;\n      }\n    }\n\n    // Add recent messages\n    result.push(...recentMessages);\n\n    counter.dispose();\n\n    // Restore original order\n    return result.sort((a, b) => messages.indexOf(a) - messages.indexOf(b));\n  }\n}\n\n/**\n * Context Manager for automatic context truncation\n */\nexport class ContextManager {\n  private config: ContextConfig;\n  private counter: TokenCounter;\n  private strategies: Map<string, TruncationStrategy>;\n\n  constructor(config: ContextConfig) {\n    this.config = {\n      reservedTokens: 1000,\n      preserveSystemMessages: true,\n      preserveRecentCount: 1,\n      warningThreshold: 0.8,\n      truncationStrategy: 'oldest-first',\n      ...config,\n    };\n\n    this.counter = new TokenCounter();\n\n    // Initialize strategies\n    this.strategies = new Map<string, TruncationStrategy>();\n    this.strategies.set('oldest-first', new OldestFirstStrategy());\n    this.strategies.set('sliding-window', new SlidingWindowStrategy());\n    this.strategies.set('importance-based', new ImportanceBasedStrategy());\n    this.strategies.set('least-relevant', new LeastRelevantStrategy());\n  }\n\n  /**\n   * Get current token usage\n   */\n  getTokenUsage(messages: ContextMessage[]): TokenUsage {\n    const messageTokens = this.counter.countMessagesTokens(messages, this.config.model);\n    const reservedTokens = this.config.reservedTokens ?? 1000;\n    const maxTokens = this.config.maxTokens;\n\n    return {\n      totalTokens: messageTokens,\n      messageTokens: messageTokens,\n      overheadTokens: 3, // base overhead\n      remainingTokens: Math.max(0, maxTokens - messageTokens - reservedTokens),\n    };\n  }\n\n  /**\n   * Check if messages need truncation\n   */\n  needsTruncation(messages: ContextMessage[]): boolean {\n    const usage = this.getTokenUsage(messages);\n    const maxTokens = this.config.maxTokens - (this.config.reservedTokens ?? 1000);\n    return usage.totalTokens > maxTokens;\n  }\n\n  /**\n   * Check if approaching token limit\n   */\n  isApproachingLimit(messages: ContextMessage[]): boolean {\n    const usage = this.getTokenUsage(messages);\n    const maxTokens = this.config.maxTokens - (this.config.reservedTokens ?? 1000);\n    const threshold = this.config.warningThreshold ?? 0.8;\n    return usage.totalTokens >= maxTokens * threshold;\n  }\n\n  /**\n   * Truncate messages using configured strategy\n   */\n  truncate(messages: ContextMessage[]): ContextMessage[] {\n    const maxTokens = this.config.maxTokens - (this.config.reservedTokens ?? 1000);\n    const currentTokens = this.counter.countMessagesTokens(messages, this.config.model);\n\n    // Check if truncation is needed\n    if (currentTokens <= maxTokens) {\n      return messages;\n    }\n\n    // Get strategy\n    let strategy: TruncationStrategy;\n\n    if (this.config.truncationStrategy === 'custom' && this.config.customTruncationFn) {\n      // Use custom function\n      const result = this.config.customTruncationFn(messages, maxTokens);\n      if (this.config.onTruncate) {\n        const removed = messages.filter((m) => !result.includes(m));\n        this.config.onTruncate(removed, result);\n      }\n      return result;\n    } else {\n      strategy = this.strategies.get(this.config.truncationStrategy ?? 'oldest-first')!;\n    }\n\n    // Execute truncation\n    const result = strategy.truncate(messages, maxTokens, currentTokens, this.config);\n\n    // Callback\n    if (this.config.onTruncate) {\n      const removed = messages.filter((m) => !result.includes(m));\n      this.config.onTruncate(removed, result);\n    }\n\n    return result;\n  }\n\n  /**\n   * Add message with automatic truncation\n   */\n  addMessage(\n    messages: ContextMessage[],\n    newMessage: ContextMessage\n  ): ContextMessage[] {\n    const updatedMessages = [...messages, newMessage];\n\n    // Check for warning threshold\n    if (this.isApproachingLimit(updatedMessages) && this.config.onWarning) {\n      const usage = this.getTokenUsage(updatedMessages);\n      this.config.onWarning(usage);\n    }\n\n    // Truncate if needed\n    if (this.needsTruncation(updatedMessages)) {\n      return this.truncate(updatedMessages);\n    }\n\n    return updatedMessages;\n  }\n\n  /**\n   * Add multiple messages with automatic truncation\n   */\n  addMessages(\n    messages: ContextMessage[],\n    newMessages: ContextMessage[]\n  ): ContextMessage[] {\n    let result = messages;\n\n    for (const message of newMessages) {\n      result = this.addMessage(result, message);\n    }\n\n    return result;\n  }\n\n  /**\n   * Get maximum token limit for current model\n   */\n  getModelMaxTokens(): number {\n    return MODEL_TOKEN_LIMITS[this.config.model] ?? 8192;\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(config: Partial<ContextConfig>): void {\n    this.config = { ...this.config, ...config };\n  }\n\n  /**\n   * Register a custom truncation strategy\n   */\n  registerStrategy(strategy: TruncationStrategy): void {\n    this.strategies.set(strategy.name, strategy);\n  }\n\n  /**\n   * Clean up resources\n   */\n  dispose(): void {\n    this.counter.dispose();\n  }\n}\n"]}