@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
package/dist/cli/index.js
CHANGED
|
@@ -3,16 +3,6 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const config_js_1 = require("../runtime/config.js");
|
|
5
5
|
const prompt_js_1 = require("./prompt.js");
|
|
6
|
-
/**
|
|
7
|
-
* replay and backfill open the daemon's database and rewrite its workspace settings, the shell
|
|
8
|
-
* sandbox's proxy ports among them, so they run only while the daemon is stopped.
|
|
9
|
-
*/
|
|
10
|
-
async function requireDaemonStopped(command) {
|
|
11
|
-
const { daemonStatus } = await import('./commands/daemon.js');
|
|
12
|
-
if (daemonStatus() === 'running') {
|
|
13
|
-
throw new prompt_js_1.CliInputError(`Stop the daemon before mama ${command}: run mama stop`);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
6
|
async function main() {
|
|
17
7
|
const command = process.argv[2];
|
|
18
8
|
if (command === 'tools') {
|
|
@@ -33,42 +23,99 @@ async function main() {
|
|
|
33
23
|
return;
|
|
34
24
|
}
|
|
35
25
|
if (command === 'register-owner') {
|
|
36
|
-
await requireDaemonStopped('register-owner');
|
|
37
26
|
const { runRegisterOwner } = await import('./commands/register-owner.js');
|
|
38
27
|
await runRegisterOwner(process.argv.slice(3));
|
|
39
28
|
return;
|
|
40
29
|
}
|
|
30
|
+
if (command === 'logs') {
|
|
31
|
+
const { runLogs } = await import('./commands/logs.js');
|
|
32
|
+
const controller = new AbortController();
|
|
33
|
+
process.once('SIGINT', () => controller.abort());
|
|
34
|
+
await runLogs(process.argv.slice(3), { signal: controller.signal });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
41
37
|
if (command === 'daemon') {
|
|
42
38
|
const { runDaemon } = await import('./commands/daemon.js');
|
|
43
|
-
await
|
|
39
|
+
const { InstallBusyError, RestorePendingError } = await import('./runtime/daemon-control.js');
|
|
40
|
+
try {
|
|
41
|
+
const { DAEMON_LOG_LIMITS, openRotatingLog, takeOverOutput } = await import('../runtime/rotating-log.js');
|
|
42
|
+
await runDaemon({
|
|
43
|
+
captureOutput: (logFile) => takeOverOutput(openRotatingLog(logFile, DAEMON_LOG_LIMITS)),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// Another process already holds this install, or a restore is unfinished: a clean exit,
|
|
48
|
+
// which the service files leave stopped (they restart only after a failure).
|
|
49
|
+
// A newer schema stays newer too; restarting into the refusal would only repeat it.
|
|
50
|
+
if (!(error instanceof InstallBusyError) &&
|
|
51
|
+
!(error instanceof RestorePendingError) &&
|
|
52
|
+
!isNewerSchema(error)) {
|
|
53
|
+
// The log line above names the error; this names the stage and the next step.
|
|
54
|
+
const stage = error.bootStage;
|
|
55
|
+
if (typeof stage === 'string') {
|
|
56
|
+
console.error(`mama daemon failed at boot stage ${stage}; mama doctor checks the install`);
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
console.error(error.message);
|
|
61
|
+
}
|
|
44
62
|
return;
|
|
45
63
|
}
|
|
46
64
|
if (command === 'replay') {
|
|
47
|
-
await requireDaemonStopped('replay');
|
|
48
65
|
const { runReplay } = await import('./commands/replay.js');
|
|
49
66
|
await runReplay();
|
|
50
67
|
return;
|
|
51
68
|
}
|
|
52
69
|
if (command === 'backfill') {
|
|
53
|
-
await requireDaemonStopped('backfill');
|
|
54
70
|
const { runBackfill } = await import('./commands/backfill.js');
|
|
55
71
|
await runBackfill(process.argv.slice(3));
|
|
56
72
|
return;
|
|
57
73
|
}
|
|
74
|
+
if (command === 'restore') {
|
|
75
|
+
const { runRestore } = await import('./commands/restore.js');
|
|
76
|
+
await runRestore(process.argv.slice(3));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (command === 'backup') {
|
|
80
|
+
const { runBackup } = await import('./commands/backup.js');
|
|
81
|
+
await runBackup(process.argv.slice(3));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (command === 'doctor') {
|
|
85
|
+
const { runDoctor } = await import('./commands/doctor.js');
|
|
86
|
+
process.exitCode = await runDoctor(process.argv.slice(3));
|
|
87
|
+
// A source probe that timed out may still hold a socket; once the output has drained, leave.
|
|
88
|
+
setTimeout(() => process.exit(), 1_000).unref();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (command === 'uninstall') {
|
|
92
|
+
const { runUninstall } = await import('./commands/uninstall.js');
|
|
93
|
+
process.exitCode = await runUninstall(process.argv.slice(3));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (command === 'service') {
|
|
97
|
+
const { runService } = await import('./commands/service.js');
|
|
98
|
+
process.exitCode = await runService(process.argv.slice(3));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
58
101
|
if (command === 'status') {
|
|
59
|
-
const {
|
|
60
|
-
|
|
102
|
+
const { runStatus } = await import('./commands/control.js');
|
|
103
|
+
process.exitCode = await runStatus(process.argv.slice(3));
|
|
61
104
|
return;
|
|
62
105
|
}
|
|
63
106
|
if (command === 'stop') {
|
|
64
|
-
const {
|
|
65
|
-
|
|
107
|
+
const { runStop } = await import('./commands/control.js');
|
|
108
|
+
process.exitCode = await runStop(process.argv.slice(3));
|
|
66
109
|
return;
|
|
67
110
|
}
|
|
68
|
-
console.log('Usage: mama init | tools install | secret set <NAME> | secret list | register-owner <telegram id> | daemon | replay | backfill <file> | status | stop');
|
|
111
|
+
console.log('Usage: mama init | tools install | secret set <NAME> | secret list | register-owner <telegram id> | daemon | replay | backfill <file> | status [--json] | stop | service install|start|stop|restart|status|uninstall | uninstall [--dry-run] [--data [--toolkit]] | doctor [--json] [--offline] [--report] | logs [-n <lines>] [--follow] | backup [--include-secrets] [--logs] | restore <archive> | restore --rollback');
|
|
112
|
+
}
|
|
113
|
+
/** Core's refusal of a database a newer version migrated; its message is core's own text. */
|
|
114
|
+
function isNewerSchema(error) {
|
|
115
|
+
return error instanceof Error && error.code === 'MAMA_SCHEMA_NEWER';
|
|
69
116
|
}
|
|
70
117
|
void main().catch((error) => {
|
|
71
|
-
if (error instanceof prompt_js_1.CliInputError || error instanceof config_js_1.ConfigError) {
|
|
118
|
+
if (error instanceof prompt_js_1.CliInputError || error instanceof config_js_1.ConfigError || isNewerSchema(error)) {
|
|
72
119
|
console.error(error.message);
|
|
73
120
|
}
|
|
74
121
|
else {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;AAEA,oDAAmD;AACnD,2CAA4C;AAE5C
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,93 @@
|
|
|
1
1
|
export declare function findExecutable(name: string): string | undefined;
|
|
2
|
+
/**
|
|
3
|
+
* A Node path that survives an upgrade. Homebrew removes a version's Cellar folder when it
|
|
4
|
+
* upgrades, but keeps `<prefix>/opt/<formula>` (and `<prefix>/bin/node` for `node`) pointing at
|
|
5
|
+
* the current one, so the launch files use those when the running Node lives in the Cellar.
|
|
6
|
+
*/
|
|
7
|
+
export declare function stableNodePath(execPath: string, exists?: (path: string) => boolean): string;
|
|
8
|
+
/** A Node path that a version manager or an upgrade removes (I6). */
|
|
9
|
+
export declare function versionedNodePath(path: string): boolean;
|
|
10
|
+
/** The first comment line of every start.sh that mama writes. */
|
|
11
|
+
export declare const START_SCRIPT_MARKER = "# Written by mama init or mama service install; mama service install rewrites it.";
|
|
2
12
|
export declare function startScript(options: {
|
|
3
13
|
home: string;
|
|
4
14
|
nodePath: string;
|
|
5
15
|
cliPath: string;
|
|
6
16
|
executablePaths: string[];
|
|
17
|
+
/** Tests name which tool folders exist; by default the ones on this machine. */
|
|
18
|
+
exists?: (path: string) => boolean;
|
|
7
19
|
viewer: Record<string, string>;
|
|
20
|
+
/** config.yaml's logging.level; the core logger reads it only from MAMA_LOG_LEVEL. */
|
|
21
|
+
logLevel: string;
|
|
22
|
+
/** `export` lines carried over verbatim from the script being replaced. */
|
|
23
|
+
carried?: readonly string[];
|
|
8
24
|
}): string;
|
|
25
|
+
/**
|
|
26
|
+
* Where a package manager installs the owner's command-line tools: Homebrew on Apple silicon
|
|
27
|
+
* (/opt/homebrew) and on Intel Macs and most Linux installs (/usr/local). The agent's shell runs
|
|
28
|
+
* those tools (python3 with its packages, sqlite3) and expects them ahead of the system's own, as
|
|
29
|
+
* in the owner's terminal.
|
|
30
|
+
*/
|
|
31
|
+
export declare const TOOL_DIRECTORIES: string[];
|
|
32
|
+
/**
|
|
33
|
+
* The PATH a generated start.sh sets: Node's folder, the backend's and gws's, the package
|
|
34
|
+
* manager's folders that exist on this machine, then the system's.
|
|
35
|
+
*/
|
|
36
|
+
export declare function startPathEntries(options: {
|
|
37
|
+
nodePath: string;
|
|
38
|
+
executablePaths: string[];
|
|
39
|
+
/** Tests name what exists; by default the folders on this machine. */
|
|
40
|
+
exists?: (path: string) => boolean;
|
|
41
|
+
}): string[];
|
|
42
|
+
/**
|
|
43
|
+
* What the service manager captures before the daemon writes its own rotated log (daemon.log):
|
|
44
|
+
* start.sh's own messages, a crash while Node loads, a fatal error, a native library's writes.
|
|
45
|
+
*/
|
|
46
|
+
export declare const CRASH_LOG_NAME = "crash.log";
|
|
47
|
+
/** start.sh empties the crash log at start once it is past this size. */
|
|
48
|
+
export declare const CRASH_LOG_CAP_BYTES: number;
|
|
49
|
+
/** Seconds a service manager waits for a stopping daemon before it kills it. */
|
|
50
|
+
export declare const SERVICE_STOP_SECONDS = 60;
|
|
51
|
+
/**
|
|
52
|
+
* The LaunchAgent restarts the daemon only after a failure: a clean exit (a stop, or a refusal
|
|
53
|
+
* because another process holds the install) leaves it stopped.
|
|
54
|
+
*/
|
|
9
55
|
export declare function launchAgent(home: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* The systemd user unit, with the same restart policy as the LaunchAgent. `%h` is the home folder,
|
|
58
|
+
* expanded by systemd per argument, so a path with spaces stays one argument. KillMode=mixed sends
|
|
59
|
+
* the stop signal to the daemon alone, which stops its children in order; anything left is killed
|
|
60
|
+
* when the stop times out.
|
|
61
|
+
*/
|
|
62
|
+
export declare function systemdUnit(): string;
|
|
63
|
+
/** What an existing start.sh holds that a regenerated one would or would not reproduce. */
|
|
64
|
+
export interface StartScriptReading {
|
|
65
|
+
/** Written by mama (it carries the marker line). */
|
|
66
|
+
readonly generated: boolean;
|
|
67
|
+
/** `export` lines kept verbatim, except PATH and MAMA_LOG_LEVEL, which are written anew. */
|
|
68
|
+
readonly carried: string[];
|
|
69
|
+
readonly path: string | null;
|
|
70
|
+
readonly logLevel: string | null;
|
|
71
|
+
readonly exec: string | null;
|
|
72
|
+
/** Other lines with an effect (assignments, commands) that the new script does not have. */
|
|
73
|
+
readonly notReproduced: string[];
|
|
74
|
+
/** It sources this install's auth.env with the generated line. */
|
|
75
|
+
readonly loadsAuthEnv: boolean;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Split a start.sh line into words as sh does before expansion: a `#` starting a word ends the
|
|
79
|
+
* line, single quotes are literal, double
|
|
80
|
+
* quotes keep their text (a backslash escapes `"`, `\\`, `$` and a backtick), and a backslash
|
|
81
|
+
* outside quotes escapes the next character. Variables stay as written.
|
|
82
|
+
*/
|
|
83
|
+
export declare function shellWords(line: string): string[];
|
|
84
|
+
/** The PATH entries an `export PATH=` value names, with `$HOME` and `~` read as `home`. */
|
|
85
|
+
export declare function startPathValue(value: string, home: string): string[];
|
|
86
|
+
/** The values a start.sh's carried `export` lines set, unquoted. */
|
|
87
|
+
export declare function startExports(reading: StartScriptReading): Record<string, string>;
|
|
88
|
+
/**
|
|
89
|
+
* Read a start.sh against what this install's generated one holds. Only exact generated lines
|
|
90
|
+
* count as reproduced: a changed `cd` or a different sourced file is reported, not dropped.
|
|
91
|
+
*/
|
|
92
|
+
export declare function readStartScript(script: string, home: string): StartScriptReading;
|
|
10
93
|
//# sourceMappingURL=launch-files.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-files.d.ts","sourceRoot":"","sources":["../../src/cli/launch-files.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY/D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"launch-files.d.ts","sourceRoot":"","sources":["../../src/cli/launch-files.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GAC7C,MAAM,CASR;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIvD;AAED,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,sFACqD,CAAC;AAEtF,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gFAAgF;IAChF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,sFAAsF;IACtF,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,GAAG,MAAM,CAmBT;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,UAA0C,CAAC;AAExE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,sEAAsE;IACtE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACpC,GAAG,MAAM,EAAE,CAWX;AAWD;;;GAGG;AACH,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAe/C,gFAAgF;AAChF,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBhD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAkBpC;AAED,2FAA2F;AAC3F,MAAM,WAAW,kBAAkB;IACjC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,4FAA4F;IAC5F,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IACjC,kEAAkE;IAClE,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmCjD;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKpE;AAED,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOhF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CA2ChF"}
|
package/dist/cli/launch-files.js
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SERVICE_STOP_SECONDS = exports.CRASH_LOG_CAP_BYTES = exports.CRASH_LOG_NAME = exports.TOOL_DIRECTORIES = exports.START_SCRIPT_MARKER = void 0;
|
|
3
4
|
exports.findExecutable = findExecutable;
|
|
5
|
+
exports.stableNodePath = stableNodePath;
|
|
6
|
+
exports.versionedNodePath = versionedNodePath;
|
|
4
7
|
exports.startScript = startScript;
|
|
8
|
+
exports.startPathEntries = startPathEntries;
|
|
5
9
|
exports.launchAgent = launchAgent;
|
|
10
|
+
exports.systemdUnit = systemdUnit;
|
|
11
|
+
exports.shellWords = shellWords;
|
|
12
|
+
exports.startPathValue = startPathValue;
|
|
13
|
+
exports.startExports = startExports;
|
|
14
|
+
exports.readStartScript = readStartScript;
|
|
6
15
|
const node_fs_1 = require("node:fs");
|
|
7
16
|
const node_path_1 = require("node:path");
|
|
8
17
|
const secrets_js_1 = require("./secrets.js");
|
|
@@ -21,32 +30,69 @@ function findExecutable(name) {
|
|
|
21
30
|
}
|
|
22
31
|
return undefined;
|
|
23
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* A Node path that survives an upgrade. Homebrew removes a version's Cellar folder when it
|
|
35
|
+
* upgrades, but keeps `<prefix>/opt/<formula>` (and `<prefix>/bin/node` for `node`) pointing at
|
|
36
|
+
* the current one, so the launch files use those when the running Node lives in the Cellar.
|
|
37
|
+
*/
|
|
38
|
+
function stableNodePath(execPath, exists = node_fs_1.existsSync) {
|
|
39
|
+
const brew = /^(.*)\/Cellar\/(node(?:@\d+)?)\/[^/]+\/bin\/node$/.exec(execPath);
|
|
40
|
+
if (!brew)
|
|
41
|
+
return execPath;
|
|
42
|
+
const [, prefix, formula] = brew;
|
|
43
|
+
const candidates = [
|
|
44
|
+
(0, node_path_1.join)(prefix, 'opt', formula, 'bin', 'node'),
|
|
45
|
+
...(formula === 'node' ? [(0, node_path_1.join)(prefix, 'bin', 'node')] : []),
|
|
46
|
+
];
|
|
47
|
+
return candidates.find((candidate) => exists(candidate)) ?? execPath;
|
|
48
|
+
}
|
|
49
|
+
/** A Node path that a version manager or an upgrade removes (I6). */
|
|
50
|
+
function versionedNodePath(path) {
|
|
51
|
+
return /\/Cellar\/node(@\d+)?\/|\/\.nvm\/versions\/node\/|\/\.volta\/tools\/image\/node\/|\/fnm\/node-versions\//.test(path);
|
|
52
|
+
}
|
|
53
|
+
/** The first comment line of every start.sh that mama writes. */
|
|
54
|
+
exports.START_SCRIPT_MARKER = '# Written by mama init or mama service install; mama service install rewrites it.';
|
|
24
55
|
function startScript(options) {
|
|
25
56
|
const root = (0, node_path_1.join)(options.home, '.mama');
|
|
26
|
-
const path = [
|
|
27
|
-
...new Set([
|
|
28
|
-
(0, node_path_1.dirname)(options.nodePath),
|
|
29
|
-
...options.executablePaths.map(node_path_1.dirname),
|
|
30
|
-
'/usr/bin',
|
|
31
|
-
'/bin',
|
|
32
|
-
'/usr/sbin',
|
|
33
|
-
'/sbin',
|
|
34
|
-
]),
|
|
35
|
-
].join(':');
|
|
36
57
|
return [
|
|
37
58
|
'#!/bin/sh',
|
|
59
|
+
exports.START_SCRIPT_MARKER,
|
|
38
60
|
'set -eu',
|
|
39
61
|
'umask 077',
|
|
40
|
-
`export PATH=${(0, secrets_js_1.shellQuote)(
|
|
62
|
+
`export PATH=${(0, secrets_js_1.shellQuote)(startPathEntries(options).join(':'))}`,
|
|
41
63
|
`cd ${(0, secrets_js_1.shellQuote)(root)}`,
|
|
42
64
|
'set -a',
|
|
43
65
|
`. ${(0, secrets_js_1.shellQuote)((0, node_path_1.join)(root, 'auth.env'))}`,
|
|
44
66
|
'set +a',
|
|
67
|
+
`export MAMA_LOG_LEVEL=${(0, secrets_js_1.shellQuote)(options.logLevel.toUpperCase())}`,
|
|
45
68
|
...Object.entries(options.viewer).map(([name, value]) => `export ${name}=${(0, secrets_js_1.shellQuote)(value)}`),
|
|
46
|
-
|
|
69
|
+
...(options.carried ?? []),
|
|
70
|
+
...crashLogLines(root),
|
|
71
|
+
`exec ${(0, secrets_js_1.shellQuote)(options.nodePath)} ${(0, secrets_js_1.shellQuote)(options.cliPath)} daemon >> "$crash" 2>&1`,
|
|
47
72
|
'',
|
|
48
73
|
].join('\n');
|
|
49
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Where a package manager installs the owner's command-line tools: Homebrew on Apple silicon
|
|
77
|
+
* (/opt/homebrew) and on Intel Macs and most Linux installs (/usr/local). The agent's shell runs
|
|
78
|
+
* those tools (python3 with its packages, sqlite3) and expects them ahead of the system's own, as
|
|
79
|
+
* in the owner's terminal.
|
|
80
|
+
*/
|
|
81
|
+
exports.TOOL_DIRECTORIES = ['/opt/homebrew/bin', '/usr/local/bin'];
|
|
82
|
+
/**
|
|
83
|
+
* The PATH a generated start.sh sets: Node's folder, the backend's and gws's, the package
|
|
84
|
+
* manager's folders that exist on this machine, then the system's.
|
|
85
|
+
*/
|
|
86
|
+
function startPathEntries(options) {
|
|
87
|
+
const exists = options.exists ?? node_fs_1.existsSync;
|
|
88
|
+
const system = ['/usr/bin', '/bin', '/usr/sbin', '/sbin'];
|
|
89
|
+
// A Node or backend in a system folder (/usr/bin/node on Linux) keeps the system's place, after
|
|
90
|
+
// the tool folders; start.sh runs Node by its full path either way.
|
|
91
|
+
const own = [(0, node_path_1.dirname)(options.nodePath), ...options.executablePaths.map(node_path_1.dirname)].filter((directory) => !system.includes(directory));
|
|
92
|
+
return [
|
|
93
|
+
...new Set([...own, ...exports.TOOL_DIRECTORIES.filter((directory) => exists(directory)), ...system]),
|
|
94
|
+
];
|
|
95
|
+
}
|
|
50
96
|
function xml(value) {
|
|
51
97
|
return value
|
|
52
98
|
.replace(/&/g, '&')
|
|
@@ -55,6 +101,31 @@ function xml(value) {
|
|
|
55
101
|
.replace(/"/g, '"')
|
|
56
102
|
.replace(/'/g, ''');
|
|
57
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* What the service manager captures before the daemon writes its own rotated log (daemon.log):
|
|
106
|
+
* start.sh's own messages, a crash while Node loads, a fatal error, a native library's writes.
|
|
107
|
+
*/
|
|
108
|
+
exports.CRASH_LOG_NAME = 'crash.log';
|
|
109
|
+
/** start.sh empties the crash log at start once it is past this size. */
|
|
110
|
+
exports.CRASH_LOG_CAP_BYTES = 1024 * 1024;
|
|
111
|
+
/**
|
|
112
|
+
* start.sh's crash log: only what comes before the daemon takes over its own output lands there;
|
|
113
|
+
* it is made owner-only and emptied at start once past the cap.
|
|
114
|
+
*/
|
|
115
|
+
function crashLogLines(root) {
|
|
116
|
+
return [
|
|
117
|
+
`crash=${(0, secrets_js_1.shellQuote)((0, node_path_1.join)(root, 'logs', exports.CRASH_LOG_NAME))}`,
|
|
118
|
+
// launchd creates the file it redirects to before this script's umask applies.
|
|
119
|
+
`if [ -f "$crash" ]; then chmod 600 "$crash"; fi`,
|
|
120
|
+
`if [ -f "$crash" ] && [ "$(wc -c < "$crash")" -gt ${exports.CRASH_LOG_CAP_BYTES} ]; then : > "$crash"; fi`,
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
/** Seconds a service manager waits for a stopping daemon before it kills it. */
|
|
124
|
+
exports.SERVICE_STOP_SECONDS = 60;
|
|
125
|
+
/**
|
|
126
|
+
* The LaunchAgent restarts the daemon only after a failure: a clean exit (a stop, or a refusal
|
|
127
|
+
* because another process holds the install) leaves it stopped.
|
|
128
|
+
*/
|
|
58
129
|
function launchAgent(home) {
|
|
59
130
|
const root = (0, node_path_1.join)(home, '.mama');
|
|
60
131
|
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
@@ -65,10 +136,155 @@ function launchAgent(home) {
|
|
|
65
136
|
<key>WorkingDirectory</key><string>${xml(root)}</string>
|
|
66
137
|
<key>EnvironmentVariables</key><dict><key>HOME</key><string>${xml(home)}</string></dict>
|
|
67
138
|
<key>RunAtLoad</key><true/>
|
|
68
|
-
<key>KeepAlive</key><
|
|
69
|
-
<key>
|
|
70
|
-
<key>
|
|
139
|
+
<key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict>
|
|
140
|
+
<key>ExitTimeOut</key><integer>${exports.SERVICE_STOP_SECONDS}</integer>
|
|
141
|
+
<key>StandardOutPath</key><string>${xml((0, node_path_1.join)(root, 'logs', exports.CRASH_LOG_NAME))}</string>
|
|
142
|
+
<key>StandardErrorPath</key><string>${xml((0, node_path_1.join)(root, 'logs', exports.CRASH_LOG_NAME))}</string>
|
|
71
143
|
</dict></plist>
|
|
72
144
|
`;
|
|
73
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* The systemd user unit, with the same restart policy as the LaunchAgent. `%h` is the home folder,
|
|
148
|
+
* expanded by systemd per argument, so a path with spaces stays one argument. KillMode=mixed sends
|
|
149
|
+
* the stop signal to the daemon alone, which stops its children in order; anything left is killed
|
|
150
|
+
* when the stop times out.
|
|
151
|
+
*/
|
|
152
|
+
function systemdUnit() {
|
|
153
|
+
return [
|
|
154
|
+
'[Unit]',
|
|
155
|
+
'Description=MAMA OS daemon',
|
|
156
|
+
'',
|
|
157
|
+
'[Service]',
|
|
158
|
+
'Type=simple',
|
|
159
|
+
'WorkingDirectory=%h/.mama',
|
|
160
|
+
'ExecStart="%h/.mama/start.sh"',
|
|
161
|
+
'Restart=on-failure',
|
|
162
|
+
'RestartSec=10',
|
|
163
|
+
`TimeoutStopSec=${exports.SERVICE_STOP_SECONDS}`,
|
|
164
|
+
'KillMode=mixed',
|
|
165
|
+
'',
|
|
166
|
+
'[Install]',
|
|
167
|
+
'WantedBy=default.target',
|
|
168
|
+
'',
|
|
169
|
+
].join('\n');
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Split a start.sh line into words as sh does before expansion: a `#` starting a word ends the
|
|
173
|
+
* line, single quotes are literal, double
|
|
174
|
+
* quotes keep their text (a backslash escapes `"`, `\\`, `$` and a backtick), and a backslash
|
|
175
|
+
* outside quotes escapes the next character. Variables stay as written.
|
|
176
|
+
*/
|
|
177
|
+
function shellWords(line) {
|
|
178
|
+
const words = [];
|
|
179
|
+
let word = null;
|
|
180
|
+
for (let index = 0; index < line.length; index += 1) {
|
|
181
|
+
const char = line[index];
|
|
182
|
+
if (char === "'") {
|
|
183
|
+
const end = line.indexOf("'", index + 1);
|
|
184
|
+
if (end < 0)
|
|
185
|
+
throw new Error('unterminated single quote');
|
|
186
|
+
word = (word ?? '') + line.slice(index + 1, end);
|
|
187
|
+
index = end;
|
|
188
|
+
}
|
|
189
|
+
else if (char === '"') {
|
|
190
|
+
let text = '';
|
|
191
|
+
index += 1;
|
|
192
|
+
while (index < line.length && line[index] !== '"') {
|
|
193
|
+
if (line[index] === '\\' && '"\\$`'.includes(line[index + 1] ?? ''))
|
|
194
|
+
index += 1;
|
|
195
|
+
text += line[index];
|
|
196
|
+
index += 1;
|
|
197
|
+
}
|
|
198
|
+
if (index >= line.length)
|
|
199
|
+
throw new Error('unterminated double quote');
|
|
200
|
+
word = (word ?? '') + text;
|
|
201
|
+
}
|
|
202
|
+
else if (char === '\\') {
|
|
203
|
+
word = (word ?? '') + (line[index + 1] ?? '');
|
|
204
|
+
index += 1;
|
|
205
|
+
}
|
|
206
|
+
else if (/\s/.test(char)) {
|
|
207
|
+
if (word !== null)
|
|
208
|
+
words.push(word);
|
|
209
|
+
word = null;
|
|
210
|
+
}
|
|
211
|
+
else if (char === '#' && word === null) {
|
|
212
|
+
// A # that starts a word starts a comment.
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
word = (word ?? '') + char;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (word !== null)
|
|
220
|
+
words.push(word);
|
|
221
|
+
return words;
|
|
222
|
+
}
|
|
223
|
+
/** The PATH entries an `export PATH=` value names, with `$HOME` and `~` read as `home`. */
|
|
224
|
+
function startPathValue(value, home) {
|
|
225
|
+
return (shellWords(value)[0] ?? '')
|
|
226
|
+
.split(':')
|
|
227
|
+
.map((entry) => entry.replace(/^(\$HOME|\$\{HOME\}|~)(?=\/|$)/, home))
|
|
228
|
+
.filter((entry) => entry !== '' && entry !== '$PATH' && entry !== '${PATH}');
|
|
229
|
+
}
|
|
230
|
+
/** The values a start.sh's carried `export` lines set, unquoted. */
|
|
231
|
+
function startExports(reading) {
|
|
232
|
+
return Object.fromEntries(reading.carried.flatMap((line) => {
|
|
233
|
+
const match = /^export\s+([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line);
|
|
234
|
+
return match ? [[match[1], shellWords(match[2])[0] ?? '']] : [];
|
|
235
|
+
}));
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Read a start.sh against what this install's generated one holds. Only exact generated lines
|
|
239
|
+
* count as reproduced: a changed `cd` or a different sourced file is reported, not dropped.
|
|
240
|
+
*/
|
|
241
|
+
function readStartScript(script, home) {
|
|
242
|
+
const root = (0, node_path_1.join)(home, '.mama');
|
|
243
|
+
const generatedLines = new Set([
|
|
244
|
+
'set -eu',
|
|
245
|
+
'set -a',
|
|
246
|
+
'set +a',
|
|
247
|
+
'umask 077',
|
|
248
|
+
`cd ${(0, secrets_js_1.shellQuote)(root)}`,
|
|
249
|
+
`. ${(0, secrets_js_1.shellQuote)((0, node_path_1.join)(root, 'auth.env'))}`,
|
|
250
|
+
...crashLogLines(root),
|
|
251
|
+
]);
|
|
252
|
+
const carried = [];
|
|
253
|
+
const notReproduced = [];
|
|
254
|
+
let path = null;
|
|
255
|
+
let logLevel = null;
|
|
256
|
+
let exec = null;
|
|
257
|
+
for (const raw of script.split('\n')) {
|
|
258
|
+
const line = raw.trim();
|
|
259
|
+
if (line === '')
|
|
260
|
+
continue;
|
|
261
|
+
const exported = /^export\s+([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line);
|
|
262
|
+
if (exported) {
|
|
263
|
+
if (exported[1] === 'PATH')
|
|
264
|
+
path = exported[2];
|
|
265
|
+
else if (exported[1] === 'MAMA_LOG_LEVEL')
|
|
266
|
+
logLevel = exported[2];
|
|
267
|
+
else
|
|
268
|
+
carried.push(line);
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
if (/^exec\s/.test(line)) {
|
|
272
|
+
exec = line;
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (line.startsWith('#') || generatedLines.has(line))
|
|
276
|
+
continue;
|
|
277
|
+
notReproduced.push(line);
|
|
278
|
+
}
|
|
279
|
+
const authLine = `. ${(0, secrets_js_1.shellQuote)((0, node_path_1.join)(root, 'auth.env'))}`;
|
|
280
|
+
return {
|
|
281
|
+
generated: script.includes(exports.START_SCRIPT_MARKER),
|
|
282
|
+
loadsAuthEnv: script.split('\n').some((line) => line.trim() === authLine),
|
|
283
|
+
carried,
|
|
284
|
+
path,
|
|
285
|
+
logLevel,
|
|
286
|
+
exec,
|
|
287
|
+
notReproduced,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
74
290
|
//# sourceMappingURL=launch-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-files.js","sourceRoot":"","sources":["../../src/cli/launch-files.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"launch-files.js","sourceRoot":"","sources":["../../src/cli/launch-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type SpawnSyncReturns } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* The oldest backend CLI versions a MAMA release was verified on. MAMA depends on their sandbox,
|
|
4
|
+
* hook, settings and permission behaviour, so an older CLI is refused; raise these only after
|
|
5
|
+
* verifying a newer one.
|
|
6
|
+
*/
|
|
7
|
+
export declare const MINIMUM_BACKEND_VERSIONS: {
|
|
8
|
+
readonly claude: "2.1.299";
|
|
9
|
+
readonly codex: "0.160.1";
|
|
10
|
+
};
|
|
11
|
+
export type BackendName = keyof typeof MINIMUM_BACKEND_VERSIONS;
|
|
12
|
+
export type ProbeRun = (command: string, args: string[], env?: NodeJS.ProcessEnv) => SpawnSyncReturns<string>;
|
|
13
|
+
export declare function defaultProbeRun(command: string, args: string[], env?: NodeJS.ProcessEnv): SpawnSyncReturns<string>;
|
|
14
|
+
/** Compare dotted numeric versions; a missing part counts as 0. */
|
|
15
|
+
export declare function compareVersions(left: string, right: string): number;
|
|
16
|
+
export interface BackendProbe {
|
|
17
|
+
readonly version: string | null;
|
|
18
|
+
readonly minimum: string;
|
|
19
|
+
readonly versionOk: boolean;
|
|
20
|
+
readonly loggedIn: boolean;
|
|
21
|
+
/** Why the version or the login could not be read; never a credential. */
|
|
22
|
+
readonly problem: string | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read a backend CLI's version and whether it is signed in, without printing anything the CLI
|
|
26
|
+
* says about the account. `env` is the environment the daemon gives the backend, so a login that
|
|
27
|
+
* only this shell's variables provide does not count; Codex is asked about the managed home.
|
|
28
|
+
*/
|
|
29
|
+
export declare function probeBackend(backend: BackendName, executable: string, options?: {
|
|
30
|
+
codexHome?: string;
|
|
31
|
+
run?: ProbeRun;
|
|
32
|
+
env?: NodeJS.ProcessEnv;
|
|
33
|
+
}): BackendProbe;
|
|
34
|
+
//# sourceMappingURL=backend-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-probe.d.ts","sourceRoot":"","sources":["../../../src/cli/runtime/backend-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;;;CAG3B,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,wBAAwB,CAAC;AAEhE,MAAM,MAAM,QAAQ,GAAG,CACrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,KACpB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE9B,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,gBAAgB,CAAC,MAAM,CAAC,CAE1B;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQnE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAO,GAC5E,YAAY,CA6Cd"}
|