cursor-history 0.5.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/README.md +385 -2
- package/dist/cli/commands/backup.d.ts +9 -0
- package/dist/cli/commands/backup.d.ts.map +1 -0
- package/dist/cli/commands/backup.js +168 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/export.d.ts.map +1 -1
- package/dist/cli/commands/export.js +39 -7
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/list-backups.d.ts +9 -0
- package/dist/cli/commands/list-backups.d.ts.map +1 -0
- package/dist/cli/commands/list-backups.js +166 -0
- package/dist/cli/commands/list-backups.js.map +1 -0
- package/dist/cli/commands/list.d.ts.map +1 -1
- package/dist/cli/commands/list.js +44 -9
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/migrate-session.d.ts +12 -0
- package/dist/cli/commands/migrate-session.d.ts.map +1 -0
- package/dist/cli/commands/migrate-session.js +125 -0
- package/dist/cli/commands/migrate-session.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +13 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +122 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/restore.d.ts +9 -0
- package/dist/cli/commands/restore.d.ts.map +1 -0
- package/dist/cli/commands/restore.js +192 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +31 -3
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/show.d.ts.map +1 -1
- package/dist/cli/commands/show.js +32 -4
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/errors.d.ts +56 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +90 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/index.js +11 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/backup.d.ts +89 -0
- package/dist/core/backup.d.ts.map +1 -0
- package/dist/core/backup.js +709 -0
- package/dist/core/backup.js.map +1 -0
- package/dist/core/migrate.d.ts +40 -0
- package/dist/core/migrate.d.ts.map +1 -0
- package/dist/core/migrate.js +586 -0
- package/dist/core/migrate.js.map +1 -0
- package/dist/core/storage.d.ts +78 -6
- package/dist/core/storage.d.ts.map +1 -1
- package/dist/core/storage.js +327 -45
- package/dist/core/storage.js.map +1 -1
- package/dist/core/types.d.ts +280 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/lib/backup.d.ts +98 -0
- package/dist/lib/backup.d.ts.map +1 -0
- package/dist/lib/backup.js +108 -0
- package/dist/lib/backup.js.map +1 -0
- package/dist/lib/config.d.ts +33 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +81 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +257 -30
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +404 -54
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/index.d.ts +219 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +520 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/platform.d.ts +11 -0
- package/dist/lib/platform.d.ts.map +1 -1
- package/dist/lib/platform.js +32 -0
- package/dist/lib/platform.js.map +1 -1
- package/dist/lib/types.d.ts +374 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +9 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts +17 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +20 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +32 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3H,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,MAAM,MAAM,SAAS,CAAC;AAa7B,+BAA+B;AAC/B,MAAM,sBAAsB,GAAG,OAAO,CAAC;AACvC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAEjC,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,wBAAwB,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE1D,OAAO,yBAAyB,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,GAAG,OAAO,GAAG,OAAO,MAAM,CAAC;AAC1F,CAAC;AAkBD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,KAAK,GAAuB,EAAE,CAAC;IAErC,8DAA8D;IAC9D,6EAA6E;IAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElC,sCAAsC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;IACnE,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC;YACT,YAAY,EAAE,YAAY;YAC1B,YAAY,EAAE,2BAA2B;YACzC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACrC,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,mBAAmB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBAE3D,4BAA4B;oBAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;oBAC1D,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;wBAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;wBACvC,KAAK,CAAC,IAAI,CAAC;4BACT,YAAY,EAAE,eAAe;4BAC7B,YAAY,EAAE,oBAAoB,KAAK,CAAC,IAAI,cAAc;4BAC1D,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,IAAI,EAAE,cAAc;4BACpB,WAAW,EAAE,KAAK,CAAC,IAAI;yBACxB,CAAC,CAAC;oBACL,CAAC;oBAED,kEAAkE;oBAClE,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;oBAC/D,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;wBACzC,KAAK,CAAC,IAAI,CAAC;4BACT,YAAY,EAAE,iBAAiB;4BAC/B,YAAY,EAAE,oBAAoB,KAAK,CAAC,IAAI,iBAAiB;4BAC7D,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,IAAI,EAAE,gBAAgB;4BACtB,WAAW,EAAE,KAAK,CAAC,IAAI;yBACxB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAwB,EACxB,KAAkB;IAElB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAwC,CAAC;IAElE,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,cAAc,EAAE,QAAQ;QACxB,oBAAoB,EAAE,sBAAsB;QAC5C,KAAK;QACL,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,4BAA4B;YAC5B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,EAEhF,CAAC;YACd,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAA6C,CAAC;gBAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,OAAO,IAAI,CAAC,MAAM,CAAC;gBACrB,CAAC;gBACD,IAAI,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC1D,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,QAAgB;IACvE,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,aAAqB;IAErB,0DAA0D;IAC1D,mEAAmE;IACnE,2EAA2E;IAC3E,+FAA+F;IAE/F,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,6CAA6C;QAC7C,2DAA2D;QAC3D,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,gBAAgB;YAClC,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAqB;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,kBAAkB;IAClB,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,wBAAwB,EAAE,CAAC;IACpE,MAAM,SAAS,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC;IAC1F,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,KAAK,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,CAAC;IAEtC,iCAAiC;IACjC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,oCAAoC;IACpC,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;YAClF,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE,wBAAwB,UAAU,6BAA6B;SACvE,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,UAAU,EAAE,CAAC;QACX,KAAK,EAAE,UAAU;QACjB,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;YAClF,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE,4BAA4B,UAAU,EAAE;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAE/D,yBAAyB;IACzB,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB;IACnF,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;YAClF,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE,yBAAyB;SACjC,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9D,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,8BAA8B;QAC9B,MAAM,WAAW,GAAsB,EAAE,CAAC;QAC1C,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YAE3B,UAAU,EAAE,CAAC;gBACX,KAAK,EAAE,YAAY;gBACnB,WAAW,EAAE,MAAM,CAAC,YAAY;gBAChC,cAAc,EAAE,CAAC;gBACjB,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,cAAc;gBACd,UAAU;aACX,CAAC,CAAC;YAEH,qCAAqC;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YACxD,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtD,mEAAmE;YACnE,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAClE,gDAAgD;gBAChD,MAAM,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,oDAAoD;gBACpD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBAClD,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACvC,CAAC;YAED,2CAA2C;YAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YAEzC,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,MAAM,CAAC,YAAY;gBACzB,IAAI,EAAE,MAAM,CAAC,MAAM;gBACnB,QAAQ;gBACR,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAC;YAEH,qCAAqC;YACrC,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAClE,YAAY,IAAI,aAAa,CAAC,YAAY,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACvC,CAAC;YAED,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC;QAChC,CAAC;QAED,qBAAqB;QACrB,UAAU,EAAE,CAAC;YACX,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,OAAO,CAAC,MAAM;YAC9B,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,cAAc,EAAE,UAAU;YAC1B,UAAU;SACX,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC;QAEzB,mCAAmC;QACnC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,uEAAuE;YACvE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,gCAAgC;QAChC,MAAM,KAAK,GAAgB;YACzB,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,YAAY;YACZ,cAAc,EAAE,YAAY,CAAC,IAAI;SAClC,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACpD,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7E,oBAAoB;QACpB,UAAU,EAAE,CAAC;YACX,KAAK,EAAE,YAAY;YACnB,cAAc,EAAE,OAAO,CAAC,MAAM;YAC9B,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,cAAc,EAAE,UAAU;YAC1B,UAAU;SACX,CAAC,CAAC;QAEH,iBAAiB;QACjB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,UAAU,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;QACD,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAEzB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,UAAU;YACtB,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,0BAA0B;QAC1B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;gBACjC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACvB,CAAC;yBAAM,CAAC;wBACN,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;gBACD,8BAA8B;gBAC9B,IAAI,CAAC;oBACH,SAAS,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC,CAAC;YACF,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,UAAU,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,MAAc;IACnE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,uEAAuE;IACvE,MAAM,QAAQ,GAAG,IAAI,CACnB,MAAM,EAAE,EACR,yBAAyB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CACnF,CAAC;IACF,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhC,iDAAiD;IACjD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,mCAAmC;IAClC,EAAiD,CAAC,SAAS,GAAG,QAAQ,CAAC;IAExE,mCAAmC;IACnC,MAAM,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,EAAE,CAAC,KAAK,GAAG,GAAG,EAAE;QACd,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACrD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAmB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,uBAAuB;IACvB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,CAAC,0BAA0B,UAAU,EAAE,CAAC;SACjD,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,CAAC,qBAAqB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,CAAC,mCAAmC,CAAC;SAC9C,CAAC;IACJ,CAAC;IAED,IAAI,QAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAmB,CAAC;IAC5E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,EAAE;YACd,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,CAAC,0BAA0B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;SACjF,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,cAAc,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC1C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,MAAwC,CAAC;IAC7C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;SAAM,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,UAAU,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,kBAAkB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,oBAAoB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,MAAM;QACN,QAAQ;QACR,UAAU;QACV,cAAc;QACd,YAAY;QACZ,MAAM;KACP,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAqB;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,wBAAwB,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;IACpC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAErC,oBAAoB;IACpB,UAAU,EAAE,CAAC;QACX,KAAK,EAAE,YAAY;QACnB,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,CAAC;QACb,eAAe,EAAE,SAAS;KAC3B,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAS,CAAC;IAEtC,yBAAyB;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;IAEnE,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE,mCAAmC,OAAO,6BAA6B;SAC/E,CAAC;IACJ,CAAC;IAED,UAAU,EAAE,CAAC;QACX,KAAK,EAAE,YAAY;QACnB,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;QACjC,eAAe,EAAE,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;QACzE,cAAc,EAAE,UAAU,CAAC,cAAc;KAC1C,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAa,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAE3F,IAAI,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;YAErC,UAAU,EAAE,CAAC;gBACX,KAAK,EAAE,YAAY;gBACnB,WAAW,EAAE,SAAS,CAAC,IAAI;gBAC3B,cAAc,EAAE,CAAC;gBACjB,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;gBACjC,eAAe,EAAE,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;gBACzE,cAAc,EAAE,UAAU,CAAC,cAAc;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS,CAAC,qBAAqB;YACjC,CAAC;YAED,0DAA0D;YAC1D,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAE7C,6BAA6B;YAC7B,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAElD,aAAa;YACb,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAED,oBAAoB;QACpB,UAAU,EAAE,CAAC;YACX,KAAK,EAAE,YAAY;YACnB,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;YACrC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;YACjC,eAAe,EAAE,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;SAC1E,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU;YACV,aAAa,EAAE,aAAa,CAAC,MAAM;YACnC,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,0DAA0D;QAC1D,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,aAAa,EAAE,CAAC;YAChB,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE,mBAAmB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SACvE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,SAAkB;IAC5C,MAAM,GAAG,GAAG,SAAS,IAAI,mBAAmB,EAAE,CAAC;IAE/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEhC,MAAM,IAAI,GAAe;gBACvB,QAAQ;gBACR,QAAQ,EAAE,KAAK,CAAC,IAAI;gBACpB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,UAAU,EAAE,IAAI,CAAC,KAAK;aACvB,CAAC;YAEF,uBAAuB;YACvB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAC9C,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,KAAK,GAAG,mBAAmB,CAAC;gBACnC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,0CAA0C;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IAExE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+EAA+E;AAC/E,kEAAkE;AAClE,+EAA+E;AAE/E,SAAS,wBAAwB;IAC/B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,IAAI,CACT,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAC1D,QAAQ,EACR,MAAM,EACN,kBAAkB,CACnB,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAC5F;YACE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core migration logic for Cursor chat history
|
|
3
|
+
*
|
|
4
|
+
* This module provides session-level migration as the core primitive.
|
|
5
|
+
* Workspace-level migration is built on top of session migration.
|
|
6
|
+
*/
|
|
7
|
+
import type { MigrateSessionOptions, MigrateWorkspaceOptions, SessionMigrationResult, WorkspaceMigrationResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Migrate a single session from its current workspace to a destination workspace.
|
|
10
|
+
*
|
|
11
|
+
* This is the core primitive for all migration operations.
|
|
12
|
+
* Move mode: removes session from source, adds to destination.
|
|
13
|
+
* Copy mode: duplicates session to destination, keeps source intact.
|
|
14
|
+
*
|
|
15
|
+
* @param sessionId - The session ID to migrate
|
|
16
|
+
* @param options - Migration options
|
|
17
|
+
* @returns Migration result for this session
|
|
18
|
+
*/
|
|
19
|
+
export declare function migrateSession(sessionId: string, options: Omit<MigrateSessionOptions, 'sessionIds'>): SessionMigrationResult;
|
|
20
|
+
/**
|
|
21
|
+
* Migrate multiple sessions to a destination workspace.
|
|
22
|
+
*
|
|
23
|
+
* Handles batch migration with partial failure support.
|
|
24
|
+
* Each session is migrated independently - failures don't stop the batch.
|
|
25
|
+
*
|
|
26
|
+
* @param options - Migration options including session IDs
|
|
27
|
+
* @returns Array of results for each session
|
|
28
|
+
*/
|
|
29
|
+
export declare function migrateSessions(options: MigrateSessionOptions): SessionMigrationResult[];
|
|
30
|
+
/**
|
|
31
|
+
* Migrate all sessions from one workspace to another.
|
|
32
|
+
*
|
|
33
|
+
* This is a convenience wrapper that finds all sessions in the source workspace
|
|
34
|
+
* and calls migrateSession for each one.
|
|
35
|
+
*
|
|
36
|
+
* @param options - Workspace migration options
|
|
37
|
+
* @returns Aggregate result with per-session details
|
|
38
|
+
*/
|
|
39
|
+
export declare function migrateWorkspace(options: MigrateWorkspaceOptions): WorkspaceMigrationResult;
|
|
40
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/core/migrate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,OAAO,KAAK,EACV,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AA+apB;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,GACjD,sBAAsB,CA+IxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,sBAAsB,EAAE,CAuBxF;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,wBAAwB,CAoF3F"}
|
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core migration logic for Cursor chat history
|
|
3
|
+
*
|
|
4
|
+
* This module provides session-level migration as the core primitive.
|
|
5
|
+
* Workspace-level migration is built on top of session migration.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import Database from 'better-sqlite3';
|
|
11
|
+
import { findWorkspaceForSession, findWorkspaceByPath, openDatabaseReadWrite, getComposerData, updateComposerData, } from './storage.js';
|
|
12
|
+
import { normalizePath, pathsEqual } from '../lib/platform.js';
|
|
13
|
+
import { SessionNotFoundError, WorkspaceNotFoundError, SameWorkspaceError, NoSessionsFoundError, DestinationHasSessionsError, NestedPathError, } from '../lib/errors.js';
|
|
14
|
+
/**
|
|
15
|
+
* Generate a new unique session ID (UUID v4 format)
|
|
16
|
+
*/
|
|
17
|
+
function generateSessionId() {
|
|
18
|
+
// Simple UUID v4 generator
|
|
19
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
20
|
+
const r = (Math.random() * 16) | 0;
|
|
21
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
22
|
+
return v.toString(16);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the global Cursor storage path
|
|
27
|
+
*/
|
|
28
|
+
function getGlobalStoragePath() {
|
|
29
|
+
const platform = process.platform;
|
|
30
|
+
const home = homedir();
|
|
31
|
+
if (platform === 'win32') {
|
|
32
|
+
return join(process.env['APPDATA'] ?? join(home, 'AppData', 'Roaming'), 'Cursor', 'User', 'globalStorage');
|
|
33
|
+
}
|
|
34
|
+
else if (platform === 'darwin') {
|
|
35
|
+
return join(home, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return join(home, '.config', 'Cursor', 'User', 'globalStorage');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* T004: Transform a single path by replacing source prefix with destination prefix.
|
|
43
|
+
* Returns null if path doesn't start with source prefix (external path).
|
|
44
|
+
*
|
|
45
|
+
* @param path - The path to transform
|
|
46
|
+
* @param sourcePrefix - Source workspace path prefix
|
|
47
|
+
* @param destPrefix - Destination workspace path prefix
|
|
48
|
+
* @returns Transformed path or null if path is external
|
|
49
|
+
*/
|
|
50
|
+
function transformPath(path, sourcePrefix, destPrefix) {
|
|
51
|
+
// Normalize for comparison (handle trailing slashes)
|
|
52
|
+
const normalizedSource = sourcePrefix.replace(/\/+$/, '');
|
|
53
|
+
const normalizedPath = path;
|
|
54
|
+
// Check if path starts with source prefix
|
|
55
|
+
if (normalizedPath.startsWith(normalizedSource + '/') || normalizedPath === normalizedSource) {
|
|
56
|
+
// Replace the prefix
|
|
57
|
+
return destPrefix + normalizedPath.slice(normalizedSource.length);
|
|
58
|
+
}
|
|
59
|
+
// Path is outside source workspace
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* T005: Transform file paths in toolFormerData.params.
|
|
64
|
+
* Updates: relativeWorkspacePath, targetFile, filePath, path
|
|
65
|
+
*
|
|
66
|
+
* @param params - Parsed params object (will be mutated)
|
|
67
|
+
* @param sourcePrefix - Source workspace path prefix
|
|
68
|
+
* @param destPrefix - Destination workspace path prefix
|
|
69
|
+
* @param debug - Whether to log transformations
|
|
70
|
+
* @returns Count of transformed and skipped paths
|
|
71
|
+
*/
|
|
72
|
+
function transformToolFormerParams(params, sourcePrefix, destPrefix, debug) {
|
|
73
|
+
const result = { transformed: 0, skipped: 0 };
|
|
74
|
+
const pathFields = ['relativeWorkspacePath', 'targetFile', 'filePath', 'path'];
|
|
75
|
+
for (const field of pathFields) {
|
|
76
|
+
const value = params[field];
|
|
77
|
+
if (typeof value !== 'string')
|
|
78
|
+
continue;
|
|
79
|
+
const transformed = transformPath(value, sourcePrefix, destPrefix);
|
|
80
|
+
if (transformed !== null) {
|
|
81
|
+
if (debug) {
|
|
82
|
+
console.error(`[DEBUG] toolFormerData.params.${field}: ${value} -> ${transformed}`);
|
|
83
|
+
}
|
|
84
|
+
params[field] = transformed;
|
|
85
|
+
result.transformed++;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
if (debug) {
|
|
89
|
+
console.error(`[SKIP] toolFormerData.params.${field}: ${value} (outside workspace)`);
|
|
90
|
+
}
|
|
91
|
+
result.skipped++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* T006: Transform file paths in codeBlocks[].uri.
|
|
98
|
+
* Updates: path, _formatted, _fsPath
|
|
99
|
+
*
|
|
100
|
+
* @param uri - URI object (will be mutated)
|
|
101
|
+
* @param sourcePrefix - Source workspace path prefix
|
|
102
|
+
* @param destPrefix - Destination workspace path prefix
|
|
103
|
+
* @param debug - Whether to log transformations
|
|
104
|
+
* @param blockIndex - Index of code block for logging
|
|
105
|
+
* @returns Count of transformed and skipped paths
|
|
106
|
+
*/
|
|
107
|
+
function transformCodeBlockUri(uri, sourcePrefix, destPrefix, debug, blockIndex) {
|
|
108
|
+
const result = { transformed: 0, skipped: 0 };
|
|
109
|
+
// Transform uri.path
|
|
110
|
+
if (typeof uri.path === 'string') {
|
|
111
|
+
const transformed = transformPath(uri.path, sourcePrefix, destPrefix);
|
|
112
|
+
if (transformed !== null) {
|
|
113
|
+
if (debug) {
|
|
114
|
+
console.error(`[DEBUG] codeBlocks[${blockIndex}].uri.path: ${uri.path} -> ${transformed}`);
|
|
115
|
+
}
|
|
116
|
+
uri.path = transformed;
|
|
117
|
+
result.transformed++;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if (debug) {
|
|
121
|
+
console.error(`[SKIP] codeBlocks[${blockIndex}].uri.path: ${uri.path} (outside workspace)`);
|
|
122
|
+
}
|
|
123
|
+
result.skipped++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Transform uri._fsPath
|
|
127
|
+
if (typeof uri._fsPath === 'string') {
|
|
128
|
+
const transformed = transformPath(uri._fsPath, sourcePrefix, destPrefix);
|
|
129
|
+
if (transformed !== null) {
|
|
130
|
+
if (debug) {
|
|
131
|
+
console.error(`[DEBUG] codeBlocks[${blockIndex}].uri._fsPath: ${uri._fsPath} -> ${transformed}`);
|
|
132
|
+
}
|
|
133
|
+
uri._fsPath = transformed;
|
|
134
|
+
result.transformed++;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
if (debug) {
|
|
138
|
+
console.error(`[SKIP] codeBlocks[${blockIndex}].uri._fsPath: ${uri._fsPath} (outside workspace)`);
|
|
139
|
+
}
|
|
140
|
+
result.skipped++;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Transform uri._formatted (file:// URL format)
|
|
144
|
+
if (typeof uri._formatted === 'string') {
|
|
145
|
+
// Extract path from file:// URL
|
|
146
|
+
const fileUrlPrefix = 'file://';
|
|
147
|
+
if (uri._formatted.startsWith(fileUrlPrefix)) {
|
|
148
|
+
const urlPath = uri._formatted.slice(fileUrlPrefix.length);
|
|
149
|
+
const transformed = transformPath(urlPath, sourcePrefix, destPrefix);
|
|
150
|
+
if (transformed !== null) {
|
|
151
|
+
const newFormatted = fileUrlPrefix + transformed;
|
|
152
|
+
if (debug) {
|
|
153
|
+
console.error(`[DEBUG] codeBlocks[${blockIndex}].uri._formatted: ${uri._formatted} -> ${newFormatted}`);
|
|
154
|
+
}
|
|
155
|
+
uri._formatted = newFormatted;
|
|
156
|
+
result.transformed++;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
if (debug) {
|
|
160
|
+
console.error(`[SKIP] codeBlocks[${blockIndex}].uri._formatted: ${uri._formatted} (outside workspace)`);
|
|
161
|
+
}
|
|
162
|
+
result.skipped++;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* T007: Transform all file paths in a bubble's data.
|
|
170
|
+
* Updates toolFormerData.params and codeBlocks[].uri
|
|
171
|
+
*
|
|
172
|
+
* @param bubbleData - Bubble data object (will be mutated)
|
|
173
|
+
* @param sourcePrefix - Source workspace path prefix
|
|
174
|
+
* @param destPrefix - Destination workspace path prefix
|
|
175
|
+
* @param debug - Whether to log transformations
|
|
176
|
+
* @returns Total count of transformed and skipped paths
|
|
177
|
+
*/
|
|
178
|
+
function transformBubblePaths(bubbleData, sourcePrefix, destPrefix, debug) {
|
|
179
|
+
const result = { transformed: 0, skipped: 0 };
|
|
180
|
+
// Transform toolFormerData.params
|
|
181
|
+
const toolFormerData = bubbleData.toolFormerData;
|
|
182
|
+
if (toolFormerData?.params) {
|
|
183
|
+
try {
|
|
184
|
+
// params is stored as JSON string
|
|
185
|
+
const params = JSON.parse(toolFormerData.params);
|
|
186
|
+
const paramsResult = transformToolFormerParams(params, sourcePrefix, destPrefix, debug);
|
|
187
|
+
result.transformed += paramsResult.transformed;
|
|
188
|
+
result.skipped += paramsResult.skipped;
|
|
189
|
+
// Update params back to JSON string if any paths were transformed
|
|
190
|
+
if (paramsResult.transformed > 0) {
|
|
191
|
+
toolFormerData.params = JSON.stringify(params);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// params is not valid JSON, skip
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Transform codeBlocks[].uri
|
|
199
|
+
const codeBlocks = bubbleData.codeBlocks;
|
|
200
|
+
if (Array.isArray(codeBlocks)) {
|
|
201
|
+
for (let i = 0; i < codeBlocks.length; i++) {
|
|
202
|
+
const block = codeBlocks[i];
|
|
203
|
+
if (block?.uri && typeof block.uri === 'object') {
|
|
204
|
+
const uriResult = transformCodeBlockUri(block.uri, sourcePrefix, destPrefix, debug, i);
|
|
205
|
+
result.transformed += uriResult.transformed;
|
|
206
|
+
result.skipped += uriResult.skipped;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* T008: Check if destination path is nested within source path.
|
|
214
|
+
* This would cause infinite replacement loops during path transformation.
|
|
215
|
+
*
|
|
216
|
+
* @param source - Source workspace path
|
|
217
|
+
* @param destination - Destination workspace path
|
|
218
|
+
* @returns true if destination is nested within source
|
|
219
|
+
*/
|
|
220
|
+
function isNestedPath(source, destination) {
|
|
221
|
+
const normalizedSource = normalizePath(source).replace(/\/+$/, '');
|
|
222
|
+
const normalizedDest = normalizePath(destination).replace(/\/+$/, '');
|
|
223
|
+
// Destination is nested if it starts with source + separator
|
|
224
|
+
return normalizedDest.startsWith(normalizedSource + '/');
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Copy all bubble data for a session in global storage with new IDs.
|
|
228
|
+
* This is required for copy mode to create independent session data.
|
|
229
|
+
* Also transforms file paths from source workspace to destination workspace.
|
|
230
|
+
*
|
|
231
|
+
* @param oldComposerId - Original composer ID
|
|
232
|
+
* @param newComposerId - New composer ID for the copy
|
|
233
|
+
* @param sourceWorkspace - Source workspace path (for path transformation)
|
|
234
|
+
* @param destWorkspace - Destination workspace path (for path transformation)
|
|
235
|
+
* @param debug - Whether to log detailed path transformations
|
|
236
|
+
* @returns Map of old bubble IDs to new bubble IDs
|
|
237
|
+
*/
|
|
238
|
+
function copyBubbleDataInGlobalStorage(oldComposerId, newComposerId, sourceWorkspace, destWorkspace, debug = false) {
|
|
239
|
+
const globalDbPath = join(getGlobalStoragePath(), 'state.vscdb');
|
|
240
|
+
if (!existsSync(globalDbPath)) {
|
|
241
|
+
return new Map();
|
|
242
|
+
}
|
|
243
|
+
const bubbleIdMap = new Map();
|
|
244
|
+
const db = new Database(globalDbPath, { readonly: false });
|
|
245
|
+
// Normalize workspace paths for transformation
|
|
246
|
+
const sourcePrefix = normalizePath(sourceWorkspace).replace(/\/+$/, '');
|
|
247
|
+
const destPrefix = normalizePath(destWorkspace).replace(/\/+$/, '');
|
|
248
|
+
try {
|
|
249
|
+
// 1. Copy composerData entry with new ID
|
|
250
|
+
const composerDataRow = db.prepare("SELECT value FROM cursorDiskKV WHERE key = ?").get(`composerData:${oldComposerId}`);
|
|
251
|
+
if (composerDataRow) {
|
|
252
|
+
const composerData = JSON.parse(composerDataRow.value);
|
|
253
|
+
// Update composerId in the data
|
|
254
|
+
composerData.composerId = newComposerId;
|
|
255
|
+
// We'll update fullConversationHeadersOnly after generating new bubble IDs
|
|
256
|
+
const oldBubbleHeaders = composerData.fullConversationHeadersOnly || [];
|
|
257
|
+
// Generate new bubble IDs and build the mapping
|
|
258
|
+
const newBubbleHeaders = [];
|
|
259
|
+
for (const header of oldBubbleHeaders) {
|
|
260
|
+
if (header.bubbleId) {
|
|
261
|
+
const newBubbleId = generateSessionId();
|
|
262
|
+
bubbleIdMap.set(header.bubbleId, newBubbleId);
|
|
263
|
+
newBubbleHeaders.push({
|
|
264
|
+
...header,
|
|
265
|
+
bubbleId: newBubbleId,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
composerData.fullConversationHeadersOnly = newBubbleHeaders;
|
|
270
|
+
// Insert new composerData
|
|
271
|
+
db.prepare("INSERT OR REPLACE INTO cursorDiskKV (key, value) VALUES (?, ?)").run(`composerData:${newComposerId}`, JSON.stringify(composerData));
|
|
272
|
+
}
|
|
273
|
+
// 2. Copy all bubble entries with new IDs and transform paths
|
|
274
|
+
const bubbleRows = db.prepare("SELECT key, value FROM cursorDiskKV WHERE key LIKE ?").all(`bubbleId:${oldComposerId}:%`);
|
|
275
|
+
for (const row of bubbleRows) {
|
|
276
|
+
// Extract old bubble ID from key: bubbleId:<composerId>:<bubbleId>
|
|
277
|
+
const parts = row.key.split(':');
|
|
278
|
+
const oldBubbleId = parts[2];
|
|
279
|
+
if (!oldBubbleId)
|
|
280
|
+
continue;
|
|
281
|
+
// Get or generate new bubble ID
|
|
282
|
+
let newBubbleId = bubbleIdMap.get(oldBubbleId);
|
|
283
|
+
if (!newBubbleId) {
|
|
284
|
+
newBubbleId = generateSessionId();
|
|
285
|
+
bubbleIdMap.set(oldBubbleId, newBubbleId);
|
|
286
|
+
}
|
|
287
|
+
// Parse and update the bubble data
|
|
288
|
+
const bubbleData = JSON.parse(row.value);
|
|
289
|
+
bubbleData.bubbleId = newBubbleId;
|
|
290
|
+
// T010-T011: Transform file paths in the bubble data
|
|
291
|
+
if (debug) {
|
|
292
|
+
console.error(`[DEBUG] Processing bubble: ${oldBubbleId} -> ${newBubbleId}`);
|
|
293
|
+
}
|
|
294
|
+
transformBubblePaths(bubbleData, sourcePrefix, destPrefix, debug);
|
|
295
|
+
// Create new key with new IDs
|
|
296
|
+
const newKey = `bubbleId:${newComposerId}:${newBubbleId}`;
|
|
297
|
+
// Insert the copied bubble with transformed paths
|
|
298
|
+
db.prepare("INSERT OR REPLACE INTO cursorDiskKV (key, value) VALUES (?, ?)").run(newKey, JSON.stringify(bubbleData));
|
|
299
|
+
}
|
|
300
|
+
return bubbleIdMap;
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
db.close();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Update file paths in existing bubble data for move operations.
|
|
308
|
+
* Unlike copy mode, this modifies bubbles in place (no new IDs needed).
|
|
309
|
+
*
|
|
310
|
+
* @param composerId - Composer ID to update
|
|
311
|
+
* @param sourceWorkspace - Source workspace path
|
|
312
|
+
* @param destWorkspace - Destination workspace path
|
|
313
|
+
* @param debug - Whether to log detailed path transformations
|
|
314
|
+
*/
|
|
315
|
+
function updateBubblePathsInGlobalStorage(composerId, sourceWorkspace, destWorkspace, debug = false) {
|
|
316
|
+
const globalDbPath = join(getGlobalStoragePath(), 'state.vscdb');
|
|
317
|
+
if (!existsSync(globalDbPath)) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
const db = new Database(globalDbPath, { readonly: false });
|
|
321
|
+
// Normalize workspace paths for transformation
|
|
322
|
+
const sourcePrefix = normalizePath(sourceWorkspace).replace(/\/+$/, '');
|
|
323
|
+
const destPrefix = normalizePath(destWorkspace).replace(/\/+$/, '');
|
|
324
|
+
try {
|
|
325
|
+
// Get all bubble entries for this composer
|
|
326
|
+
const bubbleRows = db.prepare("SELECT key, value FROM cursorDiskKV WHERE key LIKE ?").all(`bubbleId:${composerId}:%`);
|
|
327
|
+
for (const row of bubbleRows) {
|
|
328
|
+
// Parse the bubble data
|
|
329
|
+
const bubbleData = JSON.parse(row.value);
|
|
330
|
+
const bubbleId = bubbleData.bubbleId;
|
|
331
|
+
// Transform file paths in the bubble data
|
|
332
|
+
if (debug && bubbleId) {
|
|
333
|
+
console.error(`[DEBUG] Processing bubble: ${bubbleId}`);
|
|
334
|
+
}
|
|
335
|
+
const result = transformBubblePaths(bubbleData, sourcePrefix, destPrefix, debug);
|
|
336
|
+
// Only update if paths were transformed
|
|
337
|
+
if (result.transformed > 0) {
|
|
338
|
+
db.prepare("UPDATE cursorDiskKV SET value = ? WHERE key = ?").run(JSON.stringify(bubbleData), row.key);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
finally {
|
|
343
|
+
db.close();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Migrate a single session from its current workspace to a destination workspace.
|
|
348
|
+
*
|
|
349
|
+
* This is the core primitive for all migration operations.
|
|
350
|
+
* Move mode: removes session from source, adds to destination.
|
|
351
|
+
* Copy mode: duplicates session to destination, keeps source intact.
|
|
352
|
+
*
|
|
353
|
+
* @param sessionId - The session ID to migrate
|
|
354
|
+
* @param options - Migration options
|
|
355
|
+
* @returns Migration result for this session
|
|
356
|
+
*/
|
|
357
|
+
export function migrateSession(sessionId, options) {
|
|
358
|
+
const { destination, mode, dryRun, dataPath, debug = false } = options;
|
|
359
|
+
// Note: force option is used at the CLI layer for validation, not in core migration
|
|
360
|
+
// Normalize destination path
|
|
361
|
+
const normalizedDest = normalizePath(destination);
|
|
362
|
+
// Find source workspace for this session
|
|
363
|
+
const sourceInfo = findWorkspaceForSession(sessionId, dataPath);
|
|
364
|
+
if (!sourceInfo) {
|
|
365
|
+
throw new SessionNotFoundError(sessionId);
|
|
366
|
+
}
|
|
367
|
+
const sourceWorkspace = sourceInfo.workspace.path;
|
|
368
|
+
// Check if source and destination are the same
|
|
369
|
+
if (pathsEqual(sourceWorkspace, normalizedDest)) {
|
|
370
|
+
throw new SameWorkspaceError(normalizedDest);
|
|
371
|
+
}
|
|
372
|
+
// T013: Check for nested paths (would cause infinite replacement loops)
|
|
373
|
+
if (isNestedPath(sourceWorkspace, normalizedDest)) {
|
|
374
|
+
throw new NestedPathError(sourceWorkspace, normalizedDest);
|
|
375
|
+
}
|
|
376
|
+
// Find destination workspace
|
|
377
|
+
const destInfo = findWorkspaceByPath(normalizedDest, dataPath);
|
|
378
|
+
if (!destInfo) {
|
|
379
|
+
throw new WorkspaceNotFoundError(normalizedDest);
|
|
380
|
+
}
|
|
381
|
+
// If dry run, return preview result without making changes
|
|
382
|
+
if (dryRun) {
|
|
383
|
+
return {
|
|
384
|
+
success: true,
|
|
385
|
+
sessionId,
|
|
386
|
+
sourceWorkspace,
|
|
387
|
+
destinationWorkspace: normalizedDest,
|
|
388
|
+
mode,
|
|
389
|
+
dryRun: true,
|
|
390
|
+
pathsWillBeUpdated: true,
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
// Perform the actual migration
|
|
394
|
+
try {
|
|
395
|
+
// Open both databases for read-write
|
|
396
|
+
const sourceDb = openDatabaseReadWrite(sourceInfo.dbPath);
|
|
397
|
+
const destDb = openDatabaseReadWrite(destInfo.dbPath);
|
|
398
|
+
try {
|
|
399
|
+
// Get composer data from both workspaces
|
|
400
|
+
const sourceResult = getComposerData(sourceDb);
|
|
401
|
+
const destResult = getComposerData(destDb);
|
|
402
|
+
if (!sourceResult) {
|
|
403
|
+
throw new Error('Source workspace has no composer data');
|
|
404
|
+
}
|
|
405
|
+
// Find the session in source data
|
|
406
|
+
const sessionIndex = sourceResult.composers.findIndex((s) => s.composerId === sessionId);
|
|
407
|
+
if (sessionIndex === -1) {
|
|
408
|
+
throw new SessionNotFoundError(sessionId);
|
|
409
|
+
}
|
|
410
|
+
const sessionToMigrate = sourceResult.composers[sessionIndex];
|
|
411
|
+
if (mode === 'move') {
|
|
412
|
+
// Remove from source
|
|
413
|
+
const newSourceComposers = sourceResult.composers.filter((_, i) => i !== sessionIndex);
|
|
414
|
+
updateComposerData(sourceDb, newSourceComposers, sourceResult.isNewFormat, sourceResult.rawData);
|
|
415
|
+
// Add to destination
|
|
416
|
+
const destComposers = destResult ? destResult.composers : [];
|
|
417
|
+
const newDestComposers = [...destComposers, sessionToMigrate];
|
|
418
|
+
updateComposerData(destDb, newDestComposers, destResult?.isNewFormat ?? sourceResult.isNewFormat, destResult?.rawData);
|
|
419
|
+
// T010-T012: Update file paths in global storage bubble data for move mode
|
|
420
|
+
updateBubblePathsInGlobalStorage(sessionId, sourceWorkspace, normalizedDest, debug);
|
|
421
|
+
return {
|
|
422
|
+
success: true,
|
|
423
|
+
sessionId,
|
|
424
|
+
sourceWorkspace,
|
|
425
|
+
destinationWorkspace: normalizedDest,
|
|
426
|
+
mode: 'move',
|
|
427
|
+
dryRun: false,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
// Copy mode - duplicate session to destination, keep source intact
|
|
432
|
+
// Generate new session ID for the copy
|
|
433
|
+
const newSessionId = generateSessionId();
|
|
434
|
+
// Copy all bubble data in global storage with new IDs
|
|
435
|
+
// This ensures the copy is fully independent from the original
|
|
436
|
+
// T014: Transform paths during copy (AFTER copying, on new data only)
|
|
437
|
+
copyBubbleDataInGlobalStorage(sessionId, newSessionId, sourceWorkspace, normalizedDest, debug);
|
|
438
|
+
// Deep clone and update the session with new ID
|
|
439
|
+
const copiedSession = JSON.parse(JSON.stringify(sessionToMigrate));
|
|
440
|
+
copiedSession.composerId = newSessionId;
|
|
441
|
+
// Add to destination (don't modify source)
|
|
442
|
+
const destComposers = destResult ? destResult.composers : [];
|
|
443
|
+
const newDestComposers = [...destComposers, copiedSession];
|
|
444
|
+
updateComposerData(destDb, newDestComposers, destResult?.isNewFormat ?? sourceResult.isNewFormat, destResult?.rawData);
|
|
445
|
+
return {
|
|
446
|
+
success: true,
|
|
447
|
+
sessionId,
|
|
448
|
+
sourceWorkspace,
|
|
449
|
+
destinationWorkspace: normalizedDest,
|
|
450
|
+
mode: 'copy',
|
|
451
|
+
newSessionId,
|
|
452
|
+
dryRun: false,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
finally {
|
|
457
|
+
sourceDb.close();
|
|
458
|
+
destDb.close();
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
catch (error) {
|
|
462
|
+
// Return failure result instead of throwing for partial failure handling
|
|
463
|
+
return {
|
|
464
|
+
success: false,
|
|
465
|
+
sessionId,
|
|
466
|
+
sourceWorkspace,
|
|
467
|
+
destinationWorkspace: normalizedDest,
|
|
468
|
+
mode,
|
|
469
|
+
error: error instanceof Error ? error.message : String(error),
|
|
470
|
+
dryRun: false,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Migrate multiple sessions to a destination workspace.
|
|
476
|
+
*
|
|
477
|
+
* Handles batch migration with partial failure support.
|
|
478
|
+
* Each session is migrated independently - failures don't stop the batch.
|
|
479
|
+
*
|
|
480
|
+
* @param options - Migration options including session IDs
|
|
481
|
+
* @returns Array of results for each session
|
|
482
|
+
*/
|
|
483
|
+
export function migrateSessions(options) {
|
|
484
|
+
const { sessionIds, ...sessionOptions } = options;
|
|
485
|
+
const results = [];
|
|
486
|
+
for (const sessionId of sessionIds) {
|
|
487
|
+
try {
|
|
488
|
+
const result = migrateSession(sessionId, sessionOptions);
|
|
489
|
+
results.push(result);
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
// Convert thrown errors to result objects for partial failure handling
|
|
493
|
+
results.push({
|
|
494
|
+
success: false,
|
|
495
|
+
sessionId,
|
|
496
|
+
sourceWorkspace: 'unknown',
|
|
497
|
+
destinationWorkspace: options.destination,
|
|
498
|
+
mode: options.mode,
|
|
499
|
+
error: error instanceof Error ? error.message : String(error),
|
|
500
|
+
dryRun: options.dryRun,
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return results;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Migrate all sessions from one workspace to another.
|
|
508
|
+
*
|
|
509
|
+
* This is a convenience wrapper that finds all sessions in the source workspace
|
|
510
|
+
* and calls migrateSession for each one.
|
|
511
|
+
*
|
|
512
|
+
* @param options - Workspace migration options
|
|
513
|
+
* @returns Aggregate result with per-session details
|
|
514
|
+
*/
|
|
515
|
+
export function migrateWorkspace(options) {
|
|
516
|
+
const { source, destination, mode, dryRun, force, dataPath, debug = false } = options;
|
|
517
|
+
// Normalize paths
|
|
518
|
+
const normalizedSource = normalizePath(source);
|
|
519
|
+
const normalizedDest = normalizePath(destination);
|
|
520
|
+
// Check if source and destination are the same
|
|
521
|
+
if (pathsEqual(normalizedSource, normalizedDest)) {
|
|
522
|
+
throw new SameWorkspaceError(normalizedSource);
|
|
523
|
+
}
|
|
524
|
+
// T015: Check for nested paths (would cause infinite replacement loops)
|
|
525
|
+
if (isNestedPath(normalizedSource, normalizedDest)) {
|
|
526
|
+
throw new NestedPathError(normalizedSource, normalizedDest);
|
|
527
|
+
}
|
|
528
|
+
// Find source workspace
|
|
529
|
+
const sourceInfo = findWorkspaceByPath(normalizedSource, dataPath);
|
|
530
|
+
if (!sourceInfo) {
|
|
531
|
+
throw new WorkspaceNotFoundError(normalizedSource);
|
|
532
|
+
}
|
|
533
|
+
// Find destination workspace
|
|
534
|
+
const destInfo = findWorkspaceByPath(normalizedDest, dataPath);
|
|
535
|
+
if (!destInfo) {
|
|
536
|
+
throw new WorkspaceNotFoundError(normalizedDest);
|
|
537
|
+
}
|
|
538
|
+
// Get sessions from source workspace
|
|
539
|
+
const sourceDb = openDatabaseReadWrite(sourceInfo.dbPath);
|
|
540
|
+
const sourceResult = getComposerData(sourceDb);
|
|
541
|
+
sourceDb.close();
|
|
542
|
+
if (!sourceResult || sourceResult.composers.length === 0) {
|
|
543
|
+
throw new NoSessionsFoundError(normalizedSource);
|
|
544
|
+
}
|
|
545
|
+
// Check if destination has existing sessions (unless force is set)
|
|
546
|
+
if (!force) {
|
|
547
|
+
const destDb = openDatabaseReadWrite(destInfo.dbPath);
|
|
548
|
+
const destResult = getComposerData(destDb);
|
|
549
|
+
destDb.close();
|
|
550
|
+
if (destResult && destResult.composers.length > 0) {
|
|
551
|
+
throw new DestinationHasSessionsError(normalizedDest, destResult.composers.length);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
// Extract session IDs
|
|
555
|
+
const sessionIds = sourceResult.composers
|
|
556
|
+
.map((s) => s.composerId)
|
|
557
|
+
.filter((id) => typeof id === 'string');
|
|
558
|
+
if (sessionIds.length === 0) {
|
|
559
|
+
throw new NoSessionsFoundError(normalizedSource);
|
|
560
|
+
}
|
|
561
|
+
// Migrate all sessions
|
|
562
|
+
const results = migrateSessions({
|
|
563
|
+
sessionIds,
|
|
564
|
+
destination: normalizedDest,
|
|
565
|
+
mode,
|
|
566
|
+
dryRun,
|
|
567
|
+
force,
|
|
568
|
+
dataPath,
|
|
569
|
+
debug,
|
|
570
|
+
});
|
|
571
|
+
// Aggregate results
|
|
572
|
+
const successCount = results.filter((r) => r.success).length;
|
|
573
|
+
const failureCount = results.filter((r) => !r.success).length;
|
|
574
|
+
return {
|
|
575
|
+
success: failureCount === 0,
|
|
576
|
+
source: normalizedSource,
|
|
577
|
+
destination: normalizedDest,
|
|
578
|
+
mode,
|
|
579
|
+
totalSessions: results.length,
|
|
580
|
+
successCount,
|
|
581
|
+
failureCount,
|
|
582
|
+
results,
|
|
583
|
+
dryRun,
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
//# sourceMappingURL=migrate.js.map
|