@agent-teams/engineering-foundation 0.13.0 → 0.13.1

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 (55) hide show
  1. package/dist/repository-mutation/adapters/node/node-absent-file-publication.d.ts +31 -0
  2. package/dist/repository-mutation/adapters/node/node-absent-file-publication.d.ts.map +1 -0
  3. package/dist/repository-mutation/adapters/node/node-absent-file-publication.js +272 -0
  4. package/dist/repository-mutation/adapters/node/node-absent-file-publication.js.map +1 -0
  5. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts +20 -0
  6. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts.map +1 -0
  7. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js +123 -0
  8. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js.map +1 -0
  9. package/dist/repository-mutation/adapters/node/node-directory-durability.d.ts +12 -0
  10. package/dist/repository-mutation/adapters/node/node-directory-durability.d.ts.map +1 -0
  11. package/dist/repository-mutation/adapters/node/node-directory-durability.js +32 -0
  12. package/dist/repository-mutation/adapters/node/node-directory-durability.js.map +1 -0
  13. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.d.ts +13 -0
  14. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.d.ts.map +1 -0
  15. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.js +67 -0
  16. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.js.map +1 -0
  17. package/dist/repository-mutation/adapters/node/node-repository-path.d.ts +2 -0
  18. package/dist/repository-mutation/adapters/node/node-repository-path.d.ts.map +1 -0
  19. package/dist/repository-mutation/adapters/node/node-repository-path.js +7 -0
  20. package/dist/repository-mutation/adapters/node/node-repository-path.js.map +1 -0
  21. package/dist/repository-mutation/application/model/exact-postimage.d.ts +17 -0
  22. package/dist/repository-mutation/application/model/exact-postimage.d.ts.map +1 -0
  23. package/dist/repository-mutation/application/model/exact-postimage.js +11 -0
  24. package/dist/repository-mutation/application/model/exact-postimage.js.map +1 -0
  25. package/dist/repository-mutation/application/model/path-identity.d.ts +7 -0
  26. package/dist/repository-mutation/application/model/path-identity.d.ts.map +1 -0
  27. package/dist/repository-mutation/application/model/path-identity.js +2 -0
  28. package/dist/repository-mutation/application/model/path-identity.js.map +1 -0
  29. package/dist/repository-mutation/application/model/repository-path.d.ts +8 -0
  30. package/dist/repository-mutation/application/model/repository-path.d.ts.map +1 -0
  31. package/dist/repository-mutation/application/model/repository-path.js +74 -0
  32. package/dist/repository-mutation/application/model/repository-path.js.map +1 -0
  33. package/dist/scaffolding/adapters/node/filesystem-file-identity.d.ts +3 -23
  34. package/dist/scaffolding/adapters/node/filesystem-file-identity.d.ts.map +1 -1
  35. package/dist/scaffolding/adapters/node/filesystem-file-identity.js +1 -122
  36. package/dist/scaffolding/adapters/node/filesystem-file-identity.js.map +1 -1
  37. package/dist/scaffolding/adapters/node/filesystem-operation-state.d.ts +2 -1
  38. package/dist/scaffolding/adapters/node/filesystem-operation-state.d.ts.map +1 -1
  39. package/dist/scaffolding/adapters/node/filesystem-operation-state.js +73 -122
  40. package/dist/scaffolding/adapters/node/filesystem-operation-state.js.map +1 -1
  41. package/dist/scaffolding/adapters/node/filesystem-path-guard.d.ts.map +1 -1
  42. package/dist/scaffolding/adapters/node/filesystem-path-guard.js +27 -68
  43. package/dist/scaffolding/adapters/node/filesystem-path-guard.js.map +1 -1
  44. package/dist/scaffolding/application/policies/legacy-scaffolding-repository-path.d.ts +4 -0
  45. package/dist/scaffolding/application/policies/legacy-scaffolding-repository-path.d.ts.map +1 -0
  46. package/dist/scaffolding/application/policies/legacy-scaffolding-repository-path.js +48 -0
  47. package/dist/scaffolding/application/policies/legacy-scaffolding-repository-path.js.map +1 -0
  48. package/dist/transaction-coordination/adapters/node/installed-foundation-build-identity.js +1 -1
  49. package/dist/transaction-coordination/adapters/node/installed-foundation-build-identity.js.map +1 -1
  50. package/dist/transaction-coordination/adapters/node/node-foundation-operation-lock.d.ts.map +1 -1
  51. package/dist/transaction-coordination/adapters/node/node-foundation-operation-lock.js +1 -1
  52. package/dist/transaction-coordination/adapters/node/node-foundation-operation-lock.js.map +1 -1
  53. package/dist/transaction-coordination/adapters/node/node-foundation-transaction-slot.js +1 -1
  54. package/dist/transaction-coordination/adapters/node/node-foundation-transaction-slot.js.map +1 -1
  55. package/package.json +1 -1
