@ny4n/durable 0.0.0-stage → 1.0.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 (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +711 -2
  3. package/dist/documents.d.ts +66 -0
  4. package/dist/documents.d.ts.map +1 -0
  5. package/dist/documents.js +98 -0
  6. package/dist/documents.js.map +1 -0
  7. package/dist/entries.d.ts +31 -0
  8. package/dist/entries.d.ts.map +1 -0
  9. package/dist/entries.js +31 -0
  10. package/dist/entries.js.map +1 -0
  11. package/dist/env/decode.d.ts +16 -0
  12. package/dist/env/decode.d.ts.map +1 -0
  13. package/dist/env/decode.js +28 -0
  14. package/dist/env/decode.js.map +1 -0
  15. package/dist/env/index.d.ts +263 -0
  16. package/dist/env/index.d.ts.map +1 -0
  17. package/dist/env/index.js +49 -0
  18. package/dist/env/index.js.map +1 -0
  19. package/dist/env/line-scan.d.ts +13 -0
  20. package/dist/env/line-scan.d.ts.map +1 -0
  21. package/dist/env/line-scan.js +147 -0
  22. package/dist/env/line-scan.js.map +1 -0
  23. package/dist/env/node-watch.d.ts +29 -0
  24. package/dist/env/node-watch.d.ts.map +1 -0
  25. package/dist/env/node-watch.js +485 -0
  26. package/dist/env/node-watch.js.map +1 -0
  27. package/dist/env/node.d.ts +56 -0
  28. package/dist/env/node.d.ts.map +1 -0
  29. package/dist/env/node.js +1166 -0
  30. package/dist/env/node.js.map +1 -0
  31. package/dist/errors.d.ts +32 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +53 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/harness/agent.d.ts +33 -0
  36. package/dist/harness/agent.d.ts.map +1 -0
  37. package/dist/harness/agent.js +235 -0
  38. package/dist/harness/agent.js.map +1 -0
  39. package/dist/harness/assistant.d.ts +15 -0
  40. package/dist/harness/assistant.d.ts.map +1 -0
  41. package/dist/harness/assistant.js +23 -0
  42. package/dist/harness/assistant.js.map +1 -0
  43. package/dist/harness/compaction.d.ts +56 -0
  44. package/dist/harness/compaction.d.ts.map +1 -0
  45. package/dist/harness/compaction.js +384 -0
  46. package/dist/harness/compaction.js.map +1 -0
  47. package/dist/harness/context.d.ts +63 -0
  48. package/dist/harness/context.d.ts.map +1 -0
  49. package/dist/harness/context.js +221 -0
  50. package/dist/harness/context.js.map +1 -0
  51. package/dist/harness/define.d.ts +18 -0
  52. package/dist/harness/define.d.ts.map +1 -0
  53. package/dist/harness/define.js +25 -0
  54. package/dist/harness/define.js.map +1 -0
  55. package/dist/harness/events.d.ts +180 -0
  56. package/dist/harness/events.d.ts.map +1 -0
  57. package/dist/harness/events.js +370 -0
  58. package/dist/harness/events.js.map +1 -0
  59. package/dist/harness/generation.d.ts +54 -0
  60. package/dist/harness/generation.d.ts.map +1 -0
  61. package/dist/harness/generation.js +514 -0
  62. package/dist/harness/generation.js.map +1 -0
  63. package/dist/harness/harness.d.ts +17 -0
  64. package/dist/harness/harness.d.ts.map +1 -0
  65. package/dist/harness/harness.js +332 -0
  66. package/dist/harness/harness.js.map +1 -0
  67. package/dist/harness/inbox.d.ts +59 -0
  68. package/dist/harness/inbox.d.ts.map +1 -0
  69. package/dist/harness/inbox.js +97 -0
  70. package/dist/harness/inbox.js.map +1 -0
  71. package/dist/harness/json.d.ts +10 -0
  72. package/dist/harness/json.d.ts.map +1 -0
  73. package/dist/harness/json.js +33 -0
  74. package/dist/harness/json.js.map +1 -0
  75. package/dist/harness/live.d.ts +142 -0
  76. package/dist/harness/live.d.ts.map +1 -0
  77. package/dist/harness/live.js +149 -0
  78. package/dist/harness/live.js.map +1 -0
  79. package/dist/harness/output.d.ts +69 -0
  80. package/dist/harness/output.d.ts.map +1 -0
  81. package/dist/harness/output.js +318 -0
  82. package/dist/harness/output.js.map +1 -0
  83. package/dist/harness/prompt.d.ts +27 -0
  84. package/dist/harness/prompt.d.ts.map +1 -0
  85. package/dist/harness/prompt.js +131 -0
  86. package/dist/harness/prompt.js.map +1 -0
  87. package/dist/harness/provider.d.ts +14 -0
  88. package/dist/harness/provider.d.ts.map +1 -0
  89. package/dist/harness/provider.js +30 -0
  90. package/dist/harness/provider.js.map +1 -0
  91. package/dist/harness/registry.d.ts +6 -0
  92. package/dist/harness/registry.d.ts.map +1 -0
  93. package/dist/harness/registry.js +101 -0
  94. package/dist/harness/registry.js.map +1 -0
  95. package/dist/harness/run.d.ts +17 -0
  96. package/dist/harness/run.d.ts.map +1 -0
  97. package/dist/harness/run.js +26 -0
  98. package/dist/harness/run.js.map +1 -0
  99. package/dist/harness/scheduler.d.ts +106 -0
  100. package/dist/harness/scheduler.d.ts.map +1 -0
  101. package/dist/harness/scheduler.js +1743 -0
  102. package/dist/harness/scheduler.js.map +1 -0
  103. package/dist/harness/submissions.d.ts +29 -0
  104. package/dist/harness/submissions.d.ts.map +1 -0
  105. package/dist/harness/submissions.js +175 -0
  106. package/dist/harness/submissions.js.map +1 -0
  107. package/dist/harness/task-graph.d.ts +49 -0
  108. package/dist/harness/task-graph.d.ts.map +1 -0
  109. package/dist/harness/task-graph.js +168 -0
  110. package/dist/harness/task-graph.js.map +1 -0
  111. package/dist/harness/tool.d.ts +76 -0
  112. package/dist/harness/tool.d.ts.map +1 -0
  113. package/dist/harness/tool.js +736 -0
  114. package/dist/harness/tool.js.map +1 -0
  115. package/dist/harness/types.d.ts +713 -0
  116. package/dist/harness/types.d.ts.map +1 -0
  117. package/dist/harness/types.js +2 -0
  118. package/dist/harness/types.js.map +1 -0
  119. package/dist/harness/usage.d.ts +18 -0
  120. package/dist/harness/usage.d.ts.map +1 -0
  121. package/dist/harness/usage.js +57 -0
  122. package/dist/harness/usage.js.map +1 -0
  123. package/dist/harness/util.d.ts +19 -0
  124. package/dist/harness/util.d.ts.map +1 -0
  125. package/dist/harness/util.js +58 -0
  126. package/dist/harness/util.js.map +1 -0
  127. package/dist/harness/view.d.ts +47 -0
  128. package/dist/harness/view.d.ts.map +1 -0
  129. package/dist/harness/view.js +206 -0
  130. package/dist/harness/view.js.map +1 -0
  131. package/dist/ids.d.ts +6 -0
  132. package/dist/ids.d.ts.map +1 -0
  133. package/dist/ids.js +9 -0
  134. package/dist/ids.js.map +1 -0
  135. package/dist/images/cloudflare.d.ts +4 -0
  136. package/dist/images/cloudflare.d.ts.map +1 -0
  137. package/dist/images/cloudflare.js +9 -0
  138. package/dist/images/cloudflare.js.map +1 -0
  139. package/dist/images/exif.d.ts +3 -0
  140. package/dist/images/exif.d.ts.map +1 -0
  141. package/dist/images/exif.js +71 -0
  142. package/dist/images/exif.js.map +1 -0
  143. package/dist/images/index.d.ts +18 -0
  144. package/dist/images/index.d.ts.map +1 -0
  145. package/dist/images/index.js +125 -0
  146. package/dist/images/index.js.map +1 -0
  147. package/dist/images/node-worker.d.ts +17 -0
  148. package/dist/images/node-worker.d.ts.map +1 -0
  149. package/dist/images/node-worker.js +16 -0
  150. package/dist/images/node-worker.js.map +1 -0
  151. package/dist/images/node.d.ts +21 -0
  152. package/dist/images/node.d.ts.map +1 -0
  153. package/dist/images/node.js +121 -0
  154. package/dist/images/node.js.map +1 -0
  155. package/dist/index.d.ts +24 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +20 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/session/forks.d.ts +10 -0
  160. package/dist/session/forks.d.ts.map +1 -0
  161. package/dist/session/forks.js +42 -0
  162. package/dist/session/forks.js.map +1 -0
  163. package/dist/session/observation.d.ts +42 -0
  164. package/dist/session/observation.d.ts.map +1 -0
  165. package/dist/session/observation.js +281 -0
  166. package/dist/session/observation.js.map +1 -0
  167. package/dist/session/session.d.ts +133 -0
  168. package/dist/session/session.d.ts.map +1 -0
  169. package/dist/session/session.js +811 -0
  170. package/dist/session/session.js.map +1 -0
  171. package/dist/session/transaction.d.ts +119 -0
  172. package/dist/session/transaction.d.ts.map +1 -0
  173. package/dist/session/transaction.js +795 -0
  174. package/dist/session/transaction.js.map +1 -0
  175. package/dist/storage/jsonl/index.d.ts +2 -0
  176. package/dist/storage/jsonl/index.d.ts.map +1 -0
  177. package/dist/storage/jsonl/index.js +2 -0
  178. package/dist/storage/jsonl/index.js.map +1 -0
  179. package/dist/storage/jsonl/node.d.ts +6 -0
  180. package/dist/storage/jsonl/node.d.ts.map +1 -0
  181. package/dist/storage/jsonl/node.js +8 -0
  182. package/dist/storage/jsonl/node.js.map +1 -0
  183. package/dist/storage/jsonl/storage.d.ts +143 -0
  184. package/dist/storage/jsonl/storage.d.ts.map +1 -0
  185. package/dist/storage/jsonl/storage.js +682 -0
  186. package/dist/storage/jsonl/storage.js.map +1 -0
  187. package/dist/storage/memory.d.ts +62 -0
  188. package/dist/storage/memory.d.ts.map +1 -0
  189. package/dist/storage/memory.js +733 -0
  190. package/dist/storage/memory.js.map +1 -0
  191. package/dist/storage/scan.d.ts +18 -0
  192. package/dist/storage/scan.d.ts.map +1 -0
  193. package/dist/storage/scan.js +29 -0
  194. package/dist/storage/scan.js.map +1 -0
  195. package/dist/storage/sqlite/cloudflare.d.ts +46 -0
  196. package/dist/storage/sqlite/cloudflare.d.ts.map +1 -0
  197. package/dist/storage/sqlite/cloudflare.js +106 -0
  198. package/dist/storage/sqlite/cloudflare.js.map +1 -0
  199. package/dist/storage/sqlite/database.d.ts +37 -0
  200. package/dist/storage/sqlite/database.d.ts.map +1 -0
  201. package/dist/storage/sqlite/database.js +2 -0
  202. package/dist/storage/sqlite/database.js.map +1 -0
  203. package/dist/storage/sqlite/index.d.ts +4 -0
  204. package/dist/storage/sqlite/index.d.ts.map +1 -0
  205. package/dist/storage/sqlite/index.js +3 -0
  206. package/dist/storage/sqlite/index.js.map +1 -0
  207. package/dist/storage/sqlite/migrations.d.ts +11 -0
  208. package/dist/storage/sqlite/migrations.d.ts.map +1 -0
  209. package/dist/storage/sqlite/migrations.js +111 -0
  210. package/dist/storage/sqlite/migrations.js.map +1 -0
  211. package/dist/storage/sqlite/node.d.ts +41 -0
  212. package/dist/storage/sqlite/node.d.ts.map +1 -0
  213. package/dist/storage/sqlite/node.js +179 -0
  214. package/dist/storage/sqlite/node.js.map +1 -0
  215. package/dist/storage/sqlite/storage.d.ts +65 -0
  216. package/dist/storage/sqlite/storage.d.ts.map +1 -0
  217. package/dist/storage/sqlite/storage.js +670 -0
  218. package/dist/storage/sqlite/storage.js.map +1 -0
  219. package/dist/tasks.d.ts +6 -0
  220. package/dist/tasks.d.ts.map +1 -0
  221. package/dist/tasks.js +5 -0
  222. package/dist/tasks.js.map +1 -0
  223. package/dist/testing/assertions.d.ts +5 -0
  224. package/dist/testing/assertions.d.ts.map +1 -0
  225. package/dist/testing/assertions.js +25 -0
  226. package/dist/testing/assertions.js.map +1 -0
  227. package/dist/testing/env-conformance.d.ts +7 -0
  228. package/dist/testing/env-conformance.d.ts.map +1 -0
  229. package/dist/testing/env-conformance.js +431 -0
  230. package/dist/testing/env-conformance.js.map +1 -0
  231. package/dist/testing/index.d.ts +7 -0
  232. package/dist/testing/index.d.ts.map +1 -0
  233. package/dist/testing/index.js +6 -0
  234. package/dist/testing/index.js.map +1 -0
  235. package/dist/testing/runner.d.ts +12 -0
  236. package/dist/testing/runner.d.ts.map +1 -0
  237. package/dist/testing/runner.js +23 -0
  238. package/dist/testing/runner.js.map +1 -0
  239. package/dist/testing/storage-benchmark.d.ts +41 -0
  240. package/dist/testing/storage-benchmark.d.ts.map +1 -0
  241. package/dist/testing/storage-benchmark.js +350 -0
  242. package/dist/testing/storage-benchmark.js.map +1 -0
  243. package/dist/testing/storage-conformance.d.ts +4 -0
  244. package/dist/testing/storage-conformance.d.ts.map +1 -0
  245. package/dist/testing/storage-conformance.js +1213 -0
  246. package/dist/testing/storage-conformance.js.map +1 -0
  247. package/dist/testing/types.d.ts +37 -0
  248. package/dist/testing/types.d.ts.map +1 -0
  249. package/dist/testing/types.js +2 -0
  250. package/dist/testing/types.js.map +1 -0
  251. package/dist/tools/bash.d.ts +55 -0
  252. package/dist/tools/bash.d.ts.map +1 -0
  253. package/dist/tools/bash.js +138 -0
  254. package/dist/tools/bash.js.map +1 -0
  255. package/dist/tools/edit-diff.d.ts +89 -0
  256. package/dist/tools/edit-diff.d.ts.map +1 -0
  257. package/dist/tools/edit-diff.js +386 -0
  258. package/dist/tools/edit-diff.js.map +1 -0
  259. package/dist/tools/edit.d.ts +18 -0
  260. package/dist/tools/edit.d.ts.map +1 -0
  261. package/dist/tools/edit.js +117 -0
  262. package/dist/tools/edit.js.map +1 -0
  263. package/dist/tools/env.d.ts +5 -0
  264. package/dist/tools/env.d.ts.map +1 -0
  265. package/dist/tools/env.js +7 -0
  266. package/dist/tools/env.js.map +1 -0
  267. package/dist/tools/file-mutation-queue.d.ts +9 -0
  268. package/dist/tools/file-mutation-queue.d.ts.map +1 -0
  269. package/dist/tools/file-mutation-queue.js +52 -0
  270. package/dist/tools/file-mutation-queue.js.map +1 -0
  271. package/dist/tools/image-processor.d.ts +47 -0
  272. package/dist/tools/image-processor.d.ts.map +1 -0
  273. package/dist/tools/image-processor.js +30 -0
  274. package/dist/tools/image-processor.js.map +1 -0
  275. package/dist/tools/image.d.ts +20 -0
  276. package/dist/tools/image.d.ts.map +1 -0
  277. package/dist/tools/image.js +178 -0
  278. package/dist/tools/image.js.map +1 -0
  279. package/dist/tools/index.d.ts +46 -0
  280. package/dist/tools/index.d.ts.map +1 -0
  281. package/dist/tools/index.js +23 -0
  282. package/dist/tools/index.js.map +1 -0
  283. package/dist/tools/path-utils.d.ts +5 -0
  284. package/dist/tools/path-utils.d.ts.map +1 -0
  285. package/dist/tools/path-utils.js +26 -0
  286. package/dist/tools/path-utils.js.map +1 -0
  287. package/dist/tools/read.d.ts +25 -0
  288. package/dist/tools/read.d.ts.map +1 -0
  289. package/dist/tools/read.js +235 -0
  290. package/dist/tools/read.js.map +1 -0
  291. package/dist/tools/write.d.ts +10 -0
  292. package/dist/tools/write.d.ts.map +1 -0
  293. package/dist/tools/write.js +31 -0
  294. package/dist/tools/write.js.map +1 -0
  295. package/dist/truncate.d.ts +64 -0
  296. package/dist/truncate.d.ts.map +1 -0
  297. package/dist/truncate.js +154 -0
  298. package/dist/truncate.js.map +1 -0
  299. package/dist/types.d.ts +932 -0
  300. package/dist/types.d.ts.map +1 -0
  301. package/dist/types.js +3 -0
  302. package/dist/types.js.map +1 -0
  303. package/package.json +140 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-conformance.js","sourceRoot":"","sources":["../../src/testing/storage-conformance.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"@ny4n/chord\";\nimport { BACKGROUND_CONTEXT } from \"@ny4n/chord/context\";\nimport type { Op } from \"@ny4n/chord/delta\";\nimport { idFromNumber } from \"../ids.ts\";\nimport {\n\ttype ConversationId,\n\ttype Cursor,\n\ttype DocumentCreate,\n\ttype DocumentId,\n\ttype EntryId,\n\ttype EntryRecord,\n\ttype JsonObject,\n\ttype Page,\n\tROOT_CONVERSATION_ID,\n\ttype ScanOrder,\n\ttype Storage,\n\ttype StorageWrite,\n\ttype SubmissionId,\n\ttype SubmissionQuery,\n\ttype SubmissionRecord,\n\ttype TaskId,\n\ttype TaskRecord,\n} from \"../types.ts\";\nimport type { StorageConformanceAssertions, StorageConformanceCase, StorageConformanceOptions } from \"./types.ts\";\n\nconst context = BACKGROUND_CONTEXT;\ntype StoredTask = TaskRecord<JsonValue, JsonValue, JsonValue>;\n\nasync function createRoot(storage: Storage): Promise<ConversationId> {\n\tawait storage.commit([{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], context);\n\treturn ROOT_CONVERSATION_ID;\n}\n\nfunction pendingTask(id: TaskId<JsonValue>, conversationId: ConversationId, phase = \"ready\") {\n\treturn {\n\t\tid,\n\t\tconversationId,\n\t\tkind: \"test.task\",\n\t\tversion: 1,\n\t\tinput: { value: id },\n\t\tstate: { status: \"pending\", checkpoint: { phase } },\n\t\tbackground: false,\n\t\tabortRequested: false,\n\t} satisfies StoredTask;\n}\n\nfunction entry(\n\tid: EntryId,\n\tconversationId: ConversationId,\n\tkind = \"message\",\n\textra: Partial<EntryRecord> = {},\n): EntryRecord {\n\treturn { id, conversationId, kind, ...extra };\n}\n\ntype ConformanceTest = (storage: Storage) => Promise<void>;\n\ntype Identified = { readonly id: number };\n\ntype AssertionResult = {\n\ttoBe(expected: unknown): void;\n\ttoBeDefined(): void;\n\ttoBeGreaterThan(expected: number): void;\n\ttoBeUndefined(): void;\n\ttoEqual(expected: unknown): void;\n\ttoHaveLength(expected: number): void;\n\ttoMatchObject(expected: unknown): void;\n\treadonly rejects: { toThrow(messageIncludes: string): Promise<void> };\n\treadonly resolves: { toBe(expected: unknown): Promise<void> };\n};\n\nfunction assertionFacade(assertions: StorageConformanceAssertions) {\n\treturn (actual: unknown): AssertionResult => ({\n\t\ttoBe: (expected) => assertions.strictEqual(actual, expected),\n\t\ttoBeDefined: () => assertions.ok(actual !== undefined, \"Expected value to be defined\"),\n\t\ttoBeGreaterThan: (expected) => assertions.greaterThan(actual as number, expected),\n\t\ttoBeUndefined: () => assertions.strictEqual(actual, undefined),\n\t\ttoEqual: (expected) => assertions.deepEqual(actual, expected),\n\t\ttoHaveLength: (expected) => assertions.strictEqual((actual as { readonly length: unknown }).length, expected),\n\t\ttoMatchObject: (expected) => assertions.partialDeepEqual(actual, expected),\n\t\trejects: {\n\t\t\ttoThrow: (messageIncludes) => assertions.rejects(Promise.resolve(actual), messageIncludes),\n\t\t},\n\t\tresolves: {\n\t\t\ttoBe: async (expected) => assertions.strictEqual(await Promise.resolve(actual), expected),\n\t\t},\n\t});\n}\n\nfunction createCase(options: StorageConformanceOptions, name: string, test: ConformanceTest): StorageConformanceCase {\n\treturn { name, run: () => options.withStorage(test) };\n}\n\n/** Creates runner-independent cases. `withStorage` must call and await its callback exactly once per case. */\nexport function createStorageConformance(options: StorageConformanceOptions): readonly StorageConformanceCase[] {\n\tconst expect = assertionFacade(options.assertions);\n\treturn [\n\t\tcreateCase(options, \"reserves ID 1 for the immutable root conversation\", async (storage) => {\n\t\t\texpect(await storage.mintId<ConversationId>()).toBe(2);\n\t\t\tawait expect(createRoot(storage)).resolves.toBe(ROOT_CONVERSATION_ID);\n\t\t\texpect(await storage.conversation(ROOT_CONVERSATION_ID, context)).toEqual({ id: ROOT_CONVERSATION_ID });\n\t\t\tawait expect(\n\t\t\t\tstorage.commit([{ type: \"conversation\", value: { id: ROOT_CONVERSATION_ID } }], context),\n\t\t\t).rejects.toThrow(`ID ${ROOT_CONVERSATION_ID} already belongs to conversation`);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\toptions,\n\t\t\t\"commits mixed table writes atomically and rolls all of them back on failure\",\n\t\t\tasync (storage) => {\n\t\t\t\tconst rootId = await createRoot(storage);\n\t\t\t\tconst entryId = await storage.mintId<EntryId>();\n\t\t\t\tconst taskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\t\tconst submissionId = await storage.mintId<SubmissionId>();\n\t\t\t\tconst task = pendingTask(taskId, rootId);\n\t\t\t\tconst input: SubmissionRecord = {\n\t\t\t\t\tid: submissionId,\n\t\t\t\t\tconversationId: rootId,\n\t\t\t\t\trequestId: \"request-1\",\n\t\t\t\t\ttype: \"input\",\n\t\t\t\t\tstatus: \"placed\",\n\t\t\t\t\tentry: entryId,\n\t\t\t\t};\n\t\t\t\tconst initialSeq = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ type: \"entry\", value: entry(entryId, rootId, \"user\", { data: { text: \"hello\" } }) },\n\t\t\t\t\t\t{ type: \"task\", value: task },\n\t\t\t\t\t\t{ type: \"submission\", value: input },\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\n\t\t\t\texpect(await storage.entry(entryId, context)).toEqual({\n\t\t\t\t\tentry: entry(entryId, rootId, \"user\", { data: { text: \"hello\" } }),\n\t\t\t\t\tcommitSeq: initialSeq,\n\t\t\t\t});\n\t\t\t\texpect(await storage.task(taskId, context)).toEqual(task);\n\t\t\t\texpect(await storage.submission(submissionId, context)).toEqual(input);\n\n\t\t\t\tconst transientEntryId = await storage.mintId<EntryId>();\n\t\t\t\tconst runningTask: StoredTask = {\n\t\t\t\t\t...task,\n\t\t\t\t\tstate: { status: \"running\", checkpoint: { phase: \"effect\" } },\n\t\t\t\t};\n\t\t\t\tconst doneInput: SubmissionRecord = { ...input, status: \"done\", answer: transientEntryId };\n\t\t\t\tawait expect(\n\t\t\t\t\tstorage.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ type: \"task\", value: runningTask },\n\t\t\t\t\t\t\t{ type: \"submission\", value: doneInput },\n\t\t\t\t\t\t\t{ type: \"entry\", value: entry(transientEntryId, rootId, \"assistant\") },\n\t\t\t\t\t\t\t{ type: \"conversation\", value: { id: rootId } },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t),\n\t\t\t\t).rejects.toThrow(`ID ${rootId} already belongs to conversation`);\n\n\t\t\t\texpect(await storage.task(taskId, context)).toEqual(task);\n\t\t\t\texpect(await storage.submission(submissionId, context)).toEqual(input);\n\t\t\t\texpect(await storage.entry(transientEntryId, context)).toBeUndefined();\n\t\t\t\tconst afterRollbackSeq = await storage.commit(\n\t\t\t\t\t[{ type: \"entry\", value: entry(await storage.mintId<EntryId>(), rootId, \"after-rollback\") }],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\texpect(afterRollbackSeq).toBeGreaterThan(initialSeq);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(options, \"detaches retained writes and every returned record\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst entryId = await storage.mintId<EntryId>();\n\t\t\tconst taskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst submissionId = await storage.mintId<SubmissionId>();\n\t\t\tconst entryData = { nested: [1, 2] };\n\t\t\tconst checkpoint = { phase: \"ready\", nested: { count: 1 } };\n\t\t\tconst detail = { codes: [\"initial\"] };\n\t\t\tconst storedEntry = entry(entryId, rootId, \"note\", { data: entryData });\n\t\t\tconst storedTask: StoredTask = {\n\t\t\t\t...pendingTask(taskId, rootId),\n\t\t\t\tstate: { status: \"pending\", checkpoint },\n\t\t\t};\n\t\t\tconst storedInput: SubmissionRecord = {\n\t\t\t\tid: submissionId,\n\t\t\t\tconversationId: rootId,\n\t\t\t\ttype: \"input\",\n\t\t\t\tstatus: \"unanswered\",\n\t\t\t\treason: \"failed\",\n\t\t\t\tdetail,\n\t\t\t};\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"entry\", value: storedEntry },\n\t\t\t\t\t{ type: \"task\", value: storedTask },\n\t\t\t\t\t{ type: \"submission\", value: storedInput },\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\tentryData.nested.push(3);\n\t\t\tcheckpoint.nested.count = 2;\n\t\t\tdetail.codes.push(\"mutated\");\n\t\t\texpect((await storage.entry(entryId, context))?.entry.data).toEqual({ nested: [1, 2] });\n\t\t\texpect((await storage.task(taskId, context))?.state).toEqual({\n\t\t\t\tstatus: \"pending\",\n\t\t\t\tcheckpoint: { phase: \"ready\", nested: { count: 1 } },\n\t\t\t});\n\t\t\texpect((await storage.submission(submissionId, context))?.detail).toEqual({ codes: [\"initial\"] });\n\n\t\t\tconst readEntry = (await storage.entry(entryId, context))!.entry;\n\t\t\t(readEntry.data as { nested: number[] }).nested.push(9);\n\t\t\tconst readTask = (await storage.task(taskId, context))!;\n\t\t\tif (readTask.state.status !== \"terminal\") {\n\t\t\t\t(readTask.state.checkpoint as { phase: string; nested: { count: number } }).nested.count = 9;\n\t\t\t}\n\t\t\tconst readInput = (await storage.submission(submissionId, context))!;\n\t\t\t(readInput.detail as { codes: string[] }).codes.push(\"read mutation\");\n\n\t\t\texpect((await storage.entry(entryId, context))?.entry.data).toEqual({ nested: [1, 2] });\n\t\t\texpect((await storage.task(taskId, context))?.state).toEqual({\n\t\t\t\tstatus: \"pending\",\n\t\t\t\tcheckpoint: { phase: \"ready\", nested: { count: 1 } },\n\t\t\t});\n\t\t\texpect((await storage.submission(submissionId, context))?.detail).toEqual({ codes: [\"initial\"] });\n\t\t}),\n\n\t\tcreateCase(options, \"detaches prototype-like JSON keys without changing object prototypes\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst entryId = await storage.mintId<EntryId>();\n\t\t\tconst data = JSON.parse(\n\t\t\t\t'{\"__proto__\":{\"polluted\":false},\"constructor\":{\"label\":\"stored\"},\"toString\":\"value\"}',\n\t\t\t) as Record<string, JsonValue>;\n\t\t\tawait storage.commit([{ type: \"entry\", value: entry(entryId, rootId, \"note\", { data }) }], context);\n\n\t\t\t(Reflect.get(data, \"__proto__\") as Record<string, JsonValue>).polluted = true;\n\t\t\t(Reflect.get(data, \"constructor\") as Record<string, JsonValue>).label = \"mutated\";\n\t\t\tconst firstRead = (await storage.entry(entryId, context))!.entry.data as Record<string, JsonValue>;\n\t\t\texpect(Object.getPrototypeOf(firstRead)).toBe(Object.prototype);\n\t\t\texpect(Object.hasOwn(firstRead, \"__proto__\")).toBe(true);\n\t\t\texpect(Reflect.get(firstRead, \"__proto__\")).toEqual({ polluted: false });\n\t\t\texpect(Reflect.get(firstRead, \"constructor\")).toEqual({ label: \"stored\" });\n\t\t\texpect(Reflect.get(firstRead, \"toString\")).toBe(\"value\");\n\t\t\texpect(({} as { polluted?: boolean }).polluted).toBeUndefined();\n\n\t\t\t(Reflect.get(firstRead, \"__proto__\") as Record<string, JsonValue>).polluted = true;\n\t\t\tconst secondRead = (await storage.entry(entryId, context))!.entry.data as Record<string, JsonValue>;\n\t\t\texpect(Reflect.get(secondRead, \"__proto__\")).toEqual({ polluted: false });\n\t\t\texpect(Reflect.get(secondRead, \"constructor\")).toEqual({ label: \"stored\" });\n\t\t\texpect(Reflect.get(secondRead, \"toString\")).toBe(\"value\");\n\t\t}),\n\n\t\tcreateCase(options, \"indexes entries committed out of ID order\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"entry\", value: entry(idFromNumber<EntryId>(30), rootId) },\n\t\t\t\t\t{ type: \"entry\", value: entry(idFromNumber<EntryId>(10), rootId) },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: entry(idFromNumber<EntryId>(20), rootId, \"marker\", {\n\t\t\t\t\t\t\thead: idFromNumber<EntryId>(10),\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\texpect(\n\t\t\t\t(await storage.scanEntries({ conversationId: rootId }, 10, undefined, context)).items.map(({ id }) => id),\n\t\t\t).toEqual([30, 20, 10]);\n\t\t\texpect((await storage.findLatestHeadMarker(rootId, undefined, context))?.id).toBe(20);\n\t\t}),\n\n\t\tcreateCase(options, \"continues an entry cursor below its last item after a newer commit\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst oldestId = await storage.mintId<EntryId>();\n\t\t\tconst middleId = await storage.mintId<EntryId>();\n\t\t\tconst newestId = await storage.mintId<EntryId>();\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"entry\", value: entry(oldestId, rootId) },\n\t\t\t\t\t{ type: \"entry\", value: entry(middleId, rootId) },\n\t\t\t\t\t{ type: \"entry\", value: entry(newestId, rootId) },\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\tconst first = await storage.scanEntries({ conversationId: rootId }, 2, undefined, context);\n\t\t\texpect(first.items.map(({ id }) => id)).toEqual([newestId, middleId]);\n\t\t\tconst appendedId = await storage.mintId<EntryId>();\n\t\t\tawait storage.commit([{ type: \"entry\", value: entry(appendedId, rootId) }], context);\n\t\t\tconst second = await storage.scanEntries({ conversationId: rootId }, 2, first.next, context);\n\t\t\texpect(second.items.map(({ id }) => id)).toEqual([oldestId]);\n\t\t\texpect(second.next).toBeUndefined();\n\t\t}),\n\n\t\tcreateCase(options, \"paginates conversations by opaque cursor in ascending ID order\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst secondId = await storage.mintId<ConversationId>();\n\t\t\tconst thirdId = await storage.mintId<ConversationId>();\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"conversation\", value: { id: thirdId } },\n\t\t\t\t\t{ type: \"conversation\", value: { id: secondId } },\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\tconst first = await storage.scanConversations({}, 2, undefined, context);\n\t\t\texpect(first.items.map(({ id }) => id)).toEqual([rootId, secondId]);\n\t\t\texpect(first.next).toBeDefined();\n\t\t\tconst roundTrippedCursor = JSON.parse(JSON.stringify(first.next)) as NonNullable<typeof first.next>;\n\t\t\tconst second = await storage.scanConversations({}, 2, roundTrippedCursor, context);\n\t\t\texpect(second.items.map(({ id }) => id)).toEqual([thirdId]);\n\t\t\texpect(second.next).toBeUndefined();\n\t\t}),\n\n\t\tcreateCase(options, \"filters and pages conversations by durable owner edges\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst otherOwnerId = await storage.mintId<ConversationId>();\n\t\t\tconst firstTaskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst secondTaskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst firstId = await storage.mintId<ConversationId>();\n\t\t\tconst secondId = await storage.mintId<ConversationId>();\n\t\t\tconst thirdId = await storage.mintId<ConversationId>();\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"conversation\", value: { id: otherOwnerId } },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"conversation\",\n\t\t\t\t\t\tvalue: { id: firstId, owner: { conversationId: rootId, taskId: firstTaskId } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"conversation\",\n\t\t\t\t\t\tvalue: { id: secondId, owner: { conversationId: rootId, taskId: secondTaskId } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"conversation\",\n\t\t\t\t\t\tvalue: { id: thirdId, owner: { conversationId: otherOwnerId, taskId: firstTaskId } },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\tconst first = await storage.scanConversations({ ownerConversationId: rootId }, 1, undefined, context);\n\t\t\texpect(first.items.map(({ id }) => id)).toEqual([firstId]);\n\t\t\texpect(first.next).toBeDefined();\n\t\t\tconst second = await storage.scanConversations({ ownerConversationId: rootId }, 1, first.next, context);\n\t\t\texpect(second.items.map(({ id }) => id)).toEqual([secondId]);\n\t\t\texpect(second.next).toBeUndefined();\n\t\t\texpect(\n\t\t\t\t(await storage.scanConversations({ ownerTaskId: firstTaskId }, 10, undefined, context)).items.map(\n\t\t\t\t\t({ id }) => id,\n\t\t\t\t),\n\t\t\t).toEqual([firstId, thirdId]);\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.scanConversations(\n\t\t\t\t\t\t{ ownerConversationId: rootId, ownerTaskId: firstTaskId },\n\t\t\t\t\t\t10,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t)\n\t\t\t\t).items.map(({ id }) => id),\n\t\t\t).toEqual([firstId]);\n\t\t}),\n\n\t\tcreateCase(options, \"scans deep fork history newest-first through every ancestor cap\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst rootFirst = await storage.mintId<EntryId>();\n\t\t\tconst rootForkPoint = await storage.mintId<EntryId>();\n\t\t\tconst rootExcludedSameCommit = await storage.mintId<EntryId>();\n\t\t\tconst rootEntriesSeq = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"entry\", value: entry(rootFirst, rootId) },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: entry(rootForkPoint, rootId, \"marker\", { head: rootFirst }),\n\t\t\t\t\t},\n\t\t\t\t\t{ type: \"entry\", value: entry(rootExcludedSameCommit, rootId) },\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst childId = await storage.mintId<ConversationId>();\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"conversation\",\n\t\t\t\t\t\tvalue: { id: childId, parent: { conversationId: rootId, at: rootForkPoint } },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst childForkPoint = await storage.mintId<EntryId>();\n\t\t\tconst childExcluded = await storage.mintId<EntryId>();\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"entry\", value: entry(childForkPoint, childId, \"note\") },\n\t\t\t\t\t{ type: \"entry\", value: entry(childExcluded, childId) },\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst rootExcludedLater = await storage.mintId<EntryId>();\n\t\t\tawait storage.commit([{ type: \"entry\", value: entry(rootExcludedLater, rootId) }], context);\n\t\t\tconst grandchildId = await storage.mintId<ConversationId>();\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"conversation\",\n\t\t\t\t\t\tvalue: { id: grandchildId, parent: { conversationId: childId, at: childForkPoint } },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst grandchildHead = await storage.mintId<EntryId>();\n\t\t\tconst grandchildTail = await storage.mintId<EntryId>();\n\t\t\tconst grandchildEntriesSeq = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"entry\",\n\t\t\t\t\t\tvalue: entry(grandchildHead, grandchildId, \"marker\", { head: grandchildHead }),\n\t\t\t\t\t},\n\t\t\t\t\t{ type: \"entry\", value: entry(grandchildTail, grandchildId) },\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst childExcludedLater = await storage.mintId<EntryId>();\n\t\t\tawait storage.commit([{ type: \"entry\", value: entry(childExcludedLater, childId) }], context);\n\n\t\t\tconst first = await storage.scanEntries({ conversationId: grandchildId }, 2, undefined, context);\n\t\t\texpect(first.items.map(({ id }) => id)).toEqual([grandchildTail, grandchildHead]);\n\t\t\tconst second = await storage.scanEntries({ conversationId: grandchildId }, 2, first.next, context);\n\t\t\texpect(second.items.map(({ id }) => id)).toEqual([childForkPoint, rootForkPoint]);\n\t\t\tconst third = await storage.scanEntries({ conversationId: grandchildId }, 2, second.next, context);\n\t\t\texpect(third.items.map(({ id }) => id)).toEqual([rootFirst]);\n\t\t\texpect(third.next).toBeUndefined();\n\n\t\t\t// Oldest first: the root's segment, then each fork's, each capped at the next fork point.\n\t\t\tconst ascending = { conversationId: grandchildId, order: \"ascending\" } as const;\n\t\t\tconst firstUp = await storage.scanEntries(ascending, 2, undefined, context);\n\t\t\texpect(firstUp.items.map(({ id }) => id)).toEqual([rootFirst, rootForkPoint]);\n\t\t\tconst secondUp = await storage.scanEntries(ascending, 2, firstUp.next, context);\n\t\t\texpect(secondUp.items.map(({ id }) => id)).toEqual([childForkPoint, grandchildHead]);\n\t\t\tconst thirdUp = await storage.scanEntries({ conversationId: grandchildId }, 2, secondUp.next, context);\n\t\t\texpect(thirdUp.items.map(({ id }) => id)).toEqual([grandchildTail]);\n\t\t\texpect(thirdUp.next).toBeUndefined();\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.scanEntries(\n\t\t\t\t\t\t{ ...ascending, minEntryId: rootForkPoint, maxEntryId: childForkPoint },\n\t\t\t\t\t\t10,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t)\n\t\t\t\t).items.map(({ id }) => id),\n\t\t\t).toEqual([rootForkPoint, childForkPoint]);\n\t\t\tawait expect(\n\t\t\t\tstorage.scanEntries({ conversationId: grandchildId, order: \"descending\" }, 2, firstUp.next, context),\n\t\t\t).rejects.toThrow(\"cursor\");\n\n\t\t\tconst currentMarker = await storage.findLatestHeadMarker(grandchildId, undefined, context);\n\t\t\texpect(currentMarker?.id).toBe(grandchildHead);\n\t\t\texpect(currentMarker?.head).toBe(grandchildHead);\n\t\t\tconst historicalMarker = await storage.findLatestHeadMarker(grandchildId, childForkPoint, context);\n\t\t\texpect(historicalMarker?.id).toBe(rootForkPoint);\n\t\t\texpect(historicalMarker?.head).toBe(rootFirst);\n\t\t\texpect(await storage.findLatestHeadMarker(grandchildId, rootFirst, context)).toBeUndefined();\n\n\t\t\tconst activeFirst = await storage.scanEntries(\n\t\t\t\t{ conversationId: grandchildId, minEntryId: currentMarker?.head },\n\t\t\t\t1,\n\t\t\t\tundefined,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\texpect(activeFirst.items.map(({ id }) => id)).toEqual([grandchildTail]);\n\t\t\texpect(activeFirst.next).toBeDefined();\n\t\t\tconst activeSecond = await storage.scanEntries(\n\t\t\t\t{ conversationId: grandchildId, minEntryId: currentMarker?.head },\n\t\t\t\t1,\n\t\t\t\tactiveFirst.next,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\texpect(activeSecond.items.map(({ id }) => id)).toEqual([grandchildHead]);\n\t\t\texpect(activeSecond.next).toBeUndefined();\n\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.scanEntries(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconversationId: grandchildId,\n\t\t\t\t\t\t\tminEntryId: historicalMarker?.head,\n\t\t\t\t\t\t\tmaxEntryId: childForkPoint,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t10,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t)\n\t\t\t\t).items.map(({ id }) => id),\n\t\t\t).toEqual([childForkPoint, rootForkPoint, rootFirst]);\n\n\t\t\texpect(await storage.entry(rootFirst, context)).toEqual({\n\t\t\t\tentry: entry(rootFirst, rootId),\n\t\t\t\tcommitSeq: rootEntriesSeq,\n\t\t\t});\n\t\t\texpect((await storage.entry(rootForkPoint, context))?.commitSeq).toBe(rootEntriesSeq);\n\t\t\texpect((await storage.entry(grandchildHead, context))?.commitSeq).toBe(grandchildEntriesSeq);\n\t\t\texpect((await storage.entry(grandchildTail, context))?.commitSeq).toBe(grandchildEntriesSeq);\n\t\t\texpect(await storage.entry(idFromNumber<EntryId>(999_999), context)).toBeUndefined();\n\n\t\t\texpect(await storage.entry(grandchildId, rootFirst, context)).toEqual({\n\t\t\t\tentry: entry(rootFirst, rootId),\n\t\t\t\tcommitSeq: rootEntriesSeq,\n\t\t\t});\n\t\t\texpect((await storage.entry(grandchildId, childForkPoint, context))?.entry.conversationId).toBe(childId);\n\t\t\texpect((await storage.entry(grandchildId, grandchildTail, context))?.commitSeq).toBe(grandchildEntriesSeq);\n\t\t\texpect(await storage.entry(grandchildId, rootExcludedSameCommit, context)).toBeUndefined();\n\t\t\texpect(await storage.entry(grandchildId, rootExcludedLater, context)).toBeUndefined();\n\t\t\texpect(await storage.entry(grandchildId, childExcluded, context)).toBeUndefined();\n\t\t\texpect(await storage.entry(grandchildId, childExcludedLater, context)).toBeUndefined();\n\t\t\texpect(await storage.entry(rootId, grandchildHead, context)).toBeUndefined();\n\t\t\texpect(await storage.entry(grandchildId, idFromNumber<EntryId>(999_999), context)).toBeUndefined();\n\t\t\tawait expect(storage.entry(idFromNumber<ConversationId>(999_999), rootFirst, context)).rejects.toThrow(\n\t\t\t\t\"Unknown conversation\",\n\t\t\t);\n\t\t\tawait expect(\n\t\t\t\tstorage.scanEntries({ conversationId: idFromNumber<ConversationId>(999_999) }, 10, undefined, context),\n\t\t\t).rejects.toThrow(\"Unknown conversation\");\n\t\t}),\n\n\t\tcreateCase(options, \"scans tables in either ID order and continues a cursor in its order\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst conversationIds = [rootId];\n\t\t\tconst taskIds: TaskId<JsonValue>[] = [];\n\t\t\tconst submissionIds: SubmissionId[] = [];\n\t\t\tfor (let index = 0; index < 3; index++) {\n\t\t\t\tconst conversationId = await storage.mintId<ConversationId>();\n\t\t\t\tconst taskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\t\tconst submissionId = await storage.mintId<SubmissionId>();\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ type: \"conversation\", value: { id: conversationId } },\n\t\t\t\t\t\t{ type: \"task\", value: pendingTask(taskId, rootId) },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"submission\",\n\t\t\t\t\t\t\tvalue: { id: submissionId, conversationId: rootId, type: \"input\", status: \"queued\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tconversationIds.push(conversationId);\n\t\t\t\ttaskIds.push(taskId);\n\t\t\t\tsubmissionIds.push(submissionId);\n\t\t\t}\n\t\t\ttype Scan = (order: ScanOrder | undefined, cursor: Cursor | undefined) => Promise<Page<Identified, Cursor>>;\n\t\t\tconst scans: readonly (readonly [Scan, readonly number[]])[] = [\n\t\t\t\t[(order, cursor) => storage.scanConversations({ order }, 2, cursor, context), conversationIds],\n\t\t\t\t[(order, cursor) => storage.scanTasks({ order }, 2, cursor, context), taskIds],\n\t\t\t\t[(order, cursor) => storage.scanSubmissions({ order }, 2, cursor, context), submissionIds],\n\t\t\t];\n\t\t\tconst all = async (scan: Scan, order: ScanOrder | undefined): Promise<number[]> => {\n\t\t\t\tconst found: number[] = [];\n\t\t\t\tlet page = await scan(order, undefined);\n\t\t\t\tfound.push(...page.items.map(({ id }) => id));\n\t\t\t\twhile (page.next !== undefined) {\n\t\t\t\t\t// A cursor carries its order; the query may omit it.\n\t\t\t\t\tpage = await scan(undefined, JSON.parse(JSON.stringify(page.next)) as Cursor);\n\t\t\t\t\tfound.push(...page.items.map(({ id }) => id));\n\t\t\t\t}\n\t\t\t\treturn found;\n\t\t\t};\n\t\t\tfor (const [scan, ids] of scans) {\n\t\t\t\tconst reversed = [...ids].reverse();\n\t\t\t\texpect(await all(scan, undefined)).toEqual(ids);\n\t\t\t\texpect(await all(scan, \"ascending\")).toEqual(ids);\n\t\t\t\texpect(await all(scan, \"descending\")).toEqual(reversed);\n\t\t\t\tconst descending = await scan(\"descending\", undefined);\n\t\t\t\texpect((await scan(\"descending\", descending.next)).items.map(({ id }) => id)).toEqual(reversed.slice(2, 4));\n\t\t\t\tawait expect(scan(\"ascending\", descending.next)).rejects.toThrow(\"cursor\");\n\t\t\t}\n\t\t}),\n\n\t\tcreateCase(options, \"replaces complete task records and pages filtered task scans\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst firstId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst secondId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst thirdId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst first = { ...pendingTask(firstId, rootId), memos: { winner: \"first\" } } satisfies StoredTask;\n\t\t\tconst second = { ...pendingTask(secondId, rootId), background: true } satisfies StoredTask;\n\t\t\tconst third = { ...pendingTask(thirdId, rootId), abortRequested: true } satisfies StoredTask;\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"task\", value: first },\n\t\t\t\t\t{ type: \"task\", value: second },\n\t\t\t\t\t{ type: \"task\", value: third },\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\tconst running: StoredTask = {\n\t\t\t\t...first,\n\t\t\t\tstate: { status: \"running\", checkpoint: { phase: \"effect\", attempt: 1 } },\n\t\t\t\tabortRequested: true,\n\t\t\t};\n\t\t\tawait storage.commit([{ type: \"task\", value: running }], context);\n\t\t\texpect(await storage.task(firstId, context)).toEqual(running);\n\t\t\tconst terminal: StoredTask = {\n\t\t\t\tid: firstId,\n\t\t\t\tconversationId: rootId,\n\t\t\t\tkind: first.kind,\n\t\t\t\tversion: first.version,\n\t\t\t\tinput: first.input,\n\t\t\t\tstate: { status: \"terminal\", outcome: { status: \"completed\", result: { entryId: 99 } } },\n\t\t\t\tbackground: false,\n\t\t\t\tabortRequested: true,\n\t\t\t};\n\t\t\tawait storage.commit([{ type: \"task\", value: terminal }], context);\n\t\t\texpect(await storage.task(firstId, context)).toEqual(terminal);\n\n\t\t\tconst pendingPage = await storage.scanTasks({ status: \"pending\" }, 1, undefined, context);\n\t\t\texpect(pendingPage.items.map(({ id }) => id)).toEqual([secondId]);\n\t\t\texpect(pendingPage.next).toBeDefined();\n\t\t\texpect(\n\t\t\t\t(await storage.scanTasks({ status: \"pending\" }, 1, pendingPage.next, context)).items.map(({ id }) => id),\n\t\t\t).toEqual([thirdId]);\n\t\t\texpect(\n\t\t\t\t(await storage.scanTasks({ status: \"terminal\", abortRequested: true }, 10, undefined, context)).items,\n\t\t\t).toEqual([terminal]);\n\t\t\texpect(\n\t\t\t\t(await storage.scanTasks({ background: true }, 10, undefined, context)).items.map(({ id }) => id),\n\t\t\t).toEqual([secondId]);\n\t\t}),\n\n\t\tcreateCase(options, \"stores owners and scans waiting and completing tasks by status\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst ownerId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst waitingId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst completingId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst owner = pendingTask(ownerId, rootId);\n\t\t\tconst waiting: StoredTask = {\n\t\t\t\t...pendingTask(waitingId, rootId),\n\t\t\t\towner: ownerId,\n\t\t\t\tstate: { status: \"waiting\", checkpoint: { phase: \"next\" }, on: [ownerId], policy: \"allSettled\" },\n\t\t\t\tmemos: { kept: true },\n\t\t\t};\n\t\t\tconst { state: _state, ...base } = pendingTask(completingId, rootId);\n\t\t\tconst completing: StoredTask = {\n\t\t\t\t...base,\n\t\t\t\towner: ownerId,\n\t\t\t\tstate: { status: \"completing\", outcome: { status: \"failed\", error: { message: \"held\" } } },\n\t\t\t};\n\t\t\tconst writes = [owner, waiting, completing].map((value) => ({ type: \"task\", value }) as const);\n\t\t\tawait storage.commit(writes, context);\n\t\t\texpect(await storage.task(waitingId, context)).toEqual(waiting);\n\t\t\texpect(await storage.task(completingId, context)).toEqual(completing);\n\t\t\tconst scan = async (status: StoredTask[\"state\"][\"status\"]) =>\n\t\t\t\t(await storage.scanTasks({ status }, 10, undefined, context)).items;\n\t\t\texpect(await scan(\"waiting\")).toEqual([waiting]);\n\t\t\texpect(await scan(\"completing\")).toEqual([completing]);\n\t\t\texpect((await scan(\"pending\")).map(({ id }) => id)).toEqual([ownerId]);\n\t\t\tconst terminal: StoredTask = {\n\t\t\t\t...completing,\n\t\t\t\tstate: { status: \"terminal\", outcome: completing.state.outcome! },\n\t\t\t};\n\t\t\tawait storage.commit([{ type: \"task\", value: terminal }], context);\n\t\t\texpect(await scan(\"completing\")).toEqual([]);\n\t\t\texpect(await scan(\"terminal\")).toEqual([terminal]);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\toptions,\n\t\t\t\"indexes request IDs per conversation and replaces complete submission records\",\n\t\t\tasync (storage) => {\n\t\t\t\tconst rootId = await createRoot(storage);\n\t\t\t\tconst secondConversationId = await storage.mintId<ConversationId>();\n\t\t\t\tawait storage.commit([{ type: \"conversation\", value: { id: secondConversationId } }], context);\n\t\t\t\tconst firstId = await storage.mintId<SubmissionId>();\n\t\t\t\tconst secondId = await storage.mintId<SubmissionId>();\n\t\t\t\tconst otherConversationId = await storage.mintId<SubmissionId>();\n\t\t\t\tconst first: SubmissionRecord = {\n\t\t\t\t\tid: firstId,\n\t\t\t\t\tconversationId: rootId,\n\t\t\t\t\trequestId: \"same\",\n\t\t\t\t\ttype: \"input\",\n\t\t\t\t\tstatus: \"queued\",\n\t\t\t\t};\n\t\t\t\tconst second: SubmissionRecord = {\n\t\t\t\t\tid: secondId,\n\t\t\t\t\tconversationId: rootId,\n\t\t\t\t\trequestId: \"other\",\n\t\t\t\t\ttype: \"input\",\n\t\t\t\t\tstatus: \"queued\",\n\t\t\t\t};\n\t\t\t\tconst otherConversation: SubmissionRecord = {\n\t\t\t\t\tid: otherConversationId,\n\t\t\t\t\tconversationId: secondConversationId,\n\t\t\t\t\trequestId: \"same\",\n\t\t\t\t\ttype: \"input\",\n\t\t\t\t\tstatus: \"queued\",\n\t\t\t\t};\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ type: \"submission\", value: first },\n\t\t\t\t\t\t{ type: \"submission\", value: second },\n\t\t\t\t\t\t{ type: \"submission\", value: otherConversation },\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\texpect(await storage.submissionByRequest(rootId, \"same\", context)).toEqual(first);\n\t\t\t\texpect(await storage.submissionByRequest(secondConversationId, \"same\", context)).toEqual(otherConversation);\n\n\t\t\t\tconst placedSecond: SubmissionRecord = {\n\t\t\t\t\t...second,\n\t\t\t\t\tstatus: \"placed\",\n\t\t\t\t\tentry: await storage.mintId<EntryId>(),\n\t\t\t\t};\n\t\t\t\tawait storage.commit([{ type: \"submission\", value: placedSecond }], context);\n\t\t\t\texpect(await storage.submission(secondId, context)).toEqual(placedSecond);\n\t\t\t\texpect(await storage.submissionByRequest(rootId, \"other\", context)).toEqual(placedSecond);\n\n\t\t\t\tconst ids = async (query: SubmissionQuery) => {\n\t\t\t\t\tconst found: SubmissionId[] = [];\n\t\t\t\t\tlet cursor: Cursor | undefined;\n\t\t\t\t\tdo {\n\t\t\t\t\t\tconst page = await storage.scanSubmissions(query, 1, cursor, context);\n\t\t\t\t\t\tfound.push(...page.items.map(({ id }) => id));\n\t\t\t\t\t\tcursor = page.next;\n\t\t\t\t\t} while (cursor !== undefined);\n\t\t\t\t\treturn found;\n\t\t\t\t};\n\t\t\t\texpect(await ids({})).toEqual([firstId, secondId, otherConversationId]);\n\t\t\t\texpect(await ids({ conversationId: rootId })).toEqual([firstId, secondId]);\n\t\t\t\t// A status change moves the record between status scans.\n\t\t\t\texpect(await ids({ status: \"queued\" })).toEqual([firstId, otherConversationId]);\n\t\t\t\texpect(await ids({ status: \"placed\" })).toEqual([secondId]);\n\t\t\t\texpect(await ids({ conversationId: secondConversationId, status: \"queued\" })).toEqual([\n\t\t\t\t\totherConversationId,\n\t\t\t\t]);\n\t\t\t\texpect(await ids({ conversationId: secondConversationId, status: \"placed\" })).toEqual([]);\n\t\t\t\texpect((await storage.scanSubmissions({ status: \"placed\" }, 10, undefined, context)).items).toEqual([\n\t\t\t\t\tplacedSecond,\n\t\t\t\t]);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(options, \"stores passive write submissions without input-only lifecycle states\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst doneId = await storage.mintId<SubmissionId>();\n\t\t\tconst failedId = await storage.mintId<SubmissionId>();\n\t\t\tconst queuedDone: SubmissionRecord = {\n\t\t\t\tid: doneId,\n\t\t\t\tconversationId: rootId,\n\t\t\t\trequestId: \"passive-done\",\n\t\t\t\ttype: \"write\",\n\t\t\t\tstatus: \"queued\",\n\t\t\t};\n\t\t\tconst queuedFailed: SubmissionRecord = {\n\t\t\t\tid: failedId,\n\t\t\t\tconversationId: rootId,\n\t\t\t\trequestId: \"passive-failed\",\n\t\t\t\ttype: \"write\",\n\t\t\t\tstatus: \"queued\",\n\t\t\t};\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"submission\", value: queuedDone },\n\t\t\t\t\t{ type: \"submission\", value: queuedFailed },\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\tconst done: SubmissionRecord = {\n\t\t\t\t...queuedDone,\n\t\t\t\tstatus: \"done\",\n\t\t\t\tentry: await storage.mintId<EntryId>(),\n\t\t\t};\n\t\t\tconst unanswered: SubmissionRecord = {\n\t\t\t\t...queuedFailed,\n\t\t\t\tstatus: \"unanswered\",\n\t\t\t\treason: \"closed\",\n\t\t\t\tdetail: { retryable: false },\n\t\t\t};\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"submission\", value: done },\n\t\t\t\t\t{ type: \"submission\", value: unanswered },\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\texpect(await storage.submission(doneId, context)).toEqual(done);\n\t\t\texpect(await storage.submissionByRequest(rootId, \"passive-done\", context)).toEqual(done);\n\t\t\texpect(await storage.submission(failedId, context)).toEqual(unanswered);\n\t\t\texpect(await storage.submissionByRequest(rootId, \"passive-failed\", context)).toEqual(unanswered);\n\t\t}),\n\n\t\tcreateCase(options, \"reconstructs rewindable documents and preserves half-open incarnations\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst firstId = await storage.mintId<DocumentId>();\n\t\t\tconst firstRecord = {\n\t\t\t\tid: firstId,\n\t\t\t\tkind: \"conversation.notes\",\n\t\t\t\tscope: { kind: \"conversation\", conversationId: rootId },\n\t\t\t\thistory: \"rewindable\",\n\t\t\t\tfork: \"asOf\",\n\t\t\t} satisfies DocumentCreate;\n\t\t\tconst initial: JsonObject = { items: [\"a\"], nested: { count: 1 } };\n\t\t\tconst createdAt = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: firstRecord,\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: initial },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst appended = [\"b\"];\n\t\t\tconst ops: Op[] = [\n\t\t\t\t[\"p\", [\"items\"], 1, 0, appended],\n\t\t\t\t[\"s\", [\"nested\", \"count\"], 2],\n\t\t\t];\n\t\t\tconst changedAt = await storage.commit(\n\t\t\t\t[{ type: \"document.change\", id: firstId, content: { kind: \"delta\", version: 1, ops } }],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\t(initial.items as string[]).push(\"caller mutation\");\n\t\t\tappended.push(\"caller mutation\");\n\t\t\texpect(await storage.document(firstId, createdAt, context)).toMatchObject({\n\t\t\t\tversion: 1,\n\t\t\t\tvalue: { items: [\"a\"], nested: { count: 1 } },\n\t\t\t\tdeltasSinceBase: 0,\n\t\t\t});\n\t\t\tconst changed = (await storage.document(firstId, changedAt, context))!;\n\t\t\texpect(changed.value).toEqual({ items: [\"a\", \"b\"], nested: { count: 2 } });\n\t\t\texpect(changed.deltasSinceBase).toBe(1);\n\t\t\t(changed.value.items as string[]).push(\"read mutation\");\n\t\t\texpect((await storage.document(firstId, \"current\", context))?.value).toEqual({\n\t\t\t\titems: [\"a\", \"b\"],\n\t\t\t\tnested: { count: 2 },\n\t\t\t});\n\n\t\t\tconst checkpointAt = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\tid: firstId,\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 2, value: { items: [\"checkpoint\"], nested: { count: 3 } } },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst replacedAt = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\tid: firstId,\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\tkind: \"delta\",\n\t\t\t\t\t\t\tversion: 2,\n\t\t\t\t\t\t\tops: [[\"r\", { items: [\"replacement\"], nested: { count: 4 } }]],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\texpect(await storage.document(firstId, changedAt, context)).toMatchObject({\n\t\t\t\tversion: 1,\n\t\t\t\tvalue: { items: [\"a\", \"b\"], nested: { count: 2 } },\n\t\t\t});\n\t\t\texpect(await storage.document(firstId, checkpointAt, context)).toMatchObject({\n\t\t\t\tversion: 2,\n\t\t\t\tvalue: { items: [\"checkpoint\"], nested: { count: 3 } },\n\t\t\t\tdeltasSinceBase: 0,\n\t\t\t});\n\t\t\texpect(await storage.document(firstId, replacedAt, context)).toMatchObject({\n\t\t\t\tvalue: { items: [\"replacement\"], nested: { count: 4 } },\n\t\t\t\tdeltasSinceBase: 1,\n\t\t\t});\n\t\t\texpect((await storage.document(firstId, \"current\", context))?.deltasSinceBase).toBe(1);\n\n\t\t\tconst secondId = await storage.mintId<DocumentId>();\n\t\t\tconst retiredAt = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: { ...firstRecord, id: secondId },\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { items: [\"new\"] } },\n\t\t\t\t\t},\n\t\t\t\t\t{ type: \"document.retire\", id: firstId },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\tid: firstId,\n\t\t\t\t\t\tcontent: { kind: \"delta\", version: 2, ops: [[\"s\", [\"retiring\"], true]] },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst address = { kind: firstRecord.kind, scope: firstRecord.scope };\n\t\t\texpect((await storage.findDocument(address, changedAt, context))?.id).toBe(firstId);\n\t\t\texpect(await storage.findDocument(address, retiredAt, context)).toMatchObject({\n\t\t\t\tid: secondId,\n\t\t\t\tcreatedAt: retiredAt,\n\t\t\t});\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.scanDocuments({ scope: firstRecord.scope, at: changedAt }, 10, undefined, context)\n\t\t\t\t).items.map(({ id }) => id),\n\t\t\t).toEqual([firstId]);\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.scanDocuments({ scope: firstRecord.scope, at: retiredAt }, 10, undefined, context)\n\t\t\t\t).items.map(({ id }) => id),\n\t\t\t).toEqual([secondId]);\n\t\t\texpect(await storage.document(firstId, retiredAt, context)).toBeUndefined();\n\t\t\texpect((await storage.document(secondId, \"current\", context))?.value).toEqual({ items: [\"new\"] });\n\t\t}),\n\n\t\tcreateCase(options, \"streams long document tails across root replacement deltas\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\tconst record = {\n\t\t\t\tid,\n\t\t\t\tkind: \"conversation.long-tail\",\n\t\t\t\tscope: { kind: \"conversation\", conversationId: rootId },\n\t\t\t\thistory: \"rewindable\",\n\t\t\t\tfork: \"asOf\",\n\t\t\t} satisfies DocumentCreate;\n\t\t\tconst initial = {\n\t\t\t\trevision: 0,\n\t\t\t\trows: Array.from({ length: 512 }, (_, value) => ({ value, stable: `row-${value}` })),\n\t\t\t};\n\t\t\tconst createdAt = await storage.commit(\n\t\t\t\t[{ type: \"document.create\", record, content: { kind: \"base\", version: 1, value: initial } }],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst beforeReplacement = structuredClone(initial);\n\t\t\tlet beforeReplacementAt = createdAt;\n\t\t\tfor (let revision = 1; revision <= 24; revision++) {\n\t\t\t\tconst index = (revision * 17) % beforeReplacement.rows.length;\n\t\t\t\tbeforeReplacement.rows[index]!.value = -revision;\n\t\t\t\tbeforeReplacement.revision = revision;\n\t\t\t\tbeforeReplacementAt = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\tkind: \"delta\",\n\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\tops: [\n\t\t\t\t\t\t\t\t\t[\"s\", [\"rows\", index, \"value\"], -revision],\n\t\t\t\t\t\t\t\t\t[\"s\", [\"revision\"], revision],\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst replacement = {\n\t\t\t\trevision: 100,\n\t\t\t\trows: Array.from({ length: 512 }, (_, value) => ({ value: 10_000 + value, stable: `new-${value}` })),\n\t\t\t};\n\t\t\tconst replacementSnapshot = structuredClone(replacement);\n\t\t\tconst replacementAt = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"r\", replacement]] },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\treplacement.rows[0]!.value = -999;\n\n\t\t\tconst current = structuredClone(replacementSnapshot);\n\t\t\tfor (let revision = 101; revision <= 124; revision++) {\n\t\t\t\tconst index = (revision * 19) % current.rows.length;\n\t\t\t\tcurrent.rows[index]!.value = -revision;\n\t\t\t\tcurrent.revision = revision;\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\tkind: \"delta\",\n\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\tops: [\n\t\t\t\t\t\t\t\t\t[\"s\", [\"rows\", index, \"value\"], -revision],\n\t\t\t\t\t\t\t\t\t[\"s\", [\"revision\"], revision],\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\texpect((await storage.document(id, createdAt, context))?.value).toEqual(initial);\n\t\t\texpect((await storage.document(id, beforeReplacementAt, context))?.value).toEqual(beforeReplacement);\n\t\t\texpect((await storage.document(id, replacementAt, context))?.value).toEqual(replacementSnapshot);\n\t\t\tconst read = (await storage.document(id, \"current\", context))!;\n\t\t\texpect(read.value).toEqual(current);\n\t\t\t(read.value.rows as Array<{ value: number }>)[0]!.value = -1_000;\n\t\t\texpect((await storage.document(id, \"current\", context))?.value).toEqual(current);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\toptions,\n\t\t\t\"copies stored document bases independently and rejects ambiguous sources\",\n\t\t\tasync (storage) => {\n\t\t\t\tconst rootId = await createRoot(storage);\n\t\t\t\tconst childId = await storage.mintId<ConversationId>();\n\t\t\t\tconst secondChildId = await storage.mintId<ConversationId>();\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ type: \"conversation\", value: { id: childId } },\n\t\t\t\t\t\t{ type: \"conversation\", value: { id: secondChildId } },\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tconst sourceId = await storage.mintId<DocumentId>();\n\t\t\t\tconst sourceRecord = {\n\t\t\t\t\tid: sourceId,\n\t\t\t\t\tkind: \"copy.source\",\n\t\t\t\t\tscope: { kind: \"conversation\", conversationId: rootId },\n\t\t\t\t\thistory: \"rewindable\",\n\t\t\t\t\tfork: \"asOf\",\n\t\t\t\t} satisfies DocumentCreate;\n\t\t\t\tconst createdAt = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\t\trecord: sourceRecord,\n\t\t\t\t\t\t\tcontent: { kind: \"base\", version: 2, value: { count: 1, rows: [{ value: \"base\" }] } },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\t\tid: sourceId,\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\tkind: \"delta\",\n\t\t\t\t\t\t\t\tversion: 2,\n\t\t\t\t\t\t\t\tops: [\n\t\t\t\t\t\t\t\t\t[\"s\", [\"count\"], 2],\n\t\t\t\t\t\t\t\t\t[\"p\", [\"rows\"], 1, 0, [{ value: \"current\" }]],\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tconst historicalCopyId = await storage.mintId<DocumentId>();\n\t\t\t\tconst currentCopyId = await storage.mintId<DocumentId>();\n\t\t\t\tconst retiredCopyId = await storage.mintId<DocumentId>();\n\t\t\t\tconst childRecord = (id: DocumentId, conversationId: ConversationId): DocumentCreate => ({\n\t\t\t\t\tid,\n\t\t\t\t\tkind: sourceRecord.kind,\n\t\t\t\t\tscope: { kind: \"conversation\", conversationId },\n\t\t\t\t\thistory: \"rewindable\",\n\t\t\t\t\tfork: \"asOf\",\n\t\t\t\t});\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.copy\",\n\t\t\t\t\t\t\trecord: childRecord(historicalCopyId, childId),\n\t\t\t\t\t\t\tsource: { id: sourceId, at: createdAt },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.copy\",\n\t\t\t\t\t\t\trecord: childRecord(currentCopyId, secondChildId),\n\t\t\t\t\t\t\tsource: { id: sourceId, at: \"current\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.copy\",\n\t\t\t\t\t\t\trecord: childRecord(retiredCopyId, rootId),\n\t\t\t\t\t\t\tsource: { id: sourceId, at: \"current\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ type: \"document.retire\", id: retiredCopyId },\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\texpect(await storage.document(historicalCopyId, \"current\", context)).toMatchObject({\n\t\t\t\t\tversion: 2,\n\t\t\t\t\tvalue: { count: 1, rows: [{ value: \"base\" }] },\n\t\t\t\t});\n\t\t\t\texpect(await storage.document(currentCopyId, \"current\", context)).toMatchObject({\n\t\t\t\t\tversion: 2,\n\t\t\t\t\tvalue: { count: 2, rows: [{ value: \"base\" }, { value: \"current\" }] },\n\t\t\t\t});\n\t\t\t\texpect(await storage.document(retiredCopyId, \"current\", context)).toBeUndefined();\n\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\t\tid: sourceId,\n\t\t\t\t\t\t\tcontent: { kind: \"base\", version: 2, value: { count: 99, rows: [] } },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ type: \"document.retire\", id: sourceId },\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\texpect((await storage.document(currentCopyId, \"current\", context))?.value).toEqual({\n\t\t\t\t\tcount: 2,\n\t\t\t\t\trows: [{ value: \"base\" }, { value: \"current\" }],\n\t\t\t\t});\n\n\t\t\t\tconst latestSourceId = await storage.mintId<DocumentId>();\n\t\t\t\tconst latestCopyId = await storage.mintId<DocumentId>();\n\t\t\t\tconst latestSource = {\n\t\t\t\t\tid: latestSourceId,\n\t\t\t\t\tkind: \"copy.latest\",\n\t\t\t\t\tscope: { kind: \"conversation\", conversationId: rootId },\n\t\t\t\t\thistory: \"latest\",\n\t\t\t\t\tfork: \"current\",\n\t\t\t\t} satisfies DocumentCreate;\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\t\trecord: latestSource,\n\t\t\t\t\t\t\tcontent: { kind: \"base\", version: 4, value: { retained: \"copy\" } },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.copy\",\n\t\t\t\t\t\t\trecord: {\n\t\t\t\t\t\t\t\t...latestSource,\n\t\t\t\t\t\t\t\tid: latestCopyId,\n\t\t\t\t\t\t\t\tscope: { kind: \"conversation\", conversationId: childId },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsource: { id: latestSourceId, at: \"current\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\t\tid: latestSourceId,\n\t\t\t\t\t\t\tcontent: { kind: \"base\", version: 4, value: { retained: \"source-only\" } },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ type: \"document.retire\", id: latestSourceId },\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\texpect(await storage.document(latestCopyId, \"current\", context)).toMatchObject({\n\t\t\t\t\tversion: 4,\n\t\t\t\t\tvalue: { retained: \"copy\" },\n\t\t\t\t});\n\n\t\t\t\tconst conflictId = await storage.mintId<DocumentId>();\n\t\t\t\tlet conflictError: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tawait storage.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"document.copy\",\n\t\t\t\t\t\t\t\trecord: childRecord(conflictId, childId),\n\t\t\t\t\t\t\t\tsource: { id: currentCopyId, at: \"current\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ type: \"document.retire\", id: currentCopyId },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconflictError = error;\n\t\t\t\t}\n\t\t\t\t// Rejected without effect: the copy and the retirement in the same batch are both absent.\n\t\t\t\texpect(conflictError instanceof Error).toBe(true);\n\t\t\t\texpect(await storage.document(conflictId, \"current\", context)).toBeUndefined();\n\t\t\t\texpect((await storage.document(currentCopyId, \"current\", context))?.value).toEqual({\n\t\t\t\t\tcount: 2,\n\t\t\t\t\trows: [{ value: \"base\" }, { value: \"current\" }],\n\t\t\t\t});\n\n\t\t\t\tconst mismatchId = await storage.mintId<DocumentId>();\n\t\t\t\tlet mismatchError: unknown;\n\t\t\t\ttry {\n\t\t\t\t\tawait storage.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"document.copy\",\n\t\t\t\t\t\t\t\trecord: { ...childRecord(mismatchId, childId), kind: \"copy.mismatch\" },\n\t\t\t\t\t\t\t\tsource: { id: currentCopyId, at: \"current\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tmismatchError = error;\n\t\t\t\t}\n\t\t\t\texpect(mismatchError instanceof Error).toBe(true);\n\t\t\t\texpect(await storage.document(mismatchId, \"current\", context)).toBeUndefined();\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\toptions,\n\t\t\t\"uses bases for version transitions and rejects historical reads of current-only documents\",\n\t\t\tasync (storage) => {\n\t\t\t\tawait createRoot(storage);\n\t\t\t\tconst id = await storage.mintId<DocumentId>();\n\t\t\t\tconst record = {\n\t\t\t\t\tid,\n\t\t\t\t\tkind: \"session.settings\",\n\t\t\t\t\tscope: { kind: \"session\" },\n\t\t\t\t} satisfies DocumentCreate;\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[{ type: \"document.create\", record, content: { kind: \"base\", version: 1, value: { count: 1 } } }],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[{ type: \"document.change\", id, content: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], 2]] } }],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tconst migratedAt = await storage.commit(\n\t\t\t\t\t[{ type: \"document.change\", id, content: { kind: \"base\", version: 2, value: { count: 3 } } }],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\texpect(await storage.document(id, \"current\", context)).toMatchObject({ version: 2, value: { count: 3 } });\n\t\t\t\tawait expect(storage.document(id, migratedAt, context)).rejects.toThrow(\n\t\t\t\t\t\"does not retain historical content\",\n\t\t\t\t);\n\n\t\t\t\tawait expect(\n\t\t\t\t\tstorage.commit(\n\t\t\t\t\t\t[{ type: \"document.change\", id, content: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], 4]] } }],\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t),\n\t\t\t\t).rejects.toThrow(\"version transition requires a base\");\n\t\t\t\texpect((await storage.document(id, \"current\", context))?.value).toEqual({ count: 3 });\n\t\t\t\tawait storage.commit([{ type: \"document.retire\", id }], context);\n\t\t\t\texpect(await storage.document(id, \"current\", context)).toBeUndefined();\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(options, \"indexes logical addresses and exact-scope scans independently\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst firstId = await storage.mintId<DocumentId>();\n\t\t\tconst secondId = await storage.mintId<DocumentId>();\n\t\t\tconst conversationId = await storage.mintId<DocumentId>();\n\t\t\tconst taskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst taskSingletonId = await storage.mintId<DocumentId>();\n\t\t\tconst taskFamilyId = await storage.mintId<DocumentId>();\n\t\t\tconst taskOtherKindId = await storage.mintId<DocumentId>();\n\t\t\tconst createdAt = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"task\", value: pendingTask(taskId, rootId) },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: {\n\t\t\t\t\t\t\tid: firstId,\n\t\t\t\t\t\t\tkind: \"cache\",\n\t\t\t\t\t\t\tscope: { kind: \"session\" },\n\t\t\t\t\t\t\tkey: \"__proto__\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { owner: \"first\" } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: {\n\t\t\t\t\t\t\tid: secondId,\n\t\t\t\t\t\t\tkind: \"cache\",\n\t\t\t\t\t\t\tscope: { kind: \"session\" },\n\t\t\t\t\t\t\tkey: \"constructor\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { owner: \"second\" } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: {\n\t\t\t\t\t\t\tid: conversationId,\n\t\t\t\t\t\t\tkind: \"cache\",\n\t\t\t\t\t\t\tscope: { kind: \"conversation\", conversationId: rootId },\n\t\t\t\t\t\t\thistory: \"latest\",\n\t\t\t\t\t\t\tfork: \"current\",\n\t\t\t\t\t\t\tkey: \"__proto__\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { owner: \"conversation\" } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: {\n\t\t\t\t\t\t\tid: taskSingletonId,\n\t\t\t\t\t\t\tkind: \"task.cache\",\n\t\t\t\t\t\t\tscope: { kind: \"task\", taskId },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { owner: \"singleton\" } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: {\n\t\t\t\t\t\t\tid: taskFamilyId,\n\t\t\t\t\t\t\tkind: \"task.cache\",\n\t\t\t\t\t\t\tscope: { kind: \"task\", taskId },\n\t\t\t\t\t\t\tkey: \"member\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { owner: \"family\" } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: {\n\t\t\t\t\t\t\tid: taskOtherKindId,\n\t\t\t\t\t\t\tkind: \"task.other\",\n\t\t\t\t\t\t\tscope: { kind: \"task\", taskId },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { owner: \"other\" } },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.findDocument(\n\t\t\t\t\t\t{ kind: \"cache\", scope: { kind: \"session\" }, key: \"__proto__\" },\n\t\t\t\t\t\t\"current\",\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t)\n\t\t\t\t)?.id,\n\t\t\t).toBe(firstId);\n\t\t\texpect(\n\t\t\t\t(await storage.scanDocuments({ scope: { kind: \"session\" }, at: \"current\" }, 1, undefined, context)).items,\n\t\t\t).toHaveLength(1);\n\t\t\tconst first = await storage.scanDocuments(\n\t\t\t\t{ scope: { kind: \"session\" }, at: \"current\" },\n\t\t\t\t1,\n\t\t\t\tundefined,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst second = await storage.scanDocuments(\n\t\t\t\t{ scope: { kind: \"session\" }, at: \"current\" },\n\t\t\t\t1,\n\t\t\t\tfirst.next,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\texpect([...first.items, ...second.items].map(({ id }) => id)).toEqual([firstId, secondId]);\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.scanDocuments(\n\t\t\t\t\t\t{ scope: { kind: \"conversation\", conversationId: rootId }, at: \"current\" },\n\t\t\t\t\t\t10,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t)\n\t\t\t\t).items.map(({ id }) => id),\n\t\t\t).toEqual([conversationId]);\n\t\t\texpect(\n\t\t\t\t(await storage.findDocument({ kind: \"task.cache\", scope: { kind: \"task\", taskId } }, \"current\", context))\n\t\t\t\t\t?.id,\n\t\t\t).toBe(taskSingletonId);\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.findDocument(\n\t\t\t\t\t\t{ kind: \"task.cache\", scope: { kind: \"task\", taskId }, key: \"member\" },\n\t\t\t\t\t\t\"current\",\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t)\n\t\t\t\t)?.id,\n\t\t\t).toBe(taskFamilyId);\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.scanDocuments(\n\t\t\t\t\t\t{ scope: { kind: \"task\", taskId }, at: \"current\", kind: \"task.cache\" },\n\t\t\t\t\t\t10,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t)\n\t\t\t\t).items.map(({ id }) => id),\n\t\t\t).toEqual([taskSingletonId, taskFamilyId]);\n\t\t\tawait expect(storage.document(taskSingletonId, createdAt, context)).rejects.toThrow(\n\t\t\t\t\"does not retain historical content\",\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\toptions,\n\t\t\t\"keeps document lifecycle failures atomic and gives create-plus-retire an empty lifetime\",\n\t\t\tasync (storage) => {\n\t\t\t\tconst rootId = await createRoot(storage);\n\t\t\t\tconst firstId = await storage.mintId<DocumentId>();\n\t\t\t\tconst secondId = await storage.mintId<DocumentId>();\n\t\t\t\tconst record = {\n\t\t\t\t\tid: firstId,\n\t\t\t\t\tkind: \"singleton\",\n\t\t\t\t\tscope: { kind: \"session\" },\n\t\t\t\t} satisfies DocumentCreate;\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[{ type: \"document.create\", record, content: { kind: \"base\", version: 1, value: { value: 1 } } }],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tawait expect(\n\t\t\t\t\tstorage.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\t\t\trecord: { ...record, id: secondId },\n\t\t\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { value: 2 } },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ type: \"document.change\", id: firstId, content: { kind: \"delta\", version: 1, ops: [] } },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t),\n\t\t\t\t).rejects.toThrow(\"already has a current incarnation\");\n\t\t\t\texpect((await storage.document(firstId, \"current\", context))?.value).toEqual({ value: 1 });\n\t\t\t\texpect(await storage.document(secondId, \"current\", context)).toBeUndefined();\n\n\t\t\t\tconst emptyId = await storage.mintId<DocumentId>();\n\t\t\t\tconst emptyAt = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\t\trecord: {\n\t\t\t\t\t\t\t\tid: emptyId,\n\t\t\t\t\t\t\t\tkind: record.kind,\n\t\t\t\t\t\t\t\tkey: \"empty\",\n\t\t\t\t\t\t\t\tscope: { kind: \"conversation\", conversationId: rootId },\n\t\t\t\t\t\t\t\thistory: \"rewindable\",\n\t\t\t\t\t\t\t\tfork: \"initial\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: {} },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ type: \"document.retire\", id: emptyId },\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\texpect(await storage.document(emptyId, \"current\", context)).toBeUndefined();\n\t\t\t\texpect(await storage.document(emptyId, emptyAt, context)).toBeUndefined();\n\t\t\t\texpect(\n\t\t\t\t\tawait storage.findDocument(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkind: record.kind,\n\t\t\t\t\t\t\tscope: { kind: \"conversation\", conversationId: rootId },\n\t\t\t\t\t\t\tkey: \"empty\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\temptyAt,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t),\n\t\t\t\t).toBeUndefined();\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\toptions,\n\t\t\t\"rolls back record tables and secondary indexes when a document command fails\",\n\t\t\tasync (storage) => {\n\t\t\t\tconst rootId = await createRoot(storage);\n\t\t\t\tconst taskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\t\tconst submissionId = await storage.mintId<SubmissionId>();\n\t\t\t\tconst documentId = await storage.mintId<DocumentId>();\n\t\t\t\tconst task = pendingTask(taskId, rootId);\n\t\t\t\tconst submission: SubmissionRecord = {\n\t\t\t\t\tid: submissionId,\n\t\t\t\t\tconversationId: rootId,\n\t\t\t\t\trequestId: \"atomic\",\n\t\t\t\t\ttype: \"input\",\n\t\t\t\t\tstatus: \"queued\",\n\t\t\t\t};\n\t\t\t\tconst record = {\n\t\t\t\t\tid: documentId,\n\t\t\t\t\tkind: \"atomic\",\n\t\t\t\t\tscope: { kind: \"session\" },\n\t\t\t\t} satisfies DocumentCreate;\n\t\t\t\tconst baselineSeq = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ type: \"task\", value: task },\n\t\t\t\t\t\t{ type: \"submission\", value: submission },\n\t\t\t\t\t\t{ type: \"document.create\", record, content: { kind: \"base\", version: 1, value: { count: 1 } } },\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\n\t\t\t\tconst entryId = await storage.mintId<EntryId>();\n\t\t\t\tconst conflictingDocumentId = await storage.mintId<DocumentId>();\n\t\t\t\tawait expect(\n\t\t\t\t\tstorage.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"task\",\n\t\t\t\t\t\t\t\tvalue: { ...task, state: { status: \"running\", checkpoint: { phase: \"effect\" } } },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"submission\",\n\t\t\t\t\t\t\t\tvalue: { ...submission, status: \"unanswered\", reason: \"failed\" },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ type: \"entry\", value: entry(entryId, rootId, \"transient\") },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\t\t\trecord: { ...record, id: conflictingDocumentId },\n\t\t\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { count: 2 } },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t),\n\t\t\t\t).rejects.toThrow(\"already has a current incarnation\");\n\n\t\t\t\texpect(await storage.task(taskId, context)).toEqual(task);\n\t\t\t\texpect((await storage.scanTasks({ status: \"pending\" }, 10, undefined, context)).items).toEqual([task]);\n\t\t\t\texpect(await storage.submissionByRequest(rootId, \"atomic\", context)).toEqual(submission);\n\t\t\t\texpect(await storage.entry(entryId, context)).toBeUndefined();\n\t\t\t\texpect(await storage.document(conflictingDocumentId, \"current\", context)).toBeUndefined();\n\t\t\t\texpect(\n\t\t\t\t\t(await storage.findDocument({ kind: record.kind, scope: record.scope }, \"current\", context))?.id,\n\t\t\t\t).toBe(documentId);\n\t\t\t\tconst afterRollbackSeq = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"document.change\",\n\t\t\t\t\t\t\tid: documentId,\n\t\t\t\t\t\t\tcontent: { kind: \"delta\", version: 1, ops: [[\"s\", [\"count\"], 3]] },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\texpect(afterRollbackSeq).toBeGreaterThan(baselineSeq);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(options, \"keeps indexed string identities lossless\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst first = \"\\ud800\";\n\t\t\tconst second = \"\\ud801\";\n\t\t\tconst firstTaskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst secondTaskId = await storage.mintId<TaskId<JsonValue>>();\n\t\t\tconst firstSubmissionId = await storage.mintId<SubmissionId>();\n\t\t\tconst secondSubmissionId = await storage.mintId<SubmissionId>();\n\t\t\tconst firstKindDocumentId = await storage.mintId<DocumentId>();\n\t\t\tconst secondKindDocumentId = await storage.mintId<DocumentId>();\n\t\t\tconst firstKeyDocumentId = await storage.mintId<DocumentId>();\n\t\t\tconst secondKeyDocumentId = await storage.mintId<DocumentId>();\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\t{ type: \"task\", value: { ...pendingTask(firstTaskId, rootId), kind: first } },\n\t\t\t\t\t{ type: \"task\", value: { ...pendingTask(secondTaskId, rootId), kind: second } },\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"submission\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid: firstSubmissionId,\n\t\t\t\t\t\t\tconversationId: rootId,\n\t\t\t\t\t\t\trequestId: first,\n\t\t\t\t\t\t\ttype: \"input\",\n\t\t\t\t\t\t\tstatus: \"queued\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"submission\",\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tid: secondSubmissionId,\n\t\t\t\t\t\t\tconversationId: rootId,\n\t\t\t\t\t\t\trequestId: second,\n\t\t\t\t\t\t\ttype: \"input\",\n\t\t\t\t\t\t\tstatus: \"queued\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: { id: firstKindDocumentId, kind: first, scope: { kind: \"session\" } },\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { identity: \"first kind\" } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: { id: secondKindDocumentId, kind: second, scope: { kind: \"session\" } },\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { identity: \"second kind\" } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: { id: firstKeyDocumentId, kind: \"family\", key: first, scope: { kind: \"session\" } },\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { identity: \"first key\" } },\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"document.create\",\n\t\t\t\t\t\trecord: { id: secondKeyDocumentId, kind: \"family\", key: second, scope: { kind: \"session\" } },\n\t\t\t\t\t\tcontent: { kind: \"base\", version: 1, value: { identity: \"second key\" } },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\texpect((await storage.scanTasks({ kind: first }, 10, undefined, context)).items.map(({ id }) => id)).toEqual([\n\t\t\t\tfirstTaskId,\n\t\t\t]);\n\t\t\texpect((await storage.scanTasks({ kind: second }, 10, undefined, context)).items.map(({ id }) => id)).toEqual([\n\t\t\t\tsecondTaskId,\n\t\t\t]);\n\t\t\texpect((await storage.task(firstTaskId, context))?.kind).toBe(first);\n\t\t\texpect((await storage.task(secondTaskId, context))?.kind).toBe(second);\n\t\t\texpect((await storage.submissionByRequest(rootId, first, context))?.requestId).toBe(first);\n\t\t\texpect((await storage.submissionByRequest(rootId, first, context))?.id).toBe(firstSubmissionId);\n\t\t\texpect((await storage.submissionByRequest(rootId, second, context))?.id).toBe(secondSubmissionId);\n\t\t\texpect((await storage.findDocument({ kind: first, scope: { kind: \"session\" } }, \"current\", context))?.id).toBe(\n\t\t\t\tfirstKindDocumentId,\n\t\t\t);\n\t\t\texpect(\n\t\t\t\t(await storage.findDocument({ kind: second, scope: { kind: \"session\" } }, \"current\", context))?.id,\n\t\t\t).toBe(secondKindDocumentId);\n\t\t\texpect(\n\t\t\t\t(await storage.findDocument({ kind: \"family\", key: first, scope: { kind: \"session\" } }, \"current\", context))\n\t\t\t\t\t?.id,\n\t\t\t).toBe(firstKeyDocumentId);\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.findDocument(\n\t\t\t\t\t\t{ kind: \"family\", key: second, scope: { kind: \"session\" } },\n\t\t\t\t\t\t\"current\",\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t)\n\t\t\t\t)?.id,\n\t\t\t).toBe(secondKeyDocumentId);\n\t\t\texpect(\n\t\t\t\t(\n\t\t\t\t\tawait storage.scanDocuments(\n\t\t\t\t\t\t{ scope: { kind: \"session\" }, at: \"current\", kind: first },\n\t\t\t\t\t\t10,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t)\n\t\t\t\t).items.map(({ id }) => id),\n\t\t\t).toEqual([firstKindDocumentId]);\n\t\t}),\n\n\t\tcreateCase(options, \"keeps one global record ID namespace and rejects exhausted ID minting\", async (storage) => {\n\t\t\tconst rootId = await createRoot(storage);\n\t\t\tconst explicitEntryId = idFromNumber<EntryId>(100);\n\t\t\tawait storage.commit([{ type: \"entry\", value: entry(explicitEntryId, rootId) }], context);\n\t\t\texpect(await storage.mintId<EntryId>()).toBe(101);\n\t\t\tawait expect(\n\t\t\t\tstorage.commit(\n\t\t\t\t\t[{ type: \"task\", value: pendingTask(idFromNumber<TaskId<JsonValue>>(explicitEntryId), rootId) }],\n\t\t\t\t\tcontext,\n\t\t\t\t),\n\t\t\t).rejects.toThrow(`ID ${explicitEntryId} already belongs to entry`);\n\n\t\t\tawait storage.commit(\n\t\t\t\t[{ type: \"entry\", value: entry(idFromNumber<EntryId>(Number.MAX_SAFE_INTEGER), rootId, \"last-id\") }],\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tawait expect(storage.mintId<EntryId>()).rejects.toThrow(\"ID space is exhausted\");\n\t\t\tawait expect(storage.mintId<EntryId>()).rejects.toThrow(\"ID space is exhausted\");\n\t\t}),\n\n\t\tcreateCase(options, \"rejects every operation after close\", async (storage) => {\n\t\t\tawait createRoot(storage);\n\t\t\tawait storage.close(context);\n\t\t\tawait expect(storage.conversation(ROOT_CONVERSATION_ID, context)).rejects.toThrow(\"closed\");\n\t\t\tawait expect(storage.commit([] satisfies StorageWrite[], context)).rejects.toThrow(\"closed\");\n\t\t\tawait expect(storage.mintId<ConversationId>()).rejects.toThrow(\"closed\");\n\t\t}),\n\t];\n}\n"]}
