@jungjaehoon/mama-os 0.76.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 (190) hide show
  1. package/CHANGELOG.md +182 -0
  2. package/README.md +25 -10
  3. package/dist/api/attachment-actions.d.ts.map +1 -1
  4. package/dist/api/attachment-actions.js +8 -7
  5. package/dist/api/attachment-actions.js.map +1 -1
  6. package/dist/api/code-act-actions.d.ts.map +1 -1
  7. package/dist/api/code-act-actions.js +5 -2
  8. package/dist/api/code-act-actions.js.map +1 -1
  9. package/dist/api/drive-actions.d.ts +4 -0
  10. package/dist/api/drive-actions.d.ts.map +1 -1
  11. package/dist/api/drive-actions.js +15 -7
  12. package/dist/api/drive-actions.js.map +1 -1
  13. package/dist/api/drive-delivery.d.ts.map +1 -1
  14. package/dist/api/drive-delivery.js +8 -3
  15. package/dist/api/drive-delivery.js.map +1 -1
  16. package/dist/api/member-enrollment.d.ts +2 -0
  17. package/dist/api/member-enrollment.d.ts.map +1 -1
  18. package/dist/api/member-enrollment.js +1 -1
  19. package/dist/api/member-enrollment.js.map +1 -1
  20. package/dist/api/member-lifecycle.d.ts +2 -0
  21. package/dist/api/member-lifecycle.d.ts.map +1 -1
  22. package/dist/api/member-lifecycle.js +1 -1
  23. package/dist/api/member-lifecycle.js.map +1 -1
  24. package/dist/api/owner-timezone-actions.d.ts +2 -0
  25. package/dist/api/owner-timezone-actions.d.ts.map +1 -1
  26. package/dist/api/owner-timezone-actions.js.map +1 -1
  27. package/dist/api/security-events.d.ts.map +1 -1
  28. package/dist/api/security-events.js +10 -1
  29. package/dist/api/security-events.js.map +1 -1
  30. package/dist/api/viewer-server.d.ts +1 -0
  31. package/dist/api/viewer-server.d.ts.map +1 -1
  32. package/dist/api/viewer-server.js +34 -0
  33. package/dist/api/viewer-server.js.map +1 -1
  34. package/dist/api/work-actions.d.ts.map +1 -1
  35. package/dist/api/work-actions.js +27 -2
  36. package/dist/api/work-actions.js.map +1 -1
  37. package/dist/cli/commands/backfill.d.ts.map +1 -1
  38. package/dist/cli/commands/backfill.js +1 -0
  39. package/dist/cli/commands/backfill.js.map +1 -1
  40. package/dist/cli/commands/backup.d.ts +13 -0
  41. package/dist/cli/commands/backup.d.ts.map +1 -0
  42. package/dist/cli/commands/backup.js +137 -0
  43. package/dist/cli/commands/backup.js.map +1 -0
  44. package/dist/cli/commands/control.d.ts +26 -0
  45. package/dist/cli/commands/control.d.ts.map +1 -0
  46. package/dist/cli/commands/control.js +193 -0
  47. package/dist/cli/commands/control.js.map +1 -0
  48. package/dist/cli/commands/daemon.d.ts +49 -3
  49. package/dist/cli/commands/daemon.d.ts.map +1 -1
  50. package/dist/cli/commands/daemon.js +253 -75
  51. package/dist/cli/commands/daemon.js.map +1 -1
  52. package/dist/cli/commands/doctor.d.ts +13 -0
  53. package/dist/cli/commands/doctor.d.ts.map +1 -0
  54. package/dist/cli/commands/doctor.js +216 -0
  55. package/dist/cli/commands/doctor.js.map +1 -0
  56. package/dist/cli/commands/init.d.ts.map +1 -1
  57. package/dist/cli/commands/init.js +3 -2
  58. package/dist/cli/commands/init.js.map +1 -1
  59. package/dist/cli/commands/logs.d.ts +9 -0
  60. package/dist/cli/commands/logs.d.ts.map +1 -0
  61. package/dist/cli/commands/logs.js +109 -0
  62. package/dist/cli/commands/logs.js.map +1 -0
  63. package/dist/cli/commands/register-owner.d.ts.map +1 -1
  64. package/dist/cli/commands/register-owner.js +12 -0
  65. package/dist/cli/commands/register-owner.js.map +1 -1
  66. package/dist/cli/commands/restore.d.ts +14 -0
  67. package/dist/cli/commands/restore.d.ts.map +1 -0
  68. package/dist/cli/commands/restore.js +130 -0
  69. package/dist/cli/commands/restore.js.map +1 -0
  70. package/dist/cli/commands/service.d.ts +28 -0
  71. package/dist/cli/commands/service.d.ts.map +1 -0
  72. package/dist/cli/commands/service.js +278 -0
  73. package/dist/cli/commands/service.js.map +1 -0
  74. package/dist/cli/commands/uninstall.d.ts +7 -0
  75. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  76. package/dist/cli/commands/uninstall.js +262 -0
  77. package/dist/cli/commands/uninstall.js.map +1 -0
  78. package/dist/cli/index.js +67 -20
  79. package/dist/cli/index.js.map +1 -1
  80. package/dist/cli/launch-files.d.ts +83 -0
  81. package/dist/cli/launch-files.d.ts.map +1 -1
  82. package/dist/cli/launch-files.js +231 -15
  83. package/dist/cli/launch-files.js.map +1 -1
  84. package/dist/cli/runtime/backend-probe.d.ts +34 -0
  85. package/dist/cli/runtime/backend-probe.d.ts.map +1 -0
  86. package/dist/cli/runtime/backend-probe.js +83 -0
  87. package/dist/cli/runtime/backend-probe.js.map +1 -0
  88. package/dist/cli/runtime/backup.d.ts +114 -0
  89. package/dist/cli/runtime/backup.d.ts.map +1 -0
  90. package/dist/cli/runtime/backup.js +564 -0
  91. package/dist/cli/runtime/backup.js.map +1 -0
  92. package/dist/cli/runtime/claude-caller-config.d.ts +3 -1
  93. package/dist/cli/runtime/claude-caller-config.d.ts.map +1 -1
  94. package/dist/cli/runtime/claude-caller-config.js +14 -2
  95. package/dist/cli/runtime/claude-caller-config.js.map +1 -1
  96. package/dist/cli/runtime/daemon-control.d.ts +84 -0
  97. package/dist/cli/runtime/daemon-control.d.ts.map +1 -0
  98. package/dist/cli/runtime/daemon-control.js +266 -0
  99. package/dist/cli/runtime/daemon-control.js.map +1 -0
  100. package/dist/cli/runtime/diagnostics.d.ts +43 -0
  101. package/dist/cli/runtime/diagnostics.d.ts.map +1 -0
  102. package/dist/cli/runtime/diagnostics.js +953 -0
  103. package/dist/cli/runtime/diagnostics.js.map +1 -0
  104. package/dist/cli/runtime/restore.d.ts +98 -0
  105. package/dist/cli/runtime/restore.d.ts.map +1 -0
  106. package/dist/cli/runtime/restore.js +756 -0
  107. package/dist/cli/runtime/restore.js.map +1 -0
  108. package/dist/cli/runtime/systemd-service.d.ts +13 -0
  109. package/dist/cli/runtime/systemd-service.d.ts.map +1 -0
  110. package/dist/cli/runtime/systemd-service.js +32 -0
  111. package/dist/cli/runtime/systemd-service.js.map +1 -0
  112. package/dist/connectors/chatwork/index.js +1 -1
  113. package/dist/connectors/chatwork/index.js.map +1 -1
  114. package/dist/connectors/config-loader.d.ts +2 -1
  115. package/dist/connectors/config-loader.d.ts.map +1 -1
  116. package/dist/connectors/config-loader.js +3 -2
  117. package/dist/connectors/config-loader.js.map +1 -1
  118. package/dist/connectors/framework/polling-scheduler.d.ts.map +1 -1
  119. package/dist/connectors/framework/polling-scheduler.js +12 -11
  120. package/dist/connectors/framework/polling-scheduler.js.map +1 -1
  121. package/dist/connectors/imessage/index.d.ts.map +1 -1
  122. package/dist/connectors/imessage/index.js +2 -1
  123. package/dist/connectors/imessage/index.js.map +1 -1
  124. package/dist/connectors/slack/index.js +1 -1
  125. package/dist/connectors/slack/index.js.map +1 -1
  126. package/dist/runtime/action-surface.d.ts.map +1 -1
  127. package/dist/runtime/action-surface.js +6 -0
  128. package/dist/runtime/action-surface.js.map +1 -1
  129. package/dist/runtime/backend-security.d.ts +3 -0
  130. package/dist/runtime/backend-security.d.ts.map +1 -1
  131. package/dist/runtime/backend-security.js +13 -5
  132. package/dist/runtime/backend-security.js.map +1 -1
  133. package/dist/runtime/claude-caller-hook.d.ts +14 -0
  134. package/dist/runtime/claude-caller-hook.d.ts.map +1 -1
  135. package/dist/runtime/claude-caller-hook.js +21 -1
  136. package/dist/runtime/claude-caller-hook.js.map +1 -1
  137. package/dist/runtime/config.d.ts +8 -0
  138. package/dist/runtime/config.d.ts.map +1 -1
  139. package/dist/runtime/config.js +17 -4
  140. package/dist/runtime/config.js.map +1 -1
  141. package/dist/runtime/connectors.d.ts +21 -1
  142. package/dist/runtime/connectors.d.ts.map +1 -1
  143. package/dist/runtime/connectors.js +28 -17
  144. package/dist/runtime/connectors.js.map +1 -1
  145. package/dist/runtime/core-db.d.ts.map +1 -1
  146. package/dist/runtime/core-db.js +2 -0
  147. package/dist/runtime/core-db.js.map +1 -1
  148. package/dist/runtime/member-session.d.ts.map +1 -1
  149. package/dist/runtime/member-session.js +11 -3
  150. package/dist/runtime/member-session.js.map +1 -1
  151. package/dist/runtime/member-system-prompt.d.ts +2 -0
  152. package/dist/runtime/member-system-prompt.d.ts.map +1 -1
  153. package/dist/runtime/member-system-prompt.js +11 -3
  154. package/dist/runtime/member-system-prompt.js.map +1 -1
  155. package/dist/runtime/native-session.d.ts +2 -0
  156. package/dist/runtime/native-session.d.ts.map +1 -1
  157. package/dist/runtime/native-session.js +25 -4
  158. package/dist/runtime/native-session.js.map +1 -1
  159. package/dist/runtime/owner-authority.d.ts +2 -0
  160. package/dist/runtime/owner-authority.d.ts.map +1 -1
  161. package/dist/runtime/owner-authority.js +4 -0
  162. package/dist/runtime/owner-authority.js.map +1 -1
  163. package/dist/runtime/owner-runtime.d.ts +2 -0
  164. package/dist/runtime/owner-runtime.d.ts.map +1 -1
  165. package/dist/runtime/owner-runtime.js +3 -0
  166. package/dist/runtime/owner-runtime.js.map +1 -1
  167. package/dist/runtime/owner-system-prompt.d.ts.map +1 -1
  168. package/dist/runtime/owner-system-prompt.js +9 -7
  169. package/dist/runtime/owner-system-prompt.js.map +1 -1
  170. package/dist/runtime/principal-access.d.ts.map +1 -1
  171. package/dist/runtime/principal-access.js +1 -0
  172. package/dist/runtime/principal-access.js.map +1 -1
  173. package/dist/runtime/rotating-log.d.ts +44 -0
  174. package/dist/runtime/rotating-log.d.ts.map +1 -0
  175. package/dist/runtime/rotating-log.js +124 -0
  176. package/dist/runtime/rotating-log.js.map +1 -0
  177. package/dist/runtime/web-fetch-scope.d.ts +20 -0
  178. package/dist/runtime/web-fetch-scope.d.ts.map +1 -0
  179. package/dist/runtime/web-fetch-scope.js +68 -0
  180. package/dist/runtime/web-fetch-scope.js.map +1 -0
  181. package/dist/tools/document-toolkit.d.ts +2 -0
  182. package/dist/tools/document-toolkit.d.ts.map +1 -1
  183. package/dist/tools/document-toolkit.js +3 -1
  184. package/dist/tools/document-toolkit.js.map +1 -1
  185. package/dist/tools/office-render.d.ts.map +1 -1
  186. package/dist/tools/office-render.js +3 -0
  187. package/dist/tools/office-render.js.map +1 -1
  188. package/package.json +4 -3
  189. package/toolkit/requirements.in +11 -0
  190. package/toolkit/requirements.lock +984 -5
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serviceFile = serviceFile;
4
+ exports.installService = installService;
5
+ exports.startService = startService;
6
+ exports.uninstallService = uninstallService;
7
+ exports.runService = runService;
8
+ const node_fs_1 = require("node:fs");
9
+ const node_os_1 = require("node:os");
10
+ const node_path_1 = require("node:path");
11
+ const config_js_1 = require("../../runtime/config.js");
12
+ const prompt_js_1 = require("../prompt.js");
13
+ const launch_files_js_1 = require("../launch-files.js");
14
+ const systemd_service_js_1 = require("../runtime/systemd-service.js");
15
+ const control_js_1 = require("./control.js");
16
+ const daemon_js_1 = require("./daemon.js");
17
+ const LAUNCHD_LABEL = 'com.mama.server';
18
+ function managerFor(platform) {
19
+ if (platform === 'darwin')
20
+ return 'launchd';
21
+ if (platform === 'linux')
22
+ return 'systemd';
23
+ throw new prompt_js_1.CliInputError('mama service runs on macOS (launchd) and Linux (systemd)');
24
+ }
25
+ function servicePath(manager, home) {
26
+ return manager === 'launchd'
27
+ ? (0, node_path_1.join)(home, 'Library', 'LaunchAgents', `${LAUNCHD_LABEL}.plist`)
28
+ : (0, systemd_service_js_1.systemdUnitPath)(home);
29
+ }
30
+ /** Run a service-manager command and fail loud with its name and its own words. */
31
+ function check(run, command, args) {
32
+ const result = run(command, args);
33
+ if (result.error) {
34
+ throw new prompt_js_1.CliInputError(`${command} ${args.join(' ')} could not run: ${result.error.message}`);
35
+ }
36
+ if (result.status !== 0) {
37
+ const detail = `${result.stderr ?? ''}`.trim() || `exit ${String(result.status)}`;
38
+ throw new prompt_js_1.CliInputError(`${command} ${args.join(' ')} failed: ${detail}`);
39
+ }
40
+ return `${result.stdout ?? ''}`;
41
+ }
42
+ /**
43
+ * Write a file only when its content changes, always leaving the requested mode; a replaced file
44
+ * is kept under runtime/, which the agents' native reads deny.
45
+ */
46
+ function writeFile(path, content, mode, keepAs) {
47
+ const previous = (0, node_fs_1.existsSync)(path) ? (0, node_fs_1.readFileSync)(path, 'utf8') : null;
48
+ if (previous === content) {
49
+ (0, node_fs_1.chmodSync)(path, mode);
50
+ return 'unchanged';
51
+ }
52
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true });
53
+ if (previous !== null) {
54
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(keepAs), { recursive: true, mode: 0o700 });
55
+ (0, node_fs_1.writeFileSync)(keepAs, previous, { mode: 0o600, flag: 'wx' });
56
+ }
57
+ const staged = `${path}.${process.pid}.tmp`;
58
+ (0, node_fs_1.writeFileSync)(staged, content, { mode });
59
+ (0, node_fs_1.chmodSync)(staged, mode);
60
+ (0, node_fs_1.renameSync)(staged, path);
61
+ return previous === null ? 'created' : 'updated';
62
+ }
63
+ function serviceRunning(manager, home, run) {
64
+ if (manager === 'launchd')
65
+ return (0, daemon_js_1.launchdService)().pid !== null;
66
+ return (0, systemd_service_js_1.systemdUnitState)(home, run, 'linux') === 'active';
67
+ }
68
+ function unquote(value) {
69
+ return value.replace(/^['"]|['"]$/g, '');
70
+ }
71
+ /**
72
+ * Write start.sh and the service file from the current templates. It names every change to what
73
+ * the daemon runs, refuses to replace a start.sh that mama did not write unless asked, and
74
+ * restarts nothing: a running service takes the files at `mama service restart`.
75
+ */
76
+ /** The service file `mama service install` writes on this platform. */
77
+ function serviceFile(options = {}) {
78
+ return servicePath(managerFor(options.platform ?? process.platform), options.home ?? (0, node_os_1.homedir)());
79
+ }
80
+ async function installService(args, options = {}) {
81
+ const flags = new Set(args);
82
+ for (const flag of flags) {
83
+ if (flag !== '--enable-linger' && flag !== '--replace') {
84
+ throw new prompt_js_1.CliInputError('Usage: mama service install [--enable-linger] [--replace]');
85
+ }
86
+ }
87
+ const home = options.home ?? (0, node_os_1.homedir)();
88
+ const manager = managerFor(options.platform ?? process.platform);
89
+ const write = options.write ?? ((line) => console.log(line));
90
+ const run = options.run ?? systemd_service_js_1.defaultServiceRun;
91
+ const configPath = options.configPath ?? (0, config_js_1.defaultConfigPath)(home);
92
+ const config = (0, config_js_1.loadConfig)({ home, path: configPath });
93
+ const root = (0, node_path_1.dirname)(configPath);
94
+ const locate = options.findExecutable ?? launch_files_js_1.findExecutable;
95
+ const backend = locate(config.agent.backend);
96
+ if (!backend) {
97
+ throw new prompt_js_1.CliInputError(`${config.agent.backend} is not on this PATH; install it or add it to PATH, then run mama service install again`);
98
+ }
99
+ const gws = locate('gws');
100
+ const nodePath = options.nodePath ?? (0, launch_files_js_1.stableNodePath)(process.execPath);
101
+ const cliPath = options.cliPath ?? (0, node_path_1.join)(__dirname, '..', 'index.js');
102
+ const executablePaths = [backend, ...(gws ? [gws] : [])];
103
+ const startPath = (0, node_path_1.join)(root, 'start.sh');
104
+ const existing = (0, node_fs_1.existsSync)(startPath) ? (0, node_fs_1.readFileSync)(startPath, 'utf8') : null;
105
+ const reading = existing === null ? null : (0, launch_files_js_1.readStartScript)(existing, home);
106
+ const script = (0, launch_files_js_1.startScript)({
107
+ home,
108
+ nodePath,
109
+ cliPath,
110
+ executablePaths,
111
+ ...(options.toolDirectoryExists ? { exists: options.toolDirectoryExists } : {}),
112
+ viewer: {},
113
+ logLevel: config.logging.level,
114
+ carried: reading?.carried ?? [],
115
+ });
116
+ // Only a start.sh that is about to change is reported; a matching one needs no account.
117
+ if (reading !== null && existing !== script) {
118
+ const execLine = script.split('\n').find((line) => line.startsWith('exec '));
119
+ if (reading.exec !== execLine) {
120
+ write(`the daemon will run: ${nodePath} ${cliPath}`);
121
+ write(`it runs now: ${reading.exec ?? '(no exec line)'}`);
122
+ }
123
+ if (reading.carried.length > 0) {
124
+ const names = reading.carried.map((line) => line.replace(/^export\s+/, '').split('=')[0]);
125
+ write(`carried over: ${names.join(', ')}`);
126
+ }
127
+ const kept = (0, launch_files_js_1.startPathEntries)({
128
+ nodePath,
129
+ executablePaths,
130
+ ...(options.toolDirectoryExists ? { exists: options.toolDirectoryExists } : {}),
131
+ });
132
+ // $HOME in the old PATH is the same folder the new one names in full.
133
+ let oldPath = [];
134
+ try {
135
+ oldPath = reading.path === null ? [] : (0, launch_files_js_1.startPathValue)(reading.path, home);
136
+ }
137
+ catch {
138
+ // A broken quote is what --replace repairs; say so instead of refusing.
139
+ write('the old PATH cannot be read (its quoting is broken)');
140
+ }
141
+ const lost = oldPath.filter((entry) => !kept.includes(entry));
142
+ if (lost.length > 0)
143
+ write(`PATH no longer includes: ${lost.join(', ')}`);
144
+ if (reading.logLevel !== null &&
145
+ unquote(reading.logLevel).toUpperCase() !== config.logging.level.toUpperCase()) {
146
+ write(`MAMA_LOG_LEVEL now follows config.yaml's logging.level (${config.logging.level}); it was ${reading.logLevel}`);
147
+ }
148
+ for (const line of reading.notReproduced.slice(0, 20)) {
149
+ write(`not reproduced: ${line.slice(0, 120)}`);
150
+ }
151
+ if (reading.notReproduced.length > 20) {
152
+ write(`not reproduced: ${reading.notReproduced.length - 20} more lines`);
153
+ }
154
+ if (!reading.generated && !flags.has('--replace')) {
155
+ throw new prompt_js_1.CliInputError(`${startPath} was not written by mama; check the changes above, then run mama service install --replace`);
156
+ }
157
+ }
158
+ if (!gws)
159
+ write('gws is not on this PATH; Google sources need it');
160
+ const stamp = (options.now?.() ?? new Date()).toISOString().replace(/[:.]/g, '-');
161
+ const keep = (name) => (0, node_path_1.join)(root, 'runtime', `${name}.${stamp}.previous`);
162
+ const startResult = writeFile(startPath, script, 0o700, keep('start.sh'));
163
+ write(`start.sh ${startResult}${startResult === 'updated' ? `; the previous one is kept at ${keep('start.sh')}` : ''}`);
164
+ const path = servicePath(manager, home);
165
+ const content = manager === 'launchd' ? (0, launch_files_js_1.launchAgent)(home) : (0, launch_files_js_1.systemdUnit)();
166
+ const serviceResult = writeFile(path, content, manager === 'launchd' ? 0o600 : 0o644, keep(manager === 'launchd' ? 'launchagent.plist' : systemd_service_js_1.SYSTEMD_UNIT));
167
+ write(`${manager === 'launchd' ? 'LaunchAgent' : 'systemd user unit'} ${serviceResult}: ${path}`);
168
+ if (manager === 'systemd') {
169
+ check(run, 'systemctl', ['--user', 'daemon-reload']);
170
+ check(run, 'systemctl', ['--user', 'enable', systemd_service_js_1.SYSTEMD_UNIT]);
171
+ const user = (0, node_os_1.userInfo)().username;
172
+ // Linger is on exactly when systemd's marker file exists; reading it needs no session.
173
+ if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(options.lingerRoot ?? '/var/lib/systemd/linger', user))) {
174
+ if (flags.has('--enable-linger')) {
175
+ check(run, 'loginctl', ['enable-linger', user]);
176
+ write('linger enabled: the service runs after you log out');
177
+ }
178
+ else {
179
+ write('linger is off, so the service stops when you log out; run mama service install --enable-linger to keep it running');
180
+ }
181
+ }
182
+ }
183
+ const changed = startResult !== 'unchanged' || serviceResult !== 'unchanged';
184
+ if (serviceRunning(manager, home, run)) {
185
+ write(changed
186
+ ? 'the service is running; mama service restart applies the new files'
187
+ : 'the service is running');
188
+ }
189
+ else {
190
+ write('start it with: mama service start');
191
+ }
192
+ return 0;
193
+ }
194
+ async function startService(options = {}) {
195
+ const home = options.home ?? (0, node_os_1.homedir)();
196
+ const manager = managerFor(options.platform ?? process.platform);
197
+ const write = options.write ?? ((line) => console.log(line));
198
+ const run = options.run ?? systemd_service_js_1.defaultServiceRun;
199
+ const path = servicePath(manager, home);
200
+ if (!(0, node_fs_1.existsSync)(path))
201
+ throw new prompt_js_1.CliInputError('No service file yet: run mama service install');
202
+ if (manager === 'launchd') {
203
+ const service = (0, daemon_js_1.launchdService)();
204
+ if (service.pid !== null) {
205
+ write('already running');
206
+ return 0;
207
+ }
208
+ // A clean exit leaves the agent loaded with no process; it is started in place.
209
+ if (service.loaded) {
210
+ check(run, 'launchctl', ['kickstart', `gui/${process.getuid()}/${LAUNCHD_LABEL}`]);
211
+ }
212
+ else {
213
+ check(run, 'launchctl', ['bootstrap', `gui/${process.getuid()}`, path]);
214
+ }
215
+ }
216
+ else {
217
+ check(run, 'systemctl', ['--user', 'start', systemd_service_js_1.SYSTEMD_UNIT]);
218
+ }
219
+ write('started; mama status shows its boot');
220
+ return 0;
221
+ }
222
+ async function uninstallService(options = {}) {
223
+ const home = options.home ?? (0, node_os_1.homedir)();
224
+ const manager = managerFor(options.platform ?? process.platform);
225
+ const write = options.write ?? ((line) => console.log(line));
226
+ const run = options.run ?? systemd_service_js_1.defaultServiceRun;
227
+ const path = servicePath(manager, home);
228
+ if (manager === 'launchd') {
229
+ const loaded = (0, daemon_js_1.launchdService)().loaded;
230
+ if (!(0, node_fs_1.existsSync)(path) && !loaded) {
231
+ write('no LaunchAgent is installed');
232
+ return 0;
233
+ }
234
+ if (loaded) {
235
+ // mama stop unloads the agent and waits for its daemon to let go of the install.
236
+ const stopped = await (0, control_js_1.runStop)([], options);
237
+ if (stopped !== 0)
238
+ return stopped;
239
+ }
240
+ }
241
+ else {
242
+ if (!(0, node_fs_1.existsSync)(path)) {
243
+ write('no systemd user unit is installed');
244
+ return 0;
245
+ }
246
+ check(run, 'systemctl', ['--user', 'disable', '--now', systemd_service_js_1.SYSTEMD_UNIT]);
247
+ }
248
+ (0, node_fs_1.rmSync)(path, { force: true });
249
+ if (manager === 'systemd')
250
+ check(run, 'systemctl', ['--user', 'daemon-reload']);
251
+ write(`service removed: ${path} (start.sh and the data stay)`);
252
+ return 0;
253
+ }
254
+ async function runService(args, options = {}) {
255
+ const [command, ...rest] = args;
256
+ if (command === 'install')
257
+ return await installService(rest, options);
258
+ if (rest.length > 0)
259
+ throw new prompt_js_1.CliInputError(`Usage: mama service ${command ?? '<command>'}`);
260
+ if (command === 'start')
261
+ return await startService(options);
262
+ if (command === 'stop')
263
+ return await (0, control_js_1.runStop)([], options);
264
+ if (command === 'restart') {
265
+ const manager = managerFor(options.platform ?? process.platform);
266
+ if (!(0, node_fs_1.existsSync)(servicePath(manager, options.home ?? (0, node_os_1.homedir)()))) {
267
+ throw new prompt_js_1.CliInputError('No service file yet: run mama service install');
268
+ }
269
+ const stopped = await (0, control_js_1.runStop)([], options);
270
+ return stopped === 0 ? await startService(options) : stopped;
271
+ }
272
+ if (command === 'status')
273
+ return await (0, control_js_1.runStatus)([], options);
274
+ if (command === 'uninstall')
275
+ return await uninstallService(options);
276
+ throw new prompt_js_1.CliInputError('Usage: mama service install|start|stop|restart|status|uninstall');
277
+ }
278
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/cli/commands/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type PromptAdapter } from '../prompt.js';
2
+ import { type ServiceOptions } from './service.js';
3
+ export interface UninstallOptions extends ServiceOptions {
4
+ prompt?: PromptAdapter;
5
+ }
6
+ export declare function runUninstall(args: readonly string[], options?: UninstallOptions): Promise<number>;
7
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAmD,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAGnG,OAAO,EAAiC,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAKlF,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAqKD,wBAAsB,YAAY,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CA2EjB"}
@@ -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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"}