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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/README.md +4 -0
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +32 -25
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/harness/agent-harness.d.ts +639 -384
  6. package/dist/harness/agent-harness.d.ts.map +1 -1
  7. package/dist/harness/agent-harness.js +5 -251
  8. package/dist/harness/agent-harness.js.map +1 -1
  9. package/dist/harness/compaction/branch-summarization.d.ts +12 -6
  10. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  11. package/dist/harness/compaction/branch-summarization.js +33 -26
  12. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  13. package/dist/harness/compaction/compaction.d.ts +30 -8
  14. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  15. package/dist/harness/compaction/compaction.js +53 -63
  16. package/dist/harness/compaction/compaction.js.map +1 -1
  17. package/dist/harness/config.d.ts +9 -0
  18. package/dist/harness/config.d.ts.map +1 -0
  19. package/dist/harness/config.js +27 -0
  20. package/dist/harness/config.js.map +1 -0
  21. package/dist/harness/context.d.ts +9 -0
  22. package/dist/harness/context.d.ts.map +1 -0
  23. package/dist/harness/context.js +13 -0
  24. package/dist/harness/context.js.map +1 -0
  25. package/dist/harness/env/nodejs.d.ts +24 -28
  26. package/dist/harness/env/nodejs.d.ts.map +1 -1
  27. package/dist/harness/env/nodejs.js +242 -87
  28. package/dist/harness/env/nodejs.js.map +1 -1
  29. package/dist/harness/events.d.ts +20 -38
  30. package/dist/harness/events.d.ts.map +1 -1
  31. package/dist/harness/events.js +240 -55
  32. package/dist/harness/events.js.map +1 -1
  33. package/dist/harness/execution/assistant.d.ts +42 -0
  34. package/dist/harness/execution/assistant.d.ts.map +1 -0
  35. package/dist/harness/execution/assistant.js +82 -0
  36. package/dist/harness/execution/assistant.js.map +1 -0
  37. package/dist/harness/execution/effect-gate.d.ts +22 -0
  38. package/dist/harness/execution/effect-gate.d.ts.map +1 -0
  39. package/dist/harness/execution/effect-gate.js +49 -0
  40. package/dist/harness/execution/effect-gate.js.map +1 -0
  41. package/dist/harness/execution/tools.d.ts +67 -0
  42. package/dist/harness/execution/tools.d.ts.map +1 -0
  43. package/dist/harness/execution/tools.js +121 -0
  44. package/dist/harness/execution/tools.js.map +1 -0
  45. package/dist/harness/hooks.d.ts +38 -0
  46. package/dist/harness/hooks.d.ts.map +1 -0
  47. package/dist/harness/hooks.js +406 -0
  48. package/dist/harness/hooks.js.map +1 -0
  49. package/dist/harness/messages.d.ts +2 -2
  50. package/dist/harness/messages.d.ts.map +1 -1
  51. package/dist/harness/messages.js.map +1 -1
  52. package/dist/harness/prompt-templates.d.ts +3 -2
  53. package/dist/harness/prompt-templates.d.ts.map +1 -1
  54. package/dist/harness/prompt-templates.js +17 -17
  55. package/dist/harness/prompt-templates.js.map +1 -1
  56. package/dist/harness/result.d.ts +93 -0
  57. package/dist/harness/result.d.ts.map +1 -1
  58. package/dist/harness/result.js +40 -0
  59. package/dist/harness/result.js.map +1 -1
  60. package/dist/harness/runtime/drive/boundary.d.ts +28 -0
  61. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
  62. package/dist/harness/runtime/drive/boundary.js +170 -0
  63. package/dist/harness/runtime/drive/boundary.js.map +1 -0
  64. package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
  65. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
  66. package/dist/harness/runtime/drive/checkpoint.js +133 -0
  67. package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
  68. package/dist/harness/runtime/drive/deferred.d.ts +15 -0
  69. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
  70. package/dist/harness/runtime/drive/deferred.js +179 -0
  71. package/dist/harness/runtime/drive/deferred.js.map +1 -0
  72. package/dist/harness/runtime/drive/generation.d.ts +8 -0
  73. package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
  74. package/dist/harness/runtime/drive/generation.js +205 -0
  75. package/dist/harness/runtime/drive/generation.js.map +1 -0
  76. package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
  77. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
  78. package/dist/harness/runtime/drive/reconcile.js +140 -0
  79. package/dist/harness/runtime/drive/reconcile.js.map +1 -0
  80. package/dist/harness/runtime/drive/recovery.d.ts +8 -0
  81. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
  82. package/dist/harness/runtime/drive/recovery.js +85 -0
  83. package/dist/harness/runtime/drive/recovery.js.map +1 -0
  84. package/dist/harness/runtime/drive/response.d.ts +23 -0
  85. package/dist/harness/runtime/drive/response.d.ts.map +1 -0
  86. package/dist/harness/runtime/drive/response.js +394 -0
  87. package/dist/harness/runtime/drive/response.js.map +1 -0
  88. package/dist/harness/runtime/drive/retry.d.ts +4 -0
  89. package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
  90. package/dist/harness/runtime/drive/retry.js +37 -0
  91. package/dist/harness/runtime/drive/retry.js.map +1 -0
  92. package/dist/harness/runtime/drive/structural.d.ts +32 -0
  93. package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
  94. package/dist/harness/runtime/drive/structural.js +929 -0
  95. package/dist/harness/runtime/drive/structural.js.map +1 -0
  96. package/dist/harness/runtime/drive/terminal.d.ts +7 -0
  97. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
  98. package/dist/harness/runtime/drive/terminal.js +49 -0
  99. package/dist/harness/runtime/drive/terminal.js.map +1 -0
  100. package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
  101. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
  102. package/dist/harness/runtime/drive/tool-placement.js +244 -0
  103. package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
  104. package/dist/harness/runtime/drive/tools.d.ts +6 -0
  105. package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
  106. package/dist/harness/runtime/drive/tools.js +449 -0
  107. package/dist/harness/runtime/drive/tools.js.map +1 -0
  108. package/dist/harness/runtime/drive.d.ts +6 -0
  109. package/dist/harness/runtime/drive.d.ts.map +1 -0
  110. package/dist/harness/runtime/drive.js +93 -0
  111. package/dist/harness/runtime/drive.js.map +1 -0
  112. package/dist/harness/runtime/harness.d.ts +59 -0
  113. package/dist/harness/runtime/harness.d.ts.map +1 -0
  114. package/dist/harness/runtime/harness.js +311 -0
  115. package/dist/harness/runtime/harness.js.map +1 -0
  116. package/dist/harness/runtime/index.d.ts +2 -0
  117. package/dist/harness/runtime/index.d.ts.map +1 -0
  118. package/dist/harness/runtime/index.js +2 -0
  119. package/dist/harness/runtime/index.js.map +1 -0
  120. package/dist/harness/runtime/lane.d.ts +101 -0
  121. package/dist/harness/runtime/lane.d.ts.map +1 -0
  122. package/dist/harness/runtime/lane.js +1575 -0
  123. package/dist/harness/runtime/lane.js.map +1 -0
  124. package/dist/harness/runtime/progress.d.ts +15 -0
  125. package/dist/harness/runtime/progress.d.ts.map +1 -0
  126. package/dist/harness/runtime/progress.js +66 -0
  127. package/dist/harness/runtime/progress.js.map +1 -0
  128. package/dist/harness/runtime/reducer.d.ts +5 -0
  129. package/dist/harness/runtime/reducer.d.ts.map +1 -0
  130. package/dist/harness/runtime/reducer.js +240 -0
  131. package/dist/harness/runtime/reducer.js.map +1 -0
  132. package/dist/harness/runtime/restore.d.ts +24 -0
  133. package/dist/harness/runtime/restore.d.ts.map +1 -0
  134. package/dist/harness/runtime/restore.js +117 -0
  135. package/dist/harness/runtime/restore.js.map +1 -0
  136. package/dist/harness/runtime/transcript.d.ts +21 -0
  137. package/dist/harness/runtime/transcript.d.ts.map +1 -0
  138. package/dist/harness/runtime/transcript.js +72 -0
  139. package/dist/harness/runtime/transcript.js.map +1 -0
  140. package/dist/harness/runtime/types.d.ts +105 -0
  141. package/dist/harness/runtime/types.d.ts.map +1 -0
  142. package/dist/harness/runtime/types.js +61 -0
  143. package/dist/harness/runtime/types.js.map +1 -0
  144. package/dist/harness/session/commit.d.ts +53 -0
  145. package/dist/harness/session/commit.d.ts.map +1 -0
  146. package/dist/harness/session/commit.js +57 -0
  147. package/dist/harness/session/commit.js.map +1 -0
  148. package/dist/harness/session/context.d.ts +6 -18
  149. package/dist/harness/session/context.d.ts.map +1 -1
  150. package/dist/harness/session/context.js +31 -49
  151. package/dist/harness/session/context.js.map +1 -1
  152. package/dist/harness/session/fork-policy.d.ts +13 -0
  153. package/dist/harness/session/fork-policy.d.ts.map +1 -0
  154. package/dist/harness/session/fork-policy.js +22 -0
  155. package/dist/harness/session/fork-policy.js.map +1 -0
  156. package/dist/harness/session/fork.d.ts +18 -0
  157. package/dist/harness/session/fork.d.ts.map +1 -0
  158. package/dist/harness/session/fork.js +127 -0
  159. package/dist/harness/session/fork.js.map +1 -0
  160. package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
  161. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
  162. package/dist/harness/session/in-memory-storage-state.js +216 -0
  163. package/dist/harness/session/in-memory-storage-state.js.map +1 -0
  164. package/dist/harness/session/index.d.ts +9 -5
  165. package/dist/harness/session/index.d.ts.map +1 -1
  166. package/dist/harness/session/index.js +7 -4
  167. package/dist/harness/session/index.js.map +1 -1
  168. package/dist/harness/session/jsonl/codec.d.ts +19 -8
  169. package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
  170. package/dist/harness/session/jsonl/codec.js +34 -218
  171. package/dist/harness/session/jsonl/codec.js.map +1 -1
  172. package/dist/harness/session/jsonl/index.d.ts +4 -0
  173. package/dist/harness/session/jsonl/index.d.ts.map +1 -0
  174. package/dist/harness/session/jsonl/index.js +4 -0
  175. package/dist/harness/session/jsonl/index.js.map +1 -0
  176. package/dist/harness/session/jsonl/legacy-v3.d.ts +18 -0
  177. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
  178. package/dist/harness/session/jsonl/legacy-v3.js +383 -0
  179. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
  180. package/dist/harness/session/jsonl/repo.d.ts +26 -19
  181. package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  182. package/dist/harness/session/jsonl/repo.js +266 -156
  183. package/dist/harness/session/jsonl/repo.js.map +1 -1
  184. package/dist/harness/session/jsonl/storage.d.ts +39 -41
  185. package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  186. package/dist/harness/session/jsonl/storage.js +238 -181
  187. package/dist/harness/session/jsonl/storage.js.map +1 -1
  188. package/dist/harness/session/jsonl/types.d.ts +23 -22
  189. package/dist/harness/session/jsonl/types.d.ts.map +1 -1
  190. package/dist/harness/session/jsonl/types.js +2 -1
  191. package/dist/harness/session/jsonl/types.js.map +1 -1
  192. package/dist/harness/session/memory.d.ts +46 -40
  193. package/dist/harness/session/memory.d.ts.map +1 -1
  194. package/dist/harness/session/memory.js +346 -113
  195. package/dist/harness/session/memory.js.map +1 -1
  196. package/dist/harness/session/mutation-line.d.ts +8 -0
  197. package/dist/harness/session/mutation-line.d.ts.map +1 -0
  198. package/dist/harness/session/mutation-line.js +21 -0
  199. package/dist/harness/session/mutation-line.js.map +1 -0
  200. package/dist/harness/session/session.d.ts +78 -46
  201. package/dist/harness/session/session.d.ts.map +1 -1
  202. package/dist/harness/session/session.js +343 -209
  203. package/dist/harness/session/session.js.map +1 -1
  204. package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
  205. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
  206. package/dist/harness/session/testing/benchmark/datasets.js +24 -0
  207. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
  208. package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
  209. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
  210. package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
  211. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
  212. package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
  213. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
  214. package/dist/harness/session/testing/benchmark/storage.js +114 -0
  215. package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
  216. package/dist/harness/session/testing/conformance/session-repo.d.ts +21 -0
  217. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
  218. package/dist/harness/session/testing/conformance/session-repo.js +590 -0
  219. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
  220. package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
  221. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
  222. package/dist/harness/session/testing/conformance/storage.js +600 -0
  223. package/dist/harness/session/testing/conformance/storage.js.map +1 -0
  224. package/dist/harness/session/testing/gating-storage.d.ts +26 -0
  225. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
  226. package/dist/harness/session/testing/gating-storage.js +100 -0
  227. package/dist/harness/session/testing/gating-storage.js.map +1 -0
  228. package/dist/harness/session/testing/index.d.ts +9 -2
  229. package/dist/harness/session/testing/index.d.ts.map +1 -1
  230. package/dist/harness/session/testing/index.js +8 -1
  231. package/dist/harness/session/testing/index.js.map +1 -1
  232. package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
  233. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
  234. package/dist/harness/session/testing/instrumented-storage.js +16 -0
  235. package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
  236. package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
  237. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
  238. package/dist/harness/session/testing/storage-decorator.js +41 -0
  239. package/dist/harness/session/testing/storage-decorator.js.map +1 -0
  240. package/dist/harness/session/testing/types.d.ts +5 -7
  241. package/dist/harness/session/testing/types.d.ts.map +1 -1
  242. package/dist/harness/session/testing/types.js.map +1 -1
  243. package/dist/harness/session/types.d.ts +424 -259
  244. package/dist/harness/session/types.d.ts.map +1 -1
  245. package/dist/harness/session/types.js +7 -8
  246. package/dist/harness/session/types.js.map +1 -1
  247. package/dist/harness/session/values.d.ts +95 -0
  248. package/dist/harness/session/values.d.ts.map +1 -0
  249. package/dist/harness/session/values.js +81 -0
  250. package/dist/harness/session/values.js.map +1 -0
  251. package/dist/harness/skills.d.ts +3 -2
  252. package/dist/harness/skills.d.ts.map +1 -1
  253. package/dist/harness/skills.js +29 -26
  254. package/dist/harness/skills.js.map +1 -1
  255. package/dist/harness/telemetry.d.ts +64 -43
  256. package/dist/harness/telemetry.d.ts.map +1 -1
  257. package/dist/harness/telemetry.js +45 -26
  258. package/dist/harness/telemetry.js.map +1 -1
  259. package/dist/harness/tools/bash.d.ts +4 -4
  260. package/dist/harness/tools/bash.d.ts.map +1 -1
  261. package/dist/harness/tools/bash.js +66 -93
  262. package/dist/harness/tools/bash.js.map +1 -1
  263. package/dist/harness/tools/edit.d.ts.map +1 -1
  264. package/dist/harness/tools/edit.js +10 -10
  265. package/dist/harness/tools/edit.js.map +1 -1
  266. package/dist/harness/tools/file-mutation-queue.d.ts +2 -1
  267. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  268. package/dist/harness/tools/file-mutation-queue.js +5 -5
  269. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  270. package/dist/harness/tools/path-utils.d.ts +3 -2
  271. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  272. package/dist/harness/tools/path-utils.js +5 -5
  273. package/dist/harness/tools/path-utils.js.map +1 -1
  274. package/dist/harness/tools/read.d.ts +2 -1
  275. package/dist/harness/tools/read.d.ts.map +1 -1
  276. package/dist/harness/tools/read.js +4 -6
  277. package/dist/harness/tools/read.js.map +1 -1
  278. package/dist/harness/tools/write.d.ts.map +1 -1
  279. package/dist/harness/tools/write.js +7 -7
  280. package/dist/harness/tools/write.js.map +1 -1
  281. package/dist/harness/types.d.ts +108 -45
  282. package/dist/harness/types.d.ts.map +1 -1
  283. package/dist/harness/types.js.map +1 -1
  284. package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
  285. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
  286. package/dist/harness/utils/adaptive-publisher.js +79 -0
  287. package/dist/harness/utils/adaptive-publisher.js.map +1 -0
  288. package/dist/harness/utils/output-capture.d.ts +31 -0
  289. package/dist/harness/utils/output-capture.d.ts.map +1 -0
  290. package/dist/harness/utils/output-capture.js +217 -0
  291. package/dist/harness/utils/output-capture.js.map +1 -0
  292. package/dist/harness/utils/shell-output.d.ts +12 -5
  293. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  294. package/dist/harness/utils/shell-output.js +64 -174
  295. package/dist/harness/utils/shell-output.js.map +1 -1
  296. package/dist/harness/utils/truncate.d.ts +1 -0
  297. package/dist/harness/utils/truncate.d.ts.map +1 -1
  298. package/dist/harness/utils/truncate.js +1 -1
  299. package/dist/harness/utils/truncate.js.map +1 -1
  300. package/dist/harness/utils/usage.d.ts +4 -0
  301. package/dist/harness/utils/usage.d.ts.map +1 -0
  302. package/dist/harness/utils/usage.js +33 -0
  303. package/dist/harness/utils/usage.js.map +1 -0
  304. package/dist/index.d.ts +4 -1
  305. package/dist/index.d.ts.map +1 -1
  306. package/dist/index.js +3 -6
  307. package/dist/index.js.map +1 -1
  308. package/dist/proxy.d.ts +2 -0
  309. package/dist/proxy.d.ts.map +1 -1
  310. package/dist/proxy.js +40 -10
  311. package/dist/proxy.js.map +1 -1
  312. package/dist/search/index.d.ts +24 -16
  313. package/dist/search/index.d.ts.map +1 -1
  314. package/dist/search/index.js +1 -1
  315. package/dist/search/index.js.map +1 -1
  316. package/dist/types.d.ts +5 -2
  317. package/dist/types.d.ts.map +1 -1
  318. package/dist/types.js.map +1 -1
  319. package/package.json +25 -4
  320. package/dist/harness/reducer.d.ts +0 -100
  321. package/dist/harness/reducer.d.ts.map +0 -1
  322. package/dist/harness/reducer.js +0 -415
  323. package/dist/harness/reducer.js.map +0 -1
  324. package/dist/harness/session/jsonl/errors.d.ts +0 -9
  325. package/dist/harness/session/jsonl/errors.d.ts.map +0 -1
  326. package/dist/harness/session/jsonl/errors.js +0 -19
  327. package/dist/harness/session/jsonl/errors.js.map +0 -1
  328. package/dist/harness/session/jsonl.d.ts +0 -3
  329. package/dist/harness/session/jsonl.d.ts.map +0 -1
  330. package/dist/harness/session/jsonl.js +0 -2
  331. package/dist/harness/session/jsonl.js.map +0 -1
  332. package/dist/harness/session/state.d.ts +0 -65
  333. package/dist/harness/session/state.d.ts.map +0 -1
  334. package/dist/harness/session/state.js +0 -319
  335. package/dist/harness/session/state.js.map +0 -1
  336. package/dist/harness/session/testing/conformance.d.ts +0 -4
  337. package/dist/harness/session/testing/conformance.d.ts.map +0 -1
  338. package/dist/harness/session/testing/conformance.js +0 -762
  339. package/dist/harness/session/testing/conformance.js.map +0 -1
  340. package/dist/search/scanning.d.ts +0 -29
  341. package/dist/search/scanning.d.ts.map +0 -1
  342. package/dist/search/scanning.js +0 -103
  343. package/dist/search/scanning.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-repo.d.ts","sourceRoot":"","sources":["../../../../../src/harness/session/testing/conformance/session-repo.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAKX,eAAe,EACf,WAAW,EAEX,MAAM,gBAAgB,CAAC;AAkBxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA6GnD,qGAAqG;AACrG,wBAAgB,qCAAqC,CAAC,SAAS,SAAS,eAAe,EAEtF,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,EAClG,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,SAAS,eAAe,EAAE,CAkF5B;AAED,qFAAqF;AACrF,wBAAgB,qCAAqC,CAAC,SAAS,SAAS,eAAe,EACtF,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,EAC9E,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,SAAS,eAAe,EAAE,CAa5B;AAED,4EAA4E;AAC5E,wBAAgB,mCAAmC,CAAC,SAAS,SAAS,eAAe,EACpF,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,EACrE,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,SAAS,eAAe,EAAE,CA+C5B;AAED,yFAAyF;AACzF,wBAAgB,wCAAwC,CAAC,SAAS,SAAS,eAAe,EACzF,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,EACvF,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,SAAS,eAAe,EAAE,CA0Y5B;AAED,sFAAsF;AACtF,wBAAgB,sDAAsD,CAAC,SAAS,SAAS,eAAe,EACvG,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,EAC9E,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,SAAS,eAAe,EAAE,CAoC5B;AAED,6FAA6F;AAC7F,wBAAgB,8CAA8C,CAAC,SAAS,SAAS,eAAe,EAC/F,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,EAC9E,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,SAAS,eAAe,EAAE,CAgE5B;AAED,4CAA4C;AAC5C,wBAAgB,4CAA4C,CAAC,SAAS,SAAS,eAAe,EAC7F,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,EAC9E,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,SAAS,eAAe,EAAE,CAK5B;AAED,2CAA2C;AAC3C,wBAAgB,gCAAgC,CAAC,SAAS,SAAS,eAAe,EACjF,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,EACvF,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,SAAS,eAAe,EAAE,CAK5B;AAED,kDAAkD;AAClD,wBAAgB,4BAA4B,CAAC,SAAS,SAAS,eAAe,EAC7E,OAAO,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC9C,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,SAAS,eAAe,EAAE,CAO5B","sourcesContent":["import { deepStrictEqual, rejects, strictEqual } from \"node:assert/strict\";\nimport type { AssistantMessage, StopReason } from \"@earendil-works/pi-ai\";\nimport { BACKGROUND_CONTEXT } from \"../../../context.ts\";\nimport { insertEntry, insertUsage } from \"../../commit.ts\";\nimport type {\n\tJsonValue,\n\tLaneConfiguration,\n\tLaneState,\n\tSession,\n\tSessionMetadata,\n\tSessionRepo,\n\tUsageRow,\n} from \"../../types.ts\";\nimport {\n\tappendList,\n\tbranchTip,\n\tentryLabel,\n\tlaneConfig,\n\tlaneState,\n\tlist,\n\toperationMeta,\n\toperationPreparation,\n\toperationResult,\n\toperationState,\n\toperationToolArgs,\n\tpendingEntry,\n\tsessionName,\n\tsetValue,\n\tvalue,\n} from \"../../values.ts\";\nimport type { ConformanceCase } from \"../types.ts\";\n\nconst ROOT_ID = \"00000000-0000-7000-8000-000000000001\";\nconst CHILD_ID = \"00000000-0000-7000-8000-000000000002\";\nconst SIBLING_ID = \"00000000-0000-7000-8000-000000000003\";\nconst USAGE_ID = \"00000000-0000-7000-8000-000000000004\";\nconst OPERATION_ID = \"00000000-0000-7000-8000-000000000005\";\nconst PENDING_ID = \"00000000-0000-7000-8000-000000000006\";\nconst UNKNOWN_ID = \"00000000-0000-7000-8000-000000000007\";\nconst idleLaneState = {\n\tcurrentOperationId: null,\n\tlastOperationId: null,\n\tinbox: [],\n} satisfies LaneState;\nconst applicationValue = value<JsonValue>(\"test.application.value\");\nconst applicationList = list<JsonValue>(\"test.application.list\");\nconst configuration = {\n\tmodel: { provider: \"provider\", modelId: \"model\" },\n\tthinkingLevel: \"off\",\n\tactiveToolNames: [\"read\"],\n} satisfies LaneConfiguration;\n\nasync function getBranchTip(session: Session, name = \"main\"): Promise<string | null | undefined> {\n\treturn (await session.branch(name, BACKGROUND_CONTEXT))?.getTipId(BACKGROUND_CONTEXT);\n}\n\nfunction assistantMessage(stopReason: StopReason): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent:\n\t\t\tstopReason === \"toolUse\"\n\t\t\t\t? [{ type: \"toolCall\", id: \"call\", name: \"read\", arguments: {} }]\n\t\t\t\t: [{ type: \"text\", text: stopReason }],\n\t\tapi: \"anthropic-messages\",\n\t\tprovider: \"anthropic\",\n\t\tmodel: \"claude-sonnet-4-5\",\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason,\n\t\t...(stopReason === \"deferred\"\n\t\t\t? {\n\t\t\t\t\tdeferred: {\n\t\t\t\t\t\tprovider: \"anthropic\",\n\t\t\t\t\t\tmodelId: \"claude-sonnet-4-5\",\n\t\t\t\t\t\tapi: \"anthropic-messages\",\n\t\t\t\t\t\tid: \"job\",\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\ttimestamp: 1,\n\t};\n}\n\nfunction usageRow(): Omit<UsageRow, \"seq\"> {\n\treturn {\n\t\tid: USAGE_ID,\n\t\tadjustment: true,\n\t\tusage: {\n\t\t\tinput: 1,\n\t\t\toutput: 2,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 3,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t};\n}\n\ninterface RepoCaseContext<TRepo> {\n\trepo: TRepo;\n\tclose?: () => void | Promise<void>;\n}\n\nfunction prepareRepoCaseFactory<TRepo>(\n\tfactory: () => Promise<TRepo>,\n\tonClose?: () => void | Promise<void>,\n): () => Promise<RepoCaseContext<TRepo>> {\n\treturn async () => ({\n\t\trepo: await factory(),\n\t\t...(onClose === undefined ? {} : { close: onClose }),\n\t});\n}\n\nfunction createCase<TRepo>(\n\tfactory: () => Promise<RepoCaseContext<TRepo>>,\n\tgroup: string,\n\tname: string,\n\ttest: (context: { repo: TRepo }) => Promise<void>,\n): ConformanceCase {\n\treturn {\n\t\tgroup,\n\t\tname,\n\t\tasync run() {\n\t\t\tconst context = await factory();\n\t\t\ttry {\n\t\t\t\tawait test(context);\n\t\t\t} finally {\n\t\t\t\tawait context.close?.();\n\t\t\t}\n\t\t},\n\t};\n}\n\n/** Creates lifecycle cases for repositories that support creation, discovery, open, and deletion. */\nexport function createSessionRepoLifecycleConformance<TMetadata extends SessionMetadata>(\n\t// Require only the methods this group exercises so partial backends can run it independently.\n\tbackendFactory: () => Promise<Pick<SessionRepo<TMetadata>, \"create\" | \"open\" | \"list\" | \"delete\">>,\n\tonClose?: () => void | Promise<void>,\n): readonly ConformanceCase[] {\n\tconst factory = prepareRepoCaseFactory(backendFactory, onClose);\n\treturn [\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"lifecycle\",\n\t\t\t\"creates a session with no implicit branch and rejects duplicate ids\",\n\t\t\tasync ({ repo }) => {\n\t\t\t\tconst session = await repo.create({ id: \"session\" }, BACKGROUND_CONTEXT);\n\n\t\t\t\tstrictEqual(session.metadata.id, \"session\");\n\t\t\t\tstrictEqual(Number.isSafeInteger(session.metadata.createdAt), true);\n\t\t\t\tstrictEqual(session.metadata.storageVersion, 1);\n\t\t\t\tstrictEqual(await session.branch(\"main\", BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(await session.getValue(laneState(\"main\"), BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(await session.getValue(laneConfig(\"main\"), BACKGROUND_CONTEXT), undefined);\n\t\t\t\tawait rejects(repo.create({ id: \"session\" }, BACKGROUND_CONTEXT));\n\t\t\t\tawait session.close(BACKGROUND_CONTEXT);\n\t\t\t},\n\t\t),\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"lifecycle\",\n\t\t\t\"close drains an acquired scope and rejects a queued mutation callback\",\n\t\t\tasync ({ repo }) => {\n\t\t\t\tconst session = await repo.create({ id: \"session\" }, BACKGROUND_CONTEXT);\n\t\t\t\tconst active = await session.beginMutation(BACKGROUND_CONTEXT);\n\t\t\t\tlet queuedStarted = false;\n\t\t\t\tconst queued = session.mutate(() => {\n\t\t\t\t\tqueuedStarted = true;\n\t\t\t\t}, BACKGROUND_CONTEXT);\n\t\t\t\tvoid queued.catch(() => {});\n\t\t\t\tconst closing = session.close(BACKGROUND_CONTEXT);\n\n\t\t\t\tawait active.end(BACKGROUND_CONTEXT);\n\t\t\t\tawait rejects(queued);\n\t\t\t\tawait closing;\n\t\t\t\tstrictEqual(queuedStarted, false);\n\t\t\t},\n\t\t),\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"lifecycle\",\n\t\t\t\"lists metadata and preserves state across close and reopen\",\n\t\t\tasync ({ repo }) => {\n\t\t\t\tconst first = await repo.create({ id: \"first\" }, BACKGROUND_CONTEXT);\n\t\t\t\tawait first.setName(\"preserved\", BACKGROUND_CONTEXT);\n\t\t\t\tconst second = await repo.create({ id: \"second\", parentSessionId: \"parent\" }, BACKGROUND_CONTEXT);\n\t\t\t\tawait second.close(BACKGROUND_CONTEXT);\n\n\t\t\t\tconst listed = await repo.list(undefined, BACKGROUND_CONTEXT);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\tlisted\n\t\t\t\t\t\t.map(({ id, parentSessionId }) => ({ id, parentSessionId }))\n\t\t\t\t\t\t.sort((left, right) => left.id.localeCompare(right.id)),\n\t\t\t\t\t[\n\t\t\t\t\t\t{ id: \"first\", parentSessionId: undefined },\n\t\t\t\t\t\t{ id: \"second\", parentSessionId: \"parent\" },\n\t\t\t\t\t],\n\t\t\t\t);\n\t\t\t\tawait first.close(BACKGROUND_CONTEXT);\n\t\t\t\tawait rejects(first.getName(BACKGROUND_CONTEXT));\n\t\t\t\tconst reopened = await repo.open(first.metadata, BACKGROUND_CONTEXT);\n\t\t\t\tstrictEqual(reopened === first, false);\n\t\t\t\tstrictEqual(await reopened.getName(BACKGROUND_CONTEXT), \"preserved\");\n\t\t\t\tawait reopened.close(BACKGROUND_CONTEXT);\n\t\t\t},\n\t\t),\n\t\tcreateCase(factory, \"lifecycle\", \"deletes closed sessions without affecting other sessions\", async ({ repo }) => {\n\t\t\tconst removed = await repo.create({ id: \"removed\" }, BACKGROUND_CONTEXT);\n\t\t\tconst retained = await repo.create({ id: \"retained\" }, BACKGROUND_CONTEXT);\n\t\t\tawait Promise.all([removed.close(BACKGROUND_CONTEXT), retained.close(BACKGROUND_CONTEXT)]);\n\n\t\t\tawait repo.delete(removed.metadata, BACKGROUND_CONTEXT);\n\t\t\tdeepStrictEqual(\n\t\t\t\t(await repo.list(undefined, BACKGROUND_CONTEXT)).map(({ id }) => id),\n\t\t\t\t[\"retained\"],\n\t\t\t);\n\t\t\tawait rejects(repo.open(removed.metadata, BACKGROUND_CONTEXT));\n\t\t\tawait rejects(repo.delete(removed.metadata, BACKGROUND_CONTEXT));\n\t\t}),\n\t];\n}\n\n/** Creates exclusive-open cases for repositories that own active session handles. */\nexport function createSessionRepoOwnershipConformance<TMetadata extends SessionMetadata>(\n\tbackendFactory: () => Promise<Pick<SessionRepo<TMetadata>, \"create\" | \"open\">>,\n\tonClose?: () => void | Promise<void>,\n): readonly ConformanceCase[] {\n\tconst factory = prepareRepoCaseFactory(backendFactory, onClose);\n\treturn [\n\t\tcreateCase(factory, \"ownership\", \"rejects opening an already-open session\", async ({ repo }) => {\n\t\t\tconst session = await repo.create({ id: \"session\" }, BACKGROUND_CONTEXT);\n\t\t\tawait rejects(repo.open(session.metadata, BACKGROUND_CONTEXT));\n\t\t\tawait session.close(BACKGROUND_CONTEXT);\n\n\t\t\tconst reopened = await repo.open(session.metadata, BACKGROUND_CONTEXT);\n\t\t\tawait rejects(repo.open(session.metadata, BACKGROUND_CONTEXT));\n\t\t\tawait reopened.close(BACKGROUND_CONTEXT);\n\t\t}),\n\t];\n}\n\n/** Creates message cases for repositories that support session creation. */\nexport function createSessionRepoMessageConformance<TMetadata extends SessionMetadata>(\n\tbackendFactory: () => Promise<Pick<SessionRepo<TMetadata>, \"create\">>,\n\tonClose?: () => void | Promise<void>,\n): readonly ConformanceCase[] {\n\tconst factory = prepareRepoCaseFactory(backendFactory, onClose);\n\treturn [\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"messages\",\n\t\t\t\"rejects pending assistant messages without changing the tree\",\n\t\t\tasync ({ repo }) => {\n\t\t\t\tconst session = await repo.create({ id: \"session\" }, BACKGROUND_CONTEXT);\n\t\t\t\tconst branch = await session.createBranch(\"main\", null, BACKGROUND_CONTEXT);\n\n\t\t\t\tawait rejects(branch.appendMessage(assistantMessage(\"pending\"), BACKGROUND_CONTEXT));\n\n\t\t\t\tstrictEqual(await getBranchTip(session), null);\n\t\t\t\tdeepStrictEqual(await session.findEntries(undefined, BACKGROUND_CONTEXT), []);\n\t\t\t\tawait session.close(BACKGROUND_CONTEXT);\n\t\t\t},\n\t\t),\n\t\tcreateCase(factory, \"messages\", \"preserves every settled assistant stop reason\", async ({ repo }) => {\n\t\t\tconst session = await repo.create({ id: \"session\" }, BACKGROUND_CONTEXT);\n\t\t\tconst messagesByStopReason = {\n\t\t\t\tstop: assistantMessage(\"stop\"),\n\t\t\t\tlength: assistantMessage(\"length\"),\n\t\t\t\ttoolUse: assistantMessage(\"toolUse\"),\n\t\t\t\terror: assistantMessage(\"error\"),\n\t\t\t\taborted: assistantMessage(\"aborted\"),\n\t\t\t\tdeferred: assistantMessage(\"deferred\"),\n\t\t\t} satisfies Record<Exclude<StopReason, \"pending\">, AssistantMessage>;\n\t\t\tconst branch = await session.createBranch(\"main\", null, BACKGROUND_CONTEXT);\n\t\t\tconst messages = Object.values(messagesByStopReason);\n\t\t\tconst ids: string[] = [];\n\n\t\t\tfor (const message of messages) ids.push(await branch.appendMessage(message, BACKGROUND_CONTEXT));\n\n\t\t\tconst entries = await session.findEntries({ order: \"asc\", type: \"message\" }, BACKGROUND_CONTEXT);\n\t\t\tdeepStrictEqual(\n\t\t\t\tentries.map((entry) => entry.id),\n\t\t\t\tids,\n\t\t\t);\n\t\t\tfor (const [index, entry] of entries.entries()) {\n\t\t\t\tif (entry.type !== \"message\") throw new Error(\"Expected message entry\");\n\t\t\t\tdeepStrictEqual(entry.message, messages[index]);\n\t\t\t}\n\t\t\tstrictEqual(await getBranchTip(session), ids.at(-1));\n\t\t\tawait session.close(BACKGROUND_CONTEXT);\n\t\t}),\n\t];\n}\n\n/** Creates fork-content cases that do not require concurrent repository coordination. */\nexport function createSessionRepoForkBehaviorConformance<TMetadata extends SessionMetadata>(\n\tbackendFactory: () => Promise<Pick<SessionRepo<TMetadata>, \"create\" | \"list\" | \"fork\">>,\n\tonClose?: () => void | Promise<void>,\n): readonly ConformanceCase[] {\n\tconst factory = prepareRepoCaseFactory(backendFactory, onClose);\n\treturn [\n\t\tcreateCase(factory, \"forks\", \"tree-forks a fresh session before first attachment\", async ({ repo }) => {\n\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\tconst fork = await repo.fork(source.metadata, { id: \"fork\", scope: \"tree\" }, BACKGROUND_CONTEXT);\n\n\t\t\tstrictEqual(fork.metadata.id, \"fork\");\n\t\t\tstrictEqual(fork.metadata.parentSessionId, \"source\");\n\t\t\tstrictEqual(await fork.branch(\"main\", BACKGROUND_CONTEXT), undefined);\n\t\t\tstrictEqual(await fork.getValue(laneConfig(\"main\"), BACKGROUND_CONTEXT), undefined);\n\t\t\tstrictEqual(await fork.getValue(laneState(\"main\"), BACKGROUND_CONTEXT), undefined);\n\t\t\tdeepStrictEqual(await fork.findEntries(undefined, BACKGROUND_CONTEXT), []);\n\t\t\tdeepStrictEqual(await fork.getStats(BACKGROUND_CONTEXT), {\n\t\t\t\tmessageCount: 0,\n\t\t\t\tusage: {\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\tcost: {\n\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\ttotal: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait Promise.all([source.close(BACKGROUND_CONTEXT), fork.close(BACKGROUND_CONTEXT)]);\n\t\t}),\n\t\tcreateCase(factory, \"forks\", \"rejects a data-only branch and releases its destination id\", async ({ repo }) => {\n\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\tawait source.createBranch(\"data\", null, BACKGROUND_CONTEXT);\n\n\t\t\tawait rejects(\n\t\t\t\trepo.fork(source.metadata, { id: \"destination\", scope: \"branch\", branch: \"data\" }, BACKGROUND_CONTEXT),\n\t\t\t);\n\t\t\tdeepStrictEqual(\n\t\t\t\t(await repo.list(undefined, BACKGROUND_CONTEXT)).map(({ id }) => id),\n\t\t\t\t[\"source\"],\n\t\t\t);\n\n\t\t\tconst destination = await repo.create({ id: \"destination\" }, BACKGROUND_CONTEXT);\n\t\t\tawait Promise.all([source.close(BACKGROUND_CONTEXT), destination.close(BACKGROUND_CONTEXT)]);\n\t\t}),\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"forks\",\n\t\t\t\"forks one named configured branch with scoped values and a zero ledger\",\n\t\t\tasync ({ repo }) => {\n\t\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\t\tawait source.mutate(\n\t\t\t\t\t(mutator) =>\n\t\t\t\t\t\tmutator.commit(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tinsertEntry({\n\t\t\t\t\t\t\t\t\tid: ROOT_ID,\n\t\t\t\t\t\t\t\t\tparentId: null,\n\t\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\t\tcustomType: \"root\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tinsertEntry({\n\t\t\t\t\t\t\t\t\tid: CHILD_ID,\n\t\t\t\t\t\t\t\t\tparentId: ROOT_ID,\n\t\t\t\t\t\t\t\t\ttype: \"message\",\n\t\t\t\t\t\t\t\t\tmessage: { role: \"user\", content: \"child\", timestamp: 1 },\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tinsertEntry({\n\t\t\t\t\t\t\t\t\tid: SIBLING_ID,\n\t\t\t\t\t\t\t\t\tparentId: ROOT_ID,\n\t\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\t\tcustomType: \"sibling\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tsetValue(branchTip(\"main\"), SIBLING_ID),\n\t\t\t\t\t\t\t\tsetValue(branchTip(\"review\"), CHILD_ID),\n\t\t\t\t\t\t\t\tsetValue(laneConfig(\"review\"), configuration),\n\t\t\t\t\t\t\t\tsetValue(laneState(\"review\"), {\n\t\t\t\t\t\t\t\t\tcurrentOperationId: OPERATION_ID,\n\t\t\t\t\t\t\t\t\tlastOperationId: \"previous\",\n\t\t\t\t\t\t\t\t\tinbox: [{ entryId: PENDING_ID, kind: \"write\" }],\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tsetValue(operationResult(\"previous\"), {\n\t\t\t\t\t\t\t\t\toperationId: \"previous\",\n\t\t\t\t\t\t\t\t\tkind: \"navigation\",\n\t\t\t\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\t\t\t\tfromTipId: ROOT_ID,\n\t\t\t\t\t\t\t\t\ttipId: CHILD_ID,\n\t\t\t\t\t\t\t\t\tstartedAt: 1,\n\t\t\t\t\t\t\t\t\tendedAt: 2,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tsetValue(sessionName, \"source name\"),\n\t\t\t\t\t\t\t\tsetValue(applicationValue, { copied: false }),\n\t\t\t\t\t\t\t\tappendList(applicationList, { copied: false }),\n\t\t\t\t\t\t\t\tsetValue(entryLabel(ROOT_ID), \"root label\"),\n\t\t\t\t\t\t\t\tsetValue(entryLabel(SIBLING_ID), \"sibling label\"),\n\t\t\t\t\t\t\t\tsetValue(pendingEntry(PENDING_ID), {\n\t\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\t\tcustomType: \"pending\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tsetValue(operationMeta(OPERATION_ID), {\n\t\t\t\t\t\t\t\t\toperationId: OPERATION_ID,\n\t\t\t\t\t\t\t\t\tlane: \"review\",\n\t\t\t\t\t\t\t\t\tsourceTipId: CHILD_ID,\n\t\t\t\t\t\t\t\t\tstartedAt: 1,\n\t\t\t\t\t\t\t\t\tintent: { kind: \"compaction\" },\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tsetValue(operationState(OPERATION_ID), {\n\t\t\t\t\t\t\t\t\tat: \"summary.deciding\",\n\t\t\t\t\t\t\t\t\tcontrol: { status: \"running\" },\n\t\t\t\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\t\t\t\tcompaction: { enabled: true, reserveTokens: 1, keepRecentTokens: 1 },\n\t\t\t\t\t\t\t\t\t\tsteeringMode: \"all\",\n\t\t\t\t\t\t\t\t\t\tfollowUpMode: \"all\",\n\t\t\t\t\t\t\t\t\t\ttoolExecution: \"sequential\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tlatestAssistantEntryId: null,\n\t\t\t\t\t\t\t\t\ttask: { taskId: OPERATION_ID, reason: \"manual\", boundary: { kind: \"finish\" } },\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tsetValue(operationToolArgs(OPERATION_ID, ROOT_ID, 0), {\n\t\t\t\t\t\t\t\t\targument: true,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tsetValue(operationPreparation(OPERATION_ID, OPERATION_ID), {\n\t\t\t\t\t\t\t\t\tkind: \"compaction\",\n\t\t\t\t\t\t\t\t\tmessagesToSummarize: [],\n\t\t\t\t\t\t\t\t\tturnPrefixMessages: [],\n\t\t\t\t\t\t\t\t\tretainedTail: [],\n\t\t\t\t\t\t\t\t\tisSplitTurn: false,\n\t\t\t\t\t\t\t\t\ttokensBefore: 0,\n\t\t\t\t\t\t\t\t\tfileOps: { read: [], written: [], edited: [] },\n\t\t\t\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\t\t\t\t\treserveTokens: 1,\n\t\t\t\t\t\t\t\t\t\tkeepRecentTokens: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tinsertUsage(usageRow()),\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\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tconst fork = await repo.fork(\n\t\t\t\t\tsource.metadata,\n\t\t\t\t\t{ id: \"fork\", scope: \"branch\", branch: \"review\", entryId: CHILD_ID, position: \"at\" },\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\t(await fork.findEntries({ order: \"asc\" }, BACKGROUND_CONTEXT)).map(({ id }) => id),\n\t\t\t\t\t[ROOT_ID, CHILD_ID],\n\t\t\t\t);\n\t\t\t\tstrictEqual(await fork.branch(\"main\", BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(await getBranchTip(fork, \"review\"), CHILD_ID);\n\t\t\t\tdeepStrictEqual((await fork.getValue(laneConfig(\"review\"), BACKGROUND_CONTEXT))?.value, configuration);\n\t\t\t\tdeepStrictEqual((await fork.getValue(laneState(\"review\"), BACKGROUND_CONTEXT))?.value, idleLaneState);\n\t\t\t\tstrictEqual(await fork.getValue(laneConfig(\"main\"), BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(await fork.getValue(laneState(\"main\"), BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(await fork.getName(BACKGROUND_CONTEXT), \"source name\");\n\t\t\t\tstrictEqual(await fork.getValue(applicationValue, BACKGROUND_CONTEXT), undefined);\n\t\t\t\tdeepStrictEqual(await fork.readList(applicationList, undefined, BACKGROUND_CONTEXT), []);\n\t\t\t\tstrictEqual(await fork.getLabel(ROOT_ID, BACKGROUND_CONTEXT), \"root label\");\n\t\t\t\tstrictEqual(await fork.getLabel(SIBLING_ID, BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(await fork.getValue(operationResult(\"previous\"), BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(await fork.getValue(pendingEntry(PENDING_ID), BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(await fork.getValue(operationMeta(OPERATION_ID), BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(await fork.getValue(operationState(OPERATION_ID), BACKGROUND_CONTEXT), undefined);\n\t\t\t\tstrictEqual(\n\t\t\t\t\tawait fork.getValue(operationToolArgs(OPERATION_ID, ROOT_ID, 0), BACKGROUND_CONTEXT),\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tstrictEqual(\n\t\t\t\t\tawait fork.getValue(operationPreparation(OPERATION_ID, OPERATION_ID), BACKGROUND_CONTEXT),\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tconst stats = await fork.getStats(BACKGROUND_CONTEXT);\n\t\t\t\tstrictEqual(stats.messageCount, 1);\n\t\t\t\tdeepStrictEqual(stats.usage, {\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t});\n\t\t\t\tawait Promise.all([source.close(BACKGROUND_CONTEXT), fork.close(BACKGROUND_CONTEXT)]);\n\t\t\t},\n\t\t),\n\t\tcreateCase(factory, \"forks\", \"enforces branch ancestry for at and before placement\", async ({ repo }) => {\n\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\tawait source.mutate(\n\t\t\t\t(mutator) =>\n\t\t\t\t\tmutator.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tinsertEntry({ id: ROOT_ID, parentId: null, type: \"custom\", customType: \"root\" }),\n\t\t\t\t\t\t\tinsertEntry({ id: CHILD_ID, parentId: ROOT_ID, type: \"custom\", customType: \"child\" }),\n\t\t\t\t\t\t\tinsertEntry({ id: SIBLING_ID, parentId: ROOT_ID, type: \"custom\", customType: \"sibling\" }),\n\t\t\t\t\t\t\tsetValue(branchTip(\"main\"), CHILD_ID),\n\t\t\t\t\t\t\tsetValue(laneConfig(\"main\"), configuration),\n\t\t\t\t\t\t\tsetValue(laneState(\"main\"), idleLaneState),\n\t\t\t\t\t\t\tsetValue(branchTip(\"empty\"), null),\n\t\t\t\t\t\t\tsetValue(laneConfig(\"empty\"), configuration),\n\t\t\t\t\t\t\tsetValue(laneState(\"empty\"), idleLaneState),\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\tBACKGROUND_CONTEXT,\n\t\t\t);\n\n\t\t\tconst before = await repo.fork(\n\t\t\t\tsource.metadata,\n\t\t\t\t{ id: \"before\", scope: \"branch\", branch: \"main\", entryId: CHILD_ID, position: \"before\" },\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tstrictEqual(await getBranchTip(before), ROOT_ID);\n\t\t\tdeepStrictEqual(\n\t\t\t\t(await before.findEntries({ order: \"asc\" }, BACKGROUND_CONTEXT)).map(({ id }) => id),\n\t\t\t\t[ROOT_ID],\n\t\t\t);\n\n\t\t\tconst mid = await repo.fork(\n\t\t\t\tsource.metadata,\n\t\t\t\t{ id: \"mid\", scope: \"branch\", branch: \"main\", entryId: ROOT_ID, position: \"at\" },\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tstrictEqual(await getBranchTip(mid), ROOT_ID);\n\t\t\tdeepStrictEqual(\n\t\t\t\t(await mid.findEntries({ order: \"asc\" }, BACKGROUND_CONTEXT)).map(({ id }) => id),\n\t\t\t\t[ROOT_ID],\n\t\t\t);\n\n\t\t\tconst beforeRoot = await repo.fork(\n\t\t\t\tsource.metadata,\n\t\t\t\t{ id: \"before-root\", scope: \"branch\", branch: \"main\", entryId: ROOT_ID, position: \"before\" },\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tstrictEqual(await getBranchTip(beforeRoot), null);\n\t\t\tdeepStrictEqual(await beforeRoot.findEntries({ order: \"asc\" }, BACKGROUND_CONTEXT), []);\n\n\t\t\tconst empty = await repo.fork(\n\t\t\t\tsource.metadata,\n\t\t\t\t{ id: \"empty\", scope: \"branch\", branch: \"empty\" },\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tstrictEqual(await getBranchTip(empty, \"empty\"), null);\n\t\t\tdeepStrictEqual(await empty.findEntries({ order: \"asc\" }, BACKGROUND_CONTEXT), []);\n\n\t\t\tfor (const [id, branch, entryId] of [\n\t\t\t\t[\"off-branch\", \"main\", SIBLING_ID],\n\t\t\t\t[\"unknown\", \"main\", UNKNOWN_ID],\n\t\t\t\t[\"null-tip\", \"empty\", ROOT_ID],\n\t\t\t] as const) {\n\t\t\t\tawait rejects(repo.fork(source.metadata, { id, scope: \"branch\", branch, entryId }, BACKGROUND_CONTEXT));\n\t\t\t}\n\t\t\tdeepStrictEqual((await repo.list(undefined, BACKGROUND_CONTEXT)).map(({ id }) => id).sort(), [\n\t\t\t\t\"before\",\n\t\t\t\t\"before-root\",\n\t\t\t\t\"empty\",\n\t\t\t\t\"mid\",\n\t\t\t\t\"source\",\n\t\t\t]);\n\t\t\tawait Promise.all([\n\t\t\t\tsource.close(BACKGROUND_CONTEXT),\n\t\t\t\tbefore.close(BACKGROUND_CONTEXT),\n\t\t\t\tbeforeRoot.close(BACKGROUND_CONTEXT),\n\t\t\t\tempty.close(BACKGROUND_CONTEXT),\n\t\t\t\tmid.close(BACKGROUND_CONTEXT),\n\t\t\t]);\n\t\t}),\n\t\tcreateCase(factory, \"forks\", \"forks a closed source session\", async ({ repo }) => {\n\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\tawait source.mutate(\n\t\t\t\t(mutator) =>\n\t\t\t\t\tmutator.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tinsertEntry({\n\t\t\t\t\t\t\t\tid: ROOT_ID,\n\t\t\t\t\t\t\t\tparentId: null,\n\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\tcustomType: \"root\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tsetValue(branchTip(\"main\"), ROOT_ID),\n\t\t\t\t\t\t\tsetValue(laneConfig(\"main\"), configuration),\n\t\t\t\t\t\t\tsetValue(laneState(\"main\"), idleLaneState),\n\t\t\t\t\t\t\tsetValue(applicationValue, \"excluded\"),\n\t\t\t\t\t\t\tappendList(applicationList, \"excluded\"),\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\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tawait source.close(BACKGROUND_CONTEXT);\n\n\t\t\tconst fork = await repo.fork(\n\t\t\t\tsource.metadata,\n\t\t\t\t{ id: \"fork\", scope: \"branch\", branch: \"main\" },\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tstrictEqual(await getBranchTip(fork), ROOT_ID);\n\t\t\tdeepStrictEqual((await fork.getValue(laneConfig(\"main\"), BACKGROUND_CONTEXT))?.value, configuration);\n\t\t\tdeepStrictEqual((await fork.getValue(laneState(\"main\"), BACKGROUND_CONTEXT))?.value, idleLaneState);\n\t\t\tstrictEqual(await fork.getValue(applicationValue, BACKGROUND_CONTEXT), undefined);\n\t\t\tdeepStrictEqual(await fork.readList(applicationList, undefined, BACKGROUND_CONTEXT), []);\n\t\t\tawait fork.close(BACKGROUND_CONTEXT);\n\t\t}),\n\n\t\tcreateCase(factory, \"forks\", \"forks the whole configured tree with fresh lane state\", async ({ repo }) => {\n\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\tawait source.mutate(\n\t\t\t\t(mutator) =>\n\t\t\t\t\tmutator.commit(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tinsertEntry({\n\t\t\t\t\t\t\t\tid: ROOT_ID,\n\t\t\t\t\t\t\t\tparentId: null,\n\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\tcustomType: \"root\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tinsertEntry({\n\t\t\t\t\t\t\t\tid: CHILD_ID,\n\t\t\t\t\t\t\t\tparentId: ROOT_ID,\n\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\tcustomType: \"child\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tinsertEntry({\n\t\t\t\t\t\t\t\tid: SIBLING_ID,\n\t\t\t\t\t\t\t\tparentId: ROOT_ID,\n\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\tcustomType: \"sibling\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tsetValue(branchTip(\"main\"), CHILD_ID),\n\t\t\t\t\t\t\tsetValue(laneConfig(\"main\"), configuration),\n\t\t\t\t\t\t\tsetValue(laneState(\"main\"), idleLaneState),\n\t\t\t\t\t\t\tsetValue(branchTip(\"review\"), SIBLING_ID),\n\t\t\t\t\t\t\tsetValue(laneConfig(\"review\"), configuration),\n\t\t\t\t\t\t\tsetValue(laneState(\"review\"), idleLaneState),\n\t\t\t\t\t\t\tsetValue(branchTip(\"notes\"), ROOT_ID),\n\t\t\t\t\t\t\tsetValue(applicationValue, { copied: true }),\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\tBACKGROUND_CONTEXT,\n\t\t\t);\n\n\t\t\tconst fork = await repo.fork(source.metadata, { id: \"fork\", scope: \"tree\" }, BACKGROUND_CONTEXT);\n\n\t\t\tdeepStrictEqual(\n\t\t\t\t(await fork.findEntries({ order: \"asc\" }, BACKGROUND_CONTEXT)).map(({ id }) => id),\n\t\t\t\t[ROOT_ID, CHILD_ID, SIBLING_ID],\n\t\t\t);\n\t\t\tstrictEqual(await getBranchTip(fork), CHILD_ID);\n\t\t\tstrictEqual(await getBranchTip(fork, \"review\"), SIBLING_ID);\n\t\t\tstrictEqual(await getBranchTip(fork, \"notes\"), ROOT_ID);\n\t\t\tstrictEqual(await fork.getValue(laneConfig(\"notes\"), BACKGROUND_CONTEXT), undefined);\n\t\t\tstrictEqual(await fork.getValue(laneState(\"notes\"), BACKGROUND_CONTEXT), undefined);\n\t\t\tdeepStrictEqual((await fork.getValue(laneConfig(\"review\"), BACKGROUND_CONTEXT))?.value, configuration);\n\t\t\tdeepStrictEqual((await fork.getValue(laneState(\"review\"), BACKGROUND_CONTEXT))?.value, idleLaneState);\n\t\t\tdeepStrictEqual((await fork.getValue(applicationValue, BACKGROUND_CONTEXT))?.value, { copied: true });\n\t\t\tawait Promise.all([source.close(BACKGROUND_CONTEXT), fork.close(BACKGROUND_CONTEXT)]);\n\t\t}),\n\t\tcreateCase(factory, \"forks\", \"rejects only surviving unknown reserved scalar state\", async ({ repo }) => {\n\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\tawait source.createBranch(\"main\", null, BACKGROUND_CONTEXT);\n\t\t\tawait source.mutate(\n\t\t\t\t(mutator) =>\n\t\t\t\t\tmutator.commit(\n\t\t\t\t\t\t[setValue(laneConfig(\"main\"), configuration), setValue(laneState(\"main\"), idleLaneState)],\n\t\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t\t),\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\n\t\t\tfor (const namespace of [\"pi\", \"pi.unknown\"] as const) {\n\t\t\t\tconst address = value<JsonValue>(namespace);\n\t\t\t\tawait source.setValue(address, true, BACKGROUND_CONTEXT);\n\t\t\t\tawait rejects(repo.fork(source.metadata, { id: \"tree\", scope: \"tree\" }, BACKGROUND_CONTEXT));\n\t\t\t\tawait rejects(\n\t\t\t\t\trepo.fork(source.metadata, { id: \"branch\", scope: \"branch\", branch: \"main\" }, BACKGROUND_CONTEXT),\n\t\t\t\t);\n\t\t\t\tawait source.deleteValue(address, BACKGROUND_CONTEXT);\n\t\t\t}\n\t\t\tawait source.close(BACKGROUND_CONTEXT);\n\n\t\t\tconst tree = await repo.fork(source.metadata, { id: \"tree\", scope: \"tree\" }, BACKGROUND_CONTEXT);\n\t\t\tconst branch = await repo.fork(\n\t\t\t\tsource.metadata,\n\t\t\t\t{ id: \"branch\", scope: \"branch\", branch: \"main\" },\n\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t);\n\t\t\tawait Promise.all([tree.close(BACKGROUND_CONTEXT), branch.close(BACKGROUND_CONTEXT)]);\n\t\t}),\n\t];\n}\n\n/** Creates fork cases that require destination reservation across create and fork. */\nexport function createSessionRepoForkDestinationReservationConformance<TMetadata extends SessionMetadata>(\n\tbackendFactory: () => Promise<Pick<SessionRepo<TMetadata>, \"create\" | \"fork\">>,\n\tonClose?: () => void | Promise<void>,\n): readonly ConformanceCase[] {\n\tconst factory = prepareRepoCaseFactory(backendFactory, onClose);\n\treturn [\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"fork coordination\",\n\t\t\t\"publishes create when it reserves a shared destination id first\",\n\t\t\tasync ({ repo }) => {\n\t\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\t\tconst results = await Promise.allSettled([\n\t\t\t\t\trepo.create({ id: \"destination\" }, BACKGROUND_CONTEXT),\n\t\t\t\t\trepo.fork(source.metadata, { id: \"destination\", scope: \"tree\" }, BACKGROUND_CONTEXT),\n\t\t\t\t]);\n\t\t\t\tstrictEqual(results[0].status, \"fulfilled\");\n\t\t\t\tstrictEqual(results[1].status, \"rejected\");\n\t\t\t\tif (results[0].status === \"fulfilled\") await results[0].value.close(BACKGROUND_CONTEXT);\n\t\t\t\tawait source.close(BACKGROUND_CONTEXT);\n\t\t\t},\n\t\t),\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"fork coordination\",\n\t\t\t\"publishes fork when it reserves a shared destination id first\",\n\t\t\tasync ({ repo }) => {\n\t\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\t\tconst results = await Promise.allSettled([\n\t\t\t\t\trepo.fork(source.metadata, { id: \"destination\", scope: \"tree\" }, BACKGROUND_CONTEXT),\n\t\t\t\t\trepo.create({ id: \"destination\" }, BACKGROUND_CONTEXT),\n\t\t\t\t]);\n\t\t\t\tstrictEqual(results[0].status, \"fulfilled\");\n\t\t\t\tstrictEqual(results[1].status, \"rejected\");\n\t\t\t\tif (results[0].status === \"fulfilled\") await results[0].value.close(BACKGROUND_CONTEXT);\n\t\t\t\tawait source.close(BACKGROUND_CONTEXT);\n\t\t\t},\n\t\t),\n\t];\n}\n\n/** Creates fork cases that require a snapshot boundary on an active source storage queue. */\nexport function createSessionRepoForkSourceSnapshotConformance<TMetadata extends SessionMetadata>(\n\tbackendFactory: () => Promise<Pick<SessionRepo<TMetadata>, \"create\" | \"fork\">>,\n\tonClose?: () => void | Promise<void>,\n): readonly ConformanceCase[] {\n\tconst factory = prepareRepoCaseFactory(backendFactory, onClose);\n\treturn [\n\t\tcreateCase(\n\t\t\tfactory,\n\t\t\t\"fork coordination\",\n\t\t\t\"captures one coherent boundary between source commits\",\n\t\t\tasync ({ repo }) => {\n\t\t\t\tconst source = await repo.create({ id: \"source\" }, BACKGROUND_CONTEXT);\n\t\t\t\tconst firstMutation = await source.beginMutation(BACKGROUND_CONTEXT);\n\t\t\t\tconst firstCommit = firstMutation.commit(\n\t\t\t\t\t[\n\t\t\t\t\t\tinsertEntry({\n\t\t\t\t\t\t\tid: ROOT_ID,\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: \"first\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tsetValue(branchTip(\"main\"), ROOT_ID),\n\t\t\t\t\t\tsetValue(laneConfig(\"main\"), configuration),\n\t\t\t\t\t\tsetValue(laneState(\"main\"), idleLaneState),\n\t\t\t\t\t\tsetValue(sessionName, \"first name\"),\n\t\t\t\t\t\tsetValue(entryLabel(ROOT_ID), \"first label\"),\n\t\t\t\t\t],\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tconst fork = repo.fork(\n\t\t\t\t\tsource.metadata,\n\t\t\t\t\t{ id: \"fork\", scope: \"branch\", branch: \"main\" },\n\t\t\t\t\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\t\t\t\tconst secondCommit = source.mutate(\n\t\t\t\t\t(mutator) =>\n\t\t\t\t\t\tmutator.commit(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tinsertEntry({\n\t\t\t\t\t\t\t\t\tid: CHILD_ID,\n\t\t\t\t\t\t\t\t\tparentId: ROOT_ID,\n\t\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\t\tcustomType: \"second\",\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tsetValue(branchTip(\"main\"), CHILD_ID),\n\t\t\t\t\t\t\t\tsetValue(sessionName, \"second name\"),\n\t\t\t\t\t\t\t\tsetValue(entryLabel(ROOT_ID), \"second label\"),\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\tBACKGROUND_CONTEXT,\n\t\t\t\t);\n\n\t\t\t\tconst [, forked] = await Promise.all([firstCommit, fork]);\n\t\t\t\tawait firstMutation.end(BACKGROUND_CONTEXT);\n\t\t\t\tawait secondCommit;\n\t\t\t\tstrictEqual(await getBranchTip(forked), ROOT_ID);\n\t\t\t\tdeepStrictEqual(\n\t\t\t\t\t(await forked.findEntries({ order: \"asc\" }, BACKGROUND_CONTEXT)).map(({ id }) => id),\n\t\t\t\t\t[ROOT_ID],\n\t\t\t\t);\n\t\t\t\tstrictEqual(await forked.getName(BACKGROUND_CONTEXT), \"first name\");\n\t\t\t\tstrictEqual(await forked.getLabel(ROOT_ID, BACKGROUND_CONTEXT), \"first label\");\n\t\t\t\tawait Promise.all([source.close(BACKGROUND_CONTEXT), forked.close(BACKGROUND_CONTEXT)]);\n\t\t\t},\n\t\t),\n\t];\n}\n\n/** Creates every fork coordination case. */\nexport function createSessionRepoForkCoordinationConformance<TMetadata extends SessionMetadata>(\n\tbackendFactory: () => Promise<Pick<SessionRepo<TMetadata>, \"create\" | \"fork\">>,\n\tonClose?: () => void | Promise<void>,\n): readonly ConformanceCase[] {\n\treturn [\n\t\t...createSessionRepoForkDestinationReservationConformance(backendFactory, onClose),\n\t\t...createSessionRepoForkSourceSnapshotConformance(backendFactory, onClose),\n\t];\n}\n\n/** Creates every fork conformance case. */\nexport function createSessionRepoForkConformance<TMetadata extends SessionMetadata>(\n\tbackendFactory: () => Promise<Pick<SessionRepo<TMetadata>, \"create\" | \"list\" | \"fork\">>,\n\tonClose?: () => void | Promise<void>,\n): readonly ConformanceCase[] {\n\treturn [\n\t\t...createSessionRepoForkBehaviorConformance(backendFactory, onClose),\n\t\t...createSessionRepoForkCoordinationConformance(backendFactory, onClose),\n\t];\n}\n\n/** Creates every SessionRepo conformance case. */\nexport function createSessionRepoConformance<TMetadata extends SessionMetadata>(\n\tfactory: () => Promise<SessionRepo<TMetadata>>,\n\tonClose?: () => void | Promise<void>,\n): readonly ConformanceCase[] {\n\treturn [\n\t\t...createSessionRepoLifecycleConformance(factory, onClose),\n\t\t...createSessionRepoOwnershipConformance(factory, onClose),\n\t\t...createSessionRepoMessageConformance(factory, onClose),\n\t\t...createSessionRepoForkConformance(factory, onClose),\n\t];\n}\n"]}