@draht/agent-core 2026.7.30 → 2026.10.4-2

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 (456) hide show
  1. package/dist/agent-loop.d.ts +27 -2
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +181 -63
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/agent.d.ts +14 -4
  6. package/dist/agent.d.ts.map +1 -1
  7. package/dist/agent.js +68 -19
  8. package/dist/agent.js.map +1 -1
  9. package/dist/harness/agent-harness.d.ts +713 -91
  10. package/dist/harness/agent-harness.d.ts.map +1 -1
  11. package/dist/harness/agent-harness.js +5 -950
  12. package/dist/harness/agent-harness.js.map +1 -1
  13. package/dist/harness/compaction/branch-summarization.d.ts +23 -10
  14. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  15. package/dist/harness/compaction/branch-summarization.js +39 -36
  16. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  17. package/dist/harness/compaction/compaction.d.ts +37 -18
  18. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  19. package/dist/harness/compaction/compaction.js +74 -97
  20. package/dist/harness/compaction/compaction.js.map +1 -1
  21. package/dist/harness/config.d.ts +9 -0
  22. package/dist/harness/config.d.ts.map +1 -0
  23. package/dist/harness/config.js +35 -0
  24. package/dist/harness/config.js.map +1 -0
  25. package/dist/harness/context.d.ts +9 -0
  26. package/dist/harness/context.d.ts.map +1 -0
  27. package/dist/harness/context.js +13 -0
  28. package/dist/harness/context.js.map +1 -0
  29. package/dist/harness/env/nodejs.d.ts +25 -27
  30. package/dist/harness/env/nodejs.d.ts.map +1 -1
  31. package/dist/harness/env/nodejs.js +355 -110
  32. package/dist/harness/env/nodejs.js.map +1 -1
  33. package/dist/harness/events.d.ts +24 -0
  34. package/dist/harness/events.d.ts.map +1 -0
  35. package/dist/harness/events.js +233 -0
  36. package/dist/harness/events.js.map +1 -0
  37. package/dist/harness/execution/assistant.d.ts +42 -0
  38. package/dist/harness/execution/assistant.d.ts.map +1 -0
  39. package/dist/harness/execution/assistant.js +82 -0
  40. package/dist/harness/execution/assistant.js.map +1 -0
  41. package/dist/harness/execution/effect-gate.d.ts +22 -0
  42. package/dist/harness/execution/effect-gate.d.ts.map +1 -0
  43. package/dist/harness/execution/effect-gate.js +49 -0
  44. package/dist/harness/execution/effect-gate.js.map +1 -0
  45. package/dist/harness/execution/tools.d.ts +67 -0
  46. package/dist/harness/execution/tools.d.ts.map +1 -0
  47. package/dist/harness/execution/tools.js +119 -0
  48. package/dist/harness/execution/tools.js.map +1 -0
  49. package/dist/harness/hooks.d.ts +38 -0
  50. package/dist/harness/hooks.d.ts.map +1 -0
  51. package/dist/harness/hooks.js +406 -0
  52. package/dist/harness/hooks.js.map +1 -0
  53. package/dist/harness/messages.d.ts +4 -4
  54. package/dist/harness/messages.d.ts.map +1 -1
  55. package/dist/harness/messages.js +4 -3
  56. package/dist/harness/messages.js.map +1 -1
  57. package/dist/harness/pico3/bash.d.ts +10 -0
  58. package/dist/harness/pico3/bash.d.ts.map +1 -0
  59. package/dist/harness/pico3/bash.js +25 -0
  60. package/dist/harness/pico3/bash.js.map +1 -0
  61. package/dist/harness/pico3/bounded.d.ts +21 -0
  62. package/dist/harness/pico3/bounded.d.ts.map +1 -0
  63. package/dist/harness/pico3/bounded.js +98 -0
  64. package/dist/harness/pico3/bounded.js.map +1 -0
  65. package/dist/harness/pico3/chord.d.ts +41 -0
  66. package/dist/harness/pico3/chord.d.ts.map +1 -0
  67. package/dist/harness/pico3/chord.js +147 -0
  68. package/dist/harness/pico3/chord.js.map +1 -0
  69. package/dist/harness/pico3/context.d.ts +16 -0
  70. package/dist/harness/pico3/context.d.ts.map +1 -0
  71. package/dist/harness/pico3/context.js +88 -0
  72. package/dist/harness/pico3/context.js.map +1 -0
  73. package/dist/harness/pico3/harness.d.ts +198 -0
  74. package/dist/harness/pico3/harness.d.ts.map +1 -0
  75. package/dist/harness/pico3/harness.js +654 -0
  76. package/dist/harness/pico3/harness.js.map +1 -0
  77. package/dist/harness/pico3/hooks.d.ts +10 -0
  78. package/dist/harness/pico3/hooks.d.ts.map +1 -0
  79. package/dist/harness/pico3/hooks.js +33 -0
  80. package/dist/harness/pico3/hooks.js.map +1 -0
  81. package/dist/harness/pico3/index.d.ts +19 -0
  82. package/dist/harness/pico3/index.d.ts.map +1 -0
  83. package/dist/harness/pico3/index.js +15 -0
  84. package/dist/harness/pico3/index.js.map +1 -0
  85. package/dist/harness/pico3/jsonl.d.ts +58 -0
  86. package/dist/harness/pico3/jsonl.d.ts.map +1 -0
  87. package/dist/harness/pico3/jsonl.js +325 -0
  88. package/dist/harness/pico3/jsonl.js.map +1 -0
  89. package/dist/harness/pico3/kinds/collapse.d.ts +49 -0
  90. package/dist/harness/pico3/kinds/collapse.d.ts.map +1 -0
  91. package/dist/harness/pico3/kinds/collapse.js +191 -0
  92. package/dist/harness/pico3/kinds/collapse.js.map +1 -0
  93. package/dist/harness/pico3/kinds/entries.d.ts +78 -0
  94. package/dist/harness/pico3/kinds/entries.d.ts.map +1 -0
  95. package/dist/harness/pico3/kinds/entries.js +13 -0
  96. package/dist/harness/pico3/kinds/entries.js.map +1 -0
  97. package/dist/harness/pico3/kinds/frames.d.ts +9 -0
  98. package/dist/harness/pico3/kinds/frames.d.ts.map +1 -0
  99. package/dist/harness/pico3/kinds/frames.js +75 -0
  100. package/dist/harness/pico3/kinds/frames.js.map +1 -0
  101. package/dist/harness/pico3/kinds/generation.d.ts +94 -0
  102. package/dist/harness/pico3/kinds/generation.d.ts.map +1 -0
  103. package/dist/harness/pico3/kinds/generation.js +504 -0
  104. package/dist/harness/pico3/kinds/generation.js.map +1 -0
  105. package/dist/harness/pico3/kinds/job.d.ts +44 -0
  106. package/dist/harness/pico3/kinds/job.d.ts.map +1 -0
  107. package/dist/harness/pico3/kinds/job.js +143 -0
  108. package/dist/harness/pico3/kinds/job.js.map +1 -0
  109. package/dist/harness/pico3/kinds/plugin.d.ts +15 -0
  110. package/dist/harness/pico3/kinds/plugin.d.ts.map +1 -0
  111. package/dist/harness/pico3/kinds/plugin.js +35 -0
  112. package/dist/harness/pico3/kinds/plugin.js.map +1 -0
  113. package/dist/harness/pico3/kinds/post-tools.d.ts +22 -0
  114. package/dist/harness/pico3/kinds/post-tools.d.ts.map +1 -0
  115. package/dist/harness/pico3/kinds/post-tools.js +145 -0
  116. package/dist/harness/pico3/kinds/post-tools.js.map +1 -0
  117. package/dist/harness/pico3/kinds/task-api.d.ts +3 -0
  118. package/dist/harness/pico3/kinds/task-api.d.ts.map +1 -0
  119. package/dist/harness/pico3/kinds/task-api.js +45 -0
  120. package/dist/harness/pico3/kinds/task-api.js.map +1 -0
  121. package/dist/harness/pico3/kinds/tool.d.ts +43 -0
  122. package/dist/harness/pico3/kinds/tool.d.ts.map +1 -0
  123. package/dist/harness/pico3/kinds/tool.js +373 -0
  124. package/dist/harness/pico3/kinds/tool.js.map +1 -0
  125. package/dist/harness/pico3/legacy-tracker.d.ts +11 -0
  126. package/dist/harness/pico3/legacy-tracker.d.ts.map +1 -0
  127. package/dist/harness/pico3/legacy-tracker.js +41 -0
  128. package/dist/harness/pico3/legacy-tracker.js.map +1 -0
  129. package/dist/harness/pico3/membrane.d.ts +23 -0
  130. package/dist/harness/pico3/membrane.d.ts.map +1 -0
  131. package/dist/harness/pico3/membrane.js +141 -0
  132. package/dist/harness/pico3/membrane.js.map +1 -0
  133. package/dist/harness/pico3/memory.d.ts +53 -0
  134. package/dist/harness/pico3/memory.d.ts.map +1 -0
  135. package/dist/harness/pico3/memory.js +264 -0
  136. package/dist/harness/pico3/memory.js.map +1 -0
  137. package/dist/harness/pico3/scheduler.d.ts +49 -0
  138. package/dist/harness/pico3/scheduler.d.ts.map +1 -0
  139. package/dist/harness/pico3/scheduler.js +438 -0
  140. package/dist/harness/pico3/scheduler.js.map +1 -0
  141. package/dist/harness/pico3/session.d.ts +264 -0
  142. package/dist/harness/pico3/session.d.ts.map +1 -0
  143. package/dist/harness/pico3/session.js +1348 -0
  144. package/dist/harness/pico3/session.js.map +1 -0
  145. package/dist/harness/pico3/system.d.ts +126 -0
  146. package/dist/harness/pico3/system.d.ts.map +1 -0
  147. package/dist/harness/pico3/system.js +244 -0
  148. package/dist/harness/pico3/system.js.map +1 -0
  149. package/dist/harness/pico3/types.d.ts +973 -0
  150. package/dist/harness/pico3/types.d.ts.map +1 -0
  151. package/dist/harness/pico3/types.js +106 -0
  152. package/dist/harness/pico3/types.js.map +1 -0
  153. package/dist/harness/pico3/view.d.ts +34 -0
  154. package/dist/harness/pico3/view.d.ts.map +1 -0
  155. package/dist/harness/pico3/view.js +411 -0
  156. package/dist/harness/pico3/view.js.map +1 -0
  157. package/dist/harness/prompt-templates.d.ts +3 -2
  158. package/dist/harness/prompt-templates.d.ts.map +1 -1
  159. package/dist/harness/prompt-templates.js +18 -23
  160. package/dist/harness/prompt-templates.js.map +1 -1
  161. package/dist/harness/result.d.ts +133 -0
  162. package/dist/harness/result.d.ts.map +1 -0
  163. package/dist/harness/result.js +81 -0
  164. package/dist/harness/result.js.map +1 -0
  165. package/dist/harness/runtime/drive/boundary.d.ts +28 -0
  166. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
  167. package/dist/harness/runtime/drive/boundary.js +173 -0
  168. package/dist/harness/runtime/drive/boundary.js.map +1 -0
  169. package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
  170. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
  171. package/dist/harness/runtime/drive/checkpoint.js +133 -0
  172. package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
  173. package/dist/harness/runtime/drive/deferred.d.ts +15 -0
  174. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
  175. package/dist/harness/runtime/drive/deferred.js +179 -0
  176. package/dist/harness/runtime/drive/deferred.js.map +1 -0
  177. package/dist/harness/runtime/drive/generation.d.ts +8 -0
  178. package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
  179. package/dist/harness/runtime/drive/generation.js +205 -0
  180. package/dist/harness/runtime/drive/generation.js.map +1 -0
  181. package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
  182. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
  183. package/dist/harness/runtime/drive/reconcile.js +140 -0
  184. package/dist/harness/runtime/drive/reconcile.js.map +1 -0
  185. package/dist/harness/runtime/drive/recovery.d.ts +8 -0
  186. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
  187. package/dist/harness/runtime/drive/recovery.js +85 -0
  188. package/dist/harness/runtime/drive/recovery.js.map +1 -0
  189. package/dist/harness/runtime/drive/response.d.ts +23 -0
  190. package/dist/harness/runtime/drive/response.d.ts.map +1 -0
  191. package/dist/harness/runtime/drive/response.js +394 -0
  192. package/dist/harness/runtime/drive/response.js.map +1 -0
  193. package/dist/harness/runtime/drive/retry.d.ts +4 -0
  194. package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
  195. package/dist/harness/runtime/drive/retry.js +34 -0
  196. package/dist/harness/runtime/drive/retry.js.map +1 -0
  197. package/dist/harness/runtime/drive/structural.d.ts +32 -0
  198. package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
  199. package/dist/harness/runtime/drive/structural.js +929 -0
  200. package/dist/harness/runtime/drive/structural.js.map +1 -0
  201. package/dist/harness/runtime/drive/terminal.d.ts +7 -0
  202. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
  203. package/dist/harness/runtime/drive/terminal.js +49 -0
  204. package/dist/harness/runtime/drive/terminal.js.map +1 -0
  205. package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
  206. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
  207. package/dist/harness/runtime/drive/tool-placement.js +219 -0
  208. package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
  209. package/dist/harness/runtime/drive/tools.d.ts +6 -0
  210. package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
  211. package/dist/harness/runtime/drive/tools.js +449 -0
  212. package/dist/harness/runtime/drive/tools.js.map +1 -0
  213. package/dist/harness/runtime/drive.d.ts +6 -0
  214. package/dist/harness/runtime/drive.d.ts.map +1 -0
  215. package/dist/harness/runtime/drive.js +93 -0
  216. package/dist/harness/runtime/drive.js.map +1 -0
  217. package/dist/harness/runtime/harness.d.ts +59 -0
  218. package/dist/harness/runtime/harness.d.ts.map +1 -0
  219. package/dist/harness/runtime/harness.js +311 -0
  220. package/dist/harness/runtime/harness.js.map +1 -0
  221. package/dist/harness/runtime/index.d.ts +2 -0
  222. package/dist/harness/runtime/index.d.ts.map +1 -0
  223. package/dist/harness/runtime/index.js +2 -0
  224. package/dist/harness/runtime/index.js.map +1 -0
  225. package/dist/harness/runtime/lane.d.ts +118 -0
  226. package/dist/harness/runtime/lane.d.ts.map +1 -0
  227. package/dist/harness/runtime/lane.js +1575 -0
  228. package/dist/harness/runtime/lane.js.map +1 -0
  229. package/dist/harness/runtime/progress.d.ts +15 -0
  230. package/dist/harness/runtime/progress.d.ts.map +1 -0
  231. package/dist/harness/runtime/progress.js +66 -0
  232. package/dist/harness/runtime/progress.js.map +1 -0
  233. package/dist/harness/runtime/reducer.d.ts +5 -0
  234. package/dist/harness/runtime/reducer.d.ts.map +1 -0
  235. package/dist/harness/runtime/reducer.js +240 -0
  236. package/dist/harness/runtime/reducer.js.map +1 -0
  237. package/dist/harness/runtime/restore.d.ts +24 -0
  238. package/dist/harness/runtime/restore.d.ts.map +1 -0
  239. package/dist/harness/runtime/restore.js +117 -0
  240. package/dist/harness/runtime/restore.js.map +1 -0
  241. package/dist/harness/runtime/transcript.d.ts +21 -0
  242. package/dist/harness/runtime/transcript.d.ts.map +1 -0
  243. package/dist/harness/runtime/transcript.js +72 -0
  244. package/dist/harness/runtime/transcript.js.map +1 -0
  245. package/dist/harness/runtime/types.d.ts +105 -0
  246. package/dist/harness/runtime/types.d.ts.map +1 -0
  247. package/dist/harness/runtime/types.js +61 -0
  248. package/dist/harness/runtime/types.js.map +1 -0
  249. package/dist/harness/session/commit.d.ts +53 -0
  250. package/dist/harness/session/commit.d.ts.map +1 -0
  251. package/dist/harness/session/commit.js +57 -0
  252. package/dist/harness/session/commit.js.map +1 -0
  253. package/dist/harness/session/context.d.ts +10 -0
  254. package/dist/harness/session/context.d.ts.map +1 -0
  255. package/dist/harness/session/context.js +49 -0
  256. package/dist/harness/session/context.js.map +1 -0
  257. package/dist/harness/session/fork-policy.d.ts +21 -0
  258. package/dist/harness/session/fork-policy.d.ts.map +1 -0
  259. package/dist/harness/session/fork-policy.js +55 -0
  260. package/dist/harness/session/fork-policy.js.map +1 -0
  261. package/dist/harness/session/fork.d.ts +16 -0
  262. package/dist/harness/session/fork.d.ts.map +1 -0
  263. package/dist/harness/session/fork.js +79 -0
  264. package/dist/harness/session/fork.js.map +1 -0
  265. package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
  266. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
  267. package/dist/harness/session/in-memory-storage-state.js +276 -0
  268. package/dist/harness/session/in-memory-storage-state.js.map +1 -0
  269. package/dist/harness/session/index.d.ts +11 -0
  270. package/dist/harness/session/index.d.ts.map +1 -0
  271. package/dist/harness/session/index.js +9 -0
  272. package/dist/harness/session/index.js.map +1 -0
  273. package/dist/harness/session/jsonl/codec.d.ts +21 -0
  274. package/dist/harness/session/jsonl/codec.d.ts.map +1 -0
  275. package/dist/harness/session/jsonl/codec.js +45 -0
  276. package/dist/harness/session/jsonl/codec.js.map +1 -0
  277. package/dist/harness/session/jsonl/fork.d.ts +38 -0
  278. package/dist/harness/session/jsonl/fork.d.ts.map +1 -0
  279. package/dist/harness/session/jsonl/fork.js +264 -0
  280. package/dist/harness/session/jsonl/fork.js.map +1 -0
  281. package/dist/harness/session/jsonl/index.d.ts +4 -0
  282. package/dist/harness/session/jsonl/index.d.ts.map +1 -0
  283. package/dist/harness/session/jsonl/index.js +4 -0
  284. package/dist/harness/session/jsonl/index.js.map +1 -0
  285. package/dist/harness/session/jsonl/io.d.ts +14 -0
  286. package/dist/harness/session/jsonl/io.d.ts.map +1 -0
  287. package/dist/harness/session/jsonl/io.js +86 -0
  288. package/dist/harness/session/jsonl/io.js.map +1 -0
  289. package/dist/harness/session/jsonl/legacy-v3.d.ts +44 -0
  290. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
  291. package/dist/harness/session/jsonl/legacy-v3.js +462 -0
  292. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
  293. package/dist/harness/session/jsonl/repo.d.ts +35 -0
  294. package/dist/harness/session/jsonl/repo.d.ts.map +1 -0
  295. package/dist/harness/session/jsonl/repo.js +301 -0
  296. package/dist/harness/session/jsonl/repo.js.map +1 -0
  297. package/dist/harness/session/jsonl/storage.d.ts +41 -0
  298. package/dist/harness/session/jsonl/storage.d.ts.map +1 -0
  299. package/dist/harness/session/jsonl/storage.js +200 -0
  300. package/dist/harness/session/jsonl/storage.js.map +1 -0
  301. package/dist/harness/session/jsonl/types.d.ts +39 -0
  302. package/dist/harness/session/jsonl/types.d.ts.map +1 -0
  303. package/dist/harness/session/jsonl/types.js +3 -0
  304. package/dist/harness/session/jsonl/types.js.map +1 -0
  305. package/dist/harness/session/memory.d.ts +48 -0
  306. package/dist/harness/session/memory.d.ts.map +1 -0
  307. package/dist/harness/session/memory.js +369 -0
  308. package/dist/harness/session/memory.js.map +1 -0
  309. package/dist/harness/session/mutation-line.d.ts +8 -0
  310. package/dist/harness/session/mutation-line.d.ts.map +1 -0
  311. package/dist/harness/session/mutation-line.js +21 -0
  312. package/dist/harness/session/mutation-line.js.map +1 -0
  313. package/dist/harness/session/session.d.ts +79 -46
  314. package/dist/harness/session/session.d.ts.map +1 -1
  315. package/dist/harness/session/session.js +320 -220
  316. package/dist/harness/session/session.js.map +1 -1
  317. package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
  318. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
  319. package/dist/harness/session/testing/benchmark/datasets.js +24 -0
  320. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
  321. package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
  322. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
  323. package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
  324. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
  325. package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
  326. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
  327. package/dist/harness/session/testing/benchmark/storage.js +114 -0
  328. package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
  329. package/dist/harness/session/testing/conformance/session-repo.d.ts +23 -0
  330. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
  331. package/dist/harness/session/testing/conformance/session-repo.js +809 -0
  332. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
  333. package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
  334. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
  335. package/dist/harness/session/testing/conformance/storage.js +600 -0
  336. package/dist/harness/session/testing/conformance/storage.js.map +1 -0
  337. package/dist/harness/session/testing/gating-storage.d.ts +26 -0
  338. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
  339. package/dist/harness/session/testing/gating-storage.js +100 -0
  340. package/dist/harness/session/testing/gating-storage.js.map +1 -0
  341. package/dist/harness/session/testing/index.d.ts +10 -0
  342. package/dist/harness/session/testing/index.d.ts.map +1 -0
  343. package/dist/harness/session/testing/index.js +9 -0
  344. package/dist/harness/session/testing/index.js.map +1 -0
  345. package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
  346. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
  347. package/dist/harness/session/testing/instrumented-storage.js +16 -0
  348. package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
  349. package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
  350. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
  351. package/dist/harness/session/testing/storage-decorator.js +41 -0
  352. package/dist/harness/session/testing/storage-decorator.js.map +1 -0
  353. package/dist/harness/session/testing/types.d.ts +12 -0
  354. package/dist/harness/session/testing/types.d.ts.map +1 -0
  355. package/dist/harness/session/testing/types.js +2 -0
  356. package/dist/harness/session/testing/types.js.map +1 -0
  357. package/dist/harness/session/types.d.ts +512 -0
  358. package/dist/harness/session/types.d.ts.map +1 -0
  359. package/dist/harness/session/types.js +9 -0
  360. package/dist/harness/session/types.js.map +1 -0
  361. package/dist/harness/session/values.d.ts +95 -0
  362. package/dist/harness/session/values.d.ts.map +1 -0
  363. package/dist/harness/session/values.js +81 -0
  364. package/dist/harness/session/values.js.map +1 -0
  365. package/dist/harness/skills.d.ts +6 -4
  366. package/dist/harness/skills.d.ts.map +1 -1
  367. package/dist/harness/skills.js +59 -44
  368. package/dist/harness/skills.js.map +1 -1
  369. package/dist/harness/telemetry.d.ts +1242 -0
  370. package/dist/harness/telemetry.d.ts.map +1 -0
  371. package/dist/harness/telemetry.js +527 -0
  372. package/dist/harness/telemetry.js.map +1 -0
  373. package/dist/harness/tools/bash.d.ts +4 -4
  374. package/dist/harness/tools/bash.d.ts.map +1 -1
  375. package/dist/harness/tools/bash.js +66 -93
  376. package/dist/harness/tools/bash.js.map +1 -1
  377. package/dist/harness/tools/edit.d.ts.map +1 -1
  378. package/dist/harness/tools/edit.js +24 -11
  379. package/dist/harness/tools/edit.js.map +1 -1
  380. package/dist/harness/tools/file-mutation-queue.d.ts +2 -1
  381. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  382. package/dist/harness/tools/file-mutation-queue.js +5 -5
  383. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  384. package/dist/harness/tools/image.js +1 -1
  385. package/dist/harness/tools/image.js.map +1 -1
  386. package/dist/harness/tools/path-utils.d.ts +3 -2
  387. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  388. package/dist/harness/tools/path-utils.js +5 -5
  389. package/dist/harness/tools/path-utils.js.map +1 -1
  390. package/dist/harness/tools/read.d.ts +2 -1
  391. package/dist/harness/tools/read.d.ts.map +1 -1
  392. package/dist/harness/tools/read.js +4 -6
  393. package/dist/harness/tools/read.js.map +1 -1
  394. package/dist/harness/tools/write.d.ts.map +1 -1
  395. package/dist/harness/tools/write.js +7 -7
  396. package/dist/harness/tools/write.js.map +1 -1
  397. package/dist/harness/types.d.ts +126 -502
  398. package/dist/harness/types.d.ts.map +1 -1
  399. package/dist/harness/types.js +10 -16
  400. package/dist/harness/types.js.map +1 -1
  401. package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
  402. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
  403. package/dist/harness/utils/adaptive-publisher.js +79 -0
  404. package/dist/harness/utils/adaptive-publisher.js.map +1 -0
  405. package/dist/harness/utils/output-capture.d.ts +31 -0
  406. package/dist/harness/utils/output-capture.d.ts.map +1 -0
  407. package/dist/harness/utils/output-capture.js +217 -0
  408. package/dist/harness/utils/output-capture.js.map +1 -0
  409. package/dist/harness/utils/shell-output.d.ts +12 -5
  410. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  411. package/dist/harness/utils/shell-output.js +64 -174
  412. package/dist/harness/utils/shell-output.js.map +1 -1
  413. package/dist/harness/utils/truncate.d.ts +1 -0
  414. package/dist/harness/utils/truncate.d.ts.map +1 -1
  415. package/dist/harness/utils/truncate.js +1 -1
  416. package/dist/harness/utils/truncate.js.map +1 -1
  417. package/dist/harness/utils/usage.d.ts +4 -0
  418. package/dist/harness/utils/usage.d.ts.map +1 -0
  419. package/dist/harness/utils/usage.js +33 -0
  420. package/dist/harness/utils/usage.js.map +1 -0
  421. package/dist/index.d.ts +13 -9
  422. package/dist/index.d.ts.map +1 -1
  423. package/dist/index.js +9 -13
  424. package/dist/index.js.map +1 -1
  425. package/dist/proxy.d.ts +6 -3
  426. package/dist/proxy.d.ts.map +1 -1
  427. package/dist/proxy.js +42 -10
  428. package/dist/proxy.js.map +1 -1
  429. package/dist/search/index.d.ts +29 -0
  430. package/dist/search/index.d.ts.map +1 -0
  431. package/dist/search/index.js +2 -0
  432. package/dist/search/index.js.map +1 -0
  433. package/dist/types.d.ts +113 -31
  434. package/dist/types.d.ts.map +1 -1
  435. package/dist/types.js.map +1 -1
  436. package/package.json +50 -4
  437. package/dist/harness/session/jsonl-repo.d.ts +0 -26
  438. package/dist/harness/session/jsonl-repo.d.ts.map +0 -1
  439. package/dist/harness/session/jsonl-repo.js +0 -100
  440. package/dist/harness/session/jsonl-repo.js.map +0 -1
  441. package/dist/harness/session/jsonl-storage.d.ts +0 -42
  442. package/dist/harness/session/jsonl-storage.d.ts.map +0 -1
  443. package/dist/harness/session/jsonl-storage.js +0 -286
  444. package/dist/harness/session/jsonl-storage.js.map +0 -1
  445. package/dist/harness/session/memory-repo.d.ts +0 -18
  446. package/dist/harness/session/memory-repo.d.ts.map +0 -1
  447. package/dist/harness/session/memory-repo.js +0 -44
  448. package/dist/harness/session/memory-repo.js.map +0 -1
  449. package/dist/harness/session/memory-storage.d.ts +0 -33
  450. package/dist/harness/session/memory-storage.d.ts.map +0 -1
  451. package/dist/harness/session/memory-storage.js +0 -163
  452. package/dist/harness/session/memory-storage.js.map +0 -1
  453. package/dist/harness/session/repo-utils.d.ts +0 -11
  454. package/dist/harness/session/repo-utils.d.ts.map +0 -1
  455. package/dist/harness/session/repo-utils.js +0 -39
  456. package/dist/harness/session/repo-utils.js.map +0 -1
