@intentic/machine 1.317.0 → 1.319.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 (125) hide show
  1. package/README.md +186 -11
  2. package/dist/commands.d.ts.map +1 -1
  3. package/dist/commands.js +2 -2
  4. package/dist/commands.js.map +1 -1
  5. package/dist/device/commands.d.ts +3 -1
  6. package/dist/device/commands.d.ts.map +1 -1
  7. package/dist/device/commands.js +2 -2
  8. package/dist/device/commands.js.map +1 -1
  9. package/dist/device/connection.d.ts +1 -0
  10. package/dist/device/connection.d.ts.map +1 -1
  11. package/dist/device/connection.js +5 -0
  12. package/dist/device/connection.js.map +1 -1
  13. package/dist/device/grant.d.ts +38 -0
  14. package/dist/device/grant.d.ts.map +1 -1
  15. package/dist/device/loopback-catch.d.ts +3 -0
  16. package/dist/device/loopback-catch.d.ts.map +1 -0
  17. package/dist/device/loopback-catch.js +103 -0
  18. package/dist/device/loopback-catch.js.map +1 -0
  19. package/dist/device/mcp.d.ts.map +1 -1
  20. package/dist/device/mcp.js +8 -1
  21. package/dist/device/mcp.js.map +1 -1
  22. package/dist/device/router.d.ts +38 -0
  23. package/dist/device/router.d.ts.map +1 -1
  24. package/dist/device/router.js +3 -1
  25. package/dist/device/router.js.map +1 -1
  26. package/dist/device/sandbox-cli.d.ts +3 -0
  27. package/dist/device/sandbox-cli.d.ts.map +1 -1
  28. package/dist/device/sandbox-cli.js +42 -0
  29. package/dist/device/sandbox-cli.js.map +1 -1
  30. package/dist/device/sandbox-rounds/ic-rounds.d.ts +3 -4
  31. package/dist/device/sandbox-rounds/ic-rounds.d.ts.map +1 -1
  32. package/dist/device/sandbox-rounds/ic-rounds.js +9 -3
  33. package/dist/device/sandbox-rounds/ic-rounds.js.map +1 -1
  34. package/dist/device/sandbox-rounds/keeper.d.ts +95 -0
  35. package/dist/device/sandbox-rounds/keeper.d.ts.map +1 -0
  36. package/dist/device/sandbox-rounds/keeper.js +277 -0
  37. package/dist/device/sandbox-rounds/keeper.js.map +1 -0
  38. package/dist/device/sandbox-rounds/swap-records.d.ts +1 -0
  39. package/dist/device/sandbox-rounds/swap-records.d.ts.map +1 -1
  40. package/dist/device/sandbox-rounds/swap-records.js +7 -0
  41. package/dist/device/sandbox-rounds/swap-records.js.map +1 -1
  42. package/dist/device/tools/agent.d.ts +2 -2
  43. package/dist/device/tools/agent.d.ts.map +1 -1
  44. package/dist/device/tools/agent.js +1 -3
  45. package/dist/device/tools/agent.js.map +1 -1
  46. package/dist/device/tools/describe.d.ts +1 -1
  47. package/dist/device/tools/describe.d.ts.map +1 -1
  48. package/dist/device/tools/describe.js +2 -1
  49. package/dist/device/tools/describe.js.map +1 -1
  50. package/dist/device/tools/in-flight.d.ts +6 -0
  51. package/dist/device/tools/in-flight.d.ts.map +1 -0
  52. package/dist/device/tools/in-flight.js +26 -0
  53. package/dist/device/tools/in-flight.js.map +1 -0
  54. package/dist/device/tools/sandboxes.d.ts +19 -7
  55. package/dist/device/tools/sandboxes.d.ts.map +1 -1
  56. package/dist/device/tools/sandboxes.js +90 -20
  57. package/dist/device/tools/sandboxes.js.map +1 -1
  58. package/dist/environments/machine.d.ts +1 -0
  59. package/dist/environments/machine.d.ts.map +1 -1
  60. package/dist/environments/machine.js.map +1 -1
  61. package/dist/resident.d.ts +12 -1
  62. package/dist/resident.d.ts.map +1 -1
  63. package/dist/resident.js +45 -14
  64. package/dist/resident.js.map +1 -1
  65. package/dist/status.d.ts.map +1 -1
  66. package/dist/status.js +9 -4
  67. package/dist/status.js.map +1 -1
  68. package/dist/sync/commands.d.ts +21 -1
  69. package/dist/sync/commands.d.ts.map +1 -1
  70. package/dist/sync/commands.js +91 -20
  71. package/dist/sync/commands.js.map +1 -1
  72. package/dist/sync/config.d.ts +10 -1
  73. package/dist/sync/config.d.ts.map +1 -1
  74. package/dist/sync/config.js +42 -1
  75. package/dist/sync/config.js.map +1 -1
  76. package/dist/sync/folders.d.ts +8 -0
  77. package/dist/sync/folders.d.ts.map +1 -0
  78. package/dist/sync/folders.js +34 -0
  79. package/dist/sync/folders.js.map +1 -0
  80. package/dist/sync/git-bridge.d.ts +1 -1
  81. package/dist/sync/git-bridge.d.ts.map +1 -1
  82. package/dist/sync/git-bridge.js +2 -1
  83. package/dist/sync/git-bridge.js.map +1 -1
  84. package/dist/sync/mirror.d.ts.map +1 -1
  85. package/dist/sync/mirror.js +3 -3
  86. package/dist/sync/mirror.js.map +1 -1
  87. package/dist/sync/mutagen.d.ts +16 -3
  88. package/dist/sync/mutagen.d.ts.map +1 -1
  89. package/dist/sync/mutagen.js +40 -22
  90. package/dist/sync/mutagen.js.map +1 -1
  91. package/dist/sync/project-commands.d.ts +23 -0
  92. package/dist/sync/project-commands.d.ts.map +1 -0
  93. package/dist/sync/project-commands.js +212 -0
  94. package/dist/sync/project-commands.js.map +1 -0
  95. package/dist/sync/project-files.d.ts +42 -0
  96. package/dist/sync/project-files.d.ts.map +1 -0
  97. package/dist/sync/project-files.js +110 -0
  98. package/dist/sync/project-files.js.map +1 -0
  99. package/dist/sync/project-local.d.ts +46 -0
  100. package/dist/sync/project-local.d.ts.map +1 -0
  101. package/dist/sync/project-local.js +217 -0
  102. package/dist/sync/project-local.js.map +1 -0
  103. package/dist/sync/project-remote.d.ts +55 -0
  104. package/dist/sync/project-remote.d.ts.map +1 -0
  105. package/dist/sync/project-remote.js +261 -0
  106. package/dist/sync/project-remote.js.map +1 -0
  107. package/dist/sync/project-transfer.d.ts +52 -0
  108. package/dist/sync/project-transfer.d.ts.map +1 -0
  109. package/dist/sync/project-transfer.js +278 -0
  110. package/dist/sync/project-transfer.js.map +1 -0
  111. package/dist/sync/report.d.ts.map +1 -1
  112. package/dist/sync/report.js +6 -4
  113. package/dist/sync/report.js.map +1 -1
  114. package/dist/sync/residue.d.ts.map +1 -1
  115. package/dist/sync/residue.js +2 -1
  116. package/dist/sync/residue.js.map +1 -1
  117. package/dist/sync/restore-points.d.ts +72 -0
  118. package/dist/sync/restore-points.d.ts.map +1 -0
  119. package/dist/sync/restore-points.js +154 -0
  120. package/dist/sync/restore-points.js.map +1 -0
  121. package/dist/sync/ssh.d.ts +3 -0
  122. package/dist/sync/ssh.d.ts.map +1 -1
  123. package/dist/sync/ssh.js +13 -4
  124. package/dist/sync/ssh.js.map +1 -1
  125. package/package.json +8 -8
