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

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 +0 -4
  2. package/dist/harness/agent-harness.d.ts +384 -639
  3. package/dist/harness/agent-harness.d.ts.map +1 -1
  4. package/dist/harness/agent-harness.js +250 -5
  5. package/dist/harness/agent-harness.js.map +1 -1
  6. package/dist/harness/compaction/branch-summarization.d.ts +6 -12
  7. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  8. package/dist/harness/compaction/branch-summarization.js +27 -33
  9. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  10. package/dist/harness/compaction/compaction.d.ts +8 -30
  11. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  12. package/dist/harness/compaction/compaction.js +64 -53
  13. package/dist/harness/compaction/compaction.js.map +1 -1
  14. package/dist/harness/env/nodejs.d.ts +28 -25
  15. package/dist/harness/env/nodejs.d.ts.map +1 -1
  16. package/dist/harness/env/nodejs.js +125 -368
  17. package/dist/harness/env/nodejs.js.map +1 -1
  18. package/dist/harness/events.d.ts +38 -20
  19. package/dist/harness/events.d.ts.map +1 -1
  20. package/dist/harness/events.js +55 -233
  21. package/dist/harness/events.js.map +1 -1
  22. package/dist/harness/messages.d.ts +2 -2
  23. package/dist/harness/messages.d.ts.map +1 -1
  24. package/dist/harness/messages.js.map +1 -1
  25. package/dist/harness/prompt-templates.d.ts +2 -3
  26. package/dist/harness/prompt-templates.d.ts.map +1 -1
  27. package/dist/harness/prompt-templates.js +17 -17
  28. package/dist/harness/prompt-templates.js.map +1 -1
  29. package/dist/harness/reducer.d.ts +100 -0
  30. package/dist/harness/reducer.d.ts.map +1 -0
  31. package/dist/harness/reducer.js +420 -0
  32. package/dist/harness/reducer.js.map +1 -0
  33. package/dist/harness/result.d.ts +0 -93
  34. package/dist/harness/result.d.ts.map +1 -1
  35. package/dist/harness/result.js +0 -39
  36. package/dist/harness/result.js.map +1 -1
  37. package/dist/harness/session/context.d.ts +19 -6
  38. package/dist/harness/session/context.d.ts.map +1 -1
  39. package/dist/harness/session/context.js +53 -31
  40. package/dist/harness/session/context.js.map +1 -1
  41. package/dist/harness/session/index.d.ts +5 -9
  42. package/dist/harness/session/index.d.ts.map +1 -1
  43. package/dist/harness/session/index.js +4 -7
  44. package/dist/harness/session/index.js.map +1 -1
  45. package/dist/harness/session/jsonl/codec.d.ts +8 -19
  46. package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
  47. package/dist/harness/session/jsonl/codec.js +219 -34
  48. package/dist/harness/session/jsonl/codec.js.map +1 -1
  49. package/dist/harness/session/jsonl/errors.d.ts +9 -0
  50. package/dist/harness/session/jsonl/errors.d.ts.map +1 -0
  51. package/dist/harness/session/jsonl/errors.js +18 -0
  52. package/dist/harness/session/jsonl/errors.js.map +1 -0
  53. package/dist/harness/session/jsonl/repo.d.ts +24 -27
  54. package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  55. package/dist/harness/session/jsonl/repo.js +151 -276
  56. package/dist/harness/session/jsonl/repo.js.map +1 -1
  57. package/dist/harness/session/jsonl/storage.d.ts +41 -39
  58. package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  59. package/dist/harness/session/jsonl/storage.js +196 -175
  60. package/dist/harness/session/jsonl/storage.js.map +1 -1
  61. package/dist/harness/session/jsonl/types.d.ts +22 -23
  62. package/dist/harness/session/jsonl/types.d.ts.map +1 -1
  63. package/dist/harness/session/jsonl/types.js +1 -2
  64. package/dist/harness/session/jsonl/types.js.map +1 -1
  65. package/dist/harness/session/jsonl.d.ts +3 -0
  66. package/dist/harness/session/jsonl.d.ts.map +1 -0
  67. package/dist/harness/session/jsonl.js +2 -0
  68. package/dist/harness/session/jsonl.js.map +1 -0
  69. package/dist/harness/session/memory.d.ts +40 -44
  70. package/dist/harness/session/memory.d.ts.map +1 -1
  71. package/dist/harness/session/memory.js +115 -333
  72. package/dist/harness/session/memory.js.map +1 -1
  73. package/dist/harness/session/session.d.ts +51 -78
  74. package/dist/harness/session/session.d.ts.map +1 -1
  75. package/dist/harness/session/session.js +207 -327
  76. package/dist/harness/session/session.js.map +1 -1
  77. package/dist/harness/session/state.d.ts +65 -0
  78. package/dist/harness/session/state.d.ts.map +1 -0
  79. package/dist/harness/session/state.js +320 -0
  80. package/dist/harness/session/state.js.map +1 -0
  81. package/dist/harness/session/testing/conformance.d.ts +4 -0
  82. package/dist/harness/session/testing/conformance.d.ts.map +1 -0
  83. package/dist/harness/session/testing/conformance.js +762 -0
  84. package/dist/harness/session/testing/conformance.js.map +1 -0
  85. package/dist/harness/session/testing/index.d.ts +2 -9
  86. package/dist/harness/session/testing/index.d.ts.map +1 -1
  87. package/dist/harness/session/testing/index.js +1 -8
  88. package/dist/harness/session/testing/index.js.map +1 -1
  89. package/dist/harness/session/testing/types.d.ts +7 -5
  90. package/dist/harness/session/testing/types.d.ts.map +1 -1
  91. package/dist/harness/session/testing/types.js.map +1 -1
  92. package/dist/harness/session/types.d.ts +265 -425
  93. package/dist/harness/session/types.d.ts.map +1 -1
  94. package/dist/harness/session/types.js +7 -7
  95. package/dist/harness/session/types.js.map +1 -1
  96. package/dist/harness/skills.d.ts +2 -3
  97. package/dist/harness/skills.d.ts.map +1 -1
  98. package/dist/harness/skills.js +26 -29
  99. package/dist/harness/skills.js.map +1 -1
  100. package/dist/harness/telemetry.d.ts +43 -64
  101. package/dist/harness/telemetry.d.ts.map +1 -1
  102. package/dist/harness/telemetry.js +26 -45
  103. package/dist/harness/telemetry.js.map +1 -1
  104. package/dist/harness/tools/bash.d.ts +4 -4
  105. package/dist/harness/tools/bash.d.ts.map +1 -1
  106. package/dist/harness/tools/bash.js +93 -66
  107. package/dist/harness/tools/bash.js.map +1 -1
  108. package/dist/harness/tools/edit.d.ts.map +1 -1
  109. package/dist/harness/tools/edit.js +13 -17
  110. package/dist/harness/tools/edit.js.map +1 -1
  111. package/dist/harness/tools/file-mutation-queue.d.ts +1 -2
  112. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  113. package/dist/harness/tools/file-mutation-queue.js +5 -5
  114. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  115. package/dist/harness/tools/path-utils.d.ts +2 -3
  116. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  117. package/dist/harness/tools/path-utils.js +5 -5
  118. package/dist/harness/tools/path-utils.js.map +1 -1
  119. package/dist/harness/tools/read.d.ts +1 -2
  120. package/dist/harness/tools/read.d.ts.map +1 -1
  121. package/dist/harness/tools/read.js +6 -4
  122. package/dist/harness/tools/read.js.map +1 -1
  123. package/dist/harness/tools/write.d.ts.map +1 -1
  124. package/dist/harness/tools/write.js +8 -12
  125. package/dist/harness/tools/write.js.map +1 -1
  126. package/dist/harness/types.d.ts +45 -128
  127. package/dist/harness/types.d.ts.map +1 -1
  128. package/dist/harness/types.js.map +1 -1
  129. package/dist/harness/utils/shell-output.d.ts +5 -19
  130. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  131. package/dist/harness/utils/shell-output.js +192 -65
  132. package/dist/harness/utils/shell-output.js.map +1 -1
  133. package/dist/harness/utils/truncate.d.ts +0 -1
  134. package/dist/harness/utils/truncate.d.ts.map +1 -1
  135. package/dist/harness/utils/truncate.js +1 -1
  136. package/dist/harness/utils/truncate.js.map +1 -1
  137. package/dist/index.d.ts +1 -4
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +6 -3
  140. package/dist/index.js.map +1 -1
  141. package/dist/search/index.d.ts +16 -24
  142. package/dist/search/index.d.ts.map +1 -1
  143. package/dist/search/index.js +1 -1
  144. package/dist/search/index.js.map +1 -1
  145. package/dist/search/scanning.d.ts +29 -0
  146. package/dist/search/scanning.d.ts.map +1 -0
  147. package/dist/search/scanning.js +103 -0
  148. package/dist/search/scanning.js.map +1 -0
  149. package/dist/types.d.ts +0 -2
  150. package/dist/types.d.ts.map +1 -1
  151. package/dist/types.js.map +1 -1
  152. package/package.json +6 -27
  153. package/dist/harness/config.d.ts +0 -9
  154. package/dist/harness/config.d.ts.map +0 -1
  155. package/dist/harness/config.js +0 -35
  156. package/dist/harness/config.js.map +0 -1
  157. package/dist/harness/context.d.ts +0 -9
  158. package/dist/harness/context.d.ts.map +0 -1
  159. package/dist/harness/context.js +0 -13
  160. package/dist/harness/context.js.map +0 -1
  161. package/dist/harness/execution/assistant.d.ts +0 -42
  162. package/dist/harness/execution/assistant.d.ts.map +0 -1
  163. package/dist/harness/execution/assistant.js +0 -82
  164. package/dist/harness/execution/assistant.js.map +0 -1
  165. package/dist/harness/execution/effect-gate.d.ts +0 -22
  166. package/dist/harness/execution/effect-gate.d.ts.map +0 -1
  167. package/dist/harness/execution/effect-gate.js +0 -48
  168. package/dist/harness/execution/effect-gate.js.map +0 -1
  169. package/dist/harness/execution/tools.d.ts +0 -67
  170. package/dist/harness/execution/tools.d.ts.map +0 -1
  171. package/dist/harness/execution/tools.js +0 -121
  172. package/dist/harness/execution/tools.js.map +0 -1
  173. package/dist/harness/hooks.d.ts +0 -38
  174. package/dist/harness/hooks.d.ts.map +0 -1
  175. package/dist/harness/hooks.js +0 -404
  176. package/dist/harness/hooks.js.map +0 -1
  177. package/dist/harness/runtime/drive/boundary.d.ts +0 -28
  178. package/dist/harness/runtime/drive/boundary.d.ts.map +0 -1
  179. package/dist/harness/runtime/drive/boundary.js +0 -173
  180. package/dist/harness/runtime/drive/boundary.js.map +0 -1
  181. package/dist/harness/runtime/drive/checkpoint.d.ts +0 -8
  182. package/dist/harness/runtime/drive/checkpoint.d.ts.map +0 -1
  183. package/dist/harness/runtime/drive/checkpoint.js +0 -133
  184. package/dist/harness/runtime/drive/checkpoint.js.map +0 -1
  185. package/dist/harness/runtime/drive/deferred.d.ts +0 -15
  186. package/dist/harness/runtime/drive/deferred.d.ts.map +0 -1
  187. package/dist/harness/runtime/drive/deferred.js +0 -179
  188. package/dist/harness/runtime/drive/deferred.js.map +0 -1
  189. package/dist/harness/runtime/drive/generation.d.ts +0 -8
  190. package/dist/harness/runtime/drive/generation.d.ts.map +0 -1
  191. package/dist/harness/runtime/drive/generation.js +0 -205
  192. package/dist/harness/runtime/drive/generation.js.map +0 -1
  193. package/dist/harness/runtime/drive/reconcile.d.ts +0 -5
  194. package/dist/harness/runtime/drive/reconcile.d.ts.map +0 -1
  195. package/dist/harness/runtime/drive/reconcile.js +0 -140
  196. package/dist/harness/runtime/drive/reconcile.js.map +0 -1
  197. package/dist/harness/runtime/drive/recovery.d.ts +0 -8
  198. package/dist/harness/runtime/drive/recovery.d.ts.map +0 -1
  199. package/dist/harness/runtime/drive/recovery.js +0 -85
  200. package/dist/harness/runtime/drive/recovery.js.map +0 -1
  201. package/dist/harness/runtime/drive/response.d.ts +0 -23
  202. package/dist/harness/runtime/drive/response.d.ts.map +0 -1
  203. package/dist/harness/runtime/drive/response.js +0 -394
  204. package/dist/harness/runtime/drive/response.js.map +0 -1
  205. package/dist/harness/runtime/drive/retry.d.ts +0 -4
  206. package/dist/harness/runtime/drive/retry.d.ts.map +0 -1
  207. package/dist/harness/runtime/drive/retry.js +0 -34
  208. package/dist/harness/runtime/drive/retry.js.map +0 -1
  209. package/dist/harness/runtime/drive/structural.d.ts +0 -32
  210. package/dist/harness/runtime/drive/structural.d.ts.map +0 -1
  211. package/dist/harness/runtime/drive/structural.js +0 -929
  212. package/dist/harness/runtime/drive/structural.js.map +0 -1
  213. package/dist/harness/runtime/drive/terminal.d.ts +0 -7
  214. package/dist/harness/runtime/drive/terminal.d.ts.map +0 -1
  215. package/dist/harness/runtime/drive/terminal.js +0 -49
  216. package/dist/harness/runtime/drive/terminal.js.map +0 -1
  217. package/dist/harness/runtime/drive/tool-placement.d.ts +0 -14
  218. package/dist/harness/runtime/drive/tool-placement.d.ts.map +0 -1
  219. package/dist/harness/runtime/drive/tool-placement.js +0 -244
  220. package/dist/harness/runtime/drive/tool-placement.js.map +0 -1
  221. package/dist/harness/runtime/drive/tools.d.ts +0 -6
  222. package/dist/harness/runtime/drive/tools.d.ts.map +0 -1
  223. package/dist/harness/runtime/drive/tools.js +0 -449
  224. package/dist/harness/runtime/drive/tools.js.map +0 -1
  225. package/dist/harness/runtime/drive.d.ts +0 -6
  226. package/dist/harness/runtime/drive.d.ts.map +0 -1
  227. package/dist/harness/runtime/drive.js +0 -93
  228. package/dist/harness/runtime/drive.js.map +0 -1
  229. package/dist/harness/runtime/harness.d.ts +0 -59
  230. package/dist/harness/runtime/harness.d.ts.map +0 -1
  231. package/dist/harness/runtime/harness.js +0 -302
  232. package/dist/harness/runtime/harness.js.map +0 -1
  233. package/dist/harness/runtime/index.d.ts +0 -2
  234. package/dist/harness/runtime/index.d.ts.map +0 -1
  235. package/dist/harness/runtime/index.js +0 -2
  236. package/dist/harness/runtime/index.js.map +0 -1
  237. package/dist/harness/runtime/lane.d.ts +0 -118
  238. package/dist/harness/runtime/lane.d.ts.map +0 -1
  239. package/dist/harness/runtime/lane.js +0 -1559
  240. package/dist/harness/runtime/lane.js.map +0 -1
  241. package/dist/harness/runtime/progress.d.ts +0 -15
  242. package/dist/harness/runtime/progress.d.ts.map +0 -1
  243. package/dist/harness/runtime/progress.js +0 -66
  244. package/dist/harness/runtime/progress.js.map +0 -1
  245. package/dist/harness/runtime/reducer.d.ts +0 -5
  246. package/dist/harness/runtime/reducer.d.ts.map +0 -1
  247. package/dist/harness/runtime/reducer.js +0 -240
  248. package/dist/harness/runtime/reducer.js.map +0 -1
  249. package/dist/harness/runtime/restore.d.ts +0 -24
  250. package/dist/harness/runtime/restore.d.ts.map +0 -1
  251. package/dist/harness/runtime/restore.js +0 -117
  252. package/dist/harness/runtime/restore.js.map +0 -1
  253. package/dist/harness/runtime/transcript.d.ts +0 -21
  254. package/dist/harness/runtime/transcript.d.ts.map +0 -1
  255. package/dist/harness/runtime/transcript.js +0 -72
  256. package/dist/harness/runtime/transcript.js.map +0 -1
  257. package/dist/harness/runtime/types.d.ts +0 -105
  258. package/dist/harness/runtime/types.d.ts.map +0 -1
  259. package/dist/harness/runtime/types.js +0 -50
  260. package/dist/harness/runtime/types.js.map +0 -1
  261. package/dist/harness/session/commit.d.ts +0 -53
  262. package/dist/harness/session/commit.d.ts.map +0 -1
  263. package/dist/harness/session/commit.js +0 -57
  264. package/dist/harness/session/commit.js.map +0 -1
  265. package/dist/harness/session/fork-policy.d.ts +0 -21
  266. package/dist/harness/session/fork-policy.d.ts.map +0 -1
  267. package/dist/harness/session/fork-policy.js +0 -55
  268. package/dist/harness/session/fork-policy.js.map +0 -1
  269. package/dist/harness/session/fork.d.ts +0 -16
  270. package/dist/harness/session/fork.d.ts.map +0 -1
  271. package/dist/harness/session/fork.js +0 -79
  272. package/dist/harness/session/fork.js.map +0 -1
  273. package/dist/harness/session/in-memory-storage-state.d.ts +0 -39
  274. package/dist/harness/session/in-memory-storage-state.d.ts.map +0 -1
  275. package/dist/harness/session/in-memory-storage-state.js +0 -269
  276. package/dist/harness/session/in-memory-storage-state.js.map +0 -1
  277. package/dist/harness/session/jsonl/fork.d.ts +0 -38
  278. package/dist/harness/session/jsonl/fork.d.ts.map +0 -1
  279. package/dist/harness/session/jsonl/fork.js +0 -266
  280. package/dist/harness/session/jsonl/fork.js.map +0 -1
  281. package/dist/harness/session/jsonl/index.d.ts +0 -4
  282. package/dist/harness/session/jsonl/index.d.ts.map +0 -1
  283. package/dist/harness/session/jsonl/index.js +0 -4
  284. package/dist/harness/session/jsonl/index.js.map +0 -1
  285. package/dist/harness/session/jsonl/io.d.ts +0 -14
  286. package/dist/harness/session/jsonl/io.d.ts.map +0 -1
  287. package/dist/harness/session/jsonl/io.js +0 -86
  288. package/dist/harness/session/jsonl/io.js.map +0 -1
  289. package/dist/harness/session/jsonl/legacy-v3.d.ts +0 -44
  290. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +0 -1
  291. package/dist/harness/session/jsonl/legacy-v3.js +0 -454
  292. package/dist/harness/session/jsonl/legacy-v3.js.map +0 -1
  293. package/dist/harness/session/mutation-line.d.ts +0 -8
  294. package/dist/harness/session/mutation-line.d.ts.map +0 -1
  295. package/dist/harness/session/mutation-line.js +0 -22
  296. package/dist/harness/session/mutation-line.js.map +0 -1
  297. package/dist/harness/session/testing/benchmark/datasets.d.ts +0 -12
  298. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +0 -1
  299. package/dist/harness/session/testing/benchmark/datasets.js +0 -24
  300. package/dist/harness/session/testing/benchmark/datasets.js.map +0 -1
  301. package/dist/harness/session/testing/benchmark/session-repo.d.ts +0 -42
  302. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +0 -1
  303. package/dist/harness/session/testing/benchmark/session-repo.js +0 -127
  304. package/dist/harness/session/testing/benchmark/session-repo.js.map +0 -1
  305. package/dist/harness/session/testing/benchmark/storage.d.ts +0 -25
  306. package/dist/harness/session/testing/benchmark/storage.d.ts.map +0 -1
  307. package/dist/harness/session/testing/benchmark/storage.js +0 -114
  308. package/dist/harness/session/testing/benchmark/storage.js.map +0 -1
  309. package/dist/harness/session/testing/conformance/session-repo.d.ts +0 -23
  310. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +0 -1
  311. package/dist/harness/session/testing/conformance/session-repo.js +0 -809
  312. package/dist/harness/session/testing/conformance/session-repo.js.map +0 -1
  313. package/dist/harness/session/testing/conformance/storage.d.ts +0 -4
  314. package/dist/harness/session/testing/conformance/storage.d.ts.map +0 -1
  315. package/dist/harness/session/testing/conformance/storage.js +0 -600
  316. package/dist/harness/session/testing/conformance/storage.js.map +0 -1
  317. package/dist/harness/session/testing/gating-storage.d.ts +0 -26
  318. package/dist/harness/session/testing/gating-storage.d.ts.map +0 -1
  319. package/dist/harness/session/testing/gating-storage.js +0 -103
  320. package/dist/harness/session/testing/gating-storage.js.map +0 -1
  321. package/dist/harness/session/testing/instrumented-storage.d.ts +0 -11
  322. package/dist/harness/session/testing/instrumented-storage.d.ts.map +0 -1
  323. package/dist/harness/session/testing/instrumented-storage.js +0 -19
  324. package/dist/harness/session/testing/instrumented-storage.js.map +0 -1
  325. package/dist/harness/session/testing/storage-decorator.d.ts +0 -20
  326. package/dist/harness/session/testing/storage-decorator.d.ts.map +0 -1
  327. package/dist/harness/session/testing/storage-decorator.js +0 -40
  328. package/dist/harness/session/testing/storage-decorator.js.map +0 -1
  329. package/dist/harness/session/values.d.ts +0 -95
  330. package/dist/harness/session/values.d.ts.map +0 -1
  331. package/dist/harness/session/values.js +0 -81
  332. package/dist/harness/session/values.js.map +0 -1
  333. package/dist/harness/utils/adaptive-publisher.d.ts +0 -24
  334. package/dist/harness/utils/adaptive-publisher.d.ts.map +0 -1
  335. package/dist/harness/utils/adaptive-publisher.js +0 -79
  336. package/dist/harness/utils/adaptive-publisher.js.map +0 -1
  337. package/dist/harness/utils/output-capture.d.ts +0 -31
  338. package/dist/harness/utils/output-capture.d.ts.map +0 -1
  339. package/dist/harness/utils/output-capture.js +0 -217
  340. package/dist/harness/utils/output-capture.js.map +0 -1
  341. package/dist/harness/utils/usage.d.ts +0 -4
  342. package/dist/harness/utils/usage.d.ts.map +0 -1
  343. package/dist/harness/utils/usage.js +0 -33
  344. package/dist/harness/utils/usage.js.map +0 -1