@@ -1,261 +1,361 @@
1
- import { createBranchSummaryMessage, createCompactionSummaryMessage, createCustomMessage } from "../messages.js";
2
- import { SessionError } from "../types.js";
3
- function deriveSessionContextState(pathEntries) {
4
- let thinkingLevel = "off";
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 === "model_change") {
12
- model = { provider: entry.provider, modelId: entry.modelId };
13
- }
14
- else if (entry.type === "message" && entry.message.role === "assistant") {
15
- model = { provider: entry.message.provider, modelId: entry.message.model };
16
- }
17
- else if (entry.type === "active_tools_change") {
18
- activeToolNames = [...entry.activeToolNames];
19
- }
1
+ import { uuidv7 } from "@draht/ai/utils/uuid";
2
+ import { insertEntry } from "./commit.js";
3
+ import { MutationLine } from "./mutation-line.js";
4
+ import { appendList as appendListWrite, branchTip, deleteList as deleteListWrite, deleteValue as deleteValueWrite, entryLabel, sessionName, setValue as setValueWrite, } from "./values.js";
5
+ /** Durable session state is internally inconsistent and cannot be safely advanced. */
6
+ export class SessionInvariantError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "SessionInvariantError";
20
10
  }
21
- return { thinkingLevel, model, activeToolNames };
22
11
  }
