@earendil-works/pi-durable 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/README.md +164 -11
- package/dist/codemode/codemode.d.ts +173 -0
- package/dist/codemode/codemode.d.ts.map +1 -0
- package/dist/codemode/codemode.js +886 -0
- package/dist/codemode/codemode.js.map +1 -0
- package/dist/codemode/describe.d.ts +38 -0
- package/dist/codemode/describe.d.ts.map +1 -0
- package/dist/codemode/describe.js +119 -0
- package/dist/codemode/describe.js.map +1 -0
- package/dist/codemode/index.d.ts +3 -0
- package/dist/codemode/index.d.ts.map +1 -0
- package/dist/codemode/index.js +3 -0
- package/dist/codemode/index.js.map +1 -0
- package/dist/codemode/models.d.ts +28 -0
- package/dist/codemode/models.d.ts.map +1 -0
- package/dist/codemode/models.js +231 -0
- package/dist/codemode/models.js.map +1 -0
- package/dist/codemode/output.d.ts +41 -0
- package/dist/codemode/output.d.ts.map +1 -0
- package/dist/codemode/output.js +167 -0
- package/dist/codemode/output.js.map +1 -0
- package/dist/env/index.d.ts +43 -0
- package/dist/env/index.d.ts.map +1 -1
- package/dist/env/index.js.map +1 -1
- package/dist/errors.d.ts +20 -3
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +34 -5
- package/dist/errors.js.map +1 -1
- package/dist/harness/agent.d.ts +5 -2
- package/dist/harness/agent.d.ts.map +1 -1
- package/dist/harness/agent.js +69 -25
- package/dist/harness/agent.js.map +1 -1
- package/dist/harness/compaction.d.ts +6 -1
- package/dist/harness/compaction.d.ts.map +1 -1
- package/dist/harness/compaction.js +10 -7
- package/dist/harness/compaction.js.map +1 -1
- package/dist/harness/context.d.ts +5 -0
- package/dist/harness/context.d.ts.map +1 -1
- package/dist/harness/context.js +46 -12
- package/dist/harness/context.js.map +1 -1
- package/dist/harness/events.d.ts +35 -15
- package/dist/harness/events.d.ts.map +1 -1
- package/dist/harness/events.js +77 -23
- package/dist/harness/events.js.map +1 -1
- package/dist/harness/generation.d.ts +2 -0
- package/dist/harness/generation.d.ts.map +1 -1
- package/dist/harness/generation.js +31 -8
- package/dist/harness/generation.js.map +1 -1
- package/dist/harness/harness.d.ts +7 -0
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/harness.js +53 -26
- package/dist/harness/harness.js.map +1 -1
- package/dist/harness/inbox.d.ts +16 -4
- package/dist/harness/inbox.d.ts.map +1 -1
- package/dist/harness/inbox.js +26 -3
- package/dist/harness/inbox.js.map +1 -1
- package/dist/harness/live.d.ts +74 -17
- package/dist/harness/live.d.ts.map +1 -1
- package/dist/harness/live.js +66 -14
- package/dist/harness/live.js.map +1 -1
- package/dist/harness/scheduler.d.ts +18 -5
- package/dist/harness/scheduler.d.ts.map +1 -1
- package/dist/harness/scheduler.js +696 -163
- package/dist/harness/scheduler.js.map +1 -1
- package/dist/harness/submissions.d.ts +7 -4
- package/dist/harness/submissions.d.ts.map +1 -1
- package/dist/harness/submissions.js +32 -13
- package/dist/harness/submissions.js.map +1 -1
- package/dist/harness/task-graph.d.ts +1 -1
- package/dist/harness/task-graph.d.ts.map +1 -1
- package/dist/harness/task-graph.js +15 -10
- package/dist/harness/task-graph.js.map +1 -1
- package/dist/harness/tool.d.ts +45 -5
- package/dist/harness/tool.d.ts.map +1 -1
- package/dist/harness/tool.js +378 -63
- package/dist/harness/tool.js.map +1 -1
- package/dist/harness/types.d.ts +153 -13
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/util.d.ts +6 -1
- package/dist/harness/util.d.ts.map +1 -1
- package/dist/harness/util.js +5 -2
- package/dist/harness/util.js.map +1 -1
- package/dist/harness/view.d.ts +6 -2
- package/dist/harness/view.d.ts.map +1 -1
- package/dist/harness/view.js +22 -12
- package/dist/harness/view.js.map +1 -1
- package/dist/images/cloudflare.d.ts +4 -0
- package/dist/images/cloudflare.d.ts.map +1 -0
- package/dist/images/cloudflare.js +9 -0
- package/dist/images/cloudflare.js.map +1 -0
- package/dist/images/exif.d.ts +3 -0
- package/dist/images/exif.d.ts.map +1 -0
- package/dist/images/exif.js +71 -0
- package/dist/images/exif.js.map +1 -0
- package/dist/images/index.d.ts +18 -0
- package/dist/images/index.d.ts.map +1 -0
- package/dist/images/index.js +125 -0
- package/dist/images/index.js.map +1 -0
- package/dist/images/node-worker.d.ts +17 -0
- package/dist/images/node-worker.d.ts.map +1 -0
- package/dist/images/node-worker.js +16 -0
- package/dist/images/node-worker.js.map +1 -0
- package/dist/images/node.d.ts +21 -0
- package/dist/images/node.d.ts.map +1 -0
- package/dist/images/node.js +121 -0
- package/dist/images/node.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/search.d.ts +13 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +85 -0
- package/dist/search.js.map +1 -0
- package/dist/session/observation.d.ts +10 -3
- package/dist/session/observation.d.ts.map +1 -1
- package/dist/session/observation.js +24 -34
- package/dist/session/observation.js.map +1 -1
- package/dist/session/session.d.ts +68 -5
- package/dist/session/session.d.ts.map +1 -1
- package/dist/session/session.js +461 -49
- package/dist/session/session.js.map +1 -1
- package/dist/session/transaction.d.ts.map +1 -1
- package/dist/session/transaction.js +1 -0
- package/dist/session/transaction.js.map +1 -1
- package/dist/storage/jsonl/storage.d.ts +4 -0
- package/dist/storage/jsonl/storage.d.ts.map +1 -1
- package/dist/storage/jsonl/storage.js +2 -1
- package/dist/storage/jsonl/storage.js.map +1 -1
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +8 -10
- package/dist/storage/memory.js.map +1 -1
- package/dist/storage/scan.d.ts.map +1 -1
- package/dist/storage/scan.js +5 -4
- package/dist/storage/scan.js.map +1 -1
- package/dist/storage/sqlite/cloudflare.d.ts +17 -5
- package/dist/storage/sqlite/cloudflare.d.ts.map +1 -1
- package/dist/storage/sqlite/cloudflare.js +57 -21
- package/dist/storage/sqlite/cloudflare.js.map +1 -1
- package/dist/storage/sqlite/index.d.ts +1 -1
- package/dist/storage/sqlite/index.d.ts.map +1 -1
- package/dist/storage/sqlite/index.js.map +1 -1
- package/dist/storage/sqlite/migrations.d.ts +5 -1
- package/dist/storage/sqlite/migrations.d.ts.map +1 -1
- package/dist/storage/sqlite/migrations.js +94 -84
- package/dist/storage/sqlite/migrations.js.map +1 -1
- package/dist/storage/sqlite/node.d.ts +6 -4
- package/dist/storage/sqlite/node.d.ts.map +1 -1
- package/dist/storage/sqlite/node.js +6 -2
- package/dist/storage/sqlite/node.js.map +1 -1
- package/dist/storage/sqlite/schema.d.ts +47 -0
- package/dist/storage/sqlite/schema.d.ts.map +1 -0
- package/dist/storage/sqlite/schema.js +57 -0
- package/dist/storage/sqlite/schema.js.map +1 -0
- package/dist/storage/sqlite/storage.d.ts +9 -1
- package/dist/storage/sqlite/storage.d.ts.map +1 -1
- package/dist/storage/sqlite/storage.js +56 -55
- package/dist/storage/sqlite/storage.js.map +1 -1
- package/dist/testing/env-conformance.d.ts.map +1 -1
- package/dist/testing/env-conformance.js +100 -0
- package/dist/testing/env-conformance.js.map +1 -1
- package/dist/testing/runner.d.ts +1 -1
- package/dist/testing/runner.d.ts.map +1 -1
- package/dist/testing/runner.js.map +1 -1
- package/dist/testing/storage-conformance.d.ts.map +1 -1
- package/dist/testing/storage-conformance.js +3 -2
- package/dist/testing/storage-conformance.js.map +1 -1
- package/dist/testing/types.d.ts +2 -0
- package/dist/testing/types.d.ts.map +1 -1
- package/dist/testing/types.js.map +1 -1
- package/dist/tool-search/index.d.ts +2 -0
- package/dist/tool-search/index.d.ts.map +1 -0
- package/dist/tool-search/index.js +2 -0
- package/dist/tool-search/index.js.map +1 -0
- package/dist/tool-search/tool-search.d.ts +23 -0
- package/dist/tool-search/tool-search.d.ts.map +1 -0
- package/dist/tool-search/tool-search.js +84 -0
- package/dist/tool-search/tool-search.js.map +1 -0
- package/dist/tools/bash.d.ts +10 -2
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +27 -9
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.js +1 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/image-processor.d.ts +50 -0
- package/dist/tools/image-processor.d.ts.map +1 -0
- package/dist/tools/image-processor.js +20 -0
- package/dist/tools/image-processor.js.map +1 -0
- package/dist/tools/image.d.ts +8 -0
- package/dist/tools/image.d.ts.map +1 -1
- package/dist/tools/image.js +47 -0
- package/dist/tools/image.js.map +1 -1
- package/dist/tools/index.d.ts +25 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +13 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/read.d.ts +10 -2
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +88 -29
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/write.js +1 -1
- package/dist/tools/write.js.map +1 -1
- package/dist/truncate.d.ts +3 -2
- package/dist/truncate.d.ts.map +1 -1
- package/dist/truncate.js +4 -34
- package/dist/truncate.js.map +1 -1
- package/dist/types.d.ts +59 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +43 -4
- package/dist/harness/output.d.ts +0 -69
- package/dist/harness/output.d.ts.map +0 -1
- package/dist/harness/output.js +0 -318
- package/dist/harness/output.js.map +0 -1
|
@@ -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 { idFromNumber, seqFromNumber } from \"../../ids.ts\";\nimport type {\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\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\tasync commit(writes: readonly StorageWrite[], context: Context): Promise<Seq> {\n\t\tthis.assertUsable();\n\t\tconst prepared = this.memory.prepareCommit(writes);\n\t\tconst encoded = this.encodeCommit(prepared.seq, prepared.writes);\n\t\tconst reclamations = this.planReclamations(prepared.writes, encoded);\n\t\tconst sidecars = await Promise.all(\n\t\t\t[...encoded.sidecars].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\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 marker = await this.fs.appendFile(this.mainPath, encoded.marker, context);\n\t\tif (!marker.ok) throw this.poison(errorFromFile(`append to ${MAIN_FILE}`, marker.error));\n\t\tconst seq = prepared.apply();\n\t\tthis.adoptSidecarState(prepared.writes);\n\t\tawait this.reclaimSidecars(reclamations, context);\n\t\treturn seq;\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 this.store.conversation(id, context);\n\t}\n\n\tasync scanConversations(query: ConversationQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.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 this.store.entry(idFromNumber<EntryId>(idOrConversationId), idOrContext as Context);\n\t\tif (typeof idOrContext !== \"number\") throw new TypeError(\"Storage.entry() requires an entry ID\");\n\t\treturn this.store.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 this.store.findLatestHeadMarker(conversationId, atOrBeforeEntryId, context);\n\t}\n\n\tasync scanEntries(query: EntryQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanEntries(query, limit, cursor, context);\n\t}\n\n\tasync task(id: TaskId, context: Context) {\n\t\treturn this.store.task(id, context);\n\t}\n\n\tasync scanTasks(query: TaskQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanTasks(query, limit, cursor, context);\n\t}\n\n\tasync submission(id: SubmissionId, context: Context) {\n\t\treturn this.store.submission(id, context);\n\t}\n\n\tasync scanSubmissions(query: SubmissionQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanSubmissions(query, limit, cursor, context);\n\t}\n\n\tasync submissionByRequest(conversationId: ConversationId, requestId: string, context: Context) {\n\t\treturn this.store.submissionByRequest(conversationId, requestId, context);\n\t}\n\n\tasync findDocument(address: DocumentAddress, at: DocumentPoint, context: Context) {\n\t\treturn this.store.findDocument(address, at, context);\n\t}\n\n\tasync document(id: DocumentId, at: DocumentPoint, context: Context) {\n\t\treturn this.store.document(id, at, context);\n\t}\n\n\tasync scanDocuments(query: DocumentQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.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\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, 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\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\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\tasync commit(writes: readonly StorageWrite[], context: Context): Promise<Seq> {\n\t\tthis.assertUsable();\n\t\tconst prepared = this.memory.prepareCommit(writes);\n\t\tconst encoded = this.encodeCommit(prepared.seq, prepared.writes);\n\t\tconst reclamations = this.planReclamations(prepared.writes, encoded);\n\t\tconst sidecars = await Promise.all(\n\t\t\t[...encoded.sidecars].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\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 marker = await this.fs.appendFile(this.mainPath, encoded.marker, context);\n\t\tif (!marker.ok) throw this.poison(errorFromFile(`append to ${MAIN_FILE}`, marker.error));\n\t\tconst seq = prepared.apply();\n\t\tthis.adoptSidecarState(prepared.writes);\n\t\tawait this.reclaimSidecars(reclamations, context);\n\t\treturn seq;\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 this.store.conversation(id, context);\n\t}\n\n\tasync scanConversations(query: ConversationQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.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 this.store.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 this.store.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 this.store.findLatestHeadMarker(conversationId, atOrBeforeEntryId, context);\n\t}\n\n\tasync scanEntries(query: EntryQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanEntries(query, limit, cursor, context);\n\t}\n\n\tasync task(id: TaskId, context: Context) {\n\t\treturn this.store.task(id, context);\n\t}\n\n\tasync scanTasks(query: TaskQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanTasks(query, limit, cursor, context);\n\t}\n\n\tasync submission(id: SubmissionId, context: Context) {\n\t\treturn this.store.submission(id, context);\n\t}\n\n\tasync scanSubmissions(query: SubmissionQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanSubmissions(query, limit, cursor, context);\n\t}\n\n\tasync submissionByRequest(conversationId: ConversationId, requestId: string, context: Context) {\n\t\treturn this.store.submissionByRequest(conversationId, requestId, context);\n\t}\n\n\tasync findDocument(address: DocumentAddress, at: DocumentPoint, context: Context) {\n\t\treturn this.store.findDocument(address, at, context);\n\t}\n\n\tasync document(id: DocumentId, at: DocumentPoint, context: Context) {\n\t\treturn this.store.document(id, at, context);\n\t}\n\n\tasync scanDocuments(query: DocumentQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.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\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 +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,uBAAuB,CAAC;AAIhE,OAAO,KAAK,EACX,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,EACN,eAAe,EAGf,UAAU,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,OAAO,EACP,UAAU,EACV,WAAW,EACX,EAAE,EAEF,IAAI,EAEJ,GAAG,EACH,OAAO,EACP,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,UAAU,EACV,MAAM,aAAa,CAAC;AAGrB,KAAK,UAAU,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIhE,OAAO,KAAK,EACX,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,EACN,eAAe,EAGf,UAAU,EACV,aAAa,EACb,aAAa,EACb,cAAc,EACd,OAAO,EACP,UAAU,EACV,WAAW,EACX,EAAE,EAEF,IAAI,EAEJ,GAAG,EACH,OAAO,EACP,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,UAAU,EACV,MAAM,aAAa,CAAC;AAGrB,KAAK,UAAU,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AA0L9D,qGAAqG;AACrG,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,KAAK,IAAI,GAAG,CAAC;CACb;AAED;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,OAAO;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAoBpB;IACF,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,MAAM,CAAS;IAEjB,MAAM,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAE7E;IAED,wEAAwE;IACxE,aAAa,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,GAAG,GAAE,GAAiC,GAAG,oBAAoB,CAqB3G;IAED,OAAO,CAAC,qBAAqB;IAuC7B,OAAO,CAAC,mBAAmB;IAiGrB,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAI/C;IAEK,YAAY,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAIjG;IAEK,iBAAiB,CACtB,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAmB3C;IAED,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IACpH,KAAK,CACJ,cAAc,EAAE,cAAc,EAC9B,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,OAAO,GACd,OAAO,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAqB3E,oBAAoB,CACzB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,OAAO,GAAG,SAAS,EACtC,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,CAAC,WAAW,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC,CAmBjE;IAEK,WAAW,CAChB,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAkBpC;IAEK,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAIzE;IAEK,SAAS,CACd,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAenC;IAEK,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAI3F;IAEK,eAAe,CACpB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAazC;IAEK,mBAAmB,CACxB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAKvC;IAEK,YAAY,CACjB,OAAO,EAAE,eAAe,EACxB,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAWrC;IAEK,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAWxG;IAEK,aAAa,CAClB,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAYvC;IAEK,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5C;IAED,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAE,cAAc;IAyBvB,kGAAkG;IAClG,OAAO,CAAE,uBAAuB;IA6BhC,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,sBAAsB;IAiC9B,OAAO,CAAC,oBAAoB;IA6B5B,OAAO,CAAC,oBAAoB;IA4C5B,OAAO,CAAC,UAAU;CAGlB"}
|
package/dist/storage/memory.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { applyImmutableBatches } from "@earendil-works/chord/delta";
|
|
2
|
-
import {
|
|
2
|
+
import { StorageRequestError } from "../errors.js";
|
|
3
3
|
import { idFromNumber, seqFromNumber } from "../ids.js";
|
|
4
4
|
import { nextCursor, scanStart } from "./scan.js";
|
|
5
5
|
function* documentDeltaBatches(id, version, revisions, start) {
|
|
@@ -47,7 +47,7 @@ const cursorId = (cursor) => {
|
|
|
47
47
|
if (after === undefined)
|
|
48
48
|
return undefined;
|
|
49
49
|
if (typeof after !== "number" || !Number.isSafeInteger(after))
|
|
50
|
-
throw new
|
|
50
|
+
throw new StorageRequestError("Invalid storage cursor");
|
|
51
51
|
return idFromNumber(after);
|
|
52
52
|
};
|
|
53
53
|
const lowerBound = (ids, target) => {
|
|
@@ -229,9 +229,7 @@ export class MemoryStorage {
|
|
|
229
229
|
};
|
|
230
230
|
}
|
|
231
231
|
catch (error) {
|
|
232
|
-
|
|
233
|
-
throw error;
|
|
234
|
-
throw new StorageRejected(`Document copy ${write.record.id} was rejected`, { cause: error });
|
|
232
|
+
throw new Error(`Document copy ${write.record.id} was rejected`, { cause: error });
|
|
235
233
|
}
|
|
236
234
|
});
|
|
237
235
|
}
|
|
@@ -370,7 +368,7 @@ export class MemoryStorage {
|
|
|
370
368
|
return { entry: clone(entry), commitSeq: this.state.entryCommitSeqs.get(id) };
|
|
371
369
|
}
|
|
372
370
|
if (typeof idOrContext !== "number")
|
|
373
|
-
throw new
|
|
371
|
+
throw new StorageRequestError("Storage.entry() requires an entry ID");
|
|
374
372
|
const conversationId = idFromNumber(idOrConversationId);
|
|
375
373
|
const id = idFromNumber(idOrContext);
|
|
376
374
|
const entry = this.visibleEntries(conversationId, id, id).next().value;
|
|
@@ -381,7 +379,7 @@ export class MemoryStorage {
|
|
|
381
379
|
async findLatestHeadMarker(conversationId, atOrBeforeEntryId, _context) {
|
|
382
380
|
this.assertOpen();
|
|
383
381
|
if (!this.state.conversations.has(conversationId)) {
|
|
384
|
-
throw new
|
|
382
|
+
throw new StorageRequestError(`Unknown conversation: ${conversationId}`);
|
|
385
383
|
}
|
|
386
384
|
let currentId = conversationId;
|
|
387
385
|
let upperEntryId = atOrBeforeEntryId ?? Number.POSITIVE_INFINITY;
|
|
@@ -521,7 +519,7 @@ export class MemoryStorage {
|
|
|
521
519
|
if (stored === undefined)
|
|
522
520
|
return undefined;
|
|
523
521
|
if (at !== "current" && isCurrentOnly(stored.record)) {
|
|
524
|
-
throw new
|
|
522
|
+
throw new StorageRequestError(`Document ${id} does not retain historical content`);
|
|
525
523
|
}
|
|
526
524
|
if (!isAliveAt(stored.record, at))
|
|
527
525
|
return undefined;
|
|
@@ -537,7 +535,7 @@ export class MemoryStorage {
|
|
|
537
535
|
}
|
|
538
536
|
*visibleEntries(conversationId, minEntryId = Number.NEGATIVE_INFINITY, maxEntryId = Number.POSITIVE_INFINITY) {
|
|
539
537
|
if (!this.state.conversations.has(conversationId)) {
|
|
540
|
-
throw new
|
|
538
|
+
throw new StorageRequestError(`Unknown conversation: ${conversationId}`);
|
|
541
539
|
}
|
|
542
540
|
let currentId = conversationId;
|
|
543
541
|
let upperEntryId = maxEntryId;
|
|
@@ -561,7 +559,7 @@ export class MemoryStorage {
|
|
|
561
559
|
/** Visible entries oldest first: the fork chain's segments from the root conversation forward. */
|
|
562
560
|
*visibleEntriesAscending(conversationId, minEntryId = Number.NEGATIVE_INFINITY, maxEntryId = Number.POSITIVE_INFINITY) {
|
|
563
561
|
if (!this.state.conversations.has(conversationId)) {
|
|
564
|
-
throw new
|
|
562
|
+
throw new StorageRequestError(`Unknown conversation: ${conversationId}`);
|
|
565
563
|
}
|
|
566
564
|
const segments = [];
|
|
567
565
|
let currentId = conversationId;
|