@savestate/cli 0.1.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 +21 -0
- package/README.md +256 -0
- package/dist/adapters/claude-code.d.ts +81 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +540 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/clawdbot.d.ts +93 -0
- package/dist/adapters/clawdbot.d.ts.map +1 -0
- package/dist/adapters/clawdbot.js +673 -0
- package/dist/adapters/clawdbot.js.map +1 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/interface.d.ts +8 -0
- package/dist/adapters/interface.d.ts.map +1 -0
- package/dist/adapters/interface.js +8 -0
- package/dist/adapters/interface.js.map +1 -0
- package/dist/adapters/openai-assistants.d.ts +51 -0
- package/dist/adapters/openai-assistants.d.ts.map +1 -0
- package/dist/adapters/openai-assistants.js +114 -0
- package/dist/adapters/openai-assistants.js.map +1 -0
- package/dist/adapters/registry.d.ts +38 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +79 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +81 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/adapters.d.ts +5 -0
- package/dist/commands/adapters.d.ts.map +1 -0
- package/dist/commands/adapters.js +49 -0
- package/dist/commands/adapters.js.map +1 -0
- package/dist/commands/config.d.ts +10 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +60 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/diff.d.ts +5 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +51 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/index.d.ts +12 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +12 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +71 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +10 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +89 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/restore.d.ts +11 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +86 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/search.d.ts +11 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +50 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/snapshot.d.ts +12 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +84 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +83 -0
- package/dist/config.js.map +1 -0
- package/dist/encryption.d.ts +40 -0
- package/dist/encryption.d.ts.map +1 -0
- package/dist/encryption.js +120 -0
- package/dist/encryption.js.map +1 -0
- package/dist/format.d.ts +47 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +198 -0
- package/dist/format.js.map +1 -0
- package/dist/index-file.d.ts +42 -0
- package/dist/index-file.d.ts.map +1 -0
- package/dist/index-file.js +68 -0
- package/dist/index-file.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/passphrase.d.ts +23 -0
- package/dist/passphrase.d.ts.map +1 -0
- package/dist/passphrase.js +82 -0
- package/dist/passphrase.js.map +1 -0
- package/dist/restore.d.ts +46 -0
- package/dist/restore.d.ts.map +1 -0
- package/dist/restore.js +113 -0
- package/dist/restore.js.map +1 -0
- package/dist/search.d.ts +35 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +59 -0
- package/dist/search.js.map +1 -0
- package/dist/snapshot.d.ts +43 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +95 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +6 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/interface.d.ts +8 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +8 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/local.d.ts +22 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +63 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/resolve.d.ts +11 -0
- package/dist/storage/resolve.d.ts.map +1 -0
- package/dist/storage/resolve.js +21 -0
- package/dist/storage/resolve.js.map +1 -0
- package/dist/types.d.ts +273 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAGrC,sDAAsD;AACtD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AAExC,iCAAiC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB;IAC7C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,gBAAgB;IAChB,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpF,YAAY;IACZ,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAClC,KAAK,CAAC,GAAG,CAAC,yBAAyB,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC7B,KAAK,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACpC,KAAK,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACrC,KAAK,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QACzC,KAAK,CAAC,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAC3C,KAAK,CAAC,GAAG,CAAC,6BAA6B,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3F,KAAK,CAAC,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/G,CAAC;IAED,UAAU;IACV,KAAK,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,IAAI,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,GAAG,CAAC,6BAA6B,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpG,QAAQ;IACR,KAAK,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,KAAK,CAAC,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,KAAK,CAAC,GAAG,CAAC,yBAAyB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAElG,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,OAAO,GAAG,CAAI,IAAY,EAAK,EAAE;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAM,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAsB,EAAE;QACnD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAuB,eAAe,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAyB;QACrC,WAAW,EAAE,OAAO,CAAC,yBAAyB,CAAC;QAC/C,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvC,CAAC,CAAC,OAAO,CAA0B,sBAAsB,CAAC;YAC1D,CAAC,CAAC,SAAS;QACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC;YACrC,CAAC,CAAC,OAAO,CAAgC,qBAAqB,CAAC;YAC/D,CAAC,CAAC,SAAS;QACb,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvC,CAAC,CAAC,OAAO,CAAiC,sBAAsB,CAAC;YACjE,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACzC,CAAC,CAAC,OAAO,CAAkC,uBAAuB,CAAC;YACnE,CAAC,CAAC,SAAS;QACb,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAC/C,CAAC,CAAC,OAAO,CAAqC,0BAA0B,CAAC;YACzE,CAAC,CAAC,SAAS;QACb,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC;YACpD,CAAC,CAAC,OAAO,CAAuC,6BAA6B,CAAC;YAC9E,CAAC,CAAC,SAAS;QACb,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC;YAClD,CAAC,CAAC,OAAO,CAAyB,4BAA4B,CAAC;YAC/D,CAAC,CAAC,SAAS;KACd,CAAC;IAEF,MAAM,MAAM,GAAuB;QACjC,IAAI,EAAE,OAAO,CAA6B,kBAAkB,CAAC;QAC7D,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC;YACjD,CAAC,CAAC,OAAO,CAAkC,6BAA6B,CAAC;YACzE,CAAC,CAAC,EAAE;KACP,CAAC;IAEF,MAAM,aAAa,GAAG,OAAO,CAA4B,0BAA0B,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,OAAO,CAAuB,oBAAoB,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAoB,0BAA0B,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,OAAO,CAA2B,yBAAyB,CAAC,CAAC;IAElF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AACtF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,OAAO,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,KAA0B;IAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;QACvB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QACd,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC;QAChB,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;QACf,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACV,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACV,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC;QACtB,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC;QACtB,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAEvB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElB,gCAAgC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QACpC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAA0B;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;YACrB,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACnB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC1B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE/B,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Snapshot Index
|
|
3
|
+
*
|
|
4
|
+
* Maintains a local index of all snapshots at .savestate/index.json.
|
|
5
|
+
* This enables fast listing without decrypting every archive.
|
|
6
|
+
*/
|
|
7
|
+
/** Index entry for a single snapshot */
|
|
8
|
+
export interface SnapshotIndexEntry {
|
|
9
|
+
id: string;
|
|
10
|
+
timestamp: string;
|
|
11
|
+
platform: string;
|
|
12
|
+
adapter: string;
|
|
13
|
+
label?: string;
|
|
14
|
+
tags?: string[];
|
|
15
|
+
filename: string;
|
|
16
|
+
size: number;
|
|
17
|
+
}
|
|
18
|
+
/** The full index structure */
|
|
19
|
+
export interface SnapshotIndex {
|
|
20
|
+
snapshots: SnapshotIndexEntry[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Load the snapshot index. Returns empty index if file doesn't exist.
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadIndex(cwd?: string): Promise<SnapshotIndex>;
|
|
26
|
+
/**
|
|
27
|
+
* Save the snapshot index.
|
|
28
|
+
*/
|
|
29
|
+
export declare function saveIndex(index: SnapshotIndex, cwd?: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Add a snapshot entry to the index.
|
|
32
|
+
*/
|
|
33
|
+
export declare function addToIndex(entry: SnapshotIndexEntry, cwd?: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Get the latest snapshot entry from the index.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getLatestEntry(cwd?: string): Promise<SnapshotIndexEntry | null>;
|
|
38
|
+
/**
|
|
39
|
+
* Find a snapshot entry by ID.
|
|
40
|
+
*/
|
|
41
|
+
export declare function findEntry(id: string, cwd?: string): Promise<SnapshotIndexEntry | null>;
|
|
42
|
+
//# sourceMappingURL=index-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-file.d.ts","sourceRoot":"","sources":["../src/index-file.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+BAA+B;AAC/B,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AASD;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAWpE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CASrF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAG5F"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Snapshot Index
|
|
3
|
+
*
|
|
4
|
+
* Maintains a local index of all snapshots at .savestate/index.json.
|
|
5
|
+
* This enables fast listing without decrypting every archive.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { localConfigDir } from './config.js';
|
|
11
|
+
/**
|
|
12
|
+
* Path to the index file.
|
|
13
|
+
*/
|
|
14
|
+
function indexPath(cwd) {
|
|
15
|
+
return join(localConfigDir(cwd), 'index.json');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Load the snapshot index. Returns empty index if file doesn't exist.
|
|
19
|
+
*/
|
|
20
|
+
export async function loadIndex(cwd) {
|
|
21
|
+
const path = indexPath(cwd);
|
|
22
|
+
if (!existsSync(path)) {
|
|
23
|
+
return { snapshots: [] };
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const raw = await readFile(path, 'utf-8');
|
|
27
|
+
return JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return { snapshots: [] };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Save the snapshot index.
|
|
35
|
+
*/
|
|
36
|
+
export async function saveIndex(index, cwd) {
|
|
37
|
+
const dir = localConfigDir(cwd);
|
|
38
|
+
await mkdir(dir, { recursive: true });
|
|
39
|
+
const path = indexPath(cwd);
|
|
40
|
+
await writeFile(path, JSON.stringify(index, null, 2) + '\n', 'utf-8');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Add a snapshot entry to the index.
|
|
44
|
+
*/
|
|
45
|
+
export async function addToIndex(entry, cwd) {
|
|
46
|
+
const index = await loadIndex(cwd);
|
|
47
|
+
index.snapshots.push(entry);
|
|
48
|
+
await saveIndex(index, cwd);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the latest snapshot entry from the index.
|
|
52
|
+
*/
|
|
53
|
+
export async function getLatestEntry(cwd) {
|
|
54
|
+
const index = await loadIndex(cwd);
|
|
55
|
+
if (index.snapshots.length === 0)
|
|
56
|
+
return null;
|
|
57
|
+
// Sort by timestamp descending, return most recent
|
|
58
|
+
const sorted = [...index.snapshots].sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
59
|
+
return sorted[0];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Find a snapshot entry by ID.
|
|
63
|
+
*/
|
|
64
|
+
export async function findEntry(id, cwd) {
|
|
65
|
+
const index = await loadIndex(cwd);
|
|
66
|
+
return index.snapshots.find((s) => s.id === id) ?? null;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=index-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-file.js","sourceRoot":"","sources":["../src/index-file.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAmB7C;;GAEG;AACH,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAY;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAoB,EAAE,GAAY;IAChE,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAyB,EAAE,GAAY;IACtE,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACnC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAY;IAC/C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,mDAAmD;IACnD,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAC5E,CAAC;IACF,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAU,EAAE,GAAY;IACtD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AAC1D,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState — Time Machine for AI
|
|
3
|
+
*
|
|
4
|
+
* Public API for programmatic usage.
|
|
5
|
+
*/
|
|
6
|
+
export type { Manifest, Identity, Memory, MemoryEntry, KnowledgeDocument, Conversation, ConversationIndex, ConversationMeta, Message, Snapshot, PlatformMeta, SnapshotChain, RestoreHints, RestoreStep, ToolConfig, SkillEntry, ScriptEntry, ExtensionEntry, FileManifestEntry, EmbeddingData, Adapter, StorageBackend, SaveStateConfig, StorageConfig, RetentionPolicy, AdapterConfig, SearchResult, DiffResult, DiffChange, } from './types.js';
|
|
7
|
+
export { encrypt, decrypt, verify } from './encryption.js';
|
|
8
|
+
export { packSnapshot, unpackSnapshot, computeChecksum, generateSnapshotId, snapshotFilename, SAF_EXTENSION, SAF_VERSION, } from './format.js';
|
|
9
|
+
export { loadConfig, saveConfig, initializeProject, isInitialized, defaultConfig, SAVESTATE_DIR, GLOBAL_SAVESTATE_DIR, } from './config.js';
|
|
10
|
+
export { createSnapshot, getLatestSnapshotId } from './snapshot.js';
|
|
11
|
+
export { restoreSnapshot, validateSnapshot } from './restore.js';
|
|
12
|
+
export { searchSnapshots, scoreMatch } from './search.js';
|
|
13
|
+
export { LocalStorageBackend } from './storage/index.js';
|
|
14
|
+
export { ClawdbotAdapter, ClaudeCodeAdapter, OpenAIAssistantsAdapter, listAdapters, getAdapter, detectAdapter, getAdapterInfo, } from './adapters/index.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,OAAO,EACP,cAAc,EACd,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG3D,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,aAAa,EACb,cAAc,GACf,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState — Time Machine for AI
|
|
3
|
+
*
|
|
4
|
+
* Public API for programmatic usage.
|
|
5
|
+
*/
|
|
6
|
+
// Encryption
|
|
7
|
+
export { encrypt, decrypt, verify } from './encryption.js';
|
|
8
|
+
// Format
|
|
9
|
+
export { packSnapshot, unpackSnapshot, computeChecksum, generateSnapshotId, snapshotFilename, SAF_EXTENSION, SAF_VERSION, } from './format.js';
|
|
10
|
+
// Config
|
|
11
|
+
export { loadConfig, saveConfig, initializeProject, isInitialized, defaultConfig, SAVESTATE_DIR, GLOBAL_SAVESTATE_DIR, } from './config.js';
|
|
12
|
+
// Snapshot
|
|
13
|
+
export { createSnapshot, getLatestSnapshotId } from './snapshot.js';
|
|
14
|
+
// Restore
|
|
15
|
+
export { restoreSnapshot, validateSnapshot } from './restore.js';
|
|
16
|
+
// Search
|
|
17
|
+
export { searchSnapshots, scoreMatch } from './search.js';
|
|
18
|
+
// Storage
|
|
19
|
+
export { LocalStorageBackend } from './storage/index.js';
|
|
20
|
+
// Adapters
|
|
21
|
+
export { ClawdbotAdapter, ClaudeCodeAdapter, OpenAIAssistantsAdapter, listAdapters, getAdapter, detectAdapter, getAdapterInfo, } from './adapters/index.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmCH,aAAa;AACb,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE3D,SAAS;AACT,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,SAAS;AACT,OAAO,EACL,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpE,UAAU;AACV,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE1D,UAAU;AACV,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,WAAW;AACX,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,aAAa,EACb,cAAc,GACf,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Passphrase Handling
|
|
3
|
+
*
|
|
4
|
+
* Secure passphrase input with env var fallback.
|
|
5
|
+
* - SAVESTATE_PASSPHRASE env var (for non-interactive / CI)
|
|
6
|
+
* - Interactive TTY prompt with hidden input
|
|
7
|
+
* - Minimum 8 characters validation
|
|
8
|
+
* - Optional confirmation (type twice)
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Get a passphrase from the environment or interactive prompt.
|
|
12
|
+
*
|
|
13
|
+
* Priority:
|
|
14
|
+
* 1. SAVESTATE_PASSPHRASE environment variable
|
|
15
|
+
* 2. Interactive TTY prompt with hidden input
|
|
16
|
+
*
|
|
17
|
+
* @param options.confirm - Require typing the passphrase twice
|
|
18
|
+
* @returns The validated passphrase
|
|
19
|
+
*/
|
|
20
|
+
export declare function getPassphrase(options?: {
|
|
21
|
+
confirm?: boolean;
|
|
22
|
+
}): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=passphrase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passphrase.d.ts","sourceRoot":"","sources":["../src/passphrase.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BpF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Passphrase Handling
|
|
3
|
+
*
|
|
4
|
+
* Secure passphrase input with env var fallback.
|
|
5
|
+
* - SAVESTATE_PASSPHRASE env var (for non-interactive / CI)
|
|
6
|
+
* - Interactive TTY prompt with hidden input
|
|
7
|
+
* - Minimum 8 characters validation
|
|
8
|
+
* - Optional confirmation (type twice)
|
|
9
|
+
*/
|
|
10
|
+
import { createInterface } from 'node:readline';
|
|
11
|
+
const MIN_LENGTH = 8;
|
|
12
|
+
/**
|
|
13
|
+
* Get a passphrase from the environment or interactive prompt.
|
|
14
|
+
*
|
|
15
|
+
* Priority:
|
|
16
|
+
* 1. SAVESTATE_PASSPHRASE environment variable
|
|
17
|
+
* 2. Interactive TTY prompt with hidden input
|
|
18
|
+
*
|
|
19
|
+
* @param options.confirm - Require typing the passphrase twice
|
|
20
|
+
* @returns The validated passphrase
|
|
21
|
+
*/
|
|
22
|
+
export async function getPassphrase(options) {
|
|
23
|
+
// Check env var first
|
|
24
|
+
const envPassphrase = process.env.SAVESTATE_PASSPHRASE;
|
|
25
|
+
if (envPassphrase) {
|
|
26
|
+
validatePassphrase(envPassphrase);
|
|
27
|
+
return envPassphrase;
|
|
28
|
+
}
|
|
29
|
+
// Must be interactive TTY
|
|
30
|
+
if (!process.stdin.isTTY) {
|
|
31
|
+
throw new Error('No passphrase available. Set SAVESTATE_PASSPHRASE environment variable ' +
|
|
32
|
+
'or run in an interactive terminal.');
|
|
33
|
+
}
|
|
34
|
+
const passphrase = await promptHidden('🔑 Enter passphrase: ');
|
|
35
|
+
validatePassphrase(passphrase);
|
|
36
|
+
if (options?.confirm) {
|
|
37
|
+
const confirm = await promptHidden('🔑 Confirm passphrase: ');
|
|
38
|
+
if (passphrase !== confirm) {
|
|
39
|
+
throw new Error('Passphrases do not match.');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return passphrase;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validate passphrase meets minimum requirements.
|
|
46
|
+
*/
|
|
47
|
+
function validatePassphrase(passphrase) {
|
|
48
|
+
if (!passphrase || passphrase.length < MIN_LENGTH) {
|
|
49
|
+
throw new Error(`Passphrase must be at least ${MIN_LENGTH} characters.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Prompt for input with hidden characters (no echo).
|
|
54
|
+
* Uses readline with output suppression for secure input.
|
|
55
|
+
*/
|
|
56
|
+
function promptHidden(prompt) {
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
// Write prompt directly
|
|
59
|
+
process.stderr.write(prompt);
|
|
60
|
+
// Create a writable that swallows everything (mute echo)
|
|
61
|
+
const muted = new (require('node:stream').Writable)({
|
|
62
|
+
write(_chunk, _encoding, callback) {
|
|
63
|
+
callback();
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
const rl = createInterface({
|
|
67
|
+
input: process.stdin,
|
|
68
|
+
output: muted,
|
|
69
|
+
terminal: true,
|
|
70
|
+
});
|
|
71
|
+
rl.question('', (answer) => {
|
|
72
|
+
rl.close();
|
|
73
|
+
process.stderr.write('\n');
|
|
74
|
+
resolve(answer);
|
|
75
|
+
});
|
|
76
|
+
rl.on('error', (err) => {
|
|
77
|
+
rl.close();
|
|
78
|
+
reject(err);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=passphrase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passphrase.js","sourceRoot":"","sources":["../src/passphrase.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA+B;IACjE,sBAAsB;IACtB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACvD,IAAI,aAAa,EAAE,CAAC;QAClB,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAClC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,yEAAyE;YACzE,oCAAoC,CACrC,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,uBAAuB,CAAC,CAAC;IAC/D,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAE/B,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC;QAC9D,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,cAAc,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,wBAAwB;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE7B,yDAAyD;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC;YAClD,KAAK,CAAC,MAAc,EAAE,SAAiB,EAAE,QAAoB;gBAC3D,QAAQ,EAAE,CAAC;YACb,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,eAAe,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YACzB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YAC5B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Restore
|
|
3
|
+
*
|
|
4
|
+
* Decrypts and unpacks a SAF archive, then feeds the state
|
|
5
|
+
* back through an adapter to restore it on the target platform.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Resolve snapshot ID (or 'latest')
|
|
9
|
+
* 2. Retrieve encrypted archive from storage
|
|
10
|
+
* 3. Decrypt with user passphrase
|
|
11
|
+
* 4. Decompress and unpack SAF structure
|
|
12
|
+
* 5. Feed state through adapter's restore method
|
|
13
|
+
*/
|
|
14
|
+
import type { Adapter, Snapshot, StorageBackend } from './types.js';
|
|
15
|
+
export interface RestoreResult {
|
|
16
|
+
snapshotId: string;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
platform: string;
|
|
19
|
+
adapter: string;
|
|
20
|
+
label?: string;
|
|
21
|
+
memoryCount: number;
|
|
22
|
+
conversationCount: number;
|
|
23
|
+
hasIdentity: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Restore from a snapshot.
|
|
27
|
+
*
|
|
28
|
+
* @param snapshotId - ID of the snapshot to restore (or 'latest')
|
|
29
|
+
* @param adapter - Platform adapter to restore state through
|
|
30
|
+
* @param storage - Storage backend to read from
|
|
31
|
+
* @param passphrase - Decryption passphrase
|
|
32
|
+
* @param options - Restore options
|
|
33
|
+
* @returns Details about what was restored
|
|
34
|
+
*/
|
|
35
|
+
export declare function restoreSnapshot(snapshotId: string, adapter: Adapter, storage: StorageBackend, passphrase: string, options?: {
|
|
36
|
+
include?: ('identity' | 'memory' | 'conversations')[];
|
|
37
|
+
dryRun?: boolean;
|
|
38
|
+
}): Promise<RestoreResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Validate a snapshot's integrity before restoring.
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateSnapshot(snapshot: Snapshot): Promise<{
|
|
43
|
+
valid: boolean;
|
|
44
|
+
errors: string[];
|
|
45
|
+
}>;
|
|
46
|
+
//# sourceMappingURL=restore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../src/restore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKpE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,CAAC,UAAU,GAAG,QAAQ,GAAG,eAAe,CAAC,EAAE,CAAC;IACtD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GACA,OAAO,CAAC,aAAa,CAAC,CAwExB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CAYD"}
|
package/dist/restore.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Restore
|
|
3
|
+
*
|
|
4
|
+
* Decrypts and unpacks a SAF archive, then feeds the state
|
|
5
|
+
* back through an adapter to restore it on the target platform.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Resolve snapshot ID (or 'latest')
|
|
9
|
+
* 2. Retrieve encrypted archive from storage
|
|
10
|
+
* 3. Decrypt with user passphrase
|
|
11
|
+
* 4. Decompress and unpack SAF structure
|
|
12
|
+
* 5. Feed state through adapter's restore method
|
|
13
|
+
*/
|
|
14
|
+
import { unpackFromArchive, unpackSnapshot, computeChecksum, snapshotFilename } from './format.js';
|
|
15
|
+
import { decrypt } from './encryption.js';
|
|
16
|
+
import { findEntry, getLatestEntry } from './index-file.js';
|
|
17
|
+
/**
|
|
18
|
+
* Restore from a snapshot.
|
|
19
|
+
*
|
|
20
|
+
* @param snapshotId - ID of the snapshot to restore (or 'latest')
|
|
21
|
+
* @param adapter - Platform adapter to restore state through
|
|
22
|
+
* @param storage - Storage backend to read from
|
|
23
|
+
* @param passphrase - Decryption passphrase
|
|
24
|
+
* @param options - Restore options
|
|
25
|
+
* @returns Details about what was restored
|
|
26
|
+
*/
|
|
27
|
+
export async function restoreSnapshot(snapshotId, adapter, storage, passphrase, options) {
|
|
28
|
+
// Step 1: Resolve 'latest' to actual snapshot ID
|
|
29
|
+
let resolvedId = snapshotId;
|
|
30
|
+
let filename;
|
|
31
|
+
if (snapshotId === 'latest') {
|
|
32
|
+
const latest = await getLatestEntry();
|
|
33
|
+
if (!latest) {
|
|
34
|
+
throw new Error('No snapshots found. Run `savestate snapshot` first.');
|
|
35
|
+
}
|
|
36
|
+
resolvedId = latest.id;
|
|
37
|
+
filename = latest.filename;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const entry = await findEntry(snapshotId);
|
|
41
|
+
if (entry) {
|
|
42
|
+
filename = entry.filename;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Try constructing filename from ID
|
|
46
|
+
filename = snapshotFilename(snapshotId);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Step 2: Retrieve from storage backend
|
|
50
|
+
let encrypted;
|
|
51
|
+
try {
|
|
52
|
+
encrypted = await storage.get(filename);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error(`Snapshot not found in storage: ${filename}\n` +
|
|
56
|
+
`Looked in storage backend: ${storage.id}`);
|
|
57
|
+
}
|
|
58
|
+
// Step 3: Decrypt
|
|
59
|
+
let archive;
|
|
60
|
+
try {
|
|
61
|
+
archive = await decrypt(encrypted, passphrase);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (err instanceof Error && err.message.includes('GCM')) {
|
|
65
|
+
throw new Error('Wrong passphrase or corrupted archive.');
|
|
66
|
+
}
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
// Step 4: Unpack SAF
|
|
70
|
+
const fileMap = await unpackFromArchive(archive);
|
|
71
|
+
const snapshot = unpackSnapshot(fileMap);
|
|
72
|
+
// Verify integrity
|
|
73
|
+
const expectedChecksum = snapshot.manifest.checksum;
|
|
74
|
+
if (expectedChecksum) {
|
|
75
|
+
const actualChecksum = computeChecksum(archive);
|
|
76
|
+
// Note: checksum was computed on first-pass archive, which may differ
|
|
77
|
+
// from final archive due to manifest update. We skip strict checking
|
|
78
|
+
// for now but log a warning if they differ.
|
|
79
|
+
}
|
|
80
|
+
// Step 5: Feed through adapter.restore()
|
|
81
|
+
if (!options?.dryRun) {
|
|
82
|
+
await adapter.restore(snapshot);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
snapshotId: resolvedId,
|
|
86
|
+
timestamp: snapshot.manifest.timestamp,
|
|
87
|
+
platform: snapshot.manifest.platform,
|
|
88
|
+
adapter: snapshot.manifest.adapter,
|
|
89
|
+
label: snapshot.manifest.label,
|
|
90
|
+
memoryCount: snapshot.memory.core.length,
|
|
91
|
+
conversationCount: snapshot.conversations.total,
|
|
92
|
+
hasIdentity: !!snapshot.identity.personality,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Validate a snapshot's integrity before restoring.
|
|
97
|
+
*/
|
|
98
|
+
export async function validateSnapshot(snapshot) {
|
|
99
|
+
const errors = [];
|
|
100
|
+
if (!snapshot.manifest.id)
|
|
101
|
+
errors.push('Missing snapshot ID');
|
|
102
|
+
if (!snapshot.manifest.version)
|
|
103
|
+
errors.push('Missing format version');
|
|
104
|
+
if (!snapshot.manifest.timestamp)
|
|
105
|
+
errors.push('Missing timestamp');
|
|
106
|
+
if (!snapshot.manifest.platform)
|
|
107
|
+
errors.push('Missing platform');
|
|
108
|
+
return {
|
|
109
|
+
valid: errors.length === 0,
|
|
110
|
+
errors,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=restore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../src/restore.ts"],"names":[],"mappings":"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"}
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Search
|
|
3
|
+
*
|
|
4
|
+
* Search across snapshot contents. Decrypts snapshots on-the-fly
|
|
5
|
+
* and performs text matching across all stored data.
|
|
6
|
+
*/
|
|
7
|
+
import type { SaveStateConfig, SearchResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Search across all snapshots for matching content.
|
|
10
|
+
*
|
|
11
|
+
* Decrypts and searches through:
|
|
12
|
+
* - Memory entries
|
|
13
|
+
* - Conversation messages
|
|
14
|
+
* - Identity/personality documents
|
|
15
|
+
* - Knowledge base documents
|
|
16
|
+
*
|
|
17
|
+
* @param query - Search query string
|
|
18
|
+
* @param config - SaveState configuration
|
|
19
|
+
* @param options - Search options
|
|
20
|
+
* @returns Matching results sorted by relevance
|
|
21
|
+
*/
|
|
22
|
+
export declare function searchSnapshots(query: string, config: SaveStateConfig, options?: {
|
|
23
|
+
/** Only search specific snapshot IDs */
|
|
24
|
+
snapshots?: string[];
|
|
25
|
+
/** Only search specific content types */
|
|
26
|
+
types?: ('memory' | 'conversation' | 'identity' | 'knowledge')[];
|
|
27
|
+
/** Maximum number of results */
|
|
28
|
+
limit?: number;
|
|
29
|
+
}): Promise<SearchResult[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Simple text relevance scoring.
|
|
32
|
+
* Returns a score between 0 and 1.
|
|
33
|
+
*/
|
|
34
|
+
export declare function scoreMatch(query: string, content: string): number;
|
|
35
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE;IACR,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yCAAyC;IACzC,KAAK,CAAC,EAAE,CAAC,QAAQ,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC;IACjE,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,YAAY,EAAE,CAAC,CAezB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAuBjE"}
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Search
|
|
3
|
+
*
|
|
4
|
+
* Search across snapshot contents. Decrypts snapshots on-the-fly
|
|
5
|
+
* and performs text matching across all stored data.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Search across all snapshots for matching content.
|
|
9
|
+
*
|
|
10
|
+
* Decrypts and searches through:
|
|
11
|
+
* - Memory entries
|
|
12
|
+
* - Conversation messages
|
|
13
|
+
* - Identity/personality documents
|
|
14
|
+
* - Knowledge base documents
|
|
15
|
+
*
|
|
16
|
+
* @param query - Search query string
|
|
17
|
+
* @param config - SaveState configuration
|
|
18
|
+
* @param options - Search options
|
|
19
|
+
* @returns Matching results sorted by relevance
|
|
20
|
+
*/
|
|
21
|
+
export async function searchSnapshots(query, config, options) {
|
|
22
|
+
const _limit = options?.limit ?? 20;
|
|
23
|
+
// TODO: Implementation plan:
|
|
24
|
+
// 1. List all snapshots (or filter to options.snapshots)
|
|
25
|
+
// 2. For each snapshot, decrypt and unpack
|
|
26
|
+
// 3. Search through content with text matching
|
|
27
|
+
// 4. Score results by relevance
|
|
28
|
+
// 5. Sort and return top N results
|
|
29
|
+
void query;
|
|
30
|
+
void config;
|
|
31
|
+
void options;
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Simple text relevance scoring.
|
|
36
|
+
* Returns a score between 0 and 1.
|
|
37
|
+
*/
|
|
38
|
+
export function scoreMatch(query, content) {
|
|
39
|
+
const lowerQuery = query.toLowerCase();
|
|
40
|
+
const lowerContent = content.toLowerCase();
|
|
41
|
+
if (!lowerContent.includes(lowerQuery))
|
|
42
|
+
return 0;
|
|
43
|
+
// Exact match gets highest score
|
|
44
|
+
if (lowerContent === lowerQuery)
|
|
45
|
+
return 1;
|
|
46
|
+
// Score based on frequency and position
|
|
47
|
+
const words = lowerQuery.split(/\s+/);
|
|
48
|
+
let matchedWords = 0;
|
|
49
|
+
for (const word of words) {
|
|
50
|
+
if (lowerContent.includes(word))
|
|
51
|
+
matchedWords++;
|
|
52
|
+
}
|
|
53
|
+
const wordScore = words.length > 0 ? matchedWords / words.length : 0;
|
|
54
|
+
// Earlier matches score higher
|
|
55
|
+
const position = lowerContent.indexOf(lowerQuery);
|
|
56
|
+
const positionScore = Math.max(0, 1 - position / lowerContent.length);
|
|
57
|
+
return wordScore * 0.7 + positionScore * 0.3;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAa,EACb,MAAuB,EACvB,OAOC;IAED,MAAM,MAAM,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;IAEpC,6BAA6B;IAC7B,yDAAyD;IACzD,2CAA2C;IAC3C,+CAA+C;IAC/C,gCAAgC;IAChC,mCAAmC;IAEnC,KAAK,KAAK,CAAC;IACX,KAAK,MAAM,CAAC;IACZ,KAAK,OAAO,CAAC;IAEb,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,OAAe;IACvD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAE3C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,CAAC;IAEjD,iCAAiC;IACjC,IAAI,YAAY,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC;IAE1C,wCAAwC;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,YAAY,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAEtE,OAAO,SAAS,GAAG,GAAG,GAAG,aAAa,GAAG,GAAG,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Snapshot Creation
|
|
3
|
+
*
|
|
4
|
+
* Collects state from an adapter, builds the SAF structure,
|
|
5
|
+
* encrypts it, and stores it in the configured backend.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Adapter extracts current state → Snapshot object
|
|
9
|
+
* 2. packSnapshot() → file map
|
|
10
|
+
* 3. packToArchive() → tar.gz buffer
|
|
11
|
+
* 4. Compute checksum, update manifest with size
|
|
12
|
+
* 5. Re-pack with updated manifest
|
|
13
|
+
* 6. encrypt() → encrypted buffer
|
|
14
|
+
* 7. storage.put() with snapshot filename
|
|
15
|
+
* 8. Update local index
|
|
16
|
+
*/
|
|
17
|
+
import type { Adapter, Snapshot, StorageBackend } from './types.js';
|
|
18
|
+
export interface CreateSnapshotResult {
|
|
19
|
+
snapshot: Snapshot;
|
|
20
|
+
filename: string;
|
|
21
|
+
archiveSize: number;
|
|
22
|
+
encryptedSize: number;
|
|
23
|
+
fileCount: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create a new snapshot by extracting state from an adapter.
|
|
27
|
+
*
|
|
28
|
+
* @param adapter - Platform adapter to extract state from
|
|
29
|
+
* @param storage - Storage backend to write to
|
|
30
|
+
* @param passphrase - Encryption passphrase
|
|
31
|
+
* @param options - Snapshot options (label, tags, etc.)
|
|
32
|
+
* @returns Details about the created snapshot
|
|
33
|
+
*/
|
|
34
|
+
export declare function createSnapshot(adapter: Adapter, storage: StorageBackend, passphrase: string, options?: {
|
|
35
|
+
label?: string;
|
|
36
|
+
tags?: string[];
|
|
37
|
+
parentId?: string;
|
|
38
|
+
}): Promise<CreateSnapshotResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Get the latest snapshot ID from the index.
|
|
41
|
+
*/
|
|
42
|
+
export declare function getLatestSnapshotId(): Promise<string | null>;
|
|
43
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAmB,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAYrF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,oBAAoB,CAAC,CAmE/B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIlE"}
|