@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
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
import { link, lstat, mkdir, open, realpath, rename, unlink } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { canonicalJson, sha256Json } from "../../../canonical-json.js";
|
|
4
|
+
import { installedFoundationVersion } from "../../../package-version.js";
|
|
5
|
+
import { createNodeFoundationTransactionCoordinator } from "../../../transaction-coordination/adapters/node/node-foundation-transaction-coordinator.js";
|
|
6
|
+
import { installedFoundationBuildIdentity } from "../../../transaction-coordination/adapters/node/installed-foundation-build-identity.js";
|
|
7
|
+
import { ensureFoundationStateDirectory } from "../../../transaction-coordination/adapters/node/node-foundation-state-directory.js";
|
|
8
|
+
import { serializeKnownFileIdentity } from "../../application/model/known-file-transaction-journal.js";
|
|
9
|
+
import { compileKnownFileTransactionEnvelope } from "../../application/policies/known-file-transaction-envelope.js";
|
|
10
|
+
import { assertKnownFileTransactionPlan } from "../../application/policies/known-file-transaction-plan.js";
|
|
11
|
+
import { captureFileHandleIdentity, pathMatchesRegularFileIdentity, readBoundedRegularFile } from "./node-bounded-regular-file.js";
|
|
12
|
+
import { syncDirectoryStrictly } from "./node-directory-durability.js";
|
|
13
|
+
import { cleanupCommittedKnownFileCaptures, prepareRollbackTemporary } from "./node-known-file-recovery-filesystem.js";
|
|
14
|
+
import { isLexicallyContainedPath } from "./node-repository-path.js";
|
|
15
|
+
import { NodeKnownFileTransactionJournalStore } from "./node-known-file-transaction-journal-store.js";
|
|
16
|
+
import { inspectKnownFileTransactionBarrier } from "./node-known-file-transaction-inspection.js";
|
|
17
|
+
import { canonicalKnownFileRoot, classifyKnownFileOperation, knownFileAliasEntry, knownFileCaptureDirectoryName, knownFileErrorCode, knownFileImageBytes, knownFileTemporaryName, KnownFileTransactionError, matchesKnownFileImage, maximumKnownFileEvidenceBytes, observeKnownFile, sameKnownFileIdentity } from "./node-known-file-transaction-filesystem.js";
|
|
18
|
+
export { KnownFileTransactionError } from "./node-known-file-transaction-filesystem.js";
|
|
19
|
+
async function initialJournal(root, plan) {
|
|
20
|
+
const operations = [];
|
|
21
|
+
for (const operation of plan.operations) {
|
|
22
|
+
operations.push(classifyKnownFileOperation(operation, await observeKnownFile(root, operation.path, maximumKnownFileEvidenceBytes(operation))));
|
|
23
|
+
}
|
|
24
|
+
return Object.freeze({
|
|
25
|
+
schemaVersion: 1,
|
|
26
|
+
plan,
|
|
27
|
+
operations: Object.freeze(operations),
|
|
28
|
+
authorizedDirectories: Object.freeze([]),
|
|
29
|
+
createdDirectories: Object.freeze([])
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function replaceOperation(journal, index, replacement) {
|
|
33
|
+
return Object.freeze({
|
|
34
|
+
...journal,
|
|
35
|
+
operations: Object.freeze(journal.operations.with(index, replacement))
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async function persist(store, stored, journal, state = "APPLYING") {
|
|
39
|
+
const envelope = compileKnownFileTransactionEnvelope({
|
|
40
|
+
foundation: stored.envelope.foundation,
|
|
41
|
+
journal,
|
|
42
|
+
state
|
|
43
|
+
});
|
|
44
|
+
stored.authority = await store.replace(stored.authority, envelope);
|
|
45
|
+
stored.envelope = envelope;
|
|
46
|
+
}
|
|
47
|
+
async function ensureParentDirectories(options) {
|
|
48
|
+
const segments = options.operationPath.split("/");
|
|
49
|
+
segments.pop();
|
|
50
|
+
let current = options.root;
|
|
51
|
+
const traversed = [];
|
|
52
|
+
for (const segment of segments) {
|
|
53
|
+
traversed.push(segment);
|
|
54
|
+
const repositoryPath = traversed.join("/");
|
|
55
|
+
const exists = await knownFileAliasEntry(current, segment);
|
|
56
|
+
if (exists === undefined) {
|
|
57
|
+
const authorized = Object.freeze({
|
|
58
|
+
...options.stored.envelope.journal,
|
|
59
|
+
authorizedDirectories: Object.freeze([
|
|
60
|
+
...options.stored.envelope.journal.authorizedDirectories,
|
|
61
|
+
repositoryPath
|
|
62
|
+
])
|
|
63
|
+
});
|
|
64
|
+
await persist(options.store, options.stored, authorized);
|
|
65
|
+
await options.faultInjector?.({
|
|
66
|
+
phase: "after-directory-authorized",
|
|
67
|
+
operationIndex: options.index,
|
|
68
|
+
path: repositoryPath
|
|
69
|
+
});
|
|
70
|
+
await mkdir(join(current, segment), { mode: 0o755 });
|
|
71
|
+
await syncDirectoryStrictly(current);
|
|
72
|
+
const metadata = await lstat(join(current, segment), { bigint: true });
|
|
73
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink()) {
|
|
74
|
+
throw new KnownFileTransactionError("KNOWN_FILE_DIRECTORY_INVALID", `Created ancestor is not one real directory: ${repositoryPath}.`);
|
|
75
|
+
}
|
|
76
|
+
const identity = serializeKnownFileIdentity({
|
|
77
|
+
birthtimeNs: metadata.birthtimeNs,
|
|
78
|
+
dev: metadata.dev,
|
|
79
|
+
ino: metadata.ino
|
|
80
|
+
});
|
|
81
|
+
await options.faultInjector?.({
|
|
82
|
+
phase: "after-directory-created-unbound",
|
|
83
|
+
operationIndex: options.index,
|
|
84
|
+
path: repositoryPath
|
|
85
|
+
});
|
|
86
|
+
const journal = Object.freeze({
|
|
87
|
+
...options.stored.envelope.journal,
|
|
88
|
+
authorizedDirectories: Object.freeze(options.stored.envelope.journal.authorizedDirectories.filter((path) => path !== repositoryPath)),
|
|
89
|
+
createdDirectories: Object.freeze([
|
|
90
|
+
...options.stored.envelope.journal.createdDirectories,
|
|
91
|
+
Object.freeze({ path: repositoryPath, identity })
|
|
92
|
+
])
|
|
93
|
+
});
|
|
94
|
+
await persist(options.store, options.stored, journal);
|
|
95
|
+
await options.faultInjector?.({
|
|
96
|
+
phase: "after-directory-created",
|
|
97
|
+
operationIndex: options.index,
|
|
98
|
+
path: repositoryPath
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
current = join(current, segment);
|
|
102
|
+
const metadata = await lstat(current);
|
|
103
|
+
if (metadata.isSymbolicLink() || !metadata.isDirectory() ||
|
|
104
|
+
!isLexicallyContainedPath(options.root, await realpath(current))) {
|
|
105
|
+
throw new KnownFileTransactionError("KNOWN_FILE_ANCESTOR_INVALID", `Managed path ancestor changed: ${options.operationPath}.`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return current;
|
|
109
|
+
}
|
|
110
|
+
async function prepareTemporary(options) {
|
|
111
|
+
const path = join(options.parent, knownFileTemporaryName(options.operation.path, options.planDigest, options.operationIndex));
|
|
112
|
+
const handle = await open(path, "wx", 0o600).catch((error) => {
|
|
113
|
+
throw new KnownFileTransactionError(knownFileErrorCode(error) === "EEXIST" ? "KNOWN_FILE_TEMPORARY_EXISTS" : "KNOWN_FILE_TEMPORARY_CREATE_FAILED", `Could not create the transaction-owned temporary for ${options.operation.path}.`, { cause: error });
|
|
114
|
+
});
|
|
115
|
+
try {
|
|
116
|
+
await handle.writeFile(knownFileImageBytes(options.operation.postimage));
|
|
117
|
+
await handle.chmod(options.operation.postimage.mode);
|
|
118
|
+
await handle.sync();
|
|
119
|
+
return { path, identity: await captureFileHandleIdentity(handle) };
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
await handle.close();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function verifyTemporary(path, identity, image) {
|
|
126
|
+
const observed = await readBoundedRegularFile(path, image.size);
|
|
127
|
+
if (observed.outcome !== "read" || !sameKnownFileIdentity(observed.identity, identity) ||
|
|
128
|
+
!matchesKnownFileImage({ state: "file", bytes: observed.bytes, identity: observed.identity, mode: observed.mode & 0o777 }, image)) {
|
|
129
|
+
throw new KnownFileTransactionError("KNOWN_FILE_TEMPORARY_CHANGED", "Transaction-owned temporary changed before publication.");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function capturePaths(options) {
|
|
133
|
+
const directory = join(options.parent, knownFileCaptureDirectoryName(options.operation.path, options.planDigest, options.operationIndex));
|
|
134
|
+
return {
|
|
135
|
+
captured: join(directory, "preimage"),
|
|
136
|
+
directory,
|
|
137
|
+
retired: join(directory, "retired")
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
async function prepareCaptureDirectory(options) {
|
|
141
|
+
const paths = capturePaths(options);
|
|
142
|
+
await mkdir(paths.directory, { mode: 0o700 }).catch((error) => {
|
|
143
|
+
throw new KnownFileTransactionError(knownFileErrorCode(error) === "EEXIST"
|
|
144
|
+
? "KNOWN_FILE_CAPTURE_EXISTS"
|
|
145
|
+
: "KNOWN_FILE_CAPTURE_CREATE_FAILED", `Could not create the transaction-owned capture for ${options.operation.path}.`, { cause: error });
|
|
146
|
+
});
|
|
147
|
+
await syncDirectoryStrictly(options.parent);
|
|
148
|
+
const metadata = await lstat(paths.directory, { bigint: true });
|
|
149
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink()) {
|
|
150
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAPTURE_INVALID", `Transaction capture is not one real directory: ${options.operation.path}.`);
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
identity: {
|
|
154
|
+
birthtimeNs: metadata.birthtimeNs,
|
|
155
|
+
dev: metadata.dev,
|
|
156
|
+
ino: metadata.ino
|
|
157
|
+
},
|
|
158
|
+
paths
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
async function captureKnownPreimage(options) {
|
|
162
|
+
const destination = join(options.root, ...options.operation.path.split("/"));
|
|
163
|
+
await link(destination, options.capture.paths.captured).catch((error) => {
|
|
164
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Could not capture the exact replacement preimage: ${options.operation.path}.`, { cause: error });
|
|
165
|
+
});
|
|
166
|
+
await syncDirectoryStrictly(options.capture.paths.directory);
|
|
167
|
+
const captured = await readBoundedRegularFile(options.capture.paths.captured, maximumKnownFileEvidenceBytes(options.operation));
|
|
168
|
+
const matchedPreimage = captured.outcome === "read"
|
|
169
|
+
? options.operation.precondition.acceptedPreimages.findIndex((image) => matchesKnownFileImage({
|
|
170
|
+
state: "file",
|
|
171
|
+
bytes: captured.bytes,
|
|
172
|
+
identity: captured.identity,
|
|
173
|
+
mode: captured.mode & 0o777
|
|
174
|
+
}, image))
|
|
175
|
+
: -1;
|
|
176
|
+
if (captured.outcome !== "read" || captured.linkCount !== 2n || matchedPreimage < 0) {
|
|
177
|
+
// This pathname is an alias created by this transaction. Removing the alias
|
|
178
|
+
// cannot remove the editor's public pathname and never discards unknown bytes.
|
|
179
|
+
await unlink(options.capture.paths.captured);
|
|
180
|
+
await syncDirectoryStrictly(options.capture.paths.directory);
|
|
181
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Captured replacement preimage is no longer accepted: ${options.operation.path}.`);
|
|
182
|
+
}
|
|
183
|
+
return { identity: captured.identity, matchedPreimage };
|
|
184
|
+
}
|
|
185
|
+
async function retireCapturedDestination(options) {
|
|
186
|
+
await rename(options.destination, options.capture.paths.retired).catch((error) => {
|
|
187
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Destination disappeared before identity-bound capture: ${options.operationPath}.`, { cause: error });
|
|
188
|
+
});
|
|
189
|
+
await syncDirectoryStrictly(options.capture.paths.directory);
|
|
190
|
+
await syncDirectoryStrictly(options.parent);
|
|
191
|
+
await options.faultInjector?.({
|
|
192
|
+
phase: "after-destination-captured",
|
|
193
|
+
operationIndex: options.index,
|
|
194
|
+
path: options.operationPath
|
|
195
|
+
});
|
|
196
|
+
const retired = await readBoundedRegularFile(options.capture.paths.retired, 8 * 1024 * 1024);
|
|
197
|
+
if (retired.outcome !== "read" ||
|
|
198
|
+
!sameKnownFileIdentity(retired.identity, options.capturedIdentity)) {
|
|
199
|
+
if (retired.outcome === "read") {
|
|
200
|
+
try {
|
|
201
|
+
await link(options.capture.paths.retired, options.destination);
|
|
202
|
+
await syncDirectoryStrictly(options.parent);
|
|
203
|
+
await unlink(options.capture.paths.retired);
|
|
204
|
+
await syncDirectoryStrictly(options.capture.paths.directory);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (knownFileErrorCode(error) !== "EEXIST") {
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `A foreign destination appeared during identity-bound capture: ${options.operationPath}.`);
|
|
213
|
+
}
|
|
214
|
+
const stableCaptured = await readBoundedRegularFile(options.capture.paths.captured, options.preimage.size);
|
|
215
|
+
if (stableCaptured.outcome !== "read" ||
|
|
216
|
+
stableCaptured.linkCount !== 2n ||
|
|
217
|
+
!sameKnownFileIdentity(stableCaptured.identity, options.capturedIdentity) ||
|
|
218
|
+
!matchesKnownFileImage({
|
|
219
|
+
state: "file", bytes: stableCaptured.bytes, identity: stableCaptured.identity,
|
|
220
|
+
mode: stableCaptured.mode & 0o777
|
|
221
|
+
}, options.preimage)) {
|
|
222
|
+
await link(options.capture.paths.retired, options.destination).catch((error) => {
|
|
223
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Mutated retired destination could not be restored: ${options.operationPath}.`, { cause: error });
|
|
224
|
+
});
|
|
225
|
+
await syncDirectoryStrictly(options.parent);
|
|
226
|
+
await unlink(options.capture.paths.retired);
|
|
227
|
+
await syncDirectoryStrictly(options.capture.paths.directory);
|
|
228
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Captured replacement preimage changed through an open file handle: ${options.operationPath}.`);
|
|
229
|
+
}
|
|
230
|
+
await unlink(options.capture.paths.retired);
|
|
231
|
+
await syncDirectoryStrictly(options.capture.paths.directory);
|
|
232
|
+
}
|
|
233
|
+
// oxlint-disable-next-line complexity, max-lines-per-function
|
|
234
|
+
async function executeOperation(options) {
|
|
235
|
+
const operation = options.stored.envelope.journal.plan.operations[options.index];
|
|
236
|
+
let journalOperation = options.stored.envelope.journal.operations[options.index];
|
|
237
|
+
if (journalOperation.state === "already-satisfied" || journalOperation.state === "published") {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
if (journalOperation.state !== "pending") {
|
|
241
|
+
throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_REQUIRED", `Operation ${operation.path} is already in progress and requires recovery.`);
|
|
242
|
+
}
|
|
243
|
+
const parent = await ensureParentDirectories({
|
|
244
|
+
...options,
|
|
245
|
+
operationPath: operation.path
|
|
246
|
+
});
|
|
247
|
+
journalOperation = Object.freeze({ ...journalOperation, state: "temporary-authorized" });
|
|
248
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
249
|
+
await options.faultInjector?.({
|
|
250
|
+
phase: "after-temporary-authorized",
|
|
251
|
+
operationIndex: options.index,
|
|
252
|
+
path: operation.path
|
|
253
|
+
});
|
|
254
|
+
const temporary = await prepareTemporary({
|
|
255
|
+
operation,
|
|
256
|
+
operationIndex: options.index,
|
|
257
|
+
parent,
|
|
258
|
+
planDigest: options.stored.envelope.journal.plan.planDigest
|
|
259
|
+
});
|
|
260
|
+
await options.faultInjector?.({
|
|
261
|
+
phase: "after-temporary-created-unbound",
|
|
262
|
+
operationIndex: options.index,
|
|
263
|
+
path: operation.path
|
|
264
|
+
});
|
|
265
|
+
journalOperation = Object.freeze({
|
|
266
|
+
...journalOperation,
|
|
267
|
+
state: "temporary-ready",
|
|
268
|
+
temporaryIdentity: serializeKnownFileIdentity(temporary.identity)
|
|
269
|
+
});
|
|
270
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
271
|
+
await options.faultInjector?.({
|
|
272
|
+
phase: "after-temporary-synced",
|
|
273
|
+
operationIndex: options.index,
|
|
274
|
+
path: operation.path
|
|
275
|
+
});
|
|
276
|
+
await verifyTemporary(temporary.path, temporary.identity, operation.postimage);
|
|
277
|
+
const destination = join(options.root, ...operation.path.split("/"));
|
|
278
|
+
if (operation.precondition.state === "absent") {
|
|
279
|
+
journalOperation = Object.freeze({ ...journalOperation, state: "publishing" });
|
|
280
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
281
|
+
await options.faultInjector?.({
|
|
282
|
+
phase: "after-operation-publishing",
|
|
283
|
+
operationIndex: options.index,
|
|
284
|
+
path: operation.path
|
|
285
|
+
});
|
|
286
|
+
await link(temporary.path, destination).catch((error) => {
|
|
287
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Destination appeared during create CAS: ${operation.path}.`, { cause: error });
|
|
288
|
+
});
|
|
289
|
+
await options.faultInjector?.({
|
|
290
|
+
phase: "after-postimage-linked",
|
|
291
|
+
operationIndex: options.index,
|
|
292
|
+
path: operation.path
|
|
293
|
+
});
|
|
294
|
+
await unlink(temporary.path);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
journalOperation = Object.freeze({ ...journalOperation, state: "capture-authorized" });
|
|
298
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
299
|
+
await options.faultInjector?.({
|
|
300
|
+
phase: "after-capture-authorized",
|
|
301
|
+
operationIndex: options.index,
|
|
302
|
+
path: operation.path
|
|
303
|
+
});
|
|
304
|
+
const capture = await prepareCaptureDirectory({
|
|
305
|
+
operation,
|
|
306
|
+
operationIndex: options.index,
|
|
307
|
+
parent,
|
|
308
|
+
planDigest: options.stored.envelope.journal.plan.planDigest
|
|
309
|
+
});
|
|
310
|
+
await options.faultInjector?.({
|
|
311
|
+
phase: "after-capture-created-unbound",
|
|
312
|
+
operationIndex: options.index,
|
|
313
|
+
path: operation.path
|
|
314
|
+
});
|
|
315
|
+
journalOperation = Object.freeze({
|
|
316
|
+
...journalOperation,
|
|
317
|
+
captureDirectoryIdentity: serializeKnownFileIdentity(capture.identity),
|
|
318
|
+
state: "capture-ready"
|
|
319
|
+
});
|
|
320
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
321
|
+
await options.faultInjector?.({
|
|
322
|
+
phase: "after-capture-ready",
|
|
323
|
+
operationIndex: options.index,
|
|
324
|
+
path: operation.path
|
|
325
|
+
});
|
|
326
|
+
const captured = await captureKnownPreimage({
|
|
327
|
+
capture,
|
|
328
|
+
...(options.faultInjector === undefined ? {} : { faultInjector: options.faultInjector }),
|
|
329
|
+
index: options.index,
|
|
330
|
+
operation: { ...operation, precondition: operation.precondition },
|
|
331
|
+
root: options.root
|
|
332
|
+
});
|
|
333
|
+
await options.faultInjector?.({
|
|
334
|
+
phase: "after-preimage-linked-unbound",
|
|
335
|
+
operationIndex: options.index,
|
|
336
|
+
path: operation.path
|
|
337
|
+
});
|
|
338
|
+
journalOperation = Object.freeze({
|
|
339
|
+
...journalOperation,
|
|
340
|
+
capturedPreimageIdentity: serializeKnownFileIdentity(captured.identity),
|
|
341
|
+
matchedPreimage: captured.matchedPreimage,
|
|
342
|
+
state: "preimage-captured"
|
|
343
|
+
});
|
|
344
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
345
|
+
await options.faultInjector?.({
|
|
346
|
+
phase: "after-preimage-captured",
|
|
347
|
+
operationIndex: options.index,
|
|
348
|
+
path: operation.path
|
|
349
|
+
});
|
|
350
|
+
const rollbackPath = join(parent, `.${operation.path.split("/").at(-1)}.agent-teams.rollback.${options.index}.tmp`);
|
|
351
|
+
const rollbackIdentity = await prepareRollbackTemporary({
|
|
352
|
+
operationPath: operation.path,
|
|
353
|
+
path: rollbackPath,
|
|
354
|
+
preimage: operation.precondition.acceptedPreimages[captured.matchedPreimage]
|
|
355
|
+
});
|
|
356
|
+
await options.faultInjector?.({
|
|
357
|
+
phase: "after-rollback-temporary-created-unbound",
|
|
358
|
+
operationIndex: options.index,
|
|
359
|
+
path: operation.path
|
|
360
|
+
});
|
|
361
|
+
await syncDirectoryStrictly(parent);
|
|
362
|
+
if (await pathMatchesRegularFileIdentity(rollbackPath, rollbackIdentity) !== "match") {
|
|
363
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Rollback temporary changed before durable identity binding: ${operation.path}.`);
|
|
364
|
+
}
|
|
365
|
+
journalOperation = Object.freeze({
|
|
366
|
+
...journalOperation,
|
|
367
|
+
rollbackTemporaryIdentity: serializeKnownFileIdentity(rollbackIdentity)
|
|
368
|
+
});
|
|
369
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
370
|
+
await options.faultInjector?.({
|
|
371
|
+
phase: "after-rollback-temporary-ready",
|
|
372
|
+
operationIndex: options.index,
|
|
373
|
+
path: operation.path
|
|
374
|
+
});
|
|
375
|
+
await retireCapturedDestination({
|
|
376
|
+
capture,
|
|
377
|
+
capturedIdentity: captured.identity,
|
|
378
|
+
destination,
|
|
379
|
+
...(options.faultInjector === undefined ? {} : { faultInjector: options.faultInjector }),
|
|
380
|
+
index: options.index,
|
|
381
|
+
operationPath: operation.path,
|
|
382
|
+
parent,
|
|
383
|
+
preimage: operation.precondition.acceptedPreimages[captured.matchedPreimage]
|
|
384
|
+
});
|
|
385
|
+
journalOperation = Object.freeze({ ...journalOperation, state: "destination-retired" });
|
|
386
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
387
|
+
await options.faultInjector?.({
|
|
388
|
+
phase: "after-destination-retired",
|
|
389
|
+
operationIndex: options.index,
|
|
390
|
+
path: operation.path
|
|
391
|
+
});
|
|
392
|
+
journalOperation = Object.freeze({ ...journalOperation, state: "publishing" });
|
|
393
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
394
|
+
await options.faultInjector?.({
|
|
395
|
+
phase: "after-operation-publishing",
|
|
396
|
+
operationIndex: options.index,
|
|
397
|
+
path: operation.path
|
|
398
|
+
});
|
|
399
|
+
await link(temporary.path, destination).catch((error) => {
|
|
400
|
+
throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Destination appeared during replacement publication: ${operation.path}.`, { cause: error });
|
|
401
|
+
});
|
|
402
|
+
await options.faultInjector?.({
|
|
403
|
+
phase: "after-postimage-linked",
|
|
404
|
+
operationIndex: options.index,
|
|
405
|
+
path: operation.path
|
|
406
|
+
});
|
|
407
|
+
await unlink(temporary.path);
|
|
408
|
+
}
|
|
409
|
+
await syncDirectoryStrictly(parent);
|
|
410
|
+
const published = await observeKnownFile(options.root, operation.path, operation.postimage.size);
|
|
411
|
+
if (!matchesKnownFileImage(published, operation.postimage) || published.identity === undefined ||
|
|
412
|
+
!sameKnownFileIdentity(published.identity, temporary.identity)) {
|
|
413
|
+
throw new KnownFileTransactionError("KNOWN_FILE_POSTIMAGE_INVALID", `Published postimage failed exact verification: ${operation.path}.`);
|
|
414
|
+
}
|
|
415
|
+
journalOperation = Object.freeze({ ...journalOperation, state: "published" });
|
|
416
|
+
await persist(options.store, options.stored, replaceOperation(options.stored.envelope.journal, options.index, journalOperation));
|
|
417
|
+
await options.faultInjector?.({
|
|
418
|
+
phase: "after-operation-published",
|
|
419
|
+
operationIndex: options.index,
|
|
420
|
+
path: operation.path
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
export function compileKnownFileTransactionReceipt(journal, outcome) {
|
|
424
|
+
const operations = journal.operations.map((entry, index) => {
|
|
425
|
+
const planOperation = journal.plan.operations[index];
|
|
426
|
+
const operationOutcome = entry.state === "already-satisfied"
|
|
427
|
+
? "already-satisfied"
|
|
428
|
+
: planOperation.precondition.state === "absent" ? "created" : "replaced";
|
|
429
|
+
return Object.freeze({
|
|
430
|
+
path: entry.path,
|
|
431
|
+
outcome: operationOutcome,
|
|
432
|
+
resultDigest: planOperation.postimage.digest
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
const body = {
|
|
436
|
+
schemaVersion: 1,
|
|
437
|
+
protocol: "foundation.replace-known-file/v1",
|
|
438
|
+
planDigest: journal.plan.planDigest,
|
|
439
|
+
outcome,
|
|
440
|
+
operations: Object.freeze(operations)
|
|
441
|
+
};
|
|
442
|
+
return Object.freeze({
|
|
443
|
+
...body,
|
|
444
|
+
receiptDigest: sha256Json({
|
|
445
|
+
domain: "agent-teams.foundation.known-file-transaction-receipt/v1",
|
|
446
|
+
body
|
|
447
|
+
})
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
export async function verifyCommittedKnownFilePostimages(root, journal) {
|
|
451
|
+
for (const operation of journal.plan.operations) {
|
|
452
|
+
if (!matchesKnownFileImage(await observeKnownFile(root, operation.path, operation.postimage.size), operation.postimage)) {
|
|
453
|
+
throw new KnownFileTransactionError("KNOWN_FILE_COMMITTED_DRIFT", `Committed postimage changed before journal retirement: ${operation.path}.`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
async function verifyApplyingKnownFilePostimages(root, journal) {
|
|
458
|
+
for (const operation of journal.plan.operations) {
|
|
459
|
+
if (!matchesKnownFileImage(await observeKnownFile(root, operation.path, operation.postimage.size), operation.postimage)) {
|
|
460
|
+
throw new KnownFileTransactionError("KNOWN_FILE_PRECOMMIT_DRIFT", `Transaction postimage changed before commit: ${operation.path}.`);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
export async function applyKnownFileTransaction(options) {
|
|
465
|
+
assertKnownFileTransactionPlan(options.plan);
|
|
466
|
+
if (process.platform === "win32") {
|
|
467
|
+
throw new KnownFileTransactionError("KNOWN_FILE_APPLY_UNSUPPORTED", "Known-file apply requires strict directory durability and is not qualified on Windows.");
|
|
468
|
+
}
|
|
469
|
+
const root = await canonicalKnownFileRoot(options.consumerRoot);
|
|
470
|
+
const barrier = await inspectKnownFileTransactionBarrier({ consumerRoot: root });
|
|
471
|
+
if (barrier.state !== "idle" && barrier.code === "KNOWN_FILE_RECOVERY_REQUIRED") {
|
|
472
|
+
throw new KnownFileTransactionError(barrier.code, barrier.message);
|
|
473
|
+
}
|
|
474
|
+
const optimisticJournal = await initialJournal(root, options.plan);
|
|
475
|
+
if (barrier.state === "idle" &&
|
|
476
|
+
optimisticJournal.operations.every(({ state }) => state === "already-satisfied")) {
|
|
477
|
+
return compileKnownFileTransactionReceipt(optimisticJournal, "already-satisfied");
|
|
478
|
+
}
|
|
479
|
+
const coordinator = await createNodeFoundationTransactionCoordinator(root);
|
|
480
|
+
const lease = await coordinator.acquire({ requestedMutation: "known-file-transaction" });
|
|
481
|
+
let retainBarrier = false;
|
|
482
|
+
let store;
|
|
483
|
+
try {
|
|
484
|
+
await options.faultInjector?.({ phase: "after-barrier-acquired" });
|
|
485
|
+
const journal = await initialJournal(root, options.plan);
|
|
486
|
+
if (journal.operations.every(({ state }) => state === "already-satisfied")) {
|
|
487
|
+
return compileKnownFileTransactionReceipt(journal, "already-satisfied");
|
|
488
|
+
}
|
|
489
|
+
const [version, buildIdentity] = await Promise.all([
|
|
490
|
+
installedFoundationVersion(),
|
|
491
|
+
installedFoundationBuildIdentity()
|
|
492
|
+
]);
|
|
493
|
+
const envelope = compileKnownFileTransactionEnvelope({
|
|
494
|
+
foundation: { version, buildIdentity },
|
|
495
|
+
journal,
|
|
496
|
+
state: "APPLYING"
|
|
497
|
+
});
|
|
498
|
+
const stateDirectory = await ensureFoundationStateDirectory(root);
|
|
499
|
+
store = new NodeKnownFileTransactionJournalStore(stateDirectory);
|
|
500
|
+
const stored = {
|
|
501
|
+
authority: await store.create(envelope),
|
|
502
|
+
envelope
|
|
503
|
+
};
|
|
504
|
+
retainBarrier = true;
|
|
505
|
+
await options.faultInjector?.({ phase: "after-journal-created" });
|
|
506
|
+
for (let index = 0; index < options.plan.operations.length; index += 1) {
|
|
507
|
+
await executeOperation({
|
|
508
|
+
...(options.faultInjector === undefined ? {} : { faultInjector: options.faultInjector }),
|
|
509
|
+
index,
|
|
510
|
+
root,
|
|
511
|
+
store,
|
|
512
|
+
stored
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
await verifyApplyingKnownFilePostimages(root, stored.envelope.journal);
|
|
516
|
+
await persist(store, stored, stored.envelope.journal, "COMMITTED");
|
|
517
|
+
await options.faultInjector?.({ phase: "after-journal-committed" });
|
|
518
|
+
await verifyCommittedKnownFilePostimages(root, stored.envelope.journal);
|
|
519
|
+
await cleanupCommittedKnownFileCaptures(root, stored.envelope.journal, options.faultInjector);
|
|
520
|
+
await verifyCommittedKnownFilePostimages(root, stored.envelope.journal);
|
|
521
|
+
const result = compileKnownFileTransactionReceipt(stored.envelope.journal, "applied");
|
|
522
|
+
await store.remove(stored.authority);
|
|
523
|
+
await options.faultInjector?.({ phase: "after-journal-retired" });
|
|
524
|
+
retainBarrier = false;
|
|
525
|
+
return result;
|
|
526
|
+
}
|
|
527
|
+
catch (error) {
|
|
528
|
+
if (store !== undefined) {
|
|
529
|
+
try {
|
|
530
|
+
retainBarrier = await store.read() !== undefined;
|
|
531
|
+
}
|
|
532
|
+
catch {
|
|
533
|
+
// Unreadable evidence must stay protected for manual inspection.
|
|
534
|
+
retainBarrier = true;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
throw error;
|
|
538
|
+
}
|
|
539
|
+
finally {
|
|
540
|
+
await lease.release({ retainTransactionBarrier: retainBarrier });
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
export function canonicalKnownFileTransactionReceipt(value) {
|
|
544
|
+
return `${canonicalJson(value)}\n`;
|
|
545
|
+
}
|
|
546
|
+
//# sourceMappingURL=node-known-file-transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-known-file-transaction.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { PortablePathIdentity } from "./path-identity.js";
|
|
2
|
+
import type { KnownFileDigest, KnownFileTransactionPlanV1 } from "./known-file-transaction.js";
|
|
3
|
+
export interface KnownFileTransactionPortableIdentityV1 {
|
|
4
|
+
readonly birthtimeNs: string;
|
|
5
|
+
readonly dev: string;
|
|
6
|
+
readonly ino: string;
|
|
7
|
+
}
|
|
8
|
+
interface KnownFileTransactionRetirementV1 {
|
|
9
|
+
readonly kind: "destination" | "rollback-temporary" | "temporary";
|
|
10
|
+
readonly state: "ready" | "captured" | "unlink-authorized";
|
|
11
|
+
readonly directoryIdentity: KnownFileTransactionPortableIdentityV1;
|
|
12
|
+
readonly pathIdentity: KnownFileTransactionPortableIdentityV1;
|
|
13
|
+
}
|
|
14
|
+
export type KnownFileTransactionJournalOperationV1 = {
|
|
15
|
+
readonly path: string;
|
|
16
|
+
readonly state: "already-satisfied" | "pending" | "temporary-authorized";
|
|
17
|
+
readonly matchedPreimage?: number;
|
|
18
|
+
readonly rollbackTemporaryIdentity?: never;
|
|
19
|
+
readonly captureDirectoryIdentity?: never;
|
|
20
|
+
readonly capturedPreimageIdentity?: never;
|
|
21
|
+
readonly retirement?: never;
|
|
22
|
+
} | {
|
|
23
|
+
readonly path: string;
|
|
24
|
+
readonly state: "temporary-ready" | "capture-authorized" | "capture-ready" | "preimage-captured" | "destination-retired" | "publishing" | "published" | "rollback-restored";
|
|
25
|
+
readonly matchedPreimage?: number;
|
|
26
|
+
readonly rollbackTemporaryIdentity?: KnownFileTransactionPortableIdentityV1;
|
|
27
|
+
readonly temporaryIdentity: KnownFileTransactionPortableIdentityV1;
|
|
28
|
+
readonly captureDirectoryIdentity?: KnownFileTransactionPortableIdentityV1;
|
|
29
|
+
readonly capturedPreimageIdentity?: KnownFileTransactionPortableIdentityV1;
|
|
30
|
+
readonly retirement?: KnownFileTransactionRetirementV1;
|
|
31
|
+
};
|
|
32
|
+
export interface KnownFileTransactionJournalV1 {
|
|
33
|
+
readonly schemaVersion: 1;
|
|
34
|
+
readonly plan: KnownFileTransactionPlanV1;
|
|
35
|
+
readonly operations: readonly KnownFileTransactionJournalOperationV1[];
|
|
36
|
+
readonly authorizedDirectories: readonly string[];
|
|
37
|
+
readonly createdDirectories: readonly {
|
|
38
|
+
readonly path: string;
|
|
39
|
+
readonly identity: KnownFileTransactionPortableIdentityV1;
|
|
40
|
+
}[];
|
|
41
|
+
}
|
|
42
|
+
export interface KnownFileTransactionEnvelopeV1 {
|
|
43
|
+
readonly schemaVersion: 5;
|
|
44
|
+
readonly operationKind: "known-file-transaction";
|
|
45
|
+
readonly recoveryHandler: {
|
|
46
|
+
readonly id: "foundation.replace-known-file";
|
|
47
|
+
readonly contractVersion: 1;
|
|
48
|
+
};
|
|
49
|
+
readonly foundation: {
|
|
50
|
+
readonly version: string;
|
|
51
|
+
readonly buildIdentity: KnownFileDigest;
|
|
52
|
+
};
|
|
53
|
+
readonly adapterContractVersion: 1;
|
|
54
|
+
readonly payloadKind: "known-file-transaction-journal/v1";
|
|
55
|
+
readonly state: "APPLYING" | "COMMITTED";
|
|
56
|
+
readonly journal: KnownFileTransactionJournalV1;
|
|
57
|
+
readonly payloadDigest: KnownFileDigest;
|
|
58
|
+
readonly envelopeDigest: KnownFileDigest;
|
|
59
|
+
}
|
|
60
|
+
export declare function serializeKnownFileIdentity(identity: PortablePathIdentity): KnownFileTransactionPortableIdentityV1;
|
|
61
|
+
export declare function deserializeKnownFileIdentity(identity: KnownFileTransactionPortableIdentityV1): PortablePathIdentity;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=known-file-transaction-journal.d.ts.map
|