@earendil-works/pi-durable 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/CHANGELOG.md +227 -0
  2. package/README.md +287 -82
  3. package/dist/codemode/codemode.d.ts +4 -4
  4. package/dist/codemode/codemode.d.ts.map +1 -1
  5. package/dist/codemode/codemode.js +21 -16
  6. package/dist/codemode/codemode.js.map +1 -1
  7. package/dist/codemode/models.d.ts.map +1 -1
  8. package/dist/codemode/models.js +6 -4
  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.map +1 -1
  13. package/dist/env/index.d.ts +12 -10
  14. package/dist/env/index.d.ts.map +1 -1
  15. package/dist/env/index.js.map +1 -1
  16. package/dist/env/node-watch.d.ts +3 -3
  17. package/dist/env/node-watch.d.ts.map +1 -1
  18. package/dist/env/node-watch.js +18 -16
  19. package/dist/env/node-watch.js.map +1 -1
  20. package/dist/env/node.d.ts +2 -2
  21. package/dist/env/node.d.ts.map +1 -1
  22. package/dist/env/node.js +12 -4
  23. package/dist/env/node.js.map +1 -1
  24. package/dist/errors.d.ts +18 -2
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/errors.js +26 -3
  27. package/dist/errors.js.map +1 -1
  28. package/dist/harness/agent.d.ts +13 -2
  29. package/dist/harness/agent.d.ts.map +1 -1
  30. package/dist/harness/agent.js +48 -6
  31. package/dist/harness/agent.js.map +1 -1
  32. package/dist/harness/compaction.d.ts +3 -1
  33. package/dist/harness/compaction.d.ts.map +1 -1
  34. package/dist/harness/compaction.js +38 -6
  35. package/dist/harness/compaction.js.map +1 -1
  36. package/dist/harness/context.d.ts +23 -7
  37. package/dist/harness/context.d.ts.map +1 -1
  38. package/dist/harness/context.js +71 -25
  39. package/dist/harness/context.js.map +1 -1
  40. package/dist/harness/define.d.ts +7 -3
  41. package/dist/harness/define.d.ts.map +1 -1
  42. package/dist/harness/define.js +4 -0
  43. package/dist/harness/define.js.map +1 -1
  44. package/dist/harness/generation.d.ts +38 -5
  45. package/dist/harness/generation.d.ts.map +1 -1
  46. package/dist/harness/generation.js +497 -108
  47. package/dist/harness/generation.js.map +1 -1
  48. package/dist/harness/harness.d.ts +7 -2
  49. package/dist/harness/harness.d.ts.map +1 -1
  50. package/dist/harness/harness.js +147 -57
  51. package/dist/harness/harness.js.map +1 -1
  52. package/dist/harness/inbox.d.ts +7 -3
  53. package/dist/harness/inbox.d.ts.map +1 -1
  54. package/dist/harness/inbox.js +7 -4
  55. package/dist/harness/inbox.js.map +1 -1
  56. package/dist/harness/json.d.ts +20 -4
  57. package/dist/harness/json.d.ts.map +1 -1
  58. package/dist/harness/json.js +23 -5
  59. package/dist/harness/json.js.map +1 -1
  60. package/dist/harness/live.d.ts +122 -16
  61. package/dist/harness/live.d.ts.map +1 -1
  62. package/dist/harness/live.js +93 -12
  63. package/dist/harness/live.js.map +1 -1
  64. package/dist/harness/partial-changes.d.ts +54 -0
  65. package/dist/harness/partial-changes.d.ts.map +1 -0
  66. package/dist/harness/partial-changes.js +162 -0
  67. package/dist/harness/partial-changes.js.map +1 -0
  68. package/dist/harness/prompt.d.ts +1 -1
  69. package/dist/harness/prompt.d.ts.map +1 -1
  70. package/dist/harness/prompt.js +1 -1
  71. package/dist/harness/prompt.js.map +1 -1
  72. package/dist/harness/registry-reader.d.ts +11 -0
  73. package/dist/harness/registry-reader.d.ts.map +1 -0
  74. package/dist/harness/registry-reader.js +25 -0
  75. package/dist/harness/registry-reader.js.map +1 -0
  76. package/dist/harness/scheduler.d.ts +86 -14
  77. package/dist/harness/scheduler.d.ts.map +1 -1
  78. package/dist/harness/scheduler.js +1459 -369
  79. package/dist/harness/scheduler.js.map +1 -1
  80. package/dist/harness/submissions.d.ts +23 -11
  81. package/dist/harness/submissions.d.ts.map +1 -1
  82. package/dist/harness/submissions.js +104 -36
  83. package/dist/harness/submissions.js.map +1 -1
  84. package/dist/harness/task-graph.d.ts +28 -8
  85. package/dist/harness/task-graph.d.ts.map +1 -1
  86. package/dist/harness/task-graph.js +85 -36
  87. package/dist/harness/task-graph.js.map +1 -1
  88. package/dist/harness/telemetry.d.ts +307 -0
  89. package/dist/harness/telemetry.d.ts.map +1 -0
  90. package/dist/harness/telemetry.js +136 -0
  91. package/dist/harness/telemetry.js.map +1 -0
  92. package/dist/harness/tool.d.ts +2 -0
  93. package/dist/harness/tool.d.ts.map +1 -1
  94. package/dist/harness/tool.js +223 -61
  95. package/dist/harness/tool.js.map +1 -1
  96. package/dist/harness/transcript.d.ts +72 -0
  97. package/dist/harness/transcript.d.ts.map +1 -0
  98. package/dist/harness/transcript.js +264 -0
  99. package/dist/harness/transcript.js.map +1 -0
  100. package/dist/harness/types.d.ts +302 -48
  101. package/dist/harness/types.d.ts.map +1 -1
  102. package/dist/harness/types.js.map +1 -1
  103. package/dist/harness/util.d.ts +7 -1
  104. package/dist/harness/util.d.ts.map +1 -1
  105. package/dist/harness/util.js +13 -0
  106. package/dist/harness/util.js.map +1 -1
  107. package/dist/harness/view.d.ts +43 -22
  108. package/dist/harness/view.d.ts.map +1 -1
  109. package/dist/harness/view.js +130 -71
  110. package/dist/harness/view.js.map +1 -1
  111. package/dist/index.d.ts +13 -9
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +7 -5
  114. package/dist/index.js.map +1 -1
  115. package/dist/search.d.ts +19 -3
  116. package/dist/search.d.ts.map +1 -1
  117. package/dist/search.js +107 -44
  118. package/dist/search.js.map +1 -1
  119. package/dist/session/cached-storage.d.ts +71 -0
  120. package/dist/session/cached-storage.d.ts.map +1 -0
  121. package/dist/session/cached-storage.js +269 -0
  122. package/dist/session/cached-storage.js.map +1 -0
  123. package/dist/session/conversation-tails.d.ts +33 -0
  124. package/dist/session/conversation-tails.d.ts.map +1 -0
  125. package/dist/session/conversation-tails.js +101 -0
  126. package/dist/session/conversation-tails.js.map +1 -0
  127. package/dist/session/keys.d.ts +68 -0
  128. package/dist/session/keys.d.ts.map +1 -0
  129. package/dist/session/keys.js +161 -0
  130. package/dist/session/keys.js.map +1 -0
  131. package/dist/session/session.d.ts +181 -29
  132. package/dist/session/session.d.ts.map +1 -1
  133. package/dist/session/session.js +1073 -183
  134. package/dist/session/session.js.map +1 -1
  135. package/dist/session/transaction.d.ts +86 -4
  136. package/dist/session/transaction.d.ts.map +1 -1
  137. package/dist/session/transaction.js +250 -38
  138. package/dist/session/transaction.js.map +1 -1
  139. package/dist/session/writer.d.ts +74 -0
  140. package/dist/session/writer.d.ts.map +1 -0
  141. package/dist/session/writer.js +294 -0
  142. package/dist/session/writer.js.map +1 -0
  143. package/dist/storage/indexeddb.d.ts +68 -0
  144. package/dist/storage/indexeddb.d.ts.map +1 -0
  145. package/dist/storage/indexeddb.js +881 -0
  146. package/dist/storage/indexeddb.js.map +1 -0
  147. package/dist/storage/jsonl/storage.d.ts +30 -2
  148. package/dist/storage/jsonl/storage.d.ts.map +1 -1
  149. package/dist/storage/jsonl/storage.js +88 -24
  150. package/dist/storage/jsonl/storage.js.map +1 -1
  151. package/dist/storage/memory.d.ts +7 -2
  152. package/dist/storage/memory.d.ts.map +1 -1
  153. package/dist/storage/memory.js +29 -3
  154. package/dist/storage/memory.js.map +1 -1
  155. package/dist/storage/sqlite/cloudflare.d.ts +2 -51
  156. package/dist/storage/sqlite/cloudflare.d.ts.map +1 -1
  157. package/dist/storage/sqlite/cloudflare.js +2 -133
  158. package/dist/storage/sqlite/cloudflare.js.map +1 -1
  159. package/dist/storage/sqlite/database.d.ts +1 -36
  160. package/dist/storage/sqlite/database.d.ts.map +1 -1
  161. package/dist/storage/sqlite/database.js.map +1 -1
  162. package/dist/storage/sqlite/index.d.ts +1 -1
  163. package/dist/storage/sqlite/index.d.ts.map +1 -1
  164. package/dist/storage/sqlite/index.js.map +1 -1
  165. package/dist/storage/sqlite/migrations.d.ts +2 -5
  166. package/dist/storage/sqlite/migrations.d.ts.map +1 -1
  167. package/dist/storage/sqlite/migrations.js +28 -28
  168. package/dist/storage/sqlite/migrations.js.map +1 -1
  169. package/dist/storage/sqlite/node.d.ts +2 -37
  170. package/dist/storage/sqlite/node.d.ts.map +1 -1
  171. package/dist/storage/sqlite/node.js +3 -174
  172. package/dist/storage/sqlite/node.js.map +1 -1
  173. package/dist/storage/sqlite/schema.d.ts +1 -3
  174. package/dist/storage/sqlite/schema.d.ts.map +1 -1
  175. package/dist/storage/sqlite/schema.js +2 -9
  176. package/dist/storage/sqlite/schema.js.map +1 -1
  177. package/dist/storage/sqlite/storage.d.ts +15 -3
  178. package/dist/storage/sqlite/storage.d.ts.map +1 -1
  179. package/dist/storage/sqlite/storage.js +110 -36
  180. package/dist/storage/sqlite/storage.js.map +1 -1
  181. package/dist/storage/store/commit.d.ts +33 -0
  182. package/dist/storage/store/commit.d.ts.map +1 -0
  183. package/dist/storage/store/commit.js +286 -0
  184. package/dist/storage/store/commit.js.map +1 -0
  185. package/dist/storage/store/documents.d.ts +43 -0
  186. package/dist/storage/store/documents.d.ts.map +1 -0
  187. package/dist/storage/store/documents.js +102 -0
  188. package/dist/storage/store/documents.js.map +1 -0
  189. package/dist/storage/store/index.d.ts +2 -0
  190. package/dist/storage/store/index.d.ts.map +1 -0
  191. package/dist/storage/store/index.js +2 -0
  192. package/dist/storage/store/index.js.map +1 -0
  193. package/dist/storage/store/queries.d.ts +49 -0
  194. package/dist/storage/store/queries.d.ts.map +1 -0
  195. package/dist/storage/store/queries.js +93 -0
  196. package/dist/storage/store/queries.js.map +1 -0
  197. package/dist/storage/store/storage.d.ts +59 -0
  198. package/dist/storage/store/storage.d.ts.map +1 -0
  199. package/dist/storage/store/storage.js +438 -0
  200. package/dist/storage/store/storage.js.map +1 -0
  201. package/dist/storage/store/tables.d.ts +54 -0
  202. package/dist/storage/store/tables.d.ts.map +1 -0
  203. package/dist/storage/store/tables.js +108 -0
  204. package/dist/storage/store/tables.js.map +1 -0
  205. package/dist/testing/commit-writes.d.ts +5 -0
  206. package/dist/testing/commit-writes.d.ts.map +1 -0
  207. package/dist/testing/commit-writes.js +12 -0
  208. package/dist/testing/commit-writes.js.map +1 -0
  209. package/dist/testing/env-conformance.js +7 -7
  210. package/dist/testing/env-conformance.js.map +1 -1
  211. package/dist/testing/index.d.ts +1 -0
  212. package/dist/testing/index.d.ts.map +1 -1
  213. package/dist/testing/index.js +1 -0
  214. package/dist/testing/index.js.map +1 -1
  215. package/dist/testing/storage-benchmark.d.ts.map +1 -1
  216. package/dist/testing/storage-benchmark.js +18 -17
  217. package/dist/testing/storage-benchmark.js.map +1 -1
  218. package/dist/testing/storage-conformance.d.ts.map +1 -1
  219. package/dist/testing/storage-conformance.js +369 -67
  220. package/dist/testing/storage-conformance.js.map +1 -1
  221. package/dist/timers.d.ts +21 -0
  222. package/dist/timers.d.ts.map +1 -0
  223. package/dist/timers.js +72 -0
  224. package/dist/timers.js.map +1 -0
  225. package/dist/tool-search/tool-search.d.ts +6 -12
  226. package/dist/tool-search/tool-search.d.ts.map +1 -1
  227. package/dist/tool-search/tool-search.js +7 -7
  228. package/dist/tool-search/tool-search.js.map +1 -1
  229. package/dist/tools/bash.d.ts +12 -12
  230. package/dist/tools/bash.d.ts.map +1 -1
  231. package/dist/tools/bash.js +16 -15
  232. package/dist/tools/bash.js.map +1 -1
  233. package/dist/tools/edit.d.ts +7 -7
  234. package/dist/tools/edit.d.ts.map +1 -1
  235. package/dist/tools/edit.js +9 -9
  236. package/dist/tools/edit.js.map +1 -1
  237. package/dist/tools/index.d.ts +32 -32
  238. package/dist/tools/read.d.ts +6 -6
  239. package/dist/tools/read.d.ts.map +1 -1
  240. package/dist/tools/read.js +19 -8
  241. package/dist/tools/read.js.map +1 -1
  242. package/dist/tools/write.d.ts +4 -4
  243. package/dist/tools/write.d.ts.map +1 -1
  244. package/dist/tools/write.js +5 -5
  245. package/dist/tools/write.js.map +1 -1
  246. package/dist/types.d.ts +331 -64
  247. package/dist/types.d.ts.map +1 -1
  248. package/dist/types.js.map +1 -1
  249. package/package.json +27 -10
  250. package/dist/harness/events.d.ts +0 -186
  251. package/dist/harness/events.d.ts.map +0 -1
  252. package/dist/harness/events.js +0 -373
  253. package/dist/harness/events.js.map +0 -1
  254. package/dist/session/observation.d.ts +0 -42
  255. package/dist/session/observation.d.ts.map +0 -1
  256. package/dist/session/observation.js +0 -281
  257. package/dist/session/observation.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage/jsonl/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, JsonValue } from \"@earendil-works/chord\";\nimport type { FileError, FileSystem } from \"../../env/index.ts\";\nimport { StorageRequestError } from \"../../errors.ts\";\nimport { idFromNumber, seqFromNumber } from \"../../ids.ts\";\nimport type {\n\tConversationId,\n\tConversationQuery,\n\tCursor,\n\tDocumentAddress,\n\tDocumentContent,\n\tDocumentCreate,\n\tDocumentId,\n\tDocumentPoint,\n\tDocumentQuery,\n\tEntryId,\n\tEntryQuery,\n\tId,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tSubmissionId,\n\tSubmissionQuery,\n\tTaskId,\n\tTaskQuery,\n\tTaskRecord,\n} from \"../../types.ts\";\nimport { MemoryStorage } from \"../memory.ts\";\n\nconst FORMAT_VERSION = 1;\nconst MAIN_FILE = \"main.jsonl\";\nconst RECLAIM_SUFFIX = \".reclaim\";\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true });\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\ntype MainOperation =\n\t| Extract<StorageWrite, { readonly type: \"conversation\" | \"entry\" | \"submission\" | \"document.retire\" }>\n\t| { readonly type: \"task\"; readonly value: StoredTask }\n\t| { readonly type: \"task.sidecar\"; readonly id: TaskId; readonly ordinal: number }\n\t| { readonly type: \"document.create\"; readonly record: DocumentCreate; readonly ordinal: number }\n\t| { readonly type: \"document.change\"; readonly id: DocumentId; readonly ordinal: number };\n\ntype MainMarker = {\n\treadonly format: typeof FORMAT_VERSION;\n\treadonly type: \"commit\";\n\treadonly seq: Seq;\n\treadonly writes: readonly MainOperation[];\n};\n\ntype SidecarPayload =\n\t| { readonly type: \"task\"; readonly value: StoredTask }\n\t| { readonly type: \"document\"; readonly id: DocumentId; readonly content: DocumentContent };\n\ntype SidecarRecord = {\n\treadonly format: typeof FORMAT_VERSION;\n\treadonly type: \"record\";\n\treadonly seq: Seq;\n\treadonly ordinal: number;\n\treadonly payload: SidecarPayload;\n};\n\ntype ParsedLine<T> = {\n\treadonly value: T;\n\treadonly start: number;\n};\n\ntype ParsedFile<T> = {\n\treadonly path: string;\n\treadonly lines: readonly ParsedLine<T>[];\n};\n\ntype EncodedCommit = {\n\treadonly marker: string;\n\treadonly sidecars: ReadonlyMap<string, string>;\n};\n\nexport type JsonlStorageOptions = {\n\t/** Flush every affected sidecar before appending the main marker. Defaults to false. */\n\treadonly fsync?: boolean;\n};\n\nexport class JsonlCorruptionError extends Error {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"JsonlCorruptionError\";\n\t}\n}\n\nexport class JsonlStoragePoisonedError extends Error {\n\tconstructor(cause: Error) {\n\t\tsuper(\"JSONL storage is poisoned and must be reopened\", { cause });\n\t\tthis.name = \"JsonlStoragePoisonedError\";\n\t}\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n\tvalue !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst isSafeInteger = (value: unknown): value is number => Number.isSafeInteger(value);\n\nconst sidecarFileName = (kind: \"doc\" | \"task\", id: DocumentId | TaskId): string => `${kind}-${id}.jsonl`;\n\nconst isSidecarFileName = (name: string): boolean => /^(?:doc|task)-(?:0|[1-9]\\d*)\\.jsonl$/.test(name);\n\nconst isReclaimFileName = (name: string): boolean => /^(?:doc|task)-(?:0|[1-9]\\d*)\\.jsonl\\.reclaim$/.test(name);\n\nconst isCurrentOnly = (record: DocumentCreate): boolean =>\n\trecord.scope.kind !== \"conversation\" || record.history === \"latest\";\n\nconst sidecarKey = (file: string, seq: Seq, ordinal: number): string => JSON.stringify([file, seq, ordinal]);\n\nconst jsonLine = (value: MainMarker | SidecarRecord): string => `${JSON.stringify(value)}\\n`;\n\nconst errorFromFile = (action: string, error: FileError): Error =>\n\tnew Error(`JSONL ${action} failed: ${error.message}`, { cause: error });\n\nconst parseJson = (text: string, description: string): unknown => {\n\ttry {\n\t\treturn JSON.parse(text) as unknown;\n\t} catch (error) {\n\t\tthrow new JsonlCorruptionError(`Malformed complete ${description}`, error instanceof Error ? error : undefined);\n\t}\n};\n\nconst validateMainOperation = (value: unknown, description: string): MainOperation => {\n\tif (!isObject(value) || typeof value.type !== \"string\") {\n\t\tthrow new JsonlCorruptionError(`Invalid write in ${description}`);\n\t}\n\tswitch (value.type) {\n\t\tcase \"conversation\":\n\t\tcase \"entry\":\n\t\tcase \"submission\":\n\t\t\tif (!isObject(value.value) || !isSafeInteger(value.value.id)) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid ${value.type} write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"task\":\n\t\t\tif (\n\t\t\t\t!isObject(value.value) ||\n\t\t\t\t!isSafeInteger(value.value.id) ||\n\t\t\t\t!isObject(value.value.state) ||\n\t\t\t\tvalue.value.state.status !== \"terminal\"\n\t\t\t) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid terminal task write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.retire\":\n\t\t\tif (!isSafeInteger(value.id)) throw new JsonlCorruptionError(`Invalid document retirement in ${description}`);\n\t\t\treturn value as MainOperation;\n\t\tcase \"task.sidecar\":\n\t\t\tif (!isSafeInteger(value.id) || !isSafeInteger(value.ordinal) || value.ordinal < 0) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid task sidecar write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.create\":\n\t\t\tif (\n\t\t\t\t!isObject(value.record) ||\n\t\t\t\t!isSafeInteger(value.record.id) ||\n\t\t\t\t!isSafeInteger(value.ordinal) ||\n\t\t\t\tvalue.ordinal < 0\n\t\t\t) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid document creation in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.change\":\n\t\t\tif (!isSafeInteger(value.id) || !isSafeInteger(value.ordinal) || value.ordinal < 0) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid document change in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tdefault:\n\t\t\tthrow new JsonlCorruptionError(`Unknown write type in ${description}`);\n\t}\n};\n\nconst parseMainMarker = (text: string, line: number): MainMarker => {\n\tconst description = `${MAIN_FILE} line ${line}`;\n\tconst value = parseJson(text, description);\n\tif (\n\t\t!isObject(value) ||\n\t\tvalue.format !== FORMAT_VERSION ||\n\t\tvalue.type !== \"commit\" ||\n\t\t!isSafeInteger(value.seq) ||\n\t\tvalue.seq < 1 ||\n\t\t!Array.isArray(value.writes)\n\t) {\n\t\tthrow new JsonlCorruptionError(`Invalid commit marker in ${description}`);\n\t}\n\treturn {\n\t\tformat: FORMAT_VERSION,\n\t\ttype: \"commit\",\n\t\tseq: seqFromNumber(value.seq),\n\t\twrites: value.writes.map((write) => validateMainOperation(write, description)),\n\t};\n};\n\nconst validateDocumentContent = (value: unknown, description: string): DocumentContent => {\n\tif (!isObject(value) || !isSafeInteger(value.version) || value.version < 1) {\n\t\tthrow new JsonlCorruptionError(`Invalid document content in ${description}`);\n\t}\n\tif (value.kind === \"base\" && isObject(value.value)) return value as DocumentContent;\n\tif (value.kind === \"delta\" && Array.isArray(value.ops)) return value as DocumentContent;\n\tthrow new JsonlCorruptionError(`Invalid document content in ${description}`);\n};\n\nconst parseSidecarRecord = (text: string, file: string, line: number): SidecarRecord => {\n\tconst description = `${file} line ${line}`;\n\tconst value = parseJson(text, description);\n\tif (\n\t\t!isObject(value) ||\n\t\tvalue.format !== FORMAT_VERSION ||\n\t\tvalue.type !== \"record\" ||\n\t\t!isSafeInteger(value.seq) ||\n\t\tvalue.seq < 1 ||\n\t\t!isSafeInteger(value.ordinal) ||\n\t\tvalue.ordinal < 0 ||\n\t\t!isObject(value.payload) ||\n\t\ttypeof value.payload.type !== \"string\"\n\t) {\n\t\tthrow new JsonlCorruptionError(`Invalid sidecar record in ${description}`);\n\t}\n\tif (value.payload.type === \"task\") {\n\t\tif (\n\t\t\t!isObject(value.payload.value) ||\n\t\t\t!isSafeInteger(value.payload.value.id) ||\n\t\t\t!isObject(value.payload.value.state) ||\n\t\t\tvalue.payload.value.state.status === \"terminal\"\n\t\t) {\n\t\t\tthrow new JsonlCorruptionError(`Invalid live task record in ${description}`);\n\t\t}\n\t} else if (value.payload.type === \"document\") {\n\t\tif (!isSafeInteger(value.payload.id)) {\n\t\t\tthrow new JsonlCorruptionError(`Invalid document record in ${description}`);\n\t\t}\n\t\tvalidateDocumentContent(value.payload.content, description);\n\t} else {\n\t\tthrow new JsonlCorruptionError(`Unknown sidecar record type in ${description}`);\n\t}\n\treturn value as SidecarRecord;\n};\n\n/** Portable JSONL implementation of the storage contract. */\nexport class JsonlStorage implements Storage {\n\tprivate readonly fs: FileSystem;\n\tprivate readonly directory: string;\n\tprivate readonly mainPath: string;\n\tprivate readonly fsync: boolean;\n\tprivate readonly memory = new MemoryStorage();\n\tprivate readonly currentOnlyDocuments = new Set<DocumentId>();\n\tprivate readonly liveTaskSidecars = new Set<TaskId>();\n\tprivate closed = false;\n\tprivate poisonError: JsonlStoragePoisonedError | undefined;\n\n\tprivate constructor(fs: FileSystem, directory: string, mainPath: string, options: JsonlStorageOptions) {\n\t\tthis.fs = fs;\n\t\tthis.directory = directory;\n\t\tthis.mainPath = mainPath;\n\t\tthis.fsync = options.fsync ?? false;\n\t}\n\n\t/** Open or create a JSONL storage directory using the supplied filesystem. */\n\tstatic async open(\n\t\tdirectory: string,\n\t\tfs: FileSystem,\n\t\tcontext: Context,\n\t\toptions: JsonlStorageOptions = {},\n\t): Promise<JsonlStorage> {\n\t\tconst absolute = await fs.absolutePath(directory, context);\n\t\tif (!absolute.ok) throw errorFromFile(\"path resolution\", absolute.error);\n\t\tconst created = await fs.createDir(absolute.value, { recursive: true }, context);\n\t\tif (!created.ok) throw errorFromFile(\"directory creation\", created.error);\n\t\tconst mainPathResult = await fs.joinPath([absolute.value, MAIN_FILE], context);\n\t\tif (!mainPathResult.ok) throw errorFromFile(\"path join\", mainPathResult.error);\n\t\tconst storage = new JsonlStorage(fs, absolute.value, mainPathResult.value, options);\n\t\tawait storage.recover(context);\n\t\treturn storage;\n\t}\n\n\tasync commit(writes: readonly StorageWrite[], context: Context): Promise<Seq> {\n\t\tthis.assertUsable();\n\t\tconst prepared = this.memory.prepareCommit(writes);\n\t\tconst encoded = this.encodeCommit(prepared.seq, prepared.writes);\n\t\tconst reclamations = this.planReclamations(prepared.writes, encoded);\n\t\tconst sidecars = await Promise.all(\n\t\t\t[...encoded.sidecars].map(async ([file, content]) => ({\n\t\t\t\tfile,\n\t\t\t\tcontent,\n\t\t\t\tpath: await this.resolveFile(file, context),\n\t\t\t})),\n\t\t);\n\n\t\tfor (const sidecar of sidecars) {\n\t\t\tconst result = await this.fs.appendFile(sidecar.path, sidecar.content, context);\n\t\t\tif (!result.ok) throw this.poison(errorFromFile(`append to ${sidecar.file}`, result.error));\n\t\t}\n\t\tif (this.fsync) {\n\t\t\tfor (const sidecar of sidecars) {\n\t\t\t\tconst result = await this.fs.flushFile(sidecar.path, context);\n\t\t\t\tif (!result.ok) throw this.poison(errorFromFile(`flush of ${sidecar.file}`, result.error));\n\t\t\t}\n\t\t}\n\t\tconst marker = await this.fs.appendFile(this.mainPath, encoded.marker, context);\n\t\tif (!marker.ok) throw this.poison(errorFromFile(`append to ${MAIN_FILE}`, marker.error));\n\t\tconst seq = prepared.apply();\n\t\tthis.adoptSidecarState(prepared.writes);\n\t\tawait this.reclaimSidecars(reclamations, context);\n\t\treturn seq;\n\t}\n\n\tasync mintId<I extends Id<string>>(): Promise<I> {\n\t\treturn this.store.mintId<I>();\n\t}\n\n\tasync conversation(id: ConversationId, context: Context) {\n\t\treturn this.store.conversation(id, context);\n\t}\n\n\tasync scanConversations(query: ConversationQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanConversations(query, limit, cursor, context);\n\t}\n\n\tentry(id: EntryId, context: Context): ReturnType<Storage[\"entry\"]>;\n\tentry(conversationId: ConversationId, id: EntryId, context: Context): ReturnType<Storage[\"entry\"]>;\n\tasync entry(idOrConversationId: EntryId | ConversationId, idOrContext: EntryId | Context, context?: Context) {\n\t\tif (context === undefined)\n\t\t\treturn this.store.entry(idFromNumber<EntryId>(idOrConversationId), idOrContext as Context);\n\t\tif (typeof idOrContext !== \"number\") throw new StorageRequestError(\"Storage.entry() requires an entry ID\");\n\t\treturn this.store.entry(\n\t\t\tidFromNumber<ConversationId>(idOrConversationId),\n\t\t\tidFromNumber<EntryId>(idOrContext),\n\t\t\tcontext,\n\t\t);\n\t}\n\n\tasync findLatestHeadMarker(\n\t\tconversationId: ConversationId,\n\t\tatOrBeforeEntryId: EntryId | undefined,\n\t\tcontext: Context,\n\t) {\n\t\treturn this.store.findLatestHeadMarker(conversationId, atOrBeforeEntryId, context);\n\t}\n\n\tasync scanEntries(query: EntryQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanEntries(query, limit, cursor, context);\n\t}\n\n\tasync task(id: TaskId, context: Context) {\n\t\treturn this.store.task(id, context);\n\t}\n\n\tasync scanTasks(query: TaskQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanTasks(query, limit, cursor, context);\n\t}\n\n\tasync submission(id: SubmissionId, context: Context) {\n\t\treturn this.store.submission(id, context);\n\t}\n\n\tasync scanSubmissions(query: SubmissionQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanSubmissions(query, limit, cursor, context);\n\t}\n\n\tasync submissionByRequest(conversationId: ConversationId, requestId: string, context: Context) {\n\t\treturn this.store.submissionByRequest(conversationId, requestId, context);\n\t}\n\n\tasync findDocument(address: DocumentAddress, at: DocumentPoint, context: Context) {\n\t\treturn this.store.findDocument(address, at, context);\n\t}\n\n\tasync document(id: DocumentId, at: DocumentPoint, context: Context) {\n\t\treturn this.store.document(id, at, context);\n\t}\n\n\tasync scanDocuments(query: DocumentQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn this.store.scanDocuments(query, limit, cursor, context);\n\t}\n\n\tasync close(context: Context): Promise<void> {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tawait this.memory.close(context);\n\t}\n\n\tprivate encodeCommit(seq: Seq, writes: readonly StorageWrite[]): EncodedCommit {\n\t\tconst mainWrites: MainOperation[] = [];\n\t\tconst records = new Map<string, SidecarRecord[]>();\n\t\tlet nextOrdinal = 0;\n\t\tconst addSidecar = (file: string, payload: SidecarPayload): number => {\n\t\t\tconst ordinal = nextOrdinal++;\n\t\t\tlet fileRecords = records.get(file);\n\t\t\tif (fileRecords === undefined) {\n\t\t\t\tfileRecords = [];\n\t\t\t\trecords.set(file, fileRecords);\n\t\t\t}\n\t\t\tfileRecords.push({ format: FORMAT_VERSION, type: \"record\", seq, ordinal, payload });\n\t\t\treturn ordinal;\n\t\t};\n\n\t\tfor (const write of writes) {\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"conversation\":\n\t\t\t\tcase \"entry\":\n\t\t\t\tcase \"submission\":\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tmainWrites.push(write);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"task\":\n\t\t\t\t\tif (write.value.state.status === \"terminal\") mainWrites.push(write);\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"task\", write.value.id), {\n\t\t\t\t\t\t\ttype: \"task\",\n\t\t\t\t\t\t\tvalue: write.value,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tmainWrites.push({ type: \"task.sidecar\", id: write.value.id, ordinal });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.create\": {\n\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"doc\", write.record.id), {\n\t\t\t\t\t\ttype: \"document\",\n\t\t\t\t\t\tid: write.record.id,\n\t\t\t\t\t\tcontent: write.content,\n\t\t\t\t\t});\n\t\t\t\t\tmainWrites.push({ type: \"document.create\", record: write.record, ordinal });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"document.change\": {\n\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"doc\", write.id), {\n\t\t\t\t\t\ttype: \"document\",\n\t\t\t\t\t\tid: write.id,\n\t\t\t\t\t\tcontent: write.content,\n\t\t\t\t\t});\n\t\t\t\t\tmainWrites.push({ type: \"document.change\", id: write.id, ordinal });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst sidecars = new Map<string, string>();\n\t\tfor (const [file, fileRecords] of records) {\n\t\t\tsidecars.set(file, fileRecords.map((record) => jsonLine(record)).join(\"\"));\n\t\t}\n\t\tconst marker: MainMarker = {\n\t\t\tformat: FORMAT_VERSION,\n\t\t\ttype: \"commit\",\n\t\t\tseq,\n\t\t\twrites: mainWrites,\n\t\t};\n\t\treturn { marker: jsonLine(marker), sidecars };\n\t}\n\n\tprivate planReclamations(writes: readonly StorageWrite[], encoded: EncodedCommit): ReadonlyMap<string, string> {\n\t\tconst createdCurrentOnlyDocuments = new Set<DocumentId>();\n\t\tconst retiredDocuments = new Set<DocumentId>();\n\t\tconst baseDocuments = new Set<DocumentId>();\n\t\tconst finalTasks = new Map<TaskId, StoredTask>();\n\t\tfor (const write of writes) {\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"document.create\":\n\t\t\t\t\tif (isCurrentOnly(write.record)) createdCurrentOnlyDocuments.add(write.record.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.change\":\n\t\t\t\t\tif (write.content.kind === \"base\") baseDocuments.add(write.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tretiredDocuments.add(write.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"task\":\n\t\t\t\t\tfinalTasks.set(write.value.id, write.value);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst replacements = new Map<string, string>();\n\t\tconst isCurrentOnlyDocument = (id: DocumentId): boolean =>\n\t\t\tthis.currentOnlyDocuments.has(id) || createdCurrentOnlyDocuments.has(id);\n\t\tfor (const id of retiredDocuments) {\n\t\t\tif (isCurrentOnlyDocument(id)) replacements.set(sidecarFileName(\"doc\", id), \"\");\n\t\t}\n\t\tfor (const id of baseDocuments) {\n\t\t\tif (!isCurrentOnlyDocument(id) || retiredDocuments.has(id)) continue;\n\t\t\tconst file = sidecarFileName(\"doc\", id);\n\t\t\tconst content = encoded.sidecars.get(file);\n\t\t\tif (content !== undefined) replacements.set(file, content);\n\t\t}\n\t\tfor (const [id, task] of finalTasks) {\n\t\t\tif (\n\t\t\t\ttask.state.status === \"terminal\" &&\n\t\t\t\t(this.liveTaskSidecars.has(id) || encoded.sidecars.has(sidecarFileName(\"task\", id)))\n\t\t\t) {\n\t\t\t\treplacements.set(sidecarFileName(\"task\", id), \"\");\n\t\t\t}\n\t\t}\n\t\treturn replacements;\n\t}\n\n\tprivate adoptSidecarState(writes: readonly StorageWrite[]): void {\n\t\tfor (const write of writes) {\n\t\t\tif (write.type === \"document.create\") {\n\t\t\t\tif (isCurrentOnly(write.record)) this.currentOnlyDocuments.add(write.record.id);\n\t\t\t} else if (write.type === \"task\") {\n\t\t\t\tif (write.value.state.status === \"terminal\") this.liveTaskSidecars.delete(write.value.id);\n\t\t\t\telse this.liveTaskSidecars.add(write.value.id);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** The marker already published this state, so reclamation is retryable best-effort maintenance. */\n\tprivate async reclaimSidecars(replacements: ReadonlyMap<string, string>, context: Context): Promise<void> {\n\t\tif (replacements.size === 0) return;\n\t\tif (this.fsync) {\n\t\t\tconst flushed = await this.fs.flushFile(this.mainPath, context);\n\t\t\tif (!flushed.ok) return;\n\t\t}\n\t\tfor (const [file, content] of replacements) await this.replaceSidecar(file, content, context);\n\t}\n\n\tprivate async replaceSidecar(file: string, content: string, context: Context): Promise<void> {\n\t\tconst path = await this.fs.joinPath([this.directory, file], context);\n\t\tif (!path.ok) return;\n\t\tif (content === \"\") {\n\t\t\tawait this.fs.remove(path.value, { force: true }, context);\n\t\t\treturn;\n\t\t}\n\t\tconst temporaryPath = await this.fs.joinPath([this.directory, `${file}${RECLAIM_SUFFIX}`], context);\n\t\tif (!temporaryPath.ok) return;\n\t\tconst written = await this.fs.writeFile(temporaryPath.value, content, context);\n\t\tif (!written.ok) return;\n\t\tif (this.fsync) {\n\t\t\tconst flushed = await this.fs.flushFile(temporaryPath.value, context);\n\t\t\tif (!flushed.ok) return;\n\t\t}\n\t\tawait this.fs.renameFile(temporaryPath.value, path.value, context);\n\t}\n\n\tprivate async recover(context: Context): Promise<void> {\n\t\tconst fs = this.fs;\n\t\tconst directory = this.directory;\n\t\tconst memory = this.memory;\n\t\tconst main = await JsonlStorage.readLines(fs, this.mainPath, MAIN_FILE, context, (text, line) =>\n\t\t\tparseMainMarker(text, line),\n\t\t);\n\t\tlet previousSeq = 0;\n\t\tfor (const marker of main.lines) {\n\t\t\tif (marker.value.seq <= previousSeq) {\n\t\t\t\tthrow new JsonlCorruptionError(`Commit sequence does not strictly increase in ${MAIN_FILE}`);\n\t\t\t}\n\t\t\tpreviousSeq = marker.value.seq;\n\t\t}\n\n\t\tconst listed = await fs.listDir(directory, context);\n\t\tif (!listed.ok) throw errorFromFile(\"directory listing\", listed.error);\n\t\tfor (const info of listed.value) {\n\t\t\tif (info.kind === \"file\" && isReclaimFileName(info.name)) {\n\t\t\t\tawait fs.remove(info.path, { force: true }, context);\n\t\t\t}\n\t\t}\n\t\tconst sidecarFiles = listed.value\n\t\t\t.filter((info) => info.kind === \"file\" && isSidecarFileName(info.name))\n\t\t\t.map((info) => info.name)\n\t\t\t.sort();\n\t\tconst parsedFiles = new Map<string, ParsedFile<SidecarRecord>>();\n\t\tconst recordByKey = new Map<string, ParsedLine<SidecarRecord>>();\n\t\tfor (const file of sidecarFiles) {\n\t\t\tconst pathResult = await fs.joinPath([directory, file], context);\n\t\t\tif (!pathResult.ok) throw errorFromFile(\"path join\", pathResult.error);\n\t\t\tconst parsed = await JsonlStorage.readLines(fs, pathResult.value, file, context, (text, line) =>\n\t\t\t\tparseSidecarRecord(text, file, line),\n\t\t\t);\n\t\t\tparsedFiles.set(file, parsed);\n\t\t\tlet previous: SidecarRecord | undefined;\n\t\t\tfor (const line of parsed.lines) {\n\t\t\t\tif (\n\t\t\t\t\tprevious !== undefined &&\n\t\t\t\t\t(line.value.seq < previous.seq ||\n\t\t\t\t\t\t(line.value.seq === previous.seq && line.value.ordinal <= previous.ordinal))\n\t\t\t\t) {\n\t\t\t\t\tthrow new JsonlCorruptionError(`Sidecar records are out of order in ${file}`);\n\t\t\t\t}\n\t\t\t\tprevious = line.value;\n\t\t\t\trecordByKey.set(sidecarKey(file, line.value.seq, line.value.ordinal), line);\n\t\t\t}\n\t\t}\n\n\t\tconst currentOnlyDocuments = new Set<DocumentId>();\n\t\tconst retiredDocuments = new Set<DocumentId>();\n\t\tconst finalTaskIsLive = new Map<TaskId, boolean>();\n\t\tfor (const { value: marker } of main.lines) {\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tif (operation.type === \"document.create\") {\n\t\t\t\t\tif (isCurrentOnly(operation.record)) currentOnlyDocuments.add(operation.record.id);\n\t\t\t\t} else if (operation.type === \"document.retire\") {\n\t\t\t\t\tretiredDocuments.add(operation.id);\n\t\t\t\t} else if (operation.type === \"task\") {\n\t\t\t\t\tfinalTaskIsLive.set(operation.value.id, false);\n\t\t\t\t} else if (operation.type === \"task.sidecar\") {\n\t\t\t\t\tfinalTaskIsLive.set(operation.id, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst retiredCurrentOnlyDocuments = new Set([...retiredDocuments].filter((id) => currentOnlyDocuments.has(id)));\n\n\t\tconst latestBases = new Map<DocumentId, SidecarRecord>();\n\t\tfor (const { value: marker } of main.lines) {\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tif (operation.type !== \"document.create\" && operation.type !== \"document.change\") continue;\n\t\t\t\tconst id = operation.type === \"document.create\" ? operation.record.id : operation.id;\n\t\t\t\tif (!currentOnlyDocuments.has(id)) continue;\n\t\t\t\tconst record = recordByKey.get(\n\t\t\t\t\tsidecarKey(sidecarFileName(\"doc\", id), marker.seq, operation.ordinal),\n\t\t\t\t)?.value;\n\t\t\t\tif (\n\t\t\t\t\trecord?.payload.type !== \"document\" ||\n\t\t\t\t\trecord.payload.id !== id ||\n\t\t\t\t\trecord.payload.content.kind !== \"base\"\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previous = latestBases.get(id);\n\t\t\t\tif (\n\t\t\t\t\tprevious === undefined ||\n\t\t\t\t\trecord.seq > previous.seq ||\n\t\t\t\t\t(record.seq === previous.seq && record.ordinal > previous.ordinal)\n\t\t\t\t) {\n\t\t\t\t\tlatestBases.set(id, record);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst isBeforeLatestBase = (id: DocumentId, seq: Seq, ordinal: number): boolean => {\n\t\t\tconst base = latestBases.get(id);\n\t\t\treturn base !== undefined && (seq < base.seq || (seq === base.seq && ordinal < base.ordinal));\n\t\t};\n\t\tconst terminalTasks = new Set([...finalTaskIsLive].filter(([, live]) => !live).map(([id]) => id));\n\t\tconst confirmed = new Set<string>();\n\t\tfor (const line of main.lines) {\n\t\t\tconst marker = line.value;\n\t\t\tconst writes: StorageWrite[] = [];\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tswitch (operation.type) {\n\t\t\t\t\tcase \"conversation\":\n\t\t\t\t\tcase \"entry\":\n\t\t\t\t\tcase \"submission\":\n\t\t\t\t\tcase \"task\":\n\t\t\t\t\tcase \"document.retire\":\n\t\t\t\t\t\twrites.push(operation);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"task.sidecar\": {\n\t\t\t\t\t\tconst optional = terminalTasks.has(operation.id);\n\t\t\t\t\t\tconst record = JsonlStorage.confirmRecord(\n\t\t\t\t\t\t\tmarker,\n\t\t\t\t\t\t\toperation.ordinal,\n\t\t\t\t\t\t\tsidecarFileName(\"task\", operation.id),\n\t\t\t\t\t\t\trecordByKey,\n\t\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t\t\toptional,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (record !== undefined) {\n\t\t\t\t\t\t\tif (record.payload.type !== \"task\" || record.payload.value.id !== operation.id) {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Confirmed task sidecar data does not match commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!optional) writes.push({ type: \"task\", value: record.payload.value });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"document.create\":\n\t\t\t\t\tcase \"document.change\": {\n\t\t\t\t\t\tconst id = operation.type === \"document.create\" ? operation.record.id : operation.id;\n\t\t\t\t\t\tconst reclaimed =\n\t\t\t\t\t\t\tretiredCurrentOnlyDocuments.has(id) || isBeforeLatestBase(id, marker.seq, operation.ordinal);\n\t\t\t\t\t\tconst record = JsonlStorage.confirmRecord(\n\t\t\t\t\t\t\tmarker,\n\t\t\t\t\t\t\toperation.ordinal,\n\t\t\t\t\t\t\tsidecarFileName(\"doc\", id),\n\t\t\t\t\t\t\trecordByKey,\n\t\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t\t\treclaimed,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlet content: DocumentContent | undefined;\n\t\t\t\t\t\tif (record !== undefined) {\n\t\t\t\t\t\t\tif (record.payload.type !== \"document\" || record.payload.id !== id) {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Confirmed document sidecar data does not match commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontent = record.payload.content;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (operation.type === \"document.create\") {\n\t\t\t\t\t\t\tif (content !== undefined && content.kind !== \"base\") {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Document creation lacks a confirmed base in commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twrites.push({\n\t\t\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\t\t\trecord: operation.record,\n\t\t\t\t\t\t\t\tcontent: reclaimed || content === undefined ? { kind: \"base\", version: 1, value: {} } : content,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (!reclaimed && content !== undefined) {\n\t\t\t\t\t\t\twrites.push({ type: \"document.change\", id, content });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tmemory.prepareCommit(writes, marker.seq).apply();\n\t\t\t} catch (error) {\n\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t`Invalid committed state at sequence ${marker.seq}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst reclamations = new Map<string, string>();\n\t\tfor (const [file, parsed] of parsedFiles) {\n\t\t\tlet unconfirmedAt: number | undefined;\n\t\t\tfor (const line of parsed.lines) {\n\t\t\t\tconst key = sidecarKey(file, line.value.seq, line.value.ordinal);\n\t\t\t\tif (confirmed.has(key)) {\n\t\t\t\t\tif (unconfirmedAt !== undefined) {\n\t\t\t\t\t\tthrow new JsonlCorruptionError(`Confirmed record follows an unconfirmed tail in ${file}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (unconfirmedAt === undefined) {\n\t\t\t\t\tunconfirmedAt = line.start;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (unconfirmedAt !== undefined) {\n\t\t\t\tconst truncated = await fs.truncateFile(parsed.path, unconfirmedAt, context);\n\t\t\t\tif (!truncated.ok) throw errorFromFile(`tail truncation of ${file}`, truncated.error);\n\t\t\t}\n\n\t\t\tconst numericId = Number(file.slice(file.indexOf(\"-\") + 1, -\".jsonl\".length));\n\t\t\tconst confirmedLines = parsed.lines.filter((line) =>\n\t\t\t\tconfirmed.has(sidecarKey(file, line.value.seq, line.value.ordinal)),\n\t\t\t);\n\t\t\tlet retainedLines: readonly ParsedLine<SidecarRecord>[] | undefined;\n\t\t\tif (file.startsWith(\"task-\") && terminalTasks.has(idFromNumber<TaskId>(numericId))) {\n\t\t\t\tretainedLines = [];\n\t\t\t} else if (file.startsWith(\"doc-\")) {\n\t\t\t\tconst documentId = idFromNumber<DocumentId>(numericId);\n\t\t\t\tif (retiredCurrentOnlyDocuments.has(documentId)) {\n\t\t\t\t\tretainedLines = [];\n\t\t\t\t} else if (latestBases.has(documentId)) {\n\t\t\t\t\tretainedLines = confirmedLines.filter(\n\t\t\t\t\t\t(line) => !isBeforeLatestBase(documentId, line.value.seq, line.value.ordinal),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\tretainedLines !== undefined &&\n\t\t\t\t(retainedLines.length < confirmedLines.length || retainedLines.length === 0)\n\t\t\t) {\n\t\t\t\treclamations.set(file, retainedLines.map((line) => jsonLine(line.value)).join(\"\"));\n\t\t\t}\n\t\t}\n\t\tawait this.reclaimSidecars(reclamations, context);\n\n\t\tfor (const id of currentOnlyDocuments) this.currentOnlyDocuments.add(id);\n\t\tfor (const [id, live] of finalTaskIsLive) {\n\t\t\tif (live) this.liveTaskSidecars.add(id);\n\t\t}\n\t}\n\n\tprivate static confirmRecord(\n\t\tmarker: MainMarker,\n\t\tordinal: number,\n\t\tfile: string,\n\t\trecordByKey: ReadonlyMap<string, ParsedLine<SidecarRecord>>,\n\t\tconfirmed: Set<string>,\n\t\toptional: boolean,\n\t): SidecarRecord | undefined {\n\t\tconst key = sidecarKey(file, marker.seq, ordinal);\n\t\tif (confirmed.has(key)) throw new JsonlCorruptionError(`Sidecar record is confirmed more than once`);\n\t\tconst line = recordByKey.get(key);\n\t\tif (line === undefined) {\n\t\t\tif (optional) return undefined;\n\t\t\tthrow new JsonlCorruptionError(`Missing confirmed sidecar record ${file} at sequence ${marker.seq}`);\n\t\t}\n\t\tconfirmed.add(key);\n\t\treturn line.value;\n\t}\n\n\tprivate static async readLines<T>(\n\t\tfs: FileSystem,\n\t\tpath: string,\n\t\tname: string,\n\t\tcontext: Context,\n\t\tparse: (text: string, line: number) => T,\n\t): Promise<ParsedFile<T>> {\n\t\tconst read = await fs.readBinaryFile(path, context);\n\t\tif (!read.ok) {\n\t\t\tif (read.error.code === \"not_found\") return { path, lines: [] };\n\t\t\tthrow errorFromFile(`read of ${name}`, read.error);\n\t\t}\n\t\tconst bytes = read.value;\n\t\tlet completeSize = bytes.length;\n\t\tif (completeSize > 0 && bytes[completeSize - 1] !== 0x0a) {\n\t\t\tcompleteSize = bytes.lastIndexOf(0x0a) + 1;\n\t\t\tconst truncated = await fs.truncateFile(path, completeSize, context);\n\t\t\tif (!truncated.ok) throw errorFromFile(`torn-line truncation of ${name}`, truncated.error);\n\t\t}\n\t\tconst lines: ParsedLine<T>[] = [];\n\t\tlet start = 0;\n\t\tlet lineNumber = 1;\n\t\tfor (let end = 0; end < completeSize; end++) {\n\t\t\tif (bytes[end] !== 0x0a) continue;\n\t\t\tlet text: string;\n\t\t\ttry {\n\t\t\t\ttext = textDecoder.decode(bytes.subarray(start, end));\n\t\t\t} catch (error) {\n\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t`Invalid UTF-8 in complete ${name} line ${lineNumber}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlines.push({ value: parse(text, lineNumber), start });\n\t\t\tstart = end + 1;\n\t\t\tlineNumber++;\n\t\t}\n\t\treturn { path, lines };\n\t}\n\n\tprivate async resolveFile(file: string, context: Context): Promise<string> {\n\t\tconst path = await this.fs.joinPath([this.directory, file], context);\n\t\tif (!path.ok) throw errorFromFile(\"path join\", path.error);\n\t\treturn path.value;\n\t}\n\n\tprivate get store(): MemoryStorage {\n\t\tthis.assertUsable();\n\t\treturn this.memory;\n\t}\n\n\tprivate poison(cause: Error): JsonlStoragePoisonedError {\n\t\tthis.poisonError ??= new JsonlStoragePoisonedError(cause);\n\t\treturn this.poisonError;\n\t}\n\n\tprivate assertUsable(): void {\n\t\tif (this.closed) throw new Error(\"JsonlStorage is closed\");\n\t\tif (this.poisonError !== undefined) throw this.poisonError;\n\t}\n}\n"]}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/storage/jsonl/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, JsonValue } from \"@earendil-works/chord\";\nimport type { FileError, FileSystem } from \"../../env/index.ts\";\nimport { StorageRequestError } from \"../../errors.ts\";\nimport { idFromNumber, seqFromNumber } from \"../../ids.ts\";\nimport type {\n\tCommitResult,\n\tConversationId,\n\tConversationQuery,\n\tCursor,\n\tDocumentAddress,\n\tDocumentContent,\n\tDocumentCreate,\n\tDocumentId,\n\tDocumentPoint,\n\tDocumentQuery,\n\tEntryId,\n\tEntryQuery,\n\tId,\n\tSeq,\n\tStorage,\n\tStorageWrite,\n\tSubmissionId,\n\tSubmissionQuery,\n\tTaskId,\n\tTaskQuery,\n\tTaskRecord,\n} from \"../../types.ts\";\nimport { MemoryStorage } from \"../memory.ts\";\n\nconst FORMAT_VERSION = 1;\nconst MAIN_FILE = \"main.jsonl\";\nconst RECLAIM_SUFFIX = \".reclaim\";\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true });\n\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\ntype MainOperation =\n\t| Extract<StorageWrite, { readonly type: \"conversation\" | \"entry\" | \"submission\" | \"document.retire\" }>\n\t| { readonly type: \"task\"; readonly value: StoredTask }\n\t| { readonly type: \"task.sidecar\"; readonly id: TaskId; readonly ordinal: number }\n\t| { readonly type: \"document.create\"; readonly record: DocumentCreate; readonly ordinal: number }\n\t| { readonly type: \"document.change\"; readonly id: DocumentId; readonly ordinal: number };\n\ntype MainMarker = {\n\treadonly format: typeof FORMAT_VERSION;\n\treadonly type: \"commit\";\n\treadonly seq: Seq;\n\treadonly writes: readonly MainOperation[];\n};\n\ntype SidecarPayload =\n\t| { readonly type: \"task\"; readonly value: StoredTask }\n\t| { readonly type: \"document\"; readonly id: DocumentId; readonly content: DocumentContent };\n\ntype SidecarRecord = {\n\treadonly format: typeof FORMAT_VERSION;\n\treadonly type: \"record\";\n\treadonly seq: Seq;\n\treadonly ordinal: number;\n\treadonly payload: SidecarPayload;\n};\n\ntype ParsedLine<T> = {\n\treadonly value: T;\n\treadonly start: number;\n};\n\ntype ParsedFile<T> = {\n\treadonly path: string;\n\treadonly lines: readonly ParsedLine<T>[];\n};\n\ntype EncodedCommit = {\n\treadonly marker: string;\n\treadonly sidecars: ReadonlyMap<string, string>;\n};\n\nexport type JsonlStorageOptions = {\n\t/** Flush every affected sidecar before appending the main marker. Defaults to false. */\n\treadonly fsync?: boolean;\n};\n\nexport class JsonlCorruptionError extends Error {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"JsonlCorruptionError\";\n\t}\n}\n\nexport class JsonlStoragePoisonedError extends Error {\n\tconstructor(cause: Error) {\n\t\tsuper(\"JSONL storage is poisoned and must be reopened\", { cause });\n\t\tthis.name = \"JsonlStoragePoisonedError\";\n\t}\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n\tvalue !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst isSafeInteger = (value: unknown): value is number => Number.isSafeInteger(value);\n\nconst sidecarFileName = (kind: \"doc\" | \"task\", id: DocumentId | TaskId): string => `${kind}-${id}.jsonl`;\n\nconst isSidecarFileName = (name: string): boolean => /^(?:doc|task)-(?:0|[1-9]\\d*)\\.jsonl$/.test(name);\n\nconst isReclaimFileName = (name: string): boolean => /^(?:doc|task)-(?:0|[1-9]\\d*)\\.jsonl\\.reclaim$/.test(name);\n\nconst isCurrentOnly = (record: DocumentCreate): boolean =>\n\trecord.scope.kind !== \"conversation\" || record.history === \"latest\";\n\nconst sidecarKey = (file: string, seq: Seq, ordinal: number): string => JSON.stringify([file, seq, ordinal]);\n\nconst jsonLine = (value: MainMarker | SidecarRecord): string => `${JSON.stringify(value)}\\n`;\n\nconst errorFromFile = (action: string, error: FileError): Error =>\n\tnew Error(`JSONL ${action} failed: ${error.message}`, { cause: error });\n\nconst parseJson = (text: string, description: string): unknown => {\n\ttry {\n\t\treturn JSON.parse(text) as unknown;\n\t} catch (error) {\n\t\tthrow new JsonlCorruptionError(`Malformed complete ${description}`, error instanceof Error ? error : undefined);\n\t}\n};\n\nconst validateMainOperation = (value: unknown, description: string): MainOperation => {\n\tif (!isObject(value) || typeof value.type !== \"string\") {\n\t\tthrow new JsonlCorruptionError(`Invalid write in ${description}`);\n\t}\n\tswitch (value.type) {\n\t\tcase \"conversation\":\n\t\tcase \"entry\":\n\t\tcase \"submission\":\n\t\t\tif (!isObject(value.value) || !isSafeInteger(value.value.id)) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid ${value.type} write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"task\":\n\t\t\tif (\n\t\t\t\t!isObject(value.value) ||\n\t\t\t\t!isSafeInteger(value.value.id) ||\n\t\t\t\t!isObject(value.value.state) ||\n\t\t\t\tvalue.value.state.status !== \"terminal\"\n\t\t\t) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid terminal task write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.retire\":\n\t\t\tif (!isSafeInteger(value.id)) throw new JsonlCorruptionError(`Invalid document retirement in ${description}`);\n\t\t\treturn value as MainOperation;\n\t\tcase \"task.sidecar\":\n\t\t\tif (!isSafeInteger(value.id) || !isSafeInteger(value.ordinal) || value.ordinal < 0) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid task sidecar write in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.create\":\n\t\t\tif (\n\t\t\t\t!isObject(value.record) ||\n\t\t\t\t!isSafeInteger(value.record.id) ||\n\t\t\t\t!isSafeInteger(value.ordinal) ||\n\t\t\t\tvalue.ordinal < 0\n\t\t\t) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid document creation in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tcase \"document.change\":\n\t\t\tif (!isSafeInteger(value.id) || !isSafeInteger(value.ordinal) || value.ordinal < 0) {\n\t\t\t\tthrow new JsonlCorruptionError(`Invalid document change in ${description}`);\n\t\t\t}\n\t\t\treturn value as MainOperation;\n\t\tdefault:\n\t\t\tthrow new JsonlCorruptionError(`Unknown write type in ${description}`);\n\t}\n};\n\nconst parseMainMarker = (text: string, line: number): MainMarker => {\n\tconst description = `${MAIN_FILE} line ${line}`;\n\tconst value = parseJson(text, description);\n\tif (\n\t\t!isObject(value) ||\n\t\tvalue.format !== FORMAT_VERSION ||\n\t\tvalue.type !== \"commit\" ||\n\t\t!isSafeInteger(value.seq) ||\n\t\tvalue.seq < 1 ||\n\t\t!Array.isArray(value.writes)\n\t) {\n\t\tthrow new JsonlCorruptionError(`Invalid commit marker in ${description}`);\n\t}\n\treturn {\n\t\tformat: FORMAT_VERSION,\n\t\ttype: \"commit\",\n\t\tseq: seqFromNumber(value.seq),\n\t\twrites: value.writes.map((write) => validateMainOperation(write, description)),\n\t};\n};\n\nconst validateDocumentContent = (value: unknown, description: string): DocumentContent => {\n\tif (!isObject(value) || !isSafeInteger(value.version) || value.version < 1) {\n\t\tthrow new JsonlCorruptionError(`Invalid document content in ${description}`);\n\t}\n\tif (value.kind === \"base\" && isObject(value.value)) return value as DocumentContent;\n\tif (value.kind === \"delta\" && Array.isArray(value.ops)) return value as DocumentContent;\n\tthrow new JsonlCorruptionError(`Invalid document content in ${description}`);\n};\n\nconst parseSidecarRecord = (text: string, file: string, line: number): SidecarRecord => {\n\tconst description = `${file} line ${line}`;\n\tconst value = parseJson(text, description);\n\tif (\n\t\t!isObject(value) ||\n\t\tvalue.format !== FORMAT_VERSION ||\n\t\tvalue.type !== \"record\" ||\n\t\t!isSafeInteger(value.seq) ||\n\t\tvalue.seq < 1 ||\n\t\t!isSafeInteger(value.ordinal) ||\n\t\tvalue.ordinal < 0 ||\n\t\t!isObject(value.payload) ||\n\t\ttypeof value.payload.type !== \"string\"\n\t) {\n\t\tthrow new JsonlCorruptionError(`Invalid sidecar record in ${description}`);\n\t}\n\tif (value.payload.type === \"task\") {\n\t\tif (\n\t\t\t!isObject(value.payload.value) ||\n\t\t\t!isSafeInteger(value.payload.value.id) ||\n\t\t\t!isObject(value.payload.value.state) ||\n\t\t\tvalue.payload.value.state.status === \"terminal\"\n\t\t) {\n\t\t\tthrow new JsonlCorruptionError(`Invalid live task record in ${description}`);\n\t\t}\n\t} else if (value.payload.type === \"document\") {\n\t\tif (!isSafeInteger(value.payload.id)) {\n\t\t\tthrow new JsonlCorruptionError(`Invalid document record in ${description}`);\n\t\t}\n\t\tvalidateDocumentContent(value.payload.content, description);\n\t} else {\n\t\tthrow new JsonlCorruptionError(`Unknown sidecar record type in ${description}`);\n\t}\n\treturn value as SidecarRecord;\n};\n\n/** Portable JSONL implementation of the storage contract. */\nexport class JsonlStorage implements Storage {\n\tprivate readonly fs: FileSystem;\n\tprivate readonly directory: string;\n\tprivate readonly mainPath: string;\n\tprivate readonly fsync: boolean;\n\tprivate readonly memory = new MemoryStorage();\n\tprivate readonly currentOnlyDocuments = new Set<DocumentId>();\n\tprivate readonly liveTaskSidecars = new Set<TaskId>();\n\tprivate closed = false;\n\tprivate poisonError: JsonlStoragePoisonedError | undefined;\n\t/** Settles once the batch being appended is; its batches are in memory already (`commit()`). */\n\tprivate writing: Promise<void> | undefined;\n\n\tprivate constructor(fs: FileSystem, directory: string, mainPath: string, options: JsonlStorageOptions) {\n\t\tthis.fs = fs;\n\t\tthis.directory = directory;\n\t\tthis.mainPath = mainPath;\n\t\tthis.fsync = options.fsync ?? false;\n\t}\n\n\t/** Open or create a JSONL storage directory using the supplied filesystem. */\n\tstatic async open(\n\t\tdirectory: string,\n\t\tfs: FileSystem,\n\t\tcontext: Context,\n\t\toptions: JsonlStorageOptions = {},\n\t): Promise<JsonlStorage> {\n\t\tconst absolute = await fs.absolutePath(directory, context);\n\t\tif (!absolute.ok) throw errorFromFile(\"path resolution\", absolute.error);\n\t\tconst created = await fs.createDir(absolute.value, { recursive: true }, context);\n\t\tif (!created.ok) throw errorFromFile(\"directory creation\", created.error);\n\t\tconst mainPathResult = await fs.joinPath([absolute.value, MAIN_FILE], context);\n\t\tif (!mainPathResult.ok) throw errorFromFile(\"path join\", mainPathResult.error);\n\t\tconst storage = new JsonlStorage(fs, absolute.value, mainPathResult.value, options);\n\t\tawait storage.recover(context);\n\t\treturn storage;\n\t}\n\n\t/**\n\t * Commit `batches` with one append per affected file: every batch's sidecar records first, then their markers in one\n\t * write of `main.jsonl`. Each batch is checked against the state the earlier ones left, so memory applies each one\n\t * as it passes, and reads wait until the appends are done; the first batch refused ends the batch. A torn append of\n\t * the markers recovers a shorter complete prefix; any failure once a batch applied poisons the storage.\n\t */\n\tasync commit(\n\t\tbatches: readonly (readonly StorageWrite[])[],\n\t\treceive: (index: number, seq: Seq) => void,\n\t\tcontext: Context,\n\t): Promise<CommitResult> {\n\t\tthis.assertUsable();\n\t\tconst seqs: Seq[] = [];\n\t\tconst encoded: EncodedCommit[] = [];\n\t\tconst reclamations = new Map<string, string>();\n\t\tlet refused: { readonly error: unknown } | undefined;\n\t\tconst writing = Promise.withResolvers<void>();\n\t\tthis.writing = writing.promise;\n\t\ttry {\n\t\t\tfor (const writes of batches) {\n\t\t\t\tlet prepared: ReturnType<MemoryStorage[\"prepareCommit\"]>;\n\t\t\t\ttry {\n\t\t\t\t\tprepared = this.memory.prepareCommit(writes);\n\t\t\t\t} catch (error) {\n\t\t\t\t\trefused = { error };\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst commit = this.encodeCommit(prepared.seq, prepared.writes);\n\t\t\t\t// A sidecar an earlier batch replaces keeps what the later ones append, unless they replace it again.\n\t\t\t\tfor (const [file, content] of commit.sidecars) {\n\t\t\t\t\tconst replacement = reclamations.get(file);\n\t\t\t\t\tif (replacement !== undefined) reclamations.set(file, replacement + content);\n\t\t\t\t}\n\t\t\t\tfor (const [file, content] of this.planReclamations(prepared.writes, commit))\n\t\t\t\t\treclamations.set(file, content);\n\t\t\t\tseqs.push(prepared.apply());\n\t\t\t\tthis.adoptSidecarState(prepared.writes);\n\t\t\t\tencoded.push(commit);\n\t\t\t}\n\t\t\tif (encoded.length > 0) await this.append(encoded, context);\n\t\t} catch (error) {\n\t\t\t// Memory runs ahead of the file: once a batch applied, any failure poisons the storage before the reads\n\t\t\t// waiting on the append go on, so none of them returns what is not stored.\n\t\t\tif (seqs.length === 0) throw error;\n\t\t\tthrow this.poison(error instanceof Error ? error : new Error(\"JSONL commit failed\", { cause: error }));\n\t\t} finally {\n\t\t\tthis.writing = undefined;\n\t\t\twriting.resolve();\n\t\t}\n\t\t// The markers are appended: the batches are durable. Reclaiming sidecars comes after the receipts.\n\t\tfor (const [index, seq] of seqs.entries()) receive(index, seq);\n\t\tawait this.reclaimSidecars(reclamations, context);\n\t\treturn refused === undefined ? { stored: seqs.length } : { stored: seqs.length, refused: refused.error };\n\t}\n\n\t/** Append the sidecar records of `commits`, flushed with `fsync`, then their markers in one write of `main.jsonl`. */\n\tprivate async append(commits: readonly EncodedCommit[], context: Context): Promise<void> {\n\t\tconst contents = new Map<string, string>();\n\t\tfor (const commit of commits) {\n\t\t\tfor (const [file, content] of commit.sidecars) contents.set(file, (contents.get(file) ?? \"\") + content);\n\t\t}\n\t\tconst sidecars = await Promise.all(\n\t\t\t[...contents].map(async ([file, content]) => ({\n\t\t\t\tfile,\n\t\t\t\tcontent,\n\t\t\t\tpath: await this.resolveFile(file, context),\n\t\t\t})),\n\t\t);\n\t\tfor (const sidecar of sidecars) {\n\t\t\tconst result = await this.fs.appendFile(sidecar.path, sidecar.content, context);\n\t\t\tif (!result.ok) throw this.poison(errorFromFile(`append to ${sidecar.file}`, result.error));\n\t\t}\n\t\tif (this.fsync) {\n\t\t\tfor (const sidecar of sidecars) {\n\t\t\t\tconst result = await this.fs.flushFile(sidecar.path, context);\n\t\t\t\tif (!result.ok) throw this.poison(errorFromFile(`flush of ${sidecar.file}`, result.error));\n\t\t\t}\n\t\t}\n\t\tconst markers = commits.length === 1 ? commits[0]!.marker : commits.map((commit) => commit.marker).join(\"\");\n\t\tconst marker = await this.fs.appendFile(this.mainPath, markers, context);\n\t\tif (!marker.ok) throw this.poison(errorFromFile(`append to ${MAIN_FILE}`, marker.error));\n\t}\n\n\tasync mintId<I extends Id<string>>(): Promise<I> {\n\t\treturn this.store.mintId<I>();\n\t}\n\n\tasync conversation(id: ConversationId, context: Context) {\n\t\treturn (await this.readable()).conversation(id, context);\n\t}\n\n\tasync scanConversations(query: ConversationQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanConversations(query, limit, cursor, context);\n\t}\n\n\tentry(id: EntryId, context: Context): ReturnType<Storage[\"entry\"]>;\n\tentry(conversationId: ConversationId, id: EntryId, context: Context): ReturnType<Storage[\"entry\"]>;\n\tasync entry(idOrConversationId: EntryId | ConversationId, idOrContext: EntryId | Context, context?: Context) {\n\t\tif (context === undefined)\n\t\t\treturn (await this.readable()).entry(idFromNumber<EntryId>(idOrConversationId), idOrContext as Context);\n\t\tif (typeof idOrContext !== \"number\") throw new StorageRequestError(\"Storage.entry() requires an entry ID\");\n\t\treturn (await this.readable()).entry(\n\t\t\tidFromNumber<ConversationId>(idOrConversationId),\n\t\t\tidFromNumber<EntryId>(idOrContext),\n\t\t\tcontext,\n\t\t);\n\t}\n\n\tasync findLatestHeadMarker(\n\t\tconversationId: ConversationId,\n\t\tatOrBeforeEntryId: EntryId | undefined,\n\t\tcontext: Context,\n\t) {\n\t\treturn (await this.readable()).findLatestHeadMarker(conversationId, atOrBeforeEntryId, context);\n\t}\n\n\tasync scanEntries(query: EntryQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanEntries(query, limit, cursor, context);\n\t}\n\n\tasync task(id: TaskId, context: Context) {\n\t\treturn (await this.readable()).task(id, context);\n\t}\n\n\tasync scanTasks(query: TaskQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanTasks(query, limit, cursor, context);\n\t}\n\n\tasync submission(id: SubmissionId, context: Context) {\n\t\treturn (await this.readable()).submission(id, context);\n\t}\n\n\tasync scanSubmissions(query: SubmissionQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanSubmissions(query, limit, cursor, context);\n\t}\n\n\tasync submissionByRequest(conversationId: ConversationId, requestId: string, context: Context) {\n\t\treturn (await this.readable()).submissionByRequest(conversationId, requestId, context);\n\t}\n\n\tasync findDocument(address: DocumentAddress, at: DocumentPoint, context: Context) {\n\t\treturn (await this.readable()).findDocument(address, at, context);\n\t}\n\n\tasync document(id: DocumentId, at: DocumentPoint, context: Context) {\n\t\treturn (await this.readable()).document(id, at, context);\n\t}\n\n\tasync scanDocuments(query: DocumentQuery, limit: number, cursor: Cursor | undefined, context: Context) {\n\t\treturn (await this.readable()).scanDocuments(query, limit, cursor, context);\n\t}\n\n\tasync close(context: Context): Promise<void> {\n\t\tif (this.closed) return;\n\t\tthis.closed = true;\n\t\tawait this.memory.close(context);\n\t}\n\n\tprivate encodeCommit(seq: Seq, writes: readonly StorageWrite[]): EncodedCommit {\n\t\tconst mainWrites: MainOperation[] = [];\n\t\tconst records = new Map<string, SidecarRecord[]>();\n\t\tlet nextOrdinal = 0;\n\t\tconst addSidecar = (file: string, payload: SidecarPayload): number => {\n\t\t\tconst ordinal = nextOrdinal++;\n\t\t\tlet fileRecords = records.get(file);\n\t\t\tif (fileRecords === undefined) {\n\t\t\t\tfileRecords = [];\n\t\t\t\trecords.set(file, fileRecords);\n\t\t\t}\n\t\t\tfileRecords.push({ format: FORMAT_VERSION, type: \"record\", seq, ordinal, payload });\n\t\t\treturn ordinal;\n\t\t};\n\n\t\tfor (const write of writes) {\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"conversation\":\n\t\t\t\tcase \"entry\":\n\t\t\t\tcase \"submission\":\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tmainWrites.push(write);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"task\":\n\t\t\t\t\tif (write.value.state.status === \"terminal\") mainWrites.push(write);\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"task\", write.value.id), {\n\t\t\t\t\t\t\ttype: \"task\",\n\t\t\t\t\t\t\tvalue: write.value,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tmainWrites.push({ type: \"task.sidecar\", id: write.value.id, ordinal });\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.create\": {\n\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"doc\", write.record.id), {\n\t\t\t\t\t\ttype: \"document\",\n\t\t\t\t\t\tid: write.record.id,\n\t\t\t\t\t\tcontent: write.content,\n\t\t\t\t\t});\n\t\t\t\t\tmainWrites.push({ type: \"document.create\", record: write.record, ordinal });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"document.change\": {\n\t\t\t\t\tconst ordinal = addSidecar(sidecarFileName(\"doc\", write.id), {\n\t\t\t\t\t\ttype: \"document\",\n\t\t\t\t\t\tid: write.id,\n\t\t\t\t\t\tcontent: write.content,\n\t\t\t\t\t});\n\t\t\t\t\tmainWrites.push({ type: \"document.change\", id: write.id, ordinal });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst sidecars = new Map<string, string>();\n\t\tfor (const [file, fileRecords] of records) {\n\t\t\tsidecars.set(file, fileRecords.map((record) => jsonLine(record)).join(\"\"));\n\t\t}\n\t\tconst marker: MainMarker = {\n\t\t\tformat: FORMAT_VERSION,\n\t\t\ttype: \"commit\",\n\t\t\tseq,\n\t\t\twrites: mainWrites,\n\t\t};\n\t\treturn { marker: jsonLine(marker), sidecars };\n\t}\n\n\tprivate planReclamations(writes: readonly StorageWrite[], encoded: EncodedCommit): ReadonlyMap<string, string> {\n\t\tconst createdCurrentOnlyDocuments = new Set<DocumentId>();\n\t\tconst retiredDocuments = new Set<DocumentId>();\n\t\tconst baseDocuments = new Set<DocumentId>();\n\t\tconst finalTasks = new Map<TaskId, StoredTask>();\n\t\tfor (const write of writes) {\n\t\t\tswitch (write.type) {\n\t\t\t\tcase \"document.create\":\n\t\t\t\t\tif (isCurrentOnly(write.record)) createdCurrentOnlyDocuments.add(write.record.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.change\":\n\t\t\t\t\tif (write.content.kind === \"base\") baseDocuments.add(write.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"document.retire\":\n\t\t\t\t\tretiredDocuments.add(write.id);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"task\":\n\t\t\t\t\tfinalTasks.set(write.value.id, write.value);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst replacements = new Map<string, string>();\n\t\tconst isCurrentOnlyDocument = (id: DocumentId): boolean =>\n\t\t\tthis.currentOnlyDocuments.has(id) || createdCurrentOnlyDocuments.has(id);\n\t\tfor (const id of retiredDocuments) {\n\t\t\tif (isCurrentOnlyDocument(id)) replacements.set(sidecarFileName(\"doc\", id), \"\");\n\t\t}\n\t\tfor (const id of baseDocuments) {\n\t\t\tif (!isCurrentOnlyDocument(id) || retiredDocuments.has(id)) continue;\n\t\t\tconst file = sidecarFileName(\"doc\", id);\n\t\t\tconst content = encoded.sidecars.get(file);\n\t\t\tif (content !== undefined) replacements.set(file, content);\n\t\t}\n\t\tfor (const [id, task] of finalTasks) {\n\t\t\tif (\n\t\t\t\ttask.state.status === \"terminal\" &&\n\t\t\t\t(this.liveTaskSidecars.has(id) || encoded.sidecars.has(sidecarFileName(\"task\", id)))\n\t\t\t) {\n\t\t\t\treplacements.set(sidecarFileName(\"task\", id), \"\");\n\t\t\t}\n\t\t}\n\t\treturn replacements;\n\t}\n\n\tprivate adoptSidecarState(writes: readonly StorageWrite[]): void {\n\t\tfor (const write of writes) {\n\t\t\tif (write.type === \"document.create\") {\n\t\t\t\tif (isCurrentOnly(write.record)) this.currentOnlyDocuments.add(write.record.id);\n\t\t\t} else if (write.type === \"task\") {\n\t\t\t\tif (write.value.state.status === \"terminal\") this.liveTaskSidecars.delete(write.value.id);\n\t\t\t\telse this.liveTaskSidecars.add(write.value.id);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** The marker already published this state, so reclamation is retryable best-effort maintenance. */\n\tprivate async reclaimSidecars(replacements: ReadonlyMap<string, string>, context: Context): Promise<void> {\n\t\tif (replacements.size === 0) return;\n\t\tif (this.fsync) {\n\t\t\tconst flushed = await this.fs.flushFile(this.mainPath, context);\n\t\t\tif (!flushed.ok) return;\n\t\t}\n\t\tfor (const [file, content] of replacements) await this.replaceSidecar(file, content, context);\n\t}\n\n\tprivate async replaceSidecar(file: string, content: string, context: Context): Promise<void> {\n\t\tconst path = await this.fs.joinPath([this.directory, file], context);\n\t\tif (!path.ok) return;\n\t\tif (content === \"\") {\n\t\t\tawait this.fs.remove(path.value, { force: true }, context);\n\t\t\treturn;\n\t\t}\n\t\tconst temporaryPath = await this.fs.joinPath([this.directory, `${file}${RECLAIM_SUFFIX}`], context);\n\t\tif (!temporaryPath.ok) return;\n\t\tconst written = await this.fs.writeFile(temporaryPath.value, content, context);\n\t\tif (!written.ok) return;\n\t\tif (this.fsync) {\n\t\t\tconst flushed = await this.fs.flushFile(temporaryPath.value, context);\n\t\t\tif (!flushed.ok) return;\n\t\t}\n\t\tawait this.fs.renameFile(temporaryPath.value, path.value, context);\n\t}\n\n\tprivate async recover(context: Context): Promise<void> {\n\t\tconst fs = this.fs;\n\t\tconst directory = this.directory;\n\t\tconst memory = this.memory;\n\t\tconst main = await JsonlStorage.readLines(fs, this.mainPath, MAIN_FILE, context, (text, line) =>\n\t\t\tparseMainMarker(text, line),\n\t\t);\n\t\tlet previousSeq = 0;\n\t\tfor (const marker of main.lines) {\n\t\t\tif (marker.value.seq <= previousSeq) {\n\t\t\t\tthrow new JsonlCorruptionError(`Commit sequence does not strictly increase in ${MAIN_FILE}`);\n\t\t\t}\n\t\t\tpreviousSeq = marker.value.seq;\n\t\t}\n\n\t\tconst listed = await fs.listDir(directory, context);\n\t\tif (!listed.ok) throw errorFromFile(\"directory listing\", listed.error);\n\t\tfor (const info of listed.value) {\n\t\t\tif (info.kind === \"file\" && isReclaimFileName(info.name)) {\n\t\t\t\tawait fs.remove(info.path, { force: true }, context);\n\t\t\t}\n\t\t}\n\t\tconst sidecarFiles = listed.value\n\t\t\t.filter((info) => info.kind === \"file\" && isSidecarFileName(info.name))\n\t\t\t.map((info) => info.name)\n\t\t\t.sort();\n\t\tconst parsedFiles = new Map<string, ParsedFile<SidecarRecord>>();\n\t\tconst recordByKey = new Map<string, ParsedLine<SidecarRecord>>();\n\t\tfor (const file of sidecarFiles) {\n\t\t\tconst pathResult = await fs.joinPath([directory, file], context);\n\t\t\tif (!pathResult.ok) throw errorFromFile(\"path join\", pathResult.error);\n\t\t\tconst parsed = await JsonlStorage.readLines(fs, pathResult.value, file, context, (text, line) =>\n\t\t\t\tparseSidecarRecord(text, file, line),\n\t\t\t);\n\t\t\tparsedFiles.set(file, parsed);\n\t\t\tlet previous: SidecarRecord | undefined;\n\t\t\tfor (const line of parsed.lines) {\n\t\t\t\tif (\n\t\t\t\t\tprevious !== undefined &&\n\t\t\t\t\t(line.value.seq < previous.seq ||\n\t\t\t\t\t\t(line.value.seq === previous.seq && line.value.ordinal <= previous.ordinal))\n\t\t\t\t) {\n\t\t\t\t\tthrow new JsonlCorruptionError(`Sidecar records are out of order in ${file}`);\n\t\t\t\t}\n\t\t\t\tprevious = line.value;\n\t\t\t\trecordByKey.set(sidecarKey(file, line.value.seq, line.value.ordinal), line);\n\t\t\t}\n\t\t}\n\n\t\tconst currentOnlyDocuments = new Set<DocumentId>();\n\t\tconst retiredDocuments = new Set<DocumentId>();\n\t\tconst finalTaskIsLive = new Map<TaskId, boolean>();\n\t\tfor (const { value: marker } of main.lines) {\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tif (operation.type === \"document.create\") {\n\t\t\t\t\tif (isCurrentOnly(operation.record)) currentOnlyDocuments.add(operation.record.id);\n\t\t\t\t} else if (operation.type === \"document.retire\") {\n\t\t\t\t\tretiredDocuments.add(operation.id);\n\t\t\t\t} else if (operation.type === \"task\") {\n\t\t\t\t\tfinalTaskIsLive.set(operation.value.id, false);\n\t\t\t\t} else if (operation.type === \"task.sidecar\") {\n\t\t\t\t\tfinalTaskIsLive.set(operation.id, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst retiredCurrentOnlyDocuments = new Set([...retiredDocuments].filter((id) => currentOnlyDocuments.has(id)));\n\n\t\tconst latestBases = new Map<DocumentId, SidecarRecord>();\n\t\tfor (const { value: marker } of main.lines) {\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tif (operation.type !== \"document.create\" && operation.type !== \"document.change\") continue;\n\t\t\t\tconst id = operation.type === \"document.create\" ? operation.record.id : operation.id;\n\t\t\t\tif (!currentOnlyDocuments.has(id)) continue;\n\t\t\t\tconst record = recordByKey.get(\n\t\t\t\t\tsidecarKey(sidecarFileName(\"doc\", id), marker.seq, operation.ordinal),\n\t\t\t\t)?.value;\n\t\t\t\tif (\n\t\t\t\t\trecord?.payload.type !== \"document\" ||\n\t\t\t\t\trecord.payload.id !== id ||\n\t\t\t\t\trecord.payload.content.kind !== \"base\"\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst previous = latestBases.get(id);\n\t\t\t\tif (\n\t\t\t\t\tprevious === undefined ||\n\t\t\t\t\trecord.seq > previous.seq ||\n\t\t\t\t\t(record.seq === previous.seq && record.ordinal > previous.ordinal)\n\t\t\t\t) {\n\t\t\t\t\tlatestBases.set(id, record);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst isBeforeLatestBase = (id: DocumentId, seq: Seq, ordinal: number): boolean => {\n\t\t\tconst base = latestBases.get(id);\n\t\t\treturn base !== undefined && (seq < base.seq || (seq === base.seq && ordinal < base.ordinal));\n\t\t};\n\t\tconst terminalTasks = new Set([...finalTaskIsLive].filter(([, live]) => !live).map(([id]) => id));\n\t\tconst confirmed = new Set<string>();\n\t\tfor (const line of main.lines) {\n\t\t\tconst marker = line.value;\n\t\t\tconst writes: StorageWrite[] = [];\n\t\t\tfor (const operation of marker.writes) {\n\t\t\t\tswitch (operation.type) {\n\t\t\t\t\tcase \"conversation\":\n\t\t\t\t\tcase \"entry\":\n\t\t\t\t\tcase \"submission\":\n\t\t\t\t\tcase \"task\":\n\t\t\t\t\tcase \"document.retire\":\n\t\t\t\t\t\twrites.push(operation);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"task.sidecar\": {\n\t\t\t\t\t\tconst optional = terminalTasks.has(operation.id);\n\t\t\t\t\t\tconst record = JsonlStorage.confirmRecord(\n\t\t\t\t\t\t\tmarker,\n\t\t\t\t\t\t\toperation.ordinal,\n\t\t\t\t\t\t\tsidecarFileName(\"task\", operation.id),\n\t\t\t\t\t\t\trecordByKey,\n\t\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t\t\toptional,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (record !== undefined) {\n\t\t\t\t\t\t\tif (record.payload.type !== \"task\" || record.payload.value.id !== operation.id) {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Confirmed task sidecar data does not match commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!optional) writes.push({ type: \"task\", value: record.payload.value });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"document.create\":\n\t\t\t\t\tcase \"document.change\": {\n\t\t\t\t\t\tconst id = operation.type === \"document.create\" ? operation.record.id : operation.id;\n\t\t\t\t\t\tconst reclaimed =\n\t\t\t\t\t\t\tretiredCurrentOnlyDocuments.has(id) || isBeforeLatestBase(id, marker.seq, operation.ordinal);\n\t\t\t\t\t\tconst record = JsonlStorage.confirmRecord(\n\t\t\t\t\t\t\tmarker,\n\t\t\t\t\t\t\toperation.ordinal,\n\t\t\t\t\t\t\tsidecarFileName(\"doc\", id),\n\t\t\t\t\t\t\trecordByKey,\n\t\t\t\t\t\t\tconfirmed,\n\t\t\t\t\t\t\treclaimed,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tlet content: DocumentContent | undefined;\n\t\t\t\t\t\tif (record !== undefined) {\n\t\t\t\t\t\t\tif (record.payload.type !== \"document\" || record.payload.id !== id) {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Confirmed document sidecar data does not match commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontent = record.payload.content;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (operation.type === \"document.create\") {\n\t\t\t\t\t\t\tif (content !== undefined && content.kind !== \"base\") {\n\t\t\t\t\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t\t\t\t\t`Document creation lacks a confirmed base in commit ${marker.seq}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twrites.push({\n\t\t\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\t\t\trecord: operation.record,\n\t\t\t\t\t\t\t\tcontent: reclaimed || content === undefined ? { kind: \"base\", version: 1, value: {} } : content,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (!reclaimed && content !== undefined) {\n\t\t\t\t\t\t\twrites.push({ type: \"document.change\", id, content });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tmemory.prepareCommit(writes, marker.seq).apply();\n\t\t\t} catch (error) {\n\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t`Invalid committed state at sequence ${marker.seq}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst reclamations = new Map<string, string>();\n\t\tfor (const [file, parsed] of parsedFiles) {\n\t\t\tlet unconfirmedAt: number | undefined;\n\t\t\tfor (const line of parsed.lines) {\n\t\t\t\tconst key = sidecarKey(file, line.value.seq, line.value.ordinal);\n\t\t\t\tif (confirmed.has(key)) {\n\t\t\t\t\tif (unconfirmedAt !== undefined) {\n\t\t\t\t\t\tthrow new JsonlCorruptionError(`Confirmed record follows an unconfirmed tail in ${file}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (unconfirmedAt === undefined) {\n\t\t\t\t\tunconfirmedAt = line.start;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (unconfirmedAt !== undefined) {\n\t\t\t\tconst truncated = await fs.truncateFile(parsed.path, unconfirmedAt, context);\n\t\t\t\tif (!truncated.ok) throw errorFromFile(`tail truncation of ${file}`, truncated.error);\n\t\t\t}\n\n\t\t\tconst numericId = Number(file.slice(file.indexOf(\"-\") + 1, -\".jsonl\".length));\n\t\t\tconst confirmedLines = parsed.lines.filter((line) =>\n\t\t\t\tconfirmed.has(sidecarKey(file, line.value.seq, line.value.ordinal)),\n\t\t\t);\n\t\t\tlet retainedLines: readonly ParsedLine<SidecarRecord>[] | undefined;\n\t\t\tif (file.startsWith(\"task-\") && terminalTasks.has(idFromNumber<TaskId>(numericId))) {\n\t\t\t\tretainedLines = [];\n\t\t\t} else if (file.startsWith(\"doc-\")) {\n\t\t\t\tconst documentId = idFromNumber<DocumentId>(numericId);\n\t\t\t\tif (retiredCurrentOnlyDocuments.has(documentId)) {\n\t\t\t\t\tretainedLines = [];\n\t\t\t\t} else if (latestBases.has(documentId)) {\n\t\t\t\t\tretainedLines = confirmedLines.filter(\n\t\t\t\t\t\t(line) => !isBeforeLatestBase(documentId, line.value.seq, line.value.ordinal),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\tretainedLines !== undefined &&\n\t\t\t\t(retainedLines.length < confirmedLines.length || retainedLines.length === 0)\n\t\t\t) {\n\t\t\t\treclamations.set(file, retainedLines.map((line) => jsonLine(line.value)).join(\"\"));\n\t\t\t}\n\t\t}\n\t\tawait this.reclaimSidecars(reclamations, context);\n\n\t\tfor (const id of currentOnlyDocuments) this.currentOnlyDocuments.add(id);\n\t\tfor (const [id, live] of finalTaskIsLive) {\n\t\t\tif (live) this.liveTaskSidecars.add(id);\n\t\t}\n\t}\n\n\tprivate static confirmRecord(\n\t\tmarker: MainMarker,\n\t\tordinal: number,\n\t\tfile: string,\n\t\trecordByKey: ReadonlyMap<string, ParsedLine<SidecarRecord>>,\n\t\tconfirmed: Set<string>,\n\t\toptional: boolean,\n\t): SidecarRecord | undefined {\n\t\tconst key = sidecarKey(file, marker.seq, ordinal);\n\t\tif (confirmed.has(key)) throw new JsonlCorruptionError(`Sidecar record is confirmed more than once`);\n\t\tconst line = recordByKey.get(key);\n\t\tif (line === undefined) {\n\t\t\tif (optional) return undefined;\n\t\t\tthrow new JsonlCorruptionError(`Missing confirmed sidecar record ${file} at sequence ${marker.seq}`);\n\t\t}\n\t\tconfirmed.add(key);\n\t\treturn line.value;\n\t}\n\n\tprivate static async readLines<T>(\n\t\tfs: FileSystem,\n\t\tpath: string,\n\t\tname: string,\n\t\tcontext: Context,\n\t\tparse: (text: string, line: number) => T,\n\t): Promise<ParsedFile<T>> {\n\t\tconst read = await fs.readBinaryFile(path, context);\n\t\tif (!read.ok) {\n\t\t\tif (read.error.code === \"not_found\") return { path, lines: [] };\n\t\t\tthrow errorFromFile(`read of ${name}`, read.error);\n\t\t}\n\t\tconst bytes = read.value;\n\t\tlet completeSize = bytes.length;\n\t\tif (completeSize > 0 && bytes[completeSize - 1] !== 0x0a) {\n\t\t\tcompleteSize = bytes.lastIndexOf(0x0a) + 1;\n\t\t\tconst truncated = await fs.truncateFile(path, completeSize, context);\n\t\t\tif (!truncated.ok) throw errorFromFile(`torn-line truncation of ${name}`, truncated.error);\n\t\t}\n\t\tconst lines: ParsedLine<T>[] = [];\n\t\tlet start = 0;\n\t\tlet lineNumber = 1;\n\t\tfor (let end = 0; end < completeSize; end++) {\n\t\t\tif (bytes[end] !== 0x0a) continue;\n\t\t\tlet text: string;\n\t\t\ttry {\n\t\t\t\ttext = textDecoder.decode(bytes.subarray(start, end));\n\t\t\t} catch (error) {\n\t\t\t\tthrow new JsonlCorruptionError(\n\t\t\t\t\t`Invalid UTF-8 in complete ${name} line ${lineNumber}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlines.push({ value: parse(text, lineNumber), start });\n\t\t\tstart = end + 1;\n\t\t\tlineNumber++;\n\t\t}\n\t\treturn { path, lines };\n\t}\n\n\tprivate async resolveFile(file: string, context: Context): Promise<string> {\n\t\tconst path = await this.fs.joinPath([this.directory, file], context);\n\t\tif (!path.ok) throw errorFromFile(\"path join\", path.error);\n\t\treturn path.value;\n\t}\n\n\tprivate get store(): MemoryStorage {\n\t\tthis.assertUsable();\n\t\treturn this.memory;\n\t}\n\n\t/** The state to read once no batch is being appended: memory runs ahead of the file while one is. */\n\tprivate async readable(): Promise<MemoryStorage> {\n\t\twhile (this.writing !== undefined) await this.writing;\n\t\treturn this.store;\n\t}\n\n\tprivate poison(cause: Error): JsonlStoragePoisonedError {\n\t\tthis.poisonError ??= new JsonlStoragePoisonedError(cause);\n\t\treturn this.poisonError;\n\t}\n\n\tprivate assertUsable(): void {\n\t\tif (this.closed) throw new Error(\"JsonlStorage is closed\");\n\t\tif (this.poisonError !== undefined) throw this.poisonError;\n\t}\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { Context, JsonValue } from "@earendil-works/chord";
