@earendil-works/pi-agent-core 0.84.3 → 0.85.0

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 (343) hide show
  1. package/README.md +4 -0
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +32 -25
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/harness/agent-harness.d.ts +639 -384
  6. package/dist/harness/agent-harness.d.ts.map +1 -1
  7. package/dist/harness/agent-harness.js +5 -251
  8. package/dist/harness/agent-harness.js.map +1 -1
  9. package/dist/harness/compaction/branch-summarization.d.ts +12 -6
  10. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  11. package/dist/harness/compaction/branch-summarization.js +33 -26
  12. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  13. package/dist/harness/compaction/compaction.d.ts +30 -8
  14. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  15. package/dist/harness/compaction/compaction.js +53 -63
  16. package/dist/harness/compaction/compaction.js.map +1 -1
  17. package/dist/harness/config.d.ts +9 -0
  18. package/dist/harness/config.d.ts.map +1 -0
  19. package/dist/harness/config.js +27 -0
  20. package/dist/harness/config.js.map +1 -0
  21. package/dist/harness/context.d.ts +9 -0
  22. package/dist/harness/context.d.ts.map +1 -0
  23. package/dist/harness/context.js +13 -0
  24. package/dist/harness/context.js.map +1 -0
  25. package/dist/harness/env/nodejs.d.ts +24 -28
  26. package/dist/harness/env/nodejs.d.ts.map +1 -1
  27. package/dist/harness/env/nodejs.js +242 -87
  28. package/dist/harness/env/nodejs.js.map +1 -1
  29. package/dist/harness/events.d.ts +20 -38
  30. package/dist/harness/events.d.ts.map +1 -1
  31. package/dist/harness/events.js +240 -55
  32. package/dist/harness/events.js.map +1 -1
  33. package/dist/harness/execution/assistant.d.ts +42 -0
  34. package/dist/harness/execution/assistant.d.ts.map +1 -0
  35. package/dist/harness/execution/assistant.js +82 -0
  36. package/dist/harness/execution/assistant.js.map +1 -0
  37. package/dist/harness/execution/effect-gate.d.ts +22 -0
  38. package/dist/harness/execution/effect-gate.d.ts.map +1 -0
  39. package/dist/harness/execution/effect-gate.js +49 -0
  40. package/dist/harness/execution/effect-gate.js.map +1 -0
  41. package/dist/harness/execution/tools.d.ts +67 -0
  42. package/dist/harness/execution/tools.d.ts.map +1 -0
  43. package/dist/harness/execution/tools.js +121 -0
  44. package/dist/harness/execution/tools.js.map +1 -0
  45. package/dist/harness/hooks.d.ts +38 -0
  46. package/dist/harness/hooks.d.ts.map +1 -0
  47. package/dist/harness/hooks.js +406 -0
  48. package/dist/harness/hooks.js.map +1 -0
  49. package/dist/harness/messages.d.ts +2 -2
  50. package/dist/harness/messages.d.ts.map +1 -1
  51. package/dist/harness/messages.js.map +1 -1
  52. package/dist/harness/prompt-templates.d.ts +3 -2
  53. package/dist/harness/prompt-templates.d.ts.map +1 -1
  54. package/dist/harness/prompt-templates.js +17 -17
  55. package/dist/harness/prompt-templates.js.map +1 -1
  56. package/dist/harness/result.d.ts +93 -0
  57. package/dist/harness/result.d.ts.map +1 -1
  58. package/dist/harness/result.js +40 -0
  59. package/dist/harness/result.js.map +1 -1
  60. package/dist/harness/runtime/drive/boundary.d.ts +28 -0
  61. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
  62. package/dist/harness/runtime/drive/boundary.js +170 -0
  63. package/dist/harness/runtime/drive/boundary.js.map +1 -0
  64. package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
  65. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
  66. package/dist/harness/runtime/drive/checkpoint.js +133 -0
  67. package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
  68. package/dist/harness/runtime/drive/deferred.d.ts +15 -0
  69. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
  70. package/dist/harness/runtime/drive/deferred.js +179 -0
  71. package/dist/harness/runtime/drive/deferred.js.map +1 -0
  72. package/dist/harness/runtime/drive/generation.d.ts +8 -0
  73. package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
  74. package/dist/harness/runtime/drive/generation.js +205 -0
  75. package/dist/harness/runtime/drive/generation.js.map +1 -0
  76. package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
  77. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
  78. package/dist/harness/runtime/drive/reconcile.js +140 -0
  79. package/dist/harness/runtime/drive/reconcile.js.map +1 -0
  80. package/dist/harness/runtime/drive/recovery.d.ts +8 -0
  81. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
  82. package/dist/harness/runtime/drive/recovery.js +85 -0
  83. package/dist/harness/runtime/drive/recovery.js.map +1 -0
  84. package/dist/harness/runtime/drive/response.d.ts +23 -0
  85. package/dist/harness/runtime/drive/response.d.ts.map +1 -0
  86. package/dist/harness/runtime/drive/response.js +394 -0
  87. package/dist/harness/runtime/drive/response.js.map +1 -0
  88. package/dist/harness/runtime/drive/retry.d.ts +4 -0
  89. package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
  90. package/dist/harness/runtime/drive/retry.js +37 -0
  91. package/dist/harness/runtime/drive/retry.js.map +1 -0
  92. package/dist/harness/runtime/drive/structural.d.ts +32 -0
  93. package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
  94. package/dist/harness/runtime/drive/structural.js +929 -0
  95. package/dist/harness/runtime/drive/structural.js.map +1 -0
  96. package/dist/harness/runtime/drive/terminal.d.ts +7 -0
  97. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
  98. package/dist/harness/runtime/drive/terminal.js +49 -0
  99. package/dist/harness/runtime/drive/terminal.js.map +1 -0
  100. package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
  101. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
  102. package/dist/harness/runtime/drive/tool-placement.js +244 -0
  103. package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
  104. package/dist/harness/runtime/drive/tools.d.ts +6 -0
  105. package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
  106. package/dist/harness/runtime/drive/tools.js +449 -0
  107. package/dist/harness/runtime/drive/tools.js.map +1 -0
  108. package/dist/harness/runtime/drive.d.ts +6 -0
  109. package/dist/harness/runtime/drive.d.ts.map +1 -0
  110. package/dist/harness/runtime/drive.js +93 -0
  111. package/dist/harness/runtime/drive.js.map +1 -0
  112. package/dist/harness/runtime/harness.d.ts +59 -0
  113. package/dist/harness/runtime/harness.d.ts.map +1 -0
  114. package/dist/harness/runtime/harness.js +311 -0
  115. package/dist/harness/runtime/harness.js.map +1 -0
  116. package/dist/harness/runtime/index.d.ts +2 -0
  117. package/dist/harness/runtime/index.d.ts.map +1 -0
  118. package/dist/harness/runtime/index.js +2 -0
  119. package/dist/harness/runtime/index.js.map +1 -0
  120. package/dist/harness/runtime/lane.d.ts +101 -0
  121. package/dist/harness/runtime/lane.d.ts.map +1 -0
  122. package/dist/harness/runtime/lane.js +1575 -0
  123. package/dist/harness/runtime/lane.js.map +1 -0
  124. package/dist/harness/runtime/progress.d.ts +15 -0
  125. package/dist/harness/runtime/progress.d.ts.map +1 -0
  126. package/dist/harness/runtime/progress.js +66 -0
  127. package/dist/harness/runtime/progress.js.map +1 -0
  128. package/dist/harness/runtime/reducer.d.ts +5 -0
  129. package/dist/harness/runtime/reducer.d.ts.map +1 -0
  130. package/dist/harness/runtime/reducer.js +240 -0
  131. package/dist/harness/runtime/reducer.js.map +1 -0
  132. package/dist/harness/runtime/restore.d.ts +24 -0
  133. package/dist/harness/runtime/restore.d.ts.map +1 -0
  134. package/dist/harness/runtime/restore.js +117 -0
  135. package/dist/harness/runtime/restore.js.map +1 -0
  136. package/dist/harness/runtime/transcript.d.ts +21 -0
  137. package/dist/harness/runtime/transcript.d.ts.map +1 -0
  138. package/dist/harness/runtime/transcript.js +72 -0
  139. package/dist/harness/runtime/transcript.js.map +1 -0
  140. package/dist/harness/runtime/types.d.ts +105 -0
  141. package/dist/harness/runtime/types.d.ts.map +1 -0
  142. package/dist/harness/runtime/types.js +61 -0
  143. package/dist/harness/runtime/types.js.map +1 -0
  144. package/dist/harness/session/commit.d.ts +53 -0
  145. package/dist/harness/session/commit.d.ts.map +1 -0
  146. package/dist/harness/session/commit.js +57 -0
  147. package/dist/harness/session/commit.js.map +1 -0
  148. package/dist/harness/session/context.d.ts +6 -18
  149. package/dist/harness/session/context.d.ts.map +1 -1
  150. package/dist/harness/session/context.js +31 -49
  151. package/dist/harness/session/context.js.map +1 -1
  152. package/dist/harness/session/fork-policy.d.ts +13 -0
  153. package/dist/harness/session/fork-policy.d.ts.map +1 -0
  154. package/dist/harness/session/fork-policy.js +22 -0
  155. package/dist/harness/session/fork-policy.js.map +1 -0
  156. package/dist/harness/session/fork.d.ts +18 -0
  157. package/dist/harness/session/fork.d.ts.map +1 -0
  158. package/dist/harness/session/fork.js +127 -0
  159. package/dist/harness/session/fork.js.map +1 -0
  160. package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
  161. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
  162. package/dist/harness/session/in-memory-storage-state.js +216 -0
  163. package/dist/harness/session/in-memory-storage-state.js.map +1 -0
  164. package/dist/harness/session/index.d.ts +9 -5
  165. package/dist/harness/session/index.d.ts.map +1 -1
  166. package/dist/harness/session/index.js +7 -4
  167. package/dist/harness/session/index.js.map +1 -1
  168. package/dist/harness/session/jsonl/codec.d.ts +19 -8
  169. package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
  170. package/dist/harness/session/jsonl/codec.js +34 -218
  171. package/dist/harness/session/jsonl/codec.js.map +1 -1
  172. package/dist/harness/session/jsonl/index.d.ts +4 -0
  173. package/dist/harness/session/jsonl/index.d.ts.map +1 -0
  174. package/dist/harness/session/jsonl/index.js +4 -0
  175. package/dist/harness/session/jsonl/index.js.map +1 -0
  176. package/dist/harness/session/jsonl/legacy-v3.d.ts +18 -0
  177. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
  178. package/dist/harness/session/jsonl/legacy-v3.js +383 -0
  179. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
  180. package/dist/harness/session/jsonl/repo.d.ts +26 -19
  181. package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  182. package/dist/harness/session/jsonl/repo.js +266 -156
  183. package/dist/harness/session/jsonl/repo.js.map +1 -1
  184. package/dist/harness/session/jsonl/storage.d.ts +39 -41
  185. package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  186. package/dist/harness/session/jsonl/storage.js +238 -181
  187. package/dist/harness/session/jsonl/storage.js.map +1 -1
  188. package/dist/harness/session/jsonl/types.d.ts +23 -22
  189. package/dist/harness/session/jsonl/types.d.ts.map +1 -1
  190. package/dist/harness/session/jsonl/types.js +2 -1
  191. package/dist/harness/session/jsonl/types.js.map +1 -1
  192. package/dist/harness/session/memory.d.ts +46 -40
  193. package/dist/harness/session/memory.d.ts.map +1 -1
  194. package/dist/harness/session/memory.js +346 -113
  195. package/dist/harness/session/memory.js.map +1 -1
  196. package/dist/harness/session/mutation-line.d.ts +8 -0
  197. package/dist/harness/session/mutation-line.d.ts.map +1 -0
  198. package/dist/harness/session/mutation-line.js +21 -0
  199. package/dist/harness/session/mutation-line.js.map +1 -0
  200. package/dist/harness/session/session.d.ts +78 -46
  201. package/dist/harness/session/session.d.ts.map +1 -1
  202. package/dist/harness/session/session.js +343 -209
  203. package/dist/harness/session/session.js.map +1 -1
  204. package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
  205. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
  206. package/dist/harness/session/testing/benchmark/datasets.js +24 -0
  207. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
  208. package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
  209. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
  210. package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
  211. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
  212. package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
  213. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
  214. package/dist/harness/session/testing/benchmark/storage.js +114 -0
  215. package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
  216. package/dist/harness/session/testing/conformance/session-repo.d.ts +21 -0
  217. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
  218. package/dist/harness/session/testing/conformance/session-repo.js +590 -0
  219. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
  220. package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
  221. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
  222. package/dist/harness/session/testing/conformance/storage.js +600 -0
  223. package/dist/harness/session/testing/conformance/storage.js.map +1 -0
  224. package/dist/harness/session/testing/gating-storage.d.ts +26 -0
  225. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
  226. package/dist/harness/session/testing/gating-storage.js +100 -0
  227. package/dist/harness/session/testing/gating-storage.js.map +1 -0
  228. package/dist/harness/session/testing/index.d.ts +9 -2
  229. package/dist/harness/session/testing/index.d.ts.map +1 -1
  230. package/dist/harness/session/testing/index.js +8 -1
  231. package/dist/harness/session/testing/index.js.map +1 -1
  232. package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
  233. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
  234. package/dist/harness/session/testing/instrumented-storage.js +16 -0
  235. package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
  236. package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
  237. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
  238. package/dist/harness/session/testing/storage-decorator.js +41 -0
  239. package/dist/harness/session/testing/storage-decorator.js.map +1 -0
  240. package/dist/harness/session/testing/types.d.ts +5 -7
  241. package/dist/harness/session/testing/types.d.ts.map +1 -1
  242. package/dist/harness/session/testing/types.js.map +1 -1
  243. package/dist/harness/session/types.d.ts +424 -259
  244. package/dist/harness/session/types.d.ts.map +1 -1
  245. package/dist/harness/session/types.js +7 -8
  246. package/dist/harness/session/types.js.map +1 -1
  247. package/dist/harness/session/values.d.ts +95 -0
  248. package/dist/harness/session/values.d.ts.map +1 -0
  249. package/dist/harness/session/values.js +81 -0
  250. package/dist/harness/session/values.js.map +1 -0
  251. package/dist/harness/skills.d.ts +3 -2
  252. package/dist/harness/skills.d.ts.map +1 -1
  253. package/dist/harness/skills.js +29 -26
  254. package/dist/harness/skills.js.map +1 -1
  255. package/dist/harness/telemetry.d.ts +64 -43
  256. package/dist/harness/telemetry.d.ts.map +1 -1
  257. package/dist/harness/telemetry.js +45 -26
  258. package/dist/harness/telemetry.js.map +1 -1
  259. package/dist/harness/tools/bash.d.ts +4 -4
  260. package/dist/harness/tools/bash.d.ts.map +1 -1
  261. package/dist/harness/tools/bash.js +66 -93
  262. package/dist/harness/tools/bash.js.map +1 -1
  263. package/dist/harness/tools/edit.d.ts.map +1 -1
  264. package/dist/harness/tools/edit.js +10 -10
  265. package/dist/harness/tools/edit.js.map +1 -1
  266. package/dist/harness/tools/file-mutation-queue.d.ts +2 -1
  267. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  268. package/dist/harness/tools/file-mutation-queue.js +5 -5
  269. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  270. package/dist/harness/tools/path-utils.d.ts +3 -2
  271. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  272. package/dist/harness/tools/path-utils.js +5 -5
  273. package/dist/harness/tools/path-utils.js.map +1 -1
  274. package/dist/harness/tools/read.d.ts +2 -1
  275. package/dist/harness/tools/read.d.ts.map +1 -1
  276. package/dist/harness/tools/read.js +4 -6
  277. package/dist/harness/tools/read.js.map +1 -1
  278. package/dist/harness/tools/write.d.ts.map +1 -1
  279. package/dist/harness/tools/write.js +7 -7
  280. package/dist/harness/tools/write.js.map +1 -1
  281. package/dist/harness/types.d.ts +108 -45
  282. package/dist/harness/types.d.ts.map +1 -1
  283. package/dist/harness/types.js.map +1 -1
  284. package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
  285. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
  286. package/dist/harness/utils/adaptive-publisher.js +79 -0
  287. package/dist/harness/utils/adaptive-publisher.js.map +1 -0
  288. package/dist/harness/utils/output-capture.d.ts +31 -0
  289. package/dist/harness/utils/output-capture.d.ts.map +1 -0
  290. package/dist/harness/utils/output-capture.js +217 -0
  291. package/dist/harness/utils/output-capture.js.map +1 -0
  292. package/dist/harness/utils/shell-output.d.ts +12 -5
  293. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  294. package/dist/harness/utils/shell-output.js +64 -174
  295. package/dist/harness/utils/shell-output.js.map +1 -1
  296. package/dist/harness/utils/truncate.d.ts +1 -0
  297. package/dist/harness/utils/truncate.d.ts.map +1 -1
  298. package/dist/harness/utils/truncate.js +1 -1
  299. package/dist/harness/utils/truncate.js.map +1 -1
  300. package/dist/harness/utils/usage.d.ts +4 -0
  301. package/dist/harness/utils/usage.d.ts.map +1 -0
  302. package/dist/harness/utils/usage.js +33 -0
  303. package/dist/harness/utils/usage.js.map +1 -0
  304. package/dist/index.d.ts +4 -1
  305. package/dist/index.d.ts.map +1 -1
  306. package/dist/index.js +3 -6
  307. package/dist/index.js.map +1 -1
  308. package/dist/proxy.d.ts +2 -0
  309. package/dist/proxy.d.ts.map +1 -1
  310. package/dist/proxy.js +40 -10
  311. package/dist/proxy.js.map +1 -1
  312. package/dist/search/index.d.ts +24 -16
  313. package/dist/search/index.d.ts.map +1 -1
  314. package/dist/search/index.js +1 -1
  315. package/dist/search/index.js.map +1 -1
  316. package/dist/types.d.ts +5 -2
  317. package/dist/types.d.ts.map +1 -1
  318. package/dist/types.js.map +1 -1
  319. package/package.json +25 -4
  320. package/dist/harness/reducer.d.ts +0 -100
  321. package/dist/harness/reducer.d.ts.map +0 -1
  322. package/dist/harness/reducer.js +0 -415
  323. package/dist/harness/reducer.js.map +0 -1
  324. package/dist/harness/session/jsonl/errors.d.ts +0 -9
  325. package/dist/harness/session/jsonl/errors.d.ts.map +0 -1
  326. package/dist/harness/session/jsonl/errors.js +0 -19
  327. package/dist/harness/session/jsonl/errors.js.map +0 -1
  328. package/dist/harness/session/jsonl.d.ts +0 -3
  329. package/dist/harness/session/jsonl.d.ts.map +0 -1
  330. package/dist/harness/session/jsonl.js +0 -2
  331. package/dist/harness/session/jsonl.js.map +0 -1
  332. package/dist/harness/session/state.d.ts +0 -65
  333. package/dist/harness/session/state.d.ts.map +0 -1
  334. package/dist/harness/session/state.js +0 -319
  335. package/dist/harness/session/state.js.map +0 -1
  336. package/dist/harness/session/testing/conformance.d.ts +0 -4
  337. package/dist/harness/session/testing/conformance.d.ts.map +0 -1
  338. package/dist/harness/session/testing/conformance.js +0 -762
  339. package/dist/harness/session/testing/conformance.js.map +0 -1
  340. package/dist/search/scanning.d.ts +0 -29
  341. package/dist/search/scanning.d.ts.map +0 -1
  342. package/dist/search/scanning.js +0 -103
  343. package/dist/search/scanning.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harness/session/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StopReason, Usage } from \"@earendil-works/pi-ai\";\nimport \"../messages.ts\";\nimport type { AgentMessage } from \"../../types.ts\";\nimport type { Session } from \"./session.ts\";\n\nexport type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };\n\nexport type SessionStopReason = Exclude<StopReason, \"pending\"> | \"deferred\";\n\nexport interface IdGenerator {\n\tnext(): string;\n}\n\nexport interface EntryBase {\n\ttype: string;\n\tid: string;\n\tseq: number; // shared sequence; read-side, storage-assigned\n\tparentId: string | null; // storage-assigned: the appending lane's leaf\n\ttimestamp: number; // Unix ms, storage-assigned\n}\n\nexport interface MessageEntry extends EntryBase {\n\ttype: \"message\";\n\tmessage: AgentMessage;\n\tterminate?: true;\n}\n\nexport interface ModelChangeEntry extends EntryBase {\n\ttype: \"model_change\";\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport interface ThinkingLevelEntry extends EntryBase {\n\ttype: \"thinking_level_change\";\n\tthinkingLevel: string;\n}\n\nexport interface ActiveToolsEntry extends EntryBase {\n\ttype: \"active_tools_change\";\n\tactiveToolNames: string[];\n}\n\nexport interface CompactionEntry extends EntryBase {\n\ttype: \"compaction\";\n\tsummary: string;\n\tretainedTail: AgentMessage[];\n\ttokensBefore: number;\n\tdetails?: unknown;\n\tusage?: Usage;\n}\n\nexport interface BranchSummaryEntry extends EntryBase {\n\ttype: \"branch_summary\";\n\tfromId: string;\n\tsummary: string;\n\tdetails?: unknown;\n\tusage?: Usage;\n}\n\nexport interface CustomEntry extends EntryBase {\n\ttype: \"custom\";\n\tcustomType: string;\n\tdata?: unknown;\n}\n\nexport type Entry =\n\t| MessageEntry\n\t| ModelChangeEntry\n\t| ThinkingLevelEntry\n\t| ActiveToolsEntry\n\t| CompactionEntry\n\t| BranchSummaryEntry\n\t| CustomEntry;\n\nexport type ProvisionedEntry<TEntry extends Entry = Entry> = TEntry extends Entry\n\t? Omit<TEntry, \"parentId\" | \"seq\" | \"timestamp\">\n\t: never;\n\nexport interface RecordBase {\n\tid: string;\n\tseq: number;\n\tlane: string;\n\ttimestamp: number;\n}\n\nexport interface OperationStartedRecord extends RecordBase {\n\ttype: \"operation_started\";\n\tsourceLeafId: string | null;\n\tintent:\n\t\t| {\n\t\t\t\tkind: \"run\";\n\t\t\t\t/** Normalized caller input before before_run; kept for suspended operations and before_resume. */\n\t\t\t\toriginalPrompt: AgentMessage[];\n\t\t\t\t/** Captured nextRun items, then the prompt, then before_run injections. */\n\t\t\t\tinitialMessages: ProvisionedEntry[];\n\t\t\t\tsystemPromptOverride?: string;\n\t\t\t\tresumeData?: { [extensionId: string]: JsonValue };\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"compaction\";\n\t\t\t\tcustomInstructions?: string;\n\t\t\t\tresultEntryId: string;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"navigation\";\n\t\t\t\ttargetId: string | null;\n\t\t\t\tsummarize: boolean;\n\t\t\t\tcustomInstructions?: string;\n\t\t\t\tlabel?: string;\n\t\t\t\tsummaryEntryId?: string;\n\t\t };\n}\n\nexport interface AbortRequestedRecord extends RecordBase {\n\ttype: \"abort_requested\";\n\trunId: string;\n}\n\nexport interface OperationFinishedRecord extends RecordBase {\n\ttype: \"operation_finished\";\n\trunId: string;\n\toutcome: \"completed\" | \"aborted\" | \"failed\" | \"declined\";\n\terror?: { code: string; message: string };\n}\n\nexport type CompactionReason = \"manual\" | \"threshold\" | \"overflow\";\n\nexport type StepAttemptRecord = RecordBase &\n\t(\n\t\t| {\n\t\t\t\ttype: \"step_attempt\";\n\t\t\t\trunId: string;\n\t\t\t\tstep: \"assistant\" | \"branch_summary\";\n\t\t\t\tattempt: number;\n\t\t\t\tresultEntryId: string;\n\t\t\t\tcompactionReason?: never;\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"step_attempt\";\n\t\t\t\trunId: string;\n\t\t\t\tstep: \"compaction\";\n\t\t\t\tattempt: number;\n\t\t\t\tresultEntryId: string;\n\t\t\t\t/** Persists why compaction summary generation started so recovery resumes the same work. */\n\t\t\t\tcompactionReason: CompactionReason;\n\t\t }\n\t);\n\nexport interface ToolStartedRecord extends RecordBase {\n\ttype: \"tool_started\";\n\trunId: string;\n\tassistantEntryId: string;\n\ttoolIndex: number;\n\ttoolCallId: string;\n\ttoolName: string;\n\teffectiveArgs: { [key: string]: unknown };\n\tresultEntryId: string;\n\treplay: \"never\" | \"safe\";\n}\n\nexport type QueueEnqueuedRecord = RecordBase &\n\t(\n\t\t| {\n\t\t\t\ttype: \"queue_enqueued\";\n\t\t\t\tqueue: \"steer\" | \"followUp\";\n\t\t\t\trunId: string;\n\t\t\t\ttarget: ProvisionedEntry;\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"queue_enqueued\";\n\t\t\t\tqueue: \"nextRun\";\n\t\t\t\trunId?: never;\n\t\t\t\ttarget: ProvisionedEntry;\n\t\t }\n\t);\n\nexport interface QueueCancelledRecord extends RecordBase {\n\ttype: \"queue_cancelled\";\n\trunId?: string;\n\tentryId: string;\n}\n\nexport interface WriteDeferredRecord extends RecordBase {\n\ttype: \"write_deferred\";\n\trunId: string;\n\ttarget: ProvisionedEntry;\n}\n\nexport type UsageRecord = RecordBase & { type: \"usage\"; usage: Usage } & (\n\t\t| {\n\t\t\t\tcause: \"assistant\" | \"compaction\" | \"branch_summary\" | \"deferred_fetch\";\n\t\t\t\trunId: string;\n\t\t\t\tentryId: string;\n\t\t\t\tattempt: number;\n\t\t\t\tstopReason: SessionStopReason;\n\t\t }\n\t\t| { cause: \"tool\"; runId: string; entryId: string; toolCallId: string }\n\t\t| { cause: \"hook\"; runId: string; entryId: string }\n\t\t| { cause: \"adjustment\"; runId?: string; entryId?: string; details?: JsonValue }\n\t);\n\nexport type LaneRecord =\n\t| OperationStartedRecord\n\t| AbortRequestedRecord\n\t| OperationFinishedRecord\n\t| StepAttemptRecord\n\t| ToolStartedRecord\n\t| QueueEnqueuedRecord\n\t| QueueCancelledRecord\n\t| WriteDeferredRecord\n\t| UsageRecord;\nexport type NewRecord<TRecord extends LaneRecord = LaneRecord> = TRecord extends LaneRecord\n\t? Omit<TRecord, \"seq\" | \"timestamp\">\n\t: never;\n\nexport type EntryOrder = \"newestFirst\" | \"oldestFirst\";\n\nexport interface EntryCursor {\n\tafterSeq: number;\n}\n\nexport interface EntryQuery {\n\ttype?: Entry[\"type\"];\n\tcustomType?: string; // for type \"custom\"\n\torder?: EntryOrder; // default newestFirst\n\tlimit?: number;\n\tcursor?: EntryCursor;\n}\n\n/** Bounds of a branch scan. Default: the whole path, leaf to root. */\nexport interface BranchBounds {\n\tstart?: string; // default: the view's lane leaf\n\tstopAtType?: Entry[\"type\"]; // scan ends after the first match, inclusive\n\tstopAtId?: string;\n}\n\nexport interface RecordQuery {\n\t/** Exact lane match. Omit to query every lane. */\n\tlane?: string;\n\t/** Exact record discriminant match. Omit to query every record type. */\n\ttype?: LaneRecord[\"type\"];\n\t/**\n\t * Operation identity. Matches OperationStartedRecord.id and the runId\n\t * property of operation-owned records. Records without an operation\n\t * identity do not match.\n\t */\n\trunId?: string;\n\t/** Exact operation intent kind. Valid only with type \"operation_started\". */\n\toperationKind?: OperationStartedRecord[\"intent\"][\"kind\"];\n\t/** Exclusive chronological lower bound: seq > afterSeq, regardless of order. */\n\tafterSeq?: number;\n\t/** Sequence order. Default: \"newestFirst\". */\n\torder?: EntryOrder;\n\t/** Positive maximum number of matching records. */\n\tlimit?: number;\n}\n\nexport interface SessionMetadata {\n\tid: string;\n\tcreatedAt: number;\n\tparentSessionId?: string;\n}\n\nexport interface SessionStats {\n\tmessageCount: number;\n\tcachedTokens: number;\n\tuncachedTokens: number;\n\ttotalTokens: number;\n\tcostTotal: number;\n}\n\nexport interface LanePointer {\n\tlane: string;\n\tleafId: string | null;\n}\n\nexport type LogItem =\n\t| { kind: \"entry\"; seq: number; entry: Entry }\n\t| { kind: \"record\"; seq: number; record: LaneRecord }\n\t| { kind: \"lane\"; seq: number; lane: string; leafId: string | null }\n\t| { kind: \"fact\"; seq: number; fact: \"name\"; name: string | undefined }\n\t| { kind: \"fact\"; seq: number; fact: \"label\"; targetId: string; label: string | undefined };\n\nexport interface LogOptions {\n\tafterSeq?: number;\n\tlimit?: number;\n}\n\nexport interface SessionStorage<TMetadata extends SessionMetadata = SessionMetadata> {\n\tgetMetadata(): Promise<TMetadata>;\n\n\t// Lanes\n\tgetLanes(): Promise<{ lane: string; leafId: string | null }[]>;\n\tcreateLane(lane: string, at: string | null): Promise<void>;\n\tmoveLane(lane: string, to: string | null): Promise<void>;\n\n\t// Entries and Records\n\tappendEntry<TEntry extends Entry>(entry: ProvisionedEntry<TEntry>, lane: string): Promise<TEntry>;\n\tappendRecord<TRecord extends LaneRecord>(record: NewRecord<TRecord>): Promise<TRecord>;\n\n\t// Reads\n\tgetEntry(id: string): Promise<Entry | undefined>;\n\tfindEntries(query?: EntryQuery): Promise<Entry[]>;\n\t/** start is mandatory here (as opposed to SessionTree's findEntriesOnBranch); defaulting to a lane's leaf is view sugar. */\n\tfindEntriesOnBranch(query: EntryQuery & BranchBounds & { start: string }): Promise<Entry[]>;\n\tfindRecords<K extends LaneRecord[\"type\"]>(\n\t\tquery: RecordQuery & { type: K },\n\t): Promise<Extract<LaneRecord, { type: K }>[]>;\n\tfindRecords(query?: RecordQuery): Promise<LaneRecord[]>;\n\t/**\n\t * Returns unfinished operation starts newest first. Recovery uses `limit: 2`:\n\t * zero results mean the lane is idle, one means it is suspended, and two\n\t * mean at least two operations are open, which is corruption. Further\n\t * results provide no additional recovery state.\n\t */\n\tfindOpenOperations(lane: string, options?: { limit?: number }): Promise<OperationStartedRecord[]>;\n\tgetLog(options?: { afterSeq?: number; limit?: number }): Promise<LogItem[]>;\n\n\t// Global facts\n\tgetName(): Promise<string | undefined>;\n\tsetName(name: string | undefined): Promise<void>;\n\tgetLabel(id: string): Promise<string | undefined>;\n\tsetLabel(id: string, label: string | undefined): Promise<void>;\n\tgetStats(): Promise<SessionStats>;\n}\n\nexport interface SessionTree {\n\tgetLeafId(): Promise<string | null>;\n\tgetEntry(id: string): Promise<Entry | undefined>;\n\tgetStats(): Promise<SessionStats>;\n\n\t// Global facts. Latest wins; not branch-scoped. \"set\", not \"append\":\n\t// append vocabulary is reserved for tree writes.\n\tgetName(): Promise<string | undefined>;\n\tsetName(name: string | undefined): Promise<void>;\n\tgetLabel(targetId: string): Promise<string | undefined>;\n\tsetLabel(targetId: string, label: string | undefined): Promise<void>;\n\n\t/** Session-wide, all branches, sequence order. */\n\tfindEntries(query?: EntryQuery): Promise<Entry[]>;\n\tfindEntry(query?: EntryQuery): Promise<Entry | undefined>;\n\n\t/** Branch-scoped: the path from start toward root. */\n\tfindEntriesOnBranch(query?: EntryQuery & BranchBounds): Promise<Entry[]>;\n\tfindEntryOnBranch(query?: EntryQuery & BranchBounds): Promise<Entry | undefined>;\n\n\t// Writes. Resolve on durable acceptance; the returned id is the entry's\n\t// id (provisioned when the write defers).\n\tappendMessage(message: AgentMessage): Promise<string>;\n\tappendCustomEntry(customType: string, data?: unknown): Promise<string>;\n}\n\nexport interface SessionCreateOptions {\n\tid?: string;\n\tparentSessionId?: string;\n}\n\nexport type ForkOptions = { scope?: \"branch\"; entryId?: string; position?: \"before\" | \"at\" } | { scope: \"tree\" };\n\nexport interface SessionRepo<\n\tTMetadata extends SessionMetadata = SessionMetadata,\n\tTCreateOptions extends SessionCreateOptions = SessionCreateOptions,\n\tTListOptions = void,\n> {\n\tcreate(options: TCreateOptions): Promise<Session<TMetadata>>;\n\t/** Opens the session for writing and acquires any backend writer claim. */\n\topen(metadata: TMetadata): Promise<Session<TMetadata>>;\n\t/** Lists session metadata without opening sessions or acquiring writer claims. */\n\tlist(options?: TListOptions): Promise<TMetadata[]>;\n\tdelete(metadata: TMetadata): Promise<void>;\n\tfork(source: TMetadata, options: ForkOptions & TCreateOptions): Promise<Session<TMetadata>>;\n}\n\nexport type SessionErrorCode =\n\t| \"not_found\"\n\t| \"already_exists\"\n\t| \"invalid_entry\"\n\t| \"invalid_payload\"\n\t| \"invalid_lane\"\n\t| \"invalid_query\"\n\t| \"invalid_fork_target\"\n\t| \"storage\";\n\nexport class SessionError extends Error {\n\treadonly code: SessionErrorCode;\n\n\tconstructor(code: SessionErrorCode, message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"SessionError\";\n\t\tthis.code = code;\n\t}\n}\n"]}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harness/session/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"@earendil-works/chord\";\nimport type { AssistantMessage, StopReason, Usage } from \"@earendil-works/pi-ai\";\nimport type { AgentMessage, QueueMode, ThinkingLevel } from \"../../types.ts\";\nimport type { BranchPreparation } from \"../compaction/branch-summarization.ts\";\nimport type { CompactionPreparation, CompactionSettings } from \"../compaction/compaction.ts\";\nimport type { Context } from \"../context.ts\";\nimport type { AgentHarnessStreamOptions } from \"../types.ts\";\nimport type { ListElement, ListReadOptions, ListWrite, StoredValue, Value, ValueList, ValueWrite } from \"./values.ts\";\n\nexport type { JsonValue } from \"@earendil-works/chord\";\n\nexport type SettledAssistantMessage = AssistantMessage & {\n\tstopReason: Exclude<StopReason, \"pending\">;\n};\n\nexport type EntryType = \"message\" | \"compaction\" | \"branch_summary\" | \"custom\";\n\nexport interface EntryBase {\n\tid: string;\n\tparentId: string | null;\n\tseq: number;\n\ttimestamp: number;\n\ttype: EntryType;\n\tcustomType?: string;\n}\n\nexport interface MessageEntry extends EntryBase {\n\ttype: \"message\";\n\tmessage: AgentMessage;\n\tterminate?: true;\n}\n\nexport interface CompactionEntry extends EntryBase {\n\ttype: \"compaction\";\n\tsummary: string;\n\tretainedTail: AgentMessage[];\n\ttokensBefore: number;\n\tdetails?: JsonValue;\n\tusage?: Usage;\n\tfromHook: boolean;\n}\n\nexport interface BranchSummaryEntry extends EntryBase {\n\ttype: \"branch_summary\";\n\tfromId: string | null;\n\tsummary: string;\n\tdetails?: JsonValue;\n\tusage?: Usage;\n\tfromHook: boolean;\n}\n\nexport interface CustomEntry extends EntryBase {\n\ttype: \"custom\";\n\tcustomType: string;\n\tdata?: JsonValue;\n}\n\n/** Convert an application-defined custom entry into model context. */\nexport type EntryProjector = (\n\tentry: CustomEntry,\n\tcontext: Context,\n) => AgentMessage[] | undefined | Promise<AgentMessage[] | undefined>;\n\nexport type Entry = MessageEntry | CompactionEntry | BranchSummaryEntry | CustomEntry;\n\n/** Entry supplied to a transaction before storage assigns sequence and timestamp. */\nexport type NewEntry<TEntry extends Entry = Entry> = TEntry extends Entry ? Omit<TEntry, \"seq\" | \"timestamp\"> : never;\n\nexport interface LaneConfiguration {\n\tmodel: { provider: string; modelId: string };\n\tthinkingLevel: ThinkingLevel;\n\tactiveToolNames: string[];\n}\n\nexport interface OperationMeta {\n\toperationId: string;\n\tlane: string;\n\tsourceTipId: string | null;\n\tstartedAt: number;\n\tintent:\n\t\t| { kind: \"run\"; promptEntryIds: string[] }\n\t\t| { kind: \"compaction\"; customInstructions?: string }\n\t\t| {\n\t\t\t\tkind: \"navigation\";\n\t\t\t\ttargetId: string | null;\n\t\t\t\tsummarize: boolean;\n\t\t\t\tlabel?: string;\n\t\t\t\tcustomInstructions?: string;\n\t\t };\n}\n\nexport type Control =\n\t| { status: \"running\" }\n\t| {\n\t\t\tstatus: \"cancel_requested\";\n\t\t\trequestedAt: number;\n\t };\n\nexport interface OperationError {\n\tcode: string;\n\tmessage: string;\n\tdetails?: JsonValue;\n}\n\nexport type TerminalStatus = \"completed\" | \"declined\" | \"aborted\" | \"failed\";\n\n/** Immutable lane-lived observation record written by one terminal transaction. */\nexport interface OperationResultRecord {\n\toperationId: string;\n\tkind: OperationMeta[\"intent\"][\"kind\"];\n\tstatus: TerminalStatus;\n\terror?: OperationError;\n\tfromTipId: string | null;\n\ttipId: string | null;\n\tstartedAt: number;\n\tendedAt: number;\n}\n\nexport type Continuation =\n\t| { kind: \"need_assistant\"; overflowRecoveryUsed: boolean }\n\t| { kind: \"may_finish\"; includeFinalAssistant: boolean };\n\n/** Checkpoint payload; the flat leaf literal replaces the old nested phase tag. */\nexport interface CheckpointData {\n\tcontinuation: Continuation;\n\ttriggerEntryId: string;\n}\n\nexport type InboxItemKind = \"steer\" | \"followUp\" | \"nextRun\" | \"write\";\n\nexport interface InboxItem {\n\tentryId: string;\n\tkind: InboxItemKind;\n}\n\nexport interface NormalizedRetryPolicy {\n\tmaxAttempts: number;\n\tbaseDelayMs: number;\n}\n\nexport interface GenerationContext {\n\tstepId: string;\n\ttriggerEntryId: string;\n\tconfiguration: LaneConfiguration;\n\tstreamOptions: AgentHarnessStreamOptions;\n\tretryPolicy: NormalizedRetryPolicy;\n\toverflowRecoveryUsed: boolean;\n}\n\ninterface ToolCallSource {\n\t/** Zero-based index in the assistant message's complete content array, not a filtered tool-call ordinal. */\n\tsourceIndex: number;\n\tresultEntryId: string;\n}\n\nexport type ToolCall = ToolCallSource &\n\t(\n\t\t| { status: \"planned\" }\n\t\t| { status: \"effect_pending\"; replay: \"never\" | \"safe\" }\n\t\t| { status: \"outcome_ready\"; terminate: boolean }\n\t\t| { status: \"completed\"; terminate: boolean }\n\t);\n\nexport interface ToolBatch {\n\tassistantEntryId: string;\n\tconfiguration: LaneConfiguration;\n\tturnId: string;\n\tcalls: ToolCall[];\n}\n\nexport interface SummaryContext {\n\tresultEntryId: string;\n\tconfiguration: LaneConfiguration;\n\tstreamOptions: AgentHarnessStreamOptions;\n\tretryPolicy: NormalizedRetryPolicy;\n}\n\n/*\n * Durable operation state is one flat union with one family-neutral discriminator\n * per dispatcher leaf. ToolBatch/ToolCall remain the nested child collection state\n * machine, and cancellation stays orthogonal via Control.\n */\n\nexport interface Cancellable {\n\tcontrol: Control;\n}\n\nexport interface RunSettings {\n\tcompaction: CompactionSettings;\n\tsteeringMode: QueueMode;\n\tfollowUpMode: QueueMode;\n\ttoolExecution: \"sequential\" | \"parallel\";\n}\n\n/** Uniform scope carried by every operation leaf. */\nexport interface OperationScope extends Cancellable {\n\tsettings: RunSettings;\n\tlatestAssistantEntryId: string | null;\n}\n\n/** Shared backoff data for every retry-wait leaf. */\nexport interface RetryWait {\n\tnextAttempt: number;\n\tnotBefore: number;\n\terrorMessage: string;\n}\n\nexport interface AssistantGenerationScope {\n\tgenerationContext: GenerationContext;\n}\n\nexport type ResultBoundary =\n\t| { kind: \"resume_checkpoint\"; resumeAfter: CheckpointData }\n\t| { kind: \"finish\" }\n\t| { kind: \"commit_navigation\"; targetId: string; label?: string };\n\nexport interface SummaryTask {\n\ttaskId: string;\n\treason?: \"manual\" | \"threshold\" | \"overflow\";\n\tcustomInstructions?: string;\n\tboundary: ResultBoundary;\n}\n\nexport interface SummaryGenerationScope {\n\ttask: SummaryTask;\n\tsummaryContext: SummaryContext;\n}\n\nexport interface SummaryGenerationReady extends SummaryGenerationScope {\n\tnextAttempt: number;\n}\n\nexport interface SummaryGenerationEffectPending extends SummaryGenerationScope {\n\tattempt: number;\n\trequest?: { index: number; usageId: string };\n\tusageIds: string[];\n}\n\nexport interface SummaryGenerationRetryWait extends SummaryGenerationScope, RetryWait {}\n\nexport interface DeferredScope extends OperationScope {\n\tstepId: string;\n\tsourceEntryId: string;\n\tpoll: number;\n\tconfiguration: LaneConfiguration;\n\tstreamOptions: AgentHarnessStreamOptions;\n}\n\nexport interface StartingOperation extends OperationScope {\n\tat: \"starting\";\n}\n\nexport interface CheckpointOperation extends OperationScope, CheckpointData {\n\tat: \"checkpoint\";\n}\n\nexport interface AssistantReadyOperation extends OperationScope, AssistantGenerationScope {\n\tat: \"assistant.ready\";\n\tnextAttempt: number;\n}\n\nexport interface AssistantEffectPendingOperation extends OperationScope, AssistantGenerationScope {\n\tat: \"assistant.effect_pending\";\n\tattempt: number;\n\tresponseEntryId: string;\n\tusageId: string;\n\tintendedOutputLimit: number;\n\tcontextWindow: number;\n}\n\nexport interface AssistantRetryWaitOperation extends OperationScope, AssistantGenerationScope, RetryWait {\n\tat: \"assistant.retry_wait\";\n}\n\nexport interface ToolsOperation extends OperationScope {\n\tat: \"tools\";\n\tbatch: ToolBatch;\n}\n\nexport interface DeferredSuspendedOperation extends DeferredScope {\n\tat: \"deferred.suspended\";\n}\n\nexport interface DeferredEffectPendingOperation extends DeferredScope {\n\tat: \"deferred.effect_pending\";\n\tresponseEntryId: string;\n\tusageId: string;\n}\n\nexport interface SummaryDecidingOperation extends OperationScope {\n\tat: \"summary.deciding\";\n\ttask: SummaryTask;\n}\n\nexport interface SummaryReadyOperation extends OperationScope, SummaryGenerationReady {\n\tat: \"summary.ready\";\n}\n\nexport interface SummaryEffectPendingOperation extends OperationScope, SummaryGenerationEffectPending {\n\tat: \"summary.effect_pending\";\n}\n\nexport interface SummaryRetryWaitOperation extends OperationScope, SummaryGenerationRetryWait {\n\tat: \"summary.retry_wait\";\n}\n\nexport interface NavigationReadyToCommitOperation extends OperationScope {\n\tat: \"navigation.ready_to_commit\";\n\t/** Unsummarized navigation may target the branch root (null). */\n\ttargetId: string | null;\n\tlabel?: string;\n}\n\n/** Flat durable operation state: exactly 13 family-neutral dispatcher leaves. */\nexport type OperationState =\n\t| StartingOperation\n\t| CheckpointOperation\n\t| AssistantReadyOperation\n\t| AssistantEffectPendingOperation\n\t| AssistantRetryWaitOperation\n\t| ToolsOperation\n\t| DeferredSuspendedOperation\n\t| DeferredEffectPendingOperation\n\t| SummaryDecidingOperation\n\t| SummaryReadyOperation\n\t| SummaryEffectPendingOperation\n\t| SummaryRetryWaitOperation\n\t| NavigationReadyToCommitOperation;\n\nexport type OperationAt = OperationState[\"at\"];\n\n/** Copy only the uniform operation scope when constructing a successor leaf. */\nexport function operationScopeOf(state: OperationState): OperationScope {\n\treturn {\n\t\tcontrol: state.control,\n\t\tsettings: state.settings,\n\t\tlatestAssistantEntryId: state.latestAssistantEntryId,\n\t};\n}\n\nexport type Operation = { meta: OperationMeta; state: OperationState };\n\nexport interface LaneState {\n\tcurrentOperationId: string | null;\n\tlastOperationId: string | null;\n\tinbox: InboxItem[];\n}\n\nexport type PendingEntry =\n\t| { type: \"message\"; payload: AgentMessage }\n\t| { type: \"custom\"; customType: string; payload?: JsonValue };\n\nexport interface DurableFileOperations {\n\tread: string[];\n\twritten: string[];\n\tedited: string[];\n}\n\nexport type DurableStructuralPreparation =\n\t| {\n\t\t\tkind: \"compaction\";\n\t\t\tmessagesToSummarize: CompactionPreparation[\"messagesToSummarize\"];\n\t\t\tturnPrefixMessages: CompactionPreparation[\"turnPrefixMessages\"];\n\t\t\tretainedTail: CompactionPreparation[\"retainedTail\"];\n\t\t\tisSplitTurn: boolean;\n\t\t\ttokensBefore: number;\n\t\t\tpreviousSummary?: string;\n\t\t\tfileOps: DurableFileOperations;\n\t\t\tsettings: CompactionSettings;\n\t }\n\t| {\n\t\t\tkind: \"branch_summary\";\n\t\t\tmessages: BranchPreparation[\"messages\"];\n\t\t\tfileOps: DurableFileOperations;\n\t\t\ttotalTokens: number;\n\t };\n\nexport interface UsageRow {\n\tid: string;\n\tseq: number;\n\tusage: Usage;\n\tentryId?: string;\n\tadjustment: boolean;\n\tdetails?: JsonValue;\n}\n\nexport interface EntryWrite {\n\tkind: \"entry\";\n\tentry: NewEntry;\n}\n\nexport interface UsageWrite {\n\tkind: \"usage\";\n\trow: Omit<UsageRow, \"seq\">;\n}\n\nexport type Write = EntryWrite | UsageWrite | ValueWrite | ListWrite;\n\nexport interface CommitResult {\n\tfirstSeq: number;\n\tseqs: number[];\n\ttimestamp: number;\n\t/** Session totals immediately after this commit was applied. */\n\tstats: SessionStats;\n}\n\nexport interface EntryStructure {\n\tid: string;\n\tparentId: string | null;\n\tseq: number;\n\ttimestamp: number;\n\ttype: EntryType;\n\tcustomType?: string;\n}\n\nexport interface EntryCursor {\n\tseq: number;\n}\n\nexport interface BranchScan {\n\tstart?: string;\n\tstopAtType?: EntryType;\n\tstopAtId?: string;\n\ttype?: EntryType;\n\tcustomType?: string;\n\torder?: \"newestFirst\" | \"oldestFirst\";\n\tlimit?: number;\n\tcursor?: EntryCursor;\n}\n\nexport type StorageBranchScan = BranchScan & { start: string };\n\nexport interface EntryScan {\n\ttype?: EntryType;\n\tcustomType?: string;\n\tfromSeq?: number;\n\ttoSeq?: number;\n\torder?: \"asc\" | \"desc\";\n\tlimit?: number;\n}\n\nexport interface UsageScan {\n\tfromSeq?: number;\n\ttoSeq?: number;\n\torder?: \"asc\" | \"desc\";\n\tlimit?: number;\n}\n\nexport interface SessionStats {\n\tmessageCount: number;\n\tusage: Usage;\n}\n\nexport interface Storage {\n\tcommit(writes: Write[], context: Context): Promise<CommitResult>;\n\tgetEntries(ids: string[], context: Context): Promise<Map<string, Entry>>;\n\tgetValue<T>(address: Value<T>, context: Context): Promise<StoredValue<T> | undefined>;\n\tscanValues<T>(prefix: Value<T>, context: Context): Promise<StoredValue<T>[]>;\n\treadList<T>(\n\t\taddress: ValueList<T>,\n\t\toptions: ListReadOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<ListElement<T>[]>;\n\tscanBranch(query: StorageBranchScan, context: Context): Promise<Entry[]>;\n\tscanBranchStructure(query: StorageBranchScan, context: Context): Promise<EntryStructure[]>;\n\tscanEntries(query: EntryScan, context: Context): Promise<Entry[]>;\n\tscanUsage(query: UsageScan, context: Context): Promise<UsageRow[]>;\n\tgetStats(context: Context): Promise<SessionStats>;\n\tclose(context: Context): Promise<void>;\n}\n\nexport interface SessionMetadata {\n\tid: string;\n\tcreatedAt: number;\n\tstorageVersion: number;\n\tcwd?: string;\n\tparentSessionId?: string;\n\tlegacyParentSessionPath?: string;\n}\n\nexport interface IdGenerator {\n\tnext(timestampMs?: number): string;\n}\n\nexport interface EntryQuery {\n\ttype?: EntryType;\n\tcustomType?: string;\n\torder?: \"asc\" | \"desc\";\n\tlimit?: number;\n\tcursor?: EntryCursor;\n}\n\nexport interface SessionReader {\n\tgetEntries(ids: string[], context: Context): Promise<Map<string, Entry>>;\n\tgetStats(context: Context): Promise<SessionStats>;\n\tgetValue<T>(address: Value<T>, context: Context): Promise<StoredValue<T> | undefined>;\n\tscanValues<T>(prefix: Value<T>, context: Context): Promise<StoredValue<T>[]>;\n\treadList<T>(\n\t\taddress: ValueList<T>,\n\t\toptions: ListReadOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<ListElement<T>[]>;\n\t/** Scan a branch from an explicit entry while this reader capability remains valid. */\n\tscanBranch(query: StorageBranchScan, context: Context): Promise<Entry[]>;\n}\n\n/** Exclusive keyless mutation barrier for one Session. */\nexport interface SessionMutation extends SessionReader {\n\t/** Exactly zero or one commit attempt. A second attempt rejects. */\n\tcommit(writes: Write[], context: Context): Promise<CommitResult>;\n\t/** Wait for any commit attempt, invalidate the capability, and release the barrier. */\n\tend(context: Context): Promise<void>;\n}\n\n/** Callback-scoped mutation capability without authority to release its Session barrier. */\nexport type SessionMutator = Omit<SessionMutation, \"end\">;\n\nexport type SessionMutationCallback<T> = (mutator: SessionMutator, context: Context) => T | Promise<T>;\n\nexport interface Branch {\n\treadonly name: string;\n\tgetTipId(context: Context): Promise<string | null>;\n\tfindEntries(query: BranchScan | undefined, context: Context): Promise<Entry[]>;\n\tfindEntry(query: BranchScan | undefined, context: Context): Promise<Entry | undefined>;\n\tappendMessage(message: AgentMessage, context: Context): Promise<string>;\n\tappendCustomEntry(customType: string, data: JsonValue | undefined, context: Context): Promise<string>;\n}\n\nexport interface Session<TMetadata extends SessionMetadata = SessionMetadata> extends SessionReader {\n\treadonly metadata: TMetadata;\n\treadonly idGenerator: IdGenerator;\n\tgetEntry(id: string, context: Context): Promise<Entry | undefined>;\n\tgetStats(context: Context): Promise<SessionStats>;\n\tgetName(context: Context): Promise<string | undefined>;\n\tgetLabel(targetId: string, context: Context): Promise<string | undefined>;\n\tfindEntries(query: EntryQuery | undefined, context: Context): Promise<Entry[]>;\n\tfindEntry(query: EntryQuery | undefined, context: Context): Promise<Entry | undefined>;\n\tbranch(name: string, context: Context): Promise<Branch | undefined>;\n\tcreateBranch(name: string, at: string | null, context: Context): Promise<Branch>;\n\tbeginMutation(context: Context): Promise<SessionMutation>;\n\t/**\n\t * Trusted exclusive callback over the Session mutation line. Calling a public Session writer from\n\t * this callback queues it behind the callback; awaiting that nested writer therefore deadlocks.\n\t * Use the supplied mutator for the callback's sole commit.\n\t */\n\tmutate<T>(mutation: SessionMutationCallback<T>, context: Context): Promise<T>;\n\tsetValue<T>(address: Value<T>, next: NoInfer<T>, context: Context): Promise<void>;\n\tdeleteValue<T>(address: Value<T>, context: Context): Promise<void>;\n\tappendList<T>(address: ValueList<T>, element: NoInfer<T>, context: Context): Promise<void>;\n\tdeleteList<T>(address: ValueList<T>, context: Context): Promise<void>;\n\tsetName(name: string | undefined, context: Context): Promise<void>;\n\tsetLabel(targetId: string, label: string | undefined, context: Context): Promise<void>;\n\tclose(context: Context): Promise<void>;\n}\n\nexport interface SessionCreateOptions {\n\tid?: string;\n\tparentSessionId?: string;\n}\n\nexport type ForkOptions =\n\t| {\n\t\t\t/**\n\t\t\t * Copy one path from a complete configured source AgentLane under the same\n\t\t\t * Branch name, with copied configuration and fresh idle lane state.\n\t\t\t */\n\t\t\tscope: \"branch\";\n\t\t\t/** Source Branch to copy. */\n\t\t\tbranch: string;\n\t\t\t/** Entry on the source Branch's current tip ancestry. Defaults to the current tip. */\n\t\t\tentryId?: string;\n\t\t\t/**\n\t\t\t * Whether the fork includes the selected entry or stops at its parent.\n\t\t\t * Defaults to including the selected entry.\n\t\t\t */\n\t\t\tposition?: \"before\" | \"at\";\n\t\t\t/** Optional destination session id. */\n\t\t\tid?: string;\n\t }\n\t| {\n\t\t\t/**\n\t\t\t * Copy the whole conversation tree and every Branch tip. Each configured\n\t\t\t * AgentLane copies configuration plus fresh idle state; data-only Branches\n\t\t\t * remain data-only. Operation/pending/result/usage state is excluded.\n\t\t\t */\n\t\t\tscope: \"tree\";\n\t\t\t/** Optional destination session id. */\n\t\t\tid?: string;\n\t };\n\nexport interface SessionRepo<\n\tTMetadata extends SessionMetadata = SessionMetadata,\n\tTCreateOptions extends { id?: string; parentSessionId?: string } = SessionCreateOptions,\n\tTListOptions = void,\n> {\n\tcreate(options: TCreateOptions, context: Context): Promise<Session<TMetadata>>;\n\topen(metadata: TMetadata, context: Context): Promise<Session<TMetadata>>;\n\tlist(options: TListOptions | undefined, context: Context): Promise<TMetadata[]>;\n\tdelete(metadata: TMetadata, context: Context): Promise<void>;\n\tfork(source: TMetadata, options: ForkOptions, context: Context): Promise<Session<TMetadata>>;\n}\n"]}