@@ -1,45 +1,230 @@
1
1
  import { err, ok } from "../../types.js";
2
- import { JSONL_FORMAT_VERSION } from "./types.js";
3
- function isRecord(value) {
2
+ import { JsonlDecodeError } from "./errors.js";
3
+ const ENTRY_TYPES = new Set([
4
+ "message",
5
+ "model_change",
6
+ "thinking_level_change",
7
+ "configuration_update",
8
+ "active_tools_change",
9
+ "compaction",
10
+ "branch_summary",
11
+ "custom",
12
+ ]);
13
+ const RECORD_TYPES = new Set([
14
+ "operation_started",
15
+ "abort_requested",
16
+ "operation_finished",
17
+ "step_attempt",
18
+ "tool_started",
19
+ "queue_enqueued",
20
+ "queue_cancelled",
21
+ "write_deferred",
22
+ "usage",
23
+ ]);
24
+ const OPERATION_KINDS = new Set(["run", "compaction", "navigation"]);
25
+ function isObject(value) {
4
26
  return typeof value === "object" && value !== null && !Array.isArray(value);
5
27
  }
6
- function isSafeIntegerAtLeast(value, minimum) {
7
- return Number.isSafeInteger(value) && value >= minimum;
8
- }
9
- export function isLegacyV3SessionHeader(value) {
10
- return (isRecord(value) &&
11
- value.type === "session" &&
12
- value.version === 3 &&
13
- typeof value.id === "string" &&
14
- typeof value.cwd === "string" &&
15
- typeof value.timestamp === "string" &&
16
- Number.isFinite(Date.parse(value.timestamp)) &&
17
- (value.parentSession === undefined || typeof value.parentSession === "string"));
18
- }
19
- export function isJsonlStorageHeader(value) {
20
- return (isRecord(value) &&
21
- value.kind === "header" &&
22
- value.v === JSONL_FORMAT_VERSION &&
23
- typeof value.id === "string" &&
24
- typeof value.cwd === "string" &&
25
- isSafeIntegerAtLeast(value.storageVersion, 1) &&
26
- isSafeIntegerAtLeast(value.createdAt, 0) &&
27
- (value.nextSeq === undefined || isSafeIntegerAtLeast(value.nextSeq, 1)) &&
28
- (value.parentSessionId === undefined || typeof value.parentSessionId === "string") &&
29
- (value.legacyParentSessionPath === undefined || typeof value.legacyParentSessionPath === "string"));
30
- }
31
- export function parseJsonlSessionHeader(line) {
28
+ function parseObject(line) {
32
29
  let value;
33
30
  try {
34
31
  value = JSON.parse(line);
35
32
  }
36
33
  catch (error) {
37
- return err(new Error("Invalid JSONL session header: not valid JSON", { cause: error }));
34
+ throw new JsonlDecodeError("syntax", "is not valid JSON", error instanceof Error ? error : undefined);
35
+ }
36
+ if (!isObject(value))
37
+ throw new JsonlDecodeError("schema", "is not a JSON object");
38
+ return value;
39
+ }
40
+ function requireString(value, field) {
41
+ if (typeof value !== "string")
42
+ throw new JsonlDecodeError("schema", `has invalid ${field}`);
43
+ return value;
44
+ }
45
+ function requireSequence(value) {
46
+ if (!Number.isSafeInteger(value) || value <= 0) {
47
+ throw new JsonlDecodeError("schema", "has invalid seq");
48
+ }
49
+ return value;
50
+ }
51
+ function requireTimestamp(value) {
52
+ if (!Number.isSafeInteger(value) || value < 0) {
53
+ throw new JsonlDecodeError("schema", "has invalid timestamp");
54
+ }
55
+ return value;
56
+ }
57
+ function requireNullableId(value, field) {
58
+ if (value !== null && typeof value !== "string") {
59
+ throw new JsonlDecodeError("schema", `has invalid ${field}`);
60
+ }
61
+ return value;
62
+ }
63
+ function decodeHeader(line) {
64
+ const value = parseObject(line);
65
+ if (value.kind !== "header")
66
+ throw new JsonlDecodeError("schema", "is not a header");
67
+ if (value.version !== 4)
68
+ throw new JsonlDecodeError("schema", "has unsupported session version");
69
+ const parentSessionId = value.parentSessionId;
70
+ if (parentSessionId !== undefined && typeof parentSessionId !== "string") {
71
+ throw new JsonlDecodeError("schema", "has invalid parentSessionId");
72
+ }
73
+ const legacyParentSessionPath = value.legacyParentSessionPath;
74
+ if (legacyParentSessionPath !== undefined && typeof legacyParentSessionPath !== "string") {
75
+ throw new JsonlDecodeError("schema", "has invalid legacyParentSessionPath");
76
+ }
77
+ if (parentSessionId !== undefined && legacyParentSessionPath !== undefined) {
78
+ throw new JsonlDecodeError("schema", "has both parentSessionId and legacyParentSessionPath");
79
+ }
80
+ const metadataValue = value.metadata;
81
+ if (metadataValue !== undefined && !isObject(metadataValue)) {
82
+ throw new JsonlDecodeError("schema", "has invalid metadata");
83
+ }
84
+ const metadata = metadataValue;
85
+ return {
86
+ kind: "header",
87
+ version: 4,
88
+ id: requireString(value.id, "id"),
89
+ createdAt: requireTimestamp(value.createdAt),
90
+ cwd: requireString(value.cwd, "cwd"),
91
+ parentSessionId,
92
+ legacyParentSessionPath,
93
+ metadata,
94
+ };
95
+ }
96
+ export function parseHeader(line) {
97
+ try {
98
+ return ok(decodeHeader(line));
99
+ }
100
+ catch (error) {
101
+ if (error instanceof JsonlDecodeError)
102
+ return err(error);
103
+ throw error;
104
+ }
105
+ }
106
+ export function encodeHeader(header) {
107
+ return `${JSON.stringify(header)}\n`;
108
+ }
109
+ export function metadataFromHeader(header, path, modifiedAt) {
110
+ return {
111
+ id: header.id,
112
+ createdAt: header.createdAt,
113
+ cwd: header.cwd,
114
+ path,
115
+ modifiedAt,
116
+ sourceFormat: 4,
117
+ ...(header.parentSessionId === undefined ? {} : { parentSessionId: header.parentSessionId }),
118
+ ...(header.legacyParentSessionPath === undefined
119
+ ? {}
120
+ : { legacyParentSessionPath: header.legacyParentSessionPath }),
121
+ ...(header.metadata === undefined ? {} : { metadata: header.metadata }),
122
+ };
123
+ }
124
+ function parseEntryMutation(value, seq) {
125
+ const lane = value.lane === undefined ? undefined : requireString(value.lane, "lane");
126
+ const id = requireString(value.id, "id");
127
+ const type = requireString(value.type, "entry type");
128
+ if (!ENTRY_TYPES.has(type)) {
129
+ throw new JsonlDecodeError("schema", `has unknown entry type ${type}`);
130
+ }
131
+ const parentId = requireNullableId(value.parentId, "parentId");
132
+ const timestamp = requireTimestamp(value.timestamp);
133
+ if (type === "custom")
134
+ requireString(value.customType, "customType");
135
+ const { kind: _kind, lane: _lane, ...entryFields } = value;
136
+ const entry = { ...entryFields, id, type, parentId, seq, timestamp };
137
+ return lane === undefined ? { kind: "entry", entry } : { kind: "entry", lane, entry };
138
+ }
139
+ function parseRecordMutation(value, seq) {
140
+ const id = requireString(value.id, "id");
141
+ const lane = requireString(value.lane, "lane");
142
+ const type = requireString(value.type, "record type");
143
+ if (!RECORD_TYPES.has(type)) {
144
+ throw new JsonlDecodeError("schema", `has unknown record type ${type}`);
145
+ }
146
+ const timestamp = requireTimestamp(value.timestamp);
147
+ if (type === "operation_started") {
148
+ if (!isObject(value.intent))
149
+ throw new JsonlDecodeError("schema", "has invalid intent");
150
+ const operationKind = requireString(value.intent.kind, "operation kind");
151
+ if (!OPERATION_KINDS.has(operationKind)) {
152
+ throw new JsonlDecodeError("schema", `has unknown operation kind ${operationKind}`);
153
+ }
154
+ }
155
+ if (type === "operation_finished")
156
+ requireString(value.runId, "runId");
157
+ const { kind: _kind, ...recordFields } = value;
158
+ return {
159
+ kind: "record",
160
+ record: { ...recordFields, id, lane, type, seq, timestamp },
161
+ };
162
+ }
163
+ function parseLaneMutation(value, seq) {
164
+ return {
165
+ kind: "lane",
166
+ seq,
167
+ lane: requireString(value.lane, "lane"),
168
+ leafId: requireNullableId(value.leafId, "leafId"),
169
+ };
170
+ }
171
+ function parseFactMutation(value, seq) {
172
+ if (value.fact === "name") {
173
+ if (value.name !== undefined && typeof value.name !== "string") {
174
+ throw new JsonlDecodeError("schema", "has invalid name");
175
+ }
176
+ return { kind: "fact", seq, fact: "name", name: value.name };
177
+ }
178
+ if (value.fact === "label") {
179
+ if (value.label !== undefined && typeof value.label !== "string") {
180
+ throw new JsonlDecodeError("schema", "has invalid label");
181
+ }
182
+ return {
183
+ kind: "fact",
184
+ seq,
185
+ fact: "label",
186
+ targetId: requireString(value.targetId, "targetId"),
187
+ label: value.label,
188
+ };
189
+ }
190
+ throw new JsonlDecodeError("schema", "has unknown fact type");
191
+ }
192
+ function decodeMutation(line) {
193
+ const value = parseObject(line);
194
+ const seq = requireSequence(value.seq);
195
+ switch (value.kind) {
196
+ case "entry":
197
+ return parseEntryMutation(value, seq);
198
+ case "record":
199
+ return parseRecordMutation(value, seq);
200
+ case "lane":
201
+ return parseLaneMutation(value, seq);
202
+ case "fact":
203
+ return parseFactMutation(value, seq);
204
+ default:
205
+ throw new JsonlDecodeError("schema", "has unknown mutation kind");
206
+ }
207
+ }
208
+ export function parseMutation(line) {
209
+ try {
210
+ return ok(decodeMutation(line));
211
+ }
212
+ catch (error) {
213
+ if (error instanceof JsonlDecodeError)
214
+ return err(error);
215
+ throw error;
216
+ }
217
+ }
218
+ export function encodeMutation(mutation) {
219
+ switch (mutation.kind) {
220
+ case "entry":
221
+ return `${JSON.stringify({ kind: "entry", lane: mutation.lane, ...mutation.entry })}\n`;
222
+ case "record":
223
+ return `${JSON.stringify({ kind: "record", ...mutation.record })}\n`;
224
+ case "lane":
225
+ return `${JSON.stringify(mutation)}\n`;
226
+ case "fact":
227
+ return `${JSON.stringify(mutation)}\n`;
38
228
  }
39
- if (isJsonlStorageHeader(value))
40
- return ok({ format: "v4", header: value });
41
- if (isLegacyV3SessionHeader(value))
42
- return ok({ format: "v3-legacy", header: value });
43
- return err(new Error("Unsupported JSONL session header"));
44
229
  }
45
230
  //# sourceMappingURL=codec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAA2B,MAAM,YAAY,CAAC;AAW3E,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,OAAe;IAC5D,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,IAAI,OAAO,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACrD,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC;QACf,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,KAAK,CAAC,OAAO,KAAK,CAAC;QACnB,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAC9E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IAClD,OAAO,CACN,QAAQ,CAAC,KAAK,CAAC;QACf,KAAK,CAAC,IAAI,KAAK,QAAQ;QACvB,KAAK,CAAC,CAAC,KAAK,oBAAoB;QAChC,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;QAC7B,oBAAoB,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7C,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACxC,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC;QAClF,CAAC,KAAK,CAAC,uBAAuB,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,uBAAuB,KAAK,QAAQ,CAAC,CAClG,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,uBAAuB,CAAC,IAAY;IACnD,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACJ,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,8CAA8C,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,oBAAoB,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,IAAI,uBAAuB,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;AAC3D,CAAC","sourcesContent":["import { err, ok, type Result } from \"../../types.ts\";\nimport { JSONL_FORMAT_VERSION, type JsonlStorageHeader } from \"./types.ts\";\n\nexport interface LegacyV3SessionHeader {\n\ttype: \"session\";\n\tversion: 3;\n\tid: string;\n\ttimestamp: string;\n\tcwd: string;\n\tparentSession?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isSafeIntegerAtLeast(value: unknown, minimum: number): value is number {\n\treturn Number.isSafeInteger(value) && (value as number) >= minimum;\n}\n\nexport function isLegacyV3SessionHeader(value: unknown): value is LegacyV3SessionHeader {\n\treturn (\n\t\tisRecord(value) &&\n\t\tvalue.type === \"session\" &&\n\t\tvalue.version === 3 &&\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.cwd === \"string\" &&\n\t\ttypeof value.timestamp === \"string\" &&\n\t\tNumber.isFinite(Date.parse(value.timestamp)) &&\n\t\t(value.parentSession === undefined || typeof value.parentSession === \"string\")\n\t);\n}\n\nexport function isJsonlStorageHeader(value: unknown): value is JsonlStorageHeader {\n\treturn (\n\t\tisRecord(value) &&\n\t\tvalue.kind === \"header\" &&\n\t\tvalue.v === JSONL_FORMAT_VERSION &&\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.cwd === \"string\" &&\n\t\tisSafeIntegerAtLeast(value.storageVersion, 1) &&\n\t\tisSafeIntegerAtLeast(value.createdAt, 0) &&\n\t\t(value.nextSeq === undefined || isSafeIntegerAtLeast(value.nextSeq, 1)) &&\n\t\t(value.parentSessionId === undefined || typeof value.parentSessionId === \"string\") &&\n\t\t(value.legacyParentSessionPath === undefined || typeof value.legacyParentSessionPath === \"string\")\n\t);\n}\n\nexport type JsonlParsedSessionHeader =\n\t| { format: \"v4\"; header: JsonlStorageHeader }\n\t| { format: \"v3-legacy\"; header: LegacyV3SessionHeader };\n\nexport function parseJsonlSessionHeader(line: string): Result<JsonlParsedSessionHeader, Error> {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(line);\n\t} catch (error) {\n\t\treturn err(new Error(\"Invalid JSONL session header: not valid JSON\", { cause: error }));\n\t}\n\tif (isJsonlStorageHeader(value)) return ok({ format: \"v4\", header: value });\n\tif (isLegacyV3SessionHeader(value)) return ok({ format: \"v3-legacy\", header: value });\n\treturn err(new Error(\"Unsupported JSONL session header\"));\n}\n"]}
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/codec.ts"],"names":[],"mappings":"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","sourcesContent":["import { err, ok, type Result } from \"../../types.ts\";\nimport type { SessionMutation } from \"../state.ts\";\nimport type { Entry, LaneRecord } from \"../types.ts\";\nimport { JsonlDecodeError } from \"./errors.ts\";\nimport type { JsonlSessionMetadata, JsonlV4Header } from \"./types.ts\";\n\nconst ENTRY_TYPES = new Set<Entry[\"type\"]>([\n\t\"message\",\n\t\"model_change\",\n\t\"thinking_level_change\",\n\t\"configuration_update\",\n\t\"active_tools_change\",\n\t\"compaction\",\n\t\"branch_summary\",\n\t\"custom\",\n]);\nconst RECORD_TYPES = new Set<LaneRecord[\"type\"]>([\n\t\"operation_started\",\n\t\"abort_requested\",\n\t\"operation_finished\",\n\t\"step_attempt\",\n\t\"tool_started\",\n\t\"queue_enqueued\",\n\t\"queue_cancelled\",\n\t\"write_deferred\",\n\t\"usage\",\n]);\nconst OPERATION_KINDS = new Set([\"run\", \"compaction\", \"navigation\"]);\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseObject(line: string): Record<string, unknown> {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(line);\n\t} catch (error) {\n\t\tthrow new JsonlDecodeError(\"syntax\", \"is not valid JSON\", error instanceof Error ? error : undefined);\n\t}\n\tif (!isObject(value)) throw new JsonlDecodeError(\"schema\", \"is not a JSON object\");\n\treturn value;\n}\n\nfunction requireString(value: unknown, field: string): string {\n\tif (typeof value !== \"string\") throw new JsonlDecodeError(\"schema\", `has invalid ${field}`);\n\treturn value;\n}\n\nfunction requireSequence(value: unknown): number {\n\tif (!Number.isSafeInteger(value) || (value as number) <= 0) {\n\t\tthrow new JsonlDecodeError(\"schema\", \"has invalid seq\");\n\t}\n\treturn value as number;\n}\n\nfunction requireTimestamp(value: unknown): number {\n\tif (!Number.isSafeInteger(value) || (value as number) < 0) {\n\t\tthrow new JsonlDecodeError(\"schema\", \"has invalid timestamp\");\n\t}\n\treturn value as number;\n}\n\nfunction requireNullableId(value: unknown, field: string): string | null {\n\tif (value !== null && typeof value !== \"string\") {\n\t\tthrow new JsonlDecodeError(\"schema\", `has invalid ${field}`);\n\t}\n\treturn value as string | null;\n}\n\nfunction decodeHeader(line: string): JsonlV4Header {\n\tconst value = parseObject(line);\n\tif (value.kind !== \"header\") throw new JsonlDecodeError(\"schema\", \"is not a header\");\n\tif (value.version !== 4) throw new JsonlDecodeError(\"schema\", \"has unsupported session version\");\n\tconst parentSessionId = value.parentSessionId;\n\tif (parentSessionId !== undefined && typeof parentSessionId !== \"string\") {\n\t\tthrow new JsonlDecodeError(\"schema\", \"has invalid parentSessionId\");\n\t}\n\tconst legacyParentSessionPath = value.legacyParentSessionPath;\n\tif (legacyParentSessionPath !== undefined && typeof legacyParentSessionPath !== \"string\") {\n\t\tthrow new JsonlDecodeError(\"schema\", \"has invalid legacyParentSessionPath\");\n\t}\n\tif (parentSessionId !== undefined && legacyParentSessionPath !== undefined) {\n\t\tthrow new JsonlDecodeError(\"schema\", \"has both parentSessionId and legacyParentSessionPath\");\n\t}\n\tconst metadataValue = value.metadata;\n\tif (metadataValue !== undefined && !isObject(metadataValue)) {\n\t\tthrow new JsonlDecodeError(\"schema\", \"has invalid metadata\");\n\t}\n\tconst metadata = metadataValue as JsonlV4Header[\"metadata\"];\n\treturn {\n\t\tkind: \"header\",\n\t\tversion: 4,\n\t\tid: requireString(value.id, \"id\"),\n\t\tcreatedAt: requireTimestamp(value.createdAt),\n\t\tcwd: requireString(value.cwd, \"cwd\"),\n\t\tparentSessionId,\n\t\tlegacyParentSessionPath,\n\t\tmetadata,\n\t};\n}\n\nexport function parseHeader(line: string): Result<JsonlV4Header, JsonlDecodeError> {\n\ttry {\n\t\treturn ok<JsonlV4Header, JsonlDecodeError>(decodeHeader(line));\n\t} catch (error) {\n\t\tif (error instanceof JsonlDecodeError) return err<JsonlV4Header, JsonlDecodeError>(error);\n\t\tthrow error;\n\t}\n}\n\nexport function encodeHeader(header: JsonlV4Header): string {\n\treturn `${JSON.stringify(header)}\\n`;\n}\n\nexport function metadataFromHeader(header: JsonlV4Header, path: string, modifiedAt: number): JsonlSessionMetadata {\n\treturn {\n\t\tid: header.id,\n\t\tcreatedAt: header.createdAt,\n\t\tcwd: header.cwd,\n\t\tpath,\n\t\tmodifiedAt,\n\t\tsourceFormat: 4,\n\t\t...(header.parentSessionId === undefined ? {} : { parentSessionId: header.parentSessionId }),\n\t\t...(header.legacyParentSessionPath === undefined\n\t\t\t? {}\n\t\t\t: { legacyParentSessionPath: header.legacyParentSessionPath }),\n\t\t...(header.metadata === undefined ? {} : { metadata: header.metadata }),\n\t};\n}\n\nfunction parseEntryMutation(value: Record<string, unknown>, seq: number): Extract<SessionMutation, { kind: \"entry\" }> {\n\tconst lane = value.lane === undefined ? undefined : requireString(value.lane, \"lane\");\n\tconst id = requireString(value.id, \"id\");\n\tconst type = requireString(value.type, \"entry type\");\n\tif (!ENTRY_TYPES.has(type as Entry[\"type\"])) {\n\t\tthrow new JsonlDecodeError(\"schema\", `has unknown entry type ${type}`);\n\t}\n\tconst parentId = requireNullableId(value.parentId, \"parentId\");\n\tconst timestamp = requireTimestamp(value.timestamp);\n\tif (type === \"custom\") requireString(value.customType, \"customType\");\n\tconst { kind: _kind, lane: _lane, ...entryFields } = value;\n\tconst entry = { ...entryFields, id, type, parentId, seq, timestamp } as unknown as Entry;\n\treturn lane === undefined ? { kind: \"entry\", entry } : { kind: \"entry\", lane, entry };\n}\n\nfunction parseRecordMutation(\n\tvalue: Record<string, unknown>,\n\tseq: number,\n): Extract<SessionMutation, { kind: \"record\" }> {\n\tconst id = requireString(value.id, \"id\");\n\tconst lane = requireString(value.lane, \"lane\");\n\tconst type = requireString(value.type, \"record type\");\n\tif (!RECORD_TYPES.has(type as LaneRecord[\"type\"])) {\n\t\tthrow new JsonlDecodeError(\"schema\", `has unknown record type ${type}`);\n\t}\n\tconst timestamp = requireTimestamp(value.timestamp);\n\tif (type === \"operation_started\") {\n\t\tif (!isObject(value.intent)) throw new JsonlDecodeError(\"schema\", \"has invalid intent\");\n\t\tconst operationKind = requireString(value.intent.kind, \"operation kind\");\n\t\tif (!OPERATION_KINDS.has(operationKind)) {\n\t\t\tthrow new JsonlDecodeError(\"schema\", `has unknown operation kind ${operationKind}`);\n\t\t}\n\t}\n\tif (type === \"operation_finished\") requireString(value.runId, \"runId\");\n\tconst { kind: _kind, ...recordFields } = value;\n\treturn {\n\t\tkind: \"record\",\n\t\trecord: { ...recordFields, id, lane, type, seq, timestamp } as unknown as LaneRecord,\n\t};\n}\n\nfunction parseLaneMutation(value: Record<string, unknown>, seq: number): Extract<SessionMutation, { kind: \"lane\" }> {\n\treturn {\n\t\tkind: \"lane\",\n\t\tseq,\n\t\tlane: requireString(value.lane, \"lane\"),\n\t\tleafId: requireNullableId(value.leafId, \"leafId\"),\n\t};\n}\n\nfunction parseFactMutation(value: Record<string, unknown>, seq: number): Extract<SessionMutation, { kind: \"fact\" }> {\n\tif (value.fact === \"name\") {\n\t\tif (value.name !== undefined && typeof value.name !== \"string\") {\n\t\t\tthrow new JsonlDecodeError(\"schema\", \"has invalid name\");\n\t\t}\n\t\treturn { kind: \"fact\", seq, fact: \"name\", name: value.name };\n\t}\n\tif (value.fact === \"label\") {\n\t\tif (value.label !== undefined && typeof value.label !== \"string\") {\n\t\t\tthrow new JsonlDecodeError(\"schema\", \"has invalid label\");\n\t\t}\n\t\treturn {\n\t\t\tkind: \"fact\",\n\t\t\tseq,\n\t\t\tfact: \"label\",\n\t\t\ttargetId: requireString(value.targetId, \"targetId\"),\n\t\t\tlabel: value.label,\n\t\t};\n\t}\n\tthrow new JsonlDecodeError(\"schema\", \"has unknown fact type\");\n}\n\nfunction decodeMutation(line: string): SessionMutation {\n\tconst value = parseObject(line);\n\tconst seq = requireSequence(value.seq);\n\tswitch (value.kind) {\n\t\tcase \"entry\":\n\t\t\treturn parseEntryMutation(value, seq);\n\t\tcase \"record\":\n\t\t\treturn parseRecordMutation(value, seq);\n\t\tcase \"lane\":\n\t\t\treturn parseLaneMutation(value, seq);\n\t\tcase \"fact\":\n\t\t\treturn parseFactMutation(value, seq);\n\t\tdefault:\n\t\t\tthrow new JsonlDecodeError(\"schema\", \"has unknown mutation kind\");\n\t}\n}\n\nexport function parseMutation(line: string): Result<SessionMutation, JsonlDecodeError> {\n\ttry {\n\t\treturn ok<SessionMutation, JsonlDecodeError>(decodeMutation(line));\n\t} catch (error) {\n\t\tif (error instanceof JsonlDecodeError) return err<SessionMutation, JsonlDecodeError>(error);\n\t\tthrow error;\n\t}\n}\n\nexport function encodeMutation(mutation: SessionMutation): string {\n\tswitch (mutation.kind) {\n\t\tcase \"entry\":\n\t\t\treturn `${JSON.stringify({ kind: \"entry\", lane: mutation.lane, ...mutation.entry })}\\n`;\n\t\tcase \"record\":\n\t\t\treturn `${JSON.stringify({ kind: \"record\", ...mutation.record })}\\n`;\n\t\tcase \"lane\":\n\t\t\treturn `${JSON.stringify(mutation)}\\n`;\n\t\tcase \"fact\":\n\t\t\treturn `${JSON.stringify(mutation)}\\n`;\n\t}\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { FileError, Result } from "../../types.ts";
2
+ import { SessionError } from "../types.ts";
3
+ export declare class JsonlDecodeError extends Error {
4
+ readonly kind: "syntax" | "schema";
5
+ constructor(kind: "syntax" | "schema", message: string, cause?: Error);
6
+ }
7
+ export declare function fileResult<T>(result: Result<T, FileError>, message: string): T;
8
+ export declare function invalidFile(path: string, line: number, cause: Error): SessionError;
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,qBAAa,gBAAiB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAEnC,YAAY,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAIpE;CACD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAS9E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,YAAY,CAElF"}
@@ -0,0 +1,18 @@
1
+ import { SessionError } from "../types.js";
2
+ export class JsonlDecodeError extends Error {
3
+ constructor(kind, message, cause) {
4
+ super(message, cause === undefined ? undefined : { cause });
5
+ this.name = "JsonlDecodeError";
6
+ this.kind = kind;
7
+ }
8
+ }
9
+ export function fileResult(result, message) {
10
+ if (!result.ok) {
11
+ throw new SessionError(result.error.code === "not_found" ? "not_found" : "storage", `${message}: ${result.error.message}`, result.error);
12
+ }
13
+ return result.value;
14
+ }
15
+ export function invalidFile(path, line, cause) {
16
+ return new SessionError("invalid_entry", `Invalid JSONL v4 session ${path}: line ${line} ${cause.message}`, cause);
17
+ }
18
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAG1C,YAAY,IAAyB,EAAE,OAAe,EAAE,KAAa;QACpE,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;CACD;AAED,MAAM,UAAU,UAAU,CAAI,MAA4B,EAAE,OAAe;IAC1E,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,YAAY,CACrB,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAC3D,GAAG,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EACrC,MAAM,CAAC,KAAK,CACZ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,KAAY;IACnE,OAAO,IAAI,YAAY,CAAC,eAAe,EAAE,4BAA4B,IAAI,UAAU,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AACpH,CAAC","sourcesContent":["import type { FileError, Result } from \"../../types.ts\";\nimport { SessionError } from \"../types.ts\";\n\nexport class JsonlDecodeError extends Error {\n\treadonly kind: \"syntax\" | \"schema\";\n\n\tconstructor(kind: \"syntax\" | \"schema\", message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"JsonlDecodeError\";\n\t\tthis.kind = kind;\n\t}\n}\n\nexport function fileResult<T>(result: Result<T, FileError>, message: string): T {\n\tif (!result.ok) {\n\t\tthrow new SessionError(\n\t\t\tresult.error.code === \"not_found\" ? \"not_found\" : \"storage\",\n\t\t\t`${message}: ${result.error.message}`,\n\t\t\tresult.error,\n\t\t);\n\t}\n\treturn result.value;\n}\n\nexport function invalidFile(path: string, line: number, cause: Error): SessionError {\n\treturn new SessionError(\"invalid_entry\", `Invalid JSONL v4 session ${path}: line ${line} ${cause.message}`, cause);\n}\n"]}
@@ -1,35 +1,32 @@
1
- import type { Context } from "../../context.ts";
2
- import type { ForkOptions, Session, SessionRepo } from "../types.ts";
3
- import { type JsonlSessionCreateOptions, type JsonlSessionListOptions, type JsonlSessionMetadata, type JsonlSessionRepoOptions } from "./types.ts";
4
- /** File-backed format-4 session repository lifecycle. */
1
+ import { Session } from "../session.ts";
2
+ import { type ForkOptions, type SessionRepo } from "../types.ts";
3
+ import { JsonlSessionStorage } from "./storage.ts";
4
+ import type { JsonlSessionCreateOptions, JsonlSessionListOptions, JsonlSessionMetadata, JsonlSessionRepoOptions } from "./types.ts";
5
+ export declare function listJsonlSessionMetadata(options: JsonlSessionRepoOptions, query?: JsonlSessionListOptions): Promise<JsonlSessionMetadata[]>;
6
+ export declare function loadJsonlSessionStorage(options: JsonlSessionRepoOptions, metadata: JsonlSessionMetadata): Promise<JsonlSessionStorage>;
5
7
  export declare class JsonlSessionRepo implements SessionRepo<JsonlSessionMetadata, JsonlSessionCreateOptions, JsonlSessionListOptions> {
6
- private readonly fileSystem;
8
+ private readonly fs;
7
9
  private readonly sessionsRootInput;
8
- private readonly now;
9
- private readonly openSessions;
10
- private readonly pendingCreates;
11
- private closed;
12
- private closePromise;
10
+ private readonly activeCreateDestinations;
11
+ private rootPromise;
13
12
  constructor(options: JsonlSessionRepoOptions);
14
- create(options: JsonlSessionCreateOptions, context: Context): Promise<Session<JsonlSessionMetadata>>;
15
- open(metadata: JsonlSessionMetadata, context: Context): Promise<Session<JsonlSessionMetadata>>;
16
- list(options: JsonlSessionListOptions | undefined, context: Context): Promise<JsonlSessionMetadata[]>;
17
- delete(metadata: JsonlSessionMetadata, context: Context): Promise<void>;
18
- fork(source: JsonlSessionMetadata, options: ForkOptions, context: Context): Promise<Session<JsonlSessionMetadata>>;
19
- close(_context: Context): Promise<void>;
13
+ create(options: JsonlSessionCreateOptions): Promise<Session<JsonlSessionMetadata>>;
14
+ open(metadata: JsonlSessionMetadata): Promise<Session<JsonlSessionMetadata>>;
15
+ list(options?: JsonlSessionListOptions): Promise<JsonlSessionMetadata[]>;
16
+ delete(metadata: JsonlSessionMetadata): Promise<void>;
17
+ fork(source: JsonlSessionMetadata, options: ForkOptions & JsonlSessionCreateOptions): Promise<Session<JsonlSessionMetadata>>;
18
+ private loadStorage;
20
19
  private resolveCreateDestination;
21
- private listDirectory;
22
- private readSessionMetadata;
23
- private sessionDirectories;
20
+ /**
21
+ * Prevent same-process create/fork races for one logical destination. The durable filename includes a
22
+ * timestamp, so the async filesystem existence check alone can let two concurrent calls both decide the
23
+ * same {cwd, id} is free and publish duplicate sessions.
24
+ */
25
+ private claimCreateDestination;
26
+ private prepareCreate;
27
+ private listDirect;
28
+ private sessionIdExists;
24
29
  private sessionDirectory;
25
- private resolveNewSessionPath;
26
- private assertSessionIdAvailable;
27
- private resolveForkInput;
28
- private isLegacyV3ForkSource;
29
- private publishOpenSession;
30
- private sessionKey;
31
- private loadStorage;
32
30
  private root;
33
- private assertOpen;
34
31
  }
