@apexops/kernel 0.10.0-next.4 → 0.11.0-next.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 (66) hide show
  1. package/README.md +28 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/directory-lock.d.ts +118 -0
  4. package/dist/directory-lock.d.ts.map +1 -0
  5. package/dist/directory-lock.js +587 -0
  6. package/dist/directory-lock.js.map +1 -0
  7. package/dist/files.d.ts +63 -0
  8. package/dist/files.d.ts.map +1 -1
  9. package/dist/files.js +158 -2
  10. package/dist/files.js.map +1 -1
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/object-store.js +2 -2
  16. package/dist/object-store.js.map +1 -1
  17. package/dist/project-store.d.ts +2 -1
  18. package/dist/project-store.d.ts.map +1 -1
  19. package/dist/project-store.js +1 -0
  20. package/dist/project-store.js.map +1 -1
  21. package/dist/repeat-files.d.ts +66 -0
  22. package/dist/repeat-files.d.ts.map +1 -0
  23. package/dist/repeat-files.js +214 -0
  24. package/dist/repeat-files.js.map +1 -0
  25. package/dist/repeat-guard.d.ts +197 -0
  26. package/dist/repeat-guard.d.ts.map +1 -0
  27. package/dist/repeat-guard.js +462 -0
  28. package/dist/repeat-guard.js.map +1 -0
  29. package/dist/review-capture.d.ts +170 -0
  30. package/dist/review-capture.d.ts.map +1 -0
  31. package/dist/review-capture.js +570 -0
  32. package/dist/review-capture.js.map +1 -0
  33. package/dist/run-repository.d.ts +52 -2
  34. package/dist/run-repository.d.ts.map +1 -1
  35. package/dist/run-repository.js +198 -52
  36. package/dist/run-repository.js.map +1 -1
  37. package/dist/tasks.d.ts.map +1 -1
  38. package/dist/tasks.js +24 -2
  39. package/dist/tasks.js.map +1 -1
  40. package/dist/test/files.test.d.ts +2 -0
  41. package/dist/test/files.test.d.ts.map +1 -0
  42. package/dist/test/files.test.js +140 -0
  43. package/dist/test/files.test.js.map +1 -0
  44. package/dist/test/policies.test.js +1 -1
  45. package/dist/test/policies.test.js.map +1 -1
  46. package/dist/test/repeat-guard.test.d.ts +2 -0
  47. package/dist/test/repeat-guard.test.d.ts.map +1 -0
  48. package/dist/test/repeat-guard.test.js +1106 -0
  49. package/dist/test/repeat-guard.test.js.map +1 -0
  50. package/dist/test/review-capture.test.d.ts +2 -0
  51. package/dist/test/review-capture.test.d.ts.map +1 -0
  52. package/dist/test/review-capture.test.js +291 -0
  53. package/dist/test/review-capture.test.js.map +1 -0
  54. package/dist/test/run-repository.test.js +451 -7
  55. package/dist/test/run-repository.test.js.map +1 -1
  56. package/dist/test/workflow.test.js +32 -1
  57. package/dist/test/workflow.test.js.map +1 -1
  58. package/dist/test/writer-transfer.test.js +6 -1
  59. package/dist/test/writer-transfer.test.js.map +1 -1
  60. package/dist/validator-registry.d.ts.map +1 -1
  61. package/dist/validator-registry.js +10 -1
  62. package/dist/validator-registry.js.map +1 -1
  63. package/dist/workflow-validator-ownership.d.ts.map +1 -1
  64. package/dist/workflow-validator-ownership.js +2 -1
  65. package/dist/workflow-validator-ownership.js.map +1 -1
  66. package/package.json +3 -3
