@earendil-works/pi-durable 0.87.1 → 0.99.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.
Files changed (168) hide show
  1. package/README.md +46 -4
  2. package/dist/documents.d.ts +66 -0
  3. package/dist/documents.d.ts.map +1 -0
  4. package/dist/documents.js +98 -0
  5. package/dist/documents.js.map +1 -0
  6. package/dist/entries.d.ts +13 -0
  7. package/dist/entries.d.ts.map +1 -0
  8. package/dist/entries.js +18 -0
  9. package/dist/entries.js.map +1 -0
  10. package/dist/env/index.d.ts +131 -0
  11. package/dist/env/index.d.ts.map +1 -0
  12. package/dist/env/index.js +45 -0
  13. package/dist/env/index.js.map +1 -0
  14. package/dist/env/node.d.ts +45 -0
  15. package/dist/env/node.d.ts.map +1 -0
  16. package/dist/env/node.js +908 -0
  17. package/dist/env/node.js.map +1 -0
  18. package/dist/env/utils/adaptive-publisher.d.ts +24 -0
  19. package/dist/env/utils/adaptive-publisher.d.ts.map +1 -0
  20. package/dist/env/utils/adaptive-publisher.js +79 -0
  21. package/dist/env/utils/adaptive-publisher.js.map +1 -0
  22. package/dist/env/utils/output-capture.d.ts +31 -0
  23. package/dist/env/utils/output-capture.d.ts.map +1 -0
  24. package/dist/env/utils/output-capture.js +238 -0
  25. package/dist/env/utils/output-capture.js.map +1 -0
  26. package/dist/env/utils/truncate.d.ts +71 -0
  27. package/dist/env/utils/truncate.d.ts.map +1 -0
  28. package/dist/env/utils/truncate.js +294 -0
  29. package/dist/env/utils/truncate.js.map +1 -0
  30. package/dist/errors.d.ts +15 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +24 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/harness/config.d.ts +20 -0
  35. package/dist/harness/config.d.ts.map +1 -0
  36. package/dist/harness/config.js +18 -0
  37. package/dist/harness/config.js.map +1 -0
  38. package/dist/harness/context.d.ts +27 -0
  39. package/dist/harness/context.d.ts.map +1 -0
  40. package/dist/harness/context.js +109 -0
  41. package/dist/harness/context.js.map +1 -0
  42. package/dist/harness/generation.d.ts +36 -0
  43. package/dist/harness/generation.d.ts.map +1 -0
  44. package/dist/harness/generation.js +266 -0
  45. package/dist/harness/generation.js.map +1 -0
  46. package/dist/harness/harness.d.ts +10 -0
  47. package/dist/harness/harness.d.ts.map +1 -0
  48. package/dist/harness/harness.js +266 -0
  49. package/dist/harness/harness.js.map +1 -0
  50. package/dist/harness/live.d.ts +40 -0
  51. package/dist/harness/live.d.ts.map +1 -0
  52. package/dist/harness/live.js +41 -0
  53. package/dist/harness/live.js.map +1 -0
  54. package/dist/harness/prompt.d.ts +24 -0
  55. package/dist/harness/prompt.d.ts.map +1 -0
  56. package/dist/harness/prompt.js +88 -0
  57. package/dist/harness/prompt.js.map +1 -0
  58. package/dist/harness/registry.d.ts +7 -0
  59. package/dist/harness/registry.d.ts.map +1 -0
  60. package/dist/harness/registry.js +309 -0
  61. package/dist/harness/registry.js.map +1 -0
  62. package/dist/harness/scheduler.d.ts +63 -0
  63. package/dist/harness/scheduler.d.ts.map +1 -0
  64. package/dist/harness/scheduler.js +605 -0
  65. package/dist/harness/scheduler.js.map +1 -0
  66. package/dist/harness/submissions.d.ts +24 -0
  67. package/dist/harness/submissions.d.ts.map +1 -0
  68. package/dist/harness/submissions.js +133 -0
  69. package/dist/harness/submissions.js.map +1 -0
  70. package/dist/harness/types.d.ts +358 -0
  71. package/dist/harness/types.d.ts.map +1 -0
  72. package/dist/harness/types.js +2 -0
  73. package/dist/harness/types.js.map +1 -0
  74. package/dist/harness/util.d.ts +14 -0
  75. package/dist/harness/util.d.ts.map +1 -0
  76. package/dist/harness/util.js +55 -0
  77. package/dist/harness/util.js.map +1 -0
  78. package/dist/ids.d.ts +6 -0
  79. package/dist/ids.d.ts.map +1 -0
  80. package/dist/ids.js +9 -0
  81. package/dist/ids.js.map +1 -0
  82. package/dist/index.d.ts +12 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +10 -0
  85. package/dist/index.js.map +1 -1
  86. package/dist/session/forks.d.ts +10 -0
  87. package/dist/session/forks.d.ts.map +1 -0
  88. package/dist/session/forks.js +42 -0
  89. package/dist/session/forks.js.map +1 -0
  90. package/dist/session/observation.d.ts +28 -0
  91. package/dist/session/observation.d.ts.map +1 -0
  92. package/dist/session/observation.js +280 -0
  93. package/dist/session/observation.js.map +1 -0
  94. package/dist/session/session.d.ts +59 -0
  95. package/dist/session/session.d.ts.map +1 -0
  96. package/dist/session/session.js +380 -0
  97. package/dist/session/session.js.map +1 -0
  98. package/dist/session/transaction.d.ts +105 -0
  99. package/dist/session/transaction.d.ts.map +1 -0
  100. package/dist/session/transaction.js +718 -0
  101. package/dist/session/transaction.js.map +1 -0
  102. package/dist/storage/jsonl/index.d.ts +2 -0
  103. package/dist/storage/jsonl/index.d.ts.map +1 -0
  104. package/dist/storage/jsonl/index.js +2 -0
  105. package/dist/storage/jsonl/index.js.map +1 -0
  106. package/dist/storage/jsonl/node.d.ts +6 -0
  107. package/dist/storage/jsonl/node.d.ts.map +1 -0
  108. package/dist/storage/jsonl/node.js +8 -0
  109. package/dist/storage/jsonl/node.js.map +1 -0
  110. package/dist/storage/jsonl/storage.d.ts +115 -0
  111. package/dist/storage/jsonl/storage.d.ts.map +1 -0
  112. package/dist/storage/jsonl/storage.js +681 -0
  113. package/dist/storage/jsonl/storage.js.map +1 -0
  114. package/dist/storage/memory.d.ts +31 -14
  115. package/dist/storage/memory.d.ts.map +1 -1
  116. package/dist/storage/memory.js +208 -61
  117. package/dist/storage/memory.js.map +1 -1
  118. package/dist/storage/sqlite/database.d.ts +5 -1
  119. package/dist/storage/sqlite/database.d.ts.map +1 -1
  120. package/dist/storage/sqlite/database.js.map +1 -1
  121. package/dist/storage/sqlite/index.d.ts.map +1 -1
  122. package/dist/storage/sqlite/migrations.d.ts +1 -1
  123. package/dist/storage/sqlite/migrations.d.ts.map +1 -1
  124. package/dist/storage/sqlite/migrations.js +8 -1
  125. package/dist/storage/sqlite/migrations.js.map +1 -1
  126. package/dist/storage/sqlite/node.d.ts.map +1 -1
  127. package/dist/storage/sqlite/node.js +2 -2
  128. package/dist/storage/sqlite/node.js.map +1 -1
  129. package/dist/storage/sqlite/storage.d.ts +20 -14
  130. package/dist/storage/sqlite/storage.d.ts.map +1 -1
  131. package/dist/storage/sqlite/storage.js +159 -55
  132. package/dist/storage/sqlite/storage.js.map +1 -1
  133. package/dist/tasks.d.ts +6 -0
  134. package/dist/tasks.d.ts.map +1 -0
  135. package/dist/tasks.js +5 -0
  136. package/dist/tasks.js.map +1 -0
  137. package/dist/testing/assertions.d.ts +5 -0
  138. package/dist/testing/assertions.d.ts.map +1 -0
  139. package/dist/testing/assertions.js +25 -0
  140. package/dist/testing/assertions.js.map +1 -0
  141. package/dist/testing/index.d.ts +6 -0
  142. package/dist/testing/index.d.ts.map +1 -0
  143. package/dist/testing/index.js +5 -0
  144. package/dist/testing/index.js.map +1 -0
  145. package/dist/testing/runner.d.ts +10 -0
  146. package/dist/testing/runner.d.ts.map +1 -0
  147. package/dist/testing/runner.js +14 -0
  148. package/dist/testing/runner.js.map +1 -0
  149. package/dist/testing/storage-benchmark.d.ts +41 -0
  150. package/dist/testing/storage-benchmark.d.ts.map +1 -0
  151. package/dist/testing/storage-benchmark.js +351 -0
  152. package/dist/testing/storage-benchmark.js.map +1 -0
  153. package/dist/testing/storage-conformance.d.ts +4 -0
  154. package/dist/testing/storage-conformance.d.ts.map +1 -0
  155. package/dist/testing/storage-conformance.js +1122 -0
  156. package/dist/testing/storage-conformance.js.map +1 -0
  157. package/dist/testing/types.d.ts +19 -0
  158. package/dist/testing/types.d.ts.map +1 -0
  159. package/dist/testing/types.js +2 -0
  160. package/dist/testing/types.js.map +1 -0
  161. package/dist/types.d.ts +422 -54
  162. package/dist/types.d.ts.map +1 -1
  163. package/dist/types.js.map +1 -1
  164. package/docs/chord-delta-findings.md +1 -1
  165. package/docs/pico-v5-chord-usage.md +47 -60
  166. package/docs/pico-v5-handoff.md +469 -264
  167. package/docs/pico-v5.md +1523 -639
  168. package/package.json +30 -5
