@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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +256 -0
  3. package/dist/adapters/claude-code.d.ts +81 -0
  4. package/dist/adapters/claude-code.d.ts.map +1 -0
  5. package/dist/adapters/claude-code.js +540 -0
  6. package/dist/adapters/claude-code.js.map +1 -0
  7. package/dist/adapters/clawdbot.d.ts +93 -0
  8. package/dist/adapters/clawdbot.d.ts.map +1 -0
  9. package/dist/adapters/clawdbot.js +673 -0
  10. package/dist/adapters/clawdbot.js.map +1 -0
  11. package/dist/adapters/index.d.ts +9 -0
  12. package/dist/adapters/index.d.ts.map +1 -0
  13. package/dist/adapters/index.js +8 -0
  14. package/dist/adapters/index.js.map +1 -0
  15. package/dist/adapters/interface.d.ts +8 -0
  16. package/dist/adapters/interface.d.ts.map +1 -0
  17. package/dist/adapters/interface.js +8 -0
  18. package/dist/adapters/interface.js.map +1 -0
  19. package/dist/adapters/openai-assistants.d.ts +51 -0
  20. package/dist/adapters/openai-assistants.d.ts.map +1 -0
  21. package/dist/adapters/openai-assistants.js +114 -0
  22. package/dist/adapters/openai-assistants.js.map +1 -0
  23. package/dist/adapters/registry.d.ts +38 -0
  24. package/dist/adapters/registry.d.ts.map +1 -0
  25. package/dist/adapters/registry.js +79 -0
  26. package/dist/adapters/registry.js.map +1 -0
  27. package/dist/cli.d.ts +18 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +81 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/commands/adapters.d.ts +5 -0
  32. package/dist/commands/adapters.d.ts.map +1 -0
  33. package/dist/commands/adapters.js +49 -0
  34. package/dist/commands/adapters.js.map +1 -0
  35. package/dist/commands/config.d.ts +10 -0
  36. package/dist/commands/config.d.ts.map +1 -0
  37. package/dist/commands/config.js +60 -0
  38. package/dist/commands/config.js.map +1 -0
  39. package/dist/commands/diff.d.ts +5 -0
  40. package/dist/commands/diff.d.ts.map +1 -0
  41. package/dist/commands/diff.js +51 -0
  42. package/dist/commands/diff.js.map +1 -0
  43. package/dist/commands/index.d.ts +12 -0
  44. package/dist/commands/index.d.ts.map +1 -0
  45. package/dist/commands/index.js +12 -0
  46. package/dist/commands/index.js.map +1 -0
  47. package/dist/commands/init.d.ts +5 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +71 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/list.d.ts +10 -0
  52. package/dist/commands/list.d.ts.map +1 -0
  53. package/dist/commands/list.js +89 -0
  54. package/dist/commands/list.js.map +1 -0
  55. package/dist/commands/restore.d.ts +11 -0
  56. package/dist/commands/restore.d.ts.map +1 -0
  57. package/dist/commands/restore.js +86 -0
  58. package/dist/commands/restore.js.map +1 -0
  59. package/dist/commands/search.d.ts +11 -0
  60. package/dist/commands/search.d.ts.map +1 -0
  61. package/dist/commands/search.js +50 -0
  62. package/dist/commands/search.js.map +1 -0
  63. package/dist/commands/snapshot.d.ts +12 -0
  64. package/dist/commands/snapshot.d.ts.map +1 -0
  65. package/dist/commands/snapshot.js +84 -0
  66. package/dist/commands/snapshot.js.map +1 -0
  67. package/dist/config.d.ts +44 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +83 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/encryption.d.ts +40 -0
  72. package/dist/encryption.d.ts.map +1 -0
  73. package/dist/encryption.js +120 -0
  74. package/dist/encryption.js.map +1 -0
  75. package/dist/format.d.ts +47 -0
  76. package/dist/format.d.ts.map +1 -0
  77. package/dist/format.js +198 -0
  78. package/dist/format.js.map +1 -0
  79. package/dist/index-file.d.ts +42 -0
  80. package/dist/index-file.d.ts.map +1 -0
  81. package/dist/index-file.js +68 -0
  82. package/dist/index-file.js.map +1 -0
  83. package/dist/index.d.ts +15 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +22 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/passphrase.d.ts +23 -0
  88. package/dist/passphrase.d.ts.map +1 -0
  89. package/dist/passphrase.js +82 -0
  90. package/dist/passphrase.js.map +1 -0
  91. package/dist/restore.d.ts +46 -0
  92. package/dist/restore.d.ts.map +1 -0
  93. package/dist/restore.js +113 -0
  94. package/dist/restore.js.map +1 -0
  95. package/dist/search.d.ts +35 -0
  96. package/dist/search.d.ts.map +1 -0
  97. package/dist/search.js +59 -0
  98. package/dist/search.js.map +1 -0
  99. package/dist/snapshot.d.ts +43 -0
  100. package/dist/snapshot.d.ts.map +1 -0
  101. package/dist/snapshot.js +95 -0
  102. package/dist/snapshot.js.map +1 -0
  103. package/dist/storage/index.d.ts +7 -0
  104. package/dist/storage/index.d.ts.map +1 -0
  105. package/dist/storage/index.js +6 -0
  106. package/dist/storage/index.js.map +1 -0
  107. package/dist/storage/interface.d.ts +8 -0
  108. package/dist/storage/interface.d.ts.map +1 -0
  109. package/dist/storage/interface.js +8 -0
  110. package/dist/storage/interface.js.map +1 -0
  111. package/dist/storage/local.d.ts +22 -0
  112. package/dist/storage/local.d.ts.map +1 -0
  113. package/dist/storage/local.js +63 -0
  114. package/dist/storage/local.js.map +1 -0
  115. package/dist/storage/resolve.d.ts +11 -0
  116. package/dist/storage/resolve.d.ts.map +1 -0
  117. package/dist/storage/resolve.js +21 -0
  118. package/dist/storage/resolve.js.map +1 -0
  119. package/dist/types.d.ts +273 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +8 -0
  122. package/dist/types.js.map +1 -0
  123. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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"}
@@ -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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"}
@@ -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"}