@earendil-works/pi-durable 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +17 -4
- package/dist/codemode/codemode.d.ts +2 -1
- package/dist/codemode/codemode.d.ts.map +1 -1
- package/dist/codemode/codemode.js +1 -37
- package/dist/codemode/codemode.js.map +1 -1
- package/dist/codemode/models.d.ts +2 -1
- package/dist/codemode/models.d.ts.map +1 -1
- package/dist/codemode/models.js.map +1 -1
- package/dist/documents.d.ts +1 -1
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +1 -1
- package/dist/documents.js.map +1 -1
- package/dist/entries.d.ts +1 -1
- package/dist/entries.d.ts.map +1 -1
- package/dist/entries.js.map +1 -1
- package/dist/env/index.d.ts +1 -1
- package/dist/env/index.d.ts.map +1 -1
- package/dist/env/index.js.map +1 -1
- package/dist/env/node-watch.d.ts +1 -1
- package/dist/env/node-watch.d.ts.map +1 -1
- package/dist/env/node-watch.js.map +1 -1
- package/dist/env/node.d.ts +1 -1
- package/dist/env/node.d.ts.map +1 -1
- package/dist/env/node.js.map +1 -1
- package/dist/harness/agent.d.ts.map +1 -1
- package/dist/harness/agent.js +27 -1
- package/dist/harness/agent.js.map +1 -1
- package/dist/harness/compaction.d.ts +8 -3
- package/dist/harness/compaction.d.ts.map +1 -1
- package/dist/harness/compaction.js +21 -9
- package/dist/harness/compaction.js.map +1 -1
- package/dist/harness/context.d.ts +1 -1
- package/dist/harness/context.d.ts.map +1 -1
- package/dist/harness/context.js.map +1 -1
- package/dist/harness/define.d.ts +1 -1
- package/dist/harness/define.d.ts.map +1 -1
- package/dist/harness/define.js.map +1 -1
- package/dist/harness/generation.d.ts +1 -1
- package/dist/harness/generation.d.ts.map +1 -1
- package/dist/harness/generation.js +6 -4
- package/dist/harness/generation.js.map +1 -1
- package/dist/harness/harness.d.ts +1 -1
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/harness.js.map +1 -1
- package/dist/harness/inbox.d.ts +2 -1
- package/dist/harness/inbox.d.ts.map +1 -1
- package/dist/harness/inbox.js +1 -1
- package/dist/harness/inbox.js.map +1 -1
- package/dist/harness/json.d.ts +1 -1
- package/dist/harness/json.d.ts.map +1 -1
- package/dist/harness/json.js.map +1 -1
- package/dist/harness/live.d.ts +2 -1
- package/dist/harness/live.d.ts.map +1 -1
- package/dist/harness/live.js.map +1 -1
- package/dist/harness/partial-changes.d.ts +1 -1
- package/dist/harness/partial-changes.d.ts.map +1 -1
- package/dist/harness/partial-changes.js +1 -0
- package/dist/harness/partial-changes.js.map +1 -1
- package/dist/harness/prompt.d.ts +1 -1
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/provider.d.ts +1 -1
- package/dist/harness/provider.d.ts.map +1 -1
- package/dist/harness/provider.js.map +1 -1
- package/dist/harness/registry-reader.d.ts +1 -1
- package/dist/harness/registry-reader.d.ts.map +1 -1
- package/dist/harness/registry-reader.js.map +1 -1
- package/dist/harness/scheduler.d.ts +2 -1
- package/dist/harness/scheduler.d.ts.map +1 -1
- package/dist/harness/scheduler.js +42 -13
- package/dist/harness/scheduler.js.map +1 -1
- package/dist/harness/submissions.d.ts +1 -1
- package/dist/harness/submissions.d.ts.map +1 -1
- package/dist/harness/submissions.js +1 -1
- package/dist/harness/submissions.js.map +1 -1
- package/dist/harness/task-graph.d.ts +3 -1
- package/dist/harness/task-graph.d.ts.map +1 -1
- package/dist/harness/task-graph.js +1 -1
- package/dist/harness/task-graph.js.map +1 -1
- package/dist/harness/tool.d.ts +1 -1
- package/dist/harness/tool.d.ts.map +1 -1
- package/dist/harness/tool.js +1 -1
- package/dist/harness/tool.js.map +1 -1
- package/dist/harness/transcript.d.ts +1 -1
- package/dist/harness/transcript.d.ts.map +1 -1
- package/dist/harness/transcript.js.map +1 -1
- package/dist/harness/types.d.ts +21 -4
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/usage.d.ts +2 -1
- package/dist/harness/usage.d.ts.map +1 -1
- package/dist/harness/usage.js +1 -1
- package/dist/harness/usage.js.map +1 -1
- package/dist/harness/util.d.ts +1 -1
- package/dist/harness/util.d.ts.map +1 -1
- package/dist/harness/util.js.map +1 -1
- package/dist/harness/view.d.ts +2 -1
- package/dist/harness/view.d.ts.map +1 -1
- package/dist/harness/view.js +1 -1
- package/dist/harness/view.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/session/cached-storage.d.ts +2 -1
- package/dist/session/cached-storage.d.ts.map +1 -1
- package/dist/session/cached-storage.js.map +1 -1
- package/dist/session/forks.d.ts +1 -1
- package/dist/session/forks.d.ts.map +1 -1
- package/dist/session/forks.js.map +1 -1
- package/dist/session/keys.d.ts +2 -1
- package/dist/session/keys.d.ts.map +1 -1
- package/dist/session/keys.js.map +1 -1
- package/dist/session/session.d.ts +3 -1
- package/dist/session/session.d.ts.map +1 -1
- package/dist/session/session.js +1 -1
- package/dist/session/session.js.map +1 -1
- package/dist/session/transaction.d.ts +4 -3
- package/dist/session/transaction.d.ts.map +1 -1
- package/dist/session/transaction.js +3 -3
- package/dist/session/transaction.js.map +1 -1
- package/dist/session/writer.d.ts +1 -1
- package/dist/session/writer.d.ts.map +1 -1
- package/dist/session/writer.js.map +1 -1
- package/dist/storage/indexeddb.d.ts +2 -1
- package/dist/storage/indexeddb.d.ts.map +1 -1
- package/dist/storage/indexeddb.js.map +1 -1
- package/dist/storage/jsonl/index.d.ts +1 -1
- package/dist/storage/jsonl/index.d.ts.map +1 -1
- package/dist/storage/jsonl/index.js +1 -1
- package/dist/storage/jsonl/index.js.map +1 -1
- package/dist/storage/jsonl/node.d.ts +3 -3
- package/dist/storage/jsonl/node.d.ts.map +1 -1
- package/dist/storage/jsonl/node.js +2 -2
- package/dist/storage/jsonl/node.js.map +1 -1
- package/dist/storage/jsonl/storage.d.ts +32 -3
- package/dist/storage/jsonl/storage.d.ts.map +1 -1
- package/dist/storage/jsonl/storage.js +70 -19
- package/dist/storage/jsonl/storage.js.map +1 -1
- package/dist/storage/memory.d.ts +2 -1
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/sqlite/commit.d.ts +52 -0
- package/dist/storage/sqlite/commit.d.ts.map +1 -0
- package/dist/storage/sqlite/commit.js +371 -0
- package/dist/storage/sqlite/commit.js.map +1 -0
- package/dist/storage/sqlite/rows.d.ts +33 -0
- package/dist/storage/sqlite/rows.d.ts.map +1 -0
- package/dist/storage/sqlite/rows.js +53 -0
- package/dist/storage/sqlite/rows.js.map +1 -0
- package/dist/storage/sqlite/statements.d.ts +13 -0
- package/dist/storage/sqlite/statements.d.ts.map +1 -0
- package/dist/storage/sqlite/statements.js +88 -0
- package/dist/storage/sqlite/statements.js.map +1 -0
- package/dist/storage/sqlite/storage.d.ts +12 -11
- package/dist/storage/sqlite/storage.d.ts.map +1 -1
- package/dist/storage/sqlite/storage.js +44 -259
- package/dist/storage/sqlite/storage.js.map +1 -1
- package/dist/storage/store/commit.d.ts +2 -2
- package/dist/storage/store/commit.d.ts.map +1 -1
- package/dist/storage/store/commit.js +1 -1
- package/dist/storage/store/commit.js.map +1 -1
- package/dist/storage/store/documents.d.ts +1 -1
- package/dist/storage/store/documents.d.ts.map +1 -1
- package/dist/storage/store/documents.js +1 -1
- package/dist/storage/store/documents.js.map +1 -1
- package/dist/storage/store/queries.d.ts +2 -2
- package/dist/storage/store/queries.d.ts.map +1 -1
- package/dist/storage/store/queries.js.map +1 -1
- package/dist/storage/store/storage.d.ts +3 -2
- package/dist/storage/store/storage.d.ts.map +1 -1
- package/dist/storage/store/storage.js +1 -1
- package/dist/storage/store/storage.js.map +1 -1
- package/dist/storage/store/tables.d.ts +31 -31
- package/dist/storage/store/tables.d.ts.map +1 -1
- package/dist/storage/store/tables.js +1 -1
- package/dist/storage/store/tables.js.map +1 -1
- package/dist/testing/commit-writes.d.ts +1 -1
- package/dist/testing/commit-writes.d.ts.map +1 -1
- package/dist/testing/commit-writes.js.map +1 -1
- package/dist/testing/env-conformance.js.map +1 -1
- package/dist/testing/storage-benchmark.js.map +1 -1
- package/dist/testing/storage-conformance.js.map +1 -1
- package/dist/tool-search/tool-search.d.ts +2 -2
- package/dist/tool-search/tool-search.d.ts.map +1 -1
- package/dist/tool-search/tool-search.js +18 -6
- package/dist/tool-search/tool-search.js.map +1 -1
- package/dist/tools/bash.d.ts +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/file-mutation-queue.d.ts +1 -1
- package/dist/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/tools/file-mutation-queue.js.map +1 -1
- package/dist/tools/path-utils.d.ts +1 -1
- package/dist/tools/path-utils.d.ts.map +1 -1
- package/dist/tools/path-utils.js.map +1 -1
- package/dist/tools/read.js.map +1 -1
- package/dist/types.d.ts +6 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -6
|
@@ -4,6 +4,8 @@ import { MemoryStorage } from "../memory.js";
|
|
|
4
4
|
const FORMAT_VERSION = 1;
|
|
5
5
|
const MAIN_FILE = "main.jsonl";
|
|
6
6
|
const RECLAIM_SUFFIX = ".reclaim";
|
|
7
|
+
/** Read-only opens retried after racing a writer's commits; each retry means another commit landed meanwhile. */
|
|
8
|
+
const READ_ONLY_OPEN_ATTEMPTS = 5;
|
|
7
9
|
const textDecoder = new TextDecoder("utf-8", { fatal: true });
|
|
8
10
|
export class JsonlCorruptionError extends Error {
|
|
9
11
|
constructor(message, cause) {
|
|
@@ -11,6 +13,13 @@ export class JsonlCorruptionError extends Error {
|
|
|
11
13
|
this.name = "JsonlCorruptionError";
|
|
12
14
|
}
|
|
13
15
|
}
|
|
16
|
+
/** `commit()` on a storage opened with `readOnly: true`. Nothing was written. */
|
|
17
|
+
export class JsonlStorageReadOnlyError extends Error {
|
|
18
|
+
constructor() {
|
|
19
|
+
super("JSONL storage is open read-only");
|
|
20
|
+
this.name = "JsonlStorageReadOnlyError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
14
23
|
export class JsonlStoragePoisonedError extends Error {
|
|
15
24
|
constructor(cause) {
|
|
16
25
|
super("JSONL storage is poisoned and must be reopened", { cause });
|
|
@@ -147,10 +156,13 @@ export class JsonlStorage {
|
|
|
147
156
|
directory;
|
|
148
157
|
mainPath;
|
|
149
158
|
fsync;
|
|
159
|
+
readOnly;
|
|
150
160
|
memory = new MemoryStorage();
|
|
151
161
|
currentOnlyDocuments = new Set();
|
|
152
162
|
liveTaskSidecars = new Set();
|
|
153
163
|
closed = false;
|
|
164
|
+
/** Bytes of `main.jsonl` recovery read (`mainChanged()`). */
|
|
165
|
+
mainSize = 0;
|
|
154
166
|
poisonError;
|
|
155
167
|
/** Settles once the batch being appended is; its batches are in memory already (`commit()`). */
|
|
156
168
|
writing;
|
|
@@ -159,21 +171,39 @@ export class JsonlStorage {
|
|
|
159
171
|
this.directory = directory;
|
|
160
172
|
this.mainPath = mainPath;
|
|
161
173
|
this.fsync = options.fsync ?? false;
|
|
174
|
+
this.readOnly = options.readOnly ?? false;
|
|
162
175
|
}
|
|
163
|
-
/**
|
|
176
|
+
/**
|
|
177
|
+
* Open or create a JSONL storage directory using the supplied filesystem. With `readOnly`, open an existing one
|
|
178
|
+
* without writing; a recovery that fails while `main.jsonl` changes raced a writer's commit and is retried.
|
|
179
|
+
*/
|
|
164
180
|
static async open(directory, fs, context, options = {}) {
|
|
165
181
|
const absolute = await fs.absolutePath(directory, context);
|
|
166
182
|
if (!absolute.ok)
|
|
167
183
|
throw errorFromFile("path resolution", absolute.error);
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
184
|
+
if (options.readOnly !== true) {
|
|
185
|
+
const created = await fs.createDir(absolute.value, { recursive: true }, context);
|
|
186
|
+
if (!created.ok)
|
|
187
|
+
throw errorFromFile("directory creation", created.error);
|
|
188
|
+
}
|
|
171
189
|
const mainPathResult = await fs.joinPath([absolute.value, MAIN_FILE], context);
|
|
172
190
|
if (!mainPathResult.ok)
|
|
173
191
|
throw errorFromFile("path join", mainPathResult.error);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
192
|
+
for (let attempt = 1;; attempt++) {
|
|
193
|
+
const storage = new JsonlStorage(fs, absolute.value, mainPathResult.value, options);
|
|
194
|
+
try {
|
|
195
|
+
await storage.recover(context);
|
|
196
|
+
return storage;
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
if (!storage.readOnly ||
|
|
200
|
+
attempt === READ_ONLY_OPEN_ATTEMPTS ||
|
|
201
|
+
!(error instanceof JsonlCorruptionError) ||
|
|
202
|
+
!(await storage.mainChanged(context))) {
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
177
207
|
}
|
|
178
208
|
/**
|
|
179
209
|
* Commit `batches` with one append per affected file: every batch's sidecar records first, then their markers in one
|
|
@@ -183,6 +213,8 @@ export class JsonlStorage {
|
|
|
183
213
|
*/
|
|
184
214
|
async commit(batches, receive, context) {
|
|
185
215
|
this.assertUsable();
|
|
216
|
+
if (this.readOnly)
|
|
217
|
+
throw new JsonlStorageReadOnlyError();
|
|
186
218
|
const seqs = [];
|
|
187
219
|
const encoded = [];
|
|
188
220
|
const reclamations = new Map();
|
|
@@ -470,11 +502,17 @@ export class JsonlStorage {
|
|
|
470
502
|
}
|
|
471
503
|
await this.fs.renameFile(temporaryPath.value, path.value, context);
|
|
472
504
|
}
|
|
505
|
+
/**
|
|
506
|
+
* Load the confirmed state. A writable open also repairs the files: it truncates torn lines and unconfirmed sidecar
|
|
507
|
+
* tails, removes leftover reclaim files, and reclaims sidecar records later commits made unnecessary. A read-only
|
|
508
|
+
* open skips the same records in memory only.
|
|
509
|
+
*/
|
|
473
510
|
async recover(context) {
|
|
474
511
|
const fs = this.fs;
|
|
475
512
|
const directory = this.directory;
|
|
476
513
|
const memory = this.memory;
|
|
477
|
-
const main = await
|
|
514
|
+
const main = await this.readLines(this.mainPath, MAIN_FILE, context, (text, line) => parseMainMarker(text, line));
|
|
515
|
+
this.mainSize = main.size;
|
|
478
516
|
let previousSeq = 0;
|
|
479
517
|
for (const marker of main.lines) {
|
|
480
518
|
if (marker.value.seq <= previousSeq) {
|
|
@@ -486,7 +524,7 @@ export class JsonlStorage {
|
|
|
486
524
|
if (!listed.ok)
|
|
487
525
|
throw errorFromFile("directory listing", listed.error);
|
|
488
526
|
for (const info of listed.value) {
|
|
489
|
-
if (info.kind === "file" && isReclaimFileName(info.name)) {
|
|
527
|
+
if (!this.readOnly && info.kind === "file" && isReclaimFileName(info.name)) {
|
|
490
528
|
await fs.remove(info.path, { force: true }, context);
|
|
491
529
|
}
|
|
492
530
|
}
|
|
@@ -500,7 +538,7 @@ export class JsonlStorage {
|
|
|
500
538
|
const pathResult = await fs.joinPath([directory, file], context);
|
|
501
539
|
if (!pathResult.ok)
|
|
502
540
|
throw errorFromFile("path join", pathResult.error);
|
|
503
|
-
const parsed = await
|
|
541
|
+
const parsed = await this.readLines(pathResult.value, file, context, (text, line) => parseSidecarRecord(text, file, line));
|
|
504
542
|
parsedFiles.set(file, parsed);
|
|
505
543
|
let previous;
|
|
506
544
|
for (const line of parsed.lines) {
|
|
@@ -636,7 +674,7 @@ export class JsonlStorage {
|
|
|
636
674
|
unconfirmedAt = line.start;
|
|
637
675
|
}
|
|
638
676
|
}
|
|
639
|
-
if (unconfirmedAt !== undefined) {
|
|
677
|
+
if (unconfirmedAt !== undefined && !this.readOnly) {
|
|
640
678
|
const truncated = await fs.truncateFile(parsed.path, unconfirmedAt, context);
|
|
641
679
|
if (!truncated.ok)
|
|
642
680
|
throw errorFromFile(`tail truncation of ${file}`, truncated.error);
|
|
@@ -661,7 +699,8 @@ export class JsonlStorage {
|
|
|
661
699
|
reclamations.set(file, retainedLines.map((line) => jsonLine(line.value)).join(""));
|
|
662
700
|
}
|
|
663
701
|
}
|
|
664
|
-
|
|
702
|
+
if (!this.readOnly)
|
|
703
|
+
await this.reclaimSidecars(reclamations, context);
|
|
665
704
|
for (const id of currentOnlyDocuments)
|
|
666
705
|
this.currentOnlyDocuments.add(id);
|
|
667
706
|
for (const [id, live] of finalTaskIsLive) {
|
|
@@ -682,20 +721,23 @@ export class JsonlStorage {
|
|
|
682
721
|
confirmed.add(key);
|
|
683
722
|
return line.value;
|
|
684
723
|
}
|
|
685
|
-
|
|
686
|
-
|
|
724
|
+
/** Parse the complete lines of `path`; a torn final line is truncated, or only skipped when read-only. */
|
|
725
|
+
async readLines(path, name, context, parse) {
|
|
726
|
+
const read = await this.fs.readBinaryFile(path, context);
|
|
687
727
|
if (!read.ok) {
|
|
688
728
|
if (read.error.code === "not_found")
|
|
689
|
-
return { path, lines: [] };
|
|
729
|
+
return { path, lines: [], size: 0 };
|
|
690
730
|
throw errorFromFile(`read of ${name}`, read.error);
|
|
691
731
|
}
|
|
692
732
|
const bytes = read.value;
|
|
693
733
|
let completeSize = bytes.length;
|
|
694
734
|
if (completeSize > 0 && bytes[completeSize - 1] !== 0x0a) {
|
|
695
735
|
completeSize = bytes.lastIndexOf(0x0a) + 1;
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
736
|
+
if (!this.readOnly) {
|
|
737
|
+
const truncated = await this.fs.truncateFile(path, completeSize, context);
|
|
738
|
+
if (!truncated.ok)
|
|
739
|
+
throw errorFromFile(`torn-line truncation of ${name}`, truncated.error);
|
|
740
|
+
}
|
|
699
741
|
}
|
|
700
742
|
const lines = [];
|
|
701
743
|
let start = 0;
|
|
@@ -714,7 +756,16 @@ export class JsonlStorage {
|
|
|
714
756
|
start = end + 1;
|
|
715
757
|
lineNumber++;
|
|
716
758
|
}
|
|
717
|
-
return { path, lines };
|
|
759
|
+
return { path, lines, size: bytes.length };
|
|
760
|
+
}
|
|
761
|
+
/**
|
|
762
|
+
* Whether `main.jsonl` changed size since recovery read it. A writer reclaims a sidecar only after appending the
|
|
763
|
+
* marker that allows it, so sidecars read while `main.jsonl` stayed the same match its markers; a recovery that
|
|
764
|
+
* failed while it changed may have read a sidecar a newer commit reclaimed.
|
|
765
|
+
*/
|
|
766
|
+
async mainChanged(context) {
|
|
767
|
+
const info = await this.fs.fileInfo(this.mainPath, context);
|
|
768
|
+
return info.ok && info.value.size !== this.mainSize;
|
|
718
769
|
}
|
|
719
770
|
async resolveFile(file, context) {
|
|
720
771
|
const path = await this.fs.joinPath([this.directory, file], context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage/jsonl/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, JsonValue } from \"@earendil-works/chord\";\nimport type { FileError, FileSystem } from \"../../env/index.ts\";\nimport { StorageRequestError } from \"../../errors.ts\";\nimport { idFromNumber, seqFromNumber } from \"../../ids.ts\";\nimport type {\n\tCommitResult,\n\tConversationId,\n\tConversationQuery,\n\tCursor,\n\tDocumentAddress,\n\tDocumentContent,\n\tDocumentCreate,\n\tDocumentId,\n\tDocumentPoint,\n\tDocumentQuery,\n\tEntryId,\n\tEntryQuery,\n\tId,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tSubmissionId,\n\tSubmissionQuery,\n\tTaskId,\n\tTaskQuery,\n\tTaskRecord,\n} from \"../../types.ts\";\nimport { MemoryStorage } from \"../memory.ts\";\n\nconst FORMAT_VERSION = 1;\nconst MAIN_FILE = \"main.jsonl\";\nconst RECLAIM_SUFFIX = \".reclaim\";\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true });\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\ntype MainOperation =\n\t| Extract<StorageWrite, { readonly type: \"conversation\" | \"entry\" | \"submission\" | \"document.retire\" }>\n\t| { readonly type: \"task\"; readonly value: StoredTask }\n\t| { readonly type: \"task.sidecar\"; readonly id: TaskId; readonly ordinal: number }\n\t| { readonly type: \"document.create\"; readonly record: DocumentCreate; readonly ordinal: number }\n\t| { readonly type: \"document.change\"; readonly id: DocumentId; readonly ordinal: number };\n\ntype MainMarker = {\n\treadonly format: typeof FORMAT_VERSION;\n\treadonly type: \"commit\";\n\treadonly seq: Seq;\n\treadonly writes: readonly MainOperation[];\n};\n\ntype SidecarPayload =\n\t| { readonly type: \"task\"; readonly value: StoredTask }\n\t| { readonly type: \"document\"; readonly id: DocumentId; readonly content: DocumentContent };\n\ntype SidecarRecord = {\n\treadonly format: typeof FORMAT_VERSION;\n\treadonly type: \"record\";\n\treadonly seq: Seq;\n\treadonly ordinal: number;\n\treadonly payload: SidecarPayload;\n};\n\ntype ParsedLine<T> = {\n\treadonly value: T;\n\treadonly start: number;\n};\n\ntype ParsedFile<T> = {\n\treadonly path: string;\n\treadonly lines: readonly ParsedLine<T>[];\n};\n\ntype EncodedCommit = {\n\treadonly marker: string;\n\treadonly sidecars: ReadonlyMap<string, string>;\n};\n\nexport type JsonlStorageOptions = {\n\t/** Flush every affected sidecar before appending the main marker. Defaults to false. */\n\treadonly fsync?: boolean;\n};\n\nexport class JsonlCorruptionError extends Error {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"JsonlCorruptionError\";\n\t}\n}\n\nexport class JsonlStoragePoisonedError extends Error {\n\tconstructor(cause: Error) {\n\t\tsuper(\"JSONL storage is poisoned and must be reopened\", { cause });\n\t\tthis.name = \"JsonlStoragePoisonedError\";\n\t}\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n\tvalue !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst isSafeInteger = (value: unknown): value is number => Number.isSafeInteger(value);\n\nconst sidecarFileName = (kind: \"doc\" | \"task\", id: DocumentId | TaskId): string => `${kind}-${id}.jsonl`;\n\nconst isSidecarFileName = (name: string): boolean => /^(?:doc|task)-(?:0|[1-9]\\d*)\\.jsonl$/.test(name);\n\nconst isReclaimFileName = (name: string): boolean => /^(?:doc|task)-(?:0|[1-9]\\d*)\\.jsonl\\.reclaim$/.test(name);\n\nconst isCurrentOnly = (record: DocumentCreate): boolean =>\n\trecord.scope.kind !== \"conversation\" || record.history === \"latest\";\n\nconst sidecarKey = (file: string, seq: Seq, ordinal: number): string => JSON.stringify([file, seq, ordinal]);\n\nconst jsonLine = (value: MainMarker | SidecarRecord): string => `${JSON.stringify(value)}\\n`;\n\nconst errorFromFile = (action: string, error: FileError): Error =>\n\tnew Error(`JSONL ${action} failed: ${error.message}`, { cause: error });\n\nconst parseJson = (text: string, description: string): unknown => {\n\ttry {\n\t\treturn JSON.parse(text) as unknown;\n\t} catch (error) {\n\t\tthrow new JsonlCorruptionError(`Malformed complete ${description}`, error instanceof Error ? error : undefined);\n\t}\n};\n\nconst validateMainOperation = (value: unknown, description: string): MainOperation => {\n\tif (!isObject(value) || typeof value.type !== \"string\") {\n\t\tthrow new JsonlCorruptionError(`Invalid write in ${description}`);\n\t}\n\tswitch (value.type) {\n\t\tcase \"conversation\":\n\t\tcase \"entry\":\n\t\tcase \"submission\":\n\t\t\tif (!isObject(value.value) || !isSafeInteger(value.value.id)) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid ${value.type} write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"task\":\n\t\t\tif (\n\t\t\t\t!isObject(value.value) ||\n\t\t\t\t!isSafeInteger(value.value.id) ||\n\t\t\t\t!isObject(value.value.state) ||\n\t\t\t\tvalue.value.state.status !== \"terminal\"\n\t\t\t) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid terminal task write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.retire\":\n\t\t\tif (!isSafeInteger(value.id)) throw new JsonlCorruptionError(`Invalid document retirement in ${description}`);\n\t\t\treturn value as MainOperation;\n\t\tcase \"task.sidecar\":\n\t\t\tif (!isSafeInteger(value.id) || !isSafeInteger(value.ordinal) || value.ordinal < 0) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid task sidecar write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.create\":\n\t\t\tif (\n\t\t\t\t!isObject(value.record) ||\n\t\t\t\t!isSafeInteger(value.record.id) ||\n\t\t\t\t!isSafeInteger(value.ordinal) ||\n\t\t\t\tvalue.ordinal < 0\n\t\t\t) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid document creation in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.change\":\n\t\t\tif (!isSafeInteger(value.id) || !isSafeInteger(value.ordinal) || value.ordinal < 0) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid document change in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tdefault:\n\t\t\tthrow new JsonlCorruptionError(`Unknown write type in ${description}`);\n\t}\n};\n\nconst parseMainMarker = (text: string, line: number): MainMarker => {\n\tconst description = `${MAIN_FILE} line ${line}`;\n\tconst value = parseJson(text, description);\n\tif (\n\t\t!isObject(value) ||\n\t\tvalue.format !== FORMAT_VERSION ||\n\t\tvalue.type !== \"commit\" ||\n\t\t!isSafeInteger(value.seq) ||\n\t\tvalue.seq < 1 ||\n\t\t!Array.isArray(value.writes)\n\t) {\n\t\tthrow new JsonlCorruptionError(`Invalid commit marker in ${description}`);\n\t}\n\treturn {\n\t\tformat: FORMAT_VERSION,\n\t\ttype: \"commit\",\n\t\tseq: seqFromNumber(value.seq),\n\t\twrites: value.writes.map((write) => validateMainOperation(write, description)),\n\t};\n};\n\nconst validateDocumentContent = (value: unknown, description: string): DocumentContent => {\n\tif (!isObject(value) || !isSafeInteger(value.version) || value.version < 1) {\n\t\tthrow new JsonlCorruptionError(`Invalid document content in ${description}`);\n\t}\n\tif (value.kind === \"base\" && isObject(value.value)) return value as DocumentContent;\n\tif (value.kind === \"delta\" && Array.isArray(value.ops)) return value as DocumentContent;\n\tthrow new JsonlCorruptionError(`Invalid document content in ${description}`);\n};\n\nconst parseSidecarRecord = (text: string, file: string, line: number): SidecarRecord => {\n\tconst description = `${file} line ${line}`;\n\tconst value = parseJson(text, description);\n\tif (\n\t\t!isObject(value) ||\n\t\tvalue.format !== FORMAT_VERSION ||\n\t\tvalue.type !== \"record\" ||\n\t\t!isSafeInteger(value.seq) ||\n\t\tvalue.seq < 1 ||\n\t\t!isSafeInteger(value.ordinal) ||\n\t\tvalue.ordinal < 0 ||\n\t\t!isObject(value.payload) ||\n\t\ttypeof value.payload.type !== \"string\"\n\t) {\n\t\tthrow new JsonlCorruptionError(`Invalid sidecar record in ${description}`);\n\t}\n\tif (value.payload.type === \"task\") {\n\t\tif (\n\t\t\t!isObject(value.payload.value) ||\n\t\t\t!isSafeInteger(value.payload.value.id) ||\n\t\t\t!isObject(value.payload.value.state) ||\n\t\t\tvalue.payload.value.state.status === \"terminal\"\n\t\t) {\n\t\t\tthrow new JsonlCorruptionError(`Invalid live task record in ${description}`);\n\t\t}\n\t} else if (value.payload.type === \"document\") {\n\t\tif (!isSafeInteger(value.payload.id)) {\n\t\t\tthrow new JsonlCorruptionError(`Invalid document record in ${description}`);\n\t\t}\n\t\tvalidateDocumentContent(value.payload.content, description);\n\t} else {\n\t\tthrow new JsonlCorruptionError(`Unknown sidecar record type in ${description}`);\n\t}\n\treturn value as SidecarRecord;\n};\n\n/** Portable JSONL implementation of the storage contract. */\nexport class JsonlStorage implements Storage {\n\tprivate readonly fs: FileSystem;\n\tprivate readonly directory: string;\n\tprivate readonly mainPath: string;\n\tprivate readonly fsync: boolean;\n\tprivate readonly memory = new MemoryStorage();\n\tprivate readonly currentOnlyDocuments = new Set<DocumentId>();\n\tprivate readonly liveTaskSidecars = new Set<TaskId>();\n\tprivate closed = false;\n\tprivate poisonError: JsonlStoragePoisonedError | undefined;\n\t/** Settles once the batch being appended is; its batches are in memory already (`commit()`). */\n\tprivate writing: Promise<void> | undefined;\n\n\tprivate constructor(fs: FileSystem, directory: string, mainPath: string, options: JsonlStorageOptions) {\n\t\tthis.fs = fs;\n\t\tthis.directory = directory;\n\t\tthis.mainPath = mainPath;\n\t\tthis.fsync = options.fsync ?? false;\n\t}\n\n\t/** Open or create a JSONL storage directory using the supplied filesystem. */\n\tstatic async open(\n\t\tdirectory: string,\n\t\tfs: FileSystem,\n\t\tcontext: Context,\n\t\toptions: JsonlStorageOptions = {},\n\t): Promise<JsonlStorage> {\n\t\tconst absolute = await fs.absolutePath(directory, context);\n\t\tif (!absolute.ok) throw errorFromFile(\"path resolution\", absolute.error);\n\t\tconst created = await fs.createDir(absolute.value, { recursive: true }, context);\n\t\tif (!created.ok) throw errorFromFile(\"directory creation\", created.error);\n\t\tconst mainPathResult = await fs.joinPath([absolute.value, MAIN_FILE], context);\n\t\tif (!mainPathResult.ok) throw errorFromFile(\"path join\", mainPathResult.error);\n\t\tconst storage = new JsonlStorage(fs, absolute.value, mainPathResult.value, options);\n\t\tawait storage.recover(context);\n\t\treturn storage;\n\t}\n\n\t/**\n\t * Commit `batches` with one append per affected file: every batch's sidecar records first, then their markers in one\n\t * write of `main.jsonl`. Each batch is checked against the state the earlier ones left, so memory applies each one\n\t * as it passes, and reads wait until the appends are done; the first batch refused ends the batch. A torn append of\n\t * the markers recovers a shorter complete prefix; any failure once a batch applied poisons the storage.\n\t */\n\tasync commit(\n\t\tbatches: readonly (readonly StorageWrite[])[],\n\t\treceive: (index: number, seq: Seq) => void,\n\t\tcontext: Context,\n\t): Promise<CommitResult> {\n\t\tthis.assertUsable();\n\t\tconst seqs: Seq[] = [];\n\t\tconst encoded: EncodedCommit[] = [];\n\t\tconst reclamations = new Map<string, string>();\n\t\tlet refused: { readonly error: unknown } | undefined;\n\t\tconst writing = Promise.withResolvers<void>();\n\t\tthis.writing = writing.promise;\n\t\ttry {\n\t\t\tfor (const writes of batches) {\n\t\t\t\tlet prepared: ReturnType<MemoryStorage[\"prepareCommit\"]>;\n\t\t\t\ttry {\n\t\t\t\t\tprepared = this.memory.prepareCommit(writes);\n\t\t\t\t} catch (error) {\n\t\t\t\t\trefused = { error };\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst commit = this.encodeCommit(prepared.seq, prepared.writes);\n\t\t\t\t// A sidecar an earlier batch replaces keeps what the later ones append, unless they replace it again.\n\t\t\t\tfor (const [file, content] of commit.sidecars) {\n\t\t\t\t\tconst replacement = reclamations.get(file);\n\t\t\t\t\tif (replacement !== undefined) reclamations.set(file, replacement + content);\n\t\t\t\t}\n\t\t\t\tfor (const [file, content] of this.planReclamations(prepared.writes, commit))\n\t\t\t\t\treclamations.set(file, content);\n\t\t\t\tseqs.push(prepared.apply());\n\t\t\t\tthis.adoptSidecarState(prepared.writes);\n\t\t\t\tencoded.push(commit);\n\t\t\t}\n\t\t\tif (encoded.length > 0) await this.append(encoded, context);\n\t\t} catch (error) {\n\t\t\t// Memory runs ahead of the file: once a batch applied, any failure poisons the storage before the reads\n\t\t\t// waiting on the append go on, so none of them returns what is not stored.\n\t\t\tif (seqs.length === 0) throw error;\n\t\t\tthrow this.poison(error instanceof Error ? error : new Error(\"JSONL commit failed\", { cause: error }));\n\t\t} finally {\n\t\t\tthis.writing = undefined;\n\t\t\twriting.resolve();\n\t\t}\n\t\t// The markers are appended: the batches are durable. Reclaiming sidecars comes after the receipts.\n\t\tfor (const [index, seq] of seqs.entries()) receive(index, seq);\n\t\tawait this.reclaimSidecars(reclamations, context);\n\t\treturn refused === undefined ? { stored: seqs.length } : { stored: seqs.length, refused: refused.error };\n\t}\n\n\t/** Append the sidecar records of `commits`, flushed with `fsync`, then their markers in one write of `main.jsonl`. */\n\tprivate async append(commits: readonly EncodedCommit[], context: Context): Promise<void> {\n\t\tconst contents = new Map<string, string>();\n\t\tfor (const commit of commits) {\n\t\t\tfor (const [file, content] of commit.sidecars) contents.set(file, (contents.get(file) ?? \"\") + content);\n\t\t}\n\t\tconst sidecars = await Promise.all(\n\t\t\t[...contents].map(async ([file, content]) => ({\n\t\t\t\tfile,\n\t\t\t\tcontent,\n\t\t\t\tpath: await this.resolveFile(file, context),\n\t\t\t})),\n\t\t);\n\t\tfor (const sidecar of sidecars) {\n\t\t\tconst result = await this.fs.appendFile(sidecar.path, sidecar.content, context);\n\t\t\tif (!result.ok) throw this.poison(errorFromFile(`append to ${sidecar.file}`, result.error));\n\t\t}\n\t\tif (this.fsync) {\n\t\t\tfor (const sidecar of sidecars) {\n\t\t\t\tconst result = await this.fs.flushFile(sidecar.path, context);\n\t\t\t\tif (!result.ok) throw this.poison(errorFromFile(`flush of ${sidecar.file}`, result.error));\n\t\t\t}\n\t\t}\n\t\tconst markers = commits.length === 1 ? commits[0]!.marker : commits.map((commit) => commit.marker).join(\"\");\n\t\tconst marker = await this.fs.appendFile(this.mainPath, markers, context);\n\t\tif (!marker.ok) throw this.poison(errorFromFile(`append to ${MAIN_FILE}`, marker.error));\n\t}\n\n\tasync mintId<I extends Id<string>>(): Promise<I> {\n\t\treturn this.store.mintId<I>();\n\t}\n\n\tasync conversation(id: ConversationId, context: Context) {\n\t\treturn (await this.readable()).conversation(id, context);\n\t}\n\n\tasync scanConversations(query: ConversationQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanConversations(query, limit, cursor, context);\n\t}\n\n\tentry(id: EntryId, context: Context): ReturnType<Storage[\"entry\"]>;\n\tentry(conversationId: ConversationId, id: EntryId, context: Context): ReturnType<Storage[\"entry\"]>;\n\tasync entry(idOrConversationId: EntryId | ConversationId, idOrContext: EntryId | Context, context?: Context) {\n\t\tif (context === undefined)\n\t\t\treturn (await this.readable()).entry(idFromNumber<EntryId>(idOrConversationId), idOrContext as Context);\n\t\tif (typeof idOrContext !== \"number\") throw new StorageRequestError(\"Storage.entry() requires an entry ID\");\n\t\treturn (await this.readable()).entry(\n\t\t\tidFromNumber<ConversationId>(idOrConversationId),\n\t\t\tidFromNumber<EntryId>(idOrContext),\n\t\t\tcontext,\n\t\t);\n\t}\n\n\tasync findLatestHeadMarker(\n\t\tconversationId: ConversationId,\n\t\tatOrBeforeEntryId: EntryId | undefined,\n\t\tcontext: Context,\n\t) {\n\t\treturn (await this.readable()).findLatestHeadMarker(conversationId, atOrBeforeEntryId, context);\n\t}\n\n\tasync scanEntries(query: EntryQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanEntries(query, limit, cursor, context);\n\t}\n\n\tasync task(id: TaskId, context: Context) {\n\t\treturn (await this.readable()).task(id, context);\n\t}\n\n\tasync scanTasks(query: TaskQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanTasks(query, limit, cursor, context);\n\t}\n\n\tasync submission(id: SubmissionId, context: Context) {\n\t\treturn (await this.readable()).submission(id, context);\n\t}\n\n\tasync scanSubmissions(query: SubmissionQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanSubmissions(query, limit, cursor, context);\n\t}\n\n\tasync submissionByRequest(conversationId: ConversationId, requestId: string, context: Context) {\n\t\treturn (await this.readable()).submissionByRequest(conversationId, requestId, context);\n\t}\n\n\tasync findDocument(address: DocumentAddress, at: DocumentPoint, context: Context) {\n\t\treturn (await this.readable()).findDocument(address, at, context);\n\t}\n\n\tasync document(id: DocumentId, at: DocumentPoint, context: Context) {\n\t\treturn (await this.readable()).document(id, at, context);\n\t}\n\n\tasync scanDocuments(query: DocumentQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanDocuments(query, limit, cursor, context);\n\t}\n\n\tasync close(context: Context): Promise<void> {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tawait this.memory.close(context);\n\t}\n\n\tprivate encodeCommit(seq: Seq, writes: readonly StorageWrite[]): EncodedCommit {\n\t\tconst mainWrites: MainOperation[] = [];\n\t\tconst records = new Map<string, SidecarRecord[]>();\n\t\tlet nextOrdinal = 0;\n\t\tconst addSidecar = (file: string, payload: SidecarPayload): number => {\n\t\t\tconst ordinal = nextOrdinal++;\n\t\t\tlet fileRecords = records.get(file);\n\t\t\tif (fileRecords === undefined) {\n\t\t\t\tfileRecords = [];\n\t\t\t\trecords.set(file, fileRecords);\n\t\t\t}\n\t\t\tfileRecords.push({ format: FORMAT_VERSION, type: \"record\", seq, ordinal, payload });\n\t\t\treturn ordinal;\n\t\t};\n\n\t\tfor (const write of writes) {\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"conversation\":\n\t\t\t\tcase \"entry\":\n\t\t\t\tcase \"submission\":\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tmainWrites.push(write);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"task\":\n\t\t\t\t\tif (write.value.state.status === \"terminal\") mainWrites.push(write);\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"task\", write.value.id), {\n\t\t\t\t\t\t\ttype: \"task\",\n\t\t\t\t\t\t\tvalue: write.value,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tmainWrites.push({ type: \"task.sidecar\", id: write.value.id, ordinal });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.create\": {\n\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"doc\", write.record.id), {\n\t\t\t\t\t\ttype: \"document\",\n\t\t\t\t\t\tid: write.record.id,\n\t\t\t\t\t\tcontent: write.content,\n\t\t\t\t\t});\n\t\t\t\t\tmainWrites.push({ type: \"document.create\", record: write.record, ordinal });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"document.change\": {\n\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"doc\", write.id), {\n\t\t\t\t\t\ttype: \"document\",\n\t\t\t\t\t\tid: write.id,\n\t\t\t\t\t\tcontent: write.content,\n\t\t\t\t\t});\n\t\t\t\t\tmainWrites.push({ type: \"document.change\", id: write.id, ordinal });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst sidecars = new Map<string, string>();\n\t\tfor (const [file, fileRecords] of records) {\n\t\t\tsidecars.set(file, fileRecords.map((record) => jsonLine(record)).join(\"\"));\n\t\t}\n\t\tconst marker: MainMarker = {\n\t\t\tformat: FORMAT_VERSION,\n\t\t\ttype: \"commit\",\n\t\t\tseq,\n\t\t\twrites: mainWrites,\n\t\t};\n\t\treturn { marker: jsonLine(marker), sidecars };\n\t}\n\n\tprivate planReclamations(writes: readonly StorageWrite[], encoded: EncodedCommit): ReadonlyMap<string, string> {\n\t\tconst createdCurrentOnlyDocuments = new Set<DocumentId>();\n\t\tconst retiredDocuments = new Set<DocumentId>();\n\t\tconst baseDocuments = new Set<DocumentId>();\n\t\tconst finalTasks = new Map<TaskId, StoredTask>();\n\t\tfor (const write of writes) {\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"document.create\":\n\t\t\t\t\tif (isCurrentOnly(write.record)) createdCurrentOnlyDocuments.add(write.record.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.change\":\n\t\t\t\t\tif (write.content.kind === \"base\") baseDocuments.add(write.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tretiredDocuments.add(write.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"task\":\n\t\t\t\t\tfinalTasks.set(write.value.id, write.value);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst replacements = new Map<string, string>();\n\t\tconst isCurrentOnlyDocument = (id: DocumentId): boolean =>\n\t\t\tthis.currentOnlyDocuments.has(id) || createdCurrentOnlyDocuments.has(id);\n\t\tfor (const id of retiredDocuments) {\n\t\t\tif (isCurrentOnlyDocument(id)) replacements.set(sidecarFileName(\"doc\", id), \"\");\n\t\t}\n\t\tfor (const id of baseDocuments) {\n\t\t\tif (!isCurrentOnlyDocument(id) || retiredDocuments.has(id)) continue;\n\t\t\tconst file = sidecarFileName(\"doc\", id);\n\t\t\tconst content = encoded.sidecars.get(file);\n\t\t\tif (content !== undefined) replacements.set(file, content);\n\t\t}\n\t\tfor (const [id, task] of finalTasks) {\n\t\t\tif (\n\t\t\t\ttask.state.status === \"terminal\" &&\n\t\t\t\t(this.liveTaskSidecars.has(id) || encoded.sidecars.has(sidecarFileName(\"task\", id)))\n\t\t\t) {\n\t\t\t\treplacements.set(sidecarFileName(\"task\", id), \"\");\n\t\t\t}\n\t\t}\n\t\treturn replacements;\n\t}\n\n\tprivate adoptSidecarState(writes: readonly StorageWrite[]): void {\n\t\tfor (const write of writes) {\n\t\t\tif (write.type === \"document.create\") {\n\t\t\t\tif (isCurrentOnly(write.record)) this.currentOnlyDocuments.add(write.record.id);\n\t\t\t} else if (write.type === \"task\") {\n\t\t\t\tif (write.value.state.status === \"terminal\") this.liveTaskSidecars.delete(write.value.id);\n\t\t\t\telse this.liveTaskSidecars.add(write.value.id);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** The marker already published this state, so reclamation is retryable best-effort maintenance. */\n\tprivate async reclaimSidecars(replacements: ReadonlyMap<string, string>, context: Context): Promise<void> {\n\t\tif (replacements.size === 0) return;\n\t\tif (this.fsync) {\n\t\t\tconst flushed = await this.fs.flushFile(this.mainPath, context);\n\t\t\tif (!flushed.ok) return;\n\t\t}\n\t\tfor (const [file, content] of replacements) await this.replaceSidecar(file, content, context);\n\t}\n\n\tprivate async replaceSidecar(file: string, content: string, context: Context): Promise<void> {\n\t\tconst path = await this.fs.joinPath([this.directory, file], context);\n\t\tif (!path.ok) return;\n\t\tif (content === \"\") {\n\t\t\tawait this.fs.remove(path.value, { force: true }, context);\n\t\t\treturn;\n\t\t}\n\t\tconst temporaryPath = await this.fs.joinPath([this.directory, `${file}${RECLAIM_SUFFIX}`], context);\n\t\tif (!temporaryPath.ok) return;\n\t\tconst written = await this.fs.writeFile(temporaryPath.value, content, context);\n\t\tif (!written.ok) return;\n\t\tif (this.fsync) {\n\t\t\tconst flushed = await this.fs.flushFile(temporaryPath.value, context);\n\t\t\tif (!flushed.ok) return;\n\t\t}\n\t\tawait this.fs.renameFile(temporaryPath.value, path.value, context);\n\t}\n\n\tprivate async recover(context: Context): Promise<void> {\n\t\tconst fs = this.fs;\n\t\tconst directory = this.directory;\n\t\tconst memory = this.memory;\n\t\tconst main = await JsonlStorage.readLines(fs, this.mainPath, MAIN_FILE, context, (text, line) =>\n\t\t\tparseMainMarker(text, line),\n\t\t);\n\t\tlet previousSeq = 0;\n\t\tfor (const marker of main.lines) {\n\t\t\tif (marker.value.seq <= previousSeq) {\n\t\t\t\tthrow new JsonlCorruptionError(`Commit sequence does not strictly increase in ${MAIN_FILE}`);\n\t\t\t}\n\t\t\tpreviousSeq = marker.value.seq;\n\t\t}\n\n\t\tconst listed = await fs.listDir(directory, context);\n\t\tif (!listed.ok) throw errorFromFile(\"directory listing\", listed.error);\n\t\tfor (const info of listed.value) {\n\t\t\tif (info.kind === \"file\" && isReclaimFileName(info.name)) {\n\t\t\t\tawait fs.remove(info.path, { force: true }, context);\n\t\t\t}\n\t\t}\n\t\tconst sidecarFiles = listed.value\n\t\t\t.filter((info) => info.kind === \"file\" && isSidecarFileName(info.name))\n\t\t\t.map((info) => info.name)\n\t\t\t.sort();\n\t\tconst parsedFiles = new Map<string, ParsedFile<SidecarRecord>>();\n\t\tconst recordByKey = new Map<string, ParsedLine<SidecarRecord>>();\n\t\tfor (const file of sidecarFiles) {\n\t\t\tconst pathResult = await fs.joinPath([directory, file], context);\n\t\t\tif (!pathResult.ok) throw errorFromFile(\"path join\", pathResult.error);\n\t\t\tconst parsed = await JsonlStorage.readLines(fs, pathResult.value, file, context, (text, line) =>\n\t\t\t\tparseSidecarRecord(text, file, line),\n\t\t\t);\n\t\t\tparsedFiles.set(file, parsed);\n\t\t\tlet previous: SidecarRecord | undefined;\n\t\t\tfor (const line of parsed.lines) {\n\t\t\t\tif (\n\t\t\t\t\tprevious !== undefined &&\n\t\t\t\t\t(line.value.seq < previous.seq ||\n\t\t\t\t\t\t(line.value.seq === previous.seq && line.value.ordinal <= previous.ordinal))\n\t\t\t\t) {\n\t\t\t\t\tthrow new JsonlCorruptionError(`Sidecar records are out of order in ${file}`);\n\t\t\t\t}\n\t\t\t\tprevious = line.value;\n\t\t\t\trecordByKey.set(sidecarKey(file, line.value.seq, line.value.ordinal), line);\n\t\t\t}\n\t\t}\n\n\t\tconst currentOnlyDocuments = new Set<DocumentId>();\n\t\tconst retiredDocuments = new Set<DocumentId>();\n\t\tconst finalTaskIsLive = new Map<TaskId, boolean>();\n\t\tfor (const { value: marker } of main.lines) {\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tif (operation.type === \"document.create\") {\n\t\t\t\t\tif (isCurrentOnly(operation.record)) currentOnlyDocuments.add(operation.record.id);\n\t\t\t\t} else if (operation.type === \"document.retire\") {\n\t\t\t\t\tretiredDocuments.add(operation.id);\n\t\t\t\t} else if (operation.type === \"task\") {\n\t\t\t\t\tfinalTaskIsLive.set(operation.value.id, false);\n\t\t\t\t} else if (operation.type === \"task.sidecar\") {\n\t\t\t\t\tfinalTaskIsLive.set(operation.id, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst retiredCurrentOnlyDocuments = new Set([...retiredDocuments].filter((id) => currentOnlyDocuments.has(id)));\n\n\t\tconst latestBases = new Map<DocumentId, SidecarRecord>();\n\t\tfor (const { value: marker } of main.lines) {\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tif (operation.type !== \"document.create\" && operation.type !== \"document.change\") continue;\n\t\t\t\tconst id = operation.type === \"document.create\" ? operation.record.id : operation.id;\n\t\t\t\tif (!currentOnlyDocuments.has(id)) continue;\n\t\t\t\tconst record = recordByKey.get(\n\t\t\t\t\tsidecarKey(sidecarFileName(\"doc\", id), marker.seq, operation.ordinal),\n\t\t\t\t)?.value;\n\t\t\t\tif (\n\t\t\t\t\trecord?.payload.type !== \"document\" ||\n\t\t\t\t\trecord.payload.id !== id ||\n\t\t\t\t\trecord.payload.content.kind !== \"base\"\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previous = latestBases.get(id);\n\t\t\t\tif (\n\t\t\t\t\tprevious === undefined ||\n\t\t\t\t\trecord.seq > previous.seq ||\n\t\t\t\t\t(record.seq === previous.seq && record.ordinal > previous.ordinal)\n\t\t\t\t) {\n\t\t\t\t\tlatestBases.set(id, record);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst isBeforeLatestBase = (id: DocumentId, seq: Seq, ordinal: number): boolean => {\n\t\t\tconst base = latestBases.get(id);\n\t\t\treturn base !== undefined && (seq < base.seq || (seq === base.seq && ordinal < base.ordinal));\n\t\t};\n\t\tconst terminalTasks = new Set([...finalTaskIsLive].filter(([, live]) => !live).map(([id]) => id));\n\t\tconst confirmed = new Set<string>();\n\t\tfor (const line of main.lines) {\n\t\t\tconst marker = line.value;\n\t\t\tconst writes: StorageWrite[] = [];\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tswitch (operation.type) {\n\t\t\t\t\tcase \"conversation\":\n\t\t\t\t\tcase \"entry\":\n\t\t\t\t\tcase \"submission\":\n\t\t\t\t\tcase \"task\":\n\t\t\t\t\tcase \"document.retire\":\n\t\t\t\t\t\twrites.push(operation);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"task.sidecar\": {\n\t\t\t\t\t\tconst optional = terminalTasks.has(operation.id);\n\t\t\t\t\t\tconst record = JsonlStorage.confirmRecord(\n\t\t\t\t\t\t\tmarker,\n\t\t\t\t\t\t\toperation.ordinal,\n\t\t\t\t\t\t\tsidecarFileName(\"task\", operation.id),\n\t\t\t\t\t\t\trecordByKey,\n\t\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t\t\toptional,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (record !== undefined) {\n\t\t\t\t\t\t\tif (record.payload.type !== \"task\" || record.payload.value.id !== operation.id) {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Confirmed task sidecar data does not match commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!optional) writes.push({ type: \"task\", value: record.payload.value });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"document.create\":\n\t\t\t\t\tcase \"document.change\": {\n\t\t\t\t\t\tconst id = operation.type === \"document.create\" ? operation.record.id : operation.id;\n\t\t\t\t\t\tconst reclaimed =\n\t\t\t\t\t\t\tretiredCurrentOnlyDocuments.has(id) || isBeforeLatestBase(id, marker.seq, operation.ordinal);\n\t\t\t\t\t\tconst record = JsonlStorage.confirmRecord(\n\t\t\t\t\t\t\tmarker,\n\t\t\t\t\t\t\toperation.ordinal,\n\t\t\t\t\t\t\tsidecarFileName(\"doc\", id),\n\t\t\t\t\t\t\trecordByKey,\n\t\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t\t\treclaimed,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlet content: DocumentContent | undefined;\n\t\t\t\t\t\tif (record !== undefined) {\n\t\t\t\t\t\t\tif (record.payload.type !== \"document\" || record.payload.id !== id) {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Confirmed document sidecar data does not match commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontent = record.payload.content;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (operation.type === \"document.create\") {\n\t\t\t\t\t\t\tif (content !== undefined && content.kind !== \"base\") {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Document creation lacks a confirmed base in commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twrites.push({\n\t\t\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\t\t\trecord: operation.record,\n\t\t\t\t\t\t\t\tcontent: reclaimed || content === undefined ? { kind: \"base\", version: 1, value: {} } : content,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (!reclaimed && content !== undefined) {\n\t\t\t\t\t\t\twrites.push({ type: \"document.change\", id, content });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tmemory.prepareCommit(writes, marker.seq).apply();\n\t\t\t} catch (error) {\n\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t`Invalid committed state at sequence ${marker.seq}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst reclamations = new Map<string, string>();\n\t\tfor (const [file, parsed] of parsedFiles) {\n\t\t\tlet unconfirmedAt: number | undefined;\n\t\t\tfor (const line of parsed.lines) {\n\t\t\t\tconst key = sidecarKey(file, line.value.seq, line.value.ordinal);\n\t\t\t\tif (confirmed.has(key)) {\n\t\t\t\t\tif (unconfirmedAt !== undefined) {\n\t\t\t\t\t\tthrow new JsonlCorruptionError(`Confirmed record follows an unconfirmed tail in ${file}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (unconfirmedAt === undefined) {\n\t\t\t\t\tunconfirmedAt = line.start;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (unconfirmedAt !== undefined) {\n\t\t\t\tconst truncated = await fs.truncateFile(parsed.path, unconfirmedAt, context);\n\t\t\t\tif (!truncated.ok) throw errorFromFile(`tail truncation of ${file}`, truncated.error);\n\t\t\t}\n\n\t\t\tconst numericId = Number(file.slice(file.indexOf(\"-\") + 1, -\".jsonl\".length));\n\t\t\tconst confirmedLines = parsed.lines.filter((line) =>\n\t\t\t\tconfirmed.has(sidecarKey(file, line.value.seq, line.value.ordinal)),\n\t\t\t);\n\t\t\tlet retainedLines: readonly ParsedLine<SidecarRecord>[] | undefined;\n\t\t\tif (file.startsWith(\"task-\") && terminalTasks.has(idFromNumber<TaskId>(numericId))) {\n\t\t\t\tretainedLines = [];\n\t\t\t} else if (file.startsWith(\"doc-\")) {\n\t\t\t\tconst documentId = idFromNumber<DocumentId>(numericId);\n\t\t\t\tif (retiredCurrentOnlyDocuments.has(documentId)) {\n\t\t\t\t\tretainedLines = [];\n\t\t\t\t} else if (latestBases.has(documentId)) {\n\t\t\t\t\tretainedLines = confirmedLines.filter(\n\t\t\t\t\t\t(line) => !isBeforeLatestBase(documentId, line.value.seq, line.value.ordinal),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\tretainedLines !== undefined &&\n\t\t\t\t(retainedLines.length < confirmedLines.length || retainedLines.length === 0)\n\t\t\t) {\n\t\t\t\treclamations.set(file, retainedLines.map((line) => jsonLine(line.value)).join(\"\"));\n\t\t\t}\n\t\t}\n\t\tawait this.reclaimSidecars(reclamations, context);\n\n\t\tfor (const id of currentOnlyDocuments) this.currentOnlyDocuments.add(id);\n\t\tfor (const [id, live] of finalTaskIsLive) {\n\t\t\tif (live) this.liveTaskSidecars.add(id);\n\t\t}\n\t}\n\n\tprivate static confirmRecord(\n\t\tmarker: MainMarker,\n\t\tordinal: number,\n\t\tfile: string,\n\t\trecordByKey: ReadonlyMap<string, ParsedLine<SidecarRecord>>,\n\t\tconfirmed: Set<string>,\n\t\toptional: boolean,\n\t): SidecarRecord | undefined {\n\t\tconst key = sidecarKey(file, marker.seq, ordinal);\n\t\tif (confirmed.has(key)) throw new JsonlCorruptionError(`Sidecar record is confirmed more than once`);\n\t\tconst line = recordByKey.get(key);\n\t\tif (line === undefined) {\n\t\t\tif (optional) return undefined;\n\t\t\tthrow new JsonlCorruptionError(`Missing confirmed sidecar record ${file} at sequence ${marker.seq}`);\n\t\t}\n\t\tconfirmed.add(key);\n\t\treturn line.value;\n\t}\n\n\tprivate static async readLines<T>(\n\t\tfs: FileSystem,\n\t\tpath: string,\n\t\tname: string,\n\t\tcontext: Context,\n\t\tparse: (text: string, line: number) => T,\n\t): Promise<ParsedFile<T>> {\n\t\tconst read = await fs.readBinaryFile(path, context);\n\t\tif (!read.ok) {\n\t\t\tif (read.error.code === \"not_found\") return { path, lines: [] };\n\t\t\tthrow errorFromFile(`read of ${name}`, read.error);\n\t\t}\n\t\tconst bytes = read.value;\n\t\tlet completeSize = bytes.length;\n\t\tif (completeSize > 0 && bytes[completeSize - 1] !== 0x0a) {\n\t\t\tcompleteSize = bytes.lastIndexOf(0x0a) + 1;\n\t\t\tconst truncated = await fs.truncateFile(path, completeSize, context);\n\t\t\tif (!truncated.ok) throw errorFromFile(`torn-line truncation of ${name}`, truncated.error);\n\t\t}\n\t\tconst lines: ParsedLine<T>[] = [];\n\t\tlet start = 0;\n\t\tlet lineNumber = 1;\n\t\tfor (let end = 0; end < completeSize; end++) {\n\t\t\tif (bytes[end] !== 0x0a) continue;\n\t\t\tlet text: string;\n\t\t\ttry {\n\t\t\t\ttext = textDecoder.decode(bytes.subarray(start, end));\n\t\t\t} catch (error) {\n\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t`Invalid UTF-8 in complete ${name} line ${lineNumber}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlines.push({ value: parse(text, lineNumber), start });\n\t\t\tstart = end + 1;\n\t\t\tlineNumber++;\n\t\t}\n\t\treturn { path, lines };\n\t}\n\n\tprivate async resolveFile(file: string, context: Context): Promise<string> {\n\t\tconst path = await this.fs.joinPath([this.directory, file], context);\n\t\tif (!path.ok) throw errorFromFile(\"path join\", path.error);\n\t\treturn path.value;\n\t}\n\n\tprivate get store(): MemoryStorage {\n\t\tthis.assertUsable();\n\t\treturn this.memory;\n\t}\n\n\t/** The state to read once no batch is being appended: memory runs ahead of the file while one is. */\n\tprivate async readable(): Promise<MemoryStorage> {\n\t\twhile (this.writing !== undefined) await this.writing;\n\t\treturn this.store;\n\t}\n\n\tprivate poison(cause: Error): JsonlStoragePoisonedError {\n\t\tthis.poisonError ??= new JsonlStoragePoisonedError(cause);\n\t\treturn this.poisonError;\n\t}\n\n\tprivate assertUsable(): void {\n\t\tif (this.closed) throw new Error(\"JsonlStorage is closed\");\n\t\tif (this.poisonError !== undefined) throw this.poisonError;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage/jsonl/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord/context\";\nimport type { JsonValue } from \"@earendil-works/chord/json\";\nimport type { FileError, FileSystem } from \"../../env/index.ts\";\nimport { StorageRequestError } from \"../../errors.ts\";\nimport { idFromNumber, seqFromNumber } from \"../../ids.ts\";\nimport type {\n\tCommitResult,\n\tConversationId,\n\tConversationQuery,\n\tCursor,\n\tDocumentAddress,\n\tDocumentContent,\n\tDocumentCreate,\n\tDocumentId,\n\tDocumentPoint,\n\tDocumentQuery,\n\tEntryId,\n\tEntryQuery,\n\tId,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tSubmissionId,\n\tSubmissionQuery,\n\tTaskId,\n\tTaskQuery,\n\tTaskRecord,\n} from \"../../types.ts\";\nimport { MemoryStorage } from \"../memory.ts\";\n\nconst FORMAT_VERSION = 1;\nconst MAIN_FILE = \"main.jsonl\";\nconst RECLAIM_SUFFIX = \".reclaim\";\n/** Read-only opens retried after racing a writer's commits; each retry means another commit landed meanwhile. */\nconst READ_ONLY_OPEN_ATTEMPTS = 5;\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true });\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\ntype MainOperation =\n\t| Extract<StorageWrite, { readonly type: \"conversation\" | \"entry\" | \"submission\" | \"document.retire\" }>\n\t| { readonly type: \"task\"; readonly value: StoredTask }\n\t| { readonly type: \"task.sidecar\"; readonly id: TaskId; readonly ordinal: number }\n\t| { readonly type: \"document.create\"; readonly record: DocumentCreate; readonly ordinal: number }\n\t| { readonly type: \"document.change\"; readonly id: DocumentId; readonly ordinal: number };\n\ntype MainMarker = {\n\treadonly format: typeof FORMAT_VERSION;\n\treadonly type: \"commit\";\n\treadonly seq: Seq;\n\treadonly writes: readonly MainOperation[];\n};\n\ntype SidecarPayload =\n\t| { readonly type: \"task\"; readonly value: StoredTask }\n\t| { readonly type: \"document\"; readonly id: DocumentId; readonly content: DocumentContent };\n\ntype SidecarRecord = {\n\treadonly format: typeof FORMAT_VERSION;\n\treadonly type: \"record\";\n\treadonly seq: Seq;\n\treadonly ordinal: number;\n\treadonly payload: SidecarPayload;\n};\n\ntype ParsedLine<T> = {\n\treadonly value: T;\n\treadonly start: number;\n};\n\ntype ParsedFile<T> = {\n\treadonly path: string;\n\treadonly lines: readonly ParsedLine<T>[];\n\t/** Bytes read, a torn final line included; 0 for a missing file. */\n\treadonly size: number;\n};\n\ntype EncodedCommit = {\n\treadonly marker: string;\n\treadonly sidecars: ReadonlyMap<string, string>;\n};\n\nexport type JsonlStorageOptions = {\n\t/** Flush every affected sidecar before appending the main marker. Defaults to false. */\n\treadonly fsync?: boolean;\n\t/**\n\t * Open without writing, for a viewer of a directory another process may be writing: recovery skips torn final lines\n\t * and unconfirmed sidecar tails in memory instead of truncating them, reclaims nothing, and creates no directory.\n\t * The storage holds the state committed at open and `commit()` rejects. Defaults to false.\n\t */\n\treadonly readOnly?: boolean;\n};\n\nexport class JsonlCorruptionError extends Error {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"JsonlCorruptionError\";\n\t}\n}\n\n/** `commit()` on a storage opened with `readOnly: true`. Nothing was written. */\nexport class JsonlStorageReadOnlyError extends Error {\n\tconstructor() {\n\t\tsuper(\"JSONL storage is open read-only\");\n\t\tthis.name = \"JsonlStorageReadOnlyError\";\n\t}\n}\n\nexport class JsonlStoragePoisonedError extends Error {\n\tconstructor(cause: Error) {\n\t\tsuper(\"JSONL storage is poisoned and must be reopened\", { cause });\n\t\tthis.name = \"JsonlStoragePoisonedError\";\n\t}\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n\tvalue !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst isSafeInteger = (value: unknown): value is number => Number.isSafeInteger(value);\n\nconst sidecarFileName = (kind: \"doc\" | \"task\", id: DocumentId | TaskId): string => `${kind}-${id}.jsonl`;\n\nconst isSidecarFileName = (name: string): boolean => /^(?:doc|task)-(?:0|[1-9]\\d*)\\.jsonl$/.test(name);\n\nconst isReclaimFileName = (name: string): boolean => /^(?:doc|task)-(?:0|[1-9]\\d*)\\.jsonl\\.reclaim$/.test(name);\n\nconst isCurrentOnly = (record: DocumentCreate): boolean =>\n\trecord.scope.kind !== \"conversation\" || record.history === \"latest\";\n\nconst sidecarKey = (file: string, seq: Seq, ordinal: number): string => JSON.stringify([file, seq, ordinal]);\n\nconst jsonLine = (value: MainMarker | SidecarRecord): string => `${JSON.stringify(value)}\\n`;\n\nconst errorFromFile = (action: string, error: FileError): Error =>\n\tnew Error(`JSONL ${action} failed: ${error.message}`, { cause: error });\n\nconst parseJson = (text: string, description: string): unknown => {\n\ttry {\n\t\treturn JSON.parse(text) as unknown;\n\t} catch (error) {\n\t\tthrow new JsonlCorruptionError(`Malformed complete ${description}`, error instanceof Error ? error : undefined);\n\t}\n};\n\nconst validateMainOperation = (value: unknown, description: string): MainOperation => {\n\tif (!isObject(value) || typeof value.type !== \"string\") {\n\t\tthrow new JsonlCorruptionError(`Invalid write in ${description}`);\n\t}\n\tswitch (value.type) {\n\t\tcase \"conversation\":\n\t\tcase \"entry\":\n\t\tcase \"submission\":\n\t\t\tif (!isObject(value.value) || !isSafeInteger(value.value.id)) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid ${value.type} write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"task\":\n\t\t\tif (\n\t\t\t\t!isObject(value.value) ||\n\t\t\t\t!isSafeInteger(value.value.id) ||\n\t\t\t\t!isObject(value.value.state) ||\n\t\t\t\tvalue.value.state.status !== \"terminal\"\n\t\t\t) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid terminal task write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.retire\":\n\t\t\tif (!isSafeInteger(value.id)) throw new JsonlCorruptionError(`Invalid document retirement in ${description}`);\n\t\t\treturn value as MainOperation;\n\t\tcase \"task.sidecar\":\n\t\t\tif (!isSafeInteger(value.id) || !isSafeInteger(value.ordinal) || value.ordinal < 0) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid task sidecar write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.create\":\n\t\t\tif (\n\t\t\t\t!isObject(value.record) ||\n\t\t\t\t!isSafeInteger(value.record.id) ||\n\t\t\t\t!isSafeInteger(value.ordinal) ||\n\t\t\t\tvalue.ordinal < 0\n\t\t\t) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid document creation in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.change\":\n\t\t\tif (!isSafeInteger(value.id) || !isSafeInteger(value.ordinal) || value.ordinal < 0) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid document change in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tdefault:\n\t\t\tthrow new JsonlCorruptionError(`Unknown write type in ${description}`);\n\t}\n};\n\nconst parseMainMarker = (text: string, line: number): MainMarker => {\n\tconst description = `${MAIN_FILE} line ${line}`;\n\tconst value = parseJson(text, description);\n\tif (\n\t\t!isObject(value) ||\n\t\tvalue.format !== FORMAT_VERSION ||\n\t\tvalue.type !== \"commit\" ||\n\t\t!isSafeInteger(value.seq) ||\n\t\tvalue.seq < 1 ||\n\t\t!Array.isArray(value.writes)\n\t) {\n\t\tthrow new JsonlCorruptionError(`Invalid commit marker in ${description}`);\n\t}\n\treturn {\n\t\tformat: FORMAT_VERSION,\n\t\ttype: \"commit\",\n\t\tseq: seqFromNumber(value.seq),\n\t\twrites: value.writes.map((write) => validateMainOperation(write, description)),\n\t};\n};\n\nconst validateDocumentContent = (value: unknown, description: string): DocumentContent => {\n\tif (!isObject(value) || !isSafeInteger(value.version) || value.version < 1) {\n\t\tthrow new JsonlCorruptionError(`Invalid document content in ${description}`);\n\t}\n\tif (value.kind === \"base\" && isObject(value.value)) return value as DocumentContent;\n\tif (value.kind === \"delta\" && Array.isArray(value.ops)) return value as DocumentContent;\n\tthrow new JsonlCorruptionError(`Invalid document content in ${description}`);\n};\n\nconst parseSidecarRecord = (text: string, file: string, line: number): SidecarRecord => {\n\tconst description = `${file} line ${line}`;\n\tconst value = parseJson(text, description);\n\tif (\n\t\t!isObject(value) ||\n\t\tvalue.format !== FORMAT_VERSION ||\n\t\tvalue.type !== \"record\" ||\n\t\t!isSafeInteger(value.seq) ||\n\t\tvalue.seq < 1 ||\n\t\t!isSafeInteger(value.ordinal) ||\n\t\tvalue.ordinal < 0 ||\n\t\t!isObject(value.payload) ||\n\t\ttypeof value.payload.type !== \"string\"\n\t) {\n\t\tthrow new JsonlCorruptionError(`Invalid sidecar record in ${description}`);\n\t}\n\tif (value.payload.type === \"task\") {\n\t\tif (\n\t\t\t!isObject(value.payload.value) ||\n\t\t\t!isSafeInteger(value.payload.value.id) ||\n\t\t\t!isObject(value.payload.value.state) ||\n\t\t\tvalue.payload.value.state.status === \"terminal\"\n\t\t) {\n\t\t\tthrow new JsonlCorruptionError(`Invalid live task record in ${description}`);\n\t\t}\n\t} else if (value.payload.type === \"document\") {\n\t\tif (!isSafeInteger(value.payload.id)) {\n\t\t\tthrow new JsonlCorruptionError(`Invalid document record in ${description}`);\n\t\t}\n\t\tvalidateDocumentContent(value.payload.content, description);\n\t} else {\n\t\tthrow new JsonlCorruptionError(`Unknown sidecar record type in ${description}`);\n\t}\n\treturn value as SidecarRecord;\n};\n\n/** Portable JSONL implementation of the storage contract. */\nexport class JsonlStorage implements Storage {\n\tprivate readonly fs: FileSystem;\n\tprivate readonly directory: string;\n\tprivate readonly mainPath: string;\n\tprivate readonly fsync: boolean;\n\tprivate readonly readOnly: boolean;\n\tprivate readonly memory = new MemoryStorage();\n\tprivate readonly currentOnlyDocuments = new Set<DocumentId>();\n\tprivate readonly liveTaskSidecars = new Set<TaskId>();\n\tprivate closed = false;\n\t/** Bytes of `main.jsonl` recovery read (`mainChanged()`). */\n\tprivate mainSize = 0;\n\tprivate poisonError: JsonlStoragePoisonedError | undefined;\n\t/** Settles once the batch being appended is; its batches are in memory already (`commit()`). */\n\tprivate writing: Promise<void> | undefined;\n\n\tprivate constructor(fs: FileSystem, directory: string, mainPath: string, options: JsonlStorageOptions) {\n\t\tthis.fs = fs;\n\t\tthis.directory = directory;\n\t\tthis.mainPath = mainPath;\n\t\tthis.fsync = options.fsync ?? false;\n\t\tthis.readOnly = options.readOnly ?? false;\n\t}\n\n\t/**\n\t * Open or create a JSONL storage directory using the supplied filesystem. With `readOnly`, open an existing one\n\t * without writing; a recovery that fails while `main.jsonl` changes raced a writer's commit and is retried.\n\t */\n\tstatic async open(\n\t\tdirectory: string,\n\t\tfs: FileSystem,\n\t\tcontext: Context,\n\t\toptions: JsonlStorageOptions = {},\n\t): Promise<JsonlStorage> {\n\t\tconst absolute = await fs.absolutePath(directory, context);\n\t\tif (!absolute.ok) throw errorFromFile(\"path resolution\", absolute.error);\n\t\tif (options.readOnly !== true) {\n\t\t\tconst created = await fs.createDir(absolute.value, { recursive: true }, context);\n\t\t\tif (!created.ok) throw errorFromFile(\"directory creation\", created.error);\n\t\t}\n\t\tconst mainPathResult = await fs.joinPath([absolute.value, MAIN_FILE], context);\n\t\tif (!mainPathResult.ok) throw errorFromFile(\"path join\", mainPathResult.error);\n\t\tfor (let attempt = 1; ; attempt++) {\n\t\t\tconst storage = new JsonlStorage(fs, absolute.value, mainPathResult.value, options);\n\t\t\ttry {\n\t\t\t\tawait storage.recover(context);\n\t\t\t\treturn storage;\n\t\t\t} catch (error) {\n\t\t\t\tif (\n\t\t\t\t\t!storage.readOnly ||\n\t\t\t\t\tattempt === READ_ONLY_OPEN_ATTEMPTS ||\n\t\t\t\t\t!(error instanceof JsonlCorruptionError) ||\n\t\t\t\t\t!(await storage.mainChanged(context))\n\t\t\t\t) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Commit `batches` with one append per affected file: every batch's sidecar records first, then their markers in one\n\t * write of `main.jsonl`. Each batch is checked against the state the earlier ones left, so memory applies each one\n\t * as it passes, and reads wait until the appends are done; the first batch refused ends the batch. A torn append of\n\t * the markers recovers a shorter complete prefix; any failure once a batch applied poisons the storage.\n\t */\n\tasync commit(\n\t\tbatches: readonly (readonly StorageWrite[])[],\n\t\treceive: (index: number, seq: Seq) => void,\n\t\tcontext: Context,\n\t): Promise<CommitResult> {\n\t\tthis.assertUsable();\n\t\tif (this.readOnly) throw new JsonlStorageReadOnlyError();\n\t\tconst seqs: Seq[] = [];\n\t\tconst encoded: EncodedCommit[] = [];\n\t\tconst reclamations = new Map<string, string>();\n\t\tlet refused: { readonly error: unknown } | undefined;\n\t\tconst writing = Promise.withResolvers<void>();\n\t\tthis.writing = writing.promise;\n\t\ttry {\n\t\t\tfor (const writes of batches) {\n\t\t\t\tlet prepared: ReturnType<MemoryStorage[\"prepareCommit\"]>;\n\t\t\t\ttry {\n\t\t\t\t\tprepared = this.memory.prepareCommit(writes);\n\t\t\t\t} catch (error) {\n\t\t\t\t\trefused = { error };\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst commit = this.encodeCommit(prepared.seq, prepared.writes);\n\t\t\t\t// A sidecar an earlier batch replaces keeps what the later ones append, unless they replace it again.\n\t\t\t\tfor (const [file, content] of commit.sidecars) {\n\t\t\t\t\tconst replacement = reclamations.get(file);\n\t\t\t\t\tif (replacement !== undefined) reclamations.set(file, replacement + content);\n\t\t\t\t}\n\t\t\t\tfor (const [file, content] of this.planReclamations(prepared.writes, commit))\n\t\t\t\t\treclamations.set(file, content);\n\t\t\t\tseqs.push(prepared.apply());\n\t\t\t\tthis.adoptSidecarState(prepared.writes);\n\t\t\t\tencoded.push(commit);\n\t\t\t}\n\t\t\tif (encoded.length > 0) await this.append(encoded, context);\n\t\t} catch (error) {\n\t\t\t// Memory runs ahead of the file: once a batch applied, any failure poisons the storage before the reads\n\t\t\t// waiting on the append go on, so none of them returns what is not stored.\n\t\t\tif (seqs.length === 0) throw error;\n\t\t\tthrow this.poison(error instanceof Error ? error : new Error(\"JSONL commit failed\", { cause: error }));\n\t\t} finally {\n\t\t\tthis.writing = undefined;\n\t\t\twriting.resolve();\n\t\t}\n\t\t// The markers are appended: the batches are durable. Reclaiming sidecars comes after the receipts.\n\t\tfor (const [index, seq] of seqs.entries()) receive(index, seq);\n\t\tawait this.reclaimSidecars(reclamations, context);\n\t\treturn refused === undefined ? { stored: seqs.length } : { stored: seqs.length, refused: refused.error };\n\t}\n\n\t/** Append the sidecar records of `commits`, flushed with `fsync`, then their markers in one write of `main.jsonl`. */\n\tprivate async append(commits: readonly EncodedCommit[], context: Context): Promise<void> {\n\t\tconst contents = new Map<string, string>();\n\t\tfor (const commit of commits) {\n\t\t\tfor (const [file, content] of commit.sidecars) contents.set(file, (contents.get(file) ?? \"\") + content);\n\t\t}\n\t\tconst sidecars = await Promise.all(\n\t\t\t[...contents].map(async ([file, content]) => ({\n\t\t\t\tfile,\n\t\t\t\tcontent,\n\t\t\t\tpath: await this.resolveFile(file, context),\n\t\t\t})),\n\t\t);\n\t\tfor (const sidecar of sidecars) {\n\t\t\tconst result = await this.fs.appendFile(sidecar.path, sidecar.content, context);\n\t\t\tif (!result.ok) throw this.poison(errorFromFile(`append to ${sidecar.file}`, result.error));\n\t\t}\n\t\tif (this.fsync) {\n\t\t\tfor (const sidecar of sidecars) {\n\t\t\t\tconst result = await this.fs.flushFile(sidecar.path, context);\n\t\t\t\tif (!result.ok) throw this.poison(errorFromFile(`flush of ${sidecar.file}`, result.error));\n\t\t\t}\n\t\t}\n\t\tconst markers = commits.length === 1 ? commits[0]!.marker : commits.map((commit) => commit.marker).join(\"\");\n\t\tconst marker = await this.fs.appendFile(this.mainPath, markers, context);\n\t\tif (!marker.ok) throw this.poison(errorFromFile(`append to ${MAIN_FILE}`, marker.error));\n\t}\n\n\tasync mintId<I extends Id<string>>(): Promise<I> {\n\t\treturn this.store.mintId<I>();\n\t}\n\n\tasync conversation(id: ConversationId, context: Context) {\n\t\treturn (await this.readable()).conversation(id, context);\n\t}\n\n\tasync scanConversations(query: ConversationQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanConversations(query, limit, cursor, context);\n\t}\n\n\tentry(id: EntryId, context: Context): ReturnType<Storage[\"entry\"]>;\n\tentry(conversationId: ConversationId, id: EntryId, context: Context): ReturnType<Storage[\"entry\"]>;\n\tasync entry(idOrConversationId: EntryId | ConversationId, idOrContext: EntryId | Context, context?: Context) {\n\t\tif (context === undefined)\n\t\t\treturn (await this.readable()).entry(idFromNumber<EntryId>(idOrConversationId), idOrContext as Context);\n\t\tif (typeof idOrContext !== \"number\") throw new StorageRequestError(\"Storage.entry() requires an entry ID\");\n\t\treturn (await this.readable()).entry(\n\t\t\tidFromNumber<ConversationId>(idOrConversationId),\n\t\t\tidFromNumber<EntryId>(idOrContext),\n\t\t\tcontext,\n\t\t);\n\t}\n\n\tasync findLatestHeadMarker(\n\t\tconversationId: ConversationId,\n\t\tatOrBeforeEntryId: EntryId | undefined,\n\t\tcontext: Context,\n\t) {\n\t\treturn (await this.readable()).findLatestHeadMarker(conversationId, atOrBeforeEntryId, context);\n\t}\n\n\tasync scanEntries(query: EntryQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanEntries(query, limit, cursor, context);\n\t}\n\n\tasync task(id: TaskId, context: Context) {\n\t\treturn (await this.readable()).task(id, context);\n\t}\n\n\tasync scanTasks(query: TaskQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanTasks(query, limit, cursor, context);\n\t}\n\n\tasync submission(id: SubmissionId, context: Context) {\n\t\treturn (await this.readable()).submission(id, context);\n\t}\n\n\tasync scanSubmissions(query: SubmissionQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanSubmissions(query, limit, cursor, context);\n\t}\n\n\tasync submissionByRequest(conversationId: ConversationId, requestId: string, context: Context) {\n\t\treturn (await this.readable()).submissionByRequest(conversationId, requestId, context);\n\t}\n\n\tasync findDocument(address: DocumentAddress, at: DocumentPoint, context: Context) {\n\t\treturn (await this.readable()).findDocument(address, at, context);\n\t}\n\n\tasync document(id: DocumentId, at: DocumentPoint, context: Context) {\n\t\treturn (await this.readable()).document(id, at, context);\n\t}\n\n\tasync scanDocuments(query: DocumentQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanDocuments(query, limit, cursor, context);\n\t}\n\n\tasync close(context: Context): Promise<void> {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tawait this.memory.close(context);\n\t}\n\n\tprivate encodeCommit(seq: Seq, writes: readonly StorageWrite[]): EncodedCommit {\n\t\tconst mainWrites: MainOperation[] = [];\n\t\tconst records = new Map<string, SidecarRecord[]>();\n\t\tlet nextOrdinal = 0;\n\t\tconst addSidecar = (file: string, payload: SidecarPayload): number => {\n\t\t\tconst ordinal = nextOrdinal++;\n\t\t\tlet fileRecords = records.get(file);\n\t\t\tif (fileRecords === undefined) {\n\t\t\t\tfileRecords = [];\n\t\t\t\trecords.set(file, fileRecords);\n\t\t\t}\n\t\t\tfileRecords.push({ format: FORMAT_VERSION, type: \"record\", seq, ordinal, payload });\n\t\t\treturn ordinal;\n\t\t};\n\n\t\tfor (const write of writes) {\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"conversation\":\n\t\t\t\tcase \"entry\":\n\t\t\t\tcase \"submission\":\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tmainWrites.push(write);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"task\":\n\t\t\t\t\tif (write.value.state.status === \"terminal\") mainWrites.push(write);\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"task\", write.value.id), {\n\t\t\t\t\t\t\ttype: \"task\",\n\t\t\t\t\t\t\tvalue: write.value,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tmainWrites.push({ type: \"task.sidecar\", id: write.value.id, ordinal });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.create\": {\n\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"doc\", write.record.id), {\n\t\t\t\t\t\ttype: \"document\",\n\t\t\t\t\t\tid: write.record.id,\n\t\t\t\t\t\tcontent: write.content,\n\t\t\t\t\t});\n\t\t\t\t\tmainWrites.push({ type: \"document.create\", record: write.record, ordinal });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"document.change\": {\n\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"doc\", write.id), {\n\t\t\t\t\t\ttype: \"document\",\n\t\t\t\t\t\tid: write.id,\n\t\t\t\t\t\tcontent: write.content,\n\t\t\t\t\t});\n\t\t\t\t\tmainWrites.push({ type: \"document.change\", id: write.id, ordinal });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst sidecars = new Map<string, string>();\n\t\tfor (const [file, fileRecords] of records) {\n\t\t\tsidecars.set(file, fileRecords.map((record) => jsonLine(record)).join(\"\"));\n\t\t}\n\t\tconst marker: MainMarker = {\n\t\t\tformat: FORMAT_VERSION,\n\t\t\ttype: \"commit\",\n\t\t\tseq,\n\t\t\twrites: mainWrites,\n\t\t};\n\t\treturn { marker: jsonLine(marker), sidecars };\n\t}\n\n\tprivate planReclamations(writes: readonly StorageWrite[], encoded: EncodedCommit): ReadonlyMap<string, string> {\n\t\tconst createdCurrentOnlyDocuments = new Set<DocumentId>();\n\t\tconst retiredDocuments = new Set<DocumentId>();\n\t\tconst baseDocuments = new Set<DocumentId>();\n\t\tconst finalTasks = new Map<TaskId, StoredTask>();\n\t\tfor (const write of writes) {\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"document.create\":\n\t\t\t\t\tif (isCurrentOnly(write.record)) createdCurrentOnlyDocuments.add(write.record.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.change\":\n\t\t\t\t\tif (write.content.kind === \"base\") baseDocuments.add(write.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tretiredDocuments.add(write.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"task\":\n\t\t\t\t\tfinalTasks.set(write.value.id, write.value);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst replacements = new Map<string, string>();\n\t\tconst isCurrentOnlyDocument = (id: DocumentId): boolean =>\n\t\t\tthis.currentOnlyDocuments.has(id) || createdCurrentOnlyDocuments.has(id);\n\t\tfor (const id of retiredDocuments) {\n\t\t\tif (isCurrentOnlyDocument(id)) replacements.set(sidecarFileName(\"doc\", id), \"\");\n\t\t}\n\t\tfor (const id of baseDocuments) {\n\t\t\tif (!isCurrentOnlyDocument(id) || retiredDocuments.has(id)) continue;\n\t\t\tconst file = sidecarFileName(\"doc\", id);\n\t\t\tconst content = encoded.sidecars.get(file);\n\t\t\tif (content !== undefined) replacements.set(file, content);\n\t\t}\n\t\tfor (const [id, task] of finalTasks) {\n\t\t\tif (\n\t\t\t\ttask.state.status === \"terminal\" &&\n\t\t\t\t(this.liveTaskSidecars.has(id) || encoded.sidecars.has(sidecarFileName(\"task\", id)))\n\t\t\t) {\n\t\t\t\treplacements.set(sidecarFileName(\"task\", id), \"\");\n\t\t\t}\n\t\t}\n\t\treturn replacements;\n\t}\n\n\tprivate adoptSidecarState(writes: readonly StorageWrite[]): void {\n\t\tfor (const write of writes) {\n\t\t\tif (write.type === \"document.create\") {\n\t\t\t\tif (isCurrentOnly(write.record)) this.currentOnlyDocuments.add(write.record.id);\n\t\t\t} else if (write.type === \"task\") {\n\t\t\t\tif (write.value.state.status === \"terminal\") this.liveTaskSidecars.delete(write.value.id);\n\t\t\t\telse this.liveTaskSidecars.add(write.value.id);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** The marker already published this state, so reclamation is retryable best-effort maintenance. */\n\tprivate async reclaimSidecars(replacements: ReadonlyMap<string, string>, context: Context): Promise<void> {\n\t\tif (replacements.size === 0) return;\n\t\tif (this.fsync) {\n\t\t\tconst flushed = await this.fs.flushFile(this.mainPath, context);\n\t\t\tif (!flushed.ok) return;\n\t\t}\n\t\tfor (const [file, content] of replacements) await this.replaceSidecar(file, content, context);\n\t}\n\n\tprivate async replaceSidecar(file: string, content: string, context: Context): Promise<void> {\n\t\tconst path = await this.fs.joinPath([this.directory, file], context);\n\t\tif (!path.ok) return;\n\t\tif (content === \"\") {\n\t\t\tawait this.fs.remove(path.value, { force: true }, context);\n\t\t\treturn;\n\t\t}\n\t\tconst temporaryPath = await this.fs.joinPath([this.directory, `${file}${RECLAIM_SUFFIX}`], context);\n\t\tif (!temporaryPath.ok) return;\n\t\tconst written = await this.fs.writeFile(temporaryPath.value, content, context);\n\t\tif (!written.ok) return;\n\t\tif (this.fsync) {\n\t\t\tconst flushed = await this.fs.flushFile(temporaryPath.value, context);\n\t\t\tif (!flushed.ok) return;\n\t\t}\n\t\tawait this.fs.renameFile(temporaryPath.value, path.value, context);\n\t}\n\n\t/**\n\t * Load the confirmed state. A writable open also repairs the files: it truncates torn lines and unconfirmed sidecar\n\t * tails, removes leftover reclaim files, and reclaims sidecar records later commits made unnecessary. A read-only\n\t * open skips the same records in memory only.\n\t */\n\tprivate async recover(context: Context): Promise<void> {\n\t\tconst fs = this.fs;\n\t\tconst directory = this.directory;\n\t\tconst memory = this.memory;\n\t\tconst main = await this.readLines(this.mainPath, MAIN_FILE, context, (text, line) => parseMainMarker(text, line));\n\t\tthis.mainSize = main.size;\n\t\tlet previousSeq = 0;\n\t\tfor (const marker of main.lines) {\n\t\t\tif (marker.value.seq <= previousSeq) {\n\t\t\t\tthrow new JsonlCorruptionError(`Commit sequence does not strictly increase in ${MAIN_FILE}`);\n\t\t\t}\n\t\t\tpreviousSeq = marker.value.seq;\n\t\t}\n\n\t\tconst listed = await fs.listDir(directory, context);\n\t\tif (!listed.ok) throw errorFromFile(\"directory listing\", listed.error);\n\t\tfor (const info of listed.value) {\n\t\t\tif (!this.readOnly && info.kind === \"file\" && isReclaimFileName(info.name)) {\n\t\t\t\tawait fs.remove(info.path, { force: true }, context);\n\t\t\t}\n\t\t}\n\t\tconst sidecarFiles = listed.value\n\t\t\t.filter((info) => info.kind === \"file\" && isSidecarFileName(info.name))\n\t\t\t.map((info) => info.name)\n\t\t\t.sort();\n\t\tconst parsedFiles = new Map<string, ParsedFile<SidecarRecord>>();\n\t\tconst recordByKey = new Map<string, ParsedLine<SidecarRecord>>();\n\t\tfor (const file of sidecarFiles) {\n\t\t\tconst pathResult = await fs.joinPath([directory, file], context);\n\t\t\tif (!pathResult.ok) throw errorFromFile(\"path join\", pathResult.error);\n\t\t\tconst parsed = await this.readLines(pathResult.value, file, context, (text, line) =>\n\t\t\t\tparseSidecarRecord(text, file, line),\n\t\t\t);\n\t\t\tparsedFiles.set(file, parsed);\n\t\t\tlet previous: SidecarRecord | undefined;\n\t\t\tfor (const line of parsed.lines) {\n\t\t\t\tif (\n\t\t\t\t\tprevious !== undefined &&\n\t\t\t\t\t(line.value.seq < previous.seq ||\n\t\t\t\t\t\t(line.value.seq === previous.seq && line.value.ordinal <= previous.ordinal))\n\t\t\t\t) {\n\t\t\t\t\tthrow new JsonlCorruptionError(`Sidecar records are out of order in ${file}`);\n\t\t\t\t}\n\t\t\t\tprevious = line.value;\n\t\t\t\trecordByKey.set(sidecarKey(file, line.value.seq, line.value.ordinal), line);\n\t\t\t}\n\t\t}\n\n\t\tconst currentOnlyDocuments = new Set<DocumentId>();\n\t\tconst retiredDocuments = new Set<DocumentId>();\n\t\tconst finalTaskIsLive = new Map<TaskId, boolean>();\n\t\tfor (const { value: marker } of main.lines) {\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tif (operation.type === \"document.create\") {\n\t\t\t\t\tif (isCurrentOnly(operation.record)) currentOnlyDocuments.add(operation.record.id);\n\t\t\t\t} else if (operation.type === \"document.retire\") {\n\t\t\t\t\tretiredDocuments.add(operation.id);\n\t\t\t\t} else if (operation.type === \"task\") {\n\t\t\t\t\tfinalTaskIsLive.set(operation.value.id, false);\n\t\t\t\t} else if (operation.type === \"task.sidecar\") {\n\t\t\t\t\tfinalTaskIsLive.set(operation.id, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst retiredCurrentOnlyDocuments = new Set([...retiredDocuments].filter((id) => currentOnlyDocuments.has(id)));\n\n\t\tconst latestBases = new Map<DocumentId, SidecarRecord>();\n\t\tfor (const { value: marker } of main.lines) {\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tif (operation.type !== \"document.create\" && operation.type !== \"document.change\") continue;\n\t\t\t\tconst id = operation.type === \"document.create\" ? operation.record.id : operation.id;\n\t\t\t\tif (!currentOnlyDocuments.has(id)) continue;\n\t\t\t\tconst record = recordByKey.get(\n\t\t\t\t\tsidecarKey(sidecarFileName(\"doc\", id), marker.seq, operation.ordinal),\n\t\t\t\t)?.value;\n\t\t\t\tif (\n\t\t\t\t\trecord?.payload.type !== \"document\" ||\n\t\t\t\t\trecord.payload.id !== id ||\n\t\t\t\t\trecord.payload.content.kind !== \"base\"\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previous = latestBases.get(id);\n\t\t\t\tif (\n\t\t\t\t\tprevious === undefined ||\n\t\t\t\t\trecord.seq > previous.seq ||\n\t\t\t\t\t(record.seq === previous.seq && record.ordinal > previous.ordinal)\n\t\t\t\t) {\n\t\t\t\t\tlatestBases.set(id, record);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst isBeforeLatestBase = (id: DocumentId, seq: Seq, ordinal: number): boolean => {\n\t\t\tconst base = latestBases.get(id);\n\t\t\treturn base !== undefined && (seq < base.seq || (seq === base.seq && ordinal < base.ordinal));\n\t\t};\n\t\tconst terminalTasks = new Set([...finalTaskIsLive].filter(([, live]) => !live).map(([id]) => id));\n\t\tconst confirmed = new Set<string>();\n\t\tfor (const line of main.lines) {\n\t\t\tconst marker = line.value;\n\t\t\tconst writes: StorageWrite[] = [];\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tswitch (operation.type) {\n\t\t\t\t\tcase \"conversation\":\n\t\t\t\t\tcase \"entry\":\n\t\t\t\t\tcase \"submission\":\n\t\t\t\t\tcase \"task\":\n\t\t\t\t\tcase \"document.retire\":\n\t\t\t\t\t\twrites.push(operation);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"task.sidecar\": {\n\t\t\t\t\t\tconst optional = terminalTasks.has(operation.id);\n\t\t\t\t\t\tconst record = JsonlStorage.confirmRecord(\n\t\t\t\t\t\t\tmarker,\n\t\t\t\t\t\t\toperation.ordinal,\n\t\t\t\t\t\t\tsidecarFileName(\"task\", operation.id),\n\t\t\t\t\t\t\trecordByKey,\n\t\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t\t\toptional,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (record !== undefined) {\n\t\t\t\t\t\t\tif (record.payload.type !== \"task\" || record.payload.value.id !== operation.id) {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Confirmed task sidecar data does not match commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!optional) writes.push({ type: \"task\", value: record.payload.value });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"document.create\":\n\t\t\t\t\tcase \"document.change\": {\n\t\t\t\t\t\tconst id = operation.type === \"document.create\" ? operation.record.id : operation.id;\n\t\t\t\t\t\tconst reclaimed =\n\t\t\t\t\t\t\tretiredCurrentOnlyDocuments.has(id) || isBeforeLatestBase(id, marker.seq, operation.ordinal);\n\t\t\t\t\t\tconst record = JsonlStorage.confirmRecord(\n\t\t\t\t\t\t\tmarker,\n\t\t\t\t\t\t\toperation.ordinal,\n\t\t\t\t\t\t\tsidecarFileName(\"doc\", id),\n\t\t\t\t\t\t\trecordByKey,\n\t\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t\t\treclaimed,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlet content: DocumentContent | undefined;\n\t\t\t\t\t\tif (record !== undefined) {\n\t\t\t\t\t\t\tif (record.payload.type !== \"document\" || record.payload.id !== id) {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Confirmed document sidecar data does not match commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontent = record.payload.content;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (operation.type === \"document.create\") {\n\t\t\t\t\t\t\tif (content !== undefined && content.kind !== \"base\") {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Document creation lacks a confirmed base in commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twrites.push({\n\t\t\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\t\t\trecord: operation.record,\n\t\t\t\t\t\t\t\tcontent: reclaimed || content === undefined ? { kind: \"base\", version: 1, value: {} } : content,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (!reclaimed && content !== undefined) {\n\t\t\t\t\t\t\twrites.push({ type: \"document.change\", id, content });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tmemory.prepareCommit(writes, marker.seq).apply();\n\t\t\t} catch (error) {\n\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t`Invalid committed state at sequence ${marker.seq}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst reclamations = new Map<string, string>();\n\t\tfor (const [file, parsed] of parsedFiles) {\n\t\t\tlet unconfirmedAt: number | undefined;\n\t\t\tfor (const line of parsed.lines) {\n\t\t\t\tconst key = sidecarKey(file, line.value.seq, line.value.ordinal);\n\t\t\t\tif (confirmed.has(key)) {\n\t\t\t\t\tif (unconfirmedAt !== undefined) {\n\t\t\t\t\t\tthrow new JsonlCorruptionError(`Confirmed record follows an unconfirmed tail in ${file}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (unconfirmedAt === undefined) {\n\t\t\t\t\tunconfirmedAt = line.start;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (unconfirmedAt !== undefined && !this.readOnly) {\n\t\t\t\tconst truncated = await fs.truncateFile(parsed.path, unconfirmedAt, context);\n\t\t\t\tif (!truncated.ok) throw errorFromFile(`tail truncation of ${file}`, truncated.error);\n\t\t\t}\n\n\t\t\tconst numericId = Number(file.slice(file.indexOf(\"-\") + 1, -\".jsonl\".length));\n\t\t\tconst confirmedLines = parsed.lines.filter((line) =>\n\t\t\t\tconfirmed.has(sidecarKey(file, line.value.seq, line.value.ordinal)),\n\t\t\t);\n\t\t\tlet retainedLines: readonly ParsedLine<SidecarRecord>[] | undefined;\n\t\t\tif (file.startsWith(\"task-\") && terminalTasks.has(idFromNumber<TaskId>(numericId))) {\n\t\t\t\tretainedLines = [];\n\t\t\t} else if (file.startsWith(\"doc-\")) {\n\t\t\t\tconst documentId = idFromNumber<DocumentId>(numericId);\n\t\t\t\tif (retiredCurrentOnlyDocuments.has(documentId)) {\n\t\t\t\t\tretainedLines = [];\n\t\t\t\t} else if (latestBases.has(documentId)) {\n\t\t\t\t\tretainedLines = confirmedLines.filter(\n\t\t\t\t\t\t(line) => !isBeforeLatestBase(documentId, line.value.seq, line.value.ordinal),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\tretainedLines !== undefined &&\n\t\t\t\t(retainedLines.length < confirmedLines.length || retainedLines.length === 0)\n\t\t\t) {\n\t\t\t\treclamations.set(file, retainedLines.map((line) => jsonLine(line.value)).join(\"\"));\n\t\t\t}\n\t\t}\n\t\tif (!this.readOnly) await this.reclaimSidecars(reclamations, context);\n\n\t\tfor (const id of currentOnlyDocuments) this.currentOnlyDocuments.add(id);\n\t\tfor (const [id, live] of finalTaskIsLive) {\n\t\t\tif (live) this.liveTaskSidecars.add(id);\n\t\t}\n\t}\n\n\tprivate static confirmRecord(\n\t\tmarker: MainMarker,\n\t\tordinal: number,\n\t\tfile: string,\n\t\trecordByKey: ReadonlyMap<string, ParsedLine<SidecarRecord>>,\n\t\tconfirmed: Set<string>,\n\t\toptional: boolean,\n\t): SidecarRecord | undefined {\n\t\tconst key = sidecarKey(file, marker.seq, ordinal);\n\t\tif (confirmed.has(key)) throw new JsonlCorruptionError(`Sidecar record is confirmed more than once`);\n\t\tconst line = recordByKey.get(key);\n\t\tif (line === undefined) {\n\t\t\tif (optional) return undefined;\n\t\t\tthrow new JsonlCorruptionError(`Missing confirmed sidecar record ${file} at sequence ${marker.seq}`);\n\t\t}\n\t\tconfirmed.add(key);\n\t\treturn line.value;\n\t}\n\n\t/** Parse the complete lines of `path`; a torn final line is truncated, or only skipped when read-only. */\n\tprivate async readLines<T>(\n\t\tpath: string,\n\t\tname: string,\n\t\tcontext: Context,\n\t\tparse: (text: string, line: number) => T,\n\t): Promise<ParsedFile<T>> {\n\t\tconst read = await this.fs.readBinaryFile(path, context);\n\t\tif (!read.ok) {\n\t\t\tif (read.error.code === \"not_found\") return { path, lines: [], size: 0 };\n\t\t\tthrow errorFromFile(`read of ${name}`, read.error);\n\t\t}\n\t\tconst bytes = read.value;\n\t\tlet completeSize = bytes.length;\n\t\tif (completeSize > 0 && bytes[completeSize - 1] !== 0x0a) {\n\t\t\tcompleteSize = bytes.lastIndexOf(0x0a) + 1;\n\t\t\tif (!this.readOnly) {\n\t\t\t\tconst truncated = await this.fs.truncateFile(path, completeSize, context);\n\t\t\t\tif (!truncated.ok) throw errorFromFile(`torn-line truncation of ${name}`, truncated.error);\n\t\t\t}\n\t\t}\n\t\tconst lines: ParsedLine<T>[] = [];\n\t\tlet start = 0;\n\t\tlet lineNumber = 1;\n\t\tfor (let end = 0; end < completeSize; end++) {\n\t\t\tif (bytes[end] !== 0x0a) continue;\n\t\t\tlet text: string;\n\t\t\ttry {\n\t\t\t\ttext = textDecoder.decode(bytes.subarray(start, end));\n\t\t\t} catch (error) {\n\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t`Invalid UTF-8 in complete ${name} line ${lineNumber}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlines.push({ value: parse(text, lineNumber), start });\n\t\t\tstart = end + 1;\n\t\t\tlineNumber++;\n\t\t}\n\t\treturn { path, lines, size: bytes.length };\n\t}\n\n\t/**\n\t * Whether `main.jsonl` changed size since recovery read it. A writer reclaims a sidecar only after appending the\n\t * marker that allows it, so sidecars read while `main.jsonl` stayed the same match its markers; a recovery that\n\t * failed while it changed may have read a sidecar a newer commit reclaimed.\n\t */\n\tprivate async mainChanged(context: Context): Promise<boolean> {\n\t\tconst info = await this.fs.fileInfo(this.mainPath, context);\n\t\treturn info.ok && info.value.size !== this.mainSize;\n\t}\n\n\tprivate async resolveFile(file: string, context: Context): Promise<string> {\n\t\tconst path = await this.fs.joinPath([this.directory, file], context);\n\t\tif (!path.ok) throw errorFromFile(\"path join\", path.error);\n\t\treturn path.value;\n\t}\n\n\tprivate get store(): MemoryStorage {\n\t\tthis.assertUsable();\n\t\treturn this.memory;\n\t}\n\n\t/** The state to read once no batch is being appended: memory runs ahead of the file while one is. */\n\tprivate async readable(): Promise<MemoryStorage> {\n\t\twhile (this.writing !== undefined) await this.writing;\n\t\treturn this.store;\n\t}\n\n\tprivate poison(cause: Error): JsonlStoragePoisonedError {\n\t\tthis.poisonError ??= new JsonlStoragePoisonedError(cause);\n\t\treturn this.poisonError;\n\t}\n\n\tprivate assertUsable(): void {\n\t\tif (this.closed) throw new Error(\"JsonlStorage is closed\");\n\t\tif (this.poisonError !== undefined) throw this.poisonError;\n\t}\n}\n"]}
|
package/dist/storage/memory.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { Context
|
|
1
|
+
import type { Context } from "@earendil-works/chord/context";
|
|
2
|
+
import type { JsonValue } from "@earendil-works/chord/json";
|
|
2
3
|
import type { CommitResult, ConversationId, ConversationQuery, ConversationRecord, Cursor, DocumentAddress, DocumentId, DocumentPoint, DocumentQuery, DocumentRecord, EntryId, EntryQuery, EntryRecord, Id, Page, Seq, Storage, StorageWrite, StoredDocument, SubmissionId, SubmissionQuery, SubmissionRecord, TaskId, TaskQuery, TaskRecord } from "../types.ts";
|
|
3
4
|
type StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;
|
|
4
5
|
/** A fully validated, detached state mutation whose application performs no fallible preparation. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
|