@earendil-works/pi-durable 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +17 -4
  3. package/dist/codemode/codemode.d.ts +2 -1
  4. package/dist/codemode/codemode.d.ts.map +1 -1
  5. package/dist/codemode/codemode.js +1 -37
  6. package/dist/codemode/codemode.js.map +1 -1
  7. package/dist/codemode/models.d.ts +2 -1
  8. package/dist/codemode/models.d.ts.map +1 -1
  9. package/dist/codemode/models.js.map +1 -1
  10. package/dist/documents.d.ts +1 -1
  11. package/dist/documents.d.ts.map +1 -1
  12. package/dist/documents.js +1 -1
  13. package/dist/documents.js.map +1 -1
  14. package/dist/entries.d.ts +1 -1
  15. package/dist/entries.d.ts.map +1 -1
  16. package/dist/entries.js.map +1 -1
  17. package/dist/env/index.d.ts +1 -1
  18. package/dist/env/index.d.ts.map +1 -1
  19. package/dist/env/index.js.map +1 -1
  20. package/dist/env/node-watch.d.ts +1 -1
  21. package/dist/env/node-watch.d.ts.map +1 -1
  22. package/dist/env/node-watch.js.map +1 -1
  23. package/dist/env/node.d.ts +1 -1
  24. package/dist/env/node.d.ts.map +1 -1
  25. package/dist/env/node.js.map +1 -1
  26. package/dist/harness/agent.d.ts.map +1 -1
  27. package/dist/harness/agent.js +27 -1
  28. package/dist/harness/agent.js.map +1 -1
  29. package/dist/harness/compaction.d.ts +8 -3
  30. package/dist/harness/compaction.d.ts.map +1 -1
  31. package/dist/harness/compaction.js +21 -9
  32. package/dist/harness/compaction.js.map +1 -1
  33. package/dist/harness/context.d.ts +1 -1
  34. package/dist/harness/context.d.ts.map +1 -1
  35. package/dist/harness/context.js.map +1 -1
  36. package/dist/harness/define.d.ts +1 -1
  37. package/dist/harness/define.d.ts.map +1 -1
  38. package/dist/harness/define.js.map +1 -1
  39. package/dist/harness/generation.d.ts +1 -1
  40. package/dist/harness/generation.d.ts.map +1 -1
  41. package/dist/harness/generation.js +6 -4
  42. package/dist/harness/generation.js.map +1 -1
  43. package/dist/harness/harness.d.ts +1 -1
  44. package/dist/harness/harness.d.ts.map +1 -1
  45. package/dist/harness/harness.js.map +1 -1
  46. package/dist/harness/inbox.d.ts +2 -1
  47. package/dist/harness/inbox.d.ts.map +1 -1
  48. package/dist/harness/inbox.js +1 -1
  49. package/dist/harness/inbox.js.map +1 -1
  50. package/dist/harness/json.d.ts +1 -1
  51. package/dist/harness/json.d.ts.map +1 -1
  52. package/dist/harness/json.js.map +1 -1
  53. package/dist/harness/live.d.ts +2 -1
  54. package/dist/harness/live.d.ts.map +1 -1
  55. package/dist/harness/live.js.map +1 -1
  56. package/dist/harness/partial-changes.d.ts +1 -1
  57. package/dist/harness/partial-changes.d.ts.map +1 -1
  58. package/dist/harness/partial-changes.js +1 -0
  59. package/dist/harness/partial-changes.js.map +1 -1
  60. package/dist/harness/prompt.d.ts +1 -1
  61. package/dist/harness/prompt.d.ts.map +1 -1
  62. package/dist/harness/prompt.js.map +1 -1
  63. package/dist/harness/provider.d.ts +1 -1
  64. package/dist/harness/provider.d.ts.map +1 -1
  65. package/dist/harness/provider.js.map +1 -1
  66. package/dist/harness/registry-reader.d.ts +1 -1
  67. package/dist/harness/registry-reader.d.ts.map +1 -1
  68. package/dist/harness/registry-reader.js.map +1 -1
  69. package/dist/harness/scheduler.d.ts +2 -1
  70. package/dist/harness/scheduler.d.ts.map +1 -1
  71. package/dist/harness/scheduler.js +42 -13
  72. package/dist/harness/scheduler.js.map +1 -1
  73. package/dist/harness/submissions.d.ts +1 -1
  74. package/dist/harness/submissions.d.ts.map +1 -1
  75. package/dist/harness/submissions.js +1 -1
  76. package/dist/harness/submissions.js.map +1 -1
  77. package/dist/harness/task-graph.d.ts +3 -1
  78. package/dist/harness/task-graph.d.ts.map +1 -1
  79. package/dist/harness/task-graph.js +1 -1
  80. package/dist/harness/task-graph.js.map +1 -1
  81. package/dist/harness/tool.d.ts +1 -1
  82. package/dist/harness/tool.d.ts.map +1 -1
  83. package/dist/harness/tool.js +1 -1
  84. package/dist/harness/tool.js.map +1 -1
  85. package/dist/harness/transcript.d.ts +1 -1
  86. package/dist/harness/transcript.d.ts.map +1 -1
  87. package/dist/harness/transcript.js.map +1 -1
  88. package/dist/harness/types.d.ts +21 -4
  89. package/dist/harness/types.d.ts.map +1 -1
  90. package/dist/harness/types.js.map +1 -1
  91. package/dist/harness/usage.d.ts +2 -1
  92. package/dist/harness/usage.d.ts.map +1 -1
  93. package/dist/harness/usage.js +1 -1
  94. package/dist/harness/usage.js.map +1 -1
  95. package/dist/harness/util.d.ts +1 -1
  96. package/dist/harness/util.d.ts.map +1 -1
  97. package/dist/harness/util.js.map +1 -1
  98. package/dist/harness/view.d.ts +2 -1
  99. package/dist/harness/view.d.ts.map +1 -1
  100. package/dist/harness/view.js +1 -1
  101. package/dist/harness/view.js.map +1 -1
  102. package/dist/index.d.ts +1 -1
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js.map +1 -1
  105. package/dist/session/cached-storage.d.ts +2 -1
  106. package/dist/session/cached-storage.d.ts.map +1 -1
  107. package/dist/session/cached-storage.js.map +1 -1
  108. package/dist/session/forks.d.ts +1 -1
  109. package/dist/session/forks.d.ts.map +1 -1
  110. package/dist/session/forks.js.map +1 -1
  111. package/dist/session/keys.d.ts +2 -1
  112. package/dist/session/keys.d.ts.map +1 -1
  113. package/dist/session/keys.js.map +1 -1
  114. package/dist/session/session.d.ts +3 -1
  115. package/dist/session/session.d.ts.map +1 -1
  116. package/dist/session/session.js +1 -1
  117. package/dist/session/session.js.map +1 -1
  118. package/dist/session/transaction.d.ts +4 -3
  119. package/dist/session/transaction.d.ts.map +1 -1
  120. package/dist/session/transaction.js +3 -3
  121. package/dist/session/transaction.js.map +1 -1
  122. package/dist/session/writer.d.ts +1 -1
  123. package/dist/session/writer.d.ts.map +1 -1
  124. package/dist/session/writer.js.map +1 -1
  125. package/dist/storage/indexeddb.d.ts +2 -1
  126. package/dist/storage/indexeddb.d.ts.map +1 -1
  127. package/dist/storage/indexeddb.js.map +1 -1
  128. package/dist/storage/jsonl/index.d.ts +1 -1
  129. package/dist/storage/jsonl/index.d.ts.map +1 -1
  130. package/dist/storage/jsonl/index.js +1 -1
  131. package/dist/storage/jsonl/index.js.map +1 -1
  132. package/dist/storage/jsonl/node.d.ts +3 -3
  133. package/dist/storage/jsonl/node.d.ts.map +1 -1
  134. package/dist/storage/jsonl/node.js +2 -2
  135. package/dist/storage/jsonl/node.js.map +1 -1
  136. package/dist/storage/jsonl/storage.d.ts +32 -3
  137. package/dist/storage/jsonl/storage.d.ts.map +1 -1
  138. package/dist/storage/jsonl/storage.js +70 -19
  139. package/dist/storage/jsonl/storage.js.map +1 -1
  140. package/dist/storage/memory.d.ts +2 -1
  141. package/dist/storage/memory.d.ts.map +1 -1
  142. package/dist/storage/memory.js.map +1 -1
  143. package/dist/storage/sqlite/commit.d.ts +52 -0
  144. package/dist/storage/sqlite/commit.d.ts.map +1 -0
  145. package/dist/storage/sqlite/commit.js +371 -0
  146. package/dist/storage/sqlite/commit.js.map +1 -0
  147. package/dist/storage/sqlite/rows.d.ts +33 -0
  148. package/dist/storage/sqlite/rows.d.ts.map +1 -0
  149. package/dist/storage/sqlite/rows.js +53 -0
  150. package/dist/storage/sqlite/rows.js.map +1 -0
  151. package/dist/storage/sqlite/statements.d.ts +13 -0
  152. package/dist/storage/sqlite/statements.d.ts.map +1 -0
  153. package/dist/storage/sqlite/statements.js +88 -0
  154. package/dist/storage/sqlite/statements.js.map +1 -0
  155. package/dist/storage/sqlite/storage.d.ts +12 -11
  156. package/dist/storage/sqlite/storage.d.ts.map +1 -1
  157. package/dist/storage/sqlite/storage.js +44 -259
  158. package/dist/storage/sqlite/storage.js.map +1 -1
  159. package/dist/storage/store/commit.d.ts +2 -2
  160. package/dist/storage/store/commit.d.ts.map +1 -1
  161. package/dist/storage/store/commit.js +1 -1
  162. package/dist/storage/store/commit.js.map +1 -1
  163. package/dist/storage/store/documents.d.ts +1 -1
  164. package/dist/storage/store/documents.d.ts.map +1 -1
  165. package/dist/storage/store/documents.js +1 -1
  166. package/dist/storage/store/documents.js.map +1 -1
  167. package/dist/storage/store/queries.d.ts +2 -2
  168. package/dist/storage/store/queries.d.ts.map +1 -1
  169. package/dist/storage/store/queries.js.map +1 -1
  170. package/dist/storage/store/storage.d.ts +3 -2
  171. package/dist/storage/store/storage.d.ts.map +1 -1
  172. package/dist/storage/store/storage.js +1 -1
  173. package/dist/storage/store/storage.js.map +1 -1
  174. package/dist/storage/store/tables.d.ts +31 -31
  175. package/dist/storage/store/tables.d.ts.map +1 -1
  176. package/dist/storage/store/tables.js +1 -1
  177. package/dist/storage/store/tables.js.map +1 -1
  178. package/dist/testing/commit-writes.d.ts +1 -1
  179. package/dist/testing/commit-writes.d.ts.map +1 -1
  180. package/dist/testing/commit-writes.js.map +1 -1
  181. package/dist/testing/env-conformance.js.map +1 -1
  182. package/dist/testing/storage-benchmark.js.map +1 -1
  183. package/dist/testing/storage-conformance.js.map +1 -1
  184. package/dist/tool-search/tool-search.d.ts +2 -2
  185. package/dist/tool-search/tool-search.d.ts.map +1 -1
  186. package/dist/tool-search/tool-search.js +18 -6
  187. package/dist/tool-search/tool-search.js.map +1 -1
  188. package/dist/tools/bash.d.ts +1 -1
  189. package/dist/tools/bash.d.ts.map +1 -1
  190. package/dist/tools/bash.js.map +1 -1
  191. package/dist/tools/file-mutation-queue.d.ts +1 -1
  192. package/dist/tools/file-mutation-queue.d.ts.map +1 -1
  193. package/dist/tools/file-mutation-queue.js.map +1 -1
  194. package/dist/tools/path-utils.d.ts +1 -1
  195. package/dist/tools/path-utils.d.ts.map +1 -1
  196. package/dist/tools/path-utils.js.map +1 -1
  197. package/dist/tools/read.js.map +1 -1
  198. package/dist/types.d.ts +6 -2
  199. package/dist/types.d.ts.map +1 -1
  200. package/dist/types.js.map +1 -1
  201. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"indexeddb.js","sourceRoot":"","sources":["../../src/storage/indexeddb.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference lib=\"dom\" />\n\nimport type { Context, JsonValue } from \"@earendil-works/chord\";\nimport { apply, type Op } from \"@earendil-works/chord/delta\";\nimport { StorageRequestError } from \"../errors.ts\";\nimport { idFromNumber, seqFromNumber } from \"../ids.ts\";\nimport type {\n\tCommitResult,\n\tConversationId,\n\tConversationQuery,\n\tConversationRecord,\n\tCursor,\n\tDocumentAddress,\n\tDocumentContent,\n\tDocumentCreate,\n\tDocumentId,\n\tDocumentPoint,\n\tDocumentQuery,\n\tDocumentRecord,\n\tEntryId,\n\tEntryQuery,\n\tEntryRecord,\n\tId,\n\tJsonObject,\n\tPage,\n\tScanOrder,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tStoredDocument,\n\tSubmissionId,\n\tSubmissionQuery,\n\tSubmissionRecord,\n\tTaskId,\n\tTaskQuery,\n\tTaskRecord,\n} from \"../types.ts\";\nimport { nextCursor, type ScanStart, scanStart } from \"./scan.ts\";\n\nconst DATABASE_VERSION = 1;\nconst MAX_KEY = Number.MAX_SAFE_INTEGER;\nconst META_KEY = \"state\";\n\nconst STORES = {\n\tmeta: \"meta\",\n\trecordIds: \"record_ids\",\n\tconversations: \"conversations\",\n\tentries: \"entries\",\n\ttasks: \"tasks\",\n\tsubmissions: \"submissions\",\n\tdocuments: \"documents\",\n\tdocumentRevisions: \"document_revisions\",\n} as const;\n\nconst ALL_STORES = Object.values(STORES);\n\nconst INDEXES = {\n\tconversationsByOwnerConversation: \"conversations_by_owner_conversation\",\n\tconversationsByOwnerTask: \"conversations_by_owner_task\",\n\tentriesByConversation: \"entries_by_conversation\",\n\tentryHeadsByConversation: \"entry_heads_by_conversation\",\n\ttasksByStatus: \"tasks_by_status\",\n\ttasksByConversation: \"tasks_by_conversation\",\n\ttasksByKind: \"tasks_by_kind\",\n\ttasksByAbortRequested: \"tasks_by_abort_requested\",\n\ttasksByBackground: \"tasks_by_background\",\n\tsubmissionsByRequest: \"submissions_by_request\",\n\tsubmissionsByConversation: \"submissions_by_conversation\",\n\tsubmissionsByStatus: \"submissions_by_status\",\n\tdocumentsByAddress: \"documents_by_address\",\n\tdocumentsByScope: \"documents_by_scope\",\n\tdocumentsByScopeKind: \"documents_by_scope_kind\",\n\tdocumentRevisionsByKind: \"document_revisions_by_kind\",\n} as const;\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\ntype TableName = \"conversation\" | \"entry\" | \"task\" | \"submission\" | \"document\";\ntype DocumentAction = {\n\tcreate?: DocumentCreate;\n\tcopy?: Extract<StorageWrite, { readonly type: \"document.copy\" }>[\"source\"];\n\tcontent?: DocumentContent;\n\tretire: boolean;\n};\ntype ScopeColumns = {\n\treadonly scopeKind: DocumentRecord[\"scope\"][\"kind\"];\n\treadonly ownerId: number;\n};\ntype MetaRow = { readonly key: typeof META_KEY; readonly nextId: number; readonly nextSeq: number };\ntype RecordIdRow = { readonly id: number; readonly recordType: TableName };\ntype ConversationRow = {\n\treadonly id: ConversationId;\n\treadonly ownerConversationId?: ConversationId;\n\treadonly ownerTaskId?: TaskId;\n\treadonly record: ConversationRecord;\n};\ntype EntryRow = {\n\treadonly id: EntryId;\n\treadonly conversationId: ConversationId;\n\treadonly headConversationId?: ConversationId;\n\treadonly commitSeq: Seq;\n\treadonly record: EntryRecord;\n};\ntype TaskRow = {\n\treadonly id: TaskId;\n\treadonly conversationId: ConversationId;\n\treadonly kind: string;\n\treadonly status: StoredTask[\"state\"][\"status\"];\n\treadonly abortRequested: 0 | 1;\n\treadonly background: 0 | 1;\n\treadonly record: StoredTask;\n};\ntype SubmissionRow = {\n\treadonly id: SubmissionId;\n\treadonly conversationId: ConversationId;\n\treadonly requestId?: string;\n\treadonly status: SubmissionRecord[\"status\"];\n\treadonly record: SubmissionRecord;\n};\ntype DocumentRow = {\n\treadonly id: DocumentId;\n\treadonly kind: string;\n\treadonly family: 0 | 1;\n\treadonly keyValue: string;\n\treadonly scopeKind: DocumentRecord[\"scope\"][\"kind\"];\n\treadonly ownerId: number;\n\treadonly createdAt: Seq;\n\treadonly retiredAt?: Seq;\n\treadonly record: DocumentRecord;\n};\ntype RevisionRow = {\n\treadonly documentId: DocumentId;\n\treadonly seq: Seq;\n\treadonly kind: DocumentContent[\"kind\"];\n\treadonly version: number;\n\treadonly content: JsonObject | readonly Op[];\n};\n\ntype IndexedDbStorageOptions = {\n\treadonly indexedDB?: IDBFactory;\n};\n\n/** A failure IndexedDB reported without an error of its own: the database's, like every `DOMException` it throws. */\nclass IndexedDbFailure extends Error {}\n\n/**\n * Whether `error`, or an error it was caused by (a copy's rejection wraps its cause), is IndexedDB's own: a\n * `DOMException`, or a failure it reported without one. Any other error of a batch's checks is one of Durable's.\n */\nfunction fromIndexedDb(error: unknown): boolean {\n\tconst seen = new Set<unknown>();\n\tfor (let at: unknown = error; at !== null && typeof at === \"object\" && !seen.has(at); ) {\n\t\tif (at instanceof DOMException || at instanceof IndexedDbFailure) return true;\n\t\tseen.add(at);\n\t\tat = (at as { cause?: unknown }).cause;\n\t}\n\treturn false;\n}\n\nconst requestResult = <T>(request: IDBRequest<T>): Promise<T> =>\n\tnew Promise<T>((resolve, reject) => {\n\t\trequest.addEventListener(\"success\", () => resolve(request.result), { once: true });\n\t\trequest.addEventListener(\n\t\t\t\"error\",\n\t\t\t() => reject(request.error ?? new IndexedDbFailure(\"IndexedDB request failed\")),\n\t\t\t{\n\t\t\t\tonce: true,\n\t\t\t},\n\t\t);\n\t});\n\nconst transactionResult = (transaction: IDBTransaction): Promise<void> =>\n\tnew Promise<void>((resolve, reject) => {\n\t\ttransaction.addEventListener(\"complete\", () => resolve(), { once: true });\n\t\ttransaction.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => reject(transaction.error ?? new IndexedDbFailure(\"IndexedDB transaction was aborted\")),\n\t\t\t{ once: true },\n\t\t);\n\t\ttransaction.addEventListener(\n\t\t\t\"error\",\n\t\t\t() => reject(transaction.error ?? new IndexedDbFailure(\"IndexedDB transaction failed\")),\n\t\t\t{ once: true },\n\t\t);\n\t});\n\nconst keyRanges = (): typeof IDBKeyRange => {\n\tif (typeof IDBKeyRange === \"undefined\") throw new Error(\"IndexedDB key ranges are not available\");\n\treturn IDBKeyRange;\n};\n\nconst cursorValues = <T>(\n\tsource: IDBObjectStore | IDBIndex,\n\trange: IDBKeyRange | IDBValidKey | null,\n\tdirection: IDBCursorDirection,\n\tlimit: number,\n\taccept: (value: T) => boolean = () => true,\n): Promise<T[]> =>\n\tnew Promise<T[]>((resolve, reject) => {\n\t\tconst values: T[] = [];\n\t\tconst request = source.openCursor(range, direction);\n\t\trequest.addEventListener(\n\t\t\t\"error\",\n\t\t\t() => reject(request.error ?? new IndexedDbFailure(\"IndexedDB cursor failed\")),\n\t\t\t{\n\t\t\t\tonce: true,\n\t\t\t},\n\t\t);\n\t\trequest.addEventListener(\"success\", () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor === null) {\n\t\t\t\tresolve(values);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst value = cursor.value as T;\n\t\t\tif (accept(value)) values.push(value);\n\t\t\tif (values.length >= limit) {\n\t\t\t\tresolve(values);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcursor.continue();\n\t\t});\n\t});\n\nconst firstCursorValue = <T>(\n\tsource: IDBObjectStore | IDBIndex,\n\trange: IDBKeyRange | IDBValidKey | null,\n\tdirection: IDBCursorDirection,\n\taccept: (value: T) => boolean = () => true,\n): Promise<T | undefined> =>\n\tnew Promise<T | undefined>((resolve, reject) => {\n\t\tconst request = source.openCursor(range, direction);\n\t\trequest.addEventListener(\n\t\t\t\"error\",\n\t\t\t() => reject(request.error ?? new IndexedDbFailure(\"IndexedDB cursor failed\")),\n\t\t\t{\n\t\t\t\tonce: true,\n\t\t\t},\n\t\t);\n\t\trequest.addEventListener(\"success\", () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor === null) {\n\t\t\t\tresolve(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst value = cursor.value as T;\n\t\t\tif (accept(value)) {\n\t\t\t\tresolve(value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcursor.continue();\n\t\t});\n\t});\n\nconst page = <T extends { readonly id: Id<string> }>(\n\tvalues: readonly T[],\n\tlimit: number,\n\torder: ScanOrder = \"ascending\",\n): Page<T, Cursor> => {\n\tconst items = values.slice(0, limit);\n\tif (values.length <= limit) return { items };\n\treturn { items, next: nextCursor(items.at(-1)!.id, order) };\n};\n\nconst cursorId = <I extends Id<string>>(cursor: Cursor | undefined): I | undefined => {\n\tconst after = cursor?.after;\n\tif (after === undefined) return undefined;\n\tif (typeof after !== \"number\" || !Number.isSafeInteger(after)) {\n\t\tthrow new StorageRequestError(\"Invalid storage cursor\");\n\t}\n\treturn idFromNumber<I>(after);\n};\n\nconst primaryRange = (start: ScanStart): IDBKeyRange | null => {\n\tif (start.after === undefined) return null;\n\treturn start.order === \"ascending\"\n\t\t? keyRanges().lowerBound(start.after, true)\n\t\t: keyRanges().upperBound(start.after, true);\n};\n\nconst compoundIdRange = (\n\tprefix: readonly IDBValidKey[],\n\tminimum: number,\n\tmaximum: number,\n\tminimumOpen = false,\n\tmaximumOpen = false,\n): IDBKeyRange => keyRanges().bound([...prefix, minimum], [...prefix, maximum], minimumOpen, maximumOpen);\n\nconst scanCompoundRows = <T extends { readonly id: number }>(\n\tindex: IDBIndex,\n\tprefix: readonly IDBValidKey[],\n\tstart: ScanStart,\n\tlimit: number,\n\taccept: (value: T) => boolean,\n): Promise<T[]> => {\n\tconst minimum = start.order === \"ascending\" && start.after !== undefined ? start.after : 0;\n\tconst maximum = start.order === \"descending\" && start.after !== undefined ? start.after : MAX_KEY;\n\treturn cursorValues<T>(\n\t\tindex,\n\t\tcompoundIdRange(\n\t\t\tprefix,\n\t\t\tminimum,\n\t\t\tmaximum,\n\t\t\tstart.order === \"ascending\" && start.after !== undefined,\n\t\t\tstart.order === \"descending\" && start.after !== undefined,\n\t\t),\n\t\tstart.order === \"ascending\" ? \"next\" : \"prev\",\n\t\tlimit,\n\t\taccept,\n\t);\n};\n\nconst scopeColumns = (scope: DocumentRecord[\"scope\"]): ScopeColumns => {\n\tswitch (scope.kind) {\n\t\tcase \"session\":\n\t\t\treturn { scopeKind: \"session\", ownerId: 0 };\n\t\tcase \"conversation\":\n\t\t\treturn { scopeKind: \"conversation\", ownerId: scope.conversationId };\n\t\tcase \"task\":\n\t\t\treturn { scopeKind: \"task\", ownerId: scope.taskId };\n\t}\n};\n\nconst addressParts = (address: DocumentAddress | DocumentCreate | DocumentRecord) => {\n\tconst scope = scopeColumns(address.scope);\n\treturn {\n\t\tkind: address.kind,\n\t\t...scope,\n\t\tfamily: address.key === undefined ? (0 as const) : (1 as const),\n\t\tkeyValue: address.key ?? \"\",\n\t};\n};\n\nconst addressPrefix = (address: DocumentAddress | DocumentCreate | DocumentRecord): readonly IDBValidKey[] => {\n\tconst parts = addressParts(address);\n\treturn [parts.kind, parts.scopeKind, parts.ownerId, parts.family, parts.keyValue];\n};\n\nconst addressKey = (address: DocumentAddress | DocumentCreate | DocumentRecord): string =>\n\tJSON.stringify(addressPrefix(address));\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 writeId = (write: StorageWrite): Id<string> | undefined => {\n\tswitch (write.type) {\n\t\tcase \"conversation\":\n\t\tcase \"entry\":\n\t\tcase \"task\":\n\t\tcase \"submission\":\n\t\t\treturn write.value.id;\n\t\tcase \"document.create\":\n\t\tcase \"document.copy\":\n\t\t\treturn write.record.id;\n\t\tcase \"document.change\":\n\t\tcase \"document.retire\":\n\t\t\treturn undefined;\n\t}\n};\n\nfunction createSchema(database: IDBDatabase): void {\n\tconst meta = database.createObjectStore(STORES.meta, { keyPath: \"key\" });\n\tmeta.add({ key: META_KEY, nextId: 2, nextSeq: 1 } satisfies MetaRow);\n\tdatabase.createObjectStore(STORES.recordIds, { keyPath: \"id\" });\n\n\tconst conversations = database.createObjectStore(STORES.conversations, { keyPath: \"id\" });\n\tconversations.createIndex(INDEXES.conversationsByOwnerConversation, [\"ownerConversationId\", \"id\"]);\n\tconversations.createIndex(INDEXES.conversationsByOwnerTask, [\"ownerTaskId\", \"id\"]);\n\n\tconst entries = database.createObjectStore(STORES.entries, { keyPath: \"id\" });\n\tentries.createIndex(INDEXES.entriesByConversation, [\"conversationId\", \"id\"]);\n\tentries.createIndex(INDEXES.entryHeadsByConversation, [\"headConversationId\", \"id\"]);\n\n\tconst tasks = database.createObjectStore(STORES.tasks, { keyPath: \"id\" });\n\ttasks.createIndex(INDEXES.tasksByStatus, [\"status\", \"id\"]);\n\ttasks.createIndex(INDEXES.tasksByConversation, [\"conversationId\", \"id\"]);\n\ttasks.createIndex(INDEXES.tasksByKind, [\"kind\", \"id\"]);\n\ttasks.createIndex(INDEXES.tasksByAbortRequested, [\"abortRequested\", \"id\"]);\n\ttasks.createIndex(INDEXES.tasksByBackground, [\"background\", \"id\"]);\n\n\tconst submissions = database.createObjectStore(STORES.submissions, { keyPath: \"id\" });\n\tsubmissions.createIndex(INDEXES.submissionsByRequest, [\"conversationId\", \"requestId\"]);\n\tsubmissions.createIndex(INDEXES.submissionsByConversation, [\"conversationId\", \"id\"]);\n\tsubmissions.createIndex(INDEXES.submissionsByStatus, [\"status\", \"id\"]);\n\n\tconst documents = database.createObjectStore(STORES.documents, { keyPath: \"id\" });\n\tdocuments.createIndex(INDEXES.documentsByAddress, [\n\t\t\"kind\",\n\t\t\"scopeKind\",\n\t\t\"ownerId\",\n\t\t\"family\",\n\t\t\"keyValue\",\n\t\t\"createdAt\",\n\t\t\"id\",\n\t]);\n\tdocuments.createIndex(INDEXES.documentsByScope, [\"scopeKind\", \"ownerId\", \"id\"]);\n\tdocuments.createIndex(INDEXES.documentsByScopeKind, [\"scopeKind\", \"ownerId\", \"kind\", \"id\"]);\n\n\tconst revisions = database.createObjectStore(STORES.documentRevisions, { keyPath: [\"documentId\", \"seq\"] });\n\trevisions.createIndex(INDEXES.documentRevisionsByKind, [\"documentId\", \"kind\", \"seq\"]);\n}\n\n/** Browser IndexedDB implementation of the durable storage contract. One owner must serialize access to each database. */\nexport class IndexedDbStorage implements Storage {\n\tprivate readonly database: IDBDatabase;\n\tprivate closed = false;\n\tprivate closing: Promise<void> | undefined;\n\tprivate activeOperations = 0;\n\tprivate operationsDrained: (() => void) | undefined;\n\n\tprivate constructor(database: IDBDatabase) {\n\t\tthis.database = database;\n\t}\n\n\t/** Open or create a browser-only IndexedDB database. */\n\tstatic async open(name: string, options: IndexedDbStorageOptions = {}): Promise<IndexedDbStorage> {\n\t\tconst factory = options.indexedDB ?? globalThis.indexedDB;\n\t\tif (factory === undefined) throw new Error(\"IndexedDB is not available\");\n\t\tconst request = factory.open(name, DATABASE_VERSION);\n\t\trequest.addEventListener(\"upgradeneeded\", (event) => {\n\t\t\tif ((event as IDBVersionChangeEvent).oldVersion === 0) createSchema(request.result);\n\t\t});\n\t\tconst database = await requestResult(request);\n\t\ttry {\n\t\t\tconst transaction = database.transaction(STORES.meta, \"readonly\");\n\t\t\tconst done = transactionResult(transaction);\n\t\t\tconst metadata = await requestResult(\n\t\t\t\ttransaction.objectStore(STORES.meta).get(META_KEY) as IDBRequest<MetaRow>,\n\t\t\t);\n\t\t\tawait done;\n\t\t\tif (metadata === undefined) throw new Error(\"Durable IndexedDB metadata is missing\");\n\t\t\treturn new IndexedDbStorage(database);\n\t\t} catch (error) {\n\t\t\tdatabase.close();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/** Delete a closed database. Open connections in this or another owner can block deletion. */\n\tstatic async delete(name: string, options: IndexedDbStorageOptions = {}): Promise<void> {\n\t\tconst factory = options.indexedDB ?? globalThis.indexedDB;\n\t\tif (factory === undefined) throw new Error(\"IndexedDB is not available\");\n\t\tawait requestResult(factory.deleteDatabase(name));\n\t}\n\n\t/**\n\t * Commit `batches` in one IndexedDB transaction, each with its own seq. Each batch does every read and check, copy\n\t * resolution included, against the state the earlier ones left before it issues its first write; the first one\n\t * refused ends the call, and the transaction commits the ones before it. An error of IndexedDB itself aborts the\n\t * transaction: the call rejects with nothing stored.\n\t */\n\tasync commit(\n\t\tbatches: readonly (readonly StorageWrite[])[],\n\t\treceive: (index: number, seq: Seq) => void,\n\t\t_context: Context,\n\t): Promise<CommitResult> {\n\t\tthis.assertOpen();\n\t\tconst seqs: Seq[] = [];\n\t\tlet refused: { readonly error: unknown } | undefined;\n\t\tawait this.transaction(ALL_STORES, \"readwrite\", async (transaction) => {\n\t\t\tconst metaStore = transaction.objectStore(STORES.meta);\n\t\t\tconst metadata = await requestResult(metaStore.get(META_KEY) as IDBRequest<MetaRow>);\n\t\t\tif (metadata === undefined) throw new Error(\"Durable IndexedDB metadata is missing\");\n\t\t\tlet next = metadata.nextSeq;\n\t\t\tlet nextId = metadata.nextId;\n\t\t\tfor (const writes of batches) {\n\t\t\t\tlet documentActions: Map<DocumentId, DocumentAction>;\n\t\t\t\ttry {\n\t\t\t\t\tdocumentActions = this.prepareDocumentActions(writes);\n\t\t\t\t\tawait this.checkGlobalIds(transaction, writes);\n\t\t\t\t\tawait this.checkDocumentActions(transaction, documentActions);\n\t\t\t\t\tawait this.resolveCopies(transaction, documentActions);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (fromIndexedDb(error)) throw error;\n\t\t\t\t\trefused = { error };\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst seq = seqFromNumber(next++);\n\t\t\t\tfor (const write of writes) await this.applyTableWrite(transaction, write, seq);\n\t\t\t\tawait this.applyDocumentActions(transaction, documentActions, seq);\n\t\t\t\tfor (const write of writes) {\n\t\t\t\t\tconst id = writeId(write);\n\t\t\t\t\tif (id !== undefined) nextId = Math.max(nextId, id + 1);\n\t\t\t\t}\n\t\t\t\tseqs.push(seq);\n\t\t\t}\n\t\t\tif (seqs.length > 0) {\n\t\t\t\tawait requestResult(metaStore.put({ key: META_KEY, nextId, nextSeq: next } satisfies MetaRow));\n\t\t\t}\n\t\t});\n\t\t// The transaction completed: the stored batches are durable.\n\t\tfor (const [index, seq] of seqs.entries()) receive(index, seq);\n\t\treturn refused === undefined ? { stored: seqs.length } : { stored: seqs.length, refused: refused.error };\n\t}\n\n\tasync mintId<I extends Id<string>>(): Promise<I> {\n\t\tthis.assertOpen();\n\t\treturn this.transaction(STORES.meta, \"readwrite\", async (transaction) => {\n\t\t\tconst store = transaction.objectStore(STORES.meta);\n\t\t\tconst metadata = await requestResult(store.get(META_KEY) as IDBRequest<MetaRow>);\n\t\t\tif (metadata === undefined) throw new Error(\"Durable IndexedDB metadata is missing\");\n\t\t\tif (!Number.isSafeInteger(metadata.nextId)) throw new Error(\"ID space is exhausted\");\n\t\t\tawait requestResult(store.put({ ...metadata, nextId: metadata.nextId + 1 }));\n\t\t\treturn idFromNumber<I>(metadata.nextId);\n\t\t});\n\t}\n\n\tconversation(id: ConversationId, _context: Context): Promise<ConversationRecord | undefined> {\n\t\treturn this.transaction(\n\t\t\tSTORES.conversations,\n\t\t\t\"readonly\",\n\t\t\tasync (transaction) =>\n\t\t\t\t(\n\t\t\t\t\tawait requestResult(\n\t\t\t\t\t\ttransaction.objectStore(STORES.conversations).get(id) as IDBRequest<ConversationRow | undefined>,\n\t\t\t\t\t)\n\t\t\t\t)?.record,\n\t\t);\n\t}\n\n\tasync scanConversations(\n\t\tquery: ConversationQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<ConversationRecord, Cursor>> {\n\t\tconst start = scanStart(query.order, cursor, \"ascending\");\n\t\treturn this.transaction(STORES.conversations, \"readonly\", async (transaction) => {\n\t\t\tconst store = transaction.objectStore(STORES.conversations);\n\t\t\tconst accept = (row: ConversationRow) =>\n\t\t\t\tquery.ownerConversationId === undefined || row.ownerConversationId === query.ownerConversationId;\n\t\t\tlet rows: ConversationRow[];\n\t\t\tif (query.ownerTaskId !== undefined) {\n\t\t\t\trows = await scanCompoundRows(\n\t\t\t\t\tstore.index(INDEXES.conversationsByOwnerTask),\n\t\t\t\t\t[query.ownerTaskId],\n\t\t\t\t\tstart,\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t} else if (query.ownerConversationId !== undefined) {\n\t\t\t\trows = await scanCompoundRows(\n\t\t\t\t\tstore.index(INDEXES.conversationsByOwnerConversation),\n\t\t\t\t\t[query.ownerConversationId],\n\t\t\t\t\tstart,\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trows = await cursorValues<ConversationRow>(\n\t\t\t\t\tstore,\n\t\t\t\t\tprimaryRange(start),\n\t\t\t\t\tstart.order === \"ascending\" ? \"next\" : \"prev\",\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn page(\n\t\t\t\trows.map((row) => row.record),\n\t\t\t\tlimit,\n\t\t\t\tstart.order,\n\t\t\t);\n\t\t});\n\t}\n\n\tentry(id: EntryId, context: Context): Promise<{ readonly entry: EntryRecord; readonly commitSeq: Seq } | undefined>;\n\tentry(\n\t\tconversationId: ConversationId,\n\t\tid: EntryId,\n\t\tcontext: Context,\n\t): Promise<{ readonly entry: EntryRecord; readonly commitSeq: Seq } | undefined>;\n\tentry(\n\t\tidOrConversationId: EntryId | ConversationId,\n\t\tidOrContext: EntryId | Context,\n\t\tcontext?: Context,\n\t): Promise<{ readonly entry: EntryRecord; readonly commitSeq: Seq } | undefined> {\n\t\treturn this.transaction([STORES.conversations, STORES.entries], \"readonly\", async (transaction) => {\n\t\t\tconst id =\n\t\t\t\tcontext === undefined\n\t\t\t\t\t? idFromNumber<EntryId>(idOrConversationId)\n\t\t\t\t\t: typeof idOrContext === \"number\"\n\t\t\t\t\t\t? idFromNumber<EntryId>(idOrContext)\n\t\t\t\t\t\t: undefined;\n\t\t\tif (id === undefined) throw new StorageRequestError(\"Storage.entry() requires an entry ID\");\n\t\t\tlet conversation: ConversationRecord | undefined;\n\t\t\tif (context !== undefined) {\n\t\t\t\tconst conversationId = idFromNumber<ConversationId>(idOrConversationId);\n\t\t\t\tconversation = await this.readConversation(transaction, conversationId);\n\t\t\t\tif (conversation === undefined) throw new StorageRequestError(`Unknown conversation: ${conversationId}`);\n\t\t\t}\n\t\t\tconst row = await requestResult(\n\t\t\t\ttransaction.objectStore(STORES.entries).get(id) as IDBRequest<EntryRow | undefined>,\n\t\t\t);\n\t\t\tif (row === undefined) return undefined;\n\t\t\tif (conversation !== undefined) {\n\t\t\t\tlet upperEntryId = MAX_KEY;\n\t\t\t\twhile (conversation.id !== row.conversationId) {\n\t\t\t\t\tif (conversation.parent === undefined) return undefined;\n\t\t\t\t\tupperEntryId = Math.min(upperEntryId, conversation.parent.at);\n\t\t\t\t\tconversation = (await this.readConversation(transaction, conversation.parent.conversationId))!;\n\t\t\t\t}\n\t\t\t\tif (row.id > upperEntryId) return undefined;\n\t\t\t}\n\t\t\treturn { entry: row.record, commitSeq: row.commitSeq };\n\t\t});\n\t}\n\n\tfindLatestHeadMarker(\n\t\tconversationId: ConversationId,\n\t\tatOrBeforeEntryId: EntryId | undefined,\n\t\t_context: Context,\n\t): Promise<(EntryRecord & { readonly head: EntryId }) | undefined> {\n\t\treturn this.transaction([STORES.conversations, STORES.entries], \"readonly\", async (transaction) => {\n\t\t\tlet conversation = await this.readConversation(transaction, conversationId);\n\t\t\tif (conversation === undefined) throw new StorageRequestError(`Unknown conversation: ${conversationId}`);\n\t\t\tlet upper = atOrBeforeEntryId ?? MAX_KEY;\n\t\t\tconst index = transaction.objectStore(STORES.entries).index(INDEXES.entryHeadsByConversation);\n\t\t\twhile (true) {\n\t\t\t\tconst row = await firstCursorValue<EntryRow>(index, compoundIdRange([conversation.id], 0, upper), \"prev\");\n\t\t\t\tif (row !== undefined) return row.record as EntryRecord & { readonly head: EntryId };\n\t\t\t\tif (conversation.parent === undefined) return undefined;\n\t\t\t\tupper = Math.min(upper, conversation.parent.at);\n\t\t\t\tconversation = (await this.readConversation(transaction, conversation.parent.conversationId))!;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync scanEntries(\n\t\tquery: EntryQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<EntryRecord, Cursor>> {\n\t\tconst start = scanStart(query.order, cursor, \"descending\");\n\t\treturn this.transaction([STORES.conversations, STORES.entries], \"readonly\", async (transaction) => {\n\t\t\tconst values =\n\t\t\t\tstart.order === \"ascending\"\n\t\t\t\t\t? await this.readEntriesAscending(transaction, query, limit, start.after)\n\t\t\t\t\t: await this.readEntriesDescending(transaction, query, limit, start.after);\n\t\t\treturn page(values, limit, start.order);\n\t\t});\n\t}\n\n\ttask(id: TaskId, _context: Context): Promise<StoredTask | undefined> {\n\t\treturn this.transaction(\n\t\t\tSTORES.tasks,\n\t\t\t\"readonly\",\n\t\t\tasync (transaction) =>\n\t\t\t\t(await requestResult(transaction.objectStore(STORES.tasks).get(id) as IDBRequest<TaskRow | undefined>))\n\t\t\t\t\t?.record,\n\t\t);\n\t}\n\n\tasync scanTasks(\n\t\tquery: TaskQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<StoredTask, Cursor>> {\n\t\tconst start = scanStart(query.order, cursor, \"ascending\");\n\t\treturn this.transaction(STORES.tasks, \"readonly\", async (transaction) => {\n\t\t\tconst store = transaction.objectStore(STORES.tasks);\n\t\t\tconst accept = (row: TaskRow) =>\n\t\t\t\t(query.conversationId === undefined || row.conversationId === query.conversationId) &&\n\t\t\t\t(query.kind === undefined || row.kind === query.kind) &&\n\t\t\t\t(query.status === undefined || row.status === query.status) &&\n\t\t\t\t(query.abortRequested === undefined || row.abortRequested === (query.abortRequested ? 1 : 0)) &&\n\t\t\t\t(query.background === undefined || row.background === (query.background ? 1 : 0));\n\t\t\tlet source: IDBObjectStore | IDBIndex = store;\n\t\t\tlet prefix: readonly IDBValidKey[] | undefined;\n\t\t\tif (query.status !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByStatus);\n\t\t\t\tprefix = [query.status];\n\t\t\t} else if (query.conversationId !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByConversation);\n\t\t\t\tprefix = [query.conversationId];\n\t\t\t} else if (query.kind !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByKind);\n\t\t\t\tprefix = [query.kind];\n\t\t\t} else if (query.abortRequested !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByAbortRequested);\n\t\t\t\tprefix = [query.abortRequested ? 1 : 0];\n\t\t\t} else if (query.background !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByBackground);\n\t\t\t\tprefix = [query.background ? 1 : 0];\n\t\t\t}\n\t\t\tconst rows =\n\t\t\t\tprefix === undefined\n\t\t\t\t\t? await cursorValues<TaskRow>(\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\tprimaryRange(start),\n\t\t\t\t\t\t\tstart.order === \"ascending\" ? \"next\" : \"prev\",\n\t\t\t\t\t\t\tlimit + 1,\n\t\t\t\t\t\t\taccept,\n\t\t\t\t\t\t)\n\t\t\t\t\t: await scanCompoundRows<TaskRow>(source as IDBIndex, prefix, start, limit + 1, accept);\n\t\t\treturn page(\n\t\t\t\trows.map((row) => row.record),\n\t\t\t\tlimit,\n\t\t\t\tstart.order,\n\t\t\t);\n\t\t});\n\t}\n\n\tsubmission(id: SubmissionId, _context: Context): Promise<SubmissionRecord | undefined> {\n\t\treturn this.transaction(\n\t\t\tSTORES.submissions,\n\t\t\t\"readonly\",\n\t\t\tasync (transaction) =>\n\t\t\t\t(\n\t\t\t\t\tawait requestResult(\n\t\t\t\t\t\ttransaction.objectStore(STORES.submissions).get(id) as IDBRequest<SubmissionRow | undefined>,\n\t\t\t\t\t)\n\t\t\t\t)?.record,\n\t\t);\n\t}\n\n\tasync scanSubmissions(\n\t\tquery: SubmissionQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<SubmissionRecord, Cursor>> {\n\t\tconst start = scanStart(query.order, cursor, \"ascending\");\n\t\treturn this.transaction(STORES.submissions, \"readonly\", async (transaction) => {\n\t\t\tconst store = transaction.objectStore(STORES.submissions);\n\t\t\tconst accept = (row: SubmissionRow) =>\n\t\t\t\t(query.conversationId === undefined || row.conversationId === query.conversationId) &&\n\t\t\t\t(query.status === undefined || row.status === query.status);\n\t\t\tlet rows: SubmissionRow[];\n\t\t\tif (query.status !== undefined) {\n\t\t\t\trows = await scanCompoundRows(\n\t\t\t\t\tstore.index(INDEXES.submissionsByStatus),\n\t\t\t\t\t[query.status],\n\t\t\t\t\tstart,\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t} else if (query.conversationId !== undefined) {\n\t\t\t\trows = await scanCompoundRows(\n\t\t\t\t\tstore.index(INDEXES.submissionsByConversation),\n\t\t\t\t\t[query.conversationId],\n\t\t\t\t\tstart,\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trows = await cursorValues<SubmissionRow>(\n\t\t\t\t\tstore,\n\t\t\t\t\tprimaryRange(start),\n\t\t\t\t\tstart.order === \"ascending\" ? \"next\" : \"prev\",\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn page(\n\t\t\t\trows.map((row) => row.record),\n\t\t\t\tlimit,\n\t\t\t\tstart.order,\n\t\t\t);\n\t\t});\n\t}\n\n\tsubmissionByRequest(\n\t\tconversationId: ConversationId,\n\t\trequestId: string,\n\t\t_context: Context,\n\t): Promise<SubmissionRecord | undefined> {\n\t\treturn this.transaction(STORES.submissions, \"readonly\", async (transaction) => {\n\t\t\tconst row = await requestResult(\n\t\t\t\ttransaction\n\t\t\t\t\t.objectStore(STORES.submissions)\n\t\t\t\t\t.index(INDEXES.submissionsByRequest)\n\t\t\t\t\t.get([conversationId, requestId]) as IDBRequest<SubmissionRow | undefined>,\n\t\t\t);\n\t\t\treturn row?.record;\n\t\t});\n\t}\n\n\tfindDocument(address: DocumentAddress, at: DocumentPoint, _context: Context): Promise<DocumentRecord | undefined> {\n\t\treturn this.transaction(STORES.documents, \"readonly\", async (transaction) => {\n\t\t\tconst row = await firstCursorValue<DocumentRow>(\n\t\t\t\ttransaction.objectStore(STORES.documents).index(INDEXES.documentsByAddress),\n\t\t\t\tkeyRanges().bound([...addressPrefix(address), 0, 0], [...addressPrefix(address), MAX_KEY, MAX_KEY]),\n\t\t\t\t\"prev\",\n\t\t\t\t(value) => isAliveAt(value.record, at),\n\t\t\t);\n\t\t\treturn row?.record;\n\t\t});\n\t}\n\n\tdocument(id: DocumentId, at: DocumentPoint, _context: Context): Promise<StoredDocument | undefined> {\n\t\treturn this.transaction([STORES.documents, STORES.documentRevisions], \"readonly\", (transaction) =>\n\t\t\tthis.materializeDocument(transaction, id, at),\n\t\t);\n\t}\n\n\tasync scanDocuments(\n\t\tquery: DocumentQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<DocumentRecord, Cursor>> {\n\t\tconst after = cursorId<DocumentId>(cursor);\n\t\treturn this.transaction(STORES.documents, \"readonly\", async (transaction) => {\n\t\t\tconst scope = scopeColumns(query.scope);\n\t\t\tconst store = transaction.objectStore(STORES.documents);\n\t\t\tconst index =\n\t\t\t\tquery.kind === undefined\n\t\t\t\t\t? store.index(INDEXES.documentsByScope)\n\t\t\t\t\t: store.index(INDEXES.documentsByScopeKind);\n\t\t\tconst prefix: readonly IDBValidKey[] =\n\t\t\t\tquery.kind === undefined ? [scope.scopeKind, scope.ownerId] : [scope.scopeKind, scope.ownerId, query.kind];\n\t\t\tconst rows = await cursorValues<DocumentRow>(\n\t\t\t\tindex,\n\t\t\t\tcompoundIdRange(prefix, after ?? 0, MAX_KEY, after !== undefined),\n\t\t\t\t\"next\",\n\t\t\t\tlimit + 1,\n\t\t\t\t(row) => isAliveAt(row.record, query.at),\n\t\t\t);\n\t\t\treturn page(\n\t\t\t\trows.map((row) => row.record),\n\t\t\t\tlimit,\n\t\t\t);\n\t\t});\n\t}\n\n\tclose(_context: Context): Promise<void> {\n\t\tif (this.closing === undefined) {\n\t\t\tthis.closed = true;\n\t\t\tthis.closing = this.closeDatabase();\n\t\t}\n\t\treturn this.closing;\n\t}\n\n\tprivate async closeDatabase(): Promise<void> {\n\t\tif (this.activeOperations > 0) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tthis.operationsDrained = resolve;\n\t\t\t});\n\t\t}\n\t\tthis.database.close();\n\t}\n\n\tprivate async transaction<T>(\n\t\tstores: string | readonly string[],\n\t\tmode: IDBTransactionMode,\n\t\toperation: (transaction: IDBTransaction) => Promise<T>,\n\t): Promise<T> {\n\t\tthis.assertOpen();\n\t\tthis.activeOperations++;\n\t\ttry {\n\t\t\tconst transaction = this.database.transaction(stores, mode);\n\t\t\tconst done = transactionResult(transaction);\n\t\t\ttry {\n\t\t\t\tconst value = await operation(transaction);\n\t\t\t\tawait done;\n\t\t\t\treturn value;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\ttransaction.abort();\n\t\t\t\t} catch {\n\t\t\t\t\t// It may already have aborted or committed.\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait done;\n\t\t\t\t} catch {\n\t\t\t\t\t// Preserve the operation failure.\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} finally {\n\t\t\tif (--this.activeOperations === 0) this.operationsDrained?.();\n\t\t}\n\t}\n\n\tprivate async readConversation(\n\t\ttransaction: IDBTransaction,\n\t\tid: ConversationId,\n\t): Promise<ConversationRecord | undefined> {\n\t\treturn (\n\t\t\tawait requestResult(\n\t\t\t\ttransaction.objectStore(STORES.conversations).get(id) as IDBRequest<ConversationRow | undefined>,\n\t\t\t)\n\t\t)?.record;\n\t}\n\n\tprivate async readEntriesDescending(\n\t\ttransaction: IDBTransaction,\n\t\tquery: EntryQuery,\n\t\tlimit: number,\n\t\tafter: number | undefined,\n\t): Promise<EntryRecord[]> {\n\t\tlet conversation = await this.readConversation(transaction, query.conversationId);\n\t\tif (conversation === undefined) throw new StorageRequestError(`Unknown conversation: ${query.conversationId}`);\n\t\tlet upper = query.maxEntryId ?? MAX_KEY;\n\t\tif (after !== undefined) upper = Math.min(upper, after - 1);\n\t\tconst minimum = query.minEntryId ?? 0;\n\t\tconst values: EntryRecord[] = [];\n\t\tconst index = transaction.objectStore(STORES.entries).index(INDEXES.entriesByConversation);\n\t\twhile (true) {\n\t\t\tif (upper >= minimum) {\n\t\t\t\tconst rows = await cursorValues<EntryRow>(\n\t\t\t\t\tindex,\n\t\t\t\t\tcompoundIdRange([conversation.id], minimum, upper),\n\t\t\t\t\t\"prev\",\n\t\t\t\t\tlimit + 1 - values.length,\n\t\t\t\t);\n\t\t\t\tvalues.push(...rows.map((row) => row.record));\n\t\t\t}\n\t\t\tif (values.length > limit || conversation.parent === undefined) break;\n\t\t\tupper = Math.min(upper, conversation.parent.at);\n\t\t\tif (upper < minimum) break;\n\t\t\tconversation = (await this.readConversation(transaction, conversation.parent.conversationId))!;\n\t\t}\n\t\treturn values;\n\t}\n\n\tprivate async readEntriesAscending(\n\t\ttransaction: IDBTransaction,\n\t\tquery: EntryQuery,\n\t\tlimit: number,\n\t\tafter: number | undefined,\n\t): Promise<EntryRecord[]> {\n\t\tconst segments: { readonly conversationId: ConversationId; readonly upper: number }[] = [];\n\t\tlet conversation = await this.readConversation(transaction, query.conversationId);\n\t\tif (conversation === undefined) throw new StorageRequestError(`Unknown conversation: ${query.conversationId}`);\n\t\tlet upper = query.maxEntryId ?? MAX_KEY;\n\t\tconst requestedMinimum = query.minEntryId ?? 0;\n\t\twhile (true) {\n\t\t\tsegments.push({ conversationId: conversation.id, upper });\n\t\t\tif (conversation.parent === undefined) break;\n\t\t\tupper = Math.min(upper, conversation.parent.at);\n\t\t\tif (upper < requestedMinimum) break;\n\t\t\tconversation = (await this.readConversation(transaction, conversation.parent.conversationId))!;\n\t\t}\n\t\tconst minimum = after === undefined ? requestedMinimum : Math.max(requestedMinimum, after + 1);\n\t\tconst values: EntryRecord[] = [];\n\t\tconst index = transaction.objectStore(STORES.entries).index(INDEXES.entriesByConversation);\n\t\tfor (const segment of segments.reverse()) {\n\t\t\tif (segment.upper < minimum) continue;\n\t\t\tconst rows = await cursorValues<EntryRow>(\n\t\t\t\tindex,\n\t\t\t\tcompoundIdRange([segment.conversationId], minimum, segment.upper),\n\t\t\t\t\"next\",\n\t\t\t\tlimit + 1 - values.length,\n\t\t\t);\n\t\t\tvalues.push(...rows.map((row) => row.record));\n\t\t\tif (values.length > limit) break;\n\t\t}\n\t\treturn values;\n\t}\n\n\tprivate async materializeDocument(\n\t\ttransaction: IDBTransaction,\n\t\tid: DocumentId,\n\t\tat: DocumentPoint,\n\t): Promise<StoredDocument | undefined> {\n\t\tconst record = (\n\t\t\tawait requestResult(transaction.objectStore(STORES.documents).get(id) as IDBRequest<DocumentRow | undefined>)\n\t\t)?.record;\n\t\tif (record === undefined) return undefined;\n\t\tif (at !== \"current\" && isCurrentOnly(record)) {\n\t\t\tthrow new StorageRequestError(`Document ${id} does not retain historical content`);\n\t\t}\n\t\tif (!isAliveAt(record, at)) return undefined;\n\t\tconst upper = at === \"current\" ? MAX_KEY : at;\n\t\tconst revisions = transaction.objectStore(STORES.documentRevisions);\n\t\tconst base = await firstCursorValue<RevisionRow>(\n\t\t\trevisions.index(INDEXES.documentRevisionsByKind),\n\t\t\tkeyRanges().bound([id, \"base\", 0], [id, \"base\", upper]),\n\t\t\t\"prev\",\n\t\t);\n\t\tif (base === undefined || base.kind !== \"base\") throw new Error(`Document ${id} is missing a required base`);\n\t\tlet value = base.content as JsonObject;\n\t\tconst tail =\n\t\t\tbase.seq >= upper\n\t\t\t\t? []\n\t\t\t\t: await cursorValues<RevisionRow>(\n\t\t\t\t\t\trevisions,\n\t\t\t\t\t\tkeyRanges().bound([id, base.seq], [id, upper], true),\n\t\t\t\t\t\t\"next\",\n\t\t\t\t\t\tMAX_KEY,\n\t\t\t\t\t);\n\t\tfor (const revision of tail) {\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 = apply(value, revision.content as readonly Op[]) as JsonObject;\n\t\t}\n\t\treturn { record, version: base.version, value, deltasSinceBase: tail.length };\n\t}\n\n\tprivate async checkGlobalIds(transaction: IDBTransaction, writes: readonly StorageWrite[]): Promise<void> {\n\t\tconst store = transaction.objectStore(STORES.recordIds);\n\t\tconst claimed = new Map<Id<string>, 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 document = write.type === \"document.create\" || write.type === \"document.copy\";\n\t\t\tconst table: TableName = document ? \"document\" : write.type;\n\t\t\tconst id = document ? write.record.id : write.value.id;\n\t\t\tconst existing = (await requestResult(store.get(id) as IDBRequest<RecordIdRow | undefined>))?.recordType;\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\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<DocumentId, DocumentAction> {\n\t\tconst actions = new Map<DocumentId, DocumentAction>();\n\t\tfor (const write of writes) {\n\t\t\tif (\n\t\t\t\twrite.type !== \"document.create\" &&\n\t\t\t\twrite.type !== \"document.copy\" &&\n\t\t\t\twrite.type !== \"document.change\" &&\n\t\t\t\twrite.type !== \"document.retire\"\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst id = write.type === \"document.create\" || write.type === \"document.copy\" ? 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 || action.copy !== 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.copy\":\n\t\t\t\t\tif (action.create !== undefined || action.content !== undefined || action.copy !== 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.copy = write.source;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.change\":\n\t\t\t\t\tif (action.content !== undefined || action.copy !== 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.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 async checkDocumentActions(\n\t\ttransaction: IDBTransaction,\n\t\tactions: ReadonlyMap<DocumentId, DocumentAction>,\n\t): Promise<void> {\n\t\tconst documents = transaction.objectStore(STORES.documents);\n\t\tconst revisions = transaction.objectStore(STORES.documentRevisions);\n\t\tconst liveCounts = new Map<string, number>();\n\t\tfor (const [id, action] of actions) {\n\t\t\tif (action.copy !== undefined && actions.has(action.copy.id)) {\n\t\t\t\tthrow new Error(`Document copy ${id} source is changed in the copy batch`);\n\t\t\t}\n\t\t\tconst existing = (await requestResult(documents.get(id) as IDBRequest<DocumentRow | undefined>))?.record;\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?.retiredAt !== undefined) throw new Error(`Document ${id} is retired`);\n\t\t\tif (action.content?.kind === \"delta\") {\n\t\t\t\tconst previous = await firstCursorValue<RevisionRow>(revisions, compoundIdRange([id], 0, MAX_KEY), \"prev\");\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\t\t\tconst record = action.create ?? existing!;\n\t\t\tconst key = addressKey(record);\n\t\t\tlet live = liveCounts.get(key);\n\t\t\tif (live === undefined) live = (await this.currentDocumentId(transaction, record)) === undefined ? 0 : 1;\n\t\t\tif (action.retire && existing !== undefined) live--;\n\t\t\tif (action.create !== undefined && !action.retire) live++;\n\t\t\tliveCounts.set(key, live);\n\t\t}\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 async currentDocumentId(\n\t\ttransaction: IDBTransaction,\n\t\taddress: DocumentAddress | DocumentCreate | DocumentRecord,\n\t): Promise<DocumentId | undefined> {\n\t\tconst row = await firstCursorValue<DocumentRow>(\n\t\t\ttransaction.objectStore(STORES.documents).index(INDEXES.documentsByAddress),\n\t\t\tkeyRanges().bound([...addressPrefix(address), 0, 0], [...addressPrefix(address), MAX_KEY, MAX_KEY]),\n\t\t\t\"prev\",\n\t\t\t(value) => value.retiredAt === undefined,\n\t\t);\n\t\treturn row?.id;\n\t}\n\n\tprivate async claimId(transaction: IDBTransaction, id: Id<string>, recordType: TableName): Promise<void> {\n\t\tawait requestResult(transaction.objectStore(STORES.recordIds).put({ id, recordType } satisfies RecordIdRow));\n\t}\n\n\tprivate async applyTableWrite(transaction: IDBTransaction, write: StorageWrite, seq: Seq): Promise<void> {\n\t\tswitch (write.type) {\n\t\t\tcase \"conversation\":\n\t\t\t\tawait this.claimId(transaction, write.value.id, \"conversation\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\ttransaction.objectStore(STORES.conversations).add({\n\t\t\t\t\t\tid: write.value.id,\n\t\t\t\t\t\t...(write.value.owner === undefined\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\townerConversationId: write.value.owner.conversationId,\n\t\t\t\t\t\t\t\t\townerTaskId: write.value.owner.taskId,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\trecord: write.value,\n\t\t\t\t\t} satisfies ConversationRow),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"entry\":\n\t\t\t\tawait this.claimId(transaction, write.value.id, \"entry\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\ttransaction.objectStore(STORES.entries).add({\n\t\t\t\t\t\tid: write.value.id,\n\t\t\t\t\t\tconversationId: write.value.conversationId,\n\t\t\t\t\t\t...(write.value.head === undefined ? {} : { headConversationId: write.value.conversationId }),\n\t\t\t\t\t\tcommitSeq: seq,\n\t\t\t\t\t\trecord: write.value,\n\t\t\t\t\t} satisfies EntryRow),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"task\":\n\t\t\t\tawait this.claimId(transaction, write.value.id, \"task\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\ttransaction.objectStore(STORES.tasks).put({\n\t\t\t\t\t\tid: write.value.id,\n\t\t\t\t\t\tconversationId: write.value.conversationId,\n\t\t\t\t\t\tkind: write.value.kind,\n\t\t\t\t\t\tstatus: write.value.state.status,\n\t\t\t\t\t\tabortRequested: write.value.abortRequested ? 1 : 0,\n\t\t\t\t\t\tbackground: write.value.background ? 1 : 0,\n\t\t\t\t\t\trecord: write.value,\n\t\t\t\t\t} satisfies TaskRow),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"submission\":\n\t\t\t\tawait this.claimId(transaction, write.value.id, \"submission\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\ttransaction.objectStore(STORES.submissions).put({\n\t\t\t\t\t\tid: write.value.id,\n\t\t\t\t\t\tconversationId: write.value.conversationId,\n\t\t\t\t\t\t...(write.value.requestId === undefined ? {} : { requestId: write.value.requestId }),\n\t\t\t\t\t\tstatus: write.value.status,\n\t\t\t\t\t\trecord: write.value,\n\t\t\t\t\t} satisfies SubmissionRow),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"document.create\":\n\t\t\tcase \"document.copy\":\n\t\t\tcase \"document.change\":\n\t\t\tcase \"document.retire\":\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** Resolve each copy to a base of its source's state before this batch, which may not change the source. */\n\tprivate async resolveCopies(transaction: IDBTransaction, actions: Map<DocumentId, DocumentAction>): Promise<void> {\n\t\tfor (const [id, action] of actions) {\n\t\t\tif (action.copy === undefined) continue;\n\t\t\ttry {\n\t\t\t\tconst stored = await this.materializeDocument(transaction, action.copy.id, action.copy.at);\n\t\t\t\tif (stored === undefined) throw new Error(`Fork source document ${action.copy.id} cannot be read`);\n\t\t\t\tconst create = action.create!;\n\t\t\t\tif (\n\t\t\t\t\tstored.record.scope.kind !== \"conversation\" ||\n\t\t\t\t\tcreate.scope.kind !== \"conversation\" ||\n\t\t\t\t\tstored.record.kind !== create.kind ||\n\t\t\t\t\tstored.record.key !== create.key ||\n\t\t\t\t\tstored.record.history !== create.history ||\n\t\t\t\t\tstored.record.fork !== create.fork\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(`Fork source document ${action.copy.id} does not match the copied record`);\n\t\t\t\t}\n\t\t\t\taction.content = { kind: \"base\", version: stored.version, value: stored.value };\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(`Document copy ${id} was rejected`, { cause: error });\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async applyDocumentActions(\n\t\ttransaction: IDBTransaction,\n\t\tactions: ReadonlyMap<DocumentId, DocumentAction>,\n\t\tseq: Seq,\n\t): Promise<void> {\n\t\tconst documents = transaction.objectStore(STORES.documents);\n\t\tconst revisions = transaction.objectStore(STORES.documentRevisions);\n\t\tfor (const [id, action] of actions) {\n\t\t\t// Copies are resolved to their content by `resolveCopies()`.\n\t\t\tconst content = action.content;\n\t\t\tlet record: DocumentRecord;\n\t\t\tif (action.create !== undefined) {\n\t\t\t\trecord = {\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\tconst parts = addressParts(record);\n\t\t\t\tawait this.claimId(transaction, id, \"document\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\tdocuments.add({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\t...parts,\n\t\t\t\t\t\tcreatedAt: seq,\n\t\t\t\t\t\t...(action.retire ? { retiredAt: seq } : {}),\n\t\t\t\t\t\trecord,\n\t\t\t\t\t} satisfies DocumentRow),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trecord = (await requestResult(documents.get(id) as IDBRequest<DocumentRow>)).record;\n\t\t\t}\n\n\t\t\tif (content !== undefined) {\n\t\t\t\tif (content.kind === \"base\" && isCurrentOnly(record)) {\n\t\t\t\t\tawait requestResult(revisions.delete(compoundIdRange([id], 0, MAX_KEY)));\n\t\t\t\t}\n\t\t\t\tawait requestResult(\n\t\t\t\t\trevisions.add({\n\t\t\t\t\t\tdocumentId: id,\n\t\t\t\t\t\tseq,\n\t\t\t\t\t\tkind: content.kind,\n\t\t\t\t\t\tversion: content.version,\n\t\t\t\t\t\tcontent: content.kind === \"base\" ? content.value : content.ops,\n\t\t\t\t\t} satisfies RevisionRow),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (action.retire) {\n\t\t\t\tif (action.create === undefined) {\n\t\t\t\t\trecord = { ...record, retiredAt: seq };\n\t\t\t\t\tconst row = (await requestResult(documents.get(id) as IDBRequest<DocumentRow>))!;\n\t\t\t\t\tawait requestResult(documents.put({ ...row, retiredAt: seq, record } satisfies DocumentRow));\n\t\t\t\t}\n\t\t\t\tif (isCurrentOnly(record)) {\n\t\t\t\t\tawait requestResult(revisions.delete(compoundIdRange([id], 0, MAX_KEY)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.closed) throw new Error(\"IndexedDbStorage is closed\");\n\t}\n}\n\nexport type { IndexedDbStorageOptions };\n"]}
