@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,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,5 @@
1
+ /**
2
+ * savestate diff <a> <b> — Compare two snapshots
3
+ */
4
+ export declare function diffCommand(snapshotA: string, snapshotB: string): Promise<void>;
5
+ //# sourceMappingURL=diff.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * savestate init — Initialize SaveState in the current directory
3
+ */
4
+ export declare function initCommand(): Promise<void>;
5
+ //# sourceMappingURL=init.d.ts.map
@@ -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,10 @@
1
+ /**
2
+ * savestate list — List all snapshots
3
+ */
4
+ interface ListOptions {
5
+ json?: boolean;
6
+ limit?: string;
7
+ }
8
+ export declare function listCommand(options: ListOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=list.d.ts.map
@@ -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"}