{"version":3,"sources":["../src/storage/domains/thread-state/base.ts","../src/storage/domains/thread-state/inmemory.ts","../src/storage/base.ts","../src/storage/domains/base.ts","../src/storage/domains/versioned.ts","../src/storage/git-history.ts","../src/storage/source-control.ts","../src/storage/filesystem-versioned.ts"],"names":["MastraBase","realpathSync","relative","execFile"],"mappings":";;;;;;;;AAkEO,IAAe,kBAAA,GAAf,cAA0CA,4BAAA,CAAW;AAAA,EAC1D,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM;AAAA,MACJ,SAAA,EAAW,SAAA;AAAA,MACX,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AA4BF;;;AClGA,SAAS,MAAS,KAAA,EAAa;AAC7B,EAAA,OAAO,KAAA,KAAU,MAAA,GAAY,KAAA,GAAS,eAAA,CAAgB,KAAK,CAAA;AAC7D;AAcO,IAAM,0BAAA,GAAN,cAAyC,kBAAA,CAAmB;AAAA,EAChD,aAAA,uBAAoB,GAAA,EAAkC;AAAA,EAEvE,MAAM,IAAA,GAAsB;AAAA,EAE5B;AAAA,EAEA,MAAM,QAAA,CAAsB,EAAE,QAAA,EAAU,MAAK,EAA+D;AAC1G,IAAA,MAAM,QAAQ,IAAA,CAAK,aAAA,CAAc,IAAI,QAAQ,CAAA,EAAG,IAAI,IAAI,CAAA;AACxD,IAAA,OAAO,KAAA,KAAU,MAAA,GAAY,MAAA,GAAY,KAAA,CAAM,KAAU,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,QAAA,CAAsB,EAAE,QAAA,EAAU,IAAA,EAAM,OAAM,EAAgE;AAClH,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,uBAAa,GAAA,EAAqB;AAClC,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AAAA,IACzC;AACA,IAAA,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,WAAA,CAAY,EAAE,QAAA,EAAU,MAAK,EAAsD;AACvF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC9C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AAClB,IAAA,IAAI,OAAO,IAAA,KAAS,CAAA,EAAG,IAAA,CAAK,aAAA,CAAc,OAAO,QAAQ,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,EAC3B;AACF;;;ACUO,IAAM,cAAA,GAAiB;AAAA,EAC5B,QAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AAUO,SAAS,gBAAA,CAAiB,cAA0C,YAAA,EAA8B;AACvG,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,MAAA,CAAO,gBAAA;AAAA,EAChB,CAAA,MAAA,IAAW,iBAAiB,CAAA,EAAG;AAC7B,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,MAAA,IAAW,OAAO,YAAA,KAAiB,QAAA,IAAY,eAAe,CAAA,EAAG;AAC/D,IAAA,OAAO,YAAA;AAAA,EACT,CAAA,MAAA,IAAW,OAAO,YAAA,KAAiB,QAAA,IAAY,eAAe,CAAA,EAAG;AAC/D,IAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,YAAA;AACT;AAWO,SAAS,mBAAA,CACd,IAAA,EACA,YAAA,EACA,iBAAA,EAC6C;AAC7C,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,YAAA,KAAiB,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAO,iBAAA;AAAA,IAC5C,OAAA,EAAS,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA,GAC5C;AACF;AAyIO,IAAM,oBAAA,GAAN,cAAmCA,4BAAA,CAAW;AAAA,EACzC,cAAA,GAA0C,IAAA;AAAA,EAC1C,eAAA,GAAkB,IAAA;AAAA,EAE5B,EAAA;AAAA,EACA,MAAA;AAAA,EACU,MAAA;AAAA;AAAA;AAAA;AAAA,EAKV,WAAA,GAAuB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASb,aAAA;AAAA,EACA,YAAA;AAAA,EAEV,YAAY,MAAA,EAAoC;AAC9C,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQ,sBAAA;AAE5B,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,OAAO,MAAA,CAAO,EAAA,KAAO,QAAA,IAAY,MAAA,CAAO,EAAA,CAAG,IAAA,EAAK,KAAM,EAAA,EAAI;AAC1E,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,0CAAA,CAA4C,CAAA;AAAA,IACrE;AAEA,IAAA,KAAA,CAAM;AAAA,MACJ,SAAA,EAAW,SAAA;AAAA,MACX;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,EAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,IAAe,KAAA;AAGzC,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,MAAA,IAAU,OAAO,OAAA,EAAS;AACrD,MAAA,MAAM,aAAA,GAAgB,OAAO,OAAA,EAAS,MAAA;AACtC,MAAA,MAAM,YAAA,GAAe,OAAO,MAAA,EAAQ,MAAA;AACpC,MAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,IAAW,EAAC;AAI3C,MAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,OAAA;AAC5B,MAAA,IAAA,CAAK,eAAe,MAAA,CAAO,MAAA;AAG3B,MAAA,MAAM,iBAAA,GAAoB,iBAAiB,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,KAAM,MAAS,CAAA;AACjG,MAAA,MAAM,gBAAA,GAAmB,gBAAgB,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,KAAM,MAAS,CAAA;AAC9F,MAAA,MAAM,kBAAA,GAAqB,OAAO,MAAA,CAAO,eAAe,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,MAAM,MAAS,CAAA;AAEnF,MAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,gBAAA,IAAoB,CAAC,kBAAA,EAAoB;AAClE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAY,cAAc,CAAA;AAGtD,MAAA,MAAM,OAAA,GAAU,CAAiC,GAAA,KAA0C;AACzF,QAAA,IAAI,gBAAgB,GAAG,CAAA,KAAM,MAAA,EAAW,OAAO,gBAAgB,GAAG,CAAA;AAClE,QAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,IAAK,YAAA,GAAe,GAAG,CAAA,KAAM,MAAA,EAAW,OAAO,YAAA,CAAa,GAAG,CAAA;AAC1F,QAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,MAC5B,CAAA;AAGA,MAAA,IAAA,CAAK,MAAA,GAAS;AAAA,QACZ,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AAAA,QACxB,SAAA,EAAW,QAAQ,WAAW,CAAA;AAAA,QAC9B,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AAAA,QACxB,aAAA,EAAe,QAAQ,eAAe,CAAA;AAAA,QACtC,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AAAA,QACxB,QAAA,EAAU,QAAQ,UAAU,CAAA;AAAA,QAC5B,WAAA,EAAa,QAAQ,aAAa,CAAA;AAAA,QAClC,YAAA,EAAc,QAAQ,cAAc,CAAA;AAAA,QACpC,iBAAA,EAAmB,QAAQ,mBAAmB,CAAA;AAAA,QAC9C,UAAA,EAAY,QAAQ,YAAY,CAAA;AAAA,QAChC,UAAA,EAAY,QAAQ,YAAY,CAAA;AAAA,QAChC,UAAA,EAAY,QAAQ,YAAY,CAAA;AAAA,QAChC,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AAAA,QACxB,SAAA,EAAW,QAAQ,WAAW,CAAA;AAAA,QAC9B,KAAA,EAAO,QAAQ,OAAO,CAAA;AAAA,QACtB,eAAA,EAAiB,QAAQ,iBAAiB,CAAA;AAAA,QAC1C,SAAA,EAAW,QAAQ,WAAW,CAAA;AAAA,QAC9B,QAAA,EAAU,QAAQ,UAAU,CAAA;AAAA,QAC5B,OAAA,EAAS,QAAQ,SAAS,CAAA;AAAA,QAC1B,uBAAA,EAAyB,QAAQ,yBAAyB,CAAA;AAAA,QAC1D,aAAA,EAAe,QAAQ,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKtC,WAAA,EAAa,OAAA,CAAQ,aAAa,CAAA,IAAK,IAAI,0BAAA;AAA2B,OACxE;AAAA,IACF;AAAA,EAEF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAA,CAAiB,MAAA,EAA0B,IAAA,mBAAqB,IAAI,KAAa,EAAS;AACxF,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpB,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,KAAoB;AACnC,MAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AAC/D,MAAA,MAAM,KAAM,MAAA,CAAkF,gBAAA;AAC9F,MAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,QAAA,EAAA,CAAG,IAAA,CAAK,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AACA,IAAA,IAAI,IAAA,CAAK,aAAA,EAAe,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAClD,IAAA,IAAI,IAAA,CAAK,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA;AAChD,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,KAAA,MAAW,UAAU,MAAA,CAAO,MAAA,CAAO,KAAK,MAAM,CAAA,UAAW,MAAM,CAAA;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,SAAyC,SAAA,EAAsD;AACnG,IAAA,OAAO,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,IAAA,GAAsB;AAE1B,IAAA,IAAI,IAAA,CAAK,eAAA,IAAoB,MAAM,IAAA,CAAK,cAAA,EAAiB;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,QAAA,EAAS;AACpC,IAAA,MAAM,IAAA,CAAK,cAAA;AAAA,EACb;AAAA,EAEA,MAAM,QAAA,GAA6B;AAIjC,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAA0B;AACpD,IAAA,IAAI,IAAA,CAAK,aAAA,EAAe,aAAA,CAAc,GAAA,CAAI,KAAK,aAAa,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,YAAA,EAAc,aAAA,CAAc,GAAA,CAAI,KAAK,YAAY,CAAA;AAC1D,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,aAAa,CAAA,CAAE,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,IAAA,EAAM,CAAC,CAAA;AAIjE,IAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAa;AAC5C,IAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,KAAkC;AAC1D,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACrB,MAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,EAAG;AACjD,QAAA,IAAI,MAAA,EAAQ,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AACA,IAAA,gBAAA,CAAiB,KAAK,aAAa,CAAA;AACnC,IAAA,gBAAA,CAAiB,KAAK,YAAY,CAAA;AAKlC,IAAA,MAAM,YAA6B,EAAC;AACpC,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,KAAkD;AACnE,MAAA,IAAI,CAAC,MAAA,IAAU,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC/C,MAAA,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAA;AAC5B,MAAA,kBAAA,CAAmB,IAAI,MAAM,CAAA;AAAA,IAC/B,CAAA;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAC5B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,SAAS,CAAA;AAC/B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAC5B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,aAAa,CAAA;AACnC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAC5B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,QAAQ,CAAA;AAC9B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,WAAW,CAAA;AACjC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,YAAY,CAAA;AAClC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,iBAAiB,CAAA;AACvC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,UAAU,CAAA;AAChC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,UAAU,CAAA;AAChC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,UAAU,CAAA;AAChC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,MAAM,CAAA;AAC5B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,SAAS,CAAA;AAC/B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,KAAK,CAAA;AAC3B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,eAAe,CAAA;AACrC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,SAAS,CAAA;AAC/B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,QAAQ,CAAA;AAC9B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,OAAO,CAAA;AAC7B,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,uBAAuB,CAAA;AAC7C,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,aAAa,CAAA;AACnC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,WAAW,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,OAAA,CAAQ,IAAI,SAAS,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAQF;AAUO,IAAM,aAAA,GAAN,cAA4B,oBAAA,CAAqB;AAAC;;;AC3elD,IAAe,aAAA,GAAf,cAAqCA,4BAAA,CAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrD,MAAM,IAAA,GAAsB;AAAA,EAE5B;AAQF;;;AC6EA,IAAM,mBAAA,GAAmD;AAAA,EACvD,SAAA,EAAW,IAAA;AAAA,EACX,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,kBAAA,GAAwD;AAAA,EAC5D,GAAA,EAAK,IAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAEA,IAAM,oBAAA,GAA4D;AAAA,EAChE,aAAA,EAAe,IAAA;AAAA,EACf,SAAA,EAAW;AACb,CAAA;AAuBO,IAAe,sBAAA,GAAf,cAaG,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4CZ,sBAAsB,OAAA,EAAuC;AACrE,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,IAAA,CAAK,qBAAqB,CAAA;AAEtD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAA,CAAgB,EAAA,EAAY,OAAA,EAA+D;AAC/F,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAEpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,IAAA,EAAiD;AAClE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAEnC,IAAA,MAAM,SAAU,IAAA,EAA8C,MAAA;AAC9D,IAAA,MAAM,QAAA,GAAY,MAAA,CAAmC,IAAA,CAAK,OAAO,CAAA;AACjE,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC7B,QAAA,CAAS,IAAI,CAAA,MAAA,KAAU,IAAA,CAAK,cAAc,MAAA,EAAQ,EAAE,MAAA,EAAsD,CAAC;AAAA,KAC7G;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,CAAC,IAAA,CAAK,OAAO,GAAG;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,aAAA,CAAc,MAAA,EAAiB,OAAA,EAAwD;AACrG,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,WAAA;AAClC,IAAA,IAAI,OAAA,GAA2B,IAAA;AAE/B,IAAA,IAAI,SAAS,SAAA,EAAW;AAEtB,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,WAAW,OAAA,EAAS;AAE7B,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,EAAE,CAAA;AAAA,IACjD,CAAA,MAAO;AAEL,MAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,eAAe,CAAA;AAEtD,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,IAAA,CAAK,MAAA,EAAQ,IAAA;AAAA,YACX,CAAA,OAAA,EAAU,MAAA,CAAO,EAAE,CAAA,qBAAA,EAAwB,OAAO,eAAe,CAAA,uDAAA;AAAA,WACnE;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,EAAE,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,qBAAA,CAAsB,OAAO,CAAA;AACzD,MAAA,OAAO;AAAA,QACL,GAAG,MAAA;AAAA,QACH,GAAG,cAAA;AAAA,QACH,mBAAmB,OAAA,CAAQ;AAAA,OAC7B;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMU,YAAA,CACR,OAAA,EACA,gBAAA,GAAwC,MAAA,EACkB;AAC1D,IAAA,OAAO;AAAA,MACL,OAAO,OAAA,EAAS,KAAA,IAAS,QAAQ,KAAA,IAAS,mBAAA,GAAsB,QAAQ,KAAA,GAAQ,WAAA;AAAA,MAChF,WAAW,OAAA,EAAS,SAAA,IAAa,QAAQ,SAAA,IAAa,kBAAA,GAAqB,QAAQ,SAAA,GAAY;AAAA,KACjG;AAAA,EACF;AAAA,EAEU,mBAAA,CACR,OAAA,EACA,gBAAA,GAAgD,MAAA,EAC0B;AAC1E,IAAA,OAAO;AAAA,MACL,OAAO,OAAA,EAAS,KAAA,IAAS,QAAQ,KAAA,IAAS,oBAAA,GAAuB,QAAQ,KAAA,GAAQ,eAAA;AAAA,MACjF,WAAW,OAAA,EAAS,SAAA,IAAa,QAAQ,SAAA,IAAa,kBAAA,GAAqB,QAAQ,SAAA,GAAY;AAAA,KACjG;AAAA,EACF;AACF;ACzRO,IAAM,aAAN,MAAiB;AAAA;AAAA,EAEd,aAAA,uBAAoB,GAAA,EAA4B;AAAA;AAAA,EAGhD,WAAA,uBAAkB,GAAA,EAAyB;AAAA;AAAA;AAAA;AAAA,EAK3C,aAAA,uBAAoB,GAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjD,MAAM,UAAU,GAAA,EAA+B;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACzC,IAAA,IAAI,MAAA,KAAW,OAAO,OAAO,KAAA;AAC7B,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,IAAA;AAEvC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAC,WAAA,EAAa,iBAAiB,CAAC,CAAA,EAAG,IAAA,EAAK;AAC3E,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,cAAA,CAAe,GAAA,EAAa,QAAA,EAAkB,QAAgB,EAAA,EAA0B;AAC5F,IAAA,MAAM,WAAW,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,QAAQ,IAAI,KAAK,CAAA,CAAA;AAC5C,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAClC,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAI;AAChC,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AACjC,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AAGF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK;AAAA,QAC/B,KAAA;AAAA,QACA,eAAe,KAAK,CAAA,CAAA;AAAA,QACpB,wBAAA;AAAA,QACA,UAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,MAAM,UAAuB,EAAC;AAC9B,MAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAClC,QAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,QAAA,IAAI,CAAC,OAAA,EAAS;AAEd,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACpC,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,WAAW,CAAC,CAAA;AAClD,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,WAAW,CAAC,CAAA;AAElD,QAAA,IAAI,QAAA,KAAa,EAAA,IAAM,QAAA,KAAa,EAAA,IAAM,aAAa,EAAA,EAAI;AAE3D,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,UAC/B,IAAA,EAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAM,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,UACpD,MAAA,EAAQ,OAAA,CAAQ,KAAA,CAAM,QAAA,GAAW,GAAG,QAAQ,CAAA;AAAA,UAC5C,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,QAAA,GAAW,CAAC;AAAA,SACpC,CAAA;AAAA,MACH;AAEA,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,CAAA;AACtC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AACjC,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAA,CACJ,GAAA,EACA,UAAA,EACA,QAAA,EACmB;AACnB,IAAA,MAAM,WAAW,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,UAAU,IAAI,QAAQ,CAAA,CAAA;AACjD,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,GAAI,OAAO,IAAA;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,EAAK,QAAQ,CAAA;AACjD,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAC,MAAA,EAAQ,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAC,CAAA;AACrE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AACvC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,cAAA,CAAe,KAAa,QAAA,EAA0B;AAC5D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACvC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAE,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,QAAA,GAAWC,gBAAa,IAAI,CAAA;AAClC,IAAA,MAAM,OAAA,GAAUA,gBAAa,GAAG,CAAA;AAChC,IAAA,MAAM,MAAA,GAASC,aAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACzC,IAAA,OAAO,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,IAAA,CAAK,KAAa,IAAA,EAAiC;AACzD,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAAC,sBAAA,CAAS,KAAA,EAAO,IAAA,EAAM,EAAE,GAAA,EAAK,SAAA,EAAW,EAAA,GAAK,IAAA,GAAO,IAAA,EAAK,EAAG,CAAC,KAAA,EAAO,MAAA,KAAW;AAC7E,QAAA,IAAI,KAAA,SAAc,KAAK,CAAA;AAAA,qBACV,MAAM,CAAA;AAAA,MACrB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACF;;;AC5GO,IAAM,yBAAA,GAA4B;AAElC,SAAS,8BAAA,CAA+B,WAAmB,QAAA,EAA0B;AAC1F,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,kBAAA,CAAmB,QAAQ,CAAC,CAAA,KAAA,CAAA;AACrD;AAEO,SAAS,uBAAuB,OAAA,EAAyB;AAC9D,EAAA,OAAO,8BAAA,CAA+B,2BAA2B,OAAO,CAAA;AAC1E;;;AC3EA,IAAM,kBAAA,GAAqB,MAAA;AAO3B,SAAS,eAAe,KAAA,EAAyB;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,cAAc,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,SAAS,OAAO,KAAA,KAAU,QAAA,IAAY,EAAE,iBAAiB,IAAA,CAAA,EAAO;AAClE,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACZ,OAAO,OAAA,CAAQ,KAAgC,CAAA,CAC5C,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,UAAU,MAAS,CAAA,CACzC,IAAA,CAAK,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,KAAK,MAAM,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,EACnD,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAC,KAAK,cAAA,CAAe,KAAK,CAAC,CAAC;AAAA,KACvD;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AA2DO,IAAM,0BAAA,GAAN,MAAM,2BAAA,CAGX;AAAA,EACS,EAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,IAAA;AAAA,EACA,qBAAA;AAAA,EACQ,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,4BAAA;AAAA,EACA,uBAAA;AAAA;AAAA;AAAA;AAAA,EAQT,QAAA,uBAAe,GAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpC,QAAA,uBAAe,GAAA,EAAsB;AAAA;AAAA;AAAA;AAAA,EAKrC,QAAA,GAAW,KAAA;AAAA;AAAA;AAAA;AAAA,EAKnB,OAAe,UAAA,GAAa,IAAI,UAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnC,iBAAA,GAA0C,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1C,gBAAA,uBAAuB,GAAA,EAAoB;AAAA,EAEnD,YAAY,MAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,EAAA;AACjB,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AACnB,IAAA,IAAA,CAAK,wBAAwB,MAAA,CAAO,qBAAA;AACpC,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,eAAA,IAAmB,EAAA;AACjD,IAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,iBAAA;AAChC,IAAA,IAAA,CAAK,+BAA+B,MAAA,CAAO,4BAAA;AAC3C,IAAA,IAAA,CAAK,0BAA0B,MAAA,CAAO,uBAAA;AAAA,EACxC;AAAA,EAEQ,kBAAkB,QAAA,EAA0B;AAClD,IAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,8CAAA,CAAgD,CAAA;AAAA,IAC9E;AACA,IAAA,OAAO,8BAAA,CAA+B,IAAA,CAAK,iBAAA,EAAmB,QAAQ,CAAA;AAAA,EACxE;AAAA,EAEQ,8BAA8B,QAAA,EAA0B;AAC9D,IAAA,MAAM,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,QAAA;AAC9C,IAAA,OAAO,kBAAA,CAAmB,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAC,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAa,EAAA,EAAqB;AACvC,IAAA,OAAO,EAAA,CAAG,WAAW,kBAAkB,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,MAAM,eAAA,GAAkB,CAAC,QAAA,EAAkB,cAAA,KAA4C;AACrF,MAAA,MAAM,SAAA,GAAY,YAAY,QAAQ,CAAA,GAAA,CAAA;AACtC,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAGrB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,EAAA,EAAI,QAAA;AAAA,QACJ,MAAA,EAAQ,WAAA;AAAA,QACR,eAAA,EAAiB,SAAA;AAAA,QACjB,SAAA,EAAW,GAAA;AAAA,QACX,SAAA,EAAW;AAAA,OACb;AAEA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AAIlC,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,EAAA,EAAI,SAAA;AAAA,QACJ,CAAC,IAAA,CAAK,aAAa,GAAG,QAAA;AAAA,QACtB,aAAA,EAAe,CAAA;AAAA,QACf,GAAG,cAAA;AAAA,QACH,SAAA,EAAW;AAAA,OACb;AAEA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAAA,IACtC,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,CAAG,UAAA,CAAoC,KAAK,YAAY,CAAA;AAE9E,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,cAAc,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjE,MAAA,IAAI,CAAC,cAAA,IAAkB,OAAO,cAAA,KAAmB,QAAA,EAAU;AAC3D,MAAA,eAAA,CAAgB,UAAU,cAAc,CAAA;AAAA,IAC1C;AAEA,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,KAAA,MAAW,YAAY,IAAA,CAAK,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACtE,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,6BAAA,CAA8B,QAAQ,CAAA;AAC5D,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA;AAClD,QAAA,IAAI,CAAC,cAAA,IAAkB,OAAO,cAAA,KAAmB,QAAA,EAAU;AAC3D,QAAA,eAAA,CAAgB,UAAU,cAAc,CAAA;AAAA,MAC1C;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAK,cAAA,EAAe;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAA,GAAkC;AAC9C,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,MAAM,IAAA,CAAK,iBAAA;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,cAAA,GAAgC;AAC5C,IAAA,MAAM,MAAM,2BAAA,CAA2B,UAAA;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,EAAA,CAAG,GAAA;AAGpB,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,cAAA,CAAe,KAAK,IAAA,CAAK,YAAA,EAAc,KAAK,eAAe,CAAA;AAGrF,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,OAAO,EAAE,OAAA,EAAQ;AAG5C,IAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAoB;AAEnD,IAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAElD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,MAAA,MAAM,MAAA,GAAS,eAAe,CAAC,CAAA;AAG/B,MAAA,MAAM,WAAA,GAAc,MAAM,GAAA,CAAI,eAAA;AAAA,QAC5B,GAAA;AAAA,QACA,MAAA,CAAO,IAAA;AAAA,QACP,IAAA,CAAK;AAAA,OACP;AACA,MAAA,IAAI,CAAC,WAAA,EAAa;AAGlB,MAAA,KAAA,MAAW,CAAC,QAAA,EAAU,cAAc,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACpE,QAAA,IAAI,CAAC,cAAA,IAAkB,OAAO,cAAA,KAAmB,QAAA,EAAU;AAG3D,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAChD,QAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA,KAAM,UAAA,EAAY;AACpD,QAAA,iBAAA,CAAkB,GAAA,CAAI,UAAU,UAAU,CAAA;AAE1C,QAAA,MAAM,KAAA,GAAA,CAAS,kBAAA,CAAmB,GAAA,CAAI,QAAQ,KAAK,CAAA,IAAK,CAAA;AACxD,QAAA,kBAAA,CAAmB,GAAA,CAAI,UAAU,KAAK,CAAA;AAEtC,QAAA,MAAM,YAAY,CAAA,EAAG,kBAAkB,GAAG,MAAA,CAAO,IAAI,IAAI,QAAQ,CAAA,CAAA;AAGjE,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAElC,QAAA,MAAM,OAAA,GAAU;AAAA,UACd,EAAA,EAAI,SAAA;AAAA,UACJ,CAAC,IAAA,CAAK,aAAa,GAAG,QAAA;AAAA,UACtB,aAAA,EAAe,KAAA;AAAA,UACf,eAAe,MAAA,CAAO,OAAA;AAAA,UACtB,GAAG,cAAA;AAAA,UACH,WAAW,MAAA,CAAO;AAAA,SACpB;AAEA,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAAA,MACtC;AAAA,IACF;AAKA,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AAErC,MAAA,KAAA,MAAW,YAAY,IAAA,CAAK,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACtE,QAAA,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,6BAAA,CAA8B,QAAQ,CAAC,CAAA;AAAA,MAC/D;AAGA,MAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,EAAG;AAC3C,QAAA,YAAA,CAAa,IAAI,QAAQ,CAAA;AAAA,MAC3B;AAEA,MAAA,KAAA,MAAW,YAAY,YAAA,EAAc;AACnC,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,uBAAA,CAAwB,UAAU,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAC,CAAA;AAChG,QAAA,kBAAA,CAAmB,GAAA,CAAI,UAAU,KAAK,CAAA;AAAA,MACxC;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,gBAAA,GAAmB,kBAAA;AAIxB,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,QAAQ,CAAA,IAAK,kBAAA,EAAoB;AACrD,MAAA,MAAM,iBAAA,GAAoB,YAAY,QAAQ,CAAA,GAAA,CAAA;AAC9C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,iBAAiB,CAAA;AACnD,MAAA,IAAI,OAAA,EAAS;AACX,QAAC,OAAA,CAAoC,gBAAgB,QAAA,GAAW,CAAA;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,uBAAA,CAAwB,QAAA,EAAkB,UAAA,EAAqC;AAC3F,IAAA,MAAM,MAAM,2BAAA,CAA2B,UAAA;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,EAAA,CAAG,GAAA;AACpB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAChD,IAAA,MAAM,mBAAmB,MAAM,GAAA,CAAI,eAAe,GAAA,EAAK,QAAA,EAAU,KAAK,eAAe,CAAA;AACrF,IAAA,IAAI,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG,OAAO,UAAA;AAE1C,IAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,gBAAgB,EAAE,OAAA,EAAQ;AACvD,IAAA,IAAI,yBAAA;AACJ,IAAA,IAAI,KAAA,GAAQ,UAAA;AAEZ,IAAA,KAAA,MAAW,UAAU,gBAAA,EAAkB;AACrC,MAAA,MAAM,iBAAiB,MAAM,GAAA,CAAI,gBAAyC,GAAA,EAAK,MAAA,CAAO,MAAM,QAAQ,CAAA;AACpG,MAAA,IAAI,CAAC,cAAA,IAAkB,OAAO,cAAA,KAAmB,QAAA,EAAU;AAIzD,QAAA,yBAAA,GAA4B,MAAA;AAC5B,QAAA;AAAA,MACF;AAIA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAChD,MAAA,IAAI,8BAA8B,UAAA,EAAY;AAC9C,MAAA,yBAAA,GAA4B,UAAA;AAE5B,MAAA,KAAA,IAAS,CAAA;AAET,MAAA,MAAM,YAAY,CAAA,EAAG,kBAAkB,GAAG,MAAA,CAAO,IAAI,IAAI,QAAQ,CAAA,CAAA;AACjE,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAElC,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,EAAA,EAAI,SAAA;AAAA,QACJ,CAAC,IAAA,CAAK,aAAa,GAAG,QAAA;AAAA,QACtB,aAAA,EAAe,KAAA;AAAA,QACf,eAAe,MAAA,CAAO,OAAA;AAAA,QACtB,GAAG,cAAA;AAAA,QACH,WAAW,MAAA,CAAO;AAAA,OACpB;AAEA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,WAAoD,EAAC;AAC3D,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAqC;AAE/D,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,CAAA,IAAK,KAAK,QAAA,EAAU;AAC9C,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,eAAA,EAAiB;AAE9D,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,eAAe,CAAA;AACxD,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,qBAAA,CAAsB,OAAO,CAAA;AACzD,MAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,4BAAA,GAA+B,MAAM,CAAA,EAAG;AACzE,QAAA,MAAM,WAAW,IAAA,CAAK,uBAAA,GAClB,KAAK,uBAAA,CAAwB,cAAA,EAAgB,MAAM,CAAA,GACnD,cAAA;AACJ,QAAA,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,cAAA,CAAe,QAAQ,CAA4B,CAAA;AAAA,MACjF,CAAA,MAAO;AAIL,QAAA,QAAA,CAAS,QAAQ,CAAA,GAAI,cAAA,CAAe,cAAc,CAAA;AAAA,MACpD;AAAA,IACF;AAOA,IAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,QAAQ,EAAE,MAAA,GAAS,CAAA;AACxD,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,KAAK,YAAY,CAAA;AACnE,IAAA,IAAI,gBAAA,IAAoB,CAAC,IAAA,CAAK,iBAAA,IAAqB,gBAAA,EAAkB;AACnE,MAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,YAAA,EAAc,QAAQ,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,KAAA,MAAW,YAAY,IAAA,CAAK,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACtE,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,6BAAA,CAA8B,QAAQ,CAAA;AAC5D,QAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChC,UAAA,IAAA,CAAK,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAAA,QACnC;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,CAAC,QAAA,EAAU,cAAc,CAAA,IAAK,aAAA,EAAe;AACtD,QAAA,IAAA,CAAK,GAAG,WAAA,CAAY,IAAA,CAAK,iBAAA,CAAkB,QAAQ,GAAG,cAAc,CAAA;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAAA,EAA4C;AACxE,IAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,IAAA,CAAK,qBAAqB,CAAA;AACtD,IAAA,MAAM,SAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,EAAA,EAAqC;AACjD,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAE,CAAA,GAAI,IAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,YAAA,CAAa,EAAA,EAAY,MAAA,EAAmC;AAChE,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,IAAI,CAAA,iBAAA,EAAoB,EAAE,CAAA,eAAA,CAAiB,CAAA;AAAA,IACrE;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,eAAA,CAAgB,MAAM,CAAC,CAAA;AAC7C,IAAA,OAAO,gBAAgB,MAAM,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,YAAA,CAAa,EAAA,EAAY,OAAA,EAAoD;AACjF,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACrC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,IAAI,CAAA,iBAAA,EAAoB,EAAE,CAAA,UAAA,CAAY,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,QAAA,EAAS;AAE9B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,MAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,MAAA,IAAI,UAAU,MAAA,EAAW;AAEzB,MAAA,IAAI,QAAQ,UAAA,IAAc,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AACrE,QAAA,OAAA,CAAQ,UAAU,CAAA,GAAI;AAAA,UACpB,GAAK,OAAA,CAAQ,UAAU,CAAA,IAA6C,EAAC;AAAA,UACrE,GAAI;AAAA,SACN;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,MACjB;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,WAAW,CAAA,mBAAI,IAAI,IAAA,EAAK;AAEhC,IAAA,MAAM,aAAA,GAAgB,OAAA;AACtB,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,eAAA,CAAgB,aAAa,CAAC,CAAA;AAKpD,IAAA,MAAM,YAAA,GAAe,SAAS,MAAA,KAAW,WAAA;AACzC,IAAA,MAAM,WAAA,GAAc,aAAA,CAAc,MAAA,KAAW,WAAA,IAAe,aAAA,CAAc,eAAA;AAC1E,IAAA,IAAI,WAAA,IAAgB,YAAA,IAAgB,OAAA,CAAQ,QAAQ,MAAM,MAAA,EAAY;AACpE,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAEA,IAAA,OAAO,gBAAgB,aAAa,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,aAAa,EAAA,EAA2B;AAC5C,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AACvB,IAAA,MAAM,IAAA,CAAK,yBAAyB,EAAE,CAAA;AACtC,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,MAAM,aAAa,IAAA,EAMkB;AACnC,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,MAAM,EAAE,OAAO,CAAA,EAAG,OAAA,EAAS,cAAc,OAAA,EAAS,OAAA,EAAS,SAAQ,GAAI,IAAA;AAEvE,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,YAAA,EAAc,GAAG,CAAA;AAClD,IAAA,IAAI,IAAA,GAAO,CAAA,EAAG,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAEjD,IAAA,IAAI,WAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAGhD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,QAAA,IAAI,UAAU,MAAA,EAAW;AACzB,QAAA,IAAI,QAAQ,UAAA,IAAc,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AACrE,UAAA,QAAA,GAAW,QAAA,CAAS,OAAO,CAAA,CAAA,KAAK;AAC9B,YAAA,MAAM,IAAA,GAAQ,EAA8B,UAAU,CAAA;AACtD,YAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,YAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,CAAE,KAAA;AAAA,cACtD,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAC,CAAC,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC;AAAA,aAC1D;AAAA,UACF,CAAC,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAA,CAAA,KAAM,CAAA,CAA8B,GAAG,MAAM,KAAK,CAAA;AAAA,QAC/E;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAS,SAAS,KAAA,IAAoB,WAAA;AAC5C,IAAA,MAAM,SAAA,GAAa,SAAS,SAAA,IAAwB,MAAA;AACpD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,MAAM,OAAO,IAAI,IAAA,CAAM,EAA8B,KAAK,CAAkB,EAAE,OAAA,EAAQ;AACtF,MAAA,MAAM,OAAO,IAAI,IAAA,CAAM,EAA8B,KAAK,CAAkB,EAAE,OAAA,EAAQ;AACtF,MAAA,OAAO,SAAA,KAAc,KAAA,GAAQ,IAAA,GAAO,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,IACpD,CAAC,CAAA;AAED,IAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,kBAAA,KAAuB,mBAAA,CAAoB,IAAA,EAAM,cAAc,OAAO,CAAA;AAE/F,IAAA,OAAO;AAAA,MACL,CAAC,OAAO,GAAG,SAAS,KAAA,CAAM,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,MAClD,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,IAAA;AAAA,MACA,OAAA,EAAS,kBAAA;AAAA,MACT,OAAA,EAAS,MAAA,GAAS,OAAA,GAAU,QAAA,CAAS;AAAA,KACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,KAAA,EAAoC;AACtD,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,kBAAA,EAAqB,KAAA,CAAM,EAAE,CAAA,eAAA,CAAiB,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,QAAA,GAAY,KAAA,CAAkC,IAAA,CAAK,aAAa,CAAA;AAGtE,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,MAAA,IAAK,CAAA,CAA8B,KAAK,aAAa,CAAA,KAAM,YAAY,CAAA,CAAE,aAAA,KAAkB,MAAM,aAAA,EAAe;AAC9G,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,oBAAoB,KAAA,CAAM,aAAa,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC7G;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAoB;AAAA,MACxB,GAAG,KAAA;AAAA,MACH,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,eAAA,CAAgB,OAAO,CAAC,CAAA;AACpD,IAAA,OAAO,gBAAgB,OAAO,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,WAAW,EAAA,EAAsC;AACrD,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,GAAI,eAAA,CAAgB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAE,CAAA,GAAI,IAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,kBAAA,CAAmB,QAAA,EAAkB,aAAA,EAAiD;AAC1F,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,MAAA,IAAK,EAA8B,IAAA,CAAK,aAAa,MAAM,QAAA,IAAY,CAAA,CAAE,kBAAkB,aAAA,EAAe;AACxG,QAAA,OAAO,gBAAgB,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,QAAA,EAA4C;AACjE,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,IAAA,IAAI,MAAA,GAA0B,IAAA;AAC9B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,MAAA,IAAK,CAAA,CAA8B,IAAA,CAAK,aAAa,CAAA,KAAM,QAAA,EAAU;AACnE,QAAA,IAAI,CAAC,MAAA,IAAU,CAAA,CAAE,aAAA,GAAgB,OAAO,aAAA,EAAe;AACrD,UAAA,MAAA,GAAS,CAAA;AAAA,QACX;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA,GAAS,eAAA,CAAgB,MAAM,CAAA,GAAI,IAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,YAAA,CAAa,KAAA,EAA8B,aAAA,EAAkE;AACjH,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,IAAA,MAAM,EAAE,IAAA,GAAO,CAAA,EAAG,OAAA,EAAS,YAAA,EAAc,SAAQ,GAAI,KAAA;AACrD,IAAA,MAAM,QAAA,GAAY,MAAkC,aAAa,CAAA;AAEjE,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,YAAA,EAAc,EAAE,CAAA;AACjD,IAAA,IAAI,IAAA,GAAO,CAAA,EAAG,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAMjD,IAAA,MAAM,IAAA,CAAK,0BAA0B,QAAQ,CAAA;AAE7C,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,KAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MAClD,CAAA,CAAA,KAAM,CAAA,CAA8B,IAAA,CAAK,aAAa,CAAA,KAAM;AAAA,KAC9D;AAGA,IAAA,MAAM,KAAA,GAAS,SAAS,KAAA,IAAoB,eAAA;AAC5C,IAAA,MAAM,SAAA,GAAa,SAAS,SAAA,IAAwB,MAAA;AACpD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,MAAM,IAAA,GAAO,KAAA,KAAU,WAAA,GAAc,IAAI,IAAA,CAAK,EAAE,SAAS,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAA,CAAE,aAAA;AACzE,MAAA,MAAM,IAAA,GAAO,KAAA,KAAU,WAAA,GAAc,IAAI,IAAA,CAAK,EAAE,SAAS,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAA,CAAE,aAAA;AACzE,MAAA,OAAO,SAAA,KAAc,KAAA,GAAQ,IAAA,GAAO,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,IACpD,CAAC,CAAA;AAED,IAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,kBAAA,KAAuB,mBAAA,CAAoB,IAAA,EAAM,cAAc,OAAO,CAAA;AAE/F,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,MACjD,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,IAAA;AAAA,MACA,OAAA,EAAS,kBAAA;AAAA,MACT,OAAA,EAAS,MAAA,GAAS,OAAA,GAAU,QAAA,CAAS;AAAA,KACvC;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,EAAA,EAA2B;AAC7C,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAE5B,IAAA,IAAI,2BAAA,CAA2B,YAAA,CAAa,EAAE,CAAA,EAAG;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,EACzB;AAAA,EAEA,MAAM,yBAAyB,QAAA,EAAiC;AAC9D,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,OAAO,CAAA,IAAK,KAAK,QAAA,EAAU;AAChD,MAAA,IAAK,OAAA,CAAoC,IAAA,CAAK,aAAa,CAAA,KAAM,QAAA,EAAU;AAEzE,QAAA,IAAI,2BAAA,CAA2B,YAAA,CAAa,SAAS,CAAA,EAAG;AACxD,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,QAAA,EAAmC;AACrD,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,MAAA,IAAK,CAAA,CAA8B,IAAA,CAAK,aAAa,CAAA,KAAM,QAAA,EAAU;AACnE,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,0BAA0B,QAAA,EAAiC;AACvE,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,IAAqB,CAAC,QAAA,EAAU;AAC1C,IAAA,MAAM,cAAc,KAAA,CAAM,IAAA,CAAK,KAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MACrD,CAAA,CAAA,KAAM,CAAA,CAA8B,IAAA,CAAK,aAAa,CAAA,KAAM;AAAA,KAC9D;AACA,IAAA,IAAI,WAAA,EAAa;AAEjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAC1D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,uBAAA,CAAwB,UAAU,UAAU,CAAA;AACxE,IAAA,IAAI,WAAW,UAAA,EAAY;AACzB,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB,QAAA,EAAmC;AAC5D,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,IAAA,MAAM,IAAA,CAAK,0BAA0B,QAAQ,CAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,sBAAsB,QAAQ,CAAA;AAAA,EAC5C;AAAA,EAEQ,sBAAsB,QAAA,EAA0B;AACtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AACxD,IAAA,IAAI,UAAA,GAAa,QAAA;AACjB,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AACtC,MAAA,IAAK,CAAA,CAA8B,IAAA,CAAK,aAAa,CAAA,KAAM,QAAA,EAAU;AACnE,QAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAA,CAAE,aAAa,CAAA;AAAA,MACnD;AAAA,IACF;AACA,IAAA,OAAO,UAAA,GAAa,CAAA;AAAA,EACtB;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,YAAY,CAAA;AAIrC,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,KAAA,MAAW,YAAY,IAAA,CAAK,EAAA,CAAG,eAAA,CAAgB,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACtE,QAAA,IAAA,CAAK,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF","file":"chunk-2UAP4LDC.cjs","sourcesContent":["import { MastraBase } from '../../../base';\n\n/**\n * A single task in an agent's structured task list.\n *\n * Mirrors the task shape used by the built-in task tools. Kept as a plain,\n * self-contained type so the storage domain does not depend on the tools\n * package.\n */\nexport interface TaskRecord {\n id: string;\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n}\n\n/**\n * A durable goal objective for an agent thread.\n *\n * Stored in the thread-state domain under `type: 'goal'`. The objective drives\n * the in-loop goal scorer (the agent keeps working until the goal is judged\n * complete or the run budget is exhausted). All settings except `objective`,\n * `status`, and `runsUsed` are optional: when absent here they fall back to the\n * Agent's `goal` config at read time, so an objective only persists the fields a\n * caller explicitly provided. `judgeModelId` is required at runtime for the goal\n * to do anything — when neither this record nor the Agent's `goal.judge`\n * resolves a judge model, the goal step is a no-op.\n */\nexport interface GoalObjectiveRecord {\n /** Stable objective id, used for per-goal judge memory and UI correlation. */\n id?: string;\n /** The prose objective the agent is working toward. */\n objective: string;\n status: 'active' | 'paused' | 'done';\n /** Number of goal evaluations consumed so far. */\n runsUsed: number;\n /** Max evaluations before the goal stops. Falls back to agent `goal.maxRuns` (default 50). */\n maxRuns?: number;\n /** Judge model id. Falls back to agent `goal.judge`; if neither resolves the goal is a no-op. */\n judgeModelId?: string;\n /** Extra judge guidance. Falls back to agent `goal.prompt` (default = built-in goal judge prompt). */\n prompt?: string;\n /**\n * Why the objective is parked (`status === 'paused'`). Set for judge failure\n * or budget exhaustion. Unset for `active`/`done`.\n */\n pausedReason?: string;\n startedAt: number;\n updatedAt: number;\n}\n\n/**\n * Abstract base class for the thread-state storage domain.\n *\n * The thread-state domain holds arbitrary, durable, per-thread state keyed by a\n * `type` namespace. Each `(threadId, type)` pair owns one value. Today the only\n * types are `'task'` (the structured task list managed by the built-in task\n * tools) and `'goal'` (the durable {@link GoalObjectiveRecord} that drives the\n * in-loop goal scorer). The domain is intentionally generic so other\n * agent-scoped state can be tracked the same way without a new domain.\n *\n * The built-in task tools read/write the `'task'` slot synchronously within a\n * run (so a `task_update` sees the tasks a prior `task_write` produced), and the\n * task state processor reads it to project the list onto the agent state-signal\n * lane.\n */\nexport abstract class ThreadStateStorage extends MastraBase {\n constructor() {\n super({\n component: 'STORAGE',\n name: 'THREAD_STATE',\n });\n }\n\n /**\n * Initialize the thread-state store (create tables, indexes, etc).\n */\n abstract init(): Promise;\n\n /**\n * Get the state value for a `(threadId, type)` pair. Returns `undefined` when\n * no value has been set.\n */\n abstract getState(args: { threadId: string; type: string }): Promise;\n\n /**\n * Set the state value for a `(threadId, type)` pair. Full-replacement\n * semantics: the stored value becomes exactly `value`.\n */\n abstract setState(args: { threadId: string; type: string; value: T }): Promise;\n\n /**\n * Delete the state value for a `(threadId, type)` pair.\n */\n abstract deleteState(args: { threadId: string; type: string }): Promise;\n\n /**\n * Delete all thread state. Used for testing.\n */\n abstract dangerouslyClearAll(): Promise;\n}\n","import { ThreadStateStorage } from './base';\n\nfunction clone(value: T): T {\n return value === undefined ? value : (structuredClone(value) as T);\n}\n\n/**\n * In-memory implementation of {@link ThreadStateStorage}.\n *\n * Holds each thread's state in a `Map>`. Stored\n * values are cloned on read and write so callers cannot mutate the backing\n * value.\n *\n * This is the default thread-state store wired by the composite store: task\n * tracking works out of the box without a configured backend. It is **not**\n * durable across process restarts — configure a durable backend (e.g.\n * `@mastra/libsql`) for state that must survive a restart.\n */\nexport class InMemoryThreadStateStorage extends ThreadStateStorage {\n private readonly stateByThread = new Map>();\n\n async init(): Promise {\n // No-op for in-memory store.\n }\n\n async getState({ threadId, type }: { threadId: string; type: string }): Promise {\n const value = this.stateByThread.get(threadId)?.get(type);\n return value === undefined ? undefined : clone(value as T);\n }\n\n async setState({ threadId, type, value }: { threadId: string; type: string; value: T }): Promise {\n let byType = this.stateByThread.get(threadId);\n if (!byType) {\n byType = new Map();\n this.stateByThread.set(threadId, byType);\n }\n byType.set(type, clone(value));\n }\n\n async deleteState({ threadId, type }: { threadId: string; type: string }): Promise {\n const byType = this.stateByThread.get(threadId);\n if (!byType) return;\n byType.delete(type);\n if (byType.size === 0) this.stateByThread.delete(threadId);\n }\n\n async dangerouslyClearAll(): Promise {\n this.stateByThread.clear();\n }\n}\n","import { MastraBase } from '../base';\n\nimport type {\n AgentsStorage,\n PromptBlocksStorage,\n ScorerDefinitionsStorage,\n MCPClientsStorage,\n MCPServersStorage,\n WorkspacesStorage,\n SkillsStorage,\n FavoritesStorage,\n ScoresStorage,\n WorkflowsStorage,\n MemoryStorage,\n ObservabilityStorage,\n BlobStore,\n DatasetsStorage,\n ExperimentsStorage,\n BackgroundTasksStorage,\n SchedulesStorage,\n ChannelsStorage,\n HarnessStorage,\n ToolProviderConnectionsStorage,\n NotificationsStorage,\n ThreadStateStorage,\n} from './domains';\nimport { InMemoryThreadStateStorage } from './domains/thread-state/inmemory';\n\n/** Map of all storage domain interfaces available in a composite store. */\nexport type StorageDomains = {\n workflows?: WorkflowsStorage;\n scores?: ScoresStorage;\n memory?: MemoryStorage;\n channels?: ChannelsStorage;\n notifications?: NotificationsStorage;\n observability?: ObservabilityStorage;\n agents?: AgentsStorage;\n datasets?: DatasetsStorage;\n experiments?: ExperimentsStorage;\n promptBlocks?: PromptBlocksStorage;\n scorerDefinitions?: ScorerDefinitionsStorage;\n mcpClients?: MCPClientsStorage;\n mcpServers?: MCPServersStorage;\n workspaces?: WorkspacesStorage;\n skills?: SkillsStorage;\n favorites?: FavoritesStorage;\n blobs?: BlobStore;\n backgroundTasks?: BackgroundTasksStorage;\n schedules?: SchedulesStorage;\n harness?: HarnessStorage;\n toolProviderConnections?: ToolProviderConnectionsStorage;\n threadState?: ThreadStateStorage;\n};\n\n/**\n * Domain keys used by the Mastra Editor.\n * Used by the `editor` shorthand on MastraCompositeStoreConfig to route\n * all editor-related domains to a single store.\n */\nexport const EDITOR_DOMAINS = [\n 'agents',\n 'promptBlocks',\n 'scorerDefinitions',\n 'mcpClients',\n 'mcpServers',\n 'workspaces',\n 'skills',\n 'favorites',\n 'toolProviderConnections',\n] as const satisfies ReadonlyArray;\n\n/**\n * Normalizes perPage input for pagination queries.\n *\n * @param perPageInput - The raw perPage value from the user\n * @param defaultValue - The default perPage value to use when undefined (typically 40 for messages, 100 for threads)\n * @returns A numeric perPage value suitable for queries (false becomes MAX_SAFE_INTEGER)\n * @throws Error if perPage is a negative number\n */\nexport function normalizePerPage(perPageInput: number | false | undefined, defaultValue: number): number {\n if (perPageInput === false) {\n return Number.MAX_SAFE_INTEGER; // Get all results\n } else if (perPageInput === 0) {\n return 0; // Return zero results\n } else if (typeof perPageInput === 'number' && perPageInput > 0) {\n return perPageInput; // Valid positive number\n } else if (typeof perPageInput === 'number' && perPageInput < 0) {\n throw new Error('perPage must be >= 0');\n }\n // For undefined, use default\n return defaultValue;\n}\n\n/**\n * Calculates pagination offset and prepares perPage value for response.\n * When perPage is false (fetch all), offset is always 0 regardless of page.\n *\n * @param page - The page number (0-indexed)\n * @param perPageInput - The original perPage input (number, false for all, or undefined)\n * @param normalizedPerPage - The normalized perPage value (from normalizePerPage)\n * @returns Object with offset for query and perPage for response\n */\nexport function calculatePagination(\n page: number,\n perPageInput: number | false | undefined,\n normalizedPerPage: number,\n): { offset: number; perPage: number | false } {\n return {\n offset: perPageInput === false ? 0 : page * normalizedPerPage,\n perPage: perPageInput === false ? false : normalizedPerPage,\n };\n}\n\n/**\n * Configuration for individual domain overrides.\n * Each domain can be sourced from a different storage adapter.\n */\nexport type MastraStorageDomains = Partial;\n\n/**\n * Configuration options for MastraCompositeStore.\n *\n * Can be used in two ways:\n * 1. By store implementations: `{ id, name, disableInit? }` - stores set `this.stores` directly\n * 2. For composition: `{ id, default?, domains?, disableInit? }` - compose domains from multiple stores\n */\nexport interface MastraCompositeStoreConfig {\n /**\n * Unique identifier for this storage instance.\n */\n id: string;\n\n /**\n * Name of the storage adapter (used for logging).\n * Required for store implementations extending MastraCompositeStore.\n */\n name?: string;\n\n /**\n * Default storage adapter to use for domains not explicitly specified.\n * If provided, domains from this storage will be used as fallbacks.\n */\n default?: MastraCompositeStore;\n\n /**\n * Storage adapter for editor-related domains (agents, promptBlocks, scorerDefinitions,\n * mcpClients, mcpServers, workspaces, skills).\n *\n * This is a shorthand that routes all editor domains to a single store instead of\n * specifying each individually in `domains`. Useful for filesystem-based storage\n * where editor configs are stored as JSON files in the repository.\n *\n * Priority: domains > editor > default\n *\n * @example\n * ```typescript\n * new MastraCompositeStore({\n * id: 'my-store',\n * default: postgresStore,\n * editor: filesystemStore,\n * })\n * ```\n */\n editor?: MastraCompositeStore;\n\n /**\n * Individual domain overrides. Each domain can come from a different storage adapter.\n * These take precedence over both `editor` and `default` storage.\n *\n * @example\n * ```typescript\n * domains: {\n * memory: pgStore.stores?.memory,\n * workflows: libsqlStore.stores?.workflows,\n * }\n * ```\n */\n domains?: MastraStorageDomains;\n\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n * This is useful for CI/CD pipelines where you want to:\n * 1. Run migrations explicitly during deployment (not at runtime)\n * 2. Use different credentials for schema changes vs runtime operations\n *\n * When disableInit is true:\n * - The storage will not automatically create/alter tables on first use\n * - You must call `storage.init()` explicitly in your CI/CD scripts\n *\n * @example\n * // In CI/CD script:\n * const storage = new PostgresStore({ ...config, disableInit: false });\n * await storage.init(); // Explicitly run migrations\n *\n * // In runtime application:\n * const storage = new PostgresStore({ ...config, disableInit: true });\n * // No auto-init, tables must already exist\n */\n disableInit?: boolean;\n}\n\n/**\n * Base class for all Mastra storage adapters.\n *\n * Can be used in two ways:\n *\n * 1. **Extended by store implementations** (PostgresStore, LibSQLStore, etc.):\n * Store implementations extend this class and set `this.stores` with their domain implementations.\n *\n * 2. **Directly instantiated for composition**:\n * Compose domains from multiple storage backends using `default` and `domains` options.\n *\n * All domain-specific operations should be accessed through `getStore()`:\n *\n * @example\n * ```typescript\n * // Composition: mix domains from different stores\n * const storage = new MastraCompositeStore({\n * id: 'composite',\n * default: pgStore,\n * domains: {\n * memory: libsqlStore.stores?.memory,\n * },\n * });\n *\n * // Use `editor` shorthand to route all editor domains to a filesystem store\n * const storage2 = new MastraCompositeStore({\n * id: 'with-fs-editor',\n * default: pgStore,\n * editor: filesystemStore,\n * });\n *\n * // Access domains\n * const memory = await storage.getStore('memory');\n * await memory?.saveThread({ thread });\n * ```\n */\n/**\n * Minimal interface a storage adapter sees from the Mastra instance.\n * Kept narrow on purpose to avoid pulling the full Mastra type into the\n * storage layer (which would create a circular import).\n */\nexport interface StorageMastraRef {\n getAgentById?: (id: string) => { source?: string; __getEditorConfig?: () => unknown } | undefined;\n listAgents?: () => Record unknown }> | undefined;\n getEditor?: () => { getSource?: () => 'code' | 'db' | undefined } | undefined;\n}\n\nexport class MastraCompositeStore extends MastraBase {\n protected hasInitialized: null | Promise = null;\n protected shouldCacheInit = true;\n\n id: string;\n stores?: StorageDomains;\n protected mastra?: StorageMastraRef;\n\n /**\n * When true, automatic initialization (table creation/migrations) is disabled.\n */\n disableInit: boolean = false;\n\n /**\n * Retained references to the parent stores supplied via composition. `init()`\n * delegates to these so the parent's own `init()` logic (pragmas, ordered\n * DDL, init coalescing, etc.) runs instead of being bypassed by the\n * composite iterating the inner domains in parallel — which was the cause\n * of the SQLITE_BUSY / \"no such table\" races reported in issue #16782.\n */\n protected parentDefault?: MastraCompositeStore;\n protected parentEditor?: MastraCompositeStore;\n\n constructor(config: MastraCompositeStoreConfig) {\n const name = config.name ?? 'MastraCompositeStore';\n\n if (!config.id || typeof config.id !== 'string' || config.id.trim() === '') {\n throw new Error(`${name}: id must be provided and cannot be empty.`);\n }\n\n super({\n component: 'STORAGE',\n name,\n });\n\n this.id = config.id;\n this.disableInit = config.disableInit ?? false;\n\n // If composition config is provided (default, editor, or domains), compose the stores\n if (config.default || config.editor || config.domains) {\n const defaultStores = config.default?.stores;\n const editorStores = config.editor?.stores;\n const domainOverrides = config.domains ?? {};\n\n // Retain the parent store refs so init() can delegate to their own\n // init() — see field doc above and init() below.\n this.parentDefault = config.default;\n this.parentEditor = config.editor;\n\n // Validate that at least one storage source is provided\n const hasDefaultDomains = defaultStores && Object.values(defaultStores).some(v => v !== undefined);\n const hasEditorDomains = editorStores && Object.values(editorStores).some(v => v !== undefined);\n const hasOverrideDomains = Object.values(domainOverrides).some(v => v !== undefined);\n\n if (!hasDefaultDomains && !hasEditorDomains && !hasOverrideDomains) {\n throw new Error(\n 'MastraCompositeStore requires at least one storage source. Provide a default storage, an editor storage, or domain overrides.',\n );\n }\n\n const editorDomainSet = new Set(EDITOR_DOMAINS);\n\n // Helper: resolve a domain with priority: domains > editor (for editor domains) > default\n const resolve = (key: K): StorageDomains[K] | undefined => {\n if (domainOverrides[key] !== undefined) return domainOverrides[key];\n if (editorDomainSet.has(key) && editorStores?.[key] !== undefined) return editorStores[key];\n return defaultStores?.[key];\n };\n\n // Build the composed stores object\n this.stores = {\n memory: resolve('memory'),\n workflows: resolve('workflows'),\n scores: resolve('scores'),\n observability: resolve('observability'),\n agents: resolve('agents'),\n datasets: resolve('datasets'),\n experiments: resolve('experiments'),\n promptBlocks: resolve('promptBlocks'),\n scorerDefinitions: resolve('scorerDefinitions'),\n mcpClients: resolve('mcpClients'),\n mcpServers: resolve('mcpServers'),\n workspaces: resolve('workspaces'),\n skills: resolve('skills'),\n favorites: resolve('favorites'),\n blobs: resolve('blobs'),\n backgroundTasks: resolve('backgroundTasks'),\n schedules: resolve('schedules'),\n channels: resolve('channels'),\n harness: resolve('harness'),\n toolProviderConnections: resolve('toolProviderConnections'),\n notifications: resolve('notifications'),\n // The thread-state domain always has an in-memory store wired by default\n // so the built-in task tools work out of the box without a configured\n // backend. Configure a durable backend for state that must survive a\n // process restart.\n threadState: resolve('threadState') ?? new InMemoryThreadStateStorage(),\n } as StorageDomains;\n }\n // Otherwise, subclasses set stores themselves\n }\n\n /**\n * Register the Mastra instance with this storage adapter and cascade the\n * reference to all owned domain stores and parent composites. Storage\n * adapters that need to look up agents, editor config, etc. can read\n * `this.mastra` after this is called.\n * @internal\n */\n __registerMastra(mastra: StorageMastraRef, seen: Set = new Set()): void {\n if (seen.has(this)) return;\n seen.add(this);\n this.mastra = mastra;\n const cascade = (target: unknown) => {\n if (!target || typeof target !== 'object' || seen.has(target)) return;\n const fn = (target as { __registerMastra?: (m: StorageMastraRef, s?: Set) => void }).__registerMastra;\n if (typeof fn === 'function') {\n fn.call(target, mastra, seen);\n } else {\n seen.add(target);\n }\n };\n if (this.parentDefault) cascade(this.parentDefault);\n if (this.parentEditor) cascade(this.parentEditor);\n if (this.stores) {\n for (const domain of Object.values(this.stores)) cascade(domain);\n }\n }\n\n /**\n * Get a domain-specific storage interface.\n *\n * @param storeName - The name of the domain to access ('memory', 'workflows', 'scores', 'observability', 'agents')\n * @returns The domain storage interface, or undefined if not available\n *\n * @example\n * ```typescript\n * const memory = await storage.getStore('memory');\n * if (memory) {\n * await memory.saveThread({ thread });\n * }\n * ```\n */\n async getStore(storeName: K): Promise {\n return this.stores?.[storeName];\n }\n\n /**\n * Initialize all domain stores.\n *\n * When a parent store was supplied via `default` or `editor`, delegate to\n * its own `init()` first. Each adapter owns its `init()` contract — it may\n * apply connection-level setup, run migrations, enforce DDL ordering, or\n * coalesce concurrent callers. Calling each domain's `init()` directly\n * against the parent's shared client would bypass all of that and can\n * corrupt or partially create schema (see issue #16782 for the SQLite\n * symptom).\n *\n * Any remaining domains that did NOT come from a parent (e.g. supplied via\n * the explicit `domains` override pointing at a different store) are then\n * initialized individually — but only the ones the parents didn't already\n * cover, so we never double-init the same domain instance.\n */\n async init(): Promise {\n // to prevent race conditions, await any current init\n if (this.shouldCacheInit && (await this.hasInitialized)) {\n return;\n }\n\n this.hasInitialized = this.#runInit();\n await this.hasInitialized;\n }\n\n async #runInit(): Promise {\n // 1. Delegate to parent stores. Each parent owns its own init contract\n // (setup, migrations, sequencing, coalescing). Dedupe by identity so\n // a store passed as both `default` and `editor` only gets init()'d once.\n const uniqueParents = new Set();\n if (this.parentDefault) uniqueParents.add(this.parentDefault);\n if (this.parentEditor) uniqueParents.add(this.parentEditor);\n await Promise.all([...uniqueParents].map(parent => parent.init()));\n\n // 2. Build a set of domain instances the parents already initialized so\n // we don't init them a second time below.\n const alreadyInitialized = new Set();\n const addParentDomains = (parent?: MastraCompositeStore) => {\n if (!parent?.stores) return;\n for (const domain of Object.values(parent.stores)) {\n if (domain) alreadyInitialized.add(domain);\n }\n };\n addParentDomains(this.parentDefault);\n addParentDomains(this.parentEditor);\n\n // 3. Init any remaining domains (typically those provided via the\n // explicit `domains` override pointing at a different store, or those\n // set directly by a subclass).\n const initTasks: Promise[] = [];\n const maybeInit = (domain: { init(): Promise } | undefined) => {\n if (!domain || alreadyInitialized.has(domain)) return;\n initTasks.push(domain.init());\n alreadyInitialized.add(domain);\n };\n\n if (this.stores) {\n maybeInit(this.stores.memory);\n maybeInit(this.stores.workflows);\n maybeInit(this.stores.scores);\n maybeInit(this.stores.observability);\n maybeInit(this.stores.agents);\n maybeInit(this.stores.datasets);\n maybeInit(this.stores.experiments);\n maybeInit(this.stores.promptBlocks);\n maybeInit(this.stores.scorerDefinitions);\n maybeInit(this.stores.mcpClients);\n maybeInit(this.stores.mcpServers);\n maybeInit(this.stores.workspaces);\n maybeInit(this.stores.skills);\n maybeInit(this.stores.favorites);\n maybeInit(this.stores.blobs);\n maybeInit(this.stores.backgroundTasks);\n maybeInit(this.stores.schedules);\n maybeInit(this.stores.channels);\n maybeInit(this.stores.harness);\n maybeInit(this.stores.toolProviderConnections);\n maybeInit(this.stores.notifications);\n maybeInit(this.stores.threadState);\n }\n\n await Promise.all(initTasks);\n return true;\n }\n /**\n * Optional lifecycle hook: release underlying client/connection handles.\n * Implementations (e.g. LibSQLStore) override this to checkpoint WAL files\n * and close the database client so OS handles are freed synchronously.\n * Called automatically by Mastra.shutdown().\n */\n close?(): Promise;\n}\n\n/**\n * @deprecated Use MastraCompositeStoreConfig instead. This alias will be removed in a future version.\n */\nexport interface MastraStorageConfig extends MastraCompositeStoreConfig {}\n\n/**\n * @deprecated Use MastraCompositeStore instead. This alias will be removed in a future version.\n */\nexport class MastraStorage extends MastraCompositeStore {}\n","import { MastraBase } from '../../base';\n\n/**\n * Base class for all storage domains.\n * Provides common interface for initialization and data clearing.\n */\nexport abstract class StorageDomain extends MastraBase {\n /**\n * Initialize the storage domain.\n * This should create any necessary tables/collections.\n * Default implementation is a no-op - override in adapters that need initialization.\n */\n async init(): Promise {\n // Default no-op - adapters override if they need to create tables/collections\n }\n\n /**\n * Clears all data from this storage domain.\n * This is a destructive operation - use with caution.\n * Primarily used for testing.\n */\n abstract dangerouslyClearAll(): Promise;\n}\n","import type { StorageOrderBy, ThreadOrderBy, ThreadSortDirection } from '../types';\nimport { StorageDomain } from './base';\n\n// ============================================================================\n// Version Resolution Options\n// ============================================================================\n\n/**\n * Options for resolving which version of an entity to use.\n * Either pick by status (draft/published/archived) or by a specific version ID — not both.\n */\nexport type VersionResolutionOptions =\n | { status?: 'draft' | 'published' | 'archived'; versionId?: never }\n | { versionId: string; status?: never };\n\n// ============================================================================\n// Generic Version Types\n// ============================================================================\n\n/**\n * Base interface for version metadata fields that exist on every version row.\n * The `TFkField` parameter controls the name of the foreign key field.\n */\nexport interface VersionBase {\n /** UUID identifier for this version */\n id: string;\n /** Sequential version number (1, 2, 3, ...) */\n versionNumber: number;\n /** Array of field names that changed from the previous version */\n changedFields?: string[];\n /** Optional message describing the changes */\n changeMessage?: string;\n /** When this version was created */\n createdAt: Date;\n}\n\n/**\n * Base interface for version creation input.\n * Same as VersionBase but without the server-assigned `createdAt` timestamp.\n */\nexport interface CreateVersionInputBase extends Omit {}\n\n/**\n * Sort direction for version listings.\n */\nexport type VersionSortDirectionGeneric = ThreadSortDirection;\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type VersionOrderByGeneric = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing versions with pagination and sorting.\n */\nexport interface ListVersionsInputBase {\n /** Page number (0-indexed) */\n page?: number;\n /**\n * Number of items per page, or `false` to fetch all records without pagination limit.\n * Defaults to 20 if not specified.\n */\n perPage?: number | false;\n /** Sorting options */\n orderBy?: {\n field?: VersionOrderByGeneric;\n direction?: VersionSortDirectionGeneric;\n };\n}\n\n/**\n * Output for listing versions with pagination info.\n */\nexport interface ListVersionsOutputBase {\n /** Array of versions for the current page */\n versions: TVersion[];\n /** Total number of versions */\n total: number;\n /** Current page number */\n page: number;\n /** Items per page */\n perPage: number | false;\n /** Whether there are more pages */\n hasMore: boolean;\n}\n\n// ============================================================================\n// Entity base — the \"thin record\" must have these fields\n// ============================================================================\n\nexport interface VersionedEntityBase {\n id: string;\n activeVersionId?: string;\n}\n\n// ============================================================================\n// Constants for validation (shared across all versioned domains)\n// ============================================================================\n\nconst ENTITY_ORDER_BY_SET: Record = {\n createdAt: true,\n updatedAt: true,\n};\n\nconst SORT_DIRECTION_SET: Record = {\n ASC: true,\n DESC: true,\n};\n\nconst VERSION_ORDER_BY_SET: Record = {\n versionNumber: true,\n createdAt: true,\n};\n\n// ============================================================================\n// VersionedStorageDomain — generic base class\n// ============================================================================\n\n/**\n * Generic base class for versioned storage domains (agents, prompt blocks, scorer definitions).\n *\n * Type parameters:\n * - `TEntity` — Thin record type (e.g. StorageAgentType)\n * - `TSnapshot` — Snapshot config type (e.g. StorageAgentSnapshotType)\n * - `TResolved` — Entity + snapshot merged (e.g. StorageResolvedAgentType)\n * - `TVersion` — Version row (e.g. AgentVersion)\n * - `TCreateVersion` — Input for creating a version\n * - `TListVersionsInput` — Input for listing versions\n * - `TListVersionsOutput` — Output for listing versions\n * - `TCreateInput` — Input for creating an entity\n * - `TUpdateInput` — Input for updating an entity\n * - `TListInput` — Input for listing entities\n * - `TListOutput` — Output for listing entities (paginated thin records)\n * - `TListResolvedOutput` — Output for listing resolved entities\n */\nexport abstract class VersionedStorageDomain<\n TEntity extends VersionedEntityBase,\n TSnapshot,\n TResolved extends TEntity,\n TVersion extends VersionBase,\n TCreateVersion extends CreateVersionInputBase,\n TListVersionsInput extends ListVersionsInputBase,\n TListVersionsOutput extends ListVersionsOutputBase,\n TCreateInput,\n TUpdateInput,\n TListInput,\n TListOutput,\n TListResolvedOutput,\n> extends StorageDomain {\n /**\n * The key name used in list outputs (e.g. 'agents', 'promptBlocks', 'scorerDefinitions').\n * Subclasses must provide this so the generic resolution logic can build the correct output shape.\n */\n protected abstract readonly listKey: string;\n\n /**\n * The set of version metadata field names (including the FK field) to strip\n * when extracting snapshot config from a version row.\n * e.g. ['id', 'agentId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt']\n */\n protected abstract readonly versionMetadataFields: string[];\n\n // ==========================================================================\n // Entity CRUD (abstract — implemented by concrete store classes)\n // ==========================================================================\n\n abstract getById(id: string): Promise;\n abstract create(input: TCreateInput): Promise;\n abstract update(input: TUpdateInput): Promise;\n abstract delete(id: string): Promise;\n abstract list(args?: TListInput): Promise;\n\n // ==========================================================================\n // Version methods (abstract — implemented by concrete store classes)\n // ==========================================================================\n\n abstract createVersion(input: TCreateVersion): Promise;\n abstract getVersion(id: string): Promise;\n abstract getVersionByNumber(entityId: string, versionNumber: number): Promise;\n abstract getLatestVersion(entityId: string): Promise;\n abstract listVersions(input: TListVersionsInput): Promise;\n abstract deleteVersion(id: string): Promise;\n abstract deleteVersionsByParentId(entityId: string): Promise;\n abstract countVersions(entityId: string): Promise;\n\n // ==========================================================================\n // Concrete resolution methods\n // ==========================================================================\n\n /**\n * Strips version metadata fields from a version row, leaving only snapshot config fields.\n */\n protected extractSnapshotConfig(version: TVersion): Partial {\n const result: Record = {};\n const metadataSet = new Set(this.versionMetadataFields);\n\n for (const [key, value] of Object.entries(version)) {\n if (!metadataSet.has(key)) {\n result[key] = value;\n }\n }\n\n return result as Partial;\n }\n\n /**\n * Resolves an entity by merging its thin record with the active or latest version config.\n * - `{ status: 'draft' }` — resolve with the latest version.\n * - `{ status: 'published' }` (default) — resolve with the active version, falling back to latest.\n * - `{ versionId: '...' }` — resolve with a specific version by ID.\n */\n async getByIdResolved(id: string, options?: VersionResolutionOptions): Promise {\n const entity = await this.getById(id);\n\n if (!entity) {\n return null;\n }\n\n return this.resolveEntity(entity, options);\n }\n\n /**\n * Lists entities with version resolution.\n * When `status` is `'draft'`, each entity is resolved with its latest version.\n * When `status` is `'published'` (default), each entity is resolved with its active version.\n */\n async listResolved(args?: TListInput): Promise {\n const result = await this.list(args);\n\n const status = (args as Record | undefined)?.status as string | undefined;\n const entities = (result as Record)[this.listKey] as TEntity[];\n const resolved = await Promise.all(\n entities.map(entity => this.resolveEntity(entity, { status: status as 'draft' | 'published' | 'archived' })),\n );\n\n return {\n ...result,\n [this.listKey]: resolved,\n } as TListResolvedOutput;\n }\n\n /**\n * Resolves a single entity by merging it with its active or latest version.\n * - `{ versionId: '...' }` — resolve with a specific version by ID.\n * - `{ status: 'published' }` (default) — use activeVersionId, fall back to latest.\n * - `{ status: 'draft' }` — always use the latest version.\n */\n protected async resolveEntity(entity: TEntity, options?: VersionResolutionOptions): Promise {\n const status = options?.status || 'published';\n let version: TVersion | null = null;\n\n if (options?.versionId) {\n // Specific version resolution: fetch by exact version ID\n version = await this.getVersion(options.versionId);\n } else if (status === 'draft') {\n // Draft resolution: always use the latest version (which may be ahead of activeVersionId)\n version = await this.getLatestVersion(entity.id);\n } else {\n // Published/archived resolution: use activeVersionId, fall back to latest\n if (entity.activeVersionId) {\n version = await this.getVersion(entity.activeVersionId);\n\n if (!version) {\n this.logger?.warn?.(\n `Entity ${entity.id} has activeVersionId ${entity.activeVersionId} but version not found. Falling back to latest version.`,\n );\n }\n }\n\n if (!version) {\n version = await this.getLatestVersion(entity.id);\n }\n }\n\n if (version) {\n const snapshotConfig = this.extractSnapshotConfig(version);\n return {\n ...entity,\n ...snapshotConfig,\n resolvedVersionId: version.id,\n } as unknown as TResolved;\n }\n\n return entity as unknown as TResolved;\n }\n\n // ==========================================================================\n // Protected Helper Methods\n // ==========================================================================\n\n protected parseOrderBy(\n orderBy?: StorageOrderBy,\n defaultDirection: ThreadSortDirection = 'DESC',\n ): { field: ThreadOrderBy; direction: ThreadSortDirection } {\n return {\n field: orderBy?.field && orderBy.field in ENTITY_ORDER_BY_SET ? orderBy.field : 'createdAt',\n direction: orderBy?.direction && orderBy.direction in SORT_DIRECTION_SET ? orderBy.direction : defaultDirection,\n };\n }\n\n protected parseVersionOrderBy(\n orderBy?: TListVersionsInput['orderBy'],\n defaultDirection: VersionSortDirectionGeneric = 'DESC',\n ): { field: VersionOrderByGeneric; direction: VersionSortDirectionGeneric } {\n return {\n field: orderBy?.field && orderBy.field in VERSION_ORDER_BY_SET ? orderBy.field : 'versionNumber',\n direction: orderBy?.direction && orderBy.direction in SORT_DIRECTION_SET ? orderBy.direction : defaultDirection,\n };\n }\n}\n","import { execFile } from 'node:child_process';\nimport { realpathSync } from 'node:fs';\nimport { relative } from 'node:path';\n\n/**\n * A single Git commit entry parsed from `git log` output.\n */\nexport interface GitCommit {\n /** Full commit SHA */\n hash: string;\n /** Commit author date as a Date object */\n date: Date;\n /** Author name */\n author: string;\n /** Commit subject line */\n message: string;\n}\n\n/**\n * Read-only utility for reading Git history of filesystem-stored JSON files.\n *\n * All operations are performed by shelling out to the `git` CLI via\n * `child_process.execFile` (no third-party dependencies). This class never\n * writes to Git — the user manages their own commits.\n *\n * Designed as a singleton shared across all domain helpers via a static field\n * on `FilesystemVersionedHelpers`.\n */\nexport class GitHistory {\n /** Cache: dir → repo root (string) or `false` if not a repo. */\n private repoRootCache = new Map();\n\n /** Cache: `dir:filename:limit` → ordered commits (newest first). */\n private commitCache = new Map();\n\n /** Cache: `dir:commitHash:filename` → parsed JSON. Stored as unknown because\n * shared files are `{ [entityId]: snapshot }` while per-entity files are the\n * snapshot itself. */\n private snapshotCache = new Map();\n\n // ===========================================================================\n // Public API\n // ===========================================================================\n\n /**\n * Returns `true` if `dir` is inside a Git repository.\n * Result is cached after the first call per directory.\n */\n async isGitRepo(dir: string): Promise {\n const cached = this.repoRootCache.get(dir);\n if (cached === false) return false;\n if (typeof cached === 'string') return true;\n\n try {\n const root = (await this.exec(dir, ['rev-parse', '--show-toplevel'])).trim();\n this.repoRootCache.set(dir, root);\n return true;\n } catch {\n this.repoRootCache.set(dir, false);\n return false;\n }\n }\n\n /**\n * Get the list of commits that touched a specific file, newest first.\n * Returns an empty array if Git is unavailable or the file has no history.\n *\n * @param dir Absolute path to the storage directory\n * @param filename The JSON filename relative to `dir` (e.g., 'agents.json')\n * @param limit Maximum number of commits to retrieve\n */\n async getFileHistory(dir: string, filename: string, limit: number = 50): Promise {\n const cacheKey = `${dir}:${filename}:${limit}`;\n if (this.commitCache.has(cacheKey)) {\n return this.commitCache.get(cacheKey)!;\n }\n\n if (!(await this.isGitRepo(dir))) {\n this.commitCache.set(cacheKey, []);\n return [];\n }\n\n try {\n // `filename` is already relative to `dir`, and `exec` runs with `cwd: dir`,\n // so `git log -- ` resolves correctly.\n const raw = await this.exec(dir, [\n 'log',\n `--max-count=${limit}`,\n '--format=%H|%aI|%aN|%s',\n '--follow',\n '--',\n filename,\n ]);\n\n const commits: GitCommit[] = [];\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n const pipeIdx1 = trimmed.indexOf('|');\n const pipeIdx2 = trimmed.indexOf('|', pipeIdx1 + 1);\n const pipeIdx3 = trimmed.indexOf('|', pipeIdx2 + 1);\n\n if (pipeIdx1 === -1 || pipeIdx2 === -1 || pipeIdx3 === -1) continue;\n\n commits.push({\n hash: trimmed.slice(0, pipeIdx1),\n date: new Date(trimmed.slice(pipeIdx1 + 1, pipeIdx2)),\n author: trimmed.slice(pipeIdx2 + 1, pipeIdx3),\n message: trimmed.slice(pipeIdx3 + 1),\n });\n }\n\n this.commitCache.set(cacheKey, commits);\n return commits;\n } catch {\n this.commitCache.set(cacheKey, []);\n return [];\n }\n }\n\n /**\n * Read and parse a JSON file at a specific Git commit.\n * Returns the parsed entity map, or `null` if the file didn't exist at that commit.\n *\n * @param dir Absolute path to the storage directory\n * @param commitHash Full or abbreviated commit SHA\n * @param filename The JSON filename relative to `dir` (e.g., 'agents.json')\n */\n async getFileAtCommit>>(\n dir: string,\n commitHash: string,\n filename: string,\n ): Promise {\n const cacheKey = `${dir}:${commitHash}:${filename}`;\n if (this.snapshotCache.has(cacheKey)) {\n return this.snapshotCache.get(cacheKey)! as T;\n }\n\n if (!(await this.isGitRepo(dir))) return null;\n\n try {\n const relPath = this.relativeToRepo(dir, filename);\n const raw = await this.exec(dir, ['show', `${commitHash}:${relPath}`]);\n const parsed = JSON.parse(raw);\n this.snapshotCache.set(cacheKey, parsed);\n return parsed as T;\n } catch {\n return null;\n }\n }\n\n /**\n * Invalidate all caches. Call after external operations that change Git state\n * (e.g., the user commits or pulls).\n */\n invalidateCache(): void {\n this.repoRootCache.clear();\n this.commitCache.clear();\n this.snapshotCache.clear();\n }\n\n // ===========================================================================\n // Internals\n // ===========================================================================\n\n /**\n * Get the relative path from the Git repo root to a file in the storage directory.\n */\n private relativeToRepo(dir: string, filename: string): string {\n const root = this.repoRootCache.get(dir);\n if (!root) {\n throw new Error(`Not a git repository: ${dir}`);\n }\n // Resolve symlinks so that macOS /var → /private/var differences don't break relative()\n const realRoot = realpathSync(root);\n const realDir = realpathSync(dir);\n const relDir = relative(realRoot, realDir);\n return relDir ? `${relDir}/${filename}` : filename;\n }\n\n /**\n * Execute a git command and return stdout.\n */\n private exec(cwd: string, args: string[]): Promise {\n return new Promise((resolve, reject) => {\n execFile('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {\n if (error) reject(error);\n else resolve(stdout);\n });\n });\n }\n}\n","export type SourceControlCapabilityReason =\n | 'provider-not-configured'\n | 'provider-unavailable'\n | 'missing-permissions'\n | 'project-not-linked'\n | 'unsupported';\n\nexport type SourceControlCapabilities = {\n canRead: boolean;\n canWrite: boolean;\n canListHistory: boolean;\n canOpenChangeRequest: boolean;\n reason?: SourceControlCapabilityReason | string;\n};\n\nexport type SourceProviderInfo = {\n id: string;\n displayName: string;\n};\n\nexport type SourceFileRef = {\n path: string;\n ref?: string;\n};\n\nexport type SourceFile = SourceFileRef & {\n content: string;\n sha?: string;\n};\n\nexport type SourceWriteFileInput = SourceFileRef & {\n content: string;\n message?: string;\n expectedSha?: string;\n};\n\nexport type SourceWriteResult = {\n path: string;\n ref?: string;\n sha?: string;\n commitSha?: string;\n url?: string;\n};\n\nexport type SourceFileHistoryInput = {\n path: string;\n ref?: string;\n limit?: number;\n};\n\nexport type SourceFileListInput = {\n path: string;\n ref?: string;\n};\n\nexport type SourceFileListEntry = {\n path: string;\n sha?: string;\n};\n\nexport type SourceFileHistoryEntry = {\n id: string;\n ref?: string;\n message?: string;\n author?: string;\n createdAt: string;\n url?: string;\n};\n\nexport type SourceChangeRequestInput = {\n title: string;\n body?: string;\n files: SourceWriteFileInput[];\n baseRef?: string;\n headRef?: string;\n inspectOnly?: boolean;\n};\n\nexport type SourceChangeRequestResult = {\n id?: string | number;\n url: string;\n ref?: string;\n};\n\nexport const SOURCE_CONTROL_AGENTS_DIR = 'agents';\n\nexport function getSourceControlEntityFilePath(directory: string, entityId: string): string {\n return `${directory}/${encodeURIComponent(entityId)}.json`;\n}\n\nexport function getSourceAgentFilePath(agentId: string): string {\n return getSourceControlEntityFilePath(SOURCE_CONTROL_AGENTS_DIR, agentId);\n}\n\nexport interface SourceControlProvider extends SourceProviderInfo {\n getCapabilities(): Promise;\n readFile(input: SourceFileRef): Promise;\n writeFile(input: SourceWriteFileInput): Promise;\n listFileHistory(input: SourceFileHistoryInput): Promise;\n listFiles?(input: SourceFileListInput): Promise;\n openChangeRequest?(input: SourceChangeRequestInput): Promise;\n}\n\nexport type EditorSourceCapabilities = {\n source: 'db' | 'code';\n storage: 'database' | 'filesystem' | 'source-control' | 'unavailable';\n provider?: SourceProviderInfo;\n canSave: boolean;\n canOpenChangeRequest: boolean;\n unavailableReason?: string;\n};\n","import { normalizePerPage, calculatePagination } from './base';\nimport type {\n VersionBase,\n ListVersionsInputBase,\n ListVersionsOutputBase,\n VersionedEntityBase,\n} from './domains/versioned';\n\nimport type { FilesystemDB } from './filesystem-db';\nimport { GitHistory } from './git-history';\nimport { getSourceControlEntityFilePath } from './source-control';\nimport type { StorageOrderBy } from './types';\n\n/**\n * Prefix for version IDs that come from git history.\n * These versions are read-only and cannot be deleted.\n */\nconst GIT_VERSION_PREFIX = 'git-';\n\n/**\n * Recursively sort object keys alphabetically so the on-disk JSON is stable\n * across saves. Arrays preserve order; object entries are emitted in a\n * deterministic order so git diffs only reflect real content changes.\n */\nfunction stableSortKeys(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stableSortKeys);\n }\n if (value && typeof value === 'object' && !(value instanceof Date)) {\n return Object.fromEntries(\n Object.entries(value as Record)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, stableSortKeys(entry)]),\n );\n }\n return value;\n}\n\n/**\n * Configuration for a filesystem-backed versioned storage domain.\n */\nexport interface FilesystemVersionedConfig {\n /** The FilesystemDB instance for I/O */\n db: FilesystemDB;\n /** Filename for the entities JSON file (e.g., 'agents.json') */\n entitiesFile: string;\n /** The key name of the parent FK field on versions (e.g., 'agentId') */\n parentIdField: string;\n /** Name for logging/error messages */\n name: string;\n /**\n * Fields that are version metadata (not part of the snapshot config).\n * These are stripped when writing to disk.\n * e.g., ['id', 'agentId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt']\n */\n versionMetadataFields: string[];\n /** Maximum number of git commits to load per file (default: 50) */\n gitHistoryLimit?: number;\n /** Directory for published entities that should be persisted as one JSON file per entity. */\n perEntityFilesDir?: string;\n /** Return true when an entity should persist as one JSON file instead of inside entitiesFile. */\n shouldPersistToPerEntityFile?: (entity: VersionedEntityBase) => boolean;\n /**\n * Optional snapshot filter applied to per-entity files only.\n * Lets per-entity files (e.g. code-mode JSON) exclude fields that are not\n * user-editable from Studio (such as `model`) while keeping the shared\n * `entitiesFile` snapshot unchanged.\n */\n perEntitySnapshotFilter?: (snapshot: Record, entity: VersionedEntityBase) => Record;\n}\n\n/**\n * Generic helpers for filesystem-backed versioned storage domains.\n *\n * Versions are kept entirely in memory. Only the published snapshot config\n * (the clean primitive configuration) is persisted to the on-disk JSON file.\n * This means the JSON files are human-readable, Git-friendly, and contain\n * no version metadata like `changedFields` or `changeMessage`.\n *\n * When the storage directory is inside a git repository, committed versions\n * of the JSON file are automatically loaded as read-only version history.\n * Each git commit that touched the file becomes a version record, giving\n * users a full published history in the version panel — powered by git.\n *\n * On-disk format for `agents.json`:\n * ```json\n * {\n * \"my-agent-id\": {\n * \"name\": \"My Agent\",\n * \"instructions\": \"Be helpful\",\n * \"model\": { \"provider\": \"openai\", \"name\": \"gpt-4\" }\n * }\n * }\n * ```\n */\nexport class FilesystemVersionedHelpers<\n TEntity extends VersionedEntityBase & { createdAt: Date; updatedAt: Date; status: string },\n TVersion extends VersionBase,\n> {\n readonly db: FilesystemDB;\n readonly entitiesFile: string;\n readonly parentIdField: string;\n readonly name: string;\n readonly versionMetadataFields: string[];\n private readonly gitHistoryLimit: number;\n private readonly perEntityFilesDir?: string;\n private readonly shouldPersistToPerEntityFile?: (entity: VersionedEntityBase) => boolean;\n private readonly perEntitySnapshotFilter?: (\n snapshot: Record,\n entity: VersionedEntityBase,\n ) => Record;\n\n /**\n * In-memory entity records (thin metadata), keyed by entity ID.\n */\n private entities = new Map();\n\n /**\n * In-memory version records, keyed by version ID.\n * Includes both in-memory/hydrated versions and git-based versions (metadata only).\n */\n private versions = new Map();\n\n /**\n * Whether we've loaded from disk yet.\n */\n private hydrated = false;\n\n /**\n * Git history utility instance (shared across all helpers).\n */\n private static gitHistory = new GitHistory();\n\n /**\n * Promise that resolves when git history has been loaded.\n * null means git history loading hasn't been triggered yet.\n */\n private gitHistoryPromise: Promise | null = null;\n\n /**\n * The highest version number from git history, per entity ID.\n * Used to assign version numbers to new in-memory versions that continue\n * after the git history.\n */\n private gitVersionCounts = new Map();\n\n constructor(config: FilesystemVersionedConfig) {\n this.db = config.db;\n this.entitiesFile = config.entitiesFile;\n this.parentIdField = config.parentIdField;\n this.name = config.name;\n this.versionMetadataFields = config.versionMetadataFields;\n this.gitHistoryLimit = config.gitHistoryLimit ?? 50;\n this.perEntityFilesDir = config.perEntityFilesDir;\n this.shouldPersistToPerEntityFile = config.shouldPersistToPerEntityFile;\n this.perEntitySnapshotFilter = config.perEntitySnapshotFilter;\n }\n\n private perEntityFilename(entityId: string): string {\n if (!this.perEntityFilesDir) {\n throw new Error(`${this.name}: per-entity files directory is not configured`);\n }\n return getSourceControlEntityFilePath(this.perEntityFilesDir, entityId);\n }\n\n private entityIdFromPerEntityFilename(filename: string): string {\n const basename = filename.split('/').pop() ?? filename;\n return decodeURIComponent(basename.replace(/\\.json$/, ''));\n }\n\n /**\n * Check if a version ID represents a git-based version.\n */\n static isGitVersion(id: string): boolean {\n return id.startsWith(GIT_VERSION_PREFIX);\n }\n\n /**\n * Hydrate in-memory state from the on-disk JSON file.\n * For each entry on disk, creates an in-memory entity (status: 'published')\n * and a synthetic version with the snapshot config.\n *\n * Also kicks off async git history loading in the background.\n * Version numbers for hydrated entities are assigned as 1 initially,\n * but will be reassigned after git history loads.\n */\n hydrate(): void {\n if (this.hydrated) return;\n this.hydrated = true;\n\n const hydrateSnapshot = (entityId: string, snapshotConfig: Record) => {\n const versionId = `hydrated-${entityId}-v1`;\n const now = new Date();\n\n // Create a synthetic entity record\n const entity = {\n id: entityId,\n status: 'published',\n activeVersionId: versionId,\n createdAt: now,\n updatedAt: now,\n } as unknown as TEntity;\n\n this.entities.set(entityId, entity);\n\n // Create a synthetic version with the snapshot config.\n // Version number starts at 1 but may be bumped after git history loads.\n const version = {\n id: versionId,\n [this.parentIdField]: entityId,\n versionNumber: 1,\n ...snapshotConfig,\n createdAt: now,\n } as TVersion;\n\n this.versions.set(versionId, version);\n };\n\n const diskData = this.db.readDomain>(this.entitiesFile);\n\n for (const [entityId, snapshotConfig] of Object.entries(diskData)) {\n if (!snapshotConfig || typeof snapshotConfig !== 'object') continue;\n hydrateSnapshot(entityId, snapshotConfig);\n }\n\n if (this.perEntityFilesDir) {\n for (const filename of this.db.listDomainFiles(this.perEntityFilesDir)) {\n const entityId = this.entityIdFromPerEntityFilename(filename);\n const snapshotConfig = this.db.readDomain(filename);\n if (!snapshotConfig || typeof snapshotConfig !== 'object') continue;\n hydrateSnapshot(entityId, snapshotConfig);\n }\n }\n\n // Kick off async git history loading (fire and forget)\n this.gitHistoryPromise = this.loadGitHistory();\n }\n\n /**\n * Ensure git history has been loaded before proceeding.\n * Call this in version-related methods to ensure git versions are available.\n */\n private async ensureGitHistory(): Promise {\n this.hydrate();\n if (this.gitHistoryPromise) {\n await this.gitHistoryPromise;\n }\n }\n\n /**\n * Load git commit history for the domain's JSON file.\n * Creates read-only version records (metadata + snapshot config) for each\n * commit where an entity existed. Reassigns version numbers for\n * hydrated (current disk) versions to sit on top of git history.\n */\n private async loadGitHistory(): Promise {\n const git = FilesystemVersionedHelpers.gitHistory;\n const dir = this.db.dir;\n\n // Check if we're in a git repo\n const isRepo = await git.isGitRepo(dir);\n if (!isRepo) return;\n\n // Get commit history for this domain's file\n const commits = await git.getFileHistory(dir, this.entitiesFile, this.gitHistoryLimit);\n\n // Process commits from oldest to newest so version numbers are sequential\n const orderedCommits = [...commits].reverse();\n\n // Track per-entity version counts from git\n const entityVersionCount = new Map();\n // Track previous snapshot per entity to skip unchanged entries\n const previousSnapshots = new Map();\n\n for (let i = 0; i < orderedCommits.length; i++) {\n const commit = orderedCommits[i]!;\n\n // Load the file content at this commit\n const fileContent = await git.getFileAtCommit>>(\n dir,\n commit.hash,\n this.entitiesFile,\n );\n if (!fileContent) continue;\n\n // Create a version record for each entity that actually changed in this commit\n for (const [entityId, snapshotConfig] of Object.entries(fileContent)) {\n if (!snapshotConfig || typeof snapshotConfig !== 'object') continue;\n\n // Skip if entity data is unchanged from the previous commit\n const serialized = JSON.stringify(snapshotConfig);\n if (previousSnapshots.get(entityId) === serialized) continue;\n previousSnapshots.set(entityId, serialized);\n\n const count = (entityVersionCount.get(entityId) ?? 0) + 1;\n entityVersionCount.set(entityId, count);\n\n const versionId = `${GIT_VERSION_PREFIX}${commit.hash}-${entityId}`;\n\n // Skip if we somehow already have this version\n if (this.versions.has(versionId)) continue;\n\n const version = {\n id: versionId,\n [this.parentIdField]: entityId,\n versionNumber: count,\n changeMessage: commit.message,\n ...snapshotConfig,\n createdAt: commit.date,\n } as TVersion;\n\n this.versions.set(versionId, version);\n }\n }\n\n // Walk git history for per-entity files (code mode). Each per-entity file\n // is a standalone snapshot, not an entityId → snapshot map, so each commit\n // touching the file becomes one version for that entity.\n if (this.perEntityFilesDir) {\n const perEntityIds = new Set();\n // Known entities currently on disk\n for (const filename of this.db.listDomainFiles(this.perEntityFilesDir)) {\n perEntityIds.add(this.entityIdFromPerEntityFilename(filename));\n }\n // Entities only present in git history (deleted on disk but still in commits)\n // are discovered lazily by scanning entities map, which is already hydrated.\n for (const entityId of this.entities.keys()) {\n perEntityIds.add(entityId);\n }\n\n for (const entityId of perEntityIds) {\n const count = await this.loadPerEntityGitHistory(entityId, entityVersionCount.get(entityId) ?? 0);\n entityVersionCount.set(entityId, count);\n }\n }\n\n // Save the max git version count per entity\n this.gitVersionCounts = entityVersionCount;\n\n // Reassign version numbers for hydrated (current disk) versions\n // so they sit on top of git history\n for (const [entityId, gitCount] of entityVersionCount) {\n const hydratedVersionId = `hydrated-${entityId}-v1`;\n const version = this.versions.get(hydratedVersionId);\n if (version) {\n (version as Record).versionNumber = gitCount + 1;\n }\n }\n }\n\n /**\n * Load git-backed versions for a single per-entity file. Each commit that\n * changes the file becomes one version. Returns the running version count\n * for the entity (starting from `startCount`). Used both by the bulk\n * git-history pass and by `listVersions` to lazily discover entities that\n * were deleted on disk but still exist in git history.\n */\n private async loadPerEntityGitHistory(entityId: string, startCount: number): Promise {\n const git = FilesystemVersionedHelpers.gitHistory;\n const dir = this.db.dir;\n const filename = this.perEntityFilename(entityId);\n const perEntityCommits = await git.getFileHistory(dir, filename, this.gitHistoryLimit);\n if (perEntityCommits.length === 0) return startCount;\n\n const orderedPerEntity = [...perEntityCommits].reverse();\n let previousSnapshotForEntity: string | undefined;\n let count = startCount;\n\n for (const commit of orderedPerEntity) {\n const snapshotConfig = await git.getFileAtCommit>(dir, commit.hash, filename);\n if (!snapshotConfig || typeof snapshotConfig !== 'object') {\n // The file did not exist at this commit (e.g. it was deleted). Reset the\n // dedupe baseline so a later restore with identical content is still\n // recorded as a distinct version rather than skipped.\n previousSnapshotForEntity = undefined;\n continue;\n }\n\n // The per-entity file IS the snapshot, so flatten one level\n // compared to the shared-file branch.\n const serialized = JSON.stringify(snapshotConfig);\n if (previousSnapshotForEntity === serialized) continue;\n previousSnapshotForEntity = serialized;\n\n count += 1;\n\n const versionId = `${GIT_VERSION_PREFIX}${commit.hash}-${entityId}`;\n if (this.versions.has(versionId)) continue;\n\n const version = {\n id: versionId,\n [this.parentIdField]: entityId,\n versionNumber: count,\n changeMessage: commit.message,\n ...snapshotConfig,\n createdAt: commit.date,\n } as TVersion;\n\n this.versions.set(versionId, version);\n }\n\n return count;\n }\n\n // ==========================================================================\n // Disk persistence — only published snapshot configs\n // ==========================================================================\n\n /**\n * Write the published snapshot config for an entity to disk.\n * Strips all entity metadata and version metadata fields, leaving only\n * the clean primitive configuration.\n */\n private persistToDisk(): void {\n const diskData: Record> = {};\n const perEntityData = new Map>();\n\n for (const [entityId, entity] of this.entities) {\n if (entity.status !== 'published' || !entity.activeVersionId) continue;\n\n const version = this.versions.get(entity.activeVersionId);\n if (!version) continue;\n\n const snapshotConfig = this.extractSnapshotConfig(version);\n if (this.perEntityFilesDir && this.shouldPersistToPerEntityFile?.(entity)) {\n const filtered = this.perEntitySnapshotFilter\n ? this.perEntitySnapshotFilter(snapshotConfig, entity)\n : snapshotConfig;\n perEntityData.set(entityId, stableSortKeys(filtered) as Record);\n } else {\n // Sort keys here too so shared-file domains get deterministic ordering.\n // The shared git-history path dedupes with JSON.stringify, so without\n // stable ordering a reorder-only write could surface as a fake version.\n diskData[entityId] = stableSortKeys(snapshotConfig) as Record;\n }\n }\n\n // When every published entity is persisted to per-entity files (code mode)\n // and the shared file would otherwise be an empty `{}` stub, skip writing\n // it so projects that only use code mode don't end up tracking an empty\n // `agents.json` in git. Existing shared files keep being updated so\n // db-mode and mixed setups behave the same as before.\n const hasSharedEntries = Object.keys(diskData).length > 0;\n const sharedFileExists = this.db.domainFileExists(this.entitiesFile);\n if (hasSharedEntries || !this.perEntityFilesDir || sharedFileExists) {\n this.db.writeDomain(this.entitiesFile, diskData);\n }\n\n if (this.perEntityFilesDir) {\n for (const filename of this.db.listDomainFiles(this.perEntityFilesDir)) {\n const entityId = this.entityIdFromPerEntityFilename(filename);\n if (!perEntityData.has(entityId)) {\n this.db.removeDomainFile(filename);\n }\n }\n\n for (const [entityId, snapshotConfig] of perEntityData) {\n this.db.writeDomain(this.perEntityFilename(entityId), snapshotConfig);\n }\n }\n }\n\n /**\n * Extract the snapshot config from a version, stripping version metadata fields.\n */\n private extractSnapshotConfig(version: TVersion): Record {\n const metadataSet = new Set(this.versionMetadataFields);\n const result: Record = {};\n\n for (const [key, value] of Object.entries(version)) {\n if (!metadataSet.has(key)) {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n // ==========================================================================\n // Entity CRUD\n // ==========================================================================\n\n async getById(id: string): Promise {\n this.hydrate();\n return this.entities.has(id) ? structuredClone(this.entities.get(id)!) : null;\n }\n\n async createEntity(id: string, entity: TEntity): Promise {\n this.hydrate();\n if (this.entities.has(id)) {\n throw new Error(`${this.name}: entity with id ${id} already exists`);\n }\n this.entities.set(id, structuredClone(entity));\n return structuredClone(entity);\n }\n\n async updateEntity(id: string, updates: Record): Promise {\n this.hydrate();\n const existing = this.entities.get(id);\n if (!existing) {\n throw new Error(`${this.name}: entity with id ${id} not found`);\n }\n\n const updated = { ...existing } as Record;\n\n for (const [key, value] of Object.entries(updates)) {\n if (key === 'id') continue;\n if (value === undefined) continue;\n\n if (key === 'metadata' && typeof value === 'object' && value !== null) {\n updated['metadata'] = {\n ...((updated['metadata'] as Record | undefined) ?? {}),\n ...(value as Record),\n };\n } else {\n updated[key] = value;\n }\n }\n updated['updatedAt'] = new Date();\n\n const updatedEntity = updated as TEntity;\n this.entities.set(id, structuredClone(updatedEntity));\n\n // Persist to disk when publication state changes:\n // - entity becomes published (write to disk)\n // - entity was published but status changed (remove from disk)\n const wasPublished = existing.status === 'published';\n const isPublished = updatedEntity.status === 'published' && updatedEntity.activeVersionId;\n if (isPublished || (wasPublished && updates['status'] !== undefined)) {\n this.persistToDisk();\n }\n\n return structuredClone(updatedEntity);\n }\n\n async deleteEntity(id: string): Promise {\n this.hydrate();\n this.entities.delete(id);\n await this.deleteVersionsByParentId(id);\n this.persistToDisk();\n }\n\n async listEntities(args: {\n page?: number;\n perPage?: number | false;\n orderBy?: StorageOrderBy;\n filters?: Record;\n listKey: string;\n }): Promise> {\n this.hydrate();\n const { page = 0, perPage: perPageInput, orderBy, filters, listKey } = args;\n\n const perPage = normalizePerPage(perPageInput, 100);\n if (page < 0) throw new Error('page must be >= 0');\n\n let entities = Array.from(this.entities.values());\n\n // Apply filters\n if (filters) {\n for (const [key, value] of Object.entries(filters)) {\n if (value === undefined) continue;\n if (key === 'metadata' && typeof value === 'object' && value !== null) {\n entities = entities.filter(e => {\n const meta = (e as Record)['metadata'] as Record | undefined;\n if (!meta) return false;\n return Object.entries(value as Record).every(\n ([k, v]) => JSON.stringify(meta[k]) === JSON.stringify(v),\n );\n });\n } else {\n entities = entities.filter(e => (e as Record)[key] === value);\n }\n }\n }\n\n // Sort\n const field = (orderBy?.field as string) ?? 'createdAt';\n const direction = (orderBy?.direction as string) ?? 'DESC';\n entities.sort((a, b) => {\n const aVal = new Date((a as Record)[field] as string | Date).getTime();\n const bVal = new Date((b as Record)[field] as string | Date).getTime();\n return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n });\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n return {\n [listKey]: entities.slice(offset, offset + perPage),\n total: entities.length,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < entities.length,\n };\n }\n\n // ==========================================================================\n // Version Methods (in-memory + git history)\n // ==========================================================================\n\n async createVersion(input: TVersion): Promise {\n await this.ensureGitHistory();\n if (this.versions.has(input.id)) {\n throw new Error(`${this.name}: version with id ${input.id} already exists`);\n }\n\n const parentId = (input as Record)[this.parentIdField] as string;\n\n // Check for duplicate (parentId, versionNumber) pair\n for (const v of this.versions.values()) {\n if ((v as Record)[this.parentIdField] === parentId && v.versionNumber === input.versionNumber) {\n throw new Error(`${this.name}: version number ${input.versionNumber} already exists for entity ${parentId}`);\n }\n }\n\n const version: TVersion = {\n ...input,\n createdAt: new Date(),\n } as TVersion;\n\n this.versions.set(input.id, structuredClone(version));\n return structuredClone(version);\n }\n\n async getVersion(id: string): Promise {\n await this.ensureGitHistory();\n return this.versions.has(id) ? structuredClone(this.versions.get(id)!) : null;\n }\n\n async getVersionByNumber(entityId: string, versionNumber: number): Promise {\n await this.ensureGitHistory();\n for (const v of this.versions.values()) {\n if ((v as Record)[this.parentIdField] === entityId && v.versionNumber === versionNumber) {\n return structuredClone(v);\n }\n }\n return null;\n }\n\n async getLatestVersion(entityId: string): Promise {\n await this.ensureGitHistory();\n let latest: TVersion | null = null;\n for (const v of this.versions.values()) {\n if ((v as Record)[this.parentIdField] === entityId) {\n if (!latest || v.versionNumber > latest.versionNumber) {\n latest = v;\n }\n }\n }\n return latest ? structuredClone(latest) : null;\n }\n\n async listVersions(input: ListVersionsInputBase, parentIdField: string): Promise> {\n await this.ensureGitHistory();\n const { page = 0, perPage: perPageInput, orderBy } = input;\n const entityId = (input as Record)[parentIdField] as string;\n\n const perPage = normalizePerPage(perPageInput, 20);\n if (page < 0) throw new Error('page must be >= 0');\n\n // Lazily discover per-entity files that were deleted on disk but still\n // exist in git history. The bulk git-history pass only walks entities that\n // are currently on disk or in memory, so a deleted-then-requested entity\n // would otherwise surface no versions.\n await this.ensurePerEntityGitHistory(entityId);\n\n const versions = Array.from(this.versions.values()).filter(\n v => (v as Record)[this.parentIdField] === entityId,\n );\n\n // Sort\n const field = (orderBy?.field as string) ?? 'versionNumber';\n const direction = (orderBy?.direction as string) ?? 'DESC';\n versions.sort((a, b) => {\n const aVal = field === 'createdAt' ? new Date(a.createdAt).getTime() : a.versionNumber;\n const bVal = field === 'createdAt' ? new Date(b.createdAt).getTime() : b.versionNumber;\n return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n });\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n return {\n versions: versions.slice(offset, offset + perPage),\n total: versions.length,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < versions.length,\n };\n }\n\n async deleteVersion(id: string): Promise {\n await this.ensureGitHistory();\n // Git-based versions are read-only\n if (FilesystemVersionedHelpers.isGitVersion(id)) return;\n this.versions.delete(id);\n }\n\n async deleteVersionsByParentId(entityId: string): Promise {\n await this.ensureGitHistory();\n for (const [versionId, version] of this.versions) {\n if ((version as Record)[this.parentIdField] === entityId) {\n // Skip git-based versions (read-only)\n if (FilesystemVersionedHelpers.isGitVersion(versionId)) continue;\n this.versions.delete(versionId);\n }\n }\n }\n\n async countVersions(entityId: string): Promise {\n await this.ensureGitHistory();\n let count = 0;\n for (const v of this.versions.values()) {\n if ((v as Record)[this.parentIdField] === entityId) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * Lazily discover per-entity git history for an entity that was deleted on\n * disk but still exists in git commits. The bulk git-history pass only walks\n * entities currently on disk or in memory, so without this an entity that has\n * no in-memory versions would surface no git versions (and `gitVersionCounts`\n * would stay 0, letting a recreated entity collide with git version numbers).\n */\n private async ensurePerEntityGitHistory(entityId: string): Promise {\n if (!this.perEntityFilesDir || !entityId) return;\n const hasVersions = Array.from(this.versions.values()).some(\n v => (v as Record)[this.parentIdField] === entityId,\n );\n if (hasVersions) return;\n\n const startCount = this.gitVersionCounts.get(entityId) ?? 0;\n const newCount = await this.loadPerEntityGitHistory(entityId, startCount);\n if (newCount > startCount) {\n this.gitVersionCounts.set(entityId, newCount);\n }\n }\n\n async getNextVersionNumber(entityId: string): Promise {\n await this.ensureGitHistory();\n await this.ensurePerEntityGitHistory(entityId);\n return this._getNextVersionNumber(entityId);\n }\n\n private _getNextVersionNumber(entityId: string): number {\n const gitCount = this.gitVersionCounts.get(entityId) ?? 0;\n let maxVersion = gitCount;\n for (const v of this.versions.values()) {\n if ((v as Record)[this.parentIdField] === entityId) {\n maxVersion = Math.max(maxVersion, v.versionNumber);\n }\n }\n return maxVersion + 1;\n }\n\n async dangerouslyClearAll(): Promise {\n this.entities.clear();\n this.versions.clear();\n this.gitVersionCounts.clear();\n this.gitHistoryPromise = null;\n this.hydrated = false;\n this.db.clearDomain(this.entitiesFile);\n\n // Per-entity files are real on-disk snapshots; clearing only the shared\n // file leaves them behind and they get re-imported on the next hydrate.\n if (this.perEntityFilesDir) {\n for (const filename of this.db.listDomainFiles(this.perEntityFilesDir)) {\n this.db.removeDomainFile(filename);\n }\n }\n }\n}\n"]}