@@ -0,0 +1,217 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createReadStream } from "node:fs";
3
+ import { chmod, lstat, mkdir, open, readdir, readFile, rename, rm, rmdir, stat } from "node:fs/promises";
4
+ import { basename, dirname, join } from "node:path";
5
+ import { pipeline } from "node:stream/promises";
6
+ import { setTimeout as sleep } from "node:timers/promises";
7
+ import { errnoCode, undefinedIfMissing } from "@intentic/base/errors";
8
+ import { writeFileAtomic } from "@intentic/base/fs";
9
+ import { z } from "zod";
10
+ import { isPortablePath } from "./project-files.js";
11
+ export const hashFile = async (path, algorithm = "sha256") => {
12
+ const digest = createHash(algorithm);
13
+ for await (const chunk of createReadStream(path)) {
14
+ digest.update(chunk);
15
+ }
16
+ return digest.digest("hex");
17
+ };
18
+ const flushed = async (path, flags) => {
19
+ const handle = await open(path, flags);
20
+ try {
21
+ await handle.sync();
22
+ }
23
+ finally {
24
+ await handle.close();
25
+ }
26
+ };
27
+ export const realDurability = {
28
+ file: async (path) => await flushed(path, "r+"),
29
+ folder: async (path) => {
30
+ if (process.platform !== "win32") {
31
+ await flushed(path, "r");
32
+ }
33
+ },
34
+ };
35
+ const RecordSchema = z.object({
36
+ localDir: z.string(),
37
+ remoteDir: z.string(),
38
+ files: z.record(z.string(), z.tuple([z.number(), z.number(), z.number(), z.string()])),
39
+ agreed: z.record(z.string(), z.string()),
40
+ });
41
+ export const listingRecordPath = (stateDir, sandboxId) => join(stateDir, "hashes", `${encodeURIComponent(sandboxId)}.json`);
42
+ export const readListingRecord = async (path, localDir, remoteDir) => {
43
+ const raw = await readFile(path, "utf8").catch(undefinedIfMissing);
44
+ const parsed = raw === undefined ? undefined : parseRecord(raw);
45
+ if (parsed === undefined || parsed.localDir !== localDir || parsed.remoteDir !== remoteDir) {
46
+ return { files: new Map(), agreed: new Map() };
47
+ }
48
+ const files = Object.entries(parsed.files).map(([file, [size, mtimeMs, ctimeMs, hash]]) => [file, { size, mtimeMs, ctimeMs, hash }]);
49
+ return { files: new Map(files), agreed: new Map(Object.entries(parsed.agreed)) };
50
+ };
51
+ const parseRecord = (raw) => {
52
+ try {
53
+ return RecordSchema.safeParse(JSON.parse(raw)).data;
54
+ }
55
+ catch {
56
+ return undefined;
57
+ }
58
+ };
59
+ export const writeListingRecord = async (path, localDir, remoteDir, record) => {
60
+ const files = Object.fromEntries([...record.files].map(([file, held]) => [file, [held.size, held.mtimeMs, held.ctimeMs, held.hash]]));
61
+ await writeFileAtomic(path, JSON.stringify({ localDir, remoteDir, files, agreed: Object.fromEntries(record.agreed) }), 0o600);
62
+ };
63
+ export const assertFolder = async (root) => {
64
+ const info = await stat(root).catch(undefinedIfMissing);
65
+ if (info?.isDirectory() !== true) {
66
+ throw new Error(`${root} is not there (moved, deleted, or on a disk that is not connected)`);
67
+ }
68
+ };
69
+ export const walkLocal = async (walk) => {
70
+ await assertFolder(walk.root);
71
+ const listing = new Map();
72
+ const hashes = new Map();
73
+ const hashOf = async (path, info) => {
74
+ const held = walk.cached.get(path);
75
+ if (held !== undefined && held.size === info.size && held.mtimeMs === info.mtimeMs && held.ctimeMs === info.ctimeMs) {
76
+ return held.hash;
77
+ }
78
+ return walk.wantsHash(path, info.size)
79
+ ? await hashFile(join(walk.root, path)).then((hash) => hash, () => null)
80
+ : undefined;
81
+ };
82
+ const entryOf = async (path, isFile) => {
83
+ const info = isFile ? await lstat(join(walk.root, path)).catch(undefinedIfMissing) : undefined;
84
+ if (info === undefined) {
85
+ return isFile ? undefined : "other";
86
+ }
87
+ const hash = info.isFile() ? await hashOf(path, info) : null;
88
+ if (hash === null) {
89
+ return "other";
90
+ }
91
+ if (hash !== undefined) {
92
+ hashes.set(path, { size: info.size, mtimeMs: info.mtimeMs, ctimeMs: info.ctimeMs, hash });
93
+ }
94
+ return { size: info.size, hash };
95
+ };
96
+ const visit = async (relative) => {
97
+ const entries = (await readdir(join(walk.root, relative), { withFileTypes: true }).catch(undefinedIfMissing)) ?? [];
98
+ for (const entry of entries) {
99
+ const path = relative === "" ? entry.name : `${relative}/${entry.name}`;
100
+ if (!isPortablePath(path) || walk.ignored(path)) {
101
+ continue;
102
+ }
103
+ if (entry.isDirectory()) {
104
+ await visit(path);
105
+ continue;
106
+ }
107
+ const listed = await entryOf(path, entry.isFile());
108
+ if (listed !== undefined) {
109
+ listing.set(path, listed);
110
+ }
111
+ }
112
+ };
113
+ await visit("");
114
+ return { listing, hashes };
115
+ };
116
+ export const localTarget = async (root, path) => {
117
+ if (!isPortablePath(path)) {
118
+ throw new Error(`${JSON.stringify(path)} is not a path inside the folder`);
119
+ }
120
+ const parts = path.split("/");
121
+ let target = root;
122
+ for (const [at, part] of parts.entries()) {
123
+ target = join(target, part);
124
+ const info = await lstat(target).catch(undefinedIfMissing);
125
+ if (info === undefined) {
126
+ break;
127
+ }
128
+ const last = at === parts.length - 1;
129
+ if (info.isSymbolicLink() || (last ? !info.isFile() : !info.isDirectory())) {
130
+ throw new Error(last ? "something other than a regular file is here" : `${parts.slice(0, at + 1).join("/")} is not a plain folder here`);
131
+ }
132
+ }
133
+ return join(root, ...parts);
134
+ };
135
+ export const localFile = async (root, path) => {
136
+ const target = await localTarget(root, path);
137
+ const info = await lstat(target).catch(undefinedIfMissing);
138
+ return info === undefined ? undefined : { size: info.size, hash: await hashFile(target), mode: info.mode & 0o7777 };
139
+ };
140
+ const TRANSIENT_RENAME = new Set(["EPERM", "EACCES", "EBUSY"]);
141
+ const renameInto = async (from, to) => {
142
+ for (let attempt = 1;; attempt += 1) {
143
+ try {
144
+ await rename(from, to);
145
+ return;
146
+ }
147
+ catch (error) {
148
+ if (process.platform !== "win32" || attempt >= 10 || !TRANSIENT_RENAME.has(errnoCode(error) ?? "")) {
149
+ throw error;
150
+ }
151
+ await sleep(50);
152
+ }
153
+ }
154
+ };
155
+ let installs = 0;
156
+ export const installFile = async (root, path, source, mode) => {
157
+ const target = await localTarget(root, path);
158
+ await mkdirPlain(root, dirname(path));
159
+ installs += 1;
160
+ const temporary = join(dirname(target), `.${basename(target)}.intentic-${process.pid}-${installs}.tmp`);
161
+ try {
162
+ const handle = await open(temporary, "wx", "exact" in mode || !mode.executable ? 0o666 : 0o777);
163
+ try {
164
+ await pipeline(createReadStream(source), handle.createWriteStream());
165
+ }
166
+ finally {
167
+ await handle.close().catch(() => undefined);
168
+ }
169
+ if ("exact" in mode) {
170
+ await chmod(temporary, mode.exact);
171
+ }
172
+ await realDurability.file(temporary);
173
+ await localTarget(root, path);
174
+ await renameInto(temporary, target);
175
+ }
176
+ finally {
177
+ await rm(temporary, { force: true });
178
+ }
179
+ };
180
+ const mkdirPlain = async (root, relative) => {
181
+ if (relative === "." || relative === "") {
182
+ return;
183
+ }
184
+ let at = root;
185
+ for (const part of relative.split("/")) {
186
+ at = join(at, part);
187
+ const info = await lstat(at).catch(undefinedIfMissing);
188
+ if (info === undefined) {
189
+ await mkdirOne(at);
190
+ }
191
+ else if (info.isSymbolicLink() || !info.isDirectory()) {
192
+ throw new Error(`${relative} is not a plain folder here`);
193
+ }
194
+ }
195
+ };
196
+ const mkdirOne = async (path) => {
197
+ try {
198
+ await mkdir(path);
199
+ }
200
+ catch (error) {
201
+ if (errnoCode(error) !== "EEXIST") {
202
+ throw error;
203
+ }
204
+ }
205
+ };
206
+ export const removeFile = async (root, path) => {
207
+ await rm(await localTarget(root, path));
208
+ const parts = path.split("/").slice(0, -1);
209
+ while (parts.length > 0) {
210
+ const emptied = await rmdir(join(root, ...parts)).then(() => true, () => false);
211
+ if (!emptied) {
212
+ return;
213
+ }
214
+ parts.pop();
215
+ }
216
+ };
217
+ //# sourceMappingURL=project-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-local.js","sourceRoot":"","sources":["../../src/sync/project-local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { type Listing } from "./project-files.js";
2
+ export interface Exited {
3
+ readonly status: number | null;
4
+ readonly stderr: string;
5
+ }
6
+ export interface Spawned {
7
+ readonly stdout: AsyncIterable<Buffer>;
8
+ readonly exit: Promise<Exited>;
9
+ }
10
+ export interface SpawnOptions {
11
+ readonly input?: string;
12
+ readonly timeoutMs: number;
13
+ }
14
+ export interface ProjectRunner {
15
+ readonly spawn: (command: string, args: readonly string[], options: SpawnOptions) => Spawned;
16
+ }
17
+ export declare const realProjectRunner: ProjectRunner;
18
+ export interface Collected extends Exited {
19
+ readonly stdout: Buffer;
20
+ }
21
+ export declare const collect: (spawned: Spawned) => Promise<Collected>;
22
+ export declare const remoteNodeCommand: (program: string, input: string) => string;
23
+ export declare const LISTING_PROGRAM: string;
24
+ export declare const FETCH_PROGRAM: string;
25
+ export interface Fetched {
26
+ readonly staged: string;
27
+ readonly size: number;
28
+ readonly hash: string;
29
+ readonly executable: boolean;
30
+ }
31
+ export interface NotFetched {
32
+ readonly skipped: string;
33
+ }
34
+ export declare const receiveFiles: (stdout: AsyncIterable<Buffer>, paths: readonly string[], staging: string) => Promise<Map<string, Fetched | NotFetched>>;
35
+ export interface SandboxCopy {
36
+ readonly list: (ignoreExpressions: readonly string[]) => Promise<Listing>;
37
+ readonly fetch: (paths: readonly string[], staging: string) => Promise<ReadonlyMap<string, Fetched | NotFetched>>;
38
+ }
39
+ export declare const sandboxCopy: (runner: ProjectRunner, ssh: string, alias: string, remoteDir: string) => SandboxCopy;
40
+ export interface ReportedConflict {
41
+ readonly agreed?: string | undefined;
42
+ readonly here?: string | undefined;
43
+ }
44
+ export interface SessionView {
45
+ readonly state: "absent" | "paused" | "running";
46
+ readonly conflicts: ReadonlyMap<string, ReportedConflict>;
47
+ }
48
+ export interface SessionControl {
49
+ readonly inspect: () => Promise<SessionView>;
50
+ readonly flush: () => Promise<boolean>;
51
+ readonly pause: () => Promise<void>;
52
+ readonly resume: () => Promise<void>;
53
+ }
54
+ export declare const mutagenSession: (runner: ProjectRunner, mutagen: string, name: string) => SessionControl;
55
+ //# sourceMappingURL=project-remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-remote.d.ts","sourceRoot":"","sources":["../../src/sync/project-remote.ts"],"names":[],"mappings":"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"}
@@ -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"}