@earendil-works/pi-agent-core 0.84.3 → 0.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/README.md +4 -0
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +32 -25
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/harness/agent-harness.d.ts +639 -384
  6. package/dist/harness/agent-harness.d.ts.map +1 -1
  7. package/dist/harness/agent-harness.js +5 -251
  8. package/dist/harness/agent-harness.js.map +1 -1
  9. package/dist/harness/compaction/branch-summarization.d.ts +12 -6
  10. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  11. package/dist/harness/compaction/branch-summarization.js +33 -26
  12. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  13. package/dist/harness/compaction/compaction.d.ts +30 -8
  14. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  15. package/dist/harness/compaction/compaction.js +53 -63
  16. package/dist/harness/compaction/compaction.js.map +1 -1
  17. package/dist/harness/config.d.ts +9 -0
  18. package/dist/harness/config.d.ts.map +1 -0
  19. package/dist/harness/config.js +27 -0
  20. package/dist/harness/config.js.map +1 -0
  21. package/dist/harness/context.d.ts +9 -0
  22. package/dist/harness/context.d.ts.map +1 -0
  23. package/dist/harness/context.js +13 -0
  24. package/dist/harness/context.js.map +1 -0
  25. package/dist/harness/env/nodejs.d.ts +24 -28
  26. package/dist/harness/env/nodejs.d.ts.map +1 -1
  27. package/dist/harness/env/nodejs.js +242 -87
  28. package/dist/harness/env/nodejs.js.map +1 -1
  29. package/dist/harness/events.d.ts +20 -38
  30. package/dist/harness/events.d.ts.map +1 -1
  31. package/dist/harness/events.js +240 -55
  32. package/dist/harness/events.js.map +1 -1
  33. package/dist/harness/execution/assistant.d.ts +42 -0
  34. package/dist/harness/execution/assistant.d.ts.map +1 -0
  35. package/dist/harness/execution/assistant.js +82 -0
  36. package/dist/harness/execution/assistant.js.map +1 -0
  37. package/dist/harness/execution/effect-gate.d.ts +22 -0
  38. package/dist/harness/execution/effect-gate.d.ts.map +1 -0
  39. package/dist/harness/execution/effect-gate.js +49 -0
  40. package/dist/harness/execution/effect-gate.js.map +1 -0
  41. package/dist/harness/execution/tools.d.ts +67 -0
  42. package/dist/harness/execution/tools.d.ts.map +1 -0
  43. package/dist/harness/execution/tools.js +121 -0
  44. package/dist/harness/execution/tools.js.map +1 -0
  45. package/dist/harness/hooks.d.ts +38 -0
  46. package/dist/harness/hooks.d.ts.map +1 -0
  47. package/dist/harness/hooks.js +406 -0
  48. package/dist/harness/hooks.js.map +1 -0
  49. package/dist/harness/messages.d.ts +2 -2
  50. package/dist/harness/messages.d.ts.map +1 -1
  51. package/dist/harness/messages.js.map +1 -1
  52. package/dist/harness/prompt-templates.d.ts +3 -2
  53. package/dist/harness/prompt-templates.d.ts.map +1 -1
  54. package/dist/harness/prompt-templates.js +17 -17
  55. package/dist/harness/prompt-templates.js.map +1 -1
  56. package/dist/harness/result.d.ts +93 -0
  57. package/dist/harness/result.d.ts.map +1 -1
  58. package/dist/harness/result.js +40 -0
  59. package/dist/harness/result.js.map +1 -1
  60. package/dist/harness/runtime/drive/boundary.d.ts +28 -0
  61. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
  62. package/dist/harness/runtime/drive/boundary.js +170 -0
  63. package/dist/harness/runtime/drive/boundary.js.map +1 -0
  64. package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
  65. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
  66. package/dist/harness/runtime/drive/checkpoint.js +133 -0
  67. package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
  68. package/dist/harness/runtime/drive/deferred.d.ts +15 -0
  69. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
  70. package/dist/harness/runtime/drive/deferred.js +179 -0
  71. package/dist/harness/runtime/drive/deferred.js.map +1 -0
  72. package/dist/harness/runtime/drive/generation.d.ts +8 -0
  73. package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
  74. package/dist/harness/runtime/drive/generation.js +205 -0
  75. package/dist/harness/runtime/drive/generation.js.map +1 -0
  76. package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
  77. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
  78. package/dist/harness/runtime/drive/reconcile.js +140 -0
  79. package/dist/harness/runtime/drive/reconcile.js.map +1 -0
  80. package/dist/harness/runtime/drive/recovery.d.ts +8 -0
  81. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
  82. package/dist/harness/runtime/drive/recovery.js +85 -0
  83. package/dist/harness/runtime/drive/recovery.js.map +1 -0
  84. package/dist/harness/runtime/drive/response.d.ts +23 -0
  85. package/dist/harness/runtime/drive/response.d.ts.map +1 -0
  86. package/dist/harness/runtime/drive/response.js +394 -0
  87. package/dist/harness/runtime/drive/response.js.map +1 -0
  88. package/dist/harness/runtime/drive/retry.d.ts +4 -0
  89. package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
  90. package/dist/harness/runtime/drive/retry.js +37 -0
  91. package/dist/harness/runtime/drive/retry.js.map +1 -0
  92. package/dist/harness/runtime/drive/structural.d.ts +32 -0
  93. package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
  94. package/dist/harness/runtime/drive/structural.js +929 -0
  95. package/dist/harness/runtime/drive/structural.js.map +1 -0
  96. package/dist/harness/runtime/drive/terminal.d.ts +7 -0
  97. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
  98. package/dist/harness/runtime/drive/terminal.js +49 -0
  99. package/dist/harness/runtime/drive/terminal.js.map +1 -0
  100. package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
  101. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
  102. package/dist/harness/runtime/drive/tool-placement.js +244 -0
  103. package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
  104. package/dist/harness/runtime/drive/tools.d.ts +6 -0
  105. package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
  106. package/dist/harness/runtime/drive/tools.js +449 -0
  107. package/dist/harness/runtime/drive/tools.js.map +1 -0
  108. package/dist/harness/runtime/drive.d.ts +6 -0
  109. package/dist/harness/runtime/drive.d.ts.map +1 -0
  110. package/dist/harness/runtime/drive.js +93 -0
  111. package/dist/harness/runtime/drive.js.map +1 -0
  112. package/dist/harness/runtime/harness.d.ts +59 -0
  113. package/dist/harness/runtime/harness.d.ts.map +1 -0
  114. package/dist/harness/runtime/harness.js +311 -0
  115. package/dist/harness/runtime/harness.js.map +1 -0
  116. package/dist/harness/runtime/index.d.ts +2 -0
  117. package/dist/harness/runtime/index.d.ts.map +1 -0
  118. package/dist/harness/runtime/index.js +2 -0
  119. package/dist/harness/runtime/index.js.map +1 -0
  120. package/dist/harness/runtime/lane.d.ts +101 -0
  121. package/dist/harness/runtime/lane.d.ts.map +1 -0
  122. package/dist/harness/runtime/lane.js +1575 -0
  123. package/dist/harness/runtime/lane.js.map +1 -0
  124. package/dist/harness/runtime/progress.d.ts +15 -0
  125. package/dist/harness/runtime/progress.d.ts.map +1 -0
  126. package/dist/harness/runtime/progress.js +66 -0
  127. package/dist/harness/runtime/progress.js.map +1 -0
  128. package/dist/harness/runtime/reducer.d.ts +5 -0
  129. package/dist/harness/runtime/reducer.d.ts.map +1 -0
  130. package/dist/harness/runtime/reducer.js +240 -0
  131. package/dist/harness/runtime/reducer.js.map +1 -0
  132. package/dist/harness/runtime/restore.d.ts +24 -0
  133. package/dist/harness/runtime/restore.d.ts.map +1 -0
  134. package/dist/harness/runtime/restore.js +117 -0
  135. package/dist/harness/runtime/restore.js.map +1 -0
  136. package/dist/harness/runtime/transcript.d.ts +21 -0
  137. package/dist/harness/runtime/transcript.d.ts.map +1 -0
  138. package/dist/harness/runtime/transcript.js +72 -0
  139. package/dist/harness/runtime/transcript.js.map +1 -0
  140. package/dist/harness/runtime/types.d.ts +105 -0
  141. package/dist/harness/runtime/types.d.ts.map +1 -0
  142. package/dist/harness/runtime/types.js +61 -0
  143. package/dist/harness/runtime/types.js.map +1 -0
  144. package/dist/harness/session/commit.d.ts +53 -0
  145. package/dist/harness/session/commit.d.ts.map +1 -0
  146. package/dist/harness/session/commit.js +57 -0
  147. package/dist/harness/session/commit.js.map +1 -0
  148. package/dist/harness/session/context.d.ts +6 -18
  149. package/dist/harness/session/context.d.ts.map +1 -1
  150. package/dist/harness/session/context.js +31 -49
  151. package/dist/harness/session/context.js.map +1 -1
  152. package/dist/harness/session/fork-policy.d.ts +13 -0
  153. package/dist/harness/session/fork-policy.d.ts.map +1 -0
  154. package/dist/harness/session/fork-policy.js +22 -0
  155. package/dist/harness/session/fork-policy.js.map +1 -0
  156. package/dist/harness/session/fork.d.ts +18 -0
  157. package/dist/harness/session/fork.d.ts.map +1 -0
  158. package/dist/harness/session/fork.js +127 -0
  159. package/dist/harness/session/fork.js.map +1 -0
  160. package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
  161. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
  162. package/dist/harness/session/in-memory-storage-state.js +216 -0
  163. package/dist/harness/session/in-memory-storage-state.js.map +1 -0
  164. package/dist/harness/session/index.d.ts +9 -5
  165. package/dist/harness/session/index.d.ts.map +1 -1
  166. package/dist/harness/session/index.js +7 -4
  167. package/dist/harness/session/index.js.map +1 -1
  168. package/dist/harness/session/jsonl/codec.d.ts +19 -8
  169. package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
  170. package/dist/harness/session/jsonl/codec.js +34 -218
  171. package/dist/harness/session/jsonl/codec.js.map +1 -1
  172. package/dist/harness/session/jsonl/index.d.ts +4 -0
  173. package/dist/harness/session/jsonl/index.d.ts.map +1 -0
  174. package/dist/harness/session/jsonl/index.js +4 -0
  175. package/dist/harness/session/jsonl/index.js.map +1 -0
  176. package/dist/harness/session/jsonl/legacy-v3.d.ts +18 -0
  177. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
  178. package/dist/harness/session/jsonl/legacy-v3.js +383 -0
  179. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
  180. package/dist/harness/session/jsonl/repo.d.ts +26 -19
  181. package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  182. package/dist/harness/session/jsonl/repo.js +266 -156
  183. package/dist/harness/session/jsonl/repo.js.map +1 -1
  184. package/dist/harness/session/jsonl/storage.d.ts +39 -41
  185. package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  186. package/dist/harness/session/jsonl/storage.js +238 -181
  187. package/dist/harness/session/jsonl/storage.js.map +1 -1
  188. package/dist/harness/session/jsonl/types.d.ts +23 -22
  189. package/dist/harness/session/jsonl/types.d.ts.map +1 -1
  190. package/dist/harness/session/jsonl/types.js +2 -1
  191. package/dist/harness/session/jsonl/types.js.map +1 -1
  192. package/dist/harness/session/memory.d.ts +46 -40
  193. package/dist/harness/session/memory.d.ts.map +1 -1
  194. package/dist/harness/session/memory.js +346 -113
  195. package/dist/harness/session/memory.js.map +1 -1
  196. package/dist/harness/session/mutation-line.d.ts +8 -0
  197. package/dist/harness/session/mutation-line.d.ts.map +1 -0
  198. package/dist/harness/session/mutation-line.js +21 -0
  199. package/dist/harness/session/mutation-line.js.map +1 -0
  200. package/dist/harness/session/session.d.ts +78 -46
  201. package/dist/harness/session/session.d.ts.map +1 -1
  202. package/dist/harness/session/session.js +343 -209
  203. package/dist/harness/session/session.js.map +1 -1
  204. package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
  205. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
  206. package/dist/harness/session/testing/benchmark/datasets.js +24 -0
  207. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
  208. package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
  209. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
  210. package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
  211. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
  212. package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
  213. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
  214. package/dist/harness/session/testing/benchmark/storage.js +114 -0
  215. package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
  216. package/dist/harness/session/testing/conformance/session-repo.d.ts +21 -0
  217. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
  218. package/dist/harness/session/testing/conformance/session-repo.js +590 -0
  219. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
  220. package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
  221. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
  222. package/dist/harness/session/testing/conformance/storage.js +600 -0
  223. package/dist/harness/session/testing/conformance/storage.js.map +1 -0
  224. package/dist/harness/session/testing/gating-storage.d.ts +26 -0
  225. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
  226. package/dist/harness/session/testing/gating-storage.js +100 -0
  227. package/dist/harness/session/testing/gating-storage.js.map +1 -0
  228. package/dist/harness/session/testing/index.d.ts +9 -2
  229. package/dist/harness/session/testing/index.d.ts.map +1 -1
  230. package/dist/harness/session/testing/index.js +8 -1
  231. package/dist/harness/session/testing/index.js.map +1 -1
  232. package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
  233. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
  234. package/dist/harness/session/testing/instrumented-storage.js +16 -0
  235. package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
  236. package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
  237. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
  238. package/dist/harness/session/testing/storage-decorator.js +41 -0
  239. package/dist/harness/session/testing/storage-decorator.js.map +1 -0
  240. package/dist/harness/session/testing/types.d.ts +5 -7
  241. package/dist/harness/session/testing/types.d.ts.map +1 -1
  242. package/dist/harness/session/testing/types.js.map +1 -1
  243. package/dist/harness/session/types.d.ts +424 -259
  244. package/dist/harness/session/types.d.ts.map +1 -1
  245. package/dist/harness/session/types.js +7 -8
  246. package/dist/harness/session/types.js.map +1 -1
  247. package/dist/harness/session/values.d.ts +95 -0
  248. package/dist/harness/session/values.d.ts.map +1 -0
  249. package/dist/harness/session/values.js +81 -0
  250. package/dist/harness/session/values.js.map +1 -0
  251. package/dist/harness/skills.d.ts +3 -2
  252. package/dist/harness/skills.d.ts.map +1 -1
  253. package/dist/harness/skills.js +29 -26
  254. package/dist/harness/skills.js.map +1 -1
  255. package/dist/harness/telemetry.d.ts +64 -43
  256. package/dist/harness/telemetry.d.ts.map +1 -1
  257. package/dist/harness/telemetry.js +45 -26
  258. package/dist/harness/telemetry.js.map +1 -1
  259. package/dist/harness/tools/bash.d.ts +4 -4
  260. package/dist/harness/tools/bash.d.ts.map +1 -1
  261. package/dist/harness/tools/bash.js +66 -93
  262. package/dist/harness/tools/bash.js.map +1 -1
  263. package/dist/harness/tools/edit.d.ts.map +1 -1
  264. package/dist/harness/tools/edit.js +10 -10
  265. package/dist/harness/tools/edit.js.map +1 -1
  266. package/dist/harness/tools/file-mutation-queue.d.ts +2 -1
  267. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  268. package/dist/harness/tools/file-mutation-queue.js +5 -5
  269. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  270. package/dist/harness/tools/path-utils.d.ts +3 -2
  271. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  272. package/dist/harness/tools/path-utils.js +5 -5
  273. package/dist/harness/tools/path-utils.js.map +1 -1
  274. package/dist/harness/tools/read.d.ts +2 -1
  275. package/dist/harness/tools/read.d.ts.map +1 -1
  276. package/dist/harness/tools/read.js +4 -6
  277. package/dist/harness/tools/read.js.map +1 -1
  278. package/dist/harness/tools/write.d.ts.map +1 -1
  279. package/dist/harness/tools/write.js +7 -7
  280. package/dist/harness/tools/write.js.map +1 -1
  281. package/dist/harness/types.d.ts +108 -45
  282. package/dist/harness/types.d.ts.map +1 -1
  283. package/dist/harness/types.js.map +1 -1
  284. package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
  285. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
  286. package/dist/harness/utils/adaptive-publisher.js +79 -0
  287. package/dist/harness/utils/adaptive-publisher.js.map +1 -0
  288. package/dist/harness/utils/output-capture.d.ts +31 -0
  289. package/dist/harness/utils/output-capture.d.ts.map +1 -0
  290. package/dist/harness/utils/output-capture.js +217 -0
  291. package/dist/harness/utils/output-capture.js.map +1 -0
  292. package/dist/harness/utils/shell-output.d.ts +12 -5
  293. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  294. package/dist/harness/utils/shell-output.js +64 -174
  295. package/dist/harness/utils/shell-output.js.map +1 -1
  296. package/dist/harness/utils/truncate.d.ts +1 -0
  297. package/dist/harness/utils/truncate.d.ts.map +1 -1
  298. package/dist/harness/utils/truncate.js +1 -1
  299. package/dist/harness/utils/truncate.js.map +1 -1
  300. package/dist/harness/utils/usage.d.ts +4 -0
  301. package/dist/harness/utils/usage.d.ts.map +1 -0
  302. package/dist/harness/utils/usage.js +33 -0
  303. package/dist/harness/utils/usage.js.map +1 -0
  304. package/dist/index.d.ts +4 -1
  305. package/dist/index.d.ts.map +1 -1
  306. package/dist/index.js +3 -6
  307. package/dist/index.js.map +1 -1
  308. package/dist/proxy.d.ts +2 -0
  309. package/dist/proxy.d.ts.map +1 -1
  310. package/dist/proxy.js +40 -10
  311. package/dist/proxy.js.map +1 -1
  312. package/dist/search/index.d.ts +24 -16
  313. package/dist/search/index.d.ts.map +1 -1
  314. package/dist/search/index.js +1 -1
  315. package/dist/search/index.js.map +1 -1
  316. package/dist/types.d.ts +5 -2
  317. package/dist/types.d.ts.map +1 -1
  318. package/dist/types.js.map +1 -1
  319. package/package.json +25 -4
  320. package/dist/harness/reducer.d.ts +0 -100
  321. package/dist/harness/reducer.d.ts.map +0 -1
  322. package/dist/harness/reducer.js +0 -415
  323. package/dist/harness/reducer.js.map +0 -1
  324. package/dist/harness/session/jsonl/errors.d.ts +0 -9
  325. package/dist/harness/session/jsonl/errors.d.ts.map +0 -1
  326. package/dist/harness/session/jsonl/errors.js +0 -19
  327. package/dist/harness/session/jsonl/errors.js.map +0 -1
  328. package/dist/harness/session/jsonl.d.ts +0 -3
  329. package/dist/harness/session/jsonl.d.ts.map +0 -1
  330. package/dist/harness/session/jsonl.js +0 -2
  331. package/dist/harness/session/jsonl.js.map +0 -1
  332. package/dist/harness/session/state.d.ts +0 -65
  333. package/dist/harness/session/state.d.ts.map +0 -1
  334. package/dist/harness/session/state.js +0 -319
  335. package/dist/harness/session/state.js.map +0 -1
  336. package/dist/harness/session/testing/conformance.d.ts +0 -4
  337. package/dist/harness/session/testing/conformance.d.ts.map +0 -1
  338. package/dist/harness/session/testing/conformance.js +0 -762
  339. package/dist/harness/session/testing/conformance.js.map +0 -1
  340. package/dist/search/scanning.d.ts +0 -29
  341. package/dist/search/scanning.d.ts.map +0 -1
  342. package/dist/search/scanning.js +0 -103
  343. package/dist/search/scanning.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../../src/harness/session/testing/conformance/storage.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAa3D,OAAO,EACN,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,UAAU,EACV,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,KAAK,GACL,MAAM,iBAAiB,CAAC;AAGzB,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAC5C,MAAM,QAAQ,GAAG,KAAK,CAAS,mBAAmB,CAAC,CAAC;AACpD,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAY,YAAY,EAAE,GAAG,CAAC,CAAC;AACvE,MAAM,eAAe,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC,KAAK,CAAY,YAAY,EAAE,MAAM,CAAC,CAAC;AAChF,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAY,WAAW,EAAE,GAAG,CAAC,CAAC;AAIpE,SAAS,UAAU,CAClB,OAAsC,EACtC,KAAa,EACb,IAAY,EACZ,IAAqB,EACH;IAClB,OAAO;QACN,KAAK;QACL,IAAI;QACJ,KAAK,CAAC,GAAG,GAAG;;;gBACX,MAAY,OAAO,kCAAG,MAAM,OAAO,EAAE,OAAA,CAAC;gBACtC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;;;;;;;;;;;QAAA,CACpB;KACD,CAAC;AAAA,CACF;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,MAAc,EAAE,OAAO,GAAkD,EAAE,EAAS;IACjH,OAAO;QACN,KAAK;QACL,MAAM;QACN,SAAS,EAAE,KAAK,GAAG,CAAC;QACpB,UAAU,EAAE,MAAM,GAAG,CAAC;QACtB,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;QACrF,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;QAC5E,WAAW,EAAE,KAAK,GAAG,MAAM;QAC3B,IAAI,EAAE;YACL,KAAK,EAAE,KAAK,GAAG,GAAG;YAClB,MAAM,EAAE,MAAM,GAAG,GAAG;YACpB,SAAS,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG;YAC5B,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG;YAC9B,KAAK,EAAE,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG;SACjC;KACD,CAAC;AAAA,CACF;AAED,SAAS,SAAS,GAAU;IAC3B,OAAO;QACN,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KACpE,CAAC;AAAA,CACF;AAED,SAAS,SAAS,CAAC,EAAU,EAAE,QAAQ,GAAkB,IAAI,EAAE,IAAI,GAAG,EAAE,EAA0B;IACjG,OAAO;QACN,EAAE;QACF,QAAQ;QACR,IAAI,EAAE,SAAS;QACf,OAAO,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACjC,SAAS,EAAE,iBAAiB;SAC5B;KACD,CAAC;AAAA,CACF;AAED,SAAS,WAAW,CACnB,EAAU,EACV,QAAuB,EACvB,UAAU,GAAG,MAAM,EACnB,IAAI,GAAwB,EAAE,EAAE,EAAE,EACV;IACxB,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAAA,CAC1D;AAED,SAAS,eAAe,CAAC,EAAU,EAAE,QAAuB,EAA6B;IACxF,OAAO;QACN,EAAE;QACF,QAAQ;QACR,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,WAAW,EAAE,EAAE;QACxB,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE;QAChB,QAAQ,EAAE,KAAK;KACf,CAAC;AAAA,CACF;AAED,iHAAiH;AACjH,SAAS,GAAG,CAAC,OAA4C,EAAY;IACpE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAAA,CACxC;AAED,SAAS,wBAAwB,CAAC,MAAyB,EAAQ;IAClE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACpD,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAClG,CAAC;AAAA,CACD;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAgB,EAAE,MAAoB,EAAiB;IACvF,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAAA,CAC1E;AAED,gFAAgF;AAChF,MAAM,UAAU,wBAAwB,CAAC,OAAsC,EAA8B;IAC5G,OAAO;QACN,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,gDAAgD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC5G,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC;gBACC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;gBAC7B,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;aACrF,EACD,kBAAkB,CAClB,CAAC;YAEF,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACzC,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;YACpE,eAAe,CACd,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,EACvD,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CACjG,CAAC;YACF,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAAE;gBACrE,OAAO,EAAE,QAAQ;gBACjB,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;aACnB,CAAC,CAAC;YACH,eAAe,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,EAAE;gBAC9E,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;aAC7F,CAAC,CAAC;QAAA,CACH,CAAC;QAEF,UAAU,CACT,OAAO,EACP,cAAc,EACd,uDAAuD,EACvD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,OAAO,CAAC,MAAM,CACnB,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,EACrG,kBAAkB,CAClB,CAAC;YACF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAClF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAE/D,MAAM,OAAO,CACZ,OAAO,CAAC,MAAM,CACb;gBACC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;gBAC/B,WAAW,CAAC,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;gBACnD,WAAW,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBAC5E,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;aACzC,EACD,kBAAkB,CAClB,CACD,CAAC;YAEF,eAAe,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,EAAE,aAAa,CAAC,CAAC;YAChG,eAAe,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,EAAE,WAAW,CAAC,CAAC;YAC5F,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC,CAAC;YACzE,WAAW,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAAE,SAAS,CAAC,CAAC;QAAA,CAC7E,CACD;QAED,UAAU,CACT,OAAO,EACP,cAAc,EACd,mEAAmE,EACnE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,OAAO,CAAC,MAAM,CACnB;gBACC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;gBAC9C,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC9C,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;aAC/B,EACD,kBAAkB,CAClB,CAAC;YACF,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAC/F,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAEvF,MAAM,OAAO,CACZ,OAAO,CAAC,MAAM,CACb;gBACC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC;gBAC/C,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACjC,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAC9C,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;aACvC,EACD,kBAAkB,CAClB,CACD,CAAC;YAEF,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,EAAE,iBAAiB,CAAC,CAAC;YACzG,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC,EAAE,aAAa,CAAC,CAAC;YACjG,WAAW,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;QAAA,CACnG,CACD;QAED,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,kDAAkD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC9G,MAAM,OAAO,CAAC,MAAM,CACnB;gBACC,WAAW,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;gBACxC,WAAW,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;aAC5E,EACD,kBAAkB,CAClB,CAAC;YAEF,MAAM,OAAO,CACZ,OAAO,CAAC,MAAM,CACb,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,EAC9E,kBAAkB,CAClB,CACD,CAAC;YACF,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;YAEtG,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI;gBAC1B;oBACC,kBAAkB;oBAClB;wBACC,WAAW,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;wBAClD,WAAW,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;qBAC9E;iBACD;gBACD;oBACC,kBAAkB;oBAClB;wBACC,WAAW,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;wBAC9E,WAAW,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;qBAClD;iBACD;aACkC,EAAE,CAAC;gBACtC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAC;YACpG,CAAC;YAED,eAAe,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC1G,eAAe,CACd,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EACpF,CAAC,gBAAgB,CAAC,CAClB,CAAC;QAAA,CACF,CAAC;QAEF,UAAU,CACT,OAAO,EACP,cAAc,EACd,6DAA6D,EAC7D,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAC3E,MAAM,OAAO,CAAC,MAAM,CACnB,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EAC5F,kBAAkB,CAClB,CAAC;YACF,eAAe,CACd,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,kBAAkB,CAAC,CAAC,EAChG,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAC/B,CAAC;YAEF,MAAM,OAAO,CACZ,OAAO,CAAC,MAAM,CACb;gBACC,WAAW,CAAC,WAAW,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;gBACzD,WAAW,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBAChD,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC;aAClD,EACD,kBAAkB,CAClB,CACD,CAAC;YACF,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;YACnG,MAAM,OAAO,CAAC,MAAM,CACnB,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,EACnF,kBAAkB,CAClB,CAAC;YACF,MAAM,OAAO,CACZ,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CACpG,CAAC;YAEF,eAAe,CACd,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,kBAAkB,CAAC,EACxG,IAAI,GAAG,EAAE,CACT,CAAC;YACF,WAAW,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,kBAAkB,CAAC,EAAE,SAAS,CAAC,CAAC;QAAA,CAChG,CACD;QAED,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,oDAAoD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAChH,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YACpD,MAAM,OAAO,CAAC,MAAM,CACnB;gBACC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC7E,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;aACjC,EACD,kBAAkB,CAClB,CAAC;YAEF,WAAW,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7F,eAAe,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE;gBAC5F,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,WAAW,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAE1F,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,MAAM,CACrC,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAChG,kBAAkB,CAClB,CAAC;YAEF,eAAe,CACd,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,EACxD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAC3F,CAAC;YACF,WAAW,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC,EAAE,SAAS,CAAC,CAAC;YAC3F,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,EAAE;gBAC9E,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC;gBAC1B,KAAK,EAAE,KAAK,CAAC,EAAE;gBACf,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;aACtB,CAAC,CAAC;QAAA,CACH,CAAC;QAEF,UAAU,CACT,OAAO,EACP,QAAQ,EACR,kEAAkE,EAClE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CACjC;gBACC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAClC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAClC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC/B,QAAQ,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;gBACvC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAC1C,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;aACrC,EACD,kBAAkB,CAClB,CAAC;YACF,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC,EAAE;gBAClF,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC;gBAC9B,KAAK,EAAE,IAAI;gBACX,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;aAClB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC;gBACC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAClC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAChC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC;aAC5C,EACD,kBAAkB,CAClB,CAAC;YAEF,eAAe,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC,EAAE;gBACzF,EAAE,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAC3E,EAAE,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAChE,EAAE,OAAO,EAAE,SAAS,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBACrE,EAAE,OAAO,EAAE,SAAS,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;aACxE,CAAC,CAAC;YACH,WAAW,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,EAAE,SAAS,CAAC,CAAC;QAAA,CACxF,CACD;QAED,UAAU,CACT,OAAO,EACP,QAAQ,EACR,mEAAmE,EACnE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC;YACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC;gBACC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;gBACnC,WAAW,CAAC,YAAY,CAAC;gBACzB,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;gBAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAC3B,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC;gBACjC,UAAU,CAAC,QAAQ,CAAC;gBACpB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC5B,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC;gBACpC,UAAU,CAAC,WAAW,CAAC;aACvB,EACD,kBAAkB,CAClB,CAAC;YAEF,WAAW,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC,EAAE,SAAS,CAAC,CAAC;YACjF,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE;gBACtE,OAAO,EAAE,SAAS;gBAClB,KAAK,EAAE,MAAM;gBACb,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;aACnB,CAAC,CAAC;YACH,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE;gBAChF,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;aACtC,CAAC,CAAC;YACH,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC;QAAA,CACxF,CACD;QAED,UAAU,CACT,OAAO,EACP,QAAQ,EACR,6DAA6D,EAC7D,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,OAAO,CAAC,MAAM,CACnB;gBACC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC9B,WAAW,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;aAC9E,EACD,kBAAkB,CAClB,CAAC;YACF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;YAClF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAE/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAC3D,kBAAkB,CAClB,CAAC;YAEF,eAAe,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,EAAE,aAAa,CAAC,CAAC;YAChG,eAAe,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,EAAE,WAAW,CAAC,CAAC;YAC5F,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC,CAAC;YACzE,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC,EAAE;gBACrE,OAAO,EAAE,QAAQ;gBACjB,KAAK,EAAE,QAAQ;gBACf,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;aACnB,CAAC,CAAC;QAAA,CACH,CACD;QAED,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,0DAA0D,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC/G,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACnC,WAAW,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EACzG,kBAAkB,CAClB,CAAC;YACF,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE;gBAC/E,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;aACnC,CAAC,CAAC;YACH,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE;gBAClF,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;aACnC,CAAC,CAAC;YACH,eAAe,CACd,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,EACnG;gBACC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;aACnC,CACD,CAAC;YACF,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,EAAE;gBACjG,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;aACnC,CAAC,CAAC;YACH,eAAe,CACd,MAAM,OAAO,CAAC,QAAQ,CACrB,OAAO,EACP,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAC7D,kBAAkB,CAClB,EACD;gBACC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;aACnC,CACD,CAAC;YACF,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;YAC3E,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;YAE1F,MAAM,OAAO,CAAC,MAAM,CACnB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EACjF,kBAAkB,CAClB,CAAC;YACF,eAAe,CACd,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAC1F,CAAC,KAAK,CAAC,CACP,CAAC;QAAA,CACF,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,mDAAmD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACxG,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,OAAO,CAAC,MAAM,CACnB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EACxE,kBAAkB,CAClB,CAAC;YACF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;YACjF,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACrC,WAAW,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrG,WAAW,CACV,CACC,MAAM,OAAO,CAAC,QAAQ,CACrB,OAAO,EACP;gBACC,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,EAAE;aACtC,EACD,kBAAkB,CAClB,CACD,CAAC,MAAM,EACR,KAAK,CACL,CAAC;QAAA,CACF,CAAC;QAEF,UAAU,CACT,OAAO,EACP,OAAO,EACP,wEAAwE,EACxE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,MAAM,CACrC;gBACC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC/B,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;gBAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC1B,WAAW,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;aACzE,EACD,kBAAkB,CAClB,CAAC;YACF,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE;gBAC/E,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;aACzC,CAAC,CAAC;YAEH,MAAM,OAAO,CACZ,OAAO,CAAC,MAAM,CACb,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAC1F,kBAAkB,CAClB,CACD,CAAC;YACF,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE;gBAC/E,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;aACzC,CAAC,CAAC;YACH,WAAW,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAAA,CACnF,CACD;QAED,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,6CAA6C,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC1G,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC;gBACC,WAAW,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;gBACzF,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;aACjF,EACD,kBAAkB,CAClB,CAAC;YAEF,eAAe,CACd,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,WAAW,CAAC,EAAE,kBAAkB,CAAC,EAC3E,IAAI,GAAG,CAAC;gBACP;oBACC,cAAc;oBACd;wBACC,EAAE,EAAE,cAAc;wBAClB,QAAQ,EAAE,IAAI;wBACd,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,QAAQ;wBACpB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;wBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;qBAC3B;iBACD;gBACD;oBACC,WAAW;oBACX;wBACC,GAAG,WAAW,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;wBACvE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;wBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;qBAC3B;iBACD;aACD,CAAC,CACF,CAAC;QAAA,CACF,CAAC;QAEF,UAAU,CACT,OAAO,EACP,eAAe,EACf,wEAAwE,EACxE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC;gBACC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC9B,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAClD,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACpD,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACnD,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;aACxC,EACD,kBAAkB,CAClB,CAAC;YAEF,eAAe,CACd,GAAG,CACF,MAAM,OAAO,CAAC,WAAW,CACxB;gBACC,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,MAAM;gBAClB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrB,KAAK,EAAE,MAAM;aACb,EACD,kBAAkB,CAClB,CACD,EACD,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACpB,CAAC;YACF,eAAe,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC,EAAE;gBAC/F,MAAM;gBACN,QAAQ;aACR,CAAC,CAAC;YACH,eAAe,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC,EAAE;gBAChG,MAAM;gBACN,QAAQ;aACR,CAAC,CAAC;QAAA,CACH,CACD;QAED,UAAU,CACT,OAAO,EACP,gBAAgB,EAChB,wDAAwD,EACxD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC;gBACC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC9B,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACpD,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC1C,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACjD,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBACnD,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aACtC,EACD,kBAAkB,CAClB,CAAC;YAEF,eAAe,CACd,GAAG,CACF,MAAM,OAAO,CAAC,UAAU,CACvB,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,EAC5D,kBAAkB,CAClB,CACD,EACD,CAAC,MAAM,CAAC,CACR,CAAC;YACF,eAAe,CACd,GAAG,CACF,MAAM,OAAO,CAAC,UAAU,CACvB;gBACC,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,QAAQ;aACd,EACD,kBAAkB,CAClB,CACD,EACD,CAAC,QAAQ,CAAC,CACV,CAAC;YACF,eAAe,CACd,GAAG,CACF,MAAM,OAAO,CAAC,UAAU,CACvB;gBACC,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,aAAa;gBACpB,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAC/B,KAAK,EAAE,CAAC;aACR,EACD,kBAAkB,CAClB,CACD,EACD,CAAC,SAAS,EAAE,QAAQ,CAAC,CACrB,CAAC;YACF,eAAe,CACd,GAAG,CACF,MAAM,OAAO,CAAC,UAAU,CACvB;gBACC,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,aAAa;gBACpB,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAC/B,KAAK,EAAE,CAAC;aACR,EACD,kBAAkB,CAClB,CACD,EACD,CAAC,QAAQ,EAAE,SAAS,CAAC,CACrB,CAAC;YACF,eAAe,CACd,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,kBAAkB,CAAC,CAAC,EACtG,EAAE,CACF,CAAC;YACF,eAAe,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,EAAE;gBACzG,MAAM;aACN,CAAC,CAAC;YACH,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAAA,CAC5E,CACD;QAED,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,iDAAiD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAC/G,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACnF,kBAAkB,CAClB,CAAC;YAEF,eAAe,CACd,MAAM,OAAO,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,kBAAkB,CAAC,EAC/F;gBACC;oBACC,EAAE,EAAE,MAAM;oBACV,QAAQ,EAAE,IAAI;oBACd,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,IAAI,EAAE,SAAS;iBACf;gBACD;oBACC,EAAE,EAAE,OAAO;oBACX,QAAQ,EAAE,MAAM;oBAChB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,MAAM;iBAClB;aACD,CACD,CAAC;QAAA,CACF,CAAC;QAEF,UAAU,CACT,OAAO,EACP,gBAAgB,EAChB,mDAAmD,EACnD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC;gBACC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC9B,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACpD,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC1C,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACjD,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBACnD,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aACtC,EACD,kBAAkB,CAClB,CAAC;YAEF,eAAe,CACd,GAAG,CACF,MAAM,OAAO,CAAC,mBAAmB,CAChC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,EAC5D,kBAAkB,CAClB,CACD,EACD,CAAC,MAAM,CAAC,CACR,CAAC;YACF,eAAe,CACd,GAAG,CACF,MAAM,OAAO,CAAC,mBAAmB,CAChC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAClF,kBAAkB,CAClB,CACD,EACD,CAAC,QAAQ,EAAE,SAAS,CAAC,CACrB,CAAC;YACF,MAAM,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAAA,CACrF,CACD;QAED,UAAU,CACT,OAAO,EACP,iBAAiB,EACjB,iEAAiE,EACjE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC;gBACC,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;gBACrE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;gBAClC,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;gBACrE,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aACpE,EACD,kBAAkB,CAClB,CAAC;YAEF,eAAe,CACd,CACC,MAAM,OAAO,CAAC,SAAS,CACtB,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAChE,kBAAkB,CAClB,CACD,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EACtB,CAAC,SAAS,CAAC,CACX,CAAC;YACF,eAAe,CACd,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAC/F,CAAC,SAAS,EAAE,SAAS,CAAC,CACtB,CAAC;YACF,eAAe,CACd,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAC9F,CAAC,SAAS,EAAE,SAAS,CAAC,CACtB,CAAC;QAAA,CACF,CACD;QAED,UAAU,CACT,OAAO,EACP,iBAAiB,EACjB,sDAAsD,EACtD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,eAAe,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAErG,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CACjC;gBACC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBACjC,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;aACpE,EACD,kBAAkB,CAClB,CAAC;YACF,MAAM,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACxC,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;YAErE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAClC;gBACC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAC7C,WAAW,CAAC,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;gBACpD,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aACpE,EACD,kBAAkB,CAClB,CAAC;YACF,MAAM,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACzC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC7B,YAAY,EAAE,CAAC;gBACf,KAAK,EAAE;oBACN,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,EAAE;oBACV,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,EAAE;oBACd,YAAY,EAAE,EAAE;oBAChB,SAAS,EAAE,CAAC;oBACZ,WAAW,EAAE,EAAE;oBACf,IAAI,EAAE;wBACL,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK;wBACrD,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM;wBACxD,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS;wBACjE,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU;wBACpE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK;qBACrD;iBACD;aACD,CAAC,CAAC;QAAA,CACH,CACD;QAED,UAAU,CACT,OAAO,EACP,eAAe,EACf,oDAAoD,EACpD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;YACpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAC/F,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YAEvE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;YACjD,eAAe,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAC5E,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAC7E,MAAM,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC/C,eAAe,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAAA,CAC3G,CACD;QAED,UAAU,CACT,OAAO,EACP,WAAW,EACX,mEAAmE,EACnE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAC1F,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACrD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAEtD,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACpD,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;YACtD,WAAW,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;YAE7C,MAAM,aAAa,GAAG;gBACrB,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,kBAAkB,CAAC;gBAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;gBAC9C,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,kBAAkB,CAAC;gBAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,kBAAkB,CAAC;gBACnE,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,kBAAkB,CAAC;gBAC7D,OAAO,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,kBAAkB,CAAC;gBACtE,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC;gBACzD,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC;gBACvD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;aACpC,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,aAAa;gBAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAAA,CACtD,CACD;KACD,CAAC;AAAA,CACF","sourcesContent":["import { deepStrictEqual, ok, rejects, strictEqual } from \"node:assert/strict\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport { BACKGROUND_CONTEXT } from \"../../../context.ts\";\nimport { insertEntry, insertUsage } from \"../../commit.ts\";\nimport type {\n\tCommitResult,\n\tCompactionEntry,\n\tCustomEntry,\n\tEntry,\n\tEntryStructure,\n\tJsonValue,\n\tMessageEntry,\n\tNewEntry,\n\tStorage,\n\tWrite,\n} from \"../../types.ts\";\nimport {\n\tappendList,\n\tbranchTip,\n\tdeleteList,\n\tdeleteValue,\n\tentryLabel,\n\tlist,\n\tpendingEntry,\n\tsetValue,\n\tvalue,\n} from \"../../values.ts\";\nimport type { ConformanceCase, StorageFixture } from \"../types.ts\";\n\nconst MESSAGE_TIMESTAMP = 1_650_000_000_000;\nconst testName = value<string>(\"test.session.name\");\nconst testValue = (key: string) => value<JsonValue>(\"test.value\", key);\nconst testValuePrefix = (prefix = \"\") => value<JsonValue>(\"test.value\", prefix);\nconst testList = (key: string) => list<JsonValue>(\"test.list\", key);\n\ntype ConformanceTest = (fixture: StorageFixture) => Promise<void>;\n\nfunction createCase(\n\tfactory: () => Promise<StorageFixture>,\n\tgroup: string,\n\tname: string,\n\ttest: ConformanceTest,\n): ConformanceCase {\n\treturn {\n\t\tgroup,\n\t\tname,\n\t\tasync run() {\n\t\t\tawait using fixture = await factory();\n\t\t\tawait test(fixture);\n\t\t},\n\t};\n}\n\nfunction usage(input: number, output: number, options: { cacheWrite1h?: number; reasoning?: number } = {}): Usage {\n\treturn {\n\t\tinput,\n\t\toutput,\n\t\tcacheRead: input + 1,\n\t\tcacheWrite: output + 1,\n\t\t...(options.cacheWrite1h === undefined ? {} : { cacheWrite1h: options.cacheWrite1h }),\n\t\t...(options.reasoning === undefined ? {} : { reasoning: options.reasoning }),\n\t\ttotalTokens: input + output,\n\t\tcost: {\n\t\t\tinput: input / 100,\n\t\t\toutput: output / 100,\n\t\t\tcacheRead: (input + 1) / 100,\n\t\t\tcacheWrite: (output + 1) / 100,\n\t\t\ttotal: (input + output + 2) / 100,\n\t\t},\n\t};\n}\n\nfunction zeroUsage(): Usage {\n\treturn {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n}\n\nfunction userEntry(id: string, parentId: string | null = null, text = id): NewEntry<MessageEntry> {\n\treturn {\n\t\tid,\n\t\tparentId,\n\t\ttype: \"message\",\n\t\tmessage: {\n\t\t\trole: \"user\",\n\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\ttimestamp: MESSAGE_TIMESTAMP,\n\t\t},\n\t};\n}\n\nfunction customEntry(\n\tid: string,\n\tparentId: string | null,\n\tcustomType = \"note\",\n\tdata: CustomEntry[\"data\"] = { id },\n): NewEntry<CustomEntry> {\n\treturn { id, parentId, type: \"custom\", customType, data };\n}\n\nfunction compactionEntry(id: string, parentId: string | null): NewEntry<CompactionEntry> {\n\treturn {\n\t\tid,\n\t\tparentId,\n\t\ttype: \"compaction\",\n\t\tsummary: `summary:${id}`,\n\t\tretainedTail: [],\n\t\ttokensBefore: 10,\n\t\tfromHook: false,\n\t};\n}\n\n// EntryStructure is included for scanBranchStructure conformance, especially SQLite's payload-free branch scans.\nfunction ids(entries: readonly (Entry | EntryStructure)[]): string[] {\n\treturn entries.map((entry) => entry.id);\n}\n\nfunction assertStrictlyIncreasing(values: readonly number[]): void {\n\tfor (let index = 1; index < values.length; index++) {\n\t\tok(values[index - 1] < values[index], `Expected ${values.join(\", \")} to be strictly increasing`);\n\t}\n}\n\nasync function assertCommitStats(storage: Storage, result: CommitResult): Promise<void> {\n\tdeepStrictEqual(result.stats, await storage.getStats(BACKGROUND_CONTEXT));\n}\n\n/** Creates fresh, runner-independent cases for the durable Storage contract. */\nexport function createStorageConformance(factory: () => Promise<StorageFixture>): readonly ConformanceCase[] {\n\treturn [\n\t\tcreateCase(factory, \"transactions\", \"commits mixed writes atomically in write order\", async ({ storage }) => {\n\t\t\tconst result = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\tinsertEntry(userEntry(\"entry\")),\n\t\t\t\t\tsetValue(testName, \"session\"),\n\t\t\t\t\tinsertUsage({ id: \"usage\", usage: usage(2, 3), adjustment: false, entryId: \"entry\" }),\n\t\t\t\t],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\n\t\t\tstrictEqual(result.seqs.length, 3);\n\t\t\tstrictEqual(result.firstSeq, result.seqs[0]);\n\t\t\tawait assertCommitStats(storage, result);\n\t\t\tassertStrictlyIncreasing(result.seqs);\n\t\t\tok(Number.isSafeInteger(result.timestamp) && result.timestamp >= 0);\n\t\t\tdeepStrictEqual(\n\t\t\t\tawait storage.getEntries([\"entry\"], BACKGROUND_CONTEXT),\n\t\t\t\tnew Map([[\"entry\", { ...userEntry(\"entry\"), seq: result.seqs[0], timestamp: result.timestamp }]]),\n\t\t\t);\n\t\t\tdeepStrictEqual(await storage.getValue(testName, BACKGROUND_CONTEXT), {\n\t\t\t\taddress: testName,\n\t\t\t\tvalue: \"session\",\n\t\t\t\tseq: result.seqs[1],\n\t\t\t});\n\t\t\tdeepStrictEqual(await storage.scanUsage({ order: \"asc\" }, BACKGROUND_CONTEXT), [\n\t\t\t\t{ id: \"usage\", seq: result.seqs[2], usage: usage(2, 3), adjustment: false, entryId: \"entry\" },\n\t\t\t]);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"transactions\",\n\t\t\t\"rolls back every store when a mixed transaction fails\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[insertEntry(userEntry(\"root\")), insertUsage({ id: \"taken\", usage: usage(1, 1), adjustment: false })],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tconst entriesBefore = await storage.scanEntries({ order: \"asc\" }, BACKGROUND_CONTEXT);\n\t\t\t\tconst usageBefore = await storage.scanUsage({ order: \"asc\" }, BACKGROUND_CONTEXT);\n\t\t\t\tconst statsBefore = await storage.getStats(BACKGROUND_CONTEXT);\n\n\t\t\t\tawait rejects(\n\t\t\t\t\tstorage.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tsetValue(testName, \"transient\"),\n\t\t\t\t\t\t\tinsertEntry(customEntry(\"transient-entry\", \"root\")),\n\t\t\t\t\t\t\tinsertUsage({ id: \"transient-usage\", usage: usage(5, 8), adjustment: true }),\n\t\t\t\t\t\t\tinsertEntry(customEntry(\"taken\", \"root\")),\n\t\t\t\t\t\t],\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(await storage.scanEntries({ order: \"asc\" }, BACKGROUND_CONTEXT), entriesBefore);\n\t\t\t\tdeepStrictEqual(await storage.scanUsage({ order: \"asc\" }, BACKGROUND_CONTEXT), usageBefore);\n\t\t\t\tdeepStrictEqual(await storage.getStats(BACKGROUND_CONTEXT), statsBefore);\n\t\t\t\tstrictEqual(await storage.getValue(testName, BACKGROUND_CONTEXT), undefined);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"transactions\",\n\t\t\t\"preserves overwritten and deleted values when a transaction fails\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tsetValue(testValue(\"overwritten\"), \"original\"),\n\t\t\t\t\t\tsetValue(testValue(\"deleted\"), { kept: true }),\n\t\t\t\t\t\tinsertEntry(userEntry(\"taken\")),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tconst overwrittenBefore = await storage.getValue(testValue(\"overwritten\"), BACKGROUND_CONTEXT);\n\t\t\t\tconst deletedBefore = await storage.getValue(testValue(\"deleted\"), BACKGROUND_CONTEXT);\n\n\t\t\t\tawait rejects(\n\t\t\t\t\tstorage.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tsetValue(testValue(\"overwritten\"), \"transient\"),\n\t\t\t\t\t\t\tdeleteValue(testValue(\"deleted\")),\n\t\t\t\t\t\t\tinsertEntry(customEntry(\"transient\", \"taken\")),\n\t\t\t\t\t\t\tinsertEntry(customEntry(\"taken\", null)),\n\t\t\t\t\t\t],\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(await storage.getValue(testValue(\"overwritten\"), BACKGROUND_CONTEXT), overwrittenBefore);\n\t\t\t\tdeepStrictEqual(await storage.getValue(testValue(\"deleted\"), BACKGROUND_CONTEXT), deletedBefore);\n\t\t\t\tstrictEqual((await storage.getEntries([\"transient\"], BACKGROUND_CONTEXT)).has(\"transient\"), false);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(factory, \"transactions\", \"enforces one shared entry and usage id namespace\", async ({ storage }) => {\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\tinsertEntry(userEntry(\"existing-entry\")),\n\t\t\t\t\tinsertUsage({ id: \"existing-usage\", usage: usage(1, 1), adjustment: false }),\n\t\t\t\t],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\n\t\t\tawait rejects(\n\t\t\t\tstorage.commit(\n\t\t\t\t\t[insertUsage({ id: \"existing-entry\", usage: usage(2, 2), adjustment: false })],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t),\n\t\t\t);\n\t\t\tawait rejects(storage.commit([insertEntry(customEntry(\"existing-usage\", null))], BACKGROUND_CONTEXT));\n\n\t\t\tfor (const [id, writes] of [\n\t\t\t\t[\n\t\t\t\t\t\"entry-then-usage\",\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertEntry(customEntry(\"entry-then-usage\", null)),\n\t\t\t\t\t\tinsertUsage({ id: \"entry-then-usage\", usage: usage(3, 3), adjustment: false }),\n\t\t\t\t\t],\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t\"usage-then-entry\",\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertUsage({ id: \"usage-then-entry\", usage: usage(4, 4), adjustment: false }),\n\t\t\t\t\t\tinsertEntry(customEntry(\"usage-then-entry\", null)),\n\t\t\t\t\t],\n\t\t\t\t],\n\t\t\t] satisfies Array<[string, Write[]]>) {\n\t\t\t\tawait rejects(storage.commit(writes, BACKGROUND_CONTEXT), `Expected duplicate id ${id} to reject`);\n\t\t\t}\n\n\t\t\tdeepStrictEqual(ids(await storage.scanEntries({ order: \"asc\" }, BACKGROUND_CONTEXT)), [\"existing-entry\"]);\n\t\t\tdeepStrictEqual(\n\t\t\t\t(await storage.scanUsage({ order: \"asc\" }, BACKGROUND_CONTEXT)).map((row) => row.id),\n\t\t\t\t[\"existing-usage\"],\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"transactions\",\n\t\t\t\"resolves parents only from prior entries and earlier writes\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tawait storage.commit([insertEntry(userEntry(\"root\"))], BACKGROUND_CONTEXT);\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[insertEntry(customEntry(\"child\", \"root\")), insertEntry(customEntry(\"grandchild\", \"child\"))],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tids(await storage.scanBranch({ start: \"grandchild\", order: \"oldestFirst\" }, BACKGROUND_CONTEXT)),\n\t\t\t\t\t[\"root\", \"child\", \"grandchild\"],\n\t\t\t\t);\n\n\t\t\t\tawait rejects(\n\t\t\t\t\tstorage.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tinsertEntry(customEntry(\"before-parent\", \"later-parent\")),\n\t\t\t\t\t\t\tinsertEntry(customEntry(\"later-parent\", \"root\")),\n\t\t\t\t\t\t\tsetValue(entryLabel(\"before-parent\"), \"transient\"),\n\t\t\t\t\t\t],\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tawait rejects(storage.commit([insertEntry(customEntry(\"orphan\", \"missing\"))], BACKGROUND_CONTEXT));\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[insertUsage({ id: \"usage-is-not-parent\", usage: usage(1, 1), adjustment: false })],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tawait rejects(\n\t\t\t\t\tstorage.commit([insertEntry(customEntry(\"usage-child\", \"usage-is-not-parent\"))], BACKGROUND_CONTEXT),\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tawait storage.getEntries([\"before-parent\", \"later-parent\", \"orphan\", \"usage-child\"], BACKGROUND_CONTEXT),\n\t\t\t\t\tnew Map(),\n\t\t\t\t);\n\t\t\t\tstrictEqual(await storage.getValue(entryLabel(\"before-parent\"), BACKGROUND_CONTEXT), undefined);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(factory, \"transactions\", \"places pending content under its reserved entry id\", async ({ storage }) => {\n\t\t\tconst entry = userEntry(\"reserved\", null, \"queued\");\n\t\t\tawait storage.commit(\n\t\t\t\t[\n\t\t\t\t\tsetValue(pendingEntry(entry.id), { type: \"message\", payload: entry.message }),\n\t\t\t\t\tsetValue(branchTip(\"main\"), null),\n\t\t\t\t],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\n\t\t\tstrictEqual((await storage.getEntries([entry.id], BACKGROUND_CONTEXT)).has(entry.id), false);\n\t\t\tdeepStrictEqual((await storage.getValue(pendingEntry(entry.id), BACKGROUND_CONTEXT))?.value, {\n\t\t\t\ttype: \"message\",\n\t\t\t\tpayload: entry.message,\n\t\t\t});\n\t\t\tstrictEqual((await storage.getValue(branchTip(\"main\"), BACKGROUND_CONTEXT))?.value, null);\n\n\t\t\tconst placement = await storage.commit(\n\t\t\t\t[insertEntry(entry), deleteValue(pendingEntry(entry.id)), setValue(branchTip(\"main\"), entry.id)],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\n\t\t\tdeepStrictEqual(\n\t\t\t\tawait storage.getEntries([entry.id], BACKGROUND_CONTEXT),\n\t\t\t\tnew Map([[entry.id, { ...entry, seq: placement.seqs[0], timestamp: placement.timestamp }]]),\n\t\t\t);\n\t\t\tstrictEqual(await storage.getValue(pendingEntry(entry.id), BACKGROUND_CONTEXT), undefined);\n\t\t\tdeepStrictEqual(await storage.getValue(branchTip(\"main\"), BACKGROUND_CONTEXT), {\n\t\t\t\taddress: branchTip(\"main\"),\n\t\t\t\tvalue: entry.id,\n\t\t\t\tseq: placement.seqs[2],\n\t\t\t});\n\t\t}),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"values\",\n\t\t\t\"sets, replaces, deletes, and recreates values without tombstones\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tconst first = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tsetValue(testValue(\"prefix/b\"), 1),\n\t\t\t\t\t\tsetValue(testValue(\"prefix/a\"), 2),\n\t\t\t\t\t\tsetValue(testValue(\"other\"), 3),\n\t\t\t\t\t\tsetValue(testValue(\"prefix/\\ue000\"), 4),\n\t\t\t\t\t\tsetValue(testValue(\"prefix/\\u{10000}\"), 5),\n\t\t\t\t\t\tsetValue(testValue(\"prefix/a\"), null),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(await storage.getValue(testValue(\"prefix/a\"), BACKGROUND_CONTEXT), {\n\t\t\t\t\taddress: testValue(\"prefix/a\"),\n\t\t\t\t\tvalue: null,\n\t\t\t\t\tseq: first.seqs[5],\n\t\t\t\t});\n\n\t\t\t\tconst second = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tdeleteValue(testValue(\"prefix/a\")),\n\t\t\t\t\t\tdeleteValue(testValue(\"absent\")),\n\t\t\t\t\t\tsetValue(testValue(\"prefix/a\"), \"recreated\"),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(await storage.scanValues(testValuePrefix(\"prefix/\"), BACKGROUND_CONTEXT), [\n\t\t\t\t\t{ address: testValue(\"prefix/a\"), value: \"recreated\", seq: second.seqs[2] },\n\t\t\t\t\t{ address: testValue(\"prefix/b\"), value: 1, seq: first.seqs[0] },\n\t\t\t\t\t{ address: testValue(\"prefix/\\ue000\"), value: 4, seq: first.seqs[3] },\n\t\t\t\t\t{ address: testValue(\"prefix/\\u{10000}\"), value: 5, seq: first.seqs[4] },\n\t\t\t\t]);\n\t\t\t\tstrictEqual(await storage.getValue(testValue(\"absent\"), BACKGROUND_CONTEXT), undefined);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"values\",\n\t\t\t\"applies same-transaction value and list operations in write order\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tconst keptValue = testValue(\"write-order/kept\");\n\t\t\t\tconst deletedValue = testValue(\"write-order/deleted\");\n\t\t\t\tconst keptList = testList(\"write-order/kept\");\n\t\t\t\tconst deletedList = testList(\"write-order/deleted\");\n\t\t\t\tconst result = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tsetValue(deletedValue, \"transient\"),\n\t\t\t\t\t\tdeleteValue(deletedValue),\n\t\t\t\t\t\tsetValue(keptValue, \"transient\"),\n\t\t\t\t\t\tsetValue(keptValue, \"kept\"),\n\t\t\t\t\t\tappendList(keptList, \"transient\"),\n\t\t\t\t\t\tdeleteList(keptList),\n\t\t\t\t\t\tappendList(keptList, \"kept\"),\n\t\t\t\t\t\tappendList(deletedList, \"transient\"),\n\t\t\t\t\t\tdeleteList(deletedList),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tstrictEqual(await storage.getValue(deletedValue, BACKGROUND_CONTEXT), undefined);\n\t\t\t\tdeepStrictEqual(await storage.getValue(keptValue, BACKGROUND_CONTEXT), {\n\t\t\t\t\taddress: keptValue,\n\t\t\t\t\tvalue: \"kept\",\n\t\t\t\t\tseq: result.seqs[3],\n\t\t\t\t});\n\t\t\t\tdeepStrictEqual(await storage.readList(keptList, undefined, BACKGROUND_CONTEXT), [\n\t\t\t\t\t{ seq: result.seqs[6], value: \"kept\" },\n\t\t\t\t]);\n\t\t\t\tdeepStrictEqual(await storage.readList(deletedList, undefined, BACKGROUND_CONTEXT), []);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"values\",\n\t\t\t\"does not change historical stores during value-only commits\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tawait storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertEntry(userEntry(\"root\")),\n\t\t\t\t\t\tinsertUsage({ id: \"historical-usage\", usage: usage(2, 3), adjustment: false }),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tconst entriesBefore = await storage.scanEntries({ order: \"asc\" }, BACKGROUND_CONTEXT);\n\t\t\t\tconst usageBefore = await storage.scanUsage({ order: \"asc\" }, BACKGROUND_CONTEXT);\n\t\t\t\tconst statsBefore = await storage.getStats(BACKGROUND_CONTEXT);\n\n\t\t\t\tconst result = await storage.commit(\n\t\t\t\t\t[setValue(testName, \"first\"), setValue(testName, \"second\")],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(await storage.scanEntries({ order: \"asc\" }, BACKGROUND_CONTEXT), entriesBefore);\n\t\t\t\tdeepStrictEqual(await storage.scanUsage({ order: \"asc\" }, BACKGROUND_CONTEXT), usageBefore);\n\t\t\t\tdeepStrictEqual(await storage.getStats(BACKGROUND_CONTEXT), statsBefore);\n\t\t\t\tdeepStrictEqual(await storage.getValue(testName, BACKGROUND_CONTEXT), {\n\t\t\t\t\taddress: testName,\n\t\t\t\t\tvalue: \"second\",\n\t\t\t\t\tseq: result.seqs[1],\n\t\t\t\t});\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(factory, \"lists\", \"pages appends by global sequence and deletes whole lists\", async ({ storage }) => {\n\t\t\tconst address = testList(\"events\");\n\t\t\tstrictEqual((await storage.readList(address, undefined, BACKGROUND_CONTEXT)).length, 0);\n\t\t\tconst result = await storage.commit(\n\t\t\t\t[appendList(address, \"a\"), setValue(testName, \"gap\"), appendList(address, \"b\"), appendList(address, \"c\")],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tdeepStrictEqual(await storage.readList(address, undefined, BACKGROUND_CONTEXT), [\n\t\t\t\t{ seq: result.seqs[0], value: \"a\" },\n\t\t\t\t{ seq: result.seqs[2], value: \"b\" },\n\t\t\t\t{ seq: result.seqs[3], value: \"c\" },\n\t\t\t]);\n\t\t\tdeepStrictEqual(await storage.readList(address, { limit: 2 }, BACKGROUND_CONTEXT), [\n\t\t\t\t{ seq: result.seqs[0], value: \"a\" },\n\t\t\t\t{ seq: result.seqs[2], value: \"b\" },\n\t\t\t]);\n\t\t\tdeepStrictEqual(\n\t\t\t\tawait storage.readList(address, { cursor: { seq: result.seqs[0]! }, limit: 2 }, BACKGROUND_CONTEXT),\n\t\t\t\t[\n\t\t\t\t\t{ seq: result.seqs[2], value: \"b\" },\n\t\t\t\t\t{ seq: result.seqs[3], value: \"c\" },\n\t\t\t\t],\n\t\t\t);\n\t\t\tdeepStrictEqual(await storage.readList(address, { order: \"desc\", limit: 2 }, BACKGROUND_CONTEXT), [\n\t\t\t\t{ seq: result.seqs[3], value: \"c\" },\n\t\t\t\t{ seq: result.seqs[2], value: \"b\" },\n\t\t\t]);\n\t\t\tdeepStrictEqual(\n\t\t\t\tawait storage.readList(\n\t\t\t\t\taddress,\n\t\t\t\t\t{ order: \"desc\", cursor: { seq: result.seqs[3]! }, limit: 2 },\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t),\n\t\t\t\t[\n\t\t\t\t\t{ seq: result.seqs[2], value: \"b\" },\n\t\t\t\t\t{ seq: result.seqs[0], value: \"a\" },\n\t\t\t\t],\n\t\t\t);\n\t\t\tawait rejects(storage.readList(address, { limit: 0 }, BACKGROUND_CONTEXT));\n\t\t\tawait rejects(storage.readList(address, { limit: Number.MAX_VALUE }, BACKGROUND_CONTEXT));\n\n\t\t\tawait storage.commit(\n\t\t\t\t[deleteList(address), deleteList(testList(\"absent\")), appendList(address, \"new\")],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tdeepStrictEqual(\n\t\t\t\t(await storage.readList(address, undefined, BACKGROUND_CONTEXT)).map(({ value }) => value),\n\t\t\t\t[\"new\"],\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(factory, \"lists\", \"clamps one read page without limiting list growth\", async ({ storage }) => {\n\t\t\tconst address = testList(\"large\");\n\t\t\tawait storage.commit(\n\t\t\t\tArray.from({ length: 10_001 }, (_, index) => appendList(address, index)),\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tconst firstPage = await storage.readList(address, undefined, BACKGROUND_CONTEXT);\n\t\t\tstrictEqual(firstPage.length, 1_000);\n\t\t\tstrictEqual((await storage.readList(address, { limit: 20_000 }, BACKGROUND_CONTEXT)).length, 10_000);\n\t\t\tstrictEqual(\n\t\t\t\t(\n\t\t\t\t\tawait storage.readList(\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcursor: { seq: firstPage.at(-1)!.seq },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t)\n\t\t\t\t).length,\n\t\t\t\t1_000,\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"lists\",\n\t\t\t\"commits mixed list writes atomically and rolls them back with siblings\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tconst address = testList(\"atomic\");\n\t\t\t\tconst committed = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertEntry(userEntry(\"mixed\")),\n\t\t\t\t\t\tappendList(address, \"kept\"),\n\t\t\t\t\t\tsetValue(testName, \"kept\"),\n\t\t\t\t\t\tinsertUsage({ id: \"mixed-usage\", usage: usage(1, 2), adjustment: false }),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(await storage.readList(address, undefined, BACKGROUND_CONTEXT), [\n\t\t\t\t\t{ seq: committed.seqs[1], value: \"kept\" },\n\t\t\t\t]);\n\n\t\t\t\tawait rejects(\n\t\t\t\t\tstorage.commit(\n\t\t\t\t\t\t[appendList(address, \"transient\"), deleteValue(testName), insertEntry(userEntry(\"mixed\"))],\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(await storage.readList(address, undefined, BACKGROUND_CONTEXT), [\n\t\t\t\t\t{ seq: committed.seqs[1], value: \"kept\" },\n\t\t\t\t]);\n\t\t\t\tstrictEqual((await storage.getValue(testName, BACKGROUND_CONTEXT))?.value, \"kept\");\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(factory, \"entry queries\", \"stores custom entries with and without data\", async ({ storage }) => {\n\t\t\tconst result = await storage.commit(\n\t\t\t\t[\n\t\t\t\t\tinsertEntry({ id: \"without-data\", parentId: null, type: \"custom\", customType: \"marker\" }),\n\t\t\t\t\tinsertEntry(customEntry(\"with-data\", \"without-data\", \"note\", { nested: [1, 2] })),\n\t\t\t\t],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\n\t\t\tdeepStrictEqual(\n\t\t\t\tawait storage.getEntries([\"without-data\", \"with-data\"], BACKGROUND_CONTEXT),\n\t\t\t\tnew Map([\n\t\t\t\t\t[\n\t\t\t\t\t\t\"without-data\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: \"without-data\",\n\t\t\t\t\t\t\tparentId: null,\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tcustomType: \"marker\",\n\t\t\t\t\t\t\tseq: result.seqs[0],\n\t\t\t\t\t\t\ttimestamp: result.timestamp,\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\t\"with-data\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...customEntry(\"with-data\", \"without-data\", \"note\", { nested: [1, 2] }),\n\t\t\t\t\t\t\tseq: result.seqs[1],\n\t\t\t\t\t\t\ttimestamp: result.timestamp,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t]),\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"entry queries\",\n\t\t\t\"scans global entries with explicit ranges, filters, orders, and limits\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tconst result = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertEntry(userEntry(\"root\")),\n\t\t\t\t\t\tinsertEntry(customEntry(\"note-1\", \"root\", \"note\")),\n\t\t\t\t\t\tinsertEntry(customEntry(\"other\", \"note-1\", \"other\")),\n\t\t\t\t\t\tinsertEntry(customEntry(\"note-2\", \"other\", \"note\")),\n\t\t\t\t\t\tinsertEntry(userEntry(\"tail\", \"note-2\")),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tids(\n\t\t\t\t\t\tawait storage.scanEntries(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\tcustomType: \"note\",\n\t\t\t\t\t\t\t\tfromSeq: result.seqs[1],\n\t\t\t\t\t\t\t\ttoSeq: result.seqs[3],\n\t\t\t\t\t\t\t\torder: \"desc\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\t[\"note-2\", \"note-1\"],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(ids(await storage.scanEntries({ order: \"asc\", limit: 2 }, BACKGROUND_CONTEXT)), [\n\t\t\t\t\t\"root\",\n\t\t\t\t\t\"note-1\",\n\t\t\t\t]);\n\t\t\t\tdeepStrictEqual(ids(await storage.scanEntries({ order: \"desc\", limit: 2 }, BACKGROUND_CONTEXT)), [\n\t\t\t\t\t\"tail\",\n\t\t\t\t\t\"note-2\",\n\t\t\t\t]);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"branch queries\",\n\t\t\t\"applies stops before filters and cursors before limits\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tconst result = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertEntry(userEntry(\"root\")),\n\t\t\t\t\t\tinsertEntry(customEntry(\"marker\", \"root\", \"marker\")),\n\t\t\t\t\t\tinsertEntry(userEntry(\"middle\", \"marker\")),\n\t\t\t\t\t\tinsertEntry(compactionEntry(\"compact\", \"middle\")),\n\t\t\t\t\t\tinsertEntry(customEntry(\"note\", \"compact\", \"note\")),\n\t\t\t\t\t\tinsertEntry(userEntry(\"leaf\", \"note\")),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tids(\n\t\t\t\t\t\tawait storage.scanBranch(\n\t\t\t\t\t\t\t{ start: \"leaf\", stopAtType: \"compaction\", type: \"message\" },\n\t\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\t[\"leaf\"],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tids(\n\t\t\t\t\t\tawait storage.scanBranch(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstart: \"leaf\",\n\t\t\t\t\t\t\t\torder: \"oldestFirst\",\n\t\t\t\t\t\t\t\tstopAtId: \"middle\",\n\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\t[\"marker\"],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tids(\n\t\t\t\t\t\tawait storage.scanBranch(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstart: \"leaf\",\n\t\t\t\t\t\t\t\torder: \"newestFirst\",\n\t\t\t\t\t\t\t\tcursor: { seq: result.seqs[4] },\n\t\t\t\t\t\t\t\tlimit: 2,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\t[\"compact\", \"middle\"],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tids(\n\t\t\t\t\t\tawait storage.scanBranch(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstart: \"leaf\",\n\t\t\t\t\t\t\t\torder: \"oldestFirst\",\n\t\t\t\t\t\t\t\tcursor: { seq: result.seqs[1] },\n\t\t\t\t\t\t\t\tlimit: 2,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\t[\"middle\", \"compact\"],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tids(await storage.scanBranch({ start: \"leaf\", stopAtId: \"leaf\", type: \"custom\" }, BACKGROUND_CONTEXT)),\n\t\t\t\t\t[],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(ids(await storage.scanBranch({ start: \"leaf\", customType: \"note\" }, BACKGROUND_CONTEXT)), [\n\t\t\t\t\t\"note\",\n\t\t\t\t]);\n\t\t\t\tawait rejects(storage.scanBranch({ start: \"missing\" }, BACKGROUND_CONTEXT));\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(factory, \"branch queries\", \"returns branch structure without payload fields\", async ({ storage }) => {\n\t\t\tconst result = await storage.commit(\n\t\t\t\t[insertEntry(userEntry(\"root\")), insertEntry(customEntry(\"child\", \"root\", \"note\"))],\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\n\t\t\tdeepStrictEqual(\n\t\t\t\tawait storage.scanBranchStructure({ start: \"child\", order: \"oldestFirst\" }, BACKGROUND_CONTEXT),\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"root\",\n\t\t\t\t\t\tparentId: null,\n\t\t\t\t\t\tseq: result.seqs[0],\n\t\t\t\t\t\ttimestamp: result.timestamp,\n\t\t\t\t\t\ttype: \"message\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"child\",\n\t\t\t\t\t\tparentId: \"root\",\n\t\t\t\t\t\tseq: result.seqs[1],\n\t\t\t\t\t\ttimestamp: result.timestamp,\n\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\tcustomType: \"note\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t);\n\t\t}),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"branch queries\",\n\t\t\t\"applies branch query semantics to structure scans\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tconst result = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertEntry(userEntry(\"root\")),\n\t\t\t\t\t\tinsertEntry(customEntry(\"marker\", \"root\", \"marker\")),\n\t\t\t\t\t\tinsertEntry(userEntry(\"middle\", \"marker\")),\n\t\t\t\t\t\tinsertEntry(compactionEntry(\"compact\", \"middle\")),\n\t\t\t\t\t\tinsertEntry(customEntry(\"note\", \"compact\", \"note\")),\n\t\t\t\t\t\tinsertEntry(userEntry(\"leaf\", \"note\")),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tids(\n\t\t\t\t\t\tawait storage.scanBranchStructure(\n\t\t\t\t\t\t\t{ start: \"leaf\", stopAtType: \"compaction\", type: \"message\" },\n\t\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\t[\"leaf\"],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tids(\n\t\t\t\t\t\tawait storage.scanBranchStructure(\n\t\t\t\t\t\t\t{ start: \"leaf\", order: \"oldestFirst\", cursor: { seq: result.seqs[1] }, limit: 2 },\n\t\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\t[\"middle\", \"compact\"],\n\t\t\t\t);\n\t\t\t\tawait rejects(storage.scanBranchStructure({ start: \"missing\" }, BACKGROUND_CONTEXT));\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"usage and stats\",\n\t\t\t\"scans the usage ledger with explicit ranges, orders, and limits\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tconst result = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertUsage({ id: \"usage-1\", usage: usage(1, 1), adjustment: false }),\n\t\t\t\t\t\tsetValue(testName, \"sequence gap\"),\n\t\t\t\t\t\tinsertUsage({ id: \"usage-2\", usage: usage(2, 2), adjustment: false }),\n\t\t\t\t\t\tinsertUsage({ id: \"usage-3\", usage: usage(3, 3), adjustment: true }),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\t(\n\t\t\t\t\t\tawait storage.scanUsage(\n\t\t\t\t\t\t\t{ fromSeq: result.seqs[1], toSeq: result.seqs[2], order: \"asc\" },\n\t\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t\t)\n\t\t\t\t\t).map((row) => row.id),\n\t\t\t\t\t[\"usage-2\"],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\t(await storage.scanUsage({ order: \"desc\", limit: 2 }, BACKGROUND_CONTEXT)).map((row) => row.id),\n\t\t\t\t\t[\"usage-3\", \"usage-2\"],\n\t\t\t\t);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\t(await storage.scanUsage({ order: \"asc\", limit: 2 }, BACKGROUND_CONTEXT)).map((row) => row.id),\n\t\t\t\t\t[\"usage-1\", \"usage-2\"],\n\t\t\t\t);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"usage and stats\",\n\t\t\t\"keeps stats equal to message count and ledger totals\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tdeepStrictEqual(await storage.getStats(BACKGROUND_CONTEXT), { messageCount: 0, usage: zeroUsage() });\n\n\t\t\t\tconst firstUsage = usage(2, 3, { cacheWrite1h: 4, reasoning: 1 });\n\t\t\t\tconst first = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertEntry(userEntry(\"message\")),\n\t\t\t\t\t\tinsertUsage({ id: \"usage-1\", usage: firstUsage, adjustment: false }),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tawait assertCommitStats(storage, first);\n\t\t\t\tdeepStrictEqual(first.stats, { messageCount: 1, usage: firstUsage });\n\n\t\t\t\tconst secondUsage = usage(5, 7, { cacheWrite1h: 6, reasoning: 2 });\n\t\t\t\tconst second = await storage.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertEntry(customEntry(\"custom\", \"message\")),\n\t\t\t\t\t\tinsertEntry(compactionEntry(\"compaction\", \"custom\")),\n\t\t\t\t\t\tinsertUsage({ id: \"usage-2\", usage: secondUsage, adjustment: true }),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tawait assertCommitStats(storage, second);\n\t\t\t\tdeepStrictEqual(second.stats, {\n\t\t\t\t\tmessageCount: 1,\n\t\t\t\t\tusage: {\n\t\t\t\t\t\tinput: 7,\n\t\t\t\t\t\toutput: 10,\n\t\t\t\t\t\tcacheRead: 9,\n\t\t\t\t\t\tcacheWrite: 12,\n\t\t\t\t\t\tcacheWrite1h: 10,\n\t\t\t\t\t\treasoning: 3,\n\t\t\t\t\t\ttotalTokens: 17,\n\t\t\t\t\t\tcost: {\n\t\t\t\t\t\t\tinput: firstUsage.cost.input + secondUsage.cost.input,\n\t\t\t\t\t\t\toutput: firstUsage.cost.output + secondUsage.cost.output,\n\t\t\t\t\t\t\tcacheRead: firstUsage.cost.cacheRead + secondUsage.cost.cacheRead,\n\t\t\t\t\t\t\tcacheWrite: firstUsage.cost.cacheWrite + secondUsage.cost.cacheWrite,\n\t\t\t\t\t\t\ttotal: firstUsage.cost.total + secondUsage.cost.total,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"serialization\",\n\t\t\t\"serializes back-to-back commits in admission order\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tconst first = storage.commit([insertEntry(userEntry(\"first\"))], BACKGROUND_CONTEXT);\n\t\t\t\tconst second = storage.commit([insertEntry(userEntry(\"second\", \"first\"))], BACKGROUND_CONTEXT);\n\t\t\t\tconst [firstResult, secondResult] = await Promise.all([first, second]);\n\n\t\t\t\tok(firstResult.seqs[0]! < secondResult.seqs[0]!);\n\t\t\t\tdeepStrictEqual(firstResult.stats, { messageCount: 1, usage: zeroUsage() });\n\t\t\t\tdeepStrictEqual(secondResult.stats, { messageCount: 2, usage: zeroUsage() });\n\t\t\t\tawait assertCommitStats(storage, secondResult);\n\t\t\t\tdeepStrictEqual(ids(await storage.scanEntries({ order: \"asc\" }, BACKGROUND_CONTEXT)), [\"first\", \"second\"]);\n\t\t\t},\n\t\t),\n\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"lifecycle\",\n\t\t\t\"seals admission, drains admitted commits, and closes idempotently\",\n\t\t\tasync ({ storage }) => {\n\t\t\t\tconst admitted = storage.commit([insertEntry(userEntry(\"admitted\"))], BACKGROUND_CONTEXT);\n\t\t\t\tconst firstClose = storage.close(BACKGROUND_CONTEXT);\n\t\t\t\tconst secondClose = storage.close(BACKGROUND_CONTEXT);\n\n\t\t\t\tawait rejects(storage.getStats(BACKGROUND_CONTEXT));\n\t\t\t\tawait rejects(storage.commit([], BACKGROUND_CONTEXT));\n\t\t\t\tstrictEqual((await admitted).seqs.length, 1);\n\t\t\t\tawait Promise.all([firstClose, secondClose]);\n\n\t\t\t\tconst rejectedReads = [\n\t\t\t\t\tstorage.getEntries([], BACKGROUND_CONTEXT),\n\t\t\t\t\tstorage.getValue(testName, BACKGROUND_CONTEXT),\n\t\t\t\t\tstorage.scanValues(testName, BACKGROUND_CONTEXT),\n\t\t\t\t\tstorage.readList(testList(\"events\"), undefined, BACKGROUND_CONTEXT),\n\t\t\t\t\tstorage.scanBranch({ start: \"admitted\" }, BACKGROUND_CONTEXT),\n\t\t\t\t\tstorage.scanBranchStructure({ start: \"admitted\" }, BACKGROUND_CONTEXT),\n\t\t\t\t\tstorage.scanEntries({ order: \"asc\" }, BACKGROUND_CONTEXT),\n\t\t\t\t\tstorage.scanUsage({ order: \"asc\" }, BACKGROUND_CONTEXT),\n\t\t\t\t\tstorage.getStats(BACKGROUND_CONTEXT),\n\t\t\t\t];\n\t\t\t\tfor (const read of rejectedReads) await rejects(read);\n\t\t\t},\n\t\t),\n\t];\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import type { Context } from "../../context.ts";