@@ -0,0 +1,37 @@
1
+ import type { ExecutionEnv } from "../env/index.ts";
2
+ import type { Storage } from "../types.ts";
3
+ export interface StorageConformanceAssertions {
4
+ ok(value: unknown, message?: string): void;
5
+ strictEqual(actual: unknown, expected: unknown): void;
6
+ deepEqual(actual: unknown, expected: unknown): void;
7
+ partialDeepEqual(actual: unknown, expected: unknown): void;
8
+ greaterThan(actual: number, expected: number): void;
9
+ rejects(operation: Promise<unknown>, messageIncludes: string): Promise<void>;
10
+ }
11
+ export type StorageConformanceProvider = (use: (storage: Storage) => Promise<void>) => Promise<void>;
12
+ export interface StorageConformanceOptions {
13
+ readonly assertions: StorageConformanceAssertions;
14
+ readonly withStorage: StorageConformanceProvider;
15
+ }
16
+ export interface StorageConformanceCase {
17
+ readonly name: string;
18
+ run(): Promise<void>;
19
+ }
20
+ export type EnvConformanceAssertions = StorageConformanceAssertions;
21
+ /** Calls `use` once with an environment whose `cwd` is a fresh, empty, writable directory, then cleans up. */
22
+ export type EnvConformanceProvider = (use: (env: ExecutionEnv) => Promise<void>) => Promise<void>;
23
+ export interface EnvConformanceOptions {
24
+ readonly assertions: EnvConformanceAssertions;
25
+ readonly withEnv: EnvConformanceProvider;
26
+ /** Program and flag that run a POSIX shell script from the next argument; default `["sh", "-c"]`. */
27
+ readonly shell?: readonly string[];
28
+ /** Whether the shell's `ln -s` creates symbolic links; default true. */
29
+ readonly symlinks?: boolean;
30
+ }
31
+ export interface EnvConformanceCase {
32
+ readonly name: string;
33
+ /** Cases that wait for an environment's watch latency need longer than a test runner's default timeout. */
34
+ readonly timeoutMs?: number;
35
+ run(): Promise<void>;
36
+ }
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,4BAA4B;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACtD,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACpD,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3D,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAED,MAAM,MAAM,0BAA0B,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErG,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,UAAU,EAAE,4BAA4B,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC;CACjD;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,MAAM,MAAM,wBAAwB,GAAG,4BAA4B,CAAC;AAEpE,8GAA8G;AAC9G,MAAM,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAElG,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,qGAAqG;IACrG,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2GAA2G;IAC3G,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExecutionEnv } from \"../env/index.ts\";\nimport type { Storage } from \"../types.ts\";\n\nexport interface StorageConformanceAssertions {\n\tok(value: unknown, message?: string): void;\n\tstrictEqual(actual: unknown, expected: unknown): void;\n\tdeepEqual(actual: unknown, expected: unknown): void;\n\tpartialDeepEqual(actual: unknown, expected: unknown): void;\n\tgreaterThan(actual: number, expected: number): void;\n\trejects(operation: Promise<unknown>, messageIncludes: string): Promise<void>;\n}\n\nexport type StorageConformanceProvider = (use: (storage: Storage) => Promise<void>) => Promise<void>;\n\nexport interface StorageConformanceOptions {\n\treadonly assertions: StorageConformanceAssertions;\n\treadonly withStorage: StorageConformanceProvider;\n}\n\nexport interface StorageConformanceCase {\n\treadonly name: string;\n\trun(): Promise<void>;\n}\n\nexport type EnvConformanceAssertions = StorageConformanceAssertions;\n\n/** Calls `use` once with an environment whose `cwd` is a fresh, empty, writable directory, then cleans up. */\nexport type EnvConformanceProvider = (use: (env: ExecutionEnv) => Promise<void>) => Promise<void>;\n\nexport interface EnvConformanceOptions {\n\treadonly assertions: EnvConformanceAssertions;\n\treadonly withEnv: EnvConformanceProvider;\n\t/** Program and flag that run a POSIX shell script from the next argument; default `[\"sh\", \"-c\"]`. */\n\treadonly shell?: readonly string[];\n\t/** Whether the shell's `ln -s` creates symbolic links; default true. */\n\treadonly symlinks?: boolean;\n}\n\nexport interface EnvConformanceCase {\n\treadonly name: string;\n\t/** Cases that wait for an environment's watch latency need longer than a test runner's default timeout. */\n\treadonly timeoutMs?: number;\n\trun(): Promise<void>;\n}\n"]}
@@ -0,0 +1,55 @@
1
+ import type { Context } from "@ny4n/chord";
2
+ import { type Static, Type } from "typebox";
3
+ import type { ToolExecutionApi, ToolRegistration } from "../harness/types.ts";
4
+ declare const bashSchema: Type.TObject<{
5
+ command: Type.TString;
6
+ timeout: Type.TOptional<Type.TNumber>;
7
+ }>;
8
+ declare const powershellSchema: Type.TObject<{
9
+ command: Type.TString;
10
+ timeout: Type.TOptional<Type.TNumber>;
11
+ }>;
12
+ /** What a program that calls `bash` or `powershell` receives. */
13
+ declare const shellStructuredOutputSchema: Type.TObject<{
14
+ output: Type.TString;
15
+ truncated: Type.TBoolean;
16
+ fullOutputPath: Type.TOptional<Type.TString>;
17
+ exitCode: Type.TNumber;
18
+ }>;
19
+ export type BashToolInput = Static<typeof bashSchema>;
20
+ export type PowerShellToolInput = Static<typeof powershellSchema>;
21
+ export type ShellStructuredOutput = Static<typeof shellStructuredOutputSchema>;
22
+ /** A command about to run, which `prepare` may change: the script, its working directory and environment. */
23
+ export interface BashExecution {
24
+ command: string;
25
+ cwd: string;
26
+ env: Record<string, string>;
27
+ inheritEnv: boolean;
28
+ }
29
+ export type BashPrepare = (execution: BashExecution, api: ToolExecutionApi, context: Context) => void | Promise<void>;
30
+ export interface BashToolOptions {
31
+ commandPrefix?: string;
32
+ prepare?: BashPrepare;
33
+ }
34
+ export interface PowerShellToolOptions {
35
+ /** Lines run before each command. */
36
+ commandPrefix?: string;
37
+ prepare?: BashPrepare;
38
+ /** PowerShell programs to try in order; default `pwsh`, then `powershell`. A program that cannot start is skipped. */
39
+ programs?: readonly string[];
40
+ }
41
+ /**
42
+ * Runs a command through the environment's shell. Its output streams to `api.output()`, where the Harness keeps the
43
+ * tail within the default limits; the result content is that retained output. The retained window goes to the
44
+ * environment, which may omit output outside it and report how much it omitted, so dropped counts stay exact. Output
45
+ * beyond the limits is spilled to a file whose path is reported as a diagnostic. A nonzero exit is an error result with
46
+ * the exit code; a timeout throws, which makes an error result that still carries the output and diagnostics.
47
+ */
48
+ export declare function createBashTool(options?: BashToolOptions): ToolRegistration<typeof bashSchema>;
49
+ /**
50
+ * Runs a PowerShell command, like `bash` but through PowerShell instead of the environment's shell: `pwsh` (PowerShell
51
+ * 7), else Windows PowerShell, started directly with the command as an argument, so no other shell parses it.
52
+ */
53
+ export declare function createPowerShellTool(options?: PowerShellToolOptions): ToolRegistration<typeof powershellSchema>;
54
+ export {};
55
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,gBAAgB,EAAuB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMnG,QAAA,MAAM,UAAU;;;EAGd,CAAC;AAEH,QAAA,MAAM,gBAAgB;;;EAGpB,CAAC;AAEH,iEAAiE;AACjE,QAAA,MAAM,2BAA2B;;;;;EAK/B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AACtD,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAClE,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE/E,6GAA6G;AAC7G,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtH,MAAM,WAAW,eAAe;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACrC,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,sHAAsH;IACtH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAqFD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,gBAAgB,CAAC,OAAO,UAAU,CAAC,CAa7F;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,gBAAgB,CAAC,OAAO,gBAAgB,CAAC,CAgB/G"}
@@ -0,0 +1,138 @@
1
+ import { Type } from "typebox";
2
+ import { defineTool } from "../harness/define.js";
3
+ import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES } from "../truncate.js";
4
+ import { requireEnv } from "./env.js";
5
+ const MAX_TIMEOUT_SECONDS = 2_147_483_647 / 1000;
6
+ const bashSchema = Type.Object({
7
+ command: Type.String({ description: "Bash command to execute" }),
8
+ timeout: Type.Optional(Type.Number({ description: "Timeout in seconds (optional, no default timeout)" })),
9
+ });
10
+ const powershellSchema = Type.Object({
11
+ command: Type.String({ description: "PowerShell command to execute" }),
12
+ timeout: Type.Optional(Type.Number({ description: "Timeout in seconds (optional, no default timeout)" })),
13
+ });
14
+ /** What a program that calls `bash` or `powershell` receives. */
15
+ const shellStructuredOutputSchema = Type.Object({
16
+ output: Type.String({ description: "Combined stdout and stderr: the retained tail, as the model sees it" }),
17
+ truncated: Type.Boolean({ description: "Whether earlier output was dropped" }),
18
+ fullOutputPath: Type.Optional(Type.String({ description: "File with the complete output, when it was spilled" })),
19
+ exitCode: Type.Number(),
20
+ });
21
+ function validateTimeout(timeout) {
22
+ if (timeout === undefined)
23
+ return;
24
+ if (!Number.isFinite(timeout) || timeout <= 0) {
25
+ throw new Error("Invalid timeout: must be a finite number of seconds");
26
+ }
27
+ if (timeout > MAX_TIMEOUT_SECONDS) {
28
+ throw new Error(`Invalid timeout: maximum is ${MAX_TIMEOUT_SECONDS} seconds`);
29
+ }
30
+ }
31
+ /** The execution of one call: the command with its prefix, in the environment's working directory, then `prepare`. */
32
+ async function prepareExecution(command, options, api, context) {
33
+ const execution = {
34
+ command: options?.commandPrefix ? `${options.commandPrefix}\n${command}` : command,
35
+ cwd: requireEnv(api).cwd,
36
+ env: {},
37
+ inheritEnv: true,
38
+ };
39
+ await options?.prepare?.(execution, api, context);
40
+ return execution;
41
+ }
42
+ /**
43
+ * Run each command form in turn until one starts, streaming output to `api.output()` within the retained window, and
44
+ * turn the result into the tool's result: a spill diagnostic, an error result for a nonzero exit, and a thrown error for
45
+ * a failure such as a timeout. The structured output repeats the retained output with the exit code.
46
+ */
47
+ async function runCommand(commands, execution, timeout, api, context) {
48
+ const env = requireEnv(api);
49
+ let result;
50
+ for (const command of commands) {
51
+ result = await env.exec(command, {
52
+ cwd: execution.cwd,
53
+ env: execution.env,
54
+ inheritEnv: execution.inheritEnv,
55
+ ...(timeout === undefined ? {} : { timeout }),
56
+ onOutput: (text, _context, info) => api.output(text, info.skipped),
57
+ spill: { afterBytes: DEFAULT_MAX_BYTES, afterLines: DEFAULT_MAX_LINES },
58
+ // An environment may then omit output outside the retained tail and report the omission.
59
+ ...(api.outputWindow === undefined ? {} : { window: api.outputWindow }),
60
+ }, context);
61
+ // A program that could not start produced no output; the next form may.
62
+ if (result.ok || result.error.code !== "spawn_error")
63
+ break;
64
+ }
65
+ if (result === undefined)
66
+ throw new Error("No command to run");
67
+ const spillPath = result.ok ? result.value.spillPath : result.error.spillPath;
68
+ if (spillPath !== undefined) {
69
+ api.diagnostic({ severity: "info", code: "full_output", message: `Full output: ${spillPath}` });
70
+ }
71
+ if (!result.ok) {
72
+ if (result.error.code === "aborted" && context.abortSignal?.aborted)
73
+ throw result.error;
74
+ if (result.error.code === "timeout")
75
+ throw new Error(`Command timed out after ${timeout} seconds`);
76
+ if (result.error.code === "aborted")
77
+ throw new Error("Command aborted");
78
+ throw result.error;
79
+ }
80
+ const exitCode = result.value.exitCode;
81
+ const retained = api.retainedOutput();
82
+ const structuredOutput = {
83
+ output: retained.text,
84
+ truncated: retained.truncated,
85
+ ...(spillPath === undefined ? {} : { fullOutputPath: spillPath }),
86
+ exitCode,
87
+ };
88
+ if (exitCode === 0)
89
+ return { structuredOutput };
90
+ const exited = { severity: "error", code: "exit_code", message: `Command exited with code ${exitCode}` };
91
+ return { structuredOutput, isError: true, diagnostics: [exited] };
92
+ }
93
+ /**
94
+ * Runs a command through the environment's shell. Its output streams to `api.output()`, where the Harness keeps the
95
+ * tail within the default limits; the result content is that retained output. The retained window goes to the
96
+ * environment, which may omit output outside it and report how much it omitted, so dropped counts stay exact. Output
97
+ * beyond the limits is spilled to a file whose path is reported as a diagnostic. A nonzero exit is an error result with
98
+ * the exit code; a timeout throws, which makes an error result that still carries the output and diagnostics.
99
+ */
100
+ export function createBashTool(options) {
101
+ return defineTool({
102
+ name: "bash",
103
+ description: `Execute a bash command in the current working directory. Returns combined stdout and stderr. Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.`,
104
+ parameters: bashSchema,
105
+ structuredOutputSchema: shellStructuredOutputSchema,
106
+ outputLimits: { retain: "tail" },
107
+ async execute(args, api, context) {
108
+ validateTimeout(args.timeout);
109
+ const execution = await prepareExecution(args.command, options, api, context);
110
+ return runCommand([execution.command], execution, args.timeout, api, context);
111
+ },
112
+ });
113
+ }
114
+ /** Output in UTF-8 whatever the console's code page, as the coding agent's `powershell` tool does. */
115
+ const UTF8_OUTPUT = "try { [Console]::OutputEncoding=[System.Text.Encoding]::UTF8 } catch {}";
116
+ const POWERSHELL_ARGS = ["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-Command"];
117
+ /**
118
+ * Runs a PowerShell command, like `bash` but through PowerShell instead of the environment's shell: `pwsh` (PowerShell
119
+ * 7), else Windows PowerShell, started directly with the command as an argument, so no other shell parses it.
120
+ */
121
+ export function createPowerShellTool(options) {
122
+ const programs = options?.programs ?? ["pwsh", "powershell"];
123
+ return defineTool({
124
+ name: "powershell",
125
+ description: `Execute a PowerShell command in the current working directory. Returns combined stdout and stderr. Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.`,
126
+ parameters: powershellSchema,
127
+ structuredOutputSchema: shellStructuredOutputSchema,
128
+ outputLimits: { retain: "tail" },
129
+ async execute(args, api, context) {
130
+ validateTimeout(args.timeout);
131
+ const execution = await prepareExecution(args.command, options, api, context);
132
+ const script = `${UTF8_OUTPUT}\n${execution.command}`;
133
+ const commands = programs.map((program) => [program, ...POWERSHELL_ARGS, script]);
134
+ return runCommand(commands, execution, args.timeout, api, context);
135
+ },
136
+ });
137
+ }
138
+ //# sourceMappingURL=bash.js.map