@agent-teams/engineering-foundation 0.17.0-rc.0 → 0.17.0-rc.2
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.
- package/README.md +11 -0
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/changesets-prerelease-state.d.ts +10 -0
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/changesets-prerelease-state.d.ts.map +1 -0
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/changesets-prerelease-state.js +69 -0
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/changesets-prerelease-state.js.map +1 -0
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.js +27 -7
- package/dist/capabilities/public-api-compatibility/adapters/outbound/filesystem/filesystem-public-api-repository.js.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/model/public-api.d.ts +2 -0
- package/dist/capabilities/public-api-compatibility/application/model/public-api.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.d.ts.map +1 -1
- package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.js +21 -3
- package/dist/capabilities/public-api-compatibility/application/use-cases/promote-public-api-baselines.js.map +1 -1
- package/dist/document-authoring/composition/inspect-document-transaction.d.ts.map +1 -1
- package/dist/document-authoring/composition/inspect-document-transaction.js +11 -12
- package/dist/document-authoring/composition/inspect-document-transaction.js.map +1 -1
- package/dist/foundation-state-contract.d.ts +1 -0
- package/dist/foundation-state-contract.d.ts.map +1 -1
- package/dist/foundation-state-contract.js +1 -0
- package/dist/foundation-state-contract.js.map +1 -1
- package/dist/local-mode/inspection.d.ts.map +1 -1
- package/dist/local-mode/inspection.js +11 -1
- package/dist/local-mode/inspection.js.map +1 -1
- package/dist/mutation/index.d.ts +8 -0
- package/dist/mutation/index.d.ts.map +1 -1
- package/dist/mutation/index.js +4 -1
- package/dist/mutation/index.js.map +1 -1
- package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts +2 -0
- package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts.map +1 -1
- package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js +31 -23
- package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js.map +1 -1
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.d.ts +28 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.js +194 -0
- package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.d.ts +25 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.js +129 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.d.ts +12 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.js +46 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.d.ts +21 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.js +178 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.d.ts +4 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.js +43 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts +11 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js +888 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts +20 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts.map +1 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction.js +546 -0
- package/dist/repository-mutation/adapters/node/node-known-file-transaction.js.map +1 -0
- package/dist/repository-mutation/application/model/known-file-transaction-journal.d.ts +63 -0
- package/dist/repository-mutation/application/model/known-file-transaction-journal.d.ts.map +1 -0
- package/dist/repository-mutation/application/model/known-file-transaction-journal.js +15 -0
- package/dist/repository-mutation/application/model/known-file-transaction-journal.js.map +1 -0
- package/dist/repository-mutation/application/model/known-file-transaction.d.ts +64 -0
- package/dist/repository-mutation/application/model/known-file-transaction.d.ts.map +1 -0
- package/dist/repository-mutation/application/model/known-file-transaction.js +2 -0
- package/dist/repository-mutation/application/model/known-file-transaction.js.map +1 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-envelope.d.ts +8 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-envelope.d.ts.map +1 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-envelope.js +241 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-envelope.js.map +1 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-plan.d.ts +7 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-plan.d.ts.map +1 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-plan.js +215 -0
- package/dist/repository-mutation/application/policies/known-file-transaction-plan.js.map +1 -0
- package/dist/schema-catalog.d.ts.map +1 -1
- package/dist/schema-catalog.js +3 -0
- package/dist/schema-catalog.js.map +1 -1
- package/dist/schema-ids.d.ts +1 -1
- package/dist/schema-ids.d.ts.map +1 -1
- package/dist/schema-ids.js +3 -0
- package/dist/schema-ids.js.map +1 -1
- package/dist/semantic-version.d.ts +1 -0
- package/dist/semantic-version.d.ts.map +1 -1
- package/dist/semantic-version.js +11 -0
- package/dist/semantic-version.js.map +1 -1
- package/dist/transaction-coordination/adapters/node/document-transaction-status.d.ts +9 -0
- package/dist/transaction-coordination/adapters/node/document-transaction-status.d.ts.map +1 -0
- package/dist/transaction-coordination/adapters/node/document-transaction-status.js +26 -0
- package/dist/transaction-coordination/adapters/node/document-transaction-status.js.map +1 -0
- package/dist/transaction-coordination/adapters/node/known-file-transaction-status.d.ts +8 -0
- package/dist/transaction-coordination/adapters/node/known-file-transaction-status.d.ts.map +1 -0
- package/dist/transaction-coordination/adapters/node/known-file-transaction-status.js +50 -0
- package/dist/transaction-coordination/adapters/node/known-file-transaction-status.js.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-foundation-transaction-slot.d.ts.map +1 -1
- package/dist/transaction-coordination/adapters/node/node-foundation-transaction-slot.js +33 -37
- package/dist/transaction-coordination/adapters/node/node-foundation-transaction-slot.js.map +1 -1
- package/dist/transaction-coordination/application/foundation-transaction-coordinator.d.ts +1 -1
- package/dist/transaction-coordination/application/foundation-transaction-coordinator.d.ts.map +1 -1
- package/dist/transaction-coordination/application/foundation-transaction-coordinator.js +12 -1
- package/dist/transaction-coordination/application/foundation-transaction-coordinator.js.map +1 -1
- package/dist/transaction-coordination/application/model/internal-transaction-status.d.ts +14 -2
- package/dist/transaction-coordination/application/model/internal-transaction-status.d.ts.map +1 -1
- package/dist/transaction-coordination/application/model/transaction-status.d.ts +6 -2
- package/dist/transaction-coordination/application/model/transaction-status.d.ts.map +1 -1
- package/package.json +4 -1
- package/schemas/foundation-transaction-envelope/v5.schema.json +94 -0
- package/schemas/known-file-transaction-plan/v1.schema.json +65 -0
- package/schemas/known-file-transaction-receipt/v1.schema.json +36 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-bounded-regular-file.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-bounded-regular-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,0CAA0C,CAAC;AAElD,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;
|
|
1
|
+
{"version":3,"file":"node-bounded-regular-file.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-bounded-regular-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,0CAA0C,CAAC;AAElD,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,SAAS,EAAE,MAAM,CAAC;IAC3B,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;AAmF3B,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,mCAAmC,GAClD,OAAO,CAAC,sBAAsB,CAAC,CA0BjC;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,mCAAmC,GAClD,OAAO,CAAC,sBAAsB,CAAC,CA8BjC;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AAED,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAkB5B"}
|
|
@@ -31,6 +31,7 @@ function sameFileObservation(left, right) {
|
|
|
31
31
|
left.birthtimeNs === right.birthtimeNs &&
|
|
32
32
|
left.ctimeNs === right.ctimeNs &&
|
|
33
33
|
left.mtimeNs === right.mtimeNs &&
|
|
34
|
+
left.nlink === right.nlink &&
|
|
34
35
|
left.size === right.size);
|
|
35
36
|
}
|
|
36
37
|
async function readAtMost(handle, maximumBytes) {
|
|
@@ -69,34 +70,41 @@ export async function readBoundedRegularFile(path, maximumBytes, faultInjector)
|
|
|
69
70
|
throw error;
|
|
70
71
|
}
|
|
71
72
|
try {
|
|
72
|
-
|
|
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 pathMatchesRegularFileIdentity(path, identity)) !== "match") {
|
|
87
|
-
return { outcome: "changed" };
|
|
88
|
-
}
|
|
89
|
-
return {
|
|
90
|
-
outcome: "read",
|
|
91
|
-
bytes,
|
|
92
|
-
identity,
|
|
93
|
-
mode: Number(after.mode)
|
|
94
|
-
};
|
|
73
|
+
return await readBoundedRegularFileHandle(handle, path, maximumBytes, faultInjector);
|
|
95
74
|
}
|
|
96
75
|
finally {
|
|
97
76
|
await handle.close();
|
|
98
77
|
}
|
|
99
78
|
}
|
|
79
|
+
export async function readBoundedRegularFileHandle(handle, path, maximumBytes, faultInjector) {
|
|
80
|
+
if (!Number.isSafeInteger(maximumBytes) || maximumBytes < 0) {
|
|
81
|
+
throw new TypeError("maximumBytes must be a non-negative safe integer.");
|
|
82
|
+
}
|
|
83
|
+
const before = await handle.stat({ bigint: true });
|
|
84
|
+
if (!before.isFile() || before.size > BigInt(maximumBytes)) {
|
|
85
|
+
return { outcome: "invalid" };
|
|
86
|
+
}
|
|
87
|
+
const identity = identityFromStat(before);
|
|
88
|
+
const bytes = await readAtMost(handle, maximumBytes);
|
|
89
|
+
if (bytes === undefined) {
|
|
90
|
+
return { outcome: "invalid" };
|
|
91
|
+
}
|
|
92
|
+
await faultInjector?.({ phase: "before-stability-check", path });
|
|
93
|
+
const after = await handle.stat({ bigint: true });
|
|
94
|
+
if (!after.isFile() ||
|
|
95
|
+
!sameFileObservation(before, after) ||
|
|
96
|
+
after.size !== BigInt(bytes.byteLength) ||
|
|
97
|
+
(await pathMatchesRegularFileIdentity(path, identity)) !== "match") {
|
|
98
|
+
return { outcome: "changed" };
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
outcome: "read",
|
|
102
|
+
bytes,
|
|
103
|
+
identity,
|
|
104
|
+
linkCount: after.nlink,
|
|
105
|
+
mode: Number(after.mode)
|
|
106
|
+
};
|
|
107
|
+
}
|
|
100
108
|
export async function captureFileHandleIdentity(handle) {
|
|
101
109
|
return identityFromStat(await handle.stat({ bigint: true }));
|
|
102
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-bounded-regular-file.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-bounded-regular-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"node-bounded-regular-file.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-bounded-regular-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AAuB3E,SAAS,gBAAgB,CAAC,QAIzB;IACC,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,GAAG,EAAE,QAAQ,CAAC,GAAG;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,MAAM,IAAI,KAAK;QACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,CACnD,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,IAAY;IAChD,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,MAAM,IAAI,KAAK;QACd,KAA+B,CAAC,IAAI,KAAK,IAAI,CAC/C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,IAAY;IAClD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAYD,SAAS,mBAAmB,CAC1B,IAA2B,EAC3B,KAA4B;IAE5B,OAAO,CACL,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QACtB,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QACtB,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;QACtC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAC9B,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAC9B,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAC1B,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CACzB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAkB,EAClB,YAAoB;IAEpB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,IAAI,YAAY,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5E,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAC3C,KAAK,IAAI,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY,EACZ,YAAoB,EACpB,aAAmD;IAEnD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,MAAM,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAChC,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;IACzE,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;IAC5E,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;YAC5B,CAAC,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAC,EACtC,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAChC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,4BAA4B,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IACvF,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAkB,EAClB,IAAY,EACZ,YAAoB,EACpB,aAAmD;IAEnD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAChC,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAChC,CAAC;IACD,MAAM,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,IACE,CAAC,KAAK,CAAC,MAAM,EAAE;QACf,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC;QACnC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QACvC,CAAC,MAAM,8BAA8B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,OAAO,EAClE,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAChC,CAAC;IACD,OAAO;QACL,OAAO,EAAE,MAAM;QACf,KAAK;QACL,QAAQ;QACR,SAAS,EAAE,KAAK,CAAC,KAAK;QACtB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAkB;IAElB,OAAO,gBAAgB,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,IAAY,EACZ,QAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;YAClC,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;YAC7B,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW;YAC7C,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,WAAW,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { KnownFileImageV1 } from "../../application/model/known-file-transaction.js";
|
|
2
|
+
import type { KnownFileTransactionJournalV1 } from "../../application/model/known-file-transaction-journal.js";
|
|
3
|
+
import { deserializeKnownFileIdentity } from "../../application/model/known-file-transaction-journal.js";
|
|
4
|
+
import { captureFileHandleIdentity } from "./node-bounded-regular-file.js";
|
|
5
|
+
import { type ObservedKnownFile } from "./node-known-file-transaction-filesystem.js";
|
|
6
|
+
export declare function knownFileCapturePaths(options: {
|
|
7
|
+
readonly operationPath: string;
|
|
8
|
+
readonly operationIndex: number;
|
|
9
|
+
readonly parent: string;
|
|
10
|
+
readonly planDigest: string;
|
|
11
|
+
}): {
|
|
12
|
+
readonly captured: string;
|
|
13
|
+
readonly directory: string;
|
|
14
|
+
readonly retired: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function cleanupCommittedKnownFileCaptures(root: string, journal: KnownFileTransactionJournalV1, faultInjector?: (point: {
|
|
17
|
+
readonly operationIndex: number;
|
|
18
|
+
readonly path: string;
|
|
19
|
+
readonly phase: "after-committed-capture-unlinked";
|
|
20
|
+
}) => Promise<void> | void): Promise<void>;
|
|
21
|
+
export declare function observeRecoveryFile(path: string, maximumBytes: number): Promise<ObservedKnownFile>;
|
|
22
|
+
export declare function prepareRollbackTemporary(options: {
|
|
23
|
+
readonly expectedIdentity?: ReturnType<typeof deserializeKnownFileIdentity>;
|
|
24
|
+
readonly operationPath: string;
|
|
25
|
+
readonly path: string;
|
|
26
|
+
readonly preimage: KnownFileImageV1;
|
|
27
|
+
}): Promise<Awaited<ReturnType<typeof captureFileHandleIdentity>>>;
|
|
28
|
+
//# sourceMappingURL=node-known-file-recovery-filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-known-file-recovery-filesystem.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-recovery-filesystem.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2DAA2D,CAAC;AAC/G,OAAO,EAAE,4BAA4B,EAAE,MAAM,2DAA2D,CAAC;AACzG,OAAO,EACL,yBAAyB,EAG1B,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,6CAA6C,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAWtF;AAuBD,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,6BAA6B,EACtC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,kCAAkC,CAAC;CACpD,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACzB,OAAO,CAAC,IAAI,CAAC,CA6Ff;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAoB5B;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE;IACtD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;IAC5E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;CACrC,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,CAuFjE"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { constants, lstat, open, readdir, rmdir, unlink } from "node:fs/promises";
|
|
2
|
+
import { basename, dirname, join } from "node:path";
|
|
3
|
+
import { deserializeKnownFileIdentity } from "../../application/model/known-file-transaction-journal.js";
|
|
4
|
+
import { captureFileHandleIdentity, readBoundedRegularFile, readBoundedRegularFileHandle } from "./node-bounded-regular-file.js";
|
|
5
|
+
import { syncDirectoryStrictly } from "./node-directory-durability.js";
|
|
6
|
+
import { knownFileErrorCode, knownFileCaptureDirectoryName, knownFileImageBytes, KnownFileTransactionError, matchesKnownFileImage, sameKnownFileIdentity } from "./node-known-file-transaction-filesystem.js";
|
|
7
|
+
export function knownFileCapturePaths(options) {
|
|
8
|
+
const directory = join(options.parent, knownFileCaptureDirectoryName(options.operationPath, options.planDigest, options.operationIndex));
|
|
9
|
+
return {
|
|
10
|
+
captured: join(directory, "preimage"),
|
|
11
|
+
directory,
|
|
12
|
+
retired: join(directory, "retired")
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
async function assertCaptureDirectoryIdentity(path, expected, displayPath) {
|
|
16
|
+
const metadata = await lstat(path, { bigint: true }).catch((error) => {
|
|
17
|
+
if (knownFileErrorCode(error) === "ENOENT") {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
throw error;
|
|
21
|
+
});
|
|
22
|
+
if (metadata === null) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink() ||
|
|
26
|
+
metadata.birthtimeNs !== expected.birthtimeNs || metadata.dev !== expected.dev ||
|
|
27
|
+
metadata.ino !== expected.ino) {
|
|
28
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Transaction capture directory changed: ${displayPath}.`);
|
|
29
|
+
}
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
export async function cleanupCommittedKnownFileCaptures(root, journal, faultInjector) {
|
|
33
|
+
for (const [index, journalOperation] of journal.operations.entries()) {
|
|
34
|
+
if (!("temporaryIdentity" in journalOperation) ||
|
|
35
|
+
journalOperation.captureDirectoryIdentity === undefined) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const operation = journal.plan.operations[index];
|
|
39
|
+
const parent = dirname(join(root, ...operation.path.split("/")));
|
|
40
|
+
const paths = knownFileCapturePaths({
|
|
41
|
+
operationIndex: index,
|
|
42
|
+
operationPath: operation.path,
|
|
43
|
+
parent,
|
|
44
|
+
planDigest: journal.plan.planDigest
|
|
45
|
+
});
|
|
46
|
+
if (operation.precondition.state !== "known-file" ||
|
|
47
|
+
journalOperation.matchedPreimage === undefined) {
|
|
48
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Committed replacement lacks exact preimage authority: ${operation.path}.`);
|
|
49
|
+
}
|
|
50
|
+
const preimage = operation.precondition.acceptedPreimages[journalOperation.matchedPreimage];
|
|
51
|
+
if (journalOperation.rollbackTemporaryIdentity !== undefined) {
|
|
52
|
+
const rollbackPath = join(parent, `.${basename(operation.path)}.agent-teams.rollback.${index}.tmp`);
|
|
53
|
+
const rollback = await observeRecoveryFile(rollbackPath, preimage.size);
|
|
54
|
+
if (rollback.state === "file") {
|
|
55
|
+
const expectedRollback = deserializeKnownFileIdentity(journalOperation.rollbackTemporaryIdentity);
|
|
56
|
+
if (rollback.identity === undefined ||
|
|
57
|
+
!sameKnownFileIdentity(rollback.identity, expectedRollback) ||
|
|
58
|
+
!matchesKnownFileImage(rollback, preimage)) {
|
|
59
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Committed rollback copy changed: ${operation.path}.`);
|
|
60
|
+
}
|
|
61
|
+
await unlink(rollbackPath);
|
|
62
|
+
await syncDirectoryStrictly(parent);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const expectedDirectory = deserializeKnownFileIdentity(journalOperation.captureDirectoryIdentity);
|
|
66
|
+
const directoryExists = await assertCaptureDirectoryIdentity(paths.directory, expectedDirectory, operation.path);
|
|
67
|
+
if (!directoryExists) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const entries = (await readdir(paths.directory)).toSorted();
|
|
71
|
+
if (entries.length === 0) {
|
|
72
|
+
await rmdir(paths.directory);
|
|
73
|
+
await syncDirectoryStrictly(parent);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (journalOperation.capturedPreimageIdentity === undefined) {
|
|
77
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Committed replacement lacks captured preimage authority: ${operation.path}.`);
|
|
78
|
+
}
|
|
79
|
+
const captured = await readBoundedRegularFile(paths.captured, operation.precondition.acceptedPreimages[journalOperation.matchedPreimage].size);
|
|
80
|
+
const expectedCaptured = deserializeKnownFileIdentity(journalOperation.capturedPreimageIdentity);
|
|
81
|
+
if (captured.outcome !== "read" ||
|
|
82
|
+
!sameKnownFileIdentity(captured.identity, expectedCaptured) ||
|
|
83
|
+
!matchesKnownFileImage({
|
|
84
|
+
state: "file", bytes: captured.bytes, identity: captured.identity,
|
|
85
|
+
mode: captured.mode & 0o777
|
|
86
|
+
}, preimage)) {
|
|
87
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Committed captured preimage changed: ${operation.path}.`);
|
|
88
|
+
}
|
|
89
|
+
if (entries.join(",") !== "preimage") {
|
|
90
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Committed capture directory contains foreign evidence: ${operation.path}.`);
|
|
91
|
+
}
|
|
92
|
+
await unlink(paths.captured);
|
|
93
|
+
await syncDirectoryStrictly(paths.directory);
|
|
94
|
+
await faultInjector?.({
|
|
95
|
+
operationIndex: index,
|
|
96
|
+
path: operation.path,
|
|
97
|
+
phase: "after-committed-capture-unlinked"
|
|
98
|
+
});
|
|
99
|
+
await rmdir(paths.directory);
|
|
100
|
+
await syncDirectoryStrictly(parent);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export async function observeRecoveryFile(path, maximumBytes) {
|
|
104
|
+
let observed;
|
|
105
|
+
try {
|
|
106
|
+
observed = await readBoundedRegularFile(path, maximumBytes);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (knownFileErrorCode(error) === "ENOENT") {
|
|
110
|
+
return { state: "absent" };
|
|
111
|
+
}
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
if (observed.outcome !== "read") {
|
|
115
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", "Recovery path is not one stable bounded regular file.");
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
state: "file",
|
|
119
|
+
bytes: observed.bytes,
|
|
120
|
+
identity: observed.identity,
|
|
121
|
+
mode: observed.mode & 0o777
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export async function prepareRollbackTemporary(options) {
|
|
125
|
+
let handle;
|
|
126
|
+
let rollbackIdentity;
|
|
127
|
+
let created = false;
|
|
128
|
+
try {
|
|
129
|
+
handle = await open(options.path, "wx", 0o600);
|
|
130
|
+
created = true;
|
|
131
|
+
rollbackIdentity = await captureFileHandleIdentity(handle);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (knownFileErrorCode(error) !== "EEXIST") {
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
if (options.expectedIdentity === undefined) {
|
|
138
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Rollback temporary exists without durable identity authority: ${options.operationPath}.`);
|
|
139
|
+
}
|
|
140
|
+
const noFollow = process.platform === "win32" ? 0 : constants.O_NOFOLLOW;
|
|
141
|
+
handle = await open(options.path, constants.O_RDWR | noFollow);
|
|
142
|
+
try {
|
|
143
|
+
const stale = await readBoundedRegularFileHandle(handle, options.path, options.preimage.size);
|
|
144
|
+
if (stale.outcome !== "read" || !matchesKnownFileImage({
|
|
145
|
+
state: "file", bytes: stale.bytes, identity: stale.identity,
|
|
146
|
+
mode: stale.mode & 0o777
|
|
147
|
+
}, options.preimage)) {
|
|
148
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Rollback temporary is foreign or modified: ${options.operationPath}.`);
|
|
149
|
+
}
|
|
150
|
+
rollbackIdentity = await captureFileHandleIdentity(handle);
|
|
151
|
+
if (!sameKnownFileIdentity(rollbackIdentity, stale.identity) ||
|
|
152
|
+
!sameKnownFileIdentity(rollbackIdentity, options.expectedIdentity)) {
|
|
153
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Rollback temporary changed while it was opened: ${options.operationPath}.`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (inspectionError) {
|
|
157
|
+
await handle.close();
|
|
158
|
+
throw inspectionError;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (created) {
|
|
162
|
+
try {
|
|
163
|
+
const bytes = knownFileImageBytes(options.preimage);
|
|
164
|
+
await handle.truncate(0);
|
|
165
|
+
let offset = 0;
|
|
166
|
+
while (offset < bytes.byteLength) {
|
|
167
|
+
const { bytesWritten } = await handle.write(bytes, offset, bytes.byteLength - offset, offset);
|
|
168
|
+
if (bytesWritten === 0) {
|
|
169
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_FAILED", `Rollback temporary write made no progress: ${options.operationPath}.`);
|
|
170
|
+
}
|
|
171
|
+
offset += bytesWritten;
|
|
172
|
+
}
|
|
173
|
+
await handle.chmod(options.preimage.mode);
|
|
174
|
+
await handle.sync();
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
await handle.close();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
await handle.close();
|
|
182
|
+
}
|
|
183
|
+
const prepared = await readBoundedRegularFile(options.path, options.preimage.size);
|
|
184
|
+
if (prepared.outcome !== "read" ||
|
|
185
|
+
!sameKnownFileIdentity(prepared.identity, rollbackIdentity) ||
|
|
186
|
+
!matchesKnownFileImage({
|
|
187
|
+
state: "file", bytes: prepared.bytes, identity: prepared.identity,
|
|
188
|
+
mode: prepared.mode & 0o777
|
|
189
|
+
}, options.preimage)) {
|
|
190
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Rollback temporary changed before publication: ${options.operationPath}.`);
|
|
191
|
+
}
|
|
192
|
+
return rollbackIdentity;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=node-known-file-recovery-filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-known-file-recovery-filesystem.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-recovery-filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { KnownFileImageV1, KnownFileTransactionPlanV1 } from "../../application/model/known-file-transaction.js";
|
|
2
|
+
import type { KnownFileTransactionJournalOperationV1 } from "../../application/model/known-file-transaction-journal.js";
|
|
3
|
+
import { captureFileHandleIdentity } from "./node-bounded-regular-file.js";
|
|
4
|
+
export declare class KnownFileTransactionError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
constructor(code: string, message: string, options?: ErrorOptions);
|
|
7
|
+
}
|
|
8
|
+
export interface ObservedKnownFile {
|
|
9
|
+
readonly state: "absent" | "file";
|
|
10
|
+
readonly bytes?: Buffer;
|
|
11
|
+
readonly identity?: Awaited<ReturnType<typeof captureFileHandleIdentity>>;
|
|
12
|
+
readonly mode?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function knownFileErrorCode(error: unknown): string | undefined;
|
|
15
|
+
export declare function sameKnownFileIdentity(left: Awaited<ReturnType<typeof captureFileHandleIdentity>>, right: Awaited<ReturnType<typeof captureFileHandleIdentity>>): boolean;
|
|
16
|
+
export declare function knownFileImageBytes(image: KnownFileImageV1): Buffer;
|
|
17
|
+
export declare function matchesKnownFileImage(observed: ObservedKnownFile, image: KnownFileImageV1): boolean;
|
|
18
|
+
export declare function knownFileTemporaryName(path: string, planDigest: string, operationIndex: number): string;
|
|
19
|
+
export declare function knownFileCaptureDirectoryName(path: string, planDigest: string, operationIndex: number): string;
|
|
20
|
+
export declare function canonicalKnownFileRoot(consumerRoot: string): Promise<string>;
|
|
21
|
+
export declare function knownFileAliasEntry(parent: string, requested: string): Promise<string | undefined>;
|
|
22
|
+
export declare function observeKnownFile(root: string, repositoryPath: string, maximumBytes: number): Promise<ObservedKnownFile>;
|
|
23
|
+
export declare function maximumKnownFileEvidenceBytes(operation: KnownFileTransactionPlanV1["operations"][number]): number;
|
|
24
|
+
export declare function classifyKnownFileOperation(operation: KnownFileTransactionPlanV1["operations"][number], observed: ObservedKnownFile): KnownFileTransactionJournalOperationV1;
|
|
25
|
+
//# sourceMappingURL=node-known-file-transaction-filesystem.d.ts.map
|
package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-known-file-transaction-filesystem.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-transaction-filesystem.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,mDAAmD,CAAC;AAC3D,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,2DAA2D,CAAC;AAKxH,OAAO,EACL,yBAAyB,EAE1B,MAAM,gCAAgC,CAAC;AAKxC,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAmB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAIvE;CACF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC;IAC1E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIrE;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,EAC3D,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,GAC3D,OAAO,CAGT;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAEnE;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAKT;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,MAAM,CAER;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,MAAM,CAER;AAED,wBAAsB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlF;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B;AAuCD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAqC5B;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,0BAA0B,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAC1D,MAAM,CAOR;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,0BAA0B,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,EAC3D,QAAQ,EAAE,iBAAiB,GAC1B,sCAAsC,CAuBxC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readdir, realpath } from "node:fs/promises";
|
|
3
|
+
import { basename, join, resolve } from "node:path";
|
|
4
|
+
import { portableRepositoryPathIdentity, portableRepositoryPathProblem } from "../../application/model/repository-path.js";
|
|
5
|
+
import { captureFileHandleIdentity, readBoundedRegularFile } from "./node-bounded-regular-file.js";
|
|
6
|
+
import { isLexicallyContainedPath } from "./node-repository-path.js";
|
|
7
|
+
const MAXIMUM_MANAGED_FILE_BYTES = 8 * 1024 * 1024;
|
|
8
|
+
export class KnownFileTransactionError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
constructor(code, message, options) {
|
|
11
|
+
super(message, options);
|
|
12
|
+
this.name = "KnownFileTransactionError";
|
|
13
|
+
this.code = code;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function knownFileErrorCode(error) {
|
|
17
|
+
return error instanceof Error && "code" in error
|
|
18
|
+
? error.code
|
|
19
|
+
: undefined;
|
|
20
|
+
}
|
|
21
|
+
export function sameKnownFileIdentity(left, right) {
|
|
22
|
+
return left.birthtimeNs === right.birthtimeNs &&
|
|
23
|
+
left.dev === right.dev && left.ino === right.ino;
|
|
24
|
+
}
|
|
25
|
+
export function knownFileImageBytes(image) {
|
|
26
|
+
return Buffer.from(image.contentBase64, "base64");
|
|
27
|
+
}
|
|
28
|
+
export function matchesKnownFileImage(observed, image) {
|
|
29
|
+
return observed.state === "file" && observed.bytes !== undefined &&
|
|
30
|
+
observed.bytes.byteLength === image.size &&
|
|
31
|
+
`sha256:${createHash("sha256").update(observed.bytes).digest("hex")}` === image.digest &&
|
|
32
|
+
observed.mode === image.mode;
|
|
33
|
+
}
|
|
34
|
+
export function knownFileTemporaryName(path, planDigest, operationIndex) {
|
|
35
|
+
return `.${basename(path)}.agent-teams.${planDigest.slice(7, 23)}.${operationIndex}.tmp`;
|
|
36
|
+
}
|
|
37
|
+
export function knownFileCaptureDirectoryName(path, planDigest, operationIndex) {
|
|
38
|
+
return `.${basename(path)}.agent-teams.capture.${planDigest.slice(7, 23)}.${operationIndex}`;
|
|
39
|
+
}
|
|
40
|
+
export async function canonicalKnownFileRoot(consumerRoot) {
|
|
41
|
+
const requested = resolve(consumerRoot);
|
|
42
|
+
const metadata = await lstat(requested);
|
|
43
|
+
if (metadata.isSymbolicLink() || !metadata.isDirectory()) {
|
|
44
|
+
throw new KnownFileTransactionError("KNOWN_FILE_ROOT_INVALID", "Consumer root must be one real directory, not a symlink.");
|
|
45
|
+
}
|
|
46
|
+
return realpath(requested);
|
|
47
|
+
}
|
|
48
|
+
export async function knownFileAliasEntry(parent, requested) {
|
|
49
|
+
const identity = portableRepositoryPathIdentity(requested);
|
|
50
|
+
const matches = (await readdir(parent)).filter((entry) => portableRepositoryPathIdentity(entry) === identity);
|
|
51
|
+
if (matches.some((entry) => entry !== requested)) {
|
|
52
|
+
throw new KnownFileTransactionError("KNOWN_FILE_PATH_ALIAS", `Portable case or Unicode path collision blocks ${requested}.`);
|
|
53
|
+
}
|
|
54
|
+
return matches.find((entry) => entry === requested);
|
|
55
|
+
}
|
|
56
|
+
async function resolveExistingParent(root, repositoryPath) {
|
|
57
|
+
const problem = portableRepositoryPathProblem(repositoryPath);
|
|
58
|
+
if (problem !== undefined) {
|
|
59
|
+
throw new KnownFileTransactionError("KNOWN_FILE_PATH_INVALID", `Repository path is not portable (${problem}): ${repositoryPath}.`);
|
|
60
|
+
}
|
|
61
|
+
const segments = repositoryPath.split("/");
|
|
62
|
+
segments.pop();
|
|
63
|
+
let current = root;
|
|
64
|
+
for (const segment of segments) {
|
|
65
|
+
if (await knownFileAliasEntry(current, segment) === undefined) {
|
|
66
|
+
return { absolute: current, complete: false };
|
|
67
|
+
}
|
|
68
|
+
current = join(current, segment);
|
|
69
|
+
const metadata = await lstat(current);
|
|
70
|
+
if (metadata.isSymbolicLink() || !metadata.isDirectory()) {
|
|
71
|
+
throw new KnownFileTransactionError("KNOWN_FILE_ANCESTOR_INVALID", `Repository ancestor must be one real directory: ${repositoryPath}.`);
|
|
72
|
+
}
|
|
73
|
+
const canonical = await realpath(current);
|
|
74
|
+
if (!isLexicallyContainedPath(root, canonical) || canonical !== current) {
|
|
75
|
+
throw new KnownFileTransactionError("KNOWN_FILE_PATH_ESCAPE", `Repository ancestor escapes or aliases the root: ${repositoryPath}.`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { absolute: current, complete: true };
|
|
79
|
+
}
|
|
80
|
+
export async function observeKnownFile(root, repositoryPath, maximumBytes) {
|
|
81
|
+
const parent = await resolveExistingParent(root, repositoryPath);
|
|
82
|
+
if (!parent.complete) {
|
|
83
|
+
return { state: "absent" };
|
|
84
|
+
}
|
|
85
|
+
const name = repositoryPath.split("/").at(-1);
|
|
86
|
+
if (await knownFileAliasEntry(parent.absolute, name) === undefined) {
|
|
87
|
+
return { state: "absent" };
|
|
88
|
+
}
|
|
89
|
+
const path = join(root, ...repositoryPath.split("/"));
|
|
90
|
+
const metadata = await lstat(path, { bigint: true });
|
|
91
|
+
if (metadata.isSymbolicLink() || !metadata.isFile()) {
|
|
92
|
+
throw new KnownFileTransactionError("KNOWN_FILE_DESTINATION_INVALID", `Managed path must be a real regular file: ${repositoryPath}.`);
|
|
93
|
+
}
|
|
94
|
+
const observed = await readBoundedRegularFile(path, Math.max(maximumBytes, MAXIMUM_MANAGED_FILE_BYTES));
|
|
95
|
+
if (observed.outcome !== "read") {
|
|
96
|
+
throw new KnownFileTransactionError("KNOWN_FILE_UNSTABLE", `Managed path is oversized, unstable, or invalid: ${repositoryPath}.`);
|
|
97
|
+
}
|
|
98
|
+
if (observed.linkCount !== 1n) {
|
|
99
|
+
throw new KnownFileTransactionError("KNOWN_FILE_HARDLINK", `Managed path has multiple hard links: ${repositoryPath}.`);
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
state: "file",
|
|
103
|
+
bytes: observed.bytes,
|
|
104
|
+
identity: observed.identity,
|
|
105
|
+
mode: observed.mode & 0o777
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export function maximumKnownFileEvidenceBytes(operation) {
|
|
109
|
+
return Math.max(operation.postimage.size, ...(operation.precondition.state === "known-file"
|
|
110
|
+
? operation.precondition.acceptedPreimages.map(({ size }) => size)
|
|
111
|
+
: [0]));
|
|
112
|
+
}
|
|
113
|
+
export function classifyKnownFileOperation(operation, observed) {
|
|
114
|
+
if (matchesKnownFileImage(observed, operation.postimage)) {
|
|
115
|
+
return { path: operation.path, state: "already-satisfied" };
|
|
116
|
+
}
|
|
117
|
+
if (operation.precondition.state === "absent") {
|
|
118
|
+
if (observed.state !== "absent") {
|
|
119
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Expected an absent managed path: ${operation.path}.`);
|
|
120
|
+
}
|
|
121
|
+
return { path: operation.path, state: "pending" };
|
|
122
|
+
}
|
|
123
|
+
const matchedPreimage = operation.precondition.acceptedPreimages.findIndex((image) => matchesKnownFileImage(observed, image));
|
|
124
|
+
if (matchedPreimage === -1) {
|
|
125
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Managed path does not match an exact accepted preimage: ${operation.path}.`);
|
|
126
|
+
}
|
|
127
|
+
return { path: operation.path, state: "pending", matchedPreimage };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=node-known-file-transaction-filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-known-file-transaction-filesystem.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-transaction-filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type KnownFileTransactionBarrierInspection = {
|
|
2
|
+
readonly state: "idle";
|
|
3
|
+
} | {
|
|
4
|
+
readonly state: "recovery-required";
|
|
5
|
+
readonly code: "KNOWN_FILE_OPERATION_ACTIVE" | "KNOWN_FILE_RECOVERY_REQUIRED";
|
|
6
|
+
readonly recoverableByInstalledBuild: boolean;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function inspectKnownFileTransactionBarrier(options: {
|
|
10
|
+
readonly consumerRoot: string;
|
|
11
|
+
}): Promise<KnownFileTransactionBarrierInspection>;
|
|
12
|
+
//# sourceMappingURL=node-known-file-transaction-inspection.d.ts.map
|
package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-known-file-transaction-inspection.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-transaction-inspection.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,qCAAqC,GAC7C;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1B;IACE,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,IAAI,EACT,6BAA6B,GAC7B,8BAA8B,CAAC;IACnC,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAYN,wBAAsB,kCAAkC,CAAC,OAAO,EAAE;IAChE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,GAAG,OAAO,CAAC,qCAAqC,CAAC,CA6BjD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { lstat } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { LOCAL_OPERATION_LOCK, LOCAL_STATE_DIRECTORY } from "../../../foundation-state-contract.js";
|
|
4
|
+
import { createNodeFoundationTransactionCoordinator } from "../../../transaction-coordination/adapters/node/node-foundation-transaction-coordinator.js";
|
|
5
|
+
import { canonicalKnownFileRoot, knownFileErrorCode } from "./node-known-file-transaction-filesystem.js";
|
|
6
|
+
async function operationLockExists(root) {
|
|
7
|
+
try {
|
|
8
|
+
await lstat(join(root, LOCAL_STATE_DIRECTORY, LOCAL_OPERATION_LOCK));
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (knownFileErrorCode(error) === "ENOENT") {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function inspectKnownFileTransactionBarrier(options) {
|
|
19
|
+
const root = await canonicalKnownFileRoot(options.consumerRoot);
|
|
20
|
+
const [hasOperationLock, status] = await Promise.all([
|
|
21
|
+
operationLockExists(root),
|
|
22
|
+
createNodeFoundationTransactionCoordinator(root).then((coordinator) => coordinator.inspect())
|
|
23
|
+
]);
|
|
24
|
+
if (status.state !== "idle") {
|
|
25
|
+
const recoverableByInstalledBuild = status.state === "pending" &&
|
|
26
|
+
status.operationKind === "known-file-transaction" &&
|
|
27
|
+
!status.diagnostics.some(({ code }) => code === "FOUNDATION_TRANSACTION_VERSION_MISMATCH");
|
|
28
|
+
return Object.freeze({
|
|
29
|
+
state: "recovery-required",
|
|
30
|
+
code: "KNOWN_FILE_RECOVERY_REQUIRED",
|
|
31
|
+
recoverableByInstalledBuild,
|
|
32
|
+
message: status.diagnostics[0]?.message ??
|
|
33
|
+
"Foundation transaction evidence must be recovered before consumer integration can continue."
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (hasOperationLock) {
|
|
37
|
+
return Object.freeze({
|
|
38
|
+
state: "recovery-required",
|
|
39
|
+
code: "KNOWN_FILE_OPERATION_ACTIVE",
|
|
40
|
+
recoverableByInstalledBuild: false,
|
|
41
|
+
message: "A Foundation operation is active or interrupted; retry after it completes or recover its evidence."
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return Object.freeze({ state: "idle" });
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=node-known-file-transaction-inspection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-known-file-transaction-inspection.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-transaction-inspection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,0CAA0C,EAAE,MAAM,4FAA4F,CAAC;AACxJ,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAazG,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YAAA,OAAO,KAAK,CAAC;QAAA,CAAC;QAC3D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,OAExD;IACC,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACnD,mBAAmB,CAAC,IAAI,CAAC;QACzB,0CAA0C,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;KAC9F,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,2BAA2B,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS;YAC5D,MAAM,CAAC,aAAa,KAAK,wBAAwB;YACjD,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACpC,IAAI,KAAK,yCAAyC,CACnD,CAAC;QACJ,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,mBAAmB;YAC1B,IAAI,EAAE,8BAA8B;YACpC,2BAA2B;YAC3B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO;gBACrC,6FAA6F;SAChG,CAAC,CAAC;IACL,CAAC;IACD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,mBAAmB;YAC1B,IAAI,EAAE,6BAA6B;YACnC,2BAA2B,EAAE,KAAK;YAClC,OAAO,EAAE,oGAAoG;SAC9G,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { KnownFileTransactionEnvelopeV1 } from "../../application/model/known-file-transaction-journal.js";
|
|
2
|
+
import { captureFileHandleIdentity } from "./node-bounded-regular-file.js";
|
|
3
|
+
export interface KnownFileJournalAuthority {
|
|
4
|
+
readonly digest: `sha256:${string}`;
|
|
5
|
+
readonly identity: Awaited<ReturnType<typeof captureFileHandleIdentity>>;
|
|
6
|
+
}
|
|
7
|
+
declare function readEnvelope(path: string): Promise<{
|
|
8
|
+
readonly authority: KnownFileJournalAuthority;
|
|
9
|
+
readonly envelope: KnownFileTransactionEnvelopeV1;
|
|
10
|
+
} | undefined>;
|
|
11
|
+
export declare class NodeKnownFileTransactionJournalStore {
|
|
12
|
+
#private;
|
|
13
|
+
constructor(stateDirectory: string);
|
|
14
|
+
read(): Promise<Awaited<ReturnType<typeof readEnvelope>>>;
|
|
15
|
+
create(envelope: KnownFileTransactionEnvelopeV1): Promise<KnownFileJournalAuthority>;
|
|
16
|
+
replace(expected: KnownFileJournalAuthority, envelope: KnownFileTransactionEnvelopeV1): Promise<KnownFileJournalAuthority>;
|
|
17
|
+
remove(expected: KnownFileJournalAuthority): Promise<void>;
|
|
18
|
+
canonicalizeTemporary(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=node-known-file-transaction-journal-store.d.ts.map
|
package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-known-file-transaction-journal-store.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-transaction-journal-store.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,2DAA2D,CAAC;AAEhH,OAAO,EACL,yBAAyB,EAG1B,MAAM,gCAAgC,CAAC;AAOxC,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,UAAU,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC;CAC1E;AAwBD,iBAAe,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,8BAA8B,CAAC;CACnD,GAAG,SAAS,CAAC,CAsBb;AAUD,qBAAa,oCAAoC;;IAK/C,YAAmB,cAAc,EAAE,MAAM,EAIxC;IAEY,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAMrE;IA8BY,MAAM,CAAC,QAAQ,EAAE,8BAA8B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAUhG;IAEY,OAAO,CAClB,QAAQ,EAAE,yBAAyB,EACnC,QAAQ,EAAE,8BAA8B,GACvC,OAAO,CAAC,yBAAyB,CAAC,CASpC;IAEY,MAAM,CAAC,QAAQ,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;IAEY,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2ClD;CACF"}
|