1
+ {"version":3,"file":"indexeddb.js","sourceRoot":"","sources":["../../src/storage/indexeddb.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference lib=\"dom\" />\n\nimport type { Context } from \"@earendil-works/chord/context\";\nimport { apply, type Op } from \"@earendil-works/chord/delta\";\nimport type { JsonValue } from \"@earendil-works/chord/json\";\nimport { StorageRequestError } from \"../errors.ts\";\nimport { idFromNumber, seqFromNumber } from \"../ids.ts\";\nimport type {\n\tCommitResult,\n\tConversationId,\n\tConversationQuery,\n\tConversationRecord,\n\tCursor,\n\tDocumentAddress,\n\tDocumentContent,\n\tDocumentCreate,\n\tDocumentId,\n\tDocumentPoint,\n\tDocumentQuery,\n\tDocumentRecord,\n\tEntryId,\n\tEntryQuery,\n\tEntryRecord,\n\tId,\n\tJsonObject,\n\tPage,\n\tScanOrder,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tStoredDocument,\n\tSubmissionId,\n\tSubmissionQuery,\n\tSubmissionRecord,\n\tTaskId,\n\tTaskQuery,\n\tTaskRecord,\n} from \"../types.ts\";\nimport { nextCursor, type ScanStart, scanStart } from \"./scan.ts\";\n\nconst DATABASE_VERSION = 1;\nconst MAX_KEY = Number.MAX_SAFE_INTEGER;\nconst META_KEY = \"state\";\n\nconst STORES = {\n\tmeta: \"meta\",\n\trecordIds: \"record_ids\",\n\tconversations: \"conversations\",\n\tentries: \"entries\",\n\ttasks: \"tasks\",\n\tsubmissions: \"submissions\",\n\tdocuments: \"documents\",\n\tdocumentRevisions: \"document_revisions\",\n} as const;\n\nconst ALL_STORES = Object.values(STORES);\n\nconst INDEXES = {\n\tconversationsByOwnerConversation: \"conversations_by_owner_conversation\",\n\tconversationsByOwnerTask: \"conversations_by_owner_task\",\n\tentriesByConversation: \"entries_by_conversation\",\n\tentryHeadsByConversation: \"entry_heads_by_conversation\",\n\ttasksByStatus: \"tasks_by_status\",\n\ttasksByConversation: \"tasks_by_conversation\",\n\ttasksByKind: \"tasks_by_kind\",\n\ttasksByAbortRequested: \"tasks_by_abort_requested\",\n\ttasksByBackground: \"tasks_by_background\",\n\tsubmissionsByRequest: \"submissions_by_request\",\n\tsubmissionsByConversation: \"submissions_by_conversation\",\n\tsubmissionsByStatus: \"submissions_by_status\",\n\tdocumentsByAddress: \"documents_by_address\",\n\tdocumentsByScope: \"documents_by_scope\",\n\tdocumentsByScopeKind: \"documents_by_scope_kind\",\n\tdocumentRevisionsByKind: \"document_revisions_by_kind\",\n} as const;\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\ntype TableName = \"conversation\" | \"entry\" | \"task\" | \"submission\" | \"document\";\ntype DocumentAction = {\n\tcreate?: DocumentCreate;\n\tcopy?: Extract<StorageWrite, { readonly type: \"document.copy\" }>[\"source\"];\n\tcontent?: DocumentContent;\n\tretire: boolean;\n};\ntype ScopeColumns = {\n\treadonly scopeKind: DocumentRecord[\"scope\"][\"kind\"];\n\treadonly ownerId: number;\n};\ntype MetaRow = { readonly key: typeof META_KEY; readonly nextId: number; readonly nextSeq: number };\ntype RecordIdRow = { readonly id: number; readonly recordType: TableName };\ntype ConversationRow = {\n\treadonly id: ConversationId;\n\treadonly ownerConversationId?: ConversationId;\n\treadonly ownerTaskId?: TaskId;\n\treadonly record: ConversationRecord;\n};\ntype EntryRow = {\n\treadonly id: EntryId;\n\treadonly conversationId: ConversationId;\n\treadonly headConversationId?: ConversationId;\n\treadonly commitSeq: Seq;\n\treadonly record: EntryRecord;\n};\ntype TaskRow = {\n\treadonly id: TaskId;\n\treadonly conversationId: ConversationId;\n\treadonly kind: string;\n\treadonly status: StoredTask[\"state\"][\"status\"];\n\treadonly abortRequested: 0 | 1;\n\treadonly background: 0 | 1;\n\treadonly record: StoredTask;\n};\ntype SubmissionRow = {\n\treadonly id: SubmissionId;\n\treadonly conversationId: ConversationId;\n\treadonly requestId?: string;\n\treadonly status: SubmissionRecord[\"status\"];\n\treadonly record: SubmissionRecord;\n};\ntype DocumentRow = {\n\treadonly id: DocumentId;\n\treadonly kind: string;\n\treadonly family: 0 | 1;\n\treadonly keyValue: string;\n\treadonly scopeKind: DocumentRecord[\"scope\"][\"kind\"];\n\treadonly ownerId: number;\n\treadonly createdAt: Seq;\n\treadonly retiredAt?: Seq;\n\treadonly record: DocumentRecord;\n};\ntype RevisionRow = {\n\treadonly documentId: DocumentId;\n\treadonly seq: Seq;\n\treadonly kind: DocumentContent[\"kind\"];\n\treadonly version: number;\n\treadonly content: JsonObject | readonly Op[];\n};\n\ntype IndexedDbStorageOptions = {\n\treadonly indexedDB?: IDBFactory;\n};\n\n/** A failure IndexedDB reported without an error of its own: the database's, like every `DOMException` it throws. */\nclass IndexedDbFailure extends Error {}\n\n/**\n * Whether `error`, or an error it was caused by (a copy's rejection wraps its cause), is IndexedDB's own: a\n * `DOMException`, or a failure it reported without one. Any other error of a batch's checks is one of Durable's.\n */\nfunction fromIndexedDb(error: unknown): boolean {\n\tconst seen = new Set<unknown>();\n\tfor (let at: unknown = error; at !== null && typeof at === \"object\" && !seen.has(at); ) {\n\t\tif (at instanceof DOMException || at instanceof IndexedDbFailure) return true;\n\t\tseen.add(at);\n\t\tat = (at as { cause?: unknown }).cause;\n\t}\n\treturn false;\n}\n\nconst requestResult = <T>(request: IDBRequest<T>): Promise<T> =>\n\tnew Promise<T>((resolve, reject) => {\n\t\trequest.addEventListener(\"success\", () => resolve(request.result), { once: true });\n\t\trequest.addEventListener(\n\t\t\t\"error\",\n\t\t\t() => reject(request.error ?? new IndexedDbFailure(\"IndexedDB request failed\")),\n\t\t\t{\n\t\t\t\tonce: true,\n\t\t\t},\n\t\t);\n\t});\n\nconst transactionResult = (transaction: IDBTransaction): Promise<void> =>\n\tnew Promise<void>((resolve, reject) => {\n\t\ttransaction.addEventListener(\"complete\", () => resolve(), { once: true });\n\t\ttransaction.addEventListener(\n\t\t\t\"abort\",\n\t\t\t() => reject(transaction.error ?? new IndexedDbFailure(\"IndexedDB transaction was aborted\")),\n\t\t\t{ once: true },\n\t\t);\n\t\ttransaction.addEventListener(\n\t\t\t\"error\",\n\t\t\t() => reject(transaction.error ?? new IndexedDbFailure(\"IndexedDB transaction failed\")),\n\t\t\t{ once: true },\n\t\t);\n\t});\n\nconst keyRanges = (): typeof IDBKeyRange => {\n\tif (typeof IDBKeyRange === \"undefined\") throw new Error(\"IndexedDB key ranges are not available\");\n\treturn IDBKeyRange;\n};\n\nconst cursorValues = <T>(\n\tsource: IDBObjectStore | IDBIndex,\n\trange: IDBKeyRange | IDBValidKey | null,\n\tdirection: IDBCursorDirection,\n\tlimit: number,\n\taccept: (value: T) => boolean = () => true,\n): Promise<T[]> =>\n\tnew Promise<T[]>((resolve, reject) => {\n\t\tconst values: T[] = [];\n\t\tconst request = source.openCursor(range, direction);\n\t\trequest.addEventListener(\n\t\t\t\"error\",\n\t\t\t() => reject(request.error ?? new IndexedDbFailure(\"IndexedDB cursor failed\")),\n\t\t\t{\n\t\t\t\tonce: true,\n\t\t\t},\n\t\t);\n\t\trequest.addEventListener(\"success\", () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor === null) {\n\t\t\t\tresolve(values);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst value = cursor.value as T;\n\t\t\tif (accept(value)) values.push(value);\n\t\t\tif (values.length >= limit) {\n\t\t\t\tresolve(values);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcursor.continue();\n\t\t});\n\t});\n\nconst firstCursorValue = <T>(\n\tsource: IDBObjectStore | IDBIndex,\n\trange: IDBKeyRange | IDBValidKey | null,\n\tdirection: IDBCursorDirection,\n\taccept: (value: T) => boolean = () => true,\n): Promise<T | undefined> =>\n\tnew Promise<T | undefined>((resolve, reject) => {\n\t\tconst request = source.openCursor(range, direction);\n\t\trequest.addEventListener(\n\t\t\t\"error\",\n\t\t\t() => reject(request.error ?? new IndexedDbFailure(\"IndexedDB cursor failed\")),\n\t\t\t{\n\t\t\t\tonce: true,\n\t\t\t},\n\t\t);\n\t\trequest.addEventListener(\"success\", () => {\n\t\t\tconst cursor = request.result;\n\t\t\tif (cursor === null) {\n\t\t\t\tresolve(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst value = cursor.value as T;\n\t\t\tif (accept(value)) {\n\t\t\t\tresolve(value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcursor.continue();\n\t\t});\n\t});\n\nconst page = <T extends { readonly id: Id<string> }>(\n\tvalues: readonly T[],\n\tlimit: number,\n\torder: ScanOrder = \"ascending\",\n): Page<T, Cursor> => {\n\tconst items = values.slice(0, limit);\n\tif (values.length <= limit) return { items };\n\treturn { items, next: nextCursor(items.at(-1)!.id, order) };\n};\n\nconst cursorId = <I extends Id<string>>(cursor: Cursor | undefined): I | undefined => {\n\tconst after = cursor?.after;\n\tif (after === undefined) return undefined;\n\tif (typeof after !== \"number\" || !Number.isSafeInteger(after)) {\n\t\tthrow new StorageRequestError(\"Invalid storage cursor\");\n\t}\n\treturn idFromNumber<I>(after);\n};\n\nconst primaryRange = (start: ScanStart): IDBKeyRange | null => {\n\tif (start.after === undefined) return null;\n\treturn start.order === \"ascending\"\n\t\t? keyRanges().lowerBound(start.after, true)\n\t\t: keyRanges().upperBound(start.after, true);\n};\n\nconst compoundIdRange = (\n\tprefix: readonly IDBValidKey[],\n\tminimum: number,\n\tmaximum: number,\n\tminimumOpen = false,\n\tmaximumOpen = false,\n): IDBKeyRange => keyRanges().bound([...prefix, minimum], [...prefix, maximum], minimumOpen, maximumOpen);\n\nconst scanCompoundRows = <T extends { readonly id: number }>(\n\tindex: IDBIndex,\n\tprefix: readonly IDBValidKey[],\n\tstart: ScanStart,\n\tlimit: number,\n\taccept: (value: T) => boolean,\n): Promise<T[]> => {\n\tconst minimum = start.order === \"ascending\" && start.after !== undefined ? start.after : 0;\n\tconst maximum = start.order === \"descending\" && start.after !== undefined ? start.after : MAX_KEY;\n\treturn cursorValues<T>(\n\t\tindex,\n\t\tcompoundIdRange(\n\t\t\tprefix,\n\t\t\tminimum,\n\t\t\tmaximum,\n\t\t\tstart.order === \"ascending\" && start.after !== undefined,\n\t\t\tstart.order === \"descending\" && start.after !== undefined,\n\t\t),\n\t\tstart.order === \"ascending\" ? \"next\" : \"prev\",\n\t\tlimit,\n\t\taccept,\n\t);\n};\n\nconst scopeColumns = (scope: DocumentRecord[\"scope\"]): ScopeColumns => {\n\tswitch (scope.kind) {\n\t\tcase \"session\":\n\t\t\treturn { scopeKind: \"session\", ownerId: 0 };\n\t\tcase \"conversation\":\n\t\t\treturn { scopeKind: \"conversation\", ownerId: scope.conversationId };\n\t\tcase \"task\":\n\t\t\treturn { scopeKind: \"task\", ownerId: scope.taskId };\n\t}\n};\n\nconst addressParts = (address: DocumentAddress | DocumentCreate | DocumentRecord) => {\n\tconst scope = scopeColumns(address.scope);\n\treturn {\n\t\tkind: address.kind,\n\t\t...scope,\n\t\tfamily: address.key === undefined ? (0 as const) : (1 as const),\n\t\tkeyValue: address.key ?? \"\",\n\t};\n};\n\nconst addressPrefix = (address: DocumentAddress | DocumentCreate | DocumentRecord): readonly IDBValidKey[] => {\n\tconst parts = addressParts(address);\n\treturn [parts.kind, parts.scopeKind, parts.ownerId, parts.family, parts.keyValue];\n};\n\nconst addressKey = (address: DocumentAddress | DocumentCreate | DocumentRecord): string =>\n\tJSON.stringify(addressPrefix(address));\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 writeId = (write: StorageWrite): Id<string> | undefined => {\n\tswitch (write.type) {\n\t\tcase \"conversation\":\n\t\tcase \"entry\":\n\t\tcase \"task\":\n\t\tcase \"submission\":\n\t\t\treturn write.value.id;\n\t\tcase \"document.create\":\n\t\tcase \"document.copy\":\n\t\t\treturn write.record.id;\n\t\tcase \"document.change\":\n\t\tcase \"document.retire\":\n\t\t\treturn undefined;\n\t}\n};\n\nfunction createSchema(database: IDBDatabase): void {\n\tconst meta = database.createObjectStore(STORES.meta, { keyPath: \"key\" });\n\tmeta.add({ key: META_KEY, nextId: 2, nextSeq: 1 } satisfies MetaRow);\n\tdatabase.createObjectStore(STORES.recordIds, { keyPath: \"id\" });\n\n\tconst conversations = database.createObjectStore(STORES.conversations, { keyPath: \"id\" });\n\tconversations.createIndex(INDEXES.conversationsByOwnerConversation, [\"ownerConversationId\", \"id\"]);\n\tconversations.createIndex(INDEXES.conversationsByOwnerTask, [\"ownerTaskId\", \"id\"]);\n\n\tconst entries = database.createObjectStore(STORES.entries, { keyPath: \"id\" });\n\tentries.createIndex(INDEXES.entriesByConversation, [\"conversationId\", \"id\"]);\n\tentries.createIndex(INDEXES.entryHeadsByConversation, [\"headConversationId\", \"id\"]);\n\n\tconst tasks = database.createObjectStore(STORES.tasks, { keyPath: \"id\" });\n\ttasks.createIndex(INDEXES.tasksByStatus, [\"status\", \"id\"]);\n\ttasks.createIndex(INDEXES.tasksByConversation, [\"conversationId\", \"id\"]);\n\ttasks.createIndex(INDEXES.tasksByKind, [\"kind\", \"id\"]);\n\ttasks.createIndex(INDEXES.tasksByAbortRequested, [\"abortRequested\", \"id\"]);\n\ttasks.createIndex(INDEXES.tasksByBackground, [\"background\", \"id\"]);\n\n\tconst submissions = database.createObjectStore(STORES.submissions, { keyPath: \"id\" });\n\tsubmissions.createIndex(INDEXES.submissionsByRequest, [\"conversationId\", \"requestId\"]);\n\tsubmissions.createIndex(INDEXES.submissionsByConversation, [\"conversationId\", \"id\"]);\n\tsubmissions.createIndex(INDEXES.submissionsByStatus, [\"status\", \"id\"]);\n\n\tconst documents = database.createObjectStore(STORES.documents, { keyPath: \"id\" });\n\tdocuments.createIndex(INDEXES.documentsByAddress, [\n\t\t\"kind\",\n\t\t\"scopeKind\",\n\t\t\"ownerId\",\n\t\t\"family\",\n\t\t\"keyValue\",\n\t\t\"createdAt\",\n\t\t\"id\",\n\t]);\n\tdocuments.createIndex(INDEXES.documentsByScope, [\"scopeKind\", \"ownerId\", \"id\"]);\n\tdocuments.createIndex(INDEXES.documentsByScopeKind, [\"scopeKind\", \"ownerId\", \"kind\", \"id\"]);\n\n\tconst revisions = database.createObjectStore(STORES.documentRevisions, { keyPath: [\"documentId\", \"seq\"] });\n\trevisions.createIndex(INDEXES.documentRevisionsByKind, [\"documentId\", \"kind\", \"seq\"]);\n}\n\n/** Browser IndexedDB implementation of the durable storage contract. One owner must serialize access to each database. */\nexport class IndexedDbStorage implements Storage {\n\tprivate readonly database: IDBDatabase;\n\tprivate closed = false;\n\tprivate closing: Promise<void> | undefined;\n\tprivate activeOperations = 0;\n\tprivate operationsDrained: (() => void) | undefined;\n\n\tprivate constructor(database: IDBDatabase) {\n\t\tthis.database = database;\n\t}\n\n\t/** Open or create a browser-only IndexedDB database. */\n\tstatic async open(name: string, options: IndexedDbStorageOptions = {}): Promise<IndexedDbStorage> {\n\t\tconst factory = options.indexedDB ?? globalThis.indexedDB;\n\t\tif (factory === undefined) throw new Error(\"IndexedDB is not available\");\n\t\tconst request = factory.open(name, DATABASE_VERSION);\n\t\trequest.addEventListener(\"upgradeneeded\", (event) => {\n\t\t\tif ((event as IDBVersionChangeEvent).oldVersion === 0) createSchema(request.result);\n\t\t});\n\t\tconst database = await requestResult(request);\n\t\ttry {\n\t\t\tconst transaction = database.transaction(STORES.meta, \"readonly\");\n\t\t\tconst done = transactionResult(transaction);\n\t\t\tconst metadata = await requestResult(\n\t\t\t\ttransaction.objectStore(STORES.meta).get(META_KEY) as IDBRequest<MetaRow>,\n\t\t\t);\n\t\t\tawait done;\n\t\t\tif (metadata === undefined) throw new Error(\"Durable IndexedDB metadata is missing\");\n\t\t\treturn new IndexedDbStorage(database);\n\t\t} catch (error) {\n\t\t\tdatabase.close();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/** Delete a closed database. Open connections in this or another owner can block deletion. */\n\tstatic async delete(name: string, options: IndexedDbStorageOptions = {}): Promise<void> {\n\t\tconst factory = options.indexedDB ?? globalThis.indexedDB;\n\t\tif (factory === undefined) throw new Error(\"IndexedDB is not available\");\n\t\tawait requestResult(factory.deleteDatabase(name));\n\t}\n\n\t/**\n\t * Commit `batches` in one IndexedDB transaction, each with its own seq. Each batch does every read and check, copy\n\t * resolution included, against the state the earlier ones left before it issues its first write; the first one\n\t * refused ends the call, and the transaction commits the ones before it. An error of IndexedDB itself aborts the\n\t * transaction: the call rejects with nothing stored.\n\t */\n\tasync commit(\n\t\tbatches: readonly (readonly StorageWrite[])[],\n\t\treceive: (index: number, seq: Seq) => void,\n\t\t_context: Context,\n\t): Promise<CommitResult> {\n\t\tthis.assertOpen();\n\t\tconst seqs: Seq[] = [];\n\t\tlet refused: { readonly error: unknown } | undefined;\n\t\tawait this.transaction(ALL_STORES, \"readwrite\", async (transaction) => {\n\t\t\tconst metaStore = transaction.objectStore(STORES.meta);\n\t\t\tconst metadata = await requestResult(metaStore.get(META_KEY) as IDBRequest<MetaRow>);\n\t\t\tif (metadata === undefined) throw new Error(\"Durable IndexedDB metadata is missing\");\n\t\t\tlet next = metadata.nextSeq;\n\t\t\tlet nextId = metadata.nextId;\n\t\t\tfor (const writes of batches) {\n\t\t\t\tlet documentActions: Map<DocumentId, DocumentAction>;\n\t\t\t\ttry {\n\t\t\t\t\tdocumentActions = this.prepareDocumentActions(writes);\n\t\t\t\t\tawait this.checkGlobalIds(transaction, writes);\n\t\t\t\t\tawait this.checkDocumentActions(transaction, documentActions);\n\t\t\t\t\tawait this.resolveCopies(transaction, documentActions);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (fromIndexedDb(error)) throw error;\n\t\t\t\t\trefused = { error };\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst seq = seqFromNumber(next++);\n\t\t\t\tfor (const write of writes) await this.applyTableWrite(transaction, write, seq);\n\t\t\t\tawait this.applyDocumentActions(transaction, documentActions, seq);\n\t\t\t\tfor (const write of writes) {\n\t\t\t\t\tconst id = writeId(write);\n\t\t\t\t\tif (id !== undefined) nextId = Math.max(nextId, id + 1);\n\t\t\t\t}\n\t\t\t\tseqs.push(seq);\n\t\t\t}\n\t\t\tif (seqs.length > 0) {\n\t\t\t\tawait requestResult(metaStore.put({ key: META_KEY, nextId, nextSeq: next } satisfies MetaRow));\n\t\t\t}\n\t\t});\n\t\t// The transaction completed: the stored batches are durable.\n\t\tfor (const [index, seq] of seqs.entries()) receive(index, seq);\n\t\treturn refused === undefined ? { stored: seqs.length } : { stored: seqs.length, refused: refused.error };\n\t}\n\n\tasync mintId<I extends Id<string>>(): Promise<I> {\n\t\tthis.assertOpen();\n\t\treturn this.transaction(STORES.meta, \"readwrite\", async (transaction) => {\n\t\t\tconst store = transaction.objectStore(STORES.meta);\n\t\t\tconst metadata = await requestResult(store.get(META_KEY) as IDBRequest<MetaRow>);\n\t\t\tif (metadata === undefined) throw new Error(\"Durable IndexedDB metadata is missing\");\n\t\t\tif (!Number.isSafeInteger(metadata.nextId)) throw new Error(\"ID space is exhausted\");\n\t\t\tawait requestResult(store.put({ ...metadata, nextId: metadata.nextId + 1 }));\n\t\t\treturn idFromNumber<I>(metadata.nextId);\n\t\t});\n\t}\n\n\tconversation(id: ConversationId, _context: Context): Promise<ConversationRecord | undefined> {\n\t\treturn this.transaction(\n\t\t\tSTORES.conversations,\n\t\t\t\"readonly\",\n\t\t\tasync (transaction) =>\n\t\t\t\t(\n\t\t\t\t\tawait requestResult(\n\t\t\t\t\t\ttransaction.objectStore(STORES.conversations).get(id) as IDBRequest<ConversationRow | undefined>,\n\t\t\t\t\t)\n\t\t\t\t)?.record,\n\t\t);\n\t}\n\n\tasync scanConversations(\n\t\tquery: ConversationQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<ConversationRecord, Cursor>> {\n\t\tconst start = scanStart(query.order, cursor, \"ascending\");\n\t\treturn this.transaction(STORES.conversations, \"readonly\", async (transaction) => {\n\t\t\tconst store = transaction.objectStore(STORES.conversations);\n\t\t\tconst accept = (row: ConversationRow) =>\n\t\t\t\tquery.ownerConversationId === undefined || row.ownerConversationId === query.ownerConversationId;\n\t\t\tlet rows: ConversationRow[];\n\t\t\tif (query.ownerTaskId !== undefined) {\n\t\t\t\trows = await scanCompoundRows(\n\t\t\t\t\tstore.index(INDEXES.conversationsByOwnerTask),\n\t\t\t\t\t[query.ownerTaskId],\n\t\t\t\t\tstart,\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t} else if (query.ownerConversationId !== undefined) {\n\t\t\t\trows = await scanCompoundRows(\n\t\t\t\t\tstore.index(INDEXES.conversationsByOwnerConversation),\n\t\t\t\t\t[query.ownerConversationId],\n\t\t\t\t\tstart,\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trows = await cursorValues<ConversationRow>(\n\t\t\t\t\tstore,\n\t\t\t\t\tprimaryRange(start),\n\t\t\t\t\tstart.order === \"ascending\" ? \"next\" : \"prev\",\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn page(\n\t\t\t\trows.map((row) => row.record),\n\t\t\t\tlimit,\n\t\t\t\tstart.order,\n\t\t\t);\n\t\t});\n\t}\n\n\tentry(id: EntryId, context: Context): Promise<{ readonly entry: EntryRecord; readonly commitSeq: Seq } | undefined>;\n\tentry(\n\t\tconversationId: ConversationId,\n\t\tid: EntryId,\n\t\tcontext: Context,\n\t): Promise<{ readonly entry: EntryRecord; readonly commitSeq: Seq } | undefined>;\n\tentry(\n\t\tidOrConversationId: EntryId | ConversationId,\n\t\tidOrContext: EntryId | Context,\n\t\tcontext?: Context,\n\t): Promise<{ readonly entry: EntryRecord; readonly commitSeq: Seq } | undefined> {\n\t\treturn this.transaction([STORES.conversations, STORES.entries], \"readonly\", async (transaction) => {\n\t\t\tconst id =\n\t\t\t\tcontext === undefined\n\t\t\t\t\t? idFromNumber<EntryId>(idOrConversationId)\n\t\t\t\t\t: typeof idOrContext === \"number\"\n\t\t\t\t\t\t? idFromNumber<EntryId>(idOrContext)\n\t\t\t\t\t\t: undefined;\n\t\t\tif (id === undefined) throw new StorageRequestError(\"Storage.entry() requires an entry ID\");\n\t\t\tlet conversation: ConversationRecord | undefined;\n\t\t\tif (context !== undefined) {\n\t\t\t\tconst conversationId = idFromNumber<ConversationId>(idOrConversationId);\n\t\t\t\tconversation = await this.readConversation(transaction, conversationId);\n\t\t\t\tif (conversation === undefined) throw new StorageRequestError(`Unknown conversation: ${conversationId}`);\n\t\t\t}\n\t\t\tconst row = await requestResult(\n\t\t\t\ttransaction.objectStore(STORES.entries).get(id) as IDBRequest<EntryRow | undefined>,\n\t\t\t);\n\t\t\tif (row === undefined) return undefined;\n\t\t\tif (conversation !== undefined) {\n\t\t\t\tlet upperEntryId = MAX_KEY;\n\t\t\t\twhile (conversation.id !== row.conversationId) {\n\t\t\t\t\tif (conversation.parent === undefined) return undefined;\n\t\t\t\t\tupperEntryId = Math.min(upperEntryId, conversation.parent.at);\n\t\t\t\t\tconversation = (await this.readConversation(transaction, conversation.parent.conversationId))!;\n\t\t\t\t}\n\t\t\t\tif (row.id > upperEntryId) return undefined;\n\t\t\t}\n\t\t\treturn { entry: row.record, commitSeq: row.commitSeq };\n\t\t});\n\t}\n\n\tfindLatestHeadMarker(\n\t\tconversationId: ConversationId,\n\t\tatOrBeforeEntryId: EntryId | undefined,\n\t\t_context: Context,\n\t): Promise<(EntryRecord & { readonly head: EntryId }) | undefined> {\n\t\treturn this.transaction([STORES.conversations, STORES.entries], \"readonly\", async (transaction) => {\n\t\t\tlet conversation = await this.readConversation(transaction, conversationId);\n\t\t\tif (conversation === undefined) throw new StorageRequestError(`Unknown conversation: ${conversationId}`);\n\t\t\tlet upper = atOrBeforeEntryId ?? MAX_KEY;\n\t\t\tconst index = transaction.objectStore(STORES.entries).index(INDEXES.entryHeadsByConversation);\n\t\t\twhile (true) {\n\t\t\t\tconst row = await firstCursorValue<EntryRow>(index, compoundIdRange([conversation.id], 0, upper), \"prev\");\n\t\t\t\tif (row !== undefined) return row.record as EntryRecord & { readonly head: EntryId };\n\t\t\t\tif (conversation.parent === undefined) return undefined;\n\t\t\t\tupper = Math.min(upper, conversation.parent.at);\n\t\t\t\tconversation = (await this.readConversation(transaction, conversation.parent.conversationId))!;\n\t\t\t}\n\t\t});\n\t}\n\n\tasync scanEntries(\n\t\tquery: EntryQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<EntryRecord, Cursor>> {\n\t\tconst start = scanStart(query.order, cursor, \"descending\");\n\t\treturn this.transaction([STORES.conversations, STORES.entries], \"readonly\", async (transaction) => {\n\t\t\tconst values =\n\t\t\t\tstart.order === \"ascending\"\n\t\t\t\t\t? await this.readEntriesAscending(transaction, query, limit, start.after)\n\t\t\t\t\t: await this.readEntriesDescending(transaction, query, limit, start.after);\n\t\t\treturn page(values, limit, start.order);\n\t\t});\n\t}\n\n\ttask(id: TaskId, _context: Context): Promise<StoredTask | undefined> {\n\t\treturn this.transaction(\n\t\t\tSTORES.tasks,\n\t\t\t\"readonly\",\n\t\t\tasync (transaction) =>\n\t\t\t\t(await requestResult(transaction.objectStore(STORES.tasks).get(id) as IDBRequest<TaskRow | undefined>))\n\t\t\t\t\t?.record,\n\t\t);\n\t}\n\n\tasync scanTasks(\n\t\tquery: TaskQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<StoredTask, Cursor>> {\n\t\tconst start = scanStart(query.order, cursor, \"ascending\");\n\t\treturn this.transaction(STORES.tasks, \"readonly\", async (transaction) => {\n\t\t\tconst store = transaction.objectStore(STORES.tasks);\n\t\t\tconst accept = (row: TaskRow) =>\n\t\t\t\t(query.conversationId === undefined || row.conversationId === query.conversationId) &&\n\t\t\t\t(query.kind === undefined || row.kind === query.kind) &&\n\t\t\t\t(query.status === undefined || row.status === query.status) &&\n\t\t\t\t(query.abortRequested === undefined || row.abortRequested === (query.abortRequested ? 1 : 0)) &&\n\t\t\t\t(query.background === undefined || row.background === (query.background ? 1 : 0));\n\t\t\tlet source: IDBObjectStore | IDBIndex = store;\n\t\t\tlet prefix: readonly IDBValidKey[] | undefined;\n\t\t\tif (query.status !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByStatus);\n\t\t\t\tprefix = [query.status];\n\t\t\t} else if (query.conversationId !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByConversation);\n\t\t\t\tprefix = [query.conversationId];\n\t\t\t} else if (query.kind !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByKind);\n\t\t\t\tprefix = [query.kind];\n\t\t\t} else if (query.abortRequested !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByAbortRequested);\n\t\t\t\tprefix = [query.abortRequested ? 1 : 0];\n\t\t\t} else if (query.background !== undefined) {\n\t\t\t\tsource = store.index(INDEXES.tasksByBackground);\n\t\t\t\tprefix = [query.background ? 1 : 0];\n\t\t\t}\n\t\t\tconst rows =\n\t\t\t\tprefix === undefined\n\t\t\t\t\t? await cursorValues<TaskRow>(\n\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\tprimaryRange(start),\n\t\t\t\t\t\t\tstart.order === \"ascending\" ? \"next\" : \"prev\",\n\t\t\t\t\t\t\tlimit + 1,\n\t\t\t\t\t\t\taccept,\n\t\t\t\t\t\t)\n\t\t\t\t\t: await scanCompoundRows<TaskRow>(source as IDBIndex, prefix, start, limit + 1, accept);\n\t\t\treturn page(\n\t\t\t\trows.map((row) => row.record),\n\t\t\t\tlimit,\n\t\t\t\tstart.order,\n\t\t\t);\n\t\t});\n\t}\n\n\tsubmission(id: SubmissionId, _context: Context): Promise<SubmissionRecord | undefined> {\n\t\treturn this.transaction(\n\t\t\tSTORES.submissions,\n\t\t\t\"readonly\",\n\t\t\tasync (transaction) =>\n\t\t\t\t(\n\t\t\t\t\tawait requestResult(\n\t\t\t\t\t\ttransaction.objectStore(STORES.submissions).get(id) as IDBRequest<SubmissionRow | undefined>,\n\t\t\t\t\t)\n\t\t\t\t)?.record,\n\t\t);\n\t}\n\n\tasync scanSubmissions(\n\t\tquery: SubmissionQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<SubmissionRecord, Cursor>> {\n\t\tconst start = scanStart(query.order, cursor, \"ascending\");\n\t\treturn this.transaction(STORES.submissions, \"readonly\", async (transaction) => {\n\t\t\tconst store = transaction.objectStore(STORES.submissions);\n\t\t\tconst accept = (row: SubmissionRow) =>\n\t\t\t\t(query.conversationId === undefined || row.conversationId === query.conversationId) &&\n\t\t\t\t(query.status === undefined || row.status === query.status);\n\t\t\tlet rows: SubmissionRow[];\n\t\t\tif (query.status !== undefined) {\n\t\t\t\trows = await scanCompoundRows(\n\t\t\t\t\tstore.index(INDEXES.submissionsByStatus),\n\t\t\t\t\t[query.status],\n\t\t\t\t\tstart,\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t} else if (query.conversationId !== undefined) {\n\t\t\t\trows = await scanCompoundRows(\n\t\t\t\t\tstore.index(INDEXES.submissionsByConversation),\n\t\t\t\t\t[query.conversationId],\n\t\t\t\t\tstart,\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trows = await cursorValues<SubmissionRow>(\n\t\t\t\t\tstore,\n\t\t\t\t\tprimaryRange(start),\n\t\t\t\t\tstart.order === \"ascending\" ? \"next\" : \"prev\",\n\t\t\t\t\tlimit + 1,\n\t\t\t\t\taccept,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn page(\n\t\t\t\trows.map((row) => row.record),\n\t\t\t\tlimit,\n\t\t\t\tstart.order,\n\t\t\t);\n\t\t});\n\t}\n\n\tsubmissionByRequest(\n\t\tconversationId: ConversationId,\n\t\trequestId: string,\n\t\t_context: Context,\n\t): Promise<SubmissionRecord | undefined> {\n\t\treturn this.transaction(STORES.submissions, \"readonly\", async (transaction) => {\n\t\t\tconst row = await requestResult(\n\t\t\t\ttransaction\n\t\t\t\t\t.objectStore(STORES.submissions)\n\t\t\t\t\t.index(INDEXES.submissionsByRequest)\n\t\t\t\t\t.get([conversationId, requestId]) as IDBRequest<SubmissionRow | undefined>,\n\t\t\t);\n\t\t\treturn row?.record;\n\t\t});\n\t}\n\n\tfindDocument(address: DocumentAddress, at: DocumentPoint, _context: Context): Promise<DocumentRecord | undefined> {\n\t\treturn this.transaction(STORES.documents, \"readonly\", async (transaction) => {\n\t\t\tconst row = await firstCursorValue<DocumentRow>(\n\t\t\t\ttransaction.objectStore(STORES.documents).index(INDEXES.documentsByAddress),\n\t\t\t\tkeyRanges().bound([...addressPrefix(address), 0, 0], [...addressPrefix(address), MAX_KEY, MAX_KEY]),\n\t\t\t\t\"prev\",\n\t\t\t\t(value) => isAliveAt(value.record, at),\n\t\t\t);\n\t\t\treturn row?.record;\n\t\t});\n\t}\n\n\tdocument(id: DocumentId, at: DocumentPoint, _context: Context): Promise<StoredDocument | undefined> {\n\t\treturn this.transaction([STORES.documents, STORES.documentRevisions], \"readonly\", (transaction) =>\n\t\t\tthis.materializeDocument(transaction, id, at),\n\t\t);\n\t}\n\n\tasync scanDocuments(\n\t\tquery: DocumentQuery,\n\t\tlimit: number,\n\t\tcursor: Cursor | undefined,\n\t\t_context: Context,\n\t): Promise<Page<DocumentRecord, Cursor>> {\n\t\tconst after = cursorId<DocumentId>(cursor);\n\t\treturn this.transaction(STORES.documents, \"readonly\", async (transaction) => {\n\t\t\tconst scope = scopeColumns(query.scope);\n\t\t\tconst store = transaction.objectStore(STORES.documents);\n\t\t\tconst index =\n\t\t\t\tquery.kind === undefined\n\t\t\t\t\t? store.index(INDEXES.documentsByScope)\n\t\t\t\t\t: store.index(INDEXES.documentsByScopeKind);\n\t\t\tconst prefix: readonly IDBValidKey[] =\n\t\t\t\tquery.kind === undefined ? [scope.scopeKind, scope.ownerId] : [scope.scopeKind, scope.ownerId, query.kind];\n\t\t\tconst rows = await cursorValues<DocumentRow>(\n\t\t\t\tindex,\n\t\t\t\tcompoundIdRange(prefix, after ?? 0, MAX_KEY, after !== undefined),\n\t\t\t\t\"next\",\n\t\t\t\tlimit + 1,\n\t\t\t\t(row) => isAliveAt(row.record, query.at),\n\t\t\t);\n\t\t\treturn page(\n\t\t\t\trows.map((row) => row.record),\n\t\t\t\tlimit,\n\t\t\t);\n\t\t});\n\t}\n\n\tclose(_context: Context): Promise<void> {\n\t\tif (this.closing === undefined) {\n\t\t\tthis.closed = true;\n\t\t\tthis.closing = this.closeDatabase();\n\t\t}\n\t\treturn this.closing;\n\t}\n\n\tprivate async closeDatabase(): Promise<void> {\n\t\tif (this.activeOperations > 0) {\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tthis.operationsDrained = resolve;\n\t\t\t});\n\t\t}\n\t\tthis.database.close();\n\t}\n\n\tprivate async transaction<T>(\n\t\tstores: string | readonly string[],\n\t\tmode: IDBTransactionMode,\n\t\toperation: (transaction: IDBTransaction) => Promise<T>,\n\t): Promise<T> {\n\t\tthis.assertOpen();\n\t\tthis.activeOperations++;\n\t\ttry {\n\t\t\tconst transaction = this.database.transaction(stores, mode);\n\t\t\tconst done = transactionResult(transaction);\n\t\t\ttry {\n\t\t\t\tconst value = await operation(transaction);\n\t\t\t\tawait done;\n\t\t\t\treturn value;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\ttransaction.abort();\n\t\t\t\t} catch {\n\t\t\t\t\t// It may already have aborted or committed.\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait done;\n\t\t\t\t} catch {\n\t\t\t\t\t// Preserve the operation failure.\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} finally {\n\t\t\tif (--this.activeOperations === 0) this.operationsDrained?.();\n\t\t}\n\t}\n\n\tprivate async readConversation(\n\t\ttransaction: IDBTransaction,\n\t\tid: ConversationId,\n\t): Promise<ConversationRecord | undefined> {\n\t\treturn (\n\t\t\tawait requestResult(\n\t\t\t\ttransaction.objectStore(STORES.conversations).get(id) as IDBRequest<ConversationRow | undefined>,\n\t\t\t)\n\t\t)?.record;\n\t}\n\n\tprivate async readEntriesDescending(\n\t\ttransaction: IDBTransaction,\n\t\tquery: EntryQuery,\n\t\tlimit: number,\n\t\tafter: number | undefined,\n\t): Promise<EntryRecord[]> {\n\t\tlet conversation = await this.readConversation(transaction, query.conversationId);\n\t\tif (conversation === undefined) throw new StorageRequestError(`Unknown conversation: ${query.conversationId}`);\n\t\tlet upper = query.maxEntryId ?? MAX_KEY;\n\t\tif (after !== undefined) upper = Math.min(upper, after - 1);\n\t\tconst minimum = query.minEntryId ?? 0;\n\t\tconst values: EntryRecord[] = [];\n\t\tconst index = transaction.objectStore(STORES.entries).index(INDEXES.entriesByConversation);\n\t\twhile (true) {\n\t\t\tif (upper >= minimum) {\n\t\t\t\tconst rows = await cursorValues<EntryRow>(\n\t\t\t\t\tindex,\n\t\t\t\t\tcompoundIdRange([conversation.id], minimum, upper),\n\t\t\t\t\t\"prev\",\n\t\t\t\t\tlimit + 1 - values.length,\n\t\t\t\t);\n\t\t\t\tvalues.push(...rows.map((row) => row.record));\n\t\t\t}\n\t\t\tif (values.length > limit || conversation.parent === undefined) break;\n\t\t\tupper = Math.min(upper, conversation.parent.at);\n\t\t\tif (upper < minimum) break;\n\t\t\tconversation = (await this.readConversation(transaction, conversation.parent.conversationId))!;\n\t\t}\n\t\treturn values;\n\t}\n\n\tprivate async readEntriesAscending(\n\t\ttransaction: IDBTransaction,\n\t\tquery: EntryQuery,\n\t\tlimit: number,\n\t\tafter: number | undefined,\n\t): Promise<EntryRecord[]> {\n\t\tconst segments: { readonly conversationId: ConversationId; readonly upper: number }[] = [];\n\t\tlet conversation = await this.readConversation(transaction, query.conversationId);\n\t\tif (conversation === undefined) throw new StorageRequestError(`Unknown conversation: ${query.conversationId}`);\n\t\tlet upper = query.maxEntryId ?? MAX_KEY;\n\t\tconst requestedMinimum = query.minEntryId ?? 0;\n\t\twhile (true) {\n\t\t\tsegments.push({ conversationId: conversation.id, upper });\n\t\t\tif (conversation.parent === undefined) break;\n\t\t\tupper = Math.min(upper, conversation.parent.at);\n\t\t\tif (upper < requestedMinimum) break;\n\t\t\tconversation = (await this.readConversation(transaction, conversation.parent.conversationId))!;\n\t\t}\n\t\tconst minimum = after === undefined ? requestedMinimum : Math.max(requestedMinimum, after + 1);\n\t\tconst values: EntryRecord[] = [];\n\t\tconst index = transaction.objectStore(STORES.entries).index(INDEXES.entriesByConversation);\n\t\tfor (const segment of segments.reverse()) {\n\t\t\tif (segment.upper < minimum) continue;\n\t\t\tconst rows = await cursorValues<EntryRow>(\n\t\t\t\tindex,\n\t\t\t\tcompoundIdRange([segment.conversationId], minimum, segment.upper),\n\t\t\t\t\"next\",\n\t\t\t\tlimit + 1 - values.length,\n\t\t\t);\n\t\t\tvalues.push(...rows.map((row) => row.record));\n\t\t\tif (values.length > limit) break;\n\t\t}\n\t\treturn values;\n\t}\n\n\tprivate async materializeDocument(\n\t\ttransaction: IDBTransaction,\n\t\tid: DocumentId,\n\t\tat: DocumentPoint,\n\t): Promise<StoredDocument | undefined> {\n\t\tconst record = (\n\t\t\tawait requestResult(transaction.objectStore(STORES.documents).get(id) as IDBRequest<DocumentRow | undefined>)\n\t\t)?.record;\n\t\tif (record === undefined) return undefined;\n\t\tif (at !== \"current\" && isCurrentOnly(record)) {\n\t\t\tthrow new StorageRequestError(`Document ${id} does not retain historical content`);\n\t\t}\n\t\tif (!isAliveAt(record, at)) return undefined;\n\t\tconst upper = at === \"current\" ? MAX_KEY : at;\n\t\tconst revisions = transaction.objectStore(STORES.documentRevisions);\n\t\tconst base = await firstCursorValue<RevisionRow>(\n\t\t\trevisions.index(INDEXES.documentRevisionsByKind),\n\t\t\tkeyRanges().bound([id, \"base\", 0], [id, \"base\", upper]),\n\t\t\t\"prev\",\n\t\t);\n\t\tif (base === undefined || base.kind !== \"base\") throw new Error(`Document ${id} is missing a required base`);\n\t\tlet value = base.content as JsonObject;\n\t\tconst tail =\n\t\t\tbase.seq >= upper\n\t\t\t\t? []\n\t\t\t\t: await cursorValues<RevisionRow>(\n\t\t\t\t\t\trevisions,\n\t\t\t\t\t\tkeyRanges().bound([id, base.seq], [id, upper], true),\n\t\t\t\t\t\t\"next\",\n\t\t\t\t\t\tMAX_KEY,\n\t\t\t\t\t);\n\t\tfor (const revision of tail) {\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 = apply(value, revision.content as readonly Op[]) as JsonObject;\n\t\t}\n\t\treturn { record, version: base.version, value, deltasSinceBase: tail.length };\n\t}\n\n\tprivate async checkGlobalIds(transaction: IDBTransaction, writes: readonly StorageWrite[]): Promise<void> {\n\t\tconst store = transaction.objectStore(STORES.recordIds);\n\t\tconst claimed = new Map<Id<string>, 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 document = write.type === \"document.create\" || write.type === \"document.copy\";\n\t\t\tconst table: TableName = document ? \"document\" : write.type;\n\t\t\tconst id = document ? write.record.id : write.value.id;\n\t\t\tconst existing = (await requestResult(store.get(id) as IDBRequest<RecordIdRow | undefined>))?.recordType;\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\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<DocumentId, DocumentAction> {\n\t\tconst actions = new Map<DocumentId, DocumentAction>();\n\t\tfor (const write of writes) {\n\t\t\tif (\n\t\t\t\twrite.type !== \"document.create\" &&\n\t\t\t\twrite.type !== \"document.copy\" &&\n\t\t\t\twrite.type !== \"document.change\" &&\n\t\t\t\twrite.type !== \"document.retire\"\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst id = write.type === \"document.create\" || write.type === \"document.copy\" ? 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 || action.copy !== 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.copy\":\n\t\t\t\t\tif (action.create !== undefined || action.content !== undefined || action.copy !== 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.copy = write.source;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.change\":\n\t\t\t\t\tif (action.content !== undefined || action.copy !== 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.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 async checkDocumentActions(\n\t\ttransaction: IDBTransaction,\n\t\tactions: ReadonlyMap<DocumentId, DocumentAction>,\n\t): Promise<void> {\n\t\tconst documents = transaction.objectStore(STORES.documents);\n\t\tconst revisions = transaction.objectStore(STORES.documentRevisions);\n\t\tconst liveCounts = new Map<string, number>();\n\t\tfor (const [id, action] of actions) {\n\t\t\tif (action.copy !== undefined && actions.has(action.copy.id)) {\n\t\t\t\tthrow new Error(`Document copy ${id} source is changed in the copy batch`);\n\t\t\t}\n\t\t\tconst existing = (await requestResult(documents.get(id) as IDBRequest<DocumentRow | undefined>))?.record;\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?.retiredAt !== undefined) throw new Error(`Document ${id} is retired`);\n\t\t\tif (action.content?.kind === \"delta\") {\n\t\t\t\tconst previous = await firstCursorValue<RevisionRow>(revisions, compoundIdRange([id], 0, MAX_KEY), \"prev\");\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\t\t\tconst record = action.create ?? existing!;\n\t\t\tconst key = addressKey(record);\n\t\t\tlet live = liveCounts.get(key);\n\t\t\tif (live === undefined) live = (await this.currentDocumentId(transaction, record)) === undefined ? 0 : 1;\n\t\t\tif (action.retire && existing !== undefined) live--;\n\t\t\tif (action.create !== undefined && !action.retire) live++;\n\t\t\tliveCounts.set(key, live);\n\t\t}\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 async currentDocumentId(\n\t\ttransaction: IDBTransaction,\n\t\taddress: DocumentAddress | DocumentCreate | DocumentRecord,\n\t): Promise<DocumentId | undefined> {\n\t\tconst row = await firstCursorValue<DocumentRow>(\n\t\t\ttransaction.objectStore(STORES.documents).index(INDEXES.documentsByAddress),\n\t\t\tkeyRanges().bound([...addressPrefix(address), 0, 0], [...addressPrefix(address), MAX_KEY, MAX_KEY]),\n\t\t\t\"prev\",\n\t\t\t(value) => value.retiredAt === undefined,\n\t\t);\n\t\treturn row?.id;\n\t}\n\n\tprivate async claimId(transaction: IDBTransaction, id: Id<string>, recordType: TableName): Promise<void> {\n\t\tawait requestResult(transaction.objectStore(STORES.recordIds).put({ id, recordType } satisfies RecordIdRow));\n\t}\n\n\tprivate async applyTableWrite(transaction: IDBTransaction, write: StorageWrite, seq: Seq): Promise<void> {\n\t\tswitch (write.type) {\n\t\t\tcase \"conversation\":\n\t\t\t\tawait this.claimId(transaction, write.value.id, \"conversation\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\ttransaction.objectStore(STORES.conversations).add({\n\t\t\t\t\t\tid: write.value.id,\n\t\t\t\t\t\t...(write.value.owner === undefined\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\townerConversationId: write.value.owner.conversationId,\n\t\t\t\t\t\t\t\t\townerTaskId: write.value.owner.taskId,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\trecord: write.value,\n\t\t\t\t\t} satisfies ConversationRow),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"entry\":\n\t\t\t\tawait this.claimId(transaction, write.value.id, \"entry\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\ttransaction.objectStore(STORES.entries).add({\n\t\t\t\t\t\tid: write.value.id,\n\t\t\t\t\t\tconversationId: write.value.conversationId,\n\t\t\t\t\t\t...(write.value.head === undefined ? {} : { headConversationId: write.value.conversationId }),\n\t\t\t\t\t\tcommitSeq: seq,\n\t\t\t\t\t\trecord: write.value,\n\t\t\t\t\t} satisfies EntryRow),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"task\":\n\t\t\t\tawait this.claimId(transaction, write.value.id, \"task\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\ttransaction.objectStore(STORES.tasks).put({\n\t\t\t\t\t\tid: write.value.id,\n\t\t\t\t\t\tconversationId: write.value.conversationId,\n\t\t\t\t\t\tkind: write.value.kind,\n\t\t\t\t\t\tstatus: write.value.state.status,\n\t\t\t\t\t\tabortRequested: write.value.abortRequested ? 1 : 0,\n\t\t\t\t\t\tbackground: write.value.background ? 1 : 0,\n\t\t\t\t\t\trecord: write.value,\n\t\t\t\t\t} satisfies TaskRow),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"submission\":\n\t\t\t\tawait this.claimId(transaction, write.value.id, \"submission\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\ttransaction.objectStore(STORES.submissions).put({\n\t\t\t\t\t\tid: write.value.id,\n\t\t\t\t\t\tconversationId: write.value.conversationId,\n\t\t\t\t\t\t...(write.value.requestId === undefined ? {} : { requestId: write.value.requestId }),\n\t\t\t\t\t\tstatus: write.value.status,\n\t\t\t\t\t\trecord: write.value,\n\t\t\t\t\t} satisfies SubmissionRow),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"document.create\":\n\t\t\tcase \"document.copy\":\n\t\t\tcase \"document.change\":\n\t\t\tcase \"document.retire\":\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** Resolve each copy to a base of its source's state before this batch, which may not change the source. */\n\tprivate async resolveCopies(transaction: IDBTransaction, actions: Map<DocumentId, DocumentAction>): Promise<void> {\n\t\tfor (const [id, action] of actions) {\n\t\t\tif (action.copy === undefined) continue;\n\t\t\ttry {\n\t\t\t\tconst stored = await this.materializeDocument(transaction, action.copy.id, action.copy.at);\n\t\t\t\tif (stored === undefined) throw new Error(`Fork source document ${action.copy.id} cannot be read`);\n\t\t\t\tconst create = action.create!;\n\t\t\t\tif (\n\t\t\t\t\tstored.record.scope.kind !== \"conversation\" ||\n\t\t\t\t\tcreate.scope.kind !== \"conversation\" ||\n\t\t\t\t\tstored.record.kind !== create.kind ||\n\t\t\t\t\tstored.record.key !== create.key ||\n\t\t\t\t\tstored.record.history !== create.history ||\n\t\t\t\t\tstored.record.fork !== create.fork\n\t\t\t\t) {\n\t\t\t\t\tthrow new Error(`Fork source document ${action.copy.id} does not match the copied record`);\n\t\t\t\t}\n\t\t\t\taction.content = { kind: \"base\", version: stored.version, value: stored.value };\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(`Document copy ${id} was rejected`, { cause: error });\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async applyDocumentActions(\n\t\ttransaction: IDBTransaction,\n\t\tactions: ReadonlyMap<DocumentId, DocumentAction>,\n\t\tseq: Seq,\n\t): Promise<void> {\n\t\tconst documents = transaction.objectStore(STORES.documents);\n\t\tconst revisions = transaction.objectStore(STORES.documentRevisions);\n\t\tfor (const [id, action] of actions) {\n\t\t\t// Copies are resolved to their content by `resolveCopies()`.\n\t\t\tconst content = action.content;\n\t\t\tlet record: DocumentRecord;\n\t\t\tif (action.create !== undefined) {\n\t\t\t\trecord = {\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\tconst parts = addressParts(record);\n\t\t\t\tawait this.claimId(transaction, id, \"document\");\n\t\t\t\tawait requestResult(\n\t\t\t\t\tdocuments.add({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\t...parts,\n\t\t\t\t\t\tcreatedAt: seq,\n\t\t\t\t\t\t...(action.retire ? { retiredAt: seq } : {}),\n\t\t\t\t\t\trecord,\n\t\t\t\t\t} satisfies DocumentRow),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trecord = (await requestResult(documents.get(id) as IDBRequest<DocumentRow>)).record;\n\t\t\t}\n\n\t\t\tif (content !== undefined) {\n\t\t\t\tif (content.kind === \"base\" && isCurrentOnly(record)) {\n\t\t\t\t\tawait requestResult(revisions.delete(compoundIdRange([id], 0, MAX_KEY)));\n\t\t\t\t}\n\t\t\t\tawait requestResult(\n\t\t\t\t\trevisions.add({\n\t\t\t\t\t\tdocumentId: id,\n\t\t\t\t\t\tseq,\n\t\t\t\t\t\tkind: content.kind,\n\t\t\t\t\t\tversion: content.version,\n\t\t\t\t\t\tcontent: content.kind === \"base\" ? content.value : content.ops,\n\t\t\t\t\t} satisfies RevisionRow),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (action.retire) {\n\t\t\t\tif (action.create === undefined) {\n\t\t\t\t\trecord = { ...record, retiredAt: seq };\n\t\t\t\t\tconst row = (await requestResult(documents.get(id) as IDBRequest<DocumentRow>))!;\n\t\t\t\t\tawait requestResult(documents.put({ ...row, retiredAt: seq, record } satisfies DocumentRow));\n\t\t\t\t}\n\t\t\t\tif (isCurrentOnly(record)) {\n\t\t\t\t\tawait requestResult(revisions.delete(compoundIdRange([id], 0, MAX_KEY)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.closed) throw new Error(\"IndexedDbStorage is closed\");\n\t}\n}\n\nexport type { IndexedDbStorageOptions };\n"]}
@@ -1,2 +1,2 @@
1
- export { JsonlCorruptionError, JsonlStorage, type JsonlStorageOptions, JsonlStoragePoisonedError, } from "./storage.ts";
1
+ export { JsonlCorruptionError, JsonlStorage, type JsonlStorageOptions, JsonlStoragePoisonedError, JsonlStorageReadOnlyError, } from "./storage.ts";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/jsonl/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,YAAY,EACZ,KAAK,mBAAmB,EACxB,yBAAyB,GACzB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/jsonl/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,YAAY,EACZ,KAAK,mBAAmB,EACxB,yBAAyB,EACzB,yBAAyB,GACzB,MAAM,cAAc,CAAC"}
@@ -1,2 +1,2 @@
1
- export { JsonlCorruptionError, JsonlStorage, JsonlStoragePoisonedError, } from "./storage.js";
1
+ export { JsonlCorruptionError, JsonlStorage, JsonlStoragePoisonedError, JsonlStorageReadOnlyError, } from "./storage.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/jsonl/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,YAAY,EAEZ,yBAAyB,GACzB,MAAM,cAAc,CAAC","sourcesContent":["export {\n\tJsonlCorruptionError,\n\tJsonlStorage,\n\ttype JsonlStorageOptions,\n\tJsonlStoragePoisonedError,\n} from \"./storage.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/jsonl/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,YAAY,EAEZ,yBAAyB,EACzB,yBAAyB,GACzB,MAAM,cAAc,CAAC","sourcesContent":["export {\n\tJsonlCorruptionError,\n\tJsonlStorage,\n\ttype JsonlStorageOptions,\n\tJsonlStoragePoisonedError,\n\tJsonlStorageReadOnlyError,\n} from \"./storage.ts\";\n"]}
@@ -1,6 +1,6 @@
1
- import type { Context } from "@earendil-works/chord";
1
+ import type { Context } from "@earendil-works/chord/context";
2
2
  import { JsonlStorage, type JsonlStorageOptions } from "./storage.ts";
