@arden-hq/revisions 0.0.0-stage → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +84 -2
  3. package/dist/domain/change-set.d.ts +34 -0
  4. package/dist/domain/change-set.d.ts.map +1 -0
  5. package/dist/domain/change-set.js +206 -0
  6. package/dist/domain/change-set.js.map +1 -0
  7. package/dist/domain/codec.d.ts +17 -0
  8. package/dist/domain/codec.d.ts.map +1 -0
  9. package/dist/domain/codec.js +188 -0
  10. package/dist/domain/codec.js.map +1 -0
  11. package/dist/domain/errors.d.ts +61 -0
  12. package/dist/domain/errors.d.ts.map +1 -0
  13. package/dist/domain/errors.js +44 -0
  14. package/dist/domain/errors.js.map +1 -0
  15. package/dist/domain/format.d.ts +72 -0
  16. package/dist/domain/format.d.ts.map +1 -0
  17. package/dist/domain/format.js +93 -0
  18. package/dist/domain/format.js.map +1 -0
  19. package/dist/domain/integrity.d.ts +7 -0
  20. package/dist/domain/integrity.d.ts.map +1 -0
  21. package/dist/domain/integrity.js +100 -0
  22. package/dist/domain/integrity.js.map +1 -0
  23. package/dist/domain/model.d.ts +114 -0
  24. package/dist/domain/model.d.ts.map +1 -0
  25. package/dist/domain/model.js +145 -0
  26. package/dist/domain/model.js.map +1 -0
  27. package/dist/domain/query.d.ts +31 -0
  28. package/dist/domain/query.d.ts.map +1 -0
  29. package/dist/domain/query.js +168 -0
  30. package/dist/domain/query.js.map +1 -0
  31. package/dist/domain/transaction.d.ts +26 -0
  32. package/dist/domain/transaction.d.ts.map +1 -0
  33. package/dist/domain/transaction.js +93 -0
  34. package/dist/domain/transaction.js.map +1 -0
  35. package/dist/domain/tree.d.ts +6 -0
  36. package/dist/domain/tree.d.ts.map +1 -0
  37. package/dist/domain/tree.js +59 -0
  38. package/dist/domain/tree.js.map +1 -0
  39. package/dist/effect/index.d.ts +10 -0
  40. package/dist/effect/index.d.ts.map +1 -0
  41. package/dist/effect/index.js +4 -0
  42. package/dist/effect/index.js.map +1 -0
  43. package/dist/repository/commit.d.ts +12 -0
  44. package/dist/repository/commit.d.ts.map +1 -0
  45. package/dist/repository/commit.js +164 -0
  46. package/dist/repository/commit.js.map +1 -0
  47. package/dist/repository/history.d.ts +21 -0
  48. package/dist/repository/history.d.ts.map +1 -0
  49. package/dist/repository/history.js +152 -0
  50. package/dist/repository/history.js.map +1 -0
  51. package/dist/repository/service.d.ts +114 -0
  52. package/dist/repository/service.d.ts.map +1 -0
  53. package/dist/repository/service.js +374 -0
  54. package/dist/repository/service.js.map +1 -0
  55. package/dist/repository/state.d.ts +27 -0
  56. package/dist/repository/state.d.ts.map +1 -0
  57. package/dist/repository/state.js +72 -0
  58. package/dist/repository/state.js.map +1 -0
  59. package/dist/repository/transaction.d.ts +27 -0
  60. package/dist/repository/transaction.d.ts.map +1 -0
  61. package/dist/repository/transaction.js +372 -0
  62. package/dist/repository/transaction.js.map +1 -0
  63. package/dist/storage/files.d.ts +17 -0
  64. package/dist/storage/files.d.ts.map +1 -0
  65. package/dist/storage/files.js +179 -0
  66. package/dist/storage/files.js.map +1 -0
  67. package/dist/storage/maintenance-adapter.d.ts +5 -0
  68. package/dist/storage/maintenance-adapter.d.ts.map +1 -0
  69. package/dist/storage/maintenance-adapter.js +177 -0
  70. package/dist/storage/maintenance-adapter.js.map +1 -0
  71. package/dist/storage/maintenance-reader.d.ts +17 -0
  72. package/dist/storage/maintenance-reader.d.ts.map +1 -0
  73. package/dist/storage/maintenance-reader.js +82 -0
  74. package/dist/storage/maintenance-reader.js.map +1 -0
  75. package/dist/storage/maintenance.d.ts +113 -0
  76. package/dist/storage/maintenance.d.ts.map +1 -0
  77. package/dist/storage/maintenance.js +445 -0
  78. package/dist/storage/maintenance.js.map +1 -0
  79. package/dist/storage/node.d.ts +7 -0
  80. package/dist/storage/node.d.ts.map +1 -0
  81. package/dist/storage/node.js +53 -0
  82. package/dist/storage/node.js.map +1 -0
  83. package/dist/storage/service.d.ts +88 -0
  84. package/dist/storage/service.d.ts.map +1 -0
  85. package/dist/storage/service.js +506 -0
  86. package/dist/storage/service.js.map +1 -0
  87. package/package.json +63 -4