@@ -1,10 +1,9 @@
1
- import "../messages.js";
2
- export class SessionError extends Error {
3
- code;
4
- constructor(code, message, cause) {
5
- super(message, cause === undefined ? undefined : { cause });
6
- this.name = "SessionError";
7
- this.code = code;
8
- }
1
+ /** Copy only the uniform operation scope when constructing a successor leaf. */
2
+ export function operationScopeOf(state) {
3
+ return {
4
+ control: state.control,
5
+ settings: state.settings,
6
+ latestAssistantEntryId: state.latestAssistantEntryId,
7
+ };
9
8
  }
10
9
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/harness/session/types.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,CAAC;AA+XxB,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC7B,IAAI,CAAmB;IAEhC,YAAY,IAAsB,EAAE,OAAe,EAAE,KAAa,EAAE;QACnE,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAAA,CACjB;CACD","sourcesContent":["import type { StopReason, Usage } from \"@earendil-works/pi-ai\";\nimport \"../messages.ts\";\nimport type { AgentMessage } from \"../../types.ts\";\nimport type { Session } from \"./session.ts\";\n\nexport type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };\n\nexport type SessionStopReason = Exclude<StopReason, \"pending\"> | \"deferred\";\n\nexport interface IdGenerator {\n\tnext(): string;\n}\n\nexport interface EntryBase {\n\ttype: string;\n\tid: string;\n\tseq: number; // shared sequence; read-side, storage-assigned\n\tparentId: string | null; // storage-assigned: the appending lane's leaf\n\ttimestamp: number; // Unix ms, storage-assigned\n}\n\nexport interface MessageEntry extends EntryBase {\n\ttype: \"message\";\n\tmessage: AgentMessage;\n\tterminate?: true;\n}\n\nexport interface ModelChangeEntry extends EntryBase {\n\ttype: \"model_change\";\n\tprovider: string;\n\tmodelId: string;\n}\n\nexport interface ThinkingLevelEntry extends EntryBase {\n\ttype: \"thinking_level_change\";\n\tthinkingLevel: string;\n}\n\nexport interface ActiveToolsEntry extends EntryBase {\n\ttype: \"active_tools_change\";\n\tactiveToolNames: string[];\n}\n\nexport interface CompactionEntry extends EntryBase {\n\ttype: \"compaction\";\n\tsummary: string;\n\tretainedTail: AgentMessage[];\n\ttokensBefore: number;\n\tdetails?: unknown;\n\tusage?: Usage;\n}\n\nexport interface BranchSummaryEntry extends EntryBase {\n\ttype: \"branch_summary\";\n\tfromId: string;\n\tsummary: string;\n\tdetails?: unknown;\n\tusage?: Usage;\n}\n\nexport interface CustomEntry extends EntryBase {\n\ttype: \"custom\";\n\tcustomType: string;\n\tdata?: unknown;\n}\n\nexport type Entry =\n\t| MessageEntry\n\t| ModelChangeEntry\n\t| ThinkingLevelEntry\n\t| ActiveToolsEntry\n\t| CompactionEntry\n\t| BranchSummaryEntry\n\t| CustomEntry;\n\nexport type ProvisionedEntry<TEntry extends Entry = Entry> = TEntry extends Entry\n\t? Omit<TEntry, \"parentId\" | \"seq\" | \"timestamp\">\n\t: never;\n\nexport interface RecordBase {\n\tid: string;\n\tseq: number;\n\tlane: string;\n\ttimestamp: number;\n}\n\nexport interface OperationStartedRecord extends RecordBase {\n\ttype: \"operation_started\";\n\tsourceLeafId: string | null;\n\tintent:\n\t\t| {\n\t\t\t\tkind: \"run\";\n\t\t\t\t/** Normalized caller input before before_run; kept for suspended operations and before_resume. */\n\t\t\t\toriginalPrompt: AgentMessage[];\n\t\t\t\t/** Captured nextRun items, then the prompt, then before_run injections. */\n\t\t\t\tinitialMessages: ProvisionedEntry[];\n\t\t\t\tsystemPromptOverride?: string;\n\t\t\t\tresumeData?: { [extensionId: string]: JsonValue };\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"compaction\";\n\t\t\t\tcustomInstructions?: string;\n\t\t\t\tresultEntryId: string;\n\t\t }\n\t\t| {\n\t\t\t\tkind: \"navigation\";\n\t\t\t\ttargetId: string | null;\n\t\t\t\tsummarize: boolean;\n\t\t\t\tcustomInstructions?: string;\n\t\t\t\tlabel?: string;\n\t\t\t\tsummaryEntryId?: string;\n\t\t };\n}\n\nexport interface AbortRequestedRecord extends RecordBase {\n\ttype: \"abort_requested\";\n\trunId: string;\n}\n\nexport interface OperationFinishedRecord extends RecordBase {\n\ttype: \"operation_finished\";\n\trunId: string;\n\toutcome: \"completed\" | \"aborted\" | \"failed\" | \"declined\";\n\terror?: { code: string; message: string };\n}\n\nexport type CompactionReason = \"manual\" | \"threshold\" | \"overflow\";\n\nexport type StepAttemptRecord = RecordBase &\n\t(\n\t\t| {\n\t\t\t\ttype: \"step_attempt\";\n\t\t\t\trunId: string;\n\t\t\t\tstep: \"assistant\" | \"branch_summary\";\n\t\t\t\tattempt: number;\n\t\t\t\tresultEntryId: string;\n\t\t\t\tcompactionReason?: never;\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"step_attempt\";\n\t\t\t\trunId: string;\n\t\t\t\tstep: \"compaction\";\n\t\t\t\tattempt: number;\n\t\t\t\tresultEntryId: string;\n\t\t\t\t/** Persists why compaction summary generation started so recovery resumes the same work. */\n\t\t\t\tcompactionReason: CompactionReason;\n\t\t }\n\t);\n\nexport interface ToolStartedRecord extends RecordBase {\n\ttype: \"tool_started\";\n\trunId: string;\n\tassistantEntryId: string;\n\ttoolIndex: number;\n\ttoolCallId: string;\n\ttoolName: string;\n\teffectiveArgs: { [key: string]: unknown };\n\tresultEntryId: string;\n\treplay: \"never\" | \"safe\";\n}\n\nexport type QueueEnqueuedRecord = RecordBase &\n\t(\n\t\t| {\n\t\t\t\ttype: \"queue_enqueued\";\n\t\t\t\tqueue: \"steer\" | \"followUp\";\n\t\t\t\trunId: string;\n\t\t\t\ttarget: ProvisionedEntry;\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"queue_enqueued\";\n\t\t\t\tqueue: \"nextRun\";\n\t\t\t\trunId?: never;\n\t\t\t\ttarget: ProvisionedEntry;\n\t\t }\n\t);\n\nexport interface QueueCancelledRecord extends RecordBase {\n\ttype: \"queue_cancelled\";\n\trunId?: string;\n\tentryId: string;\n}\n\nexport interface WriteDeferredRecord extends RecordBase {\n\ttype: \"write_deferred\";\n\trunId: string;\n\ttarget: ProvisionedEntry;\n}\n\nexport type UsageRecord = RecordBase & { type: \"usage\"; usage: Usage } & (\n\t\t| {\n\t\t\t\tcause: \"assistant\" | \"compaction\" | \"branch_summary\" | \"deferred_fetch\";\n\t\t\t\trunId: string;\n\t\t\t\tentryId: string;\n\t\t\t\tattempt: number;\n\t\t\t\tstopReason: SessionStopReason;\n\t\t }\n\t\t| { cause: \"tool\"; runId: string; entryId: string; toolCallId: string }\n\t\t| { cause: \"hook\"; runId: string; entryId: string }\n\t\t| { cause: \"adjustment\"; runId?: string; entryId?: string; details?: JsonValue }\n\t);\n\nexport type LaneRecord =\n\t| OperationStartedRecord\n\t| AbortRequestedRecord\n\t| OperationFinishedRecord\n\t| StepAttemptRecord\n\t| ToolStartedRecord\n\t| QueueEnqueuedRecord\n\t| QueueCancelledRecord\n\t| WriteDeferredRecord\n\t| UsageRecord;\nexport type NewRecord<TRecord extends LaneRecord = LaneRecord> = TRecord extends LaneRecord\n\t? Omit<TRecord, \"seq\" | \"timestamp\">\n\t: never;\n\nexport type EntryOrder = \"newestFirst\" | \"oldestFirst\";\n\nexport interface EntryCursor {\n\tafterSeq: number;\n}\n\nexport interface EntryQuery {\n\ttype?: Entry[\"type\"];\n\tcustomType?: string; // for type \"custom\"\n\torder?: EntryOrder; // default newestFirst\n\tlimit?: number;\n\tcursor?: EntryCursor;\n}\n\n/** Bounds of a branch scan. Default: the whole path, leaf to root. */\nexport interface BranchBounds {\n\tstart?: string; // default: the view's lane leaf\n\tstopAtType?: Entry[\"type\"]; // scan ends after the first match, inclusive\n\tstopAtId?: string;\n}\n\nexport interface RecordQuery {\n\t/** Exact lane match. Omit to query every lane. */\n\tlane?: string;\n\t/** Exact record discriminant match. Omit to query every record type. */\n\ttype?: LaneRecord[\"type\"];\n\t/**\n\t * Operation identity. Matches OperationStartedRecord.id and the runId\n\t * property of operation-owned records. Records without an operation\n\t * identity do not match.\n\t */\n\trunId?: string;\n\t/** Exact operation intent kind. Valid only with type \"operation_started\". */\n\toperationKind?: OperationStartedRecord[\"intent\"][\"kind\"];\n\t/** Exclusive chronological lower bound: seq > afterSeq, regardless of order. */\n\tafterSeq?: number;\n\t/** Sequence order. Default: \"newestFirst\". */\n\torder?: EntryOrder;\n\t/** Positive maximum number of matching records. */\n\tlimit?: number;\n}\n\nexport interface SessionMetadata {\n\tid: string;\n\tcreatedAt: number;\n\tparentSessionId?: string;\n}\n\nexport interface SessionStats {\n\tmessageCount: number;\n\tcachedTokens: number;\n\tuncachedTokens: number;\n\ttotalTokens: number;\n\tcostTotal: number;\n}\n\nexport interface LanePointer {\n\tlane: string;\n\tleafId: string | null;\n}\n\nexport type LogItem =\n\t| { kind: \"entry\"; seq: number; entry: Entry }\n\t| { kind: \"record\"; seq: number; record: LaneRecord }\n\t| { kind: \"lane\"; seq: number; lane: string; leafId: string | null }\n\t| { kind: \"fact\"; seq: number; fact: \"name\"; name: string | undefined }\n\t| { kind: \"fact\"; seq: number; fact: \"label\"; targetId: string; label: string | undefined };\n\nexport interface LogOptions {\n\tafterSeq?: number;\n\tlimit?: number;\n}\n\nexport interface SessionStorage<TMetadata extends SessionMetadata = SessionMetadata> {\n\tgetMetadata(): Promise<TMetadata>;\n\n\t// Lanes\n\tgetLanes(): Promise<{ lane: string; leafId: string | null }[]>;\n\tcreateLane(lane: string, at: string | null): Promise<void>;\n\tmoveLane(lane: string, to: string | null): Promise<void>;\n\n\t// Entries and Records\n\tappendEntry<TEntry extends Entry>(entry: ProvisionedEntry<TEntry>, lane: string): Promise<TEntry>;\n\tappendRecord<TRecord extends LaneRecord>(record: NewRecord<TRecord>): Promise<TRecord>;\n\n\t// Reads\n\tgetEntry(id: string): Promise<Entry | undefined>;\n\tfindEntries(query?: EntryQuery): Promise<Entry[]>;\n\t/** start is mandatory here (as opposed to SessionTree's findEntriesOnBranch); defaulting to a lane's leaf is view sugar. */\n\tfindEntriesOnBranch(query: EntryQuery & BranchBounds & { start: string }): Promise<Entry[]>;\n\tfindRecords<K extends LaneRecord[\"type\"]>(\n\t\tquery: RecordQuery & { type: K },\n\t): Promise<Extract<LaneRecord, { type: K }>[]>;\n\tfindRecords(query?: RecordQuery): Promise<LaneRecord[]>;\n\t/**\n\t * Returns unfinished operation starts newest first. Recovery uses `limit: 2`:\n\t * zero results mean the lane is idle, one means it is suspended, and two\n\t * mean at least two operations are open, which is corruption. Further\n\t * results provide no additional recovery state.\n\t */\n\tfindOpenOperations(lane: string, options?: { limit?: number }): Promise<OperationStartedRecord[]>;\n\tgetLog(options?: { afterSeq?: number; limit?: number }): Promise<LogItem[]>;\n\n\t// Global facts\n\tgetName(): Promise<string | undefined>;\n\tsetName(name: string | undefined): Promise<void>;\n\tgetLabel(id: string): Promise<string | undefined>;\n\tsetLabel(id: string, label: string | undefined): Promise<void>;\n\tgetStats(): Promise<SessionStats>;\n}\n\nexport interface SessionTree {\n\tgetLeafId(): Promise<string | null>;\n\tgetEntry(id: string): Promise<Entry | undefined>;\n\tgetStats(): Promise<SessionStats>;\n\n\t// Global facts. Latest wins; not branch-scoped. \"set\", not \"append\":\n\t// append vocabulary is reserved for tree writes.\n\tgetName(): Promise<string | undefined>;\n\tsetName(name: string | undefined): Promise<void>;\n\tgetLabel(targetId: string): Promise<string | undefined>;\n\tsetLabel(targetId: string, label: string | undefined): Promise<void>;\n\n\t/** Session-wide, all branches, sequence order. */\n\tfindEntries(query?: EntryQuery): Promise<Entry[]>;\n\tfindEntry(query?: EntryQuery): Promise<Entry | undefined>;\n\n\t/** Branch-scoped: the path from start toward root. */\n\tfindEntriesOnBranch(query?: EntryQuery & BranchBounds): Promise<Entry[]>;\n\tfindEntryOnBranch(query?: EntryQuery & BranchBounds): Promise<Entry | undefined>;\n\n\t// Writes. Resolve on durable acceptance; the returned id is the entry's\n\t// id (provisioned when the write defers).\n\tappendMessage(message: AgentMessage): Promise<string>;\n\tappendCustomEntry(customType: string, data?: unknown): Promise<string>;\n}\n\nexport interface SessionCreateOptions {\n\tid?: string;\n\tparentSessionId?: string;\n}\n\nexport type ForkOptions = { scope?: \"branch\"; entryId?: string; position?: \"before\" | \"at\" } | { scope: \"tree\" };\n\nexport interface SessionRepo<\n\tTMetadata extends SessionMetadata = SessionMetadata,\n\tTCreateOptions extends SessionCreateOptions = SessionCreateOptions,\n\tTListOptions = void,\n> {\n\tcreate(options: TCreateOptions): Promise<Session<TMetadata>>;\n\t/** Opens the session for writing and acquires any backend writer claim. */\n\topen(metadata: TMetadata): Promise<Session<TMetadata>>;\n\t/** Lists session metadata without opening sessions or acquiring writer claims. */\n\tlist(options?: TListOptions): Promise<TMetadata[]>;\n\tdelete(metadata: TMetadata): Promise<void>;\n\tfork(source: TMetadata, options: ForkOptions & TCreateOptions): Promise<Session<TMetadata>>;\n}\n\nexport type SessionErrorCode =\n\t| \"not_found\"\n\t| \"already_exists\"\n\t| \"invalid_entry\"\n\t| \"invalid_payload\"\n\t| \"invalid_lane\"\n\t| \"invalid_query\"\n\t| \"invalid_fork_target\"\n\t| \"storage\";\n\nexport class SessionError extends Error {\n\treadonly code: SessionErrorCode;\n\n\tconstructor(code: SessionErrorCode, message: string, cause?: Error) {\n\t\tsuper(message, cause === undefined ? undefined : { cause });\n\t\tthis.name = \"SessionError\";\n\t\tthis.code = code;\n\t}\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/harness/session/types.ts"],"names":[],"mappings":"AA2UA,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,KAAqB,EAAkB;IACvE,OAAO;QACN,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;KACpD,CAAC;AAAA,CACF","sourcesContent":["import type { JsonValue } from \"@earendil-works/chord\";\nimport type { AssistantMessage, StopReason, Usage } from \"@earendil-works/pi-ai\";\nimport type { AgentMessage, QueueMode, ThinkingLevel } from \"../../types.ts\";\nimport type { BranchPreparation } from \"../compaction/branch-summarization.ts\";\nimport type { CompactionPreparation, CompactionSettings } from \"../compaction/compaction.ts\";\nimport type { Context } from \"../context.ts\";\nimport type { AgentHarnessStreamOptions } from \"../types.ts\";\nimport type { ListElement, ListReadOptions, ListWrite, StoredValue, Value, ValueList, ValueWrite } from \"./values.ts\";\n\nexport type { JsonValue } from \"@earendil-works/chord\";\n\nexport type SettledAssistantMessage = AssistantMessage & {\n\tstopReason: Exclude<StopReason, \"pending\">;\n};\n\nexport type EntryType = \"message\" | \"compaction\" | \"branch_summary\" | \"custom\";\n\nexport interface EntryBase {\n\tid: string;\n\tparentId: string | null;\n\tseq: number;\n\ttimestamp: number;\n\ttype: EntryType;\n\tcustomType?: string;\n}\n\nexport interface MessageEntry extends EntryBase {\n\ttype: \"message\";\n\tmessage: AgentMessage;\n\tterminate?: true;\n}\n\nexport interface CompactionEntry extends EntryBase {\n\ttype: \"compaction\";\n\tsummary: string;\n\tretainedTail: AgentMessage[];\n\ttokensBefore: number;\n\tdetails?: JsonValue;\n\tusage?: Usage;\n\tfromHook: boolean;\n}\n\nexport interface BranchSummaryEntry extends EntryBase {\n\ttype: \"branch_summary\";\n\tfromId: string | null;\n\tsummary: string;\n\tdetails?: JsonValue;\n\tusage?: Usage;\n\tfromHook: boolean;\n}\n\nexport interface CustomEntry extends EntryBase {\n\ttype: \"custom\";\n\tcustomType: string;\n\tdata?: JsonValue;\n}\n\n/** Convert an application-defined custom entry into model context. */\nexport type EntryProjector = (\n\tentry: CustomEntry,\n\tcontext: Context,\n) => AgentMessage[] | undefined | Promise<AgentMessage[] | undefined>;\n\nexport type Entry = MessageEntry | CompactionEntry | BranchSummaryEntry | CustomEntry;\n\n/** Entry supplied to a transaction before storage assigns sequence and timestamp. */\nexport type NewEntry<TEntry extends Entry = Entry> = TEntry extends Entry ? Omit<TEntry, \"seq\" | \"timestamp\"> : never;\n\nexport interface LaneConfiguration {\n\tmodel: { provider: string; modelId: string };\n\tthinkingLevel: ThinkingLevel;\n\tactiveToolNames: string[];\n}\n\nexport interface OperationMeta {\n\toperationId: string;\n\tlane: string;\n\tsourceTipId: string | null;\n\tstartedAt: number;\n\tintent:\n\t\t| { kind: \"run\"; promptEntryIds: string[] }\n\t\t| { kind: \"compaction\"; customInstructions?: string }\n\t\t| {\n\t\t\t\tkind: \"navigation\";\n\t\t\t\ttargetId: string | null;\n\t\t\t\tsummarize: boolean;\n\t\t\t\tlabel?: string;\n\t\t\t\tcustomInstructions?: string;\n\t\t };\n}\n\nexport type Control =\n\t| { status: \"running\" }\n\t| {\n\t\t\tstatus: \"cancel_requested\";\n\t\t\trequestedAt: number;\n\t };\n\nexport interface OperationError {\n\tcode: string;\n\tmessage: string;\n\tdetails?: JsonValue;\n}\n\nexport type TerminalStatus = \"completed\" | \"declined\" | \"aborted\" | \"failed\";\n\n/** Immutable lane-lived observation record written by one terminal transaction. */\nexport interface OperationResultRecord {\n\toperationId: string;\n\tkind: OperationMeta[\"intent\"][\"kind\"];\n\tstatus: TerminalStatus;\n\terror?: OperationError;\n\tfromTipId: string | null;\n\ttipId: string | null;\n\tstartedAt: number;\n\tendedAt: number;\n}\n\nexport type Continuation =\n\t| { kind: \"need_assistant\"; overflowRecoveryUsed: boolean }\n\t| { kind: \"may_finish\"; includeFinalAssistant: boolean };\n\n/** Checkpoint payload; the flat leaf literal replaces the old nested phase tag. */\nexport interface CheckpointData {\n\tcontinuation: Continuation;\n\ttriggerEntryId: string;\n}\n\nexport type InboxItemKind = \"steer\" | \"followUp\" | \"nextRun\" | \"write\";\n\nexport interface InboxItem {\n\tentryId: string;\n\tkind: InboxItemKind;\n}\n\nexport interface NormalizedRetryPolicy {\n\tmaxAttempts: number;\n\tbaseDelayMs: number;\n}\n\nexport interface GenerationContext {\n\tstepId: string;\n\ttriggerEntryId: string;\n\tconfiguration: LaneConfiguration;\n\tstreamOptions: AgentHarnessStreamOptions;\n\tretryPolicy: NormalizedRetryPolicy;\n\toverflowRecoveryUsed: boolean;\n}\n\ninterface ToolCallSource {\n\t/** Zero-based index in the assistant message's complete content array, not a filtered tool-call ordinal. */\n\tsourceIndex: number;\n\tresultEntryId: string;\n}\n\nexport type ToolCall = ToolCallSource &\n\t(\n\t\t| { status: \"planned\" }\n\t\t| { status: \"effect_pending\"; replay: \"never\" | \"safe\" }\n\t\t| { status: \"outcome_ready\"; terminate: boolean }\n\t\t| { status: \"completed\"; terminate: boolean }\n\t);\n\nexport interface ToolBatch {\n\tassistantEntryId: string;\n\tconfiguration: LaneConfiguration;\n\tturnId: string;\n\tcalls: ToolCall[];\n}\n\nexport interface SummaryContext {\n\tresultEntryId: string;\n\tconfiguration: LaneConfiguration;\n\tstreamOptions: AgentHarnessStreamOptions;\n\tretryPolicy: NormalizedRetryPolicy;\n}\n\n/*\n * Durable operation state is one flat union with one family-neutral discriminator\n * per dispatcher leaf. ToolBatch/ToolCall remain the nested child collection state\n * machine, and cancellation stays orthogonal via Control.\n */\n\nexport interface Cancellable {\n\tcontrol: Control;\n}\n\nexport interface RunSettings {\n\tcompaction: CompactionSettings;\n\tsteeringMode: QueueMode;\n\tfollowUpMode: QueueMode;\n\ttoolExecution: \"sequential\" | \"parallel\";\n}\n\n/** Uniform scope carried by every operation leaf. */\nexport interface OperationScope extends Cancellable {\n\tsettings: RunSettings;\n\tlatestAssistantEntryId: string | null;\n}\n\n/** Shared backoff data for every retry-wait leaf. */\nexport interface RetryWait {\n\tnextAttempt: number;\n\tnotBefore: number;\n\terrorMessage: string;\n}\n\nexport interface AssistantGenerationScope {\n\tgenerationContext: GenerationContext;\n}\n\nexport type ResultBoundary =\n\t| { kind: \"resume_checkpoint\"; resumeAfter: CheckpointData }\n\t| { kind: \"finish\" }\n\t| { kind: \"commit_navigation\"; targetId: string; label?: string };\n\nexport interface SummaryTask {\n\ttaskId: string;\n\treason?: \"manual\" | \"threshold\" | \"overflow\";\n\tcustomInstructions?: string;\n\tboundary: ResultBoundary;\n}\n\nexport interface SummaryGenerationScope {\n\ttask: SummaryTask;\n\tsummaryContext: SummaryContext;\n}\n\nexport interface SummaryGenerationReady extends SummaryGenerationScope {\n\tnextAttempt: number;\n}\n\nexport interface SummaryGenerationEffectPending extends SummaryGenerationScope {\n\tattempt: number;\n\trequest?: { index: number; usageId: string };\n\tusageIds: string[];\n}\n\nexport interface SummaryGenerationRetryWait extends SummaryGenerationScope, RetryWait {}\n\nexport interface DeferredScope extends OperationScope {\n\tstepId: string;\n\tsourceEntryId: string;\n\tpoll: number;\n\tconfiguration: LaneConfiguration;\n\tstreamOptions: AgentHarnessStreamOptions;\n}\n\nexport interface StartingOperation extends OperationScope {\n\tat: \"starting\";\n}\n\nexport interface CheckpointOperation extends OperationScope, CheckpointData {\n\tat: \"checkpoint\";\n}\n\nexport interface AssistantReadyOperation extends OperationScope, AssistantGenerationScope {\n\tat: \"assistant.ready\";\n\tnextAttempt: number;\n}\n\nexport interface AssistantEffectPendingOperation extends OperationScope, AssistantGenerationScope {\n\tat: \"assistant.effect_pending\";\n\tattempt: number;\n\tresponseEntryId: string;\n\tusageId: string;\n\tintendedOutputLimit: number;\n\tcontextWindow: number;\n}\n\nexport interface AssistantRetryWaitOperation extends OperationScope, AssistantGenerationScope, RetryWait {\n\tat: \"assistant.retry_wait\";\n}\n\nexport interface ToolsOperation extends OperationScope {\n\tat: \"tools\";\n\tbatch: ToolBatch;\n}\n\nexport interface DeferredSuspendedOperation extends DeferredScope {\n\tat: \"deferred.suspended\";\n}\n\nexport interface DeferredEffectPendingOperation extends DeferredScope {\n\tat: \"deferred.effect_pending\";\n\tresponseEntryId: string;\n\tusageId: string;\n}\n\nexport interface SummaryDecidingOperation extends OperationScope {\n\tat: \"summary.deciding\";\n\ttask: SummaryTask;\n}\n\nexport interface SummaryReadyOperation extends OperationScope, SummaryGenerationReady {\n\tat: \"summary.ready\";\n}\n\nexport interface SummaryEffectPendingOperation extends OperationScope, SummaryGenerationEffectPending {\n\tat: \"summary.effect_pending\";\n}\n\nexport interface SummaryRetryWaitOperation extends OperationScope, SummaryGenerationRetryWait {\n\tat: \"summary.retry_wait\";\n}\n\nexport interface NavigationReadyToCommitOperation extends OperationScope {\n\tat: \"navigation.ready_to_commit\";\n\t/** Unsummarized navigation may target the branch root (null). */\n\ttargetId: string | null;\n\tlabel?: string;\n}\n\n/** Flat durable operation state: exactly 13 family-neutral dispatcher leaves. */\nexport type OperationState =\n\t| StartingOperation\n\t| CheckpointOperation\n\t| AssistantReadyOperation\n\t| AssistantEffectPendingOperation\n\t| AssistantRetryWaitOperation\n\t| ToolsOperation\n\t| DeferredSuspendedOperation\n\t| DeferredEffectPendingOperation\n\t| SummaryDecidingOperation\n\t| SummaryReadyOperation\n\t| SummaryEffectPendingOperation\n\t| SummaryRetryWaitOperation\n\t| NavigationReadyToCommitOperation;\n\nexport type OperationAt = OperationState[\"at\"];\n\n/** Copy only the uniform operation scope when constructing a successor leaf. */\nexport function operationScopeOf(state: OperationState): OperationScope {\n\treturn {\n\t\tcontrol: state.control,\n\t\tsettings: state.settings,\n\t\tlatestAssistantEntryId: state.latestAssistantEntryId,\n\t};\n}\n\nexport type Operation = { meta: OperationMeta; state: OperationState };\n\nexport interface LaneState {\n\tcurrentOperationId: string | null;\n\tlastOperationId: string | null;\n\tinbox: InboxItem[];\n}\n\nexport type PendingEntry =\n\t| { type: \"message\"; payload: AgentMessage }\n\t| { type: \"custom\"; customType: string; payload?: JsonValue };\n\nexport interface DurableFileOperations {\n\tread: string[];\n\twritten: string[];\n\tedited: string[];\n}\n\nexport type DurableStructuralPreparation =\n\t| {\n\t\t\tkind: \"compaction\";\n\t\t\tmessagesToSummarize: CompactionPreparation[\"messagesToSummarize\"];\n\t\t\tturnPrefixMessages: CompactionPreparation[\"turnPrefixMessages\"];\n\t\t\tretainedTail: CompactionPreparation[\"retainedTail\"];\n\t\t\tisSplitTurn: boolean;\n\t\t\ttokensBefore: number;\n\t\t\tpreviousSummary?: string;\n\t\t\tfileOps: DurableFileOperations;\n\t\t\tsettings: CompactionSettings;\n\t }\n\t| {\n\t\t\tkind: \"branch_summary\";\n\t\t\tmessages: BranchPreparation[\"messages\"];\n\t\t\tfileOps: DurableFileOperations;\n\t\t\ttotalTokens: number;\n\t };\n\nexport interface UsageRow {\n\tid: string;\n\tseq: number;\n\tusage: Usage;\n\tentryId?: string;\n\tadjustment: boolean;\n\tdetails?: JsonValue;\n}\n\nexport interface EntryWrite {\n\tkind: \"entry\";\n\tentry: NewEntry;\n}\n\nexport interface UsageWrite {\n\tkind: \"usage\";\n\trow: Omit<UsageRow, \"seq\">;\n}\n\nexport type Write = EntryWrite | UsageWrite | ValueWrite | ListWrite;\n\nexport interface CommitResult {\n\tfirstSeq: number;\n\tseqs: number[];\n\ttimestamp: number;\n\t/** Session totals immediately after this commit was applied. */\n\tstats: SessionStats;\n}\n\nexport interface EntryStructure {\n\tid: string;\n\tparentId: string | null;\n\tseq: number;\n\ttimestamp: number;\n\ttype: EntryType;\n\tcustomType?: string;\n}\n\nexport interface EntryCursor {\n\tseq: number;\n}\n\nexport interface BranchScan {\n\tstart?: string;\n\tstopAtType?: EntryType;\n\tstopAtId?: string;\n\ttype?: EntryType;\n\tcustomType?: string;\n\torder?: \"newestFirst\" | \"oldestFirst\";\n\tlimit?: number;\n\tcursor?: EntryCursor;\n}\n\nexport type StorageBranchScan = BranchScan & { start: string };\n\nexport interface EntryScan {\n\ttype?: EntryType;\n\tcustomType?: string;\n\tfromSeq?: number;\n\ttoSeq?: number;\n\torder?: \"asc\" | \"desc\";\n\tlimit?: number;\n}\n\nexport interface UsageScan {\n\tfromSeq?: number;\n\ttoSeq?: number;\n\torder?: \"asc\" | \"desc\";\n\tlimit?: number;\n}\n\nexport interface SessionStats {\n\tmessageCount: number;\n\tusage: Usage;\n}\n\nexport interface Storage {\n\tcommit(writes: Write[], context: Context): Promise<CommitResult>;\n\tgetEntries(ids: string[], context: Context): Promise<Map<string, Entry>>;\n\tgetValue<T>(address: Value<T>, context: Context): Promise<StoredValue<T> | undefined>;\n\tscanValues<T>(prefix: Value<T>, context: Context): Promise<StoredValue<T>[]>;\n\treadList<T>(\n\t\taddress: ValueList<T>,\n\t\toptions: ListReadOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<ListElement<T>[]>;\n\tscanBranch(query: StorageBranchScan, context: Context): Promise<Entry[]>;\n\tscanBranchStructure(query: StorageBranchScan, context: Context): Promise<EntryStructure[]>;\n\tscanEntries(query: EntryScan, context: Context): Promise<Entry[]>;\n\tscanUsage(query: UsageScan, context: Context): Promise<UsageRow[]>;\n\tgetStats(context: Context): Promise<SessionStats>;\n\tclose(context: Context): Promise<void>;\n}\n\nexport interface SessionMetadata {\n\tid: string;\n\tcreatedAt: number;\n\tstorageVersion: number;\n\tcwd?: string;\n\tparentSessionId?: string;\n\tlegacyParentSessionPath?: string;\n}\n\nexport interface IdGenerator {\n\tnext(timestampMs?: number): string;\n}\n\nexport interface EntryQuery {\n\ttype?: EntryType;\n\tcustomType?: string;\n\torder?: \"asc\" | \"desc\";\n\tlimit?: number;\n\tcursor?: EntryCursor;\n}\n\nexport interface SessionReader {\n\tgetEntries(ids: string[], context: Context): Promise<Map<string, Entry>>;\n\tgetStats(context: Context): Promise<SessionStats>;\n\tgetValue<T>(address: Value<T>, context: Context): Promise<StoredValue<T> | undefined>;\n\tscanValues<T>(prefix: Value<T>, context: Context): Promise<StoredValue<T>[]>;\n\treadList<T>(\n\t\taddress: ValueList<T>,\n\t\toptions: ListReadOptions | undefined,\n\t\tcontext: Context,\n\t): Promise<ListElement<T>[]>;\n\t/** Scan a branch from an explicit entry while this reader capability remains valid. */\n\tscanBranch(query: StorageBranchScan, context: Context): Promise<Entry[]>;\n}\n\n/** Exclusive keyless mutation barrier for one Session. */\nexport interface SessionMutation extends SessionReader {\n\t/** Exactly zero or one commit attempt. A second attempt rejects. */\n\tcommit(writes: Write[], context: Context): Promise<CommitResult>;\n\t/** Wait for any commit attempt, invalidate the capability, and release the barrier. */\n\tend(context: Context): Promise<void>;\n}\n\n/** Callback-scoped mutation capability without authority to release its Session barrier. */\nexport type SessionMutator = Omit<SessionMutation, \"end\">;\n\nexport type SessionMutationCallback<T> = (mutator: SessionMutator, context: Context) => T | Promise<T>;\n\nexport interface Branch {\n\treadonly name: string;\n\tgetTipId(context: Context): Promise<string | null>;\n\tfindEntries(query: BranchScan | undefined, context: Context): Promise<Entry[]>;\n\tfindEntry(query: BranchScan | undefined, context: Context): Promise<Entry | undefined>;\n\tappendMessage(message: AgentMessage, context: Context): Promise<string>;\n\tappendCustomEntry(customType: string, data: JsonValue | undefined, context: Context): Promise<string>;\n}\n\nexport interface Session<TMetadata extends SessionMetadata = SessionMetadata> extends SessionReader {\n\treadonly metadata: TMetadata;\n\treadonly idGenerator: IdGenerator;\n\tgetEntry(id: string, context: Context): Promise<Entry | undefined>;\n\tgetStats(context: Context): Promise<SessionStats>;\n\tgetName(context: Context): Promise<string | undefined>;\n\tgetLabel(targetId: string, context: Context): Promise<string | undefined>;\n\tfindEntries(query: EntryQuery | undefined, context: Context): Promise<Entry[]>;\n\tfindEntry(query: EntryQuery | undefined, context: Context): Promise<Entry | undefined>;\n\tbranch(name: string, context: Context): Promise<Branch | undefined>;\n\tcreateBranch(name: string, at: string | null, context: Context): Promise<Branch>;\n\tbeginMutation(context: Context): Promise<SessionMutation>;\n\t/**\n\t * Trusted exclusive callback over the Session mutation line. Calling a public Session writer from\n\t * this callback queues it behind the callback; awaiting that nested writer therefore deadlocks.\n\t * Use the supplied mutator for the callback's sole commit.\n\t */\n\tmutate<T>(mutation: SessionMutationCallback<T>, context: Context): Promise<T>;\n\tsetValue<T>(address: Value<T>, next: NoInfer<T>, context: Context): Promise<void>;\n\tdeleteValue<T>(address: Value<T>, context: Context): Promise<void>;\n\tappendList<T>(address: ValueList<T>, element: NoInfer<T>, context: Context): Promise<void>;\n\tdeleteList<T>(address: ValueList<T>, context: Context): Promise<void>;\n\tsetName(name: string | undefined, context: Context): Promise<void>;\n\tsetLabel(targetId: string, label: string | undefined, context: Context): Promise<void>;\n\tclose(context: Context): Promise<void>;\n}\n\nexport interface SessionCreateOptions {\n\tid?: string;\n\tparentSessionId?: string;\n}\n\nexport type ForkOptions =\n\t| {\n\t\t\t/**\n\t\t\t * Copy one path from a complete configured source AgentLane under the same\n\t\t\t * Branch name, with copied configuration and fresh idle lane state.\n\t\t\t */\n\t\t\tscope: \"branch\";\n\t\t\t/** Source Branch to copy. */\n\t\t\tbranch: string;\n\t\t\t/** Entry on the source Branch's current tip ancestry. Defaults to the current tip. */\n\t\t\tentryId?: string;\n\t\t\t/**\n\t\t\t * Whether the fork includes the selected entry or stops at its parent.\n\t\t\t * Defaults to including the selected entry.\n\t\t\t */\n\t\t\tposition?: \"before\" | \"at\";\n\t\t\t/** Optional destination session id. */\n\t\t\tid?: string;\n\t }\n\t| {\n\t\t\t/**\n\t\t\t * Copy the whole conversation tree and every Branch tip. Each configured\n\t\t\t * AgentLane copies configuration plus fresh idle state; data-only Branches\n\t\t\t * remain data-only. Operation/pending/result/usage state is excluded.\n\t\t\t */\n\t\t\tscope: \"tree\";\n\t\t\t/** Optional destination session id. */\n\t\t\tid?: string;\n\t };\n\nexport interface SessionRepo<\n\tTMetadata extends SessionMetadata = SessionMetadata,\n\tTCreateOptions extends { id?: string; parentSessionId?: string } = SessionCreateOptions,\n\tTListOptions = void,\n> {\n\tcreate(options: TCreateOptions, context: Context): Promise<Session<TMetadata>>;\n\topen(metadata: TMetadata, context: Context): Promise<Session<TMetadata>>;\n\tlist(options: TListOptions | undefined, context: Context): Promise<TMetadata[]>;\n\tdelete(metadata: TMetadata, context: Context): Promise<void>;\n\tfork(source: TMetadata, options: ForkOptions, context: Context): Promise<Session<TMetadata>>;\n}\n"]}
@@ -0,0 +1,95 @@
1
+ import type { AssistantMessageFrame } from "@earendil-works/pi-ai";
2
+ import type { AgentToolResult } from "../../types.ts";
3
+ import type { DurableStructuralPreparation, JsonValue, LaneConfiguration, LaneState, OperationMeta, OperationResultRecord, OperationState, PendingEntry } from "./types.ts";
4
+ declare const storedValueType: unique symbol;
5
+ export interface StoredAddressBase {
6
+ readonly namespace: string;
7
+ readonly key: string;
8
+ readonly kind: "value" | "list";
9
+ }
10
+ export interface Value<T> extends StoredAddressBase {
11
+ readonly kind: "value";
12
+ readonly [storedValueType]?: (value: T) => T;
13
+ }
14
+ export interface ValueList<T> extends StoredAddressBase {
15
+ readonly kind: "list";
16
+ readonly [storedValueType]?: (value: T) => T;
17
+ }
18
+ export interface StoredValue<T> {
19
+ address: Value<T>;
20
+ value: T;
21
+ seq: number;
22
+ }
23
+ export interface ListElement<T> {
24
+ seq: number;
25
+ value: T;
26
+ }
27
+ export interface ListCursor {
28
+ seq: number;
29
+ }
30
+ export interface ListReadOptions {
31
+ cursor?: ListCursor;
32
+ order?: "asc" | "desc";
33
+ limit?: number;
34
+ }
35
+ export interface ResolvedListReadOptions {
36
+ cursor?: ListCursor;
37
+ order: "asc" | "desc";
38
+ limit: number;
39
+ }
40
+ export interface ValueSetWrite {
41
+ kind: "value";
42
+ op: "set";
43
+ namespace: string;
44
+ key: string;
45
+ value: unknown;
46
+ }
47
+ export interface ValueDeleteWrite {
48
+ kind: "value";
49
+ op: "delete";
50
+ namespace: string;
51
+ key: string;
52
+ }
53
+ export interface ListAppendWrite {
54
+ kind: "list";
55
+ op: "append";
56
+ namespace: string;
57
+ key: string;
58
+ value: unknown;
59
+ }
60
+ export interface ListDeleteWrite {
61
+ kind: "list";
62
+ op: "delete";
63
+ namespace: string;
64
+ key: string;
65
+ }
66
+ export type ValueWrite = ValueSetWrite | ValueDeleteWrite;
67
+ export type ListWrite = ListAppendWrite | ListDeleteWrite;
68
+ export declare function value<T>(namespace: string, key?: string): Value<T>;
69
+ export declare function list<T>(namespace: string, key?: string): ValueList<T>;
70
+ export declare function setValue<T>(address: Value<T>, next: NoInfer<T>): ValueSetWrite;
71
+ export declare function deleteValue<T>(address: Value<T>): ValueDeleteWrite;
72
+ export declare function appendList<T>(address: ValueList<T>, element: NoInfer<T>): ListAppendWrite;
73
+ export declare function deleteList<T>(address: ValueList<T>): ListDeleteWrite;
74
+ export declare function resolveListReadOptions(options?: ListReadOptions): ResolvedListReadOptions;
75
+ export declare const branchTip: (branch: string) => Value<string | null>;
76
+ export declare const branchTipInventoryPrefix: () => Value<string | null>;
77
+ export declare const laneConfig: (lane: string) => Value<LaneConfiguration>;
78
+ export declare const laneState: (lane: string) => Value<LaneState>;
79
+ export declare const operationResult: (operationId: string) => Value<OperationResultRecord>;
80
+ export declare const operationMeta: (operationId: string) => Value<OperationMeta>;
81
+ export declare const operationState: (operationId: string) => Value<OperationState>;
82
+ export declare const operationToolArgs: (operationId: string, stepId: string, sourceIndex: number) => Value<Record<string, JsonValue>>;
83
+ export declare const operationToolMemo: (operationId: string, invocationId: string, name: string) => Value<JsonValue>;
84
+ export declare const operationPreparation: (operationId: string, taskId: string) => Value<DurableStructuralPreparation>;
85
+ export declare const operationToolArgsPrefix: (operationId: string, stepId?: string | undefined) => Value<Record<string, JsonValue>>;
86
+ export declare const operationToolMemoPrefix: (operationId: string, invocationId?: string | undefined) => Value<JsonValue>;
87
+ export declare const operationPreparationPrefix: (operationId: string) => Value<DurableStructuralPreparation>;
88
+ export declare const pendingEntry: (entryId: string) => Value<PendingEntry>;
89
+ export declare const pendingToolOutput: (operationId: string, invocationId: string) => Value<AgentToolResult<unknown>>;
90
+ export declare const pendingAssistantFrames: (operationId: string, responseEntryId: string) => ValueList<AssistantMessageFrame>;
91
+ export declare const pendingToolOutputPrefix: (operationId: string) => Value<AgentToolResult<unknown>>;
92
+ export declare const sessionName: Value<string>;
93
+ export declare const entryLabel: (entryId: string) => Value<string>;
94
+ export {};
95
+ //# sourceMappingURL=values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../../src/harness/session/values.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessageFrame } from \"@earendil-works/pi-ai\";\nimport type { AgentToolResult } from \"../../types.ts\";\nimport type {\n\tDurableStructuralPreparation,\n\tJsonValue,\n\tLaneConfiguration,\n\tLaneState,\n\tOperationMeta,\n\tOperationResultRecord,\n\tOperationState,\n\tPendingEntry,\n} from \"./types.ts\";\n\ndeclare const storedValueType: unique symbol;\n\nexport interface StoredAddressBase {\n\treadonly namespace: string;\n\treadonly key: string;\n\treadonly kind: \"value\" | \"list\";\n}\n\nexport interface Value<T> extends StoredAddressBase {\n\treadonly kind: \"value\";\n\treadonly [storedValueType]?: (value: T) => T;\n}\n\nexport interface ValueList<T> extends StoredAddressBase {\n\treadonly kind: \"list\";\n\treadonly [storedValueType]?: (value: T) => T;\n}\n\nexport interface StoredValue<T> {\n\taddress: Value<T>;\n\tvalue: T;\n\tseq: number;\n}\n\nexport interface ListElement<T> {\n\tseq: number;\n\tvalue: T;\n}\n\nexport interface ListCursor {\n\tseq: number;\n}\n\nexport interface ListReadOptions {\n\tcursor?: ListCursor;\n\torder?: \"asc\" | \"desc\";\n\tlimit?: number;\n}\n\nexport interface ResolvedListReadOptions {\n\tcursor?: ListCursor;\n\torder: \"asc\" | \"desc\";\n\tlimit: number;\n}\n\nexport interface ValueSetWrite {\n\tkind: \"value\";\n\top: \"set\";\n\tnamespace: string;\n\tkey: string;\n\tvalue: unknown;\n}\n\nexport interface ValueDeleteWrite {\n\tkind: \"value\";\n\top: \"delete\";\n\tnamespace: string;\n\tkey: string;\n}\n\nexport interface ListAppendWrite {\n\tkind: \"list\";\n\top: \"append\";\n\tnamespace: string;\n\tkey: string;\n\tvalue: unknown;\n}\n\nexport interface ListDeleteWrite {\n\tkind: \"list\";\n\top: \"delete\";\n\tnamespace: string;\n\tkey: string;\n}\n\nexport type ValueWrite = ValueSetWrite | ValueDeleteWrite;\nexport type ListWrite = ListAppendWrite | ListDeleteWrite;\n\nfunction validateAddress(namespace: string, key: string): void {\n\tif (namespace.length === 0) throw new TypeError(\"Value namespace must not be empty\");\n\tif (namespace.includes(\"\\u0000\")) throw new TypeError(\"Value namespace must not contain \\\\u0000\");\n\tif (key.includes(\"\\u0000\")) throw new TypeError(\"Value key must not contain \\\\u0000\");\n}\n\nexport function value<T>(namespace: string, key = \"\"): Value<T> {\n\tvalidateAddress(namespace, key);\n\treturn Object.freeze({ namespace, key, kind: \"value\" }) as Value<T>;\n}\n\nexport function list<T>(namespace: string, key = \"\"): ValueList<T> {\n\tvalidateAddress(namespace, key);\n\treturn Object.freeze({ namespace, key, kind: \"list\" }) as ValueList<T>;\n}\n\nexport function setValue<T>(address: Value<T>, next: NoInfer<T>): ValueSetWrite {\n\treturn {\n\t\tkind: \"value\",\n\t\top: \"set\",\n\t\tnamespace: address.namespace,\n\t\tkey: address.key,\n\t\tvalue: next,\n\t};\n}\n\nexport function deleteValue<T>(address: Value<T>): ValueDeleteWrite {\n\treturn {\n\t\tkind: \"value\",\n\t\top: \"delete\",\n\t\tnamespace: address.namespace,\n\t\tkey: address.key,\n\t};\n}\n\nexport function appendList<T>(address: ValueList<T>, element: NoInfer<T>): ListAppendWrite {\n\treturn {\n\t\tkind: \"list\",\n\t\top: \"append\",\n\t\tnamespace: address.namespace,\n\t\tkey: address.key,\n\t\tvalue: element,\n\t};\n}\n\nexport function deleteList<T>(address: ValueList<T>): ListDeleteWrite {\n\treturn {\n\t\tkind: \"list\",\n\t\top: \"delete\",\n\t\tnamespace: address.namespace,\n\t\tkey: address.key,\n\t};\n}\n\nexport function resolveListReadOptions(options: ListReadOptions = {}): ResolvedListReadOptions {\n\tconst requestedLimit = options.limit ?? 1_000;\n\tif (!Number.isSafeInteger(requestedLimit) || requestedLimit <= 0) {\n\t\tthrow new TypeError(\"List read limit must be a positive safe integer\");\n\t}\n\treturn {\n\t\t...(options.cursor === undefined ? {} : { cursor: options.cursor }),\n\t\torder: options.order ?? \"asc\",\n\t\tlimit: Math.min(requestedLimit, 10_000),\n\t};\n}\n\nexport const branchTip = (branch: string) => value<string | null>(\"pi.branch.tip\", branch);\nexport const branchTipInventoryPrefix = () => value<string | null>(\"pi.branch.tip\");\nexport const laneConfig = (lane: string) => value<LaneConfiguration>(\"pi.lane.config\", lane);\nexport const laneState = (lane: string) => value<LaneState>(\"pi.lane.state\", lane);\nexport const operationResult = (operationId: string) => value<OperationResultRecord>(\"pi.result\", operationId);\n\nexport const operationMeta = (operationId: string) => value<OperationMeta>(\"pi.op.meta\", operationId);\nexport const operationState = (operationId: string) => value<OperationState>(\"pi.op.state\", operationId);\nexport const operationToolArgs = (operationId: string, stepId: string, sourceIndex: number) =>\n\tvalue<Record<string, JsonValue>>(\"pi.op.tool_args\", `${operationId}:${stepId}:${sourceIndex}`);\nexport const operationToolMemo = (operationId: string, invocationId: string, name: string) =>\n\tvalue<JsonValue>(\"pi.op.tool_memo\", `${operationId}:${invocationId}:${name}`);\nexport const operationPreparation = (operationId: string, taskId: string) =>\n\tvalue<DurableStructuralPreparation>(\"pi.op.preparation\", `${operationId}:${taskId}`);\n\nexport const operationToolArgsPrefix = (operationId: string, stepId?: string) =>\n\tvalue<Record<string, JsonValue>>(\n\t\t\"pi.op.tool_args\",\n\t\tstepId === undefined ? `${operationId}:` : `${operationId}:${stepId}:`,\n\t);\nexport const operationToolMemoPrefix = (operationId: string, invocationId?: string) =>\n\tvalue<JsonValue>(\n\t\t\"pi.op.tool_memo\",\n\t\tinvocationId === undefined ? `${operationId}:` : `${operationId}:${invocationId}:`,\n\t);\nexport const operationPreparationPrefix = (operationId: string) =>\n\tvalue<DurableStructuralPreparation>(\"pi.op.preparation\", `${operationId}:`);\n\nexport const pendingEntry = (entryId: string) => value<PendingEntry>(\"pi.pending.entry\", entryId);\nexport const pendingToolOutput = (operationId: string, invocationId: string) =>\n\tvalue<AgentToolResult<unknown>>(\"pi.pending.tool_output\", `${operationId}:${invocationId}`);\nexport const pendingAssistantFrames = (operationId: string, responseEntryId: string) =>\n\tlist<AssistantMessageFrame>(\"pi.pending.assistant_frame\", `${operationId}:${responseEntryId}`);\nexport const pendingToolOutputPrefix = (operationId: string) =>\n\tvalue<AgentToolResult<unknown>>(\"pi.pending.tool_output\", `${operationId}:`);\n\nexport const sessionName = value<string>(\"pi.session.name\");\nexport const entryLabel = (entryId: string) => value<string>(\"pi.entry.label\", entryId);\n"]}
@@ -0,0 +1,81 @@
1
+ function validateAddress(namespace, key) {
2
+ if (namespace.length === 0)
3
+ throw new TypeError("Value namespace must not be empty");
4
+ if (namespace.includes("\u0000"))
5
+ throw new TypeError("Value namespace must not contain \\u0000");
6
+ if (key.includes("\u0000"))
7
+ throw new TypeError("Value key must not contain \\u0000");
8
+ }
9
+ export function value(namespace, key = "") {
10
+ validateAddress(namespace, key);
11
+ return Object.freeze({ namespace, key, kind: "value" });
12
+ }
13
+ export function list(namespace, key = "") {
14
+ validateAddress(namespace, key);
15
+ return Object.freeze({ namespace, key, kind: "list" });
16
+ }
17
+ export function setValue(address, next) {
18
+ return {
19
+ kind: "value",
20
+ op: "set",
21
+ namespace: address.namespace,
22
+ key: address.key,
23
+ value: next,
24
+ };
25
+ }
26
+ export function deleteValue(address) {
27
+ return {
28
+ kind: "value",
29
+ op: "delete",
30
+ namespace: address.namespace,
31
+ key: address.key,
32
+ };
33
+ }
34
+ export function appendList(address, element) {
35
+ return {
36
+ kind: "list",
37
+ op: "append",
38
+ namespace: address.namespace,
39
+ key: address.key,
40
+ value: element,
41
+ };
42
+ }
43
+ export function deleteList(address) {
44
+ return {
45
+ kind: "list",
46
+ op: "delete",
47
+ namespace: address.namespace,
48
+ key: address.key,
49
+ };
50
+ }
51
+ export function resolveListReadOptions(options = {}) {
52
+ const requestedLimit = options.limit ?? 1_000;
53
+ if (!Number.isSafeInteger(requestedLimit) || requestedLimit <= 0) {
54
+ throw new TypeError("List read limit must be a positive safe integer");
55
+ }
56
+ return {
57
+ ...(options.cursor === undefined ? {} : { cursor: options.cursor }),
58
+ order: options.order ?? "asc",
59
+ limit: Math.min(requestedLimit, 10_000),
60
+ };
61
+ }
62
+ export const branchTip = (branch) => value("pi.branch.tip", branch);
63
+ export const branchTipInventoryPrefix = () => value("pi.branch.tip");
64
+ export const laneConfig = (lane) => value("pi.lane.config", lane);
65
+ export const laneState = (lane) => value("pi.lane.state", lane);
66
+ export const operationResult = (operationId) => value("pi.result", operationId);
67
+ export const operationMeta = (operationId) => value("pi.op.meta", operationId);
68
+ export const operationState = (operationId) => value("pi.op.state", operationId);
69
+ export const operationToolArgs = (operationId, stepId, sourceIndex) => value("pi.op.tool_args", `${operationId}:${stepId}:${sourceIndex}`);
70
+ export const operationToolMemo = (operationId, invocationId, name) => value("pi.op.tool_memo", `${operationId}:${invocationId}:${name}`);
71
+ export const operationPreparation = (operationId, taskId) => value("pi.op.preparation", `${operationId}:${taskId}`);
72
+ export const operationToolArgsPrefix = (operationId, stepId) => value("pi.op.tool_args", stepId === undefined ? `${operationId}:` : `${operationId}:${stepId}:`);
73
+ export const operationToolMemoPrefix = (operationId, invocationId) => value("pi.op.tool_memo", invocationId === undefined ? `${operationId}:` : `${operationId}:${invocationId}:`);
74
+ export const operationPreparationPrefix = (operationId) => value("pi.op.preparation", `${operationId}:`);
75
+ export const pendingEntry = (entryId) => value("pi.pending.entry", entryId);
76
+ export const pendingToolOutput = (operationId, invocationId) => value("pi.pending.tool_output", `${operationId}:${invocationId}`);
77
+ export const pendingAssistantFrames = (operationId, responseEntryId) => list("pi.pending.assistant_frame", `${operationId}:${responseEntryId}`);
78
+ export const pendingToolOutputPrefix = (operationId) => value("pi.pending.tool_output", `${operationId}:`);
79
+ export const sessionName = value("pi.session.name");
80
+ export const entryLabel = (entryId) => value("pi.entry.label", entryId);
81
+ //# sourceMappingURL=values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"values.js","sourceRoot":"","sources":["../../../src/harness/session/values.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessageFrame } from \"@earendil-works/pi-ai\";\nimport type { AgentToolResult } from \"../../types.ts\";\nimport type {\n\tDurableStructuralPreparation,\n\tJsonValue,\n\tLaneConfiguration,\n\tLaneState,\n\tOperationMeta,\n\tOperationResultRecord,\n\tOperationState,\n\tPendingEntry,\n} from \"./types.ts\";\n\ndeclare const storedValueType: unique symbol;\n\nexport interface StoredAddressBase {\n\treadonly namespace: string;\n\treadonly key: string;\n\treadonly kind: \"value\" | \"list\";\n}\n\nexport interface Value<T> extends StoredAddressBase {\n\treadonly kind: \"value\";\n\treadonly [storedValueType]?: (value: T) => T;\n}\n\nexport interface ValueList<T> extends StoredAddressBase {\n\treadonly kind: \"list\";\n\treadonly [storedValueType]?: (value: T) => T;\n}\n\nexport interface StoredValue<T> {\n\taddress: Value<T>;\n\tvalue: T;\n\tseq: number;\n}\n\nexport interface ListElement<T> {\n\tseq: number;\n\tvalue: T;\n}\n\nexport interface ListCursor {\n\tseq: number;\n}\n\nexport interface ListReadOptions {\n\tcursor?: ListCursor;\n\torder?: \"asc\" | \"desc\";\n\tlimit?: number;\n}\n\nexport interface ResolvedListReadOptions {\n\tcursor?: ListCursor;\n\torder: \"asc\" | \"desc\";\n\tlimit: number;\n}\n\nexport interface ValueSetWrite {\n\tkind: \"value\";\n\top: \"set\";\n\tnamespace: string;\n\tkey: string;\n\tvalue: unknown;\n}\n\nexport interface ValueDeleteWrite {\n\tkind: \"value\";\n\top: \"delete\";\n\tnamespace: string;\n\tkey: string;\n}\n\nexport interface ListAppendWrite {\n\tkind: \"list\";\n\top: \"append\";\n\tnamespace: string;\n\tkey: string;\n\tvalue: unknown;\n}\n\nexport interface ListDeleteWrite {\n\tkind: \"list\";\n\top: \"delete\";\n\tnamespace: string;\n\tkey: string;\n}\n\nexport type ValueWrite = ValueSetWrite | ValueDeleteWrite;\nexport type ListWrite = ListAppendWrite | ListDeleteWrite;\n\nfunction validateAddress(namespace: string, key: string): void {\n\tif (namespace.length === 0) throw new TypeError(\"Value namespace must not be empty\");\n\tif (namespace.includes(\"\\u0000\")) throw new TypeError(\"Value namespace must not contain \\\\u0000\");\n\tif (key.includes(\"\\u0000\")) throw new TypeError(\"Value key must not contain \\\\u0000\");\n}\n\nexport function value<T>(namespace: string, key = \"\"): Value<T> {\n\tvalidateAddress(namespace, key);\n\treturn Object.freeze({ namespace, key, kind: \"value\" }) as Value<T>;\n}\n\nexport function list<T>(namespace: string, key = \"\"): ValueList<T> {\n\tvalidateAddress(namespace, key);\n\treturn Object.freeze({ namespace, key, kind: \"list\" }) as ValueList<T>;\n}\n\nexport function setValue<T>(address: Value<T>, next: NoInfer<T>): ValueSetWrite {\n\treturn {\n\t\tkind: \"value\",\n\t\top: \"set\",\n\t\tnamespace: address.namespace,\n\t\tkey: address.key,\n\t\tvalue: next,\n\t};\n}\n\nexport function deleteValue<T>(address: Value<T>): ValueDeleteWrite {\n\treturn {\n\t\tkind: \"value\",\n\t\top: \"delete\",\n\t\tnamespace: address.namespace,\n\t\tkey: address.key,\n\t};\n}\n\nexport function appendList<T>(address: ValueList<T>, element: NoInfer<T>): ListAppendWrite {\n\treturn {\n\t\tkind: \"list\",\n\t\top: \"append\",\n\t\tnamespace: address.namespace,\n\t\tkey: address.key,\n\t\tvalue: element,\n\t};\n}\n\nexport function deleteList<T>(address: ValueList<T>): ListDeleteWrite {\n\treturn {\n\t\tkind: \"list\",\n\t\top: \"delete\",\n\t\tnamespace: address.namespace,\n\t\tkey: address.key,\n\t};\n}\n\nexport function resolveListReadOptions(options: ListReadOptions = {}): ResolvedListReadOptions {\n\tconst requestedLimit = options.limit ?? 1_000;\n\tif (!Number.isSafeInteger(requestedLimit) || requestedLimit <= 0) {\n\t\tthrow new TypeError(\"List read limit must be a positive safe integer\");\n\t}\n\treturn {\n\t\t...(options.cursor === undefined ? {} : { cursor: options.cursor }),\n\t\torder: options.order ?? \"asc\",\n\t\tlimit: Math.min(requestedLimit, 10_000),\n\t};\n}\n\nexport const branchTip = (branch: string) => value<string | null>(\"pi.branch.tip\", branch);\nexport const branchTipInventoryPrefix = () => value<string | null>(\"pi.branch.tip\");\nexport const laneConfig = (lane: string) => value<LaneConfiguration>(\"pi.lane.config\", lane);\nexport const laneState = (lane: string) => value<LaneState>(\"pi.lane.state\", lane);\nexport const operationResult = (operationId: string) => value<OperationResultRecord>(\"pi.result\", operationId);\n\nexport const operationMeta = (operationId: string) => value<OperationMeta>(\"pi.op.meta\", operationId);\nexport const operationState = (operationId: string) => value<OperationState>(\"pi.op.state\", operationId);\nexport const operationToolArgs = (operationId: string, stepId: string, sourceIndex: number) =>\n\tvalue<Record<string, JsonValue>>(\"pi.op.tool_args\", `${operationId}:${stepId}:${sourceIndex}`);\nexport const operationToolMemo = (operationId: string, invocationId: string, name: string) =>\n\tvalue<JsonValue>(\"pi.op.tool_memo\", `${operationId}:${invocationId}:${name}`);\nexport const operationPreparation = (operationId: string, taskId: string) =>\n\tvalue<DurableStructuralPreparation>(\"pi.op.preparation\", `${operationId}:${taskId}`);\n\nexport const operationToolArgsPrefix = (operationId: string, stepId?: string) =>\n\tvalue<Record<string, JsonValue>>(\n\t\t\"pi.op.tool_args\",\n\t\tstepId === undefined ? `${operationId}:` : `${operationId}:${stepId}:`,\n\t);\nexport const operationToolMemoPrefix = (operationId: string, invocationId?: string) =>\n\tvalue<JsonValue>(\n\t\t\"pi.op.tool_memo\",\n\t\tinvocationId === undefined ? `${operationId}:` : `${operationId}:${invocationId}:`,\n\t);\nexport const operationPreparationPrefix = (operationId: string) =>\n\tvalue<DurableStructuralPreparation>(\"pi.op.preparation\", `${operationId}:`);\n\nexport const pendingEntry = (entryId: string) => value<PendingEntry>(\"pi.pending.entry\", entryId);\nexport const pendingToolOutput = (operationId: string, invocationId: string) =>\n\tvalue<AgentToolResult<unknown>>(\"pi.pending.tool_output\", `${operationId}:${invocationId}`);\nexport const pendingAssistantFrames = (operationId: string, responseEntryId: string) =>\n\tlist<AssistantMessageFrame>(\"pi.pending.assistant_frame\", `${operationId}:${responseEntryId}`);\nexport const pendingToolOutputPrefix = (operationId: string) =>\n\tvalue<AgentToolResult<unknown>>(\"pi.pending.tool_output\", `${operationId}:`);\n\nexport const sessionName = value<string>(\"pi.session.name\");\nexport const entryLabel = (entryId: string) => value<string>(\"pi.entry.label\", entryId);\n"]}
@@ -1,3 +1,4 @@
1
+ import type { Context } from "./context.ts";
1
2
  import { type ExecutionEnv, type Skill } from "./types.ts";
