@intentic/machine 1.317.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 (90) hide show
  1. package/README.md +134 -7
  2. package/dist/device/grant.d.ts +38 -0
  3. package/dist/device/grant.d.ts.map +1 -1
  4. package/dist/device/loopback-catch.d.ts +3 -0
  5. package/dist/device/loopback-catch.d.ts.map +1 -0
  6. package/dist/device/loopback-catch.js +103 -0
  7. package/dist/device/loopback-catch.js.map +1 -0
  8. package/dist/device/router.d.ts +38 -0
  9. package/dist/device/router.d.ts.map +1 -1
  10. package/dist/device/router.js +3 -1
  11. package/dist/device/router.js.map +1 -1
  12. package/dist/device/sandbox-rounds/ic-rounds.js +3 -3
  13. package/dist/device/sandbox-rounds/ic-rounds.js.map +1 -1
  14. package/dist/device/tools/agent.d.ts +2 -2
  15. package/dist/device/tools/agent.d.ts.map +1 -1
  16. package/dist/device/tools/agent.js +1 -3
  17. package/dist/device/tools/agent.js.map +1 -1
  18. package/dist/device/tools/describe.d.ts +1 -1
  19. package/dist/device/tools/describe.d.ts.map +1 -1
  20. package/dist/device/tools/describe.js +2 -1
  21. package/dist/device/tools/describe.js.map +1 -1
  22. package/dist/device/tools/in-flight.d.ts +6 -0
  23. package/dist/device/tools/in-flight.d.ts.map +1 -0
  24. package/dist/device/tools/in-flight.js +26 -0
  25. package/dist/device/tools/in-flight.js.map +1 -0
  26. package/dist/device/tools/sandboxes.d.ts +6 -2
  27. package/dist/device/tools/sandboxes.d.ts.map +1 -1
  28. package/dist/device/tools/sandboxes.js +26 -13
  29. package/dist/device/tools/sandboxes.js.map +1 -1
  30. package/dist/status.d.ts.map +1 -1
  31. package/dist/status.js +9 -4
  32. package/dist/status.js.map +1 -1
  33. package/dist/sync/commands.d.ts +18 -0
  34. package/dist/sync/commands.d.ts.map +1 -1
  35. package/dist/sync/commands.js +88 -17
  36. package/dist/sync/commands.js.map +1 -1
  37. package/dist/sync/config.d.ts +10 -1
  38. package/dist/sync/config.d.ts.map +1 -1
  39. package/dist/sync/config.js +42 -1
  40. package/dist/sync/config.js.map +1 -1
  41. package/dist/sync/folders.d.ts +8 -0
  42. package/dist/sync/folders.d.ts.map +1 -0
  43. package/dist/sync/folders.js +34 -0
  44. package/dist/sync/folders.js.map +1 -0
  45. package/dist/sync/git-bridge.d.ts +1 -1
  46. package/dist/sync/git-bridge.d.ts.map +1 -1
  47. package/dist/sync/git-bridge.js +2 -1
  48. package/dist/sync/git-bridge.js.map +1 -1
  49. package/dist/sync/mirror.d.ts.map +1 -1
  50. package/dist/sync/mirror.js +3 -3
  51. package/dist/sync/mirror.js.map +1 -1
  52. package/dist/sync/mutagen.d.ts +16 -3
  53. package/dist/sync/mutagen.d.ts.map +1 -1
  54. package/dist/sync/mutagen.js +40 -22
  55. package/dist/sync/mutagen.js.map +1 -1
  56. package/dist/sync/project-commands.d.ts +23 -0
  57. package/dist/sync/project-commands.d.ts.map +1 -0
  58. package/dist/sync/project-commands.js +212 -0
  59. package/dist/sync/project-commands.js.map +1 -0
  60. package/dist/sync/project-files.d.ts +42 -0
  61. package/dist/sync/project-files.d.ts.map +1 -0
  62. package/dist/sync/project-files.js +110 -0
  63. package/dist/sync/project-files.js.map +1 -0
  64. package/dist/sync/project-local.d.ts +46 -0
  65. package/dist/sync/project-local.d.ts.map +1 -0
  66. package/dist/sync/project-local.js +217 -0
  67. package/dist/sync/project-local.js.map +1 -0
  68. package/dist/sync/project-remote.d.ts +55 -0
  69. package/dist/sync/project-remote.d.ts.map +1 -0
  70. package/dist/sync/project-remote.js +261 -0
  71. package/dist/sync/project-remote.js.map +1 -0
  72. package/dist/sync/project-transfer.d.ts +52 -0
  73. package/dist/sync/project-transfer.d.ts.map +1 -0
  74. package/dist/sync/project-transfer.js +278 -0
  75. package/dist/sync/project-transfer.js.map +1 -0
  76. package/dist/sync/report.d.ts.map +1 -1
  77. package/dist/sync/report.js +6 -4
  78. package/dist/sync/report.js.map +1 -1
  79. package/dist/sync/residue.d.ts.map +1 -1
  80. package/dist/sync/residue.js +2 -1
  81. package/dist/sync/residue.js.map +1 -1
  82. package/dist/sync/restore-points.d.ts +72 -0
  83. package/dist/sync/restore-points.d.ts.map +1 -0
  84. package/dist/sync/restore-points.js +154 -0
  85. package/dist/sync/restore-points.js.map +1 -0
  86. package/dist/sync/ssh.d.ts +3 -0
  87. package/dist/sync/ssh.d.ts.map +1 -1
  88. package/dist/sync/ssh.js +13 -4
  89. package/dist/sync/ssh.js.map +1 -1
  90. package/package.json +8 -8