2
- import type { ConversationId, ConversationQuery, ConversationRecord, Cursor, DocumentAddress, DocumentId, DocumentPoint, DocumentQuery, DocumentRecord, EntryId, EntryQuery, EntryRecord, Id, Page, Seq, Storage, StorageWrite, StoredDocument, SubmissionId, SubmissionQuery, SubmissionRecord, TaskId, TaskQuery, TaskRecord } from "../types.ts";
2
+ import type { CommitResult, ConversationId, ConversationQuery, ConversationRecord, Cursor, DocumentAddress, DocumentId, DocumentPoint, DocumentQuery, DocumentRecord, EntryId, EntryQuery, EntryRecord, Id, Page, Seq, Storage, StorageWrite, StoredDocument, SubmissionId, SubmissionQuery, SubmissionRecord, TaskId, TaskQuery, TaskRecord } from "../types.ts";
3
3
  type StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;
4
4
  /** A fully validated, detached state mutation whose application performs no fallible preparation. */
5
5
  export interface PreparedMemoryCommit {
@@ -19,7 +19,12 @@ export declare class MemoryStorage implements Storage {
19
19
  private nextId;
20
20
  private nextSeq;
21
21
  private closed;
22
- commit(writes: readonly StorageWrite[], _context: Context): Promise<Seq>;
22
+ /**
23
+ * Apply `batches` one by one, each checked against the state the earlier ones left (`prepareCommit()`, which only
24
+ * checks and detaches, so a batch it refuses changed nothing); stops at the first one refused. Memory is durable at
25
+ * once; the receipts follow the last batch.
26
+ */
27
+ commit(batches: readonly (readonly StorageWrite[])[], receive: (index: number, seq: Seq) => void, _context: Context): Promise<CommitResult>;
23
28
  /** Validate and detach one commit without changing observable state. */
24
29
  prepareCommit(writes: readonly StorageWrite[], seq?: Seq): PreparedMemoryCommit;
25
30
  private resolveDocumentCopies;
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
@@ -154,7 +154,7 @@ export class MemoryStorage {
154
154
  entryCommitSeqs: new Map(),
155
155
  tasks: new Map(),
156
156
  taskIds: [],
157
- taskIdsByStatus: { pending: [], running: [], waiting: [], completing: [], terminal: [] },
157
+ taskIdsByStatus: { pending: [], running: [], waiting: [], sleeping: [], completing: [], terminal: [] },
158
158
  submissions: new Map(),
159
159
  submissionIds: [],
160
160
  submissionIdsByStatus: { queued: [], placed: [], done: [], unanswered: [] },
@@ -166,8 +166,34 @@ export class MemoryStorage {
166
166
  nextId = 2;
167
167
  nextSeq = 1;
168
168
  closed = false;
169
- async commit(writes, _context) {
170
- return this.prepareCommit(writes).apply();
169
+ /**
170
+ * Apply `batches` one by one, each checked against the state the earlier ones left (`prepareCommit()`, which only
171
+ * checks and detaches, so a batch it refuses changed nothing); stops at the first one refused. Memory is durable at
172
+ * once; the receipts follow the last batch.
173
+ */
174
+ async commit(batches, receive, _context) {
175
+ this.assertOpen();
176
+ const seqs = [];
177
+ let refused;
178
+ try {
179
+ for (const writes of batches) {
180
+ let prepared;
181
+ try {
182
+ prepared = this.prepareCommit(writes);
183
+ }
184
+ catch (error) {
185
+ refused = { error };
186
+ break;
187
+ }
188
+ seqs.push(prepared.apply());
189
+ }
190
+ }
191
+ finally {
192
+ // Also when a batch's apply throws: the batches applied before it are stored, and their receipts stand.
193
+ for (const [index, seq] of seqs.entries())
194
+ receive(index, seq);
195
+ }
196
+ return refused === undefined ? { stored: seqs.length } : { stored: seqs.length, refused: refused.error };
171
197
  }
172
198
  /** Validate and detach one commit without changing observable state. */
173
199
  prepareCommit(writes, seq = seqFromNumber(this.nextSeq)) {