@@ -0,0 +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\t(value.payload.value.state.status !== \"pending\" && value.payload.value.state.status !== \"running\")\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,6 +1,13 @@
1
1
  import type { Context, JsonValue } from "@earendil-works/chord";
2
- import type { ConversationRecord, Cursor, DocumentAddress, DocumentPoint, DocumentQuery, DocumentRecord, EntryQuery, EntryRecord, Id, Page, Seq, Storage, StorageWrite, StoredDocument, SubmissionRecord, TaskQuery, TaskRecord } from "../types.ts";
2
+ import type { 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
3
  type StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;
4
+ /** A fully validated, detached state mutation whose application performs no fallible preparation. */
5
+ export interface PreparedMemoryCommit {
6
+ readonly seq: Seq;
7
+ /** Deeply frozen detached writes for persistence. */
8
+ readonly writes: readonly StorageWrite[];
9
+ apply(): Seq;
10
+ }
4
11
  /**
5
12
  * Detached in-memory reference implementation of `Storage`.
6
13
  *
@@ -13,25 +20,35 @@ export declare class MemoryStorage implements Storage {
13
20
  private nextSeq;
14
21
  private closed;
15
22
  commit(writes: readonly StorageWrite[], _context: Context): Promise<Seq>;
16
- mintId(): Promise<Id>;
17
- conversation(id: Id, _context: Context): Promise<ConversationRecord | undefined>;
18
- scanConversations(cursor: Cursor | undefined, limit: number, _context: Context): Promise<Page<ConversationRecord, Cursor>>;
19
- entry(id: Id, _context: Context): Promise<{
23
+ /** Validate and detach one commit without changing observable state. */
24
+ prepareCommit(writes: readonly StorageWrite[], seq?: Seq): PreparedMemoryCommit;
25
+ private resolveDocumentCopies;
26
+ private applyPreparedCommit;
27
+ mintId<I extends Id<string>>(): Promise<I>;
28
+ conversation(id: ConversationId, _context: Context): Promise<ConversationRecord | undefined>;
29
+ scanConversations(query: ConversationQuery, limit: number, cursor: Cursor | undefined, _context: Context): Promise<Page<ConversationRecord, Cursor>>;
30
+ entry(id: EntryId, context: Context): Promise<{
31
+ readonly entry: EntryRecord;
32
+ readonly commitSeq: Seq;
33
+ } | undefined>;
34
+ entry(conversationId: ConversationId, id: EntryId, context: Context): Promise<{
20
35
  readonly entry: EntryRecord;
21
36
  readonly commitSeq: Seq;
22
37
  } | undefined>;
23
- findLatestHeadMarker(conversationId: Id, atOrBeforeEntryId: Id | undefined, _context: Context): Promise<(EntryRecord & {
24
- readonly head: Id;
38
+ findLatestHeadMarker(conversationId: ConversationId, atOrBeforeEntryId: EntryId | undefined, _context: Context): Promise<(EntryRecord & {
39
+ readonly head: EntryId;
25
40
  }) | undefined>;
26
- scanEntries(query: EntryQuery, cursor: Cursor | undefined, limit: number, _context: Context): Promise<Page<EntryRecord, Cursor>>;
27
- task(id: Id, _context: Context): Promise<StoredTask | undefined>;
28
- scanTasks(query: TaskQuery, cursor: Cursor | undefined, limit: number, _context: Context): Promise<Page<StoredTask, Cursor>>;
29
- submission(id: Id, _context: Context): Promise<SubmissionRecord | undefined>;
30
- submissionByRequest(conversationId: Id, requestId: string, _context: Context): Promise<SubmissionRecord | undefined>;
41
+ scanEntries(query: EntryQuery, limit: number, cursor: Cursor | undefined, _context: Context): Promise<Page<EntryRecord, Cursor>>;
42
+ task(id: TaskId, _context: Context): Promise<StoredTask | undefined>;
43
+ scanTasks(query: TaskQuery, limit: number, cursor: Cursor | undefined, _context: Context): Promise<Page<StoredTask, Cursor>>;
44
+ submission(id: SubmissionId, _context: Context): Promise<SubmissionRecord | undefined>;
45
+ scanSubmissions(query: SubmissionQuery, limit: number, cursor: Cursor | undefined, _context: Context): Promise<Page<SubmissionRecord, Cursor>>;
46
+ submissionByRequest(conversationId: ConversationId, requestId: string, _context: Context): Promise<SubmissionRecord | undefined>;
31
47
  findDocument(address: DocumentAddress, at: DocumentPoint, _context: Context): Promise<DocumentRecord | undefined>;
32
- document(id: Id, at: DocumentPoint, _context: Context): Promise<StoredDocument | undefined>;
33
- scanDocuments(query: DocumentQuery, cursor: Cursor | undefined, limit: number, _context: Context): Promise<Page<DocumentRecord, Cursor>>;
48
+ document(id: DocumentId, at: DocumentPoint, _context: Context): Promise<StoredDocument | undefined>;
49
+ scanDocuments(query: DocumentQuery, limit: number, cursor: Cursor | undefined, _context: Context): Promise<Page<DocumentRecord, Cursor>>;
34
50
  close(_context: Context): Promise<void>;
51
+ private materializeDocument;
35
52
  private visibleEntries;
36
53
  private checkGlobalIds;
37
54
  private prepareDocumentActions;
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, JsonValue } from \"@earendil-works/chord\";\nimport { applyImmutable } from \"@earendil-works/chord/delta\";\nimport type {\n\tConversationRecord,\n\tCursor,\n\tDocumentAddress,\n\tDocumentContent,\n\tDocumentCreate,\n\tDocumentPoint,\n\tDocumentQuery,\n\tDocumentRecord,\n\tEntryQuery,\n\tEntryRecord,\n\tId,\n\tJsonObject,\n\tPage,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tStoredDocument,\n\tSubmissionRecord,\n\tTaskQuery,\n\tTaskRecord,\n} from \"../types.ts\";\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\ntype TaskStatus = StoredTask[\"state\"][\"status\"];\ntype TableName = \"conversation\" | \"entry\" | \"task\" | \"submission\" | \"document\";\ntype DocumentRevision = DocumentContent & { readonly seq: Seq };\ntype StoredDocumentState = {\n\trecord: DocumentRecord;\n\trevisions: DocumentRevision[];\n};\ntype DocumentAction = {\n\tcreate?: DocumentCreate;\n\tcontent?: DocumentContent;\n\tretire: boolean;\n};\n\ntype DocumentAddressIndex = {\n\tids: Id[];\n\tcurrentId?: Id;\n};\n\ntype State = {\n\tconversations: Map<Id, ConversationRecord>;\n\tconversationIds: Id[];\n\tentries: Map<Id, EntryRecord>;\n\tentryIds: Map<Id, Id[]>;\n\theadEntryIds: Map<Id, Id[]>;\n\tentryCommitSeqs: Map<Id, Seq>;\n\ttasks: Map<Id, StoredTask>;\n\ttaskIds: Id[];\n\ttaskIdsByStatus: Record<TaskStatus, Id[]>;\n\tsubmissions: Map<Id, SubmissionRecord>;\n\tsubmissionIdsByRequest: Map<Id, Map<string, Id>>;\n\tdocuments: Map<Id, StoredDocumentState>;\n\tdocumentAddresses: Map<string, DocumentAddressIndex>;\n\tdocumentIdsByScope: Map<string, Id[]>;\n};\n\nconst clone = <T>(value: T): T => {\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (Array.isArray(value)) return value.map((item) => clone(item)) as T;\n\tconst source = value as Record<string, unknown>;\n\tconst nullPrototype = Object.getPrototypeOf(value) === null;\n\tconst result = (nullPrototype ? Object.create(null) : {}) as Record<string, unknown>;\n\tfor (const key of Object.keys(source)) {\n\t\tconst copied = clone(source[key]);\n\t\tif (!nullPrototype && key in result) {\n\t\t\tObject.defineProperty(result, key, {\n\t\t\t\tvalue: copied,\n\t\t\t\twritable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t});\n\t\t} else {\n\t\t\tresult[key] = copied;\n\t\t}\n\t}\n\treturn result as T;\n};\n\nconst cursorId = (cursor: Readonly<Record<string, JsonValue>> | undefined): Id | undefined =>\n\tcursor?.after as Id | undefined;\n\nconst lowerBound = (ids: readonly Id[], target: Id): number => {\n\tlet low = 0;\n\tlet high = ids.length;\n\twhile (low < high) {\n\t\tconst middle = (low + high) >>> 1;\n\t\tif (ids[middle] < target) low = middle + 1;\n\t\telse high = middle;\n\t}\n\treturn low;\n};\n\nconst upperBound = (ids: readonly Id[], target: Id): number => {\n\tlet low = 0;\n\tlet high = ids.length;\n\twhile (low < high) {\n\t\tconst middle = (low + high) >>> 1;\n\t\tif (ids[middle] <= target) low = middle + 1;\n\t\telse high = middle;\n\t}\n\treturn low;\n};\n\nconst insertSorted = (ids: Id[], id: Id): void => {\n\tif (ids.length === 0 || ids[ids.length - 1] < id) ids.push(id);\n\telse ids.splice(lowerBound(ids, id), 0, id);\n};\n\nconst removeSorted = (ids: Id[], id: Id): void => {\n\tconst index = lowerBound(ids, id);\n\tif (ids[index] === id) ids.splice(index, 1);\n};\n\nconst scopeKey = (scope: DocumentRecord[\"scope\"]): string => {\n\tswitch (scope.kind) {\n\t\tcase \"session\":\n\t\t\treturn JSON.stringify([\"session\"]);\n\t\tcase \"conversation\":\n\t\t\treturn JSON.stringify([\"conversation\", scope.conversationId]);\n\t\tcase \"task\":\n\t\t\treturn JSON.stringify([\"task\", scope.taskId]);\n\t}\n};\n\nconst addressKey = (address: DocumentAddress): string =>\n\tJSON.stringify([\n\t\taddress.kind,\n\t\tscopeKey(address.scope),\n\t\taddress.key === undefined ? [\"singleton\"] : [\"family\", address.key],\n\t]);\n\nconst recordAddressKey = (record: DocumentRecord | DocumentCreate): string =>\n\taddressKey({ kind: record.kind, scope: record.scope, key: record.key });\n\nconst isAliveAt = (record: DocumentRecord, at: DocumentPoint): boolean => {\n\tif (at === \"current\") return record.retiredAt === undefined;\n\treturn record.createdAt <= at && (record.retiredAt === undefined || at < record.retiredAt);\n};\n\nconst isCurrentOnly = (record: DocumentRecord): boolean =>\n\trecord.scope.kind !== \"conversation\" || record.history === \"latest\";\n\nconst tableContaining = (state: State, id: Id): TableName | undefined => {\n\tif (state.conversations.has(id)) return \"conversation\";\n\tif (state.entries.has(id)) return \"entry\";\n\tif (state.tasks.has(id)) return \"task\";\n\tif (state.submissions.has(id)) return \"submission\";\n\tif (state.documents.has(id)) return \"document\";\n\treturn undefined;\n};\n\nconst page = <T extends { readonly id: Id }>(values: readonly T[], limit: number): Page<T, Cursor> => {\n\tconst items = values.slice(0, limit);\n\tif (values.length <= limit) return { items: clone(items) };\n\treturn { items: clone(items), next: { after: items.at(-1)!.id } };\n};\n\n/**\n * Detached in-memory reference implementation of `Storage`.\n *\n * Reads and retained writes are cloned intentionally to match the ownership boundary\n * of serialization-backed stores. This is backend conformance, not validation.\n */\nexport class MemoryStorage implements Storage {\n\tprivate readonly state: State = {\n\t\tconversations: new Map(),\n\t\tconversationIds: [],\n\t\tentries: new Map(),\n\t\tentryIds: new Map(),\n\t\theadEntryIds: new Map(),\n\t\tentryCommitSeqs: new Map(),\n\t\ttasks: new Map(),\n\t\ttaskIds: [],\n\t\ttaskIdsByStatus: { pending: [], running: [], terminal: [] },\n\t\tsubmissions: new Map(),\n\t\tsubmissionIdsByRequest: new Map(),\n\t\tdocuments: new Map(),\n\t\tdocumentAddresses: new Map(),\n\t\tdocumentIdsByScope: new Map(),\n\t};\n\tprivate nextId = 2;\n\tprivate nextSeq = 1;\n\tprivate closed = false;\n\n\tasync commit(writes: readonly StorageWrite[], _context: Context): Promise<Seq> {\n\t\tthis.assertOpen();\n\t\tconst prepared = writes.map((write) => clone(write));\n\t\tconst seq = this.nextSeq;\n\t\tthis.checkGlobalIds(prepared);\n\t\tconst documentActions = this.prepareDocumentActions(prepared);\n\t\tthis.checkDocumentActions(documentActions);\n\n\t\tfor (const write of prepared) {\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"conversation\":\n\t\t\t\t\tthis.state.conversations.set(write.value.id, write.value);\n\t\t\t\t\tinsertSorted(this.state.conversationIds, write.value.id);\n\t\t\t\t\tthis.nextId = Math.max(this.nextId, write.value.id + 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"entry\": {\n\t\t\t\t\tthis.state.entries.set(write.value.id, write.value);\n\t\t\t\t\tthis.state.entryCommitSeqs.set(write.value.id, seq);\n\t\t\t\t\tlet ids = this.state.entryIds.get(write.value.conversationId);\n\t\t\t\t\tif (ids === undefined) {\n\t\t\t\t\t\tids = [];\n\t\t\t\t\t\tthis.state.entryIds.set(write.value.conversationId, ids);\n\t\t\t\t\t}\n\t\t\t\t\tinsertSorted(ids, write.value.id);\n\t\t\t\t\tif (write.value.head !== undefined) {\n\t\t\t\t\t\tlet headIds = this.state.headEntryIds.get(write.value.conversationId);\n\t\t\t\t\t\tif (headIds === undefined) {\n\t\t\t\t\t\t\theadIds = [];\n\t\t\t\t\t\t\tthis.state.headEntryIds.set(write.value.conversationId, headIds);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinsertSorted(headIds, write.value.id);\n\t\t\t\t\t}\n\t\t\t\t\tthis.nextId = Math.max(this.nextId, write.value.id + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"task\": {\n\t\t\t\t\tconst previous = this.state.tasks.get(write.value.id);\n\t\t\t\t\tif (previous === undefined) {\n\t\t\t\t\t\tinsertSorted(this.state.taskIds, write.value.id);\n\t\t\t\t\t\tinsertSorted(this.state.taskIdsByStatus[write.value.state.status], write.value.id);\n\t\t\t\t\t} else if (previous.state.status !== write.value.state.status) {\n\t\t\t\t\t\tremoveSorted(this.state.taskIdsByStatus[previous.state.status], write.value.id);\n\t\t\t\t\t\tinsertSorted(this.state.taskIdsByStatus[write.value.state.status], write.value.id);\n\t\t\t\t\t}\n\t\t\t\t\tthis.state.tasks.set(write.value.id, write.value);\n\t\t\t\t\tthis.nextId = Math.max(this.nextId, write.value.id + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"submission\": {\n\t\t\t\t\tconst previous = this.state.submissions.get(write.value.id);\n\t\t\t\t\tif (previous?.requestId !== undefined) {\n\t\t\t\t\t\tconst previousRequests = this.state.submissionIdsByRequest.get(previous.conversationId);\n\t\t\t\t\t\tif (previousRequests?.get(previous.requestId) === write.value.id) {\n\t\t\t\t\t\t\tpreviousRequests.delete(previous.requestId);\n\t\t\t\t\t\t\tif (previousRequests.size === 0) this.state.submissionIdsByRequest.delete(previous.conversationId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.state.submissions.set(write.value.id, write.value);\n\t\t\t\t\tif (write.value.requestId !== undefined) {\n\t\t\t\t\t\tlet requests = this.state.submissionIdsByRequest.get(write.value.conversationId);\n\t\t\t\t\t\tif (requests === undefined) {\n\t\t\t\t\t\t\trequests = new Map();\n\t\t\t\t\t\t\tthis.state.submissionIdsByRequest.set(write.value.conversationId, requests);\n\t\t\t\t\t\t}\n\t\t\t\t\t\trequests.set(write.value.requestId, write.value.id);\n\t\t\t\t\t}\n\t\t\t\t\tthis.nextId = Math.max(this.nextId, write.value.id + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"document.create\":\n\t\t\t\tcase \"document.change\":\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.applyDocumentActions(documentActions, seq);\n\t\tthis.nextSeq++;\n\t\treturn seq;\n\t}\n\n\tasync mintId(): Promise<Id> {\n\t\tthis.assertOpen();\n\t\tif (!Number.isSafeInteger(this.nextId)) throw new Error(\"ID space is exhausted\");\n\t\treturn this.nextId++;\n\t}\n\n\tasync conversation(id: Id, _context: Context): Promise<ConversationRecord | undefined> {\n\t\tthis.assertOpen();\n\t\tconst value = this.state.conversations.get(id);\n\t\treturn value === undefined ? undefined : clone(value);\n\t}\n\n\tasync scanConversations(\n\t\tcursor: Cursor | undefined,\n\t\tlimit: number,\n\t\t_context: Context,\n\t): Promise<Page<ConversationRecord, Cursor>> {\n\t\tthis.assertOpen();\n\t\tconst after = cursorId(cursor);\n\t\tconst start = after === undefined ? 0 : upperBound(this.state.conversationIds, after);\n\t\tconst values = this.state.conversationIds\n\t\t\t.slice(start, start + limit + 1)\n\t\t\t.map((id) => this.state.conversations.get(id)!);\n\t\treturn page(values, limit);\n\t}\n\n\tasync entry(\n\t\tid: Id,\n\t\t_context: Context,\n\t): Promise<{ readonly entry: EntryRecord; readonly commitSeq: Seq } | undefined> {\n\t\tthis.assertOpen();\n\t\tconst entry = this.state.entries.get(id);\n\t\tif (entry === undefined) return undefined;\n\t\treturn { entry: clone(entry), commitSeq: this.state.entryCommitSeqs.get(id)! };\n\t}\n\n\tasync findLatestHeadMarker(\n\t\tconversationId: Id,\n\t\tatOrBeforeEntryId: Id | undefined,\n\t\t_context: Context,\n\t): Promise<(EntryRecord & { readonly head: Id }) | undefined> {\n\t\tthis.assertOpen();\n\t\tif (!this.state.conversations.has(conversationId)) {\n\t\t\tthrow new Error(`Unknown conversation: ${conversationId}`);\n\t\t}\n\t\tlet currentId = conversationId;\n\t\tlet upperEntryId = atOrBeforeEntryId ?? Number.POSITIVE_INFINITY;\n\t\twhile (true) {\n\t\t\tconst ids = this.state.headEntryIds.get(currentId) ?? [];\n\t\t\tconst index = upperBound(ids, upperEntryId) - 1;\n\t\t\tif (index >= 0) {\n\t\t\t\tconst entry = this.state.entries.get(ids[index])!;\n\t\t\t\treturn clone({ ...entry, head: entry.head! });\n\t\t\t}\n\t\t\tconst conversation = this.state.conversations.get(currentId)!;\n\t\t\tif (conversation.parent === undefined) return undefined;\n\t\t\tupperEntryId = Math.min(upperEntryId, conversation.parent.at);\n\t\t\tcurrentId = conversation.parent.conversationId;\n\t\t}\n\t}\n\n\tasync scanEntries(\n\t\tquery: EntryQuery,\n\t\tcursor: Cursor | undefined,\n\t\tlimit: number,\n\t\t_context: Context,\n\t): Promise<Page<EntryRecord, Cursor>> {\n\t\tthis.assertOpen();\n\t\tconst after = cursorId(cursor);\n\t\tconst maxEntryId =\n\t\t\tafter === undefined ? query.maxEntryId : Math.min(query.maxEntryId ?? Number.POSITIVE_INFINITY, after - 1);\n\t\tconst visible: EntryRecord[] = [];\n\t\tfor (const entry of this.visibleEntries(query.conversationId, query.minEntryId, maxEntryId)) {\n\t\t\tvisible.push(entry);\n\t\t\tif (visible.length > limit) break;\n\t\t}\n\t\treturn page(visible, limit);\n\t}\n\n\tasync task(id: Id, _context: Context): Promise<StoredTask | undefined> {\n\t\tthis.assertOpen();\n\t\tconst value = this.state.tasks.get(id);\n\t\treturn value === undefined ? undefined : clone(value);\n\t}\n\n\tasync scanTasks(\n\t\tquery: TaskQuery,\n\t\tcursor: Cursor | undefined,\n\t\tlimit: number,\n\t\t_context: Context,\n\t): Promise<Page<StoredTask, Cursor>> {\n\t\tthis.assertOpen();\n\t\tconst after = cursorId(cursor);\n\t\tconst ids = query.status === undefined ? this.state.taskIds : this.state.taskIdsByStatus[query.status];\n\t\tconst start = after === undefined ? 0 : upperBound(ids, after);\n\t\tconst values: StoredTask[] = [];\n\t\tfor (let index = start; index < ids.length && values.length <= limit; index++) {\n\t\t\tconst value = this.state.tasks.get(ids[index])!;\n\t\t\tif (query.conversationId !== undefined && value.conversationId !== query.conversationId) continue;\n\t\t\tif (query.kind !== undefined && value.kind !== query.kind) continue;\n\t\t\tif (query.abortRequested !== undefined && value.abortRequested !== query.abortRequested) continue;\n\t\t\tif (query.background !== undefined && value.background !== query.background) continue;\n\t\t\tvalues.push(value);\n\t\t}\n\t\treturn page(values, limit);\n\t}\n\n\tasync submission(id: Id, _context: Context): Promise<SubmissionRecord | undefined> {\n\t\tthis.assertOpen();\n\t\tconst value = this.state.submissions.get(id);\n\t\treturn value === undefined ? undefined : clone(value);\n\t}\n\n\tasync submissionByRequest(\n\t\tconversationId: Id,\n\t\trequestId: string,\n\t\t_context: Context,\n\t): Promise<SubmissionRecord | undefined> {\n\t\tthis.assertOpen();\n\t\tconst id = this.state.submissionIdsByRequest.get(conversationId)?.get(requestId);\n\t\tif (id === undefined) return undefined;\n\t\treturn clone(this.state.submissions.get(id)!);\n\t}\n\n\tasync findDocument(\n\t\taddress: DocumentAddress,\n\t\tat: DocumentPoint,\n\t\t_context: Context,\n\t): Promise<DocumentRecord | undefined> {\n\t\tthis.assertOpen();\n\t\tconst index = this.state.documentAddresses.get(addressKey(address));\n\t\tif (at === \"current\") {\n\t\t\treturn index?.currentId === undefined ? undefined : clone(this.state.documents.get(index.currentId)!.record);\n\t\t}\n\t\tfor (const id of index?.ids ?? []) {\n\t\t\tconst record = this.state.documents.get(id)!.record;\n\t\t\tif (isAliveAt(record, at)) return clone(record);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tasync document(id: Id, at: DocumentPoint, _context: Context): Promise<StoredDocument | undefined> {\n\t\tthis.assertOpen();\n\t\tconst stored = this.state.documents.get(id);\n\t\tif (stored === undefined) return undefined;\n\t\tif (at !== \"current\" && isCurrentOnly(stored.record)) {\n\t\t\tthrow new Error(`Document ${id} does not retain historical content`);\n\t\t}\n\t\tif (!isAliveAt(stored.record, at)) return undefined;\n\t\tconst revisions = at === \"current\" ? stored.revisions : stored.revisions.filter((revision) => revision.seq <= at);\n\t\tlet baseIndex = revisions.length - 1;\n\t\twhile (baseIndex >= 0 && revisions[baseIndex]!.kind !== \"base\") baseIndex--;\n\t\tconst base = revisions[baseIndex];\n\t\tif (base?.kind !== \"base\") throw new Error(`Document ${id} is missing a required base`);\n\t\tlet value = base.value;\n\t\tfor (let index = baseIndex + 1; index < revisions.length; index++) {\n\t\t\tconst revision = revisions[index]!;\n\t\t\tif (revision.kind !== \"delta\" || revision.version !== base.version) {\n\t\t\t\tthrow new Error(`Document ${id} crosses a stored version boundary without a base`);\n\t\t\t}\n\t\t\tvalue = applyImmutable(value, revision.ops) as JsonObject;\n\t\t}\n\t\treturn { record: clone(stored.record), version: base.version, value: clone(value) };\n\t}\n\n\tasync scanDocuments(\n\t\tquery: DocumentQuery,\n\t\tcursor: Cursor | undefined,\n\t\tlimit: number,\n\t\t_context: Context,\n\t): Promise<Page<DocumentRecord, Cursor>> {\n\t\tthis.assertOpen();\n\t\tconst ids = this.state.documentIdsByScope.get(scopeKey(query.scope)) ?? [];\n\t\tconst after = cursorId(cursor);\n\t\tconst start = after === undefined ? 0 : upperBound(ids, after);\n\t\tconst values: DocumentRecord[] = [];\n\t\tfor (let index = start; index < ids.length && values.length <= limit; index++) {\n\t\t\tconst record = this.state.documents.get(ids[index]!)!.record;\n\t\t\tif (query.kind !== undefined && record.kind !== query.kind) continue;\n\t\t\tif (isAliveAt(record, query.at)) values.push(record);\n\t\t}\n\t\treturn page(values, limit);\n\t}\n\n\tasync close(_context: Context): Promise<void> {\n\t\tthis.closed = true;\n\t}\n\n\tprivate *visibleEntries(\n\t\tconversationId: Id,\n\t\tminEntryId = Number.NEGATIVE_INFINITY,\n\t\tmaxEntryId = Number.POSITIVE_INFINITY,\n\t): Generator<EntryRecord> {\n\t\tif (!this.state.conversations.has(conversationId)) {\n\t\t\tthrow new Error(`Unknown conversation: ${conversationId}`);\n\t\t}\n\t\tlet currentId = conversationId;\n\t\tlet upperEntryId = maxEntryId;\n\t\twhile (true) {\n\t\t\tconst ids = this.state.entryIds.get(currentId) ?? [];\n\t\t\tfor (let index = upperBound(ids, upperEntryId) - 1; index >= 0; index--) {\n\t\t\t\tconst id = ids[index];\n\t\t\t\tif (id < minEntryId) break;\n\t\t\t\tyield this.state.entries.get(id)!;\n\t\t\t}\n\t\t\tconst conversation = this.state.conversations.get(currentId)!;\n\t\t\tif (conversation.parent === undefined) break;\n\t\t\tupperEntryId = Math.min(upperEntryId, conversation.parent.at);\n\t\t\tif (upperEntryId < minEntryId) break;\n\t\t\tcurrentId = conversation.parent.conversationId;\n\t\t}\n\t}\n\n\tprivate checkGlobalIds(writes: readonly StorageWrite[]): void {\n\t\tconst claimed = new Map<Id, TableName>();\n\t\tfor (const write of writes) {\n\t\t\tif (write.type === \"document.change\" || write.type === \"document.retire\") continue;\n\t\t\tconst table: TableName = write.type === \"document.create\" ? \"document\" : write.type;\n\t\t\tconst id = write.type === \"document.create\" ? write.record.id : write.value.id;\n\t\t\tconst existing = tableContaining(this.state, id);\n\t\t\tconst earlier = claimed.get(id);\n\t\t\tif (table === \"conversation\" || table === \"entry\" || table === \"document\") {\n\t\t\t\tif (existing !== undefined) throw new Error(`ID ${id} already belongs to ${existing}`);\n\t\t\t\tif (earlier !== undefined) throw new Error(`ID ${id} is written more than once`);\n\t\t\t} else {\n\t\t\t\tif (existing !== undefined && existing !== table) {\n\t\t\t\t\tthrow new Error(`ID ${id} already belongs to ${existing}`);\n\t\t\t\t}\n\t\t\t\tif (earlier !== undefined && earlier !== table) throw new Error(`ID ${id} is written as two record types`);\n\t\t\t}\n\t\t\tclaimed.set(id, table);\n\t\t}\n\t}\n\n\tprivate prepareDocumentActions(writes: readonly StorageWrite[]): Map<Id, DocumentAction> {\n\t\tconst actions = new Map<Id, DocumentAction>();\n\t\tfor (const write of writes) {\n\t\t\tif (write.type !== \"document.create\" && write.type !== \"document.change\" && write.type !== \"document.retire\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst id = write.type === \"document.create\" ? write.record.id : write.id;\n\t\t\tlet action = actions.get(id);\n\t\t\tif (action === undefined) {\n\t\t\t\taction = { retire: false };\n\t\t\t\tactions.set(id, action);\n\t\t\t}\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"document.create\":\n\t\t\t\t\tif (action.create !== undefined || action.content !== undefined) {\n\t\t\t\t\t\tthrow new Error(`Document ${id} has more than one content command`);\n\t\t\t\t\t}\n\t\t\t\t\taction.create = write.record;\n\t\t\t\t\taction.content = write.content;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.change\":\n\t\t\t\t\tif (action.content !== undefined) throw new Error(`Document ${id} has more than one content command`);\n\t\t\t\t\taction.content = write.content;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tif (action.retire) throw new Error(`Document ${id} is retired more than once`);\n\t\t\t\t\taction.retire = true;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn actions;\n\t}\n\n\tprivate checkDocumentActions(actions: ReadonlyMap<Id, DocumentAction>): void {\n\t\tconst liveCounts = new Map<string, number>();\n\t\tfor (const [id, action] of actions) {\n\t\t\tconst existing = this.state.documents.get(id);\n\t\t\tif (action.create === undefined && existing === undefined) throw new Error(`Unknown document: ${id}`);\n\t\t\tif (action.create !== undefined && existing !== undefined) throw new Error(`Document ${id} already exists`);\n\t\t\tif (existing?.record.retiredAt !== undefined) throw new Error(`Document ${id} is retired`);\n\t\t\tif (action.create !== undefined && action.content?.kind !== \"base\") {\n\t\t\t\tthrow new Error(`Document ${id} creation requires a base`);\n\t\t\t}\n\t\t\tconst previous = existing?.revisions.at(-1);\n\t\t\tif (action.content?.kind === \"delta\") {\n\t\t\t\tif (previous === undefined) throw new Error(`Document ${id} delta has no base`);\n\t\t\t\tif (previous.version !== action.content.version) {\n\t\t\t\t\tthrow new Error(`Document ${id} version transition requires a base`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst key = action.create === undefined ? recordAddressKey(existing!.record) : recordAddressKey(action.create);\n\t\t\tconst currentId = this.state.documentAddresses.get(key)?.currentId;\n\t\t\tlet live = liveCounts.get(key);\n\t\t\tif (live === undefined) live = currentId === undefined ? 0 : 1;\n\t\t\tif (action.retire && currentId === id) live--;\n\t\t\tif (action.create !== undefined && !action.retire) live++;\n\t\t\tliveCounts.set(key, live);\n\t\t}\n\n\t\tfor (const live of liveCounts.values()) {\n\t\t\tif (live > 1) throw new Error(`Document address already has a current incarnation`);\n\t\t}\n\t}\n\n\tprivate applyDocumentActions(actions: ReadonlyMap<Id, DocumentAction>, seq: Seq): void {\n\t\tfor (const [id, action] of actions) {\n\t\t\tlet stored = this.state.documents.get(id);\n\t\t\tif (action.create !== undefined) {\n\t\t\t\tconst record: DocumentRecord = {\n\t\t\t\t\t...action.create,\n\t\t\t\t\tcreatedAt: seq,\n\t\t\t\t\t...(action.retire ? { retiredAt: seq } : {}),\n\t\t\t\t};\n\t\t\t\tstored = { record, revisions: [{ ...action.content!, seq }] };\n\t\t\t\tthis.state.documents.set(id, stored);\n\n\t\t\t\tconst key = recordAddressKey(record);\n\t\t\t\tlet address = this.state.documentAddresses.get(key);\n\t\t\t\tif (address === undefined) {\n\t\t\t\t\taddress = { ids: [] };\n\t\t\t\t\tthis.state.documentAddresses.set(key, address);\n\t\t\t\t}\n\t\t\t\tinsertSorted(address.ids, id);\n\n\t\t\t\tlet scopeIds = this.state.documentIdsByScope.get(scopeKey(record.scope));\n\t\t\t\tif (scopeIds === undefined) {\n\t\t\t\t\tscopeIds = [];\n\t\t\t\t\tthis.state.documentIdsByScope.set(scopeKey(record.scope), scopeIds);\n\t\t\t\t}\n\t\t\t\tinsertSorted(scopeIds, id);\n\t\t\t\tthis.nextId = Math.max(this.nextId, id + 1);\n\t\t\t} else if (action.content !== undefined) {\n\t\t\t\tconst revision = { ...action.content, seq } as DocumentRevision;\n\t\t\t\tif (revision.kind === \"base\" && isCurrentOnly(stored!.record)) stored!.revisions = [revision];\n\t\t\t\telse stored!.revisions.push(revision);\n\t\t\t}\n\n\t\t\tif (action.retire && action.create === undefined) stored!.record = { ...stored!.record, retiredAt: seq };\n\t\t\tif (action.retire && isCurrentOnly(stored!.record)) stored!.revisions = [];\n\t\t\tif (action.create !== undefined || action.retire) {\n\t\t\t\tconst address = this.state.documentAddresses.get(recordAddressKey(stored!.record))!;\n\t\t\t\tif (action.retire && address.currentId === id) delete address.currentId;\n\t\t\t\tif (action.create !== undefined && !action.retire) address.currentId = id;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.closed) throw new Error(\"MemoryStorage is closed\");\n\t}\n}\n"]}
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,EACJ,GAAG,EACH,OAAO,EACP,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,UAAU,EACV,MAAM,aAAa,CAAC;AAErB,KAAK,UAAU,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AA0K9D,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;IAwC7B,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,CAWpC;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,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,sBAAsB;IAiC9B,OAAO,CAAC,oBAAoB;IA6B5B,OAAO,CAAC,oBAAoB;IA4C5B,OAAO,CAAC,UAAU;CAGlB"}