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.
Files changed (170) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -0
  3. package/bin/antigravity.mjs +212 -0
  4. package/bin/init.mjs +36 -0
  5. package/bin/oci-sniper.sh +69 -0
  6. package/bin/total-recall.mjs +229 -0
  7. package/docs/ARCHITECTURE.md +251 -0
  8. package/docs/IDE_INTEGRATION.md +112 -0
  9. package/package.json +71 -0
  10. package/scaffold/.agent/skills/total-recall/SKILL.md +195 -0
  11. package/scaffold/.agent/skills/total-recall/evals/evals.json +20 -0
  12. package/scaffold/.agent/skills/total-recall/memory-vault/concepts/cli-help-reference.md +145 -0
  13. package/scaffold/.agent/skills/total-recall/memory-vault/invariants/operating-instructions.md +75 -0
  14. package/scaffold/.agent/skills/total-recall/memory-vault/preferences/always-websearch-gap.md +16 -0
  15. package/scaffold/.agent/skills/total-recall/memory-vault/preferences/topic-research-sop.md +17 -0
  16. package/scaffold/.agent/skills/total-recall/references/api-reference.md +187 -0
  17. package/scaffold/.agent/skills/total-recall/references/architecture-reference.md +81 -0
  18. package/scaffold/.agent/skills/total-recall/references/cli-reference.md +103 -0
  19. package/scaffold/.agent/skills/total-recall/references/ssss-reference.md +88 -0
  20. package/scaffold/.agent/skills/total-recall/references/troubleshooting.md +68 -0
  21. package/scaffold/.agent/skills/total-recall/scripts/sync-repo.mjs +83 -0
  22. package/scaffold/.agent/skills/total-recall/skills/cli-agents/SKILL.md +122 -0
  23. package/scaffold/.agent/skills/total-recall/skills/cli-agents/agents.yml +27 -0
  24. package/scaffold/.agent/skills/total-recall/skills/cli-agents/references/antigravity.txt +20 -0
  25. package/scaffold/.agent/skills/total-recall/skills/cli-agents/references/claude.txt +58 -0
  26. package/scaffold/.agent/skills/total-recall/skills/cli-agents/references/codex.txt +81 -0
  27. package/scaffold/.agent/skills/total-recall/skills/cli-agents/references/gemini.txt +44 -0
  28. package/scaffold/.agent/skills/total-recall/skills/research/SKILL.md +337 -0
  29. package/scaffold/.agent/skills/total-recall/skills/skill/SKILL.md +281 -0
  30. package/scaffold/.agent/skills/total-recall/skills/skill/assets/skill-template/SKILL.md +20 -0
  31. package/scaffold/.agent/skills/total-recall/skills/skill/evals/evals.json +20 -0
  32. package/scaffold/.agent/skills/total-recall/skills/skill/hooks/on-skill-add.sh +14 -0
  33. package/scaffold/.agent/skills/total-recall/skills/skill/hooks/on-skill-delete.sh +14 -0
  34. package/scaffold/.agent/skills/total-recall/skills/skill/learnings/.gitkeep +0 -0
  35. package/scaffold/.agent/skills/total-recall/skills/skill/references/.gitkeep +0 -0
  36. package/scaffold/.agent/skills/total-recall/skills/skill/scripts/.gitkeep +0 -0
  37. package/scaffold/.agent/skills/total-recall/skills/skill/scripts/create-skill.sh +65 -0
  38. package/scaffold/.agent/skills/total-recall/skills/skill/scripts/enforce-skill-optimization.mjs +135 -0
  39. package/scaffold/.agent/skills/total-recall/skills/skill/scripts/find-skills.mjs +124 -0
  40. package/scaffold/.agent/skills/total-recall/skills/skill/scripts/scan-skill.mjs +207 -0
  41. package/scaffold/.agent/skills/total-recall/skills/skill/scripts/skill-watcher.mjs +64 -0
  42. package/scaffold/.agent/skills/total-recall/skills/skill/subagents/audit-all-skills.md +62 -0
  43. package/scaffold/.agent/skills/total-recall/skills/ssss/SKILL.md +27 -0
  44. package/scaffold/.agent/skills/total-recall/skills/ssss/evals/evals.json +17 -0
  45. package/scaffold/.agent/skills/total-recall/skills/ssss/references/ssss-spec.md +117 -0
  46. package/scaffold/.agent/skills/total-recall/skills/ssss/scripts/validate-schema.mjs +54 -0
  47. package/scaffold/.agent/skills/total-recall/skills/ssss/subagents/audit-ssss-node.md +9 -0
  48. package/scaffold/.agent/skills/total-recall/subagents/total-recall-diagnostician.md +13 -0
  49. package/src/cli/agent-dir.mjs +105 -0
  50. package/src/cli/backup.mjs +313 -0
  51. package/src/cli/brain.mjs +224 -0
  52. package/src/cli/chat.mjs +74 -0
  53. package/src/cli/config.mjs +247 -0
  54. package/src/cli/connect.mjs +872 -0
  55. package/src/cli/daemon.mjs +228 -0
  56. package/src/cli/deploy-ui.mjs +1793 -0
  57. package/src/cli/deploy.mjs +1726 -0
  58. package/src/cli/doctor.mjs +254 -0
  59. package/src/cli/dream.mjs +80 -0
  60. package/src/cli/forget.mjs +92 -0
  61. package/src/cli/friction.mjs +21 -0
  62. package/src/cli/generate-pat.mjs +65 -0
  63. package/src/cli/hash-password.mjs +22 -0
  64. package/src/cli/help.mjs +153 -0
  65. package/src/cli/import-rules.mjs +102 -0
  66. package/src/cli/ingest/index.mjs +318 -0
  67. package/src/cli/ingest/parsers/chrome-bookmarks.mjs +238 -0
  68. package/src/cli/ingest/parsers/google-keep.mjs +147 -0
  69. package/src/cli/ingest/parsers/search-history.mjs +142 -0
  70. package/src/cli/ingest/parsers/youtube-history.mjs +181 -0
  71. package/src/cli/ingest/utils/dedup.mjs +69 -0
  72. package/src/cli/ingest/utils/takeout-walker.mjs +101 -0
  73. package/src/cli/ingest.mjs +102 -0
  74. package/src/cli/init.mjs +736 -0
  75. package/src/cli/integration-dispatcher.mjs +128 -0
  76. package/src/cli/lint.mjs +166 -0
  77. package/src/cli/map.mjs +194 -0
  78. package/src/cli/migrate.mjs +87 -0
  79. package/src/cli/rebuild.mjs +88 -0
  80. package/src/cli/recall.mjs +219 -0
  81. package/src/cli/relay.mjs +518 -0
  82. package/src/cli/remember.mjs +306 -0
  83. package/src/cli/research.mjs +381 -0
  84. package/src/cli/reset-password.mjs +75 -0
  85. package/src/cli/restore.mjs +135 -0
  86. package/src/cli/setup.mjs +616 -0
  87. package/src/cli/share.mjs +180 -0
  88. package/src/cli/skill.mjs +313 -0
  89. package/src/cli/snapshot.mjs +108 -0
  90. package/src/cli/start.mjs +63 -0
  91. package/src/cli/status.mjs +296 -0
  92. package/src/cli/sync.mjs +383 -0
  93. package/src/cli/uninstall.mjs +613 -0
  94. package/src/cli/upgrade.mjs +141 -0
  95. package/src/cli/wizard.html +3682 -0
  96. package/src/core/blackboard.mjs +54 -0
  97. package/src/core/clarity-rewriter.mjs +770 -0
  98. package/src/core/conclusion-writer.mjs +259 -0
  99. package/src/core/config.mjs +277 -0
  100. package/src/core/conflict-detector.mjs +536 -0
  101. package/src/core/crypto.mjs +107 -0
  102. package/src/core/daemon-control.mjs +158 -0
  103. package/src/core/daemon-loop.mjs +364 -0
  104. package/src/core/dream.mjs +347 -0
  105. package/src/core/drift-detector.mjs +143 -0
  106. package/src/core/embeddings.mjs +632 -0
  107. package/src/core/emergency-alerts.mjs +137 -0
  108. package/src/core/evolution.mjs +107 -0
  109. package/src/core/fact-seeker.mjs +1602 -0
  110. package/src/core/friction.mjs +95 -0
  111. package/src/core/import-rules.mjs +308 -0
  112. package/src/core/inference-engine.mjs +367 -0
  113. package/src/core/logger.mjs +75 -0
  114. package/src/core/memory-layers.mjs +96 -0
  115. package/src/core/migrate.mjs +116 -0
  116. package/src/core/notifications.mjs +77 -0
  117. package/src/core/operation-validator.mjs +272 -0
  118. package/src/core/optimizer.mjs +330 -0
  119. package/src/core/pattern_detector.mjs +113 -0
  120. package/src/core/post-mortem.mjs +413 -0
  121. package/src/core/protect-instructions.mjs +148 -0
  122. package/src/core/quick-capture.mjs +145 -0
  123. package/src/core/research-queue.mjs +431 -0
  124. package/src/core/research.mjs +461 -0
  125. package/src/core/runtime.mjs +515 -0
  126. package/src/core/sandbox.mjs +163 -0
  127. package/src/core/scheduler.mjs +569 -0
  128. package/src/core/schema.mjs +333 -0
  129. package/src/core/search.mjs +219 -0
  130. package/src/core/semantic-index.mjs +276 -0
  131. package/src/core/session-watcher.mjs +850 -0
  132. package/src/core/snapshot.mjs +133 -0
  133. package/src/core/source-adapters.mjs +1038 -0
  134. package/src/core/steering.mjs +137 -0
  135. package/src/core/surface.mjs +444 -0
  136. package/src/core/task_runner.mjs +125 -0
  137. package/src/core/tts.mjs +142 -0
  138. package/src/core/usage-tracker.mjs +349 -0
  139. package/src/core/vault-cache.mjs +76 -0
  140. package/src/core/vault.mjs +273 -0
  141. package/src/core/watchdog.mjs +236 -0
  142. package/src/server/api.mjs +944 -0
  143. package/src/server/auth.mjs +410 -0
  144. package/src/server/index.mjs +868 -0
  145. package/src/server/keys.mjs +181 -0
  146. package/src/server/rest.mjs +1652 -0
  147. package/src/server/route-manifest.json +77 -0
  148. package/src/server/routes/_shared.mjs +93 -0
  149. package/src/server/routes/keys.mjs +55 -0
  150. package/src/server/routes/memory.mjs +249 -0
  151. package/src/server/routes/sessions.mjs +336 -0
  152. package/src/server/routes/share.mjs +138 -0
  153. package/src/server/tools.mjs +618 -0
  154. package/templates/Caddyfile +37 -0
  155. package/templates/com.totalrecall.backup.plist +42 -0
  156. package/templates/com.totalrecall.daemon.plist +40 -0
  157. package/templates/com.totalrecall.duckdns.plist +23 -0
  158. package/templates/com.totalrecall.server.plist +46 -0
  159. package/templates/default-config/budget.yml +6 -0
  160. package/templates/default-config/runtime.yml +11 -0
  161. package/templates/default-config/security.yml +53 -0
  162. package/templates/default-config/voice.yml +34 -0
  163. package/templates/obsidian-queries/conflicts.md +26 -0
  164. package/templates/obsidian-queries/daily.md +17 -0
  165. package/templates/obsidian-queries/index.md +38 -0
  166. package/templates/obsidian-queries/skills.md +14 -0
  167. package/templates/onboarding-interview.md +72 -0
  168. package/templates/skill_engineering.md +40 -0
  169. package/templates/total-recall-daemon.service +21 -0
  170. 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
+ }