23
- export function defaultContextEntryTransform(pathEntries) {
24
- let compaction = null;
25
- for (const entry of pathEntries) {
26
- if (entry.type === "compaction") {
27
- compaction = entry;
28
- }
12
+ /** A requested Branch name is invalid. */
13
+ export class SessionInvalidBranchError extends Error {
14
+ branch;
15
+ reason;
16
+ constructor(branch, reason) {
17
+ super(`Invalid branch ${JSON.stringify(branch)}: ${reason}`);
18
+ this.name = "SessionInvalidBranchError";
19
+ this.branch = branch;
20
+ this.reason = reason;
29
21
  }
30
- if (!compaction) {
31
- return [...pathEntries];
32
- }
33
- const entries = [compaction];
34
- const compactionIdx = pathEntries.findIndex((entry) => entry.type === "compaction" && entry.id === compaction.id);
35
- if (compaction.retainedTail) {
36
- for (let i = compactionIdx + 1; i < pathEntries.length; i++) {
37
- entries.push(pathEntries[i]);
38
- }
39
- return entries;
40
- }
41
- if (compaction.firstKeptEntryId) {
42
- let foundFirstKept = false;
43
- for (let i = 0; i < compactionIdx; i++) {
44
- const entry = pathEntries[i];
45
- if (entry.id === compaction.firstKeptEntryId)
46
- foundFirstKept = true;
47
- if (foundFirstKept)
48
- entries.push(entry);
49
- }
50
- }
51
- for (let i = compactionIdx + 1; i < pathEntries.length; i++) {
52
- entries.push(pathEntries[i]);
22
+ }
23
+ /** A requested branch already exists. */
24
+ export class SessionBranchExistsError extends Error {
25
+ branch;
26
+ constructor(branch) {
27
+ super(`Branch already exists: ${branch}`);
28
+ this.name = "SessionBranchExistsError";
29
+ this.branch = branch;
53
30
  }
54
- return entries;
55
31
  }
56
- export function buildContextEntries(pathEntries, options = {}) {
57
- let entries = defaultContextEntryTransform(pathEntries);
58
- for (const transform of options.entryTransforms ?? []) {
59
- entries = [...transform(entries)];
32
+ /** A pending assistant message cannot be persisted as a session entry. */
33
+ export class SessionPendingAssistantMessageError extends Error {
34
+ constructor() {
35
+ super("Cannot persist a pending assistant message");
36
+ this.name = "SessionPendingAssistantMessageError";
60
37
  }
61
- return entries;
62
38
  }
63
- export function sessionEntryToContextMessages(entry, index, entries, options = {}) {
64
- if (entry.type === "message") {
65
- return [entry.message];
39
+ /** A requested session entry target does not exist. */
40
+ export class SessionUnknownTargetError extends Error {
41
+ targetId;
42
+ constructor(targetId) {
43
+ super(`Unknown target: ${targetId}`);
44
+ this.name = "SessionUnknownTargetError";
45
+ this.targetId = targetId;
66
46
  }
67
- if (entry.type === "custom_message") {
68
- return [
69
- createCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp),
70
- ];
47
+ }
48
+ class StorageBackedSessionMutation {
49
+ storage;
50
+ release;
51
+ active = true;
52
+ commitResult;
53
+ endPromise;
54
+ constructor(storage, release) {
55
+ this.storage = storage;
56
+ this.release = release;
57
+ }
58
+ commit(writes, context) {
59
+ this.assertActive();
60
+ if (this.commitResult !== undefined)
61
+ return Promise.reject(new Error("SessionMutator commit already attempted"));
62
+ try {
63
+ for (const write of writes) {
64
+ if (write.kind === "entry" &&
65
+ write.entry.type === "message" &&
66
+ write.entry.message.role === "assistant" &&
67
+ write.entry.message.stopReason === "pending") {
68
+ throw new SessionPendingAssistantMessageError();
69
+ }
70
+ }
71
+ this.commitResult = this.storage.commit(writes, context);
72
+ }
73
+ catch (error) {
74
+ this.commitResult = Promise.reject(error);
75
+ }
76
+ return this.commitResult;
71
77
  }
72
- if (entry.type === "compaction") {
73
- return [
74
- createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),
75
- ...(entry.retainedTail ?? []),
76
- ];
78
+ end(_context) {
79
+ if (this.endPromise !== undefined)
80
+ return this.endPromise;
81
+ this.active = false;
82
+ this.endPromise = this.settle().finally(this.release);
83
+ return this.endPromise;
77
84
  }
78
- if (entry.type === "branch_summary" && entry.summary) {
79
- return [createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp)];
85
+ getEntries(ids, context) {
86
+ this.assertActive();
87
+ return this.storage.getEntries(ids, context);
80
88
  }
81
- if (entry.type === "custom") {
82
- return [...(options.entryProjectors?.[entry.customType]?.(entry, index, entries) ?? [])];
89
+ getStats(context) {
90
+ this.assertActive();
91
+ return this.storage.getStats(context);
83
92
  }
84
- return [];
85
- }
86
- export function buildSessionContext(pathEntries, options = {}) {
87
- const state = deriveSessionContextState(pathEntries);
88
- const contextEntries = buildContextEntries(pathEntries, options);
89
- const messages = contextEntries.flatMap((entry, index) => sessionEntryToContextMessages(entry, index, contextEntries, options));
90
- return { ...state, messages };
91
- }
92
- export class Session {
93
- constructor(storage, contextBuildOptions = {}) {
94
- this.storage = storage;
95
- this.contextBuildOptions = contextBuildOptions;
93
+ getValue(address, context) {
94
+ this.assertActive();
95
+ return this.storage.getValue(address, context);
96
96
  }
97
- getMetadata() {
98
- return this.storage.getMetadata();
97
+ scanValues(prefix, context) {
98
+ this.assertActive();
99
+ return this.storage.scanValues(prefix, context);
99
100
  }
100
- getStorage() {
101
- return this.storage;
101
+ readList(address, options, context) {
102
+ this.assertActive();
103
+ return this.storage.readList(address, options, context);
102
104
  }
103
- getLeafId() {
104
- return this.storage.getLeafId();
105
+ scanBranch(query, context) {
106
+ this.assertActive();
107
+ return this.storage.scanBranch(query, context);
105
108
  }
106
- getEntry(id) {
107
- return this.storage.getEntry(id);
109
+ settle() {
110
+ return (this.commitResult?.then(() => undefined, () => undefined) ?? Promise.resolve());
108
111
  }
109
- getEntries(options) {
110
- return this.storage.getEntries(options);
112
+ assertActive() {
113
+ if (!this.active)
114
+ throw new Error("SessionMutator cannot be used outside its mutation callback");
111
115
  }
112
- async getBranch(fromId) {
113
- const leafId = fromId ?? (await this.storage.getLeafId());
114
- return this.storage.getPathToRootOrCompaction(leafId);
116
+ }
117
+ class StorageBackedBranch {
118
+ name;
119
+ session;
120
+ constructor(name, session) {
121
+ this.name = name;
122
+ this.session = session;
115
123
  }
116
- async buildContextEntries(options = {}) {
117
- return buildContextEntries(await this.getBranch(), this.mergeContextBuildOptions(options));
124
+ getTipId(context) {
125
+ return this.session.getBranchTip(this.name, context);
118
126
  }
119
- async buildContext(options = {}) {
120
- return buildSessionContext(await this.getBranch(), this.mergeContextBuildOptions(options));
127
+ async findEntries(query, context) {
128
+ query ??= {};
129
+ const start = query.start ?? (await this.getTipId(context));
130
+ if (start === null)
131
+ return [];
132
+ return this.session.scanBranch({ ...query, start, order: query.order ?? "newestFirst" }, context);
121
133
  }
122
- mergeContextBuildOptions(options) {
123
- return {
124
- entryTransforms: [...(this.contextBuildOptions.entryTransforms ?? []), ...(options.entryTransforms ?? [])],
125
- entryProjectors: {
126
- ...(this.contextBuildOptions.entryProjectors ?? {}),
127
- ...(options.entryProjectors ?? {}),
128
- },
129
- };
134
+ async findEntry(query, context) {
135
+ query ??= {};
136
+ return (await this.findEntries({ ...query, limit: query.limit === undefined ? 1 : Math.min(query.limit, 1) }, context))[0];
130
137
  }
131
- getLabel(id) {
132
- return this.storage.getLabel(id);
138
+ appendMessage(message, context) {
139
+ return this.session.appendToBranch(this.name, { type: "message", message }, context);
133
140
  }
134
- getSessionStats() {
135
- return this.storage.getSessionStats();
141
+ appendCustomEntry(customType, data, context) {
142
+ return this.session.appendToBranch(this.name, { type: "custom", customType, ...(data === undefined ? {} : { data }) }, context);
136
143
  }
137
- async getSessionName() {
138
- return this.storage.getSessionName();
144
+ }
145
+ /** Package-internal typed boundary shared by concrete session repositories. */
146
+ export class StorageBackedSession {
147
+ metadata;
148
+ idGenerator;
149
+ storage;
150
+ mutationLine;
151
+ onClose;
152
+ branches = new Map();
153
+ closedError = new Error("Session is closed");
154
+ state = "open";
155
+ closePromise;
156
+ constructor(metadata, storage, options = {}) {
157
+ this.metadata = metadata;
158
+ this.idGenerator = options.idGenerator ?? { next: uuidv7 };
159
+ this.storage = storage;
160
+ this.mutationLine = options.mutationLine ?? new MutationLine();
161
+ this.onClose = options.onClose;
162
+ }
163
+ async beginMutation(_context) {
164
+ this.assertOpen();
165
+ let grant;
166
+ let rejectGrant;
167
+ const granted = new Promise((resolve, reject) => {
168
+ grant = resolve;
169
+ rejectGrant = reject;
170
+ });
171
+ let release;
172
+ const finished = new Promise((resolve) => {
173
+ release = resolve;
174
+ });
175
+ const line = this.mutationLine.run(async () => {
176
+ grant(new StorageBackedSessionMutation(this.storage, release));
177
+ await finished;
178
+ });
179
+ void line.catch(rejectGrant);
180
+ return granted;
139
181
  }
140
- async appendTypedEntry(entry) {
141
- await this.storage.appendEntry(entry);
142
- return entry.id;
182
+ async mutate(mutation, context) {
183
+ const mutator = await this.beginMutation(context);
184
+ try {
185
+ return await mutation(mutator, context);
186
+ }
187
+ finally {
188
+ await mutator.end(context);
189
+ }
143
190
  }
144
- async appendMessage(message) {
145
- return this.appendTypedEntry({
146
- type: "message",
147
- id: await this.storage.createEntryId(),
148
- parentId: await this.storage.getLeafId(),
149
- timestamp: new Date().toISOString(),
150
- message,
151
- });
191
+ async getEntries(ids, context) {
192
+ this.assertOpen();
193
+ return this.storage.getEntries(ids, context);
152
194
  }
153
- async appendThinkingLevelChange(thinkingLevel) {
154
- return this.appendTypedEntry({
155
- type: "thinking_level_change",
156
- id: await this.storage.createEntryId(),
157
- parentId: await this.storage.getLeafId(),
158
- timestamp: new Date().toISOString(),
159
- thinkingLevel,
160
- });
195
+ async getEntry(id, context) {
196
+ return (await this.getEntries([id], context)).get(id);
161
197
  }
162
- async appendModelChange(provider, modelId) {
163
- return this.appendTypedEntry({
164
- type: "model_change",
165
- id: await this.storage.createEntryId(),
166
- parentId: await this.storage.getLeafId(),
167
- timestamp: new Date().toISOString(),
168
- provider,
169
- modelId,
170
- });
198
+ async getValue(address, context) {
199
+ this.assertOpen();
200
+ return this.storage.getValue(address, context);
171
201
  }
172
- async appendActiveToolsChange(activeToolNames) {
173
- return this.appendTypedEntry({
174
- type: "active_tools_change",
175
- id: await this.storage.createEntryId(),
176
- parentId: await this.storage.getLeafId(),
177
- timestamp: new Date().toISOString(),
178
- activeToolNames: [...activeToolNames],
179
- });
202
+ async scanValues(prefix, context) {
203
+ this.assertOpen();
204
+ return this.storage.scanValues(prefix, context);
180
205
  }
181
- async appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromHook, usage, retainedTail) {
182
- return this.appendTypedEntry({
183
- type: "compaction",
184
- id: await this.storage.createEntryId(),
185
- parentId: await this.storage.getLeafId(),
186
- timestamp: new Date().toISOString(),
187
- summary,
188
- firstKeptEntryId,
189
- tokensBefore,
190
- retainedTail,
191
- details,
192
- usage,
193
- fromHook,
194
- });
206
+ async readList(address, options, context) {
207
+ this.assertOpen();
208
+ return this.storage.readList(address, options, context);
195
209
  }
196
- async appendCustomEntry(customType, data) {
197
- return this.appendTypedEntry({
198
- type: "custom",
199
- id: await this.storage.createEntryId(),
200
- parentId: await this.storage.getLeafId(),
201
- timestamp: new Date().toISOString(),
202
- customType,
203
- data,
204
- });
210
+ async scanBranch(query, context) {
211
+ this.assertOpen();
212
+ return this.storage.scanBranch(query, context);
205
213
  }
206
- async appendCustomMessageEntry(customType, content, display, details) {
207
- return this.appendTypedEntry({
208
- type: "custom_message",
209
- id: await this.storage.createEntryId(),
210
- parentId: await this.storage.getLeafId(),
211
- timestamp: new Date().toISOString(),
212
- customType,
213
- content,
214
- display,
215
- details,
216
- });
214
+ async getStats(context) {
215
+ this.assertOpen();
216
+ return this.storage.getStats(context);
217
217
  }
218
- async appendLabel(targetId, label) {
219
- if (!(await this.storage.getEntry(targetId))) {
220
- throw new SessionError("not_found", `Entry ${targetId} not found`);
221
- }
222
- return this.appendTypedEntry({
223
- type: "label",
224
- id: await this.storage.createEntryId(),
225
- parentId: await this.storage.getLeafId(),
226
- timestamp: new Date().toISOString(),
227
- targetId,
228
- label,
229
- });
218
+ async getName(context) {
219
+ return (await this.getValue(sessionName, context))?.value;
230
220
  }
231
- async appendSessionName(name) {
232
- const sanitizedName = name.replace(/[\r\n]+/g, " ").trim();
233
- return this.appendTypedEntry({
234
- type: "session_info",
235
- id: await this.storage.createEntryId(),
236
- parentId: await this.storage.getLeafId(),
237
- timestamp: new Date().toISOString(),
238
- name: sanitizedName,
239
- });
221
+ async getLabel(targetId, context) {
222
+ return (await this.getValue(entryLabel(targetId), context))?.value;
240
223
  }
241
- async moveTo(entryId, summary) {
242
- if (entryId !== null && !(await this.storage.getEntry(entryId))) {
243
- throw new SessionError("not_found", `Entry ${entryId} not found`);
224
+ async findEntries(query, context) {
225
+ query ??= {};
226
+ this.assertOpen();
227
+ const order = query.order ?? "desc";
228
+ if (query.cursor !== undefined) {
229
+ if (order === "asc" && query.cursor.seq === Number.MAX_SAFE_INTEGER)
230
+ return [];
231
+ if (order === "desc" && query.cursor.seq <= 1)
232
+ return [];
244
233
  }
245
- await this.storage.setLeafId(entryId);
246
- if (!summary)
234
+ return this.storage.scanEntries({
235
+ type: query.type,
236
+ customType: query.customType,
237
+ order,
238
+ limit: query.limit,
239
+ ...(query.cursor === undefined
240
+ ? {}
241
+ : order === "asc"
242
+ ? { fromSeq: query.cursor.seq + 1 }
243
+ : { toSeq: query.cursor.seq - 1 }),
244
+ }, context);
245
+ }
246
+ async findEntry(query, context) {
247
+ query ??= {};
248
+ return (await this.findEntries({ ...query, limit: query.limit === undefined ? 1 : Math.min(query.limit, 1) }, context))[0];
249
+ }
250
+ async branch(name, context) {
251
+ this.assertValidBranchName(name);
252
+ if ((await this.getValue(branchTip(name), context)) === undefined)
247
253
  return undefined;
248
- return this.appendTypedEntry({
249
- type: "branch_summary",
250
- id: await this.storage.createEntryId(),
251
- parentId: entryId,
252
- timestamp: new Date().toISOString(),
253
- fromId: entryId ?? "root",
254
- summary: summary.summary,
255
- details: summary.details,
256
- usage: summary.usage,
257
- fromHook: summary.fromHook,
254
+ return this.getOrCreateBranchObject(name);
255
+ }
256
+ async createBranch(name, at, context) {
257
+ this.assertOpen();
258
+ this.assertValidBranchName(name);
259
+ await this.mutate(async (mutator) => {
260
+ if ((await mutator.getValue(branchTip(name), context)) !== undefined) {
261
+ throw new SessionBranchExistsError(name);
262
+ }
263
+ if (at !== null && !(await mutator.getEntries([at], context)).has(at)) {
264
+ throw new SessionUnknownTargetError(at);
265
+ }
266
+ await mutator.commit([setValueWrite(branchTip(name), at)], context);
267
+ }, context);
268
+ return this.getOrCreateBranchObject(name);
269
+ }
270
+ setValue(address, next, context) {
271
+ return this.mutate(async (mutator) => {
272
+ await mutator.commit([setValueWrite(address, next)], context);
273
+ }, context);
274
+ }
275
+ deleteValue(address, context) {
276
+ return this.mutate(async (mutator) => {
277
+ await mutator.commit([deleteValueWrite(address)], context);
278
+ }, context);
279
+ }
280
+ appendList(address, element, context) {
281
+ return this.mutate(async (mutator) => {
282
+ await mutator.commit([appendListWrite(address, element)], context);
283
+ }, context);
284
+ }
285
+ deleteList(address, context) {
286
+ return this.mutate(async (mutator) => {
287
+ await mutator.commit([deleteListWrite(address)], context);
288
+ }, context);
289
+ }
290
+ setName(name, context) {
291
+ return name === undefined ? this.deleteValue(sessionName, context) : this.setValue(sessionName, name, context);
292
+ }
293
+ setLabel(targetId, label, context) {
294
+ const address = entryLabel(targetId);
295
+ return label === undefined ? this.deleteValue(address, context) : this.setValue(address, label, context);
296
+ }
297
+ close(context) {
298
+ if (this.closePromise !== undefined)
299
+ return this.closePromise;
300
+ this.state = "closing";
301
+ this.closePromise = this.mutationLine
302
+ .seal(this.closedError)
303
+ .then(() => this.storage.close(context))
304
+ .finally(() => {
305
+ this.state = "closed";
306
+ this.onClose?.();
258
307
  });
308
+ return this.closePromise;
309
+ }
310
+ async getBranchTip(name, context) {
311
+ const stored = await this.getValue(branchTip(name), context);
312
+ if (stored === undefined)
313
+ throw new SessionInvariantError(`Unknown branch: ${name}`);
314
+ return stored.value;
315
+ }
316
+ async appendToBranch(name, entry, context) {
317
+ this.assertOpen();
318
+ if (entry.type === "message" && entry.message.role === "assistant" && entry.message.stopReason === "pending") {
319
+ throw new SessionPendingAssistantMessageError();
320
+ }
321
+ const id = this.idGenerator.next();
322
+ await this.mutate(async (mutator) => {
323
+ const tip = await mutator.getValue(branchTip(name), context);
324
+ if (tip === undefined)
325
+ throw new SessionInvariantError(`Unknown branch: ${name}`);
326
+ await mutator.commit([
327
+ insertEntry(entry.type === "message"
328
+ ? { id, parentId: tip.value, type: "message", message: entry.message }
329
+ : {
330
+ id,
331
+ parentId: tip.value,
332
+ type: "custom",
333
+ customType: entry.customType,
334
+ ...(entry.data === undefined ? {} : { data: entry.data }),
335
+ }),
336
+ setValueWrite(branchTip(name), id),
337
+ ], context);
338
+ }, context);
339
+ return id;
340
+ }
341
+ getOrCreateBranchObject(name) {
342
+ let branch = this.branches.get(name);
343
+ if (branch === undefined) {
344
+ branch = new StorageBackedBranch(name, this);
345
+ this.branches.set(name, branch);
346
+ }
347
+ return branch;
348
+ }
349
+ assertValidBranchName(name) {
350
+ if (name.length === 0)
351
+ throw new SessionInvalidBranchError(name, "branch name must not be empty");
352
+ if (name.includes("\u0000")) {
353
+ throw new SessionInvalidBranchError(name, "branch name must not contain \\u0000");
354
+ }
355
+ }
356
+ assertOpen() {
357
+ if (this.state !== "open")
358
+ throw this.closedError;
259
359
  }
260
360
  }
261
361
  //# sourceMappingURL=session.js.map