@code-yeongyu/senpi-agent-core 2026.9.12 → 2026.9.13

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 (344) hide show
  1. package/README.md +4 -0
  2. package/dist/harness/agent-harness.d.ts +639 -384
  3. package/dist/harness/agent-harness.d.ts.map +1 -1
  4. package/dist/harness/agent-harness.js +5 -250
  5. package/dist/harness/agent-harness.js.map +1 -1
  6. package/dist/harness/compaction/branch-summarization.d.ts +12 -6
  7. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  8. package/dist/harness/compaction/branch-summarization.js +33 -27
  9. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  10. package/dist/harness/compaction/compaction.d.ts +30 -8
  11. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  12. package/dist/harness/compaction/compaction.js +53 -64
  13. package/dist/harness/compaction/compaction.js.map +1 -1
  14. package/dist/harness/config.d.ts +9 -0
  15. package/dist/harness/config.d.ts.map +1 -0
  16. package/dist/harness/config.js +35 -0
  17. package/dist/harness/config.js.map +1 -0
  18. package/dist/harness/context.d.ts +9 -0
  19. package/dist/harness/context.d.ts.map +1 -0
  20. package/dist/harness/context.js +13 -0
  21. package/dist/harness/context.js.map +1 -0
  22. package/dist/harness/env/nodejs.d.ts +25 -28
  23. package/dist/harness/env/nodejs.d.ts.map +1 -1
  24. package/dist/harness/env/nodejs.js +368 -125
  25. package/dist/harness/env/nodejs.js.map +1 -1
  26. package/dist/harness/events.d.ts +20 -38
  27. package/dist/harness/events.d.ts.map +1 -1
  28. package/dist/harness/events.js +233 -55
  29. package/dist/harness/events.js.map +1 -1
  30. package/dist/harness/execution/assistant.d.ts +42 -0
  31. package/dist/harness/execution/assistant.d.ts.map +1 -0
  32. package/dist/harness/execution/assistant.js +82 -0
  33. package/dist/harness/execution/assistant.js.map +1 -0
  34. package/dist/harness/execution/effect-gate.d.ts +22 -0
  35. package/dist/harness/execution/effect-gate.d.ts.map +1 -0
  36. package/dist/harness/execution/effect-gate.js +48 -0
  37. package/dist/harness/execution/effect-gate.js.map +1 -0
  38. package/dist/harness/execution/tools.d.ts +67 -0
  39. package/dist/harness/execution/tools.d.ts.map +1 -0
  40. package/dist/harness/execution/tools.js +121 -0
  41. package/dist/harness/execution/tools.js.map +1 -0
  42. package/dist/harness/hooks.d.ts +38 -0
  43. package/dist/harness/hooks.d.ts.map +1 -0
  44. package/dist/harness/hooks.js +404 -0
  45. package/dist/harness/hooks.js.map +1 -0
  46. package/dist/harness/messages.d.ts +2 -2
  47. package/dist/harness/messages.d.ts.map +1 -1
  48. package/dist/harness/messages.js.map +1 -1
  49. package/dist/harness/prompt-templates.d.ts +3 -2
  50. package/dist/harness/prompt-templates.d.ts.map +1 -1
  51. package/dist/harness/prompt-templates.js +17 -17
  52. package/dist/harness/prompt-templates.js.map +1 -1
  53. package/dist/harness/result.d.ts +93 -0
  54. package/dist/harness/result.d.ts.map +1 -1
  55. package/dist/harness/result.js +39 -0
  56. package/dist/harness/result.js.map +1 -1
  57. package/dist/harness/runtime/drive/boundary.d.ts +28 -0
  58. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
  59. package/dist/harness/runtime/drive/boundary.js +173 -0
  60. package/dist/harness/runtime/drive/boundary.js.map +1 -0
  61. package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
  62. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
  63. package/dist/harness/runtime/drive/checkpoint.js +133 -0
  64. package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
  65. package/dist/harness/runtime/drive/deferred.d.ts +15 -0
  66. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
  67. package/dist/harness/runtime/drive/deferred.js +179 -0
  68. package/dist/harness/runtime/drive/deferred.js.map +1 -0
  69. package/dist/harness/runtime/drive/generation.d.ts +8 -0
  70. package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
  71. package/dist/harness/runtime/drive/generation.js +205 -0
  72. package/dist/harness/runtime/drive/generation.js.map +1 -0
  73. package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
  74. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
  75. package/dist/harness/runtime/drive/reconcile.js +140 -0
  76. package/dist/harness/runtime/drive/reconcile.js.map +1 -0
  77. package/dist/harness/runtime/drive/recovery.d.ts +8 -0
  78. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
  79. package/dist/harness/runtime/drive/recovery.js +85 -0
  80. package/dist/harness/runtime/drive/recovery.js.map +1 -0
  81. package/dist/harness/runtime/drive/response.d.ts +23 -0
  82. package/dist/harness/runtime/drive/response.d.ts.map +1 -0
  83. package/dist/harness/runtime/drive/response.js +394 -0
  84. package/dist/harness/runtime/drive/response.js.map +1 -0
  85. package/dist/harness/runtime/drive/retry.d.ts +4 -0
  86. package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
  87. package/dist/harness/runtime/drive/retry.js +34 -0
  88. package/dist/harness/runtime/drive/retry.js.map +1 -0
  89. package/dist/harness/runtime/drive/structural.d.ts +32 -0
  90. package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
  91. package/dist/harness/runtime/drive/structural.js +929 -0
  92. package/dist/harness/runtime/drive/structural.js.map +1 -0
  93. package/dist/harness/runtime/drive/terminal.d.ts +7 -0
  94. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
  95. package/dist/harness/runtime/drive/terminal.js +49 -0
  96. package/dist/harness/runtime/drive/terminal.js.map +1 -0
  97. package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
  98. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
  99. package/dist/harness/runtime/drive/tool-placement.js +244 -0
  100. package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
  101. package/dist/harness/runtime/drive/tools.d.ts +6 -0
  102. package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
  103. package/dist/harness/runtime/drive/tools.js +449 -0
  104. package/dist/harness/runtime/drive/tools.js.map +1 -0
  105. package/dist/harness/runtime/drive.d.ts +6 -0
  106. package/dist/harness/runtime/drive.d.ts.map +1 -0
  107. package/dist/harness/runtime/drive.js +93 -0
  108. package/dist/harness/runtime/drive.js.map +1 -0
  109. package/dist/harness/runtime/harness.d.ts +59 -0
  110. package/dist/harness/runtime/harness.d.ts.map +1 -0
  111. package/dist/harness/runtime/harness.js +302 -0
  112. package/dist/harness/runtime/harness.js.map +1 -0
  113. package/dist/harness/runtime/index.d.ts +2 -0
  114. package/dist/harness/runtime/index.d.ts.map +1 -0
  115. package/dist/harness/runtime/index.js +2 -0
  116. package/dist/harness/runtime/index.js.map +1 -0
  117. package/dist/harness/runtime/lane.d.ts +118 -0
  118. package/dist/harness/runtime/lane.d.ts.map +1 -0
  119. package/dist/harness/runtime/lane.js +1559 -0
  120. package/dist/harness/runtime/lane.js.map +1 -0
  121. package/dist/harness/runtime/progress.d.ts +15 -0
  122. package/dist/harness/runtime/progress.d.ts.map +1 -0
  123. package/dist/harness/runtime/progress.js +66 -0
  124. package/dist/harness/runtime/progress.js.map +1 -0
  125. package/dist/harness/runtime/reducer.d.ts +5 -0
  126. package/dist/harness/runtime/reducer.d.ts.map +1 -0
  127. package/dist/harness/runtime/reducer.js +240 -0
  128. package/dist/harness/runtime/reducer.js.map +1 -0
  129. package/dist/harness/runtime/restore.d.ts +24 -0
  130. package/dist/harness/runtime/restore.d.ts.map +1 -0
  131. package/dist/harness/runtime/restore.js +117 -0
  132. package/dist/harness/runtime/restore.js.map +1 -0
  133. package/dist/harness/runtime/transcript.d.ts +21 -0
  134. package/dist/harness/runtime/transcript.d.ts.map +1 -0
  135. package/dist/harness/runtime/transcript.js +72 -0
  136. package/dist/harness/runtime/transcript.js.map +1 -0
  137. package/dist/harness/runtime/types.d.ts +105 -0
  138. package/dist/harness/runtime/types.d.ts.map +1 -0
  139. package/dist/harness/runtime/types.js +50 -0
  140. package/dist/harness/runtime/types.js.map +1 -0
  141. package/dist/harness/session/commit.d.ts +53 -0
  142. package/dist/harness/session/commit.d.ts.map +1 -0
  143. package/dist/harness/session/commit.js +57 -0
  144. package/dist/harness/session/commit.js.map +1 -0
  145. package/dist/harness/session/context.d.ts +6 -19
  146. package/dist/harness/session/context.d.ts.map +1 -1
  147. package/dist/harness/session/context.js +31 -53
  148. package/dist/harness/session/context.js.map +1 -1
  149. package/dist/harness/session/fork-policy.d.ts +21 -0
  150. package/dist/harness/session/fork-policy.d.ts.map +1 -0
  151. package/dist/harness/session/fork-policy.js +55 -0
  152. package/dist/harness/session/fork-policy.js.map +1 -0
  153. package/dist/harness/session/fork.d.ts +16 -0
  154. package/dist/harness/session/fork.d.ts.map +1 -0
  155. package/dist/harness/session/fork.js +79 -0
  156. package/dist/harness/session/fork.js.map +1 -0
  157. package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
  158. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
  159. package/dist/harness/session/in-memory-storage-state.js +269 -0
  160. package/dist/harness/session/in-memory-storage-state.js.map +1 -0
  161. package/dist/harness/session/index.d.ts +9 -5
  162. package/dist/harness/session/index.d.ts.map +1 -1
  163. package/dist/harness/session/index.js +7 -4
  164. package/dist/harness/session/index.js.map +1 -1
  165. package/dist/harness/session/jsonl/codec.d.ts +19 -8
  166. package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
  167. package/dist/harness/session/jsonl/codec.js +34 -219
  168. package/dist/harness/session/jsonl/codec.js.map +1 -1
  169. package/dist/harness/session/jsonl/fork.d.ts +38 -0
  170. package/dist/harness/session/jsonl/fork.d.ts.map +1 -0
  171. package/dist/harness/session/jsonl/fork.js +266 -0
  172. package/dist/harness/session/jsonl/fork.js.map +1 -0
  173. package/dist/harness/session/jsonl/index.d.ts +4 -0
  174. package/dist/harness/session/jsonl/index.d.ts.map +1 -0
  175. package/dist/harness/session/jsonl/index.js +4 -0
  176. package/dist/harness/session/jsonl/index.js.map +1 -0
  177. package/dist/harness/session/jsonl/io.d.ts +14 -0
  178. package/dist/harness/session/jsonl/io.d.ts.map +1 -0
  179. package/dist/harness/session/jsonl/io.js +86 -0
  180. package/dist/harness/session/jsonl/io.js.map +1 -0
  181. package/dist/harness/session/jsonl/legacy-v3.d.ts +44 -0
  182. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
  183. package/dist/harness/session/jsonl/legacy-v3.js +454 -0
  184. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
  185. package/dist/harness/session/jsonl/repo.d.ts +27 -24
  186. package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  187. package/dist/harness/session/jsonl/repo.js +276 -151
  188. package/dist/harness/session/jsonl/repo.js.map +1 -1
  189. package/dist/harness/session/jsonl/storage.d.ts +39 -41
  190. package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  191. package/dist/harness/session/jsonl/storage.js +175 -196
  192. package/dist/harness/session/jsonl/storage.js.map +1 -1
  193. package/dist/harness/session/jsonl/types.d.ts +23 -22
  194. package/dist/harness/session/jsonl/types.d.ts.map +1 -1
  195. package/dist/harness/session/jsonl/types.js +2 -1
  196. package/dist/harness/session/jsonl/types.js.map +1 -1
  197. package/dist/harness/session/memory.d.ts +44 -40
  198. package/dist/harness/session/memory.d.ts.map +1 -1
  199. package/dist/harness/session/memory.js +333 -115
  200. package/dist/harness/session/memory.js.map +1 -1
  201. package/dist/harness/session/mutation-line.d.ts +8 -0
  202. package/dist/harness/session/mutation-line.d.ts.map +1 -0
  203. package/dist/harness/session/mutation-line.js +22 -0
  204. package/dist/harness/session/mutation-line.js.map +1 -0
  205. package/dist/harness/session/session.d.ts +78 -51
  206. package/dist/harness/session/session.d.ts.map +1 -1
  207. package/dist/harness/session/session.js +327 -207
  208. package/dist/harness/session/session.js.map +1 -1
  209. package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
  210. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
  211. package/dist/harness/session/testing/benchmark/datasets.js +24 -0
  212. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
  213. package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
  214. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
  215. package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
  216. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
  217. package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
  218. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
  219. package/dist/harness/session/testing/benchmark/storage.js +114 -0
  220. package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
  221. package/dist/harness/session/testing/conformance/session-repo.d.ts +23 -0
  222. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
  223. package/dist/harness/session/testing/conformance/session-repo.js +809 -0
  224. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
  225. package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
  226. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
  227. package/dist/harness/session/testing/conformance/storage.js +600 -0
  228. package/dist/harness/session/testing/conformance/storage.js.map +1 -0
  229. package/dist/harness/session/testing/gating-storage.d.ts +26 -0
  230. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
  231. package/dist/harness/session/testing/gating-storage.js +103 -0
  232. package/dist/harness/session/testing/gating-storage.js.map +1 -0
  233. package/dist/harness/session/testing/index.d.ts +9 -2
  234. package/dist/harness/session/testing/index.d.ts.map +1 -1
  235. package/dist/harness/session/testing/index.js +8 -1
  236. package/dist/harness/session/testing/index.js.map +1 -1
  237. package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
  238. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
  239. package/dist/harness/session/testing/instrumented-storage.js +19 -0
  240. package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
  241. package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
  242. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
  243. package/dist/harness/session/testing/storage-decorator.js +40 -0
  244. package/dist/harness/session/testing/storage-decorator.js.map +1 -0
  245. package/dist/harness/session/testing/types.d.ts +5 -7
  246. package/dist/harness/session/testing/types.d.ts.map +1 -1
  247. package/dist/harness/session/testing/types.js.map +1 -1
  248. package/dist/harness/session/types.d.ts +425 -265
  249. package/dist/harness/session/types.d.ts.map +1 -1
  250. package/dist/harness/session/types.js +7 -7
  251. package/dist/harness/session/types.js.map +1 -1
  252. package/dist/harness/session/values.d.ts +95 -0
  253. package/dist/harness/session/values.d.ts.map +1 -0
  254. package/dist/harness/session/values.js +81 -0
  255. package/dist/harness/session/values.js.map +1 -0
  256. package/dist/harness/skills.d.ts +3 -2
  257. package/dist/harness/skills.d.ts.map +1 -1
  258. package/dist/harness/skills.js +29 -26
  259. package/dist/harness/skills.js.map +1 -1
  260. package/dist/harness/telemetry.d.ts +64 -43
  261. package/dist/harness/telemetry.d.ts.map +1 -1
  262. package/dist/harness/telemetry.js +45 -26
  263. package/dist/harness/telemetry.js.map +1 -1
  264. package/dist/harness/tools/bash.d.ts +4 -4
  265. package/dist/harness/tools/bash.d.ts.map +1 -1
  266. package/dist/harness/tools/bash.js +66 -93
  267. package/dist/harness/tools/bash.js.map +1 -1
  268. package/dist/harness/tools/edit.d.ts.map +1 -1
  269. package/dist/harness/tools/edit.js +17 -13
  270. package/dist/harness/tools/edit.js.map +1 -1
  271. package/dist/harness/tools/file-mutation-queue.d.ts +2 -1
  272. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  273. package/dist/harness/tools/file-mutation-queue.js +5 -5
  274. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  275. package/dist/harness/tools/path-utils.d.ts +3 -2
  276. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  277. package/dist/harness/tools/path-utils.js +5 -5
  278. package/dist/harness/tools/path-utils.js.map +1 -1
  279. package/dist/harness/tools/read.d.ts +2 -1
  280. package/dist/harness/tools/read.d.ts.map +1 -1
  281. package/dist/harness/tools/read.js +4 -6
  282. package/dist/harness/tools/read.js.map +1 -1
  283. package/dist/harness/tools/write.d.ts.map +1 -1
  284. package/dist/harness/tools/write.js +12 -8
  285. package/dist/harness/tools/write.js.map +1 -1
  286. package/dist/harness/types.d.ts +128 -45
  287. package/dist/harness/types.d.ts.map +1 -1
  288. package/dist/harness/types.js.map +1 -1
  289. package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
  290. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
  291. package/dist/harness/utils/adaptive-publisher.js +79 -0
  292. package/dist/harness/utils/adaptive-publisher.js.map +1 -0
  293. package/dist/harness/utils/output-capture.d.ts +31 -0
  294. package/dist/harness/utils/output-capture.d.ts.map +1 -0
  295. package/dist/harness/utils/output-capture.js +217 -0
  296. package/dist/harness/utils/output-capture.js.map +1 -0
  297. package/dist/harness/utils/shell-output.d.ts +19 -5
  298. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  299. package/dist/harness/utils/shell-output.js +65 -192
  300. package/dist/harness/utils/shell-output.js.map +1 -1
  301. package/dist/harness/utils/truncate.d.ts +1 -0
  302. package/dist/harness/utils/truncate.d.ts.map +1 -1
  303. package/dist/harness/utils/truncate.js +1 -1
  304. package/dist/harness/utils/truncate.js.map +1 -1
  305. package/dist/harness/utils/usage.d.ts +4 -0
  306. package/dist/harness/utils/usage.d.ts.map +1 -0
  307. package/dist/harness/utils/usage.js +33 -0
  308. package/dist/harness/utils/usage.js.map +1 -0
  309. package/dist/index.d.ts +4 -1
  310. package/dist/index.d.ts.map +1 -1
  311. package/dist/index.js +3 -6
  312. package/dist/index.js.map +1 -1
  313. package/dist/search/index.d.ts +24 -16
  314. package/dist/search/index.d.ts.map +1 -1
  315. package/dist/search/index.js +1 -1
  316. package/dist/search/index.js.map +1 -1
  317. package/dist/types.d.ts +2 -0
  318. package/dist/types.d.ts.map +1 -1
  319. package/dist/types.js.map +1 -1
  320. package/package.json +27 -6
  321. package/dist/harness/reducer.d.ts +0 -100
  322. package/dist/harness/reducer.d.ts.map +0 -1
  323. package/dist/harness/reducer.js +0 -420
  324. package/dist/harness/reducer.js.map +0 -1
  325. package/dist/harness/session/jsonl/errors.d.ts +0 -9
  326. package/dist/harness/session/jsonl/errors.d.ts.map +0 -1
  327. package/dist/harness/session/jsonl/errors.js +0 -18
  328. package/dist/harness/session/jsonl/errors.js.map +0 -1
  329. package/dist/harness/session/jsonl.d.ts +0 -3
  330. package/dist/harness/session/jsonl.d.ts.map +0 -1
  331. package/dist/harness/session/jsonl.js +0 -2
  332. package/dist/harness/session/jsonl.js.map +0 -1
  333. package/dist/harness/session/state.d.ts +0 -65
  334. package/dist/harness/session/state.d.ts.map +0 -1
  335. package/dist/harness/session/state.js +0 -320
  336. package/dist/harness/session/state.js.map +0 -1
  337. package/dist/harness/session/testing/conformance.d.ts +0 -4
  338. package/dist/harness/session/testing/conformance.d.ts.map +0 -1
  339. package/dist/harness/session/testing/conformance.js +0 -762
  340. package/dist/harness/session/testing/conformance.js.map +0 -1
  341. package/dist/search/scanning.d.ts +0 -29
  342. package/dist/search/scanning.d.ts.map +0 -1
  343. package/dist/search/scanning.js +0 -103
  344. 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;IAErB,OAAO;QACN,KAAK;QACL,IAAI;QACJ,KAAK,CAAC,GAAG;;;gBACR,MAAY,OAAO,kCAAG,MAAM,OAAO,EAAE,OAAA,CAAC;gBACtC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;;;;;;;;;;;QACrB,CAAC;KACD,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,MAAc,EAAE,OAAO,GAAkD,EAAE;IACxG,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;AACH,CAAC;AAED,SAAS,SAAS;IACjB,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;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAU,EAAE,QAAQ,GAAkB,IAAI,EAAE,IAAI,GAAG,EAAE;IACvE,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;AACH,CAAC;AAED,SAAS,WAAW,CACnB,EAAU,EACV,QAAuB,EACvB,UAAU,GAAG,MAAM,EACnB,IAAI,GAAwB,EAAE,EAAE,EAAE;IAElC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe,CAAC,EAAU,EAAE,QAAuB;IAC3D,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;AACH,CAAC;AAED,iHAAiH;AACjH,SAAS,GAAG,CAAC,OAA4C;IACxD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAyB;IAC1D,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;AACF,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAgB,EAAE,MAAoB;IACtE,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,wBAAwB,CAAC,OAAsC;IAC9E,OAAO;QACN,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,gDAAgD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC3G,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;QACJ,CAAC,CAAC;QAEF,UAAU,CACT,OAAO,EACP,cAAc,EACd,uDAAuD,EACvD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QAC9E,CAAC,CACD;QAED,UAAU,CACT,OAAO,EACP,cAAc,EACd,mEAAmE,EACnE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACpG,CAAC,CACD;QAED,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,kDAAkD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7G,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;QACH,CAAC,CAAC;QAEF,UAAU,CACT,OAAO,EACP,cAAc,EACd,6DAA6D,EAC7D,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACjG,CAAC,CACD;QAED,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,oDAAoD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC/G,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;QACJ,CAAC,CAAC;QAEF,UAAU,CACT,OAAO,EACP,QAAQ,EACR,kEAAkE,EAClE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACzF,CAAC,CACD;QAED,UAAU,CACT,OAAO,EACP,QAAQ,EACR,mEAAmE,EACnE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACzF,CAAC,CACD;QAED,UAAU,CACT,OAAO,EACP,QAAQ,EACR,6DAA6D,EAC7D,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACJ,CAAC,CACD;QAED,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,0DAA0D,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC9G,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;QACH,CAAC,CAAC;QAEF,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,mDAAmD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACvG,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;QACH,CAAC,CAAC;QAEF,UAAU,CACT,OAAO,EACP,OAAO,EACP,wEAAwE,EACxE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACpF,CAAC,CACD;QAED,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,6CAA6C,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACzG,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;QACH,CAAC,CAAC;QAEF,UAAU,CACT,OAAO,EACP,eAAe,EACf,wEAAwE,EACxE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACJ,CAAC,CACD;QAED,UAAU,CACT,OAAO,EACP,gBAAgB,EAChB,wDAAwD,EACxD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QAC7E,CAAC,CACD;QAED,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,iDAAiD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC9G,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;QACH,CAAC,CAAC;QAEF,UAAU,CACT,OAAO,EACP,gBAAgB,EAChB,mDAAmD,EACnD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACtF,CAAC,CACD;QAED,UAAU,CACT,OAAO,EACP,iBAAiB,EACjB,iEAAiE,EACjE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACH,CAAC,CACD;QAED,UAAU,CACT,OAAO,EACP,iBAAiB,EACjB,sDAAsD,EACtD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACJ,CAAC,CACD;QAED,UAAU,CACT,OAAO,EACP,eAAe,EACf,oDAAoD,EACpD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QAC5G,CAAC,CACD;QAED,UAAU,CACT,OAAO,EACP,WAAW,EACX,mEAAmE,EACnE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACrB,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;QACvD,CAAC,CACD;KACD,CAAC;AACH,CAAC","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"}