@@ -0,0 +1,7 @@
1
+ import { isAbsolute, relative, sep } from "node:path";
2
+ export function isLexicallyContainedPath(root, candidate) {
3
+ const relation = relative(root, candidate);
4
+ return (relation === "" ||
5
+ (!relation.startsWith(`..${sep}`) && relation !== ".." && !isAbsolute(relation)));
6
+ }
7
+ //# sourceMappingURL=node-repository-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-repository-path.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-repository-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,SAAiB;IACtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC3C,OAAO,CACL,QAAQ,KAAK,EAAE;QACf,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CACjF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface ExactFilePostimage {
2
+ readonly bytes: Uint8Array;
3
+ readonly digest: string;
4
+ readonly mode: number;
5
+ readonly size: number;
6
+ }
7
+ export type ExactFilePostimageState = "absent" | "conflict" | "exact";
8
+ export type AbsentFilePublicationOutcome = "already-satisfied" | "published";
9
+ export type AbsentFilePublicationErrorCode = "CLEANUP_FAILED" | "CONFLICT" | "INVALID_ERROR" | "INVALID_POSTIMAGE" | "PUBLICATION_INVALID" | "PUBLICATION_INCOMPLETE" | "PUBLICATION_UNSUPPORTED" | "TEMPORARY_EXISTS" | "TEMPORARY_REPLACED" | "VERIFICATION_FAILED";
10
+ export declare class AbsentFilePublicationError extends Error {
11
+ readonly code: AbsentFilePublicationErrorCode;
12
+ readonly cleanupError: unknown;
13
+ constructor(code: AbsentFilePublicationErrorCode, message: string, options?: ErrorOptions & {
14
+ readonly cleanupError?: unknown;
15
+ });
16
+ }
17
+ //# sourceMappingURL=exact-postimage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-postimage.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/application/model/exact-postimage.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAEtE,MAAM,MAAM,4BAA4B,GAAG,mBAAmB,GAAG,WAAW,CAAC;AAE7E,MAAM,MAAM,8BAA8B,GACtC,gBAAgB,GAChB,UAAU,GACV,eAAe,GACf,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,yBAAyB,GACzB,kBAAkB,GAClB,oBAAoB,GACpB,qBAAqB,CAAC;AAE1B,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAE/B,YACE,IAAI,EAAE,8BAA8B,EACpC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,GAAG;QAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,EAM7D;CACF"}
@@ -0,0 +1,11 @@
1
+ export class AbsentFilePublicationError extends Error {
2
+ code;
3
+ cleanupError;
4
+ constructor(code, message, options) {
5
+ super(message, options);
6
+ this.name = "AbsentFilePublicationError";
7
+ this.code = code;
8
+ this.cleanupError = options?.cleanupError;
9
+ }
10
+ }
11
+ //# sourceMappingURL=exact-postimage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exact-postimage.js","sourceRoot":"","sources":["../../../../src/repository-mutation/application/model/exact-postimage.ts"],"names":[],"mappings":"AAuBA,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,IAAI,CAAiC;IACrC,YAAY,CAAU;IAE/B,YACE,IAAoC,EACpC,OAAe,EACf,OAA4D;QAE5D,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;IAC5C,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export interface PortablePathIdentity {
2
+ readonly birthtimeNs: bigint;
3
+ readonly dev: bigint;
4
+ readonly ino: bigint;
5
+ }
6
+ export type PathIdentityMatch = "different" | "match" | "missing";
7
+ //# sourceMappingURL=path-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-identity.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/application/model/path-identity.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=path-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-identity.js","sourceRoot":"","sources":["../../../../src/repository-mutation/application/model/path-identity.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export type PortableRepositoryPathProblem = "absolute" | "backslash" | "control-character" | "empty-segment" | "invalid-character" | "invalid-segment" | "path-too-long" | "reserved-name" | "segment-too-long" | "trailing-dot" | "trailing-space";
2
+ export declare function portableRepositoryPathProblem(repositoryPath: string): PortableRepositoryPathProblem | undefined;
3
+ export declare function portableRepositoryPathIdentity(repositoryPath: string): string;
4
+ export declare function findPortableRepositoryPathCollision(repositoryPaths: readonly string[]): {
5
+ readonly first: string;
6
+ readonly second: string;
7
+ } | undefined;
8
+ //# sourceMappingURL=repository-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-path.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/application/model/repository-path.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,6BAA6B,GACrC,UAAU,GACV,WAAW,GACX,mBAAmB,GACnB,eAAe,GACf,mBAAmB,GACnB,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,cAAc,GACd,gBAAgB,CAAC;AAYrB,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,GACrB,6BAA6B,GAAG,SAAS,CAiD3C;AAED,wBAAgB,8BAA8B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,mCAAmC,CACjD,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAWjE"}
@@ -0,0 +1,74 @@
1
+ const WINDOWS_RESERVED_NAMES = new Set([
2
+ "AUX",
3
+ "CON",
4
+ "NUL",
5
+ "PRN",
6
+ ...Array.from({ length: 9 }, (_unused, index) => `COM${index + 1}`),
7
+ ...Array.from({ length: 9 }, (_unused, index) => `LPT${index + 1}`)
8
+ ]);
9
+ const PORTABLE_SEGMENT = /^[A-Za-z0-9._@+-]+$/u;
10
+ function isPortableAbsolutePath(repositoryPath) {
11
+ return (repositoryPath.startsWith("/") ||
12
+ repositoryPath.startsWith("\\\\") ||
13
+ /^[A-Za-z]:[\\/]/u.test(repositoryPath));
14
+ }
15
+ export function portableRepositoryPathProblem(repositoryPath) {
16
+ if (repositoryPath.length > 512 ||
17
+ new TextEncoder().encode(repositoryPath).byteLength > 512) {
18
+ return "path-too-long";
19
+ }
20
+ if (isPortableAbsolutePath(repositoryPath)) {
21
+ return "absolute";
22
+ }
23
+ if (repositoryPath.includes("\\")) {
24
+ return "backslash";
25
+ }
26
+ const segments = repositoryPath.split("/");
27
+ for (const segment of segments) {
28
+ if (segment.length === 0) {
29
+ return "empty-segment";
30
+ }
31
+ if (segment === "." || segment === "..") {
32
+ return "invalid-segment";
33
+ }
34
+ if (segment.length > 255 ||
35
+ new TextEncoder().encode(segment).byteLength > 255) {
36
+ return "segment-too-long";
37
+ }
38
+ if (segment.endsWith(".")) {
39
+ return "trailing-dot";
40
+ }
41
+ if (segment.endsWith(" ")) {
42
+ return "trailing-space";
43
+ }
44
+ if (Array.from(segment).some((character) => {
45
+ const codePoint = character.codePointAt(0) ?? 0;
46
+ return codePoint < 32 || codePoint === 127;
47
+ })) {
48
+ return "control-character";
49
+ }
50
+ if (WINDOWS_RESERVED_NAMES.has((segment.split(".")[0] ?? "").toUpperCase())) {
51
+ return "reserved-name";
52
+ }
53
+ if (!PORTABLE_SEGMENT.test(segment)) {
54
+ return "invalid-character";
55
+ }
56
+ }
57
+ return undefined;
58
+ }
59
+ export function portableRepositoryPathIdentity(repositoryPath) {
60
+ return repositoryPath.normalize("NFC").toLowerCase();
61
+ }
62
+ export function findPortableRepositoryPathCollision(repositoryPaths) {
63
+ const observed = new Map();
64
+ for (const repositoryPath of repositoryPaths) {
65
+ const identity = portableRepositoryPathIdentity(repositoryPath);
66
+ const first = observed.get(identity);
67
+ if (first !== undefined) {
68
+ return { first, second: repositoryPath };
69
+ }
70
+ observed.set(identity, repositoryPath);
71
+ }
72
+ return undefined;
73
+ }
74
+ //# sourceMappingURL=repository-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-path.js","sourceRoot":"","sources":["../../../../src/repository-mutation/application/model/repository-path.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,4 @@
1
- import { type FileHandle } from "node:fs/promises";
2
- export interface PortableFileIdentity {
3
- readonly birthtimeNs: bigint;
4
- readonly dev: bigint;
5
- readonly ino: bigint;
6
- }
7
- export type BoundedRegularFileRead = {
8
- readonly outcome: "read";
9
- readonly bytes: Buffer;
10
- readonly identity: PortableFileIdentity;
11
- readonly mode: number;
12
- } | {
13
- readonly outcome: "changed";
14
- } | {
15
- readonly outcome: "invalid";
16
- };
17
- export type BoundedRegularFileReadFaultInjector = (point: {
18
- readonly phase: "before-stability-check";
19
- readonly path: string;
20
- }) => Promise<void> | void;
21
- export declare function readBoundedRegularFile(path: string, maximumBytes: number, faultInjector?: BoundedRegularFileReadFaultInjector): Promise<BoundedRegularFileRead>;
22
- export declare function captureFileHandleIdentity(handle: FileHandle): Promise<PortableFileIdentity>;
23
- export declare function pathMatchesFileIdentity(path: string, expected: PortableFileIdentity): Promise<"different" | "match" | "missing">;
1
+ export { captureFileHandleIdentity, pathMatchesRegularFileIdentity as pathMatchesFileIdentity, readBoundedRegularFile } from "../../../repository-mutation/adapters/node/node-bounded-regular-file.js";
2
+ export type { BoundedRegularFileRead, BoundedRegularFileReadFaultInjector } from "../../../repository-mutation/adapters/node/node-bounded-regular-file.js";
3
+ export type { PortablePathIdentity as PortableFileIdentity } from "../../../repository-mutation/application/model/path-identity.js";
24
4
  //# sourceMappingURL=filesystem-file-identity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem-file-identity.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-file-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IACE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC;AAEpC,MAAM,MAAM,mCAAmC,GAAG,CAAC,KAAK,EAAE;IACxD,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAiF3B,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,mCAAmC,GAClD,OAAO,CAAC,sBAAsB,CAAC,CAkDjC;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC,CAkB5C"}
