total-recall-brain 3.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 +173 -0
- package/bin/antigravity.mjs +212 -0
- package/bin/init.mjs +36 -0
- package/bin/oci-sniper.sh +69 -0
- package/bin/total-recall.mjs +229 -0
- package/docs/ARCHITECTURE.md +251 -0
- package/docs/IDE_INTEGRATION.md +112 -0
- package/package.json +71 -0
- package/scaffold/.agent/skills/total-recall/SKILL.md +195 -0
- package/scaffold/.agent/skills/total-recall/evals/evals.json +20 -0
- package/scaffold/.agent/skills/total-recall/memory-vault/concepts/cli-help-reference.md +145 -0
- package/scaffold/.agent/skills/total-recall/memory-vault/invariants/operating-instructions.md +75 -0
- package/scaffold/.agent/skills/total-recall/memory-vault/preferences/always-websearch-gap.md +16 -0
- package/scaffold/.agent/skills/total-recall/memory-vault/preferences/topic-research-sop.md +17 -0
- package/scaffold/.agent/skills/total-recall/references/api-reference.md +187 -0
- package/scaffold/.agent/skills/total-recall/references/architecture-reference.md +81 -0
- package/scaffold/.agent/skills/total-recall/references/cli-reference.md +103 -0
- package/scaffold/.agent/skills/total-recall/references/ssss-reference.md +88 -0
- package/scaffold/.agent/skills/total-recall/references/troubleshooting.md +68 -0
- package/scaffold/.agent/skills/total-recall/scripts/sync-repo.mjs +83 -0
- package/scaffold/.agent/skills/total-recall/skills/cli-agents/SKILL.md +122 -0
- package/scaffold/.agent/skills/total-recall/skills/cli-agents/agents.yml +27 -0
- package/scaffold/.agent/skills/total-recall/skills/cli-agents/references/antigravity.txt +20 -0
- package/scaffold/.agent/skills/total-recall/skills/cli-agents/references/claude.txt +58 -0
- package/scaffold/.agent/skills/total-recall/skills/cli-agents/references/codex.txt +81 -0
- package/scaffold/.agent/skills/total-recall/skills/cli-agents/references/gemini.txt +44 -0
- package/scaffold/.agent/skills/total-recall/skills/research/SKILL.md +337 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/SKILL.md +281 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/assets/skill-template/SKILL.md +20 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/evals/evals.json +20 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/hooks/on-skill-add.sh +14 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/hooks/on-skill-delete.sh +14 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/learnings/.gitkeep +0 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/references/.gitkeep +0 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/scripts/.gitkeep +0 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/scripts/create-skill.sh +65 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/scripts/enforce-skill-optimization.mjs +135 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/scripts/find-skills.mjs +124 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/scripts/scan-skill.mjs +207 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/scripts/skill-watcher.mjs +64 -0
- package/scaffold/.agent/skills/total-recall/skills/skill/subagents/audit-all-skills.md +62 -0
- package/scaffold/.agent/skills/total-recall/skills/ssss/SKILL.md +27 -0
- package/scaffold/.agent/skills/total-recall/skills/ssss/evals/evals.json +17 -0
- package/scaffold/.agent/skills/total-recall/skills/ssss/references/ssss-spec.md +117 -0
- package/scaffold/.agent/skills/total-recall/skills/ssss/scripts/validate-schema.mjs +54 -0
- package/scaffold/.agent/skills/total-recall/skills/ssss/subagents/audit-ssss-node.md +9 -0
- package/scaffold/.agent/skills/total-recall/subagents/total-recall-diagnostician.md +13 -0
- package/src/cli/agent-dir.mjs +105 -0
- package/src/cli/backup.mjs +313 -0
- package/src/cli/brain.mjs +224 -0
- package/src/cli/chat.mjs +74 -0
- package/src/cli/config.mjs +247 -0
- package/src/cli/connect.mjs +872 -0
- package/src/cli/daemon.mjs +228 -0
- package/src/cli/deploy-ui.mjs +1793 -0
- package/src/cli/deploy.mjs +1726 -0
- package/src/cli/doctor.mjs +254 -0
- package/src/cli/dream.mjs +80 -0
- package/src/cli/forget.mjs +92 -0
- package/src/cli/friction.mjs +21 -0
- package/src/cli/generate-pat.mjs +65 -0
- package/src/cli/hash-password.mjs +22 -0
- package/src/cli/help.mjs +153 -0
- package/src/cli/import-rules.mjs +102 -0
- package/src/cli/ingest/index.mjs +318 -0
- package/src/cli/ingest/parsers/chrome-bookmarks.mjs +238 -0
- package/src/cli/ingest/parsers/google-keep.mjs +147 -0
- package/src/cli/ingest/parsers/search-history.mjs +142 -0
- package/src/cli/ingest/parsers/youtube-history.mjs +181 -0
- package/src/cli/ingest/utils/dedup.mjs +69 -0
- package/src/cli/ingest/utils/takeout-walker.mjs +101 -0
- package/src/cli/ingest.mjs +102 -0
- package/src/cli/init.mjs +736 -0
- package/src/cli/integration-dispatcher.mjs +128 -0
- package/src/cli/lint.mjs +166 -0
- package/src/cli/map.mjs +194 -0
- package/src/cli/migrate.mjs +87 -0
- package/src/cli/rebuild.mjs +88 -0
- package/src/cli/recall.mjs +219 -0
- package/src/cli/relay.mjs +518 -0
- package/src/cli/remember.mjs +306 -0
- package/src/cli/research.mjs +381 -0
- package/src/cli/reset-password.mjs +75 -0
- package/src/cli/restore.mjs +135 -0
- package/src/cli/setup.mjs +616 -0
- package/src/cli/share.mjs +180 -0
- package/src/cli/skill.mjs +313 -0
- package/src/cli/snapshot.mjs +108 -0
- package/src/cli/start.mjs +63 -0
- package/src/cli/status.mjs +296 -0
- package/src/cli/sync.mjs +383 -0
- package/src/cli/uninstall.mjs +613 -0
- package/src/cli/upgrade.mjs +141 -0
- package/src/cli/wizard.html +3682 -0
- package/src/core/blackboard.mjs +54 -0
- package/src/core/clarity-rewriter.mjs +770 -0
- package/src/core/conclusion-writer.mjs +259 -0
- package/src/core/config.mjs +277 -0
- package/src/core/conflict-detector.mjs +536 -0
- package/src/core/crypto.mjs +107 -0
- package/src/core/daemon-control.mjs +158 -0
- package/src/core/daemon-loop.mjs +364 -0
- package/src/core/dream.mjs +347 -0
- package/src/core/drift-detector.mjs +143 -0
- package/src/core/embeddings.mjs +632 -0
- package/src/core/emergency-alerts.mjs +137 -0
- package/src/core/evolution.mjs +107 -0
- package/src/core/fact-seeker.mjs +1602 -0
- package/src/core/friction.mjs +95 -0
- package/src/core/import-rules.mjs +308 -0
- package/src/core/inference-engine.mjs +367 -0
- package/src/core/logger.mjs +75 -0
- package/src/core/memory-layers.mjs +96 -0
- package/src/core/migrate.mjs +116 -0
- package/src/core/notifications.mjs +77 -0
- package/src/core/operation-validator.mjs +272 -0
- package/src/core/optimizer.mjs +330 -0
- package/src/core/pattern_detector.mjs +113 -0
- package/src/core/post-mortem.mjs +413 -0
- package/src/core/protect-instructions.mjs +148 -0
- package/src/core/quick-capture.mjs +145 -0
- package/src/core/research-queue.mjs +431 -0
- package/src/core/research.mjs +461 -0
- package/src/core/runtime.mjs +515 -0
- package/src/core/sandbox.mjs +163 -0
- package/src/core/scheduler.mjs +569 -0
- package/src/core/schema.mjs +333 -0
- package/src/core/search.mjs +219 -0
- package/src/core/semantic-index.mjs +276 -0
- package/src/core/session-watcher.mjs +850 -0
- package/src/core/snapshot.mjs +133 -0
- package/src/core/source-adapters.mjs +1038 -0
- package/src/core/steering.mjs +137 -0
- package/src/core/surface.mjs +444 -0
- package/src/core/task_runner.mjs +125 -0
- package/src/core/tts.mjs +142 -0
- package/src/core/usage-tracker.mjs +349 -0
- package/src/core/vault-cache.mjs +76 -0
- package/src/core/vault.mjs +273 -0
- package/src/core/watchdog.mjs +236 -0
- package/src/server/api.mjs +944 -0
- package/src/server/auth.mjs +410 -0
- package/src/server/index.mjs +868 -0
- package/src/server/keys.mjs +181 -0
- package/src/server/rest.mjs +1652 -0
- package/src/server/route-manifest.json +77 -0
- package/src/server/routes/_shared.mjs +93 -0
- package/src/server/routes/keys.mjs +55 -0
- package/src/server/routes/memory.mjs +249 -0
- package/src/server/routes/sessions.mjs +336 -0
- package/src/server/routes/share.mjs +138 -0
- package/src/server/tools.mjs +618 -0
- package/templates/Caddyfile +37 -0
- package/templates/com.totalrecall.backup.plist +42 -0
- package/templates/com.totalrecall.daemon.plist +40 -0
- package/templates/com.totalrecall.duckdns.plist +23 -0
- package/templates/com.totalrecall.server.plist +46 -0
- package/templates/default-config/budget.yml +6 -0
- package/templates/default-config/runtime.yml +11 -0
- package/templates/default-config/security.yml +53 -0
- package/templates/default-config/voice.yml +34 -0
- package/templates/obsidian-queries/conflicts.md +26 -0
- package/templates/obsidian-queries/daily.md +17 -0
- package/templates/obsidian-queries/index.md +38 -0
- package/templates/obsidian-queries/skills.md +14 -0
- package/templates/onboarding-interview.md +72 -0
- package/templates/skill_engineering.md +40 -0
- package/templates/total-recall-daemon.service +21 -0
- package/templates/total-recall-server.service +20 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import crypto from 'node:crypto';
|
|
5
|
+
import { brainDir } from './config.mjs';
|
|
6
|
+
import { logger } from './logger.mjs';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* SSSS Snapshot & Rollback
|
|
10
|
+
*
|
|
11
|
+
* Implements local VFS snapshotting for the Sovereign AI OS.
|
|
12
|
+
* Since the memory-vault is excluded from git, we use fast local
|
|
13
|
+
* tarballs to provide point-in-time recovery for the vault.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
export function getSnapshotsDir() {
|
|
17
|
+
const snapshotsDir = path.join(brainDir, '.snapshots');
|
|
18
|
+
if (!fs.existsSync(snapshotsDir)) {
|
|
19
|
+
fs.mkdirSync(snapshotsDir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
return snapshotsDir;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a point-in-time snapshot of the memory vault.
|
|
26
|
+
*
|
|
27
|
+
* @param {string} reason - The reason for the snapshot (e.g. 'pre-dream', 'manual')
|
|
28
|
+
* @returns {{ success: boolean, snapshot_id: string, path: string, error?: string }}
|
|
29
|
+
*/
|
|
30
|
+
export function createSnapshot(reason = 'manual') {
|
|
31
|
+
try {
|
|
32
|
+
const vaultDir = path.join(brainDir, 'memory-vault');
|
|
33
|
+
const snapshotsDir = getSnapshotsDir();
|
|
34
|
+
|
|
35
|
+
if (!fs.existsSync(vaultDir)) {
|
|
36
|
+
return { success: false, error: 'Vault directory does not exist.' };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
40
|
+
const shortId = crypto.randomBytes(3).toString('hex');
|
|
41
|
+
const snapshotId = `${timestamp}-${shortId}`;
|
|
42
|
+
const snapshotName = `vault-${snapshotId}.tar.gz`;
|
|
43
|
+
const destPath = path.join(snapshotsDir, snapshotName);
|
|
44
|
+
|
|
45
|
+
// Create the snapshot metadata
|
|
46
|
+
const metaPath = path.join(snapshotsDir, `vault-${snapshotId}.json`);
|
|
47
|
+
const metadata = {
|
|
48
|
+
snapshot_id: snapshotId,
|
|
49
|
+
created_at: new Date().toISOString(),
|
|
50
|
+
reason,
|
|
51
|
+
};
|
|
52
|
+
fs.writeFileSync(metaPath, JSON.stringify(metadata, null, 2));
|
|
53
|
+
|
|
54
|
+
// Tar the vault
|
|
55
|
+
// We use tar -C so the archive contains paths relative to memory-vault
|
|
56
|
+
const result = spawnSync('tar', ['-czf', destPath, '-C', vaultDir, '.'], { stdio: 'pipe' });
|
|
57
|
+
if (result.status !== 0) {
|
|
58
|
+
fs.unlinkSync(metaPath);
|
|
59
|
+
throw new Error(`tar failed: ${result.stderr.toString()}`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
logger.info('snapshot', `Created snapshot ${snapshotId} (${reason})`);
|
|
63
|
+
return { success: true, snapshot_id: snapshotId, path: destPath };
|
|
64
|
+
} catch (err) {
|
|
65
|
+
logger.error('snapshot', `Failed to create snapshot: ${err.message}`);
|
|
66
|
+
return { success: false, error: err.message };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* List all available snapshots, sorted newest first.
|
|
72
|
+
*/
|
|
73
|
+
export function listSnapshots() {
|
|
74
|
+
const snapshotsDir = getSnapshotsDir();
|
|
75
|
+
const files = fs.readdirSync(snapshotsDir);
|
|
76
|
+
const snapshots = [];
|
|
77
|
+
|
|
78
|
+
for (const file of files) {
|
|
79
|
+
if (file.endsWith('.json')) {
|
|
80
|
+
try {
|
|
81
|
+
const meta = JSON.parse(fs.readFileSync(path.join(snapshotsDir, file), 'utf8'));
|
|
82
|
+
const tarball = file.replace('.json', '.tar.gz');
|
|
83
|
+
if (fs.existsSync(path.join(snapshotsDir, tarball))) {
|
|
84
|
+
snapshots.push({ ...meta, file: tarball });
|
|
85
|
+
}
|
|
86
|
+
} catch { /* Ignore corrupted meta */ }
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return snapshots.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Rollback the memory vault to a specific snapshot.
|
|
95
|
+
*
|
|
96
|
+
* @param {string} snapshotId - The ID of the snapshot to restore.
|
|
97
|
+
* @returns {{ success: boolean, error?: string }}
|
|
98
|
+
*/
|
|
99
|
+
export function rollbackVault(snapshotId) {
|
|
100
|
+
try {
|
|
101
|
+
const vaultDir = path.join(brainDir, 'memory-vault');
|
|
102
|
+
const snapshotsDir = getSnapshotsDir();
|
|
103
|
+
|
|
104
|
+
const tarball = path.join(snapshotsDir, `vault-${snapshotId}.tar.gz`);
|
|
105
|
+
if (!fs.existsSync(tarball)) {
|
|
106
|
+
return { success: false, error: `Snapshot ${snapshotId} not found.` };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Safety measure: take a backup of the CURRENT state before destroying it
|
|
110
|
+
const preRollback = createSnapshot(`pre-rollback-to-${snapshotId}`);
|
|
111
|
+
if (!preRollback.success) {
|
|
112
|
+
return { success: false, error: `Failed to create pre-rollback safety snapshot: ${preRollback.error}` };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Purge current vault
|
|
116
|
+
if (fs.existsSync(vaultDir)) {
|
|
117
|
+
fs.rmSync(vaultDir, { recursive: true, force: true });
|
|
118
|
+
}
|
|
119
|
+
fs.mkdirSync(vaultDir, { recursive: true });
|
|
120
|
+
|
|
121
|
+
// Restore from tarball
|
|
122
|
+
const result = spawnSync('tar', ['-xzf', tarball, '-C', vaultDir], { stdio: 'pipe' });
|
|
123
|
+
if (result.status !== 0) {
|
|
124
|
+
throw new Error(`tar extraction failed: ${result.stderr.toString()}`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
logger.info('snapshot', `Rolled back to snapshot ${snapshotId}`);
|
|
128
|
+
return { success: true };
|
|
129
|
+
} catch (err) {
|
|
130
|
+
logger.error('snapshot', `Rollback failed: ${err.message}`);
|
|
131
|
+
return { success: false, error: err.message };
|
|
132
|
+
}
|
|
133
|
+
}
|