@@ -0,0 +1,103 @@
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
+ constructor() {
12
+ super(...arguments);
13
+ this.armed = false;
14
+ this.discarded = false;
15
+ this.queue = [];
16
+ this.waiters = [];
17
+ }
18
+ /** Fixture setup bypasses gating until explicitly armed. */
19
+ arm() {
20
+ this.armed = true;
21
+ }
22
+ pending() {
23
+ return this.queue.length;
24
+ }
25
+ /** Wait until at least `count` commits are parked. */
26
+ waitPending(count = 1) {
27
+ if (!Number.isSafeInteger(count) || count < 1) {
28
+ return Promise.reject(new RangeError("Pending commit count must be a positive safe integer"));
29
+ }
30
+ if (this.discarded)
31
+ return Promise.reject(new CommitDiscarded("storage discarded"));
32
+ if (this.queue.length >= count)
33
+ return Promise.resolve();
34
+ return new Promise((resolve, reject) => {
35
+ this.waiters.push({ count, resolve, reject });
36
+ });
37
+ }
38
+ async commit(writes, context) {
39
+ if (this.discarded)
40
+ throw new CommitDiscarded("commit rejected: storage discarded");
41
+ if (!this.armed)
42
+ return super.commit(writes, context);
43
+ let landed;
44
+ let lost;
45
+ const landing = new Promise((resolve, reject) => {
46
+ landed = resolve;
47
+ lost = reject;
48
+ });
49
+ void landing.catch(() => { });
50
+ const released = new Promise((resolve, reject) => {
51
+ this.queue.push({ release: resolve, drop: reject, landing });
52
+ });
53
+ this.notifyWaiters();
54
+ try {
55
+ await released;
56
+ if (this.discarded)
57
+ throw new CommitDiscarded("commit rejected: storage discarded");
58
+ const result = await super.commit(writes, context);
59
+ landed();
60
+ return result;
61
+ }
62
+ catch (error) {
63
+ const normalized = error instanceof Error ? error : new Error(String(error));
64
+ lost(normalized);
65
+ throw error;
66
+ }
67
+ }
68
+ /** Release `count` commits in FIFO order and wait until each write lands. */
69
+ async next(count = 1) {
70
+ if (!Number.isSafeInteger(count) || count < 1) {
71
+ throw new RangeError("Released commit count must be a positive safe integer");
72
+ }
73
+ for (let index = 0; index < count; index++) {
74
+ await this.waitPending();
75
+ const parked = this.queue.shift();
76
+ if (parked === undefined)
77
+ throw new Error("No parked commit");
78
+ parked.release();
79
+ await parked.landing;
80
+ }
81
+ }
82
+ /** Drop parked commits and permanently reject every later commit. */
83
+ discard() {
84
+ if (this.discarded)
85
+ return;
86
+ this.discarded = true;
87
+ const error = new CommitDiscarded("commit discarded");
88
+ for (const parked of this.queue.splice(0))
89
+ parked.drop(error);
90
+ for (const waiter of this.waiters.splice(0))
91
+ waiter.reject(error);
92
+ }
93
+ notifyWaiters() {
94
+ for (let index = this.waiters.length - 1; index >= 0; index--) {
95
+ const waiter = this.waiters[index];
96
+ if (this.queue.length < waiter.count)
97
+ continue;
98
+ this.waiters.splice(index, 1);
99
+ waiter.resolve();
100
+ }
101
+ }
102
+ }
103
+ //# 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, createSessionRepoStreamingForkConformance, } 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"}
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,EACrC,yCAAyC,GACzC,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"}
@@ -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, createSessionRepoStreamingForkConformance, } 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,EACrC,yCAAyC,GACzC,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\tcreateSessionRepoStreamingForkConformance,\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"}
@@ -0,0 +1,19 @@
1
+ import { StorageDecorator } from "./storage-decorator.js";
2
+ /** Test-only transparent Storage decorator that records commit admission. */
3
+ export class InstrumentedStorage extends StorageDecorator {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.commitAttempts = [];
7
+ }
8
+ getCommitAttempts() {
9
+ return this.commitAttempts.slice();
10
+ }
11
+ clearCommitAttempts() {
12
+ this.commitAttempts.length = 0;
13
+ }
14
+ commit(writes, context) {
15
+ this.commitAttempts.push(writes);
16
+ return this.delegate.commit(writes, context);
17
+ }
18
+ }
19
+ //# 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;IAAzD;;QACkB,mBAAc,GAAc,EAAE,CAAC;IAcjD,CAAC;IAZA,iBAAiB;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAED,mBAAmB;QAClB,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;IAEQ,MAAM,CAAC,MAAe,EAAE,OAAgB;QAChD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;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"}
@@ -0,0 +1,40 @@
1
+ /** Test-only forwarding base for decorators that alter one part of Storage behavior. */
2
+ export class StorageDecorator {
3
+ constructor(delegate) {
4
+ this.delegate = delegate;
5
+ }
6
+ commit(writes, context) {
7
+ return this.delegate.commit(writes, context);
8
+ }
9
+ getEntries(ids, context) {
10
+ return this.delegate.getEntries(ids, context);
11
+ }
12
+ getValue(address, context) {
13
+ return this.delegate.getValue(address, context);
14
+ }
15
+ scanValues(prefix, context) {
16
+ return this.delegate.scanValues(prefix, context);
17
+ }
18
+ readList(address, options, context) {
19
+ return this.delegate.readList(address, options, context);
20
+ }
21
+ scanBranch(query, context) {
22
+ return this.delegate.scanBranch(query, context);
23
+ }
24
+ scanBranchStructure(query, context) {
25
+ return this.delegate.scanBranchStructure(query, context);
26
+ }
27
+ scanEntries(query, context) {
28
+ return this.delegate.scanEntries(query, context);
29
+ }
30
+ scanUsage(query, context) {
31
+ return this.delegate.scanUsage(query, context);
32
+ }
33
+ getStats(context) {
34
+ return this.delegate.getStats(context);
35
+ }
36
+ close(context) {
37
+ return this.delegate.close(context);
38
+ }
39
+ }
40
+ //# 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;IAG5B,YAAY,QAAiB;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,MAAe,EAAE,OAAgB;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,UAAU,CAAC,GAAa,EAAE,OAAgB;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,QAAQ,CAAI,OAAiB,EAAE,OAAgB;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,UAAU,CAAI,MAAgB,EAAE,OAAgB;QAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,QAAQ,CACP,OAAqB,EACrB,OAAoC,EACpC,OAAgB;QAEhB,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,UAAU,CAAC,KAAwB,EAAE,OAAgB;QACpD,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,mBAAmB,CAAC,KAAwB,EAAE,OAAgB;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,WAAW,CAAC,KAAgB,EAAE,OAAgB;QAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,SAAS,CAAC,KAAgB,EAAE,OAAgB;QAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,QAAQ,CAAC,OAAgB;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,OAAgB;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;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"}
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"}
@@ -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"]}