@jungjaehoon/mama-os 0.77.0 → 0.78.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 (124) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +25 -10
  3. package/dist/api/security-events.d.ts.map +1 -1
  4. package/dist/api/security-events.js +10 -1
  5. package/dist/api/security-events.js.map +1 -1
  6. package/dist/api/viewer-server.d.ts +1 -0
  7. package/dist/api/viewer-server.d.ts.map +1 -1
  8. package/dist/api/viewer-server.js +34 -0
  9. package/dist/api/viewer-server.js.map +1 -1
  10. package/dist/api/work-actions.d.ts.map +1 -1
  11. package/dist/api/work-actions.js +27 -2
  12. package/dist/api/work-actions.js.map +1 -1
  13. package/dist/cli/commands/backfill.d.ts.map +1 -1
  14. package/dist/cli/commands/backfill.js +1 -0
  15. package/dist/cli/commands/backfill.js.map +1 -1
  16. package/dist/cli/commands/backup.d.ts +13 -0
  17. package/dist/cli/commands/backup.d.ts.map +1 -0
  18. package/dist/cli/commands/backup.js +137 -0
  19. package/dist/cli/commands/backup.js.map +1 -0
  20. package/dist/cli/commands/control.d.ts +26 -0
  21. package/dist/cli/commands/control.d.ts.map +1 -0
  22. package/dist/cli/commands/control.js +193 -0
  23. package/dist/cli/commands/control.js.map +1 -0
  24. package/dist/cli/commands/daemon.d.ts +49 -3
  25. package/dist/cli/commands/daemon.d.ts.map +1 -1
  26. package/dist/cli/commands/daemon.js +244 -74
  27. package/dist/cli/commands/daemon.js.map +1 -1
  28. package/dist/cli/commands/doctor.d.ts +13 -0
  29. package/dist/cli/commands/doctor.d.ts.map +1 -0
  30. package/dist/cli/commands/doctor.js +216 -0
  31. package/dist/cli/commands/doctor.js.map +1 -0
  32. package/dist/cli/commands/init.d.ts.map +1 -1
  33. package/dist/cli/commands/init.js +3 -2
  34. package/dist/cli/commands/init.js.map +1 -1
  35. package/dist/cli/commands/logs.d.ts +9 -0
  36. package/dist/cli/commands/logs.d.ts.map +1 -0
  37. package/dist/cli/commands/logs.js +109 -0
  38. package/dist/cli/commands/logs.js.map +1 -0
  39. package/dist/cli/commands/register-owner.d.ts.map +1 -1
  40. package/dist/cli/commands/register-owner.js +12 -0
  41. package/dist/cli/commands/register-owner.js.map +1 -1
  42. package/dist/cli/commands/restore.d.ts +14 -0
  43. package/dist/cli/commands/restore.d.ts.map +1 -0
  44. package/dist/cli/commands/restore.js +130 -0
  45. package/dist/cli/commands/restore.js.map +1 -0
  46. package/dist/cli/commands/service.d.ts +28 -0
  47. package/dist/cli/commands/service.d.ts.map +1 -0
  48. package/dist/cli/commands/service.js +278 -0
  49. package/dist/cli/commands/service.js.map +1 -0
  50. package/dist/cli/commands/uninstall.d.ts +7 -0
  51. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  52. package/dist/cli/commands/uninstall.js +262 -0
  53. package/dist/cli/commands/uninstall.js.map +1 -0
  54. package/dist/cli/index.js +67 -20
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/launch-files.d.ts +83 -0
  57. package/dist/cli/launch-files.d.ts.map +1 -1
  58. package/dist/cli/launch-files.js +231 -15
  59. package/dist/cli/launch-files.js.map +1 -1
  60. package/dist/cli/runtime/backend-probe.d.ts +34 -0
  61. package/dist/cli/runtime/backend-probe.d.ts.map +1 -0
  62. package/dist/cli/runtime/backend-probe.js +83 -0
  63. package/dist/cli/runtime/backend-probe.js.map +1 -0
  64. package/dist/cli/runtime/backup.d.ts +114 -0
  65. package/dist/cli/runtime/backup.d.ts.map +1 -0
  66. package/dist/cli/runtime/backup.js +564 -0
  67. package/dist/cli/runtime/backup.js.map +1 -0
  68. package/dist/cli/runtime/daemon-control.d.ts +84 -0
  69. package/dist/cli/runtime/daemon-control.d.ts.map +1 -0
  70. package/dist/cli/runtime/daemon-control.js +266 -0
  71. package/dist/cli/runtime/daemon-control.js.map +1 -0
  72. package/dist/cli/runtime/diagnostics.d.ts +43 -0
  73. package/dist/cli/runtime/diagnostics.d.ts.map +1 -0
  74. package/dist/cli/runtime/diagnostics.js +953 -0
  75. package/dist/cli/runtime/diagnostics.js.map +1 -0
  76. package/dist/cli/runtime/restore.d.ts +98 -0
  77. package/dist/cli/runtime/restore.d.ts.map +1 -0
  78. package/dist/cli/runtime/restore.js +756 -0
  79. package/dist/cli/runtime/restore.js.map +1 -0
  80. package/dist/cli/runtime/systemd-service.d.ts +13 -0
  81. package/dist/cli/runtime/systemd-service.d.ts.map +1 -0
  82. package/dist/cli/runtime/systemd-service.js +32 -0
  83. package/dist/cli/runtime/systemd-service.js.map +1 -0
  84. package/dist/connectors/chatwork/index.js +1 -1
  85. package/dist/connectors/chatwork/index.js.map +1 -1
  86. package/dist/connectors/config-loader.d.ts +2 -1
  87. package/dist/connectors/config-loader.d.ts.map +1 -1
  88. package/dist/connectors/config-loader.js +3 -2
  89. package/dist/connectors/config-loader.js.map +1 -1
  90. package/dist/connectors/framework/polling-scheduler.d.ts.map +1 -1
  91. package/dist/connectors/framework/polling-scheduler.js +12 -11
  92. package/dist/connectors/framework/polling-scheduler.js.map +1 -1
  93. package/dist/connectors/imessage/index.d.ts.map +1 -1
  94. package/dist/connectors/imessage/index.js +2 -1
  95. package/dist/connectors/imessage/index.js.map +1 -1
  96. package/dist/connectors/slack/index.js +1 -1
  97. package/dist/connectors/slack/index.js.map +1 -1
  98. package/dist/runtime/backend-security.d.ts +3 -0
  99. package/dist/runtime/backend-security.d.ts.map +1 -1
  100. package/dist/runtime/backend-security.js +13 -5
  101. package/dist/runtime/backend-security.js.map +1 -1
  102. package/dist/runtime/config.d.ts +3 -0
  103. package/dist/runtime/config.d.ts.map +1 -1
  104. package/dist/runtime/config.js +4 -4
  105. package/dist/runtime/config.js.map +1 -1
  106. package/dist/runtime/connectors.d.ts +21 -1
  107. package/dist/runtime/connectors.d.ts.map +1 -1
  108. package/dist/runtime/connectors.js +28 -17
  109. package/dist/runtime/connectors.js.map +1 -1
  110. package/dist/runtime/core-db.d.ts.map +1 -1
  111. package/dist/runtime/core-db.js +2 -0
  112. package/dist/runtime/core-db.js.map +1 -1
  113. package/dist/runtime/owner-system-prompt.d.ts.map +1 -1
  114. package/dist/runtime/owner-system-prompt.js +7 -5
  115. package/dist/runtime/owner-system-prompt.js.map +1 -1
  116. package/dist/runtime/rotating-log.d.ts +44 -0
  117. package/dist/runtime/rotating-log.d.ts.map +1 -0
  118. package/dist/runtime/rotating-log.js +124 -0
  119. package/dist/runtime/rotating-log.js.map +1 -0
  120. package/dist/tools/document-toolkit.d.ts +2 -0
  121. package/dist/tools/document-toolkit.d.ts.map +1 -1
  122. package/dist/tools/document-toolkit.js +2 -0
  123. package/dist/tools/document-toolkit.js.map +1 -1
  124. package/package.json +4 -3
