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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/README.md +4 -0
  2. package/dist/harness/agent-harness.d.ts +639 -384
  3. package/dist/harness/agent-harness.d.ts.map +1 -1
  4. package/dist/harness/agent-harness.js +5 -250
  5. package/dist/harness/agent-harness.js.map +1 -1
  6. package/dist/harness/compaction/branch-summarization.d.ts +12 -6
  7. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  8. package/dist/harness/compaction/branch-summarization.js +33 -27
  9. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  10. package/dist/harness/compaction/compaction.d.ts +30 -8
  11. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  12. package/dist/harness/compaction/compaction.js +53 -64
  13. package/dist/harness/compaction/compaction.js.map +1 -1
  14. package/dist/harness/config.d.ts +9 -0
  15. package/dist/harness/config.d.ts.map +1 -0
  16. package/dist/harness/config.js +35 -0
  17. package/dist/harness/config.js.map +1 -0
  18. package/dist/harness/context.d.ts +9 -0
  19. package/dist/harness/context.d.ts.map +1 -0
  20. package/dist/harness/context.js +13 -0
  21. package/dist/harness/context.js.map +1 -0
  22. package/dist/harness/env/nodejs.d.ts +25 -28
  23. package/dist/harness/env/nodejs.d.ts.map +1 -1
  24. package/dist/harness/env/nodejs.js +368 -125
  25. package/dist/harness/env/nodejs.js.map +1 -1
  26. package/dist/harness/events.d.ts +20 -38
  27. package/dist/harness/events.d.ts.map +1 -1
  28. package/dist/harness/events.js +233 -55
  29. package/dist/harness/events.js.map +1 -1
  30. package/dist/harness/execution/assistant.d.ts +42 -0
  31. package/dist/harness/execution/assistant.d.ts.map +1 -0
  32. package/dist/harness/execution/assistant.js +82 -0
  33. package/dist/harness/execution/assistant.js.map +1 -0
  34. package/dist/harness/execution/effect-gate.d.ts +22 -0
  35. package/dist/harness/execution/effect-gate.d.ts.map +1 -0
  36. package/dist/harness/execution/effect-gate.js +48 -0
  37. package/dist/harness/execution/effect-gate.js.map +1 -0
  38. package/dist/harness/execution/tools.d.ts +67 -0
  39. package/dist/harness/execution/tools.d.ts.map +1 -0
  40. package/dist/harness/execution/tools.js +121 -0
  41. package/dist/harness/execution/tools.js.map +1 -0
  42. package/dist/harness/hooks.d.ts +38 -0
  43. package/dist/harness/hooks.d.ts.map +1 -0
  44. package/dist/harness/hooks.js +404 -0
  45. package/dist/harness/hooks.js.map +1 -0
  46. package/dist/harness/messages.d.ts +2 -2
  47. package/dist/harness/messages.d.ts.map +1 -1
  48. package/dist/harness/messages.js.map +1 -1
  49. package/dist/harness/prompt-templates.d.ts +3 -2
  50. package/dist/harness/prompt-templates.d.ts.map +1 -1
  51. package/dist/harness/prompt-templates.js +17 -17
  52. package/dist/harness/prompt-templates.js.map +1 -1
  53. package/dist/harness/result.d.ts +93 -0
  54. package/dist/harness/result.d.ts.map +1 -1
  55. package/dist/harness/result.js +39 -0
  56. package/dist/harness/result.js.map +1 -1
  57. package/dist/harness/runtime/drive/boundary.d.ts +28 -0
  58. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
  59. package/dist/harness/runtime/drive/boundary.js +173 -0
  60. package/dist/harness/runtime/drive/boundary.js.map +1 -0
  61. package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
  62. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
  63. package/dist/harness/runtime/drive/checkpoint.js +133 -0
  64. package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
  65. package/dist/harness/runtime/drive/deferred.d.ts +15 -0
  66. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
  67. package/dist/harness/runtime/drive/deferred.js +179 -0
  68. package/dist/harness/runtime/drive/deferred.js.map +1 -0
  69. package/dist/harness/runtime/drive/generation.d.ts +8 -0
  70. package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
  71. package/dist/harness/runtime/drive/generation.js +205 -0
  72. package/dist/harness/runtime/drive/generation.js.map +1 -0
  73. package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
  74. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
  75. package/dist/harness/runtime/drive/reconcile.js +140 -0
  76. package/dist/harness/runtime/drive/reconcile.js.map +1 -0
  77. package/dist/harness/runtime/drive/recovery.d.ts +8 -0
  78. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
  79. package/dist/harness/runtime/drive/recovery.js +85 -0
  80. package/dist/harness/runtime/drive/recovery.js.map +1 -0
  81. package/dist/harness/runtime/drive/response.d.ts +23 -0
  82. package/dist/harness/runtime/drive/response.d.ts.map +1 -0
  83. package/dist/harness/runtime/drive/response.js +394 -0
  84. package/dist/harness/runtime/drive/response.js.map +1 -0
  85. package/dist/harness/runtime/drive/retry.d.ts +4 -0
  86. package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
  87. package/dist/harness/runtime/drive/retry.js +34 -0
  88. package/dist/harness/runtime/drive/retry.js.map +1 -0
  89. package/dist/harness/runtime/drive/structural.d.ts +32 -0
  90. package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
  91. package/dist/harness/runtime/drive/structural.js +929 -0
  92. package/dist/harness/runtime/drive/structural.js.map +1 -0
  93. package/dist/harness/runtime/drive/terminal.d.ts +7 -0
  94. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
  95. package/dist/harness/runtime/drive/terminal.js +49 -0
  96. package/dist/harness/runtime/drive/terminal.js.map +1 -0
  97. package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
  98. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
  99. package/dist/harness/runtime/drive/tool-placement.js +244 -0
  100. package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
  101. package/dist/harness/runtime/drive/tools.d.ts +6 -0
  102. package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
  103. package/dist/harness/runtime/drive/tools.js +449 -0
  104. package/dist/harness/runtime/drive/tools.js.map +1 -0
  105. package/dist/harness/runtime/drive.d.ts +6 -0
  106. package/dist/harness/runtime/drive.d.ts.map +1 -0
  107. package/dist/harness/runtime/drive.js +93 -0
  108. package/dist/harness/runtime/drive.js.map +1 -0
  109. package/dist/harness/runtime/harness.d.ts +59 -0
  110. package/dist/harness/runtime/harness.d.ts.map +1 -0
  111. package/dist/harness/runtime/harness.js +302 -0
  112. package/dist/harness/runtime/harness.js.map +1 -0
  113. package/dist/harness/runtime/index.d.ts +2 -0
  114. package/dist/harness/runtime/index.d.ts.map +1 -0
  115. package/dist/harness/runtime/index.js +2 -0
  116. package/dist/harness/runtime/index.js.map +1 -0
  117. package/dist/harness/runtime/lane.d.ts +118 -0
  118. package/dist/harness/runtime/lane.d.ts.map +1 -0
  119. package/dist/harness/runtime/lane.js +1559 -0
  120. package/dist/harness/runtime/lane.js.map +1 -0
  121. package/dist/harness/runtime/progress.d.ts +15 -0
  122. package/dist/harness/runtime/progress.d.ts.map +1 -0
  123. package/dist/harness/runtime/progress.js +66 -0
  124. package/dist/harness/runtime/progress.js.map +1 -0
  125. package/dist/harness/runtime/reducer.d.ts +5 -0
  126. package/dist/harness/runtime/reducer.d.ts.map +1 -0
  127. package/dist/harness/runtime/reducer.js +240 -0
  128. package/dist/harness/runtime/reducer.js.map +1 -0
  129. package/dist/harness/runtime/restore.d.ts +24 -0
  130. package/dist/harness/runtime/restore.d.ts.map +1 -0
  131. package/dist/harness/runtime/restore.js +117 -0
  132. package/dist/harness/runtime/restore.js.map +1 -0
  133. package/dist/harness/runtime/transcript.d.ts +21 -0
  134. package/dist/harness/runtime/transcript.d.ts.map +1 -0
  135. package/dist/harness/runtime/transcript.js +72 -0
  136. package/dist/harness/runtime/transcript.js.map +1 -0
  137. package/dist/harness/runtime/types.d.ts +105 -0
  138. package/dist/harness/runtime/types.d.ts.map +1 -0
  139. package/dist/harness/runtime/types.js +50 -0
  140. package/dist/harness/runtime/types.js.map +1 -0
  141. package/dist/harness/session/commit.d.ts +53 -0
  142. package/dist/harness/session/commit.d.ts.map +1 -0
  143. package/dist/harness/session/commit.js +57 -0
  144. package/dist/harness/session/commit.js.map +1 -0
  145. package/dist/harness/session/context.d.ts +6 -19
  146. package/dist/harness/session/context.d.ts.map +1 -1
  147. package/dist/harness/session/context.js +31 -53
  148. package/dist/harness/session/context.js.map +1 -1
  149. package/dist/harness/session/fork-policy.d.ts +21 -0
  150. package/dist/harness/session/fork-policy.d.ts.map +1 -0
  151. package/dist/harness/session/fork-policy.js +55 -0
  152. package/dist/harness/session/fork-policy.js.map +1 -0
  153. package/dist/harness/session/fork.d.ts +16 -0
  154. package/dist/harness/session/fork.d.ts.map +1 -0
  155. package/dist/harness/session/fork.js +79 -0
  156. package/dist/harness/session/fork.js.map +1 -0
  157. package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
  158. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
  159. package/dist/harness/session/in-memory-storage-state.js +269 -0
  160. package/dist/harness/session/in-memory-storage-state.js.map +1 -0
  161. package/dist/harness/session/index.d.ts +9 -5
  162. package/dist/harness/session/index.d.ts.map +1 -1
  163. package/dist/harness/session/index.js +7 -4
  164. package/dist/harness/session/index.js.map +1 -1
  165. package/dist/harness/session/jsonl/codec.d.ts +19 -8
  166. package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
  167. package/dist/harness/session/jsonl/codec.js +34 -219
  168. package/dist/harness/session/jsonl/codec.js.map +1 -1
  169. package/dist/harness/session/jsonl/fork.d.ts +38 -0
  170. package/dist/harness/session/jsonl/fork.d.ts.map +1 -0
  171. package/dist/harness/session/jsonl/fork.js +266 -0
  172. package/dist/harness/session/jsonl/fork.js.map +1 -0
  173. package/dist/harness/session/jsonl/index.d.ts +4 -0
  174. package/dist/harness/session/jsonl/index.d.ts.map +1 -0
  175. package/dist/harness/session/jsonl/index.js +4 -0
  176. package/dist/harness/session/jsonl/index.js.map +1 -0
  177. package/dist/harness/session/jsonl/io.d.ts +14 -0
  178. package/dist/harness/session/jsonl/io.d.ts.map +1 -0
  179. package/dist/harness/session/jsonl/io.js +86 -0
  180. package/dist/harness/session/jsonl/io.js.map +1 -0
  181. package/dist/harness/session/jsonl/legacy-v3.d.ts +44 -0
  182. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
  183. package/dist/harness/session/jsonl/legacy-v3.js +454 -0
  184. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
  185. package/dist/harness/session/jsonl/repo.d.ts +27 -24
  186. package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  187. package/dist/harness/session/jsonl/repo.js +276 -151
  188. package/dist/harness/session/jsonl/repo.js.map +1 -1
  189. package/dist/harness/session/jsonl/storage.d.ts +39 -41
  190. package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  191. package/dist/harness/session/jsonl/storage.js +175 -196
  192. package/dist/harness/session/jsonl/storage.js.map +1 -1
  193. package/dist/harness/session/jsonl/types.d.ts +23 -22
  194. package/dist/harness/session/jsonl/types.d.ts.map +1 -1
  195. package/dist/harness/session/jsonl/types.js +2 -1
  196. package/dist/harness/session/jsonl/types.js.map +1 -1
  197. package/dist/harness/session/memory.d.ts +44 -40
  198. package/dist/harness/session/memory.d.ts.map +1 -1
  199. package/dist/harness/session/memory.js +333 -115
  200. package/dist/harness/session/memory.js.map +1 -1
  201. package/dist/harness/session/mutation-line.d.ts +8 -0
  202. package/dist/harness/session/mutation-line.d.ts.map +1 -0
  203. package/dist/harness/session/mutation-line.js +22 -0
  204. package/dist/harness/session/mutation-line.js.map +1 -0
  205. package/dist/harness/session/session.d.ts +78 -51
  206. package/dist/harness/session/session.d.ts.map +1 -1
  207. package/dist/harness/session/session.js +327 -207
  208. package/dist/harness/session/session.js.map +1 -1
  209. package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
  210. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
  211. package/dist/harness/session/testing/benchmark/datasets.js +24 -0
  212. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
  213. package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
  214. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
  215. package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
  216. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
  217. package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
  218. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
  219. package/dist/harness/session/testing/benchmark/storage.js +114 -0
  220. package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
  221. package/dist/harness/session/testing/conformance/session-repo.d.ts +23 -0
  222. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
  223. package/dist/harness/session/testing/conformance/session-repo.js +809 -0
  224. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
  225. package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
  226. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
  227. package/dist/harness/session/testing/conformance/storage.js +600 -0
  228. package/dist/harness/session/testing/conformance/storage.js.map +1 -0
  229. package/dist/harness/session/testing/gating-storage.d.ts +26 -0
  230. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
  231. package/dist/harness/session/testing/gating-storage.js +103 -0
  232. package/dist/harness/session/testing/gating-storage.js.map +1 -0
  233. package/dist/harness/session/testing/index.d.ts +9 -2
  234. package/dist/harness/session/testing/index.d.ts.map +1 -1
  235. package/dist/harness/session/testing/index.js +8 -1
  236. package/dist/harness/session/testing/index.js.map +1 -1
  237. package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
  238. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
  239. package/dist/harness/session/testing/instrumented-storage.js +19 -0
  240. package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
  241. package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
  242. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
  243. package/dist/harness/session/testing/storage-decorator.js +40 -0
  244. package/dist/harness/session/testing/storage-decorator.js.map +1 -0
  245. package/dist/harness/session/testing/types.d.ts +5 -7
  246. package/dist/harness/session/testing/types.d.ts.map +1 -1
  247. package/dist/harness/session/testing/types.js.map +1 -1
  248. package/dist/harness/session/types.d.ts +425 -265
  249. package/dist/harness/session/types.d.ts.map +1 -1
  250. package/dist/harness/session/types.js +7 -7
  251. package/dist/harness/session/types.js.map +1 -1
  252. package/dist/harness/session/values.d.ts +95 -0
  253. package/dist/harness/session/values.d.ts.map +1 -0
  254. package/dist/harness/session/values.js +81 -0
  255. package/dist/harness/session/values.js.map +1 -0
  256. package/dist/harness/skills.d.ts +3 -2
  257. package/dist/harness/skills.d.ts.map +1 -1
  258. package/dist/harness/skills.js +29 -26
  259. package/dist/harness/skills.js.map +1 -1
  260. package/dist/harness/telemetry.d.ts +64 -43
  261. package/dist/harness/telemetry.d.ts.map +1 -1
  262. package/dist/harness/telemetry.js +45 -26
  263. package/dist/harness/telemetry.js.map +1 -1
  264. package/dist/harness/tools/bash.d.ts +4 -4
  265. package/dist/harness/tools/bash.d.ts.map +1 -1
  266. package/dist/harness/tools/bash.js +66 -93
  267. package/dist/harness/tools/bash.js.map +1 -1
  268. package/dist/harness/tools/edit.d.ts.map +1 -1
  269. package/dist/harness/tools/edit.js +17 -13
  270. package/dist/harness/tools/edit.js.map +1 -1
  271. package/dist/harness/tools/file-mutation-queue.d.ts +2 -1
  272. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  273. package/dist/harness/tools/file-mutation-queue.js +5 -5
  274. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  275. package/dist/harness/tools/path-utils.d.ts +3 -2
  276. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  277. package/dist/harness/tools/path-utils.js +5 -5
  278. package/dist/harness/tools/path-utils.js.map +1 -1
  279. package/dist/harness/tools/read.d.ts +2 -1
  280. package/dist/harness/tools/read.d.ts.map +1 -1
  281. package/dist/harness/tools/read.js +4 -6
  282. package/dist/harness/tools/read.js.map +1 -1
  283. package/dist/harness/tools/write.d.ts.map +1 -1
  284. package/dist/harness/tools/write.js +12 -8
  285. package/dist/harness/tools/write.js.map +1 -1
  286. package/dist/harness/types.d.ts +128 -45
  287. package/dist/harness/types.d.ts.map +1 -1
  288. package/dist/harness/types.js.map +1 -1
  289. package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
  290. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
  291. package/dist/harness/utils/adaptive-publisher.js +79 -0
  292. package/dist/harness/utils/adaptive-publisher.js.map +1 -0
  293. package/dist/harness/utils/output-capture.d.ts +31 -0
  294. package/dist/harness/utils/output-capture.d.ts.map +1 -0
  295. package/dist/harness/utils/output-capture.js +217 -0
  296. package/dist/harness/utils/output-capture.js.map +1 -0
  297. package/dist/harness/utils/shell-output.d.ts +19 -5
  298. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  299. package/dist/harness/utils/shell-output.js +65 -192
  300. package/dist/harness/utils/shell-output.js.map +1 -1
  301. package/dist/harness/utils/truncate.d.ts +1 -0
  302. package/dist/harness/utils/truncate.d.ts.map +1 -1
  303. package/dist/harness/utils/truncate.js +1 -1
  304. package/dist/harness/utils/truncate.js.map +1 -1
  305. package/dist/harness/utils/usage.d.ts +4 -0
  306. package/dist/harness/utils/usage.d.ts.map +1 -0
  307. package/dist/harness/utils/usage.js +33 -0
  308. package/dist/harness/utils/usage.js.map +1 -0
  309. package/dist/index.d.ts +4 -1
  310. package/dist/index.d.ts.map +1 -1
  311. package/dist/index.js +3 -6
  312. package/dist/index.js.map +1 -1
  313. package/dist/search/index.d.ts +24 -16
  314. package/dist/search/index.d.ts.map +1 -1
  315. package/dist/search/index.js +1 -1
  316. package/dist/search/index.js.map +1 -1
  317. package/dist/types.d.ts +2 -0
  318. package/dist/types.d.ts.map +1 -1
  319. package/dist/types.js.map +1 -1
  320. package/package.json +27 -6
  321. package/dist/harness/reducer.d.ts +0 -100
  322. package/dist/harness/reducer.d.ts.map +0 -1
  323. package/dist/harness/reducer.js +0 -420
  324. package/dist/harness/reducer.js.map +0 -1
  325. package/dist/harness/session/jsonl/errors.d.ts +0 -9
  326. package/dist/harness/session/jsonl/errors.d.ts.map +0 -1
  327. package/dist/harness/session/jsonl/errors.js +0 -18
  328. package/dist/harness/session/jsonl/errors.js.map +0 -1
  329. package/dist/harness/session/jsonl.d.ts +0 -3
  330. package/dist/harness/session/jsonl.d.ts.map +0 -1
  331. package/dist/harness/session/jsonl.js +0 -2
  332. package/dist/harness/session/jsonl.js.map +0 -1
  333. package/dist/harness/session/state.d.ts +0 -65
  334. package/dist/harness/session/state.d.ts.map +0 -1
  335. package/dist/harness/session/state.js +0 -320
  336. package/dist/harness/session/state.js.map +0 -1
  337. package/dist/harness/session/testing/conformance.d.ts +0 -4
  338. package/dist/harness/session/testing/conformance.d.ts.map +0 -1
  339. package/dist/harness/session/testing/conformance.js +0 -762
  340. package/dist/harness/session/testing/conformance.js.map +0 -1
  341. package/dist/search/scanning.d.ts +0 -29
  342. package/dist/search/scanning.d.ts.map +0 -1
  343. package/dist/search/scanning.js +0 -103
  344. package/dist/search/scanning.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork.js","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/fork.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"../../context.ts\";\nimport type { FileSystem, TextLineReader } from \"../../types.ts\";\nimport type {\n\tCommittedEntryWrite,\n\tCommittedListAppendWrite,\n\tCommittedValueSetWrite,\n\tCommittedWrite,\n} from \"../commit.ts\";\nimport { type ForkCurrentStatePlan, projectForkCurrentStateWrite, selectBranchFork } from \"../fork-policy.ts\";\nimport type { ForkOptions } from \"../types.ts\";\nimport { fileValue, parseJsonlTransaction, publishJsonl, readJsonlHeader } from \"./io.ts\";\nimport type { LegacyV3Source } from \"./legacy-v3.ts\";\nimport { JSONL_STORAGE_VERSION, type JsonlStorageHeader } from \"./types.ts\";\n\ninterface JsonlForkSourceMetadata {\n\tid: string;\n\tcwd: string;\n\tpath: string;\n}\n\nfunction physicalKey(namespace: string, key: string): string {\n\treturn `${namespace}\\u0000${key}`;\n}\n\nasync function readJsonlForkHeader(\n\treader: TextLineReader,\n\tsource: JsonlForkSourceMetadata,\n\tcontext: Context,\n): Promise<JsonlStorageHeader> {\n\tconst parsed = await readJsonlHeader(reader, source.path, context);\n\tif (parsed.format !== \"v4\") {\n\t\tthrow new Error(`Invalid JSONL storage ${source.path}: expected format 4 header`);\n\t}\n\tconst header = parsed.header;\n\tif (header.id !== source.id || header.cwd !== source.cwd) {\n\t\tthrow new Error(`Session identity does not match header: ${source.id}`);\n\t}\n\tif (header.storageVersion !== JSONL_STORAGE_VERSION) {\n\t\tthrow new Error(`Session ${source.id} uses unsupported storage version ${header.storageVersion}`);\n\t}\n\treturn header;\n}\n\nfunction reachesForkBoundary(writes: readonly CommittedWrite[], stopBeforeSeq: number | undefined): boolean {\n\tif (stopBeforeSeq === undefined || writes.length === 0) return false;\n\tconst first = writes[0]!;\n\tconst last = writes.at(-1)!;\n\tif (first.seq >= stopBeforeSeq) return true;\n\tif (last.seq >= stopBeforeSeq) {\n\t\tthrow new Error(`JSONL transaction crosses fork sequence boundary ${stopBeforeSeq}`);\n\t}\n\treturn false;\n}\n\n/** Read complete transactions after the header, never splitting a transaction at the sequence boundary. */\nasync function* readJsonlForkTransactions(\n\treader: TextLineReader,\n\tpath: string,\n\tstopBeforeSeq: number | undefined,\n\tcontext: Context,\n): AsyncIterable<CommittedWrite[]> {\n\twhile (true) {\n\t\tconst line = fileValue(await reader.readLine(context), `Failed to read JSONL fork source ${path}`);\n\t\tif (line === undefined || !line.terminated) break;\n\t\tconst writes = parseJsonlTransaction(line.text);\n\t\tif (reachesForkBoundary(writes, stopBeforeSeq)) break;\n\t\tyield writes;\n\t}\n}\n\nclass JsonlForkIndex {\n\tprivate readonly currentScalarSeqs = new Map<string, number>();\n\tprivate readonly branchTips = new Map<string, string | null>();\n\tprivate readonly firstSurvivingListSeqs = new Map<string, number>();\n\tprivate readonly entryParents = new Map<string, string | null>();\n\tprivate readonly copiedEntryIds = new Set<string>();\n\tprivate readonly laneConfigs = new Set<string>();\n\tprivate readonly laneStates = new Set<string>();\n\n\tapplyEntry(id: string, parentId: string | null): void {\n\t\tthis.entryParents.set(id, parentId);\n\t}\n\n\tapplyWrites(writes: readonly CommittedWrite[]): void {\n\t\tfor (const write of writes) {\n\t\t\tswitch (write.kind) {\n\t\t\t\tcase \"entry\":\n\t\t\t\t\tthis.applyEntry(write.id, write.parentId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"value\": {\n\t\t\t\t\tconst key = physicalKey(write.namespace, write.key);\n\t\t\t\t\tif (write.op === \"delete\") {\n\t\t\t\t\t\tthis.currentScalarSeqs.delete(key);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.currentScalarSeqs.set(key, write.seq);\n\t\t\t\t\t}\n\t\t\t\t\tthis.applyLaneValue(write);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tconst key = physicalKey(write.namespace, write.key);\n\t\t\t\t\tif (write.op === \"delete\") this.firstSurvivingListSeqs.delete(key);\n\t\t\t\t\telse if (!this.firstSurvivingListSeqs.has(key)) this.firstSurvivingListSeqs.set(key, write.seq);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"usage\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate applyLaneValue(write: Extract<CommittedWrite, { kind: \"value\" }>): void {\n\t\tconst present = write.op === \"set\";\n\t\tswitch (write.namespace) {\n\t\t\tcase \"pi.branch.tip\":\n\t\t\t\tif (present) this.branchTips.set(write.key, write.value as string | null);\n\t\t\t\telse this.branchTips.delete(write.key);\n\t\t\t\tbreak;\n\t\t\tcase \"pi.lane.config\":\n\t\t\t\tif (present) this.laneConfigs.add(write.key);\n\t\t\t\telse this.laneConfigs.delete(write.key);\n\t\t\t\tbreak;\n\t\t\tcase \"pi.lane.state\":\n\t\t\t\tif (present) this.laneStates.add(write.key);\n\t\t\t\telse this.laneStates.delete(write.key);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tgetBranchTip(branch: string): string | null | undefined {\n\t\treturn this.branchTips.get(branch);\n\t}\n\n\thasCompleteLane(branch: string): boolean {\n\t\treturn this.laneConfigs.has(branch) && this.laneStates.has(branch);\n\t}\n\n\tgetCurrentScalarSeq(namespace: string, key: string): number | undefined {\n\t\treturn this.currentScalarSeqs.get(physicalKey(namespace, key));\n\t}\n\n\tisSurvivingListElement(namespace: string, key: string, seq: number): boolean {\n\t\tconst firstSeq = this.firstSurvivingListSeqs.get(physicalKey(namespace, key));\n\t\treturn firstSeq !== undefined && seq >= firstSeq;\n\t}\n\n\tgetParent(entryId: string): string | null | undefined {\n\t\treturn this.entryParents.get(entryId);\n\t}\n\n\tselectEntry(entryId: string): void {\n\t\tthis.copiedEntryIds.add(entryId);\n\t}\n\n\tisEntrySelected(entryId: string): boolean {\n\t\treturn this.copiedEntryIds.has(entryId);\n\t}\n}\n\n/**\n * Validate the source lanes and return the fork plan.\n *\n * Branch scope updates JsonlForkIndex's selected entries via index.selectEntry(): it selects the\n * destination tip and its ancestors after validating entryId and applying \"at\"/\"before\". The plan\n * records the branch name and destination tip; the copy pass uses the index to filter entries and labels.\n *\n * Tree scope leaves the index's selected entries unchanged because the copy pass keeps every entry.\n * Both formats use the same indexed metadata; this function performs no file I/O.\n */\nfunction selectJsonlFork(index: JsonlForkIndex, options: ForkOptions): ForkCurrentStatePlan {\n\tif (options.scope === \"tree\") return { scope: \"tree\" };\n\tconst plan = selectBranchFork(options, {\n\t\ttip: index.getBranchTip(options.branch),\n\t\tgetParent: (entryId) => index.getParent(entryId),\n\t\tselectEntry: (entryId) => index.selectEntry(entryId),\n\t});\n\tif (!index.hasCompleteLane(options.branch)) {\n\t\tthrow new Error(`Source branch ${JSON.stringify(options.branch)} is not a configured AgentLane`);\n\t}\n\treturn plan;\n}\n\ntype JsonlForkWrite = CommittedEntryWrite | CommittedValueSetWrite | CommittedListAppendWrite;\n\nfunction projectJsonlForkWrite(\n\twrite: CommittedWrite,\n\tindex: JsonlForkIndex,\n\tplan: ForkCurrentStatePlan,\n\tisEntryCopied: (entryId: string) => boolean,\n): JsonlForkWrite | undefined {\n\tswitch (write.kind) {\n\t\tcase \"entry\":\n\t\t\treturn isEntryCopied(write.id) ? write : undefined;\n\t\tcase \"value\":\n\t\t\tif (write.op !== \"set\") return undefined;\n\t\t\tif (index.getCurrentScalarSeq(write.namespace, write.key) !== write.seq) return undefined;\n\t\t\treturn projectForkCurrentStateWrite(write, plan, isEntryCopied);\n\t\tcase \"list\":\n\t\t\tif (write.op !== \"append\") return undefined;\n\t\t\tif (!index.isSurvivingListElement(write.namespace, write.key, write.seq)) return undefined;\n\t\t\treturn projectForkCurrentStateWrite(write, plan, isEntryCopied);\n\t\tcase \"usage\":\n\t\t\treturn undefined;\n\t}\n}\n\n/** Prepared fork input: format-4 file metadata or an already-normalized legacy source. */\nexport type JsonlForkInput =\n\t| { kind: \"open\"; metadata: JsonlForkSourceMetadata; nextSeq: number }\n\t| { kind: \"closed\"; metadata: JsonlForkSourceMetadata }\n\t| { kind: \"legacy-v3\"; normalized: LegacyV3Source };\n\n/**\n * Build the index used to select branch ancestry and identify current scalar/list writes.\n * Retains entry parent links, current-row sequences, and lane inventory, not entry payloads.\n * Returns the index and the source's nextSeq high-water mark; no destination writes occur here.\n *\n * V3: LegacyV3Source already scanned the file and assigned normalized IDs/sequences. Copy its\n * in-memory entry structures and derived values without reopening the file or calling writes(),\n * which would unnecessarily parse payloads and reconstruct compaction tails before fork selection.\n *\n * V4: Open the source file and fold complete transactions into the index. For an open source,\n * stop at the captured commit-queue sequence boundary. For a closed source, scan to EOF or a torn\n * final line and derive nextSeq from the header and highest complete write sequence.\n * The later copy pass reopens the source file in both formats and emits only selected writes.\n */\nasync function indexForkInput(\n\tinput: JsonlForkInput,\n\tfileSystem: FileSystem,\n\tcontext: Context,\n): Promise<{ index: JsonlForkIndex; nextSeq: number }> {\n\tconst index = new JsonlForkIndex();\n\tif (input.kind === \"legacy-v3\") {\n\t\tfor (const entry of input.normalized.entryStructures()) index.applyEntry(entry.id, entry.parentId);\n\t\tindex.applyWrites(input.normalized.values);\n\t\treturn { index, nextSeq: input.normalized.nextSeq };\n\t}\n\tconst reader = fileValue(\n\t\tawait fileSystem.openTextLineReader(input.metadata.path, context),\n\t\t`Failed to open JSONL fork source ${input.metadata.path}`,\n\t);\n\ttry {\n\t\tconst header = await readJsonlForkHeader(reader, input.metadata, context);\n\t\tconst stopBeforeSeq = input.kind === \"open\" ? input.nextSeq : undefined;\n\t\tlet highestCompleteSeq = 0;\n\t\tfor await (const writes of readJsonlForkTransactions(reader, input.metadata.path, stopBeforeSeq, context)) {\n\t\t\tindex.applyWrites(writes);\n\t\t\tif (writes.length !== 0) highestCompleteSeq = writes.at(-1)!.seq;\n\t\t}\n\t\treturn {\n\t\t\tindex,\n\t\t\tnextSeq: input.kind === \"open\" ? input.nextSeq : Math.max(header.nextSeq ?? 1, highestCompleteSeq + 1),\n\t\t};\n\t} finally {\n\t\tawait reader.close(context);\n\t}\n}\n\n/** Yield source writes; the caller owns final projection and filtering. */\nasync function* streamForkWrites(\n\tinput: JsonlForkInput,\n\tfileSystem: FileSystem,\n\tstopBeforeSeq: number,\n\tisEntryCopied: (entryId: string) => boolean,\n\tcontext: Context,\n): AsyncIterable<CommittedWrite> {\n\tif (input.kind === \"legacy-v3\") {\n\t\t// V3 filters early to avoid rereading messages and reconstructing unselected compaction tails.\n\t\t// V4 already stores complete payloads, so it streams all captured writes below.\n\t\t// Both formats still pass through projectJsonlForkWrite() for final filtering and transformation.\n\t\tyield* input.normalized.writes(context, isEntryCopied);\n\t\treturn;\n\t}\n\tconst reader = fileValue(\n\t\tawait fileSystem.openTextLineReader(input.metadata.path, context),\n\t\t`Failed to open JSONL fork source ${input.metadata.path}`,\n\t);\n\ttry {\n\t\tawait readJsonlForkHeader(reader, input.metadata, context);\n\t\tfor await (const writes of readJsonlForkTransactions(reader, input.metadata.path, stopBeforeSeq, context)) {\n\t\t\tyield* writes;\n\t\t}\n\t} finally {\n\t\tawait reader.close(context);\n\t}\n}\n\n/**\n * Index the source, validate the requested fork, and stream selected entries and current state\n * into an atomically published format-4 destination without modifying the source.\n * Preserve copied sequences and the source's nextSeq while excluding usage and open-operation state.\n * Source files must not be replaced or edited between passes; later append-only writes are excluded\n * by the captured sequence boundary or legacy record count. Does not open the destination Session.\n */\nexport async function runJsonlFork(\n\toptions: {\n\t\tinput: JsonlForkInput;\n\t\tfileSystem: FileSystem;\n\t\tdestinationPath: string;\n\t\tdestinationHeader: Omit<JsonlStorageHeader, \"nextSeq\">;\n\t\tfork: ForkOptions;\n\t},\n\tcontext: Context,\n): Promise<void> {\n\tconst { index, nextSeq } = await indexForkInput(options.input, options.fileSystem, context);\n\tlet fork = options.fork;\n\tif (options.input.kind === \"legacy-v3\" && fork.scope === \"branch\" && fork.entryId !== undefined) {\n\t\tfork = { ...fork, entryId: options.input.normalized.translateForkEntryId(fork.entryId) };\n\t}\n\tconst plan = selectJsonlFork(index, fork);\n\tconst isEntryCopied = (entryId: string): boolean => {\n\t\tif (plan.scope === \"tree\") return true;\n\t\treturn index.isEntrySelected(entryId);\n\t};\n\tawait publishJsonl(\n\t\toptions.fileSystem,\n\t\toptions.destinationPath,\n\t\t{ ...options.destinationHeader, nextSeq },\n\t\tcontext,\n\t\tasync (append) => {\n\t\t\tconst sourceWrites = streamForkWrites(options.input, options.fileSystem, nextSeq, isEntryCopied, context);\n\t\t\tfor await (const write of sourceWrites) {\n\t\t\t\tconst projected = projectJsonlForkWrite(write, index, plan, isEntryCopied);\n\t\t\t\tif (projected !== undefined) await append([projected]);\n\t\t\t}\n\t\t},\n\t);\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export * from "./repo.ts";
2
+ export * from "./storage.ts";
3
+ export * from "./types.ts";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./repo.js";
2
+ export * from "./storage.js";
3
+ export * from "./types.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC","sourcesContent":["export * from \"./repo.ts\";\nexport * from \"./storage.ts\";\nexport * from \"./types.ts\";\n"]}
@@ -0,0 +1,14 @@
1
+ import type { Context } from "../../context.ts";
2
+ import type { FileError, FileSystem, Result, TextLineReader } from "../../types.ts";
3
+ import type { CommittedWrite } from "../commit.ts";
4
+ import { type JsonlParsedSessionHeader } from "./codec.ts";
5
+ import type { JsonlStorageHeader } from "./types.ts";
6
+ export declare function fileValue<T>(result: Result<T, FileError>, action: string): T;
7
+ export declare function readJsonlHeader(reader: TextLineReader, path: string, context: Context): Promise<JsonlParsedSessionHeader>;
8
+ export declare function parseJsonlTransaction(line: string): CommittedWrite[];
9
+ export declare function serializeJsonlTransaction(writes: readonly CommittedWrite[]): string;
10
+ /** Publish only after the callback succeeds; it must await each append before returning. */
11
+ export declare function publishFileAtomically(fileSystem: FileSystem, destinationPath: string, context: Context, writeContent: (append: (content: string) => Promise<void>) => Promise<void>): Promise<void>;
12
+ /** Stream a header and complete transactions through the shared atomic publisher. */
13
+ export declare function publishJsonl(fileSystem: FileSystem, destinationPath: string, header: JsonlStorageHeader, context: Context, writeTransactions: (append: (writes: readonly CommittedWrite[]) => Promise<void>) => Promise<void>): Promise<void>;
14
+ //# sourceMappingURL=io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/io.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,KAAK,EAOX,cAAc,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,wBAAwB,EAA2B,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAG5E;AAED,wBAAsB,eAAe,CACpC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,wBAAwB,CAAC,CAUnC;AAgCD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAQpE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAEnF;AAED,4FAA4F;AAC5F,wBAAsB,qBAAqB,CAC1C,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GACzE,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,qFAAqF;AACrF,wBAAsB,YAAY,CACjC,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,OAAO,EAChB,iBAAiB,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAChG,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -0,0 +1,86 @@
1
+ import { parseJsonlSessionHeader } from "./codec.js";
2
+ export function fileValue(result, action) {
3
+ if (!result.ok)
4
+ throw new Error(`${action}: ${result.error.message}`, { cause: result.error });
5
+ return result.value;
6
+ }
7
+ export async function readJsonlHeader(reader, path, context) {
8
+ const line = fileValue(await reader.readLine(context), `Failed to read JSONL storage ${path}`);
9
+ if (line === undefined || !line.terminated || line.text === "") {
10
+ throw new Error(`Invalid JSONL storage ${path}: missing header`);
11
+ }
12
+ const parsed = parseJsonlSessionHeader(line.text);
13
+ if (!parsed.ok) {
14
+ throw new Error(`Invalid JSONL storage ${path}: invalid header`, { cause: parsed.error });
15
+ }
16
+ return parsed.value;
17
+ }
18
+ function isRecord(value) {
19
+ return typeof value === "object" && value !== null && !Array.isArray(value);
20
+ }
21
+ function requireSafeInteger(value, field, minimum) {
22
+ if (!Number.isSafeInteger(value) || value < minimum)
23
+ throw new Error(`Invalid JSONL ${field}`);
24
+ }
25
+ function parseCommittedWrite(value) {
26
+ if (!isRecord(value))
27
+ throw new Error("Invalid JSONL transaction write");
28
+ requireSafeInteger(value.seq, "write seq", 1);
29
+ switch (value.kind) {
30
+ case "entry":
31
+ requireSafeInteger(value.timestamp, "entry timestamp", 0);
32
+ return value;
33
+ case "usage":
34
+ return value;
35
+ case "value":
36
+ if (value.op === "set")
37
+ return value;
38
+ if (value.op === "delete")
39
+ return value;
40
+ throw new Error(`Invalid JSONL value operation: ${String(value.op)}`);
41
+ case "list":
42
+ if (value.op === "append")
43
+ return value;
44
+ if (value.op === "delete")
45
+ return value;
46
+ throw new Error(`Invalid JSONL list operation: ${String(value.op)}`);
47
+ default:
48
+ throw new Error(`Invalid JSONL write kind: ${String(value.kind)}`);
49
+ }
50
+ }
51
+ export function parseJsonlTransaction(line) {
52
+ let value;
53
+ try {
54
+ value = JSON.parse(line);
55
+ }
56
+ catch (error) {
57
+ throw new Error("Invalid JSONL transaction: not valid JSON", { cause: error });
58
+ }
59
+ return (Array.isArray(value) ? value : [value]).map(parseCommittedWrite);
60
+ }
61
+ export function serializeJsonlTransaction(writes) {
62
+ return JSON.stringify(writes.length === 1 ? writes[0] : writes);
63
+ }
64
+ /** Publish only after the callback succeeds; it must await each append before returning. */
65
+ export async function publishFileAtomically(fileSystem, destinationPath, context, writeContent) {
66
+ const tempPath = `${destinationPath}.tmp`;
67
+ try {
68
+ fileValue(await fileSystem.writeFile(tempPath, "", context), `Failed to stage JSONL storage ${destinationPath}`);
69
+ await writeContent(async (content) => {
70
+ fileValue(await fileSystem.appendFile(tempPath, content, context), `Failed to append JSONL storage ${destinationPath}`);
71
+ });
72
+ fileValue(await fileSystem.renameFile(tempPath, destinationPath, context), `Failed to publish JSONL storage ${destinationPath}`);
73
+ }
74
+ catch (error) {
75
+ await fileSystem.remove(tempPath, { force: true }, context);
76
+ throw error;
77
+ }
78
+ }
79
+ /** Stream a header and complete transactions through the shared atomic publisher. */
80
+ export async function publishJsonl(fileSystem, destinationPath, header, context, writeTransactions) {
81
+ await publishFileAtomically(fileSystem, destinationPath, context, async (append) => {
82
+ await append(`${JSON.stringify(header)}\n`);
83
+ await writeTransactions((writes) => append(`${serializeJsonlTransaction(writes)}\n`));
84
+ });
85
+ }
86
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/io.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"../../context.ts\";\nimport type { FileError, FileSystem, Result, TextLineReader } from \"../../types.ts\";\nimport type {\n\tCommittedEntryWrite,\n\tCommittedListAppendWrite,\n\tCommittedListDeleteWrite,\n\tCommittedUsageWrite,\n\tCommittedValueDeleteWrite,\n\tCommittedValueSetWrite,\n\tCommittedWrite,\n} from \"../commit.ts\";\nimport { type JsonlParsedSessionHeader, parseJsonlSessionHeader } from \"./codec.ts\";\nimport type { JsonlStorageHeader } from \"./types.ts\";\n\nexport function fileValue<T>(result: Result<T, FileError>, action: string): T {\n\tif (!result.ok) throw new Error(`${action}: ${result.error.message}`, { cause: result.error });\n\treturn result.value;\n}\n\nexport async function readJsonlHeader(\n\treader: TextLineReader,\n\tpath: string,\n\tcontext: Context,\n): Promise<JsonlParsedSessionHeader> {\n\tconst line = fileValue(await reader.readLine(context), `Failed to read JSONL storage ${path}`);\n\tif (line === undefined || !line.terminated || line.text === \"\") {\n\t\tthrow new Error(`Invalid JSONL storage ${path}: missing header`);\n\t}\n\tconst parsed = parseJsonlSessionHeader(line.text);\n\tif (!parsed.ok) {\n\t\tthrow new Error(`Invalid JSONL storage ${path}: invalid header`, { cause: parsed.error });\n\t}\n\treturn parsed.value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction requireSafeInteger(value: unknown, field: string, minimum: number): void {\n\tif (!Number.isSafeInteger(value) || (value as number) < minimum) throw new Error(`Invalid JSONL ${field}`);\n}\n\nfunction parseCommittedWrite(value: unknown): CommittedWrite {\n\tif (!isRecord(value)) throw new Error(\"Invalid JSONL transaction write\");\n\trequireSafeInteger(value.seq, \"write seq\", 1);\n\tswitch (value.kind) {\n\t\tcase \"entry\":\n\t\t\trequireSafeInteger(value.timestamp, \"entry timestamp\", 0);\n\t\t\treturn value as unknown as CommittedEntryWrite;\n\t\tcase \"usage\":\n\t\t\treturn value as unknown as CommittedUsageWrite;\n\t\tcase \"value\":\n\t\t\tif (value.op === \"set\") return value as unknown as CommittedValueSetWrite;\n\t\t\tif (value.op === \"delete\") return value as unknown as CommittedValueDeleteWrite;\n\t\t\tthrow new Error(`Invalid JSONL value operation: ${String(value.op)}`);\n\t\tcase \"list\":\n\t\t\tif (value.op === \"append\") return value as unknown as CommittedListAppendWrite;\n\t\t\tif (value.op === \"delete\") return value as unknown as CommittedListDeleteWrite;\n\t\t\tthrow new Error(`Invalid JSONL list operation: ${String(value.op)}`);\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid JSONL write kind: ${String(value.kind)}`);\n\t}\n}\n\nexport function parseJsonlTransaction(line: string): CommittedWrite[] {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(line);\n\t} catch (error) {\n\t\tthrow new Error(\"Invalid JSONL transaction: not valid JSON\", { cause: error });\n\t}\n\treturn (Array.isArray(value) ? value : [value]).map(parseCommittedWrite);\n}\n\nexport function serializeJsonlTransaction(writes: readonly CommittedWrite[]): string {\n\treturn JSON.stringify(writes.length === 1 ? writes[0] : writes);\n}\n\n/** Publish only after the callback succeeds; it must await each append before returning. */\nexport async function publishFileAtomically(\n\tfileSystem: FileSystem,\n\tdestinationPath: string,\n\tcontext: Context,\n\twriteContent: (append: (content: string) => Promise<void>) => Promise<void>,\n): Promise<void> {\n\tconst tempPath = `${destinationPath}.tmp`;\n\ttry {\n\t\tfileValue(await fileSystem.writeFile(tempPath, \"\", context), `Failed to stage JSONL storage ${destinationPath}`);\n\t\tawait writeContent(async (content) => {\n\t\t\tfileValue(\n\t\t\t\tawait fileSystem.appendFile(tempPath, content, context),\n\t\t\t\t`Failed to append JSONL storage ${destinationPath}`,\n\t\t\t);\n\t\t});\n\t\tfileValue(\n\t\t\tawait fileSystem.renameFile(tempPath, destinationPath, context),\n\t\t\t`Failed to publish JSONL storage ${destinationPath}`,\n\t\t);\n\t} catch (error) {\n\t\tawait fileSystem.remove(tempPath, { force: true }, context);\n\t\tthrow error;\n\t}\n}\n\n/** Stream a header and complete transactions through the shared atomic publisher. */\nexport async function publishJsonl(\n\tfileSystem: FileSystem,\n\tdestinationPath: string,\n\theader: JsonlStorageHeader,\n\tcontext: Context,\n\twriteTransactions: (append: (writes: readonly CommittedWrite[]) => Promise<void>) => Promise<void>,\n): Promise<void> {\n\tawait publishFileAtomically(fileSystem, destinationPath, context, async (append) => {\n\t\tawait append(`${JSON.stringify(header)}\\n`);\n\t\tawait writeTransactions((writes) => append(`${serializeJsonlTransaction(writes)}\\n`));\n\t});\n}\n"]}
@@ -0,0 +1,44 @@
1
+ import type { Usage } from "@earendil-works/pi-ai";
2
+ import type { Context } from "../../context.ts";
3
+ import type { FileSystem } from "../../types.ts";
4
+ import type { CommittedEntryWrite, CommittedValueSetWrite } from "../commit.ts";
5
+ import { type LegacyV3SessionHeader } from "./codec.ts";
6
+ import { type JsonlSessionMetadata, type JsonlStorageHeader } from "./types.ts";
7
+ type JsonlSessionMetadataBase = Omit<JsonlSessionMetadata, "path" | "modifiedAt">;
8
+ export declare function metadataFromLegacyV3Header(fileSystem: FileSystem, header: LegacyV3SessionHeader, context: Context): Promise<JsonlSessionMetadataBase>;
9
+ export declare function normalizeLegacyV3Header(fileSystem: FileSystem, header: LegacyV3SessionHeader, context: Context): Promise<JsonlStorageHeader>;
10
+ /**
11
+ * A captured legacy file exposed as repeatable logical v4 writes.
12
+ * Each pass reopens the path; callers must not replace or edit the source between passes.
13
+ * Structural indexes, label/configuration metadata, and derived current values survive between scans.
14
+ */
15
+ export declare class LegacyV3Source {
16
+ readonly header: JsonlStorageHeader;
17
+ readonly importedUsage: Usage;
18
+ readonly nextSeq: number;
19
+ readonly values: readonly CommittedValueSetWrite[];
20
+ private readonly fileSystem;
21
+ private readonly path;
22
+ private readonly entries;
23
+ private readonly resolveLegacyId;
24
+ private constructor();
25
+ /**
26
+ * Scan complete v3 records without modifying the file, ignoring an unterminated final line.
27
+ * Build parent mappings, assign IDs stable for this source instance, and derive current values
28
+ * and imported usage. Retain metadata, not conversation payloads or an open reader. writes()
29
+ * reopens the path to materialize captured records and resolve their payload-specific references.
30
+ */
31
+ static read(fileSystem: FileSystem, path: string, context: Context): Promise<LegacyV3Source>;
32
+ entryStructures(): Iterable<Pick<CommittedEntryWrite, "id" | "parentId" | "seq">>;
33
+ translateForkEntryId(legacyId: string): string;
34
+ private collectRequiredTailMessageIds;
35
+ /**
36
+ * Stream normalized v4 entries, optionally filtered by reminted ID, followed by derived current values.
37
+ * Each pass owns its reader and message cache, sharing only the captured IDs and metadata.
38
+ */
39
+ writes(context: Context, isEntrySelected?: (id: string) => boolean): AsyncIterable<CommittedEntryWrite | CommittedValueSetWrite>;
40
+ /** Replay only the captured prefix and verify its physical identities before materialization. */
41
+ private readCapturedEntries;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=legacy-v3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-v3.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/legacy-v3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,gBAAgB,CAAC;AAEjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGhF,OAAO,EAAE,KAAK,qBAAqB,EAA2B,MAAM,YAAY,CAAC;AAEjF,OAAO,EAGN,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,MAAM,YAAY,CAAC;AAsIpB,KAAK,wBAAwB,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC;AAalF,wBAAsB,0BAA0B,CAC/C,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,wBAAwB,CAAC,CAanC;AAED,wBAAsB,uBAAuB,CAC5C,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,kBAAkB,CAAC,CAM7B;AAyUD;;;;GAIG;AACH,qBAAa,cAAc;IAC1B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAClE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAElD,OAAO,eAiBN;IAED;;;;;OAKG;IACH,OAAa,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAwBjG;IAEA,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,CAKjF;IAED,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK7C;IAED,OAAO,CAAC,6BAA6B;IAgBrC;;;OAGG;IACI,MAAM,CACZ,OAAO,EAAE,OAAO,EAChB,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,GACvC,aAAa,CAAC,mBAAmB,GAAG,sBAAsB,CAAC,CAsB7D;IAED,iGAAiG;YAClF,mBAAmB;CA8BlC"}