@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,292 @@
1
+ import { TextDecoder } from "node:util";
2
+ import { canonicalJson, sha256Json } from "./canonical-json.js";
3
+ import { parseStrictJson } from "./strict-json.js";
4
+ export const REPOSITORY_MUTATION_ENVELOPE_FORMAT = "agent-teams.repository-mutation.transaction-envelope/v1";
5
+ const maximumEnvelopeBytes = 32 * 1024 * 1024;
6
+ const maximumDepth = 64;
7
+ const maximumEntries = 100_000;
8
+ const maximumStringLength = 1024 * 1024;
9
+ const maximumIdentifierLength = 256;
10
+ const maximumArtifactFieldLength = 1024;
11
+ const sha256 = /^sha256:[0-9a-f]{64}$/u;
12
+ const identifier = /^[\x21-\x7e]+$/u;
13
+ const strictUtf8 = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
14
+ export class RepositoryMutationEnvelopeError extends Error {
15
+ constructor(message, options) {
16
+ super(message, options);
17
+ this.name = "RepositoryMutationEnvelopeError";
18
+ }
19
+ }
20
+ function fail(message) {
21
+ throw new RepositoryMutationEnvelopeError(message);
22
+ }
23
+ function record(value, subject) {
24
+ if (typeof value !== "object" || value === null || Array.isArray(value) ||
25
+ (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)) {
26
+ fail(`${subject} must be a plain object.`);
27
+ }
28
+ return value;
29
+ }
30
+ function exactKeys(value, expected, subject) {
31
+ const keys = Reflect.ownKeys(value);
32
+ if (keys.some((key) => typeof key !== "string") ||
33
+ keys.toSorted().join("\0") !== [...expected].toSorted().join("\0") ||
34
+ keys.some((key) => {
35
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
36
+ return descriptor === undefined || !("value" in descriptor) || descriptor.enumerable !== true;
37
+ })) {
38
+ fail(`${subject} has unknown or missing fields.`);
39
+ }
40
+ }
41
+ function boundedIdentifier(value, subject) {
42
+ if (typeof value !== "string" || value.length === 0 ||
43
+ value.length > maximumIdentifierLength || !identifier.test(value) ||
44
+ value.normalize("NFC") !== value) {
45
+ fail(`${subject} is invalid.`);
46
+ }
47
+ return value;
48
+ }
49
+ function positiveInteger(value, subject) {
50
+ if (!Number.isSafeInteger(value) || value <= 0) {
51
+ fail(`${subject} must be a positive safe integer.`);
52
+ }
53
+ return value;
54
+ }
55
+ function artifact(value, subject) {
56
+ const candidate = record(value, subject);
57
+ exactKeys(candidate, ["buildIdentity", "name", "version"], subject);
58
+ if (typeof candidate["name"] !== "string" || candidate["name"].length === 0 ||
59
+ candidate["name"].length > maximumArtifactFieldLength ||
60
+ typeof candidate["version"] !== "string" || candidate["version"].length === 0 ||
61
+ candidate["version"].length > maximumArtifactFieldLength ||
62
+ candidate["name"].normalize("NFC") !== candidate["name"] ||
63
+ candidate["version"].normalize("NFC") !== candidate["version"] ||
64
+ !sha256.test(String(candidate["buildIdentity"]))) {
65
+ fail(`${subject} is invalid.`);
66
+ }
67
+ return {
68
+ name: candidate["name"],
69
+ version: candidate["version"],
70
+ buildIdentity: candidate["buildIdentity"]
71
+ };
72
+ }
73
+ function appendCanonicalArray(candidate, depth, pending) {
74
+ const keys = Reflect.ownKeys(candidate);
75
+ if (Object.getPrototypeOf(candidate) !== Array.prototype ||
76
+ keys.some((key) => typeof key !== "string" ||
77
+ (key !== "length" && !/^(?:0|[1-9][0-9]*)$/u.test(key))) ||
78
+ keys.length !== candidate.length + 1) {
79
+ fail("Repository Mutation payload contains a noncanonical array.");
80
+ }
81
+ for (let index = candidate.length - 1; index >= 0; index -= 1) {
82
+ const descriptor = Object.getOwnPropertyDescriptor(candidate, String(index));
83
+ if (descriptor === undefined || !("value" in descriptor) || !descriptor.enumerable) {
84
+ fail("Repository Mutation payload arrays must contain only dense enumerable data properties.");
85
+ }
86
+ pending.push({ value: descriptor.value, depth: depth + 1 });
87
+ }
88
+ return candidate.length;
89
+ }
90
+ function appendCanonicalObject(candidate, depth, pending) {
91
+ if (Object.getPrototypeOf(candidate) !== Object.prototype && Object.getPrototypeOf(candidate) !== null) {
92
+ fail("Repository Mutation payload objects must have a plain or null prototype.");
93
+ }
94
+ const keys = Reflect.ownKeys(candidate);
95
+ for (const key of keys) {
96
+ if (typeof key !== "string" || key.length > maximumStringLength || key.normalize("NFC") !== key) {
97
+ fail("Repository Mutation payload contains a noncanonical object key.");
98
+ }
99
+ const descriptor = Object.getOwnPropertyDescriptor(candidate, key);
100
+ if (descriptor === undefined || !("value" in descriptor) || descriptor.enumerable !== true) {
101
+ fail("Repository Mutation payload objects must contain enumerable own data properties.");
102
+ }
103
+ pending.push({ value: descriptor.value, depth: depth + 1 });
104
+ }
105
+ return keys.length;
106
+ }
107
+ function canonicalPayload(value) {
108
+ let entries = 0;
109
+ const pending = [
110
+ { value, depth: 0 }
111
+ ];
112
+ while (pending.length > 0) {
113
+ const current = pending.pop();
114
+ if (current.depth > maximumDepth) {
115
+ fail("Repository Mutation payload is too deep.");
116
+ }
117
+ if (typeof current.value === "string") {
118
+ if (current.value.length > maximumStringLength) {
119
+ fail("Repository Mutation payload contains an oversized string.");
120
+ }
121
+ continue;
122
+ }
123
+ if (current.value === null || typeof current.value === "boolean") {
124
+ continue;
125
+ }
126
+ if (typeof current.value === "number") {
127
+ if (!Number.isSafeInteger(current.value) || Object.is(current.value, -0)) {
128
+ fail("Repository Mutation payload contains a noncanonical number.");
129
+ }
130
+ continue;
131
+ }
132
+ if (typeof current.value !== "object") {
133
+ fail("Repository Mutation payload is outside the canonical JSON data model.");
134
+ }
135
+ const candidate = current.value;
136
+ if (Array.isArray(candidate)) {
137
+ entries += appendCanonicalArray(candidate, current.depth, pending);
138
+ }
139
+ else {
140
+ entries += appendCanonicalObject(candidate, current.depth, pending);
141
+ }
142
+ if (entries > maximumEntries) {
143
+ fail("Repository Mutation payload has too many entries.");
144
+ }
145
+ }
146
+ // The leaf canonicalizer is the sole canonical serialization and digest authority.
147
+ canonicalJson(value);
148
+ return value;
149
+ }
150
+ function clone(value) {
151
+ if (value === null || typeof value !== "object") {
152
+ return value;
153
+ }
154
+ if (Array.isArray(value)) {
155
+ const result = [];
156
+ for (let index = 0; index < value.length; index += 1) {
157
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
158
+ result.push(clone(descriptor.value));
159
+ }
160
+ return result;
161
+ }
162
+ const result = {};
163
+ for (const key of Object.keys(value)) {
164
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
165
+ result[key] = clone(descriptor.value);
166
+ }
167
+ return result;
168
+ }
169
+ function deepFreeze(value) {
170
+ const pending = [];
171
+ if (typeof value === "object" && value !== null) {
172
+ pending.push(value);
173
+ }
174
+ while (pending.length > 0) {
175
+ const current = pending.pop();
176
+ for (const child of Object.values(current)) {
177
+ if (typeof child === "object" && child !== null && !Object.isFrozen(child)) {
178
+ pending.push(child);
179
+ }
180
+ }
181
+ Object.freeze(current);
182
+ }
183
+ return value;
184
+ }
185
+ function compile(value) {
186
+ const ownerArtifact = artifact(value["ownerArtifact"], "Owner artifact identity");
187
+ const kernelArtifact = artifact(value["kernelArtifact"], "Kernel artifact identity");
188
+ const recoveryHandler = record(value["recoveryHandler"], "Recovery handler");
189
+ exactKeys(recoveryHandler, ["contractVersion", "id"], "Recovery handler");
190
+ const payload = clone(canonicalPayload(value["payload"]));
191
+ const body = {
192
+ schemaVersion: 6,
193
+ format: REPOSITORY_MUTATION_ENVELOPE_FORMAT,
194
+ operationKind: boundedIdentifier(value["operationKind"], "Operation kind"),
195
+ recoveryHandler: {
196
+ id: boundedIdentifier(recoveryHandler["id"], "Recovery handler id"),
197
+ contractVersion: positiveInteger(recoveryHandler["contractVersion"], "Recovery handler contract version")
198
+ },
199
+ ownerArtifact,
200
+ kernelArtifact,
201
+ adapterContractVersion: positiveInteger(value["adapterContractVersion"], "Adapter contract version"),
202
+ payloadKind: boundedIdentifier(value["payloadKind"], "Payload kind"),
203
+ state: boundedIdentifier(value["state"], "Envelope state"),
204
+ payload,
205
+ payloadDigest: sha256Json(payload)
206
+ };
207
+ return deepFreeze({
208
+ ...body,
209
+ envelopeDigest: sha256Json(body)
210
+ });
211
+ }
212
+ export function compileRepositoryMutationEnvelope(input) {
213
+ const candidate = record(input, "Repository Mutation envelope input");
214
+ exactKeys(candidate, [
215
+ "adapterContractVersion", "kernelArtifact", "operationKind", "ownerArtifact",
216
+ "payload", "payloadKind", "recoveryHandler", "state"
217
+ ], "Repository Mutation envelope input");
218
+ return compile(candidate);
219
+ }
220
+ function assertBoundedSourceDepth(source) {
221
+ let depth = 0;
222
+ let inString = false;
223
+ let escaped = false;
224
+ for (const character of source) {
225
+ if (inString) {
226
+ if (escaped) {
227
+ escaped = false;
228
+ }
229
+ else if (character === "\\") {
230
+ escaped = true;
231
+ }
232
+ else if (character === '"') {
233
+ inString = false;
234
+ }
235
+ }
236
+ else if (character === '"') {
237
+ inString = true;
238
+ }
239
+ else if (character === "{" || character === "[") {
240
+ depth += 1;
241
+ if (depth > maximumDepth + 1) {
242
+ fail("Repository Mutation envelope is too deep.");
243
+ }
244
+ }
245
+ else if (character === "}" || character === "]") {
246
+ depth -= 1;
247
+ }
248
+ }
249
+ }
250
+ export function parseRepositoryMutationEnvelope(bytes) {
251
+ if (!(bytes instanceof Uint8Array) || bytes.byteLength === 0 || bytes.byteLength > maximumEnvelopeBytes) {
252
+ fail("Repository Mutation envelope byte length is invalid.");
253
+ }
254
+ let value;
255
+ try {
256
+ const source = strictUtf8.decode(bytes);
257
+ assertBoundedSourceDepth(source);
258
+ value = parseStrictJson(source);
259
+ }
260
+ catch (error) {
261
+ if (error instanceof RepositoryMutationEnvelopeError) {
262
+ throw error;
263
+ }
264
+ throw new RepositoryMutationEnvelopeError("Repository Mutation envelope is not strict UTF-8 JSON.", { cause: error });
265
+ }
266
+ const candidate = record(value, "Repository Mutation envelope");
267
+ exactKeys(candidate, [
268
+ "adapterContractVersion", "envelopeDigest", "format", "kernelArtifact",
269
+ "operationKind", "ownerArtifact", "payload", "payloadDigest", "payloadKind",
270
+ "recoveryHandler", "schemaVersion", "state"
271
+ ], "Repository Mutation envelope");
272
+ if (candidate["schemaVersion"] !== 6 || candidate["format"] !== REPOSITORY_MUTATION_ENVELOPE_FORMAT ||
273
+ !sha256.test(String(candidate["payloadDigest"])) || !sha256.test(String(candidate["envelopeDigest"]))) {
274
+ fail("Repository Mutation envelope binding is invalid.");
275
+ }
276
+ const compiled = compile(candidate);
277
+ if (compiled.payloadDigest !== candidate["payloadDigest"] ||
278
+ compiled.envelopeDigest !== candidate["envelopeDigest"]) {
279
+ fail("Repository Mutation envelope digest is invalid.");
280
+ }
281
+ return compiled;
282
+ }
283
+ export function assertRepositoryMutationArtifactBindings(envelope, expectedOwner, expectedKernel) {
284
+ const owner = artifact(expectedOwner, "Expected owner artifact identity");
285
+ const kernel = artifact(expectedKernel, "Expected kernel artifact identity");
286
+ const fields = ["name", "version", "buildIdentity"];
287
+ if (fields.some((field) => envelope.ownerArtifact[field] !== owner[field] ||
288
+ envelope.kernelArtifact[field] !== kernel[field])) {
289
+ fail("The exact owner and kernel artifacts that created the Repository Mutation envelope are required.");
290
+ }
291
+ }
292
+ //# sourceMappingURL=repository-mutation-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-mutation-envelope.js","sourceRoot":"","sources":["../src/repository-mutation-envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const LOCAL_STATE_DIRECTORY: ".agent-teams-local";
2
+ export declare const LOCAL_OPERATION_LOCK: "foundation-operation.lock";
3
+ export declare const FOUNDATION_TRANSACTION_FILE: "scaffolding-transaction.json";
4
+ export declare const TRANSACTION_TEMPORARY_FILE: "scaffolding-transaction.json.tmp";
5
+ export declare const KNOWN_FILE_TRANSACTION_TEMPORARY_FILE: "scaffolding-transaction.json.known-file.tmp";
6
+ //# sourceMappingURL=state-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-contract.d.ts","sourceRoot":"","sources":["../src/state-contract.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,EAAG,oBAA6B,CAAC;AACnE,eAAO,MAAM,oBAAoB,EAAG,2BAAoC,CAAC;AACzE,eAAO,MAAM,2BAA2B,EAAG,8BAAuC,CAAC;AACnF,eAAO,MAAM,0BAA0B,oCAAgD,CAAC;AACxF,eAAO,MAAM,qCAAqC,+CAA2D,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const LOCAL_STATE_DIRECTORY = ".agent-teams-local";
2
+ export const LOCAL_OPERATION_LOCK = "foundation-operation.lock";
3
+ export const FOUNDATION_TRANSACTION_FILE = "scaffolding-transaction.json";
4
+ export const TRANSACTION_TEMPORARY_FILE = `${FOUNDATION_TRANSACTION_FILE}.tmp`;
5
+ export const KNOWN_FILE_TRANSACTION_TEMPORARY_FILE = `${FOUNDATION_TRANSACTION_FILE}.known-file.tmp`;
6
+ //# sourceMappingURL=state-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-contract.js","sourceRoot":"","sources":["../src/state-contract.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,oBAA6B,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAAoC,CAAC;AACzE,MAAM,CAAC,MAAM,2BAA2B,GAAG,8BAAuC,CAAC;AACnF,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,2BAA2B,MAAe,CAAC;AACxF,MAAM,CAAC,MAAM,qCAAqC,GAAG,GAAG,2BAA2B,iBAA0B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type StrictJsonFailure = "duplicate-key" | "syntax";
2
+ export declare class StrictJsonError extends Error {
3
+ readonly failure: StrictJsonFailure;
4
+ constructor(failure: StrictJsonFailure);
5
+ }
6
+ export declare function parseStrictJson(source: string): unknown;
7
+ //# sourceMappingURL=strict-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-json.d.ts","sourceRoot":"","sources":["../src/strict-json.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,QAAQ,CAAC;AAE3D,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IAEpC,YAAY,OAAO,EAAE,iBAAiB,EAIrC;CACF;AAwFD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CASvD"}
@@ -0,0 +1,131 @@
1
+ export class StrictJsonError extends Error {
2
+ failure;
3
+ constructor(failure) {
4
+ super(`Strict JSON parsing failed: ${failure}.`);
5
+ this.name = "StrictJsonError";
6
+ this.failure = failure;
7
+ }
8
+ }
9
+ class JsonCursor {
10
+ #offset = 0;
11
+ #source;
12
+ constructor(source) {
13
+ this.#source = source;
14
+ }
15
+ get done() {
16
+ this.#space();
17
+ return this.#offset === this.#source.length;
18
+ }
19
+ #space() {
20
+ while (/\s/u.test(this.#source[this.#offset] ?? "")) {
21
+ this.#offset += 1;
22
+ }
23
+ }
24
+ #take(expected) {
25
+ this.#space();
26
+ if (!this.#source.startsWith(expected, this.#offset)) {
27
+ throw new StrictJsonError("syntax");
28
+ }
29
+ this.#offset += expected.length;
30
+ }
31
+ #string() {
32
+ this.#space();
33
+ const start = this.#offset;
34
+ if (this.#source[this.#offset] !== '"') {
35
+ throw new StrictJsonError("syntax");
36
+ }
37
+ this.#offset += 1;
38
+ while (this.#offset < this.#source.length) {
39
+ const character = this.#source[this.#offset];
40
+ if (character === '"') {
41
+ this.#offset += 1;
42
+ try {
43
+ return JSON.parse(this.#source.slice(start, this.#offset));
44
+ }
45
+ catch {
46
+ throw new StrictJsonError("syntax");
47
+ }
48
+ }
49
+ if (character === "\\") {
50
+ this.#offset += 1;
51
+ }
52
+ this.#offset += 1;
53
+ }
54
+ throw new StrictJsonError("syntax");
55
+ }
56
+ value() {
57
+ this.#space();
58
+ const character = this.#source[this.#offset];
59
+ if (character === "{") {
60
+ return this.#object();
61
+ }
62
+ if (character === "[") {
63
+ return this.#array();
64
+ }
65
+ if (character === '"') {
66
+ this.#string();
67
+ return;
68
+ }
69
+ const remainder = this.#source.slice(this.#offset);
70
+ const token = /^(?:true|false|null|-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?)/u.exec(remainder)?.[0];
71
+ if (token === undefined) {
72
+ throw new StrictJsonError("syntax");
73
+ }
74
+ this.#offset += token.length;
75
+ }
76
+ #array() {
77
+ this.#take("[");
78
+ this.#space();
79
+ if (this.#source[this.#offset] === "]") {
80
+ this.#offset += 1;
81
+ return;
82
+ }
83
+ for (;;) {
84
+ this.value();
85
+ this.#space();
86
+ if (this.#source[this.#offset] === "]") {
87
+ this.#offset += 1;
88
+ return;
89
+ }
90
+ this.#take(",");
91
+ }
92
+ }
93
+ #object() {
94
+ this.#take("{");
95
+ const keys = new Set();
96
+ this.#space();
97
+ if (this.#source[this.#offset] === "}") {
98
+ this.#offset += 1;
99
+ return;
100
+ }
101
+ for (;;) {
102
+ const key = this.#string();
103
+ if (keys.has(key)) {
104
+ throw new StrictJsonError("duplicate-key");
105
+ }
106
+ keys.add(key);
107
+ this.#take(":");
108
+ this.value();
109
+ this.#space();
110
+ if (this.#source[this.#offset] === "}") {
111
+ this.#offset += 1;
112
+ return;
113
+ }
114
+ this.#take(",");
115
+ }
116
+ }
117
+ }
118
+ export function parseStrictJson(source) {
119
+ const cursor = new JsonCursor(source);
120
+ cursor.value();
121
+ if (!cursor.done) {
122
+ throw new StrictJsonError("syntax");
123
+ }
124
+ try {
125
+ return JSON.parse(source);
126
+ }
127
+ catch {
128
+ throw new StrictJsonError("syntax");
129
+ }
130
+ }
131
+ //# sourceMappingURL=strict-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-json.js","sourceRoot":"","sources":["../src/strict-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { JournalSlotAuthority, JournalSlotFailureFactory, JournalSlotResidueMatcher, StoredJournalSlot } from "./node-journal-slot-profile.js";
2
+ export declare function observeJournalSlotAuthority(path: string, expected: JournalSlotAuthority, maximumBytes: number): Promise<"match" | "missing" | "other">;
3
+ export declare function journalSlotPathExists(path: string, maximumBytes: number): Promise<boolean>;
4
+ export declare function readJournalSlot<TJournal>(options: {
5
+ readonly failure: JournalSlotFailureFactory;
6
+ readonly maximumBytes: number;
7
+ readonly parse: (bytes: Buffer) => Promise<TJournal>;
8
+ readonly path: string;
9
+ }): Promise<StoredJournalSlot<TJournal> | undefined>;
10
+ export declare function journalSlotResidueNames(options: {
11
+ readonly failure: JournalSlotFailureFactory;
12
+ readonly matchers: readonly JournalSlotResidueMatcher[];
13
+ readonly parent: string;
14
+ }): Promise<readonly string[]>;
15
+ /**
16
+ * Creates one private evidence directory. Owners choose the naming; a name
17
+ * collision retries with the next generated name so concurrent retirements
18
+ * never share a directory.
19
+ */
20
+ export declare function createPrivateJournalSlotDirectory(parent: string, name: () => string): Promise<{
21
+ readonly directory: string;
22
+ readonly path: string;
23
+ }>;
24
+ export declare function prepareJournalSlotCandidate(options: {
25
+ readonly bytes: Buffer;
26
+ readonly candidatePath: string;
27
+ readonly failure: JournalSlotFailureFactory;
28
+ }): Promise<JournalSlotAuthority>;
29
+ //# sourceMappingURL=node-journal-slot-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-journal-slot-evidence.d.ts","sourceRoot":"","sources":["../../../../src/transaction-coordination/adapters/node/node-journal-slot-evidence.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,gCAAgC,CAAC;AAiBxC,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,oBAAoB,EAC9B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,CAgBxC;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE;IACvD,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,CAiBnD;AAQD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CA8B7B;AAED;;;;GAIG;AACH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,MAAM,GACjB,OAAO,CAAC;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAYhE;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;CAC7C,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAsBhC"}
@@ -0,0 +1,139 @@
1
+ import { mkdir, open, opendir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { captureFileHandleIdentity, pathMatchesRegularFileIdentity, readBoundedRegularFile } from "../../../repository-mutation/adapters/node/node-bounded-regular-file.js";
4
+ import { sha256Bytes } from "../../../canonical-json.js";
5
+ const MAXIMUM_DIRECTORY_ENTRIES = 1024;
6
+ function journalSlotErrorCode(error) {
7
+ return error instanceof Error && "code" in error
8
+ ? error.code
9
+ : undefined;
10
+ }
11
+ function journalSlotAuthority(identity, bytes) {
12
+ return { authorityDigest: sha256Bytes(bytes), identity };
13
+ }
14
+ export async function observeJournalSlotAuthority(path, expected, maximumBytes) {
15
+ try {
16
+ const observed = await readBoundedRegularFile(path, maximumBytes);
17
+ if (observed.outcome !== "read") {
18
+ return "other";
19
+ }
20
+ return (await pathMatchesRegularFileIdentity(path, expected.identity)) === "match" &&
21
+ sha256Bytes(observed.bytes) === expected.authorityDigest
22
+ ? "match"
23
+ : "other";
24
+ }
25
+ catch (error) {
26
+ if (journalSlotErrorCode(error) === "ENOENT") {
27
+ return "missing";
28
+ }
29
+ throw error;
30
+ }
31
+ }
32
+ export async function journalSlotPathExists(path, maximumBytes) {
33
+ try {
34
+ await readBoundedRegularFile(path, maximumBytes);
35
+ return true;
36
+ }
37
+ catch (error) {
38
+ if (journalSlotErrorCode(error) === "ENOENT") {
39
+ return false;
40
+ }
41
+ throw error;
42
+ }
43
+ }
44
+ export async function readJournalSlot(options) {
45
+ let observed;
46
+ try {
47
+ observed = await readBoundedRegularFile(options.path, options.maximumBytes);
48
+ }
49
+ catch (error) {
50
+ if (journalSlotErrorCode(error) === "ENOENT") {
51
+ return undefined;
52
+ }
53
+ throw error;
54
+ }
55
+ if (observed.outcome !== "read") {
56
+ throw options.failure("not-regular-file", {});
57
+ }
58
+ return {
59
+ authority: journalSlotAuthority(observed.identity, observed.bytes),
60
+ journal: await options.parse(observed.bytes)
61
+ };
62
+ }
63
+ function matchesResidue(entry, matcher) {
64
+ return "exact" in matcher
65
+ ? entry === matcher.exact
66
+ : entry.startsWith(matcher.prefix);
67
+ }
68
+ export async function journalSlotResidueNames(options) {
69
+ let directory;
70
+ try {
71
+ directory = await opendir(options.parent);
72
+ }
73
+ catch (error) {
74
+ if (journalSlotErrorCode(error) === "ENOENT") {
75
+ throw options.failure("state-directory-missing", { cause: error });
76
+ }
77
+ throw error;
78
+ }
79
+ const residues = [];
80
+ let entries = 0;
81
+ try {
82
+ for (;;) {
83
+ const entry = await directory.read();
84
+ if (entry === null) {
85
+ break;
86
+ }
87
+ entries += 1;
88
+ if (entries > MAXIMUM_DIRECTORY_ENTRIES) {
89
+ throw options.failure("too-many-entries", {});
90
+ }
91
+ if (options.matchers.some((matcher) => matchesResidue(entry.name, matcher))) {
92
+ residues.push(entry.name);
93
+ }
94
+ }
95
+ }
96
+ finally {
97
+ await directory.close();
98
+ }
99
+ return residues.toSorted();
100
+ }
101
+ /**
102
+ * Creates one private evidence directory. Owners choose the naming; a name
103
+ * collision retries with the next generated name so concurrent retirements
104
+ * never share a directory.
105
+ */
106
+ export async function createPrivateJournalSlotDirectory(parent, name) {
107
+ for (;;) {
108
+ const directory = join(parent, name());
109
+ try {
110
+ await mkdir(directory, { mode: 0o700 });
111
+ return { directory, path: join(directory, "evidence") };
112
+ }
113
+ catch (error) {
114
+ if (journalSlotErrorCode(error) !== "EEXIST") {
115
+ throw error;
116
+ }
117
+ }
118
+ }
119
+ }
120
+ export async function prepareJournalSlotCandidate(options) {
121
+ let handle;
122
+ try {
123
+ handle = await open(options.candidatePath, "wx", 0o600);
124
+ }
125
+ catch (error) {
126
+ throw options.failure(journalSlotErrorCode(error) === "EEXIST"
127
+ ? "candidate-exists"
128
+ : "candidate-unavailable", { cause: error });
129
+ }
130
+ try {
131
+ await handle.writeFile(options.bytes);
132
+ await handle.sync();
133
+ return journalSlotAuthority(await captureFileHandleIdentity(handle), options.bytes);
134
+ }
135
+ finally {
136
+ await handle.close();
137
+ }
138
+ }
139
+ //# sourceMappingURL=node-journal-slot-evidence.js.map