@intentic/machine 1.316.0 → 1.318.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 (190) hide show
  1. package/README.md +198 -10
  2. package/dist/agent-trial.d.ts +25 -0
  3. package/dist/agent-trial.d.ts.map +1 -0
  4. package/dist/agent-trial.js +132 -0
  5. package/dist/agent-trial.js.map +1 -0
  6. package/dist/autostart/autostart.d.ts.map +1 -0
  7. package/dist/{autostart.js → autostart/autostart.js} +1 -1
  8. package/dist/autostart/autostart.js.map +1 -0
  9. package/dist/autostart/legacy-autostart.d.ts +4 -0
  10. package/dist/autostart/legacy-autostart.d.ts.map +1 -0
  11. package/dist/autostart/legacy-autostart.js +33 -0
  12. package/dist/autostart/legacy-autostart.js.map +1 -0
  13. package/dist/commands.d.ts.map +1 -1
  14. package/dist/commands.js +3 -1
  15. package/dist/commands.js.map +1 -1
  16. package/dist/device/grant.d.ts +322 -0
  17. package/dist/device/grant.d.ts.map +1 -0
  18. package/dist/device/grant.js +15 -0
  19. package/dist/device/grant.js.map +1 -0
  20. package/dist/device/loopback-catch.d.ts +3 -0
  21. package/dist/device/loopback-catch.d.ts.map +1 -0
  22. package/dist/device/loopback-catch.js +103 -0
  23. package/dist/device/loopback-catch.js.map +1 -0
  24. package/dist/device/mcp.d.ts.map +1 -1
  25. package/dist/device/mcp.js +5 -2
  26. package/dist/device/mcp.js.map +1 -1
  27. package/dist/device/router.d.ts +41 -2
  28. package/dist/device/router.d.ts.map +1 -1
  29. package/dist/device/router.js +23 -7
  30. package/dist/device/router.js.map +1 -1
  31. package/dist/device/sandbox-cli.d.ts +6 -0
  32. package/dist/device/sandbox-cli.d.ts.map +1 -0
  33. package/dist/device/sandbox-cli.js +76 -0
  34. package/dist/device/sandbox-cli.js.map +1 -0
  35. package/dist/device/sandbox-rounds/auto-backup.d.ts +13 -0
  36. package/dist/device/sandbox-rounds/auto-backup.d.ts.map +1 -0
  37. package/dist/device/sandbox-rounds/auto-backup.js +97 -0
  38. package/dist/device/sandbox-rounds/auto-backup.js.map +1 -0
  39. package/dist/device/sandbox-rounds/auto-prepare.d.ts +11 -0
  40. package/dist/device/sandbox-rounds/auto-prepare.d.ts.map +1 -0
  41. package/dist/device/sandbox-rounds/auto-prepare.js +20 -0
  42. package/dist/device/sandbox-rounds/auto-prepare.js.map +1 -0
  43. package/dist/device/sandbox-rounds/ic-rounds.d.ts +23 -0
  44. package/dist/device/sandbox-rounds/ic-rounds.d.ts.map +1 -0
  45. package/dist/device/sandbox-rounds/ic-rounds.js +78 -0
  46. package/dist/device/sandbox-rounds/ic-rounds.js.map +1 -0
  47. package/dist/device/sandbox-rounds/probation-watch.d.ts +32 -0
  48. package/dist/device/sandbox-rounds/probation-watch.d.ts.map +1 -0
  49. package/dist/device/sandbox-rounds/probation-watch.js +60 -0
  50. package/dist/device/sandbox-rounds/probation-watch.js.map +1 -0
  51. package/dist/device/sandbox-rounds/swap-records.d.ts +14 -0
  52. package/dist/device/sandbox-rounds/swap-records.d.ts.map +1 -0
  53. package/dist/device/sandbox-rounds/swap-records.js +45 -0
  54. package/dist/device/sandbox-rounds/swap-records.js.map +1 -0
  55. package/dist/device/tools/agent.d.ts +2 -2
  56. package/dist/device/tools/agent.d.ts.map +1 -1
  57. package/dist/device/tools/agent.js +14 -3
  58. package/dist/device/tools/agent.js.map +1 -1
  59. package/dist/device/tools/command-ledger.d.ts +14 -0
  60. package/dist/device/tools/command-ledger.d.ts.map +1 -0
  61. package/dist/device/tools/command-ledger.js +85 -0
  62. package/dist/device/tools/command-ledger.js.map +1 -0
  63. package/dist/device/tools/describe.d.ts +1 -1
  64. package/dist/device/tools/describe.d.ts.map +1 -1
  65. package/dist/device/tools/describe.js +2 -1
  66. package/dist/device/tools/describe.js.map +1 -1
  67. package/dist/device/tools/ic-binary.d.ts +1 -1
  68. package/dist/device/tools/ic-binary.d.ts.map +1 -1
  69. package/dist/device/tools/ic-binary.js +8 -3
  70. package/dist/device/tools/ic-binary.js.map +1 -1
  71. package/dist/device/tools/in-flight.d.ts +6 -0
  72. package/dist/device/tools/in-flight.d.ts.map +1 -0
  73. package/dist/device/tools/in-flight.js +26 -0
  74. package/dist/device/tools/in-flight.js.map +1 -0
  75. package/dist/device/tools/sandboxes.d.ts +14 -4
  76. package/dist/device/tools/sandboxes.d.ts.map +1 -1
  77. package/dist/device/tools/sandboxes.js +87 -27
  78. package/dist/device/tools/sandboxes.js.map +1 -1
  79. package/dist/device/tools/shell.d.ts +1 -0
  80. package/dist/device/tools/shell.d.ts.map +1 -1
  81. package/dist/device/tools/shell.js +15 -1
  82. package/dist/device/tools/shell.js.map +1 -1
  83. package/dist/environments/auto-upgrade.d.ts +2 -0
  84. package/dist/environments/auto-upgrade.d.ts.map +1 -1
  85. package/dist/environments/auto-upgrade.js +15 -0
  86. package/dist/environments/auto-upgrade.js.map +1 -1
  87. package/dist/environments/children.js +1 -1
  88. package/dist/environments/children.js.map +1 -1
  89. package/dist/environments/commands.d.ts +2 -0
  90. package/dist/environments/commands.d.ts.map +1 -1
  91. package/dist/environments/commands.js +46 -10
  92. package/dist/environments/commands.js.map +1 -1
  93. package/dist/environments/machine-upgrade.d.ts +2 -0
  94. package/dist/environments/machine-upgrade.d.ts.map +1 -1
  95. package/dist/environments/machine-upgrade.js +17 -2
  96. package/dist/environments/machine-upgrade.js.map +1 -1
  97. package/dist/environments/machine.d.ts +6 -0
  98. package/dist/environments/machine.d.ts.map +1 -1
  99. package/dist/environments/machine.js.map +1 -1
  100. package/dist/release.d.ts.map +1 -1
  101. package/dist/release.js +1 -6
  102. package/dist/release.js.map +1 -1
  103. package/dist/resident.d.ts +1 -0
  104. package/dist/resident.d.ts.map +1 -1
  105. package/dist/resident.js +30 -6
  106. package/dist/resident.js.map +1 -1
  107. package/dist/status.d.ts.map +1 -1
  108. package/dist/status.js +9 -4
  109. package/dist/status.js.map +1 -1
  110. package/dist/supervision.d.ts +1 -0
  111. package/dist/supervision.d.ts.map +1 -1
  112. package/dist/supervision.js +17 -1
  113. package/dist/supervision.js.map +1 -1
  114. package/dist/sync/commands.d.ts +19 -0
  115. package/dist/sync/commands.d.ts.map +1 -1
  116. package/dist/sync/commands.js +117 -23
  117. package/dist/sync/commands.js.map +1 -1
  118. package/dist/sync/config.d.ts +12 -1
  119. package/dist/sync/config.d.ts.map +1 -1
  120. package/dist/sync/config.js +45 -1
  121. package/dist/sync/config.js.map +1 -1
  122. package/dist/sync/folders.d.ts +8 -0
  123. package/dist/sync/folders.d.ts.map +1 -0
  124. package/dist/sync/folders.js +34 -0
  125. package/dist/sync/folders.js.map +1 -0
  126. package/dist/sync/git-bridge.d.ts +1 -1
  127. package/dist/sync/git-bridge.d.ts.map +1 -1
  128. package/dist/sync/git-bridge.js +2 -1
  129. package/dist/sync/git-bridge.js.map +1 -1
  130. package/dist/sync/mirror.d.ts +3 -1
  131. package/dist/sync/mirror.d.ts.map +1 -1
  132. package/dist/sync/mirror.js +72 -20
  133. package/dist/sync/mirror.js.map +1 -1
  134. package/dist/sync/mutagen.d.ts +29 -5
  135. package/dist/sync/mutagen.d.ts.map +1 -1
  136. package/dist/sync/mutagen.js +86 -31
  137. package/dist/sync/mutagen.js.map +1 -1
  138. package/dist/sync/project-commands.d.ts +23 -0
  139. package/dist/sync/project-commands.d.ts.map +1 -0
  140. package/dist/sync/project-commands.js +212 -0
  141. package/dist/sync/project-commands.js.map +1 -0
  142. package/dist/sync/project-files.d.ts +42 -0
  143. package/dist/sync/project-files.d.ts.map +1 -0
  144. package/dist/sync/project-files.js +110 -0
  145. package/dist/sync/project-files.js.map +1 -0
  146. package/dist/sync/project-local.d.ts +46 -0
  147. package/dist/sync/project-local.d.ts.map +1 -0
  148. package/dist/sync/project-local.js +217 -0
  149. package/dist/sync/project-local.js.map +1 -0
  150. package/dist/sync/project-remote.d.ts +55 -0
  151. package/dist/sync/project-remote.d.ts.map +1 -0
  152. package/dist/sync/project-remote.js +261 -0
  153. package/dist/sync/project-remote.js.map +1 -0
  154. package/dist/sync/project-transfer.d.ts +52 -0
  155. package/dist/sync/project-transfer.d.ts.map +1 -0
  156. package/dist/sync/project-transfer.js +278 -0
  157. package/dist/sync/project-transfer.js.map +1 -0
  158. package/dist/sync/report.d.ts.map +1 -1
  159. package/dist/sync/report.js +6 -4
  160. package/dist/sync/report.js.map +1 -1
  161. package/dist/sync/residue.d.ts.map +1 -1
  162. package/dist/sync/residue.js +2 -1
  163. package/dist/sync/residue.js.map +1 -1
  164. package/dist/sync/restore-points.d.ts +72 -0
  165. package/dist/sync/restore-points.d.ts.map +1 -0
  166. package/dist/sync/restore-points.js +154 -0
  167. package/dist/sync/restore-points.js.map +1 -0
  168. package/dist/sync/ssh.d.ts +6 -0
  169. package/dist/sync/ssh.d.ts.map +1 -1
  170. package/dist/sync/ssh.js +41 -3
  171. package/dist/sync/ssh.js.map +1 -1
  172. package/dist/sync/swap-pause.d.ts +10 -0
  173. package/dist/sync/swap-pause.d.ts.map +1 -0
  174. package/dist/sync/swap-pause.js +29 -0
  175. package/dist/sync/swap-pause.js.map +1 -0
  176. package/dist/sync/symlinks.d.ts +8 -0
  177. package/dist/sync/symlinks.d.ts.map +1 -0
  178. package/dist/sync/symlinks.js +30 -0
  179. package/dist/sync/symlinks.js.map +1 -0
  180. package/dist/upgrade.d.ts.map +1 -1
  181. package/dist/upgrade.js +18 -7
  182. package/dist/upgrade.js.map +1 -1
  183. package/package.json +8 -8
  184. package/dist/autostart.d.ts.map +0 -1
  185. package/dist/autostart.js.map +0 -1
  186. package/dist/device/auto-prepare.d.ts +0 -18
  187. package/dist/device/auto-prepare.d.ts.map +0 -1
  188. package/dist/device/auto-prepare.js +0 -85
  189. package/dist/device/auto-prepare.js.map +0 -1
  190. /package/dist/{autostart.d.ts → autostart/autostart.d.ts} +0 -0
