@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
package/dist/snapshot.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
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 { generateSnapshotId, SAF_VERSION, packSnapshot, packToArchive, computeChecksum, snapshotFilename, } from './format.js';
|
|
18
|
+
import { encrypt } from './encryption.js';
|
|
19
|
+
import { addToIndex } from './index-file.js';
|
|
20
|
+
/**
|
|
21
|
+
* Create a new snapshot by extracting state from an adapter.
|
|
22
|
+
*
|
|
23
|
+
* @param adapter - Platform adapter to extract state from
|
|
24
|
+
* @param storage - Storage backend to write to
|
|
25
|
+
* @param passphrase - Encryption passphrase
|
|
26
|
+
* @param options - Snapshot options (label, tags, etc.)
|
|
27
|
+
* @returns Details about the created snapshot
|
|
28
|
+
*/
|
|
29
|
+
export async function createSnapshot(adapter, storage, passphrase, options) {
|
|
30
|
+
// Step 1: Extract state from the platform
|
|
31
|
+
const snapshot = await adapter.extract();
|
|
32
|
+
// Step 2: Enrich manifest
|
|
33
|
+
const snapshotId = generateSnapshotId();
|
|
34
|
+
const now = new Date().toISOString();
|
|
35
|
+
snapshot.manifest = {
|
|
36
|
+
...snapshot.manifest,
|
|
37
|
+
id: snapshotId,
|
|
38
|
+
version: SAF_VERSION,
|
|
39
|
+
timestamp: now,
|
|
40
|
+
adapter: adapter.id,
|
|
41
|
+
platform: adapter.platform,
|
|
42
|
+
label: options?.label ?? snapshot.manifest.label,
|
|
43
|
+
tags: options?.tags ?? snapshot.manifest.tags,
|
|
44
|
+
parent: options?.parentId,
|
|
45
|
+
};
|
|
46
|
+
// Step 3: Update snapshot chain
|
|
47
|
+
snapshot.chain = {
|
|
48
|
+
current: snapshotId,
|
|
49
|
+
parent: options?.parentId,
|
|
50
|
+
ancestors: options?.parentId
|
|
51
|
+
? [...(snapshot.chain?.ancestors ?? []), options.parentId]
|
|
52
|
+
: [],
|
|
53
|
+
};
|
|
54
|
+
// Step 4: First pass — pack to get file map and compute checksum
|
|
55
|
+
const fileMap = packSnapshot(snapshot);
|
|
56
|
+
const firstArchive = packToArchive(fileMap);
|
|
57
|
+
const checksum = computeChecksum(firstArchive);
|
|
58
|
+
// Step 5: Update manifest with checksum and size, then re-pack
|
|
59
|
+
snapshot.manifest.checksum = checksum;
|
|
60
|
+
snapshot.manifest.size = firstArchive.length;
|
|
61
|
+
const finalFileMap = packSnapshot(snapshot);
|
|
62
|
+
const finalArchive = packToArchive(finalFileMap);
|
|
63
|
+
// Step 6: Encrypt the archive
|
|
64
|
+
const encrypted = await encrypt(finalArchive, passphrase);
|
|
65
|
+
// Step 7: Store the encrypted archive
|
|
66
|
+
const filename = snapshotFilename(snapshotId);
|
|
67
|
+
await storage.put(filename, encrypted);
|
|
68
|
+
// Step 8: Update local index
|
|
69
|
+
await addToIndex({
|
|
70
|
+
id: snapshotId,
|
|
71
|
+
timestamp: now,
|
|
72
|
+
platform: adapter.platform,
|
|
73
|
+
adapter: adapter.id,
|
|
74
|
+
label: options?.label,
|
|
75
|
+
tags: options?.tags,
|
|
76
|
+
filename,
|
|
77
|
+
size: encrypted.length,
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
snapshot,
|
|
81
|
+
filename,
|
|
82
|
+
archiveSize: finalArchive.length,
|
|
83
|
+
encryptedSize: encrypted.length,
|
|
84
|
+
fileCount: finalFileMap.size,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the latest snapshot ID from the index.
|
|
89
|
+
*/
|
|
90
|
+
export async function getLatestSnapshotId() {
|
|
91
|
+
const { getLatestEntry } = await import('./index-file.js');
|
|
92
|
+
const entry = await getLatestEntry();
|
|
93
|
+
return entry?.id ?? null;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAU7C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,OAAuB,EACvB,UAAkB,EAClB,OAIC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAEzC,0BAA0B;IAC1B,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,QAAQ,CAAC,QAAQ,GAAG;QAClB,GAAG,QAAQ,CAAC,QAAQ;QACpB,EAAE,EAAE,UAAU;QACd,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,OAAO,CAAC,EAAE;QACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK;QAChD,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI;QAC7C,MAAM,EAAE,OAAO,EAAE,QAAQ;KAC1B,CAAC;IAEF,gCAAgC;IAChC,QAAQ,CAAC,KAAK,GAAG;QACf,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,OAAO,EAAE,QAAQ;QACzB,SAAS,EAAE,OAAO,EAAE,QAAQ;YAC1B,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;YAC1D,CAAC,CAAC,EAAE;KACP,CAAC;IAEF,iEAAiE;IACjE,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAE/C,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;IAE7C,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAEjD,8BAA8B;IAC9B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAE1D,sCAAsC;IACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEvC,6BAA6B;IAC7B,MAAM,UAAU,CAAC;QACf,EAAE,EAAE,UAAU;QACd,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,EAAE;QACnB,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,QAAQ;QACR,IAAI,EAAE,SAAS,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,WAAW,EAAE,YAAY,CAAC,MAAM;QAChC,aAAa,EAAE,SAAS,CAAC,MAAM;QAC/B,SAAS,EAAE,YAAY,CAAC,IAAI;KAC7B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;IACrC,OAAO,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Filesystem Storage Backend
|
|
3
|
+
*
|
|
4
|
+
* Default backend. Stores encrypted archives at ~/.savestate/snapshots/
|
|
5
|
+
* or a user-configured directory.
|
|
6
|
+
*/
|
|
7
|
+
import type { StorageBackend } from '../types.js';
|
|
8
|
+
export declare class LocalStorageBackend implements StorageBackend {
|
|
9
|
+
readonly id = "local";
|
|
10
|
+
private readonly baseDir;
|
|
11
|
+
constructor(options?: {
|
|
12
|
+
path?: string;
|
|
13
|
+
});
|
|
14
|
+
private resolvePath;
|
|
15
|
+
private ensureDir;
|
|
16
|
+
put(key: string, data: Buffer): Promise<void>;
|
|
17
|
+
get(key: string): Promise<Buffer>;
|
|
18
|
+
list(prefix?: string): Promise<string[]>;
|
|
19
|
+
delete(key: string): Promise<void>;
|
|
20
|
+
exists(key: string): Promise<boolean>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,EAAE,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IAIvC,OAAO,CAAC,WAAW;YAML,SAAS;IAMjB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKjC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUxC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS5C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Filesystem Storage Backend
|
|
3
|
+
*
|
|
4
|
+
* Default backend. Stores encrypted archives at ~/.savestate/snapshots/
|
|
5
|
+
* or a user-configured directory.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, readdir, unlink, mkdir, stat } from 'node:fs/promises';
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
const DEFAULT_BASE_DIR = join(homedir(), '.savestate', 'snapshots');
|
|
12
|
+
export class LocalStorageBackend {
|
|
13
|
+
id = 'local';
|
|
14
|
+
baseDir;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.baseDir = options?.path ?? DEFAULT_BASE_DIR;
|
|
17
|
+
}
|
|
18
|
+
resolvePath(key) {
|
|
19
|
+
// Prevent path traversal
|
|
20
|
+
const sanitized = key.replace(/\.\./g, '').replace(/^\//, '');
|
|
21
|
+
return join(this.baseDir, sanitized);
|
|
22
|
+
}
|
|
23
|
+
async ensureDir() {
|
|
24
|
+
if (!existsSync(this.baseDir)) {
|
|
25
|
+
await mkdir(this.baseDir, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async put(key, data) {
|
|
29
|
+
await this.ensureDir();
|
|
30
|
+
const filePath = this.resolvePath(key);
|
|
31
|
+
const dir = filePath.substring(0, filePath.lastIndexOf('/'));
|
|
32
|
+
await mkdir(dir, { recursive: true });
|
|
33
|
+
await writeFile(filePath, data);
|
|
34
|
+
}
|
|
35
|
+
async get(key) {
|
|
36
|
+
const filePath = this.resolvePath(key);
|
|
37
|
+
return readFile(filePath);
|
|
38
|
+
}
|
|
39
|
+
async list(prefix) {
|
|
40
|
+
await this.ensureDir();
|
|
41
|
+
const entries = await readdir(this.baseDir, { recursive: true });
|
|
42
|
+
const keys = entries.map((e) => String(e));
|
|
43
|
+
if (prefix) {
|
|
44
|
+
return keys.filter((k) => k.startsWith(prefix));
|
|
45
|
+
}
|
|
46
|
+
return keys;
|
|
47
|
+
}
|
|
48
|
+
async delete(key) {
|
|
49
|
+
const filePath = this.resolvePath(key);
|
|
50
|
+
await unlink(filePath);
|
|
51
|
+
}
|
|
52
|
+
async exists(key) {
|
|
53
|
+
try {
|
|
54
|
+
const filePath = this.resolvePath(key);
|
|
55
|
+
await stat(filePath);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Backend Resolver
|
|
3
|
+
*
|
|
4
|
+
* Creates a storage backend instance from config.
|
|
5
|
+
*/
|
|
6
|
+
import type { SaveStateConfig, StorageBackend } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create a storage backend from the config's storage section.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveStorage(config: SaveStateConfig): StorageBackend;
|
|
11
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/storage/resolve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGnE;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,CAatE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage Backend Resolver
|
|
3
|
+
*
|
|
4
|
+
* Creates a storage backend instance from config.
|
|
5
|
+
*/
|
|
6
|
+
import { LocalStorageBackend } from './local.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create a storage backend from the config's storage section.
|
|
9
|
+
*/
|
|
10
|
+
export function resolveStorage(config) {
|
|
11
|
+
switch (config.storage.type) {
|
|
12
|
+
case 'local':
|
|
13
|
+
return new LocalStorageBackend({
|
|
14
|
+
path: config.storage.options.path,
|
|
15
|
+
});
|
|
16
|
+
default:
|
|
17
|
+
throw new Error(`Unknown storage backend: ${config.storage.type}. ` +
|
|
18
|
+
`Supported: local. S3/R2/B2 coming soon.`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/storage/resolve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAuB;IACpD,QAAQ,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,OAAO;YACV,OAAO,IAAI,mBAAmB,CAAC;gBAC7B,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAA0B;aACxD,CAAC,CAAC;QAEL;YACE,MAAM,IAAI,KAAK,CACb,4BAA4B,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;gBACnD,yCAAyC,CAC1C,CAAC;IACN,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SaveState Archive Format (SAF) Types
|
|
3
|
+
*
|
|
4
|
+
* The SAF is an open format for capturing AI agent state.
|
|
5
|
+
* Structure: tar.gz → AES-256-GCM encrypted → .saf.enc
|
|
6
|
+
*/
|
|
7
|
+
export interface Manifest {
|
|
8
|
+
/** SAF format version */
|
|
9
|
+
version: string;
|
|
10
|
+
/** ISO 8601 timestamp of snapshot creation */
|
|
11
|
+
timestamp: string;
|
|
12
|
+
/** Unique snapshot identifier */
|
|
13
|
+
id: string;
|
|
14
|
+
/** Source platform identifier */
|
|
15
|
+
platform: string;
|
|
16
|
+
/** Adapter used to create this snapshot */
|
|
17
|
+
adapter: string;
|
|
18
|
+
/** SHA-256 checksum of the unencrypted archive */
|
|
19
|
+
checksum: string;
|
|
20
|
+
/** Parent snapshot ID (for incremental snapshots) */
|
|
21
|
+
parent?: string;
|
|
22
|
+
/** Human-readable label */
|
|
23
|
+
label?: string;
|
|
24
|
+
/** Tags for organization */
|
|
25
|
+
tags?: string[];
|
|
26
|
+
/** Size in bytes of the unencrypted archive */
|
|
27
|
+
size: number;
|
|
28
|
+
}
|
|
29
|
+
export interface Identity {
|
|
30
|
+
/** System prompt / personality / SOUL document */
|
|
31
|
+
personality?: string;
|
|
32
|
+
/** Configuration and settings */
|
|
33
|
+
config?: Record<string, unknown>;
|
|
34
|
+
/** Tool/plugin/skill configurations */
|
|
35
|
+
tools?: ToolConfig[];
|
|
36
|
+
/** Skills with their configs and scripts */
|
|
37
|
+
skills?: SkillEntry[];
|
|
38
|
+
/** Custom user scripts */
|
|
39
|
+
scripts?: ScriptEntry[];
|
|
40
|
+
/** Extension configurations (not code/node_modules) */
|
|
41
|
+
extensions?: ExtensionEntry[];
|
|
42
|
+
/** Project file manifest (paths + sizes, no content) */
|
|
43
|
+
fileManifest?: FileManifestEntry[];
|
|
44
|
+
/** Project metadata files (package.json, pyproject.toml, etc.) */
|
|
45
|
+
projectMeta?: Record<string, string>;
|
|
46
|
+
}
|
|
47
|
+
export interface ToolConfig {
|
|
48
|
+
name: string;
|
|
49
|
+
type: string;
|
|
50
|
+
config: Record<string, unknown>;
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
}
|
|
53
|
+
export interface SkillEntry {
|
|
54
|
+
/** Skill directory name */
|
|
55
|
+
name: string;
|
|
56
|
+
/** SKILL.md content */
|
|
57
|
+
skillMd?: string;
|
|
58
|
+
/** Files in the skill (relative path → content) */
|
|
59
|
+
files: Record<string, string>;
|
|
60
|
+
}
|
|
61
|
+
export interface ScriptEntry {
|
|
62
|
+
/** Relative path from workspace root */
|
|
63
|
+
path: string;
|
|
64
|
+
/** Script content */
|
|
65
|
+
content: string;
|
|
66
|
+
/** Whether this is a cron wrapper */
|
|
67
|
+
isCronWrapper: boolean;
|
|
68
|
+
}
|
|
69
|
+
export interface ExtensionEntry {
|
|
70
|
+
/** Extension directory name */
|
|
71
|
+
name: string;
|
|
72
|
+
/** Config files in the extension (relative path → content) */
|
|
73
|
+
configs: Record<string, string>;
|
|
74
|
+
}
|
|
75
|
+
export interface FileManifestEntry {
|
|
76
|
+
/** Relative file path */
|
|
77
|
+
path: string;
|
|
78
|
+
/** File size in bytes */
|
|
79
|
+
size: number;
|
|
80
|
+
/** Last modified ISO timestamp */
|
|
81
|
+
modified: string;
|
|
82
|
+
}
|
|
83
|
+
export interface Memory {
|
|
84
|
+
/** Platform memory entries (ChatGPT memories, Claude memory, etc.) */
|
|
85
|
+
core: MemoryEntry[];
|
|
86
|
+
/** Knowledge base documents */
|
|
87
|
+
knowledge: KnowledgeDocument[];
|
|
88
|
+
/** Optional vector embeddings for search */
|
|
89
|
+
embeddings?: EmbeddingData;
|
|
90
|
+
}
|
|
91
|
+
export interface MemoryEntry {
|
|
92
|
+
id: string;
|
|
93
|
+
content: string;
|
|
94
|
+
source: string;
|
|
95
|
+
createdAt: string;
|
|
96
|
+
updatedAt?: string;
|
|
97
|
+
metadata?: Record<string, unknown>;
|
|
98
|
+
}
|
|
99
|
+
export interface KnowledgeDocument {
|
|
100
|
+
id: string;
|
|
101
|
+
filename: string;
|
|
102
|
+
mimeType: string;
|
|
103
|
+
/** Relative path within the archive */
|
|
104
|
+
path: string;
|
|
105
|
+
size: number;
|
|
106
|
+
checksum: string;
|
|
107
|
+
}
|
|
108
|
+
export interface EmbeddingData {
|
|
109
|
+
model: string;
|
|
110
|
+
dimensions: number;
|
|
111
|
+
/** Path to binary embeddings file */
|
|
112
|
+
path: string;
|
|
113
|
+
}
|
|
114
|
+
export interface ConversationIndex {
|
|
115
|
+
total: number;
|
|
116
|
+
conversations: ConversationMeta[];
|
|
117
|
+
}
|
|
118
|
+
export interface ConversationMeta {
|
|
119
|
+
id: string;
|
|
120
|
+
title?: string;
|
|
121
|
+
createdAt: string;
|
|
122
|
+
updatedAt: string;
|
|
123
|
+
messageCount: number;
|
|
124
|
+
/** Relative path to the conversation JSON */
|
|
125
|
+
path: string;
|
|
126
|
+
}
|
|
127
|
+
export interface Conversation {
|
|
128
|
+
id: string;
|
|
129
|
+
title?: string;
|
|
130
|
+
createdAt: string;
|
|
131
|
+
updatedAt: string;
|
|
132
|
+
messages: Message[];
|
|
133
|
+
metadata?: Record<string, unknown>;
|
|
134
|
+
}
|
|
135
|
+
export interface Message {
|
|
136
|
+
id: string;
|
|
137
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
138
|
+
content: string;
|
|
139
|
+
timestamp: string;
|
|
140
|
+
metadata?: Record<string, unknown>;
|
|
141
|
+
}
|
|
142
|
+
export interface PlatformMeta {
|
|
143
|
+
name: string;
|
|
144
|
+
version?: string;
|
|
145
|
+
apiVersion?: string;
|
|
146
|
+
accountId?: string;
|
|
147
|
+
exportMethod: string;
|
|
148
|
+
}
|
|
149
|
+
export interface SnapshotChain {
|
|
150
|
+
current: string;
|
|
151
|
+
parent?: string;
|
|
152
|
+
/** Full chain of ancestor snapshot IDs (oldest first) */
|
|
153
|
+
ancestors: string[];
|
|
154
|
+
}
|
|
155
|
+
export interface RestoreHints {
|
|
156
|
+
platform: string;
|
|
157
|
+
/** Steps needed for restore on this platform */
|
|
158
|
+
steps: RestoreStep[];
|
|
159
|
+
/** Capabilities that can't be auto-restored */
|
|
160
|
+
manualSteps?: string[];
|
|
161
|
+
}
|
|
162
|
+
export interface RestoreStep {
|
|
163
|
+
type: 'api' | 'file' | 'manual';
|
|
164
|
+
description: string;
|
|
165
|
+
target: string;
|
|
166
|
+
data?: string;
|
|
167
|
+
}
|
|
168
|
+
export interface Snapshot {
|
|
169
|
+
manifest: Manifest;
|
|
170
|
+
identity: Identity;
|
|
171
|
+
memory: Memory;
|
|
172
|
+
conversations: ConversationIndex;
|
|
173
|
+
platform: PlatformMeta;
|
|
174
|
+
chain: SnapshotChain;
|
|
175
|
+
restoreHints: RestoreHints;
|
|
176
|
+
}
|
|
177
|
+
export interface Adapter {
|
|
178
|
+
/** Unique adapter identifier */
|
|
179
|
+
readonly id: string;
|
|
180
|
+
/** Human-readable name */
|
|
181
|
+
readonly name: string;
|
|
182
|
+
/** Platform this adapter targets */
|
|
183
|
+
readonly platform: string;
|
|
184
|
+
/** Adapter version */
|
|
185
|
+
readonly version: string;
|
|
186
|
+
/** Check if this adapter can operate in the current environment */
|
|
187
|
+
detect(): Promise<boolean>;
|
|
188
|
+
/** Extract current state from the platform */
|
|
189
|
+
extract(): Promise<Snapshot>;
|
|
190
|
+
/** Restore state to the platform */
|
|
191
|
+
restore(snapshot: Snapshot): Promise<void>;
|
|
192
|
+
/** Get platform-specific identity information */
|
|
193
|
+
identify(): Promise<PlatformMeta>;
|
|
194
|
+
}
|
|
195
|
+
export interface StorageBackend {
|
|
196
|
+
/** Backend identifier (e.g., 'local', 's3', 'r2') */
|
|
197
|
+
readonly id: string;
|
|
198
|
+
/** Store encrypted data */
|
|
199
|
+
put(key: string, data: Buffer): Promise<void>;
|
|
200
|
+
/** Retrieve encrypted data */
|
|
201
|
+
get(key: string): Promise<Buffer>;
|
|
202
|
+
/** List all stored keys, optionally filtered by prefix */
|
|
203
|
+
list(prefix?: string): Promise<string[]>;
|
|
204
|
+
/** Delete stored data */
|
|
205
|
+
delete(key: string): Promise<void>;
|
|
206
|
+
/** Check if a key exists */
|
|
207
|
+
exists(key: string): Promise<boolean>;
|
|
208
|
+
}
|
|
209
|
+
export interface SaveStateConfig {
|
|
210
|
+
/** Config format version */
|
|
211
|
+
version: string;
|
|
212
|
+
/** Storage backend configuration */
|
|
213
|
+
storage: StorageConfig;
|
|
214
|
+
/** Default adapter to use */
|
|
215
|
+
defaultAdapter?: string;
|
|
216
|
+
/** Auto-snapshot schedule (cron expression or interval) */
|
|
217
|
+
schedule?: string;
|
|
218
|
+
/** Snapshot retention policy */
|
|
219
|
+
retention?: RetentionPolicy;
|
|
220
|
+
/** Registered adapters */
|
|
221
|
+
adapters: AdapterConfig[];
|
|
222
|
+
}
|
|
223
|
+
export interface StorageConfig {
|
|
224
|
+
/** Backend type: 'local' | 's3' | 'r2' | 'b2' | 'filesystem' */
|
|
225
|
+
type: string;
|
|
226
|
+
/** Backend-specific options */
|
|
227
|
+
options: Record<string, unknown>;
|
|
228
|
+
}
|
|
229
|
+
export interface RetentionPolicy {
|
|
230
|
+
/** Maximum number of snapshots to keep */
|
|
231
|
+
maxSnapshots?: number;
|
|
232
|
+
/** Maximum age of snapshots (e.g., '90d', '1y') */
|
|
233
|
+
maxAge?: string;
|
|
234
|
+
/** Keep at least one snapshot per period */
|
|
235
|
+
keepPer?: 'day' | 'week' | 'month';
|
|
236
|
+
}
|
|
237
|
+
export interface AdapterConfig {
|
|
238
|
+
id: string;
|
|
239
|
+
enabled: boolean;
|
|
240
|
+
options?: Record<string, unknown>;
|
|
241
|
+
}
|
|
242
|
+
export interface SearchResult {
|
|
243
|
+
snapshotId: string;
|
|
244
|
+
snapshotTimestamp: string;
|
|
245
|
+
type: 'memory' | 'conversation' | 'identity' | 'knowledge';
|
|
246
|
+
/** The matching content */
|
|
247
|
+
content: string;
|
|
248
|
+
/** Context around the match */
|
|
249
|
+
context?: string;
|
|
250
|
+
/** Relevance score (0-1) */
|
|
251
|
+
score: number;
|
|
252
|
+
/** Source path within the archive */
|
|
253
|
+
path: string;
|
|
254
|
+
}
|
|
255
|
+
export interface DiffResult {
|
|
256
|
+
snapshotA: string;
|
|
257
|
+
snapshotB: string;
|
|
258
|
+
changes: DiffChange[];
|
|
259
|
+
summary: {
|
|
260
|
+
added: number;
|
|
261
|
+
removed: number;
|
|
262
|
+
modified: number;
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
export interface DiffChange {
|
|
266
|
+
type: 'added' | 'removed' | 'modified';
|
|
267
|
+
category: 'identity' | 'memory' | 'conversation' | 'tool';
|
|
268
|
+
path: string;
|
|
269
|
+
description: string;
|
|
270
|
+
before?: string;
|
|
271
|
+
after?: string;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@savestate/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Time Machine for AI. Backup, restore, and migrate your AI identity.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"savestate": "dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"start": "node dist/cli.js",
|
|
15
|
+
"clean": "rm -rf dist",
|
|
16
|
+
"prepublishOnly": "npm run build"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"ai",
|
|
20
|
+
"backup",
|
|
21
|
+
"restore",
|
|
22
|
+
"encryption",
|
|
23
|
+
"agent",
|
|
24
|
+
"state",
|
|
25
|
+
"migration",
|
|
26
|
+
"chatgpt",
|
|
27
|
+
"claude",
|
|
28
|
+
"time-machine"
|
|
29
|
+
],
|
|
30
|
+
"author": "DBH Ventures <hello@savestate.dev>",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"homepage": "https://savestate.dev",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/savestatedev/savestate.git"
|
|
36
|
+
},
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/savestatedev/savestate/issues"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"README.md",
|
|
43
|
+
"LICENSE"
|
|
44
|
+
],
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=20.0.0"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"chalk": "^5.4.1",
|
|
53
|
+
"commander": "^13.1.0",
|
|
54
|
+
"ora": "^8.2.0",
|
|
55
|
+
"tar": "^7.4.3"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/node": "^22.15.0",
|
|
59
|
+
"typescript": "^5.8.3"
|
|
60
|
+
}
|
|
61
|
+
}
|