3
- /** Open or create a JSONL storage directory using the local Node filesystem. */
3
+ /** Open or create a JSONL storage directory using the local Node filesystem; `readOnly` opens one without writing. */
4
4
  export declare function openNodeJsonlStorage(directory: string, context: Context, options?: JsonlStorageOptions): Promise<JsonlStorage>;
5
- export { JsonlStorage, type JsonlStorageOptions } from "./storage.ts";
5
+ export { JsonlStorage, type JsonlStorageOptions, JsonlStorageReadOnlyError } from "./storage.ts";
6
6
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/storage/jsonl/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEtE,gFAAgF;AAChF,wBAAsB,oBAAoB,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,YAAY,CAAC,CAEvB;AAED,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/storage/jsonl/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEtE,sHAAsH;AACtH,wBAAsB,oBAAoB,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,YAAY,CAAC,CAEvB;AAED,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { NodeExecutionEnv } from "../../env/node.js";
2
2
  import { JsonlStorage } from "./storage.js";
3
- /** Open or create a JSONL storage directory using the local Node filesystem. */
3
+ /** Open or create a JSONL storage directory using the local Node filesystem; `readOnly` opens one without writing. */
4
4
  export async function openNodeJsonlStorage(directory, context, options = {}) {
5
5
  return JsonlStorage.open(directory, new NodeExecutionEnv({ cwd: process.cwd() }), context, options);
6
6
  }
