@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,262 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runUninstall = runUninstall;
7
+ /**
8
+ * `mama uninstall [--dry-run] [--data [--toolkit]]`: stop MAMA and remove its service. With
9
+ * --data, once the MAMA home's path has been typed back, also remove what MAMA created: the MAMA
10
+ * home, the folder of each person it registered under `member_root` (and the folders it retired),
11
+ * and the common skills under `tools_root` (with --toolkit, the toolkit's versions too). A folder
12
+ * MAMA did not create is never removed whole: `member_root` and `tools_root` go only once empty, so
13
+ * a misconfigured root (a volume, a shared folder) loses nothing but MAMA's own entries.
14
+ * `--dry-run` lists what would go and what stays, and changes nothing. The program itself is an npm
15
+ * package, which npm removes.
16
+ */
17
+ const node_fs_1 = require("node:fs");
18
+ const node_os_1 = require("node:os");
19
+ const node_path_1 = require("node:path");
20
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
21
+ const config_js_1 = require("../../runtime/config.js");
22
+ const backend_security_js_1 = require("../../runtime/backend-security.js");
23
+ const member_paths_js_1 = require("../../runtime/member-paths.js");
24
+ const document_toolkit_js_1 = require("../../tools/document-toolkit.js");
25
+ const prompt_js_1 = require("../prompt.js");
26
+ const daemon_control_js_1 = require("../runtime/daemon-control.js");
27
+ const control_js_1 = require("./control.js");
28
+ const service_js_1 = require("./service.js");
29
+ const USAGE = 'Usage: mama uninstall [--dry-run] [--data [--toolkit]]';
30
+ const PRINCIPAL_ID = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
31
+ function parseArgs(args) {
32
+ const flags = new Set(args);
33
+ for (const arg of flags) {
34
+ if (!['--dry-run', '--data', '--toolkit'].includes(arg))
35
+ throw new prompt_js_1.CliInputError(USAGE);
36
+ }
37
+ if (flags.has('--toolkit') && !flags.has('--data'))
38
+ throw new prompt_js_1.CliInputError(USAGE);
39
+ return {
40
+ dryRun: flags.has('--dry-run'),
41
+ data: flags.has('--data'),
42
+ toolkit: flags.has('--toolkit'),
43
+ };
44
+ }
45
+ /** Bytes under a path, links counted as themselves; null when part of it cannot be read. */
46
+ function sizeOf(path) {
47
+ try {
48
+ const stat = (0, node_fs_1.lstatSync)(path);
49
+ if (!stat.isDirectory())
50
+ return stat.size;
51
+ let sum = 0;
52
+ for (const name of (0, node_fs_1.readdirSync)(path)) {
53
+ const size = sizeOf((0, node_path_1.join)(path, name));
54
+ if (size === null)
55
+ return null;
56
+ sum += size;
57
+ }
58
+ return sum;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ function sized(path) {
65
+ const bytes = sizeOf(path);
66
+ return bytes === null
67
+ ? 'size unknown: part of it cannot be read'
68
+ : `${(bytes / 1024 / 1024).toFixed(1)} MB`;
69
+ }
70
+ /** Inside `parent`, or `parent` itself, by physical path (real case, links resolved). */
71
+ function within(parent, child) {
72
+ const path = (0, node_path_1.relative)((0, backend_security_js_1.physicalReadPath)(parent), (0, backend_security_js_1.physicalReadPath)(child));
73
+ return path === '' || (path !== '..' && !path.startsWith(`..${node_path_1.sep}`));
74
+ }
75
+ /** The ids of the people MAMA registered, from its own database. */
76
+ function registeredPeople(config) {
77
+ if (!(0, node_fs_1.existsSync)(config.database.path))
78
+ return [];
79
+ const db = new better_sqlite3_1.default(config.database.path, { readonly: true, fileMustExist: true });
80
+ try {
81
+ return db.prepare('SELECT principal_id FROM principals').all()
82
+ .map((row) => row.principal_id)
83
+ .filter((id) => PRINCIPAL_ID.test(id));
84
+ }
85
+ finally {
86
+ db.close();
87
+ }
88
+ }
89
+ /**
90
+ * What --data removes. The MAMA home goes whole, and is refused when it is a link or when it is the
91
+ * filesystem root, HOME or a folder holding HOME (compared by physical path, so a different letter
92
+ * case on a case-insensitive disk is the same folder). Under member_root and tools_root only the
93
+ * entries MAMA creates go.
94
+ */
95
+ function dataPlan(home, configPath, toolkit) {
96
+ const root = (0, node_path_1.dirname)(configPath);
97
+ const plan = { root, remove: [], emptied: [], stays: [] };
98
+ if (!(0, node_fs_1.existsSync)(root))
99
+ return plan;
100
+ if ((0, node_fs_1.lstatSync)(root).isSymbolicLink()) {
101
+ throw new prompt_js_1.CliInputError(`${root} is a link; remove its target, or the link, yourself`);
102
+ }
103
+ if (within((0, backend_security_js_1.physicalReadPath)(root), home) || (0, backend_security_js_1.physicalReadPath)(root) === node_path_1.sep) {
104
+ throw new prompt_js_1.CliInputError(`refusing to remove ${root}: it is the filesystem root, your home or a folder that holds it`);
105
+ }
106
+ if ((0, node_fs_1.existsSync)(configPath)) {
107
+ const config = (0, config_js_1.loadConfig)({ home, path: configPath });
108
+ if (config.member_root !== undefined && (0, node_fs_1.existsSync)(config.member_root)) {
109
+ for (const id of registeredPeople(config)) {
110
+ const folder = (0, node_path_1.join)(config.member_root, id);
111
+ if ((0, node_fs_1.existsSync)(folder))
112
+ plan.remove.push({ path: folder, what: `${id}'s workspace and state` });
113
+ for (const temp of [(0, member_paths_js_1.memberClaudeTmpDir)(id), (0, member_paths_js_1.memberRoomTmpRoot)(id)]) {
114
+ if ((0, node_fs_1.existsSync)(temp))
115
+ plan.remove.push({ path: temp, what: `${id}'s temporary files` });
116
+ }
117
+ }
118
+ for (const entry of (0, node_fs_1.readdirSync)(config.member_root)) {
119
+ if (entry.startsWith('.retired-')) {
120
+ plan.remove.push({ path: (0, node_path_1.join)(config.member_root, entry), what: 'a retired folder' });
121
+ }
122
+ }
123
+ plan.emptied.push(config.member_root);
124
+ }
125
+ if (config.tools_root !== undefined && (0, node_fs_1.existsSync)(config.tools_root)) {
126
+ for (const entry of (0, node_fs_1.readdirSync)(config.tools_root)) {
127
+ const path = (0, node_path_1.join)(config.tools_root, entry);
128
+ if (entry === 'skills') {
129
+ plan.remove.push({ path, what: 'the common skills' });
130
+ }
131
+ else if (!toolkit) {
132
+ continue;
133
+ }
134
+ else if (entry.startsWith('v-')) {
135
+ plan.remove.push({ path, what: 'a document toolkit version', remove: document_toolkit_js_1.removeVersion });
136
+ }
137
+ else if (entry === 'current' ||
138
+ entry.startsWith('.current-') ||
139
+ entry === '.leases' ||
140
+ entry === '.mama-document-toolkit') {
141
+ plan.remove.push({ path, what: 'the document toolkit' });
142
+ }
143
+ else if (entry === 'apps' || entry === 'fonts') {
144
+ // Homebrew installed these casks into tools_root and keeps their records.
145
+ const casks = entry === 'apps' ? 'libreoffice' : 'font-noto-sans-cjk font-noto-serif-cjk';
146
+ plan.stays.push({ path, what: `installed by Homebrew: brew uninstall --cask ${casks}` });
147
+ }
148
+ }
149
+ if (toolkit)
150
+ plan.emptied.push(config.tools_root);
151
+ }
152
+ // Settings can point outside the MAMA home; such a path is not proven to be MAMA's alone.
153
+ const elsewhere = [
154
+ { path: config.database.path, what: 'the database' },
155
+ { path: config.logging.file, what: 'the daemon log' },
156
+ { path: config.agent.codex_home ?? (0, node_path_1.join)(root, '.codex'), what: 'the Codex home' },
157
+ { path: config.jev.keyFile, what: 'the Jev key' },
158
+ { path: config.jev.vocabFile, what: "Jev's vocabulary" },
159
+ ...(config.agent.codex_cwd
160
+ ? [{ path: config.agent.codex_cwd, what: 'the Codex workspace' }]
161
+ : []),
162
+ ...(config.agent.tools?.mcp_config
163
+ ? [{ path: config.agent.tools.mcp_config, what: 'the MCP configuration' }]
164
+ : []),
165
+ ];
166
+ for (const entry of elsewhere) {
167
+ if ((0, node_fs_1.existsSync)(entry.path) && !within(root, entry.path)) {
168
+ plan.stays.push({
169
+ path: entry.path,
170
+ what: `${entry.what}, set outside the MAMA home; remove it yourself if it is MAMA's alone`,
171
+ });
172
+ }
173
+ }
174
+ }
175
+ plan.remove.push({
176
+ path: root,
177
+ what: 'the MAMA home: config, credentials, workspace, logs, backups and, by default, the database',
178
+ });
179
+ return plan;
180
+ }
181
+ async function runUninstall(args, options = {}) {
182
+ const { dryRun, data, toolkit } = parseArgs(args);
183
+ const home = options.home ?? (0, node_os_1.homedir)();
184
+ const configPath = options.configPath ?? (0, config_js_1.defaultConfigPath)(home);
185
+ const write = options.write ?? ((line) => console.log(line));
186
+ const plan = data ? dataPlan(home, configPath, toolkit) : null;
187
+ const notes = (prefix, say) => {
188
+ if (!plan)
189
+ return;
190
+ for (const entry of plan.remove)
191
+ say(`${prefix} ${entry.path} (${sized(entry.path)}): ${entry.what}`);
192
+ for (const folder of plan.emptied)
193
+ say(`${prefix} ${folder} too, if nothing else is left in it`);
194
+ for (const entry of plan.stays) {
195
+ say(`stays: ${entry.path} (${entry.what})`);
196
+ }
197
+ };
198
+ if (dryRun) {
199
+ write(`would stop MAMA and remove its service: ${(0, service_js_1.serviceFile)(options)}`);
200
+ notes('would remove', write);
201
+ if (!data)
202
+ write('the data stays; --data also removes it');
203
+ return 0;
204
+ }
205
+ if (plan && plan.remove.length > 0) {
206
+ const prompt = options.prompt ?? (0, prompt_js_1.createTerminalPrompt)();
207
+ (0, prompt_js_1.requireTTY)(prompt);
208
+ notes('removes', (line) => prompt.write(line));
209
+ const typed = (await prompt.text(`This cannot be undone. Type ${plan.root} to remove it`)).trim();
210
+ if (typed !== plan.root)
211
+ throw new prompt_js_1.CliInputError('Not confirmed; nothing was removed.');
212
+ }
213
+ // Whatever holds the install (the service's daemon, one started by hand) stops first; a command
214
+ // that cannot be stopped this way leaves everything as it was.
215
+ const control = (0, daemon_control_js_1.daemonControlPaths)((0, node_path_1.dirname)(configPath));
216
+ if ((0, daemon_control_js_1.lockHolder)(control) !== null) {
217
+ const stopped = await (0, control_js_1.runStop)([], options);
218
+ if (stopped !== 0)
219
+ return stopped;
220
+ }
221
+ const removed = await (0, service_js_1.uninstallService)(options);
222
+ if (removed !== 0 || !plan || !(0, node_fs_1.existsSync)(plan.root)) {
223
+ if (plan)
224
+ write('npm uninstall -g @jungjaehoon/mama-os removes the program itself');
225
+ return removed;
226
+ }
227
+ // One entry that cannot be removed does not stop the rest half-way; each failure is reported.
228
+ const failed = [];
229
+ const lock = (0, daemon_control_js_1.acquireInstallLock)(control, 'uninstall');
230
+ try {
231
+ for (const entry of plan.remove) {
232
+ try {
233
+ if (entry.remove)
234
+ entry.remove(entry.path);
235
+ else
236
+ (0, node_fs_1.rmSync)(entry.path, { recursive: true, force: true });
237
+ write(`removed ${entry.path}`);
238
+ }
239
+ catch (error) {
240
+ failed.push(`${entry.path}: ${error instanceof Error ? error.message : String(error)}`);
241
+ }
242
+ }
243
+ for (const folder of plan.emptied) {
244
+ if ((0, node_fs_1.existsSync)(folder) && (0, node_fs_1.readdirSync)(folder).length === 0) {
245
+ (0, node_fs_1.rmdirSync)(folder);
246
+ write(`removed ${folder}`);
247
+ }
248
+ else if ((0, node_fs_1.existsSync)(folder)) {
249
+ write(`kept ${folder}: it still holds what stays, or entries MAMA did not create`);
250
+ }
251
+ }
252
+ }
253
+ finally {
254
+ // The lock's file went with the MAMA home; closing it is all that is left.
255
+ lock.release();
256
+ }
257
+ for (const failure of failed)
258
+ write(`could not remove ${failure}`);
259
+ write('npm uninstall -g @jungjaehoon/mama-os removes the program itself');
260
+ return failed.length > 0 ? 1 : 0;
261
+ }
262
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -3,16 +3,6 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const config_js_1 = require("../runtime/config.js");
5
5
  const prompt_js_1 = require("./prompt.js");
6
- /**
7
- * replay and backfill open the daemon's database and rewrite its workspace settings, the shell
8
- * sandbox's proxy ports among them, so they run only while the daemon is stopped.
9
- */
10
- async function requireDaemonStopped(command) {
11
- const { daemonStatus } = await import('./commands/daemon.js');
12
- if (daemonStatus() === 'running') {
13
- throw new prompt_js_1.CliInputError(`Stop the daemon before mama ${command}: run mama stop`);
14
- }
15
- }
16
6
  async function main() {
17
7
  const command = process.argv[2];
18
8
  if (command === 'tools') {
@@ -33,42 +23,99 @@ async function main() {
33
23
  return;
34
24
  }
35
25
  if (command === 'register-owner') {
36
- await requireDaemonStopped('register-owner');
37
26
  const { runRegisterOwner } = await import('./commands/register-owner.js');
38
27
  await runRegisterOwner(process.argv.slice(3));
39
28
  return;
40
29
  }
30
+ if (command === 'logs') {
31
+ const { runLogs } = await import('./commands/logs.js');
32
+ const controller = new AbortController();
33
+ process.once('SIGINT', () => controller.abort());
34
+ await runLogs(process.argv.slice(3), { signal: controller.signal });
35
+ return;
36
+ }
41
37
  if (command === 'daemon') {
42
38
  const { runDaemon } = await import('./commands/daemon.js');
43
- await runDaemon();
39
+ const { InstallBusyError, RestorePendingError } = await import('./runtime/daemon-control.js');
40
+ try {
41
+ const { DAEMON_LOG_LIMITS, openRotatingLog, takeOverOutput } = await import('../runtime/rotating-log.js');
42
+ await runDaemon({
43
+ captureOutput: (logFile) => takeOverOutput(openRotatingLog(logFile, DAEMON_LOG_LIMITS)),
44
+ });
45
+ }
46
+ catch (error) {
47
+ // Another process already holds this install, or a restore is unfinished: a clean exit,
48
+ // which the service files leave stopped (they restart only after a failure).
49
+ // A newer schema stays newer too; restarting into the refusal would only repeat it.
50
+ if (!(error instanceof InstallBusyError) &&
51
+ !(error instanceof RestorePendingError) &&
52
+ !isNewerSchema(error)) {
53
+ // The log line above names the error; this names the stage and the next step.
54
+ const stage = error.bootStage;
55
+ if (typeof stage === 'string') {
56
+ console.error(`mama daemon failed at boot stage ${stage}; mama doctor checks the install`);
57
+ }
58
+ throw error;
59
+ }
60
+ console.error(error.message);
61
+ }
44
62
  return;
45
63
  }
46
64
  if (command === 'replay') {
47
- await requireDaemonStopped('replay');
48
65
  const { runReplay } = await import('./commands/replay.js');
49
66
  await runReplay();
50
67
  return;
51
68
  }
52
69
  if (command === 'backfill') {
53
- await requireDaemonStopped('backfill');
54
70
  const { runBackfill } = await import('./commands/backfill.js');
55
71
  await runBackfill(process.argv.slice(3));
56
72
  return;
57
73
  }
74
+ if (command === 'restore') {
75
+ const { runRestore } = await import('./commands/restore.js');
76
+ await runRestore(process.argv.slice(3));
77
+ return;
78
+ }
79
+ if (command === 'backup') {
80
+ const { runBackup } = await import('./commands/backup.js');
81
+ await runBackup(process.argv.slice(3));
82
+ return;
83
+ }
84
+ if (command === 'doctor') {
85
+ const { runDoctor } = await import('./commands/doctor.js');
86
+ process.exitCode = await runDoctor(process.argv.slice(3));
87
+ // A source probe that timed out may still hold a socket; once the output has drained, leave.
88
+ setTimeout(() => process.exit(), 1_000).unref();
89
+ return;
90
+ }
91
+ if (command === 'uninstall') {
92
+ const { runUninstall } = await import('./commands/uninstall.js');
93
+ process.exitCode = await runUninstall(process.argv.slice(3));
94
+ return;
95
+ }
96
+ if (command === 'service') {
97
+ const { runService } = await import('./commands/service.js');
98
+ process.exitCode = await runService(process.argv.slice(3));
99
+ return;
100
+ }
58
101
  if (command === 'status') {
59
- const { daemonStatus } = await import('./commands/daemon.js');
60
- console.log(daemonStatus());
102
+ const { runStatus } = await import('./commands/control.js');
103
+ process.exitCode = await runStatus(process.argv.slice(3));
61
104
  return;
62
105
  }
63
106
  if (command === 'stop') {
64
- const { requestDaemonStop } = await import('./commands/daemon.js');
65
- requestDaemonStop();
107
+ const { runStop } = await import('./commands/control.js');
108
+ process.exitCode = await runStop(process.argv.slice(3));
66
109
  return;
67
110
  }
68
- console.log('Usage: mama init | tools install | secret set <NAME> | secret list | register-owner <telegram id> | daemon | replay | backfill <file> | status | stop');
111
+ console.log('Usage: mama init | tools install | secret set <NAME> | secret list | register-owner <telegram id> | daemon | replay | backfill <file> | status [--json] | stop | service install|start|stop|restart|status|uninstall | uninstall [--dry-run] [--data [--toolkit]] | doctor [--json] [--offline] [--report] | logs [-n <lines>] [--follow] | backup [--include-secrets] [--logs] | restore <archive> | restore --rollback');
112
+ }
113
+ /** Core's refusal of a database a newer version migrated; its message is core's own text. */
114
+ function isNewerSchema(error) {
115
+ return error instanceof Error && error.code === 'MAMA_SCHEMA_NEWER';
69
116
  }
70
117
  void main().catch((error) => {
71
- if (error instanceof prompt_js_1.CliInputError || error instanceof config_js_1.ConfigError) {
118
+ if (error instanceof prompt_js_1.CliInputError || error instanceof config_js_1.ConfigError || isNewerSchema(error)) {
72
119
  console.error(error.message);
73
120
  }
74
121
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,93 @@
1
1
  export declare function findExecutable(name: string): string | undefined;
2
+ /**
3
+ * A Node path that survives an upgrade. Homebrew removes a version's Cellar folder when it
4
+ * upgrades, but keeps `<prefix>/opt/<formula>` (and `<prefix>/bin/node` for `node`) pointing at
5
+ * the current one, so the launch files use those when the running Node lives in the Cellar.
6
+ */
7
+ export declare function stableNodePath(execPath: string, exists?: (path: string) => boolean): string;
8
+ /** A Node path that a version manager or an upgrade removes (I6). */
9
+ export declare function versionedNodePath(path: string): boolean;
10
+ /** The first comment line of every start.sh that mama writes. */
11
+ export declare const START_SCRIPT_MARKER = "# Written by mama init or mama service install; mama service install rewrites it.";
2
12
  export declare function startScript(options: {
3
13
  home: string;
4
14
  nodePath: string;
5
15
  cliPath: string;
6
16
  executablePaths: string[];
17
+ /** Tests name which tool folders exist; by default the ones on this machine. */
18
+ exists?: (path: string) => boolean;
7
19
  viewer: Record<string, string>;
20
+ /** config.yaml's logging.level; the core logger reads it only from MAMA_LOG_LEVEL. */
21
+ logLevel: string;
22
+ /** `export` lines carried over verbatim from the script being replaced. */
23
+ carried?: readonly string[];
8
24
  }): string;
25
+ /**
26
+ * Where a package manager installs the owner's command-line tools: Homebrew on Apple silicon
27
+ * (/opt/homebrew) and on Intel Macs and most Linux installs (/usr/local). The agent's shell runs
28
+ * those tools (python3 with its packages, sqlite3) and expects them ahead of the system's own, as
29
+ * in the owner's terminal.
30
+ */
31
+ export declare const TOOL_DIRECTORIES: string[];
32
+ /**
33
+ * The PATH a generated start.sh sets: Node's folder, the backend's and gws's, the package
34
+ * manager's folders that exist on this machine, then the system's.
35
+ */
36
+ export declare function startPathEntries(options: {
37
+ nodePath: string;
38
+ executablePaths: string[];
39
+ /** Tests name what exists; by default the folders on this machine. */
40
+ exists?: (path: string) => boolean;
41
+ }): string[];
42
+ /**
43
+ * What the service manager captures before the daemon writes its own rotated log (daemon.log):
44
+ * start.sh's own messages, a crash while Node loads, a fatal error, a native library's writes.
45
+ */
46
+ export declare const CRASH_LOG_NAME = "crash.log";
47
+ /** start.sh empties the crash log at start once it is past this size. */
48
+ export declare const CRASH_LOG_CAP_BYTES: number;
49
+ /** Seconds a service manager waits for a stopping daemon before it kills it. */
50
+ export declare const SERVICE_STOP_SECONDS = 60;
51
+ /**
52
+ * The LaunchAgent restarts the daemon only after a failure: a clean exit (a stop, or a refusal
53
+ * because another process holds the install) leaves it stopped.
54
+ */
9
55
  export declare function launchAgent(home: string): string;
56
+ /**
57
+ * The systemd user unit, with the same restart policy as the LaunchAgent. `%h` is the home folder,
58
+ * expanded by systemd per argument, so a path with spaces stays one argument. KillMode=mixed sends
59
+ * the stop signal to the daemon alone, which stops its children in order; anything left is killed
60
+ * when the stop times out.
61
+ */
62
+ export declare function systemdUnit(): string;
63
+ /** What an existing start.sh holds that a regenerated one would or would not reproduce. */
64
+ export interface StartScriptReading {
65
+ /** Written by mama (it carries the marker line). */
66
+ readonly generated: boolean;
67
+ /** `export` lines kept verbatim, except PATH and MAMA_LOG_LEVEL, which are written anew. */
68
+ readonly carried: string[];
69
+ readonly path: string | null;
70
+ readonly logLevel: string | null;
71
+ readonly exec: string | null;
72
+ /** Other lines with an effect (assignments, commands) that the new script does not have. */
73
+ readonly notReproduced: string[];
74
+ /** It sources this install's auth.env with the generated line. */
75
+ readonly loadsAuthEnv: boolean;
76
+ }
77
+ /**
78
+ * Split a start.sh line into words as sh does before expansion: a `#` starting a word ends the
79
+ * line, single quotes are literal, double
80
+ * quotes keep their text (a backslash escapes `"`, `\\`, `$` and a backtick), and a backslash
81
+ * outside quotes escapes the next character. Variables stay as written.
82
+ */
83
+ export declare function shellWords(line: string): string[];
84
+ /** The PATH entries an `export PATH=` value names, with `$HOME` and `~` read as `home`. */
85
+ export declare function startPathValue(value: string, home: string): string[];
86
+ /** The values a start.sh's carried `export` lines set, unquoted. */
87
+ export declare function startExports(reading: StartScriptReading): Record<string, string>;
88
+ /**
89
+ * Read a start.sh against what this install's generated one holds. Only exact generated lines
90
+ * count as reproduced: a changed `cd` or a different sourced file is reported, not dropped.
91
+ */
92
+ export declare function readStartScript(script: string, home: string): StartScriptReading;
10
93
  //# sourceMappingURL=launch-files.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"launch-files.d.ts","sourceRoot":"","sources":["../../src/cli/launch-files.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY/D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,GAAG,MAAM,CAyBT;AAWD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAehD"}
1
+ {"version":3,"file":"launch-files.d.ts","sourceRoot":"","sources":["../../src/cli/launch-files.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GAC7C,MAAM,CASR;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIvD;AAED,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,sFACqD,CAAC;AAEtF,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gFAAgF;IAChF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,sFAAsF;IACtF,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,GAAG,MAAM,CAmBT;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,UAA0C,CAAC;AAExE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,sEAAsE;IACtE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACpC,GAAG,MAAM,EAAE,CAWX;AAWD;;;GAGG;AACH,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAe/C,gFAAgF;AAChF,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBhD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAkBpC;AAED,2FAA2F;AAC3F,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,4FAA4F;IAC5F,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IACjC,kEAAkE;IAClE,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmCjD;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKpE;AAED,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOhF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CA2ChF"}