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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/README.md +4 -0
  2. package/dist/harness/agent-harness.d.ts +639 -384
  3. package/dist/harness/agent-harness.d.ts.map +1 -1
  4. package/dist/harness/agent-harness.js +5 -250
  5. package/dist/harness/agent-harness.js.map +1 -1
  6. package/dist/harness/compaction/branch-summarization.d.ts +12 -6
  7. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  8. package/dist/harness/compaction/branch-summarization.js +33 -27
  9. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  10. package/dist/harness/compaction/compaction.d.ts +30 -8
  11. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  12. package/dist/harness/compaction/compaction.js +53 -64
  13. package/dist/harness/compaction/compaction.js.map +1 -1
  14. package/dist/harness/config.d.ts +9 -0
  15. package/dist/harness/config.d.ts.map +1 -0
  16. package/dist/harness/config.js +35 -0
  17. package/dist/harness/config.js.map +1 -0
  18. package/dist/harness/context.d.ts +9 -0
  19. package/dist/harness/context.d.ts.map +1 -0
  20. package/dist/harness/context.js +13 -0
  21. package/dist/harness/context.js.map +1 -0
  22. package/dist/harness/env/nodejs.d.ts +25 -28
  23. package/dist/harness/env/nodejs.d.ts.map +1 -1
  24. package/dist/harness/env/nodejs.js +368 -125
  25. package/dist/harness/env/nodejs.js.map +1 -1
  26. package/dist/harness/events.d.ts +20 -38
  27. package/dist/harness/events.d.ts.map +1 -1
  28. package/dist/harness/events.js +233 -55
  29. package/dist/harness/events.js.map +1 -1
  30. package/dist/harness/execution/assistant.d.ts +42 -0
  31. package/dist/harness/execution/assistant.d.ts.map +1 -0
  32. package/dist/harness/execution/assistant.js +82 -0
  33. package/dist/harness/execution/assistant.js.map +1 -0
  34. package/dist/harness/execution/effect-gate.d.ts +22 -0
  35. package/dist/harness/execution/effect-gate.d.ts.map +1 -0
  36. package/dist/harness/execution/effect-gate.js +48 -0
  37. package/dist/harness/execution/effect-gate.js.map +1 -0
  38. package/dist/harness/execution/tools.d.ts +67 -0
  39. package/dist/harness/execution/tools.d.ts.map +1 -0
  40. package/dist/harness/execution/tools.js +121 -0
  41. package/dist/harness/execution/tools.js.map +1 -0
  42. package/dist/harness/hooks.d.ts +38 -0
  43. package/dist/harness/hooks.d.ts.map +1 -0
  44. package/dist/harness/hooks.js +404 -0
  45. package/dist/harness/hooks.js.map +1 -0
  46. package/dist/harness/messages.d.ts +2 -2
  47. package/dist/harness/messages.d.ts.map +1 -1
  48. package/dist/harness/messages.js.map +1 -1
  49. package/dist/harness/prompt-templates.d.ts +3 -2
  50. package/dist/harness/prompt-templates.d.ts.map +1 -1
  51. package/dist/harness/prompt-templates.js +17 -17
  52. package/dist/harness/prompt-templates.js.map +1 -1
  53. package/dist/harness/result.d.ts +93 -0
  54. package/dist/harness/result.d.ts.map +1 -1
  55. package/dist/harness/result.js +39 -0
  56. package/dist/harness/result.js.map +1 -1
  57. package/dist/harness/runtime/drive/boundary.d.ts +28 -0
  58. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
  59. package/dist/harness/runtime/drive/boundary.js +173 -0
  60. package/dist/harness/runtime/drive/boundary.js.map +1 -0
  61. package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
  62. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
  63. package/dist/harness/runtime/drive/checkpoint.js +133 -0
  64. package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
  65. package/dist/harness/runtime/drive/deferred.d.ts +15 -0
  66. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
  67. package/dist/harness/runtime/drive/deferred.js +179 -0
  68. package/dist/harness/runtime/drive/deferred.js.map +1 -0
  69. package/dist/harness/runtime/drive/generation.d.ts +8 -0
  70. package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
  71. package/dist/harness/runtime/drive/generation.js +205 -0
  72. package/dist/harness/runtime/drive/generation.js.map +1 -0
  73. package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
  74. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
  75. package/dist/harness/runtime/drive/reconcile.js +140 -0
  76. package/dist/harness/runtime/drive/reconcile.js.map +1 -0
  77. package/dist/harness/runtime/drive/recovery.d.ts +8 -0
  78. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
  79. package/dist/harness/runtime/drive/recovery.js +85 -0
  80. package/dist/harness/runtime/drive/recovery.js.map +1 -0
  81. package/dist/harness/runtime/drive/response.d.ts +23 -0
  82. package/dist/harness/runtime/drive/response.d.ts.map +1 -0
  83. package/dist/harness/runtime/drive/response.js +394 -0
  84. package/dist/harness/runtime/drive/response.js.map +1 -0
  85. package/dist/harness/runtime/drive/retry.d.ts +4 -0
  86. package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
  87. package/dist/harness/runtime/drive/retry.js +34 -0
  88. package/dist/harness/runtime/drive/retry.js.map +1 -0
  89. package/dist/harness/runtime/drive/structural.d.ts +32 -0
  90. package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
  91. package/dist/harness/runtime/drive/structural.js +929 -0
  92. package/dist/harness/runtime/drive/structural.js.map +1 -0
  93. package/dist/harness/runtime/drive/terminal.d.ts +7 -0
  94. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
  95. package/dist/harness/runtime/drive/terminal.js +49 -0
  96. package/dist/harness/runtime/drive/terminal.js.map +1 -0
  97. package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
  98. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
  99. package/dist/harness/runtime/drive/tool-placement.js +244 -0
  100. package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
  101. package/dist/harness/runtime/drive/tools.d.ts +6 -0
  102. package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
  103. package/dist/harness/runtime/drive/tools.js +449 -0
  104. package/dist/harness/runtime/drive/tools.js.map +1 -0
  105. package/dist/harness/runtime/drive.d.ts +6 -0
  106. package/dist/harness/runtime/drive.d.ts.map +1 -0
  107. package/dist/harness/runtime/drive.js +93 -0
  108. package/dist/harness/runtime/drive.js.map +1 -0
  109. package/dist/harness/runtime/harness.d.ts +59 -0
  110. package/dist/harness/runtime/harness.d.ts.map +1 -0
  111. package/dist/harness/runtime/harness.js +302 -0
  112. package/dist/harness/runtime/harness.js.map +1 -0
  113. package/dist/harness/runtime/index.d.ts +2 -0
  114. package/dist/harness/runtime/index.d.ts.map +1 -0
  115. package/dist/harness/runtime/index.js +2 -0
  116. package/dist/harness/runtime/index.js.map +1 -0
  117. package/dist/harness/runtime/lane.d.ts +118 -0
  118. package/dist/harness/runtime/lane.d.ts.map +1 -0
  119. package/dist/harness/runtime/lane.js +1559 -0
  120. package/dist/harness/runtime/lane.js.map +1 -0
  121. package/dist/harness/runtime/progress.d.ts +15 -0
  122. package/dist/harness/runtime/progress.d.ts.map +1 -0
  123. package/dist/harness/runtime/progress.js +66 -0
  124. package/dist/harness/runtime/progress.js.map +1 -0
  125. package/dist/harness/runtime/reducer.d.ts +5 -0
  126. package/dist/harness/runtime/reducer.d.ts.map +1 -0
  127. package/dist/harness/runtime/reducer.js +240 -0
  128. package/dist/harness/runtime/reducer.js.map +1 -0
  129. package/dist/harness/runtime/restore.d.ts +24 -0
  130. package/dist/harness/runtime/restore.d.ts.map +1 -0
  131. package/dist/harness/runtime/restore.js +117 -0
  132. package/dist/harness/runtime/restore.js.map +1 -0
  133. package/dist/harness/runtime/transcript.d.ts +21 -0
  134. package/dist/harness/runtime/transcript.d.ts.map +1 -0
  135. package/dist/harness/runtime/transcript.js +72 -0
  136. package/dist/harness/runtime/transcript.js.map +1 -0
  137. package/dist/harness/runtime/types.d.ts +105 -0
  138. package/dist/harness/runtime/types.d.ts.map +1 -0
  139. package/dist/harness/runtime/types.js +50 -0
  140. package/dist/harness/runtime/types.js.map +1 -0
  141. package/dist/harness/session/commit.d.ts +53 -0
  142. package/dist/harness/session/commit.d.ts.map +1 -0
  143. package/dist/harness/session/commit.js +57 -0
  144. package/dist/harness/session/commit.js.map +1 -0
  145. package/dist/harness/session/context.d.ts +6 -19
  146. package/dist/harness/session/context.d.ts.map +1 -1
  147. package/dist/harness/session/context.js +31 -53
  148. package/dist/harness/session/context.js.map +1 -1
  149. package/dist/harness/session/fork-policy.d.ts +21 -0
  150. package/dist/harness/session/fork-policy.d.ts.map +1 -0
  151. package/dist/harness/session/fork-policy.js +55 -0
  152. package/dist/harness/session/fork-policy.js.map +1 -0
  153. package/dist/harness/session/fork.d.ts +16 -0
  154. package/dist/harness/session/fork.d.ts.map +1 -0
  155. package/dist/harness/session/fork.js +79 -0
  156. package/dist/harness/session/fork.js.map +1 -0
  157. package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
  158. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
  159. package/dist/harness/session/in-memory-storage-state.js +269 -0
  160. package/dist/harness/session/in-memory-storage-state.js.map +1 -0
  161. package/dist/harness/session/index.d.ts +9 -5
  162. package/dist/harness/session/index.d.ts.map +1 -1
  163. package/dist/harness/session/index.js +7 -4
  164. package/dist/harness/session/index.js.map +1 -1
  165. package/dist/harness/session/jsonl/codec.d.ts +19 -8
  166. package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
  167. package/dist/harness/session/jsonl/codec.js +34 -219
  168. package/dist/harness/session/jsonl/codec.js.map +1 -1
  169. package/dist/harness/session/jsonl/fork.d.ts +38 -0
  170. package/dist/harness/session/jsonl/fork.d.ts.map +1 -0
  171. package/dist/harness/session/jsonl/fork.js +266 -0
  172. package/dist/harness/session/jsonl/fork.js.map +1 -0
  173. package/dist/harness/session/jsonl/index.d.ts +4 -0
  174. package/dist/harness/session/jsonl/index.d.ts.map +1 -0
  175. package/dist/harness/session/jsonl/index.js +4 -0
  176. package/dist/harness/session/jsonl/index.js.map +1 -0
  177. package/dist/harness/session/jsonl/io.d.ts +14 -0
  178. package/dist/harness/session/jsonl/io.d.ts.map +1 -0
  179. package/dist/harness/session/jsonl/io.js +86 -0
  180. package/dist/harness/session/jsonl/io.js.map +1 -0
  181. package/dist/harness/session/jsonl/legacy-v3.d.ts +44 -0
  182. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
  183. package/dist/harness/session/jsonl/legacy-v3.js +454 -0
  184. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
  185. package/dist/harness/session/jsonl/repo.d.ts +27 -24
  186. package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  187. package/dist/harness/session/jsonl/repo.js +276 -151
  188. package/dist/harness/session/jsonl/repo.js.map +1 -1
  189. package/dist/harness/session/jsonl/storage.d.ts +39 -41
  190. package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  191. package/dist/harness/session/jsonl/storage.js +175 -196
  192. package/dist/harness/session/jsonl/storage.js.map +1 -1
  193. package/dist/harness/session/jsonl/types.d.ts +23 -22
  194. package/dist/harness/session/jsonl/types.d.ts.map +1 -1
  195. package/dist/harness/session/jsonl/types.js +2 -1
  196. package/dist/harness/session/jsonl/types.js.map +1 -1
  197. package/dist/harness/session/memory.d.ts +44 -40
  198. package/dist/harness/session/memory.d.ts.map +1 -1
  199. package/dist/harness/session/memory.js +333 -115
  200. package/dist/harness/session/memory.js.map +1 -1
  201. package/dist/harness/session/mutation-line.d.ts +8 -0
  202. package/dist/harness/session/mutation-line.d.ts.map +1 -0
  203. package/dist/harness/session/mutation-line.js +22 -0
  204. package/dist/harness/session/mutation-line.js.map +1 -0
  205. package/dist/harness/session/session.d.ts +78 -51
  206. package/dist/harness/session/session.d.ts.map +1 -1
  207. package/dist/harness/session/session.js +327 -207
  208. package/dist/harness/session/session.js.map +1 -1
  209. package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
  210. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
  211. package/dist/harness/session/testing/benchmark/datasets.js +24 -0
  212. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
  213. package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
  214. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
  215. package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
  216. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
  217. package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
  218. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
  219. package/dist/harness/session/testing/benchmark/storage.js +114 -0
  220. package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
  221. package/dist/harness/session/testing/conformance/session-repo.d.ts +23 -0
  222. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
  223. package/dist/harness/session/testing/conformance/session-repo.js +809 -0
  224. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
  225. package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
  226. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
  227. package/dist/harness/session/testing/conformance/storage.js +600 -0
  228. package/dist/harness/session/testing/conformance/storage.js.map +1 -0
  229. package/dist/harness/session/testing/gating-storage.d.ts +26 -0
  230. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
  231. package/dist/harness/session/testing/gating-storage.js +103 -0
  232. package/dist/harness/session/testing/gating-storage.js.map +1 -0
  233. package/dist/harness/session/testing/index.d.ts +9 -2
  234. package/dist/harness/session/testing/index.d.ts.map +1 -1
  235. package/dist/harness/session/testing/index.js +8 -1
  236. package/dist/harness/session/testing/index.js.map +1 -1
  237. package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
  238. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
  239. package/dist/harness/session/testing/instrumented-storage.js +19 -0
  240. package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
  241. package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
  242. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
  243. package/dist/harness/session/testing/storage-decorator.js +40 -0
  244. package/dist/harness/session/testing/storage-decorator.js.map +1 -0
  245. package/dist/harness/session/testing/types.d.ts +5 -7
  246. package/dist/harness/session/testing/types.d.ts.map +1 -1
  247. package/dist/harness/session/testing/types.js.map +1 -1
  248. package/dist/harness/session/types.d.ts +425 -265
  249. package/dist/harness/session/types.d.ts.map +1 -1
  250. package/dist/harness/session/types.js +7 -7
  251. package/dist/harness/session/types.js.map +1 -1
  252. package/dist/harness/session/values.d.ts +95 -0
  253. package/dist/harness/session/values.d.ts.map +1 -0
  254. package/dist/harness/session/values.js +81 -0
  255. package/dist/harness/session/values.js.map +1 -0
  256. package/dist/harness/skills.d.ts +3 -2
  257. package/dist/harness/skills.d.ts.map +1 -1
  258. package/dist/harness/skills.js +29 -26
  259. package/dist/harness/skills.js.map +1 -1
  260. package/dist/harness/telemetry.d.ts +64 -43
  261. package/dist/harness/telemetry.d.ts.map +1 -1
  262. package/dist/harness/telemetry.js +45 -26
  263. package/dist/harness/telemetry.js.map +1 -1
  264. package/dist/harness/tools/bash.d.ts +4 -4
  265. package/dist/harness/tools/bash.d.ts.map +1 -1
  266. package/dist/harness/tools/bash.js +66 -93
  267. package/dist/harness/tools/bash.js.map +1 -1
  268. package/dist/harness/tools/edit.d.ts.map +1 -1
  269. package/dist/harness/tools/edit.js +17 -13
  270. package/dist/harness/tools/edit.js.map +1 -1
  271. package/dist/harness/tools/file-mutation-queue.d.ts +2 -1
  272. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  273. package/dist/harness/tools/file-mutation-queue.js +5 -5
  274. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  275. package/dist/harness/tools/path-utils.d.ts +3 -2
  276. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  277. package/dist/harness/tools/path-utils.js +5 -5
  278. package/dist/harness/tools/path-utils.js.map +1 -1
  279. package/dist/harness/tools/read.d.ts +2 -1
  280. package/dist/harness/tools/read.d.ts.map +1 -1
  281. package/dist/harness/tools/read.js +4 -6
  282. package/dist/harness/tools/read.js.map +1 -1
  283. package/dist/harness/tools/write.d.ts.map +1 -1
  284. package/dist/harness/tools/write.js +12 -8
  285. package/dist/harness/tools/write.js.map +1 -1
  286. package/dist/harness/types.d.ts +128 -45
  287. package/dist/harness/types.d.ts.map +1 -1
  288. package/dist/harness/types.js.map +1 -1
  289. package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
  290. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
  291. package/dist/harness/utils/adaptive-publisher.js +79 -0
  292. package/dist/harness/utils/adaptive-publisher.js.map +1 -0
  293. package/dist/harness/utils/output-capture.d.ts +31 -0
  294. package/dist/harness/utils/output-capture.d.ts.map +1 -0
  295. package/dist/harness/utils/output-capture.js +217 -0
  296. package/dist/harness/utils/output-capture.js.map +1 -0
  297. package/dist/harness/utils/shell-output.d.ts +19 -5
  298. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  299. package/dist/harness/utils/shell-output.js +65 -192
  300. package/dist/harness/utils/shell-output.js.map +1 -1
  301. package/dist/harness/utils/truncate.d.ts +1 -0
  302. package/dist/harness/utils/truncate.d.ts.map +1 -1
  303. package/dist/harness/utils/truncate.js +1 -1
  304. package/dist/harness/utils/truncate.js.map +1 -1
  305. package/dist/harness/utils/usage.d.ts +4 -0
  306. package/dist/harness/utils/usage.d.ts.map +1 -0
  307. package/dist/harness/utils/usage.js +33 -0
  308. package/dist/harness/utils/usage.js.map +1 -0
  309. package/dist/index.d.ts +4 -1
  310. package/dist/index.d.ts.map +1 -1
  311. package/dist/index.js +3 -6
  312. package/dist/index.js.map +1 -1
  313. package/dist/search/index.d.ts +24 -16
  314. package/dist/search/index.d.ts.map +1 -1
  315. package/dist/search/index.js +1 -1
  316. package/dist/search/index.js.map +1 -1
  317. package/dist/types.d.ts +2 -0
  318. package/dist/types.d.ts.map +1 -1
  319. package/dist/types.js.map +1 -1
  320. package/package.json +27 -6
  321. package/dist/harness/reducer.d.ts +0 -100
  322. package/dist/harness/reducer.d.ts.map +0 -1
  323. package/dist/harness/reducer.js +0 -420
  324. package/dist/harness/reducer.js.map +0 -1
  325. package/dist/harness/session/jsonl/errors.d.ts +0 -9
  326. package/dist/harness/session/jsonl/errors.d.ts.map +0 -1
  327. package/dist/harness/session/jsonl/errors.js +0 -18
  328. package/dist/harness/session/jsonl/errors.js.map +0 -1
  329. package/dist/harness/session/jsonl.d.ts +0 -3
  330. package/dist/harness/session/jsonl.d.ts.map +0 -1
  331. package/dist/harness/session/jsonl.js +0 -2
  332. package/dist/harness/session/jsonl.js.map +0 -1
  333. package/dist/harness/session/state.d.ts +0 -65
  334. package/dist/harness/session/state.d.ts.map +0 -1
  335. package/dist/harness/session/state.js +0 -320
  336. package/dist/harness/session/state.js.map +0 -1
  337. package/dist/harness/session/testing/conformance.d.ts +0 -4
  338. package/dist/harness/session/testing/conformance.d.ts.map +0 -1
  339. package/dist/harness/session/testing/conformance.js +0 -762
  340. package/dist/harness/session/testing/conformance.js.map +0 -1
  341. package/dist/search/scanning.d.ts +0 -29
  342. package/dist/search/scanning.d.ts.map +0 -1
  343. package/dist/search/scanning.js +0 -103
  344. package/dist/search/scanning.js.map +0 -1