@@ -0,0 +1,564 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.RUNTIME_FILES = exports.RUNTIME_DIRS = exports.ROOT_DIRS = exports.ROOT_FILES = void 0;
40
+ exports.secretShapedKeys = secretShapedKeys;
41
+ exports.planBackup = planBackup;
42
+ exports.collectEntries = collectEntries;
43
+ exports.copyDatabase = copyDatabase;
44
+ exports.checkDatabase = checkDatabase;
45
+ exports.rawStores = rawStores;
46
+ exports.writeArchive = writeArchive;
47
+ exports.syncPath = syncPath;
48
+ exports.verifyArchive = verifyArchive;
49
+ exports.archiveName = archiveName;
50
+ const node_crypto_1 = require("node:crypto");
51
+ const node_fs_1 = require("node:fs");
52
+ const node_path_1 = require("node:path");
53
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
54
+ const yaml = __importStar(require("js-yaml"));
55
+ const tar = __importStar(require("tar"));
56
+ const backend_security_js_1 = require("../../runtime/backend-security.js");
57
+ const launch_files_js_1 = require("../launch-files.js");
58
+ const daemon_js_1 = require("../commands/daemon.js");
59
+ /** runtime/ files the current code reads back; the rest of runtime/ is per boot or per run. */
60
+ /** Files directly in the MAMA root that a backup keeps; restore accepts no other root files. */
61
+ exports.ROOT_FILES = [
62
+ 'config.yaml',
63
+ 'connectors.json',
64
+ 'owner-policy.md',
65
+ 'report-slots.json',
66
+ 'start.sh',
67
+ ];
68
+ /** Folders in the MAMA root that a backup keeps (logs only when asked), besides the workspace. */
69
+ exports.ROOT_DIRS = ['connectors', 'downloads', 'runtime', 'logs'];
70
+ /** Folders in runtime/ that a backup keeps. */
71
+ exports.RUNTIME_DIRS = ['backfill'];
72
+ exports.RUNTIME_FILES = new Set([
73
+ 'owner-message-ledger.json',
74
+ 'report-schedule-state.json',
75
+ 'client-journal.jsonl',
76
+ 'september-import-manifest.json',
77
+ 'september-replay-cursor.json',
78
+ 'september-replay-ledger.jsonl',
79
+ ]);
80
+ /** Written per boot or per turn: never archived. */
81
+ const EPHEMERAL_NAMES = new Set(['session-credential', 'web-fetch-turn.json']);
82
+ /**
83
+ * Backend homes and their session stores. Sessions are a cache that MAMA starts again (a thread it
84
+ * cannot resume is a new one), and these folders also hold the backends' logins and the logins an
85
+ * agent makes in its shell, so they stay out; the owner's Codex login is a credential on its own.
86
+ */
87
+ const BACKEND_STATE = new Set(['.codex', 'codex-runtime']);
88
+ /** Re-created at boot. */
89
+ const REBUILT_AT_BOOT = new Set(['.empty-plugins']);
90
+ const SECRET_NAME = /(^|[_-])(token|secret|password|passwd|credential|credentials|api[_-]?key|app[_-]?key|private[_-]?key)s?($|[_-])/i;
91
+ /** A name that holds where a secret lives, or what it is called, not the secret. */
92
+ const SECRET_REFERENCE = /(path|file|dir|name)$/i;
93
+ function physical(path) {
94
+ const absolute = (0, node_path_1.resolve)(path);
95
+ return (0, node_fs_1.existsSync)(absolute) ? (0, node_fs_1.realpathSync)(absolute) : absolute;
96
+ }
97
+ function inside(parent, child) {
98
+ const path = (0, node_path_1.relative)(parent, child);
99
+ return path === '' || (path !== '..' && !path.startsWith(`..${node_path_1.sep}`) && !path.startsWith(node_path_1.sep));
100
+ }
101
+ /** Setting paths whose string value sits under a credential name. Values are never read out. */
102
+ function secretShapedKeys(value) {
103
+ const found = [];
104
+ const visit = (node, path) => {
105
+ if (Array.isArray(node)) {
106
+ node.forEach((item, index) => visit(item, [...path, String(index)]));
107
+ }
108
+ else if (node !== null && typeof node === 'object') {
109
+ for (const [key, child] of Object.entries(node)) {
110
+ const secret = SECRET_NAME.test(key) && !SECRET_REFERENCE.test(key);
111
+ if (typeof child === 'string' && child.trim() !== '' && secret) {
112
+ found.push([...path, key].join('.'));
113
+ }
114
+ else {
115
+ visit(child, [...path, key]);
116
+ }
117
+ }
118
+ }
119
+ };
120
+ visit(value, []);
121
+ return found;
122
+ }
123
+ function readStructured(path) {
124
+ const text = (0, node_fs_1.readFileSync)(path, 'utf8');
125
+ try {
126
+ return path.endsWith('.json') ? JSON.parse(text) : yaml.load(text);
127
+ }
128
+ catch {
129
+ // Parser messages quote the file, which can hold a credential.
130
+ throw new Error(`${path} cannot be parsed`);
131
+ }
132
+ }
133
+ function relativeName(root, path) {
134
+ return inside(root, path) ? (0, node_path_1.relative)(root, path) : path;
135
+ }
136
+ function both(path) {
137
+ return { configured: (0, node_path_1.resolve)(path), physical: physical(path) };
138
+ }
139
+ /**
140
+ * What a backup holds, from what the current code reads and writes (not from what a root happens
141
+ * to contain): the MAMA root's state, the database, the workspace, every person's tree under
142
+ * member_root, the published common skills, the wiki MAMA writes and Jev's vocabulary.
143
+ * Credentials, and any file that can hold one, come only with `includeSecrets`; logs only with
144
+ * `includeLogs`.
145
+ */
146
+ function planBackup(config, configPath, options) {
147
+ const paths = (0, daemon_js_1.pathsFor)(configPath, config);
148
+ const root = physical(paths.mamaRoot);
149
+ const workspace = physical(paths.workspaceDir);
150
+ const database = (0, node_path_1.resolve)(config.database.path);
151
+ const configured = {
152
+ home: both(options.home),
153
+ root: both(paths.mamaRoot),
154
+ workspace: both(paths.workspaceDir),
155
+ database: both(database),
156
+ member_root: config.member_root ? both(config.member_root) : null,
157
+ tools_root: config.tools_root ? both(config.tools_root) : null,
158
+ codex_home: both(config.agent.codex_home ?? (0, node_path_1.join)(paths.mamaRoot, '.codex')),
159
+ mcp_config: both(paths.mcpConfigPath),
160
+ log_file: both(config.logging.file),
161
+ jev_vocab: both(config.jev.vocabFile),
162
+ jev_key: both(config.jev.keyFile),
163
+ wiki: config.wiki?.enabled && config.wiki.vaultPath && config.wiki.wikiDir
164
+ ? both((0, node_path_1.resolve)(config.wiki.vaultPath, config.wiki.wikiDir))
165
+ : null,
166
+ };
167
+ const at = (key) => configured[key];
168
+ // Files that are, or can hold, credentials: archived on their own, only when asked. The MCP
169
+ // configuration lists servers besides MAMA's own (which boot writes again), with their keys.
170
+ const credentials = [
171
+ ['credentials/auth.env', both((0, node_path_1.join)(paths.mamaRoot, 'auth.env'))],
172
+ ['credentials/jev-key', at('jev_key')],
173
+ ['credentials/codex-auth.json', both((0, node_path_1.join)(at('codex_home').configured, 'auth.json'))],
174
+ ['credentials/mcp-config.json', at('mcp_config')],
175
+ ];
176
+ const secretsLeftOut = [];
177
+ if (!options.includeSecrets) {
178
+ for (const [prefix, path] of credentials) {
179
+ if (!(0, node_fs_1.existsSync)(path.physical))
180
+ continue;
181
+ if (prefix !== 'credentials/mcp-config.json') {
182
+ secretsLeftOut.push(relativeName(root, path.physical));
183
+ }
184
+ else if (Object.keys(mcpServers(path.physical)).some((name) => name !== 'mama')) {
185
+ secretsLeftOut.push(`${relativeName(root, path.physical)} (servers besides MAMA's)`);
186
+ }
187
+ }
188
+ }
189
+ // Files MAMA keeps that can carry a credential: archived only when they hold none.
190
+ const scanned = [
191
+ [physical(configPath), (path) => secretShapedKeys(readStructured(path))],
192
+ [(0, node_path_1.join)(root, 'connectors.json'), (path) => secretShapedKeys(readStructured(path))],
193
+ [
194
+ (0, node_path_1.join)(root, 'start.sh'),
195
+ (path) => {
196
+ const reading = (0, launch_files_js_1.readStartScript)((0, node_fs_1.readFileSync)(path, 'utf8'), options.home);
197
+ // Exported or assigned under the script's set -a, a credential reaches the daemon.
198
+ return [...reading.carried, ...reading.notReproduced]
199
+ .map((line) => /^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)=/.exec(line)?.[1] ?? '')
200
+ .filter((name) => name !== '' && (0, backend_security_js_1.isCredentialEnvName)(name));
201
+ },
202
+ ],
203
+ ];
204
+ const withheldFiles = new Set();
205
+ if (!options.includeSecrets) {
206
+ for (const [path, holds] of scanned) {
207
+ if ((0, node_fs_1.existsSync)(path) && holds(path).length > 0) {
208
+ withheldFiles.add(path);
209
+ secretsLeftOut.push(`${relativeName(root, path)} (it holds a credential)`);
210
+ }
211
+ }
212
+ }
213
+ // Archived on their own, or not at all: every tree leaves them out, as linked or as named.
214
+ const separate = new Set([
215
+ ...['', '-wal', '-shm', '-journal'].map((end) => both(database + end)),
216
+ ...credentials.map(([, path]) => path),
217
+ at('jev_vocab'),
218
+ at('log_file'),
219
+ // The wiki goes on its own, so a restore puts it where that install keeps its wiki.
220
+ ...(configured.wiki ? [configured.wiki] : []),
221
+ ].flatMap((path) => [path.configured, path.physical]));
222
+ for (const path of withheldFiles)
223
+ separate.add(path);
224
+ const common = (absolute, stat) => {
225
+ if (!stat.isFile() && !stat.isDirectory() && !stat.isSymbolicLink())
226
+ return false;
227
+ if (separate.has(absolute))
228
+ return false;
229
+ const name = absolute.slice(absolute.lastIndexOf(node_path_1.sep) + 1);
230
+ if (stat.isDirectory() && (name === '.tmp' || BACKEND_STATE.has(name)))
231
+ return false;
232
+ // SQLite rebuilds a shared-memory file; a check that opens the database rewrites it.
233
+ if (EPHEMERAL_NAMES.has(name) || name.endsWith('-shm'))
234
+ return false;
235
+ if (name === '.credentials.json' && !options.includeSecrets)
236
+ return false;
237
+ return true;
238
+ };
239
+ const workspaceTop = inside(root, workspace) && (0, node_path_1.relative)(root, workspace).split(node_path_1.sep).length === 1
240
+ ? (0, node_path_1.relative)(root, workspace)
241
+ : null;
242
+ const rootFiles = new Set(exports.ROOT_FILES);
243
+ const rootDirs = new Set([
244
+ ...exports.ROOT_DIRS.filter((name) => name !== 'logs' || options.includeLogs),
245
+ ...(workspaceTop ? [workspaceTop] : []),
246
+ ]);
247
+ // A kept file or folder that is a link would be archived as the link alone.
248
+ const links = [
249
+ // Only what the walk keeps: logs/ without --logs is never read, linked or not.
250
+ ...[...rootFiles, ...rootDirs]
251
+ .filter((name) => name !== workspaceTop)
252
+ .map((name) => (0, node_path_1.join)(root, name)),
253
+ ...((0, node_fs_1.existsSync)((0, node_path_1.join)(root, 'connectors'))
254
+ ? (0, node_fs_1.readdirSync)((0, node_path_1.join)(root, 'connectors')).map((name) => (0, node_path_1.join)(root, 'connectors', name))
255
+ : []),
256
+ ].filter((path) => (0, node_fs_1.existsSync)(path) && (0, node_fs_1.lstatSync)(path).isSymbolicLink());
257
+ if (links.length > 0) {
258
+ throw new Error(`${links.join(', ')} ${links.length === 1 ? 'is a symlink' : 'are symlinks'}; a backup would hold the link, not what it names`);
259
+ }
260
+ const keptByRoot = (relativePath) => {
261
+ const [top, ...rest] = relativePath.split(node_path_1.sep);
262
+ if (rest.length === 0)
263
+ return rootFiles.has(top) || rootDirs.has(top);
264
+ if (!rootDirs.has(top))
265
+ return false;
266
+ if (top !== 'runtime')
267
+ return true;
268
+ return (exports.RUNTIME_DIRS.includes(rest[0]) ||
269
+ (rest.length === 1 && exports.RUNTIME_FILES.has(rest[0])));
270
+ };
271
+ const keepRoot = (relativePath, stat) => relativePath === '' || (keptByRoot(relativePath) && common((0, node_path_1.join)(root, relativePath), stat));
272
+ const sources = [{ prefix: 'root', path: root, keep: keepRoot }];
273
+ const add = (prefix, path, keep = common) => {
274
+ if (path === null || !(0, node_fs_1.existsSync)(path))
275
+ return;
276
+ sources.push({
277
+ prefix,
278
+ path,
279
+ // A source's own root is what it archives, even when other trees leave it out.
280
+ keep: (relativePath, stat) => relativePath === ''
281
+ ? stat.isDirectory() || stat.isFile()
282
+ : keep((0, node_path_1.join)(path, relativePath), stat),
283
+ });
284
+ };
285
+ // A workspace kept elsewhere is archived where it really is.
286
+ if (!workspaceTop)
287
+ add('workspace', workspace);
288
+ add('members', configured.member_root?.physical ?? null);
289
+ // The toolkit is rebuilt by mama tools install; the published skills are not.
290
+ add('skills', configured.tools_root ? (0, node_path_1.join)(configured.tools_root.physical, 'skills') : null);
291
+ // A tree walks a path only when no folder on the way is one the trees leave out.
292
+ const kept = (parent, path) => (0, node_path_1.relative)(parent, path)
293
+ .split(node_path_1.sep)
294
+ .every((name) => name !== '.tmp' && !BACKEND_STATE.has(name));
295
+ if (configured.wiki)
296
+ add('wiki', configured.wiki.physical);
297
+ // Each tree goes back to its own root, so none may sit inside another one's kept part.
298
+ for (const outer of sources) {
299
+ for (const inner of sources) {
300
+ if (inner === outer || !inside(outer.path, inner.path))
301
+ continue;
302
+ // Left out of the outer walk, and archived on its own.
303
+ if (separate.has(inner.path))
304
+ continue;
305
+ if (!kept(outer.path, inner.path))
306
+ continue;
307
+ if (outer.prefix === 'root' && !keptByRoot((0, node_path_1.relative)(root, inner.path)))
308
+ continue;
309
+ throw new Error(`${inner.path} sits inside ${outer.path}; a backup needs them apart`);
310
+ }
311
+ }
312
+ add('jev-vocab', at('jev_vocab').physical, () => true);
313
+ if (options.includeLogs)
314
+ add('log-file', at('log_file').physical, () => true);
315
+ if (options.includeSecrets) {
316
+ for (const [prefix, path] of credentials)
317
+ add(prefix, path.physical, () => true);
318
+ }
319
+ const leftOut = (0, node_fs_1.readdirSync)(root)
320
+ .filter((name) => !keptByRoot(name) && name !== 'backups' && !REBUILT_AT_BOOT.has(name))
321
+ .filter((name) => name !== 'logs' && !BACKEND_STATE.has(name))
322
+ .filter((name) => !separate.has((0, node_path_1.join)(root, name)))
323
+ .filter((name) => physical((0, node_path_1.join)(root, name)) !== workspace)
324
+ .filter((name) => sources.every((source) => source.prefix === 'root' || source.path !== physical((0, node_path_1.join)(root, name))))
325
+ .filter((name) => {
326
+ const stat = (0, node_fs_1.lstatSync)((0, node_path_1.join)(root, name));
327
+ return stat.isFile() || stat.isDirectory() || stat.isSymbolicLink();
328
+ })
329
+ .sort();
330
+ return { sources, database, configured, leftOut, secretsLeftOut };
331
+ }
332
+ /** The MCP configuration's servers by name; an unreadable file is reported, not guessed. */
333
+ function mcpServers(path) {
334
+ const value = readStructured(path);
335
+ const servers = value?.mcpServers;
336
+ return servers && typeof servers === 'object' && !Array.isArray(servers)
337
+ ? servers
338
+ : {};
339
+ }
340
+ function hashFile(path) {
341
+ return new Promise((resolvePromise, reject) => {
342
+ const hash = (0, node_crypto_1.createHash)('sha256');
343
+ (0, node_fs_1.createReadStream)(path)
344
+ .on('data', (chunk) => hash.update(chunk))
345
+ .on('end', () => resolvePromise(hash.digest('hex')))
346
+ .on('error', reject);
347
+ });
348
+ }
349
+ /**
350
+ * The entries each source keeps, in the order tar will write them. A path reached twice (through
351
+ * overlapping sources) is kept once, under the first source that reached it.
352
+ */
353
+ async function collectEntries(sources) {
354
+ const entries = [];
355
+ const absolutes = [];
356
+ const seen = new Set();
357
+ const visit = async (source, relativePath) => {
358
+ const absolute = relativePath === '' ? source.path : (0, node_path_1.join)(source.path, relativePath);
359
+ if (seen.has(absolute))
360
+ return;
361
+ const stat = (0, node_fs_1.lstatSync)(absolute);
362
+ if (!source.keep(relativePath, stat))
363
+ return;
364
+ seen.add(absolute);
365
+ const path = relativePath === '' ? source.prefix : `${source.prefix}/${relativePath.split(node_path_1.sep).join('/')}`;
366
+ const mode = stat.mode & 0o7777;
367
+ absolutes.push(absolute);
368
+ if (stat.isSymbolicLink()) {
369
+ entries.push({ path, type: 'symlink', mode, target: (0, node_fs_1.readlinkSync)(absolute) });
370
+ }
371
+ else if (stat.isDirectory()) {
372
+ entries.push({ path, type: 'dir', mode });
373
+ for (const name of (0, node_fs_1.readdirSync)(absolute).sort()) {
374
+ await visit(source, relativePath === '' ? name : (0, node_path_1.join)(relativePath, name));
375
+ }
376
+ }
377
+ else {
378
+ entries.push({
379
+ path,
380
+ type: 'file',
381
+ mode,
382
+ size: stat.size,
383
+ sha256: await hashFile(absolute),
384
+ });
385
+ }
386
+ };
387
+ for (const source of sources)
388
+ await visit(source, '');
389
+ return { entries, absolutes };
390
+ }
391
+ /** Copy a SQLite database with its backup API and confirm the copy with integrity_check. */
392
+ async function copyDatabase(source, destination) {
393
+ const db = new better_sqlite3_1.default(source, { readonly: true, fileMustExist: true });
394
+ try {
395
+ await db.backup(destination);
396
+ }
397
+ finally {
398
+ db.close();
399
+ }
400
+ return checkDatabase(destination);
401
+ }
402
+ /**
403
+ * integrity_check must answer ok. For MAMA's main database, also read the highest applied
404
+ * migration; another database's tables are its own.
405
+ */
406
+ function checkDatabase(path, options = { schema: true }) {
407
+ let db;
408
+ try {
409
+ db = new better_sqlite3_1.default(path, { readonly: true, fileMustExist: true });
410
+ }
411
+ catch (error) {
412
+ // A rollback journal left by a crash needs a writer to roll it back first.
413
+ throw new Error(`${path} cannot be opened to check it (${error instanceof Error ? error.message : String(error)}); start and stop MAMA once so it recovers, then back up again`);
414
+ }
415
+ try {
416
+ const result = db.pragma('integrity_check', { simple: true });
417
+ if (result !== 'ok')
418
+ throw new Error(`${path} failed integrity_check: ${String(result)}`);
419
+ if (!options.schema)
420
+ return { schemaVersion: null };
421
+ const table = db
422
+ .prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'schema_version'")
423
+ .get();
424
+ if (!table)
425
+ return { schemaVersion: null };
426
+ const row = db.prepare('SELECT MAX(version) AS version FROM schema_version').get();
427
+ return { schemaVersion: row.version };
428
+ }
429
+ finally {
430
+ db.close();
431
+ }
432
+ }
433
+ /** The raw stores under connectors/: MAMA's own databases besides the main one. */
434
+ function rawStores(root) {
435
+ const connectors = (0, node_path_1.join)(physical(root), 'connectors');
436
+ if (!(0, node_fs_1.existsSync)(connectors))
437
+ return [];
438
+ return (0, node_fs_1.readdirSync)(connectors)
439
+ .map((name) => (0, node_path_1.join)(connectors, name, 'raw.db'))
440
+ .filter((path) => (0, node_fs_1.existsSync)(path) && (0, node_fs_1.lstatSync)(path).isFile());
441
+ }
442
+ /** tar's hard-link cache, told nothing: every name is stored whole, as the manifest lists it. */
443
+ class NoLinks extends Map {
444
+ get() {
445
+ return undefined;
446
+ }
447
+ }
448
+ /**
449
+ * Write exactly the collected entries, manifest first, each under its archive name, with modes
450
+ * and symlinks as they are. The file is created 0600 and flushed to disk before it returns.
451
+ */
452
+ async function writeArchive(file, manifestPath, collected) {
453
+ const names = new Map([[manifestPath, 'manifest.json']]);
454
+ collected.absolutes.forEach((absolute, index) => names.set(absolute, collected.entries[index].path));
455
+ (0, node_fs_1.closeSync)((0, node_fs_1.openSync)(file, 'wx', 0o600));
456
+ await tar.c({
457
+ file,
458
+ gzip: true,
459
+ preservePaths: true,
460
+ noDirRecurse: true,
461
+ linkCache: new NoLinks(),
462
+ onWriteEntry: (entry) => {
463
+ const directory = entry.path.endsWith('/');
464
+ const name = names.get(directory ? entry.path.slice(0, -1) : entry.path);
465
+ if (name === undefined) {
466
+ throw new Error(`tar reached ${entry.path}, which was not collected`);
467
+ }
468
+ entry.path = directory ? `${name}/` : name;
469
+ },
470
+ }, [manifestPath, ...collected.absolutes]);
471
+ syncPath(file);
472
+ }
473
+ /** Flush a file or a folder's entries to disk. */
474
+ function syncPath(path) {
475
+ const fd = (0, node_fs_1.openSync)(path, 'r');
476
+ try {
477
+ (0, node_fs_1.fsyncSync)(fd);
478
+ }
479
+ finally {
480
+ (0, node_fs_1.closeSync)(fd);
481
+ }
482
+ }
483
+ /**
484
+ * Read the archive back: the manifest comes first, every entry it lists is there once with its
485
+ * type and link target, nothing else is, and every file hashes to what the manifest recorded.
486
+ */
487
+ async function verifyArchive(file, manifest) {
488
+ const expected = new Map(manifest.entries.map((entry) => [entry.path, entry]));
489
+ const seen = new Set();
490
+ const pending = [];
491
+ let first = null;
492
+ const problems = [];
493
+ await tar.t({
494
+ file,
495
+ onReadEntry: (entry) => {
496
+ const path = entry.path.replace(/\/+$/, '');
497
+ const isFirst = first === null;
498
+ first ??= path;
499
+ if (isFirst && path === 'manifest.json') {
500
+ entry.resume();
501
+ return;
502
+ }
503
+ const want = expected.get(path);
504
+ if (!want || seen.has(path)) {
505
+ problems.push(want ? `${path} appears twice` : `${path} is not in the manifest`);
506
+ entry.resume();
507
+ return;
508
+ }
509
+ seen.add(path);
510
+ const type = entry.type === 'Directory'
511
+ ? 'dir'
512
+ : entry.type === 'SymbolicLink'
513
+ ? 'symlink'
514
+ : entry.type === 'File' || entry.type === 'OldFile'
515
+ ? 'file'
516
+ : String(entry.type);
517
+ if (type !== want.type)
518
+ problems.push(`${path} is a ${type}, not a ${want.type}`);
519
+ // tar writes a file's mode as it is and makes a readable folder listable.
520
+ const mode = (entry.mode ?? 0) & 0o7777;
521
+ if (type === 'file' && mode !== want.mode)
522
+ problems.push(`${path} has another mode`);
523
+ if (type === 'dir' && mode !== listable(want.mode))
524
+ problems.push(`${path} has another mode`);
525
+ if (type === 'symlink' && entry.linkpath !== want.target) {
526
+ problems.push(`${path} links elsewhere`);
527
+ }
528
+ if (type !== 'file') {
529
+ entry.resume();
530
+ return;
531
+ }
532
+ const hash = (0, node_crypto_1.createHash)('sha256');
533
+ pending.push(new Promise((resolvePromise) => {
534
+ entry.on('data', (chunk) => hash.update(chunk));
535
+ entry.on('end', () => {
536
+ if (hash.digest('hex') !== want.sha256)
537
+ problems.push(`${path} changed while archived`);
538
+ resolvePromise();
539
+ });
540
+ }));
541
+ },
542
+ });
543
+ await Promise.all(pending);
544
+ if (first !== 'manifest.json')
545
+ problems.push('the manifest is not the first entry');
546
+ for (const path of expected.keys())
547
+ if (!seen.has(path))
548
+ problems.push(`${path} is missing`);
549
+ for (const path of manifest.databases) {
550
+ if (expected.get(path)?.type !== 'file')
551
+ problems.push(`database ${path} is not a file entry`);
552
+ }
553
+ if (problems.length > 0) {
554
+ throw new Error(`the archive does not match its manifest (${problems.length} difference(s): ${problems.slice(0, 5).join('; ')})`);
555
+ }
556
+ }
557
+ function listable(mode) {
558
+ return mode | (mode & 0o400 ? 0o100 : 0) | (mode & 0o40 ? 0o10 : 0) | (mode & 0o4 ? 0o1 : 0);
559
+ }
560
+ function archiveName(now) {
561
+ const stamp = now.toISOString().replace(/[-:]/g, '').replace(/\..*$/, '').replace('T', '-');
562
+ return `mama-backup-${stamp}.tar.gz`;
563
+ }
564
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../src/cli/runtime/backup.ts"],"names":[],"mappings":"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"}