@@ -0,0 +1,261 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { open } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { z } from "zod";
6
+ import { parseListing } from "./project-files.js";
7
+ const STDERR_TAIL = 4096;
8
+ export const realProjectRunner = {
9
+ spawn: (command, args, options) => {
10
+ const child = spawn(command, [...args], { stdio: ["pipe", "pipe", "pipe"], windowsHide: true });
11
+ let stderr = "";
12
+ child.stderr.setEncoding("utf8");
13
+ child.stderr.on("data", (chunk) => {
14
+ stderr = `${stderr}${chunk}`.slice(-STDERR_TAIL);
15
+ });
16
+ child.stdin.on("error", () => undefined);
17
+ child.stdin.end(options.input ?? "");
18
+ const timer = setTimeout(() => child.kill("SIGKILL"), options.timeoutMs);
19
+ const exit = new Promise((resolve) => {
20
+ child.on("error", (error) => {
21
+ clearTimeout(timer);
22
+ resolve({ status: null, stderr: `${stderr}${error.message}` });
23
+ });
24
+ child.on("close", (status) => {
25
+ clearTimeout(timer);
26
+ resolve({ status, stderr });
27
+ });
28
+ });
29
+ return { stdout: child.stdout, exit };
30
+ },
31
+ };
32
+ export const collect = async (spawned) => {
33
+ const chunks = [];
34
+ for await (const chunk of spawned.stdout) {
35
+ chunks.push(chunk);
36
+ }
37
+ return { ...(await spawned.exit), stdout: Buffer.concat(chunks) };
38
+ };
39
+ export const remoteNodeCommand = (program, input) => `node -e 'eval(Buffer.from("${Buffer.from(program).toString("base64")}","base64").toString())' ${Buffer.from(input).toString("base64")}`;
40
+ export const LISTING_PROGRAM = String.raw `
41
+ const fs = require("fs");
42
+ const path = require("path");
43
+ const crypto = require("crypto");
44
+ const { root, ignore } = JSON.parse(Buffer.from(process.argv[1], "base64").toString());
45
+ const rules = ignore.map((source) => new RegExp(source));
46
+ const fields = [];
47
+ const hashed = (file) => new Promise((resolve, reject) => {
48
+ const digest = crypto.createHash("sha256");
49
+ let size = 0;
50
+ fs.createReadStream(file)
51
+ .on("data", (chunk) => { digest.update(chunk); size += chunk.length; })
52
+ .on("error", reject)
53
+ .on("end", () => resolve([String(size), digest.digest("hex")]));
54
+ });
55
+ const walk = async (relative) => {
56
+ for (const entry of await fs.promises.readdir(path.join(root, relative), { withFileTypes: true })) {
57
+ const name = relative === "" ? entry.name : relative + "/" + entry.name;
58
+ if (rules.some((rule) => rule.test(name))) continue;
59
+ if (entry.isDirectory()) { await walk(name); continue; }
60
+ if (!entry.isFile()) { fields.push(name, "-", "-"); continue; }
61
+ try { fields.push(name, ...(await hashed(path.join(root, name)))); }
62
+ catch (error) { if (error.code !== "ENOENT") fields.push(name, "-", "-"); }
63
+ }
64
+ };
65
+ fs.promises.stat(root).then(
66
+ (info) => info.isDirectory() ? walk("").then(() => process.stdout.write(fields.map((field) => field + "\0").join(""))) : Promise.reject(new Error(root + " is not a folder")),
67
+ (error) => { if (error.code === "ENOENT") process.exitCode = 3; else throw error; },
68
+ ).catch((error) => { process.stderr.write(error.message + "\n"); process.exitCode = 1; });
69
+ `;
70
+ export const FETCH_PROGRAM = String.raw `
71
+ const fs = require("fs");
72
+ const path = require("path");
73
+ const { root } = JSON.parse(Buffer.from(process.argv[1], "base64").toString());
74
+ const write = (data) => new Promise((resolve, reject) => process.stdout.write(data, (error) => (error ? reject(error) : resolve())));
75
+ const header = (frame) => write(JSON.stringify(frame) + "\n");
76
+ const plainFolders = async (name) => {
77
+ let at = root;
78
+ for (const part of name.split("/").slice(0, -1)) {
79
+ at = path.join(at, part);
80
+ if (!(await fs.promises.lstat(at)).isDirectory()) return false;
81
+ }
82
+ return true;
83
+ };
84
+ const send = async (i, name) => {
85
+ let handle;
86
+ try {
87
+ if (!(await plainFolders(name))) return header({ i, skip: "a folder on its way in the sandbox is not a plain folder" });
88
+ handle = await fs.promises.open(path.join(root, name), fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
89
+ } catch (error) {
90
+ return header({ i, skip: error.code === "ENOENT" ? "it is no longer in the sandbox" : error.code === "ELOOP" ? "it is a link in the sandbox" : String(error.code || error.message) });
91
+ }
92
+ try {
93
+ const info = await handle.stat();
94
+ if (!info.isFile()) return header({ i, skip: "it is not a regular file in the sandbox" });
95
+ await header({ i, size: info.size, x: (info.mode & 0o111) !== 0 });
96
+ let sent = 0;
97
+ while (sent < info.size) {
98
+ const buffer = Buffer.alloc(Math.min(1 << 20, info.size - sent));
99
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, sent);
100
+ if (bytesRead === 0) { await write(Buffer.alloc(info.size - sent)); break; }
101
+ await write(buffer.subarray(0, bytesRead));
102
+ sent += bytesRead;
103
+ }
104
+ } finally {
105
+ await handle.close();
106
+ }
107
+ };
108
+ const input = [];
109
+ process.stdin.on("data", (chunk) => input.push(chunk));
110
+ process.stdin.on("end", () => {
111
+ const names = Buffer.concat(input).toString().split("\0").filter((name) => name !== "");
112
+ (async () => { for (const [i, name] of names.entries()) await send(i, name); })()
113
+ .catch((error) => { process.stderr.write(error.message + "\n"); process.exitCode = 1; });
114
+ });
115
+ `;
116
+ const FrameSchema = z.union([
117
+ z.object({ i: z.number().int().nonnegative(), size: z.number().int().nonnegative(), x: z.boolean() }),
118
+ z.object({ i: z.number().int().nonnegative(), skip: z.string() }),
119
+ ]);
120
+ const HEADER_MAX = 64 * 1024;
121
+ const writeAll = async (handle, data) => {
122
+ for (let offset = 0; offset < data.length;) {
123
+ const { bytesWritten } = await handle.write(data, offset);
124
+ offset += bytesWritten;
125
+ }
126
+ };
127
+ export const receiveFiles = async (stdout, paths, staging) => {
128
+ const answers = new Map();
129
+ let pending = Buffer.alloc(0);
130
+ let body;
131
+ const finish = async (file) => {
132
+ await file.handle.close();
133
+ answers.set(paths[file.at] ?? "", { staged: file.staged, size: file.size, hash: file.digest.digest("hex"), executable: file.executable });
134
+ body = undefined;
135
+ };
136
+ const begin = async (line) => {
137
+ const frame = FrameSchema.parse(JSON.parse(line));
138
+ if (frame.i !== answers.size || frame.i >= paths.length) {
139
+ throw new Error("the sandbox answered the fetch out of order");
140
+ }
141
+ if ("skip" in frame) {
142
+ answers.set(paths[frame.i] ?? "", { skipped: frame.skip });
143
+ return;
144
+ }
145
+ const staged = join(staging, String(frame.i));
146
+ const file = { at: frame.i, staged, handle: await open(staged, "wx", 0o600), digest: createHash("sha256"), size: frame.size, executable: frame.x, remaining: frame.size };
147
+ body = file;
148
+ if (file.remaining === 0) {
149
+ await finish(file);
150
+ }
151
+ };
152
+ for await (const chunk of stdout) {
153
+ pending = Buffer.concat([pending, chunk]);
154
+ while (pending.length > 0) {
155
+ if (body !== undefined) {
156
+ const piece = pending.subarray(0, body.remaining);
157
+ await writeAll(body.handle, piece);
158
+ body.digest.update(piece);
159
+ body.remaining -= piece.length;
160
+ pending = pending.subarray(piece.length);
161
+ if (body.remaining === 0) {
162
+ await finish(body);
163
+ }
164
+ continue;
165
+ }
166
+ const newline = pending.indexOf(10);
167
+ if (newline === -1) {
168
+ if (pending.length > HEADER_MAX) {
169
+ throw new Error("the sandbox's answer to the fetch is not one this agent asked for");
170
+ }
171
+ break;
172
+ }
173
+ await begin(pending.subarray(0, newline).toString("utf8"));
174
+ pending = pending.subarray(newline + 1);
175
+ }
176
+ }
177
+ await body?.handle.close();
178
+ return answers;
179
+ };
180
+ const SSH_OPTIONS = ["-o", "BatchMode=yes", "-o", "ConnectTimeout=20", "-o", "ServerAliveInterval=15", "-o", "ServerAliveCountMax=4"];
181
+ const TRANSFER_TIMEOUT_MS = 60 * 60_000;
182
+ const failure = (what, exited) => {
183
+ const said = exited.stderr.trim().split("\n").at(-1) ?? "";
184
+ const why = exited.status === 255 ? "ssh could not reach the sandbox" : exited.status === null ? "it did not finish in time" : `it exited with ${exited.status}`;
185
+ return new Error(`${what} failed: ${why}${said === "" ? "" : ` (${said})`}`);
186
+ };
187
+ export const sandboxCopy = (runner, ssh, alias, remoteDir) => {
188
+ const command = (program, input) => [...SSH_OPTIONS, alias, remoteNodeCommand(program, input)];
189
+ return {
190
+ list: async (ignoreExpressions) => {
191
+ const listed = await collect(runner.spawn(ssh, command(LISTING_PROGRAM, JSON.stringify({ root: remoteDir, ignore: ignoreExpressions })), { timeoutMs: TRANSFER_TIMEOUT_MS }));
192
+ if (listed.status === 3) {
193
+ throw new Error(`the sandbox has no ${remoteDir}: its copy of this folder is gone`);
194
+ }
195
+ if (listed.status !== 0) {
196
+ throw failure(`listing the sandbox's copy (${remoteDir})`, listed);
197
+ }
198
+ return parseListing(listed.stdout.toString("utf8"));
199
+ },
200
+ fetch: async (paths, staging) => {
201
+ if (paths.length === 0) {
202
+ return new Map();
203
+ }
204
+ const spawned = runner.spawn(ssh, command(FETCH_PROGRAM, JSON.stringify({ root: remoteDir })), {
205
+ input: paths.map((path) => `${path}\0`).join(""),
206
+ timeoutMs: TRANSFER_TIMEOUT_MS,
207
+ });
208
+ const answers = await receiveFiles(spawned.stdout, paths, staging);
209
+ const exited = await spawned.exit;
210
+ const stopped = exited.status === 0 ? "the sandbox did not send it" : failure("fetching from the sandbox", exited).message;
211
+ return new Map(paths.map((path) => [path, answers.get(path) ?? { skipped: stopped }]));
212
+ },
213
+ };
214
+ };
215
+ const EntrySchema = z.object({ kind: z.string().optional(), digest: z.string().optional() }).nullable().optional();
216
+ const SessionListSchema = z
217
+ .array(z.object({
218
+ paused: z.boolean().optional(),
219
+ conflicts: z
220
+ .array(z.object({ root: z.string().optional(), alphaChanges: z.array(z.object({ path: z.string().optional(), old: EntrySchema, new: EntrySchema })).nullable().optional() }))
221
+ .nullable()
222
+ .optional(),
223
+ }))
224
+ .nullable();
225
+ const sessionsIn = (listed) => {
226
+ try {
227
+ return SessionListSchema.safeParse(JSON.parse(listed)).data ?? [];
228
+ }
229
+ catch {
230
+ return [];
231
+ }
232
+ };
233
+ const fileDigest = (entry) => (entry?.kind === "file" ? entry.digest : undefined);
234
+ const reportedConflicts = (session) => new Map((session?.conflicts ?? []).flatMap((conflict) => {
235
+ const root = conflict.root ?? "";
236
+ const change = conflict.alphaChanges?.find((candidate) => (candidate.path ?? "") === root);
237
+ return root === "" || change === undefined ? [] : [[root, { agreed: fileDigest(change.old), here: fileDigest(change.new) }]];
238
+ }));
239
+ const SESSION_TIMEOUT_MS = 2 * 60_000;
240
+ const FLUSH_TIMEOUT_MS = 30_000;
241
+ export const mutagenSession = (runner, mutagen, name) => {
242
+ const run = async (args, timeoutMs = SESSION_TIMEOUT_MS) => await collect(runner.spawn(mutagen, ["sync", ...args, name], { timeoutMs }));
243
+ const must = async (verb) => {
244
+ const done = await run([verb]);
245
+ if (done.status !== 0) {
246
+ throw failure(`${verb === "pause" ? "pausing" : "resuming"} the file sync of this folder`, done);
247
+ }
248
+ };
249
+ return {
250
+ inspect: async () => {
251
+ const listed = await run(["list", "--template", "{{json .}}"]);
252
+ const sessions = listed.status === 0 ? sessionsIn(listed.stdout.toString("utf8")) : [];
253
+ const state = sessions.length === 0 ? "absent" : sessions.every((session) => session.paused === true) ? "paused" : "running";
254
+ return { state, conflicts: reportedConflicts(sessions[0]) };
255
+ },
256
+ flush: async () => (await run(["flush"], FLUSH_TIMEOUT_MS)).status === 0,
257
+ pause: async () => await must("pause"),
258
+ resume: async () => await must("resume"),
259
+ };
260
+ };
261
+ //# sourceMappingURL=project-remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-remote.js","sourceRoot":"","sources":["../../src/sync/project-remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type Pairing, type ProjectDirection } from "./config.js";
2
+ import { type ChangeKind } from "./project-files.js";
3
+ import { type Durability } from "./project-local.js";
4
+ import type { SandboxCopy, SessionControl } from "./project-remote.js";
5
+ import { type PointSummary, type Skipped } from "./restore-points.js";
6
+ export type ProjectPairing = Pairing & {
7
+ readonly localDir: string;
8
+ };
9
+ export interface ProjectContext {
10
+ readonly pairing: ProjectPairing;
11
+ readonly stateDir: string;
12
+ readonly sandbox: SandboxCopy;
13
+ readonly session: SessionControl;
14
+ readonly durability?: Durability;
15
+ }
16
+ export interface ListedChange {
17
+ readonly path: string;
18
+ readonly kind: ChangeKind;
19
+ readonly size?: number;
20
+ readonly conflict?: true;
21
+ }
22
+ export interface ChangesResult {
23
+ readonly ok: true;
24
+ readonly pairing: string;
25
+ readonly direction: ProjectDirection;
26
+ readonly changes: readonly ListedChange[];
27
+ readonly truncated?: true;
28
+ }
29
+ export interface Applied {
30
+ readonly path: string;
31
+ readonly kind: ChangeKind;
32
+ }
33
+ export interface BringBackResult {
34
+ readonly ok: true;
35
+ readonly point: string;
36
+ readonly applied: readonly Applied[];
37
+ readonly skipped: readonly Skipped[];
38
+ }
39
+ export interface RestorePointsResult {
40
+ readonly ok: true;
41
+ readonly points: readonly PointSummary[];
42
+ }
43
+ export interface RestoreResult {
44
+ readonly ok: true;
45
+ readonly restored: number;
46
+ readonly skipped: readonly Skipped[];
47
+ }
48
+ export declare const projectChanges: (context: ProjectContext) => Promise<ChangesResult>;
49
+ export declare const bringBack: (context: ProjectContext, paths: readonly string[]) => Promise<BringBackResult>;
50
+ export declare const restorePoints: (context: Pick<ProjectContext, "pairing" | "stateDir">) => Promise<RestorePointsResult>;
51
+ export declare const restorePoint: (context: ProjectContext, id: string) => Promise<RestoreResult>;
52
+ //# sourceMappingURL=project-transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-transfer.d.ts","sourceRoot":"","sources":["../../src/sync/project-transfer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,OAAO,EAAsC,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtG,OAAO,EAEH,KAAK,UAAU,EAQlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEH,KAAK,UAAU,EAWlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAyC,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAIH,KAAK,YAAY,EAOjB,KAAK,OAAO,EAEf,MAAM,qBAAqB,CAAC;AAkB7B,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAEjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAEjC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;CACpC;AAGD,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,OAAO;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAGlB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;CACxC;AAwLD,eAAO,MAAM,cAAc,YAAmB,cAAc,KAAG,OAAO,CAAC,aAAa,CAcnF,CAAC;AAkHF,eAAO,MAAM,SAAS,YAAmB,cAAc,SAAS,SAAS,MAAM,EAAE,KAAG,OAAO,CAAC,eAAe,CAmBrG,CAAC;AAGP,eAAO,MAAM,aAAa,YAAmB,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,UAAU,CAAC,KAAG,OAAO,CAAC,mBAAmB,CAGrH,CAAC;AAIH,eAAO,MAAM,YAAY,YAAmB,cAAc,MAAM,MAAM,KAAG,OAAO,CAAC,aAAa,CAwBxF,CAAC"}
@@ -0,0 +1,278 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, mkdtemp, readdir, rm, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { errorMessage } from "@intentic/base/errors";
5
+ import { claimPidFile, livePidRecord, releasePidFile } from "@intentic/local-agent";
6
+ import { pairingRemoteDir, projectDirection } from "./config.js";
7
+ import { capped, classify, ignoreExpressions, ignoreMatcher, selectChanges, } from "./project-files.js";
8
+ import { assertFolder, hashFile, installFile, listingRecordPath, localFile, localTarget, readListingRecord, realDurability, removeFile, walkLocal, writeListingRecord, } from "./project-local.js";
9
+ import { backUp, createPointDir, listPoints, pruneRestorePoints, readManifest, restoreDir, restoreEntry, sealPoint, writeManifest, } from "./restore-points.js";
10
+ import { ignoresFor } from "./ssh.js";
11
+ const STALE = { current: false, conflicts: new Map() };
12
+ const flushedStanding = async (context) => {
13
+ const flushed = await context.session.flush();
14
+ const after = await context.session.inspect();
15
+ return { current: flushed && after.state === "running", conflicts: after.conflicts };
16
+ };
17
+ const mutagenDigestHere = async (root, path) => {
18
+ try {
19
+ return await hashFile(await localTarget(root, path), "sha1");
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ };
25
+ const unchangedHere = async (root, conflicts, local) => {
26
+ const verdicts = new Map();
27
+ for (const [path, reported] of conflicts) {
28
+ const here = local.get(path);
29
+ if (here === undefined || here === "other") {
30
+ continue;
31
+ }
32
+ const unmoved = reported.agreed !== undefined && reported.agreed === reported.here;
33
+ verdicts.set(path, unmoved && (await mutagenDigestHere(root, path)) === reported.here);
34
+ }
35
+ return verdicts;
36
+ };
37
+ const listSides = async (context, standing, record) => {
38
+ const { pairing, stateDir } = context;
39
+ const patterns = ignoresFor(pairing);
40
+ const remoteDir = pairingRemoteDir(pairing);
41
+ const remote = await context.sandbox.list(ignoreExpressions(patterns));
42
+ const recordPath = listingRecordPath(stateDir, pairing.sandboxId);
43
+ const held = await readListingRecord(recordPath, pairing.localDir, remoteDir);
44
+ const wantsHash = (path, size) => {
45
+ const there = remote.get(path);
46
+ return held.agreed.has(path) || (there !== undefined && there !== "other" && there.size === size);
47
+ };
48
+ const local = await walkLocal({ root: pairing.localDir, ignored: ignoreMatcher(patterns), cached: held.files, wantsHash });
49
+ const evidence = { current: standing.current, unchangedHere: await unchangedHere(pairing.localDir, standing.conflicts, local.listing) };
50
+ const classified = classify(local.listing, remote, held.agreed, evidence);
51
+ if (record) {
52
+ await writeListingRecord(recordPath, pairing.localDir, remoteDir, { files: local.hashes, agreed: classified.agreed });
53
+ }
54
+ return { remote, changes: classified.changes };
55
+ };
56
+ const recordAgreement = async (context, applied) => {
57
+ const { pairing, stateDir } = context;
58
+ const recordPath = listingRecordPath(stateDir, pairing.sandboxId);
59
+ const record = await readListingRecord(recordPath, pairing.localDir, pairingRemoteDir(pairing));
60
+ const agreed = new Map(record.agreed);
61
+ for (const { path, hash } of applied) {
62
+ if (hash === null) {
63
+ agreed.delete(path);
64
+ }
65
+ else {
66
+ agreed.set(path, hash);
67
+ }
68
+ }
69
+ await writeListingRecord(recordPath, pairing.localDir, pairingRemoteDir(pairing), { files: record.files, agreed });
70
+ };
71
+ const lockPath = (context) => join(restoreDir(context.stateDir, context.pairing.sandboxId), ".operation.pid");
72
+ const pausedPath = (context) => join(restoreDir(context.stateDir, context.pairing.sandboxId), ".paused");
73
+ const liftAbandonedPause = async (context, locked) => {
74
+ if (!existsSync(pausedPath(context)) || (!locked && (await livePidRecord(lockPath(context))) !== undefined)) {
75
+ return;
76
+ }
77
+ await context.session.resume();
78
+ await rm(pausedPath(context), { force: true });
79
+ };
80
+ const holdStill = async (context, flush) => {
81
+ if ((await context.session.inspect()).state !== "running") {
82
+ return { standing: STALE, release: undefined };
83
+ }
84
+ const standing = flush ? await flushedStanding(context) : STALE;
85
+ await writeFile(pausedPath(context), `${process.pid}\n`, { mode: 0o600 });
86
+ try {
87
+ await context.session.pause();
88
+ }
89
+ catch (error) {
90
+ await rm(pausedPath(context), { force: true });
91
+ throw error;
92
+ }
93
+ const release = async () => {
94
+ await context.session.resume();
95
+ await rm(pausedPath(context), { force: true });
96
+ };
97
+ return { standing, release };
98
+ };
99
+ const claim = async (context) => {
100
+ const dir = restoreDir(context.stateDir, context.pairing.sandboxId);
101
+ await mkdir(dir, { recursive: true, mode: 0o700 });
102
+ const claimed = await claimPidFile(lockPath(context), dir, { pid: process.pid });
103
+ return claimed.claimed ? { claimed: true } : { claimed: false, holder: claimed.holder.pid };
104
+ };
105
+ const exclusively = async (context, operation) => {
106
+ const claimed = await claim(context);
107
+ if (!claimed.claimed) {
108
+ throw new Error(`another bring-back or restore for ${context.pairing.localDir} is running (pid ${claimed.holder}); try again once it has finished`);
109
+ }
110
+ try {
111
+ await liftAbandonedPause(context, true);
112
+ return await operation();
113
+ }
114
+ finally {
115
+ await releasePidFile(lockPath(context), process.pid);
116
+ }
117
+ };
118
+ const whileHeld = async (context, flush, operation, done) => {
119
+ const held = await holdStill(context, flush);
120
+ let result;
121
+ try {
122
+ result = await operation(held.standing);
123
+ }
124
+ catch (error) {
125
+ await held.release?.().catch(() => undefined);
126
+ throw error;
127
+ }
128
+ try {
129
+ await held.release?.();
130
+ }
131
+ catch (error) {
132
+ throw new Error(`${done(result)}, but this folder's file sync could not be resumed (${errorMessage(error)}). The next bring-back, restore or change listing resumes it, and so does \`intentic-machine sync resume --sandbox ${context.pairing.sandboxId}\`.`, { cause: error });
133
+ }
134
+ return result;
135
+ };
136
+ const listed = (change) => {
137
+ const { held, ...entry } = change;
138
+ return held === undefined ? entry : { ...entry, conflict: true };
139
+ };
140
+ export const projectChanges = async (context) => {
141
+ const { claimed } = await claim(context);
142
+ try {
143
+ await liftAbandonedPause(context, claimed);
144
+ const running = (await context.session.inspect()).state === "running";
145
+ const standing = running ? await flushedStanding(context) : STALE;
146
+ const shown = capped((await listSides(context, standing, claimed)).changes);
147
+ const result = { ok: true, pairing: context.pairing.sandboxId, direction: projectDirection(context.pairing), changes: shown.changes.map(listed) };
148
+ return shown.truncated ? { ...result, truncated: true } : result;
149
+ }
150
+ finally {
151
+ if (claimed) {
152
+ await releasePidFile(lockPath(context), process.pid);
153
+ }
154
+ }
155
+ };
156
+ const readiness = (change, there, got) => {
157
+ if (change.kind === "deleted") {
158
+ return { change, applied: null };
159
+ }
160
+ if (got === undefined || "skipped" in got) {
161
+ return got ?? { skipped: "the sandbox did not send it" };
162
+ }
163
+ if (there === undefined || there === "other" || there.hash !== got.hash || there.size !== got.size) {
164
+ return { skipped: "it changed in the sandbox after it was listed; bring it back again" };
165
+ }
166
+ return { change, fetched: got, applied: got.hash };
167
+ };
168
+ const apply = async (root, ready, entry) => {
169
+ const current = await localFile(root, ready.change.path);
170
+ if ((current?.hash ?? null) !== (entry.backedUp ? entry.backup : null)) {
171
+ throw new Error("it changed here while it was being brought back");
172
+ }
173
+ if (ready.fetched === undefined) {
174
+ await removeFile(root, ready.change.path);
175
+ return;
176
+ }
177
+ const mode = current === undefined ? { executable: ready.fetched.executable } : { exact: current.mode };
178
+ await installFile(root, ready.change.path, ready.fetched.staged, mode);
179
+ };
180
+ const clearStaging = async (dir) => {
181
+ for (const name of (await readdir(dir)).filter((entry) => entry.startsWith(".staging-"))) {
182
+ await rm(join(dir, name), { recursive: true, force: true });
183
+ }
184
+ };
185
+ const readyChanges = async (context, sides, selected, staging, skipped) => {
186
+ const writable = selected.filter((change) => {
187
+ if (change.held !== undefined) {
188
+ skipped.push({ path: change.path, reason: change.held });
189
+ }
190
+ return change.held === undefined;
191
+ });
192
+ const fetched = await context.sandbox.fetch(writable.filter((change) => change.kind !== "deleted").map((change) => change.path), staging);
193
+ const ready = [];
194
+ for (const change of writable) {
195
+ const verdict = readiness(change, sides.remote.get(change.path), fetched.get(change.path));
196
+ if ("skipped" in verdict) {
197
+ skipped.push({ path: change.path, reason: verdict.skipped });
198
+ }
199
+ else {
200
+ ready.push(verdict);
201
+ }
202
+ }
203
+ return ready;
204
+ };
205
+ const bringBackHeld = async (context, paths, standing, staging) => {
206
+ const { pairing, stateDir } = context;
207
+ const durability = context.durability ?? realDurability;
208
+ const sides = await listSides(context, standing, true);
209
+ const { selected, unmatched } = selectChanges(sides.changes, paths);
210
+ const skipped = unmatched.map((path) => ({ path, reason: "the sandbox's copy has no change to bring back there" }));
211
+ const ready = await readyChanges(context, sides, selected, staging, skipped);
212
+ const point = await createPointDir(stateDir, pairing.sandboxId, Date.now());
213
+ const kept = [];
214
+ for (const item of ready) {
215
+ try {
216
+ const request = { path: item.change.path, kind: item.change.kind, applied: item.applied };
217
+ kept.push({ ready: item, entry: await backUp(stateDir, pairing.sandboxId, point.id, pairing.localDir, request, durability) });
218
+ }
219
+ catch (error) {
220
+ skipped.push({ path: item.change.path, reason: errorMessage(error) });
221
+ }
222
+ }
223
+ const manifest = { id: point.id, createdAt: point.createdAt, dir: pairing.localDir, entries: kept.map(({ entry }) => entry) };
224
+ await writeManifest(stateDir, pairing.sandboxId, manifest);
225
+ await sealPoint(stateDir, pairing.sandboxId, point.id, durability);
226
+ const done = [];
227
+ for (const { ready: item, entry } of kept) {
228
+ try {
229
+ await apply(pairing.localDir, item, entry);
230
+ done.push({ entry, kind: item.change.kind });
231
+ }
232
+ catch (error) {
233
+ skipped.push({ path: item.change.path, reason: errorMessage(error) });
234
+ }
235
+ }
236
+ await writeManifest(stateDir, pairing.sandboxId, { ...manifest, entries: done.map(({ entry }) => entry) });
237
+ await recordAgreement(context, done.map(({ entry }) => ({ path: entry.path, hash: entry.applied })));
238
+ return { ok: true, point: point.id, applied: done.map(({ entry, kind }) => ({ path: entry.path, kind })), skipped };
239
+ };
240
+ export const bringBack = async (context, paths) => await exclusively(context, async () => {
241
+ const dir = restoreDir(context.stateDir, context.pairing.sandboxId);
242
+ await clearStaging(dir);
243
+ const result = await whileHeld(context, true, async (standing) => {
244
+ const staging = await mkdtemp(join(dir, ".staging-"));
245
+ try {
246
+ return await bringBackHeld(context, paths, standing, staging);
247
+ }
248
+ finally {
249
+ await rm(staging, { recursive: true, force: true });
250
+ }
251
+ }, (done) => `Brought back ${done.applied.length} file(s), restore point ${done.point}`);
252
+ await pruneRestorePoints(context.stateDir, context.pairing.sandboxId, Date.now(), result.point);
253
+ return result;
254
+ });
255
+ export const restorePoints = async (context) => ({
256
+ ok: true,
257
+ points: await listPoints(context.stateDir, context.pairing.sandboxId, context.pairing.localDir),
258
+ });
259
+ export const restorePoint = async (context, id) => await exclusively(context, async () => {
260
+ const { pairing, stateDir } = context;
261
+ const manifest = await readManifest(stateDir, pairing.sandboxId, id, pairing.localDir);
262
+ await assertFolder(pairing.localDir);
263
+ return await whileHeld(context, false, async () => {
264
+ const skipped = [];
265
+ let restored = 0;
266
+ for (const entry of manifest.entries) {
267
+ try {
268
+ await restoreEntry(stateDir, pairing.sandboxId, id, pairing.localDir, entry);
269
+ restored += 1;
270
+ }
271
+ catch (error) {
272
+ skipped.push({ path: entry.path, reason: errorMessage(error) });
273
+ }
274
+ }
275
+ return { ok: true, restored, skipped };
276
+ }, (done) => `Restored ${done.restored} file(s) from ${id}`);
277
+ });
278
+ //# sourceMappingURL=project-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-transfer.js","sourceRoot":"","sources":["../../src/sync/project-transfer.ts"],"names":[],"mappings":"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"}