package/dist/files.d.ts CHANGED
@@ -1,6 +1,69 @@
1
+ import { type Stats } from "node:fs";
2
+ export interface RenameRetryOptions {
3
+ readonly platform?: NodeJS.Platform;
4
+ readonly attempts?: number;
5
+ readonly rename?: (from: string, to: string) => Promise<void>;
6
+ readonly sleep?: (milliseconds: number) => Promise<void>;
7
+ }
8
+ /**
9
+ * Rename with bounded retries on Windows, where antivirus, indexers and editor watchers briefly hold files open and
10
+ * make an atomic replace fail with EPERM, EACCES or EBUSY. Other platforms and other errors fail on the first attempt.
11
+ */
12
+ export declare function renameWithRetry(from: string, to: string, options?: RenameRetryOptions): Promise<void>;
13
+ export interface SharingRetryOptions {
14
+ readonly platform?: NodeJS.Platform;
15
+ readonly attempts?: number;
16
+ readonly sleep?: (milliseconds: number) => Promise<void>;
17
+ }
18
+ /**
19
+ * Runs a file operation with the bounded backoff of `renameWithRetry`, retrying the Windows sharing violations (EPERM,
20
+ * EACCES, EBUSY) that a concurrent writer, antivirus or indexer causes. Other platforms and other errors fail on the
21
+ * first attempt.
22
+ */
23
+ export declare function retrySharingViolations<T>(operation: () => Promise<T>, options?: SharingRetryOptions): Promise<T>;
24
+ export interface PublishedFileReadOptions {
25
+ readonly maxBytes: number;
26
+ /** Prefix of the error thrown when the path is not a regular file within `maxBytes`. */
27
+ readonly label: string;
28
+ readonly platform?: NodeJS.Platform;
29
+ readonly attempts?: number;
30
+ readonly lstat?: (path: string) => Promise<Pick<Stats, "isFile" | "isSymbolicLink" | "size">>;
31
+ readonly readFile?: (path: string) => Promise<Buffer>;
32
+ readonly sleep?: (milliseconds: number) => Promise<void>;
33
+ }
34
+ /**
35
+ * Read a small regular file that writers publish with an atomic replace (see `atomicWriteBytes`). Returns undefined
36
+ * only when lstat reports the path as absent. A file that vanishes between lstat and read was replaced or removed
37
+ * mid-read and is re-examined; on Windows, sharing violations (EPERM, EACCES, EBUSY) raised while a writer replaces
38
+ * the file are retried with the same bounded backoff as `renameWithRetry`. Exhausted retries rethrow, so a transient
39
+ * failure is never reported as an absent file.
40
+ */
41
+ export declare function readPublishedFile(path: string, options: PublishedFileReadOptions): Promise<Buffer | undefined>;
1
42
  export interface AtomicWriteOptions {
2
43
  refuseOverwrite?: boolean;
3
44
  }
45
+ /**
46
+ * Coordinates the atomic writes of one operation, such as a workspace lock holder, with its quiet sections, during
47
+ * which another process may read the state those writes change. A write in the fenced async context waits while a
48
+ * quiet section runs, and a quiet section starts only once no such write is in flight, so readers inside a quiet
49
+ * section never see the operation's writes land. Writes made inside a quiet section itself are not held back: the
50
+ * section's own work, such as an external provider's private records, is outside the state readers depend on. Once
51
+ * `error` is set, every later fenced write throws it instead of writing.
52
+ */
53
+ export declare class WriteFence {
54
+ error?: Error;
55
+ private writes;
56
+ private quiets;
57
+ private pendingQuiets;
58
+ private waiters;
59
+ /** Runs `operation` as a quiet section; a section started inside another one of this fence joins it. */
60
+ quiet<T>(operation: () => Promise<T>): Promise<T>;
61
+ write<T>(operation: () => Promise<T>): Promise<T>;
62
+ private changed;
63
+ private notify;
64
+ }
65
+ /** Runs `operation` with its atomic writes, and those of everything it starts, subject to `fence`. */
66
+ export declare function withWriteFence<T>(fence: WriteFence, operation: () => Promise<T>): Promise<T>;
4
67
  export declare function atomicWriteBytes(path: string, bytes: Uint8Array, options?: AtomicWriteOptions): Promise<void>;
5
68
  export declare function atomicWriteJson(path: string, value: unknown, options?: AtomicWriteOptions): Promise<void>;
6
69
  //# sourceMappingURL=files.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnH"}
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAOhD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/G;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC;IAC9F,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkCpH;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAyB;IAExC,wGAAwG;IAClG,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAetD;IAEK,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAetD;IAED,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,MAAM;CAKf;AAKD,sGAAsG;AACtG,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE5F;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAIf;AA0BD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnH"}
package/dist/files.js CHANGED
@@ -1,8 +1,164 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
1
2
  import { constants } from "node:fs";
2
- import { link, mkdir, open, rename, rm } from "node:fs/promises";
3
+ import { link, lstat, mkdir, open, readFile, rename, rm } from "node:fs/promises";
3
4
  import { basename, dirname, join } from "node:path";
4
5
  import { canonicalJsonBytes } from "./canonical.js";
