@intentic/machine 1.233.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/LICENSE +21 -0
- package/README.md +72 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +12 -0
- package/dist/app.js.map +1 -0
- package/dist/autostart.d.ts +3 -0
- package/dist/autostart.d.ts.map +1 -0
- package/dist/autostart.js +13 -0
- package/dist/autostart.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +11 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +91 -0
- package/dist/commands.js.map +1 -0
- package/dist/computer/audit.d.ts +6 -0
- package/dist/computer/audit.d.ts.map +1 -0
- package/dist/computer/audit.js +12 -0
- package/dist/computer/audit.js.map +1 -0
- package/dist/computer/commands.d.ts +8 -0
- package/dist/computer/commands.d.ts.map +1 -0
- package/dist/computer/commands.js +113 -0
- package/dist/computer/commands.js.map +1 -0
- package/dist/computer/config.d.ts +19 -0
- package/dist/computer/config.d.ts.map +1 -0
- package/dist/computer/config.js +31 -0
- package/dist/computer/config.js.map +1 -0
- package/dist/computer/connection.d.ts +8 -0
- package/dist/computer/connection.d.ts.map +1 -0
- package/dist/computer/connection.js +63 -0
- package/dist/computer/connection.js.map +1 -0
- package/dist/computer/mcp.d.ts +3 -0
- package/dist/computer/mcp.d.ts.map +1 -0
- package/dist/computer/mcp.js +312 -0
- package/dist/computer/mcp.js.map +1 -0
- package/dist/computer/policy.d.ts +8 -0
- package/dist/computer/policy.d.ts.map +1 -0
- package/dist/computer/policy.js +42 -0
- package/dist/computer/policy.js.map +1 -0
- package/dist/computer/router.d.ts +93 -0
- package/dist/computer/router.d.ts.map +1 -0
- package/dist/computer/router.js +79 -0
- package/dist/computer/router.js.map +1 -0
- package/dist/computer/tools/apps.d.ts +9 -0
- package/dist/computer/tools/apps.d.ts.map +1 -0
- package/dist/computer/tools/apps.js +41 -0
- package/dist/computer/tools/apps.js.map +1 -0
- package/dist/computer/tools/browser.d.ts +11 -0
- package/dist/computer/tools/browser.d.ts.map +1 -0
- package/dist/computer/tools/browser.js +63 -0
- package/dist/computer/tools/browser.js.map +1 -0
- package/dist/computer/tools/computer.d.ts +16 -0
- package/dist/computer/tools/computer.d.ts.map +1 -0
- package/dist/computer/tools/computer.js +80 -0
- package/dist/computer/tools/computer.js.map +1 -0
- package/dist/computer/tools/describe.d.ts +4 -0
- package/dist/computer/tools/describe.d.ts.map +1 -0
- package/dist/computer/tools/describe.js +37 -0
- package/dist/computer/tools/describe.js.map +1 -0
- package/dist/computer/tools/files.d.ts +12 -0
- package/dist/computer/tools/files.d.ts.map +1 -0
- package/dist/computer/tools/files.js +58 -0
- package/dist/computer/tools/files.js.map +1 -0
- package/dist/computer/tools/sandboxes.d.ts +45 -0
- package/dist/computer/tools/sandboxes.d.ts.map +1 -0
- package/dist/computer/tools/sandboxes.js +230 -0
- package/dist/computer/tools/sandboxes.js.map +1 -0
- package/dist/computer/tools/shell.d.ts +22 -0
- package/dist/computer/tools/shell.d.ts.map +1 -0
- package/dist/computer/tools/shell.js +78 -0
- package/dist/computer/tools/shell.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +7 -0
- package/dist/config.js.map +1 -0
- package/dist/resident.d.ts +8 -0
- package/dist/resident.d.ts.map +1 -0
- package/dist/resident.js +92 -0
- package/dist/resident.js.map +1 -0
- package/dist/status.d.ts +21 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +123 -0
- package/dist/status.js.map +1 -0
- package/dist/sync/commands.d.ts +20 -0
- package/dist/sync/commands.d.ts.map +1 -0
- package/dist/sync/commands.js +244 -0
- package/dist/sync/commands.js.map +1 -0
- package/dist/sync/config.d.ts +41 -0
- package/dist/sync/config.d.ts.map +1 -0
- package/dist/sync/config.js +35 -0
- package/dist/sync/config.js.map +1 -0
- package/dist/sync/exec.d.ts +10 -0
- package/dist/sync/exec.d.ts.map +1 -0
- package/dist/sync/exec.js +26 -0
- package/dist/sync/exec.js.map +1 -0
- package/dist/sync/git-bridge.d.ts +11 -0
- package/dist/sync/git-bridge.d.ts.map +1 -0
- package/dist/sync/git-bridge.js +122 -0
- package/dist/sync/git-bridge.js.map +1 -0
- package/dist/sync/mirror.d.ts +19 -0
- package/dist/sync/mirror.d.ts.map +1 -0
- package/dist/sync/mirror.js +310 -0
- package/dist/sync/mirror.js.map +1 -0
- package/dist/sync/mutagen.d.ts +68 -0
- package/dist/sync/mutagen.d.ts.map +1 -0
- package/dist/sync/mutagen.js +289 -0
- package/dist/sync/mutagen.js.map +1 -0
- package/dist/sync/report.d.ts +6 -0
- package/dist/sync/report.d.ts.map +1 -0
- package/dist/sync/report.js +66 -0
- package/dist/sync/report.js.map +1 -0
- package/dist/sync/ssh.d.ts +29 -0
- package/dist/sync/ssh.d.ts.map +1 -0
- package/dist/sync/ssh.js +165 -0
- package/dist/sync/ssh.js.map +1 -0
- package/dist/sync/tunnel.d.ts +22 -0
- package/dist/sync/tunnel.d.ts.map +1 -0
- package/dist/sync/tunnel.js +160 -0
- package/dist/sync/tunnel.js.map +1 -0
- package/dist/upgrade.d.ts +36 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +95 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { chmod, mkdir, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { STATE_DIR, WORKSPACE_ROOT } from "@intentic/constants";
|
|
5
|
+
import { clearWindowsRunValue, quotedCommandLine, setWindowsRunValue, stubCommand, windowsLaunchStub, } from "@intentic/local-agent";
|
|
6
|
+
import { binDir, mutagenDaemonLogPath } from "./config.js";
|
|
7
|
+
import { runProcess } from "./exec.js";
|
|
8
|
+
import { BACKUP_IGNORES, IGNORES, mutagenSshPath, sanitizeId, sshAlias, sshTransportAnswers } from "./ssh.js";
|
|
9
|
+
const MUTAGEN_VERSION = "0.18.1";
|
|
10
|
+
const SESSION_PREFIX = "intentic-";
|
|
11
|
+
export const sessionName = (sandboxId) => `${SESSION_PREFIX}${sanitizeId(sandboxId)}`;
|
|
12
|
+
export const backupSessionName = (sandboxId) => `${sessionName(sandboxId)}-state`;
|
|
13
|
+
export const syncSessionNames = (sandboxId) => [sessionName(sandboxId), backupSessionName(sandboxId)];
|
|
14
|
+
const FORWARD_PREFIX = "intentic-fwd-";
|
|
15
|
+
export const forwardSessionName = (sandboxId, port) => `${FORWARD_PREFIX}${sanitizeId(sandboxId)}-${port}`;
|
|
16
|
+
const oursIn = (listed, prefix) => listed.split(/\s+/).filter((name) => name.startsWith(prefix));
|
|
17
|
+
const FORWARD_NAME = new RegExp(`^${FORWARD_PREFIX}(.+)-(\\d+)$`);
|
|
18
|
+
export const parseForwardNames = (listed, sandboxId) => {
|
|
19
|
+
const names = oursIn(listed, FORWARD_PREFIX);
|
|
20
|
+
if (sandboxId === undefined) {
|
|
21
|
+
return names;
|
|
22
|
+
}
|
|
23
|
+
const wanted = sanitizeId(sandboxId);
|
|
24
|
+
return names.filter((name) => FORWARD_NAME.exec(name)?.[1] === wanted);
|
|
25
|
+
};
|
|
26
|
+
export const parseOrphanForwardNames = (listed, keptSandboxIds) => {
|
|
27
|
+
const kept = new Set(keptSandboxIds.map(sanitizeId));
|
|
28
|
+
return parseForwardNames(listed).filter((name) => {
|
|
29
|
+
const owner = FORWARD_NAME.exec(name)?.[1];
|
|
30
|
+
return owner === undefined || !kept.has(owner);
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
export const parseOrphanSyncNames = (listed, keep) => {
|
|
34
|
+
const kept = new Set(keep);
|
|
35
|
+
return oursIn(listed, SESSION_PREFIX).filter((name) => !kept.has(name));
|
|
36
|
+
};
|
|
37
|
+
const listSessionNames = (mutagen, kind) => {
|
|
38
|
+
const result = spawnSync(mutagen, [kind, "list", "--template", "{{range .}}{{.Name}} {{end}}"], { encoding: "utf8", windowsHide: true });
|
|
39
|
+
return result.status === 0 ? result.stdout : "";
|
|
40
|
+
};
|
|
41
|
+
export const ourForwardSessions = (mutagen, sandboxId) => parseForwardNames(listSessionNames(mutagen, "forward"), sandboxId);
|
|
42
|
+
const orphanForwardSessions = (mutagen, keptSandboxIds) => parseOrphanForwardNames(listSessionNames(mutagen, "forward"), keptSandboxIds);
|
|
43
|
+
export const mutagenForwardArgs = (args) => [
|
|
44
|
+
"forward",
|
|
45
|
+
"create",
|
|
46
|
+
"--name",
|
|
47
|
+
args.name,
|
|
48
|
+
`tcp:127.0.0.1:${args.port}`,
|
|
49
|
+
`${args.alias}:tcp:${args.host.includes(":") ? `[${args.host}]` : args.host}:${args.port}`,
|
|
50
|
+
];
|
|
51
|
+
const sessionSpec = (pairing) => ({
|
|
52
|
+
name: sessionName(pairing.sandboxId),
|
|
53
|
+
localDir: pairing.localDir,
|
|
54
|
+
alias: sshAlias(pairing.sandboxId),
|
|
55
|
+
remoteDir: WORKSPACE_ROOT,
|
|
56
|
+
mode: "two-way-safe",
|
|
57
|
+
ignores: IGNORES,
|
|
58
|
+
from: "local",
|
|
59
|
+
});
|
|
60
|
+
const backupSpec = (pairing) => ({
|
|
61
|
+
name: backupSessionName(pairing.sandboxId),
|
|
62
|
+
localDir: join(pairing.localDir, STATE_DIR),
|
|
63
|
+
alias: sshAlias(pairing.sandboxId),
|
|
64
|
+
remoteDir: `${WORKSPACE_ROOT}/${STATE_DIR}`,
|
|
65
|
+
mode: "one-way-replica",
|
|
66
|
+
ignores: BACKUP_IGNORES,
|
|
67
|
+
from: "sandbox",
|
|
68
|
+
});
|
|
69
|
+
export const mutagenCreateArgs = (spec, paused) => {
|
|
70
|
+
const local = spec.localDir;
|
|
71
|
+
const remote = `${spec.alias}:${spec.remoteDir}`;
|
|
72
|
+
return [
|
|
73
|
+
"sync",
|
|
74
|
+
"create",
|
|
75
|
+
"--name",
|
|
76
|
+
spec.name,
|
|
77
|
+
"--sync-mode",
|
|
78
|
+
spec.mode,
|
|
79
|
+
...(paused ? ["--paused"] : []),
|
|
80
|
+
...spec.ignores.flatMap((pattern) => ["--ignore", pattern]),
|
|
81
|
+
"--stage-mode-beta",
|
|
82
|
+
"neighboring",
|
|
83
|
+
...(spec.from === "local" ? [local, remote] : [remote, local]),
|
|
84
|
+
];
|
|
85
|
+
};
|
|
86
|
+
const readSession = (mutagen, name) => {
|
|
87
|
+
const result = spawnSync(mutagen, ["sync", "list", "--template", "{{json .}}", name], { encoding: "utf8", windowsHide: true });
|
|
88
|
+
if (result.status !== 0) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
return JSON.parse(result.stdout)[0];
|
|
92
|
+
};
|
|
93
|
+
export const readSessionState = (mutagen, name) => {
|
|
94
|
+
const session = readSession(mutagen, name);
|
|
95
|
+
if (session === undefined) {
|
|
96
|
+
return { exists: false };
|
|
97
|
+
}
|
|
98
|
+
return { exists: true, status: session.status ?? "disconnected", paused: session.paused, conflicts: session.conflicts?.length };
|
|
99
|
+
};
|
|
100
|
+
export const existingSyncSessions = (mutagen, names) => {
|
|
101
|
+
const listed = new Set(oursIn(listSessionNames(mutagen, "sync"), SESSION_PREFIX));
|
|
102
|
+
return names.filter((name) => listed.has(name));
|
|
103
|
+
};
|
|
104
|
+
export const pauseUnreachableSync = (mutagen, pairing) => {
|
|
105
|
+
if (pairing.mode !== "sync") {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
const names = existingSyncSessions(mutagen, syncSessionNames(pairing.sandboxId));
|
|
109
|
+
if (names.every((name) => readSessionState(mutagen, name).paused === true)) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
const result = spawnSync(mutagen, ["sync", "pause", ...names], { stdio: "ignore", windowsHide: true });
|
|
113
|
+
return result.status === 0;
|
|
114
|
+
};
|
|
115
|
+
export const resumeAutoPausedSync = (mutagen, pairing) => {
|
|
116
|
+
if (pairing.mode !== "sync" || pairing.fileSyncAutoPaused !== true) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
const names = existingSyncSessions(mutagen, syncSessionNames(pairing.sandboxId));
|
|
120
|
+
if (names.length === 0) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
const result = spawnSync(mutagen, ["sync", "resume", ...names], { stdio: "ignore", windowsHide: true });
|
|
124
|
+
return result.status === 0;
|
|
125
|
+
};
|
|
126
|
+
export const sessionMatchesSpec = (session, spec) => {
|
|
127
|
+
const [alpha, beta] = spec.from === "local"
|
|
128
|
+
? [
|
|
129
|
+
{ host: undefined, path: spec.localDir },
|
|
130
|
+
{ host: spec.alias, path: spec.remoteDir },
|
|
131
|
+
]
|
|
132
|
+
: [
|
|
133
|
+
{ host: spec.alias, path: spec.remoteDir },
|
|
134
|
+
{ host: undefined, path: spec.localDir },
|
|
135
|
+
];
|
|
136
|
+
return (session.alpha.path === alpha.path &&
|
|
137
|
+
session.alpha.host === alpha.host &&
|
|
138
|
+
session.beta.path === beta.path &&
|
|
139
|
+
session.beta.host === beta.host &&
|
|
140
|
+
session.ignore.vcs !== true &&
|
|
141
|
+
(session.ignore.paths ?? []).join("\n") === spec.ignores.join("\n"));
|
|
142
|
+
};
|
|
143
|
+
export const ensureSyncSession = async (mutagen, pairing, log) => {
|
|
144
|
+
if (pairing.mode !== "sync" || pairing.localDir === undefined) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const held = { ...pairing, localDir: pairing.localDir };
|
|
148
|
+
for (const spec of [sessionSpec(held), backupSpec(held)]) {
|
|
149
|
+
await convergeSession(mutagen, spec, log);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const convergeSession = async (mutagen, spec, log) => {
|
|
153
|
+
const live = readSession(mutagen, spec.name);
|
|
154
|
+
if (live !== undefined && sessionMatchesSpec(live, spec)) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (live !== undefined) {
|
|
158
|
+
if (!(await sshTransportAnswers(mutagenSshPath(process.platform, process.env["MUTAGEN_SSH_PATH"]), spec.alias))) {
|
|
159
|
+
log(`${spec.name}: the sandbox is not answering, so its existing file sync is left running as it is rather than terminated for a replacement that cannot be created. Retrying later.`);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
log("the running sync session was created by an older agent: recreating it so this version's rules apply (no .git file-syncs anymore; commits arrive via the git bridge instead).");
|
|
163
|
+
spawnSync(mutagen, ["sync", "terminate", spec.name], { stdio: "ignore", windowsHide: true });
|
|
164
|
+
}
|
|
165
|
+
await runMutagenAsync(mutagen, mutagenCreateArgs(spec, live?.paused === true), log);
|
|
166
|
+
};
|
|
167
|
+
export const retireOrphanSessions = (mutagen, pairings, log) => {
|
|
168
|
+
const ids = pairings.map((pairing) => pairing.sandboxId);
|
|
169
|
+
const sessions = parseOrphanSyncNames(listSessionNames(mutagen, "sync"), pairings.flatMap((pairing) => syncSessionNames(pairing.sandboxId)));
|
|
170
|
+
if (sessions.length > 0) {
|
|
171
|
+
spawnSync(mutagen, ["sync", "terminate", ...sessions], { stdio: "ignore", windowsHide: true });
|
|
172
|
+
log(`retired ${sessions.length} file-sync session(s) belonging to sandboxes this machine no longer pairs.`);
|
|
173
|
+
}
|
|
174
|
+
const forwards = orphanForwardSessions(mutagen, ids);
|
|
175
|
+
if (forwards.length > 0) {
|
|
176
|
+
spawnSync(mutagen, ["forward", "terminate", ...forwards], { stdio: "ignore", windowsHide: true });
|
|
177
|
+
log(`released ${forwards.length} port forward(s) left holding localhost for sandboxes this machine no longer pairs.`);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
export const osToken = () => {
|
|
181
|
+
if (process.platform === "linux" || process.platform === "darwin") {
|
|
182
|
+
return process.platform;
|
|
183
|
+
}
|
|
184
|
+
if (process.platform === "win32") {
|
|
185
|
+
return "windows";
|
|
186
|
+
}
|
|
187
|
+
throw new Error(`auto-download isn't supported on ${process.platform}: install mutagen and cloudflared manually, then re-run.`);
|
|
188
|
+
};
|
|
189
|
+
export const exe = process.platform === "win32" ? ".exe" : "";
|
|
190
|
+
export const archToken = () => {
|
|
191
|
+
if (process.arch === "x64") {
|
|
192
|
+
return "amd64";
|
|
193
|
+
}
|
|
194
|
+
if (process.arch === "arm64") {
|
|
195
|
+
return "arm64";
|
|
196
|
+
}
|
|
197
|
+
throw new Error(`unsupported CPU arch ${process.arch}: install mutagen and cloudflared manually, then re-run.`);
|
|
198
|
+
};
|
|
199
|
+
const installedVersion = (binary, versionArgs) => {
|
|
200
|
+
const result = spawnSync(binary, versionArgs, { encoding: "utf8", windowsHide: true });
|
|
201
|
+
if (result.error !== undefined || result.status !== 0) {
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
return /\d+\.\d+\.\d+/.exec(result.stdout)?.[0];
|
|
205
|
+
};
|
|
206
|
+
export const download = async (url, dest) => {
|
|
207
|
+
const response = await fetch(url);
|
|
208
|
+
if (!response.ok) {
|
|
209
|
+
throw new Error(`download failed (${response.status}): ${url}`);
|
|
210
|
+
}
|
|
211
|
+
await mkdir(binDir, { recursive: true });
|
|
212
|
+
await writeFile(dest, new Uint8Array(await response.arrayBuffer()));
|
|
213
|
+
};
|
|
214
|
+
const replaceBinary = async (binary, write) => {
|
|
215
|
+
const displaced = `${binary}.old`;
|
|
216
|
+
await rm(displaced, { force: true }).catch(() => { });
|
|
217
|
+
await rename(binary, displaced).catch(() => { });
|
|
218
|
+
await write();
|
|
219
|
+
await chmod(binary, 0o755);
|
|
220
|
+
await rm(displaced, { force: true }).catch(() => { });
|
|
221
|
+
};
|
|
222
|
+
const extractTarball = (tarball) => {
|
|
223
|
+
const extract = spawnSync("tar", ["-xzf", tarball, "-C", binDir], { stdio: "inherit", windowsHide: true });
|
|
224
|
+
if (extract.status !== 0) {
|
|
225
|
+
throw new Error(`failed to extract ${tarball}: tar's own reason is above (no \`tar\` on PATH, or a file it must replace is in use)`);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
export const ensureMutagen = async () => {
|
|
229
|
+
if (installedVersion("mutagen", ["version"]) !== undefined) {
|
|
230
|
+
return "mutagen";
|
|
231
|
+
}
|
|
232
|
+
const dest = join(binDir, `mutagen${exe}`);
|
|
233
|
+
if (installedVersion(dest, ["version"]) === MUTAGEN_VERSION) {
|
|
234
|
+
return dest;
|
|
235
|
+
}
|
|
236
|
+
spawnSync(dest, ["daemon", "stop"], { stdio: "ignore", windowsHide: true });
|
|
237
|
+
const tarball = join(binDir, "mutagen.tar.gz");
|
|
238
|
+
await download(`https://github.com/mutagen-io/mutagen/releases/download/v${MUTAGEN_VERSION}/mutagen_${osToken()}_${archToken()}_v${MUTAGEN_VERSION}.tar.gz`, tarball);
|
|
239
|
+
await replaceBinary(dest, () => extractTarball(tarball));
|
|
240
|
+
return dest;
|
|
241
|
+
};
|
|
242
|
+
export const runMutagenAsync = async (mutagen, args, log) => {
|
|
243
|
+
const result = await runProcess(mutagen, args);
|
|
244
|
+
const said = `${result.stdout}${result.stderr}`.trim();
|
|
245
|
+
if (result.status === 0) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
if (said !== "") {
|
|
249
|
+
log(` mutagen: ${said.split("\n").join(" / ")}`);
|
|
250
|
+
}
|
|
251
|
+
throw new Error(`mutagen ${args[0] ?? ""} exited with code ${result.status}`);
|
|
252
|
+
};
|
|
253
|
+
export const runMutagen = (mutagen, args) => {
|
|
254
|
+
const result = spawnSync(mutagen, args, { stdio: "inherit", windowsHide: true });
|
|
255
|
+
if (result.error !== undefined) {
|
|
256
|
+
throw result.error;
|
|
257
|
+
}
|
|
258
|
+
if (result.status !== 0) {
|
|
259
|
+
throw new Error(`mutagen ${args[0] ?? ""} exited with code ${result.status}`);
|
|
260
|
+
}
|
|
261
|
+
return result;
|
|
262
|
+
};
|
|
263
|
+
export const MUTAGEN_RUN_VALUE = "IntenticMutagenDaemon";
|
|
264
|
+
export const registerMutagenAutostart = (mutagen, launcher, log) => {
|
|
265
|
+
if (process.platform === "linux") {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
const stub = windowsLaunchStub(launcher);
|
|
270
|
+
if (stub === undefined) {
|
|
271
|
+
runMutagen(mutagen, ["daemon", "register"]);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
spawnSync(mutagen, ["daemon", "unregister"], { stdio: "ignore", windowsHide: true });
|
|
275
|
+
setWindowsRunValue(MUTAGEN_RUN_VALUE, quotedCommandLine(stubCommand(stub, mutagenDaemonLogPath, [mutagen, "daemon", "start"])));
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
log(`note: could not register the Mutagen daemon for autostart (${error instanceof Error ? error.message : String(error)}); it still runs while you're logged in.`);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
export const unregisterMutagenAutostart = (mutagen) => {
|
|
282
|
+
if (process.platform === "win32") {
|
|
283
|
+
clearWindowsRunValue(MUTAGEN_RUN_VALUE);
|
|
284
|
+
}
|
|
285
|
+
if (process.platform !== "linux") {
|
|
286
|
+
spawnSync(mutagen, ["daemon", "unregister"], { stdio: "ignore", windowsHide: true });
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
//# sourceMappingURL=mutagen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutagen.js","sourceRoot":"","sources":["../../src/sync/mutagen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAEH,oBAAoB,EAEpB,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,iBAAiB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAgB,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG9G,MAAM,eAAe,GAAG,QAAQ,CAAC;AAIjC,MAAM,cAAc,GAAG,WAAW,CAAC;AAGnC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAU,EAAE,CAAC,GAAG,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;AAMtG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAU,EAAE,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC;AAKlG,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAqB,EAAE,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;AAMjI,MAAM,cAAc,GAAG,eAAe,CAAC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,IAAY,EAAU,EAAE,CAAC,GAAG,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;AAKnI,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,MAAc,EAAY,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAI3H,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,IAAI,cAAc,cAAc,CAAC,CAAC;AAKlE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,SAAkB,EAAY,EAAE;IAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;AAC3E,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAE,cAAiC,EAAY,EAAE;IACnG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAc,EAAE,IAAuB,EAAY,EAAE;IACtF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5E,CAAC,CAAC;AAIF,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,IAAwB,EAAU,EAAE;IAC3E,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,8BAA8B,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACzI,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAE,SAAkB,EAAY,EAAE,CAChF,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;AAGvE,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,cAAiC,EAAY,EAAE,CAC3F,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;AAMlF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAKlC,EAAY,EAAE,CAAC;IACZ,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,IAAI,CAAC,IAAI;IACT,iBAAiB,IAAI,CAAC,IAAI,EAAE;IAC5B,GAAG,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;CAC7F,CAAC;AA0BF,MAAM,WAAW,GAAG,CAAC,OAAgD,EAAmB,EAAE,CAAC,CAAC;IACxF,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;IACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;IAClC,SAAS,EAAE,cAAc;IACzB,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,OAAO;CAChB,CAAC,CAAC;AAsBH,MAAM,UAAU,GAAG,CAAC,OAAgD,EAAmB,EAAE,CAAC,CAAC;IACvF,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC;IAC1C,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC3C,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;IAClC,SAAS,EAAE,GAAG,cAAc,IAAI,SAAS,EAAE;IAC3C,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,cAAc;IACvB,IAAI,EAAE,SAAS;CAClB,CAAC,CAAC;AAYH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAqB,EAAE,MAAe,EAAY,EAAE;IAClF,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC5B,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;IACjD,OAAO;QACH,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,IAAI,CAAC,IAAI;QACT,aAAa;QACb,IAAI,CAAC,IAAI;QACT,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3D,mBAAmB;QACnB,aAAa;QAEb,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KACjE,CAAC;AACN,CAAC,CAAC;AAqBF,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,IAAY,EAA2B,EAAE;IAC3E,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/H,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAmB,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC;AAcF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC5B,OAAe,EACf,IAAY,EACkG,EAAE;IAChH,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;AACpI,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,KAAwB,EAAY,EAAE;IACxF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,OAAgB,EAAW,EAAE;IAC/E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAEjF,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;QACzE,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACvG,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,OAAgB,EAAW,EAAE;IAC/E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;QACjE,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACxG,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC/B,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAoB,EAAE,IAAqB,EAAW,EAAE;IAGvF,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GACf,IAAI,CAAC,IAAI,KAAK,OAAO;QACjB,CAAC,CAAC;YACI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;YACxC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE;SAC7C;QACH,CAAC,CAAC;YACI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE;YAC1C,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC3C,CAAC;IACZ,OAAO,CACH,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QACjC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QACjC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QAC/B,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QAC/B,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI;QAC3B,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CACtE,CAAC;AACN,CAAC,CAAC;AAWF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAe,EAAE,OAAgB,EAAE,GAAQ,EAAiB,EAAE;IAClG,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO;IACX,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;IAKxD,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EAAE,OAAe,EAAE,IAAqB,EAAE,GAAQ,EAAiB,EAAE;IAC9F,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,IAAI,KAAK,SAAS,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO;IACX,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAWrB,IAAI,CAAC,CAAC,MAAM,mBAAmB,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9G,GAAG,CACC,GAAG,IAAI,CAAC,IAAI,qKAAqK,CACpL,CAAC;YACF,OAAO;QACX,CAAC;QACD,GAAG,CACC,8KAA8K,CACjL,CAAC;QACF,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AACxF,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,QAA4B,EAAE,GAAQ,EAAQ,EAAE;IAClG,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,oBAAoB,CACjC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,EACjC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CACrE,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/F,GAAG,CAAC,WAAW,QAAQ,CAAC,MAAM,4EAA4E,CAAC,CAAC;IAChH,CAAC;IACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAClG,GAAG,CAAC,YAAY,QAAQ,CAAC,MAAM,qFAAqF,CAAC,CAAC;IAC1H,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,GAAmC,EAAE;IACxD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,CAAC,QAAQ,0DAA0D,CAAC,CAAC;AACpI,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAE9D,MAAM,CAAC,MAAM,SAAS,GAAG,GAAsB,EAAE;IAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,CAAC,IAAI,0DAA0D,CAAC,CAAC;AACpH,CAAC,CAAC;AASF,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,WAAqB,EAAsB,EAAE;IACnF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACvF,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,IAAY,EAAiB,EAAE;IACvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC;AAOF,MAAM,aAAa,GAAG,KAAK,EAAE,MAAc,EAAE,KAAiC,EAAiB,EAAE;IAC7F,MAAM,SAAS,GAAG,GAAG,MAAM,MAAM,CAAC;IAElC,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,EAAE,CAAC;IACd,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC;AAGF,MAAM,cAAc,GAAG,CAAC,OAAe,EAAQ,EAAE;IAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3G,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,uFAAuF,CAAC,CAAC;IACzI,CAAC;AACL,CAAC,CAAC;AAaF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,IAAqB,EAAE;IACrD,IAAI,gBAAgB,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACzD,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC;IAC3C,IAAI,gBAAgB,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,eAAe,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAGD,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC/C,MAAM,QAAQ,CACV,4DAA4D,eAAe,YAAY,OAAO,EAAE,IAAI,SAAS,EAAE,KAAK,eAAe,SAAS,EAC5I,OAAO,CACV,CAAC;IACF,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,OAAe,EAAE,IAAuB,EAAE,GAAQ,EAAiB,EAAE;IACvG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;IACX,CAAC;IACD,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QACd,GAAG,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAClF,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,IAAc,EAA4B,EAAE;IACpF,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,CAAC,KAAK,CAAC;IACvB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAezD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAAe,EAAE,QAAqB,EAAE,GAAQ,EAAQ,EAAE;IAC/F,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC/B,OAAO;IACX,CAAC;IACD,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,UAAU,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;YAC5C,OAAO;QACX,CAAC;QACD,SAAS,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,kBAAkB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACpI,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,GAAG,CACC,8DAA8D,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CACjK,CAAC;IACN,CAAC;AACL,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,OAAe,EAAQ,EAAE;IAChE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC/B,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC/B,SAAS,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MachineReport } from "@intentic/sandbox-contract";
|
|
2
|
+
import { type SyncState } from "./config.js";
|
|
3
|
+
export declare const buildReport: (state: SyncState, mutagen: string | undefined, watcher: MachineReport["watcher"], capturedAt: number) => MachineReport;
|
|
4
|
+
export declare const machineReport: (mutagen: string | undefined) => Promise<MachineReport>;
|
|
5
|
+
export declare const scopedReport: (report: MachineReport, sandboxId: string) => MachineReport;
|
|
6
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/sync/report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA+B,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG7F,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AA2F3F,eAAO,MAAM,WAAW,UAAW,SAAS,WAAW,MAAM,GAAG,SAAS,WAAW,aAAa,CAAC,SAAS,CAAC,cAAc,MAAM,KAAG,aASjI,CAAC;AAGH,eAAO,MAAM,aAAa,YAAmB,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,aAAa,CACV,CAAC;AAY9E,eAAO,MAAM,YAAY,WAAY,aAAa,aAAa,MAAM,KAAG,aAItE,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { hostname, platform } from "node:os";
|
|
3
|
+
import { livePid } from "@intentic/local-agent";
|
|
4
|
+
import { runPidPath } from "../config.js";
|
|
5
|
+
import { MACHINE_VERSION } from "../version.js";
|
|
6
|
+
import { mirrorHeartbeatPath, readState } from "./config.js";
|
|
7
|
+
import { backupSessionName, readSessionState, sessionName } from "./mutagen.js";
|
|
8
|
+
const lastTick = async () => {
|
|
9
|
+
const raw = await readFile(mirrorHeartbeatPath, "utf8").catch(() => undefined);
|
|
10
|
+
const stamped = Number(raw?.trim());
|
|
11
|
+
return Number.isFinite(stamped) && stamped > 0 ? stamped : undefined;
|
|
12
|
+
};
|
|
13
|
+
const watcherState = async () => {
|
|
14
|
+
const [pid, lastTickAt] = await Promise.all([livePid(runPidPath), lastTick()]);
|
|
15
|
+
return { running: pid !== undefined, pid, lastTickAt };
|
|
16
|
+
};
|
|
17
|
+
const pairingReport = (mutagen, pairing) => {
|
|
18
|
+
if (pairing.mode !== "sync" || mutagen === undefined) {
|
|
19
|
+
return { sandboxId: pairing.sandboxId, mode: pairing.mode, localDir: pairing.localDir };
|
|
20
|
+
}
|
|
21
|
+
const session = readSessionState(mutagen, sessionName(pairing.sandboxId));
|
|
22
|
+
const backup = readSessionState(mutagen, backupSessionName(pairing.sandboxId));
|
|
23
|
+
return {
|
|
24
|
+
sandboxId: pairing.sandboxId,
|
|
25
|
+
mode: pairing.mode,
|
|
26
|
+
localDir: pairing.localDir,
|
|
27
|
+
mutagenStatus: session.status,
|
|
28
|
+
conflicts: session.conflicts,
|
|
29
|
+
paused: session.paused,
|
|
30
|
+
backupStatus: backup.status,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const portRows = (pairing) => [
|
|
34
|
+
...(pairing.mirroredPorts ?? []).map((port) => ({
|
|
35
|
+
port: port.port,
|
|
36
|
+
host: port.host,
|
|
37
|
+
sandboxId: pairing.sandboxId,
|
|
38
|
+
state: `mirrored`,
|
|
39
|
+
command: port.command,
|
|
40
|
+
})),
|
|
41
|
+
...(pairing.skippedPorts ?? []).map((port) => ({
|
|
42
|
+
port: port.port,
|
|
43
|
+
host: port.host,
|
|
44
|
+
sandboxId: pairing.sandboxId,
|
|
45
|
+
state: port.heldBy === undefined ? `busy` : `held-by-sandbox`,
|
|
46
|
+
heldBy: port.heldBy,
|
|
47
|
+
command: port.command,
|
|
48
|
+
})),
|
|
49
|
+
];
|
|
50
|
+
export const buildReport = (state, mutagen, watcher, capturedAt) => ({
|
|
51
|
+
hostname: hostname(),
|
|
52
|
+
os: platform(),
|
|
53
|
+
agents: { sync: MACHINE_VERSION },
|
|
54
|
+
sandboxes: [],
|
|
55
|
+
pairings: state.pairings.map((pairing) => pairingReport(mutagen, pairing)),
|
|
56
|
+
ports: state.pairings.flatMap(portRows),
|
|
57
|
+
watcher,
|
|
58
|
+
capturedAt,
|
|
59
|
+
});
|
|
60
|
+
export const machineReport = async (mutagen) => buildReport(await readState(), mutagen, await watcherState(), Date.now());
|
|
61
|
+
export const scopedReport = (report, sandboxId) => ({
|
|
62
|
+
...report,
|
|
63
|
+
pairings: report.pairings.filter((pairing) => pairing.sandboxId === sandboxId),
|
|
64
|
+
ports: report.ports.filter((port) => port.sandboxId === sandboxId),
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/sync/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Log } from "@intentic/local-agent";
|
|
2
|
+
export declare const IGNORES: string[];
|
|
3
|
+
export declare const BACKUP_IGNORES: readonly string[];
|
|
4
|
+
export declare const sanitizeId: (raw: string) => string;
|
|
5
|
+
export declare const sshAlias: (sandboxId: string) => string;
|
|
6
|
+
export declare const sshConfigBlock: (args: {
|
|
7
|
+
readonly alias: string;
|
|
8
|
+
readonly port: number;
|
|
9
|
+
readonly identityFile: string;
|
|
10
|
+
readonly knownHostsFile: string;
|
|
11
|
+
}) => string;
|
|
12
|
+
export declare const INCLUDE_MARKER = "Include intentic-machine.conf";
|
|
13
|
+
export declare const stripManagedIncludes: (config: string) => string;
|
|
14
|
+
export declare const pruneKnownHosts: () => Promise<boolean>;
|
|
15
|
+
export declare const ensureSshKey: () => Promise<string>;
|
|
16
|
+
export declare const pairingSshConfig: (pairings: readonly {
|
|
17
|
+
readonly sandboxId: string;
|
|
18
|
+
}[]) => string;
|
|
19
|
+
export declare const writeManagedSshConfig: (fragment: string) => Promise<void>;
|
|
20
|
+
export declare const removeManagedSshConfig: () => Promise<void>;
|
|
21
|
+
export declare const mutagenSshPath: (platform: NodeJS.Platform, override: string | undefined) => string;
|
|
22
|
+
export declare const resolvedEndpoint: (sshGOutput: string) => {
|
|
23
|
+
hostname?: string;
|
|
24
|
+
port?: number;
|
|
25
|
+
};
|
|
26
|
+
export declare const assertSshConfigVisible: (ssh: string, alias: string, expectedPort: number) => void;
|
|
27
|
+
export declare const probeSshTransport: (ssh: string, alias: string, log: Log) => Promise<void>;
|
|
28
|
+
export declare const sshTransportAnswers: (ssh: string, alias: string) => Promise<boolean>;
|
|
29
|
+
//# sourceMappingURL=ssh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/sync/ssh.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AA6BjD,eAAO,MAAM,OAAO,UAiBnB,CAAC;AA8BF,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAO1C,CAAC;AAGH,eAAO,MAAM,UAAU,QAAS,MAAM,KAAG,MAAoE,CAAC;AAE9G,eAAO,MAAM,QAAQ,cAAe,MAAM,KAAG,MAAkD,CAAC;AAkBhG,eAAO,MAAM,cAAc,SAAU;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACnC,KAAG,MAsBY,CAAC;AAYjB,eAAO,MAAM,cAAc,kCAA6B,CAAC;AASzD,eAAO,MAAM,oBAAoB,WAAY,MAAM,KAAG,MAInC,CAAC;AAcpB,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,OAAO,CAWvD,CAAC;AAGF,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,MAAM,CAenD,CAAC;AAKF,eAAO,MAAM,gBAAgB,aAAc,SAAS;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,KAAG,MAUpE,CAAC;AAMpB,eAAO,MAAM,qBAAqB,aAAoB,MAAM,KAAG,OAAO,CAAC,IAAI,CAY1E,CAAC;AAGF,eAAO,MAAM,sBAAsB,QAAa,OAAO,CAAC,IAAI,CAO3D,CAAC;AAmBF,eAAO,MAAM,cAAc,aAAc,MAAM,CAAC,QAAQ,YAAY,MAAM,GAAG,SAAS,KAAG,MAGxF,CAAC;AASF,eAAO,MAAM,gBAAgB,eAAgB,MAAM,KAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAIvF,CAAC;AAKF,eAAO,MAAM,sBAAsB,QAAS,MAAM,SAAS,MAAM,gBAAgB,MAAM,KAAG,IAwBzF,CAAC;AAMF,eAAO,MAAM,iBAAiB,QAAe,MAAM,SAAS,MAAM,OAAO,GAAG,KAAG,OAAO,CAAC,IAAI,CAK1F,CAAC;AAgBF,eAAO,MAAM,mBAAmB,QAAe,MAAM,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,CAIrF,CAAC"}
|
package/dist/sync/ssh.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { homedir, hostname } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { STATE_DIR } from "@intentic/constants";
|
|
7
|
+
import { STATE_GROUPS, stateGroupPaths, UNBACKED_STATE_PATHS } from "@intentic/sandbox-contract";
|
|
8
|
+
import { baseDir } from "../config.js";
|
|
9
|
+
import { knownHostsPath, sshConfigName, sshConfigPath, sshDir, sshKeyPath, userSshConfigPath } from "./config.js";
|
|
10
|
+
import { runProcess } from "./exec.js";
|
|
11
|
+
import { syncSshPort } from "./tunnel.js";
|
|
12
|
+
export const IGNORES = [
|
|
13
|
+
"node_modules",
|
|
14
|
+
"dist",
|
|
15
|
+
".turbo",
|
|
16
|
+
".cache",
|
|
17
|
+
".next",
|
|
18
|
+
".angular",
|
|
19
|
+
".env",
|
|
20
|
+
".secrets.json",
|
|
21
|
+
"claude.json",
|
|
22
|
+
STATE_DIR,
|
|
23
|
+
".git",
|
|
24
|
+
".pnpm-store",
|
|
25
|
+
];
|
|
26
|
+
const anchored = (path) => {
|
|
27
|
+
const tail = path.slice(`${STATE_DIR}/`.length).replace(/\/$/, "");
|
|
28
|
+
return `/${tail.endsWith(".") ? `${tail}*` : tail}`;
|
|
29
|
+
};
|
|
30
|
+
export const BACKUP_IGNORES = STATE_GROUPS.flatMap((group) => {
|
|
31
|
+
const inGroup = stateGroupPaths(group);
|
|
32
|
+
const excluded = inGroup.filter((path) => UNBACKED_STATE_PATHS.includes(path));
|
|
33
|
+
if (excluded.length === 0) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
return excluded.length === inGroup.length ? [`/${group}`] : excluded.map(anchored);
|
|
37
|
+
});
|
|
38
|
+
export const sanitizeId = (raw) => raw.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
39
|
+
export const sshAlias = (sandboxId) => `intentic-sync-${sanitizeId(sandboxId)}`;
|
|
40
|
+
const slashPath = (path) => path.replaceAll("\\", "/");
|
|
41
|
+
export const sshConfigBlock = (args) => [
|
|
42
|
+
`Host ${args.alias}`,
|
|
43
|
+
" HostName 127.0.0.1",
|
|
44
|
+
` Port ${args.port}`,
|
|
45
|
+
" User root",
|
|
46
|
+
` IdentityFile "${slashPath(args.identityFile)}"`,
|
|
47
|
+
" IdentitiesOnly yes",
|
|
48
|
+
` UserKnownHostsFile "${slashPath(args.knownHostsFile)}"`,
|
|
49
|
+
" StrictHostKeyChecking accept-new",
|
|
50
|
+
` HostKeyAlias ${args.alias}`,
|
|
51
|
+
"",
|
|
52
|
+
].join("\n");
|
|
53
|
+
export const INCLUDE_MARKER = `Include ${sshConfigName}`;
|
|
54
|
+
const MANAGED_INCLUDE = /^[ \t]*Include[ \t]+"?(?:intentic-machine\.conf|intentic-sync\.conf|.*[/\\]\.intentic[/\\]sync[/\\]ssh_config)"?[ \t]*$/;
|
|
55
|
+
export const stripManagedIncludes = (config) => config
|
|
56
|
+
.split("\n")
|
|
57
|
+
.filter((line) => !MANAGED_INCLUDE.test(line))
|
|
58
|
+
.join("\n");
|
|
59
|
+
const LITERAL_HOST_KEY_ALIAS = "%h";
|
|
60
|
+
export const pruneKnownHosts = async () => {
|
|
61
|
+
const current = await readFile(knownHostsPath, "utf8").catch(() => undefined);
|
|
62
|
+
if (current === undefined) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const kept = current.split("\n").filter((line) => line.split(" ")[0] !== LITERAL_HOST_KEY_ALIAS);
|
|
66
|
+
if (kept.length === current.split("\n").length) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
await writeFile(knownHostsPath, kept.join("\n"), { mode: 0o600 });
|
|
70
|
+
return true;
|
|
71
|
+
};
|
|
72
|
+
export const ensureSshKey = async () => {
|
|
73
|
+
await mkdir(baseDir, { recursive: true });
|
|
74
|
+
const pub = `${sshKeyPath}.pub`;
|
|
75
|
+
const existing = await readFile(pub, "utf8").catch(() => undefined);
|
|
76
|
+
if (existing !== undefined) {
|
|
77
|
+
return existing.trim();
|
|
78
|
+
}
|
|
79
|
+
const comment = hostname().replace(/\s+/g, "-") || "intentic-machine";
|
|
80
|
+
const result = spawnSync("ssh-keygen", ["-t", "ed25519", "-N", "", "-C", comment, "-f", sshKeyPath], { stdio: "inherit" });
|
|
81
|
+
if (result.status !== 0) {
|
|
82
|
+
throw new Error("ssh-keygen failed: is an OpenSSH client installed?");
|
|
83
|
+
}
|
|
84
|
+
return (await readFile(pub, "utf8")).trim();
|
|
85
|
+
};
|
|
86
|
+
export const pairingSshConfig = (pairings) => pairings
|
|
87
|
+
.map((pairing) => sshConfigBlock({
|
|
88
|
+
alias: sshAlias(pairing.sandboxId),
|
|
89
|
+
port: syncSshPort(pairing.sandboxId),
|
|
90
|
+
identityFile: sshKeyPath,
|
|
91
|
+
knownHostsFile: knownHostsPath,
|
|
92
|
+
}))
|
|
93
|
+
.join("\n");
|
|
94
|
+
export const writeManagedSshConfig = async (fragment) => {
|
|
95
|
+
await mkdir(sshDir, { recursive: true, mode: 0o700 });
|
|
96
|
+
await writeFile(sshConfigPath, fragment, { mode: 0o600 });
|
|
97
|
+
const current = await readFile(userSshConfigPath, "utf8").catch(() => "");
|
|
98
|
+
const desired = `${INCLUDE_MARKER}\n${stripManagedIncludes(current)}`;
|
|
99
|
+
if (desired === current) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const tmp = `${userSshConfigPath}.intentic-tmp`;
|
|
103
|
+
await writeFile(tmp, desired, { mode: 0o600 });
|
|
104
|
+
await rename(tmp, userSshConfigPath);
|
|
105
|
+
};
|
|
106
|
+
export const removeManagedSshConfig = async () => {
|
|
107
|
+
await rm(sshConfigPath, { force: true });
|
|
108
|
+
const current = await readFile(userSshConfigPath, "utf8").catch(() => "");
|
|
109
|
+
const stripped = stripManagedIncludes(current);
|
|
110
|
+
if (stripped !== current) {
|
|
111
|
+
await writeFile(userSshConfigPath, stripped, { mode: 0o600 });
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const WINDOWS_SSH_SEARCH_PATHS = [
|
|
115
|
+
"C:\\Program Files\\Git\\usr\\bin",
|
|
116
|
+
"C:\\Program Files (x86)\\Git\\usr\\bin",
|
|
117
|
+
"C:\\msys32\\usr\\bin",
|
|
118
|
+
"C:\\msys64\\usr\\bin",
|
|
119
|
+
"C:\\cygwin\\bin",
|
|
120
|
+
"C:\\cygwin64\\bin",
|
|
121
|
+
"C:\\Windows\\System32\\OpenSSH",
|
|
122
|
+
];
|
|
123
|
+
export const mutagenSshPath = (platform, override) => {
|
|
124
|
+
const dirs = override === undefined || override === "" ? (platform === "win32" ? WINDOWS_SSH_SEARCH_PATHS : []) : [override];
|
|
125
|
+
return dirs.map((dir) => join(dir, platform === "win32" ? "ssh.exe" : "ssh")).find((candidate) => existsSync(candidate)) ?? "ssh";
|
|
126
|
+
};
|
|
127
|
+
export const resolvedEndpoint = (sshGOutput) => {
|
|
128
|
+
const host = /^hostname (.+)$/m.exec(sshGOutput)?.[1]?.trim();
|
|
129
|
+
const port = Number(/^port (\d+)$/m.exec(sshGOutput)?.[1]);
|
|
130
|
+
return { ...(host === undefined ? {} : { hostname: host }), ...(Number.isInteger(port) ? { port } : {}) };
|
|
131
|
+
};
|
|
132
|
+
export const assertSshConfigVisible = (ssh, alias, expectedPort) => {
|
|
133
|
+
const result = spawnSync(ssh, ["-G", alias], { encoding: "utf8", windowsHide: true });
|
|
134
|
+
if (result.error !== undefined) {
|
|
135
|
+
throw new Error(`could not run "${ssh}", the SSH client Mutagen drives the sync transport with: ${result.error.message}`);
|
|
136
|
+
}
|
|
137
|
+
const resolved = resolvedEndpoint(result.stdout);
|
|
138
|
+
if (resolved.hostname === "127.0.0.1" && resolved.port === expectedPort) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const expected = `127.0.0.1:${expectedPort}`;
|
|
142
|
+
throw new Error([
|
|
143
|
+
`"${ssh}": the SSH client Mutagen uses, resolves ${alias} to "${resolved.hostname ?? "nothing"}:${resolved.port ?? "?"}" instead of ${expected},`,
|
|
144
|
+
`so it is not reading ${sshConfigPath}, which ${userSshConfigPath} includes. Most often that client resolves`,
|
|
145
|
+
`~ to a home directory other than ${homedir()}.`,
|
|
146
|
+
...(result.stderr.trim() === "" ? [] : [result.stderr.trim()]),
|
|
147
|
+
...(process.platform === "win32"
|
|
148
|
+
? [`Point Mutagen at the Windows OpenSSH client and re-run: setx MUTAGEN_SSH_PATH "C:\\Windows\\System32\\OpenSSH"`]
|
|
149
|
+
: []),
|
|
150
|
+
].join("\n"));
|
|
151
|
+
};
|
|
152
|
+
export const probeSshTransport = async (ssh, alias, log) => {
|
|
153
|
+
if (await sshTransportAnswers(ssh, alias)) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
log(`note: a test SSH connection to the sandbox failed, sync may not start:\n${sshProbeReason}`);
|
|
157
|
+
};
|
|
158
|
+
let sshProbeReason = "";
|
|
159
|
+
export const sshTransportAnswers = async (ssh, alias) => {
|
|
160
|
+
const result = await runProcess(ssh, ["-o", "BatchMode=yes", "-o", "ConnectTimeout=20", alias, "true"], { timeoutMs: PROBE_TIMEOUT_MS });
|
|
161
|
+
sshProbeReason = result.stderr.trim();
|
|
162
|
+
return result.status === 0;
|
|
163
|
+
};
|
|
164
|
+
const PROBE_TIMEOUT_MS = 30_000;
|
|
165
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/sync/ssh.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Socket } from "node:net";
|
|
2
|
+
import type { Log } from "@intentic/local-agent";
|
|
3
|
+
export declare const syncSshPort: (sandboxId: string) => number;
|
|
4
|
+
export declare const sshSocketUrl: (sandboxUrl: string) => string;
|
|
5
|
+
export interface TunnelTarget {
|
|
6
|
+
readonly sandboxId: string;
|
|
7
|
+
readonly sandboxUrl: string;
|
|
8
|
+
readonly syncToken: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const tunnelTargets: (pairings: readonly {
|
|
11
|
+
readonly sandboxId: string;
|
|
12
|
+
readonly sandboxUrl: string;
|
|
13
|
+
readonly syncToken?: string;
|
|
14
|
+
}[]) => readonly TunnelTarget[];
|
|
15
|
+
export declare const bridgeConnection: (socket: Socket, target: TunnelTarget, onError: (message: string) => void) => void;
|
|
16
|
+
export declare const startSshTunnel: (target: TunnelTarget, log: Log) => Promise<(() => Promise<void>) | undefined>;
|
|
17
|
+
export declare const createTunnelPool: (log: Log) => {
|
|
18
|
+
reconcile: (targets: readonly TunnelTarget[]) => Promise<void>;
|
|
19
|
+
stopAll: () => Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
export declare const tunnelReady: (port: number, timeoutMs: number) => Promise<boolean>;
|
|
22
|
+
//# sourceMappingURL=tunnel.d.ts.map
|