2
+ import type { CommitResult, Write } from "../types.ts";
3
+ import { StorageDecorator } from "./storage-decorator.ts";
4
+ /** Thrown for every commit rejected after simulated storage loss. */
5
+ export declare class CommitDiscarded extends Error {
6
+ constructor(message: string);
7
+ }
8
+ /** Test-only storage decorator that deterministically parks admitted commits. */
9
+ export declare class GatingStorage extends StorageDecorator {
10
+ private armed;
11
+ private discarded;
12
+ private readonly queue;
13
+ private readonly waiters;
14
+ /** Fixture setup bypasses gating until explicitly armed. */
15
+ arm(): void;
16
+ pending(): number;
17
+ /** Wait until at least `count` commits are parked. */
18
+ waitPending(count?: number): Promise<void>;
19
+ commit(writes: Write[], context: Context): Promise<CommitResult>;
20
+ /** Release `count` commits in FIFO order and wait until each write lands. */
21
+ next(count?: number): Promise<void>;
22
+ /** Drop parked commits and permanently reject every later commit. */
23
+ discard(): void;
24
+ private notifyWaiters;
25
+ }
26
+ //# sourceMappingURL=gating-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gating-storage.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/testing/gating-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,qEAAqE;AACrE,qBAAa,eAAgB,SAAQ,KAAK;IACzC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAcD,iFAAiF;AACjF,qBAAa,aAAc,SAAQ,gBAAgB;IAClD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAE/C,4DAA4D;IAC5D,GAAG,IAAI,IAAI,CAEV;IAED,OAAO,IAAI,MAAM,CAEhB;IAED,sDAAsD;IACtD,WAAW,CAAC,KAAK,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CASpC;IAEc,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CA4B9E;IAED,6EAA6E;IACvE,IAAI,CAAC,KAAK,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnC;IAED,qEAAqE;IACrE,OAAO,IAAI,IAAI,CAMd;IAED,OAAO,CAAC,aAAa;CAQrB","sourcesContent":["import type { Context } from \"../../context.ts\";\nimport type { CommitResult, Write } from \"../types.ts\";\nimport { StorageDecorator } from \"./storage-decorator.ts\";\n\n/** Thrown for every commit rejected after simulated storage loss. */\nexport class CommitDiscarded extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"CommitDiscarded\";\n\t}\n}\n\ninterface ParkedCommit {\n\trelease(): void;\n\tdrop(error: Error): void;\n\treadonly landing: Promise<void>;\n}\n\ninterface PendingWaiter {\n\tcount: number;\n\tresolve(): void;\n\treject(error: Error): void;\n}\n\n/** Test-only storage decorator that deterministically parks admitted commits. */\nexport class GatingStorage extends StorageDecorator {\n\tprivate armed = false;\n\tprivate discarded = false;\n\tprivate readonly queue: ParkedCommit[] = [];\n\tprivate readonly waiters: PendingWaiter[] = [];\n\n\t/** Fixture setup bypasses gating until explicitly armed. */\n\tarm(): void {\n\t\tthis.armed = true;\n\t}\n\n\tpending(): number {\n\t\treturn this.queue.length;\n\t}\n\n\t/** Wait until at least `count` commits are parked. */\n\twaitPending(count = 1): Promise<void> {\n\t\tif (!Number.isSafeInteger(count) || count < 1) {\n\t\t\treturn Promise.reject(new RangeError(\"Pending commit count must be a positive safe integer\"));\n\t\t}\n\t\tif (this.discarded) return Promise.reject(new CommitDiscarded(\"storage discarded\"));\n\t\tif (this.queue.length >= count) return Promise.resolve();\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tthis.waiters.push({ count, resolve, reject });\n\t\t});\n\t}\n\n\toverride async commit(writes: Write[], context: Context): Promise<CommitResult> {\n\t\tif (this.discarded) throw new CommitDiscarded(\"commit rejected: storage discarded\");\n\t\tif (!this.armed) return super.commit(writes, context);\n\n\t\tlet landed!: () => void;\n\t\tlet lost!: (error: Error) => void;\n\t\tconst landing = new Promise<void>((resolve, reject) => {\n\t\t\tlanded = resolve;\n\t\t\tlost = reject;\n\t\t});\n\t\tvoid landing.catch(() => {});\n\n\t\tconst released = new Promise<void>((resolve, reject) => {\n\t\t\tthis.queue.push({ release: resolve, drop: reject, landing });\n\t\t});\n\t\tthis.notifyWaiters();\n\n\t\ttry {\n\t\t\tawait released;\n\t\t\tif (this.discarded) throw new CommitDiscarded(\"commit rejected: storage discarded\");\n\t\t\tconst result = await super.commit(writes, context);\n\t\t\tlanded();\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst normalized = error instanceof Error ? error : new Error(String(error));\n\t\t\tlost(normalized);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/** Release `count` commits in FIFO order and wait until each write lands. */\n\tasync next(count = 1): Promise<void> {\n\t\tif (!Number.isSafeInteger(count) || count < 1) {\n\t\t\tthrow new RangeError(\"Released commit count must be a positive safe integer\");\n\t\t}\n\t\tfor (let index = 0; index < count; index++) {\n\t\t\tawait this.waitPending();\n\t\t\tconst parked = this.queue.shift();\n\t\t\tif (parked === undefined) throw new Error(\"No parked commit\");\n\t\t\tparked.release();\n\t\t\tawait parked.landing;\n\t\t}\n\t}\n\n\t/** Drop parked commits and permanently reject every later commit. */\n\tdiscard(): void {\n\t\tif (this.discarded) return;\n\t\tthis.discarded = true;\n\t\tconst error = new CommitDiscarded(\"commit discarded\");\n\t\tfor (const parked of this.queue.splice(0)) parked.drop(error);\n\t\tfor (const waiter of this.waiters.splice(0)) waiter.reject(error);\n\t}\n\n\tprivate notifyWaiters(): void {\n\t\tfor (let index = this.waiters.length - 1; index >= 0; index--) {\n\t\t\tconst waiter = this.waiters[index]!;\n\t\t\tif (this.queue.length < waiter.count) continue;\n\t\t\tthis.waiters.splice(index, 1);\n\t\t\twaiter.resolve();\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,100 @@
1
+ import { StorageDecorator } from "./storage-decorator.js";
2
+ /** Thrown for every commit rejected after simulated storage loss. */
3
+ export class CommitDiscarded extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "CommitDiscarded";
7
+ }
8
+ }
9
+ /** Test-only storage decorator that deterministically parks admitted commits. */
10
+ export class GatingStorage extends StorageDecorator {
11
+ armed = false;
12
+ discarded = false;
13
+ queue = [];
14
+ waiters = [];
15
+ /** Fixture setup bypasses gating until explicitly armed. */
16
+ arm() {
17
+ this.armed = true;
18
+ }
19
+ pending() {
20
+ return this.queue.length;
21
+ }
22
+ /** Wait until at least `count` commits are parked. */
23
+ waitPending(count = 1) {
24
+ if (!Number.isSafeInteger(count) || count < 1) {
25
+ return Promise.reject(new RangeError("Pending commit count must be a positive safe integer"));
26
+ }
27
+ if (this.discarded)
28
+ return Promise.reject(new CommitDiscarded("storage discarded"));
29
+ if (this.queue.length >= count)
30
+ return Promise.resolve();
31
+ return new Promise((resolve, reject) => {
32
+ this.waiters.push({ count, resolve, reject });
33
+ });
34
+ }
35
+ async commit(writes, context) {
36
+ if (this.discarded)
37
+ throw new CommitDiscarded("commit rejected: storage discarded");
38
+ if (!this.armed)
39
+ return super.commit(writes, context);
40
+ let landed;
41
+ let lost;
42
+ const landing = new Promise((resolve, reject) => {
43
+ landed = resolve;
44
+ lost = reject;
45
+ });
46
+ void landing.catch(() => { });
47
+ const released = new Promise((resolve, reject) => {
48
+ this.queue.push({ release: resolve, drop: reject, landing });
49
+ });
50
+ this.notifyWaiters();
51
+ try {
52
+ await released;
53
+ if (this.discarded)
54
+ throw new CommitDiscarded("commit rejected: storage discarded");
55
+ const result = await super.commit(writes, context);
56
+ landed();
57
+ return result;
58
+ }
59
+ catch (error) {
60
+ const normalized = error instanceof Error ? error : new Error(String(error));
61
+ lost(normalized);
62
+ throw error;
63
+ }
64
+ }
65
+ /** Release `count` commits in FIFO order and wait until each write lands. */
66
+ async next(count = 1) {
67
+ if (!Number.isSafeInteger(count) || count < 1) {
68
+ throw new RangeError("Released commit count must be a positive safe integer");
69
+ }
70
+ for (let index = 0; index < count; index++) {
71
+ await this.waitPending();
72
+ const parked = this.queue.shift();
73
+ if (parked === undefined)
74
+ throw new Error("No parked commit");
75
+ parked.release();
76
+ await parked.landing;
77
+ }
78
+ }
79
+ /** Drop parked commits and permanently reject every later commit. */
80
+ discard() {
81
+ if (this.discarded)
82
+ return;
83
+ this.discarded = true;
84
+ const error = new CommitDiscarded("commit discarded");
85
+ for (const parked of this.queue.splice(0))
86
+ parked.drop(error);
87
+ for (const waiter of this.waiters.splice(0))
88
+ waiter.reject(error);
89
+ }
90
+ notifyWaiters() {
91
+ for (let index = this.waiters.length - 1; index >= 0; index--) {
92
+ const waiter = this.waiters[index];
93
+ if (this.queue.length < waiter.count)
94
+ continue;
95
+ this.waiters.splice(index, 1);
96
+ waiter.resolve();
97
+ }
98
+ }
99
+ }
100
+ //# sourceMappingURL=gating-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gating-storage.js","sourceRoot":"","sources":["../../../../src/harness/session/testing/gating-storage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"../../context.ts\";\nimport type { CommitResult, Write } from \"../types.ts\";\nimport { StorageDecorator } from \"./storage-decorator.ts\";\n\n/** Thrown for every commit rejected after simulated storage loss. */\nexport class CommitDiscarded extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"CommitDiscarded\";\n\t}\n}\n\ninterface ParkedCommit {\n\trelease(): void;\n\tdrop(error: Error): void;\n\treadonly landing: Promise<void>;\n}\n\ninterface PendingWaiter {\n\tcount: number;\n\tresolve(): void;\n\treject(error: Error): void;\n}\n\n/** Test-only storage decorator that deterministically parks admitted commits. */\nexport class GatingStorage extends StorageDecorator {\n\tprivate armed = false;\n\tprivate discarded = false;\n\tprivate readonly queue: ParkedCommit[] = [];\n\tprivate readonly waiters: PendingWaiter[] = [];\n\n\t/** Fixture setup bypasses gating until explicitly armed. */\n\tarm(): void {\n\t\tthis.armed = true;\n\t}\n\n\tpending(): number {\n\t\treturn this.queue.length;\n\t}\n\n\t/** Wait until at least `count` commits are parked. */\n\twaitPending(count = 1): Promise<void> {\n\t\tif (!Number.isSafeInteger(count) || count < 1) {\n\t\t\treturn Promise.reject(new RangeError(\"Pending commit count must be a positive safe integer\"));\n\t\t}\n\t\tif (this.discarded) return Promise.reject(new CommitDiscarded(\"storage discarded\"));\n\t\tif (this.queue.length >= count) return Promise.resolve();\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tthis.waiters.push({ count, resolve, reject });\n\t\t});\n\t}\n\n\toverride async commit(writes: Write[], context: Context): Promise<CommitResult> {\n\t\tif (this.discarded) throw new CommitDiscarded(\"commit rejected: storage discarded\");\n\t\tif (!this.armed) return super.commit(writes, context);\n\n\t\tlet landed!: () => void;\n\t\tlet lost!: (error: Error) => void;\n\t\tconst landing = new Promise<void>((resolve, reject) => {\n\t\t\tlanded = resolve;\n\t\t\tlost = reject;\n\t\t});\n\t\tvoid landing.catch(() => {});\n\n\t\tconst released = new Promise<void>((resolve, reject) => {\n\t\t\tthis.queue.push({ release: resolve, drop: reject, landing });\n\t\t});\n\t\tthis.notifyWaiters();\n\n\t\ttry {\n\t\t\tawait released;\n\t\t\tif (this.discarded) throw new CommitDiscarded(\"commit rejected: storage discarded\");\n\t\t\tconst result = await super.commit(writes, context);\n\t\t\tlanded();\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst normalized = error instanceof Error ? error : new Error(String(error));\n\t\t\tlost(normalized);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/** Release `count` commits in FIFO order and wait until each write lands. */\n\tasync next(count = 1): Promise<void> {\n\t\tif (!Number.isSafeInteger(count) || count < 1) {\n\t\t\tthrow new RangeError(\"Released commit count must be a positive safe integer\");\n\t\t}\n\t\tfor (let index = 0; index < count; index++) {\n\t\t\tawait this.waitPending();\n\t\t\tconst parked = this.queue.shift();\n\t\t\tif (parked === undefined) throw new Error(\"No parked commit\");\n\t\t\tparked.release();\n\t\t\tawait parked.landing;\n\t\t}\n\t}\n\n\t/** Drop parked commits and permanently reject every later commit. */\n\tdiscard(): void {\n\t\tif (this.discarded) return;\n\t\tthis.discarded = true;\n\t\tconst error = new CommitDiscarded(\"commit discarded\");\n\t\tfor (const parked of this.queue.splice(0)) parked.drop(error);\n\t\tfor (const waiter of this.waiters.splice(0)) waiter.reject(error);\n\t}\n\n\tprivate notifyWaiters(): void {\n\t\tfor (let index = this.waiters.length - 1; index >= 0; index--) {\n\t\t\tconst waiter = this.waiters[index]!;\n\t\t\tif (this.queue.length < waiter.count) continue;\n\t\t\tthis.waiters.splice(index, 1);\n\t\t\twaiter.resolve();\n\t\t}\n\t}\n}\n"]}
@@ -1,3 +1,10 @@
1
- export { createSessionBackendConformance } from "./conformance.ts";
2
- export type { SessionBackendConformanceCase, SessionBackendFixture, SessionBackendFixtureFactory, } from "./types.ts";
1
+ export { STORAGE_BENCHMARK_DATASETS } from "./benchmark/datasets.ts";
2
+ export { SESSION_REPO_CATALOG_BENCHMARK_DATASETS, SESSION_REPO_CATALOG_READ_BENCHMARK_SCENARIOS, SESSION_REPO_CATALOG_WRITE_BENCHMARK_SCENARIOS, SESSION_REPO_FORK_BENCHMARK_DATASETS, SESSION_REPO_FORK_WRITE_BENCHMARK_SCENARIOS, type SessionRepoCatalogBenchmarkDataset, seedSessionRepoCatalogBenchmark, seedSessionRepoForkBenchmark, sessionRepoBenchmarkSessionId, } from "./benchmark/session-repo.ts";
3
+ export { generateStorageBenchmarkSeedTransactions, STORAGE_READ_BENCHMARK_SCENARIOS, STORAGE_WRITE_BENCHMARK_SCENARIOS, seedStorageBenchmark, } from "./benchmark/storage.ts";
4
+ export { createSessionRepoConformance, createSessionRepoForkBehaviorConformance, createSessionRepoForkConformance, createSessionRepoForkCoordinationConformance, createSessionRepoForkDestinationReservationConformance, createSessionRepoForkSourceSnapshotConformance, createSessionRepoLifecycleConformance, createSessionRepoMessageConformance, createSessionRepoOwnershipConformance, } from "./conformance/session-repo.ts";
5
+ export { createStorageConformance } from "./conformance/storage.ts";
6
+ export { CommitDiscarded, GatingStorage } from "./gating-storage.ts";
7
+ export { InstrumentedStorage } from "./instrumented-storage.ts";
8
+ export { StorageDecorator } from "./storage-decorator.ts";
9
+ export type { ConformanceCase, StorageFixture } from "./types.ts";
3
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EACX,6BAA6B,EAC7B,qBAAqB,EACrB,4BAA4B,GAC5B,MAAM,YAAY,CAAC","sourcesContent":["export { createSessionBackendConformance } from \"./conformance.ts\";\nexport type {\n\tSessionBackendConformanceCase,\n\tSessionBackendFixture,\n\tSessionBackendFixtureFactory,\n} from \"./types.ts\";\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EACN,uCAAuC,EACvC,6CAA6C,EAC7C,8CAA8C,EAC9C,oCAAoC,EACpC,2CAA2C,EAC3C,KAAK,kCAAkC,EACvC,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,GAC7B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,wCAAwC,EACxC,gCAAgC,EAChC,iCAAiC,EACjC,oBAAoB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACN,4BAA4B,EAC5B,wCAAwC,EACxC,gCAAgC,EAChC,4CAA4C,EAC5C,sDAAsD,EACtD,8CAA8C,EAC9C,qCAAqC,EACrC,mCAAmC,EACnC,qCAAqC,GACrC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export { STORAGE_BENCHMARK_DATASETS } from \"./benchmark/datasets.ts\";\nexport {\n\tSESSION_REPO_CATALOG_BENCHMARK_DATASETS,\n\tSESSION_REPO_CATALOG_READ_BENCHMARK_SCENARIOS,\n\tSESSION_REPO_CATALOG_WRITE_BENCHMARK_SCENARIOS,\n\tSESSION_REPO_FORK_BENCHMARK_DATASETS,\n\tSESSION_REPO_FORK_WRITE_BENCHMARK_SCENARIOS,\n\ttype SessionRepoCatalogBenchmarkDataset,\n\tseedSessionRepoCatalogBenchmark,\n\tseedSessionRepoForkBenchmark,\n\tsessionRepoBenchmarkSessionId,\n} from \"./benchmark/session-repo.ts\";\nexport {\n\tgenerateStorageBenchmarkSeedTransactions,\n\tSTORAGE_READ_BENCHMARK_SCENARIOS,\n\tSTORAGE_WRITE_BENCHMARK_SCENARIOS,\n\tseedStorageBenchmark,\n} from \"./benchmark/storage.ts\";\nexport {\n\tcreateSessionRepoConformance,\n\tcreateSessionRepoForkBehaviorConformance,\n\tcreateSessionRepoForkConformance,\n\tcreateSessionRepoForkCoordinationConformance,\n\tcreateSessionRepoForkDestinationReservationConformance,\n\tcreateSessionRepoForkSourceSnapshotConformance,\n\tcreateSessionRepoLifecycleConformance,\n\tcreateSessionRepoMessageConformance,\n\tcreateSessionRepoOwnershipConformance,\n} from \"./conformance/session-repo.ts\";\nexport { createStorageConformance } from \"./conformance/storage.ts\";\nexport { CommitDiscarded, GatingStorage } from \"./gating-storage.ts\";\nexport { InstrumentedStorage } from \"./instrumented-storage.ts\";\nexport { StorageDecorator } from \"./storage-decorator.ts\";\nexport type { ConformanceCase, StorageFixture } from \"./types.ts\";\n"]}
@@ -1,2 +1,9 @@
1
- export { createSessionBackendConformance } from "./conformance.js";
1
+ export { STORAGE_BENCHMARK_DATASETS } from "./benchmark/datasets.js";
2
+ export { SESSION_REPO_CATALOG_BENCHMARK_DATASETS, SESSION_REPO_CATALOG_READ_BENCHMARK_SCENARIOS, SESSION_REPO_CATALOG_WRITE_BENCHMARK_SCENARIOS, SESSION_REPO_FORK_BENCHMARK_DATASETS, SESSION_REPO_FORK_WRITE_BENCHMARK_SCENARIOS, seedSessionRepoCatalogBenchmark, seedSessionRepoForkBenchmark, sessionRepoBenchmarkSessionId, } from "./benchmark/session-repo.js";
3
+ export { generateStorageBenchmarkSeedTransactions, STORAGE_READ_BENCHMARK_SCENARIOS, STORAGE_WRITE_BENCHMARK_SCENARIOS, seedStorageBenchmark, } from "./benchmark/storage.js";
4
+ export { createSessionRepoConformance, createSessionRepoForkBehaviorConformance, createSessionRepoForkConformance, createSessionRepoForkCoordinationConformance, createSessionRepoForkDestinationReservationConformance, createSessionRepoForkSourceSnapshotConformance, createSessionRepoLifecycleConformance, createSessionRepoMessageConformance, createSessionRepoOwnershipConformance, } from "./conformance/session-repo.js";
5
+ export { createStorageConformance } from "./conformance/storage.js";
6
+ export { CommitDiscarded, GatingStorage } from "./gating-storage.js";
7
+ export { InstrumentedStorage } from "./instrumented-storage.js";
8
+ export { StorageDecorator } from "./storage-decorator.js";
2
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/harness/session/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { createSessionBackendConformance } from \"./conformance.ts\";\nexport type {\n\tSessionBackendConformanceCase,\n\tSessionBackendFixture,\n\tSessionBackendFixtureFactory,\n} from \"./types.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/harness/session/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EACN,uCAAuC,EACvC,6CAA6C,EAC7C,8CAA8C,EAC9C,oCAAoC,EACpC,2CAA2C,EAE3C,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,GAC7B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,wCAAwC,EACxC,gCAAgC,EAChC,iCAAiC,EACjC,oBAAoB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACN,4BAA4B,EAC5B,wCAAwC,EACxC,gCAAgC,EAChC,4CAA4C,EAC5C,sDAAsD,EACtD,8CAA8C,EAC9C,qCAAqC,EACrC,mCAAmC,EACnC,qCAAqC,GACrC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["export { STORAGE_BENCHMARK_DATASETS } from \"./benchmark/datasets.ts\";\nexport {\n\tSESSION_REPO_CATALOG_BENCHMARK_DATASETS,\n\tSESSION_REPO_CATALOG_READ_BENCHMARK_SCENARIOS,\n\tSESSION_REPO_CATALOG_WRITE_BENCHMARK_SCENARIOS,\n\tSESSION_REPO_FORK_BENCHMARK_DATASETS,\n\tSESSION_REPO_FORK_WRITE_BENCHMARK_SCENARIOS,\n\ttype SessionRepoCatalogBenchmarkDataset,\n\tseedSessionRepoCatalogBenchmark,\n\tseedSessionRepoForkBenchmark,\n\tsessionRepoBenchmarkSessionId,\n} from \"./benchmark/session-repo.ts\";\nexport {\n\tgenerateStorageBenchmarkSeedTransactions,\n\tSTORAGE_READ_BENCHMARK_SCENARIOS,\n\tSTORAGE_WRITE_BENCHMARK_SCENARIOS,\n\tseedStorageBenchmark,\n} from \"./benchmark/storage.ts\";\nexport {\n\tcreateSessionRepoConformance,\n\tcreateSessionRepoForkBehaviorConformance,\n\tcreateSessionRepoForkConformance,\n\tcreateSessionRepoForkCoordinationConformance,\n\tcreateSessionRepoForkDestinationReservationConformance,\n\tcreateSessionRepoForkSourceSnapshotConformance,\n\tcreateSessionRepoLifecycleConformance,\n\tcreateSessionRepoMessageConformance,\n\tcreateSessionRepoOwnershipConformance,\n} from \"./conformance/session-repo.ts\";\nexport { createStorageConformance } from \"./conformance/storage.ts\";\nexport { CommitDiscarded, GatingStorage } from \"./gating-storage.ts\";\nexport { InstrumentedStorage } from \"./instrumented-storage.ts\";\nexport { StorageDecorator } from \"./storage-decorator.ts\";\nexport type { ConformanceCase, StorageFixture } from \"./types.ts\";\n"]}
@@ -0,0 +1,11 @@
1
+ import type { Context } from "../../context.ts";
2
+ import type { CommitResult, Write } from "../types.ts";
3
+ import { StorageDecorator } from "./storage-decorator.ts";
4
+ /** Test-only transparent Storage decorator that records commit admission. */
5
+ export declare class InstrumentedStorage extends StorageDecorator {
6
+ private readonly commitAttempts;
7
+ getCommitAttempts(): readonly Write[][];
8
+ clearCommitAttempts(): void;
9
+ commit(writes: Write[], context: Context): Promise<CommitResult>;
10
+ }
11
+ //# sourceMappingURL=instrumented-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumented-storage.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/testing/instrumented-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,6EAA6E;AAC7E,qBAAa,mBAAoB,SAAQ,gBAAgB;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,iBAAiB,IAAI,SAAS,KAAK,EAAE,EAAE,CAEtC;IAED,mBAAmB,IAAI,IAAI,CAE1B;IAEQ,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAGxE;CACD","sourcesContent":["import type { Context } from \"../../context.ts\";\nimport type { CommitResult, Write } from \"../types.ts\";\nimport { StorageDecorator } from \"./storage-decorator.ts\";\n\n/** Test-only transparent Storage decorator that records commit admission. */\nexport class InstrumentedStorage extends StorageDecorator {\n\tprivate readonly commitAttempts: Write[][] = [];\n\n\tgetCommitAttempts(): readonly Write[][] {\n\t\treturn this.commitAttempts.slice();\n\t}\n\n\tclearCommitAttempts(): void {\n\t\tthis.commitAttempts.length = 0;\n\t}\n\n\toverride commit(writes: Write[], context: Context): Promise<CommitResult> {\n\t\tthis.commitAttempts.push(writes);\n\t\treturn this.delegate.commit(writes, context);\n\t}\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import { StorageDecorator } from "./storage-decorator.js";
2
+ /** Test-only transparent Storage decorator that records commit admission. */
3
+ export class InstrumentedStorage extends StorageDecorator {
4
+ commitAttempts = [];
5
+ getCommitAttempts() {
6
+ return this.commitAttempts.slice();
7
+ }
8
+ clearCommitAttempts() {
9
+ this.commitAttempts.length = 0;
10
+ }
11
+ commit(writes, context) {
12
+ this.commitAttempts.push(writes);
13
+ return this.delegate.commit(writes, context);
14
+ }
15
+ }
16
+ //# sourceMappingURL=instrumented-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumented-storage.js","sourceRoot":"","sources":["../../../../src/harness/session/testing/instrumented-storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,6EAA6E;AAC7E,MAAM,OAAO,mBAAoB,SAAQ,gBAAgB;IACvC,cAAc,GAAc,EAAE,CAAC;IAEhD,iBAAiB,GAAuB;QACvC,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAAA,CACnC;IAED,mBAAmB,GAAS;QAC3B,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAAA,CAC/B;IAEQ,MAAM,CAAC,MAAe,EAAE,OAAgB,EAAyB;QACzE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAA,CAC7C;CACD","sourcesContent":["import type { Context } from \"../../context.ts\";\nimport type { CommitResult, Write } from \"../types.ts\";\nimport { StorageDecorator } from \"./storage-decorator.ts\";\n\n/** Test-only transparent Storage decorator that records commit admission. */\nexport class InstrumentedStorage extends StorageDecorator {\n\tprivate readonly commitAttempts: Write[][] = [];\n\n\tgetCommitAttempts(): readonly Write[][] {\n\t\treturn this.commitAttempts.slice();\n\t}\n\n\tclearCommitAttempts(): void {\n\t\tthis.commitAttempts.length = 0;\n\t}\n\n\toverride commit(writes: Write[], context: Context): Promise<CommitResult> {\n\t\tthis.commitAttempts.push(writes);\n\t\treturn this.delegate.commit(writes, context);\n\t}\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import type { Context } from "../../context.ts";
2
+ import type { CommitResult, Entry, EntryScan, EntryStructure, SessionStats, Storage, StorageBranchScan, UsageRow, UsageScan, Write } from "../types.ts";
3
+ import type { ListElement, ListReadOptions, StoredValue, Value, ValueList } from "../values.ts";
4
+ /** Test-only forwarding base for decorators that alter one part of Storage behavior. */
5
+ export declare class StorageDecorator implements Storage {
6
+ protected readonly delegate: Storage;
7
+ constructor(delegate: Storage);
8
+ commit(writes: Write[], context: Context): Promise<CommitResult>;
9
+ getEntries(ids: string[], context: Context): Promise<Map<string, Entry>>;
10
+ getValue<T>(address: Value<T>, context: Context): Promise<StoredValue<T> | undefined>;
11
+ scanValues<T>(prefix: Value<T>, context: Context): Promise<StoredValue<T>[]>;
12
+ readList<T>(address: ValueList<T>, options: ListReadOptions | undefined, context: Context): Promise<ListElement<T>[]>;
13
+ scanBranch(query: StorageBranchScan, context: Context): Promise<Entry[]>;
14
+ scanBranchStructure(query: StorageBranchScan, context: Context): Promise<EntryStructure[]>;
15
+ scanEntries(query: EntryScan, context: Context): Promise<Entry[]>;
16
+ scanUsage(query: UsageScan, context: Context): Promise<UsageRow[]>;
17
+ getStats(context: Context): Promise<SessionStats>;
18
+ close(context: Context): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=storage-decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-decorator.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/testing/storage-decorator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EACX,YAAY,EACZ,KAAK,EACL,SAAS,EACT,cAAc,EACd,YAAY,EACZ,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEhG,wFAAwF;AACxF,qBAAa,gBAAiB,YAAW,OAAO;IAC/C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAErC,YAAY,QAAQ,EAAE,OAAO,EAE5B;IAED,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAE/D;IAED,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAEvE;IAED,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAEpF;IAED,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAE3E;IAED,QAAQ,CAAC,CAAC,EACT,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EACrB,OAAO,EAAE,eAAe,GAAG,SAAS,EACpC,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAE3B;IAED,UAAU,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAEvE;IAED,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAEzF;IAED,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAEhE;IAED,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAEjE;IAED,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAEhD;IAED,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAErC;CACD","sourcesContent":["import type { Context } from \"../../context.ts\";\nimport type {\n\tCommitResult,\n\tEntry,\n\tEntryScan,\n\tEntryStructure,\n\tSessionStats,\n\tStorage,\n\tStorageBranchScan,\n\tUsageRow,\n\tUsageScan,\n\tWrite,\n} from \"../types.ts\";\nimport type { ListElement, ListReadOptions, StoredValue, Value, ValueList } from \"../values.ts\";\n\n/** Test-only forwarding base for decorators that alter one part of Storage behavior. */\nexport class StorageDecorator implements Storage {\n\tprotected readonly delegate: Storage;\n\n\tconstructor(delegate: Storage) {\n\t\tthis.delegate = delegate;\n\t}\n\n\tcommit(writes: Write[], context: Context): Promise<CommitResult> {\n\t\treturn this.delegate.commit(writes, context);\n\t}\n\n\tgetEntries(ids: string[], context: Context): Promise<Map<string, Entry>> {\n\t\treturn this.delegate.getEntries(ids, context);\n\t}\n\n\tgetValue<T>(address: Value<T>, context: Context): Promise<StoredValue<T> | undefined> {\n\t\treturn this.delegate.getValue(address, context);\n\t}\n\n\tscanValues<T>(prefix: Value<T>, context: Context): Promise<StoredValue<T>[]> {\n\t\treturn this.delegate.scanValues(prefix, context);\n\t}\n\n\treadList<T>(\n\t\taddress: ValueList<T>,\n\t\toptions: ListReadOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<ListElement<T>[]> {\n\t\treturn this.delegate.readList(address, options, context);\n\t}\n\n\tscanBranch(query: StorageBranchScan, context: Context): Promise<Entry[]> {\n\t\treturn this.delegate.scanBranch(query, context);\n\t}\n\n\tscanBranchStructure(query: StorageBranchScan, context: Context): Promise<EntryStructure[]> {\n\t\treturn this.delegate.scanBranchStructure(query, context);\n\t}\n\n\tscanEntries(query: EntryScan, context: Context): Promise<Entry[]> {\n\t\treturn this.delegate.scanEntries(query, context);\n\t}\n\n\tscanUsage(query: UsageScan, context: Context): Promise<UsageRow[]> {\n\t\treturn this.delegate.scanUsage(query, context);\n\t}\n\n\tgetStats(context: Context): Promise<SessionStats> {\n\t\treturn this.delegate.getStats(context);\n\t}\n\n\tclose(context: Context): Promise<void> {\n\t\treturn this.delegate.close(context);\n\t}\n}\n"]}
@@ -0,0 +1,41 @@
1
+ /** Test-only forwarding base for decorators that alter one part of Storage behavior. */
2
+ export class StorageDecorator {
3
+ delegate;
4
+ constructor(delegate) {
5
+ this.delegate = delegate;
6
+ }
7
+ commit(writes, context) {
8
+ return this.delegate.commit(writes, context);
9
+ }
10
+ getEntries(ids, context) {
11
+ return this.delegate.getEntries(ids, context);
12
+ }
13
+ getValue(address, context) {
14
+ return this.delegate.getValue(address, context);
15
+ }
16
+ scanValues(prefix, context) {
17
+ return this.delegate.scanValues(prefix, context);
18
+ }
19
+ readList(address, options, context) {
20
+ return this.delegate.readList(address, options, context);
21
+ }
22
+ scanBranch(query, context) {
23
+ return this.delegate.scanBranch(query, context);
24
+ }
25
+ scanBranchStructure(query, context) {
26
+ return this.delegate.scanBranchStructure(query, context);
27
+ }
28
+ scanEntries(query, context) {
29
+ return this.delegate.scanEntries(query, context);
30
+ }
31
+ scanUsage(query, context) {
32
+ return this.delegate.scanUsage(query, context);
33
+ }
34
+ getStats(context) {
35
+ return this.delegate.getStats(context);
36
+ }
37
+ close(context) {
38
+ return this.delegate.close(context);
39
+ }
40
+ }
41
+ //# sourceMappingURL=storage-decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-decorator.js","sourceRoot":"","sources":["../../../../src/harness/session/testing/storage-decorator.ts"],"names":[],"mappings":"AAeA,wFAAwF;AACxF,MAAM,OAAO,gBAAgB;IACT,QAAQ,CAAU;IAErC,YAAY,QAAiB,EAAE;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAAA,CACzB;IAED,MAAM,CAAC,MAAe,EAAE,OAAgB,EAAyB;QAChE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAA,CAC7C;IAED,UAAU,CAAC,GAAa,EAAE,OAAgB,EAA+B;QACxE,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAAA,CAC9C;IAED,QAAQ,CAAI,OAAiB,EAAE,OAAgB,EAAuC;QACrF,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAAA,CAChD;IAED,UAAU,CAAI,MAAgB,EAAE,OAAgB,EAA6B;QAC5E,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAA,CACjD;IAED,QAAQ,CACP,OAAqB,EACrB,OAAoC,EACpC,OAAgB,EACY;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAAA,CACzD;IAED,UAAU,CAAC,KAAwB,EAAE,OAAgB,EAAoB;QACxE,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAAA,CAChD;IAED,mBAAmB,CAAC,KAAwB,EAAE,OAAgB,EAA6B;QAC1F,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAAA,CACzD;IAED,WAAW,CAAC,KAAgB,EAAE,OAAgB,EAAoB;QACjE,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAAA,CACjD;IAED,SAAS,CAAC,KAAgB,EAAE,OAAgB,EAAuB;QAClE,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAAA,CAC/C;IAED,QAAQ,CAAC,OAAgB,EAAyB;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAAA,CACvC;IAED,KAAK,CAAC,OAAgB,EAAiB;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAAA,CACpC;CACD","sourcesContent":["import type { Context } from \"../../context.ts\";\nimport type {\n\tCommitResult,\n\tEntry,\n\tEntryScan,\n\tEntryStructure,\n\tSessionStats,\n\tStorage,\n\tStorageBranchScan,\n\tUsageRow,\n\tUsageScan,\n\tWrite,\n} from \"../types.ts\";\nimport type { ListElement, ListReadOptions, StoredValue, Value, ValueList } from \"../values.ts\";\n\n/** Test-only forwarding base for decorators that alter one part of Storage behavior. */\nexport class StorageDecorator implements Storage {\n\tprotected readonly delegate: Storage;\n\n\tconstructor(delegate: Storage) {\n\t\tthis.delegate = delegate;\n\t}\n\n\tcommit(writes: Write[], context: Context): Promise<CommitResult> {\n\t\treturn this.delegate.commit(writes, context);\n\t}\n\n\tgetEntries(ids: string[], context: Context): Promise<Map<string, Entry>> {\n\t\treturn this.delegate.getEntries(ids, context);\n\t}\n\n\tgetValue<T>(address: Value<T>, context: Context): Promise<StoredValue<T> | undefined> {\n\t\treturn this.delegate.getValue(address, context);\n\t}\n\n\tscanValues<T>(prefix: Value<T>, context: Context): Promise<StoredValue<T>[]> {\n\t\treturn this.delegate.scanValues(prefix, context);\n\t}\n\n\treadList<T>(\n\t\taddress: ValueList<T>,\n\t\toptions: ListReadOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<ListElement<T>[]> {\n\t\treturn this.delegate.readList(address, options, context);\n\t}\n\n\tscanBranch(query: StorageBranchScan, context: Context): Promise<Entry[]> {\n\t\treturn this.delegate.scanBranch(query, context);\n\t}\n\n\tscanBranchStructure(query: StorageBranchScan, context: Context): Promise<EntryStructure[]> {\n\t\treturn this.delegate.scanBranchStructure(query, context);\n\t}\n\n\tscanEntries(query: EntryScan, context: Context): Promise<Entry[]> {\n\t\treturn this.delegate.scanEntries(query, context);\n\t}\n\n\tscanUsage(query: UsageScan, context: Context): Promise<UsageRow[]> {\n\t\treturn this.delegate.scanUsage(query, context);\n\t}\n\n\tgetStats(context: Context): Promise<SessionStats> {\n\t\treturn this.delegate.getStats(context);\n\t}\n\n\tclose(context: Context): Promise<void> {\n\t\treturn this.delegate.close(context);\n\t}\n}\n"]}
@@ -1,12 +1,10 @@
1
- import type { SessionRepo } from "../types.ts";
2
- /** A fresh backend instance owned by one conformance case. */
3
- export interface SessionBackendFixture extends AsyncDisposable {
4
- readonly repository: SessionRepo;
1
+ import type { Storage } from "../types.ts";
2
+ /** A fresh backend storage instance owned by one test or benchmark case. */
3
+ export interface StorageFixture extends AsyncDisposable {
4
+ readonly storage: Storage;
5
5
  }
6
- /** Creates an isolated fixture for one conformance case. */
7
- export type SessionBackendFixtureFactory = () => Promise<SessionBackendFixture>;
8
6
  /** A runner-independent conformance case that can be registered with any test framework. */
9
- export interface SessionBackendConformanceCase {
7
+ export interface ConformanceCase {
10
8
  readonly group: string;
11
9
  readonly name: string;
12
10
  run(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/testing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,8DAA8D;AAC9D,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC7D,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;CACjC;AAED,4DAA4D;AAC5D,MAAM,MAAM,4BAA4B,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEhF,4FAA4F;AAC5F,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB","sourcesContent":["import type { SessionRepo } from \"../types.ts\";\n\n/** A fresh backend instance owned by one conformance case. */\nexport interface SessionBackendFixture extends AsyncDisposable {\n\treadonly repository: SessionRepo;\n}\n\n/** Creates an isolated fixture for one conformance case. */\nexport type SessionBackendFixtureFactory = () => Promise<SessionBackendFixture>;\n\n/** A runner-independent conformance case that can be registered with any test framework. */\nexport interface SessionBackendConformanceCase {\n\treadonly group: string;\n\treadonly name: string;\n\trun(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/testing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,4EAA4E;AAC5E,MAAM,WAAW,cAAe,SAAQ,eAAe;IACtD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;AAED,4FAA4F;AAC5F,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB","sourcesContent":["import type { Storage } from \"../types.ts\";\n\n/** A fresh backend storage instance owned by one test or benchmark case. */\nexport interface StorageFixture extends AsyncDisposable {\n\treadonly storage: Storage;\n}\n\n/** A runner-independent conformance case that can be registered with any test framework. */\nexport interface ConformanceCase {\n\treadonly group: string;\n\treadonly name: string;\n\trun(): Promise<void>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/harness/session/testing/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SessionRepo } from \"../types.ts\";\n\n/** A fresh backend instance owned by one conformance case. */\nexport interface SessionBackendFixture extends AsyncDisposable {\n\treadonly repository: SessionRepo;\n}\n\n/** Creates an isolated fixture for one conformance case. */\nexport type SessionBackendFixtureFactory = () => Promise<SessionBackendFixture>;\n\n/** A runner-independent conformance case that can be registered with any test framework. */\nexport interface SessionBackendConformanceCase {\n\treadonly group: string;\n\treadonly name: string;\n\trun(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/harness/session/testing/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Storage } from \"../types.ts\";\n\n/** A fresh backend storage instance owned by one test or benchmark case. */\nexport interface StorageFixture extends AsyncDisposable {\n\treadonly storage: Storage;\n}\n\n/** A runner-independent conformance case that can be registered with any test framework. */\nexport interface ConformanceCase {\n\treadonly group: string;\n\treadonly name: string;\n\trun(): Promise<void>;\n}\n"]}