@earendil-works/pi-agent-core 0.84.4 → 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 +9 -0
  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 +239 -86
  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 +2 -0
  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,4 @@
1
+ export declare function retryDelay(baseDelayMs: number, attempt: number): number;
2
+ export declare function retryNotBefore(baseDelayMs: number, attempt: number, now?: number): number;
3
+ export declare function waitUntil(notBefore: number, signal: AbortSignal): Promise<void>;
4
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/retry.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvE;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,CAG7F;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB/E","sourcesContent":["export function retryDelay(baseDelayMs: number, attempt: number): number {\n\tconst delay = baseDelayMs * 2 ** Math.max(0, attempt - 1);\n\treturn Number.isSafeInteger(delay) ? delay : Number.MAX_SAFE_INTEGER;\n}\n\nexport function retryNotBefore(baseDelayMs: number, attempt: number, now = Date.now()): number {\n\tconst sum = now + retryDelay(baseDelayMs, attempt);\n\treturn Number.isSafeInteger(sum) ? sum : Number.MAX_SAFE_INTEGER;\n}\n\nexport function waitUntil(notBefore: number, signal: AbortSignal): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t\tconst onAbort = () => {\n\t\t\tcleanup();\n\t\t\treject(signal.reason);\n\t\t};\n\t\tconst check = () => {\n\t\t\tconst remaining = notBefore - Date.now();\n\t\t\tif (remaining <= 0) {\n\t\t\t\tcleanup();\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttimer = setTimeout(check, Math.min(remaining, 2_147_483_647));\n\t\t};\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tif (signal.aborted) onAbort();\n\t\telse check();\n\t});\n}\n"]}
@@ -0,0 +1,37 @@
1
+ export function retryDelay(baseDelayMs, attempt) {
2
+ const delay = baseDelayMs * 2 ** Math.max(0, attempt - 1);
3
+ return Number.isSafeInteger(delay) ? delay : Number.MAX_SAFE_INTEGER;
4
+ }
5
+ export function retryNotBefore(baseDelayMs, attempt, now = Date.now()) {
6
+ const sum = now + retryDelay(baseDelayMs, attempt);
7
+ return Number.isSafeInteger(sum) ? sum : Number.MAX_SAFE_INTEGER;
8
+ }
9
+ export function waitUntil(notBefore, signal) {
10
+ return new Promise((resolve, reject) => {
11
+ let timer;
12
+ const cleanup = () => {
13
+ if (timer !== undefined)
14
+ clearTimeout(timer);
15
+ signal.removeEventListener("abort", onAbort);
16
+ };
17
+ const onAbort = () => {
18
+ cleanup();
19
+ reject(signal.reason);
20
+ };
21
+ const check = () => {
22
+ const remaining = notBefore - Date.now();
23
+ if (remaining <= 0) {
24
+ cleanup();
25
+ resolve();
26
+ return;
27
+ }
28
+ timer = setTimeout(check, Math.min(remaining, 2_147_483_647));
29
+ };
30
+ signal.addEventListener("abort", onAbort, { once: true });
31
+ if (signal.aborted)
32
+ onAbort();
33
+ else
34
+ check();
35
+ });
36
+ }
37
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/retry.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,OAAe,EAAU;IACxE,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;AAAA,CACrE;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,OAAe,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAU;IAC9F,MAAM,GAAG,GAAG,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;AAAA,CACjE;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,MAAmB,EAAiB;IAChF,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QAC7C,IAAI,KAAgD,CAAC;QACrD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;YACrB,IAAI,KAAK,KAAK,SAAS;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAAA,CAC7C,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAAA,CACtB,CAAC;QACF,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACpB,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YACD,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;QAAA,CAC9D,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;;YACzB,KAAK,EAAE,CAAC;IAAA,CACb,CAAC,CAAC;AAAA,CACH","sourcesContent":["export function retryDelay(baseDelayMs: number, attempt: number): number {\n\tconst delay = baseDelayMs * 2 ** Math.max(0, attempt - 1);\n\treturn Number.isSafeInteger(delay) ? delay : Number.MAX_SAFE_INTEGER;\n}\n\nexport function retryNotBefore(baseDelayMs: number, attempt: number, now = Date.now()): number {\n\tconst sum = now + retryDelay(baseDelayMs, attempt);\n\treturn Number.isSafeInteger(sum) ? sum : Number.MAX_SAFE_INTEGER;\n}\n\nexport function waitUntil(notBefore: number, signal: AbortSignal): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\t\tconst cleanup = () => {\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t};\n\t\tconst onAbort = () => {\n\t\t\tcleanup();\n\t\t\treject(signal.reason);\n\t\t};\n\t\tconst check = () => {\n\t\t\tconst remaining = notBefore - Date.now();\n\t\t\tif (remaining <= 0) {\n\t\t\t\tcleanup();\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttimer = setTimeout(check, Math.min(remaining, 2_147_483_647));\n\t\t};\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tif (signal.aborted) onAbort();\n\t\telse check();\n\t});\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import type { BranchPreparation } from "../../compaction/branch-summarization.ts";
2
+ import type { CompactionPreparation } from "../../compaction/compaction.ts";
3
+ import { type AssistantEffectPendingOperation, type CheckpointOperation, type DurableStructuralPreparation, type NavigationReadyToCommitOperation, type SummaryDecidingOperation, type SummaryEffectPendingOperation, type SummaryReadyOperation, type SummaryRetryWaitOperation } from "../../session/types.ts";
4
+ import type { Lane } from "../lane.ts";
5
+ import type { ContinueOperationResult, Drive, ProcedureResult } from "../types.ts";
6
+ export declare function durableCompactionPreparation(preparation: CompactionPreparation): Extract<DurableStructuralPreparation, {
7
+ kind: "compaction";
8
+ }>;
9
+ export declare function durableBranchPreparation(preparation: BranchPreparation): Extract<DurableStructuralPreparation, {
10
+ kind: "branch_summary";
11
+ }>;
12
+ /** Consume one durable structural preparation and decision hook. */
13
+ export declare function runStructuralDecision<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive, deciding: SummaryDecidingOperation): Promise<ProcedureResult>;
14
+ /** Execute one ready structural generation attempt. */
15
+ export declare function runStructuralGeneration<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive, ready: SummaryReadyOperation): Promise<ProcedureResult>;
16
+ /** Consume one structural retry wait without starting a provider effect. */
17
+ export declare function runStructuralRetryWait<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive, retry: SummaryRetryWaitOperation): Promise<ProcedureResult>;
18
+ /** Convert an orphaned structural attempt into a fresh numbered attempt or terminal failure. */
19
+ export declare function recoverStructuralGeneration<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive, effect: SummaryEffectPendingOperation): Promise<ProcedureResult>;
20
+ /** Prepare threshold compaction only when no newer compaction already guards this trigger. */
21
+ export declare function prepareCompactionThreshold<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive, checkpoint: CheckpointOperation): Promise<ContinueOperationResult<{
22
+ taskId: string;
23
+ preparation: DurableStructuralPreparation;
24
+ } | undefined>>;
25
+ /** Prepare one overflow compaction before the response settlement transaction. */
26
+ export declare function prepareOverflowCompaction<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive, generation: AssistantEffectPendingOperation): Promise<{
27
+ taskId: string;
28
+ preparation: DurableStructuralPreparation;
29
+ } | undefined>;
30
+ /** Atomically move an unsummarized navigation and finish its operation. */
31
+ export declare function commitNavigation<TContext extends object | undefined>(lane: Lane<TContext>, drive: Drive, navigation: NavigationReadyToCommitOperation): Promise<ProcedureResult>;
32
+ //# sourceMappingURL=structural.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural.d.ts","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/structural.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,0CAA0C,CAAC;AAEvG,OAAO,KAAK,EAAE,qBAAqB,EAAiC,MAAM,gCAAgC,CAAC;AAO3G,OAAO,EACN,KAAK,+BAA+B,EAGpC,KAAK,mBAAmB,EAIxB,KAAK,4BAA4B,EAGjC,KAAK,gCAAgC,EAMrC,KAAK,wBAAwB,EAC7B,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAI9B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA2BnF,wBAAgB,4BAA4B,CAC3C,WAAW,EAAE,qBAAqB,GAChC,OAAO,CAAC,4BAA4B,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,CAY/D;AAED,wBAAgB,wBAAwB,CACvC,WAAW,EAAE,iBAAiB,GAC5B,OAAO,CAAC,4BAA4B,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAOnE;AA2fD,oEAAoE;AACpE,wBAAsB,qBAAqB,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EAC9E,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,wBAAwB,GAChC,OAAO,CAAC,eAAe,CAAC,CA4D1B;AAiVD,uDAAuD;AACvD,wBAAsB,uBAAuB,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EAChF,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,qBAAqB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAe1B;AAED,4EAA4E;AAC5E,wBAAsB,sBAAsB,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EAC/E,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,yBAAyB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAsC1B;AAED,gGAAgG;AAChG,wBAAsB,2BAA2B,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EACpF,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,6BAA6B,GACnC,OAAO,CAAC,eAAe,CAAC,CAkC1B;AAED,8FAA8F;AAC9F,wBAAsB,0BAA0B,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EACnF,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,mBAAmB,GAC7B,OAAO,CAAC,uBAAuB,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,4BAA4B,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,CA8B7G;AAED,kFAAkF;AAClF,wBAAsB,yBAAyB,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EAClF,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,+BAA+B,GACzC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,4BAA4B,CAAA;CAAE,GAAG,SAAS,CAAC,CAWpF;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EACnE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,gCAAgC,GAC1C,OAAO,CAAC,eAAe,CAAC,CA6C1B","sourcesContent":["import {\n\ttype Api,\n\ttype AssistantMessage,\n\tisRetryableAssistantError,\n\ttype Model,\n\ttype SimpleStreamOptions,\n} from \"@earendil-works/pi-ai\";\nimport type { HarnessEvent } from \"../../agent-harness.ts\";\nimport type { BranchPreparation, BranchSummaryResult } from \"../../compaction/branch-summarization.ts\";\nimport { generateBranchSummaryWithRequest } from \"../../compaction/branch-summarization.ts\";\nimport type { CompactionPreparation, CompactResult, SummaryRequest } from \"../../compaction/compaction.ts\";\nimport { compactWithRequest, prepareCompaction, shouldCompact } from \"../../compaction/compaction.ts\";\nimport { type Context, getTelemetryContext, withAbortSignal } from \"../../context.ts\";\nimport { AbortRequested } from \"../../execution/effect-gate.ts\";\nimport { applyStreamOptionsPatch } from \"../../hooks.ts\";\nimport { insertEntry, insertUsage } from \"../../session/commit.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport {\n\ttype AssistantEffectPendingOperation,\n\ttype AssistantReadyOperation,\n\ttype BranchSummaryEntry,\n\ttype CheckpointOperation,\n\ttype CommitResult,\n\ttype CompactionEntry,\n\ttype DurableFileOperations,\n\ttype DurableStructuralPreparation,\n\ttype JsonValue,\n\ttype LaneConfiguration,\n\ttype NavigationReadyToCommitOperation,\n\ttype NewEntry,\n\ttype OperationError,\n\toperationScopeOf,\n\ttype ResultBoundary,\n\ttype SummaryContext,\n\ttype SummaryDecidingOperation,\n\ttype SummaryEffectPendingOperation,\n\ttype SummaryReadyOperation,\n\ttype SummaryRetryWaitOperation,\n\ttype SummaryTask,\n\ttype UsageRow,\n\ttype Write,\n} from \"../../session/types.ts\";\nimport { branchTip, entryLabel, operationPreparation, setValue } from \"../../session/values.ts\";\nimport type { AgentHarnessStreamOptions } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport { committedEntryEvents, readBoundedEntries } from \"../transcript.ts\";\nimport type { ContinueOperationResult, Drive, ProcedureResult } from \"../types.ts\";\nimport {\n\tassistantReadyAtBoundary,\n\ttype BoundaryFinishPending,\n\tboundaryPlacementEvents,\n\tfinishRunBoundary,\n\tnormalizedRetryPolicy,\n\tplanBoundaryInbox,\n} from \"./boundary.ts\";\nimport { retryDelay, retryNotBefore, waitUntil } from \"./retry.ts\";\nimport { operationCleanupWrites, operationResultRecord } from \"./terminal.ts\";\n\nclass StructuralCancelled extends Error {\n\tconstructor() {\n\t\tsuper(\"Structural generation was cancelled\");\n\t\tthis.name = \"StructuralCancelled\";\n\t}\n}\n\nfunction durableFileOperations(fileOps: CompactionPreparation[\"fileOps\"]): DurableFileOperations {\n\treturn {\n\t\tread: [...fileOps.read],\n\t\twritten: [...fileOps.written],\n\t\tedited: [...fileOps.edited],\n\t};\n}\n\nexport function durableCompactionPreparation(\n\tpreparation: CompactionPreparation,\n): Extract<DurableStructuralPreparation, { kind: \"compaction\" }> {\n\treturn {\n\t\tkind: \"compaction\",\n\t\tmessagesToSummarize: preparation.messagesToSummarize,\n\t\tturnPrefixMessages: preparation.turnPrefixMessages,\n\t\tretainedTail: preparation.retainedTail,\n\t\tisSplitTurn: preparation.isSplitTurn,\n\t\ttokensBefore: preparation.tokensBefore,\n\t\t...(preparation.previousSummary === undefined ? {} : { previousSummary: preparation.previousSummary }),\n\t\tfileOps: durableFileOperations(preparation.fileOps),\n\t\tsettings: preparation.settings,\n\t};\n}\n\nexport function durableBranchPreparation(\n\tpreparation: BranchPreparation,\n): Extract<DurableStructuralPreparation, { kind: \"branch_summary\" }> {\n\treturn {\n\t\tkind: \"branch_summary\",\n\t\tmessages: preparation.messages,\n\t\tfileOps: durableFileOperations(preparation.fileOps),\n\t\ttotalTokens: preparation.totalTokens,\n\t};\n}\n\nfunction fileOperations(fileOps: DurableFileOperations): CompactionPreparation[\"fileOps\"] {\n\treturn {\n\t\tread: new Set(fileOps.read),\n\t\twritten: new Set(fileOps.written),\n\t\tedited: new Set(fileOps.edited),\n\t};\n}\n\nfunction compactionPreparation(\n\tpreparation: Extract<DurableStructuralPreparation, { kind: \"compaction\" }>,\n): CompactionPreparation {\n\treturn {\n\t\tmessagesToSummarize: preparation.messagesToSummarize,\n\t\tturnPrefixMessages: preparation.turnPrefixMessages,\n\t\tretainedTail: preparation.retainedTail,\n\t\tisSplitTurn: preparation.isSplitTurn,\n\t\ttokensBefore: preparation.tokensBefore,\n\t\t...(preparation.previousSummary === undefined ? {} : { previousSummary: preparation.previousSummary }),\n\t\tfileOps: fileOperations(preparation.fileOps),\n\t\tsettings: preparation.settings,\n\t};\n}\n\nfunction branchPreparation(\n\tpreparation: Extract<DurableStructuralPreparation, { kind: \"branch_summary\" }>,\n): BranchPreparation {\n\treturn {\n\t\tmessages: preparation.messages,\n\t\tfileOps: fileOperations(preparation.fileOps),\n\t\ttotalTokens: preparation.totalTokens,\n\t};\n}\n\nfunction summaryKind(task: SummaryTask): DurableStructuralPreparation[\"kind\"] {\n\treturn task.boundary.kind === \"commit_navigation\" ? \"branch_summary\" : \"compaction\";\n}\n\nfunction compactionReason(task: SummaryTask): \"manual\" | \"threshold\" | \"overflow\" {\n\tif (task.reason !== undefined) return task.reason;\n\tif (task.boundary.kind === \"finish\") return \"manual\";\n\tthrow new SessionInvariantError(`In-run compaction task ${task.taskId} is missing its reason`);\n}\n\nfunction navigationBoundary(task: SummaryTask): Extract<ResultBoundary, { kind: \"commit_navigation\" }> {\n\tif (task.boundary.kind !== \"commit_navigation\") {\n\t\tthrow new SessionInvariantError(`Summary task ${task.taskId} is not a navigation`);\n\t}\n\treturn task.boundary;\n}\n\nasync function readStructuralPreparation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeciding: SummaryDecidingOperation,\n): Promise<ContinueOperationResult<CompactionPreparation | BranchPreparation>> {\n\treturn lane.continueOperation(\n\t\tdeciding,\n\t\tasync (_state, current, _meta, reader) => {\n\t\t\tconst expected = summaryKind(current.task);\n\t\t\tconst stored = await reader.getValue(\n\t\t\t\toperationPreparation(drive.operationId, current.task.taskId),\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t\tif (stored?.value.kind !== expected) {\n\t\t\t\tthrow new SessionInvariantError(\n\t\t\t\t\t`Structural task ${current.task.taskId} is missing its ${expected} preparation`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (current.task.boundary.kind === \"commit_navigation\") {\n\t\t\t\tconst targetId = current.task.boundary.targetId;\n\t\t\t\tif (!(await reader.getEntries([targetId], drive.context)).has(targetId)) {\n\t\t\t\t\tthrow new SessionInvariantError(`Navigation target ${targetId} is missing`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"return\",\n\t\t\t\tresult:\n\t\t\t\t\tstored.value.kind === \"compaction\"\n\t\t\t\t\t\t? compactionPreparation(stored.value)\n\t\t\t\t\t\t: branchPreparation(stored.value),\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nfunction summaryContext<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tresultEntryId: string,\n\tconfiguration: LaneConfiguration,\n): SummaryContext {\n\treturn {\n\t\tresultEntryId,\n\t\tconfiguration,\n\t\tstreamOptions: { ...lane.readConfig().streamOptions, deferred: false },\n\t\tretryPolicy: normalizedRetryPolicy(lane),\n\t};\n}\n\nfunction usageEvent(row: Omit<UsageRow, \"seq\">, writeIndex: number, commit: CommitResult, lane: string): HarnessEvent {\n\treturn {\n\t\ttype: \"usage\",\n\t\tlane,\n\t\trow: { ...row, seq: commit.seqs[writeIndex]! },\n\t\ttotals: commit.stats.usage,\n\t};\n}\n\nfunction operationError(code: string, message: string, details?: JsonValue): OperationError {\n\treturn { code, message, ...(details === undefined ? {} : { details }) };\n}\n\ntype StructuralOutcome =\n\t| { kind: \"compaction\"; resultEntryId: string; result: CompactResult; fromHook: boolean }\n\t| { kind: \"branch_summary\"; resultEntryId: string; result: BranchSummaryResult; fromHook: boolean }\n\t| { kind: \"declined\" }\n\t| { kind: \"failed\"; error: OperationError };\n\ntype StructuralPublication = ProcedureResult | BoundaryFinishPending;\n\nasync function publishStructuralOutcome<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: SummaryDecidingOperation | SummaryReadyOperation | SummaryEffectPendingOperation,\n\toutcome: StructuralOutcome,\n): Promise<ProcedureResult> {\n\tconst hookUsageId =\n\t\t(outcome.kind === \"compaction\" || outcome.kind === \"branch_summary\") &&\n\t\toutcome.fromHook &&\n\t\toutcome.result.usage !== undefined\n\t\t\t? lane.session.idGenerator.next()\n\t\t\t: undefined;\n\tconst published = await lane.continueOperation<\n\t\tSummaryDecidingOperation | SummaryReadyOperation | SummaryEffectPendingOperation,\n\t\tStructuralPublication\n\t>(\n\t\tcapability,\n\t\tasync (state, current, meta, reader) => {\n\t\t\tconst expected = summaryKind(current.task);\n\t\t\tlet terminalCompactionEndedAt: number | undefined;\n\t\t\tif ((outcome.kind === \"compaction\" || outcome.kind === \"branch_summary\") && outcome.kind !== expected) {\n\t\t\t\tthrow new SessionInvariantError(\n\t\t\t\t\t`Structural ${outcome.kind} result does not match ${expected} task ${current.task.taskId}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst writes: Write[] = [];\n\t\t\tconst baseEvents: ((commit: CommitResult) => HarnessEvent[])[] = [];\n\t\t\tlet terminalTipId = state.tipId;\n\t\t\tif (hookUsageId !== undefined && (outcome.kind === \"compaction\" || outcome.kind === \"branch_summary\")) {\n\t\t\t\tconst usage = outcome.result.usage;\n\t\t\t\tif (usage === undefined) throw new SessionInvariantError(\"Hook usage id exists without structural usage\");\n\t\t\t\tconst row: Omit<UsageRow, \"seq\"> = { id: hookUsageId, usage, adjustment: false };\n\t\t\t\tconst writeIndex = writes.length;\n\t\t\t\twrites.push(insertUsage(row));\n\t\t\t\tbaseEvents.push((commit) => [usageEvent(row, writeIndex, commit, lane.name)]);\n\t\t\t}\n\n\t\t\tif (outcome.kind === \"compaction\") {\n\t\t\t\tconst entry: NewEntry<CompactionEntry> = {\n\t\t\t\t\tid: outcome.resultEntryId,\n\t\t\t\t\tparentId: state.tipId,\n\t\t\t\t\ttype: \"compaction\",\n\t\t\t\t\tsummary: outcome.result.summary,\n\t\t\t\t\tretainedTail: outcome.result.retainedTail,\n\t\t\t\t\ttokensBefore: outcome.result.tokensBefore,\n\t\t\t\t\t...(outcome.result.details === undefined ? {} : { details: outcome.result.details }),\n\t\t\t\t\t...(outcome.result.usage === undefined ? {} : { usage: outcome.result.usage }),\n\t\t\t\t\tfromHook: outcome.fromHook,\n\t\t\t\t};\n\t\t\t\tconst entryWriteIndex = writes.length;\n\t\t\t\twrites.push(insertEntry(entry), setValue(branchTip(lane.name), outcome.resultEntryId));\n\t\t\t\tterminalTipId = outcome.resultEntryId;\n\t\t\t\tbaseEvents.push((commit) =>\n\t\t\t\t\tcommittedEntryEvents([entry], commit, lane.name, drive.operationId, entryWriteIndex),\n\t\t\t\t);\n\t\t\t} else if (outcome.kind === \"branch_summary\") {\n\t\t\t\tconst boundary = navigationBoundary(current.task);\n\t\t\t\tconst entry: NewEntry<BranchSummaryEntry> = {\n\t\t\t\t\tid: outcome.resultEntryId,\n\t\t\t\t\tparentId: boundary.targetId,\n\t\t\t\t\ttype: \"branch_summary\",\n\t\t\t\t\tfromId: meta.sourceTipId,\n\t\t\t\t\tsummary: outcome.result.summary,\n\t\t\t\t\tdetails: { readFiles: outcome.result.readFiles, modifiedFiles: outcome.result.modifiedFiles },\n\t\t\t\t\t...(outcome.result.usage === undefined ? {} : { usage: outcome.result.usage }),\n\t\t\t\t\tfromHook: outcome.fromHook,\n\t\t\t\t};\n\t\t\t\twrites.push(setValue(branchTip(lane.name), boundary.targetId));\n\t\t\t\tconst entryWriteIndex = writes.length;\n\t\t\t\twrites.push(insertEntry(entry), setValue(branchTip(lane.name), outcome.resultEntryId));\n\t\t\t\tif (boundary.label !== undefined) writes.push(setValue(entryLabel(boundary.targetId), boundary.label));\n\t\t\t\tterminalTipId = outcome.resultEntryId;\n\t\t\t\tbaseEvents.push((commit) =>\n\t\t\t\t\tcommittedEntryEvents([entry], commit, lane.name, drive.operationId, entryWriteIndex),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst attempt =\n\t\t\t\tcurrent.at === \"summary.ready\"\n\t\t\t\t\t? current.nextAttempt\n\t\t\t\t\t: current.at === \"summary.effect_pending\"\n\t\t\t\t\t\t? current.attempt\n\t\t\t\t\t\t: undefined;\n\t\t\tif (attempt !== undefined && attempt > 1) {\n\t\t\t\tbaseEvents.push(() => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"retry_end\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tstep: current.task.taskId,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\tsuccess: outcome.kind === \"compaction\" || outcome.kind === \"branch_summary\",\n\t\t\t\t\t\t...(outcome.kind === \"failed\" ? { finalError: outcome.error.message } : {}),\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t}\n\t\t\tif (outcome.kind === \"compaction\") {\n\t\t\t\tbaseEvents.push((commit) => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\treason: compactionReason(current.task),\n\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\tentryId: outcome.resultEntryId,\n\t\t\t\t\t\tendedAt: terminalCompactionEndedAt ?? commit.timestamp,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t}\n\t\t\tconst events = (commit: CommitResult): HarnessEvent[] =>\n\t\t\t\tbaseEvents.flatMap((materialize) => materialize(commit));\n\t\t\tswitch (current.task.boundary.kind) {\n\t\t\t\tcase \"resume_checkpoint\": {\n\t\t\t\t\tif (outcome.kind === \"branch_summary\") {\n\t\t\t\t\t\tthrow new SessionInvariantError(\"Run compaction boundary received a branch summary\");\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\toutcome.kind === \"compaction\" ||\n\t\t\t\t\t\t(outcome.kind === \"declined\" && current.task.reason === \"threshold\")\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (terminalTipId === null) throw new SessionInvariantError(\"Run compaction has no Branch tip\");\n\t\t\t\t\t\tconst continuation = current.task.boundary.resumeAfter.continuation;\n\t\t\t\t\t\tconst placement = await planBoundaryInbox(\n\t\t\t\t\t\t\tlane,\n\t\t\t\t\t\t\tdrive,\n\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\treader,\n\t\t\t\t\t\t\tterminalTipId,\n\t\t\t\t\t\t\toutcome.kind === \"declined\" && continuation.kind === \"may_finish\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\toutcome.kind === \"declined\" &&\n\t\t\t\t\t\t\tplacement.triggerEntryId === undefined &&\n\t\t\t\t\t\t\tcontinuation.kind === \"may_finish\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tkind: \"return\",\n\t\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\t\tkind: \"finish_pending\",\n\t\t\t\t\t\t\t\t\tentryIds: placement.entries.map((entry) => entry.id),\n\t\t\t\t\t\t\t\t} as const,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst placementWriteIndex = writes.length;\n\t\t\t\t\t\twrites.push(...placement.writes);\n\t\t\t\t\t\tlet operationState: AssistantReadyOperation | CheckpointOperation;\n\t\t\t\t\t\tif (placement.triggerEntryId !== undefined || continuation.kind === \"need_assistant\") {\n\t\t\t\t\t\t\tconst overflowRecoveryUsed =\n\t\t\t\t\t\t\t\tplacement.triggerEntryId === undefined && continuation.kind === \"need_assistant\"\n\t\t\t\t\t\t\t\t\t? continuation.overflowRecoveryUsed\n\t\t\t\t\t\t\t\t\t: false;\n\t\t\t\t\t\t\toperationState = assistantReadyAtBoundary(\n\t\t\t\t\t\t\t\tlane,\n\t\t\t\t\t\t\t\tstate,\n\t\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\t\tplacement.triggerEntryId ?? current.task.boundary.resumeAfter.triggerEntryId,\n\t\t\t\t\t\t\t\toverflowRecoveryUsed,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toperationState = {\n\t\t\t\t\t\t\t\t...operationScopeOf(current),\n\t\t\t\t\t\t\t\tat: \"checkpoint\",\n\t\t\t\t\t\t\t\t...current.task.boundary.resumeAfter,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkind: \"commit\",\n\t\t\t\t\t\t\twrites,\n\t\t\t\t\t\t\toperationState,\n\t\t\t\t\t\t\tlane: { tipId: placement.tipId, inbox: placement.inbox },\n\t\t\t\t\t\t\tmaterialize: () => ({ kind: \"continue\" }) as const,\n\t\t\t\t\t\t\tevents: (commit) => [\n\t\t\t\t\t\t\t\t...(outcome.kind === \"compaction\"\n\t\t\t\t\t\t\t\t\t? events(commit)\n\t\t\t\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"compaction_end\" as const,\n\t\t\t\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\t\t\t\treason: \"threshold\" as const,\n\t\t\t\t\t\t\t\t\t\t\t\tstatus: \"declined\" as const,\n\t\t\t\t\t\t\t\t\t\t\t\tendedAt: commit.timestamp,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t...boundaryPlacementEvents(\n\t\t\t\t\t\t\t\t\tplacement,\n\t\t\t\t\t\t\t\t\tcommit,\n\t\t\t\t\t\t\t\t\tplacementWriteIndex,\n\t\t\t\t\t\t\t\t\tlane.name,\n\t\t\t\t\t\t\t\t\tdrive.operationId,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (state.tipId === null) throw new SessionInvariantError(\"Failed run has no Branch tip\");\n\t\t\t\t\tconst error =\n\t\t\t\t\t\toutcome.kind === \"declined\"\n\t\t\t\t\t\t\t? operationError(\"compaction_declined\", \"Overflow compaction was declined\")\n\t\t\t\t\t\t\t: outcome.error;\n\t\t\t\t\tconst cleanup = await operationCleanupWrites(reader, drive.operationId, current, drive.context);\n\t\t\t\t\tconst record = operationResultRecord(meta, \"failed\", state.tipId, error);\n\t\t\t\t\tconst compactionEnd: HarnessEvent =\n\t\t\t\t\t\toutcome.kind === \"declined\"\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\treason: compactionReason(current.task),\n\t\t\t\t\t\t\t\t\tstatus: \"declined\",\n\t\t\t\t\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\treason: compactionReason(current.task),\n\t\t\t\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\t\t\t\terror: outcome.error,\n\t\t\t\t\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"finish\",\n\t\t\t\t\t\twrites: [...writes, ...cleanup],\n\t\t\t\t\t\trecord,\n\t\t\t\t\t\tmaterialize: () => ({ kind: \"settled\", outcome: record }) as const,\n\t\t\t\t\t\tevents: (commit) => [\n\t\t\t\t\t\t\t...events(commit),\n\t\t\t\t\t\t\tcompactionEnd,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"run_end\",\n\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tfromTipId: meta.sourceTipId,\n\t\t\t\t\t\t\t\ttipId: state.tipId,\n\t\t\t\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"finish\": {\n\t\t\t\t\tif (outcome.kind === \"branch_summary\") {\n\t\t\t\t\t\tthrow new SessionInvariantError(\"Compaction finish boundary received a branch summary\");\n\t\t\t\t\t}\n\t\t\t\t\tif (outcome.kind !== \"compaction\" && state.tipId === null) {\n\t\t\t\t\t\tthrow new SessionInvariantError(\"Standalone compaction has no Branch tip\");\n\t\t\t\t\t}\n\t\t\t\t\tconst error = outcome.kind === \"failed\" ? outcome.error : undefined;\n\t\t\t\t\tconst status =\n\t\t\t\t\t\toutcome.kind === \"declined\" ? \"declined\" : outcome.kind === \"failed\" ? \"failed\" : \"completed\";\n\t\t\t\t\tconst cleanup = await operationCleanupWrites(reader, drive.operationId, current, drive.context);\n\t\t\t\t\tconst record = operationResultRecord(meta, status, terminalTipId, error);\n\t\t\t\t\tterminalCompactionEndedAt = record.endedAt;\n\t\t\t\t\tconst compactionEnd: HarnessEvent | undefined =\n\t\t\t\t\t\toutcome.kind === \"compaction\"\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: outcome.kind === \"declined\"\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\t\treason: \"manual\",\n\t\t\t\t\t\t\t\t\t\tstatus: \"declined\",\n\t\t\t\t\t\t\t\t\t\tendedAt: record.endedAt,\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\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\t\treason: \"manual\",\n\t\t\t\t\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\t\t\t\t\terror: outcome.error,\n\t\t\t\t\t\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"finish\",\n\t\t\t\t\t\twrites: [...writes, ...cleanup],\n\t\t\t\t\t\trecord,\n\t\t\t\t\t\t...(outcome.kind === \"compaction\" ? { lane: { tipId: terminalTipId } } : {}),\n\t\t\t\t\t\tmaterialize: () => ({ kind: \"settled\", outcome: record }) as const,\n\t\t\t\t\t\tevents: (commit) => [...events(commit), ...(compactionEnd === undefined ? [] : [compactionEnd])],\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"commit_navigation\": {\n\t\t\t\t\tif (outcome.kind === \"compaction\") {\n\t\t\t\t\t\tthrow new SessionInvariantError(\"Navigation boundary received a compaction result\");\n\t\t\t\t\t}\n\t\t\t\t\tconst error = outcome.kind === \"failed\" ? outcome.error : undefined;\n\t\t\t\t\tconst status =\n\t\t\t\t\t\toutcome.kind === \"declined\" ? \"declined\" : outcome.kind === \"failed\" ? \"failed\" : \"completed\";\n\t\t\t\t\tconst cleanup = await operationCleanupWrites(reader, drive.operationId, current, drive.context);\n\t\t\t\t\tconst record = operationResultRecord(meta, status, terminalTipId, error);\n\t\t\t\t\tconst navigationEnd: HarnessEvent =\n\t\t\t\t\t\toutcome.kind === \"branch_summary\"\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\ttype: \"navigation_end\",\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\t\t\t\tfromTipId: meta.sourceTipId,\n\t\t\t\t\t\t\t\t\ttipId: terminalTipId,\n\t\t\t\t\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: outcome.kind === \"declined\"\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\ttype: \"navigation_end\",\n\t\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\t\tstatus: \"declined\",\n\t\t\t\t\t\t\t\t\t\tfromTipId: meta.sourceTipId,\n\t\t\t\t\t\t\t\t\t\ttipId: terminalTipId,\n\t\t\t\t\t\t\t\t\t\tendedAt: record.endedAt,\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\t\t\ttype: \"navigation_end\",\n\t\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\t\t\t\t\terror: outcome.error,\n\t\t\t\t\t\t\t\t\t\tfromTipId: meta.sourceTipId,\n\t\t\t\t\t\t\t\t\t\ttipId: terminalTipId,\n\t\t\t\t\t\t\t\t\t\tendedAt: record.endedAt,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"finish\",\n\t\t\t\t\t\twrites: [...writes, ...cleanup],\n\t\t\t\t\t\trecord,\n\t\t\t\t\t\t...(outcome.kind === \"branch_summary\" ? { lane: { tipId: terminalTipId } } : {}),\n\t\t\t\t\t\tmaterialize: () => ({ kind: \"settled\", outcome: record }) as const,\n\t\t\t\t\t\tevents: (commit) => [...events(commit), navigationEnd],\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdrive.context,\n\t);\n\tif (published.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tif (published.value.kind !== \"finish_pending\") return published.value;\n\tconst boundary = capability.task.boundary;\n\tif (boundary.kind !== \"resume_checkpoint\" || boundary.resumeAfter.continuation.kind !== \"may_finish\") {\n\t\tthrow new SessionInvariantError(\"Structural finish mediation requires a resumable finish boundary\");\n\t}\n\treturn finishRunBoundary(lane, drive, capability, boundary.resumeAfter.continuation, published.value.entryIds, [\n\t\t{\n\t\t\ttype: \"compaction_end\",\n\t\t\tlane: lane.name,\n\t\t\trunId: drive.operationId,\n\t\t\treason: \"threshold\",\n\t\t\tstatus: \"declined\",\n\t\t\tendedAt: Date.now(),\n\t\t},\n\t]);\n}\n\nasync function publishStructuralReady<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeciding: SummaryDecidingOperation,\n): Promise<ProcedureResult> {\n\tconst resultEntryId = lane.session.idGenerator.next();\n\tconst published = await lane.continueOperation(\n\t\tdeciding,\n\t\t(state, current) => {\n\t\t\tconst operationState: SummaryReadyOperation = {\n\t\t\t\t...operationScopeOf(current),\n\t\t\t\tat: \"summary.ready\",\n\t\t\t\ttask: current.task,\n\t\t\t\tsummaryContext: summaryContext(lane, resultEntryId, state.configuration),\n\t\t\t\tnextAttempt: 1,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [],\n\t\t\t\toperationState,\n\t\t\t\tmaterialize: () => ({ kind: \"continue\" }) as const,\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n\treturn published.kind === \"cancel_requested\" ? { kind: \"continue\" } : published.value;\n}\n\n/** Consume one durable structural preparation and decision hook. */\nexport async function runStructuralDecision<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tdeciding: SummaryDecidingOperation,\n): Promise<ProcedureResult> {\n\tconst preparation = await readStructuralPreparation(lane, drive, deciding);\n\tif (preparation.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tif (deciding.task.boundary.kind === \"commit_navigation\") {\n\t\tif (!(\"messages\" in preparation.value)) {\n\t\t\tthrow new SessionInvariantError(\"Navigation task has invalid durable preparation\");\n\t\t}\n\t\tconst hook = await lane.hooks.runWithGate(\n\t\t\t\"before_navigation\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttargetId: deciding.task.boundary.targetId,\n\t\t\t\tpreparation: preparation.value,\n\t\t\t\t...(deciding.task.customInstructions === undefined\n\t\t\t\t\t? {}\n\t\t\t\t\t: { customInstructions: deciding.task.customInstructions }),\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t\tif (hook?.decline === true) return publishStructuralOutcome(lane, drive, deciding, { kind: \"declined\" });\n\t\tif (hook?.summary !== undefined) {\n\t\t\treturn publishStructuralOutcome(lane, drive, deciding, {\n\t\t\t\tkind: \"branch_summary\",\n\t\t\t\tresultEntryId: lane.session.idGenerator.next(),\n\t\t\t\tresult: hook.summary,\n\t\t\t\tfromHook: true,\n\t\t\t});\n\t\t}\n\t\treturn publishStructuralReady(lane, drive, deciding);\n\t}\n\n\tif (!(\"messagesToSummarize\" in preparation.value)) {\n\t\tthrow new SessionInvariantError(\"Compaction task has invalid durable preparation\");\n\t}\n\tconst hook = await lane.hooks.runWithGate(\n\t\t\"before_compaction\",\n\t\t{\n\t\t\tlane: lane.name,\n\t\t\trunId: drive.operationId,\n\t\t\treason: compactionReason(deciding.task),\n\t\t\tpreparation: preparation.value,\n\t\t\t...(deciding.task.customInstructions === undefined\n\t\t\t\t? {}\n\t\t\t\t: { customInstructions: deciding.task.customInstructions }),\n\t\t},\n\t\tdrive.gate,\n\t\tdrive.context,\n\t);\n\tif (hook?.decline === true) return publishStructuralOutcome(lane, drive, deciding, { kind: \"declined\" });\n\tif (hook?.compaction !== undefined) {\n\t\treturn publishStructuralOutcome(lane, drive, deciding, {\n\t\t\tkind: \"compaction\",\n\t\t\tresultEntryId: lane.session.idGenerator.next(),\n\t\t\tresult: hook.compaction,\n\t\t\tfromHook: true,\n\t\t});\n\t}\n\treturn publishStructuralReady(lane, drive, deciding);\n}\n\nfunction effectPendingFromReady(ready: SummaryReadyOperation): SummaryEffectPendingOperation {\n\treturn {\n\t\t...operationScopeOf(ready),\n\t\tat: \"summary.effect_pending\",\n\t\ttask: ready.task,\n\t\tsummaryContext: ready.summaryContext,\n\t\tattempt: ready.nextAttempt,\n\t\tusageIds: [],\n\t};\n}\n\nfunction retryWaitFromEffect(effect: SummaryEffectPendingOperation, errorMessage: string): SummaryRetryWaitOperation {\n\treturn {\n\t\t...operationScopeOf(effect),\n\t\tat: \"summary.retry_wait\",\n\t\ttask: effect.task,\n\t\tsummaryContext: effect.summaryContext,\n\t\tnextAttempt: effect.attempt + 1,\n\t\tnotBefore: retryNotBefore(effect.summaryContext.retryPolicy.baseDelayMs, effect.attempt),\n\t\terrorMessage,\n\t};\n}\n\nfunction readyFromRetryWait(retry: SummaryRetryWaitOperation): SummaryReadyOperation {\n\treturn {\n\t\t...operationScopeOf(retry),\n\t\tat: \"summary.ready\",\n\t\ttask: retry.task,\n\t\tsummaryContext: retry.summaryContext,\n\t\tnextAttempt: retry.nextAttempt,\n\t};\n}\n\nasync function publishAttemptIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tready: SummaryReadyOperation,\n): Promise<ContinueOperationResult<SummaryEffectPendingOperation>> {\n\treturn lane.continueOperation(\n\t\tready,\n\t\t(_state, current) => {\n\t\t\tconst effectPending = effectPendingFromReady(current);\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [],\n\t\t\t\toperationState: effectPending,\n\t\t\t\tmaterialize: () => effectPending,\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function publishNestedRequestIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\teffect: SummaryEffectPendingOperation,\n\tindex: number,\n\tusageId: string,\n): Promise<ContinueOperationResult<SummaryEffectPendingOperation>> {\n\treturn lane.continueOperation(\n\t\teffect,\n\t\t(_state, current) => {\n\t\t\tconst next = { ...current, request: { index, usageId } };\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [],\n\t\t\t\toperationState: next,\n\t\t\t\tmaterialize: () => next,\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function publishNestedRequestOutcome<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\teffect: SummaryEffectPendingOperation,\n\tusageId: string,\n\tresponse: AssistantMessage,\n): Promise<void> {\n\tawait lane.settleOperation(\n\t\teffect,\n\t\t(_state, current) => {\n\t\t\tconst next = { ...current, usageIds: [...current.usageIds, usageId] };\n\t\t\tdelete next.request;\n\t\t\tconst row: Omit<UsageRow, \"seq\"> = { id: usageId, usage: response.usage, adjustment: false };\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [insertUsage(row)],\n\t\t\t\toperationState: next,\n\t\t\t\tmaterialize: () => undefined,\n\t\t\t\tevents: (commit) => [usageEvent(row, 0, commit, lane.name)],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nfunction requestStreamOptions(\n\toptions: SimpleStreamOptions,\n\tstreamOptions: AgentHarnessStreamOptions,\n\tcontext: Context,\n\tonPayload: NonNullable<SimpleStreamOptions[\"onPayload\"]>,\n): SimpleStreamOptions {\n\treturn {\n\t\t...options,\n\t\ttransport: streamOptions.transport,\n\t\ttimeoutMs: streamOptions.timeoutMs,\n\t\tmaxRetries: streamOptions.maxRetries,\n\t\tmaxRetryDelayMs: streamOptions.maxRetryDelayMs,\n\t\theaders: streamOptions.headers,\n\t\tmetadata: streamOptions.metadata,\n\t\tcacheRetention: \"none\",\n\t\tdeferred: false,\n\t\tsignal: context.abortSignal,\n\t\ttelemetryContext: getTelemetryContext(context),\n\t\tonPayload,\n\t};\n}\n\nasync function performStructuralAttempt<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\teffect: SummaryEffectPendingOperation,\n\tmodel: Model<Api>,\n\tpreparation: CompactionPreparation | BranchPreparation,\n): Promise<\n\t| { kind: \"compaction\"; result: CompactResult; retryable: boolean }\n\t| { kind: \"branch_summary\"; result: BranchSummaryResult; retryable: boolean }\n\t| { kind: \"error\"; error: OperationError; retryable: boolean }\n\t| { kind: \"cancel_requested\" }\n> {\n\tlet requestIndex = 0;\n\tlet lastResponse: AssistantMessage | undefined;\n\tconst request: SummaryRequest = async (aiContext, options, requestContext) => {\n\t\tconst baseOptions: AgentHarnessStreamOptions = { ...effect.summaryContext.streamOptions, deferred: false };\n\t\tconst beforeRequest = await lane.hooks\n\t\t\t.runWithGate(\n\t\t\t\t\"before_request\",\n\t\t\t\t{\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tmodel,\n\t\t\t\t\tstep: summaryKind(effect.task),\n\t\t\t\t\tattempt: effect.attempt,\n\t\t\t\t\tstreamOptions: baseOptions,\n\t\t\t\t},\n\t\t\t\tdrive.gate,\n\t\t\t\trequestContext,\n\t\t\t)\n\t\t\t.catch(async (error: unknown) => {\n\t\t\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\t\t\tawait error.cancellation;\n\t\t\t\tthrow new StructuralCancelled();\n\t\t\t});\n\t\tconst streamOptions = {\n\t\t\t...(beforeRequest?.streamOptions === undefined\n\t\t\t\t? baseOptions\n\t\t\t\t: applyStreamOptionsPatch(baseOptions, beforeRequest.streamOptions)),\n\t\t\tdeferred: false as const,\n\t\t};\n\t\tconst usageId = lane.session.idGenerator.next();\n\t\tconst intent = await publishNestedRequestIntent(lane, drive, effect, requestIndex, usageId);\n\t\trequestIndex += 1;\n\t\tif (intent.kind === \"cancel_requested\") throw new StructuralCancelled();\n\t\tconst admittedContext = withAbortSignal(drive.gate.signal, requestContext);\n\t\tlet response: AssistantMessage;\n\t\ttry {\n\t\t\tresponse = await drive.gate.admit(() =>\n\t\t\t\tlane.models.completeSimple(\n\t\t\t\t\tmodel,\n\t\t\t\t\taiContext,\n\t\t\t\t\trequestStreamOptions(options, streamOptions, admittedContext, async (payload, requestModel) => {\n\t\t\t\t\t\tconst hook = await lane.hooks.runWithGate(\n\t\t\t\t\t\t\t\"before_payload\",\n\t\t\t\t\t\t\t{ lane: lane.name, runId: drive.operationId, model: requestModel, payload },\n\t\t\t\t\t\t\tdrive.gate,\n\t\t\t\t\t\t\tadmittedContext,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn hook?.payload;\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\t\tawait error.cancellation;\n\t\t\tthrow new StructuralCancelled();\n\t\t}\n\t\tlastResponse = response;\n\t\tawait publishNestedRequestOutcome(lane, drive, intent.value, usageId, response);\n\t\treturn response;\n\t};\n\n\ttry {\n\t\tif (summaryKind(effect.task) === \"compaction\") {\n\t\t\tif (!(\"messagesToSummarize\" in preparation)) {\n\t\t\t\tthrow new SessionInvariantError(\"Compaction summary has invalid durable preparation\");\n\t\t\t}\n\t\t\tconst result = await compactWithRequest(\n\t\t\t\tpreparation,\n\t\t\t\t{\n\t\t\t\t\tmodel,\n\t\t\t\t\tcustomInstructions: effect.task.customInstructions,\n\t\t\t\t\tthinkingLevel: effect.summaryContext.configuration.thinkingLevel,\n\t\t\t\t},\n\t\t\t\trequest,\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t\tif (!result.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"error\",\n\t\t\t\t\terror: operationError(result.error.code, result.error.message),\n\t\t\t\t\tretryable: lastResponse !== undefined && isRetryableAssistantError(lastResponse),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"compaction\",\n\t\t\t\tresult: result.value,\n\t\t\t\tretryable: lastResponse !== undefined && isRetryableAssistantError(lastResponse),\n\t\t\t};\n\t\t}\n\n\t\tif (!(\"messages\" in preparation)) {\n\t\t\tthrow new SessionInvariantError(\"Branch summary has invalid durable preparation\");\n\t\t}\n\t\tconst result = await generateBranchSummaryWithRequest(\n\t\t\tpreparation,\n\t\t\t{ customInstructions: effect.task.customInstructions },\n\t\t\trequest,\n\t\t\tdrive.context,\n\t\t);\n\t\tif (!result.ok) {\n\t\t\treturn {\n\t\t\t\tkind: \"error\",\n\t\t\t\terror: operationError(result.error.code, result.error.message),\n\t\t\t\tretryable: lastResponse !== undefined && isRetryableAssistantError(lastResponse),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"branch_summary\",\n\t\t\tresult: result.value,\n\t\t\tretryable: lastResponse !== undefined && isRetryableAssistantError(lastResponse),\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof StructuralCancelled) return { kind: \"cancel_requested\" };\n\t\tthrow error;\n\t}\n}\n\nasync function readAttemptPreparation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tready: SummaryReadyOperation,\n): Promise<ContinueOperationResult<CompactionPreparation | BranchPreparation>> {\n\treturn lane.continueOperation(\n\t\tready,\n\t\tasync (_state, current, _meta, reader) => {\n\t\t\tconst expected = summaryKind(current.task);\n\t\t\tconst stored = await reader.getValue(\n\t\t\t\toperationPreparation(drive.operationId, current.task.taskId),\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t\tif (stored === undefined || stored.value.kind !== expected) {\n\t\t\t\tthrow new SessionInvariantError(`Structural task ${current.task.taskId} has invalid durable preparation`);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"return\",\n\t\t\t\tresult:\n\t\t\t\t\tstored.value.kind === \"compaction\"\n\t\t\t\t\t\t? compactionPreparation(stored.value)\n\t\t\t\t\t\t: branchPreparation(stored.value),\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function publishAttemptResult<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\teffect: SummaryEffectPendingOperation,\n\tresult: Awaited<ReturnType<typeof performStructuralAttempt<TContext>>>,\n): Promise<ProcedureResult> {\n\tif (result.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tif (result.kind === \"compaction\") {\n\t\treturn publishStructuralOutcome(lane, drive, effect, {\n\t\t\tkind: \"compaction\",\n\t\t\tresultEntryId: effect.summaryContext.resultEntryId,\n\t\t\tresult: result.result,\n\t\t\tfromHook: false,\n\t\t});\n\t}\n\tif (result.kind === \"branch_summary\") {\n\t\treturn publishStructuralOutcome(lane, drive, effect, {\n\t\t\tkind: \"branch_summary\",\n\t\t\tresultEntryId: effect.summaryContext.resultEntryId,\n\t\t\tresult: result.result,\n\t\t\tfromHook: false,\n\t\t});\n\t}\n\tif (result.error.code === \"aborted\" && lane.state.operation!.state.control.status === \"running\") {\n\t\tthrow new SessionInvariantError(\"Structural provider response is aborted while durable control is running\");\n\t}\n\tif (result.retryable && effect.attempt < effect.summaryContext.retryPolicy.maxAttempts) {\n\t\tconst retryWait = retryWaitFromEffect(effect, result.error.message);\n\t\tconst published = await lane.continueOperation(\n\t\t\teffect,\n\t\t\t() => ({\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [],\n\t\t\t\toperationState: retryWait,\n\t\t\t\tmaterialize: () => ({ kind: \"continue\" }) as const,\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"retry_scheduled\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tstep: effect.task.taskId,\n\t\t\t\t\t\tattempt: retryWait.nextAttempt,\n\t\t\t\t\t\tmaxAttempts: effect.summaryContext.retryPolicy.maxAttempts,\n\t\t\t\t\t\tdelayMs: retryDelay(effect.summaryContext.retryPolicy.baseDelayMs, effect.attempt),\n\t\t\t\t\t\tnotBefore: retryWait.notBefore,\n\t\t\t\t\t\terrorMessage: result.error.message,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t\tdrive.context,\n\t\t);\n\t\treturn published.kind === \"cancel_requested\" ? { kind: \"continue\" } : published.value;\n\t}\n\treturn publishStructuralOutcome(lane, drive, effect, { kind: \"failed\", error: result.error });\n}\n\n/** Execute one ready structural generation attempt. */\nexport async function runStructuralGeneration<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tready: SummaryReadyOperation,\n): Promise<ProcedureResult> {\n\tconst preparation = await readAttemptPreparation(lane, drive, ready);\n\tif (preparation.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tconst identity = ready.summaryContext.configuration.model;\n\tconst model = lane.models.getModel(identity.provider, identity.modelId);\n\tif (model === undefined) {\n\t\treturn publishStructuralOutcome(lane, drive, ready, {\n\t\t\tkind: \"failed\",\n\t\t\terror: operationError(\"model_unavailable\", \"The configured model is unavailable in this process\", identity),\n\t\t});\n\t}\n\tconst intent = await publishAttemptIntent(lane, drive, ready);\n\tif (intent.kind === \"cancel_requested\") return { kind: \"continue\" };\n\tconst result = await performStructuralAttempt(lane, drive, intent.value, model, preparation.value);\n\treturn publishAttemptResult(lane, drive, intent.value, result);\n}\n\n/** Consume one structural retry wait without starting a provider effect. */\nexport async function runStructuralRetryWait<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tretry: SummaryRetryWaitOperation,\n): Promise<ProcedureResult> {\n\tif (Date.now() < retry.notBefore) {\n\t\tif (!drive.waitForRetry) {\n\t\t\treturn {\n\t\t\t\tkind: \"waiting\",\n\t\t\t\toutcome: {\n\t\t\t\t\tkind: \"waiting\",\n\t\t\t\t\toperationId: drive.operationId,\n\t\t\t\t\treason: \"retry\",\n\t\t\t\t\tnotBefore: retry.notBefore,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tawait drive.gate.admit(() => waitUntil(retry.notBefore, drive.gate.signal));\n\t}\n\tconst published = await lane.continueOperation(\n\t\tretry,\n\t\t(_state, current) => {\n\t\t\tconst ready = readyFromRetryWait(current);\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [],\n\t\t\t\toperationState: ready,\n\t\t\t\tmaterialize: () => ({ kind: \"continue\" }) as const,\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"retry_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tstep: current.task.taskId,\n\t\t\t\t\t\tattempt: current.nextAttempt,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n\treturn published.kind === \"cancel_requested\" ? { kind: \"continue\" } : published.value;\n}\n\n/** Convert an orphaned structural attempt into a fresh numbered attempt or terminal failure. */\nexport async function recoverStructuralGeneration<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\teffect: SummaryEffectPendingOperation,\n): Promise<ProcedureResult> {\n\tconst error = operationError(\n\t\t\"structural_interrupted\",\n\t\t\"Structural summary attempt was interrupted and its external outcome is unknown\",\n\t);\n\tif (effect.attempt >= effect.summaryContext.retryPolicy.maxAttempts) {\n\t\treturn publishStructuralOutcome(lane, drive, effect, { kind: \"failed\", error });\n\t}\n\tconst retryWait = retryWaitFromEffect(effect, error.message);\n\tconst published = await lane.continueOperation(\n\t\teffect,\n\t\t() => ({\n\t\t\tkind: \"commit\",\n\t\t\twrites: [],\n\t\t\toperationState: retryWait,\n\t\t\tmaterialize: () => ({ kind: \"continue\" }) as const,\n\t\t\tevents: () => [\n\t\t\t\t{\n\t\t\t\t\ttype: \"retry_scheduled\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tstep: effect.task.taskId,\n\t\t\t\t\tattempt: retryWait.nextAttempt,\n\t\t\t\t\tmaxAttempts: effect.summaryContext.retryPolicy.maxAttempts,\n\t\t\t\t\tdelayMs: retryDelay(effect.summaryContext.retryPolicy.baseDelayMs, effect.attempt),\n\t\t\t\t\tnotBefore: retryWait.notBefore,\n\t\t\t\t\terrorMessage: error.message,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t}),\n\t\tdrive.context,\n\t);\n\treturn published.kind === \"cancel_requested\" ? { kind: \"continue\" } : published.value;\n}\n\n/** Prepare threshold compaction only when no newer compaction already guards this trigger. */\nexport async function prepareCompactionThreshold<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcheckpoint: CheckpointOperation,\n): Promise<ContinueOperationResult<{ taskId: string; preparation: DurableStructuralPreparation } | undefined>> {\n\tconst settings = checkpoint.settings.compaction;\n\tconst identity = lane.state.configuration.model;\n\tconst model = lane.models.getModel(identity.provider, identity.modelId);\n\tif (!settings.enabled || model === undefined) return { kind: \"result\", value: undefined };\n\tconst path = await readBoundedEntries(lane, drive, checkpoint);\n\tif (path.kind === \"cancel_requested\") return path;\n\tconst triggerIndex = path.value.findIndex((entry) => entry.id === checkpoint.triggerEntryId);\n\tlet newestCompactionIndex = -1;\n\tfor (let index = path.value.length - 1; index >= 0; index--) {\n\t\tif (path.value[index]!.type === \"compaction\") {\n\t\t\tnewestCompactionIndex = index;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (newestCompactionIndex >= triggerIndex && newestCompactionIndex !== -1) {\n\t\treturn { kind: \"result\", value: undefined };\n\t}\n\tif (triggerIndex === -1) {\n\t\tthrow new SessionInvariantError(`Checkpoint trigger ${checkpoint.triggerEntryId} is missing from its Branch`);\n\t}\n\tconst prepared = prepareCompaction(path.value, settings);\n\tif (!prepared.ok) throw prepared.error;\n\tif (prepared.value === undefined || !shouldCompact(prepared.value.tokensBefore, model.contextWindow, settings)) {\n\t\treturn { kind: \"result\", value: undefined };\n\t}\n\treturn {\n\t\tkind: \"result\",\n\t\tvalue: { taskId: lane.session.idGenerator.next(), preparation: durableCompactionPreparation(prepared.value) },\n\t};\n}\n\n/** Prepare one overflow compaction before the response settlement transaction. */\nexport async function prepareOverflowCompaction<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tgeneration: AssistantEffectPendingOperation,\n): Promise<{ taskId: string; preparation: DurableStructuralPreparation } | undefined> {\n\tif (generation.generationContext.overflowRecoveryUsed) return undefined;\n\tconst path = await readBoundedEntries(lane, drive, generation);\n\tif (path.kind === \"cancel_requested\") return undefined;\n\tconst prepared = prepareCompaction(path.value, generation.settings.compaction);\n\tif (!prepared.ok) throw prepared.error;\n\tif (prepared.value === undefined) return undefined;\n\treturn {\n\t\ttaskId: lane.session.idGenerator.next(),\n\t\tpreparation: durableCompactionPreparation(prepared.value),\n\t};\n}\n\n/** Atomically move an unsummarized navigation and finish its operation. */\nexport function commitNavigation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tnavigation: NavigationReadyToCommitOperation,\n): Promise<ProcedureResult> {\n\treturn lane\n\t\t.continueOperation(\n\t\t\tnavigation,\n\t\t\tasync (_state, current, meta, reader) => {\n\t\t\t\tif (\n\t\t\t\t\tcurrent.targetId !== null &&\n\t\t\t\t\t!(await reader.getEntries([current.targetId], drive.context)).has(current.targetId)\n\t\t\t\t) {\n\t\t\t\t\tthrow new SessionInvariantError(`Navigation target ${current.targetId} is missing`);\n\t\t\t\t}\n\t\t\t\tif (current.targetId === meta.sourceTipId) {\n\t\t\t\t\tthrow new SessionInvariantError(\"Navigation target must differ from its source tip\");\n\t\t\t\t}\n\t\t\t\tif (current.targetId === null && current.label !== undefined) {\n\t\t\t\t\tthrow new SessionInvariantError(\"Root navigation cannot set a label\");\n\t\t\t\t}\n\t\t\t\tconst writes: Write[] = [setValue(branchTip(lane.name), current.targetId)];\n\t\t\t\tif (current.label !== undefined && current.targetId !== null) {\n\t\t\t\t\twrites.push(setValue(entryLabel(current.targetId), current.label));\n\t\t\t\t}\n\t\t\t\tconst cleanup = await operationCleanupWrites(reader, drive.operationId, current, drive.context);\n\t\t\t\tconst record = operationResultRecord(meta, \"completed\", current.targetId);\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"finish\",\n\t\t\t\t\twrites: [...writes, ...cleanup],\n\t\t\t\t\trecord,\n\t\t\t\t\tlane: { tipId: current.targetId },\n\t\t\t\t\tmaterialize: () => ({ kind: \"settled\", outcome: record }) as const,\n\t\t\t\t\tevents: () => [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"navigation_end\",\n\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\t\tfromTipId: meta.sourceTipId,\n\t\t\t\t\t\t\ttipId: current.targetId,\n\t\t\t\t\t\t\tendedAt: record.endedAt,\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\tdrive.context,\n\t\t)\n\t\t.then((result) => (result.kind === \"cancel_requested\" ? { kind: \"continue\" } : result.value));\n}\n"]}