@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.
- package/CHANGELOG.md +182 -0
- package/README.md +25 -10
- package/dist/api/attachment-actions.d.ts.map +1 -1
- package/dist/api/attachment-actions.js +8 -7
- package/dist/api/attachment-actions.js.map +1 -1
- package/dist/api/code-act-actions.d.ts.map +1 -1
- package/dist/api/code-act-actions.js +5 -2
- package/dist/api/code-act-actions.js.map +1 -1
- package/dist/api/drive-actions.d.ts +4 -0
- package/dist/api/drive-actions.d.ts.map +1 -1
- package/dist/api/drive-actions.js +15 -7
- package/dist/api/drive-actions.js.map +1 -1
- package/dist/api/drive-delivery.d.ts.map +1 -1
- package/dist/api/drive-delivery.js +8 -3
- package/dist/api/drive-delivery.js.map +1 -1
- package/dist/api/member-enrollment.d.ts +2 -0
- package/dist/api/member-enrollment.d.ts.map +1 -1
- package/dist/api/member-enrollment.js +1 -1
- package/dist/api/member-enrollment.js.map +1 -1
- package/dist/api/member-lifecycle.d.ts +2 -0
- package/dist/api/member-lifecycle.d.ts.map +1 -1
- package/dist/api/member-lifecycle.js +1 -1
- package/dist/api/member-lifecycle.js.map +1 -1
- package/dist/api/owner-timezone-actions.d.ts +2 -0
- package/dist/api/owner-timezone-actions.d.ts.map +1 -1
- package/dist/api/owner-timezone-actions.js.map +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/viewer-server.d.ts +1 -0
- package/dist/api/viewer-server.d.ts.map +1 -1
- package/dist/api/viewer-server.js +34 -0
- package/dist/api/viewer-server.js.map +1 -1
- package/dist/api/work-actions.d.ts.map +1 -1
- package/dist/api/work-actions.js +27 -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 +13 -0
- package/dist/cli/commands/backup.d.ts.map +1 -0
- package/dist/cli/commands/backup.js +137 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/control.d.ts +26 -0
- package/dist/cli/commands/control.d.ts.map +1 -0
- package/dist/cli/commands/control.js +193 -0
- package/dist/cli/commands/control.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +49 -3
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +253 -75
- 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.d.ts.map +1 -1
- package/dist/cli/commands/init.js +3 -2
- 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/register-owner.d.ts.map +1 -1
- package/dist/cli/commands/register-owner.js +12 -0
- package/dist/cli/commands/register-owner.js.map +1 -1
- package/dist/cli/commands/restore.d.ts +14 -0
- package/dist/cli/commands/restore.d.ts.map +1 -0
- package/dist/cli/commands/restore.js +130 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/service.d.ts +28 -0
- package/dist/cli/commands/service.d.ts.map +1 -0
- package/dist/cli/commands/service.js +278 -0
- package/dist/cli/commands/service.js.map +1 -0
- 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 +262 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/index.js +67 -20
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/launch-files.d.ts +83 -0
- package/dist/cli/launch-files.d.ts.map +1 -1
- package/dist/cli/launch-files.js +231 -15
- package/dist/cli/launch-files.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 +114 -0
- package/dist/cli/runtime/backup.d.ts.map +1 -0
- package/dist/cli/runtime/backup.js +564 -0
- package/dist/cli/runtime/backup.js.map +1 -0
- package/dist/cli/runtime/claude-caller-config.d.ts +3 -1
- package/dist/cli/runtime/claude-caller-config.d.ts.map +1 -1
- package/dist/cli/runtime/claude-caller-config.js +14 -2
- package/dist/cli/runtime/claude-caller-config.js.map +1 -1
- package/dist/cli/runtime/daemon-control.d.ts +84 -0
- package/dist/cli/runtime/daemon-control.d.ts.map +1 -0
- package/dist/cli/runtime/daemon-control.js +266 -0
- package/dist/cli/runtime/daemon-control.js.map +1 -0
- package/dist/cli/runtime/diagnostics.d.ts +43 -0
- package/dist/cli/runtime/diagnostics.d.ts.map +1 -0
- package/dist/cli/runtime/diagnostics.js +953 -0
- package/dist/cli/runtime/diagnostics.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/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/connectors/chatwork/index.js +1 -1
- package/dist/connectors/chatwork/index.js.map +1 -1
- package/dist/connectors/config-loader.d.ts +2 -1
- package/dist/connectors/config-loader.d.ts.map +1 -1
- package/dist/connectors/config-loader.js +3 -2
- package/dist/connectors/config-loader.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/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/slack/index.js +1 -1
- package/dist/connectors/slack/index.js.map +1 -1
- package/dist/runtime/action-surface.d.ts.map +1 -1
- package/dist/runtime/action-surface.js +6 -0
- package/dist/runtime/action-surface.js.map +1 -1
- package/dist/runtime/backend-security.d.ts +3 -0
- package/dist/runtime/backend-security.d.ts.map +1 -1
- package/dist/runtime/backend-security.js +13 -5
- package/dist/runtime/backend-security.js.map +1 -1
- package/dist/runtime/claude-caller-hook.d.ts +14 -0
- package/dist/runtime/claude-caller-hook.d.ts.map +1 -1
- package/dist/runtime/claude-caller-hook.js +21 -1
- package/dist/runtime/claude-caller-hook.js.map +1 -1
- package/dist/runtime/config.d.ts +8 -0
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +17 -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-session.d.ts.map +1 -1
- package/dist/runtime/member-session.js +11 -3
- package/dist/runtime/member-session.js.map +1 -1
- package/dist/runtime/member-system-prompt.d.ts +2 -0
- package/dist/runtime/member-system-prompt.d.ts.map +1 -1
- package/dist/runtime/member-system-prompt.js +11 -3
- package/dist/runtime/member-system-prompt.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 +25 -4
- package/dist/runtime/native-session.js.map +1 -1
- package/dist/runtime/owner-authority.d.ts +2 -0
- package/dist/runtime/owner-authority.d.ts.map +1 -1
- package/dist/runtime/owner-authority.js +4 -0
- package/dist/runtime/owner-authority.js.map +1 -1
- package/dist/runtime/owner-runtime.d.ts +2 -0
- package/dist/runtime/owner-runtime.d.ts.map +1 -1
- package/dist/runtime/owner-runtime.js +3 -0
- 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 +9 -7
- package/dist/runtime/owner-system-prompt.js.map +1 -1
- package/dist/runtime/principal-access.d.ts.map +1 -1
- package/dist/runtime/principal-access.js +1 -0
- package/dist/runtime/principal-access.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/web-fetch-scope.d.ts +20 -0
- package/dist/runtime/web-fetch-scope.d.ts.map +1 -0
- package/dist/runtime/web-fetch-scope.js +68 -0
- package/dist/runtime/web-fetch-scope.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 +3 -1
- package/dist/tools/document-toolkit.js.map +1 -1
- package/dist/tools/office-render.d.ts.map +1 -1
- package/dist/tools/office-render.js +3 -0
- package/dist/tools/office-render.js.map +1 -1
- package/package.json +4 -3
- package/toolkit/requirements.in +11 -0
- package/toolkit/requirements.lock +984 -5
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runLogs = runLogs;
|
|
4
|
+
/**
|
|
5
|
+
* `mama logs [-n N] [--follow]`: the daemon's own log (`logging.file`, daemon.log by default), its
|
|
6
|
+
* last N lines (50), then with --follow each line as the daemon writes it. Following keeps up across
|
|
7
|
+
* a rotation: when the file has been emptied, what was written since the last read is taken from the
|
|
8
|
+
* newest archive, then the file is read from its start.
|
|
9
|
+
*/
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_os_1 = require("node:os");
|
|
12
|
+
const node_string_decoder_1 = require("node:string_decoder");
|
|
13
|
+
const node_zlib_1 = require("node:zlib");
|
|
14
|
+
const rotating_log_js_1 = require("../../runtime/rotating-log.js");
|
|
15
|
+
const config_js_1 = require("../../runtime/config.js");
|
|
16
|
+
const prompt_js_1 = require("../prompt.js");
|
|
17
|
+
const USAGE = 'Usage: mama logs [-n <lines>] [--follow]';
|
|
18
|
+
const DEFAULT_LINES = 50;
|
|
19
|
+
function parseArgs(args) {
|
|
20
|
+
let lines = DEFAULT_LINES;
|
|
21
|
+
let follow = false;
|
|
22
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
23
|
+
const arg = args[i];
|
|
24
|
+
if (arg === '--follow' || arg === '-f') {
|
|
25
|
+
follow = true;
|
|
26
|
+
}
|
|
27
|
+
else if (arg === '-n') {
|
|
28
|
+
const value = args[i + 1];
|
|
29
|
+
if (value === undefined || !/^\d+$/.test(value))
|
|
30
|
+
throw new prompt_js_1.CliInputError(USAGE);
|
|
31
|
+
lines = Number(value);
|
|
32
|
+
i += 1;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
throw new prompt_js_1.CliInputError(USAGE);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { lines, follow };
|
|
39
|
+
}
|
|
40
|
+
async function runLogs(args, options = {}) {
|
|
41
|
+
const { lines, follow } = parseArgs(args);
|
|
42
|
+
const write = options.write ?? ((text) => void process.stdout.write(text));
|
|
43
|
+
const path = (0, config_js_1.loadConfig)({ home: options.home ?? (0, node_os_1.homedir)() }).logging.file;
|
|
44
|
+
if (!(0, node_fs_1.existsSync)(path) && !follow) {
|
|
45
|
+
throw new prompt_js_1.CliInputError(`${path} does not exist yet; the daemon writes it once it starts`);
|
|
46
|
+
}
|
|
47
|
+
let inode = -1;
|
|
48
|
+
let position = 0;
|
|
49
|
+
if ((0, node_fs_1.existsSync)(path)) {
|
|
50
|
+
// Read where the file stands first: a line written meanwhile is printed twice, never skipped.
|
|
51
|
+
const stat = (0, node_fs_1.statSync)(path);
|
|
52
|
+
inode = stat.ino;
|
|
53
|
+
position = stat.size;
|
|
54
|
+
// Just after a rotation the file holds only a few lines; the rest come from the archives.
|
|
55
|
+
write((0, rotating_log_js_1.readLastLines)(path, rotating_log_js_1.DAEMON_LOG_LIMITS.keep, lines).join(''));
|
|
56
|
+
}
|
|
57
|
+
if (!follow)
|
|
58
|
+
return;
|
|
59
|
+
// A character split across two reads is held until its last byte arrives.
|
|
60
|
+
const decoder = new node_string_decoder_1.StringDecoder('utf8');
|
|
61
|
+
// A rotation writes a new newest archive; that, not the file's size, says one happened, since the
|
|
62
|
+
// file can grow past the last read position again before the next poll.
|
|
63
|
+
const archive = (0, rotating_log_js_1.archivePath)(path, 1);
|
|
64
|
+
const archiveId = () => ((0, node_fs_1.existsSync)(archive) ? (0, node_fs_1.statSync)(archive).ino : null);
|
|
65
|
+
let lastArchive = archiveId();
|
|
66
|
+
const pollMs = options.pollMs ?? 500;
|
|
67
|
+
while (!options.signal?.aborted) {
|
|
68
|
+
await new Promise((resolve) => setTimeout(resolve, pollMs));
|
|
69
|
+
let stat;
|
|
70
|
+
try {
|
|
71
|
+
stat = (0, node_fs_1.statSync)(path);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// Before the daemon's first write, or while the file is being replaced.
|
|
75
|
+
if (error.code === 'ENOENT')
|
|
76
|
+
continue;
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
const currentArchive = archiveId();
|
|
80
|
+
if (stat.ino !== inode) {
|
|
81
|
+
inode = stat.ino;
|
|
82
|
+
position = 0;
|
|
83
|
+
}
|
|
84
|
+
else if (currentArchive !== null && currentArchive !== lastArchive) {
|
|
85
|
+
// Rotated: the lines written after the last read went into the newest archive.
|
|
86
|
+
const archived = (0, node_zlib_1.gunzipSync)((0, node_fs_1.readFileSync)(archive));
|
|
87
|
+
if (archived.length > position)
|
|
88
|
+
write(decoder.write(archived.subarray(position)));
|
|
89
|
+
position = 0;
|
|
90
|
+
}
|
|
91
|
+
else if (stat.size < position) {
|
|
92
|
+
position = 0;
|
|
93
|
+
}
|
|
94
|
+
lastArchive = currentArchive;
|
|
95
|
+
if (stat.size <= position)
|
|
96
|
+
continue;
|
|
97
|
+
const fd = (0, node_fs_1.openSync)(path, 'r');
|
|
98
|
+
try {
|
|
99
|
+
const chunk = Buffer.alloc(stat.size - position);
|
|
100
|
+
const read = (0, node_fs_1.readSync)(fd, chunk, 0, chunk.length, position);
|
|
101
|
+
position += read;
|
|
102
|
+
write(decoder.write(chunk.subarray(0, read)));
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
(0, node_fs_1.closeSync)(fd);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-owner.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/register-owner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"register-owner.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/register-owner.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAcD,oFAAoF;AACpF,wBAAsB,gBAAgB,CACpC,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,OAAO,CAAC,kBAAkB,CAAC,CAkB7B"}
|
|
@@ -14,6 +14,7 @@ const owner_authority_js_1 = require("../../runtime/owner-authority.js");
|
|
|
14
14
|
const source_archive_js_1 = require("../../storage/source-archive.js");
|
|
15
15
|
const prompt_js_1 = require("../prompt.js");
|
|
16
16
|
const daemon_js_1 = require("./daemon.js");
|
|
17
|
+
const daemon_control_js_1 = require("../runtime/daemon-control.js");
|
|
17
18
|
const emptyCounts = () => ({
|
|
18
19
|
principalsCreated: 0,
|
|
19
20
|
membersCreated: 0,
|
|
@@ -38,6 +39,17 @@ async function runRegisterOwner(args = [], options = {}) {
|
|
|
38
39
|
if (!memberRoot)
|
|
39
40
|
throw new prompt_js_1.CliInputError('Set member_root before mama register-owner');
|
|
40
41
|
const root = (0, node_path_1.dirname)(configPath);
|
|
42
|
+
// The cutover writes the daemon's database and raw stores, so no daemon may run beside it.
|
|
43
|
+
const lock = (0, daemon_control_js_1.acquireInstallLock)((0, daemon_control_js_1.daemonControlPaths)(root), 'register-owner');
|
|
44
|
+
try {
|
|
45
|
+
(0, daemon_control_js_1.refuseWhileRestoring)(root);
|
|
46
|
+
return await registerOwnerHolding(root, config, memberRoot, externalId);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
lock.release();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function registerOwnerHolding(root, config, memberRoot, externalId) {
|
|
41
53
|
const ledgerPath = (0, node_path_1.join)(root, 'runtime', 'owner-message-ledger.json');
|
|
42
54
|
if ((0, node_fs_1.existsSync)(ledgerPath)) {
|
|
43
55
|
const entry = new telegram_message_ledger_js_1.OwnerMessageLedger(ledgerPath)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-owner.js","sourceRoot":"","sources":["../../../src/cli/commands/register-owner.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"register-owner.js","sourceRoot":"","sources":["../../../src/cli/commands/register-owner.ts"],"names":[],"mappings":";;AA6CA,4CAqBC;AAlED,qCAAqC;AACrC,qCAAkC;AAClC,yCAA0C;AAC1C,sDAAyF;AACzF,wGAAmG;AACnG,uDAAwE;AACxE,yDAA4D;AAC5D,2EAAwE;AACxE,0FAA+E;AAC/E,yEAAkE;AAClE,uEAA2D;AAC3D,4CAA6C;AAC7C,2CAAiD;AACjD,oEAIsC;AActC,MAAM,WAAW,GAAG,GAAuB,EAAE,CAAC,CAAC;IAC7C,iBAAiB,EAAE,CAAC;IACpB,cAAc,EAAE,CAAC;IACjB,eAAe,EAAE,CAAC;IAClB,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC;IACX,kBAAkB,EAAE,CAAC;IACrB,SAAS,EAAE,CAAC;IACZ,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,CAAC;CAClB,CAAC,CAAC;AAEH,oFAAoF;AAC7E,KAAK,UAAU,gBAAgB,CACpC,OAA0B,EAAE,EAC5B,UAAkD,EAAE;IAEpD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,IAAI,yBAAa,CAAC,0CAA0C,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAA,iBAAO,GAAE,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAA,6BAAiB,EAAC,IAAI,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,IAAA,sBAAU,EAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;IACtC,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,yBAAa,CAAC,4CAA4C,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,IAAA,mBAAO,EAAC,UAAU,CAAC,CAAC;IACjC,2FAA2F;IAC3F,MAAM,IAAI,GAAG,IAAA,sCAAkB,EAAC,IAAA,sCAAkB,EAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC5E,IAAI,CAAC;QACH,IAAA,wCAAoB,EAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC1E,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAY,EACZ,MAAqC,EACrC,UAAkB,EAClB,UAAkB;IAElB,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,SAAS,EAAE,2BAA2B,CAAC,CAAC;IACtE,IAAI,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,+CAAkB,CAAC,UAAU,CAAC;aAC7C,iBAAiB,CAAC,UAAU,CAAC;aAC7B,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC;QACpE,IAAI,KAAK;YACP,MAAM,IAAI,yBAAa,CAAC,+CAA+C,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,IAAA,6BAAgB,EAAC,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,4BAAQ,CAAC,IAAA,gBAAI,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IACxD,IAAI,MAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,qCAAyB,EAAC,OAAO,CAAC,CAAC;QAChD,wEAAwE;QACxE,MAAM,QAAQ,GAAG,OAAO;aACrB,OAAO,CACN;;;gFAGwE,CACzE;aACA,GAAG,CAAC,8BAAkB,EAAE,UAAU,CAAyD,CAAC;QAC/F,IAAI,QAAQ;YACV,MAAM,IAAI,yBAAa,CACrB,gCAAgC,QAAQ,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CACjG,CAAC;QACJ,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC1E,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;YACxC,MAAM,IAAI,yBAAa,CAAC,gDAAgD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5F,IAAI,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAA,mCAAc,EAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5E,MAAM,GAAG,WAAW,EAAE,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GACd,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC;gBACpD,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,mCAAc,EAAC,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,YAAY,UAAU,EAAE,CAAC;YACzC,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;gBACrD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,8BAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC1E,IAAI,MAAM,KAAK,UAAU;oBACvB,MAAM,IAAI,yBAAa,CACrB,wEAAwE,CACzE,CAAC;gBACJ,MAAM,CAAC,iBAAiB,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxD,IAAI,MAAc,CAAC;gBACnB,IAAI,OAAO,EAAE,WAAW,KAAK,8BAAkB,EAAE,CAAC;oBAChD,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC;wBACjC,SAAS,EAAE,UAAU;wBACrB,SAAS,EAAE,SAAS;wBACpB,UAAU;wBACV,mBAAmB,EAAE,8BAAkB;wBACvC,GAAG;qBACJ,CAAC,CAAC;oBACH,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;oBAC1B,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;gBAC7B,CAAC;qBAAM,IAAI,CAAC,OAAO,EAAE,CAAC;oBACpB,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;wBAC3B,SAAS,EAAE,UAAU;wBACrB,SAAS,EAAE,SAAS;wBACpB,UAAU;wBACV,GAAG;qBACJ,CAAC,CAAC;oBACH,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;gBAC5B,CAAC;qBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,yBAAa,CAAC,+DAA+D,CAAC,CAAC;gBAC3F,CAAC;gBACD,MAAM,CAAC,YAAY;oBACjB,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpF,MAAM,CAAC,MAAM,CACX,MAAM,EACN,OAAO,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,8BAAkB,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CACjF,CAAC;gBACF,MAAM,YAAY,GAAG,OAAO;qBACzB,OAAO,CACN,4KAA4K,CAC7K;qBACA,GAAG,CAAC,OAAO,EAAE,8BAAkB,EAAE,MAAM,EAAE,8BAAkB,CAE5D,CAAC;gBACH,MAAM,WAAW,GAAG,UAAU;oBAC5B,CAAC,CAAE,OAAO;yBACL,OAAO,CACN;;;iFAGiE,CAClE;yBACA,GAAG,CAAC,GAAG,EAAE,8BAAkB,CAA2B;oBAC3D,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,KAAK,GAAG,IAAA,gCAAoB,EAAC,OAAO,EAAE;oBAC1C,SAAS,EAAE;wBACT,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC;wBAChD,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;qBACpC;oBACD,eAAe,EAAE,8BAAkB;oBACnC,aAAa,EAAE,MAAM;oBACrB,iBAAiB,EAAE,MAAM;oBACzB,YAAY,EAAE,UAAU;iBACzB,CAAC,CAAC;gBACH,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;gBACjD,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC/C,MAAM,CAAC,SAAS,GAAG,OAAO;qBACvB,OAAO,CACN,2OAA2O,CAC5O;qBACA,GAAG,CACF,MAAM,EACN,8BAAkB,EAClB,MAAM,EACN,OAAO,EACP,8BAAkB,EAClB,MAAM,EACN,8BAAkB,CACnB,CAAC,OAAO,CAAC;gBACZ,sFAAsF;gBACtF,sFAAsF;gBACtF,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC;oBAAE,IAAA,6CAAqB,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACzE,uFAAuF;gBACvF,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;gBAC1D,IAAI,UAAU,IAAI,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;oBACzC,MAAM,OAAO,GAAG,IAAI,2CAAmB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;oBACjE,KAAK,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,EAAE,CAAC;wBACpD,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;4BACtB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;4BACpB,MAAM,CAAC,cAAc,EAAE,CAAC;wBAC1B,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACnB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;SACxC,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface RestoreOptions {
|
|
2
|
+
home?: string;
|
|
3
|
+
configPath?: string;
|
|
4
|
+
write?: (line: string) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* `mama restore <archive>`: put a `mama backup` archive onto this stopped install. The restored
|
|
8
|
+
* config is the backup's settings with this install's places, and every part goes where that
|
|
9
|
+
* config puts it; the old roots in stored attachment paths are rewritten to the new ones. Each
|
|
10
|
+
* destination goes aside while its copy takes its place, under a journal that puts everything
|
|
11
|
+
* back if any step fails. Credentials and start.sh the archive does not hold stay as they are.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runRestore(args: readonly string[], options?: RestoreOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=restore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/restore.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAID;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA6Hf"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runRestore = runRestore;
|
|
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 config_js_1 = require("../../runtime/config.js");
|
|
8
|
+
const prompt_js_1 = require("../prompt.js");
|
|
9
|
+
const daemon_control_js_1 = require("../runtime/daemon-control.js");
|
|
10
|
+
const restore_js_1 = require("../runtime/restore.js");
|
|
11
|
+
const USAGE = 'Usage: mama restore <archive> | mama restore --rollback';
|
|
12
|
+
/**
|
|
13
|
+
* `mama restore <archive>`: put a `mama backup` archive onto this stopped install. The restored
|
|
14
|
+
* config is the backup's settings with this install's places, and every part goes where that
|
|
15
|
+
* config puts it; the old roots in stored attachment paths are rewritten to the new ones. Each
|
|
16
|
+
* destination goes aside while its copy takes its place, under a journal that puts everything
|
|
17
|
+
* back if any step fails. Credentials and start.sh the archive does not hold stay as they are.
|
|
18
|
+
*/
|
|
19
|
+
async function runRestore(args, options = {}) {
|
|
20
|
+
if (args.length !== 1)
|
|
21
|
+
throw new prompt_js_1.CliInputError(USAGE);
|
|
22
|
+
const home = options.home ?? (0, node_os_1.homedir)();
|
|
23
|
+
const configPath = options.configPath ?? (0, config_js_1.defaultConfigPath)(home);
|
|
24
|
+
const write = options.write ?? ((line) => console.log(line));
|
|
25
|
+
const root = (0, node_path_1.resolve)((0, node_path_1.dirname)(configPath));
|
|
26
|
+
const backups = (0, node_path_1.join)(root, 'backups');
|
|
27
|
+
// Nothing may run while files are switched under it.
|
|
28
|
+
const lock = (0, daemon_control_js_1.acquireInstallLock)((0, daemon_control_js_1.daemonControlPaths)(root), 'restore');
|
|
29
|
+
let staging = null;
|
|
30
|
+
let committed = false;
|
|
31
|
+
try {
|
|
32
|
+
// Rollback reads only the journal: mid-switch, config.yaml can be aside or the restored one.
|
|
33
|
+
if (args[0] === '--rollback') {
|
|
34
|
+
const undone = (0, restore_js_1.rollBack)(root);
|
|
35
|
+
if (undone === null)
|
|
36
|
+
(0, restore_js_1.clearOwnerThreads)(root);
|
|
37
|
+
write(undone === null
|
|
38
|
+
? 'the interrupted restore had taken effect; what it set aside is cleared'
|
|
39
|
+
: undone > 0
|
|
40
|
+
? `put back ${undone} path(s) from the interrupted restore`
|
|
41
|
+
: 'nothing to roll back');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if ((0, node_fs_1.existsSync)((0, restore_js_1.journalPath)(root))) {
|
|
45
|
+
throw new prompt_js_1.CliInputError('An earlier restore was interrupted; mama restore --rollback resolves it first');
|
|
46
|
+
}
|
|
47
|
+
if (!(0, node_fs_1.existsSync)(configPath)) {
|
|
48
|
+
throw new prompt_js_1.CliInputError(`Restore needs an installed target: ${configPath} does not exist`);
|
|
49
|
+
}
|
|
50
|
+
const config = (0, config_js_1.loadConfig)({ home, path: configPath, onIgnored: () => { } });
|
|
51
|
+
const archive = (0, node_path_1.resolve)(args[0]);
|
|
52
|
+
if (!(0, node_fs_1.existsSync)(archive) || !(0, node_fs_1.statSync)(archive).isFile()) {
|
|
53
|
+
throw new prompt_js_1.CliInputError(`${archive} is not a file`);
|
|
54
|
+
}
|
|
55
|
+
(0, node_fs_1.mkdirSync)(backups, { recursive: true, mode: 0o700 });
|
|
56
|
+
// An interrupted run leaves its staging; holding the install, nothing else is using it.
|
|
57
|
+
for (const name of (0, node_fs_1.readdirSync)(backups)) {
|
|
58
|
+
if (name.startsWith('.restore-') && name !== '.restore-journal.json') {
|
|
59
|
+
(0, restore_js_1.removeTree)((0, node_path_1.join)(backups, name));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const manifest = await (0, restore_js_1.readManifest)(archive);
|
|
63
|
+
const id = (0, restore_js_1.newRestoreId)();
|
|
64
|
+
staging = (0, node_path_1.join)(backups, `.restore-${id}`);
|
|
65
|
+
await (0, restore_js_1.extractVerified)(archive, manifest, staging);
|
|
66
|
+
// The backup's settings with this install's places: files and config then agree.
|
|
67
|
+
const stagedConfig = (0, node_path_1.join)(staging, 'root', 'config.yaml');
|
|
68
|
+
const configFromBackup = (0, node_fs_1.existsSync)(stagedConfig);
|
|
69
|
+
let restored = config;
|
|
70
|
+
if (configFromBackup) {
|
|
71
|
+
(0, node_fs_1.writeFileSync)(stagedConfig, (0, restore_js_1.restoredConfigText)((0, node_fs_1.readFileSync)(stagedConfig, 'utf8'), (0, node_fs_1.readFileSync)(configPath, 'utf8')));
|
|
72
|
+
try {
|
|
73
|
+
restored = (0, config_js_1.loadConfig)({ home, path: stagedConfig, onIgnored: () => { } });
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new prompt_js_1.CliInputError(`The backup's config does not load with this install's places: ${error instanceof Error ? error.message : String(error)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const target = (0, restore_js_1.targetPaths)(restored, configPath, home);
|
|
80
|
+
const prefixes = (0, restore_js_1.prefixesIn)(manifest);
|
|
81
|
+
for (const prefix of prefixes)
|
|
82
|
+
(0, restore_js_1.destinationOf)(prefix, target);
|
|
83
|
+
const stagedDatabase = (0, node_path_1.join)(staging, 'database');
|
|
84
|
+
let rows = 0;
|
|
85
|
+
if ((0, node_fs_1.existsSync)(stagedDatabase)) {
|
|
86
|
+
const jobs = (0, restore_js_1.hostJobsInFlight)(stagedDatabase);
|
|
87
|
+
if (jobs > 0) {
|
|
88
|
+
throw new prompt_js_1.CliInputError(`The backup holds ${jobs} host job(s) in progress (a person's export or erasure); their paths and file snapshots cannot move, so restore refuses this backup`);
|
|
89
|
+
}
|
|
90
|
+
rows = (0, restore_js_1.rewriteDatabase)(stagedDatabase, restore_js_1.PATH_COLUMNS, (0, restore_js_1.pathPairs)(manifest.configured, target));
|
|
91
|
+
}
|
|
92
|
+
(0, restore_js_1.applyModes)(staging, manifest.entries);
|
|
93
|
+
const units = prefixes.flatMap((prefix) => (0, restore_js_1.unitsFor)(prefix, staging, (0, restore_js_1.destinationOf)(prefix, target), manifest, target.workspace));
|
|
94
|
+
(0, restore_js_1.switchUnits)(root, units, id);
|
|
95
|
+
committed = true;
|
|
96
|
+
const threads = (0, restore_js_1.clearOwnerThreads)(root);
|
|
97
|
+
(0, restore_js_1.finishSwitch)(root);
|
|
98
|
+
write(`restored: ${archive}`);
|
|
99
|
+
write(` ${units.length} path(s) put in place; ${rows} stored attachment path(s) moved to this install's roots`);
|
|
100
|
+
write(` backup taken ${manifest.createdAt} by mama-os ${manifest.mama}; database schema version ${manifest.schemaVersion ?? 'none'}`);
|
|
101
|
+
if (configFromBackup) {
|
|
102
|
+
write(" config.yaml is the backup's settings with this install's paths (comments dropped)");
|
|
103
|
+
}
|
|
104
|
+
if (!manifest.includesSecrets && !(0, node_fs_1.existsSync)((0, node_path_1.join)(target.root, 'auth.env'))) {
|
|
105
|
+
write(' no auth.env: run mama secret set for each secret before starting');
|
|
106
|
+
}
|
|
107
|
+
else if (!manifest.includesSecrets) {
|
|
108
|
+
write(" this install's own credentials were kept (the backup held none)");
|
|
109
|
+
}
|
|
110
|
+
write(` start.sh was kept; mama service install writes it for this machine's paths; ${threads} Codex thread(s) cleared`);
|
|
111
|
+
write(' anything erased after this backup was taken is back');
|
|
112
|
+
write('Check it with mama doctor, then start it with mama service start.');
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (error instanceof prompt_js_1.CliInputError)
|
|
116
|
+
throw error;
|
|
117
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
118
|
+
throw new prompt_js_1.CliInputError(committed
|
|
119
|
+
? `The restore took effect, but finishing it failed: ${reason}; mama restore --rollback finishes it`
|
|
120
|
+
: (0, node_fs_1.existsSync)((0, restore_js_1.journalPath)(root))
|
|
121
|
+
? `Restore failed and could not be fully put back: ${reason}; mama restore --rollback continues putting it back`
|
|
122
|
+
: `Restore failed and this install was put back as it was: ${reason}`);
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
if (staging)
|
|
126
|
+
(0, restore_js_1.removeTree)(staging);
|
|
127
|
+
lock.release();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=restore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../src/cli/commands/restore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type ServiceRun } from '../runtime/systemd-service.js';
|
|
2
|
+
export interface ServiceOptions {
|
|
3
|
+
home?: string;
|
|
4
|
+
configPath?: string;
|
|
5
|
+
platform?: NodeJS.Platform;
|
|
6
|
+
write?: (line: string) => void;
|
|
7
|
+
run?: ServiceRun;
|
|
8
|
+
nodePath?: string;
|
|
9
|
+
cliPath?: string;
|
|
10
|
+
findExecutable?: (name: string) => string | undefined;
|
|
11
|
+
now?: () => Date;
|
|
12
|
+
/** Where systemd keeps linger markers; tests point it elsewhere. */
|
|
13
|
+
lingerRoot?: string;
|
|
14
|
+
/** Which package-manager tool folders exist; tests name them, by default this machine's. */
|
|
15
|
+
toolDirectoryExists?: (path: string) => boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Write start.sh and the service file from the current templates. It names every change to what
|
|
19
|
+
* the daemon runs, refuses to replace a start.sh that mama did not write unless asked, and
|
|
20
|
+
* restarts nothing: a running service takes the files at `mama service restart`.
|
|
21
|
+
*/
|
|
22
|
+
/** The service file `mama service install` writes on this platform. */
|
|
23
|
+
export declare function serviceFile(options?: ServiceOptions): string;
|
|
24
|
+
export declare function installService(args: readonly string[], options?: ServiceOptions): Promise<number>;
|
|
25
|
+
export declare function startService(options?: ServiceOptions): Promise<number>;
|
|
26
|
+
export declare function uninstallService(options?: ServiceOptions): Promise<number>;
|
|
27
|
+
export declare function runService(args: readonly string[], options?: ServiceOptions): Promise<number>;
|
|
28
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/service.ts"],"names":[],"mappings":"AAuBA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,+BAA+B,CAAC;AAMvC,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACtD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACjD;AAiED;;;;GAIG;AACH,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,CAEhE;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAiIjB;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBhF;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BpF;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
|