@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,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate config — View/edit configuration
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { isInitialized, loadConfig, localConfigPath } from '../config.js';
|
|
6
|
+
export async function configCommand(options) {
|
|
7
|
+
console.log();
|
|
8
|
+
if (!isInitialized()) {
|
|
9
|
+
console.log(chalk.red('✗ SaveState not initialized. Run `savestate init` first.'));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const config = await loadConfig();
|
|
13
|
+
const configPath = localConfigPath();
|
|
14
|
+
if (options.set) {
|
|
15
|
+
// TODO: Parse key=value and update config
|
|
16
|
+
console.log(chalk.yellow(` Setting config values is coming soon.`));
|
|
17
|
+
console.log(chalk.dim(` For now, edit directly: ${configPath}`));
|
|
18
|
+
console.log();
|
|
19
|
+
console.log(chalk.dim(' Usage examples:'));
|
|
20
|
+
console.log(chalk.dim(' savestate config --set storage.type=s3'));
|
|
21
|
+
console.log(chalk.dim(' savestate config --set defaultAdapter=chatgpt'));
|
|
22
|
+
console.log(chalk.dim(' savestate config --set retention.maxSnapshots=50'));
|
|
23
|
+
console.log();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (options.json) {
|
|
27
|
+
console.log(JSON.stringify(config, null, 2));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
console.log(chalk.bold('⚙️ SaveState Configuration'));
|
|
31
|
+
console.log(chalk.dim(` ${configPath}`));
|
|
32
|
+
console.log();
|
|
33
|
+
console.log(` ${chalk.dim('Version:')} ${config.version}`);
|
|
34
|
+
console.log(` ${chalk.dim('Storage:')} ${config.storage.type}`);
|
|
35
|
+
if (config.storage.options && Object.keys(config.storage.options).length > 0) {
|
|
36
|
+
for (const [key, value] of Object.entries(config.storage.options)) {
|
|
37
|
+
console.log(` ${chalk.dim(` ${key}:`)} ${value}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
console.log(` ${chalk.dim('Default Adapter:')} ${config.defaultAdapter ?? chalk.dim('(auto-detect)')}`);
|
|
41
|
+
console.log(` ${chalk.dim('Schedule:')} ${config.schedule ?? chalk.dim('(manual)')}`);
|
|
42
|
+
if (config.retention) {
|
|
43
|
+
console.log(` ${chalk.dim('Retention:')}`);
|
|
44
|
+
if (config.retention.maxSnapshots) {
|
|
45
|
+
console.log(` ${chalk.dim(' Max snapshots:')} ${config.retention.maxSnapshots}`);
|
|
46
|
+
}
|
|
47
|
+
if (config.retention.maxAge) {
|
|
48
|
+
console.log(` ${chalk.dim(' Max age:')} ${config.retention.maxAge}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (config.adapters.length > 0) {
|
|
52
|
+
console.log(` ${chalk.dim('Adapters:')}`);
|
|
53
|
+
for (const adapter of config.adapters) {
|
|
54
|
+
const status = adapter.enabled ? chalk.green('enabled') : chalk.red('disabled');
|
|
55
|
+
console.log(` • ${adapter.id} (${status})`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
console.log();
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDrF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate diff <a> <b> — Compare two snapshots
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { isInitialized } from '../config.js';
|
|
7
|
+
export async function diffCommand(snapshotA, snapshotB) {
|
|
8
|
+
console.log();
|
|
9
|
+
if (!isInitialized()) {
|
|
10
|
+
console.log(chalk.red('✗ SaveState not initialized. Run `savestate init` first.'));
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
console.log(chalk.bold('📊 Comparing snapshots'));
|
|
14
|
+
console.log(` ${chalk.cyan(snapshotA)} ↔ ${chalk.cyan(snapshotB)}`);
|
|
15
|
+
console.log();
|
|
16
|
+
const spinner = ora('Loading and decrypting snapshots...').start();
|
|
17
|
+
try {
|
|
18
|
+
// TODO: Actually diff
|
|
19
|
+
// 1. Load both snapshots
|
|
20
|
+
// 2. Decrypt both
|
|
21
|
+
// 3. Compare structures
|
|
22
|
+
// 4. Generate diff report
|
|
23
|
+
await new Promise((resolve) => setTimeout(resolve, 600));
|
|
24
|
+
spinner.stop();
|
|
25
|
+
console.log(chalk.dim(' [Not yet implemented — coming in Phase 3]'));
|
|
26
|
+
console.log();
|
|
27
|
+
console.log(chalk.dim(' This will show:'));
|
|
28
|
+
console.log(chalk.dim(' '));
|
|
29
|
+
console.log(chalk.dim(' Identity:'));
|
|
30
|
+
console.log(chalk.dim(` ${chalk.green('+')} Added 3 lines to personality.md`));
|
|
31
|
+
console.log(chalk.dim(` ${chalk.yellow('~')} Modified config.json`));
|
|
32
|
+
console.log(chalk.dim(' '));
|
|
33
|
+
console.log(chalk.dim(' Memory:'));
|
|
34
|
+
console.log(chalk.dim(` ${chalk.green('+')} 12 new memory entries`));
|
|
35
|
+
console.log(chalk.dim(` ${chalk.red('-')} 2 entries removed`));
|
|
36
|
+
console.log(chalk.dim(` ${chalk.yellow('~')} 5 entries modified`));
|
|
37
|
+
console.log(chalk.dim(' '));
|
|
38
|
+
console.log(chalk.dim(' Conversations:'));
|
|
39
|
+
console.log(chalk.dim(` ${chalk.green('+')} 8 new conversations`));
|
|
40
|
+
console.log(chalk.dim(` ${chalk.green('+')} 142 new messages in existing threads`));
|
|
41
|
+
console.log(chalk.dim(' '));
|
|
42
|
+
console.log(chalk.dim(' Summary: +27 added, -2 removed, 5 modified'));
|
|
43
|
+
console.log();
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
spinner.fail('Diff failed');
|
|
47
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command re-exports
|
|
3
|
+
*/
|
|
4
|
+
export { initCommand } from './init.js';
|
|
5
|
+
export { snapshotCommand } from './snapshot.js';
|
|
6
|
+
export { restoreCommand } from './restore.js';
|
|
7
|
+
export { listCommand } from './list.js';
|
|
8
|
+
export { searchCommand } from './search.js';
|
|
9
|
+
export { diffCommand } from './diff.js';
|
|
10
|
+
export { configCommand } from './config.js';
|
|
11
|
+
export { adaptersCommand } from './adapters.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command re-exports
|
|
3
|
+
*/
|
|
4
|
+
export { initCommand } from './init.js';
|
|
5
|
+
export { snapshotCommand } from './snapshot.js';
|
|
6
|
+
export { restoreCommand } from './restore.js';
|
|
7
|
+
export { listCommand } from './list.js';
|
|
8
|
+
export { searchCommand } from './search.js';
|
|
9
|
+
export { diffCommand } from './diff.js';
|
|
10
|
+
export { configCommand } from './config.js';
|
|
11
|
+
export { adaptersCommand } from './adapters.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAkEjD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate init — Initialize SaveState in the current directory
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { isInitialized, initializeProject, localConfigDir, saveConfig } from '../config.js';
|
|
7
|
+
import { detectAdapter } from '../adapters/registry.js';
|
|
8
|
+
import { getPassphrase } from '../passphrase.js';
|
|
9
|
+
export async function initCommand() {
|
|
10
|
+
console.log();
|
|
11
|
+
console.log(chalk.bold('⚡ SaveState — Time Machine for AI'));
|
|
12
|
+
console.log();
|
|
13
|
+
if (isInitialized()) {
|
|
14
|
+
console.log(chalk.yellow('⚠ SaveState is already initialized in this directory.'));
|
|
15
|
+
console.log(chalk.dim(` Config: ${localConfigDir()}/config.json`));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const spinner = ora('Initializing SaveState...').start();
|
|
19
|
+
try {
|
|
20
|
+
const config = await initializeProject();
|
|
21
|
+
spinner.succeed('Created .savestate/ directory');
|
|
22
|
+
// Try to auto-detect the platform
|
|
23
|
+
const detectSpinner = ora('Detecting platform...').start();
|
|
24
|
+
const adapter = await detectAdapter();
|
|
25
|
+
if (adapter) {
|
|
26
|
+
detectSpinner.succeed(`Detected platform: ${chalk.cyan(adapter.name)}`);
|
|
27
|
+
config.defaultAdapter = adapter.id;
|
|
28
|
+
config.adapters.push({ id: adapter.id, enabled: true });
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
detectSpinner.info('No platform auto-detected. Configure manually with `savestate config`.');
|
|
32
|
+
}
|
|
33
|
+
// Prompt for passphrase
|
|
34
|
+
console.log();
|
|
35
|
+
console.log(chalk.dim(' Your snapshots will be encrypted with a passphrase.'));
|
|
36
|
+
console.log(chalk.dim(' You can also set SAVESTATE_PASSPHRASE env var.'));
|
|
37
|
+
console.log();
|
|
38
|
+
try {
|
|
39
|
+
const passphrase = await getPassphrase({ confirm: true });
|
|
40
|
+
// Store a hint that passphrase was set (but NOT the passphrase itself)
|
|
41
|
+
config.storage.options.passphraseConfigured = true;
|
|
42
|
+
void passphrase; // We don't store it — just validate it works
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
// If non-interactive (e.g., env var set), that's fine
|
|
46
|
+
// If truly no passphrase, warn but don't block init
|
|
47
|
+
if (process.env.SAVESTATE_PASSPHRASE) {
|
|
48
|
+
console.log(chalk.green(' ✓ Using SAVESTATE_PASSPHRASE from environment'));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(chalk.yellow(' ⚠ No passphrase set. You\'ll be prompted when creating snapshots.'));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Save updated config
|
|
55
|
+
await saveConfig(config);
|
|
56
|
+
console.log();
|
|
57
|
+
console.log(chalk.green('✓ SaveState initialized!'));
|
|
58
|
+
console.log();
|
|
59
|
+
console.log(chalk.dim(' Next steps:'));
|
|
60
|
+
console.log(chalk.dim(` ${chalk.white('savestate snapshot')} Capture your first snapshot`));
|
|
61
|
+
console.log(chalk.dim(` ${chalk.white('savestate config')} Configure storage & adapters`));
|
|
62
|
+
console.log(chalk.dim(` ${chalk.white('savestate adapters')} See available platform adapters`));
|
|
63
|
+
console.log();
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
spinner.fail('Failed to initialize SaveState');
|
|
67
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ErE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate list — List all snapshots
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { isInitialized, loadConfig } from '../config.js';
|
|
6
|
+
import { loadIndex } from '../index-file.js';
|
|
7
|
+
export async function listCommand(options) {
|
|
8
|
+
console.log();
|
|
9
|
+
if (!isInitialized()) {
|
|
10
|
+
console.log(chalk.red('✗ SaveState not initialized. Run `savestate init` first.'));
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const config = await loadConfig();
|
|
14
|
+
const limit = options.limit ? parseInt(options.limit, 10) : 50;
|
|
15
|
+
const index = await loadIndex();
|
|
16
|
+
if (options.json) {
|
|
17
|
+
const output = index.snapshots.slice(0, limit);
|
|
18
|
+
console.log(JSON.stringify(output, null, 2));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
console.log(chalk.bold('📋 Snapshots'));
|
|
22
|
+
console.log(chalk.dim(` Storage: ${config.storage.type}`));
|
|
23
|
+
console.log();
|
|
24
|
+
if (index.snapshots.length === 0) {
|
|
25
|
+
console.log(chalk.dim(' No snapshots yet. Create one with:'));
|
|
26
|
+
console.log();
|
|
27
|
+
console.log(` ${chalk.cyan('savestate snapshot')}`);
|
|
28
|
+
console.log();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Sort by timestamp descending (most recent first)
|
|
32
|
+
const sorted = [...index.snapshots]
|
|
33
|
+
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime())
|
|
34
|
+
.slice(0, limit);
|
|
35
|
+
// Calculate column widths
|
|
36
|
+
const idWidth = Math.max(10, ...sorted.map((s) => s.id.length));
|
|
37
|
+
const dateWidth = 20;
|
|
38
|
+
const adapterWidth = Math.max(7, ...sorted.map((s) => s.adapter.length));
|
|
39
|
+
const labelWidth = Math.max(5, ...sorted.map((s) => (s.label ?? '').length));
|
|
40
|
+
const sizeWidth = 10;
|
|
41
|
+
// Header
|
|
42
|
+
const header = [
|
|
43
|
+
'ID'.padEnd(idWidth),
|
|
44
|
+
'Date'.padEnd(dateWidth),
|
|
45
|
+
'Adapter'.padEnd(adapterWidth),
|
|
46
|
+
'Label'.padEnd(labelWidth),
|
|
47
|
+
'Size'.padStart(sizeWidth),
|
|
48
|
+
].join(' ');
|
|
49
|
+
console.log(chalk.dim(` ${header}`));
|
|
50
|
+
console.log(chalk.dim(` ${'─'.repeat(header.length)}`));
|
|
51
|
+
// Rows
|
|
52
|
+
for (const s of sorted) {
|
|
53
|
+
const date = formatDate(s.timestamp);
|
|
54
|
+
const label = s.label ?? chalk.dim('—');
|
|
55
|
+
const size = formatBytes(s.size);
|
|
56
|
+
const row = [
|
|
57
|
+
chalk.cyan(s.id.padEnd(idWidth)),
|
|
58
|
+
date.padEnd(dateWidth),
|
|
59
|
+
s.adapter.padEnd(adapterWidth),
|
|
60
|
+
(typeof label === 'string' ? label : label).toString().padEnd(labelWidth),
|
|
61
|
+
size.padStart(sizeWidth),
|
|
62
|
+
].join(' ');
|
|
63
|
+
console.log(` ${row}`);
|
|
64
|
+
}
|
|
65
|
+
console.log();
|
|
66
|
+
console.log(chalk.dim(` ${sorted.length} snapshot${sorted.length !== 1 ? 's' : ''}`));
|
|
67
|
+
if (index.snapshots.length > limit) {
|
|
68
|
+
console.log(chalk.dim(` (showing ${limit} of ${index.snapshots.length})`));
|
|
69
|
+
}
|
|
70
|
+
console.log();
|
|
71
|
+
}
|
|
72
|
+
function formatDate(iso) {
|
|
73
|
+
const d = new Date(iso);
|
|
74
|
+
return d.toLocaleString('en-US', {
|
|
75
|
+
month: 'short',
|
|
76
|
+
day: 'numeric',
|
|
77
|
+
hour: '2-digit',
|
|
78
|
+
minute: '2-digit',
|
|
79
|
+
hour12: false,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function formatBytes(bytes) {
|
|
83
|
+
if (bytes < 1024)
|
|
84
|
+
return `${bytes} B`;
|
|
85
|
+
if (bytes < 1024 * 1024)
|
|
86
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
87
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate restore [snapshot-id] — Restore from a snapshot
|
|
3
|
+
*/
|
|
4
|
+
interface RestoreOptions {
|
|
5
|
+
to?: string;
|
|
6
|
+
dryRun?: boolean;
|
|
7
|
+
include?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function restoreCommand(snapshotId: string | undefined, options: RestoreOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=restore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,UAAU,cAAc;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoF3G"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate restore [snapshot-id] — Restore from a snapshot
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { isInitialized, loadConfig } from '../config.js';
|
|
7
|
+
import { restoreSnapshot } from '../restore.js';
|
|
8
|
+
import { resolveStorage } from '../storage/resolve.js';
|
|
9
|
+
import { detectAdapter, getAdapter } from '../adapters/registry.js';
|
|
10
|
+
import { getPassphrase } from '../passphrase.js';
|
|
11
|
+
export async function restoreCommand(snapshotId, options) {
|
|
12
|
+
console.log();
|
|
13
|
+
if (!isInitialized()) {
|
|
14
|
+
console.log(chalk.red('✗ SaveState not initialized. Run `savestate init` first.'));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const resolvedId = snapshotId ?? 'latest';
|
|
18
|
+
const config = await loadConfig();
|
|
19
|
+
console.log(chalk.bold(`🔄 Restoring from snapshot: ${chalk.cyan(resolvedId)}`));
|
|
20
|
+
console.log();
|
|
21
|
+
if (options.dryRun) {
|
|
22
|
+
console.log(chalk.yellow(' ▸ DRY RUN — no changes will be made'));
|
|
23
|
+
console.log();
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
// Resolve adapter
|
|
27
|
+
let adapter;
|
|
28
|
+
if (options.to) {
|
|
29
|
+
adapter = getAdapter(options.to);
|
|
30
|
+
if (!adapter) {
|
|
31
|
+
console.log(chalk.red(`✗ Unknown adapter: ${options.to}`));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (config.defaultAdapter) {
|
|
36
|
+
adapter = getAdapter(config.defaultAdapter);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
adapter = await detectAdapter();
|
|
40
|
+
}
|
|
41
|
+
if (!adapter) {
|
|
42
|
+
console.log(chalk.red('✗ No adapter found. Specify one with --to or configure a default.'));
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
// Get passphrase
|
|
46
|
+
const passphrase = await getPassphrase();
|
|
47
|
+
// Resolve storage
|
|
48
|
+
const storage = resolveStorage(config);
|
|
49
|
+
const spinner = ora('Retrieving and decrypting snapshot...').start();
|
|
50
|
+
const include = options.include
|
|
51
|
+
? options.include.split(',').map((s) => s.trim())
|
|
52
|
+
: undefined;
|
|
53
|
+
const result = await restoreSnapshot(resolvedId, adapter, storage, passphrase, {
|
|
54
|
+
include,
|
|
55
|
+
dryRun: options.dryRun,
|
|
56
|
+
});
|
|
57
|
+
spinner.succeed('Restore complete!');
|
|
58
|
+
console.log();
|
|
59
|
+
console.log(` ${chalk.dim('Snapshot:')} ${chalk.cyan(result.snapshotId)}`);
|
|
60
|
+
console.log(` ${chalk.dim('Timestamp:')} ${result.timestamp}`);
|
|
61
|
+
console.log(` ${chalk.dim('Platform:')} ${result.platform}`);
|
|
62
|
+
console.log(` ${chalk.dim('Adapter:')} ${result.adapter}`);
|
|
63
|
+
if (result.label) {
|
|
64
|
+
console.log(` ${chalk.dim('Label:')} ${result.label}`);
|
|
65
|
+
}
|
|
66
|
+
console.log(` ${chalk.dim('Identity:')} ${result.hasIdentity ? chalk.green('✓ restored') : chalk.dim('not present')}`);
|
|
67
|
+
console.log(` ${chalk.dim('Memory:')} ${result.memoryCount} entries restored`);
|
|
68
|
+
console.log(` ${chalk.dim('Conversations:')} ${result.conversationCount} indexed`);
|
|
69
|
+
console.log();
|
|
70
|
+
if (options.dryRun) {
|
|
71
|
+
console.log(chalk.yellow(' This was a dry run. No files were modified.'));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.log(chalk.green(' ✓ Your AI state has been restored.'));
|
|
75
|
+
console.log(chalk.dim(' Existing files were backed up with .bak extension.'));
|
|
76
|
+
}
|
|
77
|
+
console.log();
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
console.error();
|
|
81
|
+
console.error(chalk.red('✗ Restore failed'));
|
|
82
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=restore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate search <query> — Search across snapshots
|
|
3
|
+
*/
|
|
4
|
+
interface SearchOptions {
|
|
5
|
+
type?: string;
|
|
6
|
+
limit?: string;
|
|
7
|
+
snapshot?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function searchCommand(query: string, options: SearchOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CxF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate search <query> — Search across snapshots
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { isInitialized, loadConfig } from '../config.js';
|
|
7
|
+
export async function searchCommand(query, options) {
|
|
8
|
+
console.log();
|
|
9
|
+
if (!isInitialized()) {
|
|
10
|
+
console.log(chalk.red('✗ SaveState not initialized. Run `savestate init` first.'));
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const _config = await loadConfig();
|
|
14
|
+
const limit = options.limit ? parseInt(options.limit, 10) : 20;
|
|
15
|
+
console.log(chalk.bold(`🔍 Searching: "${chalk.cyan(query)}"`));
|
|
16
|
+
if (options.type)
|
|
17
|
+
console.log(chalk.dim(` Filter: ${options.type}`));
|
|
18
|
+
if (options.snapshot)
|
|
19
|
+
console.log(chalk.dim(` Snapshot: ${options.snapshot}`));
|
|
20
|
+
console.log();
|
|
21
|
+
const spinner = ora('Searching across snapshots...').start();
|
|
22
|
+
try {
|
|
23
|
+
// TODO: Actually search
|
|
24
|
+
// const results = await searchSnapshots(query, config, {
|
|
25
|
+
// types: options.type?.split(',') as any,
|
|
26
|
+
// limit,
|
|
27
|
+
// snapshots: options.snapshot ? [options.snapshot] : undefined,
|
|
28
|
+
// });
|
|
29
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
30
|
+
spinner.stop();
|
|
31
|
+
console.log(chalk.dim(' No snapshots to search. Create one with:'));
|
|
32
|
+
console.log();
|
|
33
|
+
console.log(` ${chalk.cyan('savestate snapshot')}`);
|
|
34
|
+
console.log();
|
|
35
|
+
console.log(chalk.dim(' Once you have snapshots, search will find matches across:'));
|
|
36
|
+
console.log(chalk.dim(' • Memory entries'));
|
|
37
|
+
console.log(chalk.dim(' • Conversation messages'));
|
|
38
|
+
console.log(chalk.dim(' • Identity/personality documents'));
|
|
39
|
+
console.log(chalk.dim(' • Knowledge base files'));
|
|
40
|
+
console.log();
|
|
41
|
+
console.log(chalk.dim(` Showing up to ${limit} results, sorted by relevance.`));
|
|
42
|
+
console.log();
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
spinner.fail('Search failed');
|
|
46
|
+
console.error(chalk.red(err instanceof Error ? err.message : String(err)));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* savestate snapshot — Capture current AI state to encrypted archive
|
|
3
|
+
*/
|
|
4
|
+
interface SnapshotOptions {
|
|
5
|
+
label?: string;
|
|
6
|
+
tags?: string;
|
|
7
|
+
adapter?: string;
|
|
8
|
+
schedule?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function snapshotCommand(options: SnapshotOptions): Promise<void>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyE7E"}
|