@agent-teams/repository-mutation 0.0.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 (243) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +201 -0
  3. package/README.md +10 -0
  4. package/dist/canonical-json.d.ts +12 -0
  5. package/dist/canonical-json.d.ts.map +1 -0
  6. package/dist/canonical-json.js +137 -0
  7. package/dist/canonical-json.js.map +1 -0
  8. package/dist/errors.d.ts +6 -0
  9. package/dist/errors.d.ts.map +1 -0
  10. package/dist/errors.js +9 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/index.d.ts +25 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +13 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/installed-artifact-identity.d.ts +15 -0
  17. package/dist/installed-artifact-identity.d.ts.map +1 -0
  18. package/dist/installed-artifact-identity.js +127 -0
  19. package/dist/installed-artifact-identity.js.map +1 -0
  20. package/dist/node.d.ts +29 -0
  21. package/dist/node.d.ts.map +1 -0
  22. package/dist/node.js +19 -0
  23. package/dist/node.js.map +1 -0
  24. package/dist/package-version.d.ts +3 -0
  25. package/dist/package-version.d.ts.map +1 -0
  26. package/dist/package-version.js +11 -0
  27. package/dist/package-version.js.map +1 -0
  28. package/dist/qualification/index.d.ts +24 -0
  29. package/dist/qualification/index.d.ts.map +1 -0
  30. package/dist/qualification/index.js +11 -0
  31. package/dist/qualification/index.js.map +1 -0
  32. package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.d.ts +19 -0
  33. package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.d.ts.map +1 -0
  34. package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.js +74 -0
  35. package/dist/repository-mutation/adapters/node/node-absent-file-publication-private.js.map +1 -0
  36. package/dist/repository-mutation/adapters/node/node-absent-file-publication.d.ts +35 -0
  37. package/dist/repository-mutation/adapters/node/node-absent-file-publication.d.ts.map +1 -0
  38. package/dist/repository-mutation/adapters/node/node-absent-file-publication.js +181 -0
  39. package/dist/repository-mutation/adapters/node/node-absent-file-publication.js.map +1 -0
  40. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts +23 -0
  41. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.d.ts.map +1 -0
  42. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js +134 -0
  43. package/dist/repository-mutation/adapters/node/node-bounded-regular-file.js.map +1 -0
  44. package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.d.ts +26 -0
  45. package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.d.ts.map +1 -0
  46. package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.js +172 -0
  47. package/dist/repository-mutation/adapters/node/node-cleanup-owned-temporary.js.map +1 -0
  48. package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.d.ts +14 -0
  49. package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.d.ts.map +1 -0
  50. package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.js +23 -0
  51. package/dist/repository-mutation/adapters/node/node-create-and-bind-directory.js.map +1 -0
  52. package/dist/repository-mutation/adapters/node/node-directory-durability.d.ts +17 -0
  53. package/dist/repository-mutation/adapters/node/node-directory-durability.d.ts.map +1 -0
  54. package/dist/repository-mutation/adapters/node/node-directory-durability.js +47 -0
  55. package/dist/repository-mutation/adapters/node/node-directory-durability.js.map +1 -0
  56. package/dist/repository-mutation/adapters/node/node-directory-materialization.d.ts +37 -0
  57. package/dist/repository-mutation/adapters/node/node-directory-materialization.d.ts.map +1 -0
  58. package/dist/repository-mutation/adapters/node/node-directory-materialization.js +244 -0
  59. package/dist/repository-mutation/adapters/node/node-directory-materialization.js.map +1 -0
  60. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.d.ts +13 -0
  61. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.d.ts.map +1 -0
  62. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.js +67 -0
  63. package/dist/repository-mutation/adapters/node/node-existing-repository-ancestors.js.map +1 -0
  64. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.d.ts +84 -0
  65. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.d.ts.map +1 -0
  66. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.js +232 -0
  67. package/dist/repository-mutation/adapters/node/node-known-file-apply-effects.js.map +1 -0
  68. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.d.ts +9 -0
  69. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.d.ts.map +1 -0
  70. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.js +2 -0
  71. package/dist/repository-mutation/adapters/node/node-known-file-apply-faults.js.map +1 -0
  72. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.d.ts +6 -0
  73. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.d.ts.map +1 -0
  74. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.js +30 -0
  75. package/dist/repository-mutation/adapters/node/node-known-file-apply-observation.js.map +1 -0
  76. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.d.ts +11 -0
  77. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.d.ts.map +1 -0
  78. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.js +159 -0
  79. package/dist/repository-mutation/adapters/node/node-known-file-apply-operation.js.map +1 -0
  80. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.d.ts +9 -0
  81. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.d.ts.map +1 -0
  82. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.js +22 -0
  83. package/dist/repository-mutation/adapters/node/node-known-file-apply-state.js.map +1 -0
  84. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.d.ts +9 -0
  85. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.d.ts.map +1 -0
  86. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.js +203 -0
  87. package/dist/repository-mutation/adapters/node/node-known-file-recovery-cleanup.js.map +1 -0
  88. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.d.ts +17 -0
  89. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.d.ts.map +1 -0
  90. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.js +22 -0
  91. package/dist/repository-mutation/adapters/node/node-known-file-recovery-executor.js.map +1 -0
  92. package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.d.ts +28 -0
  93. package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.d.ts.map +1 -0
  94. package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.js +213 -0
  95. package/dist/repository-mutation/adapters/node/node-known-file-recovery-filesystem.js.map +1 -0
  96. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.d.ts +15 -0
  97. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.d.ts.map +1 -0
  98. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.js +51 -0
  99. package/dist/repository-mutation/adapters/node/node-known-file-recovery-observation.js.map +1 -0
  100. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.d.ts +29 -0
  101. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.d.ts.map +1 -0
  102. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.js +72 -0
  103. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured-cleanup.js.map +1 -0
  104. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.d.ts +31 -0
  105. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.d.ts.map +1 -0
  106. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.js +254 -0
  107. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage-captured.js.map +1 -0
  108. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.d.ts +13 -0
  109. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.d.ts.map +1 -0
  110. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.js +210 -0
  111. package/dist/repository-mutation/adapters/node/node-known-file-recovery-preimage.js.map +1 -0
  112. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.d.ts +15 -0
  113. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.d.ts.map +1 -0
  114. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.js +181 -0
  115. package/dist/repository-mutation/adapters/node/node-known-file-recovery-retirement.js.map +1 -0
  116. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.d.ts +12 -0
  117. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.d.ts.map +1 -0
  118. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.js +18 -0
  119. package/dist/repository-mutation/adapters/node/node-known-file-recovery-state.js.map +1 -0
  120. package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.d.ts +25 -0
  121. package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.d.ts.map +1 -0
  122. package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.js +150 -0
  123. package/dist/repository-mutation/adapters/node/node-known-file-transaction-filesystem.js.map +1 -0
  124. package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.d.ts +12 -0
  125. package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.d.ts.map +1 -0
  126. package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.js +56 -0
  127. package/dist/repository-mutation/adapters/node/node-known-file-transaction-inspection.js.map +1 -0
  128. package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.d.ts +22 -0
  129. package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.d.ts.map +1 -0
  130. package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.js +246 -0
  131. package/dist/repository-mutation/adapters/node/node-known-file-transaction-journal-store.js.map +1 -0
  132. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.d.ts +21 -0
  133. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.d.ts.map +1 -0
  134. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.js +34 -0
  135. package/dist/repository-mutation/adapters/node/node-known-file-transaction-lease-release.js.map +1 -0
  136. package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.d.ts +4 -0
  137. package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.d.ts.map +1 -0
  138. package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.js +43 -0
  139. package/dist/repository-mutation/adapters/node/node-known-file-transaction-receipt.js.map +1 -0
  140. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts +14 -0
  141. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.d.ts.map +1 -0
  142. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js +109 -0
  143. package/dist/repository-mutation/adapters/node/node-known-file-transaction-recovery.js.map +1 -0
  144. package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts +21 -0
  145. package/dist/repository-mutation/adapters/node/node-known-file-transaction.d.ts.map +1 -0
  146. package/dist/repository-mutation/adapters/node/node-known-file-transaction.js +215 -0
  147. package/dist/repository-mutation/adapters/node/node-known-file-transaction.js.map +1 -0
  148. package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.d.ts +18 -0
  149. package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.d.ts.map +1 -0
  150. package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.js +30 -0
  151. package/dist/repository-mutation/adapters/node/node-prepare-exact-sibling-temporary.js.map +1 -0
  152. package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.d.ts +31 -0
  153. package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.d.ts.map +1 -0
  154. package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.js +50 -0
  155. package/dist/repository-mutation/adapters/node/node-publish-prepared-absent-file.js.map +1 -0
  156. package/dist/repository-mutation/adapters/node/node-repository-path.d.ts +2 -0
  157. package/dist/repository-mutation/adapters/node/node-repository-path.d.ts.map +1 -0
  158. package/dist/repository-mutation/adapters/node/node-repository-path.js +7 -0
  159. package/dist/repository-mutation/adapters/node/node-repository-path.js.map +1 -0
  160. package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.d.ts +21 -0
  161. package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.d.ts.map +1 -0
  162. package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.js +59 -0
  163. package/dist/repository-mutation/adapters/node/node-terminal-evidence-directory.js.map +1 -0
  164. package/dist/repository-mutation/application/model/directory-materialization.d.ts +35 -0
  165. package/dist/repository-mutation/application/model/directory-materialization.d.ts.map +1 -0
  166. package/dist/repository-mutation/application/model/directory-materialization.js +11 -0
  167. package/dist/repository-mutation/application/model/directory-materialization.js.map +1 -0
  168. package/dist/repository-mutation/application/model/exact-postimage.d.ts +17 -0
  169. package/dist/repository-mutation/application/model/exact-postimage.d.ts.map +1 -0
  170. package/dist/repository-mutation/application/model/exact-postimage.js +11 -0
  171. package/dist/repository-mutation/application/model/exact-postimage.js.map +1 -0
  172. package/dist/repository-mutation/application/model/known-file-transaction-journal.d.ts +69 -0
  173. package/dist/repository-mutation/application/model/known-file-transaction-journal.d.ts.map +1 -0
  174. package/dist/repository-mutation/application/model/known-file-transaction-journal.js +15 -0
  175. package/dist/repository-mutation/application/model/known-file-transaction-journal.js.map +1 -0
  176. package/dist/repository-mutation/application/model/known-file-transaction.d.ts +64 -0
  177. package/dist/repository-mutation/application/model/known-file-transaction.d.ts.map +1 -0
  178. package/dist/repository-mutation/application/model/known-file-transaction.js +2 -0
  179. package/dist/repository-mutation/application/model/known-file-transaction.js.map +1 -0
  180. package/dist/repository-mutation/application/model/path-identity.d.ts +7 -0
  181. package/dist/repository-mutation/application/model/path-identity.d.ts.map +1 -0
  182. package/dist/repository-mutation/application/model/path-identity.js +2 -0
  183. package/dist/repository-mutation/application/model/path-identity.js.map +1 -0
  184. package/dist/repository-mutation/application/model/repository-path.d.ts +8 -0
  185. package/dist/repository-mutation/application/model/repository-path.d.ts.map +1 -0
  186. package/dist/repository-mutation/application/model/repository-path.js +74 -0
  187. package/dist/repository-mutation/application/model/repository-path.js.map +1 -0
  188. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.d.ts +33 -0
  189. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.d.ts.map +1 -0
  190. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.js +21 -0
  191. package/dist/repository-mutation/application/policies/classify-known-file-recovery-transition.js.map +1 -0
  192. package/dist/repository-mutation/application/policies/known-file-transaction-envelope.d.ts +9 -0
  193. package/dist/repository-mutation/application/policies/known-file-transaction-envelope.d.ts.map +1 -0
  194. package/dist/repository-mutation/application/policies/known-file-transaction-envelope.js +214 -0
  195. package/dist/repository-mutation/application/policies/known-file-transaction-envelope.js.map +1 -0
  196. package/dist/repository-mutation/application/policies/known-file-transaction-plan.d.ts +7 -0
  197. package/dist/repository-mutation/application/policies/known-file-transaction-plan.d.ts.map +1 -0
  198. package/dist/repository-mutation/application/policies/known-file-transaction-plan.js +253 -0
  199. package/dist/repository-mutation/application/policies/known-file-transaction-plan.js.map +1 -0
  200. package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.d.ts +7 -0
  201. package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.d.ts.map +1 -0
  202. package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.js +2 -0
  203. package/dist/repository-mutation/application/ports/owned-temporary-cleanup-transition.js.map +1 -0
  204. package/dist/repository-mutation-envelope.d.ts +32 -0
  205. package/dist/repository-mutation-envelope.d.ts.map +1 -0
  206. package/dist/repository-mutation-envelope.js +292 -0
  207. package/dist/repository-mutation-envelope.js.map +1 -0
  208. package/dist/state-contract.d.ts +6 -0
  209. package/dist/state-contract.d.ts.map +1 -0
  210. package/dist/state-contract.js +6 -0
  211. package/dist/state-contract.js.map +1 -0
  212. package/dist/strict-json.d.ts +7 -0
  213. package/dist/strict-json.d.ts.map +1 -0
  214. package/dist/strict-json.js +131 -0
  215. package/dist/strict-json.js.map +1 -0
  216. package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.d.ts +29 -0
  217. package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.d.ts.map +1 -0
  218. package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.js +139 -0
  219. package/dist/transaction-coordination/adapters/node/node-journal-slot-evidence.js.map +1 -0
  220. package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.d.ts +151 -0
  221. package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.d.ts.map +1 -0
  222. package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.js +29 -0
  223. package/dist/transaction-coordination/adapters/node/node-journal-slot-profile.js.map +1 -0
  224. package/dist/transaction-coordination/adapters/node/node-journal-slot-store.d.ts +25 -0
  225. package/dist/transaction-coordination/adapters/node/node-journal-slot-store.d.ts.map +1 -0
  226. package/dist/transaction-coordination/adapters/node/node-journal-slot-store.js +303 -0
  227. package/dist/transaction-coordination/adapters/node/node-journal-slot-store.js.map +1 -0
  228. package/dist/transaction-coordination/adapters/node/node-operation-lock.d.ts +16 -0
  229. package/dist/transaction-coordination/adapters/node/node-operation-lock.d.ts.map +1 -0
  230. package/dist/transaction-coordination/adapters/node/node-operation-lock.js +359 -0
  231. package/dist/transaction-coordination/adapters/node/node-operation-lock.js.map +1 -0
  232. package/dist/transaction-coordination/adapters/node/node-state-directory.d.ts +11 -0
  233. package/dist/transaction-coordination/adapters/node/node-state-directory.d.ts.map +1 -0
  234. package/dist/transaction-coordination/adapters/node/node-state-directory.js +91 -0
  235. package/dist/transaction-coordination/adapters/node/node-state-directory.js.map +1 -0
  236. package/dist/transaction-coordination/mutation-lease.d.ts +38 -0
  237. package/dist/transaction-coordination/mutation-lease.d.ts.map +1 -0
  238. package/dist/transaction-coordination/mutation-lease.js +351 -0
  239. package/dist/transaction-coordination/mutation-lease.js.map +1 -0
  240. package/package.json +52 -0
  241. package/schemas/known-file-transaction-plan/v1.schema.json +65 -0
  242. package/schemas/known-file-transaction-receipt/v1.schema.json +36 -0
  243. package/schemas/repository-mutation-transaction-envelope/v1.schema.json +46 -0