1
+ {"version":3,"file":"filesystem-file-identity.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-file-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,8BAA8B,IAAI,uBAAuB,EACzD,sBAAsB,EACvB,MAAM,yEAAyE,CAAC;AACjF,YAAY,EACV,sBAAsB,EACtB,mCAAmC,EACpC,MAAM,yEAAyE,CAAC;AACjF,YAAY,EAAE,oBAAoB,IAAI,oBAAoB,EAAE,MAAM,iEAAiE,CAAC"}
@@ -1,123 +1,2 @@
1
- import { constants, lstat, open } from "node:fs/promises";
2
- function identityFromStat(metadata) {
3
- return {
4
- birthtimeNs: metadata.birthtimeNs,
5
- dev: metadata.dev,
6
- ino: metadata.ino
7
- };
8
- }
9
- function isMissing(error) {
10
- return (error instanceof Error &&
11
- "code" in error &&
12
- error.code === "ENOENT");
13
- }
14
- function hasErrorCode(error, code) {
15
- return (error instanceof Error &&
16
- "code" in error &&
17
- error.code === code);
18
- }
19
- async function isExistingNonRegularPath(path) {
20
- try {
21
- const metadata = await lstat(path);
22
- return metadata.isSymbolicLink() || !metadata.isFile();
23
- }
24
- catch {
25
- return false;
26
- }
27
- }
28
- function sameFileObservation(left, right) {
29
- return (left.dev === right.dev &&
30
- left.ino === right.ino &&
31
- left.birthtimeNs === right.birthtimeNs &&
32
- left.ctimeNs === right.ctimeNs &&
33
- left.mtimeNs === right.mtimeNs &&
34
- left.size === right.size);
35
- }
36
- async function readAtMost(handle, maximumBytes) {
37
- const chunks = [];
38
- let total = 0;
39
- while (total <= maximumBytes) {
40
- const remaining = maximumBytes + 1 - total;
41
- const buffer = Buffer.allocUnsafe(Math.min(64 * 1024, remaining));
42
- const { bytesRead } = await handle.read(buffer, 0, buffer.byteLength, null);
43
- if (bytesRead === 0) {
44
- return Buffer.concat(chunks, total);
45
- }
46
- chunks.push(buffer.subarray(0, bytesRead));
47
- total += bytesRead;
48
- }
49
- return undefined;
50
- }
51
- export async function readBoundedRegularFile(path, maximumBytes, faultInjector) {
52
- if (!Number.isSafeInteger(maximumBytes) || maximumBytes < 0) {
53
- throw new TypeError("maximumBytes must be a non-negative safe integer.");
54
- }
55
- if (await isExistingNonRegularPath(path)) {
56
- return { outcome: "invalid" };
57
- }
58
- const noFollow = process.platform === "win32" ? 0 : constants.O_NOFOLLOW;
59
- const nonBlocking = process.platform === "win32" ? 0 : constants.O_NONBLOCK;
60
- let handle;
61
- try {
62
- handle = await open(path, constants.O_RDONLY | noFollow | nonBlocking);
63
- }
64
- catch (error) {
65
- if (hasErrorCode(error, "ELOOP") ||
66
- (await isExistingNonRegularPath(path))) {
67
- return { outcome: "invalid" };
68
- }
69
- throw error;
70
- }
71
- try {
72
- const before = await handle.stat({ bigint: true });
73
- if (!before.isFile() || before.size > BigInt(maximumBytes)) {
74
- return { outcome: "invalid" };
75
- }
76
- const identity = identityFromStat(before);
77
- const bytes = await readAtMost(handle, maximumBytes);
78
- if (bytes === undefined) {
79
- return { outcome: "invalid" };
80
- }
81
- await faultInjector?.({ phase: "before-stability-check", path });
82
- const after = await handle.stat({ bigint: true });
83
- if (!after.isFile() ||
84
- !sameFileObservation(before, after) ||
85
- after.size !== BigInt(bytes.byteLength) ||
86
- (await pathMatchesFileIdentity(path, identity)) !== "match") {
87
- return { outcome: "changed" };
88
- }
89
- return {
90
- outcome: "read",
91
- bytes,
92
- identity,
93
- mode: Number(after.mode)
94
- };
95
- }
96
- finally {
97
- await handle.close();
98
- }
99
- }
100
- export async function captureFileHandleIdentity(handle) {
101
- return identityFromStat(await handle.stat({ bigint: true }));
102
- }
103
- export async function pathMatchesFileIdentity(path, expected) {
104
- try {
105
- const metadata = await lstat(path, { bigint: true });
106
- if (metadata.isSymbolicLink() || !metadata.isFile()) {
107
- return "different";
108
- }
109
- const observed = identityFromStat(metadata);
110
- return observed.dev === expected.dev &&
111
- observed.ino === expected.ino &&
112
- observed.birthtimeNs === expected.birthtimeNs
113
- ? "match"
114
- : "different";
115
- }
116
- catch (error) {
117
- if (isMissing(error)) {
118
- return "missing";
119
- }
120
- throw error;
121
- }
122
- }
1
+ export { captureFileHandleIdentity, pathMatchesRegularFileIdentity as pathMatchesFileIdentity, readBoundedRegularFile } from "../../../repository-mutation/adapters/node/node-bounded-regular-file.js";
123
2
  //# sourceMappingURL=filesystem-file-identity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem-file-identity.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-file-identity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filesystem-file-identity.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-file-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,8BAA8B,IAAI,uBAAuB,EACzD,sBAAsB,EACvB,MAAM,yEAAyE,CAAC"}
