{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/utils/chunking.ts","../src/embeddings/openai.ts","../src/embeddings/voyage.ts","../src/embeddings/google.ts","../src/extraction/extractor.ts","../src/deduplication/merger.ts","../src/deduplication/resolve-config.ts","../src/deduplication/specificity.ts","../src/deduplication/upsert-fact.ts","../src/storage/pglite-disk.stub.ts","../src/storage/pglite.ts","../src/memory-browser.ts","../src/utils/cosine.ts"],"names":["z","OpenAI","vector","MODEL_DIMENSIONS","MAX_BATCH","DEFAULT_MODEL","PGlite"],"mappings":";;;;;;;;;;;;AAKO,IAAM,aAAA,GAAgBA,MAAE,MAAA,CAAO;AAAA,EACpC,IAAA,EAAMA,MAAE,IAAA,CAAK,CAAC,QAAQ,WAAA,EAAa,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,EACpD,OAAA,EAASA,MAAE,MAAA;AACb,CAAC;AAGM,IAAM,cAAA,GAAiBA,KAAA,CAAE,KAAA,CAAM,aAAa;AAqC5C,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACxB,CAAC;;;ACpCM,IAAM,aAAA,GAAN,MAAM,cAAA,SAAsB,KAAA,CAAM;AAAA,EAC9B,IAAA;AAAA,EACS,KAAA;AAAA,EAElB,WAAA,CAAY,IAAA,EAAyB,OAAA,EAAiB,OAAA,EAA+B;AACnF,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAS,KAAA;AACtB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,cAAA,CAAc,SAAS,CAAA;AAAA,EACrD;AACF;AAEO,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAA4B,aAAA,CAAc;AAAA,EACrD,WAAA,CAAY,UAAU,8DAAA,EAAgE;AACpF,IAAA,KAAA,CAAM,mBAAmB,OAAO,CAAA;AAChC,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,oBAAA,CAAoB,SAAS,CAAA;AAAA,EAC3D;AACF;AAEO,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuB,aAAA,CAAc;AAAA,EAChD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,kBAAA,EAAoB,SAAS,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,eAAA,CAAe,SAAS,CAAA;AAAA,EACtD;AACF;AAEO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,aAAA,CAAc;AAAA,EAC9C,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,gBAAA,EAAkB,SAAS,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,aAAA,CAAa,SAAS,CAAA;AAAA,EACpD;AACF;AAEO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,aAAA,CAAc;AAAA,EACjD,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,mBAAA,EAAqB,SAAS,OAAO,CAAA;AAC3C,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,gBAAA,CAAgB,SAAS,CAAA;AAAA,EACvD;AACF;AAEO,IAAM,sBAAA,GAAN,MAAM,uBAAA,SAA+B,aAAA,CAAc;AAAA,EACxD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,sBAAsB,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,uBAAA,CAAuB,SAAS,CAAA;AAAA,EAC9D;AACF;AAEO,IAAM,WAAA,GAAN,MAAM,YAAA,SAAoB,aAAA,CAAc;AAAA,EAC7C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,kBAAkB,OAAO,CAAA;AAC/B,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,YAAA,CAAY,SAAS,CAAA;AAAA,EACnD;AACF;;;ACrEO,SAAS,UAAA,CAAc,OAAY,IAAA,EAAqB;AAC7D,EAAA,IAAI,IAAA,IAAQ,CAAA,EAAG,MAAM,IAAI,MAAM,uCAAuC,CAAA;AACtE,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,IAAA,EAAM;AAC3C,IAAA,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,iBAAiB,QAAA,EAA6B;AAC5D,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACjE;;;ACfA,IAAM,gBAAA,GAA2C;AAAA,EAC/C,wBAAA,EAA0B,IAAA;AAAA,EAC1B,wBAAA,EAA0B,IAAA;AAAA,EAC1B,wBAAA,EAA0B;AAC5B,CAAA;AAEA,IAAM,SAAA,GAAY,GAAA;AAeX,IAAM,yBAAN,MAAyD;AAAA,EACrD,UAAA;AAAA,EACQ,MAAA;AAAA,EACA,KAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,wBAAA;AAE9B,IAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,UAAA,IAAc,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAC5E,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,CAAA,gCAAA,EAAmC,KAAK,KAAK,CAAA,yCAAA;AAAA,OAC/C;AAAA,IACF;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,kBAAA;AAElB,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,cAAA;AAC7C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,WAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,IAAIC,uBAAA,CAAO,EAAE,QAAQ,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAA;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,IAAA,EAAiC;AAC3C,IAAA,MAAM,CAACC,OAAM,CAAA,GAAI,MAAM,KAAK,UAAA,CAAW,CAAC,IAAI,CAAC,CAAA;AAC7C,IAAA,OAAOA,OAAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,KAAA,EAAsC;AACrD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEhC,IAAA,IAAI;AAEF,MAAA,IAAI,KAAA,CAAM,UAAU,SAAA,EAAW;AAC7B,QAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,EAAO,SAAS,CAAA;AAC3C,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAC,CAAC,CAAA;AACvF,MAAA,OAAO,QAAQ,IAAA,EAAK;AAAA,IACtB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,gBAAgB,MAAM,KAAA;AAC3C,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,iCAAA,EAAqC,MAAgB,OAAO,CAAA,CAAA;AAAA,QAC5D,EAAE,OAAO,KAAA;AAAM,OACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkB,KAAA,EAAsC;AACpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,WAAW,MAAA,CAAO;AAAA,MACnD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ;AAAA,KACD,CAAA;AAGD,IAAA,OAAO,SAAS,IAAA,CACb,KAAA,EAAM,CACN,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA,CAChC,IAAI,CAAC,IAAA,KAAS,KAAK,SAAqB,CAAA;AAAA,EAC7C;AACF;;;ACzFA,IAAMC,iBAAAA,GAA2C;AAAA,EAC/C,YAAA,EAAc,IAAA;AAAA,EACd,iBAAA,EAAmB,IAAA;AAAA,EACnB,gBAAA,EAAkB,IAAA;AAAA,EAClB,UAAA,EAAY,IAAA;AAAA,EACZ,gBAAA,EAAkB,IAAA;AAAA,EAClB,eAAA,EAAiB,IAAA;AAAA,EACjB,eAAA,EAAiB;AACnB,CAAA;AAEA,IAAM,aAAA,GAAgB,UAAA;AACtB,IAAM,gBAAA,GAAmB,wCAAA;AACzB,IAAMC,UAAAA,GAAY,GAAA;AAqCX,IAAM,yBAAN,MAAyD;AAAA,EACrD,UAAA;AAAA,EACQ,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,aAAA;AAC9B,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA,IAAcD,iBAAAA,CAAiB,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA;AAExE,IAAA,IAAA,CAAK,eAAA,GACH,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,KAAeA,kBAAiB,IAAA,CAAK,KAAK,CAAA,GACpE,OAAA,CAAQ,UAAA,GACR,MAAA;AACN,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,OAAA,IAAW,gBAAA;AACnC,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAe,UAAA,CAAoC,KAAA;AAE5E,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,cAAA;AAC7C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,WAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,MAAM,IAAA,EAAiC;AAC3C,IAAA,MAAM,CAACD,OAAM,CAAA,GAAI,MAAM,KAAK,UAAA,CAAW,CAAC,IAAI,CAAC,CAAA;AAC7C,IAAA,OAAOA,OAAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,KAAA,EAAsC;AACrD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEhC,IAAA,IAAI;AACF,MAAA,IAAI,KAAA,CAAM,UAAUE,UAAAA,EAAW;AAC7B,QAAA,OAAO,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,EAAOA,UAAS,CAAA;AAC3C,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAC,CAAC,CAAA;AACvF,MAAA,OAAO,QAAQ,IAAA,EAAK;AAAA,IACtB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,gBAAgB,MAAM,KAAA;AAC3C,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,iCAAA,EAAqC,MAAgB,OAAO,CAAA,CAAA;AAAA,QAC5D,EAAE,OAAO,KAAA;AAAM,OACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkB,KAAA,EAAsC;AACpE,IAAA,MAAM,IAAA,GAAgC,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,KAAA,EAAM;AACjE,IAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,eAAA;AACvD,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,SAAA;AAE3C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,QAAA,EAAU;AAAA,MACnD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,QACpC,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACnD,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,4CAAA,EAA+C,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,MAAM,CAAA;AAAA,OAC3E;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAElC,IAAA,OAAO,KAAK,IAAA,CACT,KAAA,EAAM,CACN,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA,CAChC,IAAI,CAAC,IAAA,KAAS,KAAK,SAAS,CAAA;AAAA,EACjC;AACF;;;ACrIA,IAAMC,cAAAA,GAAgB,sBAAA;AACtB,IAAM,kBAAA,GAAqB,IAAA;AAC3B,IAAM,gBAAA,GAAmB,kDAAA;AAWzB,SAAS,UAAUH,OAAAA,EAA4B;AAC7C,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,KAAA,IAASA,OAAAA,EAAQ,UAAA,IAAc,KAAA,GAAQ,KAAA;AAClD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AACtC,EAAA,IAAI,SAAA,KAAc,GAAG,OAAOA,OAAAA;AAC5B,EAAA,OAAOA,OAAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,QAAQ,SAAS,CAAA;AAChD;AAgBO,IAAM,yBAAN,MAAyD;AAAA,EACrD,UAAA;AAAA,EACQ,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAASG,cAAAA;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,kBAAA;AACxC,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtE,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAe,UAAA,CAAoC,KAAA;AAE5E,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,IAAU,QAAQ,GAAA,CAAI,cAAA,IAAkB,QAAQ,GAAA,CAAI,cAAA;AAC3E,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,WAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,IAAY,oBAAA,GAA2C;AACrD,IAAA,OAAO,IAAA,CAAK,UAAA,KAAe,kBAAA,GAAqB,MAAA,GAAY,IAAA,CAAK,UAAA;AAAA,EACnE;AAAA,EAEA,MAAM,MAAM,IAAA,EAAiC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,QAAA,EAAW,KAAK,KAAK,CAAA,aAAA,CAAA;AAChD,MAAA,MAAM,IAAA,GAAgC;AAAA,QACpC,SAAS,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,CAAA;AAAE,OAC/B;AACA,MAAA,IAAI,IAAA,CAAK,oBAAA,EAAsB,IAAA,CAAK,oBAAA,GAAuB,IAAA,CAAK,oBAAA;AAChE,MAAA,IAAI,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA;AAExC,MAAA,MAAM,IAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC1C,MAAA,OAAO,SAAA,CAAU,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,gBAAgB,MAAM,KAAA;AAC3C,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,iCAAA,EAAqC,MAAgB,OAAO,CAAA,CAAA;AAAA,QAC5D,EAAE,OAAO,KAAA;AAAM,OACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,KAAA,EAAsC;AACrD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEhC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,QAAA,EAAW,KAAK,KAAK,CAAA,mBAAA,CAAA;AAChD,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnC,QAAA,MAAM,GAAA,GAA+B;AAAA,UACnC,KAAA,EAAO,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,UAC3B,SAAS,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,CAAA;AAAE,SAC/B;AACA,QAAA,IAAI,IAAA,CAAK,oBAAA,EAAsB,GAAA,CAAI,oBAAA,GAAuB,IAAA,CAAK,oBAAA;AAC/D,QAAA,IAAI,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,QAAA,GAAW,IAAA,CAAK,QAAA;AACvC,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,MAAM,OAAQ,MAAM,IAAA,CAAK,QAAQ,GAAA,EAAK,EAAE,UAAU,CAAA;AAClD,MAAA,OAAO,IAAA,CAAK,WAAW,GAAA,CAAI,CAAC,SAAS,SAAA,CAAU,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,gBAAgB,MAAM,KAAA;AAC3C,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,iCAAA,EAAqC,MAAgB,OAAO,CAAA,CAAA;AAAA,QAC5D,EAAE,OAAO,KAAA;AAAM,OACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,OAAA,CAAQ,GAAA,EAAa,IAAA,EAAiD;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,MACzC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,kBAAkB,IAAA,CAAK,MAAA;AAAA,QACvB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACnD,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,4CAAA,EAA+C,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,MAAM,CAAA;AAAA,OAC3E;AAAA,IACF;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AACF;;;AChIO,IAAM,wBAAA,GAA2B,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,sFAAA;AAkBjC,SAAS,WAAW,GAAA,EAAuB;AAChD,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,IAAI,IAAA,GAAO,IAAI,IAAA,EAAK;AAGpB,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAC7D,EAAA,IAAI,UAAA,EAAY,IAAA,GAAO,UAAA,CAAW,CAAC,EAAE,IAAA,EAAK;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAAA,IACvF;AAEA,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,MAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,MAAiC,CAAA,EAAG;AACpE,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,UAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAC3C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAC,CAAC,CAAA;AAChD,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,UAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAAA,QACvF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAC;AACV;AAaO,IAAM,YAAN,MAAgB;AAAA,EACJ,MAAA;AAAA,EACA,UAAA;AAAA,EAEjB,YAAY,OAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA,IAAc,IAAA,CAAK,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,QAAQ,QAAA,EAAwC;AACpD,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEnC,IAAA,MAAM,UAAA,GAAa,iBAAiB,QAAQ,CAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,CAAA;AAAA,EAAkB,UAAU,CAAA,CAAA;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,0BAA0B,IAAI,CAAA;AAChE,MAAA,OAAO,WAAW,GAAG,CAAA;AAAA,IACvB,SAAS,KAAA,EAAO;AAGd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6CAAA,EAAiD,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AACvF,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,iBAAA,CAAkB,MAAA,EAAgB,IAAA,EAA+B;AAC7E,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACrC,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,WAAA,EAAa;AACxC,MAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACrC,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,MAAM,IAAI,WAAA,CAAY,CAAA,iCAAA,EAAoC,IAAA,CAAK,MAAA,CAAO,QAAkB,CAAA,CAAE,CAAA;AAAA,EAC5F;AAAA,EAEA,MAAc,gBAAA,CAAiB,MAAA,EAAgB,IAAA,EAA+B;AAC5E,IAAA,MAAM,EAAE,OAAA,EAASJ,OAAAA,EAAO,GAAI,MAAM,OAAO,QAAQ,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,QAAQ,GAAA,CAAI,cAAA;AACjD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,YAAY,iDAAiD,CAAA;AAAA,IACzE;AACA,IAAA,MAAM,MAAA,GAAS,IAAIA,OAAAA,CAAO,EAAE,QAAQ,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA;AAClE,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACpD,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,WAAA,EAAa,CAAA;AAAA,MACb,QAAA,EAAU;AAAA,QACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAO;AAAA,QAClC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA;AAAK;AAChC,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,EAClD;AAAA,EAEA,MAAc,mBAAA,CAAoB,MAAA,EAAgB,IAAA,EAA+B;AAC/E,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AACF,MAAA,SAAA,GAAA,CAAa,MAAM,OAAO,mBAAmB,CAAA,EAAG,OAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,WAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,QAAQ,GAAA,CAAI,iBAAA;AACjD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,YAAY,oDAAoD,CAAA;AAAA,IAC5E;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,EAAE,QAAQ,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO;AAAA,MAC5C,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,CAAA;AAAA,MACb,MAAA;AAAA,MACA,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM;AAAA,KAC3C,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AAChC,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,SAAe,KAAA,CAAM,IAAA;AACjD,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAc,gBAAA,CAAiB,MAAA,EAAgB,IAAA,EAA+B;AAC5E,IAAA,MAAM,MAAA,GACJ,KAAK,MAAA,CAAO,MAAA,IAAU,QAAQ,GAAA,CAAI,cAAA,IAAkB,QAAQ,GAAA,CAAI,cAAA;AAClE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,YAAY,iDAAiD,CAAA;AAAA,IACzE;AACA,IAAA,MAAM,WACJ,IAAA,CAAK,MAAA,CAAO,WAAW,kDAAA,EACvB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnB,IAAA,MAAM,MAAM,CAAA,EAAG,OAAO,CAAA,QAAA,EAAW,IAAA,CAAK,OAAO,KAAK,CAAA,gBAAA,CAAA;AAElD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,gBAAA,EAAkB,MAAA;AAAA,QAClB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,kBAAA,EAAoB,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAE;AAAA,QAChD,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,CAAA;AAAA,QACpD,gBAAA,EAAkB,EAAE,WAAA,EAAa,CAAA;AAAE,OACpC;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,SAAS,MAAM,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AAAA,IAC9F;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAGlC,IAAA,OAAO,IAAA,CAAK,aAAa,CAAC,CAAA,EAAG,SAAS,KAAA,GAAQ,CAAC,GAAG,IAAA,IAAQ,EAAA;AAAA,EAC5D;AACF;;;AC1LO,IAAM,mBAAA,GAAsB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,wFAAA;AAmB5B,IAAM,SAAN,MAAa;AAAA,EACD,MAAA;AAAA,EACA,UAAA;AAAA,EAEjB,YAAY,OAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA,IAAc,IAAA,CAAK,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,SAAA,CAAU,aAAA,EAAyB,OAAA,EAAkC;AACzE,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG,OAAO,QAAQ,IAAA,EAAK;AAEpD,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,iBAAA;AAAA,MACA,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC/C,EAAA;AAAA,MACA,aAAa,OAAO,CAAA;AAAA,KACtB;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,qBAAqB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AACvE,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,EAAK;AACxB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,iBAAA,CAAkB,MAAA,EAAgB,IAAA,EAA+B;AAC7E,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACrC,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,WAAA,EAAa;AACxC,MAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACrC,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC3C;AACA,IAAA,MAAM,IAAI,WAAA,CAAY,CAAA,iCAAA,EAAoC,IAAA,CAAK,MAAA,CAAO,QAAkB,CAAA,CAAE,CAAA;AAAA,EAC5F;AAAA,EAEA,MAAc,gBAAA,CAAiB,MAAA,EAAgB,IAAA,EAA+B;AAC5E,IAAA,MAAM,EAAE,OAAA,EAASA,OAAAA,EAAO,GAAI,MAAM,OAAO,QAAQ,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,QAAQ,GAAA,CAAI,cAAA;AACjD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,YAAY,4CAA4C,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,MAAA,GAAS,IAAIA,OAAAA,CAAO,EAAE,QAAQ,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA;AAClE,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACpD,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,WAAA,EAAa,CAAA;AAAA,MACb,QAAA,EAAU;AAAA,QACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAO;AAAA,QAClC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA;AAAK;AAChC,KACD,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,EAClD;AAAA,EAEA,MAAc,mBAAA,CAAoB,MAAA,EAAgB,IAAA,EAA+B;AAC/E,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AACF,MAAA,SAAA,GAAA,CAAa,MAAM,OAAO,mBAAmB,CAAA,EAAG,OAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,WAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,QAAQ,GAAA,CAAI,iBAAA;AACjD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,YAAY,+CAA+C,CAAA;AAAA,IACvE;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,EAAE,QAAQ,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA;AACrE,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO;AAAA,MAC5C,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,CAAA;AAAA,MACb,MAAA;AAAA,MACA,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM;AAAA,KAC3C,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AAChC,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,MAAA,SAAe,KAAA,CAAM,IAAA;AACjD,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,MAAc,gBAAA,CAAiB,MAAA,EAAgB,IAAA,EAA+B;AAC5E,IAAA,MAAM,MAAA,GACJ,KAAK,MAAA,CAAO,MAAA,IAAU,QAAQ,GAAA,CAAI,cAAA,IAAkB,QAAQ,GAAA,CAAI,cAAA;AAClE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,YAAY,4CAA4C,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,WACJ,IAAA,CAAK,MAAA,CAAO,WAAW,kDAAA,EACvB,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnB,IAAA,MAAM,MAAM,CAAA,EAAG,OAAO,CAAA,QAAA,EAAW,IAAA,CAAK,OAAO,KAAK,CAAA,gBAAA,CAAA;AAElD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,gBAAA,EAAkB,MAAA;AAAA,QAClB,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,kBAAA,EAAoB,EAAE,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAE;AAAA,QAChD,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,CAAA;AAAA,QACpD,gBAAA,EAAkB,EAAE,WAAA,EAAa,CAAA;AAAE,OACpC;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAS,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,SAAS,MAAM,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AAAA,IACzF;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAGlC,IAAA,OAAO,IAAA,CAAK,aAAa,CAAC,CAAA,EAAG,SAAS,KAAA,GAAQ,CAAC,GAAG,IAAA,IAAQ,EAAA;AAAA,EAC5D;AACF;;;ACnIA,IAAM,iBAAA,GAAoB,IAAA;AAC1B,IAAM,mBAAA,GAAsB,CAAA;AAErB,SAAS,2BACd,MAAA,EAC6B;AAC7B,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,SAAA,EAAW,QAAQ,SAAA,IAAa,iBAAA;AAAA,IAChC,QAAA,EAAU,QAAQ,QAAA,IAAY,OAAA;AAAA,IAC9B,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,GAClC;AACF;;;ACrBA,SAAS,SAAS,IAAA,EAAwB;AACxC,EAAA,OAAO,IAAA,CACJ,IAAA,EAAK,CACL,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAC/B;AAEA,SAAS,eAAe,IAAA,EAA2B;AACjD,EAAA,OAAO,IAAI,GAAA;AAAA,IACT,QAAA,CAAS,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAY,CAAE,QAAQ,QAAA,EAAU,EAAE,CAAC,CAAA,CAChD,OAAO,OAAO;AAAA,GACnB;AACF;AAGO,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAEjC,EAAA,MAAM,MAAA,GAAS,SAAS,OAAO,CAAA;AAC/B,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAEhC,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,MAAA;AACrC,EAAA,MAAM,gBAAA,GAAmB,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,QAAQ,MAAM,CAAA;AAErD,EAAA,OAAO,OAAA,GAAU,gBAAA;AACnB;AAGO,SAAS,cAAA,CAAe,UAAkB,QAAA,EAA2B;AAC1E,EAAA,MAAM,cAAA,GAAiB,eAAe,QAAQ,CAAA;AAC9C,EAAA,MAAM,cAAA,GAAiB,eAAe,QAAQ,CAAA;AAE9C,EAAA,IAAI,cAAA,CAAe,IAAA,KAAS,CAAA,EAAG,OAAO,KAAA;AACtC,EAAA,IAAI,cAAA,CAAe,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAEtC,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAC/E,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,cAAc,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAC/E,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,cAAc,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,CAAA;AAG/E,EAAA,IAAI,oBAAoB,gBAAA,EAAkB;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,gBAAA,IAAoB,CAAC,gBAAA,EAAkB;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,cAAA,CAAe,IAAA,KAAS,cAAA,CAAe,IAAA,EAAM;AAC/C,IAAA,OAAO,cAAA,CAAe,OAAO,cAAA,CAAe,IAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,aAAA,GAAgB,iBAAiB,QAAQ,CAAA;AAC/C,EAAA,MAAM,aAAA,GAAgB,iBAAiB,QAAQ,CAAA;AAC/C,EAAA,IAAI,kBAAkB,aAAA,EAAe;AACnC,IAAA,OAAO,aAAA,GAAgB,aAAA;AAAA,EACzB;AAEA,EAAA,OAAO,SAAS,IAAA,EAAK,CAAE,MAAA,GAAS,QAAA,CAAS,MAAK,CAAE,MAAA;AAClD;;;ACrDA,eAAe,UAAA,CACb,OAAA,EACA,IAAA,EACA,SAAA,EACA,KAAA,EACiB;AACjB,EAAA,OAAO,QAAQ,MAAA,CAAO;AAAA,IACpB,OAAA,EAAS,IAAA;AAAA,IACT,SAAA;AAAA,IACA,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,UAAU;AAAC,GACZ,CAAA;AACH;AAEA,eAAe,YAAA,CACb,OAAA,EACA,OAAA,EACA,IAAA,EACA,SAAA,EACiB;AACjB,EAAA,IAAI,cAAA,CAAe,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AAChD,IAAA,OAAO,OAAA,CAAQ,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,EAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA;AACjB;AAEA,eAAsB,WACpB,OAAA,EACA,gBAAA,EACA,QACA,MAAA,EACA,IAAA,EACA,WACA,KAAA,EACiB;AACjB,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,UAAA,CAAW,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,KAAK,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,OAAO,SAAA,EAAW,KAAA,EAAO,OAAO,SAAS,CAAA;AACvE,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,IAAS,OAAO,SAAS,CAAA;AAEjE,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,UAAA,CAAW,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,KAAK,CAAA;AAAA,EACnD;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,CAAC,CAAA;AACzB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAE9B,EAAA,IAAI,MAAA,CAAO,aAAa,MAAA,EAAQ;AAC9B,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAEA,EAAA,IAAI,MAAA,CAAO,aAAa,SAAA,EAAW;AACjC,IAAA,OAAO,YAAA,CAAa,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,gBAAgB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,CAAU,eAAe,IAAI,CAAA;AACzD,IAAA,MAAM,eAAA,GAAkB,MAAM,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA;AAC3D,IAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,OAAO,EAAA,EAAI;AAAA,MACtD,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACZ,CAAA;AAED,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,+DAAA,EAAmE,MAAgB,OAAO,CAAA;AAAA,KAC5F;AACA,IAAA,OAAO,YAAA,CAAa,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAAA,EACvD;AACF;;;AC3FA,eAAsB,oBAAoB,QAAA,EAAiC;AAE3E;;;ACkCA,SAAS,gBAAgB,OAAA,EAA0B;AACjD,EAAA,OAAO,OAAA,CAAQ,WAAW,QAAQ,CAAA;AACpC;AAEA,SAAS,cAAA,GAAyB;AAChC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAO,OAAA,CAAQ,QAAQ,UAAA,EAAY;AACvE,IAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,GAAA,EAAK,CAAA,UAAA,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,gBAAA;AACT;AAEA,SAAS,wBAAA,CACP,SACA,QAAA,EACqB;AACrB,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,IAAI,OAAA,IAAW,eAAA,CAAgB,OAAO,CAAA,EAAG,OAAO,IAAA;AAChD,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAoC;AAC1D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AAEjC,EAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AACzB;AAEA,SAAS,cAAc,KAAA,EAAuD;AAC5E,EAAA,IAAI,KAAA,IAAS,IAAA,EAAM,OAAO,EAAC;AAC3B,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,YAAY,GAAA,EAAwB;AAC3C,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,IACvC,MAAA,EAAQ,IAAI,OAAA,IAAW,MAAA;AAAA,IACvB,OAAA,EAAS,IAAI,QAAA,IAAY,MAAA;AAAA,IACzB,SAAA,EAAW,IAAI,UAAA,IAAc,MAAA;AAAA,IAC7B,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAAA,IACpC,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAAA,IAClC,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU;AAAA,GACpC;AACF;AAEA,SAAS,gBAAgB,SAAA,EAA6B;AACpD,EAAA,OAAO,CAAA,CAAA,EAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAChC;AAEO,IAAM,uBAAN,MAAqD;AAAA,EAClD,EAAA,GAAoB,IAAA;AAAA,EACpB,UAAA,GAAa,CAAA;AAAA,EACJ,OAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,OAAA,KAAY,WAAA;AACxD,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,QAAA,GAAW,MAAA,GAAa,OAAA,CAAQ,WAAW,cAAA,EAAe;AAC9E,IAAA,IAAA,CAAK,iBAAA,GAAoB,wBAAA,CAAyB,IAAA,CAAK,OAAA,EAAS,QAAQ,iBAAiB,CAAA;AAAA,EAC3F;AAAA,EAEA,MAAM,KAAK,UAAA,EAAmC;AAC5C,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA,IAAK,cAAc,CAAA,EAAG;AACpD,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,8BAAA,EAAiC,UAAU,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAElB,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,OAAA,IAAW,CAAC,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA,EAAG;AAClD,QAAA,MAAM,mBAAA,CAAoB,KAAK,OAAO,CAAA;AAAA,MACxC;AAEA,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,UAAA,EAAY,UAAEC,aAAA,EAAO;AAAA,QACrB,GAAI,KAAK,iBAAA,KAAsB,KAAA,CAAA,GAC3B,EAAE,iBAAA,EAAmB,IAAA,CAAK,iBAAA,EAAkB,GAC5C;AAAC,OACP;AAEA,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,QAAA,GACX,IAAII,aAAA,CAAO,SAAS,CAAA,GACpB,IAAIA,aAAA,CAAO,IAAA,CAAK,OAAA,EAAU,SAAS,CAAA;AAEvC,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,sCAAA,CAAwC,CAAA;AAI3D,MAAA,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAKlB,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,KAAA;AAAA,QAC7B,CAAA,wDAAA;AAAA,OACF;AAEA,MAAA,IAAI,QAAA,CAAS,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC5B,QAAA,MAAM,YAAY,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAC,EAAE,KAAK,CAAA;AAC/C,QAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,UAAA,MAAM,IAAI,sBAAA;AAAA,YACR,CAAA,yCAAA,EAA4C,SAAS,CAAA,mEAAA,EAAsE,UAAU,CAAA,+EAAA;AAAA,WACvI;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,6BAAA,EAIM,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA,MAAA,CAclC,CAAA;AAED,MAAA,MAAM,KAAK,EAAA,CAAG,KAAA;AAAA,QACZ,CAAA;AAAA,qCAAA,CAAA;AAAA,QAEA,CAAC,MAAA,CAAO,UAAU,CAAC;AAAA,OACrB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,wBAAwB,MAAM,KAAA;AACnD,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,qCAAA,EAAyC,KAAA,CAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,QACzF,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,SAAA,GAAoB;AAC1B,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,MAAA,MAAM,IAAI,aAAa,oDAAoD,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EACd;AAAA,EAEA,MAAM,MAAA,CACJ,EAAA,EACA,KAAA,EAKiB;AACjB,IAAA,MAAM,EAAA,GAAK,KAAK,SAAA,EAAU;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,KAAW,IAAA,CAAK,UAAA,EAAY;AAC9C,MAAA,MAAM,IAAI,sBAAA;AAAA,QACR,iBAAiB,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,8BAAA,EAAiC,KAAK,UAAU,CAAA,CAAA;AAAA,OACzF;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,KAAA;AAAA,QACtB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAA,CAAA;AAAA,QAOA;AAAA,UACE,KAAA,CAAM,OAAA;AAAA,UACN,eAAA,CAAgB,MAAM,SAAS,CAAA;AAAA,UAC/B,MAAM,QAAA,IAAY,IAAA,GAAO,KAAK,SAAA,CAAU,KAAA,CAAM,QAAQ,CAAA,GAAI,IAAA;AAAA,UAC1D;AAAA;AACF,OACF;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAI,YAAA,CAAa,CAAA,kBAAA,EAAqB,EAAE,CAAA,CAAE,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,cAAc,MAAM,KAAA;AACzC,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,yBAAA,EAA6B,KAAA,CAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,QAC7E,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAyE;AACpF,IAAA,MAAM,EAAA,GAAK,KAAK,SAAA,EAAU;AAC1B,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,IAAA,CAAK,UAAA,EAAY;AAC/C,MAAA,MAAM,IAAI,sBAAA;AAAA,QACR,iBAAiB,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,8BAAA,EAAiC,KAAK,UAAU,CAAA,CAAA;AAAA,OAC1F;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,KAAA;AAAA,QACtB,CAAA;AAAA;AAAA,oBAAA,CAAA;AAAA,QAGA;AAAA,UACE,MAAA,CAAO,OAAA;AAAA,UACP,eAAA,CAAgB,OAAO,SAAS,CAAA;AAAA,UAChC,OAAO,MAAA,IAAU,IAAA;AAAA,UACjB,OAAO,OAAA,IAAW,IAAA;AAAA,UAClB,OAAO,SAAA,IAAa,IAAA;AAAA,UACpB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAA,IAAY,EAAE;AAAA;AACtC,OACF;AACA,MAAA,OAAO,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,yBAAA,EAA6B,KAAA,CAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,QAC7E,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MAAA,CACJ,SAAA,EACA,KAAA,EACA,KAAA,EAC+B;AAC/B,IAAA,MAAM,EAAA,GAAK,KAAK,SAAA,EAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,KAAA;AAAA,QACtB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,CAAA;AAAA,QAOA;AAAA,UACE,gBAAgB,SAAS,CAAA;AAAA,UACzB,MAAM,MAAA,IAAU,IAAA;AAAA,UAChB,MAAM,OAAA,IAAW,IAAA;AAAA,UACjB,MAAM,SAAA,IAAa,IAAA;AAAA,UACnB;AAAA;AACF,OACF;AAEA,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QAC/B,MAAA,EAAQ,YAAY,GAAG,CAAA;AAAA,QACvB,KAAA,EAAO,OAAO,GAAA,CAAI,KAAA,KAAU,WAAW,GAAA,CAAI,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAK;AAAA,OACrE,CAAE,CAAA;AAAA,IACJ,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,2BAAA,EAA+B,KAAA,CAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,QAC/E,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,KAAA,EAAuC;AAClD,IAAA,MAAM,EAAA,GAAK,KAAK,SAAA,EAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,KAAA;AAAA,QACtB,CAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,CAAA;AAAA,QAKA,CAAC,MAAM,MAAA,IAAU,IAAA,EAAM,MAAM,OAAA,IAAW,IAAA,EAAM,KAAA,CAAM,SAAA,IAAa,IAAI;AAAA,OACvE;AACA,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,yBAAA,EAA6B,KAAA,CAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,QAC7E,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,EAAA,GAAK,KAAK,SAAA,EAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,KAAA,CAAM,CAAA,kCAAA,CAAA,EAAsC,CAAC,EAAE,CAAC,CAAA;AAAA,IAC3D,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,yBAAA,EAA6B,KAAA,CAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,QAC7E,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,KAAA,EAAmC;AACjD,IAAA,MAAM,EAAA,GAAK,KAAK,SAAA,EAAU;AAC1B,IAAA,IAAI,CAAC,MAAM,MAAA,IAAU,CAAC,MAAM,OAAA,IAAW,CAAC,MAAM,SAAA,EAAW;AACvD,MAAA,MAAM,IAAI,YAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,KAAA;AAAA,QACP,CAAA;AAAA;AAAA;AAAA,oDAAA,CAAA;AAAA,QAIA,CAAC,MAAM,MAAA,IAAU,IAAA,EAAM,MAAM,OAAA,IAAW,IAAA,EAAM,KAAA,CAAM,SAAA,IAAa,IAAI;AAAA,OACvE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,2BAAA,EAA+B,KAAA,CAAgB,OAAO,CAAA,CAAA,EAAI;AAAA,QAC/E,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,CAAK,GAAG,KAAA,EAAM;AACpB,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AAAA,EACF;AACF;;;AChVA,IAAM,oBAAA,GAAuB,EAAA;AAMtB,IAAM,WAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EACN,MAAA;AAAA,EACA,gBAAA;AAAA,EACT,cAAA,GAAwC,IAAA;AAAA,EAC/B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,mBAAA;AAAA,EACT,WAAA,GAAc,KAAA;AAAA,EACd,WAAA,GAAoC,IAAA;AAAA,EAE5C,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,gBAAA,GAAmB,YAAA,CAAY,uBAAA,CAAwB,MAAM,CAAA;AAClE,IAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,YAAY,IAAA,EAAM;AACjE,MAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,OAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,GAAG,MAAA,CAAO,UAAA;AAAA,QACV,QAAQ,MAAA,CAAO,UAAA,CAAW,MAAA,IAAU,YAAA,CAAY,sBAAsB,MAAM,CAAA;AAAA,QAC5E,OAAA,EAAS,MAAA,CAAO,UAAA,CAAW,OAAA,IAAW,OAAO,MAAA,EAAQ;AAAA;AACvD,KACD,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,MACvB,MAAA,EAAQ;AAAA,QACN,GAAG,MAAA,CAAO,UAAA;AAAA,QACV,QAAQ,MAAA,CAAO,UAAA,CAAW,MAAA,IAAU,YAAA,CAAY,sBAAsB,MAAM,CAAA;AAAA,QAC5E,OAAA,EAAS,MAAA,CAAO,UAAA,CAAW,OAAA,IAAW,OAAO,MAAA,EAAQ;AAAA;AACvD,KACD,CAAA;AACD,IAAA,IAAA,CAAK,mBAAA,GAAsB,0BAAA,CAA2B,MAAA,CAAO,aAAa,CAAA;AAAA,EAC5E;AAAA,EAEA,OAAe,sBAAsB,MAAA,EAA+C;AAClF,IAAA,IAAI,OAAO,UAAA,CAAW,QAAA,KAAa,QAAA,EAAU,OAAO,OAAO,MAAA,EAAQ,MAAA;AACnE,IAAA,IAAI,OAAO,UAAA,CAAW,QAAA,KAAa,QAAA,EAAU,OAAO,OAAO,MAAA,EAAQ,MAAA;AACnE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAe,wBAAwB,MAAA,EAA6C;AAClF,IAAA,MAAM,EAAE,YAAW,GAAI,MAAA;AACvB,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA,OAAO,IAAI,sBAAA,CAAuB;AAAA,QAChC,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA;AAAA,QACvB,OAAA,EAAS,OAAO,MAAA,EAAQ;AAAA,OACzB,CAAA;AAAA,IACH;AACA,IAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,MAAA,MAAM,IAAI,WAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA,OAAO,IAAI,sBAAA,CAAuB;AAAA,QAChC,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA;AAAA,QACvB,OAAA,EAAS,OAAO,MAAA,EAAQ,OAAA;AAAA,QACxB,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA;AAAA,QACtB,UAAA,EAAY,OAAO,MAAA,EAAQ;AAAA,OAC5B,CAAA;AAAA,IACH;AACA,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA,OAAO,IAAI,sBAAA,CAAuB;AAAA,QAChC,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA;AAAA,QACvB,OAAA,EAAS,OAAO,MAAA,EAAQ,OAAA;AAAA,QACxB,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA;AAAA,QACtB,UAAA,EAAY,OAAO,MAAA,EAAQ;AAAA,OAC5B,CAAA;AAAA,IACH;AACA,IAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,IAAA,EAAM;AACzD,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,WAAA,CAAY,CAAA,2BAAA,EAA8B,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1E;AAAA,EAEQ,oBAAA,GAAuC;AAC7C,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,OAAO,IAAA,CAAK,cAAA;AAErC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,QAAA;AACvC,IAAA,IAAI,YAAY,QAAA,EAAU;AACxB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,oBAAA,CAAqB;AAAA,QAC7C,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,OAAA;AAAA,QAC7B,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,QAAA;AAAA,QAC9B,iBAAA,EAAmB,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AAAA,OACxC,CAAA;AACD,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IACd;AACA,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,YAAY,OAAO,CAAA,yFAAA;AAAA,OACrB;AAAA,IACF;AACA,IAAA,MAAM,IAAI,WAAA,CAAY,CAAA,wBAAA,EAA2B,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE;AAAA,EAEQ,qBAAA,GAAwC;AAC9C,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAI,mBAAA,EAAoB;AAAA,IAChC;AACA,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,WAAA,EAAa;AACtB,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAElC,IAAA,IAAA,CAAK,eAAe,YAAY;AAC9B,MAAA,MAAM,OAAA,GAAU,KAAK,oBAAA,EAAqB;AAC1C,MAAA,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA;AACnD,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB,CAAA,GAAG;AAEH,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAA;AAAA,IACb,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAI,QAAA,EAAqB,KAAA,EAAuC;AACpE,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAA;AAE5C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,MAAM,CAAA;AACjD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEhC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAE/D,IAAA,MAAM,OAAA,GAAU,KAAK,qBAAA,EAAsB;AAC3C,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,MAAM,UAAA;AAAA,UACJ,OAAA;AAAA,UACA,IAAA,CAAK,gBAAA;AAAA,UACL,IAAA,CAAK,MAAA;AAAA,UACL,IAAA,CAAK,mBAAA;AAAA,UACL,MAAM,CAAC,CAAA;AAAA,UACP,WAAW,CAAC,CAAA;AAAA,UACZ;AAAA;AACF,OACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAAiB,KAAA,EAAuC;AACrE,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AACrE,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAElC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,WAAW,OAAO,CAAA;AACjE,IAAA,MAAM,OAAA,GAAU,KAAK,qBAAA,EAAsB;AAC3C,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,MAAM,UAAA;AAAA,UACJ,OAAA;AAAA,UACA,IAAA,CAAK,gBAAA;AAAA,UACL,IAAA,CAAK,MAAA;AAAA,UACL,IAAA,CAAK,mBAAA;AAAA,UACL,QAAQ,CAAC,CAAA;AAAA,UACT,WAAW,CAAC,CAAA;AAAA,UACZ;AAAA;AACF,OACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CACJ,KAAA,EACA,KAAA,EAC+B;AAC/B,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,MAAM,EAAE,KAAA,GAAQ,oBAAA,EAAsB,GAAG,MAAK,GAAI,KAAA;AAClD,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAM,KAAK,CAAA;AACzD,IAAA,OAAO,KAAK,qBAAA,EAAsB,CAAE,MAAA,CAAO,SAAA,EAAW,MAAM,KAAK,CAAA;AAAA,EACnE;AAAA,EAEA,MAAM,OAAO,KAAA,EAAuC;AAClD,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,OAAO,IAAA,CAAK,qBAAA,EAAsB,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,OAAO,IAAA,CAAK,qBAAA,EAAsB,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,UAAU,KAAA,EAAmC;AACjD,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,OAAO,IAAA,CAAK,qBAAA,EAAsB,CAAE,SAAA,CAAU,KAAK,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,gBAAgB,KAAA,EAAO;AAC9B,MAAA,MAAM,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,IAClC;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,EACrB;AAAA,EAEA,OAAO,KAAA,GAAgB;AACrB,IAAA,OAAO,UAAA,CAAW,OAAO,UAAA,EAAW;AAAA,EACtC;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,mBAAA,EAAoB;AAAA,IAChC;AAAA,EACF;AACF;;;ACvOO,SAAS,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AACjE,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mEAAA,EAAsE,CAAA,CAAE,MAAM,CAAA,IAAA,EAAO,EAAE,MAAM,CAAA;AAAA,KAC/F;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACjB,IAAA,IAAA,IAAQ,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAClB,IAAA,IAAA,IAAQ,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EACpB;AAEA,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,IAAI,CAAA;AAC9C,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,CAAA;AAExB,EAAA,OAAO,GAAA,GAAM,KAAA;AACf","file":"browser.cjs","sourcesContent":["import { z } from \"zod\";\n\n/**\n * Input message format — matches the OpenAI/Anthropic message shape.\n */\nexport const MessageSchema = z.object({\n  role: z.enum([\"user\", \"assistant\", \"system\", \"tool\"]),\n  content: z.string(),\n});\nexport type Message = z.infer<typeof MessageSchema>;\n\nexport const MessagesSchema = z.array(MessageSchema);\n\n/**\n * A stored memory fact.\n */\nexport interface Memory {\n  id: string;\n  /** The extracted fact, in plain English. */\n  content: string;\n  /** Vector embedding of the content. */\n  embedding: number[];\n  userId?: string;\n  agentId?: string;\n  sessionId?: string;\n  metadata: Record<string, unknown>;\n  createdAt: Date;\n  updatedAt: Date;\n}\n\n/**\n * Result from {@link TurboMemory.search}.\n */\nexport interface MemorySearchResult {\n  memory: Memory;\n  /** Cosine similarity score, 0–1. */\n  score: number;\n}\n\n/**\n * Scope for operations — provide at least one of userId or agentId.\n */\nexport interface MemoryScope {\n  userId?: string;\n  agentId?: string;\n  sessionId?: string;\n}\n\nexport const MemoryScopeSchema = z.object({\n  userId: z.string().optional(),\n  agentId: z.string().optional(),\n  sessionId: z.string().optional(),\n});\n\n/**\n * Pluggable embedding backend.\n */\nexport interface EmbeddingAdapter {\n  embed(text: string): Promise<number[]>;\n  embedBatch(texts: string[]): Promise<number[][]>;\n  readonly dimensions: number;\n}\n\n/**\n * Pluggable storage backend.\n */\nexport interface StorageAdapter {\n  /**\n   * Initialise the store. Receives the embedding dimensions so the underlying\n   * vector column can be created with a matching size.\n   */\n  init(dimensions: number): Promise<void>;\n  insert(memory: Omit<Memory, \"id\" | \"createdAt\" | \"updatedAt\">): Promise<Memory>;\n  update(\n    id: string,\n    patch: {\n      content: string;\n      embedding: number[];\n      metadata?: Record<string, unknown>;\n    },\n  ): Promise<Memory>;\n  search(embedding: number[], scope: MemoryScope, limit: number): Promise<MemorySearchResult[]>;\n  getAll(scope: MemoryScope): Promise<Memory[]>;\n  delete(id: string): Promise<void>;\n  deleteAll(scope: MemoryScope): Promise<void>;\n  /** Release any held resources (file handles, db connections). */\n  close?(): Promise<void>;\n}\n\n/** Supported providers for LLM-based fact extraction. */\nexport type ExtractionProvider = \"openai\" | \"anthropic\" | \"google\";\n\nexport interface ExtractionConfig {\n  provider: ExtractionProvider;\n  model: string;\n  apiKey?: string;\n  baseURL?: string;\n}\n\nexport interface OpenAIConfig {\n  apiKey?: string;\n  baseURL?: string;\n}\n\n/** Options for the Voyage embedding adapter. */\nexport interface VoyageConfig {\n  apiKey?: string;\n  baseURL?: string;\n  model?: string;\n  dimensions?: number;\n}\n\n/** Options for the Google (Gemini) embedding adapter. */\nexport interface GoogleConfig {\n  apiKey?: string;\n  baseURL?: string;\n  model?: string;\n  dimensions?: number;\n}\n\n/** How overlapping memories are handled on write. */\nexport type DeduplicationStrategy = \"replace\" | \"skip\" | \"merge\";\n\n/** Controls semantic deduplication during {@link TurboMemory.add} / {@link TurboMemory.addFacts}. */\nexport interface DeduplicationConfig {\n  /** Default true. Set false to always insert new rows. */\n  enabled?: boolean;\n  /** Cosine similarity threshold (0–1). Default 0.92. */\n  threshold?: number;\n  /** Default \"merge\". */\n  strategy?: DeduplicationStrategy;\n  /** Max similar memories to retrieve for merge / consolidation. Default 5. */\n  mergeTopK?: number;\n}\n\n/**\n * Configuration for the {@link TurboMemory} class.\n */\nexport interface TurboMemoryConfig {\n  embeddings: \"openai\" | \"local\" | \"voyage\" | \"google\" | EmbeddingAdapter;\n  storage?: \"pglite\" | \"sqlite-vec\" | \"upstash-vector\" | \"pinecone\" | StorageAdapter;\n  extraction: ExtractionConfig;\n  openai?: OpenAIConfig;\n  /** Options forwarded to the Voyage embedding adapter. */\n  voyage?: VoyageConfig;\n  /** Options forwarded to the Google embedding adapter. */\n  google?: GoogleConfig;\n  pglite?: {\n    /**\n     * Persistence location. Defaults to `.turbomem` in `process.cwd()` on Node,\n     * or `idb://turbomem` in the browser. Prefix with `idb://` for IndexedDB.\n     */\n    dataDir?: string;\n    /** Use an in-memory database (ignores `dataDir`). Handy for tests. */\n    inMemory?: boolean;\n    /**\n     * When true, PGlite returns before IndexedDB flushes complete. Defaults to\n     * `true` for `idb://` paths.\n     */\n    relaxedDurability?: boolean;\n  };\n  sqliteVec?: {\n    /** Defaults to `.turbomem.sqlite` in `process.cwd()`. */\n    dbPath?: string;\n    /** Use an in-memory database. Handy for tests. */\n    inMemory?: boolean;\n  };\n  upstashVector?: {\n    /** Upstash Vector REST URL. Falls back to `UPSTASH_VECTOR_REST_URL`. */\n    url?: string;\n    /** Upstash Vector REST token. Falls back to `UPSTASH_VECTOR_REST_TOKEN`. */\n    token?: string;\n    /** Optional Upstash namespace. */\n    namespace?: string;\n  };\n  pinecone?: {\n    /** Pinecone API key. Falls back to `PINECONE_API_KEY`. */\n    apiKey?: string;\n    /** Pinecone index name. Falls back to `PINECONE_INDEX`. */\n    index?: string;\n    /** Direct index host (skips `describeIndex` lookup). Falls back to `PINECONE_INDEX_HOST`. */\n    host?: string;\n    /** Optional Pinecone namespace. */\n    namespace?: string;\n  };\n  /** Options forwarded to the local (transformers) embedding adapter. */\n  local?: {\n    model?: string;\n  };\n  /** Semantic deduplication on write. Enabled by default. */\n  deduplication?: DeduplicationConfig;\n}\n","/**\n * Stable, machine-readable error codes thrown by turbomem.\n */\nexport type TurboMemErrorCode =\n  | \"NOT_INITIALISED\"\n  | \"EMBEDDING_FAILED\"\n  | \"STORAGE_FAILED\"\n  | \"EXTRACTION_FAILED\"\n  | \"DIMENSION_MISMATCH\"\n  | \"INVALID_CONFIG\"\n  | \"INVALID_INPUT\";\n\n/**\n * Base error class for all turbomem errors. Carries a stable {@link code} so\n * callers can branch on error type without matching on message strings.\n */\nexport class TurboMemError extends Error {\n  readonly code: TurboMemErrorCode;\n  override readonly cause?: unknown;\n\n  constructor(code: TurboMemErrorCode, message: string, options?: { cause?: unknown }) {\n    super(message);\n    this.name = \"TurboMemError\";\n    this.code = code;\n    this.cause = options?.cause;\n    Object.setPrototypeOf(this, TurboMemError.prototype);\n  }\n}\n\nexport class NotInitialisedError extends TurboMemError {\n  constructor(message = \"TurboMemory not initialised. Call await memory.init() first.\") {\n    super(\"NOT_INITIALISED\", message);\n    this.name = \"NotInitialisedError\";\n    Object.setPrototypeOf(this, NotInitialisedError.prototype);\n  }\n}\n\nexport class EmbeddingError extends TurboMemError {\n  constructor(message: string, options?: { cause?: unknown }) {\n    super(\"EMBEDDING_FAILED\", message, options);\n    this.name = \"EmbeddingError\";\n    Object.setPrototypeOf(this, EmbeddingError.prototype);\n  }\n}\n\nexport class StorageError extends TurboMemError {\n  constructor(message: string, options?: { cause?: unknown }) {\n    super(\"STORAGE_FAILED\", message, options);\n    this.name = \"StorageError\";\n    Object.setPrototypeOf(this, StorageError.prototype);\n  }\n}\n\nexport class ExtractionError extends TurboMemError {\n  constructor(message: string, options?: { cause?: unknown }) {\n    super(\"EXTRACTION_FAILED\", message, options);\n    this.name = \"ExtractionError\";\n    Object.setPrototypeOf(this, ExtractionError.prototype);\n  }\n}\n\nexport class DimensionMismatchError extends TurboMemError {\n  constructor(message: string) {\n    super(\"DIMENSION_MISMATCH\", message);\n    this.name = \"DimensionMismatchError\";\n    Object.setPrototypeOf(this, DimensionMismatchError.prototype);\n  }\n}\n\nexport class ConfigError extends TurboMemError {\n  constructor(message: string) {\n    super(\"INVALID_CONFIG\", message);\n    this.name = \"ConfigError\";\n    Object.setPrototypeOf(this, ConfigError.prototype);\n  }\n}\n","import type { Message } from \"../types.js\";\n\n/**\n * Split an array into fixed-size chunks. Useful for batching embedding requests\n * so we respect provider request limits.\n */\nexport function chunkArray<T>(items: T[], size: number): T[][] {\n  if (size <= 0) throw new Error(\"Chunk size must be a positive integer\");\n  const chunks: T[][] = [];\n  for (let i = 0; i < items.length; i += size) {\n    chunks.push(items.slice(i, i + size));\n  }\n  return chunks;\n}\n\n/**\n * Render a list of messages into a single plain-text transcript suitable for\n * feeding to an extraction LLM.\n */\nexport function formatTranscript(messages: Message[]): string {\n  return messages.map((m) => `${m.role}: ${m.content}`).join(\"\\n\");\n}\n","import OpenAI from \"openai\";\nimport type { EmbeddingAdapter } from \"../types.js\";\nimport { EmbeddingError, ConfigError } from \"../errors.js\";\nimport { chunkArray } from \"../utils/chunking.js\";\n\n/** OpenAI embedding models and their output dimensions. */\nconst MODEL_DIMENSIONS: Record<string, number> = {\n  \"text-embedding-3-small\": 1536,\n  \"text-embedding-3-large\": 3072,\n  \"text-embedding-ada-002\": 1536,\n};\n\nconst MAX_BATCH = 100;\n\nexport type OpenAIEmbeddingModel = keyof typeof MODEL_DIMENSIONS | (string & Record<never, never>);\n\nexport interface OpenAIEmbeddingOptions {\n  apiKey?: string;\n  baseURL?: string;\n  /** Defaults to `text-embedding-3-small`. */\n  model?: OpenAIEmbeddingModel;\n  /** Override the dimension count (required for unknown models). */\n  dimensions?: number;\n  /** Inject a pre-built client (used in tests). */\n  client?: OpenAI;\n}\n\nexport class OpenAIEmbeddingAdapter implements EmbeddingAdapter {\n  readonly dimensions: number;\n  private readonly client: OpenAI;\n  private readonly model: string;\n\n  constructor(options: OpenAIEmbeddingOptions = {}) {\n    this.model = options.model ?? \"text-embedding-3-small\";\n\n    const resolvedDimensions = options.dimensions ?? MODEL_DIMENSIONS[this.model];\n    if (!resolvedDimensions) {\n      throw new ConfigError(\n        `Unknown OpenAI embedding model \"${this.model}\". Pass an explicit \\`dimensions\\` value.`,\n      );\n    }\n    this.dimensions = resolvedDimensions;\n\n    if (options.client) {\n      this.client = options.client;\n    } else {\n      const apiKey = options.apiKey ?? process.env.OPENAI_API_KEY;\n      if (!apiKey) {\n        throw new ConfigError(\n          \"OpenAI API key missing. Set OPENAI_API_KEY or pass openai.apiKey in the config.\",\n        );\n      }\n      this.client = new OpenAI({ apiKey, baseURL: options.baseURL });\n    }\n  }\n\n  async embed(text: string): Promise<number[]> {\n    const [vector] = await this.embedBatch([text]);\n    return vector;\n  }\n\n  async embedBatch(texts: string[]): Promise<number[][]> {\n    if (texts.length === 0) return [];\n\n    try {\n      // One request when under the limit; otherwise chunk into groups of 100.\n      if (texts.length <= MAX_BATCH) {\n        return await this.requestEmbeddings(texts);\n      }\n\n      const batches = chunkArray(texts, MAX_BATCH);\n      const results = await Promise.all(batches.map((batch) => this.requestEmbeddings(batch)));\n      return results.flat();\n    } catch (error) {\n      if (error instanceof EmbeddingError) throw error;\n      throw new EmbeddingError(\n        `OpenAI embedding request failed: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  private async requestEmbeddings(input: string[]): Promise<number[][]> {\n    const response = await this.client.embeddings.create({\n      model: this.model,\n      input,\n    });\n\n    // Preserve input ordering — the API may return out of order.\n    return response.data\n      .slice()\n      .sort((a, b) => a.index - b.index)\n      .map((item) => item.embedding as number[]);\n  }\n}\n","import type { EmbeddingAdapter } from \"../types.js\";\nimport { EmbeddingError, ConfigError } from \"../errors.js\";\nimport { chunkArray } from \"../utils/chunking.js\";\n\n/** Voyage embedding models and their default output dimensions. */\nconst MODEL_DIMENSIONS: Record<string, number> = {\n  \"voyage-3.5\": 1024,\n  \"voyage-3.5-lite\": 1024,\n  \"voyage-3-large\": 1024,\n  \"voyage-4\": 1024,\n  \"voyage-4-large\": 1024,\n  \"voyage-4-lite\": 1024,\n  \"voyage-code-3\": 1024,\n};\n\nconst DEFAULT_MODEL = \"voyage-4\";\nconst DEFAULT_ENDPOINT = \"https://api.voyageai.com/v1/embeddings\";\nconst MAX_BATCH = 128;\n\n/** Minimal fetch signature so a stub can be injected in tests. */\nexport type FetchLike = (\n  input: string,\n  init: {\n    method: string;\n    headers: Record<string, string>;\n    body: string;\n  },\n) => Promise<{\n  ok: boolean;\n  status: number;\n  text: () => Promise<string>;\n  json: () => Promise<unknown>;\n}>;\n\ninterface VoyageResponse {\n  data: { index: number; embedding: number[] }[];\n}\n\nexport type VoyageEmbeddingModel = keyof typeof MODEL_DIMENSIONS | (string & Record<never, never>);\n\nexport interface VoyageEmbeddingOptions {\n  apiKey?: string;\n  /** Full endpoint URL. Defaults to the public Voyage embeddings endpoint. */\n  baseURL?: string;\n  /** Defaults to `voyage-4`. */\n  model?: VoyageEmbeddingModel;\n  /** Override the dimension count (sent as `output_dimension`; default 1024). */\n  dimensions?: number;\n  /** Optional retrieval hint forwarded as `input_type` (`query` | `document`). */\n  inputType?: \"query\" | \"document\";\n  /** Inject a custom fetch implementation (used in tests). */\n  fetchImpl?: FetchLike;\n}\n\nexport class VoyageEmbeddingAdapter implements EmbeddingAdapter {\n  readonly dimensions: number;\n  private readonly apiKey: string;\n  private readonly endpoint: string;\n  private readonly model: string;\n  private readonly inputType?: \"query\" | \"document\";\n  private readonly outputDimension?: number;\n  private readonly fetchImpl: FetchLike;\n\n  constructor(options: VoyageEmbeddingOptions = {}) {\n    this.model = options.model ?? DEFAULT_MODEL;\n    this.dimensions = options.dimensions ?? MODEL_DIMENSIONS[this.model] ?? 1024;\n    // Only send output_dimension when it differs from the model default.\n    this.outputDimension =\n      options.dimensions && options.dimensions !== MODEL_DIMENSIONS[this.model]\n        ? options.dimensions\n        : undefined;\n    this.endpoint = options.baseURL ?? DEFAULT_ENDPOINT;\n    this.inputType = options.inputType;\n    this.fetchImpl = options.fetchImpl ?? ((globalThis as { fetch: FetchLike }).fetch);\n\n    const apiKey = options.apiKey ?? process.env.VOYAGE_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\n        \"Voyage API key missing. Set VOYAGE_API_KEY or pass voyage.apiKey in the config.\",\n      );\n    }\n    this.apiKey = apiKey;\n  }\n\n  async embed(text: string): Promise<number[]> {\n    const [vector] = await this.embedBatch([text]);\n    return vector;\n  }\n\n  async embedBatch(texts: string[]): Promise<number[][]> {\n    if (texts.length === 0) return [];\n\n    try {\n      if (texts.length <= MAX_BATCH) {\n        return await this.requestEmbeddings(texts);\n      }\n\n      const batches = chunkArray(texts, MAX_BATCH);\n      const results = await Promise.all(batches.map((batch) => this.requestEmbeddings(batch)));\n      return results.flat();\n    } catch (error) {\n      if (error instanceof EmbeddingError) throw error;\n      throw new EmbeddingError(\n        `Voyage embedding request failed: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  private async requestEmbeddings(input: string[]): Promise<number[][]> {\n    const body: Record<string, unknown> = { model: this.model, input };\n    if (this.outputDimension) body.output_dimension = this.outputDimension;\n    if (this.inputType) body.input_type = this.inputType;\n\n    const response = await this.fetchImpl(this.endpoint, {\n      method: \"POST\",\n      headers: {\n        Authorization: `Bearer ${this.apiKey}`,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(body),\n    });\n\n    if (!response.ok) {\n      const detail = await response.text().catch(() => \"\");\n      throw new EmbeddingError(\n        `Voyage embedding request failed with status ${response.status}: ${detail}`,\n      );\n    }\n\n    const json = (await response.json()) as VoyageResponse;\n    // Preserve input ordering — the API may return out of order.\n    return json.data\n      .slice()\n      .sort((a, b) => a.index - b.index)\n      .map((item) => item.embedding);\n  }\n}\n","import type { EmbeddingAdapter } from \"../types.js\";\nimport { EmbeddingError, ConfigError } from \"../errors.js\";\nimport type { FetchLike } from \"./voyage.js\";\n\nconst DEFAULT_MODEL = \"gemini-embedding-001\";\nconst DEFAULT_DIMENSIONS = 3072;\nconst DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\";\n\ninterface SingleResponse {\n  embedding: { values: number[] };\n}\n\ninterface BatchResponse {\n  embeddings: { values: number[] }[];\n}\n\n/** L2-normalize a vector to unit length. A no-op for already-normalized inputs. */\nfunction normalize(vector: number[]): number[] {\n  let sumSquares = 0;\n  for (const value of vector) sumSquares += value * value;\n  const magnitude = Math.sqrt(sumSquares);\n  if (magnitude === 0) return vector;\n  return vector.map((value) => value / magnitude);\n}\n\nexport interface GoogleEmbeddingOptions {\n  apiKey?: string;\n  /** Base URL for the Generative Language API. */\n  baseURL?: string;\n  /** Defaults to `gemini-embedding-001`. */\n  model?: string;\n  /** Output dimensionality (128-3072). Defaults to 3072. */\n  dimensions?: number;\n  /** Optional task type hint (e.g. `RETRIEVAL_DOCUMENT`). */\n  taskType?: string;\n  /** Inject a custom fetch implementation (used in tests). */\n  fetchImpl?: FetchLike;\n}\n\nexport class GoogleEmbeddingAdapter implements EmbeddingAdapter {\n  readonly dimensions: number;\n  private readonly apiKey: string;\n  private readonly baseURL: string;\n  private readonly model: string;\n  private readonly taskType?: string;\n  private readonly fetchImpl: FetchLike;\n\n  constructor(options: GoogleEmbeddingOptions = {}) {\n    this.model = options.model ?? DEFAULT_MODEL;\n    this.dimensions = options.dimensions ?? DEFAULT_DIMENSIONS;\n    this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n    this.taskType = options.taskType;\n    this.fetchImpl = options.fetchImpl ?? ((globalThis as { fetch: FetchLike }).fetch);\n\n    const apiKey = options.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\n        \"Google API key missing. Set GEMINI_API_KEY or pass google.apiKey in the config.\",\n      );\n    }\n    this.apiKey = apiKey;\n  }\n\n  private get outputDimensionality(): number | undefined {\n    return this.dimensions === DEFAULT_DIMENSIONS ? undefined : this.dimensions;\n  }\n\n  async embed(text: string): Promise<number[]> {\n    try {\n      const url = `${this.baseURL}/models/${this.model}:embedContent`;\n      const body: Record<string, unknown> = {\n        content: { parts: [{ text }] },\n      };\n      if (this.outputDimensionality) body.outputDimensionality = this.outputDimensionality;\n      if (this.taskType) body.taskType = this.taskType;\n\n      const json = (await this.request(url, body)) as SingleResponse;\n      return normalize(json.embedding.values);\n    } catch (error) {\n      if (error instanceof EmbeddingError) throw error;\n      throw new EmbeddingError(\n        `Google embedding request failed: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  async embedBatch(texts: string[]): Promise<number[][]> {\n    if (texts.length === 0) return [];\n\n    try {\n      const url = `${this.baseURL}/models/${this.model}:batchEmbedContents`;\n      const requests = texts.map((text) => {\n        const req: Record<string, unknown> = {\n          model: `models/${this.model}`,\n          content: { parts: [{ text }] },\n        };\n        if (this.outputDimensionality) req.outputDimensionality = this.outputDimensionality;\n        if (this.taskType) req.taskType = this.taskType;\n        return req;\n      });\n\n      const json = (await this.request(url, { requests })) as BatchResponse;\n      return json.embeddings.map((item) => normalize(item.values));\n    } catch (error) {\n      if (error instanceof EmbeddingError) throw error;\n      throw new EmbeddingError(\n        `Google embedding request failed: ${(error as Error).message}`,\n        { cause: error },\n      );\n    }\n  }\n\n  private async request(url: string, body: Record<string, unknown>): Promise<unknown> {\n    const response = await this.fetchImpl(url, {\n      method: \"POST\",\n      headers: {\n        \"x-goog-api-key\": this.apiKey,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(body),\n    });\n\n    if (!response.ok) {\n      const detail = await response.text().catch(() => \"\");\n      throw new EmbeddingError(\n        `Google embedding request failed with status ${response.status}: ${detail}`,\n      );\n    }\n\n    return response.json();\n  }\n}\n","import type { ExtractionConfig, Message } from \"../types.js\";\nimport { ConfigError } from \"../errors.js\";\nimport { formatTranscript } from \"../utils/chunking.js\";\n\nexport const EXTRACTION_SYSTEM_PROMPT = `You are a memory extraction system for an AI agent. Your job is to extract discrete, reusable facts from a conversation that would be useful to remember in future conversations.\n\nRules:\n- Extract facts that are about the USER, not about the AI's responses\n- Each fact should be a single, standalone statement\n- Facts should be in third person (e.g. \"The user prefers...\" not \"I prefer...\")\n- Only extract facts that are likely to be relevant in future conversations\n- Do not extract facts that are specific to the current task and won't matter later\n- Do not extract opinions the AI expressed\n- If no memorable facts exist, return an empty array\n\nReturn ONLY a JSON array of strings. No explanation, no markdown, no wrapper object.\nExample output: [\"The user prefers concise responses\", \"The user works in TypeScript\"]`;\n\n/**\n * Best-effort parse of an LLM response into an array of fact strings.\n * Tolerates models that wrap the array in markdown fences or a JSON object.\n */\nexport function parseFacts(raw: string): string[] {\n  if (!raw) return [];\n  let text = raw.trim();\n\n  // Strip markdown code fences if present.\n  const fenceMatch = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n  if (fenceMatch) text = fenceMatch[1].trim();\n\n  try {\n    const parsed: unknown = JSON.parse(text);\n    if (Array.isArray(parsed)) {\n      return parsed.filter((x): x is string => typeof x === \"string\" && x.trim().length > 0);\n    }\n    // Tolerate { facts: [...] } / { memories: [...] } wrappers.\n    if (parsed && typeof parsed === \"object\") {\n      for (const value of Object.values(parsed as Record<string, unknown>)) {\n        if (Array.isArray(value)) {\n          return value.filter((x): x is string => typeof x === \"string\" && x.trim().length > 0);\n        }\n      }\n    }\n  } catch {\n    // Fall through — attempt to locate a bare array within the text.\n    const arrayMatch = text.match(/\\[[\\s\\S]*\\]/);\n    if (arrayMatch) {\n      try {\n        const parsed: unknown = JSON.parse(arrayMatch[0]);\n        if (Array.isArray(parsed)) {\n          return parsed.filter((x): x is string => typeof x === \"string\" && x.trim().length > 0);\n        }\n      } catch {\n        /* give up */\n      }\n    }\n  }\n\n  return [];\n}\n\nexport interface ExtractorOptions {\n  config: ExtractionConfig;\n  /** Inject a custom completion function (used in tests). */\n  completion?: (system: string, user: string) => Promise<string>;\n}\n\n/**\n * Extracts discrete, reusable facts from a conversation using an LLM.\n * Extraction is treated as non-fatal: on any failure it logs a warning and\n * returns an empty array rather than throwing.\n */\nexport class Extractor {\n  private readonly config: ExtractionConfig;\n  private readonly completion: (system: string, user: string) => Promise<string>;\n\n  constructor(options: ExtractorOptions) {\n    this.config = options.config;\n    this.completion = options.completion ?? this.defaultCompletion.bind(this);\n  }\n\n  async extract(messages: Message[]): Promise<string[]> {\n    if (messages.length === 0) return [];\n\n    const transcript = formatTranscript(messages);\n    const user = `Conversation:\\n${transcript}`;\n\n    try {\n      const raw = await this.completion(EXTRACTION_SYSTEM_PROMPT, user);\n      return parseFacts(raw);\n    } catch (error) {\n      // Non-fatal: never block the add() flow on extraction issues.\n      // eslint-disable-next-line no-console\n      console.warn(`[turbomem] Fact extraction failed, skipping: ${(error as Error).message}`);\n      return [];\n    }\n  }\n\n  private async defaultCompletion(system: string, user: string): Promise<string> {\n    if (this.config.provider === \"openai\") {\n      return this.openaiCompletion(system, user);\n    }\n    if (this.config.provider === \"anthropic\") {\n      return this.anthropicCompletion(system, user);\n    }\n    if (this.config.provider === \"google\") {\n      return this.googleCompletion(system, user);\n    }\n    throw new ConfigError(`Unsupported extraction provider: ${this.config.provider as string}`);\n  }\n\n  private async openaiCompletion(system: string, user: string): Promise<string> {\n    const { default: OpenAI } = await import(\"openai\");\n    const apiKey = this.config.apiKey ?? process.env.OPENAI_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"OpenAI API key missing for extraction provider.\");\n    }\n    const client = new OpenAI({ apiKey, baseURL: this.config.baseURL });\n    const response = await client.chat.completions.create({\n      model: this.config.model,\n      temperature: 0,\n      messages: [\n        { role: \"system\", content: system },\n        { role: \"user\", content: user },\n      ],\n    });\n    return response.choices[0]?.message?.content ?? \"\";\n  }\n\n  private async anthropicCompletion(system: string, user: string): Promise<string> {\n    let Anthropic: typeof import(\"@anthropic-ai/sdk\").default;\n    try {\n      Anthropic = (await import(\"@anthropic-ai/sdk\")).default;\n    } catch {\n      throw new ConfigError(\n        'The \"@anthropic-ai/sdk\" package is required for the anthropic extraction provider. Install it with `npm install @anthropic-ai/sdk`.',\n      );\n    }\n    const apiKey = this.config.apiKey ?? process.env.ANTHROPIC_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"Anthropic API key missing for extraction provider.\");\n    }\n    const client = new Anthropic({ apiKey, baseURL: this.config.baseURL });\n    const response = await client.messages.create({\n      model: this.config.model,\n      max_tokens: 1024,\n      temperature: 0,\n      system,\n      messages: [{ role: \"user\", content: user }],\n    });\n    const block = response.content[0];\n    if (block && block.type === \"text\") return block.text;\n    return \"\";\n  }\n\n  private async googleCompletion(system: string, user: string): Promise<string> {\n    const apiKey =\n      this.config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"Google API key missing for extraction provider.\");\n    }\n    const baseURL = (\n      this.config.baseURL ?? \"https://generativelanguage.googleapis.com/v1beta\"\n    ).replace(/\\/$/, \"\");\n    const url = `${baseURL}/models/${this.config.model}:generateContent`;\n\n    const response = await fetch(url, {\n      method: \"POST\",\n      headers: {\n        \"x-goog-api-key\": apiKey,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        system_instruction: { parts: [{ text: system }] },\n        contents: [{ role: \"user\", parts: [{ text: user }] }],\n        generationConfig: { temperature: 0 },\n      }),\n    });\n\n    if (!response.ok) {\n      const detail = await response.text().catch(() => \"\");\n      throw new Error(`Google extraction request failed with status ${response.status}: ${detail}`);\n    }\n\n    const json = (await response.json()) as {\n      candidates?: { content?: { parts?: { text?: string }[] } }[];\n    };\n    return json.candidates?.[0]?.content?.parts?.[0]?.text ?? \"\";\n  }\n}\n","import type { ExtractionConfig } from \"../types.js\";\nimport { ConfigError } from \"../errors.js\";\n\nexport const MERGE_SYSTEM_PROMPT = `You are a memory consolidation system for an AI agent. You will receive one or more existing memory facts and one new fact that overlaps with them.\n\nYour job is to return a single consolidated fact that:\n- Is in third person (e.g. \"The user prefers...\" not \"I prefer...\")\n- Combines all unique details from the existing facts and the new fact\n- Prefers the new fact's information when there is a direct conflict\n- Is concise and standalone\n\nReturn ONLY the merged fact as plain text. No explanation, no markdown, no JSON wrapper.`;\n\nexport interface MergerOptions {\n  config: ExtractionConfig;\n  /** Inject a custom completion function (used in tests). */\n  completion?: (system: string, user: string) => Promise<string>;\n}\n\n/**\n * Consolidates overlapping memory facts using an LLM (Mem0-style multi-way merge).\n */\nexport class Merger {\n  private readonly config: ExtractionConfig;\n  private readonly completion: (system: string, user: string) => Promise<string>;\n\n  constructor(options: MergerOptions) {\n    this.config = options.config;\n    this.completion = options.completion ?? this.defaultCompletion.bind(this);\n  }\n\n  async mergeMany(existingFacts: string[], newFact: string): Promise<string> {\n    if (existingFacts.length === 0) return newFact.trim();\n\n    const lines = [\n      \"Existing facts:\",\n      ...existingFacts.map((f, i) => `${i + 1}. ${f}`),\n      \"\",\n      `New fact: ${newFact}`,\n    ];\n\n    const raw = await this.completion(MERGE_SYSTEM_PROMPT, lines.join(\"\\n\"));\n    const merged = raw.trim();\n    if (!merged) {\n      throw new Error(\"Merger returned empty content\");\n    }\n    return merged;\n  }\n\n  private async defaultCompletion(system: string, user: string): Promise<string> {\n    if (this.config.provider === \"openai\") {\n      return this.openaiCompletion(system, user);\n    }\n    if (this.config.provider === \"anthropic\") {\n      return this.anthropicCompletion(system, user);\n    }\n    if (this.config.provider === \"google\") {\n      return this.googleCompletion(system, user);\n    }\n    throw new ConfigError(`Unsupported extraction provider: ${this.config.provider as string}`);\n  }\n\n  private async openaiCompletion(system: string, user: string): Promise<string> {\n    const { default: OpenAI } = await import(\"openai\");\n    const apiKey = this.config.apiKey ?? process.env.OPENAI_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"OpenAI API key missing for merge provider.\");\n    }\n    const client = new OpenAI({ apiKey, baseURL: this.config.baseURL });\n    const response = await client.chat.completions.create({\n      model: this.config.model,\n      temperature: 0,\n      messages: [\n        { role: \"system\", content: system },\n        { role: \"user\", content: user },\n      ],\n    });\n    return response.choices[0]?.message?.content ?? \"\";\n  }\n\n  private async anthropicCompletion(system: string, user: string): Promise<string> {\n    let Anthropic: typeof import(\"@anthropic-ai/sdk\").default;\n    try {\n      Anthropic = (await import(\"@anthropic-ai/sdk\")).default;\n    } catch {\n      throw new ConfigError(\n        'The \"@anthropic-ai/sdk\" package is required for the anthropic merge provider. Install it with `npm install @anthropic-ai/sdk`.',\n      );\n    }\n    const apiKey = this.config.apiKey ?? process.env.ANTHROPIC_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"Anthropic API key missing for merge provider.\");\n    }\n    const client = new Anthropic({ apiKey, baseURL: this.config.baseURL });\n    const response = await client.messages.create({\n      model: this.config.model,\n      max_tokens: 1024,\n      temperature: 0,\n      system,\n      messages: [{ role: \"user\", content: user }],\n    });\n    const block = response.content[0];\n    if (block && block.type === \"text\") return block.text;\n    return \"\";\n  }\n\n  private async googleCompletion(system: string, user: string): Promise<string> {\n    const apiKey =\n      this.config.apiKey ?? process.env.GEMINI_API_KEY ?? process.env.GOOGLE_API_KEY;\n    if (!apiKey) {\n      throw new ConfigError(\"Google API key missing for merge provider.\");\n    }\n    const baseURL = (\n      this.config.baseURL ?? \"https://generativelanguage.googleapis.com/v1beta\"\n    ).replace(/\\/$/, \"\");\n    const url = `${baseURL}/models/${this.config.model}:generateContent`;\n\n    const response = await fetch(url, {\n      method: \"POST\",\n      headers: {\n        \"x-goog-api-key\": apiKey,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        system_instruction: { parts: [{ text: system }] },\n        contents: [{ role: \"user\", parts: [{ text: user }] }],\n        generationConfig: { temperature: 0 },\n      }),\n    });\n\n    if (!response.ok) {\n      const detail = await response.text().catch(() => \"\");\n      throw new Error(`Google merge request failed with status ${response.status}: ${detail}`);\n    }\n\n    const json = (await response.json()) as {\n      candidates?: { content?: { parts?: { text?: string }[] } }[];\n    };\n    return json.candidates?.[0]?.content?.parts?.[0]?.text ?? \"\";\n  }\n}\n","import type { DeduplicationConfig } from \"../types.js\";\n\nexport interface ResolvedDeduplicationConfig {\n  enabled: boolean;\n  threshold: number;\n  strategy: \"replace\" | \"skip\" | \"merge\";\n  mergeTopK: number;\n}\n\nconst DEFAULT_THRESHOLD = 0.92;\nconst DEFAULT_MERGE_TOP_K = 5;\n\nexport function resolveDeduplicationConfig(\n  config?: DeduplicationConfig,\n): ResolvedDeduplicationConfig {\n  return {\n    enabled: config?.enabled ?? true,\n    threshold: config?.threshold ?? DEFAULT_THRESHOLD,\n    strategy: config?.strategy ?? \"merge\",\n    mergeTopK: config?.mergeTopK ?? DEFAULT_MERGE_TOP_K,\n  };\n}\n","function tokenize(text: string): string[] {\n  return text\n    .trim()\n    .split(/\\s+/)\n    .filter((t) => t.length > 0);\n}\n\nfunction uniqueTokenSet(text: string): Set<string> {\n  return new Set(\n    tokenize(text)\n      .map((t) => t.toLowerCase().replace(/[^\\w]/g, \"\"))\n      .filter(Boolean),\n  );\n}\n\n/** Higher score = more specific / information-dense. */\nexport function specificityScore(text: string): number {\n  const trimmed = text.trim();\n  if (trimmed.length === 0) return 0;\n\n  const tokens = tokenize(trimmed);\n  if (tokens.length === 0) return 0;\n\n  const unique = new Set(tokens.map((t) => t.toLowerCase()));\n  const density = unique.size / tokens.length;\n  const concisenessBonus = 1 / Math.sqrt(trimmed.length);\n\n  return density * concisenessBonus;\n}\n\n/** True when `incoming` is more specific than `existing`. */\nexport function isMoreSpecific(incoming: string, existing: string): boolean {\n  const incomingTokens = uniqueTokenSet(incoming);\n  const existingTokens = uniqueTokenSet(existing);\n\n  if (incomingTokens.size === 0) return false;\n  if (existingTokens.size === 0) return true;\n\n  const incomingAddsInfo = [...incomingTokens].some((t) => !existingTokens.has(t));\n  const existingIsSubset = [...existingTokens].every((t) => incomingTokens.has(t));\n  const incomingIsSubset = [...incomingTokens].every((t) => existingTokens.has(t));\n\n  // Refinement: incoming preserves existing details and adds new ones.\n  if (incomingAddsInfo && existingIsSubset) {\n    return true;\n  }\n\n  // Generalization: incoming drops detail present in existing.\n  if (incomingIsSubset && !existingIsSubset) {\n    return false;\n  }\n\n  // More unique tokens generally means more specific when neither is a subset.\n  if (incomingTokens.size !== existingTokens.size) {\n    return incomingTokens.size > existingTokens.size;\n  }\n\n  const incomingScore = specificityScore(incoming);\n  const existingScore = specificityScore(existing);\n  if (incomingScore !== existingScore) {\n    return incomingScore > existingScore;\n  }\n\n  return incoming.trim().length < existing.trim().length;\n}\n","import type {\n  EmbeddingAdapter,\n  Memory,\n  MemoryScope,\n  MemorySearchResult,\n  StorageAdapter,\n} from \"../types.js\";\nimport { isMoreSpecific } from \"./specificity.js\";\nimport type { Merger } from \"./merger.js\";\nimport type { ResolvedDeduplicationConfig } from \"./resolve-config.js\";\n\nasync function insertFact(\n  storage: StorageAdapter,\n  fact: string,\n  embedding: number[],\n  scope: MemoryScope,\n): Promise<Memory> {\n  return storage.insert({\n    content: fact,\n    embedding,\n    userId: scope.userId,\n    agentId: scope.agentId,\n    sessionId: scope.sessionId,\n    metadata: {},\n  });\n}\n\nasync function smartReplace(\n  storage: StorageAdapter,\n  primary: MemorySearchResult,\n  fact: string,\n  embedding: number[],\n): Promise<Memory> {\n  if (isMoreSpecific(fact, primary.memory.content)) {\n    return storage.update(primary.memory.id, { content: fact, embedding });\n  }\n  return primary.memory;\n}\n\nexport async function upsertFact(\n  storage: StorageAdapter,\n  embeddingAdapter: EmbeddingAdapter,\n  merger: Merger,\n  config: ResolvedDeduplicationConfig,\n  fact: string,\n  embedding: number[],\n  scope: MemoryScope,\n): Promise<Memory> {\n  if (!config.enabled) {\n    return insertFact(storage, fact, embedding, scope);\n  }\n\n  const results = await storage.search(embedding, scope, config.mergeTopK);\n  const matches = results.filter((r) => r.score >= config.threshold);\n\n  if (matches.length === 0) {\n    return insertFact(storage, fact, embedding, scope);\n  }\n\n  const primary = matches[0];\n  const extras = matches.slice(1);\n\n  if (config.strategy === \"skip\") {\n    return primary.memory;\n  }\n\n  if (config.strategy === \"replace\") {\n    return smartReplace(storage, primary, fact, embedding);\n  }\n\n  // merge strategy\n  try {\n    const existingFacts = matches.map((m) => m.memory.content);\n    const merged = await merger.mergeMany(existingFacts, fact);\n    const mergedEmbedding = await embeddingAdapter.embed(merged);\n    const updated = await storage.update(primary.memory.id, {\n      content: merged,\n      embedding: mergedEmbedding,\n    });\n\n    for (const extra of extras) {\n      await storage.delete(extra.memory.id);\n    }\n\n    return updated;\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      `[turbomem] Memory merge failed, falling back to smart replace: ${(error as Error).message}`,\n    );\n    return smartReplace(storage, primary, fact, embedding);\n  }\n}\n","/** Browser build stub — disk directory creation is Node-only. */\nexport async function ensureDiskDirectory(_dataDir: string): Promise<void> {\n  // No-op: browser builds use idb:// or in-memory paths only.\n}\n","import { PGlite } from \"@electric-sql/pglite\";\nimport { vector } from \"@electric-sql/pglite/vector\";\nimport type { Memory, MemoryScope, MemorySearchResult, StorageAdapter } from \"../types.js\";\nimport { DimensionMismatchError, StorageError } from \"../errors.js\";\nimport { ensureDiskDirectory } from \"./pglite-disk.js\";\n\nexport interface PGliteStorageOptions {\n  /**\n   * Directory to persist the database. Defaults to `.turbomem` in\n   * `process.cwd()` on Node, or `idb://turbomem` in the browser.\n   *\n   * Prefix with `idb://` for IndexedDB persistence in the browser.\n   * Pass `\"memory://\"` (or set `inMemory`) for an ephemeral database.\n   */\n  dataDir?: string;\n  /** Use an in-memory database (ignores `dataDir`). Handy for tests. */\n  inMemory?: boolean;\n  /**\n   * When true, PGlite returns query results before IndexedDB flushes complete.\n   * Defaults to `true` for `idb://` paths; otherwise `false`.\n   */\n  relaxedDurability?: boolean;\n}\n\ninterface MemoryRow {\n  id: string;\n  content: string;\n  embedding: string | number[];\n  user_id: string | null;\n  agent_id: string | null;\n  session_id: string | null;\n  metadata: Record<string, unknown> | string | null;\n  created_at: string | Date;\n  updated_at: string | Date;\n  score?: number;\n}\n\nfunction isIndexedDbPath(dataDir: string): boolean {\n  return dataDir.startsWith(\"idb://\");\n}\n\nfunction defaultDataDir(): string {\n  if (typeof process !== \"undefined\" && typeof process.cwd === \"function\") {\n    return `${process.cwd()}/.turbomem`;\n  }\n  return \"idb://turbomem\";\n}\n\nfunction resolveRelaxedDurability(\n  dataDir: string | undefined,\n  explicit: boolean | undefined,\n): boolean | undefined {\n  if (explicit !== undefined) return explicit;\n  if (dataDir && isIndexedDbPath(dataDir)) return true;\n  return undefined;\n}\n\nfunction parseEmbedding(value: string | number[]): number[] {\n  if (Array.isArray(value)) return value;\n  // pgvector serialises as e.g. \"[0.1,0.2,0.3]\"\n  return JSON.parse(value) as number[];\n}\n\nfunction parseMetadata(value: MemoryRow[\"metadata\"]): Record<string, unknown> {\n  if (value == null) return {};\n  if (typeof value === \"string\") {\n    try {\n      return JSON.parse(value) as Record<string, unknown>;\n    } catch {\n      return {};\n    }\n  }\n  return value;\n}\n\nfunction rowToMemory(row: MemoryRow): Memory {\n  return {\n    id: row.id,\n    content: row.content,\n    embedding: parseEmbedding(row.embedding),\n    userId: row.user_id ?? undefined,\n    agentId: row.agent_id ?? undefined,\n    sessionId: row.session_id ?? undefined,\n    metadata: parseMetadata(row.metadata),\n    createdAt: new Date(row.created_at),\n    updatedAt: new Date(row.updated_at),\n  };\n}\n\nfunction toVectorLiteral(embedding: number[]): string {\n  return `[${embedding.join(\",\")}]`;\n}\n\nexport class PGliteStorageAdapter implements StorageAdapter {\n  private db: PGlite | null = null;\n  private dimensions = 0;\n  private readonly dataDir: string | undefined;\n  private readonly inMemory: boolean;\n  private readonly relaxedDurability: boolean | undefined;\n\n  constructor(options: PGliteStorageOptions = {}) {\n    this.inMemory = options.inMemory ?? options.dataDir === \"memory://\";\n    this.dataDir = this.inMemory ? undefined : (options.dataDir ?? defaultDataDir());\n    this.relaxedDurability = resolveRelaxedDurability(this.dataDir, options.relaxedDurability);\n  }\n\n  async init(dimensions: number): Promise<void> {\n    if (!Number.isInteger(dimensions) || dimensions <= 0) {\n      throw new StorageError(`Invalid embedding dimensions: ${dimensions}`);\n    }\n    this.dimensions = dimensions;\n\n    try {\n      if (this.dataDir && !isIndexedDbPath(this.dataDir)) {\n        await ensureDiskDirectory(this.dataDir);\n      }\n\n      const pgOptions = {\n        extensions: { vector },\n        ...(this.relaxedDurability !== undefined\n          ? { relaxedDurability: this.relaxedDurability }\n          : {}),\n      };\n\n      this.db = this.inMemory\n        ? new PGlite(pgOptions)\n        : new PGlite(this.dataDir!, pgOptions);\n\n      await this.db.exec(`CREATE EXTENSION IF NOT EXISTS vector;`);\n\n      // Track the dimension this store was created with so we can fail loudly\n      // if the embedding adapter later changes.\n      await this.db.exec(`\n        CREATE TABLE IF NOT EXISTS turbomem_meta (\n          key   TEXT PRIMARY KEY,\n          value TEXT NOT NULL\n        );\n      `);\n\n      const existing = await this.db.query<{ value: string }>(\n        `SELECT value FROM turbomem_meta WHERE key = 'dimensions'`,\n      );\n\n      if (existing.rows.length > 0) {\n        const storedDim = Number(existing.rows[0].value);\n        if (storedDim !== dimensions) {\n          throw new DimensionMismatchError(\n            `Existing turbomem store was created with ${storedDim}-dimensional vectors but the configured embedding adapter produces ${dimensions}-dimensional vectors. Use a matching embedding model or a fresh data directory.`,\n          );\n        }\n      }\n\n      await this.db.exec(`\n        CREATE TABLE IF NOT EXISTS memories (\n          id          TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,\n          content     TEXT NOT NULL,\n          embedding   vector(${dimensions}),\n          user_id     TEXT,\n          agent_id    TEXT,\n          session_id  TEXT,\n          metadata    JSONB DEFAULT '{}',\n          created_at  TIMESTAMPTZ DEFAULT now(),\n          updated_at  TIMESTAMPTZ DEFAULT now()\n        );\n\n        CREATE INDEX IF NOT EXISTS memories_embedding_idx\n          ON memories USING hnsw (embedding vector_cosine_ops);\n\n        CREATE INDEX IF NOT EXISTS memories_user_id_idx ON memories (user_id);\n        CREATE INDEX IF NOT EXISTS memories_agent_id_idx ON memories (agent_id);\n      `);\n\n      await this.db.query(\n        `INSERT INTO turbomem_meta (key, value) VALUES ('dimensions', $1)\n         ON CONFLICT (key) DO NOTHING`,\n        [String(dimensions)],\n      );\n    } catch (error) {\n      if (error instanceof DimensionMismatchError) throw error;\n      throw new StorageError(`Failed to initialise PGlite storage: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  private requireDb(): PGlite {\n    if (!this.db) {\n      throw new StorageError(\"PGlite storage not initialised. Call init() first.\");\n    }\n    return this.db;\n  }\n\n  async update(\n    id: string,\n    patch: {\n      content: string;\n      embedding: number[];\n      metadata?: Record<string, unknown>;\n    },\n  ): Promise<Memory> {\n    const db = this.requireDb();\n    if (patch.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${patch.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n    try {\n      const result = await db.query<MemoryRow>(\n        `UPDATE memories\n         SET content = $1,\n             embedding = $2::vector,\n             metadata = COALESCE($3::jsonb, metadata),\n             updated_at = now()\n         WHERE id = $4\n         RETURNING *`,\n        [\n          patch.content,\n          toVectorLiteral(patch.embedding),\n          patch.metadata != null ? JSON.stringify(patch.metadata) : null,\n          id,\n        ],\n      );\n      if (result.rows.length === 0) {\n        throw new StorageError(`Memory not found: ${id}`);\n      }\n      return rowToMemory(result.rows[0]);\n    } catch (error) {\n      if (error instanceof StorageError) throw error;\n      throw new StorageError(`Failed to update memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async insert(memory: Omit<Memory, \"id\" | \"createdAt\" | \"updatedAt\">): Promise<Memory> {\n    const db = this.requireDb();\n    if (memory.embedding.length !== this.dimensions) {\n      throw new DimensionMismatchError(\n        `Embedding has ${memory.embedding.length} dimensions but store expects ${this.dimensions}.`,\n      );\n    }\n    try {\n      const result = await db.query<MemoryRow>(\n        `INSERT INTO memories (content, embedding, user_id, agent_id, session_id, metadata)\n         VALUES ($1, $2::vector, $3, $4, $5, $6::jsonb)\n         RETURNING *`,\n        [\n          memory.content,\n          toVectorLiteral(memory.embedding),\n          memory.userId ?? null,\n          memory.agentId ?? null,\n          memory.sessionId ?? null,\n          JSON.stringify(memory.metadata ?? {}),\n        ],\n      );\n      return rowToMemory(result.rows[0]);\n    } catch (error) {\n      throw new StorageError(`Failed to insert memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async search(\n    embedding: number[],\n    scope: MemoryScope,\n    limit: number,\n  ): Promise<MemorySearchResult[]> {\n    const db = this.requireDb();\n    try {\n      const result = await db.query<MemoryRow>(\n        `SELECT *, 1 - (embedding <=> $1::vector) AS score\n         FROM memories\n         WHERE ($2::text IS NULL OR user_id = $2)\n           AND ($3::text IS NULL OR agent_id = $3)\n           AND ($4::text IS NULL OR session_id = $4)\n         ORDER BY embedding <=> $1::vector\n         LIMIT $5`,\n        [\n          toVectorLiteral(embedding),\n          scope.userId ?? null,\n          scope.agentId ?? null,\n          scope.sessionId ?? null,\n          limit,\n        ],\n      );\n\n      return result.rows.map((row) => ({\n        memory: rowToMemory(row),\n        score: typeof row.score === \"number\" ? row.score : Number(row.score),\n      }));\n    } catch (error) {\n      throw new StorageError(`Failed to search memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async getAll(scope: MemoryScope): Promise<Memory[]> {\n    const db = this.requireDb();\n    try {\n      const result = await db.query<MemoryRow>(\n        `SELECT * FROM memories\n         WHERE ($1::text IS NULL OR user_id = $1)\n           AND ($2::text IS NULL OR agent_id = $2)\n           AND ($3::text IS NULL OR session_id = $3)\n         ORDER BY created_at DESC`,\n        [scope.userId ?? null, scope.agentId ?? null, scope.sessionId ?? null],\n      );\n      return result.rows.map(rowToMemory);\n    } catch (error) {\n      throw new StorageError(`Failed to list memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async delete(id: string): Promise<void> {\n    const db = this.requireDb();\n    try {\n      await db.query(`DELETE FROM memories WHERE id = $1`, [id]);\n    } catch (error) {\n      throw new StorageError(`Failed to delete memory: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async deleteAll(scope: MemoryScope): Promise<void> {\n    const db = this.requireDb();\n    if (!scope.userId && !scope.agentId && !scope.sessionId) {\n      throw new StorageError(\n        \"deleteAll requires at least one of userId, agentId, or sessionId to avoid wiping the entire store.\",\n      );\n    }\n    try {\n      await db.query(\n        `DELETE FROM memories\n         WHERE ($1::text IS NULL OR user_id = $1)\n           AND ($2::text IS NULL OR agent_id = $2)\n           AND ($3::text IS NULL OR session_id = $3)`,\n        [scope.userId ?? null, scope.agentId ?? null, scope.sessionId ?? null],\n      );\n    } catch (error) {\n      throw new StorageError(`Failed to delete memories: ${(error as Error).message}`, {\n        cause: error,\n      });\n    }\n  }\n\n  async close(): Promise<void> {\n    if (this.db) {\n      await this.db.close();\n      this.db = null;\n    }\n  }\n}\n","import type {\n  EmbeddingAdapter,\n  Memory,\n  MemoryScope,\n  MemorySearchResult,\n  Message,\n  StorageAdapter,\n  TurboMemoryConfig,\n} from \"./types.js\";\nimport { MessagesSchema } from \"./types.js\";\nimport { ConfigError, NotInitialisedError } from \"./errors.js\";\nimport { OpenAIEmbeddingAdapter } from \"./embeddings/openai.js\";\nimport { VoyageEmbeddingAdapter } from \"./embeddings/voyage.js\";\nimport { GoogleEmbeddingAdapter } from \"./embeddings/google.js\";\nimport { Extractor } from \"./extraction/extractor.js\";\nimport { Merger } from \"./deduplication/merger.js\";\nimport { resolveDeduplicationConfig } from \"./deduplication/resolve-config.js\";\nimport { upsertFact } from \"./deduplication/upsert-fact.js\";\nimport { PGliteStorageAdapter } from \"./storage/pglite.js\";\n\nconst DEFAULT_SEARCH_LIMIT = 10;\n\n/**\n * Browser entry point for turbomem. Same API as {@link TurboMemory} but only\n * supports PGlite (IndexedDB / in-memory) or a custom {@link StorageAdapter}.\n */\nexport class TurboMemory {\n  private readonly config: TurboMemoryConfig;\n  private readonly embeddingAdapter: EmbeddingAdapter;\n  private storageAdapter: StorageAdapter | null = null;\n  private readonly extractor: Extractor;\n  private readonly merger: Merger;\n  private readonly deduplicationConfig: ReturnType<typeof resolveDeduplicationConfig>;\n  private initialised = false;\n  private initPromise: Promise<void> | null = null;\n\n  constructor(config: TurboMemoryConfig) {\n    this.config = config;\n    this.embeddingAdapter = TurboMemory.resolveEmbeddingAdapter(config);\n    if (typeof config.storage === \"object\" && config.storage !== null) {\n      this.storageAdapter = config.storage;\n    }\n    this.extractor = new Extractor({\n      config: {\n        ...config.extraction,\n        apiKey: config.extraction.apiKey ?? TurboMemory.fallbackExtractionKey(config),\n        baseURL: config.extraction.baseURL ?? config.openai?.baseURL,\n      },\n    });\n    this.merger = new Merger({\n      config: {\n        ...config.extraction,\n        apiKey: config.extraction.apiKey ?? TurboMemory.fallbackExtractionKey(config),\n        baseURL: config.extraction.baseURL ?? config.openai?.baseURL,\n      },\n    });\n    this.deduplicationConfig = resolveDeduplicationConfig(config.deduplication);\n  }\n\n  private static fallbackExtractionKey(config: TurboMemoryConfig): string | undefined {\n    if (config.extraction.provider === \"openai\") return config.openai?.apiKey;\n    if (config.extraction.provider === \"google\") return config.google?.apiKey;\n    return undefined;\n  }\n\n  private static resolveEmbeddingAdapter(config: TurboMemoryConfig): EmbeddingAdapter {\n    const { embeddings } = config;\n    if (embeddings === \"openai\") {\n      return new OpenAIEmbeddingAdapter({\n        apiKey: config.openai?.apiKey,\n        baseURL: config.openai?.baseURL,\n      });\n    }\n    if (embeddings === \"local\") {\n      throw new ConfigError(\n        'embeddings: \"local\" is not recommended in the browser (heavy WASM cold start). Use \"google\" or \"voyage\".',\n      );\n    }\n    if (embeddings === \"voyage\") {\n      return new VoyageEmbeddingAdapter({\n        apiKey: config.voyage?.apiKey,\n        baseURL: config.voyage?.baseURL,\n        model: config.voyage?.model,\n        dimensions: config.voyage?.dimensions,\n      });\n    }\n    if (embeddings === \"google\") {\n      return new GoogleEmbeddingAdapter({\n        apiKey: config.google?.apiKey,\n        baseURL: config.google?.baseURL,\n        model: config.google?.model,\n        dimensions: config.google?.dimensions,\n      });\n    }\n    if (typeof embeddings === \"object\" && embeddings !== null) {\n      return embeddings;\n    }\n    throw new ConfigError(`Invalid embeddings config: ${String(embeddings)}`);\n  }\n\n  private ensureStorageAdapter(): StorageAdapter {\n    if (this.storageAdapter) return this.storageAdapter;\n\n    const storage = this.config.storage ?? \"pglite\";\n    if (storage === \"pglite\") {\n      this.storageAdapter = new PGliteStorageAdapter({\n        dataDir: this.config.pglite?.dataDir,\n        inMemory: this.config.pglite?.inMemory,\n        relaxedDurability: this.config.pglite?.relaxedDurability,\n      });\n      return this.storageAdapter;\n    }\n    if (typeof storage === \"string\") {\n      throw new ConfigError(\n        `Storage \"${storage}\" is not available in the browser. Use storage: \"pglite\" or pass a custom StorageAdapter.`,\n      );\n    }\n    throw new ConfigError(`Invalid storage config: ${String(storage)}`);\n  }\n\n  private requireStorageAdapter(): StorageAdapter {\n    if (!this.storageAdapter) {\n      throw new NotInitialisedError();\n    }\n    return this.storageAdapter;\n  }\n\n  async init(): Promise<void> {\n    if (this.initialised) return;\n    if (this.initPromise) return this.initPromise;\n\n    this.initPromise = (async () => {\n      const adapter = this.ensureStorageAdapter();\n      await adapter.init(this.embeddingAdapter.dimensions);\n      this.initialised = true;\n    })();\n\n    try {\n      await this.initPromise;\n    } finally {\n      this.initPromise = null;\n    }\n  }\n\n  async add(messages: Message[], scope: MemoryScope): Promise<Memory[]> {\n    this.assertInitialised();\n    const parsed = MessagesSchema.parse(messages);\n\n    const facts = await this.extractor.extract(parsed);\n    if (facts.length === 0) return [];\n\n    const embeddings = await this.embeddingAdapter.embedBatch(facts);\n\n    const storage = this.requireStorageAdapter();\n    const created: Memory[] = [];\n    for (let i = 0; i < facts.length; i++) {\n      created.push(\n        await upsertFact(\n          storage,\n          this.embeddingAdapter,\n          this.merger,\n          this.deduplicationConfig,\n          facts[i],\n          embeddings[i],\n          scope,\n        ),\n      );\n    }\n    return created;\n  }\n\n  async addFacts(facts: string[], scope: MemoryScope): Promise<Memory[]> {\n    this.assertInitialised();\n    const cleaned = facts.map((f) => f.trim()).filter((f) => f.length > 0);\n    if (cleaned.length === 0) return [];\n\n    const embeddings = await this.embeddingAdapter.embedBatch(cleaned);\n    const storage = this.requireStorageAdapter();\n    const created: Memory[] = [];\n    for (let i = 0; i < cleaned.length; i++) {\n      created.push(\n        await upsertFact(\n          storage,\n          this.embeddingAdapter,\n          this.merger,\n          this.deduplicationConfig,\n          cleaned[i],\n          embeddings[i],\n          scope,\n        ),\n      );\n    }\n    return created;\n  }\n\n  async search(\n    query: string,\n    scope: MemoryScope & { limit?: number },\n  ): Promise<MemorySearchResult[]> {\n    this.assertInitialised();\n    const { limit = DEFAULT_SEARCH_LIMIT, ...rest } = scope;\n    const embedding = await this.embeddingAdapter.embed(query);\n    return this.requireStorageAdapter().search(embedding, rest, limit);\n  }\n\n  async getAll(scope: MemoryScope): Promise<Memory[]> {\n    this.assertInitialised();\n    return this.requireStorageAdapter().getAll(scope);\n  }\n\n  async delete(id: string): Promise<void> {\n    this.assertInitialised();\n    return this.requireStorageAdapter().delete(id);\n  }\n\n  async deleteAll(scope: MemoryScope): Promise<void> {\n    this.assertInitialised();\n    return this.requireStorageAdapter().deleteAll(scope);\n  }\n\n  async close(): Promise<void> {\n    if (this.storageAdapter?.close) {\n      await this.storageAdapter.close();\n    }\n    this.initialised = false;\n  }\n\n  static newId(): string {\n    return globalThis.crypto.randomUUID();\n  }\n\n  private assertInitialised(): void {\n    if (!this.initialised) {\n      throw new NotInitialisedError();\n    }\n  }\n}\n","/**\n * Compute the cosine similarity between two equal-length vectors.\n * Returns a value in the range [-1, 1]; for normalised embeddings this is\n * effectively [0, 1].\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n  if (a.length !== b.length) {\n    throw new Error(\n      `Cannot compute cosine similarity for vectors of different lengths: ${a.length} vs ${b.length}`,\n    );\n  }\n\n  let dot = 0;\n  let magA = 0;\n  let magB = 0;\n\n  for (let i = 0; i < a.length; i++) {\n    dot += a[i] * b[i];\n    magA += a[i] * a[i];\n    magB += b[i] * b[i];\n  }\n\n  const denom = Math.sqrt(magA) * Math.sqrt(magB);\n  if (denom === 0) return 0;\n\n  return dot / denom;\n}\n"]}