UNPKG

@mastra/core

Version:

Mastra is a framework for building AI-powered applications and agents with a modern TypeScript stack.

1 lines 44 kB
{"version":3,"sources":["../src/storage/domains/skills/base.ts","../src/storage/domains/skills/inmemory.ts","../src/storage/domains/skills/filesystem.ts"],"names":["VersionedStorageDomain","randomUUID","normalizePerPage","calculatePagination","version","FilesystemVersionedHelpers"],"mappings":";;;;;;AA8DO,IAAe,aAAA,GAAf,cAAqCA,wCAAA,CAa1C;AAAA,EACmB,OAAA,GAAU,QAAA;AAAA,EACV,qBAAA,GAAwB;AAAA,IACzC,IAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AAAA,EAEA,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM;AAAA,MACJ,SAAA,EAAW,SAAA;AAAA,MACX,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF;ACrEO,IAAM,qBAAA,GAAN,cAAoC,aAAA,CAAc;AAAA,EAC/C,EAAA;AAAA,EAER,WAAA,CAAY,EAAE,EAAA,EAAG,EAAuB;AACtC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AAAA,EACZ;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,IAAA,CAAK,EAAA,CAAG,OAAO,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,EAAA,CAAG,cAAc,KAAA,EAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,EAAA,EAA8C;AAC1D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,IAAI,EAAE,CAAA;AACpC,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA,GAAI,IAAA;AAAA,EAChD;AAAA,EAEA,MAAM,OAAO,KAAA,EAAsE;AACjF,IAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAElB,IAAA,IAAI,KAAK,EAAA,CAAG,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,KAAA,CAAM,EAAE,CAAA,eAAA,CAAiB,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,KAAe,KAAA,CAAM,WAAW,SAAA,GAAY,MAAA,CAAA;AACrE,IAAA,MAAM,SAAA,GAA8B;AAAA,MAClC,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAA,EAAQ,OAAA;AAAA,MACR,eAAA,EAAiB,MAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,UAAA;AAAA,MACA,aAAA,EAAe,CAAA;AAAA,MACf,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAI,SAAS,CAAA;AAGtC,IAAA,MAAM,EAAE,IAAI,GAAA,EAAK,QAAA,EAAU,WAAW,UAAA,EAAY,WAAA,EAAa,GAAG,cAAA,EAAe,GAAI,KAAA;AAGrF,IAAA,MAAM,YAAYC,mBAAA,EAAW;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,aAAA,CAAc;AAAA,QACvB,EAAA,EAAI,SAAA;AAAA,QACJ,SAAS,KAAA,CAAM,EAAA;AAAA,QACf,aAAA,EAAe,CAAA;AAAA,QACf,GAAG,cAAA;AAAA,QACH,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAAA,QACzC,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AAEd,MAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,OAAO,IAAA,CAAK,eAAe,SAAS,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,OAAO,KAAA,EAA2D;AACtE,IAAA,MAAM,EAAE,EAAA,EAAI,GAAG,OAAA,EAAQ,GAAI,KAAA;AAE3B,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,IAAI,EAAE,CAAA;AAC5C,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,EAAE,CAAA,UAAA,CAAY,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,iBAAiB,MAAA,EAAQ,GAAG,iBAAgB,GAAI,OAAA;AAM9E,IAAA,MAAM,eAAwC,EAAC;AAC/C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC1D,MAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,GAAG,CAAA,GAAI,KAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,MAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,IAAA,CAAK,CAAA,KAAA,KAAS,SAAS,YAAY,CAAA;AAG5E,IAAA,MAAM,aAAA,GAAkC;AAAA,MACtC,GAAG,cAAA;AAAA,MACH,GAAI,QAAA,KAAa,MAAA,IAAa,EAAE,QAAA,EAAS;AAAA,MACzC,GAAI,UAAA,KAAe,MAAA,IAAa,EAAE,UAAA,EAAW;AAAA,MAC7C,GAAI,eAAA,KAAoB,MAAA,IAAa,EAAE,eAAA,EAAgB;AAAA,MACvD,GAAI,MAAA,KAAW,MAAA,IAAa,EAAE,MAAA,EAA6C;AAAA,MAC3E,SAAA,sBAAe,IAAA;AAAK,KACtB;AAGA,IAAA,IAAI,eAAA,KAAoB,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AACzD,MAAA,aAAA,CAAc,MAAA,GAAS,WAAA;AAAA,IACzB;AAGA,IAAA,IAAI,eAAA,EAAiB;AAEnB,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACpD,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,EAAE,CAAA,CAAE,CAAA;AAAA,MACrD;AAGA,MAAA,MAAM;AAAA,QACJ,EAAA,EAAI,UAAA;AAAA,QACJ,OAAA,EAAS,QAAA;AAAA,QACT,aAAA,EAAe,cAAA;AAAA,QACf,aAAA,EAAe,cAAA;AAAA,QACf,aAAA,EAAe,cAAA;AAAA,QACf,SAAA,EAAW,UAAA;AAAA,QACX,GAAG;AAAA,OACL,GAAI,aAAA;AAGJ,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,GAAG,YAAA;AAAA,QACH,GAAG;AAAA,OACL;AAGA,MAAA,MAAM,gBAAgB,gBAAA,CAAiB,MAAA;AAAA,QACrC,CAAA,KAAA,KACE,KAAA,IAAS,YAAA,IACT,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,KAAkC,CAAC,CAAA,KAC7D,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,KAAkC,CAAC;AAAA,OACrE;AAGA,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,QAAA,MAAM,eAAeA,mBAAA,EAAW;AAChC,QAAA,MAAM,gBAAA,GAAmB,cAAc,aAAA,GAAgB,CAAA;AAEvD,QAAA,MAAM,KAAK,aAAA,CAAc;AAAA,UACvB,EAAA,EAAI,YAAA;AAAA,UACJ,OAAA,EAAS,EAAA;AAAA,UACT,aAAA,EAAe,gBAAA;AAAA,UACf,GAAG,SAAA;AAAA,UACH,aAAA;AAAA,UACA,aAAA,EAAe,CAAA,QAAA,EAAW,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SACnD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,aAAa,CAAA;AACpC,IAAA,OAAO,IAAA,CAAK,eAAe,aAAa,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AAEtC,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAExB,IAAA,MAAM,IAAA,CAAK,yBAAyB,EAAE,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,KAAK,IAAA,EAAiE;AAC1E,IAAA,MAAM;AAAA,MACJ,IAAA,GAAO,CAAA;AAAA,MACP,OAAA,EAAS,YAAA;AAAA,MACT,OAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF,GAAI,QAAQ,EAAC;AACb,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,IAAA,CAAK,aAAa,OAAO,CAAA;AAGtD,IAAA,MAAM,OAAA,GAAUC,kCAAA,CAAiB,YAAA,EAAc,GAAG,CAAA;AAElD,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAGA,IAAA,MAAM,SAAA,GAAY,OAAO,gBAAA,GAAmB,CAAA;AAC5C,IAAA,IAAI,IAAA,GAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAGA,IAAA,IAAI,UAAU,KAAA,CAAM,IAAA,CAAK,KAAK,EAAA,CAAG,MAAA,CAAO,QAAQ,CAAA;AAIhD,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,OAAO;AAAA,UACL,QAAQ,EAAC;AAAA,UACT,KAAA,EAAO,CAAA;AAAA,UACP,IAAA;AAAA,UACA,OAAA,EAAS,YAAA,KAAiB,KAAA,GAAQ,KAAA,GAAQ,OAAA;AAAA,UAC1C,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,SAAS,CAAA;AAC/B,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,MAAM,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,MAAA,CAAO,aAAa,QAAQ,CAAA;AAAA,IACjE;AAGA,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,MAAA,CAAO,WAAW,MAAM,CAAA;AAAA,IAC7D;AAGA,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,MAAA,CAAO,eAAe,UAAU,CAAA;AAAA,IACrE;AAIA,IAAA,IAAI,YAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAChD,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,CAAA,OAAA,KAAW;AAElC,QAAA,OAAO,KAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,YAAA,GAAe,eAAA,GAAkB,IAAA,CAAK,sBAAA,CAAuB,eAAe,CAAA,GAAI,MAAA;AACtF,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,aAAa,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,MAChE,CAAA,MAAO;AAEL,QAAA,OAAA,GAAU,EAAC;AAAA,MACb;AAAA,IACF;AAEA,IAAA,MAAM,gBAAgB,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,KAAA,EAAO,WAAW,YAAY,CAAA;AAG9E,IAAA,MAAM,gBAAgB,aAAA,CAAc,GAAA,CAAI,YAAU,IAAA,CAAK,cAAA,CAAe,MAAM,CAAC,CAAA;AAE7E,IAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,kBAAA,KAAuBC,qCAAA,CAAoB,IAAA,EAAM,cAAc,OAAO,CAAA;AAE/F,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,aAAA,CAAc,KAAA,CAAM,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,MACpD,OAAO,aAAA,CAAc,MAAA;AAAA,MACrB,IAAA;AAAA,MACA,OAAA,EAAS,kBAAA;AAAA,MACT,OAAA,EAAS,MAAA,GAAS,OAAA,GAAU,aAAA,CAAc;AAAA,KAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,KAAA,EAAuD;AAEzE,IAAA,IAAI,KAAK,EAAA,CAAG,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAA,CAAM,EAAE,CAAA,eAAA,CAAiB,CAAA;AAAA,IAC9D;AAGA,IAAA,KAAA,MAAWC,QAAAA,IAAW,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,QAAO,EAAG;AACpD,MAAA,IAAIA,SAAQ,OAAA,KAAY,KAAA,CAAM,WAAWA,QAAAA,CAAQ,aAAA,KAAkB,MAAM,aAAA,EAAe;AACtF,QAAA,MAAM,IAAI,MAAM,CAAA,eAAA,EAAkB,KAAA,CAAM,aAAa,CAAA,0BAAA,EAA6B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACnG;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAwB;AAAA,MAC5B,GAAG,KAAA;AAAA,MACH,SAAA,sBAAe,IAAA;AAAK,KACtB;AAGA,IAAA,IAAA,CAAK,EAAA,CAAG,cAAc,GAAA,CAAI,KAAA,CAAM,IAAI,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAC,CAAA;AACjE,IAAA,OAAO,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,WAAW,EAAA,EAA0C;AACzD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,IAAI,EAAE,CAAA;AAC5C,IAAA,OAAO,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA,GAAI,IAAA;AAAA,EACnD;AAAA,EAEA,MAAM,kBAAA,CAAmB,OAAA,EAAiB,aAAA,EAAqD;AAC7F,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,QAAO,EAAG;AACpD,MAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,OAAA,IAAW,OAAA,CAAQ,kBAAkB,aAAA,EAAe;AAC1E,QAAA,OAAO,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAAA,MACrC;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,OAAA,EAA+C;AACpE,IAAA,IAAI,MAAA,GAA8B,IAAA;AAClC,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,QAAO,EAAG;AACpD,MAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,QAAA,IAAI,CAAC,MAAA,IAAU,OAAA,CAAQ,aAAA,GAAgB,OAAO,aAAA,EAAe;AAC3D,UAAA,MAAA,GAAS,OAAA;AAAA,QACX;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA,GAAI,IAAA;AAAA,EACjD;AAAA,EAEA,MAAM,aAAa,KAAA,EAAiE;AAClF,IAAA,MAAM,EAAE,OAAA,EAAS,IAAA,GAAO,GAAG,OAAA,EAAS,YAAA,EAAc,SAAQ,GAAI,KAAA;AAC9D,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAG7D,IAAA,MAAM,OAAA,GAAUF,kCAAA,CAAiB,YAAA,EAAc,EAAE,CAAA;AAEjD,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,SAAA,GAAY,OAAO,gBAAA,GAAmB,CAAA;AAC5C,IAAA,IAAI,IAAA,GAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAGA,IAAA,IAAI,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,OAAO,CAAA;AAG3F,IAAA,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,KAAA,EAAO,SAAS,CAAA;AAGvD,IAAA,MAAM,iBAAiB,QAAA,CAAS,GAAA,CAAI,OAAK,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA;AAEhE,IAAA,MAAM,QAAQ,cAAA,CAAe,MAAA;AAC7B,IAAA,MAAM,EAAE,QAAQ,OAAA,EAAS,kBAAA,KAAuBC,qCAAA,CAAoB,IAAA,EAAM,cAAc,OAAO,CAAA;AAC/F,IAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,SAAS,OAAO,CAAA;AAEvE,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,iBAAA;AAAA,MACV,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,EAAS,kBAAA;AAAA,MACT,OAAA,EAAS,SAAS,OAAA,GAAU;AAAA,KAC9B;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,EAAA,EAA2B;AAC7C,IAAA,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,MAAA,CAAO,EAAE,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,yBAAyB,QAAA,EAAiC;AAC9D,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,CAAC,IAAI,OAAO,CAAA,IAAK,KAAK,EAAA,CAAG,aAAA,CAAc,SAAQ,EAAG;AAC3D,MAAA,IAAI,OAAA,CAAQ,YAAY,QAAA,EAAU;AAChC,QAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,MAAA,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,MAAA,CAAO,EAAE,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,OAAA,EAAkC;AACpD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,QAAO,EAAG;AACpD,MAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,MAAA,EAA4C;AACjE,IAAA,OAAO;AAAA,MACL,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAAA,EAAqC;AAC3D,IAAA,OAAO,gBAAgB,OAAO,CAAA;AAAA,EAChC;AAAA,EAEQ,WAAA,CACN,OAAA,EACA,KAAA,EACA,SAAA,EACA,YAAA,EACoB;AACpB,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAE5B,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,OAAO,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAE,IAAI,CAAA,GAAI,CAAA;AAC1C,QAAA,MAAM,OAAO,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAE,IAAI,CAAA,GAAI,CAAA;AAC1C,QAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,IAAA,GAAO,IAAA;AAAA,MACnC;AAEA,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,KAAK,CAAA,CAAE,OAAA,EAAQ;AAChC,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,KAAK,CAAA,CAAE,OAAA,EAAQ;AAChC,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,OAAO,SAAA,KAAc,KAAA,GAAQ,MAAA,GAAS,MAAA,GAAS,MAAA,GAAS,MAAA;AAAA,MAC1D;AAGA,MAAA,OAAO,CAAA,CAAE,KAAK,CAAA,CAAE,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,CAAA,GAAI,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB,MAAA,EAA6B;AAC1D,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,QAAO,EAAG;AAC5C,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,GAAA,CAAI,eAAe,OAAA,EAAS;AACvD,QAAA,SAAA,CAAU,GAAA,CAAI,IAAI,QAAQ,CAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CACN,QAAA,EACA,KAAA,EACA,SAAA,EACgB;AAChB,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,IAAA;AAEJ,MAAA,IAAI,UAAU,WAAA,EAAa;AACzB,QAAA,IAAA,GAAO,CAAA,CAAE,UAAU,OAAA,EAAQ;AAC3B,QAAA,IAAA,GAAO,CAAA,CAAE,UAAU,OAAA,EAAQ;AAAA,MAC7B,CAAA,MAAO;AAEL,QAAA,IAAA,GAAO,CAAA,CAAE,aAAA;AACT,QAAA,IAAA,GAAO,CAAA,CAAE,aAAA;AAAA,MACX;AAEA,MAAA,OAAO,SAAA,KAAc,KAAA,GAAQ,IAAA,GAAO,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,IACpD,CAAC,CAAA;AAAA,EACH;AACF;;;ACpeO,IAAM,uBAAA,GAAN,cAAsC,aAAA,CAAc;AAAA,EACjD,OAAA;AAAA,EAER,WAAA,CAAY,EAAE,EAAA,EAAG,EAAyB;AACxC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,IAAIE,4CAAA,CAA2B;AAAA,MAC5C,EAAA;AAAA,MACA,YAAA,EAAc,aAAA;AAAA,MACd,aAAA,EAAe,SAAA;AAAA,MACf,IAAA,EAAM,yBAAA;AAAA,MACN,uBAAuB,CAAC,IAAA,EAAM,WAAW,eAAA,EAAiB,eAAA,EAAiB,iBAAiB,WAAW;AAAA,KACxG,CAAA;AAAA,EACH;AAAA,EAEA,MAAe,IAAA,GAAsB;AACnC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,IAAA,EAAK;AAAA,EAC7B;AAAA,EAEA,MAAM,mBAAA,GAAqC;AACzC,IAAA,MAAM,IAAA,CAAK,QAAQ,mBAAA,EAAoB;AAAA,EACzC;AAAA,EAEA,MAAM,QAAQ,EAAA,EAA8C;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,OAAO,KAAA,EAAsE;AACjF,IAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,KAAe,KAAA,CAAM,WAAW,SAAA,GAAY,MAAA,CAAA;AACrE,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAA,EAAQ,OAAA;AAAA,MACR,eAAA,EAAiB,MAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,UAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,KAAA,CAAM,IAAI,MAAM,CAAA;AAGhD,IAAA,MAAM,EAAE,IAAI,GAAA,EAAK,QAAA,EAAU,WAAW,UAAA,EAAY,WAAA,EAAa,GAAG,cAAA,EAAe,GAAI,KAAA;AACrF,IAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AACpC,IAAA,MAAM,KAAK,aAAA,CAAc;AAAA,MACvB,EAAA,EAAI,SAAA;AAAA,MACJ,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,aAAA,EAAe,CAAA;AAAA,MACf,GAAG,cAAA;AAAA,MACH,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAAA,MACzC,aAAA,EAAe;AAAA,KAChB,CAAA;AAED,IAAA,OAAO,gBAAgB,MAAM,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAO,KAAA,EAA2D;AACtE,IAAA,MAAM,EAAE,EAAA,EAAI,GAAG,OAAA,EAAQ,GAAI,KAAA;AAE3B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,EAAE,CAAA,UAAA,CAAY,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,iBAAiB,MAAA,EAAQ,GAAG,iBAAgB,GAAI,OAAA;AAM9E,IAAA,MAAM,eAAwC,EAAC;AAC/C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC1D,MAAA,IAAI,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,GAAG,CAAA,GAAI,KAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,MAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,IAAA,CAAK,CAAA,KAAA,KAAS,SAAS,YAAY,CAAA;AAkB5E,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACpD,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,EAAE,CAAA,CAAE,CAAA;AAAA,MACrD;AAEA,MAAA,MAAM;AAAA,QACJ,EAAA,EAAI,UAAA;AAAA,QACJ,OAAA,EAAS,QAAA;AAAA,QACT,aAAA,EAAe,cAAA;AAAA,QACf,aAAA,EAAe,cAAA;AAAA,QACf,aAAA,EAAe,cAAA;AAAA,QACf,SAAA,EAAW,UAAA;AAAA,QACX,GAAG;AAAA,OACL,GAAI,aAAA;AAEJ,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,GAAG,YAAA;AAAA,QACH,GAAG;AAAA,OACL;AAEA,MAAA,MAAM,gBAAgB,gBAAA,CAAiB,MAAA;AAAA,QACrC,CAAA,KAAA,KACE,KAAA,IAAS,YAAA,IACT,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,KAAkC,CAAC,CAAA,KAC7D,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,KAAkC,CAAC;AAAA,OACrE;AAEA,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,QAAA,MAAM,YAAA,GAAe,OAAO,UAAA,EAAW;AACvC,QAAA,MAAM,gBAAA,GAAmB,cAAc,aAAA,GAAgB,CAAA;AAEvD,QAAA,MAAM,KAAK,aAAA,CAAc;AAAA,UACvB,EAAA,EAAI,YAAA;AAAA,UACJ,OAAA,EAAS,EAAA;AAAA,UACT,aAAA,EAAe,gBAAA;AAAA,UACf,GAAG,SAAA;AAAA,UACH,aAAA;AAAA,UACA,aAAA,EAAe,CAAA,QAAA,EAAW,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SACnD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAyC;AAAA,MAC7C,GAAI,QAAA,KAAa,MAAA,IAAa,EAAE,QAAA,EAAS;AAAA,MACzC,GAAI,UAAA,KAAe,MAAA,IAAa,EAAE,UAAA,EAAW;AAAA,MAC7C,GAAI,eAAA,KAAoB,MAAA,IAAa,EAAE,eAAA,EAAgB;AAAA,MACvD,GAAI,MAAA,KAAW,MAAA,IAAa,EAAE,MAAA;AAAO,KACvC;AACA,IAAA,IAAI,eAAA,KAAoB,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AACzD,MAAA,aAAA,CAAc,MAAA,GAAS,WAAA;AAAA,IACzB;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAI,aAAa,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,EAAE,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,KAAK,IAAA,EAAiE;AAC1E,IAAA,MAAM,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,UAAU,UAAA,EAAY,QAAA,EAAS,GAAI,IAAA,IAAQ,EAAC;AAC5E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa;AAAA,MAC7C,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,QAAA;AAAA,MACT,OAAA,EAAS,EAAE,QAAA,EAAU,UAAA,EAAY,QAAA;AAAS,KAC3C,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,KAAA,EAAuD;AACzE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAqB,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,WAAW,EAAA,EAA0C;AACzD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,EAAE,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,kBAAA,CAAmB,OAAA,EAAiB,aAAA,EAAqD;AAC7F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,OAAA,EAAS,aAAa,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,iBAAiB,OAAA,EAA+C;AACpE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,aAAa,KAAA,EAAiE;AAClF,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,OAAO,SAAS,CAAA;AAC/D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,EAAA,EAA2B;AAC7C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,EAAE,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,yBAAyB,QAAA,EAAiC;AAC9D,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,wBAAA,CAAyB,QAAQ,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,cAAc,OAAA,EAAkC;AACpD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAO,CAAA;AAAA,EAC3C;AACF","file":"chunk-JZ6HQF5G.cjs","sourcesContent":["import type {\n StorageSkillType,\n StorageSkillSnapshotType,\n StorageResolvedSkillType,\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n StorageListSkillsResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// Skill Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of a skill's definition.\n * Definition fields are top-level on the version row (no nested snapshot object).\n */\nexport interface SkillVersion extends StorageSkillSnapshotType, VersionBase {\n /** ID of the skill this version belongs to */\n skillId: string;\n}\n\n/**\n * Input for creating a new skill version.\n * Definition fields are top-level (no nested snapshot object).\n */\nexport interface CreateSkillVersionInput extends StorageSkillSnapshotType, CreateVersionInputBase {\n /** ID of the skill this version belongs to */\n skillId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type SkillVersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type SkillVersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing skill versions with pagination and sorting.\n */\nexport interface ListSkillVersionsInput extends ListVersionsInputBase {\n /** ID of the skill to list versions for */\n skillId: string;\n}\n\n/**\n * Output for listing skill versions with pagination info.\n */\nexport interface ListSkillVersionsOutput extends ListVersionsOutputBase<SkillVersion> {}\n\n// ============================================================================\n// SkillsStorage Base Class\n// ============================================================================\n\nexport abstract class SkillsStorage extends VersionedStorageDomain<\n StorageSkillType,\n StorageSkillSnapshotType,\n StorageResolvedSkillType,\n SkillVersion,\n CreateSkillVersionInput,\n ListSkillVersionsInput,\n ListSkillVersionsOutput,\n { skill: StorageCreateSkillInput },\n StorageUpdateSkillInput,\n StorageListSkillsInput | undefined,\n StorageListSkillsOutput,\n StorageListSkillsResolvedOutput\n> {\n protected readonly listKey = 'skills';\n protected readonly versionMetadataFields = [\n 'id',\n 'skillId',\n 'versionNumber',\n 'changedFields',\n 'changeMessage',\n 'createdAt',\n ] satisfies (keyof SkillVersion)[];\n\n constructor() {\n super({\n component: 'STORAGE',\n name: 'SKILLS',\n });\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n StorageSkillType,\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n ThreadOrderBy,\n ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n SkillVersion,\n CreateSkillVersionInput,\n ListSkillVersionsInput,\n ListSkillVersionsOutput,\n SkillVersionOrderBy,\n SkillVersionSortDirection,\n} from './base';\nimport { SkillsStorage } from './base';\n\nexport class InMemorySkillsStorage extends SkillsStorage {\n private db: InMemoryDB;\n\n constructor({ db }: { db: InMemoryDB }) {\n super();\n this.db = db;\n }\n\n async dangerouslyClearAll(): Promise<void> {\n this.db.skills.clear();\n this.db.skillVersions.clear();\n }\n\n // ==========================================================================\n // Skill CRUD Methods\n // ==========================================================================\n\n async getById(id: string): Promise<StorageSkillType | null> {\n const config = this.db.skills.get(id);\n return config ? this.deepCopyConfig(config) : null;\n }\n\n async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n const { skill } = input;\n\n if (this.db.skills.has(skill.id)) {\n throw new Error(`Skill with id ${skill.id} already exists`);\n }\n\n const now = new Date();\n const visibility = skill.visibility ?? (skill.authorId ? 'private' : undefined);\n const newConfig: StorageSkillType = {\n id: skill.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: skill.authorId,\n visibility,\n favoriteCount: 0,\n createdAt: now,\n updatedAt: now,\n };\n\n this.db.skills.set(skill.id, newConfig);\n\n // Extract config fields from the flat input (everything except record fields)\n const { id: _id, authorId: _authorId, visibility: _visibility, ...snapshotConfig } = skill;\n\n // Create version 1 from the config\n const versionId = randomUUID();\n try {\n await this.createVersion({\n id: versionId,\n skillId: skill.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n } catch (error) {\n // Roll back the orphaned skill record\n this.db.skills.delete(skill.id);\n throw error;\n }\n\n // Return the thin record\n return this.deepCopyConfig(newConfig);\n }\n\n async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n const { id, ...updates } = input;\n\n const existingConfig = this.db.skills.get(id);\n if (!existingConfig) {\n throw new Error(`Skill with id ${id} not found`);\n }\n\n // Separate metadata fields from config fields\n const { authorId, visibility, activeVersionId, status, ...rawConfigFields } = updates;\n\n // Filter out undefined keys: callers may spread partial snapshots into\n // update() and rely on \"omit = no change\" semantics. Without this, an\n // undefined value would clobber the latest version's populated field\n // when spread into newConfig below.\n const configFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(rawConfigFields)) {\n if (value !== undefined) configFields[key] = value;\n }\n\n // Config field names from StorageSkillSnapshotType\n const configFieldNames = [\n 'name',\n 'description',\n 'instructions',\n 'license',\n 'compatibility',\n 'source',\n 'references',\n 'scripts',\n 'assets',\n 'files',\n 'metadata',\n 'tree',\n ];\n\n // Check if any config fields are present in the update\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n // Update metadata fields on the record\n const updatedConfig: StorageSkillType = {\n ...existingConfig,\n ...(authorId !== undefined && { authorId }),\n ...(visibility !== undefined && { visibility }),\n ...(activeVersionId !== undefined && { activeVersionId }),\n ...(status !== undefined && { status: status as StorageSkillType['status'] }),\n updatedAt: new Date(),\n };\n\n // Auto-set status to 'published' when activeVersionId is set, only if status is not explicitly provided\n if (activeVersionId !== undefined && status === undefined) {\n updatedConfig.status = 'published';\n }\n\n // If config fields are being updated, create a new version\n if (hasConfigUpdate) {\n // Get the latest version to use as base\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new Error(`No versions found for skill ${id}`);\n }\n\n // Extract config from latest version\n const {\n id: _versionId,\n skillId: _skillId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n // Merge updates into latest config\n const newConfig = {\n ...latestConfig,\n ...configFields,\n };\n\n // Identify which fields changed\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n // Only create a new version if something actually changed\n if (changedFields.length > 0) {\n const newVersionId = randomUUID();\n const newVersionNumber = latestVersion.versionNumber + 1;\n\n await this.createVersion({\n id: newVersionId,\n skillId: id,\n versionNumber: newVersionNumber,\n ...newConfig,\n changedFields,\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Save the updated record\n this.db.skills.set(id, updatedConfig);\n return this.deepCopyConfig(updatedConfig);\n }\n\n async delete(id: string): Promise<void> {\n // Idempotent delete\n this.db.skills.delete(id);\n // Also delete all versions for this skill\n await this.deleteVersionsByParentId(id);\n }\n\n async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n const {\n page = 0,\n perPage: perPageInput,\n orderBy,\n authorId,\n status,\n visibility,\n metadata,\n entityIds,\n pinFavoritedFor,\n favoritedOnly,\n } = args || {};\n const { field, direction } = this.parseOrderBy(orderBy);\n\n // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n const perPage = normalizePerPage(perPageInput, 100);\n\n if (page < 0) {\n throw new Error('page must be >= 0');\n }\n\n // Prevent unreasonably large page values\n const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n if (page * perPage > maxOffset) {\n throw new Error('page value too large');\n }\n\n // Get all skills and apply filters\n let configs = Array.from(this.db.skills.values());\n\n // Restrict to a set of IDs (used by ?favoritedOnly=true).\n // An empty array means \"no candidates\" -> empty result.\n if (entityIds !== undefined) {\n if (entityIds.length === 0) {\n return {\n skills: [],\n total: 0,\n page,\n perPage: perPageInput === false ? false : perPage,\n hasMore: false,\n };\n }\n const idSet = new Set(entityIds);\n configs = configs.filter(config => idSet.has(config.id));\n }\n\n // Filter by authorId if provided\n if (authorId !== undefined) {\n configs = configs.filter(config => config.authorId === authorId);\n }\n\n // Filter by status if provided\n if (status !== undefined) {\n configs = configs.filter(config => config.status === status);\n }\n\n // Filter by visibility if provided\n if (visibility !== undefined) {\n configs = configs.filter(config => config.visibility === visibility);\n }\n\n // Filter by metadata if provided (AND logic) — skills don't have metadata on the record,\n // but we support the filter interface for consistency\n if (metadata && Object.keys(metadata).length > 0) {\n configs = configs.filter(_config => {\n // StorageSkillType doesn't have metadata on the thin record\n return false;\n });\n }\n\n // Optional favorited-first ordering / favorites-only filter.\n const favoritedIds = pinFavoritedFor ? this.collectFavoritedIdsFor(pinFavoritedFor) : undefined;\n if (favoritedOnly) {\n if (favoritedIds) {\n configs = configs.filter(config => favoritedIds.has(config.id));\n } else {\n // Defensive: favoritedOnly with no userId can never match a real row.\n configs = [];\n }\n }\n\n const sortedConfigs = this.sortConfigs(configs, field, direction, favoritedIds);\n\n // Deep clone to avoid mutation\n const clonedConfigs = sortedConfigs.map(config => this.deepCopyConfig(config));\n\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n return {\n skills: clonedConfigs.slice(offset, offset + perPage),\n total: clonedConfigs.length,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < clonedConfigs.length,\n };\n }\n\n // ==========================================================================\n // Skill Version Methods\n // ==========================================================================\n\n async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n // Check if version with this ID already exists\n if (this.db.skillVersions.has(input.id)) {\n throw new Error(`Version with id ${input.id} already exists`);\n }\n\n // Check for duplicate (skillId, versionNumber) pair\n for (const version of this.db.skillVersions.values()) {\n if (version.skillId === input.skillId && version.versionNumber === input.versionNumber) {\n throw new Error(`Version number ${input.versionNumber} already exists for skill ${input.skillId}`);\n }\n }\n\n const version: SkillVersion = {\n ...input,\n createdAt: new Date(),\n };\n\n // Deep clone before storing\n this.db.skillVersions.set(input.id, this.deepCopyVersion(version));\n return this.deepCopyVersion(version);\n }\n\n async getVersion(id: string): Promise<SkillVersion | null> {\n const version = this.db.skillVersions.get(id);\n return version ? this.deepCopyVersion(version) : null;\n }\n\n async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n for (const version of this.db.skillVersions.values()) {\n if (version.skillId === skillId && version.versionNumber === versionNumber) {\n return this.deepCopyVersion(version);\n }\n }\n return null;\n }\n\n async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n let latest: SkillVersion | null = null;\n for (const version of this.db.skillVersions.values()) {\n if (version.skillId === skillId) {\n if (!latest || version.versionNumber > latest.versionNumber) {\n latest = version;\n }\n }\n }\n return latest ? this.deepCopyVersion(latest) : null;\n }\n\n async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n const { skillId, page = 0, perPage: perPageInput, orderBy } = input;\n const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n // Normalize perPage (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n const perPage = normalizePerPage(perPageInput, 20);\n\n if (page < 0) {\n throw new Error('page must be >= 0');\n }\n\n const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n if (page * perPage > maxOffset) {\n throw new Error('page value too large');\n }\n\n // Filter versions by skillId\n let versions = Array.from(this.db.skillVersions.values()).filter(v => v.skillId === skillId);\n\n // Sort versions\n versions = this.sortVersions(versions, field, direction);\n\n // Deep clone\n const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n const total = clonedVersions.length;\n const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n return {\n versions: paginatedVersions,\n total,\n page,\n perPage: perPageForResponse,\n hasMore: offset + perPage < total,\n };\n }\n\n async deleteVersion(id: string): Promise<void> {\n this.db.skillVersions.delete(id);\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n const idsToDelete: string[] = [];\n for (const [id, version] of this.db.skillVersions.entries()) {\n if (version.skillId === entityId) {\n idsToDelete.push(id);\n }\n }\n\n for (const id of idsToDelete) {\n this.db.skillVersions.delete(id);\n }\n }\n\n async countVersions(skillId: string): Promise<number> {\n let count = 0;\n for (const version of this.db.skillVersions.values()) {\n if (version.skillId === skillId) {\n count++;\n }\n }\n return count;\n }\n\n // ==========================================================================\n // Private Helper Methods\n // ==========================================================================\n\n private deepCopyConfig(config: StorageSkillType): StorageSkillType {\n return {\n ...config,\n };\n }\n\n private deepCopyVersion(version: SkillVersion): SkillVersion {\n return structuredClone(version);\n }\n\n private sortConfigs(\n configs: StorageSkillType[],\n field: ThreadOrderBy,\n direction: ThreadSortDirection,\n favoritedIds?: Set<string>,\n ): StorageSkillType[] {\n return configs.sort((a, b) => {\n // Compound sort: favorited first, then existing orderBy, then id ASC for stable pagination.\n if (favoritedIds) {\n const aFav = favoritedIds.has(a.id) ? 1 : 0;\n const bFav = favoritedIds.has(b.id) ? 1 : 0;\n if (aFav !== bFav) return bFav - aFav;\n }\n\n const aValue = a[field].getTime();\n const bValue = b[field].getTime();\n if (aValue !== bValue) {\n return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n }\n\n // Stable tie-break for same `createdAt`/`updatedAt`.\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n });\n }\n\n /**\n * Collect the set of skill IDs favorited by the given user. Returns an empty\n * Set when the favorites domain is not wired or the user has no favorites.\n */\n private collectFavoritedIdsFor(userId: string): Set<string> {\n const favorited = new Set<string>();\n for (const row of this.db.favorites.values()) {\n if (row.userId === userId && row.entityType === 'skill') {\n favorited.add(row.entityId);\n }\n }\n return favorited;\n }\n\n private sortVersions(\n versions: SkillVersion[],\n field: SkillVersionOrderBy,\n direction: SkillVersionSortDirection,\n ): SkillVersion[] {\n return versions.sort((a, b) => {\n let aVal: number;\n let bVal: number;\n\n if (field === 'createdAt') {\n aVal = a.createdAt.getTime();\n bVal = b.createdAt.getTime();\n } else {\n // versionNumber\n aVal = a.versionNumber;\n bVal = b.versionNumber;\n }\n\n return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n });\n }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n StorageSkillType,\n StorageCreateSkillInput,\n StorageUpdateSkillInput,\n StorageListSkillsInput,\n StorageListSkillsOutput,\n} from '../../types';\nimport type { SkillVersion, CreateSkillVersionInput, ListSkillVersionsInput, ListSkillVersionsOutput } from './base';\nimport { SkillsStorage } from './base';\n\nexport class FilesystemSkillsStorage extends SkillsStorage {\n private helpers: FilesystemVersionedHelpers<StorageSkillType, SkillVersion>;\n\n constructor({ db }: { db: FilesystemDB }) {\n super();\n this.helpers = new FilesystemVersionedHelpers({\n db,\n entitiesFile: 'skills.json',\n parentIdField: 'skillId',\n name: 'FilesystemSkillsStorage',\n versionMetadataFields: ['id', 'skillId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt'],\n });\n }\n\n override async init(): Promise<void> {\n await this.helpers.db.init();\n }\n\n async dangerouslyClearAll(): Promise<void> {\n await this.helpers.dangerouslyClearAll();\n }\n\n async getById(id: string): Promise<StorageSkillType | null> {\n return this.helpers.getById(id);\n }\n\n async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n const { skill } = input;\n const now = new Date();\n const visibility = skill.visibility ?? (skill.authorId ? 'private' : undefined);\n const entity: StorageSkillType = {\n id: skill.id,\n status: 'draft',\n activeVersionId: undefined,\n authorId: skill.authorId,\n visibility,\n createdAt: now,\n updatedAt: now,\n };\n\n await this.helpers.createEntity(skill.id, entity);\n\n // Skills don't have metadata on the thin record, so only exclude id, authorId, visibility\n const { id: _id, authorId: _authorId, visibility: _visibility, ...snapshotConfig } = skill;\n const versionId = crypto.randomUUID();\n await this.createVersion({\n id: versionId,\n skillId: skill.id,\n versionNumber: 1,\n ...snapshotConfig,\n changedFields: Object.keys(snapshotConfig),\n changeMessage: 'Initial version',\n });\n\n return structuredClone(entity);\n }\n\n async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n const { id, ...updates } = input;\n\n const existing = await this.helpers.getById(id);\n if (!existing) {\n throw new Error(`FilesystemSkillsStorage: skill with id ${id} not found`);\n }\n\n const { authorId, visibility, activeVersionId, status, ...rawConfigFields } = updates;\n\n // Filter out undefined keys: callers may spread partial snapshots into\n // update() and rely on \"omit = no change\" semantics. Without this, an\n // undefined value would clobber the latest version's populated field\n // when spread into newConfig below.\n const configFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(rawConfigFields)) {\n if (value !== undefined) configFields[key] = value;\n }\n\n // Config field names from StorageSkillSnapshotType\n const configFieldNames = [\n 'name',\n 'description',\n 'instructions',\n 'license',\n 'compatibility',\n 'source',\n 'references',\n 'scripts',\n 'assets',\n 'files',\n 'metadata',\n 'tree',\n ];\n\n const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n // Update metadata fields on the record\n const updatedEntity: StorageSkillType = {\n ...existing,\n ...(authorId !== undefined && { authorId }),\n ...(visibility !== undefined && { visibility }),\n ...(activeVersionId !== undefined && { activeVersionId }),\n ...(status !== undefined && { status: status as StorageSkillType['status'] }),\n updatedAt: new Date(),\n };\n\n // Auto-set status to 'published' when activeVersionId is set without explicit status\n if (activeVersionId !== undefined && status === undefined) {\n updatedEntity.status = 'published';\n }\n\n // If config fields are being updated, create a new version\n if (hasConfigUpdate) {\n const latestVersion = await this.getLatestVersion(id);\n if (!latestVersion) {\n throw new Error(`No versions found for skill ${id}`);\n }\n\n const {\n id: _versionId,\n skillId: _skillId,\n versionNumber: _versionNumber,\n changedFields: _changedFields,\n changeMessage: _changeMessage,\n createdAt: _createdAt,\n ...latestConfig\n } = latestVersion;\n\n const newConfig = {\n ...latestConfig,\n ...configFields,\n };\n\n const changedFields = configFieldNames.filter(\n field =>\n field in configFields &&\n JSON.stringify(configFields[field as keyof typeof configFields]) !==\n JSON.stringify(latestConfig[field as keyof typeof latestConfig]),\n );\n\n if (changedFields.length > 0) {\n const newVersionId = crypto.randomUUID();\n const newVersionNumber = latestVersion.versionNumber + 1;\n\n await this.createVersion({\n id: newVersionId,\n skillId: id,\n versionNumber: newVersionNumber,\n ...newConfig,\n changedFields,\n changeMessage: `Updated ${changedFields.join(', ')}`,\n });\n }\n }\n\n // Build the entity-level updates for the helpers\n const entityUpdates: Record<string, unknown> = {\n ...(authorId !== undefined && { authorId }),\n ...(visibility !== undefined && { visibility }),\n ...(activeVersionId !== undefined && { activeVersionId }),\n ...(status !== undefined && { status }),\n };\n if (activeVersionId !== undefined && status === undefined) {\n entityUpdates.status = 'published';\n }\n return await this.helpers.updateEntity(id, entityUpdates);\n }\n\n async delete(id: string): Promise<void> {\n await this.helpers.deleteEntity(id);\n }\n\n async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n const { page, perPage, orderBy, authorId, visibility, metadata } = args || {};\n const result = await this.helpers.listEntities({\n page,\n perPage,\n orderBy,\n listKey: 'skills',\n filters: { authorId, visibility, metadata },\n });\n return result as unknown as StorageListSkillsOutput;\n }\n\n async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n return this.helpers.createVersion(input as SkillVersion);\n }\n\n async getVersion(id: string): Promise<SkillVersion | null> {\n return this.helpers.getVersion(id);\n }\n\n async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n return this.helpers.getVersionByNumber(skillId, versionNumber);\n }\n\n async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n return this.helpers.getLatestVersion(skillId);\n }\n\n async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n const result = await this.helpers.listVersions(input, 'skillId');\n return result as ListSkillVersionsOutput;\n }\n\n async deleteVersion(id: string): Promise<void> {\n await this.helpers.deleteVersion(id);\n }\n\n async deleteVersionsByParentId(entityId: string): Promise<void> {\n await this.helpers.deleteVersionsByParentId(entityId);\n }\n\n async countVersions(skillId: string): Promise<number> {\n return this.helpers.countVersions(skillId);\n }\n}\n"]}