@@ -1,7 +1,8 @@
1
+ import { type AbsentFilePublicationFaultPoint } from "../../../repository-mutation/adapters/node/node-absent-file-publication.js";
1
2
  import type { MaterializeFileOperation } from "../../contract/scaffold-contract.js";
2
3
  export type FilesystemOperationState = "absent" | "after" | "conflict";
3
4
  interface FilesystemPublicationFaultPoint {
4
- readonly phase: "after-hard-link" | "after-temporary-synced" | "after-temporary-written";
5
+ readonly phase: AbsentFilePublicationFaultPoint["phase"];
5
6
  readonly operationIndex: number;
6
7
  readonly operationPath: string;
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem-operation-state.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-operation-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAgBpF,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvE,UAAU,+BAA+B;IACvC,QAAQ,CAAC,KAAK,EACV,iBAAiB,GACjB,wBAAwB,GACxB,yBAAyB,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,MAAM,kCAAkC,GAAG,CAC/C,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAkB1B,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,wBAAwB,GAClC,OAAO,CAAC,wBAAwB,CAAC,CAwBnC;AAYD,wBAAsB,kCAAkC,CACtD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,wBAAwB,EAAE,CAAA;CAAE,GAC9F,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,wBAAwB,EACnC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,kCAAkC,GACjD,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAuH1C"}
1
+ {"version":3,"file":"filesystem-operation-state.d.ts","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-operation-state.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,+BAA+B,EACrC,MAAM,4EAA4E,CAAC;AAEpF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AASpF,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvE,UAAU,+BAA+B;IACvC,QAAQ,CAAC,KAAK,EAAE,+BAA+B,CAAC,OAAO,CAAC,CAAC;IACzD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,MAAM,kCAAkC,GAAG,CAC/C,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAW1B,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,wBAAwB,GAClC,OAAO,CAAC,wBAAwB,CAAC,CAOnC;AAYD,wBAAsB,kCAAkC,CACtD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IACJ,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC1D,GACA,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAyDD,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,wBAAwB,EACnC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,kCAAkC,GACjD,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAwC1C"}
@@ -1,58 +1,74 @@
1
- import { link, lstat, open, rm } from "node:fs/promises";
2
1
  import { basename, dirname, join, resolve } from "node:path";
3
- import { sha256Bytes, sha256Text } from "../../kernel/canonical-json.js";
2
+ import { assertTemporaryPathsAbsent, classifyExactFilePostimage, publishAbsentFile } from "../../../repository-mutation/adapters/node/node-absent-file-publication.js";
3
+ import { AbsentFilePublicationError } from "../../../repository-mutation/application/model/exact-postimage.js";
4
+ import { sha256Text } from "../../kernel/canonical-json.js";
4
5
  import { ScaffoldError } from "../../scaffold-error.js";
5
- import { assertSafeExistingAncestors, ensureSafeParent, isContainedPath, syncDirectory } from "./filesystem-path-guard.js";
6
- import { captureFileHandleIdentity, pathMatchesFileIdentity, readBoundedRegularFile } from "./filesystem-file-identity.js";
7
- function isMissing(error) {
8
- return (error instanceof Error &&
9
- "code" in error &&
10
- error.code === "ENOENT");
11
- }
12
- function hasErrorCode(error, code) {
13
- return (error instanceof Error &&
14
- "code" in error &&
15
- error.code === code);
6
+ import { assertSafeExistingAncestors, ensureSafeParent, isContainedPath } from "./filesystem-path-guard.js";
7
+ function postimage(operation) {
8
+ return {
9
+ bytes: Buffer.from(operation.after.contentBase64, "base64"),
10
+ digest: operation.after.digest,
11
+ mode: 0o644,
12
+ size: operation.after.size
13
+ };
16
14
  }
17
15
  export async function classifyFilesystemOperation(root, operation) {
18
16
  const destination = resolve(root, operation.path);
19
17
  if (!isContainedPath(root, destination)) {
20
18
  return "conflict";
21
19
  }
22
- try {
23
- const result = await readBoundedRegularFile(destination, operation.after.size);
24
- if (result.outcome !== "read") {
25
- return "conflict";
26
- }
27
- const modeMatches = process.platform === "win32" || (result.mode & 0o777) === 0o644;
28
- return sha256Bytes(result.bytes) === operation.after.digest && modeMatches
29
- ? "after"
30
- : "conflict";
31
- }
32
- catch (error) {
33
- if (isMissing(error)) {
34
- return "absent";
35
- }
36
- throw error;
37
- }
20
+ const state = await classifyExactFilePostimage(destination, postimage(operation));
21
+ return state === "exact" ? "after" : state;
38
22
  }
39
23
  function transactionTemporaryName(planDigest, operation) {
40
24
  const identity = sha256Text(`${planDigest}:${operation.id}`).slice("sha256:".length);
41
25
  return `.foundation-${identity}.tmp`;
42
26
  }
43
27
  export async function assertTransactionTemporariesAbsent(root, plan) {
44
- for (const operation of plan.operations) {
45
- const parent = dirname(resolve(root, operation.path));
46
- const temporary = join(parent, transactionTemporaryName(plan.planDigest, operation));
47
- const metadata = await lstat(temporary).catch((error) => {
48
- if (isMissing(error)) {
49
- return null;
50
- }
51
- throw error;
52
- });
53
- if (metadata !== null) {
54
- throw new ScaffoldError("SCAFFOLD_APPLY_CONFLICT", `Scaffolding transaction temporary path already exists: ${operation.path}.`);
28
+ try {
29
+ await assertTemporaryPathsAbsent(plan.operations.map((operation) => {
30
+ const parent = dirname(resolve(root, operation.path));
31
+ return {
32
+ displayPath: operation.path,
33
+ temporaryPath: join(parent, transactionTemporaryName(plan.planDigest, operation))
34
+ };
35
+ }));
36
+ }
37
+ catch (error) {
38
+ if (error instanceof AbsentFilePublicationError &&
39
+ error.code === "TEMPORARY_EXISTS") {
40
+ const operationPath = error.message.slice("Temporary path already exists: ".length, -1);
41
+ throw new ScaffoldError("SCAFFOLD_APPLY_CONFLICT", `Scaffolding transaction temporary path already exists: ${operationPath}.`);
55
42
  }
43
+ throw error;
44
+ }
45
+ }
46
+ function translatePublicationError(error, operation) {
47
+ if (!(error instanceof AbsentFilePublicationError)) {
48
+ throw error;
49
+ }
50
+ const causeOptions = error.cause === undefined ? undefined : { cause: error.cause };
51
+ switch (error.code) {
52
+ case "CONFLICT":
53
+ throw new ScaffoldError("SCAFFOLD_APPLY_CONFLICT", `Scaffolding output changed concurrently: ${operation.path}.`, [], causeOptions);
54
+ case "TEMPORARY_EXISTS":
55
+ throw new ScaffoldError("SCAFFOLD_APPLY_CONFLICT", `Scaffolding transaction temporary path already exists: ${operation.path}.`, [], causeOptions);
56
+ case "TEMPORARY_REPLACED":
57
+ throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Scaffolding temporary path was replaced concurrently: ${operation.path}.`);
58
+ case "CLEANUP_FAILED":
59
+ // Preserve the frozen scaffolding contract: cleanup failures were exposed
60
+ // directly before publication mechanics moved into the neutral kernel.
61
+ throw error.cleanupError;
62
+ case "INVALID_ERROR":
63
+ case "INVALID_POSTIMAGE":
64
+ case "PUBLICATION_INVALID":
65
+ throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Scaffolding publication failed with an invalid error value: ${operation.path}.`);
66
+ case "PUBLICATION_INCOMPLETE":
67
+ throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Scaffolding publication did not reach a terminal state: ${operation.path}.`);
68
+ case "VERIFICATION_FAILED":
69
+ throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Published scaffolding output failed digest verification: ${operation.path}.`);
70
+ case "PUBLICATION_UNSUPPORTED":
71
+ throw error.cause instanceof Error ? error.cause : error;
56
72
  }
57
73
  }
58
74
  export async function publishFilesystemOperation(root, operation, planDigest, operationIndex, faultInjector) {
@@ -67,92 +83,27 @@ export async function publishFilesystemOperation(root, operation, planDigest, op
67
83
  const parent = await ensureSafeParent(root, operation.path);
68
84
  const destination = join(parent, basename(operation.path));
69
85
  const temporary = join(parent, transactionTemporaryName(planDigest, operation));
70
- const bytes = Buffer.from(operation.after.contentBase64, "base64");
71
- let temporaryIdentity;
72
- let concurrentSatisfied = false;
73
- let published = false;
74
- let publicationError;
75
86
  try {
76
- const handle = await open(temporary, "wx", 0o600).catch((error) => {
77
- if (hasErrorCode(error, "EEXIST")) {
78
- throw new ScaffoldError("SCAFFOLD_APPLY_CONFLICT", `Scaffolding transaction temporary path already exists: ${operation.path}.`, [], { cause: error });
79
- }
80
- throw error;
81
- });
82
- try {
83
- await handle.writeFile(bytes);
84
- await faultInjector?.({
85
- phase: "after-temporary-written",
86
- operationIndex,
87
- operationPath: operation.path
88
- });
89
- await handle.chmod(0o644);
90
- await handle.sync();
91
- temporaryIdentity = await captureFileHandleIdentity(handle);
92
- }
93
- finally {
94
- await handle.close();
95
- }
96
- await faultInjector?.({
97
- phase: "after-temporary-synced",
98
- operationIndex,
99
- operationPath: operation.path
87
+ const outcome = await publishAbsentFile({
88
+ allowUnsupportedDirectoryDurability: true,
89
+ destinationPath: destination,
90
+ displayPath: operation.path,
91
+ ...(faultInjector === undefined
92
+ ? {}
93
+ : {
94
+ faultInjector: async (point) => faultInjector({
95
+ ...point,
96
+ operationIndex,
97
+ operationPath: operation.path
98
+ })
99
+ }),
100
+ postimage: postimage(operation),
101
+ temporaryPath: temporary
100
102
  });
101
- try {
102
- await link(temporary, destination);
103
- }
104
- catch (error) {
105
- if (hasErrorCode(error, "EEXIST")) {
106
- const concurrentState = await classifyFilesystemOperation(root, operation);
107
- if (concurrentState === "after") {
108
- concurrentSatisfied = true;
109
- }
110
- else {
111
- throw new ScaffoldError("SCAFFOLD_APPLY_CONFLICT", `Scaffolding output changed concurrently: ${operation.path}.`, [], { cause: error });
112
- }
113
- }
114
- else {
115
- throw error;
116
- }
117
- }
118
- if (!concurrentSatisfied) {
119
- published = true;
120
- await faultInjector?.({
121
- phase: "after-hard-link",
122
- operationIndex,
123
- operationPath: operation.path
124
- });
125
- await syncDirectory(parent);
126
- }
103
+ return outcome === "published" ? "applied" : "already-satisfied";
127
104
  }
128
105
  catch (error) {
129
- publicationError = error;
130
- }
131
- const temporaryOwnership = temporaryIdentity === undefined
132
- ? "missing"
133
- : await pathMatchesFileIdentity(temporary, temporaryIdentity);
134
- if (temporaryOwnership === "match") {
135
- await rm(temporary);
136
- await syncDirectory(parent);
137
- }
138
- else if (temporaryOwnership === "different") {
139
- throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Scaffolding temporary path was replaced concurrently: ${operation.path}.`);
140
- }
141
- if (publicationError !== undefined) {
142
- if (!(publicationError instanceof Error)) {
143
- throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Scaffolding publication failed with an invalid error value: ${operation.path}.`);
144
- }
145
- throw publicationError;
146
- }
147
- if (concurrentSatisfied) {
148
- return "already-satisfied";
149
- }
150
- if (!published) {
151
- throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Scaffolding publication did not reach a terminal state: ${operation.path}.`);
152
- }
153
- if ((await classifyFilesystemOperation(root, operation)) !== "after") {
154
- throw new ScaffoldError("SCAFFOLD_RECOVERY_REQUIRED", `Published scaffolding output failed digest verification: ${operation.path}.`);
106
+ translatePublicationError(error, operation);
155
107
  }
156
- return "applied";
157
108
  }
158
109
  //# sourceMappingURL=filesystem-operation-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem-operation-state.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-operation-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filesystem-operation-state.js","sourceRoot":"","sources":["../../../../src/scaffolding/adapters/node/filesystem-operation-state.ts"],"names":[],"mappings":"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"}