@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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -0
  3. package/dist/app.d.ts +2 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +12 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/autostart.d.ts +3 -0
  8. package/dist/autostart.d.ts.map +1 -0
  9. package/dist/autostart.js +13 -0
  10. package/dist/autostart.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +5 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/commands.d.ts +11 -0
  16. package/dist/commands.d.ts.map +1 -0
  17. package/dist/commands.js +91 -0
  18. package/dist/commands.js.map +1 -0
  19. package/dist/computer/audit.d.ts +6 -0
  20. package/dist/computer/audit.d.ts.map +1 -0
  21. package/dist/computer/audit.js +12 -0
  22. package/dist/computer/audit.js.map +1 -0
  23. package/dist/computer/commands.d.ts +8 -0
  24. package/dist/computer/commands.d.ts.map +1 -0
  25. package/dist/computer/commands.js +113 -0
  26. package/dist/computer/commands.js.map +1 -0
  27. package/dist/computer/config.d.ts +19 -0
  28. package/dist/computer/config.d.ts.map +1 -0
  29. package/dist/computer/config.js +31 -0
  30. package/dist/computer/config.js.map +1 -0
  31. package/dist/computer/connection.d.ts +8 -0
  32. package/dist/computer/connection.d.ts.map +1 -0
  33. package/dist/computer/connection.js +63 -0
  34. package/dist/computer/connection.js.map +1 -0
  35. package/dist/computer/mcp.d.ts +3 -0
  36. package/dist/computer/mcp.d.ts.map +1 -0
  37. package/dist/computer/mcp.js +312 -0
  38. package/dist/computer/mcp.js.map +1 -0
  39. package/dist/computer/policy.d.ts +8 -0
  40. package/dist/computer/policy.d.ts.map +1 -0
  41. package/dist/computer/policy.js +42 -0
  42. package/dist/computer/policy.js.map +1 -0
  43. package/dist/computer/router.d.ts +93 -0
  44. package/dist/computer/router.d.ts.map +1 -0
  45. package/dist/computer/router.js +79 -0
  46. package/dist/computer/router.js.map +1 -0
  47. package/dist/computer/tools/apps.d.ts +9 -0
  48. package/dist/computer/tools/apps.d.ts.map +1 -0
  49. package/dist/computer/tools/apps.js +41 -0
  50. package/dist/computer/tools/apps.js.map +1 -0
  51. package/dist/computer/tools/browser.d.ts +11 -0
  52. package/dist/computer/tools/browser.d.ts.map +1 -0
  53. package/dist/computer/tools/browser.js +63 -0
  54. package/dist/computer/tools/browser.js.map +1 -0
  55. package/dist/computer/tools/computer.d.ts +16 -0
  56. package/dist/computer/tools/computer.d.ts.map +1 -0
  57. package/dist/computer/tools/computer.js +80 -0
  58. package/dist/computer/tools/computer.js.map +1 -0
  59. package/dist/computer/tools/describe.d.ts +4 -0
  60. package/dist/computer/tools/describe.d.ts.map +1 -0
  61. package/dist/computer/tools/describe.js +37 -0
  62. package/dist/computer/tools/describe.js.map +1 -0
  63. package/dist/computer/tools/files.d.ts +12 -0
  64. package/dist/computer/tools/files.d.ts.map +1 -0
  65. package/dist/computer/tools/files.js +58 -0
  66. package/dist/computer/tools/files.js.map +1 -0
  67. package/dist/computer/tools/sandboxes.d.ts +45 -0
  68. package/dist/computer/tools/sandboxes.d.ts.map +1 -0
  69. package/dist/computer/tools/sandboxes.js +230 -0
  70. package/dist/computer/tools/sandboxes.js.map +1 -0
  71. package/dist/computer/tools/shell.d.ts +22 -0
  72. package/dist/computer/tools/shell.d.ts.map +1 -0
  73. package/dist/computer/tools/shell.js +78 -0
  74. package/dist/computer/tools/shell.js.map +1 -0
  75. package/dist/config.d.ts +4 -0
  76. package/dist/config.d.ts.map +1 -0
  77. package/dist/config.js +7 -0
  78. package/dist/config.js.map +1 -0
  79. package/dist/resident.d.ts +8 -0
  80. package/dist/resident.d.ts.map +1 -0
  81. package/dist/resident.js +92 -0
  82. package/dist/resident.js.map +1 -0
  83. package/dist/status.d.ts +21 -0
  84. package/dist/status.d.ts.map +1 -0
  85. package/dist/status.js +123 -0
  86. package/dist/status.js.map +1 -0
  87. package/dist/sync/commands.d.ts +20 -0
  88. package/dist/sync/commands.d.ts.map +1 -0
  89. package/dist/sync/commands.js +244 -0
  90. package/dist/sync/commands.js.map +1 -0
  91. package/dist/sync/config.d.ts +41 -0
  92. package/dist/sync/config.d.ts.map +1 -0
  93. package/dist/sync/config.js +35 -0
  94. package/dist/sync/config.js.map +1 -0
  95. package/dist/sync/exec.d.ts +10 -0
  96. package/dist/sync/exec.d.ts.map +1 -0
  97. package/dist/sync/exec.js +26 -0
  98. package/dist/sync/exec.js.map +1 -0
  99. package/dist/sync/git-bridge.d.ts +11 -0
  100. package/dist/sync/git-bridge.d.ts.map +1 -0
  101. package/dist/sync/git-bridge.js +122 -0
  102. package/dist/sync/git-bridge.js.map +1 -0
  103. package/dist/sync/mirror.d.ts +19 -0
  104. package/dist/sync/mirror.d.ts.map +1 -0
  105. package/dist/sync/mirror.js +310 -0
  106. package/dist/sync/mirror.js.map +1 -0
  107. package/dist/sync/mutagen.d.ts +68 -0
  108. package/dist/sync/mutagen.d.ts.map +1 -0
  109. package/dist/sync/mutagen.js +289 -0
  110. package/dist/sync/mutagen.js.map +1 -0
  111. package/dist/sync/report.d.ts +6 -0
  112. package/dist/sync/report.d.ts.map +1 -0
  113. package/dist/sync/report.js +66 -0
  114. package/dist/sync/report.js.map +1 -0
  115. package/dist/sync/ssh.d.ts +29 -0
  116. package/dist/sync/ssh.d.ts.map +1 -0
  117. package/dist/sync/ssh.js +165 -0
  118. package/dist/sync/ssh.js.map +1 -0
  119. package/dist/sync/tunnel.d.ts +22 -0
  120. package/dist/sync/tunnel.d.ts.map +1 -0
  121. package/dist/sync/tunnel.js +160 -0
  122. package/dist/sync/tunnel.js.map +1 -0
  123. package/dist/upgrade.d.ts +36 -0
  124. package/dist/upgrade.d.ts.map +1 -0
  125. package/dist/upgrade.js +95 -0
  126. package/dist/upgrade.js.map +1 -0
  127. package/dist/version.d.ts +2 -0
  128. package/dist/version.d.ts.map +1 -0
  129. package/dist/version.js +2 -0
  130. package/dist/version.js.map +1 -0
  131. package/package.json +49 -0