35
32
  //# sourceMappingURL=repo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/repo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAMrE,OAAO,EAGN,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAE5B,MAAM,YAAY,CAAC;AA0BpB,yDAAyD;AACzD,qBAAa,gBACZ,YAAW,WAAW,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,uBAAuB,CAAC;IAEhG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;IAChE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAA4B;IAEhD,YAAY,OAAO,EAAE,uBAAuB,EAI3C;IAEK,MAAM,CAAC,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CA8BzG;IAEK,IAAI,CAAC,QAAQ,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAYnG;IAEK,IAAI,CAAC,OAAO,EAAE,uBAAuB,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAoB1G;IAEK,MAAM,CAAC,QAAQ,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5E;IAEK,IAAI,CACT,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CA8CxC;IAED,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtC;YAEa,wBAAwB;YAcxB,aAAa;YAwBb,mBAAmB;YAenB,kBAAkB;YAMlB,gBAAgB;YAOhB,qBAAqB;YAarB,wBAAwB;YAcxB,gBAAgB;YAwBhB,oBAAoB;IAUlC,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,UAAU;YAIJ,WAAW;IA4BzB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,UAAU;CAGlB"}
1
+ {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../../../src/harness/session/jsonl/repo.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,OAAO,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,KAAK,WAAW,EAAgB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EACX,yBAAyB,EACzB,uBAAuB,EACvB,oBAAoB,EAEpB,uBAAuB,EAEvB,MAAM,YAAY,CAAC;AAmDpB,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,uBAAuB,EAChC,KAAK,GAAE,uBAA4B,GACjC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAmBjC;AAED,wBAAsB,uBAAuB,CAC5C,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AAOD,qBAAa,gBACZ,YAAW,WAAW,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,uBAAuB,CAAC;IAEhG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAqB;IAC9D,OAAO,CAAC,WAAW,CAA8B;IAEjD,YAAY,OAAO,EAAE,uBAAuB,EAG3C;IAEK,MAAM,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAMvF;IAEK,IAAI,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAEjF;IAEK,IAAI,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAEjF;IAEK,MAAM,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;IAEK,IAAI,CACT,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,WAAW,GAAG,yBAAyB,GAC9C,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAWxC;YAEa,WAAW;YAIX,wBAAwB;IAOtC;;;;OAIG;YACW,sBAAsB;YAgBtB,aAAa;YAgCb,UAAU;YAIV,eAAe;YAQf,gBAAgB;IAO9B,OAAO,CAAC,IAAI;CAMZ"}