@@ -0,0 +1,212 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { errorMessage } from "@intentic/base/errors";
3
+ import { buildCommand } from "@stricli/core";
4
+ import { z } from "zod";
5
+ import { baseDir } from "../config.js";
6
+ import { readResidentPid } from "../resident.js";
7
+ import { isProjectPairing, pairingRemoteDir, readState, setProjectDirection } from "./config.js";
8
+ import { canonicalFolder, foldersOverlap, sameFolder } from "./folders.js";
9
+ import { ensureMutagen, sessionName } from "./mutagen.js";
10
+ import { mutagenSession, realProjectRunner, sandboxCopy } from "./project-remote.js";
11
+ import { bringBack, projectChanges, restorePoint, restorePoints, } from "./project-transfer.js";
12
+ import { mutagenSshPath, sshAlias } from "./ssh.js";
13
+ export const projectPairingFor = async (pairings, dir, platform = process.platform) => {
14
+ const wanted = await canonicalFolder(dir);
15
+ const held = await Promise.all(pairings.flatMap((pairing) => (pairing.localDir === undefined ? [] : [{ ...pairing, localDir: pairing.localDir }])).map(async (pairing) => ({ pairing, folder: await canonicalFolder(pairing.localDir) })));
16
+ const same = held.filter(({ folder }) => sameFolder(wanted, folder, platform));
17
+ const project = same.find(({ pairing }) => isProjectPairing(pairing));
18
+ if (project !== undefined) {
19
+ return project.pairing;
20
+ }
21
+ if (same[0] !== undefined) {
22
+ throw new Error(`${dir} syncs with ${same[0].pairing.sandboxId} as its whole workspace, not as a project: only a project's changes are brought back`);
23
+ }
24
+ const holder = held.find(({ pairing, folder }) => isProjectPairing(pairing) && foldersOverlap(wanted, folder, platform));
25
+ throw new Error(holder === undefined ? `no project on this machine syncs ${dir}` : `${dir} is inside the project folder ${holder.pairing.localDir}: pass that folder`);
26
+ };
27
+ const sentence = (message) => {
28
+ const text = message.trim();
29
+ return `${text.charAt(0).toUpperCase()}${text.slice(1)}${/[.!?]$/.test(text) ? "" : "."}`;
30
+ };
31
+ const answer = async (cli, json, work, human) => {
32
+ try {
33
+ const result = await work();
34
+ cli.process.stdout.write(`${json ? JSON.stringify(result) : human(result)}\n`);
35
+ }
36
+ catch (error) {
37
+ const said = sentence(errorMessage(error));
38
+ if (json) {
39
+ cli.process.stdout.write(`${JSON.stringify({ ok: false, error: said })}\n`);
40
+ }
41
+ else {
42
+ cli.process.stderr.write(`${said}\n`);
43
+ }
44
+ process.exitCode = 1;
45
+ }
46
+ };
47
+ const pairingAt = async (dir) => {
48
+ if (dir === undefined || dir.trim() === "") {
49
+ throw new Error("pass --dir with the project's folder on this machine");
50
+ }
51
+ return await projectPairingFor((await readState()).pairings, dir);
52
+ };
53
+ const contextFor = async (pairing) => ({
54
+ pairing,
55
+ stateDir: baseDir,
56
+ sandbox: sandboxCopy(realProjectRunner, mutagenSshPath(process.platform, process.env["MUTAGEN_SSH_PATH"]), sshAlias(pairing.sandboxId), pairingRemoteDir(pairing)),
57
+ session: mutagenSession(realProjectRunner, await ensureMutagen(), sessionName(pairing.sandboxId)),
58
+ });
59
+ const shown = (path) => (/[\u0000-\u001F\u007F]/.test(path) ? JSON.stringify(path) : path);
60
+ const skippedLines = (skipped) => skipped.map((entry) => ` not brought back: ${shown(entry.path)} (${entry.reason})`);
61
+ const changeLine = (change) => ` ${change.kind.padEnd(8)} ${shown(change.path)}${change.size === undefined ? "" : ` (${change.size} bytes)`}${change.conflict === true ? " CONFLICT: bring-back leaves this folder's copy as it is" : ""}`;
62
+ const projectFlags = {
63
+ dir: { kind: "parsed", parse: String, optional: true, brief: "The project's folder on this machine" },
64
+ json: { kind: "boolean", brief: "Print one JSON object, `ok` first (what the desktop app reads)" },
65
+ };
66
+ const changes = buildCommand({
67
+ docs: { brief: "List what an agent changed in a copy-first project's sandbox copy, compared with the folder here" },
68
+ parameters: { flags: projectFlags },
69
+ async func(flags) {
70
+ let dir = "";
71
+ await answer(this, flags.json, async () => {
72
+ const pairing = await pairingAt(flags.dir);
73
+ dir = pairing.localDir;
74
+ return await projectChanges(await contextFor(pairing));
75
+ }, (result) => result.changes.length === 0
76
+ ? `The sandbox's copy of ${dir} has nothing to bring back.`
77
+ : [
78
+ `The sandbox's copy of ${dir} holds ${result.changes.length}${result.truncated === true ? "+" : ""} change(s) this folder does not (${result.direction}):`,
79
+ ...result.changes.map(changeLine),
80
+ ...(result.truncated === true ? [` … and more: only the first ${result.changes.length} are listed.`] : []),
81
+ `Bring them back with \`intentic-machine sync bring-back --dir ${JSON.stringify(dir)}\`, which keeps a restore point first.`,
82
+ ].join("\n"));
83
+ },
84
+ });
85
+ const PathsFileSchema = z.array(z.string().min(1));
86
+ export const pathsFromFile = async (file) => {
87
+ let raw;
88
+ try {
89
+ raw = await readFile(file, "utf8");
90
+ }
91
+ catch (error) {
92
+ throw new Error(`the paths file ${file} could not be read (${errorMessage(error)})`, { cause: error });
93
+ }
94
+ let listed;
95
+ try {
96
+ listed = PathsFileSchema.safeParse(JSON.parse(raw.replace(/^\uFEFF/, ""))).data;
97
+ }
98
+ catch {
99
+ listed = undefined;
100
+ }
101
+ if (listed === undefined) {
102
+ throw new Error(`the paths file ${file} is not a JSON array of relative paths`);
103
+ }
104
+ if (listed.length === 0) {
105
+ throw new Error(`the paths file ${file} lists no paths: leave it out to bring every change back`);
106
+ }
107
+ return listed;
108
+ };
109
+ export const requestedPaths = async (flags) => {
110
+ const fromFile = flags.pathsFile === undefined ? [] : await pathsFromFile(flags.pathsFile);
111
+ return [...new Set([...(flags.path ?? []), ...fromFile])];
112
+ };
113
+ const bringBackCommand = buildCommand({
114
+ docs: { brief: "Bring a copy-first project's changes from its sandbox into the folder here, keeping a restore point first" },
115
+ parameters: {
116
+ flags: {
117
+ ...projectFlags,
118
+ path: {
119
+ kind: "parsed",
120
+ parse: String,
121
+ variadic: true,
122
+ optional: true,
123
+ brief: "Only this path, relative to the folder, or everything under it (repeatable). Default: every change",
124
+ },
125
+ pathsFile: {
126
+ kind: "parsed",
127
+ parse: String,
128
+ optional: true,
129
+ brief: "A UTF-8 file holding a JSON array of such paths, taken together with any --path",
130
+ },
131
+ },
132
+ },
133
+ async func(flags) {
134
+ let dir = "";
135
+ await answer(this, flags.json, async () => {
136
+ const pairing = await pairingAt(flags.dir);
137
+ dir = pairing.localDir;
138
+ const paths = await requestedPaths(flags);
139
+ return await bringBack(await contextFor(pairing), paths);
140
+ }, (result) => [
141
+ result.applied.length === 0
142
+ ? `Nothing was brought back into ${dir}.`
143
+ : `Brought ${result.applied.length} change(s) back into ${dir}. Restore point ${result.point} holds what they replaced: \`intentic-machine sync restore --dir ${JSON.stringify(dir)} --point ${result.point}\` puts it back.`,
144
+ ...skippedLines(result.skipped),
145
+ ].join("\n"));
146
+ },
147
+ });
148
+ const restorePointsCommand = buildCommand({
149
+ docs: { brief: "List a copy-first project's restore points, newest first" },
150
+ parameters: { flags: projectFlags },
151
+ async func(flags) {
152
+ let dir = "";
153
+ await answer(this, flags.json, async () => {
154
+ const pairing = await pairingAt(flags.dir);
155
+ dir = pairing.localDir;
156
+ return await restorePoints({ pairing, stateDir: baseDir });
157
+ }, (result) => result.points.length === 0
158
+ ? `No restore points for ${dir}: one is kept at each bring-back.`
159
+ : [`Restore points for ${dir}, newest first:`, ...result.points.map((point) => ` ${point.id} ${point.createdAt} ${point.entries} file(s)`)].join("\n"));
160
+ },
161
+ });
162
+ const restoreCommand = buildCommand({
163
+ docs: { brief: "Undo a bring-back: put back what it replaced and remove what it added, where nothing changed since" },
164
+ parameters: { flags: { ...projectFlags, point: { kind: "parsed", parse: String, optional: true, brief: "The restore point's id (`sync restore-points` lists them)" } } },
165
+ async func(flags) {
166
+ await answer(this, flags.json, async () => {
167
+ if (flags.point === undefined || flags.point.trim() === "") {
168
+ throw new Error("pass --point with a restore point's id (`intentic-machine sync restore-points` lists them)");
169
+ }
170
+ const point = flags.point.trim();
171
+ return await restorePoint(await contextFor(await pairingAt(flags.dir)), point);
172
+ }, (result) => [`Restored ${result.restored} file(s).`, ...result.skipped.map((entry) => ` not restored: ${shown(entry.path)} (${entry.reason})`)].join("\n"));
173
+ },
174
+ });
175
+ const DIRECTIONS = ["to-sandbox", "both"];
176
+ const directionCommand = buildCommand({
177
+ docs: { brief: "Make a project copy-first (to-sandbox, the default) or sync it both ways (both)" },
178
+ parameters: {
179
+ flags: projectFlags,
180
+ positional: { kind: "tuple", parameters: [{ brief: "to-sandbox or both", parse: String, optional: true, placeholder: "direction" }] },
181
+ },
182
+ async func(flags, value) {
183
+ let dir = "";
184
+ let running = true;
185
+ await answer(this, flags.json, async () => {
186
+ const direction = DIRECTIONS.find((known) => known === value);
187
+ if (direction === undefined) {
188
+ throw new Error(`say which way: \`to-sandbox\` (copy-first) or \`both\`${value === undefined ? "" : `, not ${JSON.stringify(value)}`}`);
189
+ }
190
+ const pairing = await pairingAt(flags.dir);
191
+ dir = pairing.localDir;
192
+ await setProjectDirection(pairing.sandboxId, direction);
193
+ running = (await readResidentPid()) !== undefined;
194
+ return { ok: true, direction };
195
+ }, (result) => [
196
+ result.direction === "both"
197
+ ? `${dir} now syncs both ways: what an agent changes in the sandbox comes straight back here, deletions included. A file both sides changed is held as a conflict rather than overwritten.`
198
+ : `${dir} is copy-first: it flows into the sandbox, and what an agent changes there comes back only when you bring it back.`,
199
+ running
200
+ ? "This machine's agent switches its file sync over within a few seconds."
201
+ : "This machine's agent is not running, so the switch applies when it next starts (`intentic-machine run`).",
202
+ ].join("\n"));
203
+ },
204
+ });
205
+ export const projectCommands = {
206
+ changes,
207
+ "bring-back": bringBackCommand,
208
+ "restore-points": restorePointsCommand,
209
+ restore: restoreCommand,
210
+ direction: directionCommand,
211
+ };
212
+ //# sourceMappingURL=project-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-commands.js","sourceRoot":"","sources":["../../src/sync/project-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface FileStamp {
2
+ readonly size: number;
3
+ readonly hash?: string | undefined;
4
+ }
5
+ export type Listed = FileStamp | "other";
6
+ export type Listing = ReadonlyMap<string, Listed>;
7
+ export type ChangeKind = "added" | "modified" | "deleted";
8
+ export interface ProjectChange {
9
+ readonly path: string;
10
+ readonly kind: ChangeKind;
11
+ readonly size?: number;
12
+ readonly held?: string;
13
+ }
14
+ export declare const CHANGES_MAX = 5000;
15
+ export declare const ignoreExpression: (pattern: string) => string;
16
+ export declare const ignoreExpressions: (patterns: readonly string[]) => string[];
17
+ export declare const ignoreMatcher: (patterns: readonly string[]) => ((path: string) => boolean);
18
+ export declare const isPortablePath: (path: string) => boolean;
19
+ export declare const parseListing: (raw: string) => Map<string, Listed>;
20
+ export interface Evidence {
21
+ readonly current: boolean;
22
+ readonly unchangedHere: ReadonlyMap<string, boolean>;
23
+ }
24
+ export declare const HELD_NOT_RUNNING = "the sync was not running, so whether this folder's copy changed too cannot be told; it is left as it is";
25
+ export declare const HELD_CHANGED_HERE = "it changed here too since the two copies last agreed; this folder's copy is left as it is";
26
+ export declare const HELD_UNKNOWN = "no listing has seen the two copies agree on it, so whether it changed here too is not known; this folder's copy is left as it is";
27
+ export interface Classified {
28
+ readonly changes: readonly ProjectChange[];
29
+ readonly agreed: ReadonlyMap<string, string>;
30
+ }
31
+ export declare const classify: (local: Listing, remote: Listing, agreed: ReadonlyMap<string, string>, evidence: Evidence) => Classified;
32
+ export interface CappedChanges {
33
+ readonly changes: readonly ProjectChange[];
34
+ readonly truncated: boolean;
35
+ }
36
+ export declare const capped: (changes: readonly ProjectChange[]) => CappedChanges;
37
+ export interface Selection {
38
+ readonly selected: readonly ProjectChange[];
39
+ readonly unmatched: readonly string[];
40
+ }
41
+ export declare const selectChanges: (changes: readonly ProjectChange[], paths: readonly string[]) => Selection;
42
+ //# sourceMappingURL=project-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-files.d.ts","sourceRoot":"","sources":["../../src/sync/project-files.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAID,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AACzC,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAElD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAI1D,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CAC1B;AAGD,eAAO,MAAM,WAAW,OAAQ,CAAC;AAgBjC,eAAO,MAAM,gBAAgB,YAAa,MAAM,KAAG,MAOlD,CAAC;AAGF,eAAO,MAAM,iBAAiB,aAAc,SAAS,MAAM,EAAE,KAAG,MAAM,EAA4D,CAAC;AAEnI,eAAO,MAAM,aAAa,aAAc,SAAS,MAAM,EAAE,KAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAGrF,CAAC;AAIF,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,OAA6D,CAAC;AAO5G,eAAO,MAAM,YAAY,QAAS,MAAM,KAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAmB5D,CAAC;AAKF,MAAM,WAAW,QAAQ;IAGrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAG1B,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxD;AAGD,eAAO,MAAM,gBAAgB,4GAA4G,CAAC;AAC1I,eAAO,MAAM,iBAAiB,8FAA8F,CAAC;AAC7H,eAAO,MAAM,YAAY,qIAAqI,CAAC;AAsC/J,MAAM,WAAW,UAAU;IAEvB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAE3C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,QAAQ,UAAW,OAAO,UAAU,OAAO,UAAU,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,QAAQ,KAAG,UAuBnH,CAAC;AAEF,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B;AAGD,eAAO,MAAM,MAAM,YAAa,SAAS,aAAa,EAAE,KAAG,aAGzD,CAAC;AAEH,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAE5C,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAID,eAAO,MAAM,aAAa,YAAa,SAAS,aAAa,EAAE,SAAS,SAAS,MAAM,EAAE,KAAG,SAU3F,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { isSafeRelativePath } from "./residue.js";
2
+ export const CHANGES_MAX = 5_000;
3
+ const MUTAGEN_TEMPORARY = ".mutagen-temporary-*";
4
+ const PATTERN = /^\/?[^/*?[\]!\\{}]*(?:\*[^/*?[\]!\\{}]*)*$/;
5
+ const escaped = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
6
+ export const ignoreExpression = (pattern) => {
7
+ const bare = pattern.replace(/^\//, "");
8
+ if (!PATTERN.test(pattern) || bare === "" || bare.includes("**")) {
9
+ throw new Error(`the ignore pattern ${JSON.stringify(pattern)} is not one this agent can match exactly, so it will not compare the folder with the sandbox's copy`);
10
+ }
11
+ const name = bare.split("*").map(escaped).join("[^/]*");
12
+ return `${pattern.startsWith("/") ? "^" : "(?:^|/)"}${name}(?:/|$)`;
13
+ };
14
+ export const ignoreExpressions = (patterns) => [...patterns, MUTAGEN_TEMPORARY].map(ignoreExpression);
15
+ export const ignoreMatcher = (patterns) => {
16
+ const rules = ignoreExpressions(patterns).map((source) => new RegExp(source));
17
+ return (path) => rules.some((rule) => rule.test(path));
18
+ };
19
+ export const isPortablePath = (path) => isSafeRelativePath(path) && !/^[a-z]:/i.test(path);
20
+ const HASH = /^[0-9a-f]{64}$/;
21
+ export const parseListing = (raw) => {
22
+ const fields = raw.split("\0");
23
+ if (fields.pop() !== "" || fields.length % 3 !== 0) {
24
+ throw new Error("the sandbox's file listing ended early");
25
+ }
26
+ const listing = new Map();
27
+ for (let at = 0; at < fields.length; at += 3) {
28
+ const [path = "", size = "", hash = ""] = fields.slice(at, at + 3);
29
+ if (!isPortablePath(path)) {
30
+ continue;
31
+ }
32
+ const bytes = Number(size);
33
+ const entry = size === "-" && hash === "-" ? "other" : Number.isSafeInteger(bytes) && bytes >= 0 && HASH.test(hash) ? { size: bytes, hash } : undefined;
34
+ if (entry === undefined || listing.has(path)) {
35
+ throw new Error(`the sandbox's file listing is not one this agent wrote (at ${JSON.stringify(path)})`);
36
+ }
37
+ listing.set(path, entry);
38
+ }
39
+ return listing;
40
+ };
41
+ const sameFile = (here, there) => here.size === there.size && here.hash !== undefined && here.hash === there.hash;
42
+ export const HELD_NOT_RUNNING = "the sync was not running, so whether this folder's copy changed too cannot be told; it is left as it is";
43
+ export const HELD_CHANGED_HERE = "it changed here too since the two copies last agreed; this folder's copy is left as it is";
44
+ export const HELD_UNKNOWN = "no listing has seen the two copies agree on it, so whether it changed here too is not known; this folder's copy is left as it is";
45
+ const heldBecause = (path, here, agreed, evidence) => {
46
+ if (!evidence.current) {
47
+ return HELD_NOT_RUNNING;
48
+ }
49
+ const reported = evidence.unchangedHere.get(path);
50
+ if (reported !== undefined) {
51
+ return reported ? undefined : HELD_CHANGED_HERE;
52
+ }
53
+ if (agreed === undefined) {
54
+ return HELD_UNKNOWN;
55
+ }
56
+ return here.hash === agreed ? undefined : HELD_CHANGED_HERE;
57
+ };
58
+ const changeOf = (path, here, there, agreed, evidence) => {
59
+ if (there === undefined) {
60
+ return agreed !== undefined && here?.hash === agreed ? { path, kind: "deleted" } : undefined;
61
+ }
62
+ if (agreed !== undefined && there.hash === agreed) {
63
+ return undefined;
64
+ }
65
+ if (here === undefined) {
66
+ return { path, kind: "added", size: there.size };
67
+ }
68
+ const held = heldBecause(path, here, agreed, evidence);
69
+ return held === undefined ? { path, kind: "modified", size: there.size } : { path, kind: "modified", size: there.size, held };
70
+ };
71
+ export const classify = (local, remote, agreed, evidence) => {
72
+ const changes = [];
73
+ const next = new Map();
74
+ for (const path of [...new Set([...local.keys(), ...remote.keys()])].toSorted()) {
75
+ const here = local.get(path);
76
+ const there = remote.get(path);
77
+ if (here === "other" || there === "other") {
78
+ continue;
79
+ }
80
+ if (here !== undefined && there !== undefined && sameFile(here, there) && there.hash !== undefined) {
81
+ next.set(path, there.hash);
82
+ continue;
83
+ }
84
+ const before = agreed.get(path);
85
+ if (before !== undefined) {
86
+ next.set(path, before);
87
+ }
88
+ const change = changeOf(path, here, there, before, evidence);
89
+ if (change !== undefined) {
90
+ changes.push(change);
91
+ }
92
+ }
93
+ return { changes, agreed: next };
94
+ };
95
+ export const capped = (changes) => ({
96
+ changes: changes.slice(0, CHANGES_MAX),
97
+ truncated: changes.length > CHANGES_MAX,
98
+ });
99
+ export const selectChanges = (changes, paths) => {
100
+ if (paths.length === 0) {
101
+ return { selected: changes, unmatched: [] };
102
+ }
103
+ const wanted = paths.map((path) => path.replace(/\/+$/, ""));
104
+ const names = (path, change) => change.path === path || change.path.startsWith(`${path}/`);
105
+ return {
106
+ selected: changes.filter((change) => wanted.some((path) => names(path, change))),
107
+ unmatched: wanted.filter((path) => !changes.some((change) => names(path, change))),
108
+ };
109
+ };
110
+ //# sourceMappingURL=project-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/sync/project-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type FileStamp, type Listed } from "./project-files.js";
2
+ export declare const hashFile: (path: string, algorithm?: "sha256" | "sha1") => Promise<string>;
3
+ export interface Durability {
4
+ readonly file: (path: string) => Promise<void>;
5
+ readonly folder: (path: string) => Promise<void>;
6
+ }
7
+ export declare const realDurability: Durability;
8
+ export interface CachedHash {
9
+ readonly size: number;
10
+ readonly mtimeMs: number;
11
+ readonly ctimeMs: number;
12
+ readonly hash: string;
13
+ }
14
+ export interface ListingRecord {
15
+ readonly files: ReadonlyMap<string, CachedHash>;
16
+ readonly agreed: ReadonlyMap<string, string>;
17
+ }
18
+ export declare const listingRecordPath: (stateDir: string, sandboxId: string) => string;
19
+ export declare const readListingRecord: (path: string, localDir: string, remoteDir: string) => Promise<ListingRecord>;
20
+ export declare const writeListingRecord: (path: string, localDir: string, remoteDir: string, record: ListingRecord) => Promise<void>;
21
+ export interface LocalWalk {
22
+ readonly root: string;
23
+ readonly ignored: (path: string) => boolean;
24
+ readonly cached: ReadonlyMap<string, CachedHash>;
25
+ readonly wantsHash: (path: string, size: number) => boolean;
26
+ }
27
+ export interface LocalListing {
28
+ readonly listing: ReadonlyMap<string, Listed>;
29
+ readonly hashes: ReadonlyMap<string, CachedHash>;
30
+ }
31
+ export declare const assertFolder: (root: string) => Promise<void>;
32
+ export declare const walkLocal: (walk: LocalWalk) => Promise<LocalListing>;
33
+ export declare const localTarget: (root: string, path: string) => Promise<string>;
34
+ export interface LocalFile extends FileStamp {
35
+ readonly hash: string;
36
+ readonly mode: number;
37
+ }
38
+ export declare const localFile: (root: string, path: string) => Promise<LocalFile | undefined>;
39
+ export type FileMode = {
40
+ readonly exact: number;
41
+ } | {
42
+ readonly executable: boolean;
43
+ };
44
+ export declare const installFile: (root: string, path: string, source: string, mode: FileMode) => Promise<void>;
45
+ export declare const removeFile: (root: string, path: string) => Promise<void>;
46
+ //# sourceMappingURL=project-local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-local.d.ts","sourceRoot":"","sources":["../../src/sync/project-local.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,SAAS,EAAkB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAMjF,eAAO,MAAM,QAAQ,SAAgB,MAAM,cAAa,QAAQ,GAAG,MAAM,KAAc,OAAO,CAAC,MAAM,CAMpG,CAAC;AAKF,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAWD,eAAO,MAAM,cAAc,EAAE,UAO5B,CAAC;AAIF,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAYD,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,iBAAiB,aAAc,MAAM,aAAa,MAAM,KAAG,MAA2E,CAAC;AAIpJ,eAAO,MAAM,iBAAiB,SAAgB,MAAM,YAAY,MAAM,aAAa,MAAM,KAAG,OAAO,CAAC,aAAa,CAQhH,CAAC;AAWF,eAAO,MAAM,kBAAkB,SAAgB,MAAM,YAAY,MAAM,aAAa,MAAM,UAAU,aAAa,KAAG,OAAO,CAAC,IAAI,CAG/H,CAAC;AAEF,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEjD,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/D;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpD;AAID,eAAO,MAAM,YAAY,SAAgB,MAAM,KAAG,OAAO,CAAC,IAAI,CAK7D,CAAC;AAGF,eAAO,MAAM,SAAS,SAAgB,SAAS,KAAG,OAAO,CAAC,YAAY,CAsDrE,CAAC;AAMF,eAAO,MAAM,WAAW,SAAgB,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,MAAM,CAmB5E,CAAC;AAGF,MAAM,WAAW,SAAU,SAAQ,SAAS;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,SAAS,SAAgB,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAIzF,CAAC;AAwBF,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAMrF,eAAO,MAAM,WAAW,SAAgB,MAAM,QAAQ,MAAM,UAAU,MAAM,QAAQ,QAAQ,KAAG,OAAO,CAAC,IAAI,CAuB1G,CAAC;AAiCF,eAAO,MAAM,UAAU,SAAgB,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAczE,CAAC"}