@@ -0,0 +1,374 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { parseIdempotencyRecord } from "../domain/transaction.js";
3
+ import { Context, Effect, Layer, Schema, Semaphore } from "effect";
4
+ import { parseCommitObject } from "../domain/codec.js";
5
+ import { ChangeSet, Commit, Restore, ResourceVersion, Update, WorkingTreeAdoption, WorkingTreeChange, normalizeRelativePath } from "../domain/model.js";
6
+ import { CorruptRepositoryError, IdempotencyConflictError, InvalidRevisionInputError, RepositoryClosedError, RevisionConflictError } from "../domain/errors.js";
7
+ import { encodeUtf8 } from "../domain/format.js";
8
+ import { commit } from "./commit.js";
9
+ import { makeHistoryQuery } from "./history.js";
10
+ import { diff as queryDiff, diffPage as queryDiffPage, diffVersionsPage as queryDiffVersionsPage } from "../domain/query.js";
11
+ import { maintenanceStorageFromRevisionStorage } from "../storage/maintenance-adapter.js";
12
+ import { collect as collectObjects, integrityReport as inspectIntegrity, storageReport as inspectStorage } from "../storage/maintenance.js";
13
+ import { RevisionStorage, revisionStorageLayer } from "../storage/service.js";
14
+ import { currentMap, readCommit, snapshotAt, validateTransition, validHash } from "./state.js";
15
+ import { recoverTransactions, writeIdempotencyRecord } from "./transaction.js";
16
+ import { compareCodePoints } from "@arden-hq/std/json";
17
+ import { sha256Hex } from "@arden-hq/std/hash";
18
+ export class ManagedFileRepository extends Context.Service()("@arden-hq/revisions/ManagedFileRepository") {
19
+ }
20
+ const defaultGcGracePeriodMs = 30 * 24 * 60 * 60 * 1_000;
21
+ const decodeChangeSet = Effect.fn("decodeChangeSet")(function* (request) {
22
+ return yield* Schema.decodeUnknownEffect(ChangeSet)({
23
+ ...request,
24
+ idempotencyKey: request.idempotencyKey ?? randomUUID()
25
+ }).pipe(Effect.mapError((cause) => new InvalidRevisionInputError({ message: cause.message })));
26
+ });
27
+ const decodeWorkingTreeAdoption = Effect.fn("decodeWorkingTreeAdoption")(function* (value) {
28
+ const adoption = yield* Schema.decodeUnknownEffect(WorkingTreeAdoption)(value).pipe(Effect.mapError(() => new InvalidRevisionInputError({ message: "working-tree adoption has an invalid shape" })));
29
+ return new WorkingTreeAdoption({
30
+ ...adoption,
31
+ changes: adoption.changes.map((change) => new WorkingTreeChange({
32
+ ...change,
33
+ content: new Uint8Array(change.content)
34
+ }))
35
+ });
36
+ });
37
+ const makeRepository = Effect.fn("makeManagedFileRepository")(function* (options) {
38
+ const storage = yield* RevisionStorage;
39
+ const withLockQueue = (yield* Semaphore.make(1)).withPermit;
40
+ let closed = false;
41
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
42
+ closed = true;
43
+ }));
44
+ const reportOpen = (phase) => {
45
+ try {
46
+ options.onOpenPhase?.(phase);
47
+ }
48
+ catch {
49
+ // Diagnostics cannot prevent repository recovery.
50
+ }
51
+ };
52
+ reportOpen("revision_storage_ready");
53
+ const gcGracePeriodMs = options.gcGracePeriodMs ?? defaultGcGracePeriodMs;
54
+ if (!Number.isSafeInteger(gcGracePeriodMs) || gcGracePeriodMs < 0) {
55
+ return yield* new InvalidRevisionInputError({
56
+ message: "gcGracePeriodMs must be a non-negative safe integer"
57
+ });
58
+ }
59
+ const withRepositoryLock = Effect.fn("RevisionRepository.withRepositoryLock")(function* (operation, onLockAcquired) {
60
+ return yield* storage.withLock(Effect.andThen(Effect.sync(() => onLockAcquired?.()), operation));
61
+ });
62
+ const recoverUnderLock = withRepositoryLock(Effect.gen(function* () {
63
+ yield* storage.initialize;
64
+ reportOpen("revision_initialized");
65
+ yield* recoverTransactions(storage);
66
+ reportOpen("revision_recovered");
67
+ yield* storage.readRef;
68
+ reportOpen("revision_ref_checked");
69
+ }), () => reportOpen("revision_lock_acquired"));
70
+ const sweepAfterOpen = Effect.forkScoped(withLockQueue(withRepositoryLock(storage.cleanupMetadataTemps("."))).pipe(Effect.catchCause((cause) => Effect.logWarning("Revision history temporary sweep failed", cause))));
71
+ const openRepository = Effect.andThen(recoverUnderLock, sweepAfterOpen);
72
+ yield* openRepository;
73
+ const loadCommit = (id) => storage.readCommit(id).pipe(Effect.flatMap((bytes) => parseCommitObject(id, bytes)));
74
+ const readPublishedHead = Effect.gen(function* () {
75
+ const id = yield* storage.readRef;
76
+ if (id === null || (yield* storage.isPublished(id)))
77
+ return id;
78
+ const pending = yield* loadCommit(id);
79
+ if (pending.parentId === null || (yield* storage.isPublished(pending.parentId)))
80
+ return pending.parentId;
81
+ return yield* new CorruptRepositoryError({
82
+ message: `current ref points to unpublished commit: ${id}`
83
+ });
84
+ });
85
+ const head = readPublishedHead.pipe(Effect.flatMap((id) => id === null
86
+ ? Effect.succeed(null)
87
+ : Effect.gen(function* () {
88
+ const commit = yield* loadCommit(id);
89
+ yield* validateTransition(storage, commit);
90
+ return id;
91
+ })));
92
+ const parsed = { trees: new Map(), commits: new Map() };
93
+ const queryHistory = makeHistoryQuery();
94
+ const currentSnapshot = readPublishedHead.pipe(Effect.flatMap((id) => snapshotAt(storage, id)));
95
+ const maintenanceStorage = maintenanceStorageFromRevisionStorage(storage);
96
+ const repository = {
97
+ head,
98
+ currentRevision: readPublishedHead,
99
+ isReachable: Effect.fn("RevisionRepository.isReachable")(function* (commitId) {
100
+ if (!validHash(commitId))
101
+ return false;
102
+ return yield* storage.isPublished(commitId);
103
+ }),
104
+ get: Effect.fn("RevisionRepository.get")(function* (resourceId, options = {}) {
105
+ const resources = yield* options.at === undefined || options.at === null
106
+ ? currentSnapshot
107
+ : snapshotAt(storage, options.at);
108
+ return resources.get(resourceId) ?? null;
109
+ }),
110
+ findByPath: Effect.fn("RevisionRepository.findByPath")(function* (path, options = {}) {
111
+ const normalized = yield* normalizeRelativePath(path);
112
+ const resources = yield* options.at === undefined || options.at === null
113
+ ? currentSnapshot
114
+ : snapshotAt(storage, options.at);
115
+ return ([...resources.values()].find((resource) => resource.path === normalized &&
116
+ (options.includeArchived === true || resource.state === "active")) ?? null);
117
+ }),
118
+ listResources: Effect.fn("RevisionRepository.listResources")(function* (options = {}) {
119
+ const resources = yield* options.at === undefined || options.at === null
120
+ ? currentSnapshot
121
+ : snapshotAt(storage, options.at);
122
+ return [...resources.values()]
123
+ .filter((resource) => options.includeArchived === true || resource.state === "active")
124
+ .sort((left, right) => compareCodePoints(left.resourceId, right.resourceId));
125
+ }),
126
+ read: Effect.fn("RevisionRepository.read")(function* (resourceId, options = {}) {
127
+ const resource = yield* repository.get(resourceId, options);
128
+ if (resource === null)
129
+ return yield* new RevisionConflictError({ message: `resource is not found: ${resourceId}` });
130
+ return yield* storage.readBlob(resource.blobId);
131
+ }),
132
+ readVersion: (version) => storage.readBlob(version.blobId),
133
+ contentSize: Effect.fn("RevisionRepository.contentSize")(function* (resource, options = {}) {
134
+ if (typeof resource !== "string" && options.at !== undefined && options.at !== null) {
135
+ return yield* new RevisionConflictError({
136
+ message: "at is only supported when contentSize receives a resource ID"
137
+ });
138
+ }
139
+ const version = typeof resource !== "string" ? resource : yield* repository.get(resource, options);
140
+ if (version === null || version === undefined)
141
+ return yield* new RevisionConflictError({
142
+ message: `resource is not found: ${String(resource)}`
143
+ });
144
+ return yield* storage.blobSize(version.blobId);
145
+ }),
146
+ inspectCommit: Effect.fn("RevisionRepository.inspectCommit")(function* (commitId) {
147
+ if (!validHash(commitId) || !(yield* storage.isPublished(commitId)))
148
+ return yield* new RevisionConflictError({ message: `commit is not reachable: ${commitId}` });
149
+ return yield* loadCommit(commitId);
150
+ }),
151
+ commit: (request) => withLockQueue(decodeChangeSet(request).pipe(Effect.flatMap((changeSet) => commit(storage, head, changeSet, options.checkpoint)))),
152
+ idempotencyReceipt: Effect.fn("RevisionRepository.idempotencyReceipt")(function* (idempotencyKey) {
153
+ if (idempotencyKey.length === 0) {
154
+ return yield* new InvalidRevisionInputError({
155
+ message: "idempotency key must be non-empty"
156
+ });
157
+ }
158
+ const keyHash = sha256Hex(encodeUtf8(idempotencyKey));
159
+ const content = yield* storage.readIdempotency(keyHash);
160
+ if (content === null)
161
+ return null;
162
+ const receipt = yield* parseIdempotencyRecord(content, keyHash);
163
+ yield* storage
164
+ .readCommit(receipt.commitId)
165
+ .pipe(Effect.flatMap((bytes) => parseCommitObject(receipt.commitId, bytes)));
166
+ return receipt;
167
+ }),
168
+ finalizeIdempotencyReceipt: (idempotencyKey, requestIdentity) => withLockQueue(Effect.gen(function* () {
169
+ if (idempotencyKey.length === 0 || requestIdentity.length === 0) {
170
+ return yield* new InvalidRevisionInputError({
171
+ message: "receipt identity must be non-empty"
172
+ });
173
+ }
174
+ const critical = Effect.gen(function* () {
175
+ yield* recoverTransactions(storage);
176
+ const keyHash = sha256Hex(encodeUtf8(idempotencyKey));
177
+ const requestHash = sha256Hex(encodeUtf8(requestIdentity));
178
+ const existing = yield* storage.readIdempotency(keyHash);
179
+ if (existing !== null) {
180
+ const receipt = yield* parseIdempotencyRecord(existing, keyHash);
181
+ if (receipt.requestHash !== requestHash) {
182
+ return yield* new IdempotencyConflictError({
183
+ message: `idempotency key was reused for a different receipt: ${idempotencyKey}`
184
+ });
185
+ }
186
+ return receipt;
187
+ }
188
+ const commitId = yield* head;
189
+ if (commitId === null) {
190
+ return yield* new InvalidRevisionInputError({
191
+ message: "cannot finalize a receipt in an empty repository"
192
+ });
193
+ }
194
+ yield* storage
195
+ .readCommit(commitId)
196
+ .pipe(Effect.flatMap((bytes) => parseCommitObject(commitId, bytes)));
197
+ yield* writeIdempotencyRecord(storage, keyHash, requestHash, commitId);
198
+ return { requestHash, commitId };
199
+ });
200
+ return yield* storage.withLock(critical);
201
+ })),
202
+ previewWorkingChanges: withLockQueue(withRepositoryLock(Effect.gen(function* () {
203
+ yield* recoverTransactions(storage);
204
+ const revision = yield* readPublishedHead;
205
+ const resources = yield* currentMap(storage, revision);
206
+ const changes = [];
207
+ for (const resource of [...resources.values()].sort((left, right) => compareCodePoints(left.resourceId, right.resourceId))) {
208
+ if (resource.state !== "active")
209
+ continue;
210
+ const content = yield* storage.readWorking(resource.path, true, true);
211
+ if (content === null) {
212
+ return yield* new RevisionConflictError({
213
+ message: `managed working file is missing: ${resource.path}`
214
+ });
215
+ }
216
+ if (sha256Hex(content) === resource.blobId)
217
+ continue;
218
+ changes.push(new WorkingTreeChange({
219
+ resourceId: resource.resourceId,
220
+ path: resource.path,
221
+ expectedVersion: resource.versionId,
222
+ content: new Uint8Array(content)
223
+ }));
224
+ }
225
+ return { revision, changes };
226
+ }))),
227
+ adoptWorkingChanges: (preview, input) => withLockQueue(Effect.gen(function* () {
228
+ const adoption = yield* decodeWorkingTreeAdoption({
229
+ expectedHead: preview.revision,
230
+ changes: preview.changes,
231
+ actor: input.actor,
232
+ origin: input.origin,
233
+ reason: input.reason,
234
+ idempotencyKey: randomUUID()
235
+ });
236
+ const expectedPaths = new Map();
237
+ const operations = [];
238
+ for (const change of adoption.changes) {
239
+ const path = yield* normalizeRelativePath(change.path);
240
+ if (expectedPaths.has(change.resourceId)) {
241
+ return yield* new InvalidRevisionInputError({
242
+ message: `working-tree adoption repeats resource: ${change.resourceId}`
243
+ });
244
+ }
245
+ expectedPaths.set(change.resourceId, path);
246
+ operations.push(new Update({
247
+ resourceId: change.resourceId,
248
+ expectedVersion: change.expectedVersion,
249
+ content: new Uint8Array(change.content)
250
+ }));
251
+ }
252
+ const base = {
253
+ operations,
254
+ actor: adoption.actor,
255
+ origin: adoption.origin,
256
+ reason: adoption.reason,
257
+ idempotencyKey: adoption.idempotencyKey,
258
+ expectedHead: adoption.expectedHead
259
+ };
260
+ const changeSet = adoption.expectedHead === null
261
+ ? new ChangeSet({ ...base, enforceExpectedHead: true })
262
+ : new ChangeSet(base);
263
+ return yield* commit(storage, head, changeSet, options.checkpoint, expectedPaths);
264
+ })),
265
+ prepareHistory: Effect.fn("RevisionRepository.prepareHistory")(function* () {
266
+ const cache = { trees: new Map(), commits: new Map(), parsed };
267
+ yield* queryHistory.prepare({
268
+ head: yield* readPublishedHead,
269
+ loadCommit: (id) => readCommit(storage, id, cache)
270
+ });
271
+ }),
272
+ history: Effect.fn("RevisionRepository.history")(function* (input = {}) {
273
+ const cache = { trees: new Map(), commits: new Map(), parsed };
274
+ const current = yield* readPublishedHead;
275
+ return yield* queryHistory.query({
276
+ head: current,
277
+ resourceId: input.resourceId ?? null,
278
+ start: input.start ?? null,
279
+ stopBefore: input.stopBefore ?? null,
280
+ limit: input.limit ?? null,
281
+ validHash,
282
+ requireReachable: (id) => repository
283
+ .isReachable(id)
284
+ .pipe(Effect.flatMap((reachable) => reachable
285
+ ? Effect.succeed(undefined)
286
+ : new RevisionConflictError({ message: `commit is not reachable: ${id}` }))),
287
+ loadCommit: (id) => readCommit(storage, id, cache),
288
+ validateCommitTransition: (item) => validateTransition(storage, item, cache)
289
+ });
290
+ }),
291
+ diff: Effect.fn("RevisionRepository.diff")(function* (base, target, options = {}) {
292
+ const cache = { trees: new Map(), commits: new Map(), parsed };
293
+ const before = yield* snapshotAt(storage, base, cache);
294
+ const after = yield* snapshotAt(storage, target, cache);
295
+ return yield* queryDiff(before, after, options.resourceIds, (blobId) => storage.readBlob(blobId));
296
+ }),
297
+ diffPage: Effect.fn("RevisionRepository.diffPage")(function* (base, target, resourceId, options = {}) {
298
+ const cache = { trees: new Map(), commits: new Map(), parsed };
299
+ const before = yield* snapshotAt(storage, base, cache);
300
+ const after = yield* snapshotAt(storage, target, cache);
301
+ return yield* queryDiffPage(before.get(resourceId) ?? null, after.get(resourceId) ?? null, resourceId, options.offset ?? 0, options.limit ?? 16_384, options.tail ?? false, (blobId) => storage.readBlob(blobId));
302
+ }),
303
+ diffVersionsPage: (before, after, options = {}) => queryDiffVersionsPage(before, after, options.offset ?? 0, options.limit ?? 16_384, options.tail ?? false, options.sourceByteLimit, (blobId) => storage.blobSize(blobId), (blobId) => storage.readBlob(blobId)),
304
+ restoreFromCommit: (resourceId, sourceCommit, input) => withLockQueue(Effect.gen(function* () {
305
+ const source = yield* repository.get(resourceId, { at: sourceCommit });
306
+ if (source === null)
307
+ return yield* new RevisionConflictError({
308
+ message: `resource is not found at commit: ${resourceId}`
309
+ });
310
+ const content = yield* storage.readBlob(source.blobId);
311
+ const base = {
312
+ operations: [
313
+ new Restore({
314
+ resourceId,
315
+ expectedVersion: input.expectedVersion,
316
+ path: input.path ?? source.path,
317
+ content
318
+ })
319
+ ],
320
+ actor: input.actor,
321
+ origin: input.origin,
322
+ reason: input.reason,
323
+ idempotencyKey: input.idempotencyKey ?? randomUUID(),
324
+ enforceExpectedHead: input.enforceExpectedHead ?? false
325
+ };
326
+ return yield* commit(storage, head, input.expectedHead === undefined
327
+ ? new ChangeSet(base)
328
+ : new ChangeSet({ ...base, expectedHead: input.expectedHead }), options.checkpoint);
329
+ })),
330
+ integrityReport: withLockQueue(withRepositoryLock(inspectIntegrity(maintenanceStorage))),
331
+ storageReport: withLockQueue(withRepositoryLock(Effect.gen(function* () {
332
+ yield* storage.cleanupMetadataTemps(".");
333
+ yield* recoverTransactions(storage);
334
+ return yield* inspectStorage(maintenanceStorage, yield* currentSnapshot);
335
+ }))),
336
+ collect: (input = {}) => withLockQueue(withRepositoryLock(Effect.gen(function* () {
337
+ yield* storage.cleanupMetadataTemps(".");
338
+ yield* recoverTransactions(storage);
339
+ const gracePeriodMs = input.gracePeriodMs ?? gcGracePeriodMs;
340
+ return yield* collectObjects(maintenanceStorage, input.nowMillis === undefined
341
+ ? { gracePeriodMs }
342
+ : { gracePeriodMs, nowMillis: input.nowMillis });
343
+ })))
344
+ };
345
+ const open = (effect) => Effect.suspend(() => closed ? Effect.fail(new RepositoryClosedError({ message: "repository is closed" })) : effect);
346
+ return {
347
+ head: open(repository.head),
348
+ currentRevision: open(repository.currentRevision),
349
+ isReachable: (commitId) => open(repository.isReachable(commitId)),
350
+ get: (resourceId, at) => open(repository.get(resourceId, at)),
351
+ findByPath: (path, at) => open(repository.findByPath(path, at)),
352
+ listResources: (at) => open(repository.listResources(at)),
353
+ read: (resourceId, at) => open(repository.read(resourceId, at)),
354
+ readVersion: (version) => open(repository.readVersion(version)),
355
+ contentSize: (resource, at) => open(repository.contentSize(resource, at)),
356
+ inspectCommit: (commitId) => open(repository.inspectCommit(commitId)),
357
+ commit: (request) => open(repository.commit(request)),
358
+ idempotencyReceipt: (idempotencyKey) => open(repository.idempotencyReceipt(idempotencyKey)),
359
+ finalizeIdempotencyReceipt: (idempotencyKey, requestIdentity) => open(repository.finalizeIdempotencyReceipt(idempotencyKey, requestIdentity)),
360
+ previewWorkingChanges: open(repository.previewWorkingChanges),
361
+ adoptWorkingChanges: (preview, input) => open(repository.adoptWorkingChanges(preview, input)),
362
+ history: (input) => open(repository.history(input)),
363
+ prepareHistory: () => open(repository.prepareHistory()),
364
+ diff: (base, target, input) => open(repository.diff(base, target, input)),
365
+ diffPage: (base, target, resourceId, input) => open(repository.diffPage(base, target, resourceId, input)),
366
+ diffVersionsPage: (before, after, input) => open(repository.diffVersionsPage(before, after, input)),
367
+ restoreFromCommit: (resourceId, sourceCommit, input) => open(repository.restoreFromCommit(resourceId, sourceCommit, input)),
368
+ integrityReport: open(repository.integrityReport),
369
+ storageReport: open(repository.storageReport),
370
+ collect: (input) => open(repository.collect(input))
371
+ };
372
+ });
373
+ export const managedFileRepositoryLayer = (options) => Layer.effect(ManagedFileRepository, makeRepository(options)).pipe(Layer.provide(revisionStorageLayer(options)));
374
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/repository/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Effect } from "effect";
2
+ import { type ResourceSnapshot } from "../domain/change-set.js";
3
+ import { Commit } from "../domain/model.js";
4
+ import { RevisionStorageError } from "../domain/errors.js";
5
+ import type { RevisionError } from "../domain/errors.js";
6
+ import type { TreeRecord } from "../domain/format.js";
7
+ import type { RevisionStorageShape } from "../storage/service.js";
8
+ export type RepositoryError = RevisionError | RevisionStorageError;
9
+ export interface RevisionParsedCache {
10
+ readonly trees: Map<string, TreeRecord>;
11
+ readonly commits: Map<string, Commit>;
12
+ }
13
+ export interface RevisionReadCache {
14
+ readonly parsed: RevisionParsedCache;
15
+ readonly trees: Map<string, Effect.Effect<ResourceSnapshot, RepositoryError>>;
16
+ readonly commits: Map<string, Effect.Effect<Commit, RepositoryError>>;
17
+ }
18
+ export declare const readCommit: (storage: RevisionStorageShape, id: string, cache?: RevisionReadCache) => Effect.Effect<Commit, RepositoryError>;
19
+ export declare const validHash: (value: unknown) => value is string;
20
+ export declare const timestamp: (milliseconds: number) => string;
21
+ /** Materialize a complete immutable tree while checking its structural invariants. */
22
+ export declare const materializeTree: (storage: RevisionStorageShape, treeId: string, cache?: RevisionReadCache) => Effect.Effect<ResourceSnapshot, RepositoryError>;
23
+ export declare const currentMap: (storage: RevisionStorageShape, head: string | null, cache?: RevisionReadCache) => Effect.Effect<ResourceSnapshot, RepositoryError>;
24
+ /** Validate a commit's complete parent/tree transition and path invariants. */
25
+ export declare const validateTransition: (storage: RevisionStorageShape, commit: Commit, cache?: RevisionReadCache | undefined) => Effect.Effect<void, RepositoryError, never>;
26
+ export declare const snapshotAt: (storage: RevisionStorageShape, commitId: string | null, sharedCache?: RevisionReadCache | undefined) => Effect.Effect<ResourceSnapshot, RepositoryError, never>;
27
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/repository/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAyB,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEjE,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,oBAAoB,CAAA;AAElE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAA;IAC7E,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAA;CACtE;AA+BD,eAAO,MAAM,UAAU,YACZ,oBAAoB,MACzB,MAAM,UACF,iBAAiB,KACxB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAWrC,CAAA;AAEH,eAAO,MAAM,SAAS,UAAW,OAAO,KAAG,KAAK,IAAI,MAGW,CAAA;AAE/D,eAAO,MAAM,SAAS,iBAAkB,MAAM,KAAG,MAGhD,CAAA;AAED,sFAAsF;AACtF,eAAO,MAAM,eAAe,YACjB,oBAAoB,UACrB,MAAM,UACN,iBAAiB,KACxB,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAgB/C,CAAA;AAEH,eAAO,MAAM,UAAU,YACZ,oBAAoB,QACvB,MAAM,GAAG,IAAI,UACX,iBAAiB,KACxB,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAM1C,CAAA;AAER,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB,uIAQ7B,CAAA;AAEF,eAAO,MAAM,UAAU,kKAiBrB,CAAA"}
@@ -0,0 +1,72 @@
1
+ import { Effect } from "effect";
2
+ import {} from "../domain/change-set.js";
3
+ import { decodeCanonicalJsonl, parseCommitObject, parseTreeRecord } from "../domain/codec.js";
4
+ import { Commit } from "../domain/model.js";
5
+ import { RevisionConflictError, RevisionStorageError } from "../domain/errors.js";
6
+ import { validateSnapshotTransition } from "../domain/integrity.js";
7
+ import { materializeSnapshot } from "../domain/tree.js";
8
+ const readCached = Effect.fn("Revision.readCached")(function* (cache, key, read) {
9
+ if (cache === undefined)
10
+ return yield* read;
11
+ const existing = cache.get(key);
12
+ if (existing !== undefined)
13
+ return yield* existing;
14
+ const shared = yield* Effect.cached(read);
15
+ cache.set(key, shared);
16
+ return yield* shared;
17
+ });
18
+ const parseVerified = Effect.fn("Revision.parseVerified")(function* (cache, id, parse) {
19
+ const existing = cache?.get(id);
20
+ if (existing !== undefined)
21
+ return existing;
22
+ const value = yield* parse;
23
+ if (cache !== undefined) {
24
+ const oldest = cache.keys().next();
25
+ if (cache.size >= 512 && oldest.done !== true)
26
+ cache.delete(oldest.value);
27
+ cache.set(id, value);
28
+ }
29
+ return value;
30
+ });
31
+ export const readCommit = (storage, id, cache) => readCached(cache?.commits, id, storage
32
+ .readCommit(id)
33
+ .pipe(Effect.flatMap((bytes) => parseVerified(cache?.parsed.commits, id, parseCommitObject(id, bytes)))));
34
+ export const validHash = (value) => typeof value === "string" &&
35
+ value.length === 64 &&
36
+ [...value].every((char) => "0123456789abcdef".includes(char));
37
+ export const timestamp = (milliseconds) => {
38
+ const value = new Date(milliseconds).toISOString();
39
+ return `${value.slice(0, 19)}.${value.slice(20, 23)}000Z`;
40
+ };
41
+ /** Materialize a complete immutable tree while checking its structural invariants. */
42
+ export const materializeTree = (storage, treeId, cache) => materializeSnapshot((id) => storage
43
+ .readTree(id)
44
+ .pipe(Effect.flatMap((bytes) => parseVerified(cache?.parsed.trees, id, decodeCanonicalJsonl(bytes).pipe(Effect.flatMap(parseTreeRecord))))), treeId, cache?.trees);
45
+ export const currentMap = (storage, head, cache) => head === null
46
+ ? Effect.succeed(new Map())
47
+ : Effect.gen(function* () {
48
+ const commit = yield* readCommit(storage, head, cache);
49
+ return yield* materializeTree(storage, commit.treeId, cache);
50
+ });
51
+ /** Validate a commit's complete parent/tree transition and path invariants. */
52
+ export const validateTransition = Effect.fn("Revision.validateTransition")(function* (storage, commit, cache) {
53
+ const before = yield* currentMap(storage, commit.parentId, cache);
54
+ const after = yield* materializeTree(storage, commit.treeId, cache);
55
+ yield* validateSnapshotTransition(commit, before, after);
56
+ });
57
+ export const snapshotAt = Effect.fn("Revision.snapshotAt")(function* (storage, commitId, sharedCache) {
58
+ if (commitId === null)
59
+ return new Map();
60
+ if (!validHash(commitId) || !(yield* storage.isPublished(commitId))) {
61
+ return yield* new RevisionConflictError({ message: `commit is not reachable: ${commitId}` });
62
+ }
63
+ const cache = sharedCache ?? {
64
+ trees: new Map(),
65
+ commits: new Map(),
66
+ parsed: { trees: new Map(), commits: new Map() }
67
+ };
68
+ const commit = yield* readCommit(storage, commitId, cache);
69
+ yield* validateTransition(storage, commit, cache);
70
+ return yield* materializeTree(storage, commit.treeId, cache);
71
+ });
72
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/repository/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Effect } from "effect";
2
+ import { type Transaction } from "../domain/transaction.js";
3
+ import { type RepositoryError } from "./state.js";
4
+ import type { RevisionStorageShape } from "../storage/service.js";
5
+ export declare const writeIdempotencyRecord: (storage: RevisionStorageShape, keyHash: string, requestHash: string, commitId: string) => Effect.Effect<void, RepositoryError>;
6
+ export declare const artifact: (id: string, kind: string, index: number) => string;
7
+ export declare const workingHash: (storage: RevisionStorageShape, path: string) => Effect.Effect<string | null, RepositoryError>;
8
+ export declare const assertWorking: (storage: RevisionStorageShape, path: string, expected: string | null) => Effect.Effect<void, RepositoryError, never>;
9
+ export declare const installRows: (storage: RevisionStorageShape, transaction: Transaction, expectPreinstalled?: any) => Effect.Effect<void, RepositoryError, never>;
10
+ /** Validate every active path in a resulting tree before publishing or deleting recovery metadata. */
11
+ export declare const validateWorkingTree: (storage: RevisionStorageShape, head: string) => Effect.Effect<void, RepositoryError, never>;
12
+ /**
13
+ * Settle interrupted transactions. Only the transactions directory is swept
14
+ * for crash-orphaned temporaries here, because recovery lists it and nothing
15
+ * else: this runs before every commit, and sweeping the whole history
16
+ * (thousands of objects) each time cost seconds per boot. The rest of the
17
+ * history is swept once per open, and before maintenance lists objects.
18
+ */
19
+ export declare const recoverTransactions: (storage: RevisionStorageShape) => Effect.Effect<void, RepositoryError, never>;
20
+ declare const validatedBeforePrepare: unique symbol;
21
+ export type ValidatedTransaction = Transaction & {
22
+ readonly [validatedBeforePrepare]: true;
23
+ };
24
+ export declare const validateBeforePrepare: (storage: RevisionStorageShape, transaction: Transaction) => Effect.Effect<ValidatedTransaction, RepositoryError>;
25
+ export declare const writePreparedMarker: (storage: RevisionStorageShape, transaction: ValidatedTransaction) => Effect.Effect<void, import("../storage/service.js").StorageError, never>;
26
+ export {};
27
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/repository/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,0BAA0B,CAAA;AAWjC,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,YAAY,CAAA;AACzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAwCjE,eAAO,MAAM,sBAAsB,YACxB,oBAAoB,WACpB,MAAM,eACF,MAAM,YACT,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAwBrC,CAAA;AAED,eAAO,MAAM,QAAQ,OAAQ,MAAM,QAAQ,MAAM,SAAS,MAAM,KAAG,MACA,CAAA;AAKnE,eAAO,MAAM,WAAW,YACb,oBAAoB,QACvB,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,eAAe,CACsB,CAAA;AAErE,eAAO,MAAM,aAAa,uHAQxB,CAAA;AAEF,eAAO,MAAM,WAAW,oIAyEtB,CAAA;AA6IF,sGAAsG;AACtG,eAAO,MAAM,mBAAmB,8FAc9B,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,gFAgG9B,CAAA;AAkBF,OAAO,CAAC,MAAM,sBAAsB,EAAE,OAAO,MAAM,CAAA;AACnD,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAA;CAAE,CAAA;AAE5F,eAAO,MAAM,qBAAqB,YACvB,oBAAoB,eAChB,WAAW,KACvB,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,eAAe,CAC8C,CAAA;AAEpG,eAAO,MAAM,mBAAmB,YACrB,oBAAoB,eAChB,oBAAoB,6EAMhC,CAAA"}