2
3
  export type SkillDiagnosticCode = "file_info_failed" | "list_failed" | "read_failed" | "parse_failed" | "invalid_metadata";
3
4
  /** Warning produced while loading skills. */
@@ -20,7 +21,7 @@ export declare function formatSkillInvocation(skill: Skill, additionalInstructio
20
21
  * frontmatter, honors ignore files, and returns diagnostics for invalid declared skill files. Missing input
21
22
  * directories are skipped.
22
23
  */
23
- export declare function loadSkills(env: ExecutionEnv, dirs: string | string[]): Promise<{
24
+ export declare function loadSkills(env: ExecutionEnv, dirs: string | string[], context: Context): Promise<{
24
25
  skills: Skill[];
25
26
  diagnostics: SkillDiagnostic[];
26
27
  }>;
@@ -33,7 +34,7 @@ export declare function loadSkills(env: ExecutionEnv, dirs: string | string[]):
33
34
  export declare function loadSourcedSkills<TSource, TSkill extends Skill = Skill>(env: ExecutionEnv, inputs: Array<{
34
35
  path: string;
35
36
  source: TSource;
36
- }>, mapSkill?: (skill: Skill, source: TSource) => TSkill): Promise<{
37
+ }>, mapSkill: ((skill: Skill, source: TSource, context: Context) => TSkill) | undefined, context: Context): Promise<{
37
38
  skills: Array<{
38
39
  skill: TSkill;
39
40
  source: TSource;
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/harness/skills.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAA8B,KAAK,KAAK,EAAW,MAAM,YAAY,CAAC;AAQhG,MAAM,MAAM,mBAAmB,GAC5B,kBAAkB,GAClB,aAAa,GACb,aAAa,GACb,cAAc,GACd,kBAAkB,CAAC;AAEtB,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC/B,gEAAgE;IAChE,IAAI,EAAE,SAAS,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACb;AASD,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,sBAAsB,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3F;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC/B,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GACrB,OAAO,CAAC;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,WAAW,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAuB9D;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,EAC5E,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,EAChD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,KAAK,MAAM,GAClD,OAAO,CAAC;IACV,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClD,WAAW,EAAE,KAAK,CAAC,eAAe,GAAG;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC1D,CAAC,CAWD","sourcesContent":["import ignore from \"ignore\";\nimport { parse } from \"yaml\";\nimport { type ExecutionEnv, type FileInfo, type Result, type Skill, toError } from \"./types.ts\";\n\nconst MAX_NAME_LENGTH = 64;\nconst MAX_DESCRIPTION_LENGTH = 1024;\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\n\ntype IgnoreMatcher = ReturnType<typeof ignore>;\n\nexport type SkillDiagnosticCode =\n\t| \"file_info_failed\"\n\t| \"list_failed\"\n\t| \"read_failed\"\n\t| \"parse_failed\"\n\t| \"invalid_metadata\";\n\n/** Warning produced while loading skills. */\nexport interface SkillDiagnostic {\n\t/** Diagnostic severity. Currently only warnings are emitted. */\n\ttype: \"warning\";\n\t/** Stable diagnostic code. */\n\tcode: SkillDiagnosticCode;\n\t/** Human-readable diagnostic message. */\n\tmessage: string;\n\t/** Path associated with the diagnostic. */\n\tpath: string;\n}\n\ninterface SkillFrontmatter {\n\tname?: string;\n\tdescription?: string;\n\t\"disable-model-invocation\"?: boolean;\n\t[key: string]: unknown;\n}\n\n/** Format a skill invocation prompt, optionally appending additional user instructions. */\nexport function formatSkillInvocation(skill: Skill, additionalInstructions?: string): string {\n\tconst skillBlock = `<skill name=\"${skill.name}\" location=\"${skill.filePath}\">\\nReferences are relative to ${dirnameEnvPath(skill.filePath)}.\\n\\n${skill.content}\\n</skill>`;\n\treturn additionalInstructions ? `${skillBlock}\\n\\n${additionalInstructions}` : skillBlock;\n}\n\n/**\n * Load skills from one or more directories.\n *\n * Traverses directories recursively, loads `SKILL.md` files, loads direct root `.md` files with skill\n * frontmatter, honors ignore files, and returns diagnostics for invalid declared skill files. Missing input\n * directories are skipped.\n */\nexport async function loadSkills(\n\tenv: ExecutionEnv,\n\tdirs: string | string[],\n): Promise<{ skills: Skill[]; diagnostics: SkillDiagnostic[] }> {\n\tconst skills: Skill[] = [];\n\tconst diagnostics: SkillDiagnostic[] = [];\n\tfor (const dir of Array.isArray(dirs) ? dirs : [dirs]) {\n\t\tconst rootInfoResult = await env.fileInfo(dir);\n\t\tif (!rootInfoResult.ok) {\n\t\t\tif (rootInfoResult.error.code !== \"not_found\") {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\t\tmessage: rootInfoResult.error.message,\n\t\t\t\t\tpath: dir,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst rootInfo = rootInfoResult.value;\n\t\tif ((await resolveKind(env, rootInfo, diagnostics)) !== \"directory\") continue;\n\t\tconst result = await loadSkillsFromDirInternal(env, rootInfo.path, true, ignore(), rootInfo.path);\n\t\tskills.push(...result.skills);\n\t\tdiagnostics.push(...result.diagnostics);\n\t}\n\treturn { skills, diagnostics };\n}\n\n/**\n * Load skills from source-tagged directories.\n *\n * Source values are preserved exactly and attached to every loaded skill and diagnostic. The agent package does not\n * interpret source values; applications define their own provenance shape.\n */\nexport async function loadSourcedSkills<TSource, TSkill extends Skill = Skill>(\n\tenv: ExecutionEnv,\n\tinputs: Array<{ path: string; source: TSource }>,\n\tmapSkill?: (skill: Skill, source: TSource) => TSkill,\n): Promise<{\n\tskills: Array<{ skill: TSkill; source: TSource }>;\n\tdiagnostics: Array<SkillDiagnostic & { source: TSource }>;\n}> {\n\tconst skills: Array<{ skill: TSkill; source: TSource }> = [];\n\tconst diagnostics: Array<SkillDiagnostic & { source: TSource }> = [];\n\tfor (const input of inputs) {\n\t\tconst result = await loadSkills(env, input.path);\n\t\tfor (const skill of result.skills) {\n\t\t\tskills.push({ skill: mapSkill ? mapSkill(skill, input.source) : (skill as TSkill), source: input.source });\n\t\t}\n\t\tfor (const diagnostic of result.diagnostics) diagnostics.push({ ...diagnostic, source: input.source });\n\t}\n\treturn { skills, diagnostics };\n}\n\nasync function loadSkillsFromDirInternal(\n\tenv: ExecutionEnv,\n\tdir: string,\n\tincludeRootFiles: boolean,\n\tignoreMatcher: IgnoreMatcher,\n\trootDir: string,\n): Promise<{ skills: Skill[]; diagnostics: SkillDiagnostic[] }> {\n\tconst skills: Skill[] = [];\n\tconst diagnostics: SkillDiagnostic[] = [];\n\n\tconst dirInfoResult = await env.fileInfo(dir);\n\tif (!dirInfoResult.ok) {\n\t\tif (dirInfoResult.error.code !== \"not_found\") {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\tmessage: dirInfoResult.error.message,\n\t\t\t\tpath: dir,\n\t\t\t});\n\t\t}\n\t\treturn { skills, diagnostics };\n\t}\n\tconst dirInfo = dirInfoResult.value;\n\tif ((await resolveKind(env, dirInfo, diagnostics)) !== \"directory\") return { skills, diagnostics };\n\n\tawait addIgnoreRules(env, ignoreMatcher, dir, rootDir, diagnostics);\n\n\tconst entriesResult = await env.listDir(dir);\n\tif (!entriesResult.ok) {\n\t\tdiagnostics.push({ type: \"warning\", code: \"list_failed\", message: entriesResult.error.message, path: dir });\n\t\treturn { skills, diagnostics };\n\t}\n\tconst entries = entriesResult.value;\n\n\tfor (const entry of entries) {\n\t\tif (entry.name !== \"SKILL.md\") continue;\n\t\tconst fullPath = entry.path;\n\t\tconst kind = await resolveKind(env, entry, diagnostics);\n\t\tif (kind !== \"file\") continue;\n\t\tconst relPath = relativeEnvPath(rootDir, fullPath);\n\t\tif (ignoreMatcher.ignores(relPath)) continue;\n\n\t\tconst result = await loadSkillFromFile(env, fullPath, dirInfo.name);\n\t\tif (result.skill) skills.push(result.skill);\n\t\tdiagnostics.push(...result.diagnostics);\n\t\treturn { skills, diagnostics };\n\t}\n\n\tfor (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\tconst fullPath = entry.path;\n\t\tconst kind = await resolveKind(env, entry, diagnostics);\n\t\tif (!kind) continue;\n\n\t\tconst relPath = relativeEnvPath(rootDir, fullPath);\n\t\tconst ignorePath = kind === \"directory\" ? `${relPath}/` : relPath;\n\t\tif (ignoreMatcher.ignores(ignorePath)) continue;\n\n\t\tif (kind === \"directory\") {\n\t\t\tconst result = await loadSkillsFromDirInternal(env, fullPath, false, ignoreMatcher, rootDir);\n\t\t\tskills.push(...result.skills);\n\t\t\tdiagnostics.push(...result.diagnostics);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (kind !== \"file\" || !includeRootFiles || !entry.name.endsWith(\".md\")) continue;\n\t\tconst result = await loadSkillFromFile(env, fullPath, dirInfo.name);\n\t\tif (result.skill) skills.push(result.skill);\n\t\tdiagnostics.push(...result.diagnostics);\n\t}\n\n\treturn { skills, diagnostics };\n}\n\nasync function addIgnoreRules(\n\tenv: ExecutionEnv,\n\tig: IgnoreMatcher,\n\tdir: string,\n\trootDir: string,\n\tdiagnostics: SkillDiagnostic[],\n): Promise<void> {\n\tconst relativeDir = relativeEnvPath(rootDir, dir);\n\tconst prefix = relativeDir ? `${relativeDir}/` : \"\";\n\n\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\tconst ignorePathResult = await env.joinPath([dir, filename]);\n\t\tif (!ignorePathResult.ok) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\tmessage: ignorePathResult.error.message,\n\t\t\t\tpath: dir,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst ignorePath = ignorePathResult.value;\n\t\tconst info = await env.fileInfo(ignorePath);\n\t\tif (!info.ok) {\n\t\t\tif (info.error.code !== \"not_found\") {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\t\tmessage: info.error.message,\n\t\t\t\t\tpath: ignorePath,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (info.value.kind !== \"file\") continue;\n\t\tconst content = await env.readTextFile(ignorePath);\n\t\tif (!content.ok) {\n\t\t\tdiagnostics.push({ type: \"warning\", code: \"read_failed\", message: content.error.message, path: ignorePath });\n\t\t\tcontinue;\n\t\t}\n\t\tconst patterns = content.value\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t.filter((line): line is string => Boolean(line));\n\t\tif (patterns.length > 0) ig.add(patterns);\n\t}\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed) return null;\n\tif (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\")) return null;\n\n\tlet pattern = line;\n\tlet negated = false;\n\tif (pattern.startsWith(\"!\")) {\n\t\tnegated = true;\n\t\tpattern = pattern.slice(1);\n\t} else if (pattern.startsWith(\"\\\\!\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\tif (pattern.startsWith(\"/\")) pattern = pattern.slice(1);\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nasync function loadSkillFromFile(\n\tenv: ExecutionEnv,\n\tfilePath: string,\n\tparentDirName: string,\n): Promise<{ skill: Skill | null; diagnostics: SkillDiagnostic[] }> {\n\tconst diagnostics: SkillDiagnostic[] = [];\n\tconst isDeclaredSkill =\n\t\tfilePath\n\t\t\t.replace(/[\\\\/]+$/, \"\")\n\t\t\t.split(/[\\\\/]/)\n\t\t\t.pop() === \"SKILL.md\";\n\tconst rawContent = await env.readTextFile(filePath);\n\tif (!rawContent.ok) {\n\t\tdiagnostics.push({ type: \"warning\", code: \"read_failed\", message: rawContent.error.message, path: filePath });\n\t\treturn { skill: null, diagnostics };\n\t}\n\n\tconst parsed = parseFrontmatter<SkillFrontmatter>(rawContent.value);\n\tif (!parsed.ok) {\n\t\tif (isDeclaredSkill) {\n\t\t\tdiagnostics.push({ type: \"warning\", code: \"parse_failed\", message: parsed.error.message, path: filePath });\n\t\t}\n\t\treturn { skill: null, diagnostics };\n\t}\n\n\tconst { frontmatter, body } = parsed.value;\n\tconst description = typeof frontmatter.description === \"string\" ? frontmatter.description : undefined;\n\tif (!isDeclaredSkill && (!description || description.trim() === \"\")) {\n\t\treturn { skill: null, diagnostics };\n\t}\n\n\tfor (const error of validateDescription(description)) {\n\t\tdiagnostics.push({ type: \"warning\", code: \"invalid_metadata\", message: error, path: filePath });\n\t}\n\n\tconst frontmatterName = typeof frontmatter.name === \"string\" ? frontmatter.name : undefined;\n\tconst name = frontmatterName || parentDirName;\n\tfor (const error of validateName(name, parentDirName)) {\n\t\tdiagnostics.push({ type: \"warning\", code: \"invalid_metadata\", message: error, path: filePath });\n\t}\n\n\tif (!description || description.trim() === \"\") {\n\t\treturn { skill: null, diagnostics };\n\t}\n\n\treturn {\n\t\tskill: {\n\t\t\tname,\n\t\t\tdescription,\n\t\t\tcontent: body,\n\t\t\tfilePath,\n\t\t\tdisableModelInvocation: frontmatter[\"disable-model-invocation\"] === true,\n\t\t},\n\t\tdiagnostics,\n\t};\n}\n\nfunction validateName(name: string, parentDirName: string): string[] {\n\tconst errors: string[] = [];\n\tif (name !== parentDirName) errors.push(`name \"${name}\" does not match parent directory \"${parentDirName}\"`);\n\tif (name.length > MAX_NAME_LENGTH) errors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);\n\tif (!/^[a-z0-9-]+$/.test(name)) {\n\t\terrors.push(\"name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)\");\n\t}\n\tif (name.startsWith(\"-\") || name.endsWith(\"-\")) errors.push(\"name must not start or end with a hyphen\");\n\tif (name.includes(\"--\")) errors.push(\"name must not contain consecutive hyphens\");\n\treturn errors;\n}\n\nfunction validateDescription(description: string | undefined): string[] {\n\tconst errors: string[] = [];\n\tif (!description || description.trim() === \"\") {\n\t\terrors.push(\"description is required\");\n\t} else if (description.length > MAX_DESCRIPTION_LENGTH) {\n\t\terrors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`);\n\t}\n\treturn errors;\n}\n\nfunction parseFrontmatter<T extends Record<string, unknown>>(\n\tcontent: string,\n): Result<{ frontmatter: T; body: string }, Error> {\n\ttry {\n\t\tconst normalized = content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\t\tif (!normalized.startsWith(\"---\")) return { ok: true, value: { frontmatter: {} as T, body: normalized } };\n\t\tconst endIndex = normalized.indexOf(\"\\n---\", 3);\n\t\tif (endIndex === -1) return { ok: true, value: { frontmatter: {} as T, body: normalized } };\n\t\tconst yamlString = normalized.slice(4, endIndex);\n\t\tconst body = normalized.slice(endIndex + 4).trim();\n\t\treturn { ok: true, value: { frontmatter: (parse(yamlString) ?? {}) as T, body } };\n\t} catch (error) {\n\t\treturn { ok: false, error: toError(error) };\n\t}\n}\n\nasync function resolveKind(\n\tenv: ExecutionEnv,\n\tinfo: FileInfo,\n\tdiagnostics: SkillDiagnostic[],\n): Promise<\"file\" | \"directory\" | undefined> {\n\tif (info.kind === \"file\" || info.kind === \"directory\") return info.kind;\n\tconst canonicalPath = await env.canonicalPath(info.path);\n\tif (!canonicalPath.ok) {\n\t\tif (canonicalPath.error.code !== \"not_found\") {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\tmessage: canonicalPath.error.message,\n\t\t\t\tpath: info.path,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\tconst target = await env.fileInfo(canonicalPath.value);\n\tif (!target.ok) {\n\t\tif (target.error.code !== \"not_found\") {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\tmessage: target.error.message,\n\t\t\t\tpath: info.path,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\treturn target.value.kind === \"file\" || target.value.kind === \"directory\" ? target.value.kind : undefined;\n}\n\nfunction dirnameEnvPath(path: string): string {\n\tconst normalized = path.replace(/[\\\\/]+$/, \"\");\n\tconst separatorIndex = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\n\tif (separatorIndex === 2 && normalized[1] === \":\") return normalized.slice(0, 3);\n\treturn separatorIndex <= 0 ? \"/\" : normalized.slice(0, separatorIndex);\n}\n\nfunction relativeEnvPath(root: string, path: string): string {\n\tconst normalizedRoot = root.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n\tconst normalizedPath = path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n\tif (normalizedPath === normalizedRoot) return \"\";\n\treturn normalizedPath.startsWith(`${normalizedRoot}/`)\n\t\t? normalizedPath.slice(normalizedRoot.length + 1)\n\t\t: normalizedPath.replace(/^\\/+/, \"\");\n}\n"]}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/harness/skills.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,KAAK,YAAY,EAA8B,KAAK,KAAK,EAAW,MAAM,YAAY,CAAC;AAQhG,MAAM,MAAM,mBAAmB,GAC5B,kBAAkB,GAClB,aAAa,GACb,aAAa,GACb,cAAc,GACd,kBAAkB,CAAC;AAEtB,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC/B,gEAAgE;IAChE,IAAI,EAAE,SAAS,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACb;AASD,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,sBAAsB,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3F;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC/B,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,OAAO,EAAE,OAAO,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,WAAW,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAuB9D;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,EAC5E,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,EAChD,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,GAAG,SAAS,EACnF,OAAO,EAAE,OAAO,GACd,OAAO,CAAC;IACV,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClD,WAAW,EAAE,KAAK,CAAC,eAAe,GAAG;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC1D,CAAC,CAcD","sourcesContent":["import ignore from \"ignore\";\nimport { parse } from \"yaml\";\nimport type { Context } from \"./context.ts\";\nimport { type ExecutionEnv, type FileInfo, type Result, type Skill, toError } from \"./types.ts\";\n\nconst MAX_NAME_LENGTH = 64;\nconst MAX_DESCRIPTION_LENGTH = 1024;\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\n\ntype IgnoreMatcher = ReturnType<typeof ignore>;\n\nexport type SkillDiagnosticCode =\n\t| \"file_info_failed\"\n\t| \"list_failed\"\n\t| \"read_failed\"\n\t| \"parse_failed\"\n\t| \"invalid_metadata\";\n\n/** Warning produced while loading skills. */\nexport interface SkillDiagnostic {\n\t/** Diagnostic severity. Currently only warnings are emitted. */\n\ttype: \"warning\";\n\t/** Stable diagnostic code. */\n\tcode: SkillDiagnosticCode;\n\t/** Human-readable diagnostic message. */\n\tmessage: string;\n\t/** Path associated with the diagnostic. */\n\tpath: string;\n}\n\ninterface SkillFrontmatter {\n\tname?: string;\n\tdescription?: string;\n\t\"disable-model-invocation\"?: boolean;\n\t[key: string]: unknown;\n}\n\n/** Format a skill invocation prompt, optionally appending additional user instructions. */\nexport function formatSkillInvocation(skill: Skill, additionalInstructions?: string): string {\n\tconst skillBlock = `<skill name=\"${skill.name}\" location=\"${skill.filePath}\">\\nReferences are relative to ${dirnameEnvPath(skill.filePath)}.\\n\\n${skill.content}\\n</skill>`;\n\treturn additionalInstructions ? `${skillBlock}\\n\\n${additionalInstructions}` : skillBlock;\n}\n\n/**\n * Load skills from one or more directories.\n *\n * Traverses directories recursively, loads `SKILL.md` files, loads direct root `.md` files with skill\n * frontmatter, honors ignore files, and returns diagnostics for invalid declared skill files. Missing input\n * directories are skipped.\n */\nexport async function loadSkills(\n\tenv: ExecutionEnv,\n\tdirs: string | string[],\n\tcontext: Context,\n): Promise<{ skills: Skill[]; diagnostics: SkillDiagnostic[] }> {\n\tconst skills: Skill[] = [];\n\tconst diagnostics: SkillDiagnostic[] = [];\n\tfor (const dir of Array.isArray(dirs) ? dirs : [dirs]) {\n\t\tconst rootInfoResult = await env.fileInfo(dir, context);\n\t\tif (!rootInfoResult.ok) {\n\t\t\tif (rootInfoResult.error.code !== \"not_found\") {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\t\tmessage: rootInfoResult.error.message,\n\t\t\t\t\tpath: dir,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst rootInfo = rootInfoResult.value;\n\t\tif ((await resolveKind(env, rootInfo, diagnostics, context)) !== \"directory\") continue;\n\t\tconst result = await loadSkillsFromDirInternal(env, rootInfo.path, true, ignore(), rootInfo.path, context);\n\t\tskills.push(...result.skills);\n\t\tdiagnostics.push(...result.diagnostics);\n\t}\n\treturn { skills, diagnostics };\n}\n\n/**\n * Load skills from source-tagged directories.\n *\n * Source values are preserved exactly and attached to every loaded skill and diagnostic. The agent package does not\n * interpret source values; applications define their own provenance shape.\n */\nexport async function loadSourcedSkills<TSource, TSkill extends Skill = Skill>(\n\tenv: ExecutionEnv,\n\tinputs: Array<{ path: string; source: TSource }>,\n\tmapSkill: ((skill: Skill, source: TSource, context: Context) => TSkill) | undefined,\n\tcontext: Context,\n): Promise<{\n\tskills: Array<{ skill: TSkill; source: TSource }>;\n\tdiagnostics: Array<SkillDiagnostic & { source: TSource }>;\n}> {\n\tconst skills: Array<{ skill: TSkill; source: TSource }> = [];\n\tconst diagnostics: Array<SkillDiagnostic & { source: TSource }> = [];\n\tfor (const input of inputs) {\n\t\tconst result = await loadSkills(env, input.path, context);\n\t\tfor (const skill of result.skills) {\n\t\t\tskills.push({\n\t\t\t\tskill: mapSkill ? mapSkill(skill, input.source, context) : (skill as TSkill),\n\t\t\t\tsource: input.source,\n\t\t\t});\n\t\t}\n\t\tfor (const diagnostic of result.diagnostics) diagnostics.push({ ...diagnostic, source: input.source });\n\t}\n\treturn { skills, diagnostics };\n}\n\nasync function loadSkillsFromDirInternal(\n\tenv: ExecutionEnv,\n\tdir: string,\n\tincludeRootFiles: boolean,\n\tignoreMatcher: IgnoreMatcher,\n\trootDir: string,\n\tcontext: Context,\n): Promise<{ skills: Skill[]; diagnostics: SkillDiagnostic[] }> {\n\tconst skills: Skill[] = [];\n\tconst diagnostics: SkillDiagnostic[] = [];\n\n\tconst dirInfoResult = await env.fileInfo(dir, context);\n\tif (!dirInfoResult.ok) {\n\t\tif (dirInfoResult.error.code !== \"not_found\") {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\tmessage: dirInfoResult.error.message,\n\t\t\t\tpath: dir,\n\t\t\t});\n\t\t}\n\t\treturn { skills, diagnostics };\n\t}\n\tconst dirInfo = dirInfoResult.value;\n\tif ((await resolveKind(env, dirInfo, diagnostics, context)) !== \"directory\") return { skills, diagnostics };\n\n\tawait addIgnoreRules(env, ignoreMatcher, dir, rootDir, diagnostics, context);\n\n\tconst entriesResult = await env.listDir(dir, context);\n\tif (!entriesResult.ok) {\n\t\tdiagnostics.push({ type: \"warning\", code: \"list_failed\", message: entriesResult.error.message, path: dir });\n\t\treturn { skills, diagnostics };\n\t}\n\tconst entries = entriesResult.value;\n\n\tfor (const entry of entries) {\n\t\tif (entry.name !== \"SKILL.md\") continue;\n\t\tconst fullPath = entry.path;\n\t\tconst kind = await resolveKind(env, entry, diagnostics, context);\n\t\tif (kind !== \"file\") continue;\n\t\tconst relPath = relativeEnvPath(rootDir, fullPath);\n\t\tif (ignoreMatcher.ignores(relPath)) continue;\n\n\t\tconst result = await loadSkillFromFile(env, fullPath, dirInfo.name, context);\n\t\tif (result.skill) skills.push(result.skill);\n\t\tdiagnostics.push(...result.diagnostics);\n\t\treturn { skills, diagnostics };\n\t}\n\n\tfor (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n\t\tif (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\t\tconst fullPath = entry.path;\n\t\tconst kind = await resolveKind(env, entry, diagnostics, context);\n\t\tif (!kind) continue;\n\n\t\tconst relPath = relativeEnvPath(rootDir, fullPath);\n\t\tconst ignorePath = kind === \"directory\" ? `${relPath}/` : relPath;\n\t\tif (ignoreMatcher.ignores(ignorePath)) continue;\n\n\t\tif (kind === \"directory\") {\n\t\t\tconst result = await loadSkillsFromDirInternal(env, fullPath, false, ignoreMatcher, rootDir, context);\n\t\t\tskills.push(...result.skills);\n\t\t\tdiagnostics.push(...result.diagnostics);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (kind !== \"file\" || !includeRootFiles || !entry.name.endsWith(\".md\")) continue;\n\t\tconst result = await loadSkillFromFile(env, fullPath, dirInfo.name, context);\n\t\tif (result.skill) skills.push(result.skill);\n\t\tdiagnostics.push(...result.diagnostics);\n\t}\n\n\treturn { skills, diagnostics };\n}\n\nasync function addIgnoreRules(\n\tenv: ExecutionEnv,\n\tig: IgnoreMatcher,\n\tdir: string,\n\trootDir: string,\n\tdiagnostics: SkillDiagnostic[],\n\tcontext: Context,\n): Promise<void> {\n\tconst relativeDir = relativeEnvPath(rootDir, dir);\n\tconst prefix = relativeDir ? `${relativeDir}/` : \"\";\n\n\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\tconst ignorePathResult = await env.joinPath([dir, filename], context);\n\t\tif (!ignorePathResult.ok) {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\tmessage: ignorePathResult.error.message,\n\t\t\t\tpath: dir,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst ignorePath = ignorePathResult.value;\n\t\tconst info = await env.fileInfo(ignorePath, context);\n\t\tif (!info.ok) {\n\t\t\tif (info.error.code !== \"not_found\") {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\t\tmessage: info.error.message,\n\t\t\t\t\tpath: ignorePath,\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (info.value.kind !== \"file\") continue;\n\t\tconst content = await env.readTextFile(ignorePath, context);\n\t\tif (!content.ok) {\n\t\t\tdiagnostics.push({ type: \"warning\", code: \"read_failed\", message: content.error.message, path: ignorePath });\n\t\t\tcontinue;\n\t\t}\n\t\tconst patterns = content.value\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t.filter((line): line is string => Boolean(line));\n\t\tif (patterns.length > 0) ig.add(patterns);\n\t}\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed) return null;\n\tif (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\")) return null;\n\n\tlet pattern = line;\n\tlet negated = false;\n\tif (pattern.startsWith(\"!\")) {\n\t\tnegated = true;\n\t\tpattern = pattern.slice(1);\n\t} else if (pattern.startsWith(\"\\\\!\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\tif (pattern.startsWith(\"/\")) pattern = pattern.slice(1);\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nasync function loadSkillFromFile(\n\tenv: ExecutionEnv,\n\tfilePath: string,\n\tparentDirName: string,\n\tcontext: Context,\n): Promise<{ skill: Skill | null; diagnostics: SkillDiagnostic[] }> {\n\tconst diagnostics: SkillDiagnostic[] = [];\n\tconst isDeclaredSkill =\n\t\tfilePath\n\t\t\t.replace(/[\\\\/]+$/, \"\")\n\t\t\t.split(/[\\\\/]/)\n\t\t\t.pop() === \"SKILL.md\";\n\tconst rawContent = await env.readTextFile(filePath, context);\n\tif (!rawContent.ok) {\n\t\tdiagnostics.push({ type: \"warning\", code: \"read_failed\", message: rawContent.error.message, path: filePath });\n\t\treturn { skill: null, diagnostics };\n\t}\n\n\tconst parsed = parseFrontmatter<SkillFrontmatter>(rawContent.value);\n\tif (!parsed.ok) {\n\t\tif (isDeclaredSkill) {\n\t\t\tdiagnostics.push({ type: \"warning\", code: \"parse_failed\", message: parsed.error.message, path: filePath });\n\t\t}\n\t\treturn { skill: null, diagnostics };\n\t}\n\n\tconst { frontmatter, body } = parsed.value;\n\tconst description = typeof frontmatter.description === \"string\" ? frontmatter.description : undefined;\n\tif (!isDeclaredSkill && (!description || description.trim() === \"\")) {\n\t\treturn { skill: null, diagnostics };\n\t}\n\n\tfor (const error of validateDescription(description)) {\n\t\tdiagnostics.push({ type: \"warning\", code: \"invalid_metadata\", message: error, path: filePath });\n\t}\n\n\tconst frontmatterName = typeof frontmatter.name === \"string\" ? frontmatter.name : undefined;\n\tconst name = frontmatterName || parentDirName;\n\tfor (const error of validateName(name, parentDirName)) {\n\t\tdiagnostics.push({ type: \"warning\", code: \"invalid_metadata\", message: error, path: filePath });\n\t}\n\n\tif (!description || description.trim() === \"\") {\n\t\treturn { skill: null, diagnostics };\n\t}\n\n\treturn {\n\t\tskill: {\n\t\t\tname,\n\t\t\tdescription,\n\t\t\tcontent: body,\n\t\t\tfilePath,\n\t\t\tdisableModelInvocation: frontmatter[\"disable-model-invocation\"] === true,\n\t\t},\n\t\tdiagnostics,\n\t};\n}\n\nfunction validateName(name: string, parentDirName: string): string[] {\n\tconst errors: string[] = [];\n\tif (name !== parentDirName) errors.push(`name \"${name}\" does not match parent directory \"${parentDirName}\"`);\n\tif (name.length > MAX_NAME_LENGTH) errors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);\n\tif (!/^[a-z0-9-]+$/.test(name)) {\n\t\terrors.push(\"name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)\");\n\t}\n\tif (name.startsWith(\"-\") || name.endsWith(\"-\")) errors.push(\"name must not start or end with a hyphen\");\n\tif (name.includes(\"--\")) errors.push(\"name must not contain consecutive hyphens\");\n\treturn errors;\n}\n\nfunction validateDescription(description: string | undefined): string[] {\n\tconst errors: string[] = [];\n\tif (!description || description.trim() === \"\") {\n\t\terrors.push(\"description is required\");\n\t} else if (description.length > MAX_DESCRIPTION_LENGTH) {\n\t\terrors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`);\n\t}\n\treturn errors;\n}\n\nfunction parseFrontmatter<T extends Record<string, unknown>>(\n\tcontent: string,\n): Result<{ frontmatter: T; body: string }, Error> {\n\ttry {\n\t\tconst normalized = content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\t\tif (!normalized.startsWith(\"---\")) return { ok: true, value: { frontmatter: {} as T, body: normalized } };\n\t\tconst endIndex = normalized.indexOf(\"\\n---\", 3);\n\t\tif (endIndex === -1) return { ok: true, value: { frontmatter: {} as T, body: normalized } };\n\t\tconst yamlString = normalized.slice(4, endIndex);\n\t\tconst body = normalized.slice(endIndex + 4).trim();\n\t\treturn { ok: true, value: { frontmatter: (parse(yamlString) ?? {}) as T, body } };\n\t} catch (error) {\n\t\treturn { ok: false, error: toError(error) };\n\t}\n}\n\nasync function resolveKind(\n\tenv: ExecutionEnv,\n\tinfo: FileInfo,\n\tdiagnostics: SkillDiagnostic[],\n\tcontext: Context,\n): Promise<\"file\" | \"directory\" | undefined> {\n\tif (info.kind === \"file\" || info.kind === \"directory\") return info.kind;\n\tconst canonicalPath = await env.canonicalPath(info.path, context);\n\tif (!canonicalPath.ok) {\n\t\tif (canonicalPath.error.code !== \"not_found\") {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\tmessage: canonicalPath.error.message,\n\t\t\t\tpath: info.path,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\tconst target = await env.fileInfo(canonicalPath.value, context);\n\tif (!target.ok) {\n\t\tif (target.error.code !== \"not_found\") {\n\t\t\tdiagnostics.push({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tcode: \"file_info_failed\",\n\t\t\t\tmessage: target.error.message,\n\t\t\t\tpath: info.path,\n\t\t\t});\n\t\t}\n\t\treturn undefined;\n\t}\n\treturn target.value.kind === \"file\" || target.value.kind === \"directory\" ? target.value.kind : undefined;\n}\n\nfunction dirnameEnvPath(path: string): string {\n\tconst normalized = path.replace(/[\\\\/]+$/, \"\");\n\tconst separatorIndex = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\n\tif (separatorIndex === 2 && normalized[1] === \":\") return normalized.slice(0, 3);\n\treturn separatorIndex <= 0 ? \"/\" : normalized.slice(0, separatorIndex);\n}\n\nfunction relativeEnvPath(root: string, path: string): string {\n\tconst normalizedRoot = root.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n\tconst normalizedPath = path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n\tif (normalizedPath === normalizedRoot) return \"\";\n\treturn normalizedPath.startsWith(`${normalizedRoot}/`)\n\t\t? normalizedPath.slice(normalizedRoot.length + 1)\n\t\t: normalizedPath.replace(/^\\/+/, \"\");\n}\n"]}