@agent-teams/engineering-foundation 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/capabilities/contract-json-schema-releases/module.d.ts.map +1 -1
  2. package/dist/capabilities/contract-json-schema-releases/module.js +4 -17
  3. package/dist/capabilities/contract-json-schema-releases/module.js.map +1 -1
  4. package/dist/capabilities/contract-protobuf-evolution/module.d.ts.map +1 -1
  5. package/dist/capabilities/contract-protobuf-evolution/module.js +4 -17
  6. package/dist/capabilities/contract-protobuf-evolution/module.js.map +1 -1
  7. package/dist/capabilities/documentation-local-references/module.d.ts.map +1 -1
  8. package/dist/capabilities/documentation-local-references/module.js +4 -17
  9. package/dist/capabilities/documentation-local-references/module.js.map +1 -1
  10. package/dist/capabilities/executable-specifications/module.d.ts.map +1 -1
  11. package/dist/capabilities/executable-specifications/module.js +4 -17
  12. package/dist/capabilities/executable-specifications/module.js.map +1 -1
  13. package/dist/capabilities/governance-architecture-decisions/module.d.ts.map +1 -1
  14. package/dist/capabilities/governance-architecture-decisions/module.js +4 -17
  15. package/dist/capabilities/governance-architecture-decisions/module.js.map +1 -1
  16. package/dist/capabilities/public-api-compatibility/module.d.ts.map +1 -1
  17. package/dist/capabilities/public-api-compatibility/module.js +4 -19
  18. package/dist/capabilities/public-api-compatibility/module.js.map +1 -1
  19. package/dist/capabilities/quality-gate-runner/module.d.ts.map +1 -1
  20. package/dist/capabilities/quality-gate-runner/module.js +4 -17
  21. package/dist/capabilities/quality-gate-runner/module.js.map +1 -1
  22. package/dist/capabilities/repository-agent-workflow/module.d.ts.map +1 -1
  23. package/dist/capabilities/repository-agent-workflow/module.js +4 -17
  24. package/dist/capabilities/repository-agent-workflow/module.js.map +1 -1
  25. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/workflow-evidence-parser.d.ts.map +1 -1
  26. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/workflow-evidence-parser.js +33 -0
  27. package/dist/capabilities/repository-security-baseline/adapters/outbound/filesystem/workflow-evidence-parser.js.map +1 -1
  28. package/dist/capabilities/repository-security-baseline/application/model/repository-security.d.ts +1 -0
  29. package/dist/capabilities/repository-security-baseline/application/model/repository-security.d.ts.map +1 -1
  30. package/dist/capabilities/repository-security-baseline/application/model/repository-security.js.map +1 -1
  31. package/dist/capabilities/repository-security-baseline/application/policies/dependency-review-ordering.js +1 -1
  32. package/dist/capabilities/repository-security-baseline/application/policies/dependency-review-ordering.js.map +1 -1
  33. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security-tools.js +1 -1
  34. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security-tools.js.map +1 -1
  35. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js +1 -1
  36. package/dist/capabilities/repository-security-baseline/application/policies/evaluate-repository-security.js.map +1 -1
  37. package/dist/capabilities/repository-security-baseline/module.d.ts.map +1 -1
  38. package/dist/capabilities/repository-security-baseline/module.js +4 -17
  39. package/dist/capabilities/repository-security-baseline/module.js.map +1 -1
  40. package/dist/capabilities/source-dependencies/module.d.ts.map +1 -1
  41. package/dist/capabilities/source-dependencies/module.js +4 -19
  42. package/dist/capabilities/source-dependencies/module.js.map +1 -1
  43. package/dist/capabilities/suppression-governance/module.d.ts.map +1 -1
  44. package/dist/capabilities/suppression-governance/module.js +4 -19
  45. package/dist/capabilities/suppression-governance/module.js.map +1 -1
  46. package/dist/capabilities/workspace-dependency-declarations/module.d.ts.map +1 -1
  47. package/dist/capabilities/workspace-dependency-declarations/module.js +4 -18
  48. package/dist/capabilities/workspace-dependency-declarations/module.js.map +1 -1
  49. package/dist/capability-runtime.d.ts +8 -0
  50. package/dist/capability-runtime.d.ts.map +1 -1
  51. package/dist/capability-runtime.js +66 -0
  52. package/dist/capability-runtime.js.map +1 -1
  53. package/dist/check-runner.d.ts.map +1 -1
  54. package/dist/check-runner.js +16 -10
  55. package/dist/check-runner.js.map +1 -1
  56. package/dist/document-authoring/adapters/node/node-document-transaction-coordinator.d.ts.map +1 -1
  57. package/dist/document-authoring/adapters/node/node-document-transaction-coordinator.js +4 -26
  58. package/dist/document-authoring/adapters/node/node-document-transaction-coordinator.js.map +1 -1
  59. package/dist/document-authoring/index.d.ts +6 -1
  60. package/dist/document-authoring/index.d.ts.map +1 -1
  61. package/dist/document-authoring/index.js.map +1 -1
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +2 -0
  65. package/dist/index.js.map +1 -1
  66. package/dist/local-mode/attach-transaction.d.ts.map +1 -1
  67. package/dist/local-mode/attach-transaction.js +4 -2
  68. package/dist/local-mode/attach-transaction.js.map +1 -1
  69. package/dist/local-mode/index.d.ts +5 -0
  70. package/dist/local-mode/index.d.ts.map +1 -1
  71. package/dist/local-mode/index.js +5 -0
  72. package/dist/local-mode/index.js.map +1 -1
  73. package/dist/local-mode/inspection.d.ts.map +1 -1
  74. package/dist/local-mode/inspection.js +1 -6
  75. package/dist/local-mode/inspection.js.map +1 -1
  76. package/dist/local-mode/service.d.ts.map +1 -1
  77. package/dist/local-mode/service.js +4 -2
  78. package/dist/local-mode/service.js.map +1 -1
  79. package/dist/mutation/index.d.ts +8 -0
  80. package/dist/mutation/index.d.ts.map +1 -1
  81. package/dist/mutation/index.js.map +1 -1
  82. package/dist/mutation/qualification/index.d.ts +10 -0
  83. package/dist/mutation/qualification/index.d.ts.map +1 -0
  84. package/dist/mutation/qualification/index.js +6 -0
  85. package/dist/mutation/qualification/index.js.map +1 -0
  86. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.d.ts +84 -0
  87. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.d.ts.map +1 -0
  88. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.js +232 -0
  89. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.js.map +1 -0
  90. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.d.ts +9 -0
  91. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.d.ts.map +1 -0
  92. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.js +2 -0
  93. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.js.map +1 -0
  94. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.d.ts +6 -0
  95. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.d.ts.map +1 -0
  96. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.js +30 -0
  97. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.js.map +1 -0
  98. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.d.ts +11 -0
  99. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.d.ts.map +1 -0
  100. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.js +159 -0
  101. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.js.map +1 -0
  102. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.d.ts +9 -0
  103. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.d.ts.map +1 -0
  104. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.js +21 -0
  105. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.js.map +1 -0
  106. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.d.ts +9 -0
  107. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.d.ts.map +1 -0
  108. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.js +203 -0
  109. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.js.map +1 -0
  110. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.d.ts +17 -0
  111. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.d.ts.map +1 -0
  112. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.js +22 -0
  113. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.js.map +1 -0
  114. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.d.ts +15 -0
  115. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.d.ts.map +1 -0
  116. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.js +47 -0
  117. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.js.map +1 -0
  118. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.d.ts +29 -0
  119. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.d.ts.map +1 -0
  120. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.js +72 -0
  121. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.js.map +1 -0
  122. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.d.ts +31 -0
  123. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.d.ts.map +1 -0
  124. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.js +254 -0
  125. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.js.map +1 -0
  126. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.d.ts +13 -0
  127. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.d.ts.map +1 -0
  128. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.js +210 -0
  129. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.js.map +1 -0
  130. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.d.ts +15 -0
  131. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.d.ts.map +1 -0
  132. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.js +172 -0
  133. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.js.map +1 -0
  134. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.d.ts +12 -0
  135. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.d.ts.map +1 -0
  136. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.js +17 -0
  137. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.js.map +1 -0
  138. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.d.ts +14 -0
  139. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.d.ts.map +1 -0
  140. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.js +23 -0
  141. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.js.map +1 -0
  142. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts +2 -5
  143. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts.map +1 -1
  144. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js +30 -861
  145. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js.map +1 -1
  146. package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts +3 -9
  147. package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts.map +1 -1
  148. package/dist/repository-mutation/adapters/node/node-known-file-transaction.js +44 -452
  149. package/dist/repository-mutation/adapters/node/node-known-file-transaction.js.map +1 -1
  150. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.d.ts +25 -0
  151. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.d.ts.map +1 -0
  152. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.js +19 -0
  153. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.js.map +1 -0
  154. package/dist/scaffolding/adapters/node/filesystem-authority-workspace.d.ts.map +1 -1
  155. package/dist/scaffolding/adapters/node/filesystem-authority-workspace.js +8 -5
  156. package/dist/scaffolding/adapters/node/filesystem-authority-workspace.js.map +1 -1
  157. package/dist/transaction-coordination/application/model/transaction-status.d.ts +10 -0
  158. package/dist/transaction-coordination/application/model/transaction-status.d.ts.map +1 -1
  159. package/dist/transaction-coordination/application/release-foundation-transaction-lease.d.ts +6 -0
  160. package/dist/transaction-coordination/application/release-foundation-transaction-lease.d.ts.map +1 -0
  161. package/dist/transaction-coordination/application/release-foundation-transaction-lease.js +23 -0
  162. package/dist/transaction-coordination/application/release-foundation-transaction-lease.js.map +1 -0
  163. package/dist/unexpected-failure.d.ts +9 -0
  164. package/dist/unexpected-failure.d.ts.map +1 -0
  165. package/dist/unexpected-failure.js +105 -0
  166. package/dist/unexpected-failure.js.map +1 -0
  167. package/package.json +5 -1