@@ -0,0 +1,105 @@
1
+ import type { RetryPolicy } from "@earendil-works/pi-ai";
2
+ import type { QueueMode } from "../../types.ts";
3
+ import type { AgentHarnessOptions, DriveOptions, DriveOutcome, HarnessEvent, Resources } from "../agent-harness.ts";
4
+ import type { CompactionSettings } from "../compaction/compaction.ts";
5
+ import { type Context } from "../context.ts";
6
+ import { type Gate } from "../execution/effect-gate.ts";
7
+ import type { CommitResult, InboxItem, LaneConfiguration, Operation, OperationResultRecord, OperationState, Write } from "../session/types.ts";
8
+ import type { AgentHarnessStreamOptions, AgentHarnessTool } from "../types.ts";
9
+ export declare class SliceNotImplemented extends Error {
10
+ constructor(operation: string);
11
+ }
12
+ /** Current process-local harness configuration. */
13
+ export interface Config<TContext extends object | undefined> {
14
+ readonly tools: AgentHarnessTool<TContext>[];
15
+ readonly resources: Resources;
16
+ readonly streamOptions: AgentHarnessStreamOptions;
17
+ readonly retryPolicy: RetryPolicy;
18
+ readonly compaction: CompactionSettings;
19
+ readonly steeringMode: QueueMode;
20
+ readonly followUpMode: QueueMode;
21
+ readonly toolExecution: "sequential" | "parallel";
22
+ readonly toolContext: AgentHarnessOptions<TContext>["toolContext"];
23
+ readonly systemPrompt: AgentHarnessOptions<TContext>["systemPrompt"];
24
+ readonly toProviderMessages: NonNullable<AgentHarnessOptions<TContext>["toProviderMessages"]>;
25
+ readonly entryProjectors: Readonly<NonNullable<AgentHarnessOptions<TContext>["entryProjectors"]>>;
26
+ }
27
+ /** The current durable state owned by one lane. */
28
+ export interface LaneState {
29
+ readonly tipId: string | null;
30
+ readonly configuration: LaneConfiguration;
31
+ readonly inbox: InboxItem[];
32
+ readonly lastOperationId: string | null;
33
+ readonly operation: Operation | null;
34
+ }
35
+ type Synchronous<TResult> = TResult extends PromiseLike<unknown> ? never : TResult;
36
+ interface CommitDecision<TResult> {
37
+ kind: "commit";
38
+ writes: Write[];
39
+ materialize(commit: CommitResult): Synchronous<TResult>;
40
+ events?(commit: CommitResult): HarnessEvent[];
41
+ }
42
+ /** One effect-free decision made on a lane's serialized mutation line. */
43
+ export type LaneCommand<TResult> = (CommitDecision<TResult> & {
44
+ next: LaneState;
45
+ }) | {
46
+ kind: "return";
47
+ result: TResult;
48
+ } | {
49
+ kind: "reject";
50
+ error: Error;
51
+ };
52
+ export type ContinueOperationResult<TResult> = {
53
+ kind: "cancel_requested";
54
+ } | {
55
+ kind: "result";
56
+ value: TResult;
57
+ };
58
+ /** A durable operation transition. The Lane pairs the state write with projection publication. */
59
+ type LanePatch = Partial<Pick<LaneState, "tipId" | "configuration" | "inbox">>;
60
+ interface FinishDecision<TResult> {
61
+ kind: "finish";
62
+ writes: Write[];
63
+ record: OperationResultRecord;
64
+ lane?: LanePatch;
65
+ materialize(commit: CommitResult): Synchronous<TResult>;
66
+ events?(commit: CommitResult): HarnessEvent[];
67
+ }
68
+ export type OperationCommand<TResult> = (CommitDecision<TResult> & {
69
+ operationState: OperationState;
70
+ lane?: LanePatch;
71
+ }) | FinishDecision<TResult> | {
72
+ kind: "return";
73
+ result: TResult;
74
+ };
75
+ /** One installed process-local drive pass. */
76
+ export declare class Drive {
77
+ readonly operationId: string;
78
+ readonly completion: Promise<DriveOutcome>;
79
+ readonly gate: Gate;
80
+ readonly context: Context;
81
+ readonly waitForRetry: boolean;
82
+ readonly closeSignal: AbortSignal;
83
+ deferredPermits: number;
84
+ private readonly control;
85
+ private readonly closeController;
86
+ private readonly resolveCompletion;
87
+ private readonly rejectCompletion;
88
+ constructor(options: DriveOptions, context: Context);
89
+ settle(outcome: DriveOutcome): void;
90
+ fail(error: unknown): void;
91
+ beginAbort(cancellation: Promise<void>): void;
92
+ signalAbort(): void;
93
+ closeGate(error: Error): void;
94
+ }
95
+ export type ProcedureResult = {
96
+ kind: "continue";
97
+ } | {
98
+ kind: "waiting";
99
+ outcome: DriveOutcome;
100
+ } | {
101
+ kind: "settled";
102
+ outcome: OperationResultRecord;
103
+ };
104
+ export {};
105
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harness/runtime/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { withoutAbortSignal } from "../context.js";
2
+ import { createGate } from "../execution/effect-gate.js";
3
+ export class SliceNotImplemented extends Error {
4
+ constructor(operation) {
5
+ super(`${operation} is not implemented until its later AgentHarness slice`);
6
+ this.name = "SliceNotImplemented";
7
+ }
8
+ }
9
+ /** One installed process-local drive pass. */
10
+ export class Drive {
11
+ constructor(options, context) {
12
+ this.operationId = options.operationId;
13
+ this.context = withoutAbortSignal(context);
14
+ this.waitForRetry = options.waitForRetry ?? false;
15
+ this.deferredPermits = options.pollDeferred === true ? 1 : 0;
16
+ let resolveCompletion;
17
+ let rejectCompletion;
18
+ this.completion = new Promise((resolve, reject) => {
19
+ resolveCompletion = resolve;
20
+ rejectCompletion = reject;
21
+ });
22
+ this.resolveCompletion = resolveCompletion;
23
+ this.rejectCompletion = rejectCompletion;
24
+ void this.completion.catch(() => { });
25
+ const { gate, control } = createGate();
26
+ this.gate = gate;
27
+ this.control = control;
28
+ this.closeController = new AbortController();
29
+ this.closeSignal = this.closeController.signal;
30
+ }
31
+ settle(outcome) {
32
+ this.resolveCompletion(outcome);
33
+ }
34
+ fail(error) {
35
+ this.rejectCompletion(error);
36
+ }
37
+ beginAbort(cancellation) {
38
+ this.control.beginAbort(cancellation);
39
+ }
40
+ signalAbort() {
41
+ this.control.signalAbort();
42
+ }
43
+ closeGate(error) {
44
+ this.control.close(error);
45
+ if (!this.closeSignal.aborted)
46
+ this.closeController.abort(error);
47
+ this.rejectCompletion(error);
48
+ }
49
+ }
50
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/harness/runtime/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,UAAU,EAA+B,MAAM,6BAA6B,CAAC;AAYtF,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC7C,YAAY,SAAiB;QAC5B,KAAK,CAAC,GAAG,SAAS,wDAAwD,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACnC,CAAC;CACD;AA6DD,8CAA8C;AAC9C,MAAM,OAAO,KAAK;IAcjB,YAAY,OAAqB,EAAE,OAAgB;QAClD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC;QAClD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,iBAAmD,CAAC;QACxD,IAAI,gBAA2C,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/D,iBAAiB,GAAG,OAAO,CAAC;YAC5B,gBAAgB,GAAG,MAAM,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,OAAqB;QAC3B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,KAAc;QAClB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU,CAAC,YAA2B;QACrC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAED,WAAW;QACV,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,SAAS,CAAC,KAAY;QACrB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO;YAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACD","sourcesContent":["import type { RetryPolicy } from \"@earendil-works/pi-ai\";\nimport type { QueueMode } from \"../../types.ts\";\nimport type { AgentHarnessOptions, DriveOptions, DriveOutcome, HarnessEvent, Resources } from \"../agent-harness.ts\";\nimport type { CompactionSettings } from \"../compaction/compaction.ts\";\nimport { type Context, withoutAbortSignal } from \"../context.ts\";\nimport { createGate, type Gate, type GateControl } from \"../execution/effect-gate.ts\";\nimport type {\n\tCommitResult,\n\tInboxItem,\n\tLaneConfiguration,\n\tOperation,\n\tOperationResultRecord,\n\tOperationState,\n\tWrite,\n} from \"../session/types.ts\";\nimport type { AgentHarnessStreamOptions, AgentHarnessTool } from \"../types.ts\";\n\nexport class SliceNotImplemented extends Error {\n\tconstructor(operation: string) {\n\t\tsuper(`${operation} is not implemented until its later AgentHarness slice`);\n\t\tthis.name = \"SliceNotImplemented\";\n\t}\n}\n\n/** Current process-local harness configuration. */\nexport interface Config<TContext extends object | undefined> {\n\treadonly tools: AgentHarnessTool<TContext>[];\n\treadonly resources: Resources;\n\treadonly streamOptions: AgentHarnessStreamOptions;\n\treadonly retryPolicy: RetryPolicy;\n\treadonly compaction: CompactionSettings;\n\treadonly steeringMode: QueueMode;\n\treadonly followUpMode: QueueMode;\n\treadonly toolExecution: \"sequential\" | \"parallel\";\n\treadonly toolContext: AgentHarnessOptions<TContext>[\"toolContext\"];\n\treadonly systemPrompt: AgentHarnessOptions<TContext>[\"systemPrompt\"];\n\treadonly toProviderMessages: NonNullable<AgentHarnessOptions<TContext>[\"toProviderMessages\"]>;\n\treadonly entryProjectors: Readonly<NonNullable<AgentHarnessOptions<TContext>[\"entryProjectors\"]>>;\n}\n\n/** The current durable state owned by one lane. */\nexport interface LaneState {\n\treadonly tipId: string | null;\n\treadonly configuration: LaneConfiguration;\n\treadonly inbox: InboxItem[];\n\treadonly lastOperationId: string | null;\n\treadonly operation: Operation | null;\n}\n\ntype Synchronous<TResult> = TResult extends PromiseLike<unknown> ? never : TResult;\n\ninterface CommitDecision<TResult> {\n\tkind: \"commit\";\n\twrites: Write[];\n\tmaterialize(commit: CommitResult): Synchronous<TResult>;\n\tevents?(commit: CommitResult): HarnessEvent[];\n}\n\n/** One effect-free decision made on a lane's serialized mutation line. */\nexport type LaneCommand<TResult> =\n\t| (CommitDecision<TResult> & { next: LaneState })\n\t| { kind: \"return\"; result: TResult }\n\t| { kind: \"reject\"; error: Error };\n\nexport type ContinueOperationResult<TResult> = { kind: \"cancel_requested\" } | { kind: \"result\"; value: TResult };\n\n/** A durable operation transition. The Lane pairs the state write with projection publication. */\ntype LanePatch = Partial<Pick<LaneState, \"tipId\" | \"configuration\" | \"inbox\">>;\n\ninterface FinishDecision<TResult> {\n\tkind: \"finish\";\n\twrites: Write[];\n\trecord: OperationResultRecord;\n\tlane?: LanePatch;\n\tmaterialize(commit: CommitResult): Synchronous<TResult>;\n\tevents?(commit: CommitResult): HarnessEvent[];\n}\n\nexport type OperationCommand<TResult> =\n\t| (CommitDecision<TResult> & { operationState: OperationState; lane?: LanePatch })\n\t| FinishDecision<TResult>\n\t| { kind: \"return\"; result: TResult };\n\n/** One installed process-local drive pass. */\nexport class Drive {\n\treadonly operationId: string;\n\treadonly completion: Promise<DriveOutcome>;\n\treadonly gate: Gate;\n\treadonly context: Context;\n\treadonly waitForRetry: boolean;\n\treadonly closeSignal: AbortSignal;\n\tdeferredPermits: number;\n\n\tprivate readonly control: GateControl;\n\tprivate readonly closeController: AbortController;\n\tprivate readonly resolveCompletion: (outcome: DriveOutcome) => void;\n\tprivate readonly rejectCompletion: (error: unknown) => void;\n\n\tconstructor(options: DriveOptions, context: Context) {\n\t\tthis.operationId = options.operationId;\n\t\tthis.context = withoutAbortSignal(context);\n\t\tthis.waitForRetry = options.waitForRetry ?? false;\n\t\tthis.deferredPermits = options.pollDeferred === true ? 1 : 0;\n\t\tlet resolveCompletion!: (outcome: DriveOutcome) => void;\n\t\tlet rejectCompletion!: (error: unknown) => void;\n\t\tthis.completion = new Promise<DriveOutcome>((resolve, reject) => {\n\t\t\tresolveCompletion = resolve;\n\t\t\trejectCompletion = reject;\n\t\t});\n\t\tthis.resolveCompletion = resolveCompletion;\n\t\tthis.rejectCompletion = rejectCompletion;\n\t\tvoid this.completion.catch(() => {});\n\t\tconst { gate, control } = createGate();\n\t\tthis.gate = gate;\n\t\tthis.control = control;\n\t\tthis.closeController = new AbortController();\n\t\tthis.closeSignal = this.closeController.signal;\n\t}\n\n\tsettle(outcome: DriveOutcome): void {\n\t\tthis.resolveCompletion(outcome);\n\t}\n\n\tfail(error: unknown): void {\n\t\tthis.rejectCompletion(error);\n\t}\n\n\tbeginAbort(cancellation: Promise<void>): void {\n\t\tthis.control.beginAbort(cancellation);\n\t}\n\n\tsignalAbort(): void {\n\t\tthis.control.signalAbort();\n\t}\n\n\tcloseGate(error: Error): void {\n\t\tthis.control.close(error);\n\t\tif (!this.closeSignal.aborted) this.closeController.abort(error);\n\t\tthis.rejectCompletion(error);\n\t}\n}\n\nexport type ProcedureResult =\n\t| { kind: \"continue\" }\n\t| { kind: \"waiting\"; outcome: DriveOutcome }\n\t| { kind: \"settled\"; outcome: OperationResultRecord };\n"]}
@@ -0,0 +1,53 @@
1
+ import type { CommitResult, Entry, EntryWrite, NewEntry, UsageRow, UsageWrite, Write } from "./types.ts";
2
+ export type CommittedEntryWrite = Entry & {
3
+ kind: "entry";
4
+ };
5
+ export type CommittedUsageWrite = UsageRow & {
6
+ kind: "usage";
7
+ };
8
+ export interface CommittedValueSetWrite {
9
+ kind: "value";
10
+ op: "set";
11
+ seq: number;
12
+ namespace: string;
13
+ key: string;
14
+ value: unknown;
15
+ }
16
+ export interface CommittedValueDeleteWrite {
17
+ kind: "value";
18
+ op: "delete";
19
+ seq: number;
20
+ namespace: string;
21
+ key: string;
22
+ }
23
+ export interface CommittedListAppendWrite {
24
+ kind: "list";
25
+ op: "append";
26
+ seq: number;
27
+ namespace: string;
28
+ key: string;
29
+ value: unknown;
30
+ }
31
+ export interface CommittedListDeleteWrite {
32
+ kind: "list";
33
+ op: "delete";
34
+ seq: number;
35
+ namespace: string;
36
+ key: string;
37
+ }
38
+ export type CommittedWrite = CommittedEntryWrite | CommittedUsageWrite | CommittedValueSetWrite | CommittedValueDeleteWrite | CommittedListAppendWrite | CommittedListDeleteWrite;
39
+ export interface PreparedCommit {
40
+ writes: CommittedWrite[];
41
+ result: Omit<CommitResult, "stats">;
42
+ }
43
+ export interface CommitValidationState {
44
+ hasEntryOrUsageId(id: string): boolean;
45
+ hasEntryId(id: string): boolean;
46
+ }
47
+ export declare function insertEntry(entry: NewEntry): EntryWrite;
48
+ export declare function insertUsage(row: Omit<UsageRow, "seq">): UsageWrite;
49
+ export declare function commitWrite(write: Write, seq: number, timestamp: number): CommittedWrite;
50
+ export declare function materializeCommittedEntry(entry: NewEntry, seq: number, timestamp: number): Entry;
51
+ export declare function prepareStorageCommit(writes: Write[], firstSeq: number, timestamp: number): PreparedCommit;
52
+ export declare function validateCommittedWrites(writes: readonly CommittedWrite[], firstSeq: number, state: CommitValidationState): void;
53
+ //# sourceMappingURL=commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../../src/harness/session/commit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEzG,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAC/D,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,KAAK,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CACf;AACD,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACZ;AACD,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CACf;AACD,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACZ;AACD,MAAM,MAAM,cAAc,GACvB,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,yBAAyB,GACzB,wBAAwB,GACxB,wBAAwB,CAAC;AAE5B,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACrC,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,CAEvD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,UAAU,CAElE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAexF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAEhG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAMzG;AAED,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,qBAAqB,GAC1B,IAAI,CAsBN"}
@@ -0,0 +1,57 @@
1
+ export function insertEntry(entry) {
2
+ return { kind: "entry", entry };
3
+ }
4
+ export function insertUsage(row) {
5
+ return { kind: "usage", row };
6
+ }
7
+ export function commitWrite(write, seq, timestamp) {
8
+ switch (write.kind) {
9
+ case "entry":
10
+ return { kind: "entry", ...write.entry, seq, timestamp };
11
+ case "usage":
12
+ return { kind: "usage", ...write.row, seq };
13
+ case "value":
14
+ return write.op === "set"
15
+ ? { kind: "value", op: "set", seq, namespace: write.namespace, key: write.key, value: write.value }
16
+ : { kind: "value", op: "delete", seq, namespace: write.namespace, key: write.key };
17
+ case "list":
18
+ return write.op === "append"
19
+ ? { kind: "list", op: "append", seq, namespace: write.namespace, key: write.key, value: write.value }
20
+ : { kind: "list", op: "delete", seq, namespace: write.namespace, key: write.key };
21
+ }
22
+ }
23
+ export function materializeCommittedEntry(entry, seq, timestamp) {
24
+ return { ...entry, seq, timestamp };
25
+ }
26
+ export function prepareStorageCommit(writes, firstSeq, timestamp) {
27
+ const committedWrites = writes.map((write, index) => commitWrite(write, firstSeq + index, timestamp));
28
+ return {
29
+ writes: committedWrites,
30
+ result: { firstSeq, seqs: committedWrites.map((write) => write.seq), timestamp },
31
+ };
32
+ }
33
+ export function validateCommittedWrites(writes, firstSeq, state) {
34
+ let previousSeq = firstSeq - 1;
35
+ const transactionIds = new Set();
36
+ const transactionEntryIds = new Set();
37
+ for (const write of writes) {
38
+ if (write.seq <= previousSeq)
39
+ throw new Error(`Non-monotonic storage sequence: ${write.seq}`);
40
+ previousSeq = write.seq;
41
+ if (write.kind !== "entry" && write.kind !== "usage")
42
+ continue;
43
+ if (state.hasEntryOrUsageId(write.id) || transactionIds.has(write.id)) {
44
+ throw new Error(`Duplicate entry or usage id: ${write.id}`);
45
+ }
46
+ if (write.kind === "entry" &&
47
+ write.parentId !== null &&
48
+ !state.hasEntryId(write.parentId) &&
49
+ !transactionEntryIds.has(write.parentId)) {
50
+ throw new Error(`Missing parent entry: ${write.parentId}`);
51
+ }
52
+ transactionIds.add(write.id);
53
+ if (write.kind === "entry")
54
+ transactionEntryIds.add(write.id);
55
+ }
56
+ }
57
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../../src/harness/session/commit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommitResult, Entry, EntryWrite, NewEntry, UsageRow, UsageWrite, Write } from \"./types.ts\";\n\nexport type CommittedEntryWrite = Entry & { kind: \"entry\" };\nexport type CommittedUsageWrite = UsageRow & { kind: \"usage\" };\nexport interface CommittedValueSetWrite {\n\tkind: \"value\";\n\top: \"set\";\n\tseq: number;\n\tnamespace: string;\n\tkey: string;\n\tvalue: unknown;\n}\nexport interface CommittedValueDeleteWrite {\n\tkind: \"value\";\n\top: \"delete\";\n\tseq: number;\n\tnamespace: string;\n\tkey: string;\n}\nexport interface CommittedListAppendWrite {\n\tkind: \"list\";\n\top: \"append\";\n\tseq: number;\n\tnamespace: string;\n\tkey: string;\n\tvalue: unknown;\n}\nexport interface CommittedListDeleteWrite {\n\tkind: \"list\";\n\top: \"delete\";\n\tseq: number;\n\tnamespace: string;\n\tkey: string;\n}\nexport type CommittedWrite =\n\t| CommittedEntryWrite\n\t| CommittedUsageWrite\n\t| CommittedValueSetWrite\n\t| CommittedValueDeleteWrite\n\t| CommittedListAppendWrite\n\t| CommittedListDeleteWrite;\n\nexport interface PreparedCommit {\n\twrites: CommittedWrite[];\n\tresult: Omit<CommitResult, \"stats\">;\n}\n\nexport interface CommitValidationState {\n\thasEntryOrUsageId(id: string): boolean;\n\thasEntryId(id: string): boolean;\n}\n\nexport function insertEntry(entry: NewEntry): EntryWrite {\n\treturn { kind: \"entry\", entry };\n}\n\nexport function insertUsage(row: Omit<UsageRow, \"seq\">): UsageWrite {\n\treturn { kind: \"usage\", row };\n}\n\nexport function commitWrite(write: Write, seq: number, timestamp: number): CommittedWrite {\n\tswitch (write.kind) {\n\t\tcase \"entry\":\n\t\t\treturn { kind: \"entry\", ...write.entry, seq, timestamp };\n\t\tcase \"usage\":\n\t\t\treturn { kind: \"usage\", ...write.row, seq };\n\t\tcase \"value\":\n\t\t\treturn write.op === \"set\"\n\t\t\t\t? { kind: \"value\", op: \"set\", seq, namespace: write.namespace, key: write.key, value: write.value }\n\t\t\t\t: { kind: \"value\", op: \"delete\", seq, namespace: write.namespace, key: write.key };\n\t\tcase \"list\":\n\t\t\treturn write.op === \"append\"\n\t\t\t\t? { kind: \"list\", op: \"append\", seq, namespace: write.namespace, key: write.key, value: write.value }\n\t\t\t\t: { kind: \"list\", op: \"delete\", seq, namespace: write.namespace, key: write.key };\n\t}\n}\n\nexport function materializeCommittedEntry(entry: NewEntry, seq: number, timestamp: number): Entry {\n\treturn { ...entry, seq, timestamp };\n}\n\nexport function prepareStorageCommit(writes: Write[], firstSeq: number, timestamp: number): PreparedCommit {\n\tconst committedWrites = writes.map((write, index) => commitWrite(write, firstSeq + index, timestamp));\n\treturn {\n\t\twrites: committedWrites,\n\t\tresult: { firstSeq, seqs: committedWrites.map((write) => write.seq), timestamp },\n\t};\n}\n\nexport function validateCommittedWrites(\n\twrites: readonly CommittedWrite[],\n\tfirstSeq: number,\n\tstate: CommitValidationState,\n): void {\n\tlet previousSeq = firstSeq - 1;\n\tconst transactionIds = new Set<string>();\n\tconst transactionEntryIds = new Set<string>();\n\tfor (const write of writes) {\n\t\tif (write.seq <= previousSeq) throw new Error(`Non-monotonic storage sequence: ${write.seq}`);\n\t\tpreviousSeq = write.seq;\n\t\tif (write.kind !== \"entry\" && write.kind !== \"usage\") continue;\n\t\tif (state.hasEntryOrUsageId(write.id) || transactionIds.has(write.id)) {\n\t\t\tthrow new Error(`Duplicate entry or usage id: ${write.id}`);\n\t\t}\n\t\tif (\n\t\t\twrite.kind === \"entry\" &&\n\t\t\twrite.parentId !== null &&\n\t\t\t!state.hasEntryId(write.parentId) &&\n\t\t\t!transactionEntryIds.has(write.parentId)\n\t\t) {\n\t\t\tthrow new Error(`Missing parent entry: ${write.parentId}`);\n\t\t}\n\t\ttransactionIds.add(write.id);\n\t\tif (write.kind === \"entry\") transactionEntryIds.add(write.id);\n\t}\n}\n"]}
@@ -1,23 +1,10 @@
1
1
  import type { AgentMessage } from "../../types.ts";