@@ -0,0 +1,359 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { mkdir, open, rename, unlink } from "node:fs/promises";
4
+ import { hostname } from "node:os";
5
+ import { join } from "node:path";
6
+ import { TextDecoder } from "node:util";
7
+ import { RepositoryMutationError } from "../../../errors.js";
8
+ import { LOCAL_OPERATION_LOCK } from "../../../state-contract.js";
9
+ import { parseStrictJson } from "../../../strict-json.js";
10
+ import { readBoundedRegularFile } from "../../../repository-mutation/adapters/node/node-bounded-regular-file.js";
11
+ import { assertTerminalEvidenceDirectory, ensureTerminalEvidenceDirectory } from "../../../repository-mutation/adapters/node/node-terminal-evidence-directory.js";
12
+ import { ensureMutationStateDirectory, syncMutationStateDirectory } from "./node-state-directory.js";
13
+ const maximumLockBytes = 8 * 1024;
14
+ const strictUtf8 = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
15
+ const terminalEvidenceDirectoryName = "foundation-operation-lock.completed-evidence";
16
+ function isErrorCode(error, code) {
17
+ return (error instanceof Error &&
18
+ "code" in error &&
19
+ error.code === code);
20
+ }
21
+ function evidenceBytes(evidence) {
22
+ return Buffer.from(`${JSON.stringify(evidence)}\n`, "utf8");
23
+ }
24
+ function parseEvidence(value) {
25
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
26
+ throw new Error("Foundation operation lock evidence is invalid.");
27
+ }
28
+ const candidate = value;
29
+ const tokenIsValid = typeof candidate["token"] === "string" &&
30
+ /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u.test(candidate["token"]);
31
+ if (candidate["schemaVersion"] === 1 &&
32
+ candidate["kind"] === "transaction-barrier" &&
33
+ tokenIsValid &&
34
+ Object.keys(candidate).toSorted().join(",") === "kind,schemaVersion,token") {
35
+ return {
36
+ kind: "transaction-barrier",
37
+ schemaVersion: 1,
38
+ token: candidate["token"]
39
+ };
40
+ }
41
+ if (candidate["schemaVersion"] !== 1 ||
42
+ candidate["kind"] !== "active" ||
43
+ !tokenIsValid ||
44
+ typeof candidate["host"] !== "string" ||
45
+ candidate["host"].length === 0 ||
46
+ !Number.isSafeInteger(candidate["pid"]) ||
47
+ candidate["pid"] <= 0 ||
48
+ Object.keys(candidate).toSorted().join(",") !==
49
+ "host,kind,pid,schemaVersion,token") {
50
+ throw new Error("Foundation operation lock evidence is invalid.");
51
+ }
52
+ return {
53
+ host: candidate["host"],
54
+ kind: "active",
55
+ pid: candidate["pid"],
56
+ schemaVersion: 1,
57
+ token: candidate["token"]
58
+ };
59
+ }
60
+ async function readLock(path) {
61
+ const record = await readBoundedRegularFile(path, maximumLockBytes);
62
+ if (record.outcome !== "read") {
63
+ throw new Error("Foundation operation lock must be a stable bounded regular file.");
64
+ }
65
+ return {
66
+ evidence: parseEvidence(parseStrictJson(strictUtf8.decode(record.bytes))),
67
+ identity: record.identity
68
+ };
69
+ }
70
+ function identitiesEqual(left, right) {
71
+ return (left.birthtimeNs === right.birthtimeNs &&
72
+ left.dev === right.dev &&
73
+ left.ino === right.ino);
74
+ }
75
+ function evidenceEqual(left, right) {
76
+ if (left.kind !== right.kind || left.token !== right.token) {
77
+ return false;
78
+ }
79
+ return left.kind === "transaction-barrier" ||
80
+ right.kind === "transaction-barrier"
81
+ ? left.kind === right.kind
82
+ : left.host === right.host && left.pid === right.pid;
83
+ }
84
+ async function readHandleEvidence(handle, expectedIdentity) {
85
+ const before = await handle.stat({ bigint: true });
86
+ if (!before.isFile() ||
87
+ before.size > BigInt(maximumLockBytes) ||
88
+ !identitiesEqual({
89
+ birthtimeNs: before.birthtimeNs,
90
+ dev: before.dev,
91
+ ino: before.ino
92
+ }, expectedIdentity)) {
93
+ throw new Error("Foundation operation lock identity changed before rewrite.");
94
+ }
95
+ const bytes = Buffer.alloc(Number(before.size));
96
+ let offset = 0;
97
+ while (offset < bytes.byteLength) {
98
+ const { bytesRead } = await handle.read(bytes, offset, bytes.byteLength - offset, offset);
99
+ if (bytesRead === 0) {
100
+ throw new Error("Foundation operation lock was truncated before rewrite.");
101
+ }
102
+ offset += bytesRead;
103
+ }
104
+ const after = await handle.stat({ bigint: true });
105
+ if (before.birthtimeNs !== after.birthtimeNs ||
106
+ before.ctimeNs !== after.ctimeNs ||
107
+ before.dev !== after.dev ||
108
+ before.ino !== after.ino ||
109
+ before.mtimeNs !== after.mtimeNs ||
110
+ before.size !== after.size) {
111
+ throw new Error("Foundation operation lock changed during rewrite verification.");
112
+ }
113
+ return parseEvidence(parseStrictJson(strictUtf8.decode(bytes)));
114
+ }
115
+ async function rewriteOwnedLockEvidence(lockPath, expected, replacement) {
116
+ const noFollow = process.platform === "win32" ? 0 : constants.O_NOFOLLOW;
117
+ const handle = await open(lockPath, constants.O_RDWR | noFollow);
118
+ try {
119
+ const current = await readHandleEvidence(handle, expected.identity);
120
+ if (!evidenceEqual(current, expected.evidence)) {
121
+ throw new Error("Foundation operation lock ownership changed before rewrite.");
122
+ }
123
+ const bytes = evidenceBytes(replacement);
124
+ await handle.truncate(0);
125
+ let offset = 0;
126
+ while (offset < bytes.byteLength) {
127
+ const { bytesWritten } = await handle.write(bytes, offset, bytes.byteLength - offset, offset);
128
+ if (bytesWritten === 0) {
129
+ throw new Error("Foundation operation lock rewrite made no progress.");
130
+ }
131
+ offset += bytesWritten;
132
+ }
133
+ await handle.sync();
134
+ }
135
+ finally {
136
+ await handle.close();
137
+ }
138
+ const observed = await readLock(lockPath);
139
+ if (!evidenceEqual(observed.evidence, replacement) ||
140
+ !identitiesEqual(observed.identity, expected.identity)) {
141
+ throw new Error("Foundation operation lock rewrite was not published.");
142
+ }
143
+ return observed.identity;
144
+ }
145
+ function activeOwnerIsAlive(owner) {
146
+ if (owner.host !== hostname()) {
147
+ return undefined;
148
+ }
149
+ try {
150
+ process.kill(owner.pid, 0);
151
+ return true;
152
+ }
153
+ catch (error) {
154
+ return isErrorCode(error, "ESRCH") ? false : undefined;
155
+ }
156
+ }
157
+ async function createOwnedLock(directory, lockPath) {
158
+ const evidence = {
159
+ host: hostname(),
160
+ kind: "active",
161
+ pid: process.pid,
162
+ schemaVersion: 1,
163
+ token: randomUUID()
164
+ };
165
+ const handle = await open(lockPath, "wx", 0o600);
166
+ try {
167
+ await handle.writeFile(evidenceBytes(evidence));
168
+ await handle.sync();
169
+ }
170
+ finally {
171
+ await handle.close();
172
+ }
173
+ await syncMutationStateDirectory(directory);
174
+ const observed = await readLock(lockPath);
175
+ if (observed.evidence.kind !== "active" ||
176
+ observed.evidence.token !== evidence.token) {
177
+ throw new Error("Foundation operation lock ownership was not published.");
178
+ }
179
+ return { evidence, identity: observed.identity };
180
+ }
181
+ async function takeoverLock(directory, lockPath) {
182
+ const expected = await readLock(lockPath);
183
+ if (expected.evidence.kind === "active" &&
184
+ activeOwnerIsAlive(expected.evidence) !== false) {
185
+ throw new Error("Foundation operation lock owner is live or cannot be proven dead.");
186
+ }
187
+ const evidence = {
188
+ host: hostname(),
189
+ kind: "active",
190
+ pid: process.pid,
191
+ schemaVersion: 1,
192
+ token: randomUUID()
193
+ };
194
+ const claimPath = `${lockPath}.claim.${expected.evidence.token}`;
195
+ let claimHeld = false;
196
+ let ownershipPublished = false;
197
+ try {
198
+ try {
199
+ const claimHandle = await open(claimPath, "wx", 0o600);
200
+ try {
201
+ await claimHandle.writeFile(evidenceBytes(evidence));
202
+ await claimHandle.sync();
203
+ }
204
+ finally {
205
+ await claimHandle.close();
206
+ }
207
+ await syncMutationStateDirectory(directory);
208
+ claimHeld = true;
209
+ }
210
+ catch (error) {
211
+ if (isErrorCode(error, "EEXIST")) {
212
+ throw new Error("Foundation operation-lock takeover claim requires manual recovery.", { cause: error });
213
+ }
214
+ throw error;
215
+ }
216
+ const observed = await readLock(lockPath);
217
+ if (!evidenceEqual(observed.evidence, expected.evidence) ||
218
+ !identitiesEqual(observed.identity, expected.identity)) {
219
+ throw new Error("Foundation operation lock changed during takeover.");
220
+ }
221
+ const rewrittenIdentity = await rewriteOwnedLockEvidence(lockPath, observed, evidence);
222
+ await syncMutationStateDirectory(directory);
223
+ const current = await readLock(lockPath);
224
+ if (current.evidence.kind !== "active" ||
225
+ current.evidence.token !== evidence.token ||
226
+ !identitiesEqual(current.identity, rewrittenIdentity)) {
227
+ throw new Error("Foundation operation-lock takeover was not published.");
228
+ }
229
+ ownershipPublished = true;
230
+ return { evidence, identity: current.identity };
231
+ }
232
+ finally {
233
+ if (claimHeld) {
234
+ await unlink(claimPath).catch((error) => {
235
+ if (!ownershipPublished && !isErrorCode(error, "ENOENT")) {
236
+ throw error;
237
+ }
238
+ });
239
+ }
240
+ }
241
+ }
242
+ async function quarantineObservedLock(directory, lockPath, observed, phase, operations = {}) {
243
+ const retirementToken = operations.retirementToken?.() ?? randomUUID();
244
+ const terminalRoot = await ensureTerminalEvidenceDirectory(join(directory, terminalEvidenceDirectoryName));
245
+ await syncMutationStateDirectory(directory);
246
+ await assertTerminalEvidenceDirectory(terminalRoot);
247
+ const quarantineDirectory = join(terminalRoot.path, `${phase}.${retirementToken}`);
248
+ try {
249
+ await mkdir(quarantineDirectory, { mode: 0o700 });
250
+ }
251
+ catch (error) {
252
+ throw new Error("Foundation operation lock retirement destination is occupied; all evidence was preserved.", { cause: error });
253
+ }
254
+ await syncMutationStateDirectory(terminalRoot.path);
255
+ const quarantinePath = join(quarantineDirectory, "evidence");
256
+ await rename(lockPath, quarantinePath);
257
+ await syncMutationStateDirectory(quarantineDirectory);
258
+ await syncMutationStateDirectory(directory);
259
+ if (phase === "released") {
260
+ await operations.faultInjector?.({
261
+ path: quarantinePath,
262
+ phase: "after-release-retirement"
263
+ });
264
+ }
265
+ const quarantined = await readLock(quarantinePath);
266
+ if (quarantined.evidence.token !== observed.evidence.token ||
267
+ !identitiesEqual(quarantined.identity, observed.identity)) {
268
+ throw new Error("Foundation operation lock ownership changed during cleanup.");
269
+ }
270
+ return quarantinePath;
271
+ }
272
+ async function retainTransactionBarrier(directory, lockPath, owned) {
273
+ const current = await readLock(lockPath);
274
+ if (current.evidence.kind !== "active" ||
275
+ current.evidence.token !== owned.evidence.token ||
276
+ !identitiesEqual(current.identity, owned.identity)) {
277
+ throw new Error("Foundation operation lock ownership changed before retention.");
278
+ }
279
+ const barrier = {
280
+ kind: "transaction-barrier",
281
+ schemaVersion: 1,
282
+ token: owned.evidence.token
283
+ };
284
+ const beforePublish = await readLock(lockPath);
285
+ if (beforePublish.evidence.kind !== "active" ||
286
+ beforePublish.evidence.token !== owned.evidence.token ||
287
+ !identitiesEqual(beforePublish.identity, owned.identity)) {
288
+ throw new Error("Foundation operation lock ownership changed during retention.");
289
+ }
290
+ await rewriteOwnedLockEvidence(lockPath, beforePublish, barrier);
291
+ await syncMutationStateDirectory(directory);
292
+ }
293
+ export class NodeMutationOperationLock {
294
+ #consumerRoot;
295
+ #operations;
296
+ constructor(consumerRoot, operations = {}) {
297
+ this.#consumerRoot = consumerRoot;
298
+ this.#operations = operations;
299
+ }
300
+ async acquire() {
301
+ const directory = await ensureMutationStateDirectory(this.#consumerRoot);
302
+ const lockPath = join(directory, LOCAL_OPERATION_LOCK);
303
+ let owned;
304
+ try {
305
+ try {
306
+ owned = await createOwnedLock(directory, lockPath);
307
+ }
308
+ catch (error) {
309
+ if (!isErrorCode(error, "EEXIST")) {
310
+ throw error;
311
+ }
312
+ owned = await takeoverLock(directory, lockPath);
313
+ }
314
+ }
315
+ catch (error) {
316
+ throw new RepositoryMutationError("MUTATION_LEASE_INVALID", "Another repository mutation operation is active or its lock is not safely recoverable.", { cause: error });
317
+ }
318
+ let state = "held";
319
+ let releaseInProgress;
320
+ return async (options = {}) => {
321
+ if (state === "released") {
322
+ return;
323
+ }
324
+ releaseInProgress ??= (async () => {
325
+ try {
326
+ if (options.retainTransactionBarrier === true) {
327
+ await retainTransactionBarrier(directory, lockPath, owned);
328
+ state = "released";
329
+ await syncMutationStateDirectory(directory);
330
+ return;
331
+ }
332
+ const current = await readLock(lockPath);
333
+ if (current.evidence.kind !== "active" ||
334
+ current.evidence.token !== owned.evidence.token ||
335
+ !identitiesEqual(current.identity, owned.identity)) {
336
+ throw new Error("Foundation operation lock ownership was lost before release.");
337
+ }
338
+ const quarantinePath = await quarantineObservedLock(directory, lockPath, current, "released", this.#operations);
339
+ state = "released";
340
+ // The verified evidence is logically retired inside a fresh 0700
341
+ // directory. Node has no unlink-by-handle primitive, so retaining it
342
+ // avoids a pathname proof-to-delete race with foreign substitution.
343
+ void quarantinePath;
344
+ }
345
+ catch (error) {
346
+ throw new RepositoryMutationError("MUTATION_LEASE_INVALID", "Foundation operation lock could not be released without violating ownership.", { cause: error });
347
+ }
348
+ })();
349
+ try {
350
+ await releaseInProgress;
351
+ }
352
+ catch (error) {
353
+ releaseInProgress = undefined;
354
+ throw error;
355
+ }
356
+ };
357
+ }
358
+ }
359
+ //# sourceMappingURL=node-operation-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-operation-lock.js","sourceRoot":"","sources":["../../../../src/transaction-coordination/adapters/node/node-operation-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function ensureMutationStateDirectory(consumerRoot: string): Promise<string>;
2
+ export declare function syncMutationStateDirectory(path: string): Promise<void>;
3
+ /**
4
+ * Persists recovery-authority metadata without treating unsupported directory
5
+ * fsync as success. Ordinary local state may use the tolerant operation above;
6
+ * transaction cleanup markers must fail closed because their durable presence
7
+ * is what globally excludes another mutation after a crash.
8
+ */
9
+ export declare function syncMutationStateDirectoryStrictly(path: string): Promise<void>;
10
+ export declare function pruneMutationStateDirectory(consumerRoot: string): Promise<void>;
11
+ //# sourceMappingURL=node-state-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-state-directory.d.ts","sourceRoot":"","sources":["../../../../src/transaction-coordination/adapters/node/node-state-directory.ts"],"names":[],"mappings":"AAMA,wBAAsB,4BAA4B,CAChD,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B5E;AAED;;;;;GAKG;AACH,wBAAsB,kCAAkC,CACtD,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -0,0 +1,91 @@
1
+ import { lstat, mkdir, open, realpath, rmdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { RepositoryMutationError } from "../../../errors.js";
4
+ import { LOCAL_STATE_DIRECTORY } from "../../../state-contract.js";
5
+ export async function ensureMutationStateDirectory(consumerRoot) {
6
+ const directory = join(consumerRoot, LOCAL_STATE_DIRECTORY);
7
+ try {
8
+ const entry = await lstat(directory);
9
+ if (!entry.isDirectory() || entry.isSymbolicLink()) {
10
+ throw new RepositoryMutationError("MUTATION_STATE_INVALID", "Local foundation state path must be a real consumer-owned directory.");
11
+ }
12
+ if ((await realpath(directory)) !== directory) {
13
+ throw new RepositoryMutationError("MUTATION_STATE_INVALID", "Local foundation state directory resolves outside its expected path.");
14
+ }
15
+ return directory;
16
+ }
17
+ catch (error) {
18
+ if (!(error instanceof Error &&
19
+ "code" in error &&
20
+ error.code === "ENOENT")) {
21
+ throw error;
22
+ }
23
+ }
24
+ try {
25
+ await mkdir(directory);
26
+ }
27
+ catch (error) {
28
+ if (error instanceof Error &&
29
+ "code" in error &&
30
+ error.code === "EEXIST") {
31
+ return ensureMutationStateDirectory(consumerRoot);
32
+ }
33
+ throw error;
34
+ }
35
+ await syncMutationStateDirectory(consumerRoot);
36
+ return directory;
37
+ }
38
+ export async function syncMutationStateDirectory(path) {
39
+ try {
40
+ const handle = await open(path, "r");
41
+ try {
42
+ await handle.sync();
43
+ }
44
+ finally {
45
+ await handle.close();
46
+ }
47
+ }
48
+ catch (error) {
49
+ if (error instanceof Error &&
50
+ "code" in error &&
51
+ error.code === "ENOENT") {
52
+ return;
53
+ }
54
+ if (process.platform === "win32" &&
55
+ error instanceof Error &&
56
+ "code" in error &&
57
+ ["EACCES", "EINVAL", "EISDIR", "EPERM"].includes(error.code ?? "")) {
58
+ return;
59
+ }
60
+ throw error;
61
+ }
62
+ }
63
+ /**
64
+ * Persists recovery-authority metadata without treating unsupported directory
65
+ * fsync as success. Ordinary local state may use the tolerant operation above;
66
+ * transaction cleanup markers must fail closed because their durable presence
67
+ * is what globally excludes another mutation after a crash.
68
+ */
69
+ export async function syncMutationStateDirectoryStrictly(path) {
70
+ const handle = await open(path, "r");
71
+ try {
72
+ await handle.sync();
73
+ }
74
+ finally {
75
+ await handle.close();
76
+ }
77
+ }
78
+ export async function pruneMutationStateDirectory(consumerRoot) {
79
+ try {
80
+ await rmdir(join(consumerRoot, LOCAL_STATE_DIRECTORY));
81
+ }
82
+ catch (error) {
83
+ if (error instanceof Error &&
84
+ "code" in error &&
85
+ ["ENOENT", "ENOTEMPTY"].includes(error.code ?? "")) {
86
+ return;
87
+ }
88
+ throw error;
89
+ }
90
+ }
91
+ //# sourceMappingURL=node-state-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-state-directory.js","sourceRoot":"","sources":["../../../../src/transaction-coordination/adapters/node/node-state-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,YAAoB;IAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,uBAAuB,CAC/B,wBAAwB,EACxB,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,IAAI,uBAAuB,CAC/B,wBAAwB,EACxB,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,CAAC,CACC,KAAK,YAAY,KAAK;YACtB,MAAM,IAAI,KAAK;YACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,CACnD,EACD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,MAAM,IAAI,KAAK;YACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAClD,CAAC;YACD,OAAO,4BAA4B,CAAC,YAAY,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,0BAA0B,CAAC,YAAY,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAAY;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,MAAM,IAAI,KAAK;YACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAClD,CAAC;YACD,OAAO;QACT,CAAC;QACD,IACE,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,KAAK,YAAY,KAAK;YACtB,MAAM,IAAI,KAAK;YACf,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAC7C,KAA+B,CAAC,IAAI,IAAI,EAAE,CAC5C,EACD,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,IAAY;IAEZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,MAAM,IAAI,KAAK;YACf,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAC7B,KAA+B,CAAC,IAAI,IAAI,EAAE,CAC5C,EACD,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ declare const leaseBrand: unique symbol;
2
+ declare const observationBrand: unique symbol;
3
+ declare const claimBrand: unique symbol;
4
+ export interface MutationLease {
5
+ readonly [leaseBrand]: true;
6
+ }
7
+ export interface MutationObservation {
8
+ readonly [observationBrand]: true;
9
+ }
10
+ export interface MutationClaim {
11
+ readonly [claimBrand]: true;
12
+ }
13
+ export interface MutationArtifactIdentity {
14
+ readonly name: string;
15
+ readonly version: string;
16
+ readonly buildIdentity: `sha256:${string}`;
17
+ }
18
+ export type MutationIntent = {
19
+ readonly kind: "apply-known-file";
20
+ readonly planDigest: `sha256:${string}`;
21
+ readonly ownerArtifact: MutationArtifactIdentity;
22
+ readonly kernelArtifact: MutationArtifactIdentity;
23
+ } | {
24
+ readonly kind: "recover-known-file";
25
+ readonly ownerArtifact: MutationArtifactIdentity;
26
+ readonly kernelArtifact: MutationArtifactIdentity;
27
+ };
28
+ export declare function acquireMutationLease(root: string): Promise<MutationLease>;
29
+ export declare function observeMutationState(lease: MutationLease): Promise<MutationObservation>;
30
+ export declare function claimMutation(lease: MutationLease, observation: MutationObservation, intent: MutationIntent): Promise<MutationClaim>;
31
+ export declare function consumeMutationClaim(claim: MutationClaim, expectedKind: MutationIntent["kind"]): Promise<string>;
32
+ export declare function mutationClaimIntent(claim: MutationClaim): MutationIntent;
33
+ export declare function retainMutationClaimBarrierOnEvidence(claim: MutationClaim): Promise<void>;
34
+ export declare function retainMutationBarrierOnEvidence(lease: MutationLease): Promise<boolean>;
35
+ export declare function retainMutationBarrier(lease: MutationLease): void;
36
+ export declare function releaseMutationLease(lease: MutationLease): Promise<void>;
37
+ export {};
38
+ //# sourceMappingURL=mutation-lease.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-lease.d.ts","sourceRoot":"","sources":["../../src/transaction-coordination/mutation-lease.ts"],"names":[],"mappings":"AAaA,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AACxC,OAAO,CAAC,MAAM,gBAAgB,EAAE,OAAO,MAAM,CAAC;AAC9C,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AAExC,MAAM,WAAW,aAAa;IAAG,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAA;CAAE;AAC9D,MAAM,WAAW,mBAAmB;IAAG,QAAQ,CAAC,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAA;CAAE;AAC1E,MAAM,WAAW,aAAa;IAAG,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAA;CAAE;AAE9D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,UAAU,MAAM,EAAE,CAAC;CAC5C;AAED,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,UAAU,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,wBAAwB,CAAC;CACnD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IACjD,QAAQ,CAAC,cAAc,EAAE,wBAAwB,CAAC;CACnD,CAAC;AAkQN,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAoB/E;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAY7F;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,mBAAmB,EAChC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,aAAa,CAAC,CA6BxB;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,GACnC,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAKxE;AAED,wBAAsB,oCAAoC,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9F;AAED,wBAAsB,+BAA+B,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAU5F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEhE;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E"}