@@ -0,0 +1,232 @@
1
+ import { link, lstat, mkdir, open, realpath, rename, unlink } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { serializeKnownFileIdentity } from "../../application/model/known-file-transaction-journal.js";
4
+ import { captureFileHandleIdentity, pathMatchesRegularFileIdentity, readBoundedRegularFile } from "./node-bounded-regular-file.js";
5
+ import { syncDirectoryStrictly } from "./node-directory-durability.js";
6
+ import { prepareRollbackTemporary } from "./node-known-file-recovery-filesystem.js";
7
+ import { persistKnownFileApplyState, transitionKnownFileOperation } from "./node-known-file-apply-state.js";
8
+ import { knownFileAliasEntry, knownFileCaptureDirectoryName, knownFileErrorCode, knownFileImageBytes, knownFileTemporaryName, KnownFileTransactionError, matchesKnownFileImage, maximumKnownFileEvidenceBytes, sameKnownFileIdentity } from "./node-known-file-transaction-filesystem.js";
9
+ import { isLexicallyContainedPath } from "./node-repository-path.js";
10
+ export async function ensureKnownFileParentDirectories(options) {
11
+ const segments = options.operationPath.split("/");
12
+ segments.pop();
13
+ let current = options.root;
14
+ const traversed = [];
15
+ for (const segment of segments) {
16
+ traversed.push(segment);
17
+ const repositoryPath = traversed.join("/");
18
+ if (await knownFileAliasEntry(current, segment) === undefined) {
19
+ const authorized = Object.freeze({
20
+ ...options.stored.envelope.journal,
21
+ authorizedDirectories: Object.freeze([
22
+ ...options.stored.envelope.journal.authorizedDirectories,
23
+ repositoryPath
24
+ ])
25
+ });
26
+ await persistKnownFileApplyState(options.store, options.stored, authorized);
27
+ await options.faultInjector?.({
28
+ phase: "after-directory-authorized",
29
+ operationIndex: options.index,
30
+ path: repositoryPath
31
+ });
32
+ await mkdir(join(current, segment), { mode: 0o755 });
33
+ await syncDirectoryStrictly(current);
34
+ const metadata = await lstat(join(current, segment), { bigint: true });
35
+ if (!metadata.isDirectory() || metadata.isSymbolicLink()) {
36
+ throw new KnownFileTransactionError("KNOWN_FILE_DIRECTORY_INVALID", `Created ancestor is not one real directory: ${repositoryPath}.`);
37
+ }
38
+ const identity = serializeKnownFileIdentity({
39
+ birthtimeNs: metadata.birthtimeNs,
40
+ dev: metadata.dev,
41
+ ino: metadata.ino
42
+ });
43
+ await options.faultInjector?.({
44
+ phase: "after-directory-created-unbound",
45
+ operationIndex: options.index,
46
+ path: repositoryPath
47
+ });
48
+ const journal = Object.freeze({
49
+ ...options.stored.envelope.journal,
50
+ authorizedDirectories: Object.freeze(options.stored.envelope.journal.authorizedDirectories.filter((path) => path !== repositoryPath)),
51
+ createdDirectories: Object.freeze([
52
+ ...options.stored.envelope.journal.createdDirectories,
53
+ Object.freeze({ path: repositoryPath, identity })
54
+ ])
55
+ });
56
+ await persistKnownFileApplyState(options.store, options.stored, journal);
57
+ await options.faultInjector?.({
58
+ phase: "after-directory-created",
59
+ operationIndex: options.index,
60
+ path: repositoryPath
61
+ });
62
+ }
63
+ current = join(current, segment);
64
+ const metadata = await lstat(current);
65
+ if (metadata.isSymbolicLink() || !metadata.isDirectory() ||
66
+ !isLexicallyContainedPath(options.root, await realpath(current))) {
67
+ throw new KnownFileTransactionError("KNOWN_FILE_ANCESTOR_INVALID", `Managed path ancestor changed: ${options.operationPath}.`);
68
+ }
69
+ }
70
+ return current;
71
+ }
72
+ export async function prepareKnownFileTemporary(options) {
73
+ const path = join(options.parent, knownFileTemporaryName(options.operation.path, options.planDigest, options.operationIndex));
74
+ const handle = await open(path, "wx", 0o600).catch((error) => {
75
+ 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 });
76
+ });
77
+ try {
78
+ await handle.writeFile(knownFileImageBytes(options.operation.postimage));
79
+ await handle.chmod(options.operation.postimage.mode);
80
+ await handle.sync();
81
+ return Object.freeze({ path, identity: await captureFileHandleIdentity(handle) });
82
+ }
83
+ finally {
84
+ await handle.close();
85
+ }
86
+ }
87
+ export async function verifyKnownFileTemporary(temporary, image) {
88
+ const observed = await readBoundedRegularFile(temporary.path, image.size);
89
+ if (observed.outcome !== "read" ||
90
+ !sameKnownFileIdentity(observed.identity, temporary.identity) ||
91
+ !matchesKnownFileImage({
92
+ state: "file",
93
+ bytes: observed.bytes,
94
+ identity: observed.identity,
95
+ mode: observed.mode & 0o777
96
+ }, image)) {
97
+ throw new KnownFileTransactionError("KNOWN_FILE_TEMPORARY_CHANGED", "Transaction-owned temporary changed before publication.");
98
+ }
99
+ }
100
+ export async function prepareKnownFileCapture(options) {
101
+ const directory = join(options.parent, knownFileCaptureDirectoryName(options.operation.path, options.planDigest, options.operationIndex));
102
+ const paths = {
103
+ captured: join(directory, "preimage"),
104
+ directory,
105
+ retired: join(directory, "retired")
106
+ };
107
+ await mkdir(paths.directory, { mode: 0o700 }).catch((error) => {
108
+ throw new KnownFileTransactionError(knownFileErrorCode(error) === "EEXIST"
109
+ ? "KNOWN_FILE_CAPTURE_EXISTS"
110
+ : "KNOWN_FILE_CAPTURE_CREATE_FAILED", `Could not create the transaction-owned capture for ${options.operation.path}.`, { cause: error });
111
+ });
112
+ await syncDirectoryStrictly(options.parent);
113
+ const metadata = await lstat(paths.directory, { bigint: true });
114
+ if (!metadata.isDirectory() || metadata.isSymbolicLink()) {
115
+ throw new KnownFileTransactionError("KNOWN_FILE_CAPTURE_INVALID", `Transaction capture is not one real directory: ${options.operation.path}.`);
116
+ }
117
+ return Object.freeze({
118
+ identity: {
119
+ birthtimeNs: metadata.birthtimeNs,
120
+ dev: metadata.dev,
121
+ ino: metadata.ino
122
+ },
123
+ paths: Object.freeze(paths)
124
+ });
125
+ }
126
+ export async function captureKnownFilePreimage(options) {
127
+ const destination = join(options.root, ...options.operation.path.split("/"));
128
+ await link(destination, options.capture.paths.captured).catch((error) => {
129
+ throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Could not capture the exact replacement preimage: ${options.operation.path}.`, { cause: error });
130
+ });
131
+ await syncDirectoryStrictly(options.capture.paths.directory);
132
+ const captured = await readBoundedRegularFile(options.capture.paths.captured, maximumKnownFileEvidenceBytes(options.operation));
133
+ const matchedPreimage = captured.outcome === "read"
134
+ ? options.operation.precondition.acceptedPreimages.findIndex((image) => matchesKnownFileImage({
135
+ state: "file",
136
+ bytes: captured.bytes,
137
+ identity: captured.identity,
138
+ mode: captured.mode & 0o777
139
+ }, image))
140
+ : -1;
141
+ if (captured.outcome !== "read" || captured.linkCount !== 2n || matchedPreimage < 0) {
142
+ await unlink(options.capture.paths.captured);
143
+ await syncDirectoryStrictly(options.capture.paths.directory);
144
+ throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Captured replacement preimage is no longer accepted: ${options.operation.path}.`);
145
+ }
146
+ return Object.freeze({ identity: captured.identity, matchedPreimage });
147
+ }
148
+ export async function prepareKnownFileRollback(options) {
149
+ const rollbackPath = join(options.parent, `.${options.operation.path.split("/").at(-1)}.agent-teams.rollback.${options.index}.tmp`);
150
+ const rollbackIdentity = await prepareRollbackTemporary({
151
+ operationPath: options.operation.path,
152
+ path: rollbackPath,
153
+ preimage: options.operation.precondition.acceptedPreimages[options.preimageIndex]
154
+ });
155
+ await options.faultInjector?.({
156
+ phase: "after-rollback-temporary-created-unbound",
157
+ operationIndex: options.index,
158
+ path: options.operation.path
159
+ });
160
+ await syncDirectoryStrictly(options.parent);
161
+ if (await pathMatchesRegularFileIdentity(rollbackPath, rollbackIdentity) !== "match") {
162
+ throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Rollback temporary changed before durable identity binding: ${options.operation.path}.`);
163
+ }
164
+ const journal = transitionKnownFileOperation(options.stored.envelope.journal, options.index, { rollbackTemporaryIdentity: serializeKnownFileIdentity(rollbackIdentity) });
165
+ await persistKnownFileApplyState(options.store, options.stored, journal);
166
+ await options.faultInjector?.({
167
+ phase: "after-rollback-temporary-ready",
168
+ operationIndex: options.index,
169
+ path: options.operation.path
170
+ });
171
+ }
172
+ export async function retireKnownFileDestination(options) {
173
+ await rename(options.destination, options.capture.paths.retired).catch((error) => {
174
+ throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Destination disappeared before identity-bound capture: ${options.operationPath}.`, { cause: error });
175
+ });
176
+ await syncDirectoryStrictly(options.capture.paths.directory);
177
+ await syncDirectoryStrictly(options.parent);
178
+ await options.faultInjector?.({
179
+ phase: "after-destination-captured",
180
+ operationIndex: options.index,
181
+ path: options.operationPath
182
+ });
183
+ const retired = await readBoundedRegularFile(options.capture.paths.retired, 8 * 1024 * 1024);
184
+ if (retired.outcome !== "read" ||
185
+ !sameKnownFileIdentity(retired.identity, options.capturedIdentity)) {
186
+ if (retired.outcome === "read") {
187
+ try {
188
+ await link(options.capture.paths.retired, options.destination);
189
+ await syncDirectoryStrictly(options.parent);
190
+ await unlink(options.capture.paths.retired);
191
+ await syncDirectoryStrictly(options.capture.paths.directory);
192
+ }
193
+ catch (error) {
194
+ if (knownFileErrorCode(error) !== "EEXIST") {
195
+ throw error;
196
+ }
197
+ }
198
+ }
199
+ throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `A foreign destination appeared during identity-bound capture: ${options.operationPath}.`);
200
+ }
201
+ const stableCaptured = await readBoundedRegularFile(options.capture.paths.captured, options.preimage.size);
202
+ if (stableCaptured.outcome !== "read" ||
203
+ stableCaptured.linkCount !== 2n ||
204
+ !sameKnownFileIdentity(stableCaptured.identity, options.capturedIdentity) ||
205
+ !matchesKnownFileImage({
206
+ state: "file",
207
+ bytes: stableCaptured.bytes,
208
+ identity: stableCaptured.identity,
209
+ mode: stableCaptured.mode & 0o777
210
+ }, options.preimage)) {
211
+ await link(options.capture.paths.retired, options.destination).catch((error) => {
212
+ throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_CONFLICT", `Mutated retired destination could not be restored: ${options.operationPath}.`, { cause: error });
213
+ });
214
+ await syncDirectoryStrictly(options.parent);
215
+ await unlink(options.capture.paths.retired);
216
+ await syncDirectoryStrictly(options.capture.paths.directory);
217
+ throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", `Captured replacement preimage changed through an open file handle: ${options.operationPath}.`);
218
+ }
219
+ await unlink(options.capture.paths.retired);
220
+ await syncDirectoryStrictly(options.capture.paths.directory);
221
+ }
222
+ export async function publishKnownFileLink(options) {
223
+ await link(options.temporaryPath, options.destination).catch((error) => {
224
+ throw new KnownFileTransactionError("KNOWN_FILE_CAS_MISMATCH", options.replacement
225
+ ? `Destination appeared during replacement publication: ${options.operationPath}.`
226
+ : `Destination appeared during create CAS: ${options.operationPath}.`, { cause: error });
227
+ });
228
+ }
229
+ export async function unlinkKnownFileTemporary(path) {
230
+ await unlink(path);
231
+ }
232
+ //# sourceMappingURL=node-known-file-apply-effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-effects.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-effects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type KnownFileTransactionFaultPoint = {
2
+ readonly phase: "after-barrier-acquired" | "after-journal-created" | "after-journal-committed" | "after-journal-retired";
3
+ } | {
4
+ readonly phase: "after-directory-created" | "after-directory-created-unbound" | "after-directory-authorized" | "after-temporary-authorized" | "after-temporary-synced" | "after-temporary-created-unbound" | "after-capture-ready" | "after-capture-created-unbound" | "after-capture-authorized" | "after-preimage-captured" | "after-preimage-linked-unbound" | "after-rollback-temporary-created-unbound" | "after-rollback-temporary-ready" | "after-destination-captured" | "after-destination-retired" | "after-operation-publishing" | "after-postimage-linked" | "after-operation-published" | "after-committed-capture-unlinked";
5
+ readonly operationIndex: number;
6
+ readonly path: string;
7
+ };
8
+ export type KnownFileTransactionFaultInjector = (point: KnownFileTransactionFaultPoint) => Promise<void> | void;
9
+ //# sourceMappingURL=node-known-file-apply-faults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-faults.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-faults.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,8BAA8B,GACtC;IACE,QAAQ,CAAC,KAAK,EACV,wBAAwB,GACxB,uBAAuB,GACvB,yBAAyB,GACzB,uBAAuB,CAAC;CAC7B,GACD;IACE,QAAQ,CAAC,KAAK,EACV,yBAAyB,GACzB,iCAAiC,GACjC,4BAA4B,GAC5B,4BAA4B,GAC5B,wBAAwB,GACxB,iCAAiC,GACjC,qBAAqB,GACrB,+BAA+B,GAC/B,0BAA0B,GAC1B,yBAAyB,GACzB,+BAA+B,GAC/B,0CAA0C,GAC1C,gCAAgC,GAChC,4BAA4B,GAC5B,2BAA2B,GAC3B,4BAA4B,GAC5B,wBAAwB,GACxB,2BAA2B,GAC3B,kCAAkC,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEN,MAAM,MAAM,iCAAiC,GAAG,CAC9C,KAAK,EAAE,8BAA8B,KAClC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=node-known-file-apply-faults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-faults.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-faults.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { KnownFileTransactionPlanV1 } from "../../application/model/known-file-transaction.js";
2
+ import type { KnownFileTransactionJournalV1 } from "../../application/model/known-file-transaction-journal.js";
3
+ export declare function observeInitialKnownFileJournal(root: string, plan: KnownFileTransactionPlanV1): Promise<KnownFileTransactionJournalV1>;
4
+ export declare function verifyApplyingKnownFilePostimages(root: string, journal: KnownFileTransactionJournalV1): Promise<void>;
5
+ export declare function verifyCommittedKnownFilePostimages(root: string, journal: KnownFileTransactionJournalV1): Promise<void>;
6
+ //# sourceMappingURL=node-known-file-apply-observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-observation.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mDAAmD,CAAC;AACpG,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2DAA2D,CAAC;AAS/G,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,6BAA6B,CAAC,CAiBxC;AAgBD,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,kCAAkC,CACtD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,30 @@
1
+ import { classifyKnownFileOperation, KnownFileTransactionError, matchesKnownFileImage, maximumKnownFileEvidenceBytes, observeKnownFile } from "./node-known-file-transaction-filesystem.js";
2
+ export async function observeInitialKnownFileJournal(root, plan) {
3
+ const operations = [];
4
+ for (const operation of plan.operations) {
5
+ const observation = await observeKnownFile(root, operation.path, maximumKnownFileEvidenceBytes(operation));
6
+ operations.push(classifyKnownFileOperation(operation, observation));
7
+ }
8
+ return Object.freeze({
9
+ schemaVersion: 1,
10
+ plan,
11
+ operations: Object.freeze(operations),
12
+ authorizedDirectories: Object.freeze([]),
13
+ createdDirectories: Object.freeze([])
14
+ });
15
+ }
16
+ async function verifyKnownFilePostimages(root, journal, code, message) {
17
+ for (const operation of journal.plan.operations) {
18
+ const observation = await observeKnownFile(root, operation.path, operation.postimage.size);
19
+ if (!matchesKnownFileImage(observation, operation.postimage)) {
20
+ throw new KnownFileTransactionError(code, message(operation.path));
21
+ }
22
+ }
23
+ }
24
+ export async function verifyApplyingKnownFilePostimages(root, journal) {
25
+ await verifyKnownFilePostimages(root, journal, "KNOWN_FILE_PRECOMMIT_DRIFT", (path) => `Transaction postimage changed before commit: ${path}.`);
26
+ }
27
+ export async function verifyCommittedKnownFilePostimages(root, journal) {
28
+ await verifyKnownFilePostimages(root, journal, "KNOWN_FILE_COMMITTED_DRIFT", (path) => `Committed postimage changed before journal retirement: ${path}.`);
29
+ }
30
+ //# sourceMappingURL=node-known-file-apply-observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-observation.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-observation.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,6BAA6B,EAC7B,gBAAgB,EACjB,MAAM,6CAA6C,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,IAAY,EACZ,IAAgC;IAEhC,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,gBAAgB,CACxC,IAAI,EACJ,SAAS,CAAC,IAAI,EACd,6BAA6B,CAAC,SAAS,CAAC,CACzC,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,aAAa,EAAE,CAAC;QAChB,IAAI;QACJ,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;QACrC,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;KACtC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,IAAY,EACZ,OAAsC,EACtC,IAAiE,EACjE,OAAiC;IAEjC,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3F,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,IAAY,EACZ,OAAsC;IAEtC,MAAM,yBAAyB,CAC7B,IAAI,EACJ,OAAO,EACP,4BAA4B,EAC5B,CAAC,IAAI,EAAE,EAAE,CAAC,gDAAgD,IAAI,GAAG,CAClE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,IAAY,EACZ,OAAsC;IAEtC,MAAM,yBAAyB,CAC7B,IAAI,EACJ,OAAO,EACP,4BAA4B,EAC5B,CAAC,IAAI,EAAE,EAAE,CAAC,0DAA0D,IAAI,GAAG,CAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { KnownFileTransactionFaultInjector } from "./node-known-file-apply-faults.js";
2
+ import { type KnownFileApplyState } from "./node-known-file-apply-state.js";
3
+ import type { NodeKnownFileTransactionJournalStore } from "./node-known-file-transaction-journal-store.js";
4
+ export declare function executeKnownFileOperation(options: {
5
+ readonly faultInjector?: KnownFileTransactionFaultInjector;
6
+ readonly index: number;
7
+ readonly root: string;
8
+ readonly store: NodeKnownFileTransactionJournalStore;
9
+ readonly stored: KnownFileApplyState;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=node-known-file-apply-operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-operation.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-operation.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,kCAAkC,CAAC;AAO1C,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,gDAAgD,CAAC;AAwI3G,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,iCAAiC,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,oCAAoC,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;CACtC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DhB"}
@@ -0,0 +1,159 @@
1
+ import { join } from "node:path";
2
+ import { serializeKnownFileIdentity } from "../../application/model/known-file-transaction-journal.js";
3
+ import { syncDirectoryStrictly } from "./node-directory-durability.js";
4
+ import { captureKnownFilePreimage, ensureKnownFileParentDirectories, prepareKnownFileCapture, prepareKnownFileRollback, prepareKnownFileTemporary, publishKnownFileLink, retireKnownFileDestination, unlinkKnownFileTemporary, verifyKnownFileTemporary } from "./node-known-file-apply-effects.js";
5
+ import { persistKnownFileApplyState, transitionKnownFileOperation } from "./node-known-file-apply-state.js";
6
+ import { KnownFileTransactionError, matchesKnownFileImage, observeKnownFile, sameKnownFileIdentity } from "./node-known-file-transaction-filesystem.js";
7
+ async function transitionAndCheckpoint(context, transition, phase) {
8
+ const operation = context.stored.envelope.journal.plan.operations[context.index];
9
+ const journal = transitionKnownFileOperation(context.stored.envelope.journal, context.index, transition);
10
+ await persistKnownFileApplyState(context.store, context.stored, journal);
11
+ await context.faultInjector?.({
12
+ phase,
13
+ operationIndex: context.index,
14
+ path: operation.path
15
+ });
16
+ }
17
+ async function publishPreparedLink(context, replacement) {
18
+ const operation = context.stored.envelope.journal.plan.operations[context.index];
19
+ await transitionAndCheckpoint(context, { state: "publishing" }, "after-operation-publishing");
20
+ await publishKnownFileLink({
21
+ destination: context.destination,
22
+ operationPath: operation.path,
23
+ temporaryPath: context.temporary.path,
24
+ replacement
25
+ });
26
+ await context.faultInjector?.({
27
+ phase: "after-postimage-linked",
28
+ operationIndex: context.index,
29
+ path: operation.path
30
+ });
31
+ await unlinkKnownFileTemporary(context.temporary.path);
32
+ }
33
+ async function prepareCapture(context) {
34
+ const operation = context.stored.envelope.journal.plan.operations[context.index];
35
+ await transitionAndCheckpoint(context, { state: "capture-authorized" }, "after-capture-authorized");
36
+ const capture = await prepareKnownFileCapture({
37
+ operation,
38
+ operationIndex: context.index,
39
+ parent: context.parent,
40
+ planDigest: context.stored.envelope.journal.plan.planDigest
41
+ });
42
+ await context.faultInjector?.({
43
+ phase: "after-capture-created-unbound",
44
+ operationIndex: context.index,
45
+ path: operation.path
46
+ });
47
+ await transitionAndCheckpoint(context, {
48
+ captureDirectoryIdentity: serializeKnownFileIdentity(capture.identity),
49
+ state: "capture-ready"
50
+ }, "after-capture-ready");
51
+ return capture;
52
+ }
53
+ async function executeKnownFileReplacement(context) {
54
+ const operation = context.stored.envelope.journal.plan.operations[context.index];
55
+ if (operation.precondition.state !== "known-file") {
56
+ throw new KnownFileTransactionError("KNOWN_FILE_JOURNAL_INVALID", `Replacement operation has no known preimage: ${operation.path}.`);
57
+ }
58
+ const capture = await prepareCapture(context);
59
+ const captured = await captureKnownFilePreimage({
60
+ capture,
61
+ operation: { ...operation, precondition: operation.precondition },
62
+ root: context.root
63
+ });
64
+ await context.faultInjector?.({
65
+ phase: "after-preimage-linked-unbound",
66
+ operationIndex: context.index,
67
+ path: operation.path
68
+ });
69
+ await transitionAndCheckpoint(context, {
70
+ capturedPreimageIdentity: serializeKnownFileIdentity(captured.identity),
71
+ matchedPreimage: captured.matchedPreimage,
72
+ state: "preimage-captured"
73
+ }, "after-preimage-captured");
74
+ await prepareKnownFileRollback({
75
+ ...(context.faultInjector === undefined ? {} : { faultInjector: context.faultInjector }),
76
+ index: context.index,
77
+ operation: { ...operation, precondition: operation.precondition },
78
+ parent: context.parent,
79
+ preimageIndex: captured.matchedPreimage,
80
+ store: context.store,
81
+ stored: context.stored
82
+ });
83
+ await retireKnownFileDestination({
84
+ capture,
85
+ capturedIdentity: captured.identity,
86
+ destination: context.destination,
87
+ ...(context.faultInjector === undefined ? {} : { faultInjector: context.faultInjector }),
88
+ index: context.index,
89
+ operationPath: operation.path,
90
+ parent: context.parent,
91
+ preimage: operation.precondition.acceptedPreimages[captured.matchedPreimage]
92
+ });
93
+ await transitionAndCheckpoint(context, { state: "destination-retired" }, "after-destination-retired");
94
+ await publishPreparedLink(context, true);
95
+ }
96
+ async function verifyPublishedPostimage(context) {
97
+ const operation = context.stored.envelope.journal.plan.operations[context.index];
98
+ await syncDirectoryStrictly(context.parent);
99
+ const published = await observeKnownFile(context.root, operation.path, operation.postimage.size);
100
+ if (!matchesKnownFileImage(published, operation.postimage) || published.identity === undefined ||
101
+ !sameKnownFileIdentity(published.identity, context.temporary.identity)) {
102
+ throw new KnownFileTransactionError("KNOWN_FILE_POSTIMAGE_INVALID", `Published postimage failed exact verification: ${operation.path}.`);
103
+ }
104
+ await transitionAndCheckpoint(context, { state: "published" }, "after-operation-published");
105
+ }
106
+ export async function executeKnownFileOperation(options) {
107
+ const operation = options.stored.envelope.journal.plan.operations[options.index];
108
+ const journalOperation = options.stored.envelope.journal.operations[options.index];
109
+ if (journalOperation.state === "already-satisfied" || journalOperation.state === "published") {
110
+ return;
111
+ }
112
+ if (journalOperation.state !== "pending") {
113
+ throw new KnownFileTransactionError("KNOWN_FILE_RECOVERY_REQUIRED", `Operation ${operation.path} is already in progress and requires recovery.`);
114
+ }
115
+ const parent = await ensureKnownFileParentDirectories({
116
+ ...options,
117
+ operationPath: operation.path
118
+ });
119
+ const temporaryContext = {
120
+ destination: join(options.root, ...operation.path.split("/")),
121
+ ...options,
122
+ parent
123
+ };
124
+ const authorized = transitionKnownFileOperation(options.stored.envelope.journal, options.index, { state: "temporary-authorized" });
125
+ await persistKnownFileApplyState(options.store, options.stored, authorized);
126
+ await options.faultInjector?.({
127
+ phase: "after-temporary-authorized",
128
+ operationIndex: options.index,
129
+ path: operation.path
130
+ });
131
+ const temporary = await prepareKnownFileTemporary({
132
+ operation,
133
+ operationIndex: options.index,
134
+ parent,
135
+ planDigest: options.stored.envelope.journal.plan.planDigest
136
+ });
137
+ await options.faultInjector?.({
138
+ phase: "after-temporary-created-unbound",
139
+ operationIndex: options.index,
140
+ path: operation.path
141
+ });
142
+ const ready = transitionKnownFileOperation(options.stored.envelope.journal, options.index, { state: "temporary-ready", temporaryIdentity: serializeKnownFileIdentity(temporary.identity) });
143
+ await persistKnownFileApplyState(options.store, options.stored, ready);
144
+ await options.faultInjector?.({
145
+ phase: "after-temporary-synced",
146
+ operationIndex: options.index,
147
+ path: operation.path
148
+ });
149
+ await verifyKnownFileTemporary(temporary, operation.postimage);
150
+ const context = { ...temporaryContext, temporary };
151
+ if (operation.precondition.state === "absent") {
152
+ await publishPreparedLink(context, false);
153
+ }
154
+ else {
155
+ await executeKnownFileReplacement(context);
156
+ }
157
+ await verifyPublishedPostimage(context);
158
+ }
159
+ //# sourceMappingURL=node-known-file-apply-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-operation.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-operation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { KnownFileTransactionEnvelopeV1, KnownFileTransactionJournalOperationV1, KnownFileTransactionJournalV1 } from "../../application/model/known-file-transaction-journal.js";
2
+ import type { KnownFileJournalAuthority, NodeKnownFileTransactionJournalStore } from "./node-known-file-transaction-journal-store.js";
3
+ export interface KnownFileApplyState {
4
+ authority: KnownFileJournalAuthority;
5
+ envelope: KnownFileTransactionEnvelopeV1;
6
+ }
7
+ export declare function transitionKnownFileOperation(journal: KnownFileTransactionJournalV1, index: number, transition: Partial<KnownFileTransactionJournalOperationV1>): KnownFileTransactionJournalV1;
8
+ export declare function persistKnownFileApplyState(store: NodeKnownFileTransactionJournalStore, stored: KnownFileApplyState, journal: KnownFileTransactionJournalV1, state?: KnownFileTransactionEnvelopeV1["state"]): Promise<void>;
9
+ //# sourceMappingURL=node-known-file-apply-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-state.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,8BAA8B,EAC9B,sCAAsC,EACtC,6BAA6B,EAC9B,MAAM,2DAA2D,CAAC;AAEnE,OAAO,KAAK,EACV,yBAAyB,EACzB,oCAAoC,EACrC,MAAM,gDAAgD,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,yBAAyB,CAAC;IACrC,QAAQ,EAAE,8BAA8B,CAAC;CAC1C;AAaD,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,6BAA6B,EACtC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,CAAC,sCAAsC,CAAC,GAC1D,6BAA6B,CAO/B;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,oCAAoC,EAC3C,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,6BAA6B,EACtC,KAAK,GAAE,8BAA8B,CAAC,OAAO,CAAc,GAC1D,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,21 @@
1
+ import { compileKnownFileTransactionEnvelope } from "../../application/policies/known-file-transaction-envelope.js";
2
+ function replaceKnownFileOperation(journal, index, replacement) {
3
+ return Object.freeze({
4
+ ...journal,
5
+ operations: Object.freeze(journal.operations.with(index, replacement))
6
+ });
7
+ }
8
+ export function transitionKnownFileOperation(journal, index, transition) {
9
+ const current = journal.operations[index];
10
+ return replaceKnownFileOperation(journal, index, Object.freeze({ ...current, ...transition }));
11
+ }
12
+ export async function persistKnownFileApplyState(store, stored, journal, state = "APPLYING") {
13
+ const envelope = compileKnownFileTransactionEnvelope({
14
+ foundation: stored.envelope.foundation,
15
+ journal,
16
+ state
17
+ });
18
+ stored.authority = await store.replace(stored.authority, envelope);
19
+ stored.envelope = envelope;
20
+ }
21
+ //# sourceMappingURL=node-known-file-apply-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-apply-state.js","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-apply-state.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mCAAmC,EAAE,MAAM,+DAA+D,CAAC;AAWpH,SAAS,yBAAyB,CAChC,OAAsC,EACtC,KAAa,EACb,WAAmD;IAEnD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,OAAO;QACV,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;KACvE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,OAAsC,EACtC,KAAa,EACb,UAA2D;IAE3D,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAE,CAAC;IAC3C,OAAO,yBAAyB,CAC9B,OAAO,EACP,KAAK,EACL,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,UAAU,EAAE,CAA2C,CACvF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAA2C,EAC3C,MAA2B,EAC3B,OAAsC,EACtC,KAAK,GAA4C,UAAU;IAE3D,MAAM,QAAQ,GAAG,mCAAmC,CAAC;QACnD,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;QACtC,OAAO;QACP,KAAK;KACN,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { KnownFileRecoveryFaultInjector, StoredRecoveryJournal } from "./node-known-file-recovery-state.js";
2
+ import type { NodeKnownFileTransactionJournalStore } from "./node-known-file-transaction-journal-store.js";
3
+ export declare function rollbackKnownFileRecovery(options: {
4
+ readonly faultInjector?: KnownFileRecoveryFaultInjector;
5
+ readonly root: string;
6
+ readonly store: NodeKnownFileTransactionJournalStore;
7
+ readonly stored: StoredRecoveryJournal;
8
+ }): Promise<void>;
9
+ //# sourceMappingURL=node-known-file-recovery-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-known-file-recovery-cleanup.d.ts","sourceRoot":"","sources":["../../../../src/repository-mutation/adapters/node/node-known-file-recovery-cleanup.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,8BAA8B,EAC9B,qBAAqB,EACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,gDAAgD,CAAC;AAyK3G,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,8BAA8B,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,oCAAoC,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;CACxC,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DhB"}