7
- export { JsonlStorage } from "./storage.js";
7
+ export { JsonlStorage, JsonlStorageReadOnlyError } from "./storage.js";
8
8
  //# sourceMappingURL=node.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/storage/jsonl/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAA4B,MAAM,cAAc,CAAC;AAEtE,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,SAAiB,EACjB,OAAgB,EAChB,OAAO,GAAwB,EAAE;IAEjC,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,gBAAgB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACrG,CAAC;AAED,OAAO,EAAE,YAAY,EAA4B,MAAM,cAAc,CAAC","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport { NodeExecutionEnv } from \"../../env/node.ts\";\nimport { JsonlStorage, type JsonlStorageOptions } from \"./storage.ts\";\n\n/** Open or create a JSONL storage directory using the local Node filesystem. */\nexport async function openNodeJsonlStorage(\n\tdirectory: string,\n\tcontext: Context,\n\toptions: JsonlStorageOptions = {},\n): Promise<JsonlStorage> {\n\treturn JsonlStorage.open(directory, new NodeExecutionEnv({ cwd: process.cwd() }), context, options);\n}\n\nexport { JsonlStorage, type JsonlStorageOptions } from \"./storage.ts\";\n"]}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/storage/jsonl/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAA4B,MAAM,cAAc,CAAC;AAEtE,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,SAAiB,EACjB,OAAgB,EAChB,OAAO,GAAwB,EAAE;IAEjC,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,gBAAgB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACrG,CAAC;AAED,OAAO,EAAE,YAAY,EAA4B,yBAAyB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["import type { Context } from \"@earendil-works/chord/context\";\nimport { NodeExecutionEnv } from \"../../env/node.ts\";\nimport { JsonlStorage, type JsonlStorageOptions } from \"./storage.ts\";\n\n/** Open or create a JSONL storage directory using the local Node filesystem; `readOnly` opens one without writing. */\nexport async function openNodeJsonlStorage(\n\tdirectory: string,\n\tcontext: Context,\n\toptions: JsonlStorageOptions = {},\n): Promise<JsonlStorage> {\n\treturn JsonlStorage.open(directory, new NodeExecutionEnv({ cwd: process.cwd() }), context, options);\n}\n\nexport { JsonlStorage, type JsonlStorageOptions, JsonlStorageReadOnlyError } from \"./storage.ts\";\n"]}