@@ -0,0 +1,122 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { HISTORY_ROOT } from "@intentic/constants";
4
+ import { runProcess } from "./exec.js";
5
+ import { sshAlias } from "./ssh.js";
6
+ const EXEC_TIMEOUT_MS = 120_000;
7
+ export const realBridgeExec = {
8
+ run: async (command, args, cwd) => {
9
+ const result = await runProcess(command, args, { cwd, timeoutMs: EXEC_TIMEOUT_MS });
10
+ return result.status === 0 ? result.stdout : undefined;
11
+ },
12
+ exists: existsSync,
13
+ };
14
+ const SEGMENT = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;
15
+ const isSafeRepoId = (id) => {
16
+ const segments = id.split("/");
17
+ return segments.length <= 4 && segments.every((segment) => SEGMENT.test(segment));
18
+ };
19
+ export const listSandboxRepos = async (exec, alias) => {
20
+ const out = await exec.run("ssh", ["-o", "BatchMode=yes", alias, "ls", `${HISTORY_ROOT}/gits`]);
21
+ if (out === undefined) {
22
+ return undefined;
23
+ }
24
+ return out
25
+ .split("\n")
26
+ .map((line) => decodeURIComponent(line.trim()))
27
+ .filter((id) => id !== "" && id !== "root" && isSafeRepoId(id));
28
+ };
29
+ export const bridgeRepo = async (exec, alias, localDir, repo, log) => {
30
+ const dir = join(localDir, repo);
31
+ if (!exec.exists(dir)) {
32
+ return;
33
+ }
34
+ const url = `${alias}:/history/gits/${encodeURIComponent(repo)}`;
35
+ if (!exec.exists(join(dir, ".git"))) {
36
+ if ((await exec.run("git", ["init", "-q"], dir)) === undefined) {
37
+ return;
38
+ }
39
+ log(` ${repo}: initialized, this repo's history now follows the sandbox`);
40
+ }
41
+ if ((await exec.run("git", ["config", "--get", "core.fileMode"], dir))?.trim() !== "false") {
42
+ await exec.run("git", ["config", "core.fileMode", "false"], dir);
43
+ }
44
+ const current = (await exec.run("git", ["remote", "get-url", "sandbox"], dir))?.trim();
45
+ if (current === undefined) {
46
+ if ((await exec.run("git", ["remote", "add", "sandbox", url], dir)) === undefined) {
47
+ return;
48
+ }
49
+ }
50
+ else if (current !== url) {
51
+ await exec.run("git", ["remote", "set-url", "sandbox", url], dir);
52
+ }
53
+ const symref = (await exec.run("git", ["ls-remote", "--symref", "sandbox", "HEAD"], dir)) ?? "";
54
+ const branch = /^ref:\s+refs\/heads\/(\S+)\s+HEAD/m.exec(symref)?.[1];
55
+ const remoteTip = /^([0-9a-f]+)\s+HEAD\s*$/m.exec(symref)?.[1];
56
+ if (branch === undefined || remoteTip === undefined) {
57
+ return;
58
+ }
59
+ const head = (await exec.run("git", ["rev-parse", "-q", "--verify", "HEAD"], dir))?.trim();
60
+ const localBranch = (await exec.run("git", ["symbolic-ref", "--short", "-q", "HEAD"], dir))?.trim();
61
+ const bridged = `refs/intentic/bridged/${branch}`;
62
+ const installed = (await exec.run("git", ["rev-parse", "-q", "--verify", bridged], dir))?.trim();
63
+ if (head === remoteTip && localBranch === branch) {
64
+ if (head !== undefined && installed !== head) {
65
+ await exec.run("git", ["update-ref", bridged, head], dir);
66
+ }
67
+ return;
68
+ }
69
+ if ((await exec.run("git", ["fetch", "-q", "sandbox", `+refs/heads/${branch}:refs/remotes/sandbox/${branch}`], dir)) === undefined) {
70
+ log(` ${repo}: fetch from the sandbox failed, will retry next pass`);
71
+ return;
72
+ }
73
+ const tip = (await exec.run("git", ["rev-parse", "-q", "--verify", `refs/remotes/sandbox/${branch}`], dir))?.trim();
74
+ if (tip === undefined || tip === "") {
75
+ return;
76
+ }
77
+ if (head !== undefined && (await exec.run("git", ["diff", "--cached", "--quiet"], dir)) === undefined) {
78
+ return;
79
+ }
80
+ if (head !== undefined && head !== tip && (await exec.run("git", ["merge-base", "--is-ancestor", "HEAD", tip], dir)) === undefined) {
81
+ if (head !== installed) {
82
+ log(` ${repo}: local commits diverge from the sandbox, leaving it alone`);
83
+ return;
84
+ }
85
+ log(` ${repo}: the sandbox rewound ${branch}, following it back`);
86
+ }
87
+ if (localBranch !== branch) {
88
+ const existing = (await exec.run("git", ["rev-parse", "-q", "--verify", `refs/heads/${branch}`], dir))?.trim();
89
+ if (existing !== undefined &&
90
+ existing !== "" &&
91
+ existing !== tip &&
92
+ existing !== installed &&
93
+ (await exec.run("git", ["merge-base", "--is-ancestor", existing, tip], dir)) === undefined) {
94
+ log(` ${repo}: local branch ${branch} diverges from the sandbox, leaving it alone`);
95
+ return;
96
+ }
97
+ await exec.run("git", ["symbolic-ref", "HEAD", `refs/heads/${branch}`], dir);
98
+ }
99
+ else if (head === tip) {
100
+ return;
101
+ }
102
+ if ((await exec.run("git", ["reset", "-q", tip], dir)) !== undefined) {
103
+ await exec.run("git", ["update-ref", bridged, tip], dir);
104
+ log(` ${repo}: fast-forwarded ${branch} to ${tip.slice(0, 8)}`);
105
+ }
106
+ };
107
+ export const runGitBridge = async (exec, pairing, log, known) => {
108
+ if (pairing.mode !== "sync" || pairing.localDir === undefined) {
109
+ return undefined;
110
+ }
111
+ const alias = sshAlias(pairing.sandboxId);
112
+ const repos = known ?? (await listSandboxRepos(exec, alias));
113
+ if (repos === undefined) {
114
+ log(` ${pairing.sandboxId}: git bridge couldn't list the sandbox's repos, will retry next pass`);
115
+ return undefined;
116
+ }
117
+ for (const repo of repos) {
118
+ await bridgeRepo(exec, alias, pairing.localDir, repo, log);
119
+ }
120
+ return repos;
121
+ };
122
+ //# sourceMappingURL=git-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-bridge.js","sourceRoot":"","sources":["../../src/sync/git-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Log } from "@intentic/local-agent";
2
+ import { type PortSummary } from "@intentic/sandbox-contract";
3
+ import { type MirroredPort, type SkippedPort } from "./config.js";
4
+ export declare const shouldAutoPauseFileSync: (failedPolls: number) => boolean;
5
+ export declare class SyncAuthError extends Error {
6
+ }
7
+ export declare const fetchWorkspacePorts: (sandboxUrl: string, syncToken: string) => Promise<PortSummary[]>;
8
+ export interface ForwardExecutor {
9
+ readonly terminate: (port: number) => void;
10
+ readonly create: (summary: PortSummary) => Promise<void>;
11
+ readonly isLocalPortFree: (port: number) => Promise<boolean>;
12
+ }
13
+ export declare const reconcileForwards: (executor: ForwardExecutor, current: readonly MirroredPort[], desired: readonly PortSummary[], claimedBy: ReadonlyMap<number, string>, log: Log) => Promise<MirroredPort[]>;
14
+ export declare const skippedPortsOf: (desired: readonly PortSummary[], mirrored: readonly MirroredPort[], claimedBy: ReadonlyMap<number, string>) => SkippedPort[];
15
+ export declare const signalExitCode: (signal: NodeJS.Signals) => number;
16
+ export declare const runMirrorWatch: (log: Log) => Promise<void>;
17
+ export declare const retirePairingMirror: (mutagen: string, sandboxId: string) => Promise<number>;
18
+ export declare const teardownAllForwards: (mutagen: string, log: Log) => Promise<void>;
19
+ //# sourceMappingURL=mirror.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror.d.ts","sourceRoot":"","sources":["../../src/sync/mirror.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,KAAK,WAAW,EAAmB,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAEH,KAAK,YAAY,EAKjB,KAAK,WAAW,EAEnB,MAAM,aAAa,CAAC;AAuErB,eAAO,MAAM,uBAAuB,gBAAiB,MAAM,KAAG,OAAiD,CAAC;AAIhH,qBAAa,aAAc,SAAQ,KAAK;CAAG;AAM3C,eAAO,MAAM,mBAAmB,eAAsB,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,WAAW,EAAE,CActG,CAAC;AAaF,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAI3C,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,QAAQ,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE;AA+BD,eAAO,MAAM,iBAAiB,aAChB,eAAe,WAChB,SAAS,YAAY,EAAE,WACvB,SAAS,WAAW,EAAE,aACpB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,OACjC,GAAG,KACT,OAAO,CAAC,YAAY,EAAE,CAwCxB,CAAC;AA6BF,eAAO,MAAM,cAAc,YACd,SAAS,WAAW,EAAE,YACrB,SAAS,YAAY,EAAE,aACtB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,KACvC,WAAW,EAKb,CAAC;AAwBF,eAAO,MAAM,cAAc,WAAY,MAAM,CAAC,OAAO,KAAG,MAA2C,CAAC;AA6LpG,eAAO,MAAM,cAAc,QAAe,GAAG,KAAG,OAAO,CAAC,IAAI,CAwK3D,CAAC;AAwBF,eAAO,MAAM,mBAAmB,YAAmB,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,MAAM,CAA+C,CAAC;AAI7I,eAAO,MAAM,mBAAmB,YAAmB,MAAM,OAAO,GAAG,KAAG,OAAO,CAAC,IAAI,CAGjF,CAAC"}
@@ -0,0 +1,310 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { writeFile } from "node:fs/promises";
3
+ import net from "node:net";
4
+ import { setTimeout as sleep } from "node:timers/promises";
5
+ import { PortsListSchema } from "@intentic/sandbox-contract";
6
+ import { mirrorHeartbeatPath, readState, removePairing, setFileSyncAutoPaused, updateState, } from "./config.js";
7
+ import { realBridgeExec, runGitBridge } from "./git-bridge.js";
8
+ import { ensureMutagen, ensureSyncSession, forwardSessionName, mutagenForwardArgs, ourForwardSessions, pauseUnreachableSync, retireOrphanSessions, resumeAutoPausedSync, runMutagenAsync, } from "./mutagen.js";
9
+ import { machineReport, scopedReport } from "./report.js";
10
+ import { pairingSshConfig, pruneKnownHosts, sshAlias, writeManagedSshConfig } from "./ssh.js";
11
+ import { createTunnelPool, tunnelTargets } from "./tunnel.js";
12
+ const POLL_MS = 5000;
13
+ const PORTS_TIMEOUT_MS = 10_000;
14
+ const REPO_LIST_EVERY_TICKS = 12;
15
+ const REPORT_EVERY_TICKS = 3;
16
+ const REPORT_TIMEOUT_MS = 10_000;
17
+ const REVOKED_POLLS = 3;
18
+ const UNREACHABLE_PAUSE_POLLS = Math.ceil((60 * 60_000) / POLL_MS);
19
+ export const shouldAutoPauseFileSync = (failedPolls) => failedPolls >= UNREACHABLE_PAUSE_POLLS;
20
+ export class SyncAuthError extends Error {
21
+ }
22
+ export const fetchWorkspacePorts = async (sandboxUrl, syncToken) => {
23
+ const response = await fetch(`${sandboxUrl.replace(/\/$/, "")}/ports`, {
24
+ headers: { "x-intentic-sync": syncToken },
25
+ signal: AbortSignal.timeout(PORTS_TIMEOUT_MS),
26
+ });
27
+ if (response.status === 401 || response.status === 403) {
28
+ throw new SyncAuthError("the sandbox rejected the sync token: click 'Enable desktop sync' in your browser and re-run setup to mint a fresh one.");
29
+ }
30
+ if (!response.ok) {
31
+ throw new Error(`reading the sandbox's ports failed (${response.status}): ${await response.text()}`);
32
+ }
33
+ return PortsListSchema.parse(await response.json()).ports.filter((port) => port.kind === "workspace" && port.forwardable);
34
+ };
35
+ const localPortFree = (port) => new Promise((resolvePort) => {
36
+ const probe = net.createServer();
37
+ probe.once("error", () => resolvePort(false));
38
+ probe.listen(port, "127.0.0.1", () => probe.close(() => resolvePort(true)));
39
+ });
40
+ const mutagenExecutor = (mutagen, pairing, log) => ({
41
+ terminate: (port) => void spawnSync(mutagen, ["forward", "terminate", forwardSessionName(pairing.sandboxId, port)], { stdio: "ignore", windowsHide: true }),
42
+ create: async (summary) => await runMutagenAsync(mutagen, mutagenForwardArgs({
43
+ name: forwardSessionName(pairing.sandboxId, summary.port),
44
+ port: summary.port,
45
+ alias: sshAlias(pairing.sandboxId),
46
+ host: summary.host,
47
+ }), log),
48
+ isLocalPortFree: localPortFree,
49
+ });
50
+ export const reconcileForwards = async (executor, current, desired, claimedBy, log) => {
51
+ const desiredByPort = new Map(desired.map((port) => [port.port, port]));
52
+ for (const mirrored of current) {
53
+ const match = desiredByPort.get(mirrored.port);
54
+ if (match === undefined) {
55
+ executor.terminate(mirrored.port);
56
+ log(` localhost:${mirrored.port}: stopped (no longer listening in the sandbox)`);
57
+ }
58
+ else if (match.host !== mirrored.host) {
59
+ executor.terminate(mirrored.port);
60
+ }
61
+ }
62
+ const currentByPort = new Map(current.map((mirrored) => [mirrored.port, mirrored]));
63
+ const next = [];
64
+ for (const summary of desired) {
65
+ const existing = currentByPort.get(summary.port);
66
+ if (existing !== undefined && existing.host === summary.host) {
67
+ next.push(existing);
68
+ continue;
69
+ }
70
+ const heldBy = claimedBy.get(summary.port);
71
+ if (heldBy !== undefined) {
72
+ log(` localhost:${summary.port} is already mirrored from ${heldBy}: skipped (${summary.command ?? "unknown process"})`);
73
+ continue;
74
+ }
75
+ if (existing === undefined) {
76
+ executor.terminate(summary.port);
77
+ }
78
+ if (!(await executor.isLocalPortFree(summary.port))) {
79
+ log(` localhost:${summary.port} is busy on this machine: skipped (${summary.command ?? "unknown process"})`);
80
+ continue;
81
+ }
82
+ await executor.create(summary);
83
+ next.push({ port: summary.port, host: summary.host, command: summary.command });
84
+ log(` localhost:${summary.port} ← ${summary.command ?? "unknown process"}`);
85
+ }
86
+ return next;
87
+ };
88
+ const mirrorKey = (mirrored) => `${mirrored.port}:${mirrored.host}`;
89
+ const sameMirrorSet = (a, b) => {
90
+ if (a.length !== b.length) {
91
+ return false;
92
+ }
93
+ const seen = new Set(a.map(mirrorKey));
94
+ return b.every((mirrored) => seen.has(mirrorKey(mirrored)));
95
+ };
96
+ const skippedKey = (skipped) => `${skipped.port}:${skipped.heldBy ?? ""}`;
97
+ const sameSkippedSet = (a, b) => {
98
+ if (a.length !== b.length) {
99
+ return false;
100
+ }
101
+ const seen = new Set(a.map(skippedKey));
102
+ return b.every((skipped) => seen.has(skippedKey(skipped)));
103
+ };
104
+ export const skippedPortsOf = (desired, mirrored, claimedBy) => {
105
+ const got = new Set(mirrored.map((port) => port.port));
106
+ return desired
107
+ .filter((summary) => !got.has(summary.port))
108
+ .map((summary) => ({ port: summary.port, host: summary.host, heldBy: claimedBy.get(summary.port), command: summary.command }));
109
+ };
110
+ const beat = async () => await writeFile(mirrorHeartbeatPath, String(Date.now())).catch(() => { });
111
+ export const signalExitCode = (signal) => (signal === "SIGINT" ? 130 : 143);
112
+ const savePorts = async (sandboxId, mirroredPorts, skippedPorts) => await updateState((state) => ({
113
+ pairings: state.pairings.map((held) => (held.sandboxId === sandboxId ? { ...held, mirroredPorts, skippedPorts } : held)),
114
+ }));
115
+ const servePairing = async (mutagen, pairing, claimedBy, log) => {
116
+ const baseline = pairing.mirroredPorts ?? [];
117
+ const ports = pairing.syncToken === undefined ? [] : await fetchWorkspacePorts(pairing.sandboxUrl, pairing.syncToken);
118
+ const next = await reconcileForwards(mutagenExecutor(mutagen, pairing, log), baseline, ports, claimedBy, log);
119
+ const skipped = skippedPortsOf(ports, next, claimedBy);
120
+ if (!sameMirrorSet(baseline, next) || !sameSkippedSet(pairing.skippedPorts ?? [], skipped)) {
121
+ await savePorts(pairing.sandboxId, next, skipped);
122
+ }
123
+ return next;
124
+ };
125
+ const postReports = async (pairings, mutagen, unsupported, log) => {
126
+ const reportable = pairings.filter((pairing) => pairing.syncToken !== undefined && !unsupported.has(pairing.sandboxId));
127
+ if (reportable.length === 0) {
128
+ return;
129
+ }
130
+ const report = await machineReport(mutagen);
131
+ for (const pairing of reportable) {
132
+ try {
133
+ const response = await fetch(`${pairing.sandboxUrl.replace(/\/$/, "")}/system/sync/report`, {
134
+ method: "POST",
135
+ headers: { "content-type": "application/json", "x-intentic-sync": pairing.syncToken ?? "" },
136
+ body: JSON.stringify(scopedReport(report, pairing.sandboxId)),
137
+ signal: AbortSignal.timeout(REPORT_TIMEOUT_MS),
138
+ });
139
+ if (response.status === 404) {
140
+ unsupported.add(pairing.sandboxId);
141
+ log(` ${pairing.sandboxId}: this sandbox is running a daemon without machine reports, its Computers view will stay empty.`);
142
+ }
143
+ }
144
+ catch (error) {
145
+ log(` ${pairing.sandboxId}: report skipped: ${error instanceof Error ? error.message : String(error)}`);
146
+ }
147
+ }
148
+ };
149
+ const dropRevokedPairing = async (mutagen, sandboxId, log) => {
150
+ await removePairing(sandboxId);
151
+ retireOrphanSessions(mutagen, (await readState()).pairings, log);
152
+ };
153
+ const guard = async (log, what, step) => {
154
+ try {
155
+ await step();
156
+ return true;
157
+ }
158
+ catch (error) {
159
+ log(` ${what} failed: ${error instanceof Error ? error.message : String(error)}`);
160
+ return false;
161
+ }
162
+ };
163
+ const SESSION_RETRY_EVERY_TICKS = 60;
164
+ const absorbRejectedPoll = async (mutagen, pairing, rejectedPolls, repos, sessionsPending, log) => {
165
+ const rejected = (rejectedPolls.get(pairing.sandboxId) ?? 0) + 1;
166
+ rejectedPolls.set(pairing.sandboxId, rejected);
167
+ if (rejected < REVOKED_POLLS) {
168
+ return false;
169
+ }
170
+ log(`${pairing.sandboxId} rejected the sync token ${REVOKED_POLLS} polls in a row: this machine's enrollment was revoked.`);
171
+ rejectedPolls.delete(pairing.sandboxId);
172
+ repos.delete(pairing.sandboxId);
173
+ sessionsPending.delete(pairing.sandboxId);
174
+ await dropRevokedPairing(mutagen, pairing.sandboxId, log);
175
+ return true;
176
+ };
177
+ const absorbUnreachablePoll = async (mutagen, pairing, unreachablePolls, log) => {
178
+ const failed = (unreachablePolls.get(pairing.sandboxId) ?? 0) + 1;
179
+ unreachablePolls.set(pairing.sandboxId, failed);
180
+ if (pairing.fileSyncAutoPaused === true || !shouldAutoPauseFileSync(failed) || !pauseUnreachableSync(mutagen, pairing)) {
181
+ return false;
182
+ }
183
+ await setFileSyncAutoPaused(pairing.sandboxId, true);
184
+ log(` ${pairing.sandboxId}: unreachable for one hour; paused its Mutagen sessions to stop permanent reconnect/scanning load. They resume automatically when it returns.`);
185
+ return true;
186
+ };
187
+ const absorbPairingFailure = async (error, mutagen, pairing, tracking, log) => {
188
+ if (error instanceof SyncAuthError) {
189
+ const drop = await absorbRejectedPoll(mutagen, pairing, tracking.rejectedPolls, tracking.repos, tracking.sessionsPending, log);
190
+ return { drop, paused: false };
191
+ }
192
+ return { drop: false, paused: await absorbUnreachablePoll(mutagen, pairing, tracking.unreachablePolls, log) };
193
+ };
194
+ export const runMirrorWatch = async (log) => {
195
+ const mutagen = await ensureMutagen();
196
+ const initial = await readState();
197
+ if (initial.pairings.length === 0) {
198
+ log("no sandboxes are paired: nothing to mirror. Enable it from a sandbox's Desktop sync card.");
199
+ return;
200
+ }
201
+ await guard(log, "refreshing the ssh configuration", async () => {
202
+ await writeManagedSshConfig(pairingSshConfig(initial.pairings));
203
+ if (await pruneKnownHosts()) {
204
+ log(" removed a stale `%h` host-key entry left by an older agent: it was refusing every sandbox but the first.");
205
+ }
206
+ });
207
+ const tunnels = createTunnelPool(log);
208
+ await guard(log, "opening the sync transports", async () => await tunnels.reconcile(tunnelTargets(initial.pairings)));
209
+ const sessionsPending = new Set();
210
+ for (const pairing of initial.pairings) {
211
+ const ready = await guard(log, `${pairing.sandboxId}: preparing its file sync`, async () => await ensureSyncSession(mutagen, pairing, log));
212
+ if (!ready) {
213
+ sessionsPending.add(pairing.sandboxId);
214
+ }
215
+ }
216
+ await guard(log, "retiring orphaned sessions", () => retireOrphanSessions(mutagen, initial.pairings, log));
217
+ log(`sync started; polling ${initial.pairings.length} paired sandbox(es) every ${POLL_MS / 1000}s`);
218
+ const rejectedPolls = new Map();
219
+ const unreachablePolls = new Map();
220
+ const repos = new Map();
221
+ const tracking = { rejectedPolls, unreachablePolls, repos, sessionsPending };
222
+ const reportUnsupported = new Set();
223
+ for (let tick = 0;; tick += 1) {
224
+ const state = await readState().catch((error) => {
225
+ log(` tick skipped: the sync state didn't read (${error instanceof Error ? error.message : String(error)})`);
226
+ return undefined;
227
+ });
228
+ if (state === undefined) {
229
+ await sleep(POLL_MS);
230
+ continue;
231
+ }
232
+ if (state.pairings.length === 0) {
233
+ await tunnels.stopAll();
234
+ log("no sandboxes are paired any more: sync stopping. Re-enable from a sandbox's Desktop sync card.");
235
+ return;
236
+ }
237
+ await guard(log, "reconciling the sync transports", async () => await tunnels.reconcile(tunnelTargets(state.pairings)));
238
+ if (sessionsPending.size > 0 && tick % SESSION_RETRY_EVERY_TICKS === 0) {
239
+ for (const pairing of state.pairings.filter((held) => sessionsPending.has(held.sandboxId))) {
240
+ const ready = await guard(log, `${pairing.sandboxId}: preparing its file sync`, async () => await ensureSyncSession(mutagen, pairing, log));
241
+ if (ready) {
242
+ sessionsPending.delete(pairing.sandboxId);
243
+ log(` ${pairing.sandboxId}: file sync is running again`);
244
+ }
245
+ }
246
+ }
247
+ const claimedBy = new Map();
248
+ for (const pairing of state.pairings) {
249
+ let pausedThisPass = false;
250
+ try {
251
+ const mirrored = await servePairing(mutagen, pairing, claimedBy, log);
252
+ rejectedPolls.delete(pairing.sandboxId);
253
+ unreachablePolls.delete(pairing.sandboxId);
254
+ if (resumeAutoPausedSync(mutagen, pairing)) {
255
+ await setFileSyncAutoPaused(pairing.sandboxId, false);
256
+ sessionsPending.delete(pairing.sandboxId);
257
+ log(` ${pairing.sandboxId}: reachable again; resumed its automatically paused file sync`);
258
+ }
259
+ for (const port of mirrored) {
260
+ claimedBy.set(port.port, pairing.sandboxId);
261
+ }
262
+ }
263
+ catch (error) {
264
+ const outcome = await absorbPairingFailure(error, mutagen, pairing, tracking, log);
265
+ if (outcome.drop) {
266
+ continue;
267
+ }
268
+ pausedThisPass = outcome.paused;
269
+ log(` ${pairing.sandboxId}: reconcile skipped: ${error instanceof Error ? error.message : String(error)}`);
270
+ }
271
+ if (pairing.fileSyncAutoPaused === true || pausedThisPass) {
272
+ continue;
273
+ }
274
+ try {
275
+ const known = tick % REPO_LIST_EVERY_TICKS === 0 ? undefined : repos.get(pairing.sandboxId);
276
+ const listed = await runGitBridge(realBridgeExec, pairing, log, known);
277
+ if (listed === undefined) {
278
+ repos.delete(pairing.sandboxId);
279
+ }
280
+ else {
281
+ repos.set(pairing.sandboxId, listed);
282
+ }
283
+ }
284
+ catch (error) {
285
+ log(` ${pairing.sandboxId}: git bridge skipped: ${error instanceof Error ? error.message : String(error)}`);
286
+ }
287
+ }
288
+ if (tick % REPORT_EVERY_TICKS === 0) {
289
+ await guard(log, "posting this machine's reports", async () => await postReports(state.pairings, mutagen, reportUnsupported, log));
290
+ }
291
+ await beat();
292
+ await sleep(POLL_MS);
293
+ }
294
+ };
295
+ const teardownForwards = async (mutagen, sandboxId) => {
296
+ const names = ourForwardSessions(mutagen, sandboxId);
297
+ if (names.length > 0) {
298
+ spawnSync(mutagen, ["forward", "terminate", ...names], { stdio: "ignore", windowsHide: true });
299
+ }
300
+ await updateState((state) => ({
301
+ pairings: state.pairings.map((held) => sandboxId === undefined || held.sandboxId === sandboxId ? { ...held, mirroredPorts: [], skippedPorts: [] } : held),
302
+ }));
303
+ return names.length;
304
+ };
305
+ export const retirePairingMirror = async (mutagen, sandboxId) => await teardownForwards(mutagen, sandboxId);
306
+ export const teardownAllForwards = async (mutagen, log) => {
307
+ const forwards = await teardownForwards(mutagen);
308
+ log(forwards === 0 ? "port mirroring stopped." : `port mirroring stopped; tore down ${forwards} forward(s).`);
309
+ };
310
+ //# sourceMappingURL=mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/sync/mirror.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { type SpawnSyncReturns } from "node:child_process";
2
+ import { type CliLauncher, type Log } from "@intentic/local-agent";
3
+ import { type Pairing } from "./config.js";
4
+ export declare const sessionName: (sandboxId: string) => string;
5
+ export declare const backupSessionName: (sandboxId: string) => string;
6
+ export declare const syncSessionNames: (sandboxId: string) => readonly string[];
7
+ export declare const forwardSessionName: (sandboxId: string, port: number) => string;
8
+ export declare const parseForwardNames: (listed: string, sandboxId?: string) => string[];
9
+ export declare const parseOrphanForwardNames: (listed: string, keptSandboxIds: readonly string[]) => string[];
10
+ export declare const parseOrphanSyncNames: (listed: string, keep: readonly string[]) => string[];
11
+ export declare const ourForwardSessions: (mutagen: string, sandboxId?: string) => string[];
12
+ export declare const mutagenForwardArgs: (args: {
13
+ readonly name: string;
14
+ readonly port: number;
15
+ readonly alias: string;
16
+ readonly host: string;
17
+ }) => string[];
18
+ export interface SyncSessionSpec {
19
+ readonly name: string;
20
+ readonly localDir: string;
21
+ readonly alias: string;
22
+ readonly remoteDir: string;
23
+ readonly mode: "two-way-safe" | "one-way-replica";
24
+ readonly ignores: readonly string[];
25
+ readonly from: "local" | "sandbox";
26
+ }
27
+ export declare const mutagenCreateArgs: (spec: SyncSessionSpec, paused: boolean) => string[];
28
+ interface LiveSession {
29
+ readonly alpha: {
30
+ readonly host?: string;
31
+ readonly path?: string;
32
+ };
33
+ readonly beta: {
34
+ readonly host?: string;
35
+ readonly path?: string;
36
+ };
37
+ readonly ignore: {
38
+ readonly paths?: readonly string[];
39
+ readonly vcs?: boolean;
40
+ };
41
+ readonly paused?: boolean;
42
+ readonly status?: string;
43
+ readonly conflicts?: readonly unknown[];
44
+ }
45
+ export declare const readSessionState: (mutagen: string, name: string) => {
46
+ exists: boolean;
47
+ status?: string | undefined;
48
+ paused?: boolean | undefined;
49
+ conflicts?: number | undefined;
50
+ };
51
+ export declare const existingSyncSessions: (mutagen: string, names: readonly string[]) => string[];
52
+ export declare const pauseUnreachableSync: (mutagen: string, pairing: Pairing) => boolean;
53
+ export declare const resumeAutoPausedSync: (mutagen: string, pairing: Pairing) => boolean;
54
+ export declare const sessionMatchesSpec: (session: LiveSession, spec: SyncSessionSpec) => boolean;
55
+ export declare const ensureSyncSession: (mutagen: string, pairing: Pairing, log: Log) => Promise<void>;
56
+ export declare const retireOrphanSessions: (mutagen: string, pairings: readonly Pairing[], log: Log) => void;
57
+ export declare const osToken: () => "linux" | "darwin" | "windows";
58
+ export declare const exe: string;
59
+ export declare const archToken: () => "amd64" | "arm64";
60
+ export declare const download: (url: string, dest: string) => Promise<void>;
61
+ export declare const ensureMutagen: () => Promise<string>;
62
+ export declare const runMutagenAsync: (mutagen: string, args: readonly string[], log: Log) => Promise<void>;
63
+ export declare const runMutagen: (mutagen: string, args: string[]) => SpawnSyncReturns<Buffer>;
64
+ export declare const MUTAGEN_RUN_VALUE = "IntenticMutagenDaemon";
65
+ export declare const registerMutagenAutostart: (mutagen: string, launcher: CliLauncher, log: Log) => void;
66
+ export declare const unregisterMutagenAutostart: (mutagen: string) => void;
67
+ export {};
68
+ //# sourceMappingURL=mutagen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutagen.d.ts","sourceRoot":"","sources":["../../src/sync/mutagen.ts"],"names":[],"mappings":"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"}