2
- import type { ConfigurationUpdateEntry, CustomEntry, Entry } from "./types.ts";
3
- export interface SessionContext {
4
- messages: AgentMessage[];
5
- thinkingLevel: string;
6
- configurationUpdate: ConfigurationUpdateEntry["reasoning"] | null;
7
- model: {
8
- provider: string;
9
- modelId: string;
10
- } | null;
11
- activeToolNames: string[] | null;
12
- }
13
- export type ContextEntryTransform = (entries: readonly Entry[]) => readonly Entry[];
14
- export type CustomEntryContextMessageProjector = (entry: CustomEntry, index: number, entries: readonly Entry[]) => readonly AgentMessage[] | undefined;
2
+ import type { Context } from "../context.ts";
3
+ import type { Entry, EntryProjector } from "./types.ts";
15
4
  export interface SessionContextBuildOptions {
16
- entryTransforms?: readonly ContextEntryTransform[];
17
- entryProjectors?: Readonly<Record<string, CustomEntryContextMessageProjector>>;
5
+ entryProjectors?: Readonly<Record<string, EntryProjector>>;
18
6
  }
19
- export declare function defaultContextEntryTransform(pathEntries: readonly Entry[]): Entry[];
20
- export declare function buildContextEntries(pathEntries: readonly Entry[], options?: SessionContextBuildOptions): Entry[];
21
- export declare function sessionEntryToContextMessages(entry: Entry, index: number, entries: readonly Entry[], options?: SessionContextBuildOptions): AgentMessage[];
22
- export declare function buildSessionContext(pathEntries: readonly Entry[], options?: SessionContextBuildOptions): SessionContext;
7
+ export declare function buildContextEntries(pathEntries: readonly Entry[]): Entry[];
8
+ export declare function sessionEntryToContextMessages(entry: Entry): AgentMessage[];
9
+ export declare function buildSessionContext(pathEntries: readonly Entry[], options: SessionContextBuildOptions | undefined, context: Context): Promise<AgentMessage[]>;
23
10
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/harness/session/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,KAAK,EAAmB,wBAAwB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEhG,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,wBAAwB,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IAClE,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACpD,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,KAAK,SAAS,KAAK,EAAE,CAAC;AAEpF,MAAM,MAAM,kCAAkC,GAAG,CAChD,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,KAAK,EAAE,KACrB,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;AAEzC,MAAM,WAAW,0BAA0B;IAC1C,eAAe,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC,CAAC;CAC/E;AAyBD,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,SAAS,KAAK,EAAE,GAAG,KAAK,EAAE,CAYnF;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,SAAS,KAAK,EAAE,EAAE,OAAO,GAAE,0BAA+B,GAAG,KAAK,EAAE,CAIpH;AAED,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,KAAK,EAAE,EACzB,OAAO,GAAE,0BAA+B,GACtC,YAAY,EAAE,CAkBhB;AAED,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,SAAS,KAAK,EAAE,EAC7B,OAAO,GAAE,0BAA+B,GACtC,cAAc,CAOhB"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/harness/session/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAmB,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,0BAA0B;IAC1C,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;CAC3D;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,SAAS,KAAK,EAAE,GAAG,KAAK,EAAE,CAY1E;AASD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,EAAE,CAc1E;AAED,wBAAsB,mBAAmB,CACxC,WAAW,EAAE,SAAS,KAAK,EAAE,EAC7B,OAAO,EAAE,0BAA0B,GAAG,SAAS,EAC/C,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,YAAY,EAAE,CAAC,CAazB"}
@@ -1,34 +1,10 @@
1
1
  import { createBranchSummaryMessage, createCompactionSummaryMessage } from "../messages.js";