@@ -1,13 +1,24 @@
1
- import type { Context, JsonValue } from "@earendil-works/chord";
1
+ import type { Context } from "@earendil-works/chord/context";
2
+ import type { JsonValue } from "@earendil-works/chord/json";
2
3
  import type { FileSystem } from "../../env/index.ts";
3
4
  import type { CommitResult, ConversationId, ConversationQuery, Cursor, DocumentAddress, DocumentId, DocumentPoint, DocumentQuery, EntryId, EntryQuery, Id, Seq, Storage, StorageWrite, SubmissionId, SubmissionQuery, TaskId, TaskQuery } from "../../types.ts";
4
5
  export type JsonlStorageOptions = {
5
6
  /** Flush every affected sidecar before appending the main marker. Defaults to false. */
6
7
  readonly fsync?: boolean;
8
+ /**
9
+ * Open without writing, for a viewer of a directory another process may be writing: recovery skips torn final lines
10
+ * and unconfirmed sidecar tails in memory instead of truncating them, reclaims nothing, and creates no directory.
11
+ * The storage holds the state committed at open and `commit()` rejects. Defaults to false.
12
+ */
13
+ readonly readOnly?: boolean;
7
14
  };
8
15
  export declare class JsonlCorruptionError extends Error {
9
16
  constructor(message: string, cause?: Error);
10
17
  }
