@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,345 +1,225 @@
1
- import { uuidv7 } from "@earendil-works/pi-ai/utils/uuid";
2
- import { insertEntry } from "./commit.js";
3
- import { MutationLine } from "./mutation-line.js";
4
- import { appendList as appendListWrite, branchTip, deleteList as deleteListWrite, deleteValue as deleteValueWrite, entryLabel, sessionName, setValue as setValueWrite, } from "./values.js";
5
- /** Durable session state is internally inconsistent and cannot be safely advanced. */
6
- export class SessionInvariantError extends Error {
7
- constructor(message) {
8
- super(message);
9
- this.name = "SessionInvariantError";
10
- }
11
- }
12
- /** A requested Branch name is invalid. */
13
- export class SessionInvalidBranchError extends Error {
14
- constructor(branch, reason) {
15
- super(`Invalid branch ${JSON.stringify(branch)}: ${reason}`);
16
- this.name = "SessionInvalidBranchError";
17
- this.branch = branch;
18
- this.reason = reason;
19
- }
1
+ import { uuidv7 } from "@earendil-works/pi-ai";
2
+ import { SessionError } from "./types.js";
3
+ function invalidPayload(reason) {
4
+ throw new SessionError("invalid_payload", `Durable payload ${reason}`);
20
5
  }
21
- /** A requested branch already exists. */
22
- export class SessionBranchExistsError extends Error {
23
- constructor(branch) {
24
- super(`Branch already exists: ${branch}`);
25
- this.name = "SessionBranchExistsError";
26
- this.branch = branch;
6
+ function assertValidLimit(limit) {
7
+ if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {
8
+ throw new SessionError("invalid_query", "limit must be a positive integer");
27
9
  }
28
10
  }
29
- /** A pending assistant message cannot be persisted as a session entry. */
30
- export class SessionPendingAssistantMessageError extends Error {
31
- constructor() {
32
- super("Cannot persist a pending assistant message");
33
- this.name = "SessionPendingAssistantMessageError";
11
+ function assertValidCursor(afterSeq) {
12
+ if (afterSeq !== undefined && (!Number.isInteger(afterSeq) || afterSeq < 0)) {
13
+ throw new SessionError("invalid_query", "cursor sequence must be a non-negative integer");
34
14
  }
35
15
  }
36
- /** A requested session entry target does not exist. */
37
- export class SessionUnknownTargetError extends Error {
38
- constructor(targetId) {
39
- super(`Unknown target: ${targetId}`);
40
- this.name = "SessionUnknownTargetError";
41
- this.targetId = targetId;
42
- }
43
- }
44
- class StorageBackedSessionMutation {
45
- constructor(storage, release) {
46
- this.active = true;
47
- this.storage = storage;
48
- this.release = release;
49
- }
50
- commit(writes, context) {
51
- this.assertActive();
52
- if (this.commitResult !== undefined)
53
- return Promise.reject(new Error("SessionMutator commit already attempted"));
54
- try {
55
- for (const write of writes) {
56
- if (write.kind === "entry" &&
57
- write.entry.type === "message" &&
58
- write.entry.message.role === "assistant" &&
59
- write.entry.message.stopReason === "pending") {
60
- throw new SessionPendingAssistantMessageError();
61
- }
16
+ export function assertJsonSerializable(value) {
17
+ const active = new WeakSet();
18
+ const stack = [{ value }];
19
+ while (stack.length > 0) {
20
+ const frame = stack.pop();
21
+ if ("exit" in frame) {
22
+ active.delete(frame.exit);
23
+ continue;
24
+ }
25
+ const candidate = frame.value;
26
+ if (candidate === null || typeof candidate === "string" || typeof candidate === "boolean") {
27
+ continue;
28
+ }
29
+ if (typeof candidate === "number") {
30
+ if (!Number.isFinite(candidate))
31
+ invalidPayload("contains a non-finite number");
32
+ continue;
33
+ }
34
+ if (typeof candidate !== "object")
35
+ invalidPayload(`contains ${typeof candidate}`);
36
+ if (active.has(candidate))
37
+ invalidPayload("contains a cycle");
38
+ active.add(candidate);
39
+ stack.push({ exit: candidate });
40
+ if (Array.isArray(candidate)) {
41
+ if (Object.getPrototypeOf(candidate) !== Array.prototype) {
42
+ invalidPayload("contains a non-standard array");
43
+ }
44
+ if (Object.getOwnPropertySymbols(candidate).length > 0 ||
45
+ Object.getOwnPropertyNames(candidate).length !== candidate.length + 1) {
46
+ invalidPayload("contains an array with unsupported properties");
62
47
  }
63
- this.commitResult = this.storage.commit(writes, context);
48
+ for (let index = candidate.length - 1; index >= 0; index--) {
49
+ if (!Object.hasOwn(candidate, index))
50
+ invalidPayload("contains a sparse array");
51
+ const descriptor = Object.getOwnPropertyDescriptor(candidate, index);
52
+ if (!("value" in descriptor))
53
+ invalidPayload("contains an array accessor");
54
+ stack.push({ value: descriptor.value });
55
+ }
56
+ continue;
64
57
  }
65
- catch (error) {
66
- this.commitResult = Promise.reject(error);
58
+ const prototype = Object.getPrototypeOf(candidate);
59
+ if (prototype !== Object.prototype && prototype !== null) {
60
+ invalidPayload("contains a non-plain object");
61
+ }
62
+ if (Object.getOwnPropertySymbols(candidate).length > 0) {
63
+ invalidPayload("contains a symbol-keyed property");
64
+ }
65
+ const keys = Object.keys(candidate);
66
+ if (Object.getOwnPropertyNames(candidate).length !== keys.length) {
67
+ invalidPayload("contains a non-enumerable property");
68
+ }
69
+ for (let index = keys.length - 1; index >= 0; index--) {
70
+ const descriptor = Object.getOwnPropertyDescriptor(candidate, keys[index]);
71
+ if (!("value" in descriptor))
72
+ invalidPayload("contains an accessor");
73
+ stack.push({ value: descriptor.value });
67
74
  }
68
- return this.commitResult;
69
- }
70
- end(_context) {
71
- if (this.endPromise !== undefined)
72
- return this.endPromise;
73
- this.active = false;
74
- this.endPromise = this.settle().finally(this.release);
75
- return this.endPromise;
76
- }
77
- getEntries(ids, context) {
78
- this.assertActive();
79
- return this.storage.getEntries(ids, context);
80
- }
81
- getStats(context) {
82
- this.assertActive();
83
- return this.storage.getStats(context);
84
- }
85
- getValue(address, context) {
86
- this.assertActive();
87
- return this.storage.getValue(address, context);
88
- }
89
- scanValues(prefix, context) {
90
- this.assertActive();
91
- return this.storage.scanValues(prefix, context);
92
- }
93
- readList(address, options, context) {
94
- this.assertActive();
95
- return this.storage.readList(address, options, context);
96
- }
97
- scanBranch(query, context) {
98
- this.assertActive();
99
- return this.storage.scanBranch(query, context);
100
- }
101
- settle() {
102
- return (this.commitResult?.then(() => undefined, () => undefined) ?? Promise.resolve());
103
- }
104
- assertActive() {
105
- if (!this.active)
106
- throw new Error("SessionMutator cannot be used outside its mutation callback");
107
75
  }
108
76
  }
109
- class StorageBackedBranch {
110
- constructor(name, session) {
111
- this.name = name;
112
- this.session = session;
77
+ export class Session {
78
+ constructor(storage, options = {}) {
79
+ this.storage = storage;
80
+ this.idGenerator = options.idGenerator ?? { next: () => uuidv7() };
113
81
  }
114
- getTipId(context) {
115
- return this.session.getBranchTip(this.name, context);
82
+ async getMetadata() {
83
+ return this.storage.getMetadata();
116
84
  }
117
- async findEntries(query, context) {
118
- query ??= {};
119
- const start = query.start ?? (await this.getTipId(context));
85
+ view(lane) {
86
+ if (lane === "main")
87
+ return this;
88
+ return {
89
+ getLeafId: () => this.getLeafIdForLane(lane),
90
+ getEntry: (id) => this.getEntry(id),
91
+ getStats: () => this.getStats(),
92
+ getName: () => this.getName(),
93
+ setName: (name) => this.setName(name),
94
+ getLabel: (targetId) => this.getLabel(targetId),
95
+ setLabel: (targetId, label) => this.setLabel(targetId, label),
96
+ findEntries: (query) => this.queryEntries(query),
97
+ findEntry: async (query = {}) => (await this.queryEntries(query, 1))[0],
98
+ findEntriesOnBranch: (query) => this.queryBranchEntries(lane, query),
99
+ findEntryOnBranch: async (query = {}) => (await this.queryBranchEntries(lane, query, 1))[0],
100
+ appendMessage: (message) => this.appendMessageToLane(lane, message),
101
+ appendCustomEntry: (customType, data) => this.appendCustomEntryToLane(lane, customType, data),
102
+ };
103
+ }
104
+ async getLeafId() {
105
+ return this.getLeafIdForLane("main");
106
+ }
107
+ async getEntry(id) {
108
+ return this.storage.getEntry(id);
109
+ }
110
+ async getStats() {
111
+ return this.storage.getStats();
112
+ }
113
+ async getName() {
114
+ return this.storage.getName();
115
+ }
116
+ async setName(name) {
117
+ await this.storage.setName(name);
118
+ }
119
+ async getLabel(targetId) {
120
+ return this.storage.getLabel(targetId);
121
+ }
122
+ async setLabel(targetId, label) {
123
+ await this.storage.setLabel(targetId, label);
124
+ }
125
+ async findEntries(query) {
126
+ return this.queryEntries(query);
127
+ }
128
+ async findEntry(query = {}) {
129
+ return (await this.queryEntries(query, 1))[0];
130
+ }
131
+ async findEntriesOnBranch(query) {
132
+ return this.queryBranchEntries("main", query);
133
+ }
134
+ async findEntryOnBranch(query = {}) {
135
+ return (await this.queryBranchEntries("main", query, 1))[0];
136
+ }
137
+ async appendMessage(message) {
138
+ return this.appendMessageToLane("main", message);
139
+ }
140
+ async appendCustomEntry(customType, data) {
141
+ return this.appendCustomEntryToLane("main", customType, data);
142
+ }
143
+ async getLanes() {
144
+ return this.storage.getLanes();
145
+ }
146
+ async createLane(lane, at) {
147
+ await this.storage.createLane(lane, at);
148
+ }
149
+ async moveLane(lane, to) {
150
+ await this.storage.moveLane(lane, to);
151
+ }
152
+ async appendEntry(entry, lane) {
153
+ return this.commitEntry(entry, lane);
154
+ }
155
+ async appendRecord(record) {
156
+ return this.commitRecord(record);
157
+ }
158
+ async findRecords(query) {
159
+ return this.queryRecords(query);
160
+ }
161
+ async findOpenOperations(lane, options) {
162
+ assertValidLimit(options?.limit);
163
+ return this.storage.findOpenOperations(lane, options);
164
+ }
165
+ async getLog(options) {
166
+ return this.queryLog(options);
167
+ }
168
+ /** Returns the lane's current leaf, or null when empty. Throws when the lane does not exist. */
169
+ async getLeafIdForLane(lane) {
170
+ const pointer = (await this.getLanes()).find((candidate) => candidate.lane === lane);
171
+ if (!pointer)
172
+ throw new SessionError("invalid_lane", `Lane not found: ${lane}`);
173
+ return pointer.leafId;
174
+ }
175
+ async queryEntries(query = {}, resultLimit = query.limit) {
176
+ assertValidLimit(query.limit);
177
+ assertValidCursor(query.cursor?.afterSeq);
178
+ return this.storage.findEntries(resultLimit === query.limit ? query : { ...query, limit: resultLimit });
179
+ }
180
+ /**
181
+ * Queries from `query.start` toward the root, defaulting to the lane's current leaf.
182
+ * `resultLimit` lets single-entry queries cap results without changing the caller's query.
183
+ */
184
+ async queryBranchEntries(defaultLane, query = {}, resultLimit = query.limit) {
185
+ assertValidLimit(query.limit);
186
+ assertValidCursor(query.cursor?.afterSeq);
187
+ const start = query.start ?? (await this.getLeafIdForLane(defaultLane));
120
188
  if (start === null)
121
189
  return [];
122
- return this.session.scanBranch({ ...query, start, order: query.order ?? "newestFirst" }, context);
123
- }
124
- async findEntry(query, context) {
125
- query ??= {};
126
- return (await this.findEntries({ ...query, limit: query.limit === undefined ? 1 : Math.min(query.limit, 1) }, context))[0];
127
- }
128
- appendMessage(message, context) {
129
- return this.session.appendToBranch(this.name, { type: "message", message }, context);
130
- }
131
- appendCustomEntry(customType, data, context) {
132
- return this.session.appendToBranch(this.name, { type: "custom", customType, ...(data === undefined ? {} : { data }) }, context);
133
- }
134
- }
135
- /** Package-internal typed boundary shared by concrete session repositories. */
136
- export class StorageBackedSession {
137
- constructor(metadata, storage, options = {}) {
138
- this.branches = new Map();
139
- this.closedError = new Error("Session is closed");
140
- this.state = "open";
141
- this.metadata = metadata;
142
- this.idGenerator = options.idGenerator ?? { next: uuidv7 };
143
- this.storage = storage;
144
- this.mutationLine = options.mutationLine ?? new MutationLine();
145
- this.onClose = options.onClose;
146
- }
147
- async beginMutation(_context) {
148
- this.assertOpen();
149
- let grant;
150
- let rejectGrant;
151
- const granted = new Promise((resolve, reject) => {
152
- grant = resolve;
153
- rejectGrant = reject;
154
- });
155
- let release;
156
- const finished = new Promise((resolve) => {
157
- release = resolve;
158
- });
159
- const line = this.mutationLine.run(async () => {
160
- grant(new StorageBackedSessionMutation(this.storage, release));
161
- await finished;
162
- });
163
- void line.catch(rejectGrant);
164
- return granted;
165
- }
166
- async mutate(mutation, context) {
167
- const mutator = await this.beginMutation(context);
168
- try {
169
- return await mutation(mutator, context);
170
- }
171
- finally {
172
- await mutator.end(context);
173
- }
174
- }
175
- async getEntries(ids, context) {
176
- this.assertOpen();
177
- return this.storage.getEntries(ids, context);
178
- }
179
- async getEntry(id, context) {
180
- return (await this.getEntries([id], context)).get(id);
181
- }
182
- async getValue(address, context) {
183
- this.assertOpen();
184
- return this.storage.getValue(address, context);
185
- }
186
- async scanValues(prefix, context) {
187
- this.assertOpen();
188
- return this.storage.scanValues(prefix, context);
189
- }
190
- async readList(address, options, context) {
191
- this.assertOpen();
192
- return this.storage.readList(address, options, context);
193
- }
194
- async scanBranch(query, context) {
195
- this.assertOpen();
196
- return this.storage.scanBranch(query, context);
197
- }
198
- async getStats(context) {
199
- this.assertOpen();
200
- return this.storage.getStats(context);
201
- }
202
- async getName(context) {
203
- return (await this.getValue(sessionName, context))?.value;
204
- }
205
- async getLabel(targetId, context) {
206
- return (await this.getValue(entryLabel(targetId), context))?.value;
207
- }
208
- async findEntries(query, context) {
209
- query ??= {};
210
- this.assertOpen();
211
- const order = query.order ?? "desc";
212
- if (query.cursor !== undefined) {
213
- if (order === "asc" && query.cursor.seq === Number.MAX_SAFE_INTEGER)
214
- return [];
215
- if (order === "desc" && query.cursor.seq <= 1)
216
- return [];
217
- }
218
- return this.storage.scanEntries({
219
- type: query.type,
220
- customType: query.customType,
221
- order,
222
- limit: query.limit,
223
- ...(query.cursor === undefined
224
- ? {}
225
- : order === "asc"
226
- ? { fromSeq: query.cursor.seq + 1 }
227
- : { toSeq: query.cursor.seq - 1 }),
228
- }, context);
229
- }
230
- async findEntry(query, context) {
231
- query ??= {};
232
- return (await this.findEntries({ ...query, limit: query.limit === undefined ? 1 : Math.min(query.limit, 1) }, context))[0];
233
- }
234
- async branch(name, context) {
235
- this.assertValidBranchName(name);
236
- if ((await this.getValue(branchTip(name), context)) === undefined)
237
- return undefined;
238
- return this.getOrCreateBranchObject(name);
239
- }
240
- async createBranch(name, at, context) {
241
- this.assertOpen();
242
- this.assertValidBranchName(name);
243
- await this.mutate(async (mutator) => {
244
- if ((await mutator.getValue(branchTip(name), context)) !== undefined) {
245
- throw new SessionBranchExistsError(name);
246
- }
247
- if (at !== null && !(await mutator.getEntries([at], context)).has(at)) {
248
- throw new SessionUnknownTargetError(at);
249
- }
250
- await mutator.commit([setValueWrite(branchTip(name), at)], context);
251
- }, context);
252
- return this.getOrCreateBranchObject(name);
253
- }
254
- setValue(address, next, context) {
255
- return this.mutate(async (mutator) => {
256
- await mutator.commit([setValueWrite(address, next)], context);
257
- }, context);
258
- }
259
- deleteValue(address, context) {
260
- return this.mutate(async (mutator) => {
261
- await mutator.commit([deleteValueWrite(address)], context);
262
- }, context);
263
- }
264
- appendList(address, element, context) {
265
- return this.mutate(async (mutator) => {
266
- await mutator.commit([appendListWrite(address, element)], context);
267
- }, context);
268
- }
269
- deleteList(address, context) {
270
- return this.mutate(async (mutator) => {
271
- await mutator.commit([deleteListWrite(address)], context);
272
- }, context);
273
- }
274
- setName(name, context) {
275
- return name === undefined ? this.deleteValue(sessionName, context) : this.setValue(sessionName, name, context);
276
- }
277
- setLabel(targetId, label, context) {
278
- const address = entryLabel(targetId);
279
- return label === undefined ? this.deleteValue(address, context) : this.setValue(address, label, context);
280
- }
281
- close(context) {
282
- if (this.closePromise !== undefined)
283
- return this.closePromise;
284
- this.state = "closing";
285
- this.closePromise = this.mutationLine
286
- .seal(this.closedError)
287
- .then(() => this.storage.close(context))
288
- .finally(() => {
289
- this.state = "closed";
290
- this.onClose?.();
291
- });
292
- return this.closePromise;
293
- }
294
- async getBranchTip(name, context) {
295
- const stored = await this.getValue(branchTip(name), context);
296
- if (stored === undefined)
297
- throw new SessionInvariantError(`Unknown branch: ${name}`);
298
- return stored.value;
299
- }
300
- async appendToBranch(name, entry, context) {
301
- this.assertOpen();
302
- if (entry.type === "message" && entry.message.role === "assistant" && entry.message.stopReason === "pending") {
303
- throw new SessionPendingAssistantMessageError();
304
- }
305
- const id = this.idGenerator.next();
306
- await this.mutate(async (mutator) => {
307
- const tip = await mutator.getValue(branchTip(name), context);
308
- if (tip === undefined)
309
- throw new SessionInvariantError(`Unknown branch: ${name}`);
310
- await mutator.commit([
311
- insertEntry(entry.type === "message"
312
- ? { id, parentId: tip.value, type: "message", message: entry.message }
313
- : {
314
- id,
315
- parentId: tip.value,
316
- type: "custom",
317
- customType: entry.customType,
318
- ...(entry.data === undefined ? {} : { data: entry.data }),
319
- }),
320
- setValueWrite(branchTip(name), id),
321
- ], context);
322
- }, context);
323
- return id;
324
- }
325
- getOrCreateBranchObject(name) {
326
- let branch = this.branches.get(name);
327
- if (branch === undefined) {
328
- branch = new StorageBackedBranch(name, this);
329
- this.branches.set(name, branch);
190
+ const storageQuery = resultLimit === query.limit ? query : { ...query, limit: resultLimit };
191
+ return this.storage.findEntriesOnBranch({ ...storageQuery, start });
192
+ }
193
+ async queryRecords(query = {}) {
194
+ assertValidLimit(query.limit);
195
+ assertValidCursor(query.afterSeq);
196
+ if (query.operationKind !== undefined && query.type !== "operation_started") {
197
+ throw new SessionError("invalid_query", 'operationKind requires type "operation_started"');
330
198
  }
331
- return branch;
332
- }
333
- assertValidBranchName(name) {
334
- if (name.length === 0)
335
- throw new SessionInvalidBranchError(name, "branch name must not be empty");
336
- if (name.includes("\u0000")) {
337
- throw new SessionInvalidBranchError(name, "branch name must not contain \\u0000");
338
- }
339
- }
340
- assertOpen() {
341
- if (this.state !== "open")
342
- throw this.closedError;
199
+ return this.storage.findRecords(query);
200
+ }
201
+ async queryLog(options = {}) {
202
+ assertValidLimit(options.limit);
203
+ assertValidCursor(options.afterSeq);
204
+ return this.storage.getLog(options);
205
+ }
206
+ async appendMessageToLane(lane, message) {
207
+ const entry = await this.commitEntry({ type: "message", id: this.idGenerator.next(), message }, lane);
208
+ return entry.id;
209
+ }
210
+ async appendCustomEntryToLane(lane, customType, data) {
211
+ const entry = await this.commitEntry(data === undefined
212
+ ? { type: "custom", id: this.idGenerator.next(), customType }
213
+ : { type: "custom", id: this.idGenerator.next(), customType, data }, lane);
214
+ return entry.id;
215
+ }
216
+ async commitEntry(entry, lane) {
217
+ assertJsonSerializable(entry);
218
+ return this.storage.appendEntry(entry, lane);
219
+ }
220
+ async commitRecord(record) {
221
+ assertJsonSerializable(record);
222
+ return this.storage.appendRecord(record);
343
223
  }
344
224
  }
345
225
  //# sourceMappingURL=session.js.map