2
- function deriveSessionContextState(pathEntries) {
3
- let thinkingLevel = "off";
4
- let configurationUpdate = null;
5
- let model = null;
6
- let activeToolNames = null;
7
- for (const entry of pathEntries) {
8
- if (entry.type === "thinking_level_change") {
9
- thinkingLevel = entry.thinkingLevel;
10
- }
11
- else if (entry.type === "configuration_update") {
12
- configurationUpdate = { ...entry.reasoning };
13
- }
14
- else if (entry.type === "model_change") {
15
- model = { provider: entry.provider, modelId: entry.modelId };
16
- }
17
- else if (entry.type === "message" && entry.message.role === "assistant") {
18
- model = { provider: entry.message.provider, modelId: entry.message.model };
19
- }
20
- else if (entry.type === "active_tools_change") {
21
- activeToolNames = [...entry.activeToolNames];
22
- }
23
- }
24
- return { thinkingLevel, configurationUpdate, model, activeToolNames };
25
- }
26
- export function defaultContextEntryTransform(pathEntries) {
2
+ export function buildContextEntries(pathEntries) {
27
3
  let compaction;
28
4
  let compactionIndex = -1;
29
5
  for (let index = pathEntries.length - 1; index >= 0; index--) {
30
6
  const entry = pathEntries[index];
31
- if (entry.type === "compaction") {
7
+ if (entry?.type === "compaction") {
32
8
  compaction = entry;
33
9
  compactionIndex = index;
34
10
  break;
@@ -36,36 +12,38 @@ export function defaultContextEntryTransform(pathEntries) {
36
12
  }
37
13
  return compaction === undefined ? [...pathEntries] : [compaction, ...pathEntries.slice(compactionIndex + 1)];
38
14
  }
39
- export function buildContextEntries(pathEntries, options = {}) {
40
- let entries = defaultContextEntryTransform(pathEntries);
41
- for (const transform of options.entryTransforms ?? [])
42
- entries = [...transform(entries)];
43
- return entries;
15
+ function isContextMessage(message) {
16
+ return (message.role !== "assistant" ||
17
+ (message.stopReason !== "error" && message.stopReason !== "aborted" && message.stopReason !== "deferred"));
44
18
  }
45
- export function sessionEntryToContextMessages(entry, index, entries, options = {}) {
46
- if (entry.type === "message") {
47
- if (entry.message.role === "assistant" && entry.message.stopReason === "deferred")
19
+ export function sessionEntryToContextMessages(entry) {
20
+ switch (entry.type) {
21
+ case "message":
22
+ return isContextMessage(entry.message) ? [entry.message] : [];
23
+ case "compaction":
24
+ return [
25
+ createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),
26
+ ...entry.retainedTail.filter(isContextMessage),
27
+ ];
28
+ case "branch_summary":
29
+ return entry.summary ? [createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp)] : [];
30
+ case "custom":
48
31
  return [];
49
- return [entry.message];
50
- }
51
- if (entry.type === "compaction") {
52
- return [
53
- createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),
54
- ...entry.retainedTail,
55
- ];
56
- }
57
- if (entry.type === "branch_summary" && entry.summary) {
58
- return [createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp)];
59
32
  }
60
- if (entry.type === "custom") {
61
- return [...(options.entryProjectors?.[entry.customType]?.(entry, index, entries) ?? [])];
62
- }
63
- return [];
64
33
  }
65
- export function buildSessionContext(pathEntries, options = {}) {
66
- const state = deriveSessionContextState(pathEntries);
67
- const contextEntries = buildContextEntries(pathEntries, options);
68
- const messages = contextEntries.flatMap((entry, index) => sessionEntryToContextMessages(entry, index, contextEntries, options));
69
- return { ...state, messages };
34
+ export async function buildSessionContext(pathEntries, options, context) {
35
+ options ??= {};
36
+ const entries = buildContextEntries(pathEntries);
37
+ const messages = [];
38
+ for (const entry of entries) {
39
+ if (entry.type !== "custom") {
40
+ messages.push(...sessionEntryToContextMessages(entry));
41
+ continue;
42
+ }
43
+ const projector = options.entryProjectors?.[entry.customType];
44
+ if (projector !== undefined)
45
+ messages.push(...((await projector(entry, context)) ?? []));
46
+ }
47
+ return messages;
70
48
  }
71
49
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/harness/session/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"../../types.ts\";\nimport { createBranchSummaryMessage, createCompactionSummaryMessage } from \"../messages.ts\";\nimport type { CompactionEntry, ConfigurationUpdateEntry, CustomEntry, Entry } from \"./types.ts\";\n\nexport interface SessionContext {\n\tmessages: AgentMessage[];\n\tthinkingLevel: string;\n\tconfigurationUpdate: ConfigurationUpdateEntry[\"reasoning\"] | null;\n\tmodel: { provider: string; modelId: string } | null;\n\tactiveToolNames: string[] | null;\n}\n\nexport type ContextEntryTransform = (entries: readonly Entry[]) => readonly Entry[];\n\nexport type CustomEntryContextMessageProjector = (\n\tentry: CustomEntry,\n\tindex: number,\n\tentries: readonly Entry[],\n) => readonly AgentMessage[] | undefined;\n\nexport interface SessionContextBuildOptions {\n\tentryTransforms?: readonly ContextEntryTransform[];\n\tentryProjectors?: Readonly<Record<string, CustomEntryContextMessageProjector>>;\n}\n\nfunction deriveSessionContextState(pathEntries: readonly Entry[]): Omit<SessionContext, \"messages\"> {\n\tlet thinkingLevel = \"off\";\n\tlet configurationUpdate: ConfigurationUpdateEntry[\"reasoning\"] | null = null;\n\tlet model: { provider: string; modelId: string } | null = null;\n\tlet activeToolNames: string[] | null = null;\n\n\tfor (const entry of pathEntries) {\n\t\tif (entry.type === \"thinking_level_change\") {\n\t\t\tthinkingLevel = entry.thinkingLevel;\n\t\t} else if (entry.type === \"configuration_update\") {\n\t\t\tconfigurationUpdate = { ...entry.reasoning };\n\t\t} else if (entry.type === \"model_change\") {\n\t\t\tmodel = { provider: entry.provider, modelId: entry.modelId };\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tmodel = { provider: entry.message.provider, modelId: entry.message.model };\n\t\t} else if (entry.type === \"active_tools_change\") {\n\t\t\tactiveToolNames = [...entry.activeToolNames];\n\t\t}\n\t}\n\n\treturn { thinkingLevel, configurationUpdate, model, activeToolNames };\n}\n\nexport function defaultContextEntryTransform(pathEntries: readonly Entry[]): Entry[] {\n\tlet compaction: CompactionEntry | undefined;\n\tlet compactionIndex = -1;\n\tfor (let index = pathEntries.length - 1; index >= 0; index--) {\n\t\tconst entry = pathEntries[index]!;\n\t\tif (entry.type === \"compaction\") {\n\t\t\tcompaction = entry;\n\t\t\tcompactionIndex = index;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn compaction === undefined ? [...pathEntries] : [compaction, ...pathEntries.slice(compactionIndex + 1)];\n}\n\nexport function buildContextEntries(pathEntries: readonly Entry[], options: SessionContextBuildOptions = {}): Entry[] {\n\tlet entries = defaultContextEntryTransform(pathEntries);\n\tfor (const transform of options.entryTransforms ?? []) entries = [...transform(entries)];\n\treturn entries;\n}\n\nexport function sessionEntryToContextMessages(\n\tentry: Entry,\n\tindex: number,\n\tentries: readonly Entry[],\n\toptions: SessionContextBuildOptions = {},\n): AgentMessage[] {\n\tif (entry.type === \"message\") {\n\t\tif (entry.message.role === \"assistant\" && entry.message.stopReason === \"deferred\") return [];\n\t\treturn [entry.message];\n\t}\n\tif (entry.type === \"compaction\") {\n\t\treturn [\n\t\t\tcreateCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),\n\t\t\t...entry.retainedTail,\n\t\t];\n\t}\n\tif (entry.type === \"branch_summary\" && entry.summary) {\n\t\treturn [createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp)];\n\t}\n\tif (entry.type === \"custom\") {\n\t\treturn [...(options.entryProjectors?.[entry.customType]?.(entry, index, entries) ?? [])];\n\t}\n\treturn [];\n}\n\nexport function buildSessionContext(\n\tpathEntries: readonly Entry[],\n\toptions: SessionContextBuildOptions = {},\n): SessionContext {\n\tconst state = deriveSessionContextState(pathEntries);\n\tconst contextEntries = buildContextEntries(pathEntries, options);\n\tconst messages = contextEntries.flatMap((entry, index) =>\n\t\tsessionEntryToContextMessages(entry, index, contextEntries, options),\n\t);\n\treturn { ...state, messages };\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/harness/session/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAO5F,MAAM,UAAU,mBAAmB,CAAC,WAA6B;IAChE,IAAI,UAAuC,CAAC;IAC5C,IAAI,eAAe,GAAG,CAAC,CAAC,CAAC;IACzB,KAAK,IAAI,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;YAClC,UAAU,GAAG,KAAK,CAAC;YACnB,eAAe,GAAG,KAAK,CAAC;YACxB,MAAM;QACP,CAAC;IACF,CAAC;IACD,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAqB;IAC9C,OAAO,CACN,OAAO,CAAC,IAAI,KAAK,WAAW;QAC5B,CAAC,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC,CACzG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAY;IACzD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS;YACb,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,KAAK,YAAY;YAChB,OAAO;gBACN,8BAA8B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC;gBAClF,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC;aAC9C,CAAC;QACH,KAAK,gBAAgB;YACpB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,KAAK,QAAQ;YACZ,OAAO,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,WAA6B,EAC7B,OAA+C,EAC/C,OAAgB;IAEhB,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,SAAS;QACV,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,SAAS,KAAK,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC","sourcesContent":["import type { AgentMessage } from \"../../types.ts\";\nimport type { Context } from \"../context.ts\";\nimport { createBranchSummaryMessage, createCompactionSummaryMessage } from \"../messages.ts\";\nimport type { CompactionEntry, Entry, EntryProjector } from \"./types.ts\";\n\nexport interface SessionContextBuildOptions {\n\tentryProjectors?: Readonly<Record<string, EntryProjector>>;\n}\n\nexport function buildContextEntries(pathEntries: readonly Entry[]): Entry[] {\n\tlet compaction: CompactionEntry | undefined;\n\tlet compactionIndex = -1;\n\tfor (let index = pathEntries.length - 1; index >= 0; index--) {\n\t\tconst entry = pathEntries[index];\n\t\tif (entry?.type === \"compaction\") {\n\t\t\tcompaction = entry;\n\t\t\tcompactionIndex = index;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn compaction === undefined ? [...pathEntries] : [compaction, ...pathEntries.slice(compactionIndex + 1)];\n}\n\nfunction isContextMessage(message: AgentMessage): boolean {\n\treturn (\n\t\tmessage.role !== \"assistant\" ||\n\t\t(message.stopReason !== \"error\" && message.stopReason !== \"aborted\" && message.stopReason !== \"deferred\")\n\t);\n}\n\nexport function sessionEntryToContextMessages(entry: Entry): AgentMessage[] {\n\tswitch (entry.type) {\n\t\tcase \"message\":\n\t\t\treturn isContextMessage(entry.message) ? [entry.message] : [];\n\t\tcase \"compaction\":\n\t\t\treturn [\n\t\t\t\tcreateCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),\n\t\t\t\t...entry.retainedTail.filter(isContextMessage),\n\t\t\t];\n\t\tcase \"branch_summary\":\n\t\t\treturn entry.summary ? [createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp)] : [];\n\t\tcase \"custom\":\n\t\t\treturn [];\n\t}\n}\n\nexport async function buildSessionContext(\n\tpathEntries: readonly Entry[],\n\toptions: SessionContextBuildOptions | undefined,\n\tcontext: Context,\n): Promise<AgentMessage[]> {\n\toptions ??= {};\n\tconst entries = buildContextEntries(pathEntries);\n\tconst messages: AgentMessage[] = [];\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"custom\") {\n\t\t\tmessages.push(...sessionEntryToContextMessages(entry));\n\t\t\tcontinue;\n\t\t}\n\t\tconst projector = options.entryProjectors?.[entry.customType];\n\t\tif (projector !== undefined) messages.push(...((await projector(entry, context)) ?? []));\n\t}\n\treturn messages;\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { CommittedListAppendWrite, CommittedValueSetWrite } from "./commit.ts";
2
+ import type { ForkOptions } from "./types.ts";
3
+ export type ForkCurrentStatePlan = {
4
+ scope: "branch";
5
+ branch: string;
6
+ destinationTip: string | null;
7
+ } | {
8
+ scope: "tree";
9
+ };
10
+ export declare function selectBranchFork(options: Extract<ForkOptions, {
11
+ scope: "branch";
12
+ }>, source: {
13
+ tip: string | null | undefined;
14
+ getParent: (entryId: string) => string | null | undefined;
15
+ selectEntry: (entryId: string) => void;
16
+ }): Extract<ForkCurrentStatePlan, {
17
+ scope: "branch";
18
+ }>;
19
+ /** Project one current scalar row or surviving list element into destination state. */
20
+ export declare function projectForkCurrentStateWrite(write: CommittedValueSetWrite | CommittedListAppendWrite, plan: ForkCurrentStatePlan, isEntryCopied: (entryId: string) => boolean): CommittedValueSetWrite | CommittedListAppendWrite | undefined;
21
+ //# sourceMappingURL=fork-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork-policy.d.ts","sourceRoot":"","sources":["../../../src/harness/session/fork-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,oBAAoB,GAC7B;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC,EAClD,MAAM,EAAE;IACP,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,GACC,OAAO,CAAC,oBAAoB,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC,CAsBpD;AAED,uFAAuF;AACvF,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,sBAAsB,GAAG,wBAAwB,EACxD,IAAI,EAAE,oBAAoB,EAC1B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACzC,sBAAsB,GAAG,wBAAwB,GAAG,SAAS,CAuB/D"}
@@ -0,0 +1,55 @@
1
+ export function selectBranchFork(options, source) {
2
+ if (source.tip === undefined)
3
+ throw new Error(`Unknown source branch: ${options.branch}`);
4
+ const requested = options.entryId ?? source.tip;
5
+ let found = requested === null;
6
+ let destinationTip = null;
7
+ let entryId = source.tip;
8
+ while (entryId !== null) {
9
+ const parentId = source.getParent(entryId);
10
+ if (parentId === undefined)
11
+ throw new Error(`Corrupt source branch: missing parent ${entryId}`);
12
+ if (entryId === requested) {
13
+ found = true;
14
+ destinationTip = options.position === "before" ? parentId : entryId;
15
+ if (options.position !== "before")
16
+ source.selectEntry(entryId);
17
+ }
18
+ else if (found) {
19
+ source.selectEntry(entryId);
20
+ }
21
+ entryId = parentId;
22
+ }
23
+ if (!found) {
24
+ throw new Error(`Fork entry ${requested} is not on source branch ${JSON.stringify(options.branch)}`);
25
+ }
26
+ return { scope: "branch", branch: options.branch, destinationTip };
27
+ }
28
+ /** Project one current scalar row or surviving list element into destination state. */
29
+ export function projectForkCurrentStateWrite(write, plan, isEntryCopied) {
30
+ switch (write.namespace) {
31
+ case "pi.session.name":
32
+ return write;
33
+ case "pi.entry.label":
34
+ return isEntryCopied(write.key) ? write : undefined;
35
+ case "pi.branch.tip":
36
+ if (plan.scope === "tree")
37
+ return write;
38
+ return write.key === plan.branch ? { ...write, value: plan.destinationTip } : undefined;
39
+ case "pi.lane.config":
40
+ return plan.scope === "tree" || write.key === plan.branch ? write : undefined;
41
+ case "pi.lane.state":
42
+ return plan.scope === "tree" || write.key === plan.branch
43
+ ? { ...write, value: { currentOperationId: null, lastOperationId: null, inbox: [] } }
44
+ : undefined;
45
+ case "pi.result":
46
+ return undefined;
47
+ }
48
+ if (write.namespace.startsWith("pi.op.") || write.namespace.startsWith("pi.pending."))
49
+ return undefined;
50
+ if (write.namespace === "pi" || write.namespace.startsWith("pi.")) {
51
+ throw new Error(`Unknown reserved fork namespace: ${write.namespace}`);
52
+ }
53
+ return plan.scope === "tree" ? write : undefined;
54
+ }
55
+ //# sourceMappingURL=fork-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork-policy.js","sourceRoot":"","sources":["../../../src/harness/session/fork-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommittedListAppendWrite, CommittedValueSetWrite } from \"./commit.ts\";\nimport type { ForkOptions } from \"./types.ts\";\n\nexport type ForkCurrentStatePlan =\n\t| { scope: \"branch\"; branch: string; destinationTip: string | null }\n\t| { scope: \"tree\" };\n\nexport function selectBranchFork(\n\toptions: Extract<ForkOptions, { scope: \"branch\" }>,\n\tsource: {\n\t\ttip: string | null | undefined;\n\t\tgetParent: (entryId: string) => string | null | undefined;\n\t\tselectEntry: (entryId: string) => void;\n\t},\n): Extract<ForkCurrentStatePlan, { scope: \"branch\" }> {\n\tif (source.tip === undefined) throw new Error(`Unknown source branch: ${options.branch}`);\n\tconst requested = options.entryId ?? source.tip;\n\tlet found = requested === null;\n\tlet destinationTip: string | null = null;\n\tlet entryId = source.tip;\n\twhile (entryId !== null) {\n\t\tconst parentId = source.getParent(entryId);\n\t\tif (parentId === undefined) throw new Error(`Corrupt source branch: missing parent ${entryId}`);\n\t\tif (entryId === requested) {\n\t\t\tfound = true;\n\t\t\tdestinationTip = options.position === \"before\" ? parentId : entryId;\n\t\t\tif (options.position !== \"before\") source.selectEntry(entryId);\n\t\t} else if (found) {\n\t\t\tsource.selectEntry(entryId);\n\t\t}\n\t\tentryId = parentId;\n\t}\n\tif (!found) {\n\t\tthrow new Error(`Fork entry ${requested} is not on source branch ${JSON.stringify(options.branch)}`);\n\t}\n\treturn { scope: \"branch\", branch: options.branch, destinationTip };\n}\n\n/** Project one current scalar row or surviving list element into destination state. */\nexport function projectForkCurrentStateWrite(\n\twrite: CommittedValueSetWrite | CommittedListAppendWrite,\n\tplan: ForkCurrentStatePlan,\n\tisEntryCopied: (entryId: string) => boolean,\n): CommittedValueSetWrite | CommittedListAppendWrite | undefined {\n\tswitch (write.namespace) {\n\t\tcase \"pi.session.name\":\n\t\t\treturn write;\n\t\tcase \"pi.entry.label\":\n\t\t\treturn isEntryCopied(write.key) ? write : undefined;\n\t\tcase \"pi.branch.tip\":\n\t\t\tif (plan.scope === \"tree\") return write;\n\t\t\treturn write.key === plan.branch ? { ...write, value: plan.destinationTip } : undefined;\n\t\tcase \"pi.lane.config\":\n\t\t\treturn plan.scope === \"tree\" || write.key === plan.branch ? write : undefined;\n\t\tcase \"pi.lane.state\":\n\t\t\treturn plan.scope === \"tree\" || write.key === plan.branch\n\t\t\t\t? { ...write, value: { currentOperationId: null, lastOperationId: null, inbox: [] } }\n\t\t\t\t: undefined;\n\t\tcase \"pi.result\":\n\t\t\treturn undefined;\n\t}\n\tif (write.namespace.startsWith(\"pi.op.\") || write.namespace.startsWith(\"pi.pending.\")) return undefined;\n\tif (write.namespace === \"pi\" || write.namespace.startsWith(\"pi.\")) {\n\t\tthrow new Error(`Unknown reserved fork namespace: ${write.namespace}`);\n\t}\n\treturn plan.scope === \"tree\" ? write : undefined;\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { Entry, ForkOptions } from "./types.ts";
2
+ import { type StoredValue } from "./values.ts";
3
+ export interface ForkSourceSnapshot {
4
+ entries: Entry[];
5
+ scalarValues: StoredValue<unknown>[];
6
+ /** False when a backend supplied only the requested branch rather than the full tree. */
7
+ entriesComplete?: boolean;
8
+ }
9
+ export interface ForkDestinationSnapshot {
10
+ entries: Map<string, Entry>;
11
+ scalarValues: StoredValue<unknown>[];
12
+ nextSeq: number;
13
+ }
14
+ /** Build the complete logical state for a forked destination session. */
15
+ export declare function createForkSnapshot(source: ForkSourceSnapshot, options: ForkOptions): ForkDestinationSnapshot;
16
+ //# sourceMappingURL=fork.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork.d.ts","sourceRoot":"","sources":["../../../src/harness/session/fork.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAoC,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAEpG,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,yFAAyF;IACzF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5B,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CAChB;AAYD,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,WAAW,GAAG,uBAAuB,CAkC5G"}