18
+ /** `commit()` on a storage opened with `readOnly: true`. Nothing was written. */
19
+ export declare class JsonlStorageReadOnlyError extends Error {
20
+ constructor();
21
+ }
11
22
  export declare class JsonlStoragePoisonedError extends Error {
12
23
  constructor(cause: Error);
13
24
  }
@@ -17,15 +28,21 @@ export declare class JsonlStorage implements Storage {
17
28
  private readonly directory;
18
29
  private readonly mainPath;
19
30
  private readonly fsync;
31
+ private readonly readOnly;
20
32
  private readonly memory;
21
33
  private readonly currentOnlyDocuments;
22
34
  private readonly liveTaskSidecars;
23
35
  private closed;
36
+ /** Bytes of `main.jsonl` recovery read (`mainChanged()`). */
37
+ private mainSize;
24
38
  private poisonError;
25
39
  /** Settles once the batch being appended is; its batches are in memory already (`commit()`). */
26
40
  private writing;
27
41
  private constructor();
28
- /** Open or create a JSONL storage directory using the supplied filesystem. */
42
+ /**
43
+ * Open or create a JSONL storage directory using the supplied filesystem. With `readOnly`, open an existing one
44
+ * without writing; a recovery that fails while `main.jsonl` changes raced a writer's commit and is retried.
45
+ */
29
46
  static open(directory: string, fs: FileSystem, context: Context, options?: JsonlStorageOptions): Promise<JsonlStorage>;
30
47
  /**
31
48
  * Commit `batches` with one append per affected file: every batch's sidecar records first, then their markers in one
@@ -158,9 +175,21 @@ export declare class JsonlStorage implements Storage {
158
175
  /** The marker already published this state, so reclamation is retryable best-effort maintenance. */
159
176
  private reclaimSidecars;
160
177
  private replaceSidecar;
178
+ /**
179
+ * Load the confirmed state. A writable open also repairs the files: it truncates torn lines and unconfirmed sidecar
180
+ * tails, removes leftover reclaim files, and reclaims sidecar records later commits made unnecessary. A read-only
181
+ * open skips the same records in memory only.
182
+ */
161
183
  private recover;
162
184
  private static confirmRecord;
163
- private static readLines;
185
+ /** Parse the complete lines of `path`; a torn final line is truncated, or only skipped when read-only. */
186
+ private readLines;
187
+ /**
188
+ * Whether `main.jsonl` changed size since recovery read it. A writer reclaims a sidecar only after appending the
189
+ * marker that allows it, so sidecars read while `main.jsonl` stayed the same match its markers; a recovery that
190
+ * failed while it changed may have read a sidecar a newer commit reclaimed.
191
+ */
192
+ private mainChanged;
164
193
  private resolveFile;
165
194
  private get store();
166
195
  /** The state to read once no batch is being appended: memory runs ahead of the file while one is. */
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage/jsonl/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage/jsonl/storage.ts"],"names":[],"mappings":"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"}