6
+ const TRANSIENT_RENAME_CODES = new Set(["EPERM", "EACCES", "EBUSY"]);
7
+ /**
8
+ * Rename with bounded retries on Windows, where antivirus, indexers and editor watchers briefly hold files open and
9
+ * make an atomic replace fail with EPERM, EACCES or EBUSY. Other platforms and other errors fail on the first attempt.
10
+ */
11
+ export async function renameWithRetry(from, to, options = {}) {
12
+ if (options.attempts !== undefined &&
13
+ (!Number.isSafeInteger(options.attempts) || options.attempts < 1 || options.attempts > 10))
14
+ throw new RangeError("Rename attempts must be an integer from 1 to 10");
15
+ const move = options.rename ?? rename;
16
+ await retrySharingViolations(() => move(from, to), options);
17
+ }
18
+ /**
19
+ * Runs a file operation with the bounded backoff of `renameWithRetry`, retrying the Windows sharing violations (EPERM,
20
+ * EACCES, EBUSY) that a concurrent writer, antivirus or indexer causes. Other platforms and other errors fail on the
21
+ * first attempt.
22
+ */
23
+ export async function retrySharingViolations(operation, options = {}) {
24
+ if (options.attempts !== undefined &&
25
+ (!Number.isSafeInteger(options.attempts) || options.attempts < 1 || options.attempts > 10))
26
+ throw new RangeError("Retry attempts must be an integer from 1 to 10");
27
+ const attempts = (options.platform ?? process.platform) === "win32" ? (options.attempts ?? 10) : 1;
28
+ const sleep = options.sleep ?? (async (milliseconds) => await new Promise((done) => setTimeout(done, milliseconds)));
29
+ for (let attempt = 1;; attempt += 1) {
30
+ try {
31
+ return await operation();
32
+ }
33
+ catch (error) {
34
+ if (attempt >= attempts || !TRANSIENT_RENAME_CODES.has(error.code ?? ""))
35
+ throw error;
36
+ await sleep(Math.min(10 * 2 ** (attempt - 1), 500));
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * Read a small regular file that writers publish with an atomic replace (see `atomicWriteBytes`). Returns undefined
42
+ * only when lstat reports the path as absent. A file that vanishes between lstat and read was replaced or removed
43
+ * mid-read and is re-examined; on Windows, sharing violations (EPERM, EACCES, EBUSY) raised while a writer replaces
44
+ * the file are retried with the same bounded backoff as `renameWithRetry`. Exhausted retries rethrow, so a transient
45
+ * failure is never reported as an absent file.
46
+ */
47
+ export async function readPublishedFile(path, options) {
48
+ if (options.attempts !== undefined &&
49
+ (!Number.isSafeInteger(options.attempts) || options.attempts < 1 || options.attempts > 10))
50
+ throw new RangeError("Read attempts must be an integer from 1 to 10");
51
+ const windows = (options.platform ?? process.platform) === "win32";
52
+ const attempts = options.attempts ?? 10;
53
+ const inspect = options.lstat ?? lstat;
54
+ const read = options.readFile ?? readFile;
55
+ const sleep = options.sleep ?? (async (milliseconds) => await new Promise((done) => setTimeout(done, milliseconds)));
56
+ for (let attempt = 1;; attempt += 1) {
57
+ try {
58
+ let stat;
59
+ try {
60
+ stat = await inspect(path);
61
+ }
62
+ catch (error) {
63
+ if (error.code === "ENOENT")
64
+ return undefined;
65
+ throw error;
66
+ }
67
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > options.maxBytes) {
68
+ throw new Error(`${options.label} is unsafe`);
69
+ }
70
+ const bytes = await read(path);
71
+ if (bytes.byteLength > options.maxBytes)
72
+ throw new Error(`${options.label} is unsafe`);
73
+ return bytes;
74
+ }
75
+ catch (error) {
76
+ const code = error.code ?? "";
77
+ const transient = code === "ENOENT" || (windows && TRANSIENT_RENAME_CODES.has(code));
78
+ if (attempt >= attempts || !transient)
79
+ throw error;
80
+ await sleep(Math.min(10 * 2 ** (attempt - 1), 500));
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Coordinates the atomic writes of one operation, such as a workspace lock holder, with its quiet sections, during
86
+ * which another process may read the state those writes change. A write in the fenced async context waits while a
87
+ * quiet section runs, and a quiet section starts only once no such write is in flight, so readers inside a quiet
88
+ * section never see the operation's writes land. Writes made inside a quiet section itself are not held back: the
89
+ * section's own work, such as an external provider's private records, is outside the state readers depend on. Once
90
+ * `error` is set, every later fenced write throws it instead of writing.
91
+ */
92
+ export class WriteFence {
93
+ error;
94
+ writes = 0;
95
+ quiets = 0;
96
+ pendingQuiets = 0;
97
+ waiters = [];
98
+ /** Runs `operation` as a quiet section; a section started inside another one of this fence joins it. */
99
+ async quiet(operation) {
100
+ if (quietSections.getStore()?.has(this) === true)
101
+ return operation();
102
+ this.pendingQuiets += 1;
103
+ try {
104
+ while (this.writes > 0)
105
+ await this.changed();
106
+ }
107
+ finally {
108
+ this.pendingQuiets -= 1;
109
+ }
110
+ this.quiets += 1;
111
+ try {
112
+ return await quietSections.run(new Set(quietSections.getStore() ?? []).add(this), operation);
113
+ }
114
+ finally {
115
+ this.quiets -= 1;
116
+ this.notify();
117
+ }
118
+ }
119
+ async write(operation) {
120
+ if (this.error !== undefined)
121
+ throw this.error;
122
+ if (quietSections.getStore()?.has(this) === true)
123
+ return operation();
124
+ // Waiting quiet sections go first, so a stream of writes cannot hold a reader window off indefinitely.
125
+ while (this.quiets > 0 || this.pendingQuiets > 0) {
126
+ await this.changed();
127
+ if (this.error !== undefined)
128
+ throw this.error;
129
+ }
130
+ this.writes += 1;
131
+ try {
132
+ return await operation();
133
+ }
134
+ finally {
135
+ this.writes -= 1;
136
+ this.notify();
137
+ }
138
+ }
139
+ changed() {
140
+ return new Promise((resolve) => this.waiters.push(resolve));
141
+ }
142
+ notify() {
143
+ const waiters = this.waiters;
144
+ this.waiters = [];
145
+ for (const resolve of waiters)
146
+ resolve();
147
+ }
148
+ }
149
+ const writeFences = new AsyncLocalStorage();
150
+ const quietSections = new AsyncLocalStorage();
151
+ /** Runs `operation` with its atomic writes, and those of everything it starts, subject to `fence`. */
152
+ export function withWriteFence(fence, operation) {
153
+ return writeFences.run(fence, operation);
154
+ }
5
155
  export async function atomicWriteBytes(path, bytes, options = {}) {
156
+ const fence = writeFences.getStore();
157
+ if (fence !== undefined)
158
+ return fence.write(() => writeBytes(path, bytes, options));
159
+ return writeBytes(path, bytes, options);
160
+ }
161
+ async function writeBytes(path, bytes, options) {
6
162
  const directory = dirname(path);
7
163
  await mkdir(directory, { recursive: true });
8
164
  const temporary = join(directory, `.${basename(path)}.${process.pid}.${crypto.randomUUID()}.tmp`);
@@ -20,7 +176,7 @@ export async function atomicWriteBytes(path, bytes, options = {}) {
20
176
  await rm(temporary);
21
177
  return;
22
178
  }
23
- await rename(temporary, path);
179
+ await renameWithRetry(temporary, path);
24
180
  }
25
181
  catch (error) {
26
182
  await rm(temporary, { force: true });
package/dist/files.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAMpD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,KAAiB,EACjB,OAAO,GAAuB,EAAE;IAEhC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAClG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvG,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5B,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,KAAc,EAAE,OAAO,GAAuB,EAAE;IAClG,MAAM,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,9 @@ export * from "./improvement-store.js";
9
9
  export * from "./lease-store.js";
10
10
  export * from "./object-store.js";
11
11
  export * from "./project-store.js";
12
+ export * from "./repeat-files.js";
13
+ export * from "./repeat-guard.js";
14
+ export * from "./review-capture.js";
12
15
  export * from "./run-repository.js";
13
16
  export * from "./tasks.js";
14
17
  export * from "./validator-registry.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -9,6 +9,9 @@ export * from "./improvement-store.js";
9
9
  export * from "./lease-store.js";
10
10
  export * from "./object-store.js";
11
11
  export * from "./project-store.js";
12
+ export * from "./repeat-files.js";
13
+ export * from "./repeat-guard.js";
14
+ export * from "./review-capture.js";
12
15
  export * from "./run-repository.js";
13
16
  export * from "./tasks.js";
14
17
  export * from "./validator-registry.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC"}
@@ -54,10 +54,10 @@ export class ObjectStore {
54
54
  if (create) {
55
55
  await mkdir(this.root, { recursive: true });
56
56
  }
57
- const root = await realpath(this.root);
58
- if (root !== this.root) {
57
+ if ((await lstat(this.root)).isSymbolicLink()) {
59
58
  throw new Error("Object store root must not be a symlink");
60
59
  }
60
+ const root = await realpath(this.root);
61
61
  const path = join(root, hash.slice(0, 2), hash.slice(2));
62
62
  if (create) {
63
63
  await mkdir(dirname(path), { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"object-store.js","sourceRoot":"","sources":["../src/object-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"object-store.js","sourceRoot":"","sources":["../src/object-store.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
- import type { IacTool, ProjectConfigV1, ProjectId, RunConfigV1, RunId } from "@apexops/contracts";
1
+ import type { IacTool, ProjectConfigV1, ProjectId, RiskOwner, RunConfigV1, RunId } from "@apexops/contracts";
2
2
  import type { Clock } from "./lease-store.js";
3
3
  export type IdSource = () => string;
4
4
  export interface InitializeProjectInput {
5
5
  projectId: ProjectId;
6
6
  displayName: string;
7
7
  defaultIacTool: IacTool;
8
+ riskOwner: RiskOwner;
8
9
  }
9
10
  export interface CreateRunInput {
10
11
  environment: string;
@@ -1 +1 @@
1
- {"version":3,"file":"project-store.d.ts","sourceRoot":"","sources":["../src/project-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAKlG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;AAEpC,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB;AAED,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,YACE,aAAa,EAAE,MAAM,EACJ,KAAK,GAAE,KAAwB,EAC/B,QAAQ,GAAE,QAAoC,EAGhE;IAEK,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAY/E;IAEK,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBjF;IAEK,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAE/D;IAEK,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAErE;IAED,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAG7C;IAED,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAGvD;IAED,OAAO,CAAC,gBAAgB;YAMV,QAAQ;CAGvB"}
1
+ {"version":3,"file":"project-store.d.ts","sourceRoot":"","sources":["../src/project-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAK7G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;AAEpC,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;CACrB;AAED,qBAAa,YAAY;IAKrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,YACE,aAAa,EAAE,MAAM,EACJ,KAAK,GAAE,KAAwB,EAC/B,QAAQ,GAAE,QAAoC,EAGhE;IAEK,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAa/E;IAEK,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBjF;IAEK,UAAU,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAE/D;IAEK,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAErE;IAED,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAG7C;IAED,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAGvD;IAED,OAAO,CAAC,gBAAgB;YAMV,QAAQ;CAGvB"}
@@ -18,6 +18,7 @@ export class ProjectStore {
18
18
  displayName: input.displayName,
19
19
  createdAt: this.clock().toISOString(),
20
20
  defaultIacTool: input.defaultIacTool,
21
+ riskOwner: input.riskOwner,
21
22
  };
22
23
  const directory = this.projectDirectory(input.projectId);
23
24
  await mkdir(join(directory, "runs"), { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"project-store.js","sourceRoot":"","sources":["../src/project-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmB7C,MAAM,OAAO,YAAY;IAKJ,KAAK;IACL,QAAQ;IALlB,QAAQ,CAAS;IAE1B,YACE,aAAqB,EACJ,KAAK,GAAU,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAC/B,QAAQ,GAAa,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE;qBAD9C,KAAK;wBACL,QAAQ;QAEzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAA6B;QACnD,MAAM,OAAO,GAAoB;YAC/B,aAAa,EAAE,gBAAgB;YAC/B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE;YACrC,cAAc,EAAE,KAAK,CAAC,cAAc;SACrC,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAoB,EAAE,KAAqB;QACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAW,CAAC;QACvC,MAAM,GAAG,GAAgB;YACvB,aAAa,EAAE,gBAAgB;YAC/B,SAAS;YACT,KAAK;YACL,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,cAAc;YAChD,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE;YACrC,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;YAC9E,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;SACtG,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAoB;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAoB,EAAE,KAAY;QAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,gBAAgB,CAAC,SAAoB;QACnC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAED,YAAY,CAAC,SAAoB,EAAE,KAAY;QAC7C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;IAEO,gBAAgB,CAAC,KAAa;QACpC,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAI,IAAY;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;IACvD,CAAC;CACF"}
1
+ {"version":3,"file":"project-store.js","sourceRoot":"","sources":["../src/project-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { type SharingRetryOptions } from "./files.js";
2
+ /** Most entries a repeat file snapshot covers; a larger tree fails the snapshot, which disables replay and storage. */
3
+ export declare const MAX_REPEAT_FILE_ENTRIES = 20000;
4
+ /** Most file bytes a repeat file snapshot hashes; a larger tree fails the snapshot, which disables replay and storage. */
5
+ export declare const MAX_REPEAT_FILE_BYTES: number;
6
+ /**
7
+ * One bound path. A regular file is bound by the SHA-256 of its content and by its stat identity (device, inode, mode,
8
+ * size, modification and change times); a directory by its existence; anything else, such as a symbolic link, by its
9
+ * stat identity without being followed.
10
+ */
11
+ export type RepeatFileEntry = {
12
+ type: "directory";
13
+ } | {
14
+ type: "file";
15
+ sha256: string;
16
+ stat: string;
17
+ } | {
18
+ type: "other";
19
+ stat: string;
20
+ };
21
+ /** Content of the mutable trees a repeat-guarded call binds, as read at one point in time. */
22
+ export interface RepeatFileSnapshot {
23
+ /** Absolute, sorted, unique roots. A missing root binds its absence. */
24
+ roots: string[];
25
+ /** Every path under the roots, roots included, keyed by absolute path. */
26
+ entries: Record<string, RepeatFileEntry>;
27
+ }
28
+ export interface RepeatFileSnapshotOptions extends SharingRetryOptions {
29
+ maxEntries?: number;
30
+ maxBytes?: number;
31
+ }
32
+ /** A bound tree is too large or kept changing while it was read, so it cannot be bound by content. */
33
+ export declare class RepeatFileSnapshotError extends Error {
34
+ constructor(message: string);
35
+ }
36
+ /**
37
+ * Reads the trees under `roots` and hashes every regular file with streaming SHA-256. Roots nested in another root are
38
+ * read once. Symbolic links below a root are bound by their own stat and never followed; a root that is a symbolic
39
+ * link fails the snapshot. A file that keeps changing while it is hashed, or a tree over the entry or byte budget,
40
+ * fails the snapshot with {@link RepeatFileSnapshotError}. Windows sharing violations are retried.
41
+ */
42
+ export declare function snapshotRepeatFiles(roots: readonly string[], options?: RepeatFileSnapshotOptions): Promise<RepeatFileSnapshot>;
43
+ /** Digest of a snapshot for the repeat state token; equal only for equal roots, paths, contents and stat identities. */
44
+ export declare function repeatFilesDigest(snapshot: RepeatFileSnapshot): string;
45
+ /**
46
+ * Writes a repeat-guarded operation made itself to bound files, in order. The guard compares the bound trees after the
47
+ * operation with their content at its start changed only by these writes.
48
+ */
49
+ export declare class RepeatFileWrites {
50
+ #private;
51
+ /** The operation wrote `path` with content of SHA-256 `sha256`, creating missing parent directories. */
52
+ file(path: string, sha256: string): void;
53
+ /** The operation removed `path` and everything below it. */
54
+ removed(path: string): void;
55
+ get writes(): ReadonlyArray<{
56
+ readonly path: string;
57
+ readonly sha256: string | null;
58
+ }>;
59
+ }
60
+ /**
61
+ * True when every tree bound at `start` holds, in `end`, exactly its start content changed only by the operation's own
62
+ * `writes`: a file the operation wrote holds what it wrote, and every other path is unchanged in content and stat
63
+ * identity. A bound root missing from `end` fails the check, so `end` must be read over at least the start roots.
64
+ */
65
+ export declare function repeatFilesHeld(start: RepeatFileSnapshot, end: RepeatFileSnapshot, writes?: RepeatFileWrites): boolean;
66
+ //# sourceMappingURL=repeat-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repeat-files.d.ts","sourceRoot":"","sources":["../src/repeat-files.ts"],"names":[],"mappings":"AAKA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE9E,uHAAuH;AACvH,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,0HAA0H;AAC1H,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AAItD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACzB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3G,8FAA8F;AAC9F,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sGAAsG;AACtG,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAgBD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,kBAAkB,CAAC,CAmG7B;AAED,wHAAwH;AACxH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAEtE;AAED;;;GAGG;AACH,qBAAa,gBAAgB;;IAG3B,wGAAwG;IACxG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGvC;IAED,4DAA4D;IAC5D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1B;IAED,IAAI,MAAM,IAAI,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAErF;CACF;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,GAAG,EAAE,kBAAkB,EACvB,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CA4BT"}