@jungjaehoon/mama-os 0.77.0 → 0.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +446 -0
- package/README.md +59 -30
- package/db/migrations/002-model-runs-parent-index.sql +11 -0
- package/db/migrations/003-upkeep-settled.sql +15 -0
- package/dist/api/google-read-actions.d.ts +30 -0
- package/dist/api/google-read-actions.d.ts.map +1 -0
- package/dist/api/google-read-actions.js +256 -0
- package/dist/api/google-read-actions.js.map +1 -0
- package/dist/api/record-actions.d.ts.map +1 -1
- package/dist/api/record-actions.js +23 -5
- package/dist/api/record-actions.js.map +1 -1
- package/dist/api/report-handler.d.ts +0 -6
- package/dist/api/report-handler.d.ts.map +1 -1
- package/dist/api/report-handler.js +0 -54
- package/dist/api/report-handler.js.map +1 -1
- package/dist/api/security-events.d.ts +1 -1
- package/dist/api/security-events.d.ts.map +1 -1
- package/dist/api/security-events.js +10 -1
- package/dist/api/security-events.js.map +1 -1
- package/dist/api/source-actions.d.ts +9 -0
- package/dist/api/source-actions.d.ts.map +1 -1
- package/dist/api/source-actions.js +49 -0
- package/dist/api/source-actions.js.map +1 -1
- package/dist/api/viewer-request-security.d.ts +14 -1
- package/dist/api/viewer-request-security.d.ts.map +1 -1
- package/dist/api/viewer-request-security.js +26 -3
- package/dist/api/viewer-request-security.js.map +1 -1
- package/dist/api/viewer-server.d.ts +8 -0
- package/dist/api/viewer-server.d.ts.map +1 -1
- package/dist/api/viewer-server.js +66 -0
- package/dist/api/viewer-server.js.map +1 -1
- package/dist/api/work-actions.d.ts +19 -2
- package/dist/api/work-actions.d.ts.map +1 -1
- package/dist/api/work-actions.js +42 -2
- package/dist/api/work-actions.js.map +1 -1
- package/dist/cli/commands/backfill.d.ts.map +1 -1
- package/dist/cli/commands/backfill.js +1 -0
- package/dist/cli/commands/backfill.js.map +1 -1
- package/dist/cli/commands/backup.d.ts +14 -0
- package/dist/cli/commands/backup.d.ts.map +1 -0
- package/dist/cli/commands/backup.js +174 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/control.d.ts +44 -0
- package/dist/cli/commands/control.d.ts.map +1 -0
- package/dist/cli/commands/control.js +354 -0
- package/dist/cli/commands/control.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +60 -3
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +454 -78
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +13 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +216 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init-questions.d.ts +98 -0
- package/dist/cli/commands/init-questions.d.ts.map +1 -0
- package/dist/cli/commands/init-questions.js +420 -0
- package/dist/cli/commands/init-questions.js.map +1 -0
- package/dist/cli/commands/init-section.d.ts +13 -0
- package/dist/cli/commands/init-section.d.ts.map +1 -0
- package/dist/cli/commands/init-section.js +375 -0
- package/dist/cli/commands/init-section.js.map +1 -0
- package/dist/cli/commands/init.d.ts +56 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +562 -350
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/logs.d.ts +9 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +109 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/node-move.d.ts +20 -0
- package/dist/cli/commands/node-move.d.ts.map +1 -0
- package/dist/cli/commands/node-move.js +289 -0
- package/dist/cli/commands/node-move.js.map +1 -0
- package/dist/cli/commands/register-owner.d.ts +3 -0
- package/dist/cli/commands/register-owner.d.ts.map +1 -1
- package/dist/cli/commands/register-owner.js +14 -0
- package/dist/cli/commands/register-owner.js.map +1 -1
- package/dist/cli/commands/restore.d.ts +16 -0
- package/dist/cli/commands/restore.d.ts.map +1 -0
- package/dist/cli/commands/restore.js +137 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/service.d.ts +44 -0
- package/dist/cli/commands/service.d.ts.map +1 -0
- package/dist/cli/commands/service.js +306 -0
- package/dist/cli/commands/service.js.map +1 -0
- package/dist/cli/commands/tools.d.ts +1 -1
- package/dist/cli/commands/tools.d.ts.map +1 -1
- package/dist/cli/commands/tools.js +8 -3
- package/dist/cli/commands/tools.js.map +1 -1
- package/dist/cli/commands/uninstall.d.ts +7 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +335 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/commands/update.d.ts +59 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +948 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.js +74 -23
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/launch-files.d.ts +119 -0
- package/dist/cli/launch-files.d.ts.map +1 -1
- package/dist/cli/launch-files.js +324 -15
- package/dist/cli/launch-files.js.map +1 -1
- package/dist/cli/prompt.d.ts +2 -1
- package/dist/cli/prompt.d.ts.map +1 -1
- package/dist/cli/prompt.js +5 -2
- package/dist/cli/prompt.js.map +1 -1
- package/dist/cli/runtime/backend-probe.d.ts +34 -0
- package/dist/cli/runtime/backend-probe.d.ts.map +1 -0
- package/dist/cli/runtime/backend-probe.js +83 -0
- package/dist/cli/runtime/backend-probe.js.map +1 -0
- package/dist/cli/runtime/backup.d.ts +130 -0
- package/dist/cli/runtime/backup.d.ts.map +1 -0
- package/dist/cli/runtime/backup.js +592 -0
- package/dist/cli/runtime/backup.js.map +1 -0
- package/dist/cli/runtime/daemon-control.d.ts +169 -0
- package/dist/cli/runtime/daemon-control.d.ts.map +1 -0
- package/dist/cli/runtime/daemon-control.js +441 -0
- package/dist/cli/runtime/daemon-control.js.map +1 -0
- package/dist/cli/runtime/default-roots.d.ts +27 -0
- package/dist/cli/runtime/default-roots.d.ts.map +1 -0
- package/dist/cli/runtime/default-roots.js +61 -0
- package/dist/cli/runtime/default-roots.js.map +1 -0
- package/dist/cli/runtime/diagnostics.d.ts +68 -0
- package/dist/cli/runtime/diagnostics.d.ts.map +1 -0
- package/dist/cli/runtime/diagnostics.js +1139 -0
- package/dist/cli/runtime/diagnostics.js.map +1 -0
- package/dist/cli/runtime/init-state.d.ts +20 -0
- package/dist/cli/runtime/init-state.d.ts.map +1 -0
- package/dist/cli/runtime/init-state.js +51 -0
- package/dist/cli/runtime/init-state.js.map +1 -0
- package/dist/cli/runtime/install-kind.d.ts +54 -0
- package/dist/cli/runtime/install-kind.d.ts.map +1 -0
- package/dist/cli/runtime/install-kind.js +164 -0
- package/dist/cli/runtime/install-kind.js.map +1 -0
- package/dist/cli/runtime/node-move-journal.d.ts +44 -0
- package/dist/cli/runtime/node-move-journal.d.ts.map +1 -0
- package/dist/cli/runtime/node-move-journal.js +48 -0
- package/dist/cli/runtime/node-move-journal.js.map +1 -0
- package/dist/cli/runtime/release-check.d.ts +94 -0
- package/dist/cli/runtime/release-check.d.ts.map +1 -0
- package/dist/cli/runtime/release-check.js +316 -0
- package/dist/cli/runtime/release-check.js.map +1 -0
- package/dist/cli/runtime/restore.d.ts +98 -0
- package/dist/cli/runtime/restore.d.ts.map +1 -0
- package/dist/cli/runtime/restore.js +756 -0
- package/dist/cli/runtime/restore.js.map +1 -0
- package/dist/cli/runtime/setup-page.d.ts +57 -0
- package/dist/cli/runtime/setup-page.d.ts.map +1 -0
- package/dist/cli/runtime/setup-page.js +266 -0
- package/dist/cli/runtime/setup-page.js.map +1 -0
- package/dist/cli/runtime/source-tools.d.ts +60 -0
- package/dist/cli/runtime/source-tools.d.ts.map +1 -0
- package/dist/cli/runtime/source-tools.js +170 -0
- package/dist/cli/runtime/source-tools.js.map +1 -0
- package/dist/cli/runtime/systemd-service.d.ts +13 -0
- package/dist/cli/runtime/systemd-service.d.ts.map +1 -0
- package/dist/cli/runtime/systemd-service.js +32 -0
- package/dist/cli/runtime/systemd-service.js.map +1 -0
- package/dist/cli/runtime/telegram-pairing.d.ts +73 -0
- package/dist/cli/runtime/telegram-pairing.d.ts.map +1 -0
- package/dist/cli/runtime/telegram-pairing.js +184 -0
- package/dist/cli/runtime/telegram-pairing.js.map +1 -0
- package/dist/cli/runtime/update-journal.d.ts +135 -0
- package/dist/cli/runtime/update-journal.d.ts.map +1 -0
- package/dist/cli/runtime/update-journal.js +144 -0
- package/dist/cli/runtime/update-journal.js.map +1 -0
- package/dist/cli/runtime/update-progress.d.ts +95 -0
- package/dist/cli/runtime/update-progress.d.ts.map +1 -0
- package/dist/cli/runtime/update-progress.js +154 -0
- package/dist/cli/runtime/update-progress.js.map +1 -0
- package/dist/cli/runtime/update-request.d.ts +58 -0
- package/dist/cli/runtime/update-request.d.ts.map +1 -0
- package/dist/cli/runtime/update-request.js +172 -0
- package/dist/cli/runtime/update-request.js.map +1 -0
- package/dist/connectors/calendar/index.d.ts +5 -1
- package/dist/connectors/calendar/index.d.ts.map +1 -1
- package/dist/connectors/calendar/index.js +19 -28
- package/dist/connectors/calendar/index.js.map +1 -1
- package/dist/connectors/chatwork/index.d.ts.map +1 -1
- package/dist/connectors/chatwork/index.js +7 -3
- package/dist/connectors/chatwork/index.js.map +1 -1
- package/dist/connectors/config-loader.d.ts +7 -1
- package/dist/connectors/config-loader.d.ts.map +1 -1
- package/dist/connectors/config-loader.js +11 -2
- package/dist/connectors/config-loader.js.map +1 -1
- package/dist/connectors/discord/index.d.ts.map +1 -1
- package/dist/connectors/discord/index.js +4 -3
- package/dist/connectors/discord/index.js.map +1 -1
- package/dist/connectors/drive/index.d.ts.map +1 -1
- package/dist/connectors/drive/index.js +15 -13
- package/dist/connectors/drive/index.js.map +1 -1
- package/dist/connectors/framework/gws-utils.d.ts +62 -0
- package/dist/connectors/framework/gws-utils.d.ts.map +1 -1
- package/dist/connectors/framework/gws-utils.js +133 -3
- package/dist/connectors/framework/gws-utils.js.map +1 -1
- package/dist/connectors/framework/polling-scheduler.d.ts.map +1 -1
- package/dist/connectors/framework/polling-scheduler.js +12 -11
- package/dist/connectors/framework/polling-scheduler.js.map +1 -1
- package/dist/connectors/framework/types.d.ts +24 -0
- package/dist/connectors/framework/types.d.ts.map +1 -1
- package/dist/connectors/framework/types.js +9 -0
- package/dist/connectors/framework/types.js.map +1 -1
- package/dist/connectors/gmail/index.d.ts.map +1 -1
- package/dist/connectors/gmail/index.js +14 -13
- package/dist/connectors/gmail/index.js.map +1 -1
- package/dist/connectors/imessage/index.d.ts.map +1 -1
- package/dist/connectors/imessage/index.js +2 -1
- package/dist/connectors/imessage/index.js.map +1 -1
- package/dist/connectors/index.d.ts +4 -4
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/index.js +4 -10
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/notion/index.d.ts.map +1 -1
- package/dist/connectors/notion/index.js +5 -3
- package/dist/connectors/notion/index.js.map +1 -1
- package/dist/connectors/sheets/index.d.ts.map +1 -1
- package/dist/connectors/sheets/index.js +17 -12
- package/dist/connectors/sheets/index.js.map +1 -1
- package/dist/connectors/slack/index.d.ts.map +1 -1
- package/dist/connectors/slack/index.js +9 -3
- package/dist/connectors/slack/index.js.map +1 -1
- package/dist/connectors/telegram/index.d.ts.map +1 -1
- package/dist/connectors/telegram/index.js +4 -3
- package/dist/connectors/telegram/index.js.map +1 -1
- package/dist/connectors/trello/index.d.ts +1 -1
- package/dist/connectors/trello/index.d.ts.map +1 -1
- package/dist/connectors/trello/index.js +10 -5
- package/dist/connectors/trello/index.js.map +1 -1
- package/dist/gateways/discord.d.ts +6 -0
- package/dist/gateways/discord.d.ts.map +1 -1
- package/dist/gateways/discord.js +38 -27
- package/dist/gateways/discord.js.map +1 -1
- package/dist/gateways/slack.d.ts +6 -0
- package/dist/gateways/slack.d.ts.map +1 -1
- package/dist/gateways/slack.js +38 -27
- package/dist/gateways/slack.js.map +1 -1
- package/dist/gateways/telegram-commands.d.ts +124 -0
- package/dist/gateways/telegram-commands.d.ts.map +1 -0
- package/dist/gateways/telegram-commands.js +131 -0
- package/dist/gateways/telegram-commands.js.map +1 -0
- package/dist/gateways/telegram.d.ts +20 -0
- package/dist/gateways/telegram.d.ts.map +1 -1
- package/dist/gateways/telegram.js +138 -34
- package/dist/gateways/telegram.js.map +1 -1
- package/dist/gateways/turn-contract.d.ts +11 -0
- package/dist/gateways/turn-contract.d.ts.map +1 -1
- package/dist/runtime/action-surface.d.ts +1 -1
- package/dist/runtime/action-surface.d.ts.map +1 -1
- package/dist/runtime/action-surface.js +10 -0
- package/dist/runtime/action-surface.js.map +1 -1
- package/dist/runtime/backend-security.d.ts +26 -2
- package/dist/runtime/backend-security.d.ts.map +1 -1
- package/dist/runtime/backend-security.js +63 -10
- package/dist/runtime/backend-security.js.map +1 -1
- package/dist/runtime/config.d.ts +3 -0
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +4 -4
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/connectors.d.ts +21 -1
- package/dist/runtime/connectors.d.ts.map +1 -1
- package/dist/runtime/connectors.js +28 -17
- package/dist/runtime/connectors.js.map +1 -1
- package/dist/runtime/core-db.d.ts.map +1 -1
- package/dist/runtime/core-db.js +2 -0
- package/dist/runtime/core-db.js.map +1 -1
- package/dist/runtime/member-paths.d.ts +15 -7
- package/dist/runtime/member-paths.d.ts.map +1 -1
- package/dist/runtime/member-paths.js +64 -12
- package/dist/runtime/member-paths.js.map +1 -1
- package/dist/runtime/member-session.d.ts +4 -0
- package/dist/runtime/member-session.d.ts.map +1 -1
- package/dist/runtime/member-session.js +23 -2
- package/dist/runtime/member-session.js.map +1 -1
- package/dist/runtime/native-session.d.ts +2 -0
- package/dist/runtime/native-session.d.ts.map +1 -1
- package/dist/runtime/native-session.js +1 -0
- package/dist/runtime/native-session.js.map +1 -1
- package/dist/runtime/owner-runtime.d.ts +63 -1
- package/dist/runtime/owner-runtime.d.ts.map +1 -1
- package/dist/runtime/owner-runtime.js +180 -3
- package/dist/runtime/owner-runtime.js.map +1 -1
- package/dist/runtime/owner-system-prompt.d.ts.map +1 -1
- package/dist/runtime/owner-system-prompt.js +6 -5
- package/dist/runtime/owner-system-prompt.js.map +1 -1
- package/dist/runtime/principal-access.d.ts +2 -0
- package/dist/runtime/principal-access.d.ts.map +1 -1
- package/dist/runtime/principal-access.js +7 -0
- package/dist/runtime/principal-access.js.map +1 -1
- package/dist/runtime/principal-sessions.d.ts.map +1 -1
- package/dist/runtime/principal-sessions.js +8 -1
- package/dist/runtime/principal-sessions.js.map +1 -1
- package/dist/runtime/record-orders.d.ts.map +1 -1
- package/dist/runtime/record-orders.js +3 -29
- package/dist/runtime/record-orders.js.map +1 -1
- package/dist/runtime/report-scheduler.d.ts +9 -2
- package/dist/runtime/report-scheduler.d.ts.map +1 -1
- package/dist/runtime/report-scheduler.js +37 -10
- package/dist/runtime/report-scheduler.js.map +1 -1
- package/dist/runtime/rotating-log.d.ts +44 -0
- package/dist/runtime/rotating-log.d.ts.map +1 -0
- package/dist/runtime/rotating-log.js +124 -0
- package/dist/runtime/rotating-log.js.map +1 -0
- package/dist/runtime/stimulus-delivery.d.ts +3 -0
- package/dist/runtime/stimulus-delivery.d.ts.map +1 -1
- package/dist/runtime/stimulus-delivery.js +19 -3
- package/dist/runtime/stimulus-delivery.js.map +1 -1
- package/dist/runtime/tools-paths.d.ts +7 -0
- package/dist/runtime/tools-paths.d.ts.map +1 -1
- package/dist/runtime/tools-paths.js +11 -5
- package/dist/runtime/tools-paths.js.map +1 -1
- package/dist/runtime/upkeep-close.d.ts +17 -0
- package/dist/runtime/upkeep-close.d.ts.map +1 -0
- package/dist/runtime/upkeep-close.js +127 -0
- package/dist/runtime/upkeep-close.js.map +1 -0
- package/dist/runtime/upkeep-orders.d.ts +124 -0
- package/dist/runtime/upkeep-orders.d.ts.map +1 -0
- package/dist/runtime/upkeep-orders.js +310 -0
- package/dist/runtime/upkeep-orders.js.map +1 -0
- package/dist/runtime/upkeep-reconcile.d.ts +25 -0
- package/dist/runtime/upkeep-reconcile.d.ts.map +1 -0
- package/dist/runtime/upkeep-reconcile.js +231 -0
- package/dist/runtime/upkeep-reconcile.js.map +1 -0
- package/dist/runtime/upkeep-writeback.d.ts +22 -0
- package/dist/runtime/upkeep-writeback.d.ts.map +1 -0
- package/dist/runtime/upkeep-writeback.js +203 -0
- package/dist/runtime/upkeep-writeback.js.map +1 -0
- package/dist/tools/document-toolkit.d.ts +2 -0
- package/dist/tools/document-toolkit.d.ts.map +1 -1
- package/dist/tools/document-toolkit.js +2 -0
- package/dist/tools/document-toolkit.js.map +1 -1
- package/dist/utils/untrusted-content.d.ts.map +1 -1
- package/dist/utils/untrusted-content.js +8 -1
- package/dist/utils/untrusted-content.js.map +1 -1
- package/install/install.sh +457 -0
- package/install/node.json +9 -0
- package/package.json +5 -5
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runBackup = runBackup;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_os_1 = require("node:os");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const package_version_js_1 = require("../../package-version.js");
|
|
8
|
+
const config_js_1 = require("../../runtime/config.js");
|
|
9
|
+
const prompt_js_1 = require("../prompt.js");
|
|
10
|
+
const backup_js_1 = require("../runtime/backup.js");
|
|
11
|
+
const daemon_control_js_1 = require("../runtime/daemon-control.js");
|
|
12
|
+
const control_js_1 = require("./control.js");
|
|
13
|
+
const daemon_js_1 = require("./daemon.js");
|
|
14
|
+
const service_js_1 = require("./service.js");
|
|
15
|
+
const USAGE = 'Usage: mama backup [--include-secrets] [--logs] [--restart]';
|
|
16
|
+
function parse(args) {
|
|
17
|
+
let includeSecrets = false;
|
|
18
|
+
let includeLogs = false;
|
|
19
|
+
let restart = false;
|
|
20
|
+
for (const arg of args) {
|
|
21
|
+
if (arg === '--include-secrets')
|
|
22
|
+
includeSecrets = true;
|
|
23
|
+
else if (arg === '--logs')
|
|
24
|
+
includeLogs = true;
|
|
25
|
+
else if (arg === '--restart')
|
|
26
|
+
restart = true;
|
|
27
|
+
else
|
|
28
|
+
throw new prompt_js_1.CliInputError(USAGE);
|
|
29
|
+
}
|
|
30
|
+
return { includeSecrets, includeLogs, restart };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* `mama backup`: one verified archive of a stopped install. It holds the install while it works,
|
|
34
|
+
* so the daemon cannot start beside it, and writes the archive 0600 under `<root>/backups/`,
|
|
35
|
+
* the one folder the agents cannot read. Returns the archive's path. `--restart` drains and stops
|
|
36
|
+
* the running install first and starts it again through its service afterwards, also after a
|
|
37
|
+
* failed backup, since it ran before.
|
|
38
|
+
*/
|
|
39
|
+
async function runBackup(args, options = {}) {
|
|
40
|
+
const flags = parse(args);
|
|
41
|
+
if (!flags.restart)
|
|
42
|
+
return await backupStopped(flags, options);
|
|
43
|
+
// Only the service starts it again; a daemon run in a terminal would stay stopped.
|
|
44
|
+
if (!(0, node_fs_1.existsSync)((0, service_js_1.serviceFile)(options))) {
|
|
45
|
+
throw new prompt_js_1.CliInputError('mama backup --restart starts MAMA again through its service, and none is installed: run mama service install, or mama stop and mama backup');
|
|
46
|
+
}
|
|
47
|
+
if ((await (0, control_js_1.runStop)([], options)) !== 0) {
|
|
48
|
+
// A stop can fail after the service manager was already told to stop (a release that took
|
|
49
|
+
// too long), so the install may be down now; this names which.
|
|
50
|
+
throw new prompt_js_1.CliInputError((0, service_js_1.serviceRuns)(options)
|
|
51
|
+
? 'Not backed up: MAMA did not stop and still runs'
|
|
52
|
+
: 'Not backed up: MAMA did not stop cleanly and its service is not running; mama service start starts it again');
|
|
53
|
+
}
|
|
54
|
+
let archive;
|
|
55
|
+
try {
|
|
56
|
+
archive = await backupStopped(flags, options);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
try {
|
|
60
|
+
await (0, service_js_1.startService)(options);
|
|
61
|
+
}
|
|
62
|
+
catch (startError) {
|
|
63
|
+
// Both failures count; the backup's comes first.
|
|
64
|
+
throw new prompt_js_1.CliInputError(`${error instanceof Error ? error.message : String(error)}; MAMA did not start again either: ${startError instanceof Error ? startError.message : String(startError)} (mama service start)`);
|
|
65
|
+
}
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
await (0, service_js_1.startService)(options);
|
|
69
|
+
return archive;
|
|
70
|
+
}
|
|
71
|
+
async function backupStopped(flags, options) {
|
|
72
|
+
const home = options.home ?? (0, node_os_1.homedir)();
|
|
73
|
+
const configPath = options.configPath ?? (0, config_js_1.defaultConfigPath)(home);
|
|
74
|
+
const write = options.write ?? ((line) => console.log(line));
|
|
75
|
+
const config = (0, config_js_1.loadConfig)({ home, path: configPath, onIgnored: () => { } });
|
|
76
|
+
const paths = (0, daemon_js_1.pathsFor)(configPath, config);
|
|
77
|
+
const root = (0, node_fs_1.realpathSync)(paths.mamaRoot);
|
|
78
|
+
// Only this folder is denied to the agents, the owner's and every member's: an archive
|
|
79
|
+
// anywhere else could be read by any of them, since they run as the same user.
|
|
80
|
+
const folder = (0, node_path_1.join)(root, 'backups');
|
|
81
|
+
if ((0, node_fs_1.existsSync)(folder) && (0, node_fs_1.lstatSync)(folder).isSymbolicLink()) {
|
|
82
|
+
throw new prompt_js_1.CliInputError(`Refused: ${folder} is a symlink; the agents' deny covers the folder only`);
|
|
83
|
+
}
|
|
84
|
+
// Nothing may write the install while it is read, so a running daemon refuses the backup here.
|
|
85
|
+
const lock = (0, daemon_control_js_1.acquireInstallLock)((0, daemon_control_js_1.daemonControlPaths)(root), 'backup');
|
|
86
|
+
try {
|
|
87
|
+
(0, daemon_control_js_1.refuseWhileRestoring)(root);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
lock.release();
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
const now = options.now?.() ?? new Date();
|
|
94
|
+
const { final, staging, partial } = (0, backup_js_1.backupFiles)(folder, now, options.archivePrefix);
|
|
95
|
+
try {
|
|
96
|
+
const plan = (0, backup_js_1.planBackup)(config, configPath, { ...flags, home });
|
|
97
|
+
(0, node_fs_1.mkdirSync)(folder, { recursive: true, mode: 0o700 });
|
|
98
|
+
(0, node_fs_1.chmodSync)(folder, 0o700);
|
|
99
|
+
// An interrupted backup leaves these; holding the install, nothing else is using them.
|
|
100
|
+
for (const name of (0, node_fs_1.readdirSync)(folder)) {
|
|
101
|
+
if (name.startsWith('.staging-') || name.endsWith('.tar.gz.partial')) {
|
|
102
|
+
(0, node_fs_1.rmSync)((0, node_path_1.join)(folder, name), { recursive: true, force: true });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if ((0, node_fs_1.existsSync)(final))
|
|
106
|
+
throw new Error(`${final} already exists`);
|
|
107
|
+
(0, node_fs_1.mkdirSync)(staging, { mode: 0o700 });
|
|
108
|
+
const databaseCopy = (0, node_path_1.join)(staging, 'database');
|
|
109
|
+
const { schemaVersion } = await (0, backup_js_1.copyDatabase)(plan.database, databaseCopy);
|
|
110
|
+
// SQLite creates the copy under this shell's umask; it keeps the database's own mode.
|
|
111
|
+
(0, node_fs_1.chmodSync)(databaseCopy, (0, node_fs_1.statSync)(plan.database).mode & 0o777);
|
|
112
|
+
// Checked before anything is hashed: opening a database can rewrite its side files.
|
|
113
|
+
const stores = (0, backup_js_1.rawStores)(root);
|
|
114
|
+
for (const store of stores)
|
|
115
|
+
(0, backup_js_1.checkDatabase)(store, { schema: false });
|
|
116
|
+
const sources = [{ prefix: 'database', path: databaseCopy, keep: () => true }, ...plan.sources];
|
|
117
|
+
const collected = await (0, backup_js_1.collectEntries)(sources);
|
|
118
|
+
const manifest = {
|
|
119
|
+
format: 'mama-backup',
|
|
120
|
+
version: 1,
|
|
121
|
+
createdAt: now.toISOString(),
|
|
122
|
+
mama: (0, package_version_js_1.resolvePackageVersion)(),
|
|
123
|
+
platform: `${process.platform} ${process.arch}`,
|
|
124
|
+
schemaVersion,
|
|
125
|
+
includesSecrets: flags.includeSecrets,
|
|
126
|
+
includesLogs: flags.includeLogs,
|
|
127
|
+
roots: Object.fromEntries(sources.map((source) => [
|
|
128
|
+
source.prefix,
|
|
129
|
+
source.prefix === 'database' ? plan.database : source.path,
|
|
130
|
+
])),
|
|
131
|
+
configured: plan.configured,
|
|
132
|
+
databases: [
|
|
133
|
+
'database',
|
|
134
|
+
...stores.map((store) => `root/${(0, node_path_1.relative)(root, store).split(node_path_1.sep).join('/')}`),
|
|
135
|
+
],
|
|
136
|
+
entries: collected.entries,
|
|
137
|
+
};
|
|
138
|
+
const manifestPath = (0, node_path_1.join)(staging, 'manifest.json');
|
|
139
|
+
(0, node_fs_1.writeFileSync)(manifestPath, `${JSON.stringify(manifest)}\n`, { mode: 0o600 });
|
|
140
|
+
await (0, backup_js_1.writeArchive)(partial, manifestPath, collected);
|
|
141
|
+
await (0, backup_js_1.verifyArchive)(partial, manifest);
|
|
142
|
+
(0, node_fs_1.renameSync)(partial, final);
|
|
143
|
+
(0, backup_js_1.syncPath)(folder);
|
|
144
|
+
const files = collected.entries.filter((entry) => entry.type === 'file');
|
|
145
|
+
const bytes = files.reduce((sum, entry) => sum + (entry.size ?? 0), 0);
|
|
146
|
+
write(`backup: ${final} (copy it elsewhere yourself; the agents cannot read it here)`);
|
|
147
|
+
write(` ${files.length} files, ${(bytes / 1024 / 1024).toFixed(1)} MB read, ${((0, node_fs_1.statSync)(final).size / 1024 / 1024).toFixed(1)} MB written; verified against its manifest`);
|
|
148
|
+
write(` databases checked: ${manifest.databases.length}; schema version ${schemaVersion ?? 'none'}`);
|
|
149
|
+
if (plan.secretsLeftOut.length > 0) {
|
|
150
|
+
write(` left out as credentials: ${plan.secretsLeftOut.join('; ')} (--include-secrets adds them)`);
|
|
151
|
+
}
|
|
152
|
+
if (plan.leftOut.length > 0) {
|
|
153
|
+
write(` left out, not read by this version: ${plan.leftOut.join(', ')}`);
|
|
154
|
+
}
|
|
155
|
+
write(' Codex homes and their sessions left out; sessions start over after a restore');
|
|
156
|
+
if (!flags.includeLogs)
|
|
157
|
+
write(' logs left out (--logs adds them)');
|
|
158
|
+
if (!flags.restart)
|
|
159
|
+
write('The install is still stopped; mama service start starts it.');
|
|
160
|
+
return final;
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
if (error instanceof prompt_js_1.CliInputError)
|
|
164
|
+
throw error;
|
|
165
|
+
// The reason goes to the terminal: a file that changed, a database that failed its check.
|
|
166
|
+
throw new prompt_js_1.CliInputError(`Backup failed and nothing was kept: ${error instanceof Error ? error.message : String(error)}`);
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
(0, node_fs_1.rmSync)(staging, { recursive: true, force: true });
|
|
170
|
+
(0, node_fs_1.rmSync)(partial, { force: true });
|
|
171
|
+
lock.release();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../src/cli/commands/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type DrainDeadlines } from '../runtime/daemon-control.js';
|
|
2
|
+
import { type ServiceRun } from '../runtime/systemd-service.js';
|
|
3
|
+
/** `mama status` exits 0 while the daemon runs and 3 when nothing serves the install. */
|
|
4
|
+
export declare const STATUS_STOPPED_EXIT = 3;
|
|
5
|
+
/**
|
|
6
|
+
* How long `mama stop` reads again while the install's holder is half made. A daemon takes the
|
|
7
|
+
* install's lock, writes its holder file and opens its control socket in one stretch at the start
|
|
8
|
+
* of its boot, before it reads its config or starts anything that claims work (daemon.ts,
|
|
9
|
+
* bootDaemon). At its own stop it closes the socket, removes the file and lets go of the lock in
|
|
10
|
+
* one stretch too (daemon.ts:614-623); before that, while it still shuts down with the socket
|
|
11
|
+
* open, it refuses a drain at once ("MAMA is stopping"). A stop that reads in either stretch finds
|
|
12
|
+
* the lock held with no holder file (`unknown`, pid 0), which every stop reads again, or a daemon
|
|
13
|
+
* that does not answer, which the drained stop tries again. No turn runs then, and the stretch is
|
|
14
|
+
* a few file operations, so past this bound the holder is not starting or ending.
|
|
15
|
+
*/
|
|
16
|
+
export declare const CONTROL_WAIT_MS = 5000;
|
|
17
|
+
interface ControlOptions {
|
|
18
|
+
home?: string;
|
|
19
|
+
configPath?: string;
|
|
20
|
+
write?: (line: string) => void;
|
|
21
|
+
/** Milliseconds between checks while waiting for a stop; tests shorten it. */
|
|
22
|
+
pollMs?: number;
|
|
23
|
+
/** How long a stop waits for a half-made holder (CONTROL_WAIT_MS); tests shorten it. */
|
|
24
|
+
controlWaitMs?: number;
|
|
25
|
+
/** How long `mama stop` waits for the install to be released. */
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
/** How long a released install must stay free before `mama stop` reports it stopped. */
|
|
28
|
+
settleMs?: number;
|
|
29
|
+
/** Runs systemctl; tests replace it. */
|
|
30
|
+
run?: ServiceRun;
|
|
31
|
+
/** How long a drain waits on a daemon that stops answering; tests shorten them. */
|
|
32
|
+
drainDeadlines?: DrainDeadlines;
|
|
33
|
+
}
|
|
34
|
+
export declare function runStatus(args: readonly string[], options?: ControlOptions): Promise<number>;
|
|
35
|
+
/**
|
|
36
|
+
* Stop the install's daemon. A daemon is drained first: it claims nothing new, and the stop waits
|
|
37
|
+
* until its running turns and claimed inputs finish, so their replies are delivered. The drain's
|
|
38
|
+
* connection stays open through the stop, so nothing starts in between; inputs that arrive wait
|
|
39
|
+
* for the next start. `--now` skips the drain and interrupts what runs; at the next start MAMA
|
|
40
|
+
* delivers its stored result or tells its sender that it was interrupted.
|
|
41
|
+
*/
|
|
42
|
+
export declare function runStop(args: readonly string[], options?: ControlOptions): Promise<number>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/control.ts"],"names":[],"mappings":"AAYA,OAAO,EAKL,KAAK,cAAc,EAGpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,+BAA+B,CAAC;AAGvC,yFAAyF;AACzF,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,OAAQ,CAAC;AAErC,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,mFAAmF;IACnF,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AA+DD,wBAAsB,SAAS,CAC7B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAkFjB;AA8DD;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAoEjB"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONTROL_WAIT_MS = exports.STATUS_STOPPED_EXIT = void 0;
|
|
4
|
+
exports.runStatus = runStatus;
|
|
5
|
+
exports.runStop = runStop;
|
|
6
|
+
const node_os_1 = require("node:os");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const config_js_1 = require("../../runtime/config.js");
|
|
9
|
+
const prompt_js_1 = require("../prompt.js");
|
|
10
|
+
const release_check_js_1 = require("../runtime/release-check.js");
|
|
11
|
+
const node_move_journal_js_1 = require("../runtime/node-move-journal.js");
|
|
12
|
+
const update_journal_js_1 = require("../runtime/update-journal.js");
|
|
13
|
+
const daemon_control_js_1 = require("../runtime/daemon-control.js");
|
|
14
|
+
const systemd_service_js_1 = require("../runtime/systemd-service.js");
|
|
15
|
+
const daemon_js_1 = require("./daemon.js");
|
|
16
|
+
/** `mama status` exits 0 while the daemon runs and 3 when nothing serves the install. */
|
|
17
|
+
exports.STATUS_STOPPED_EXIT = 3;
|
|
18
|
+
/**
|
|
19
|
+
* How long `mama stop` reads again while the install's holder is half made. A daemon takes the
|
|
20
|
+
* install's lock, writes its holder file and opens its control socket in one stretch at the start
|
|
21
|
+
* of its boot, before it reads its config or starts anything that claims work (daemon.ts,
|
|
22
|
+
* bootDaemon). At its own stop it closes the socket, removes the file and lets go of the lock in
|
|
23
|
+
* one stretch too (daemon.ts:614-623); before that, while it still shuts down with the socket
|
|
24
|
+
* open, it refuses a drain at once ("MAMA is stopping"). A stop that reads in either stretch finds
|
|
25
|
+
* the lock held with no holder file (`unknown`, pid 0), which every stop reads again, or a daemon
|
|
26
|
+
* that does not answer, which the drained stop tries again. No turn runs then, and the stretch is
|
|
27
|
+
* a few file operations, so past this bound the holder is not starting or ending.
|
|
28
|
+
*/
|
|
29
|
+
exports.CONTROL_WAIT_MS = 5_000;
|
|
30
|
+
function localTime(ms) {
|
|
31
|
+
return typeof ms === 'number' ? new Date(ms).toLocaleString('sv-SE') : 'unknown';
|
|
32
|
+
}
|
|
33
|
+
function holderLine(holder) {
|
|
34
|
+
return `${holder.command} (pid ${holder.pid}) holds the install`;
|
|
35
|
+
}
|
|
36
|
+
function statusLines(status) {
|
|
37
|
+
const lines = [
|
|
38
|
+
`running: ${String(status.command)} (pid ${String(status.pid)}, version ${String(status.version)}${typeof status.node === 'string' ? `, Node.js ${status.node}` : ''}, since ${localTime(status.startedAt)})`,
|
|
39
|
+
];
|
|
40
|
+
if (status.stage !== 'running')
|
|
41
|
+
lines.push(`boot stage: ${String(status.stage)}`);
|
|
42
|
+
const drain = status.drain;
|
|
43
|
+
if (drain) {
|
|
44
|
+
lines.push(`claims held for ${drain.holds === 1 ? 'a drain' : `${drain.holds} drains`} since ${localTime(drain.since)}: new inputs wait`);
|
|
45
|
+
}
|
|
46
|
+
const update = status.update;
|
|
47
|
+
if (update) {
|
|
48
|
+
lines.push(`claims held since ${localTime(update.since)} for the update to ${update.to}: new inputs wait until mama update confirms it`);
|
|
49
|
+
}
|
|
50
|
+
const turns = Array.isArray(status.runningTurns)
|
|
51
|
+
? status.runningTurns
|
|
52
|
+
: [];
|
|
53
|
+
lines.push(turns.length === 0
|
|
54
|
+
? 'turns running: none'
|
|
55
|
+
: `turns running: ${turns.map((turn) => `${turn.session} ${turn.count}`).join(', ')}`);
|
|
56
|
+
const inputs = Array.isArray(status.inputs)
|
|
57
|
+
? status.inputs
|
|
58
|
+
: [];
|
|
59
|
+
lines.push(inputs.length === 0
|
|
60
|
+
? 'inputs waiting: none'
|
|
61
|
+
: `inputs waiting: ${inputs.map((input) => `${input.status} ${input.count}`).join(', ')}`);
|
|
62
|
+
const connectors = Array.isArray(status.connectors)
|
|
63
|
+
? status.connectors
|
|
64
|
+
: [];
|
|
65
|
+
for (const connector of connectors) {
|
|
66
|
+
const poll = connector.lastPoll ? localTime(Date.parse(connector.lastPoll)) : 'not yet';
|
|
67
|
+
lines.push(`connector ${connector.name}: ${connector.healthy ? 'ok' : 'failing'}, last poll ${poll}` +
|
|
68
|
+
(connector.error ? `, error: ${connector.error}` : ''));
|
|
69
|
+
}
|
|
70
|
+
const lastError = status.lastError;
|
|
71
|
+
if (lastError)
|
|
72
|
+
lines.push(`last error ${localTime(lastError.at)}: ${lastError.line}`);
|
|
73
|
+
return lines;
|
|
74
|
+
}
|
|
75
|
+
async function runStatus(args, options = {}) {
|
|
76
|
+
const json = args.length === 1 && args[0] === '--json';
|
|
77
|
+
if (args.length > 1 || (args.length === 1 && !json)) {
|
|
78
|
+
throw new prompt_js_1.CliInputError('Usage: mama status [--json]');
|
|
79
|
+
}
|
|
80
|
+
const write = options.write ?? ((line) => console.log(line));
|
|
81
|
+
// The service line is extra: a failing service manager is reported in it, not in place of status.
|
|
82
|
+
let service;
|
|
83
|
+
try {
|
|
84
|
+
const launchd = (0, daemon_js_1.launchdService)();
|
|
85
|
+
const unit = (0, systemd_service_js_1.systemdUnitState)(options.home ?? (0, node_os_1.homedir)(), options.run ?? systemd_service_js_1.defaultServiceRun);
|
|
86
|
+
service = launchd.loaded ? 'launchd (loaded)' : unit !== null ? `systemd (${unit})` : null;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
service = `unknown (${error instanceof Error ? error.message : String(error)})`;
|
|
90
|
+
}
|
|
91
|
+
const reply = await (0, daemon_js_1.askDaemon)('status', options);
|
|
92
|
+
// The daemon's last release check, from its file: it outlives the daemon, and nothing here asks
|
|
93
|
+
// the registry.
|
|
94
|
+
const home = options.home ?? (0, node_os_1.homedir)();
|
|
95
|
+
const release = (0, release_check_js_1.releaseReport)((0, node_path_1.dirname)(options.configPath ?? (0, config_js_1.defaultConfigPath)(home)), home);
|
|
96
|
+
const releaseLines = () => release === null
|
|
97
|
+
? []
|
|
98
|
+
: [
|
|
99
|
+
`release: ${release.detail}${release.context ? ` (${release.context})` : ''}`,
|
|
100
|
+
...(release.steps ?? []).map((step) => ` update: ${step}`),
|
|
101
|
+
...(release.fix === undefined ? [] : [` fix: ${release.fix}`]),
|
|
102
|
+
];
|
|
103
|
+
if (reply.state === 'stopped') {
|
|
104
|
+
// A stopped install may be stopped by an unfinished update: start.sh exits on its hold file.
|
|
105
|
+
// So may a move of the managed Node, which holds it on the same file.
|
|
106
|
+
let update;
|
|
107
|
+
try {
|
|
108
|
+
const root = (0, node_path_1.dirname)(options.configPath ?? (0, config_js_1.defaultConfigPath)(home));
|
|
109
|
+
const move = (0, node_move_journal_js_1.readNodeMoveJournal)((0, node_move_journal_js_1.nodeMovePlaces)(root).journal);
|
|
110
|
+
update = move === null ? (0, update_journal_js_1.unfinishedUpdate)(root) : { move };
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
update = { unreadable: error instanceof Error ? error.message : String(error) };
|
|
114
|
+
}
|
|
115
|
+
const updateLine = update === null
|
|
116
|
+
? null
|
|
117
|
+
: 'unreadable' in update
|
|
118
|
+
? `update journal cannot be read: ${update.unreadable}; mama doctor names it`
|
|
119
|
+
: 'move' in update
|
|
120
|
+
? `Node move unfinished: ${update.move.from} → ${update.move.to} (${update.move.phase}, step ${update.move.step}); run the install command again, which finishes or undoes it: ${node_move_journal_js_1.INSTALL_COMMAND}`
|
|
121
|
+
: 'journal' in update
|
|
122
|
+
? `update unfinished: ${update.journal.from} → ${update.journal.to} (${update.journal.phase}, step ${update.journal.step}); resolve it with: ${update.command}`
|
|
123
|
+
: `update hold file ${update.hold} is in place with no journal, so start.sh exits at once; remove it, then mama service start`;
|
|
124
|
+
if (json) {
|
|
125
|
+
write(JSON.stringify({
|
|
126
|
+
state: 'stopped',
|
|
127
|
+
holder: reply.holder,
|
|
128
|
+
service,
|
|
129
|
+
release: release?.state ?? null,
|
|
130
|
+
update: updateLine,
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
write(reply.holder ? `stopped; ${holderLine(reply.holder)}` : 'stopped');
|
|
135
|
+
if (updateLine)
|
|
136
|
+
write(updateLine);
|
|
137
|
+
if (service)
|
|
138
|
+
write(`service: ${service}`);
|
|
139
|
+
for (const line of releaseLines())
|
|
140
|
+
write(line);
|
|
141
|
+
}
|
|
142
|
+
return exports.STATUS_STOPPED_EXIT;
|
|
143
|
+
}
|
|
144
|
+
if (reply.reply.ok !== true) {
|
|
145
|
+
throw new prompt_js_1.CliInputError(`The daemon refused status: ${String(reply.reply.error)}`);
|
|
146
|
+
}
|
|
147
|
+
const status = reply.reply.status;
|
|
148
|
+
if (json) {
|
|
149
|
+
write(JSON.stringify({ state: 'running', status, service, release: release?.state ?? null }));
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
for (const line of statusLines(status))
|
|
153
|
+
write(line);
|
|
154
|
+
if (service)
|
|
155
|
+
write(`service: ${service}`);
|
|
156
|
+
for (const line of releaseLines())
|
|
157
|
+
write(line);
|
|
158
|
+
}
|
|
159
|
+
return 0;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Wait until the stopped holder's lock is gone. A different holder appearing means something
|
|
163
|
+
* started in its place, such as a service manager restarting the daemon; that is not a stop.
|
|
164
|
+
*/
|
|
165
|
+
async function waitForRelease(stopping, options, write) {
|
|
166
|
+
const paths = (0, daemon_js_1.installControlPaths)(options);
|
|
167
|
+
const pollMs = options.pollMs ?? 500;
|
|
168
|
+
const timeoutMs = options.timeoutMs ?? 120_000;
|
|
169
|
+
const started = Date.now();
|
|
170
|
+
let reported = started;
|
|
171
|
+
for (;;) {
|
|
172
|
+
const holder = (0, daemon_control_js_1.lockHolder)(paths);
|
|
173
|
+
if (holder === null) {
|
|
174
|
+
// A supervisor may start a replacement after a pause; the install must stay free a moment.
|
|
175
|
+
await new Promise((resolve) => setTimeout(resolve, options.settleMs ?? 3_000));
|
|
176
|
+
const next = (0, daemon_control_js_1.lockHolder)(paths);
|
|
177
|
+
return next === null ? { kind: 'released' } : { kind: 'replaced', holder: next };
|
|
178
|
+
}
|
|
179
|
+
if (holder.nonce !== stopping.nonce)
|
|
180
|
+
return { kind: 'replaced', holder };
|
|
181
|
+
if (Date.now() - started >= timeoutMs)
|
|
182
|
+
return { kind: 'timeout', holder };
|
|
183
|
+
if (Date.now() - reported >= 30_000) {
|
|
184
|
+
write(`still stopping: ${holderLine(holder)}`);
|
|
185
|
+
reported = Date.now();
|
|
186
|
+
}
|
|
187
|
+
await new Promise((resolve) => setTimeout(resolve, pollMs));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function finish(outcome, write, done) {
|
|
191
|
+
if (outcome.kind === 'released') {
|
|
192
|
+
write(done);
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
if (outcome.kind === 'replaced') {
|
|
196
|
+
write(`stopped, but ${holderLine(outcome.holder)} now: something started it again`);
|
|
197
|
+
return 1;
|
|
198
|
+
}
|
|
199
|
+
write(`not stopped yet: ${holderLine(outcome.holder)}; check mama status`);
|
|
200
|
+
return 1;
|
|
201
|
+
}
|
|
202
|
+
function waitingFor(counts) {
|
|
203
|
+
const turns = `${counts.running} turn${counts.running === 1 ? '' : 's'} running`;
|
|
204
|
+
const inputs = `${counts.claimed} input${counts.claimed === 1 ? '' : 's'} claimed`;
|
|
205
|
+
return `${turns}, ${inputs}`;
|
|
206
|
+
}
|
|
207
|
+
function minutes(ms) {
|
|
208
|
+
return `${Math.ceil(ms / 60_000)} min`;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Stop the install's daemon. A daemon is drained first: it claims nothing new, and the stop waits
|
|
212
|
+
* until its running turns and claimed inputs finish, so their replies are delivered. The drain's
|
|
213
|
+
* connection stays open through the stop, so nothing starts in between; inputs that arrive wait
|
|
214
|
+
* for the next start. `--now` skips the drain and interrupts what runs; at the next start MAMA
|
|
215
|
+
* delivers its stored result or tells its sender that it was interrupted.
|
|
216
|
+
*/
|
|
217
|
+
async function runStop(args, options = {}) {
|
|
218
|
+
const now = args.length === 1 && args[0] === '--now';
|
|
219
|
+
if (args.length > 1 || (args.length === 1 && !now)) {
|
|
220
|
+
throw new prompt_js_1.CliInputError('Usage: mama stop [--now]');
|
|
221
|
+
}
|
|
222
|
+
const write = options.write ?? ((line) => console.log(line));
|
|
223
|
+
if (now)
|
|
224
|
+
return await stopNow(options, write);
|
|
225
|
+
const paths = (0, daemon_js_1.installControlPaths)(options);
|
|
226
|
+
let reported = false;
|
|
227
|
+
const onProgress = (progress) => {
|
|
228
|
+
if (progress.idle)
|
|
229
|
+
return;
|
|
230
|
+
write(reported
|
|
231
|
+
? `still draining: ${waitingFor(progress)}`
|
|
232
|
+
: `draining: new inputs wait; waiting for ${waitingFor(progress)} (at most ${minutes(progress.bound)})`);
|
|
233
|
+
reported = true;
|
|
234
|
+
};
|
|
235
|
+
// A daemon still opening its control socket is tried again (CONTROL_WAIT_MS); booting, it has
|
|
236
|
+
// nothing to drain.
|
|
237
|
+
const started = Date.now();
|
|
238
|
+
let drain = null;
|
|
239
|
+
while (drain === null) {
|
|
240
|
+
const holder = await namedHolder(options, started);
|
|
241
|
+
// A replay, backfill or register-owner is left to finish; a stopped install has nothing to
|
|
242
|
+
// drain. A holder still unnamed past the bound goes there too, which reports it.
|
|
243
|
+
if (holder?.command !== 'daemon')
|
|
244
|
+
return await stopNow(options, write, started);
|
|
245
|
+
drain = await (0, daemon_control_js_1.drainDaemon)(paths, onProgress, options.drainDeadlines);
|
|
246
|
+
if (drain !== null)
|
|
247
|
+
break;
|
|
248
|
+
if (Date.now() - started >= (options.controlWaitMs ?? exports.CONTROL_WAIT_MS)) {
|
|
249
|
+
write(`not stopped: ${holderLine(holder)} does not answer on its control socket; mama stop --now stops it without draining`);
|
|
250
|
+
return 1;
|
|
251
|
+
}
|
|
252
|
+
await new Promise((resolve) => setTimeout(resolve, options.pollMs ?? 500));
|
|
253
|
+
}
|
|
254
|
+
try {
|
|
255
|
+
const outcome = await drain.outcome;
|
|
256
|
+
if (outcome.kind === 'bound') {
|
|
257
|
+
write(`not stopped: still ${waitingFor(outcome)} after ${minutes(outcome.bound)}; nothing changed, new inputs are claimed again (mama stop --now interrupts them)`);
|
|
258
|
+
return 1;
|
|
259
|
+
}
|
|
260
|
+
if (outcome.kind === 'refused') {
|
|
261
|
+
// A daemon older than the drain answers `unknown op`.
|
|
262
|
+
write(`not stopped: the daemon refused the drain: ${outcome.error}; mama stop --now stops it without draining`);
|
|
263
|
+
return 1;
|
|
264
|
+
}
|
|
265
|
+
if (outcome.kind === 'silent') {
|
|
266
|
+
write(`not stopped: ${outcome.error}; mama stop --now stops it without draining`);
|
|
267
|
+
return 1;
|
|
268
|
+
}
|
|
269
|
+
if (outcome.kind === 'closed') {
|
|
270
|
+
write('not stopped by this command: the daemon ended the drain before it was idle; check mama status');
|
|
271
|
+
return 1;
|
|
272
|
+
}
|
|
273
|
+
write('drained: nothing runs; stopping');
|
|
274
|
+
// Still held: the service manager's stop or the socket's stop comes next.
|
|
275
|
+
return await stopNow(options, write);
|
|
276
|
+
}
|
|
277
|
+
finally {
|
|
278
|
+
drain.release();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* The install's holder, read again while the lock is held with no holder file (`unknown`, pid 0),
|
|
283
|
+
* until `CONTROL_WAIT_MS` after `started`: such a holder is between its lock and its holder file,
|
|
284
|
+
* or between removing the file and letting go. The stop then judges the holder it will wait for,
|
|
285
|
+
* with its own nonce, not a placeholder.
|
|
286
|
+
*/
|
|
287
|
+
async function namedHolder(options, started) {
|
|
288
|
+
const paths = (0, daemon_js_1.installControlPaths)(options);
|
|
289
|
+
for (;;) {
|
|
290
|
+
const holder = (0, daemon_control_js_1.lockHolder)(paths);
|
|
291
|
+
if (holder?.command !== 'unknown')
|
|
292
|
+
return holder;
|
|
293
|
+
if (Date.now() - started >= (options.controlWaitMs ?? exports.CONTROL_WAIT_MS))
|
|
294
|
+
return holder;
|
|
295
|
+
await new Promise((resolve) => setTimeout(resolve, options.pollMs ?? 500));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Today's stop, also `--now`. A daemon run by a loaded LaunchAgent is unloaded, so KeepAlive does
|
|
300
|
+
* not restart it; any other daemon is asked through the control socket. A replay, backfill or
|
|
301
|
+
* register-owner is left to finish. A running turn is interrupted. `started` is when the stop
|
|
302
|
+
* began, so a drained stop that comes here has used up part of the wait for an unnamed holder.
|
|
303
|
+
*/
|
|
304
|
+
async function stopNow(options, write, started = Date.now()) {
|
|
305
|
+
let holder = await namedHolder(options, started);
|
|
306
|
+
const service = (0, daemon_js_1.launchdService)();
|
|
307
|
+
const run = options.run ?? systemd_service_js_1.defaultServiceRun;
|
|
308
|
+
const unit = (0, systemd_service_js_1.systemdUnitState)(options.home ?? (0, node_os_1.homedir)(), run);
|
|
309
|
+
// A service manager restarts its daemon, so it is stopped first, whichever process holds the
|
|
310
|
+
// install now: a loaded LaunchAgent is unloaded, and a systemd unit that runs or waits to
|
|
311
|
+
// restart is stopped (which also cancels a pending restart).
|
|
312
|
+
if (service.loaded)
|
|
313
|
+
(0, daemon_js_1.bootoutLaunchdService)();
|
|
314
|
+
const unitStopped = unit !== null && unit !== 'inactive' && unit !== 'failed';
|
|
315
|
+
if (unitStopped) {
|
|
316
|
+
const result = run('systemctl', ['--user', 'stop', systemd_service_js_1.SYSTEMD_UNIT]);
|
|
317
|
+
if (result.error || result.status !== 0) {
|
|
318
|
+
write(`not stopped: systemctl --user stop ${systemd_service_js_1.SYSTEMD_UNIT} failed: ${result.error?.message ?? (`${result.stderr ?? ''}`.trim() || `exit ${String(result.status)}`)}`);
|
|
319
|
+
return 1;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const unloaded = service.loaded
|
|
323
|
+
? ' (launchd service unloaded)'
|
|
324
|
+
: unitStopped
|
|
325
|
+
? ' (systemd unit stopped)'
|
|
326
|
+
: '';
|
|
327
|
+
// systemctl stop returns once the unit's daemon has exited; what holds the install now is
|
|
328
|
+
// something else, such as a daemon started in a terminal.
|
|
329
|
+
if (unitStopped)
|
|
330
|
+
holder = (0, daemon_control_js_1.lockHolder)((0, daemon_js_1.installControlPaths)(options));
|
|
331
|
+
if (holder === null) {
|
|
332
|
+
write(unloaded ? `stopped${unloaded}` : 'already stopped');
|
|
333
|
+
return 0;
|
|
334
|
+
}
|
|
335
|
+
if (holder.command !== 'daemon') {
|
|
336
|
+
write(`not stopped${unloaded}: ${holderLine(holder)} and stops when it finishes`);
|
|
337
|
+
return 1;
|
|
338
|
+
}
|
|
339
|
+
if (service.loaded && service.pid === holder.pid) {
|
|
340
|
+
return finish(await waitForRelease(holder, options, write), write, `stopped${unloaded}; mama service start starts it again`);
|
|
341
|
+
}
|
|
342
|
+
const reply = await (0, daemon_js_1.askDaemon)('stop', options);
|
|
343
|
+
if (reply.state === 'stopped') {
|
|
344
|
+
write(`not stopped${unloaded}: ${holderLine(holder)} does not answer on its control socket`);
|
|
345
|
+
return 1;
|
|
346
|
+
}
|
|
347
|
+
if (reply.reply.ok !== true) {
|
|
348
|
+
write(`not stopped${unloaded}: ${String(reply.reply.error)}`);
|
|
349
|
+
return 1;
|
|
350
|
+
}
|
|
351
|
+
write('stopping');
|
|
352
|
+
return finish(await waitForRelease(holder, options, write), write, `stopped${unloaded}`);
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../../src/cli/commands/control.ts"],"names":[],"mappings":"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"}
|