@draht/agent-core 2026.10.20 → 2026.10.23-1

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 (468) hide show
  1. package/dist/agent-loop.d.ts +6 -1
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +16 -2
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/agent.d.ts +8 -1
  6. package/dist/agent.d.ts.map +1 -1
  7. package/dist/agent.js +4 -0
  8. package/dist/agent.js.map +1 -1
  9. package/dist/index.d.ts +0 -22
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +0 -20
  12. package/dist/index.js.map +1 -1
  13. package/dist/proxy.d.ts +2 -5
  14. package/dist/proxy.d.ts.map +1 -1
  15. package/dist/proxy.js +2 -14
  16. package/dist/proxy.js.map +1 -1
  17. package/dist/types.d.ts +4 -0
  18. package/dist/types.d.ts.map +1 -1
  19. package/dist/types.js.map +1 -1
  20. package/package.json +4 -47
  21. package/dist/harness/agent-harness.d.ts +0 -716
  22. package/dist/harness/agent-harness.d.ts.map +0 -1
  23. package/dist/harness/agent-harness.js +0 -6
  24. package/dist/harness/agent-harness.js.map +0 -1
  25. package/dist/harness/compaction/branch-summarization.d.ts +0 -68
  26. package/dist/harness/compaction/branch-summarization.d.ts.map +0 -1
  27. package/dist/harness/compaction/branch-summarization.js +0 -176
  28. package/dist/harness/compaction/branch-summarization.js.map +0 -1
  29. package/dist/harness/compaction/compaction.d.ts +0 -126
  30. package/dist/harness/compaction/compaction.d.ts.map +0 -1
  31. package/dist/harness/compaction/compaction.js +0 -561
  32. package/dist/harness/compaction/compaction.js.map +0 -1
  33. package/dist/harness/compaction/utils.d.ts +0 -28
  34. package/dist/harness/compaction/utils.d.ts.map +0 -1
  35. package/dist/harness/compaction/utils.js +0 -123
  36. package/dist/harness/compaction/utils.js.map +0 -1
  37. package/dist/harness/config.d.ts +0 -9
  38. package/dist/harness/config.d.ts.map +0 -1
  39. package/dist/harness/config.js +0 -35
  40. package/dist/harness/config.js.map +0 -1
  41. package/dist/harness/context.d.ts +0 -9
  42. package/dist/harness/context.d.ts.map +0 -1
  43. package/dist/harness/context.js +0 -13
  44. package/dist/harness/context.js.map +0 -1
  45. package/dist/harness/env/nodejs.d.ts +0 -43
  46. package/dist/harness/env/nodejs.d.ts.map +0 -1
  47. package/dist/harness/env/nodejs.js +0 -865
  48. package/dist/harness/env/nodejs.js.map +0 -1
  49. package/dist/harness/events.d.ts +0 -24
  50. package/dist/harness/events.d.ts.map +0 -1
  51. package/dist/harness/events.js +0 -233
  52. package/dist/harness/events.js.map +0 -1
  53. package/dist/harness/execution/assistant.d.ts +0 -42
  54. package/dist/harness/execution/assistant.d.ts.map +0 -1
  55. package/dist/harness/execution/assistant.js +0 -82
  56. package/dist/harness/execution/assistant.js.map +0 -1
  57. package/dist/harness/execution/effect-gate.d.ts +0 -22
  58. package/dist/harness/execution/effect-gate.d.ts.map +0 -1
  59. package/dist/harness/execution/effect-gate.js +0 -49
  60. package/dist/harness/execution/effect-gate.js.map +0 -1
  61. package/dist/harness/execution/tools.d.ts +0 -67
  62. package/dist/harness/execution/tools.d.ts.map +0 -1
  63. package/dist/harness/execution/tools.js +0 -119
  64. package/dist/harness/execution/tools.js.map +0 -1
  65. package/dist/harness/execution-env.d.ts +0 -4
  66. package/dist/harness/execution-env.d.ts.map +0 -1
  67. package/dist/harness/execution-env.js +0 -3
  68. package/dist/harness/execution-env.js.map +0 -1
  69. package/dist/harness/hooks.d.ts +0 -38
  70. package/dist/harness/hooks.d.ts.map +0 -1
  71. package/dist/harness/hooks.js +0 -406
  72. package/dist/harness/hooks.js.map +0 -1
  73. package/dist/harness/messages.d.ts +0 -51
  74. package/dist/harness/messages.d.ts.map +0 -1
  75. package/dist/harness/messages.js +0 -103
  76. package/dist/harness/messages.js.map +0 -1
  77. package/dist/harness/pico3/bash.d.ts +0 -10
  78. package/dist/harness/pico3/bash.d.ts.map +0 -1
  79. package/dist/harness/pico3/bash.js +0 -25
  80. package/dist/harness/pico3/bash.js.map +0 -1
  81. package/dist/harness/pico3/bounded.d.ts +0 -21
  82. package/dist/harness/pico3/bounded.d.ts.map +0 -1
  83. package/dist/harness/pico3/bounded.js +0 -98
  84. package/dist/harness/pico3/bounded.js.map +0 -1
  85. package/dist/harness/pico3/chord.d.ts +0 -41
  86. package/dist/harness/pico3/chord.d.ts.map +0 -1
  87. package/dist/harness/pico3/chord.js +0 -147
  88. package/dist/harness/pico3/chord.js.map +0 -1
  89. package/dist/harness/pico3/context.d.ts +0 -16
  90. package/dist/harness/pico3/context.d.ts.map +0 -1
  91. package/dist/harness/pico3/context.js +0 -88
  92. package/dist/harness/pico3/context.js.map +0 -1
  93. package/dist/harness/pico3/harness.d.ts +0 -198
  94. package/dist/harness/pico3/harness.d.ts.map +0 -1
  95. package/dist/harness/pico3/harness.js +0 -654
  96. package/dist/harness/pico3/harness.js.map +0 -1
  97. package/dist/harness/pico3/hooks.d.ts +0 -10
  98. package/dist/harness/pico3/hooks.d.ts.map +0 -1
  99. package/dist/harness/pico3/hooks.js +0 -33
  100. package/dist/harness/pico3/hooks.js.map +0 -1
  101. package/dist/harness/pico3/index.d.ts +0 -19
  102. package/dist/harness/pico3/index.d.ts.map +0 -1
  103. package/dist/harness/pico3/index.js +0 -15
  104. package/dist/harness/pico3/index.js.map +0 -1
  105. package/dist/harness/pico3/jsonl.d.ts +0 -58
  106. package/dist/harness/pico3/jsonl.d.ts.map +0 -1
  107. package/dist/harness/pico3/jsonl.js +0 -325
  108. package/dist/harness/pico3/jsonl.js.map +0 -1
  109. package/dist/harness/pico3/kinds/collapse.d.ts +0 -49
  110. package/dist/harness/pico3/kinds/collapse.d.ts.map +0 -1
  111. package/dist/harness/pico3/kinds/collapse.js +0 -191
  112. package/dist/harness/pico3/kinds/collapse.js.map +0 -1
  113. package/dist/harness/pico3/kinds/entries.d.ts +0 -78
  114. package/dist/harness/pico3/kinds/entries.d.ts.map +0 -1
  115. package/dist/harness/pico3/kinds/entries.js +0 -13
  116. package/dist/harness/pico3/kinds/entries.js.map +0 -1
  117. package/dist/harness/pico3/kinds/frames.d.ts +0 -9
  118. package/dist/harness/pico3/kinds/frames.d.ts.map +0 -1
  119. package/dist/harness/pico3/kinds/frames.js +0 -75
  120. package/dist/harness/pico3/kinds/frames.js.map +0 -1
  121. package/dist/harness/pico3/kinds/generation.d.ts +0 -94
  122. package/dist/harness/pico3/kinds/generation.d.ts.map +0 -1
  123. package/dist/harness/pico3/kinds/generation.js +0 -504
  124. package/dist/harness/pico3/kinds/generation.js.map +0 -1
  125. package/dist/harness/pico3/kinds/job.d.ts +0 -44
  126. package/dist/harness/pico3/kinds/job.d.ts.map +0 -1
  127. package/dist/harness/pico3/kinds/job.js +0 -143
  128. package/dist/harness/pico3/kinds/job.js.map +0 -1
  129. package/dist/harness/pico3/kinds/plugin.d.ts +0 -15
  130. package/dist/harness/pico3/kinds/plugin.d.ts.map +0 -1
  131. package/dist/harness/pico3/kinds/plugin.js +0 -35
  132. package/dist/harness/pico3/kinds/plugin.js.map +0 -1
  133. package/dist/harness/pico3/kinds/post-tools.d.ts +0 -22
  134. package/dist/harness/pico3/kinds/post-tools.d.ts.map +0 -1
  135. package/dist/harness/pico3/kinds/post-tools.js +0 -145
  136. package/dist/harness/pico3/kinds/post-tools.js.map +0 -1
  137. package/dist/harness/pico3/kinds/task-api.d.ts +0 -3
  138. package/dist/harness/pico3/kinds/task-api.d.ts.map +0 -1
  139. package/dist/harness/pico3/kinds/task-api.js +0 -45
  140. package/dist/harness/pico3/kinds/task-api.js.map +0 -1
  141. package/dist/harness/pico3/kinds/tool.d.ts +0 -43
  142. package/dist/harness/pico3/kinds/tool.d.ts.map +0 -1
  143. package/dist/harness/pico3/kinds/tool.js +0 -373
  144. package/dist/harness/pico3/kinds/tool.js.map +0 -1
  145. package/dist/harness/pico3/legacy-tracker.d.ts +0 -11
  146. package/dist/harness/pico3/legacy-tracker.d.ts.map +0 -1
  147. package/dist/harness/pico3/legacy-tracker.js +0 -41
  148. package/dist/harness/pico3/legacy-tracker.js.map +0 -1
  149. package/dist/harness/pico3/membrane.d.ts +0 -23
  150. package/dist/harness/pico3/membrane.d.ts.map +0 -1
  151. package/dist/harness/pico3/membrane.js +0 -141
  152. package/dist/harness/pico3/membrane.js.map +0 -1
  153. package/dist/harness/pico3/memory.d.ts +0 -53
  154. package/dist/harness/pico3/memory.d.ts.map +0 -1
  155. package/dist/harness/pico3/memory.js +0 -264
  156. package/dist/harness/pico3/memory.js.map +0 -1
  157. package/dist/harness/pico3/scheduler.d.ts +0 -49
  158. package/dist/harness/pico3/scheduler.d.ts.map +0 -1
  159. package/dist/harness/pico3/scheduler.js +0 -438
  160. package/dist/harness/pico3/scheduler.js.map +0 -1
  161. package/dist/harness/pico3/session.d.ts +0 -264
  162. package/dist/harness/pico3/session.d.ts.map +0 -1
  163. package/dist/harness/pico3/session.js +0 -1348
  164. package/dist/harness/pico3/session.js.map +0 -1
  165. package/dist/harness/pico3/system.d.ts +0 -126
  166. package/dist/harness/pico3/system.d.ts.map +0 -1
  167. package/dist/harness/pico3/system.js +0 -244
  168. package/dist/harness/pico3/system.js.map +0 -1
  169. package/dist/harness/pico3/types.d.ts +0 -973
  170. package/dist/harness/pico3/types.d.ts.map +0 -1
  171. package/dist/harness/pico3/types.js +0 -106
  172. package/dist/harness/pico3/types.js.map +0 -1
  173. package/dist/harness/pico3/view.d.ts +0 -34
  174. package/dist/harness/pico3/view.d.ts.map +0 -1
  175. package/dist/harness/pico3/view.js +0 -411
  176. package/dist/harness/pico3/view.js.map +0 -1
  177. package/dist/harness/prompt-templates.d.ts +0 -49
  178. package/dist/harness/prompt-templates.d.ts.map +0 -1
  179. package/dist/harness/prompt-templates.js +0 -225
  180. package/dist/harness/prompt-templates.js.map +0 -1
  181. package/dist/harness/result.d.ts +0 -133
  182. package/dist/harness/result.d.ts.map +0 -1
  183. package/dist/harness/result.js +0 -81
  184. package/dist/harness/result.js.map +0 -1
  185. package/dist/harness/runtime/drive/boundary.d.ts +0 -28
  186. package/dist/harness/runtime/drive/boundary.d.ts.map +0 -1
  187. package/dist/harness/runtime/drive/boundary.js +0 -173
  188. package/dist/harness/runtime/drive/boundary.js.map +0 -1
  189. package/dist/harness/runtime/drive/checkpoint.d.ts +0 -8
  190. package/dist/harness/runtime/drive/checkpoint.d.ts.map +0 -1
  191. package/dist/harness/runtime/drive/checkpoint.js +0 -133
  192. package/dist/harness/runtime/drive/checkpoint.js.map +0 -1
  193. package/dist/harness/runtime/drive/deferred.d.ts +0 -15
  194. package/dist/harness/runtime/drive/deferred.d.ts.map +0 -1
  195. package/dist/harness/runtime/drive/deferred.js +0 -179
  196. package/dist/harness/runtime/drive/deferred.js.map +0 -1
  197. package/dist/harness/runtime/drive/generation.d.ts +0 -8
  198. package/dist/harness/runtime/drive/generation.d.ts.map +0 -1
  199. package/dist/harness/runtime/drive/generation.js +0 -205
  200. package/dist/harness/runtime/drive/generation.js.map +0 -1
  201. package/dist/harness/runtime/drive/reconcile.d.ts +0 -5
  202. package/dist/harness/runtime/drive/reconcile.d.ts.map +0 -1
  203. package/dist/harness/runtime/drive/reconcile.js +0 -140
  204. package/dist/harness/runtime/drive/reconcile.js.map +0 -1
  205. package/dist/harness/runtime/drive/recovery.d.ts +0 -8
  206. package/dist/harness/runtime/drive/recovery.d.ts.map +0 -1
  207. package/dist/harness/runtime/drive/recovery.js +0 -85
  208. package/dist/harness/runtime/drive/recovery.js.map +0 -1
  209. package/dist/harness/runtime/drive/response.d.ts +0 -23
  210. package/dist/harness/runtime/drive/response.d.ts.map +0 -1
  211. package/dist/harness/runtime/drive/response.js +0 -394
  212. package/dist/harness/runtime/drive/response.js.map +0 -1
  213. package/dist/harness/runtime/drive/retry.d.ts +0 -4
  214. package/dist/harness/runtime/drive/retry.d.ts.map +0 -1
  215. package/dist/harness/runtime/drive/retry.js +0 -34
  216. package/dist/harness/runtime/drive/retry.js.map +0 -1
  217. package/dist/harness/runtime/drive/structural.d.ts +0 -32
  218. package/dist/harness/runtime/drive/structural.d.ts.map +0 -1
  219. package/dist/harness/runtime/drive/structural.js +0 -929
  220. package/dist/harness/runtime/drive/structural.js.map +0 -1
  221. package/dist/harness/runtime/drive/terminal.d.ts +0 -7
  222. package/dist/harness/runtime/drive/terminal.d.ts.map +0 -1
  223. package/dist/harness/runtime/drive/terminal.js +0 -49
  224. package/dist/harness/runtime/drive/terminal.js.map +0 -1
  225. package/dist/harness/runtime/drive/tool-placement.d.ts +0 -14
  226. package/dist/harness/runtime/drive/tool-placement.d.ts.map +0 -1
  227. package/dist/harness/runtime/drive/tool-placement.js +0 -219
  228. package/dist/harness/runtime/drive/tool-placement.js.map +0 -1
  229. package/dist/harness/runtime/drive/tools.d.ts +0 -6
  230. package/dist/harness/runtime/drive/tools.d.ts.map +0 -1
  231. package/dist/harness/runtime/drive/tools.js +0 -449
  232. package/dist/harness/runtime/drive/tools.js.map +0 -1
  233. package/dist/harness/runtime/drive.d.ts +0 -6
  234. package/dist/harness/runtime/drive.d.ts.map +0 -1
  235. package/dist/harness/runtime/drive.js +0 -93
  236. package/dist/harness/runtime/drive.js.map +0 -1
  237. package/dist/harness/runtime/harness.d.ts +0 -59
  238. package/dist/harness/runtime/harness.d.ts.map +0 -1
  239. package/dist/harness/runtime/harness.js +0 -311
  240. package/dist/harness/runtime/harness.js.map +0 -1
  241. package/dist/harness/runtime/index.d.ts +0 -2
  242. package/dist/harness/runtime/index.d.ts.map +0 -1
  243. package/dist/harness/runtime/index.js +0 -2
  244. package/dist/harness/runtime/index.js.map +0 -1
  245. package/dist/harness/runtime/lane.d.ts +0 -118
  246. package/dist/harness/runtime/lane.d.ts.map +0 -1
  247. package/dist/harness/runtime/lane.js +0 -1575
  248. package/dist/harness/runtime/lane.js.map +0 -1
  249. package/dist/harness/runtime/progress.d.ts +0 -15
  250. package/dist/harness/runtime/progress.d.ts.map +0 -1
  251. package/dist/harness/runtime/progress.js +0 -66
  252. package/dist/harness/runtime/progress.js.map +0 -1
  253. package/dist/harness/runtime/reducer.d.ts +0 -5
  254. package/dist/harness/runtime/reducer.d.ts.map +0 -1
  255. package/dist/harness/runtime/reducer.js +0 -240
  256. package/dist/harness/runtime/reducer.js.map +0 -1
  257. package/dist/harness/runtime/restore.d.ts +0 -24
  258. package/dist/harness/runtime/restore.d.ts.map +0 -1
  259. package/dist/harness/runtime/restore.js +0 -117
  260. package/dist/harness/runtime/restore.js.map +0 -1
  261. package/dist/harness/runtime/transcript.d.ts +0 -21
  262. package/dist/harness/runtime/transcript.d.ts.map +0 -1
  263. package/dist/harness/runtime/transcript.js +0 -72
  264. package/dist/harness/runtime/transcript.js.map +0 -1
  265. package/dist/harness/runtime/types.d.ts +0 -105
  266. package/dist/harness/runtime/types.d.ts.map +0 -1
  267. package/dist/harness/runtime/types.js +0 -61
  268. package/dist/harness/runtime/types.js.map +0 -1
  269. package/dist/harness/session/commit.d.ts +0 -53
  270. package/dist/harness/session/commit.d.ts.map +0 -1
  271. package/dist/harness/session/commit.js +0 -57
  272. package/dist/harness/session/commit.js.map +0 -1
  273. package/dist/harness/session/context.d.ts +0 -10
  274. package/dist/harness/session/context.d.ts.map +0 -1
  275. package/dist/harness/session/context.js +0 -49
  276. package/dist/harness/session/context.js.map +0 -1
  277. package/dist/harness/session/fork-policy.d.ts +0 -21
  278. package/dist/harness/session/fork-policy.d.ts.map +0 -1
  279. package/dist/harness/session/fork-policy.js +0 -55
  280. package/dist/harness/session/fork-policy.js.map +0 -1
  281. package/dist/harness/session/fork.d.ts +0 -16
  282. package/dist/harness/session/fork.d.ts.map +0 -1
  283. package/dist/harness/session/fork.js +0 -79
  284. package/dist/harness/session/fork.js.map +0 -1
  285. package/dist/harness/session/in-memory-storage-state.d.ts +0 -39
  286. package/dist/harness/session/in-memory-storage-state.d.ts.map +0 -1
  287. package/dist/harness/session/in-memory-storage-state.js +0 -276
  288. package/dist/harness/session/in-memory-storage-state.js.map +0 -1
  289. package/dist/harness/session/index.d.ts +0 -11
  290. package/dist/harness/session/index.d.ts.map +0 -1
  291. package/dist/harness/session/index.js +0 -9
  292. package/dist/harness/session/index.js.map +0 -1
  293. package/dist/harness/session/jsonl/codec.d.ts +0 -21
  294. package/dist/harness/session/jsonl/codec.d.ts.map +0 -1
  295. package/dist/harness/session/jsonl/codec.js +0 -45
  296. package/dist/harness/session/jsonl/codec.js.map +0 -1
  297. package/dist/harness/session/jsonl/fork.d.ts +0 -38
  298. package/dist/harness/session/jsonl/fork.d.ts.map +0 -1
  299. package/dist/harness/session/jsonl/fork.js +0 -264
  300. package/dist/harness/session/jsonl/fork.js.map +0 -1
  301. package/dist/harness/session/jsonl/index.d.ts +0 -4
  302. package/dist/harness/session/jsonl/index.d.ts.map +0 -1
  303. package/dist/harness/session/jsonl/index.js +0 -4
  304. package/dist/harness/session/jsonl/index.js.map +0 -1
  305. package/dist/harness/session/jsonl/io.d.ts +0 -14
  306. package/dist/harness/session/jsonl/io.d.ts.map +0 -1
  307. package/dist/harness/session/jsonl/io.js +0 -86
  308. package/dist/harness/session/jsonl/io.js.map +0 -1
  309. package/dist/harness/session/jsonl/legacy-v3.d.ts +0 -44
  310. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +0 -1
  311. package/dist/harness/session/jsonl/legacy-v3.js +0 -462
  312. package/dist/harness/session/jsonl/legacy-v3.js.map +0 -1
  313. package/dist/harness/session/jsonl/repo.d.ts +0 -35
  314. package/dist/harness/session/jsonl/repo.d.ts.map +0 -1
  315. package/dist/harness/session/jsonl/repo.js +0 -301
  316. package/dist/harness/session/jsonl/repo.js.map +0 -1
  317. package/dist/harness/session/jsonl/storage.d.ts +0 -41
  318. package/dist/harness/session/jsonl/storage.d.ts.map +0 -1
  319. package/dist/harness/session/jsonl/storage.js +0 -200
  320. package/dist/harness/session/jsonl/storage.js.map +0 -1
  321. package/dist/harness/session/jsonl/types.d.ts +0 -39
  322. package/dist/harness/session/jsonl/types.d.ts.map +0 -1
  323. package/dist/harness/session/jsonl/types.js +0 -3
  324. package/dist/harness/session/jsonl/types.js.map +0 -1
  325. package/dist/harness/session/memory.d.ts +0 -48
  326. package/dist/harness/session/memory.d.ts.map +0 -1
  327. package/dist/harness/session/memory.js +0 -369
  328. package/dist/harness/session/memory.js.map +0 -1
  329. package/dist/harness/session/mutation-line.d.ts +0 -8
  330. package/dist/harness/session/mutation-line.d.ts.map +0 -1
  331. package/dist/harness/session/mutation-line.js +0 -21
  332. package/dist/harness/session/mutation-line.js.map +0 -1
  333. package/dist/harness/session/session.d.ts +0 -82
  334. package/dist/harness/session/session.d.ts.map +0 -1
  335. package/dist/harness/session/session.js +0 -361
  336. package/dist/harness/session/session.js.map +0 -1
  337. package/dist/harness/session/testing/benchmark/datasets.d.ts +0 -12
  338. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +0 -1
  339. package/dist/harness/session/testing/benchmark/datasets.js +0 -24
  340. package/dist/harness/session/testing/benchmark/datasets.js.map +0 -1
  341. package/dist/harness/session/testing/benchmark/session-repo.d.ts +0 -42
  342. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +0 -1
  343. package/dist/harness/session/testing/benchmark/session-repo.js +0 -127
  344. package/dist/harness/session/testing/benchmark/session-repo.js.map +0 -1
  345. package/dist/harness/session/testing/benchmark/storage.d.ts +0 -25
  346. package/dist/harness/session/testing/benchmark/storage.d.ts.map +0 -1
  347. package/dist/harness/session/testing/benchmark/storage.js +0 -114
  348. package/dist/harness/session/testing/benchmark/storage.js.map +0 -1
  349. package/dist/harness/session/testing/conformance/session-repo.d.ts +0 -23
  350. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +0 -1
  351. package/dist/harness/session/testing/conformance/session-repo.js +0 -809
  352. package/dist/harness/session/testing/conformance/session-repo.js.map +0 -1
  353. package/dist/harness/session/testing/conformance/storage.d.ts +0 -4
  354. package/dist/harness/session/testing/conformance/storage.d.ts.map +0 -1
  355. package/dist/harness/session/testing/conformance/storage.js +0 -600
  356. package/dist/harness/session/testing/conformance/storage.js.map +0 -1
  357. package/dist/harness/session/testing/gating-storage.d.ts +0 -26
  358. package/dist/harness/session/testing/gating-storage.d.ts.map +0 -1
  359. package/dist/harness/session/testing/gating-storage.js +0 -100
  360. package/dist/harness/session/testing/gating-storage.js.map +0 -1
  361. package/dist/harness/session/testing/index.d.ts +0 -10
  362. package/dist/harness/session/testing/index.d.ts.map +0 -1
  363. package/dist/harness/session/testing/index.js +0 -9
  364. package/dist/harness/session/testing/index.js.map +0 -1
  365. package/dist/harness/session/testing/instrumented-storage.d.ts +0 -11
  366. package/dist/harness/session/testing/instrumented-storage.d.ts.map +0 -1
  367. package/dist/harness/session/testing/instrumented-storage.js +0 -16
  368. package/dist/harness/session/testing/instrumented-storage.js.map +0 -1
  369. package/dist/harness/session/testing/storage-decorator.d.ts +0 -20
  370. package/dist/harness/session/testing/storage-decorator.d.ts.map +0 -1
  371. package/dist/harness/session/testing/storage-decorator.js +0 -41
  372. package/dist/harness/session/testing/storage-decorator.js.map +0 -1
  373. package/dist/harness/session/testing/types.d.ts +0 -12
  374. package/dist/harness/session/testing/types.d.ts.map +0 -1
  375. package/dist/harness/session/testing/types.js +0 -2
  376. package/dist/harness/session/testing/types.js.map +0 -1
  377. package/dist/harness/session/types.d.ts +0 -512
  378. package/dist/harness/session/types.d.ts.map +0 -1
  379. package/dist/harness/session/types.js +0 -9
  380. package/dist/harness/session/types.js.map +0 -1
  381. package/dist/harness/session/values.d.ts +0 -95
  382. package/dist/harness/session/values.d.ts.map +0 -1
  383. package/dist/harness/session/values.js +0 -81
  384. package/dist/harness/session/values.js.map +0 -1
  385. package/dist/harness/skills.d.ts +0 -46
  386. package/dist/harness/skills.d.ts.map +0 -1
  387. package/dist/harness/skills.js +0 -326
  388. package/dist/harness/skills.js.map +0 -1
  389. package/dist/harness/system-prompt.d.ts +0 -3
  390. package/dist/harness/system-prompt.d.ts.map +0 -1
  391. package/dist/harness/system-prompt.js +0 -30
  392. package/dist/harness/system-prompt.js.map +0 -1
  393. package/dist/harness/telemetry.d.ts +0 -1242
  394. package/dist/harness/telemetry.d.ts.map +0 -1
  395. package/dist/harness/telemetry.js +0 -527
  396. package/dist/harness/telemetry.js.map +0 -1
  397. package/dist/harness/tools/bash.d.ts +0 -27
  398. package/dist/harness/tools/bash.d.ts.map +0 -1
  399. package/dist/harness/tools/bash.js +0 -105
  400. package/dist/harness/tools/bash.js.map +0 -1
  401. package/dist/harness/tools/edit-diff.d.ts +0 -89
  402. package/dist/harness/tools/edit-diff.d.ts.map +0 -1
  403. package/dist/harness/tools/edit-diff.js +0 -386
  404. package/dist/harness/tools/edit-diff.js.map +0 -1
  405. package/dist/harness/tools/edit.d.ts +0 -19
  406. package/dist/harness/tools/edit.d.ts.map +0 -1
  407. package/dist/harness/tools/edit.js +0 -108
  408. package/dist/harness/tools/edit.js.map +0 -1
  409. package/dist/harness/tools/file-mutation-queue.d.ts +0 -5
  410. package/dist/harness/tools/file-mutation-queue.d.ts.map +0 -1
  411. package/dist/harness/tools/file-mutation-queue.js +0 -46
  412. package/dist/harness/tools/file-mutation-queue.js.map +0 -1
  413. package/dist/harness/tools/image.d.ts +0 -3
  414. package/dist/harness/tools/image.d.ts.map +0 -1
  415. package/dist/harness/tools/image.js +0 -106
  416. package/dist/harness/tools/image.js.map +0 -1
  417. package/dist/harness/tools/index.d.ts +0 -6
  418. package/dist/harness/tools/index.d.ts.map +0 -1
  419. package/dist/harness/tools/index.js +0 -5
  420. package/dist/harness/tools/index.js.map +0 -1
  421. package/dist/harness/tools/path-utils.d.ts +0 -5
  422. package/dist/harness/tools/path-utils.d.ts.map +0 -1
  423. package/dist/harness/tools/path-utils.js +0 -26
  424. package/dist/harness/tools/path-utils.js.map +0 -1
  425. package/dist/harness/tools/read.d.ts +0 -35
  426. package/dist/harness/tools/read.d.ts.map +0 -1
  427. package/dist/harness/tools/read.js +0 -108
  428. package/dist/harness/tools/read.js.map +0 -1
  429. package/dist/harness/tools/tool-context.d.ts +0 -6
  430. package/dist/harness/tools/tool-context.d.ts.map +0 -1
  431. package/dist/harness/tools/tool-context.js +0 -2
  432. package/dist/harness/tools/tool-context.js.map +0 -1
  433. package/dist/harness/tools/write.d.ts +0 -11
  434. package/dist/harness/tools/write.d.ts.map +0 -1
  435. package/dist/harness/tools/write.js +0 -31
  436. package/dist/harness/tools/write.js.map +0 -1
  437. package/dist/harness/types.d.ts +0 -305
  438. package/dist/harness/types.d.ts.map +0 -1
  439. package/dist/harness/types.js +0 -75
  440. package/dist/harness/types.js.map +0 -1
  441. package/dist/harness/utils/adaptive-publisher.d.ts +0 -24
  442. package/dist/harness/utils/adaptive-publisher.d.ts.map +0 -1
  443. package/dist/harness/utils/adaptive-publisher.js +0 -79
  444. package/dist/harness/utils/adaptive-publisher.js.map +0 -1
  445. package/dist/harness/utils/output-capture.d.ts +0 -31
  446. package/dist/harness/utils/output-capture.d.ts.map +0 -1
  447. package/dist/harness/utils/output-capture.js +0 -217
  448. package/dist/harness/utils/output-capture.js.map +0 -1
  449. package/dist/harness/utils/shell-output.d.ts +0 -29
  450. package/dist/harness/utils/shell-output.d.ts.map +0 -1
  451. package/dist/harness/utils/shell-output.js +0 -71
  452. package/dist/harness/utils/shell-output.js.map +0 -1
  453. package/dist/harness/utils/truncate.d.ts +0 -71
  454. package/dist/harness/utils/truncate.d.ts.map +0 -1
  455. package/dist/harness/utils/truncate.js +0 -296
  456. package/dist/harness/utils/truncate.js.map +0 -1
  457. package/dist/harness/utils/usage.d.ts +0 -4
  458. package/dist/harness/utils/usage.d.ts.map +0 -1
  459. package/dist/harness/utils/usage.js +0 -33
  460. package/dist/harness/utils/usage.js.map +0 -1
  461. package/dist/node.d.ts +0 -3
  462. package/dist/node.d.ts.map +0 -1
  463. package/dist/node.js +0 -3
  464. package/dist/node.js.map +0 -1
  465. package/dist/search/index.d.ts +0 -29
  466. package/dist/search/index.d.ts.map +0 -1
  467. package/dist/search/index.js +0 -2
  468. package/dist/search/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/harness/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ImageContent, Message, TextContent } from \"@draht/ai\";\nimport type { AgentMessage } from \"../types.ts\";\n\nexport const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:\n\n<summary>\n`;\n\nexport const COMPACTION_SUMMARY_SUFFIX = `\n</summary>`;\n\nexport const BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:\n\n<summary>\n`;\n\nexport const BRANCH_SUMMARY_SUFFIX = `</summary>`;\n\nexport interface BashExecutionMessage {\n\trole: \"bashExecution\";\n\tcommand: string;\n\toutput: string;\n\texitCode: number | undefined;\n\tcancelled: boolean;\n\ttruncated: boolean;\n\tfullOutputPath?: string;\n\ttimestamp: number;\n\texcludeFromContext?: boolean;\n}\n\nexport interface CustomMessage<T = unknown> {\n\trole: \"custom\";\n\tcustomType: string;\n\tcontent: string | (TextContent | ImageContent)[];\n\tdisplay: boolean;\n\tdetails?: T;\n\ttimestamp: number;\n}\n\nexport interface BranchSummaryMessage {\n\trole: \"branchSummary\";\n\tsummary: string;\n\tfromId: string | null;\n\ttimestamp: number;\n}\n\nexport interface CompactionSummaryMessage {\n\trole: \"compactionSummary\";\n\tsummary: string;\n\ttokensBefore: number;\n\ttimestamp: number;\n}\n\ndeclare module \"../types.ts\" {\n\tinterface CustomAgentMessages {\n\t\tbashExecution: BashExecutionMessage;\n\t\tcustom: CustomMessage;\n\t\tbranchSummary: BranchSummaryMessage;\n\t\tcompactionSummary: CompactionSummaryMessage;\n\t}\n}\n\nexport function bashExecutionToText(msg: BashExecutionMessage): string {\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\n\tif (msg.output) {\n\t\ttext += `\\`\\`\\`\\n${msg.output}\\n\\`\\`\\``;\n\t} else {\n\t\ttext += \"(no output)\";\n\t}\n\tif (msg.cancelled) {\n\t\ttext += \"\\n\\n(command cancelled)\";\n\t} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\n\t}\n\tif (msg.truncated && msg.fullOutputPath) {\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\n\t}\n\treturn text;\n}\n\nexport function createBranchSummaryMessage(\n\tsummary: string,\n\tfromId: string | null,\n\ttimestamp: string | number,\n): BranchSummaryMessage {\n\treturn {\n\t\trole: \"branchSummary\",\n\t\tsummary,\n\t\tfromId,\n\t\ttimestamp: typeof timestamp === \"number\" ? timestamp : new Date(timestamp).getTime(),\n\t};\n}\n\nexport function createCompactionSummaryMessage(\n\tsummary: string,\n\ttokensBefore: number,\n\ttimestamp: string | number,\n): CompactionSummaryMessage {\n\treturn {\n\t\trole: \"compactionSummary\",\n\t\tsummary,\n\t\ttokensBefore,\n\t\ttimestamp: typeof timestamp === \"number\" ? timestamp : new Date(timestamp).getTime(),\n\t};\n}\n\nexport function createCustomMessage(\n\tcustomType: string,\n\tcontent: string | (TextContent | ImageContent)[],\n\tdisplay: boolean,\n\tdetails: unknown | undefined,\n\ttimestamp: string | number,\n): CustomMessage {\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType,\n\t\tcontent,\n\t\tdisplay,\n\t\tdetails,\n\t\ttimestamp: typeof timestamp === \"number\" ? timestamp : new Date(timestamp).getTime(),\n\t};\n}\n\nexport function convertToLlm(messages: AgentMessage[]): Message[] {\n\treturn messages\n\t\t.map((m): Message | undefined => {\n\t\t\tswitch (m.role) {\n\t\t\t\tcase \"bashExecution\":\n\t\t\t\t\tif (m.excludeFromContext) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"custom\": {\n\t\t\t\t\tconst content = typeof m.content === \"string\" ? [{ type: \"text\" as const, text: m.content }] : m.content;\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"branchSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"compactionSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"system\":\n\t\t\t\tcase \"user\":\n\t\t\t\tcase \"assistant\":\n\t\t\t\tcase \"toolResult\":\n\t\t\t\t\treturn m;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t})\n\t\t.filter((m): m is Message => m !== undefined);\n}\n"]}
@@ -1,10 +0,0 @@
1
- import { Type } from "typebox";
2
- import type { ToolDeclaration } from "./types.ts";
3
- declare const parameters: Type.TObject<{
4
- command: Type.TString;
5
- cwd: Type.TOptional<Type.TString>;
6
- }>;
7
- /** Run a shell command. Output is piped to the kernel; bounds come from `output`. */
8
- export declare function bashTool(output?: ToolDeclaration["output"]): ToolDeclaration<typeof parameters>;
9
- export {};
10
- //# sourceMappingURL=bash.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/harness/pico3/bash.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,YAAY,CAAC;AAE9D,QAAA,MAAM,UAAU;;;EAA6E,CAAC;AAE9F,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,MAAM,GAAE,eAAe,CAAC,QAAQ,CAAM,GAAG,eAAe,CAAC,OAAO,UAAU,CAAC,CAqBnG"}
@@ -1,25 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import { Type } from "typebox";
3
- const parameters = Type.Object({ command: Type.String(), cwd: Type.Optional(Type.String()) });
4
- /** Run a shell command. Output is piped to the kernel; bounds come from `output`. */
5
- export function bashTool(output = {}) {
6
- return {
7
- name: "bash",
8
- description: "Run a shell command",
9
- parameters,
10
- replay: "unsafe",
11
- output,
12
- async execute({ command, cwd }, api, ctx) {
13
- const started = Date.now();
14
- const child = spawn("bash", ["-c", command], { cwd, stdio: ["ignore", "pipe", "pipe"] });
15
- const onAbort = () => child.kill("SIGKILL");
16
- ctx.abortSignal?.addEventListener("abort", onAbort);
17
- child.stdout.on("data", (c) => api.stream(c));
18
- child.stderr.on("data", (c) => api.stream(c));
19
- const { code, signal } = await new Promise((r) => child.on("close", (code, signal) => r({ code, signal })));
20
- ctx.abortSignal?.removeEventListener("abort", onAbort);
21
- return { isError: code !== 0, details: { exitCode: code, signal, ms: Date.now() - started } };
22
- },
23
- };
24
- }
25
- //# sourceMappingURL=bash.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/harness/pico3/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG/B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAE9F,qFAAqF;AACrF,MAAM,UAAU,QAAQ,CAAC,MAAM,GAA8B,EAAE;IAC9D,OAAO;QACN,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,qBAAqB;QAClC,UAAU;QACV,MAAM,EAAE,QAAQ;QAChB,MAAM;QACN,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACzF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5C,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAa,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAa,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,OAAO,CAAiD,CAAC,CAAC,EAAE,EAAE,CAChG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CACxD,CAAC;YACF,GAAG,CAAC,WAAW,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC;QAC/F,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { Type } from \"typebox\";\nimport type { ToolDeclaration, ToolResult } from \"./types.ts\";\n\nconst parameters = Type.Object({ command: Type.String(), cwd: Type.Optional(Type.String()) });\n\n/** Run a shell command. Output is piped to the kernel; bounds come from `output`. */\nexport function bashTool(output: ToolDeclaration[\"output\"] = {}): ToolDeclaration<typeof parameters> {\n\treturn {\n\t\tname: \"bash\",\n\t\tdescription: \"Run a shell command\",\n\t\tparameters,\n\t\treplay: \"unsafe\",\n\t\toutput,\n\t\tasync execute({ command, cwd }, api, ctx): Promise<ToolResult> {\n\t\t\tconst started = Date.now();\n\t\t\tconst child = spawn(\"bash\", [\"-c\", command], { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n\t\t\tconst onAbort = () => child.kill(\"SIGKILL\");\n\t\t\tctx.abortSignal?.addEventListener(\"abort\", onAbort);\n\t\t\tchild.stdout.on(\"data\", (c: Uint8Array) => api.stream(c));\n\t\t\tchild.stderr.on(\"data\", (c: Uint8Array) => api.stream(c));\n\t\t\tconst { code, signal } = await new Promise<{ code: number | null; signal: string | null }>((r) =>\n\t\t\t\tchild.on(\"close\", (code, signal) => r({ code, signal })),\n\t\t\t);\n\t\t\tctx.abortSignal?.removeEventListener(\"abort\", onAbort);\n\t\t\treturn { isError: code !== 0, details: { exitCode: code, signal, ms: Date.now() - started } };\n\t\t},\n\t};\n}\n"]}
@@ -1,21 +0,0 @@
1
- /**
2
- * Bounded byte collector. It retains a prefix or suffix constrained by both a byte
3
- * budget and a newline budget, and accounts for every discarded byte/newline.
4
- */
5
- export declare class Bounded {
6
- private bytes;
7
- private readonly maxBytes;
8
- private readonly maxLines;
9
- private readonly retain;
10
- droppedBytes: number;
11
- droppedLines: number;
12
- total: number;
13
- constructor(maxBytes: number, maxLines: number, retain: "head" | "tail");
14
- push(chunk: Uint8Array): void;
15
- private pushHead;
16
- private pushTail;
17
- private drop;
18
- get dropped(): number;
19
- text(): string;
20
- }
21
- //# sourceMappingURL=bounded.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bounded.d.ts","sourceRoot":"","sources":["../../../src/harness/pico3/bounded.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,OAAO;IACnB,OAAO,CAAC,KAAK,CAAiD;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,YAAY,SAAK;IACjB,YAAY,SAAK;IACjB,KAAK,SAAK;IAEV,YAAY,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAItE;IAED,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAY5B;IAED,OAAO,CAAC,QAAQ;IAqBhB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,IAAI;IAKZ,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,IAAI,MAAM,CAEb;CACD"}
@@ -1,98 +0,0 @@
1
- /**
2
- * Bounded byte collector. It retains a prefix or suffix constrained by both a byte
3
- * budget and a newline budget, and accounts for every discarded byte/newline.
4
- */
5
- export class Bounded {
6
- bytes = new Uint8Array();
7
- maxBytes;
8
- maxLines;
9
- retain;
10
- droppedBytes = 0;
11
- droppedLines = 0;
12
- total = 0;
13
- constructor(maxBytes, maxLines, retain) {
14
- this.maxBytes = Math.max(0, maxBytes);
15
- this.maxLines = Math.max(0, maxLines);
16
- this.retain = retain;
17
- }
18
- push(chunk) {
19
- this.total += chunk.length;
20
- if (chunk.length === 0)
21
- return;
22
- if (this.maxBytes === 0 || this.maxLines === 0) {
23
- this.drop(chunk);
24
- return;
25
- }
26
- if (this.retain === "head") {
27
- this.pushHead(chunk);
28
- return;
29
- }
30
- this.pushTail(chunk);
31
- }
32
- pushHead(chunk) {
33
- const remainingBytes = this.maxBytes - this.bytes.length;
34
- const remainingLines = this.maxLines - countNewlines(this.bytes);
35
- if (remainingBytes <= 0 || remainingLines <= 0) {
36
- this.drop(chunk);
37
- return;
38
- }
39
- let take = Math.min(chunk.length, remainingBytes);
40
- let lines = 0;
41
- for (let i = 0; i < take; i++) {
42
- if (chunk[i] !== 0x0a)
43
- continue;
44
- lines++;
45
- if (lines === remainingLines) {
46
- take = i + 1;
47
- break;
48
- }
49
- }
50
- this.bytes = concat(this.bytes, chunk.subarray(0, take));
51
- this.drop(chunk.subarray(take));
52
- }
53
- pushTail(chunk) {
54
- const incomingStart = tailStart(chunk, this.maxBytes, this.maxLines);
55
- this.drop(chunk.subarray(0, incomingStart));
56
- const combined = concat(this.bytes, chunk.subarray(incomingStart));
57
- const start = tailStart(combined, this.maxBytes, this.maxLines);
58
- this.drop(combined.subarray(0, start));
59
- this.bytes = combined.slice(start);
60
- }
61
- drop(bytes) {
62
- this.droppedBytes += bytes.length;
63
- this.droppedLines += countNewlines(bytes);
64
- }
65
- get dropped() {
66
- return this.droppedBytes;
67
- }
68
- text() {
69
- return new TextDecoder().decode(this.bytes);
70
- }
71
- }
72
- function tailStart(bytes, maxBytes, maxLines) {
73
- let start = Math.max(0, bytes.length - maxBytes);
74
- let excessLines = countNewlines(bytes.subarray(start)) - maxLines;
75
- for (; start < bytes.length && excessLines > 0; start++) {
76
- if (bytes[start] === 0x0a)
77
- excessLines--;
78
- }
79
- return start;
80
- }
81
- function concat(a, b) {
82
- if (a.length === 0)
83
- return b.slice();
84
- if (b.length === 0)
85
- return a;
86
- const out = new Uint8Array(a.length + b.length);
87
- out.set(a);
88
- out.set(b, a.length);
89
- return out;
90
- }
91
- function countNewlines(bytes) {
92
- let count = 0;
93
- for (const byte of bytes)
94
- if (byte === 0x0a)
95
- count++;
96
- return count;
97
- }
98
- //# sourceMappingURL=bounded.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bounded.js","sourceRoot":"","sources":["../../../src/harness/pico3/bounded.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bounded byte collector. It retains a prefix or suffix constrained by both a byte\n * budget and a newline budget, and accounts for every discarded byte/newline.\n */\nexport class Bounded {\n\tprivate bytes: Uint8Array<ArrayBufferLike> = new Uint8Array();\n\tprivate readonly maxBytes: number;\n\tprivate readonly maxLines: number;\n\tprivate readonly retain: \"head\" | \"tail\";\n\tdroppedBytes = 0;\n\tdroppedLines = 0;\n\ttotal = 0;\n\n\tconstructor(maxBytes: number, maxLines: number, retain: \"head\" | \"tail\") {\n\t\tthis.maxBytes = Math.max(0, maxBytes);\n\t\tthis.maxLines = Math.max(0, maxLines);\n\t\tthis.retain = retain;\n\t}\n\n\tpush(chunk: Uint8Array): void {\n\t\tthis.total += chunk.length;\n\t\tif (chunk.length === 0) return;\n\t\tif (this.maxBytes === 0 || this.maxLines === 0) {\n\t\t\tthis.drop(chunk);\n\t\t\treturn;\n\t\t}\n\t\tif (this.retain === \"head\") {\n\t\t\tthis.pushHead(chunk);\n\t\t\treturn;\n\t\t}\n\t\tthis.pushTail(chunk);\n\t}\n\n\tprivate pushHead(chunk: Uint8Array): void {\n\t\tconst remainingBytes = this.maxBytes - this.bytes.length;\n\t\tconst remainingLines = this.maxLines - countNewlines(this.bytes);\n\t\tif (remainingBytes <= 0 || remainingLines <= 0) {\n\t\t\tthis.drop(chunk);\n\t\t\treturn;\n\t\t}\n\t\tlet take = Math.min(chunk.length, remainingBytes);\n\t\tlet lines = 0;\n\t\tfor (let i = 0; i < take; i++) {\n\t\t\tif (chunk[i] !== 0x0a) continue;\n\t\t\tlines++;\n\t\t\tif (lines === remainingLines) {\n\t\t\t\ttake = i + 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.bytes = concat(this.bytes, chunk.subarray(0, take));\n\t\tthis.drop(chunk.subarray(take));\n\t}\n\n\tprivate pushTail(chunk: Uint8Array): void {\n\t\tconst incomingStart = tailStart(chunk, this.maxBytes, this.maxLines);\n\t\tthis.drop(chunk.subarray(0, incomingStart));\n\t\tconst combined = concat(this.bytes, chunk.subarray(incomingStart));\n\t\tconst start = tailStart(combined, this.maxBytes, this.maxLines);\n\t\tthis.drop(combined.subarray(0, start));\n\t\tthis.bytes = combined.slice(start);\n\t}\n\n\tprivate drop(bytes: Uint8Array): void {\n\t\tthis.droppedBytes += bytes.length;\n\t\tthis.droppedLines += countNewlines(bytes);\n\t}\n\n\tget dropped(): number {\n\t\treturn this.droppedBytes;\n\t}\n\n\ttext(): string {\n\t\treturn new TextDecoder().decode(this.bytes);\n\t}\n}\n\nfunction tailStart(bytes: Uint8Array, maxBytes: number, maxLines: number): number {\n\tlet start = Math.max(0, bytes.length - maxBytes);\n\tlet excessLines = countNewlines(bytes.subarray(start)) - maxLines;\n\tfor (; start < bytes.length && excessLines > 0; start++) {\n\t\tif (bytes[start] === 0x0a) excessLines--;\n\t}\n\treturn start;\n}\n\nfunction concat(a: Uint8Array, b: Uint8Array): Uint8Array {\n\tif (a.length === 0) return b.slice();\n\tif (b.length === 0) return a;\n\tconst out = new Uint8Array(a.length + b.length);\n\tout.set(a);\n\tout.set(b, a.length);\n\treturn out;\n}\n\nfunction countNewlines(bytes: Uint8Array): number {\n\tlet count = 0;\n\tfor (const byte of bytes) if (byte === 0x0a) count++;\n\treturn count;\n}\n"]}
@@ -1,41 +0,0 @@
1
- import { type Context, type MutableReplicatedState, type ReplicatedState } from "@draht/chord";
2
- import type { ConversationHandle, Harness } from "./harness.ts";
3
- import type { ConversationSpec, ConversationView, Entry, EntryScan, Id, JsonObject, NewEntry, SendInput, ViewEvent } from "./types.ts";
4
- export type PublishedConversationView = ConversationView & {
5
- commit: {
6
- events: ViewEvent[];
7
- };
8
- };
9
- export interface PicoConversationService {
10
- readonly view: ReplicatedState<PublishedConversationView>;
11
- send(input: SendInput, ctx: Context): Promise<Id>;
12
- write(entry: NewEntry, ctx: Context): Promise<Id>;
13
- inputAbort(id: Id, ctx: Context): Promise<"aborted" | "already_placed" | "not_found">;
14
- configSet(patch: JsonObject, ctx: Context): Promise<void>;
15
- abort(ctx: Context): Promise<void>;
16
- reset(handoff: string | null, ctx: Context): Promise<void>;
17
- collapse(instructions: string | null, ctx: Context): Promise<Id>;
18
- fork(at: Id | "start", spec: Omit<ConversationSpec, "parent">, ctx: Context): Promise<Id>;
19
- entries(scan: EntryScan, ctx: Context): Promise<Entry[]>;
20
- }
21
- /** Local registration/control plane and remote keyed conversation contract used by Chord facets. */
22
- export declare const PicoHarnessService: import("@draht/chord").Service<Harness<[]>>;
23
- export declare const PicoConversationService: import("@draht/chord").Service<PicoConversationService>;
24
- export declare function createPicoConversationService<Cfg extends object>(harness: Pick<Harness, "abortInput" | "entries">, conversation: ConversationHandle<Cfg>, view: ReplicatedState<PublishedConversationView>): PicoConversationService;
25
- export interface ChordViewBridge {
26
- readonly view: MutableReplicatedState<PublishedConversationView>;
27
- readonly closed: boolean;
28
- close(): void;
29
- }
30
- export interface ChordViewBridgeOptions {
31
- capacity?: number;
32
- /** Called after the raw watch is closed. The owner should close and respawn its keyed service instance. */
33
- onFailure?: (error: Error) => void;
34
- }
35
- /**
36
- * Adapt Pico's commit-granular envelopes to one Chord publication per commit.
37
- * The raw listener only enqueues. Applying ops and publishing happen together,
38
- * off the Session line, with no await between them.
39
- */
40
- export declare function attachChordView(conversation: Pick<ConversationHandle, "watch">, createState: (initial: PublishedConversationView) => MutableReplicatedState<PublishedConversationView>, ctx: Context, opts?: ChordViewBridgeOptions): Promise<ChordViewBridge>;
41
- //# sourceMappingURL=chord.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chord.d.ts","sourceRoot":"","sources":["../../../src/harness/pico3/chord.ts"],"names":[],"mappings":"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"}
@@ -1,147 +0,0 @@
1
- import { defineService, } from "@draht/chord";
2
- import { WATCH_CAPACITY } from "./view.js";
3
- /** Local registration/control plane and remote keyed conversation contract used by Chord facets. */
4
- export const PicoHarnessService = defineService("pi.harness", { local: true });
5
- export const PicoConversationService = defineService("pi.conversation");
6
- export function createPicoConversationService(harness, conversation, view) {
7
- return {
8
- view,
9
- send: (input, ctx) => conversation.send(input, ctx).then((handle) => handle.id),
10
- write: (entry, ctx) => conversation.write(entry, ctx),
11
- inputAbort: (id, ctx) => harness.abortInput(id, ctx, conversation.id),
12
- configSet: (patch, ctx) => conversation.config.set(patch, ctx),
13
- abort: (ctx) => conversation.abort(ctx),
14
- reset: (handoff, ctx) => conversation.reset(handoff ?? undefined, ctx),
15
- collapse: (instructions, ctx) => conversation.collapse(instructions ?? undefined, ctx),
16
- fork: (at, spec, ctx) => conversation.fork(at, spec, ctx).then((child) => child.id),
17
- entries: (scan, ctx) => harness.entries({ ...scan, conversationId: conversation.id }, ctx),
18
- };
19
- }
20
- /**
21
- * Adapt Pico's commit-granular envelopes to one Chord publication per commit.
22
- * The raw listener only enqueues. Applying ops and publishing happen together,
23
- * off the Session line, with no await between them.
24
- */
25
- export async function attachChordView(conversation, createState, ctx, opts = {}) {
26
- const watch = await conversation.watch(ctx);
27
- const view = createState({ ...structuredClone(watch.view), commit: { events: [] } });
28
- return bridgeWatch(watch, view, ctx, opts);
29
- }
30
- function bridgeWatch(watch, view, ctx, opts) {
31
- const capacity = opts.capacity ?? WATCH_CAPACITY;
32
- if (!Number.isSafeInteger(capacity) || capacity < 1)
33
- throw new RangeError("Chord view queue capacity must be positive");
34
- const queue = [];
35
- let scheduled = false;
36
- let closed = false;
37
- const fail = (cause) => {
38
- if (closed)
39
- return;
40
- closed = true;
41
- queue.length = 0;
42
- watch.stop();
43
- try {
44
- opts.onFailure?.(cause instanceof Error ? cause : new Error(String(cause)));
45
- }
46
- catch { }
47
- };
48
- const drain = () => {
49
- scheduled = false;
50
- while (!closed && queue.length > 0) {
51
- const envelope = queue.shift();
52
- try {
53
- view.change(ctx, (draft) => {
54
- applyTracked(draft, envelope.ops);
55
- draft.commit.events = envelope.events;
56
- });
57
- }
58
- catch (error) {
59
- fail(error);
60
- }
61
- }
62
- };
63
- watch.start((envelope) => {
64
- if (closed)
65
- return;
66
- if (queue.length >= capacity) {
67
- fail(new Error(`Pico-to-Chord view queue exceeded ${capacity} envelopes`));
68
- return;
69
- }
70
- queue.push(envelope);
71
- if (scheduled)
72
- return;
73
- scheduled = true;
74
- queueMicrotask(drain);
75
- });
76
- return {
77
- view,
78
- get closed() {
79
- return closed;
80
- },
81
- close() {
82
- if (closed)
83
- return;
84
- closed = true;
85
- queue.length = 0;
86
- watch.stop();
87
- },
88
- };
89
- }
90
- function applyTracked(root, ops) {
91
- for (const op of ops) {
92
- if (op[0] === "r")
93
- throw new Error("live Pico envelope unexpectedly replaced the view root");
94
- const path = op[1];
95
- if (op[0] === "p") {
96
- const target = resolve(root, path);
97
- if (!Array.isArray(target))
98
- throw new Error(`Pico splice path is not an array: ${path.join(".")}`);
99
- target.splice(op[2], op[3], ...op[4]);
100
- continue;
101
- }
102
- if (op[0] === "m") {
103
- const target = resolve(root, path);
104
- if (!Array.isArray(target) || target.length !== op[2].length) {
105
- throw new Error(`Pico permutation path is not a matching array: ${path.join(".")}`);
106
- }
107
- const array = target;
108
- const previous = array.slice();
109
- const rank = new Map();
110
- for (let index = 0; index < op[2].length; index++) {
111
- const value = previous[op[2][index]];
112
- if (!rank.has(value))
113
- rank.set(value, index);
114
- }
115
- array.sort((left, right) => rank.get(left) - rank.get(right));
116
- continue;
117
- }
118
- const parent = resolve(root, path.slice(0, -1));
119
- if (parent === null || typeof parent !== "object")
120
- throw new Error(`Pico operation parent is not an object: ${path.join(".")}`);
121
- const key = path[path.length - 1];
122
- if (op[0] === "d") {
123
- if (Array.isArray(parent))
124
- parent.splice(key, 1);
125
- else
126
- delete parent[key];
127
- continue;
128
- }
129
- const record = parent;
130
- if (op[0] === "s")
131
- record[key] = op[2];
132
- else if (op[0] === "a")
133
- record[key] = `${String(record[key])}${op[2]}`;
134
- else
135
- record[key] = String(record[key]).slice(op[2]);
136
- }
137
- }
138
- function resolve(root, path) {
139
- let value = root;
140
- for (const segment of path) {
141
- if (value === null || typeof value !== "object")
142
- return undefined;
143
- value = value[segment];
144
- }
145
- return value;
146
- }
147
- //# sourceMappingURL=chord.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chord.js","sourceRoot":"","sources":["../../../src/harness/pico3/chord.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Context,\n\ttype Draft,\n\tdefineService,\n\ttype MutableReplicatedState,\n\ttype ReplicatedState,\n} from \"@draht/chord\";\nimport type { Op, Path, Seg } from \"@draht/chord/delta\";\nimport type { ConversationHandle, Harness } from \"./harness.ts\";\nimport type {\n\tConversationSpec,\n\tConversationView,\n\tEntry,\n\tEntryScan,\n\tEnvelope,\n\tId,\n\tJsonObject,\n\tNewEntry,\n\tSendInput,\n\tViewEvent,\n} from \"./types.ts\";\nimport { WATCH_CAPACITY, type Watch } from \"./view.ts\";\n\nexport type PublishedConversationView = ConversationView & {\n\tcommit: { events: ViewEvent[] };\n};\n\nexport interface PicoConversationService {\n\treadonly view: ReplicatedState<PublishedConversationView>;\n\tsend(input: SendInput, ctx: Context): Promise<Id>;\n\twrite(entry: NewEntry, ctx: Context): Promise<Id>;\n\tinputAbort(id: Id, ctx: Context): Promise<\"aborted\" | \"already_placed\" | \"not_found\">;\n\tconfigSet(patch: JsonObject, ctx: Context): Promise<void>;\n\tabort(ctx: Context): Promise<void>;\n\treset(handoff: string | null, ctx: Context): Promise<void>;\n\tcollapse(instructions: string | null, ctx: Context): Promise<Id>;\n\tfork(at: Id | \"start\", spec: Omit<ConversationSpec, \"parent\">, ctx: Context): Promise<Id>;\n\tentries(scan: EntryScan, ctx: Context): Promise<Entry[]>;\n}\n\n/** Local registration/control plane and remote keyed conversation contract used by Chord facets. */\nexport const PicoHarnessService = defineService<Harness>(\"pi.harness\", { local: true });\nexport const PicoConversationService = defineService<PicoConversationService>(\"pi.conversation\");\n\nexport function createPicoConversationService<Cfg extends object>(\n\tharness: Pick<Harness, \"abortInput\" | \"entries\">,\n\tconversation: ConversationHandle<Cfg>,\n\tview: ReplicatedState<PublishedConversationView>,\n): PicoConversationService {\n\treturn {\n\t\tview,\n\t\tsend: (input, ctx) => conversation.send(input, ctx).then((handle) => handle.id),\n\t\twrite: (entry, ctx) => conversation.write(entry, ctx),\n\t\tinputAbort: (id, ctx) => harness.abortInput(id, ctx, conversation.id),\n\t\tconfigSet: (patch, ctx) => conversation.config.set(patch as never, ctx),\n\t\tabort: (ctx) => conversation.abort(ctx),\n\t\treset: (handoff, ctx) => conversation.reset(handoff ?? undefined, ctx),\n\t\tcollapse: (instructions, ctx) => conversation.collapse(instructions ?? undefined, ctx),\n\t\tfork: (at, spec, ctx) => conversation.fork(at, spec, ctx).then((child) => child.id),\n\t\tentries: (scan, ctx) => harness.entries({ ...scan, conversationId: conversation.id }, ctx),\n\t};\n}\n\nexport interface ChordViewBridge {\n\treadonly view: MutableReplicatedState<PublishedConversationView>;\n\treadonly closed: boolean;\n\tclose(): void;\n}\n\nexport interface ChordViewBridgeOptions {\n\tcapacity?: number;\n\t/** Called after the raw watch is closed. The owner should close and respawn its keyed service instance. */\n\tonFailure?: (error: Error) => void;\n}\n\n/**\n * Adapt Pico's commit-granular envelopes to one Chord publication per commit.\n * The raw listener only enqueues. Applying ops and publishing happen together,\n * off the Session line, with no await between them.\n */\nexport async function attachChordView(\n\tconversation: Pick<ConversationHandle, \"watch\">,\n\tcreateState: (initial: PublishedConversationView) => MutableReplicatedState<PublishedConversationView>,\n\tctx: Context,\n\topts: ChordViewBridgeOptions = {},\n): Promise<ChordViewBridge> {\n\tconst watch = await conversation.watch(ctx);\n\tconst view = createState({ ...structuredClone(watch.view), commit: { events: [] } });\n\treturn bridgeWatch(watch, view, ctx, opts);\n}\n\nfunction bridgeWatch(\n\twatch: Watch,\n\tview: MutableReplicatedState<PublishedConversationView>,\n\tctx: Context,\n\topts: ChordViewBridgeOptions,\n): ChordViewBridge {\n\tconst capacity = opts.capacity ?? WATCH_CAPACITY;\n\tif (!Number.isSafeInteger(capacity) || capacity < 1)\n\t\tthrow new RangeError(\"Chord view queue capacity must be positive\");\n\tconst queue: Envelope[] = [];\n\tlet scheduled = false;\n\tlet closed = false;\n\tconst fail = (cause: unknown) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tqueue.length = 0;\n\t\twatch.stop();\n\t\ttry {\n\t\t\topts.onFailure?.(cause instanceof Error ? cause : new Error(String(cause)));\n\t\t} catch {}\n\t};\n\tconst drain = () => {\n\t\tscheduled = false;\n\t\twhile (!closed && queue.length > 0) {\n\t\t\tconst envelope = queue.shift()!;\n\t\t\ttry {\n\t\t\t\tview.change(ctx, (draft) => {\n\t\t\t\t\tapplyTracked(draft, envelope.ops);\n\t\t\t\t\tdraft.commit.events = envelope.events as Draft<ViewEvent[]>;\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tfail(error);\n\t\t\t}\n\t\t}\n\t};\n\twatch.start((envelope) => {\n\t\tif (closed) return;\n\t\tif (queue.length >= capacity) {\n\t\t\tfail(new Error(`Pico-to-Chord view queue exceeded ${capacity} envelopes`));\n\t\t\treturn;\n\t\t}\n\t\tqueue.push(envelope);\n\t\tif (scheduled) return;\n\t\tscheduled = true;\n\t\tqueueMicrotask(drain);\n\t});\n\treturn {\n\t\tview,\n\t\tget closed() {\n\t\t\treturn closed;\n\t\t},\n\t\tclose() {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tqueue.length = 0;\n\t\t\twatch.stop();\n\t\t},\n\t};\n}\n\nfunction applyTracked(root: Draft<PublishedConversationView>, ops: readonly Op[]): void {\n\tfor (const op of ops) {\n\t\tif (op[0] === \"r\") throw new Error(\"live Pico envelope unexpectedly replaced the view root\");\n\t\tconst path = op[1];\n\t\tif (op[0] === \"p\") {\n\t\t\tconst target = resolve(root, path);\n\t\t\tif (!Array.isArray(target)) throw new Error(`Pico splice path is not an array: ${path.join(\".\")}`);\n\t\t\t(target as unknown[]).splice(op[2], op[3], ...op[4]);\n\t\t\tcontinue;\n\t\t}\n\t\tif (op[0] === \"m\") {\n\t\t\tconst target = resolve(root, path);\n\t\t\tif (!Array.isArray(target) || target.length !== op[2].length) {\n\t\t\t\tthrow new Error(`Pico permutation path is not a matching array: ${path.join(\".\")}`);\n\t\t\t}\n\t\t\tconst array = target as unknown[];\n\t\t\tconst previous = array.slice();\n\t\t\tconst rank = new Map<unknown, number>();\n\t\t\tfor (let index = 0; index < op[2].length; index++) {\n\t\t\t\tconst value = previous[op[2][index]!]!;\n\t\t\t\tif (!rank.has(value)) rank.set(value, index);\n\t\t\t}\n\t\t\tarray.sort((left, right) => rank.get(left)! - rank.get(right)!);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parent = resolve(root, path.slice(0, -1));\n\t\tif (parent === null || typeof parent !== \"object\")\n\t\t\tthrow new Error(`Pico operation parent is not an object: ${path.join(\".\")}`);\n\t\tconst key = path[path.length - 1]!;\n\t\tif (op[0] === \"d\") {\n\t\t\tif (Array.isArray(parent)) parent.splice(key as number, 1);\n\t\t\telse delete (parent as Record<PropertyKey, unknown>)[key];\n\t\t\tcontinue;\n\t\t}\n\t\tconst record = parent as Record<PropertyKey, unknown>;\n\t\tif (op[0] === \"s\") record[key] = op[2];\n\t\telse if (op[0] === \"a\") record[key] = `${String(record[key])}${op[2]}`;\n\t\telse record[key] = String(record[key]).slice(op[2]);\n\t}\n}\n\nfunction resolve(root: unknown, path: Path): unknown {\n\tlet value = root;\n\tfor (const segment of path) {\n\t\tif (value === null || typeof value !== \"object\") return undefined;\n\t\tvalue = (value as Record<Seg, unknown>)[segment];\n\t}\n\treturn value;\n}\n"]}
@@ -1,16 +0,0 @@
1
- import type { Context } from "@draht/chord";
2
- import type { ContextView, Id, Storage } from "./types.ts";
3
- /**
4
- * pico §1.3, verbatim:
5
- * H = newest fork-visible entry at or before T with a head
6
- * from = H ? H.head : transcript start
7
- * range = fork-visible entries from `from` through T
8
- * edits = per target, newest edit in range wins
9
- * entries = H ? [H, ...range without any head entries] : range
10
- * model = concat(entries.map(e => edits[e.id] ? apply : e.model)), then reorder tool results
11
- *
12
- * Display-only entries (aborted/error assistants, pi.usage, model-less plugin entries) have no
13
- * `model` and contribute nothing. Nothing here inspects an error string.
14
- */
15
- export declare function deriveContext(storage: Storage, conversationId: Id, at: Id | undefined, ctx: Context): Promise<ContextView>;
16
- //# sourceMappingURL=context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/harness/pico3/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAe,WAAW,EAAS,EAAE,EAAkB,OAAO,EAAiB,MAAM,YAAY,CAAC;AAE9G;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAClC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,EAAE,EAClB,EAAE,EAAE,EAAE,GAAG,SAAS,EAClB,GAAG,EAAE,OAAO,GACV,OAAO,CAAC,WAAW,CAAC,CA4CtB"}
@@ -1,88 +0,0 @@
1
- /**
2
- * pico §1.3, verbatim:
3
- * H = newest fork-visible entry at or before T with a head
4
- * from = H ? H.head : transcript start
5
- * range = fork-visible entries from `from` through T
6
- * edits = per target, newest edit in range wins
7
- * entries = H ? [H, ...range without any head entries] : range
8
- * model = concat(entries.map(e => edits[e.id] ? apply : e.model)), then reorder tool results
9
- *
10
- * Display-only entries (aborted/error assistants, pi.usage, model-less plugin entries) have no
11
- * `model` and contribute nothing. Nothing here inspects an error string.
12
- */
13
- export async function deriveContext(storage, conversationId, at, ctx) {
14
- const [head] = await storage.scanEntries({ conversationId, withHead: true, ...(at === undefined ? {} : { before: at + 1 }), limit: 1 }, ctx);
15
- const from = head?.head;
16
- // Walk newest-first until we pass `from`.
17
- const range = [];
18
- let before = at === undefined ? undefined : at + 1;
19
- for (;;) {
20
- const page = await storage.scanEntries({ conversationId, ...(before === undefined ? {} : { before }), limit: 256 }, ctx);
21
- let done = page.length < 256;
22
- for (const e of page) {
23
- if (from !== undefined && e.id < from) {
24
- done = true;
25
- break;
26
- }
27
- range.push(e);
28
- }
29
- if (done)
30
- break;
31
- before = page[page.length - 1].id;
32
- }
33
- range.reverse();
34
- const edits = new Map();
35
- for (const e of range)
36
- for (const edit of e.edits ?? [])
37
- edits.set(edit.target, edit); // later wins by iteration order
38
- const entries = head === undefined ? range : [head, ...range.filter((e) => e.head === undefined)];
39
- const messages = [];
40
- for (const e of entries) {
41
- const edit = edits.get(e.id);
42
- if (edit?.action === "omit")
43
- continue;
44
- if (edit?.action === "replace") {
45
- messages.push(...(edit.messages ?? []));
46
- continue;
47
- }
48
- if (e.model)
49
- messages.push(...e.model);
50
- }
51
- return { head, entries, messages: reorderToolResults(messages) };
52
- }
53
- function reorderToolResults(messages) {
54
- const out = [];
55
- for (let i = 0; i < messages.length; i++) {
56
- const m = messages[i];
57
- out.push(m);
58
- if (m.role !== "assistant")
59
- continue;
60
- const calls = m.content.filter((c) => c.type === "toolCall");
61
- if (calls.length === 0)
62
- continue;
63
- const results = new Map();
64
- let j = i + 1;
65
- while (j < messages.length && messages[j].role === "toolResult") {
66
- const r = messages[j];
67
- results.set(r.toolCallId, r);
68
- j++;
69
- }
70
- for (const call of calls) {
71
- out.push(results.get(call.id) ??
72
- {
73
- role: "toolResult",
74
- toolCallId: call.id,
75
- toolName: call.name,
76
- content: [
77
- { type: "text", text: "Tool result unavailable: history ends before this call completed." },
78
- ],
79
- isError: true,
80
- details: { reason: "missing_after_fork" },
81
- timestamp: m.timestamp,
82
- });
83
- }
84
- i = j - 1;
85
- }
86
- return out;
87
- }
88
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/harness/pico3/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@draht/chord\";\nimport type { ContextEdit, ContextView, Entry, Id, RequestMessage, Storage, StoredMessage } from \"./types.ts\";\n\n/**\n * pico §1.3, verbatim:\n * H = newest fork-visible entry at or before T with a head\n * from = H ? H.head : transcript start\n * range = fork-visible entries from `from` through T\n * edits = per target, newest edit in range wins\n * entries = H ? [H, ...range without any head entries] : range\n * model = concat(entries.map(e => edits[e.id] ? apply : e.model)), then reorder tool results\n *\n * Display-only entries (aborted/error assistants, pi.usage, model-less plugin entries) have no\n * `model` and contribute nothing. Nothing here inspects an error string.\n */\nexport async function deriveContext(\n\tstorage: Storage,\n\tconversationId: Id,\n\tat: Id | undefined,\n\tctx: Context,\n): Promise<ContextView> {\n\tconst [head] = await storage.scanEntries(\n\t\t{ conversationId, withHead: true, ...(at === undefined ? {} : { before: at + 1 }), limit: 1 },\n\t\tctx,\n\t);\n\tconst from = head?.head;\n\n\t// Walk newest-first until we pass `from`.\n\tconst range: Entry[] = [];\n\tlet before = at === undefined ? undefined : at + 1;\n\tfor (;;) {\n\t\tconst page = await storage.scanEntries(\n\t\t\t{ conversationId, ...(before === undefined ? {} : { before }), limit: 256 },\n\t\t\tctx,\n\t\t);\n\t\tlet done = page.length < 256;\n\t\tfor (const e of page) {\n\t\t\tif (from !== undefined && e.id < from) {\n\t\t\t\tdone = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\trange.push(e);\n\t\t}\n\t\tif (done) break;\n\t\tbefore = page[page.length - 1]!.id;\n\t}\n\trange.reverse();\n\n\tconst edits = new Map<Id, ContextEdit>();\n\tfor (const e of range) for (const edit of e.edits ?? []) edits.set(edit.target, edit); // later wins by iteration order\n\n\tconst entries = head === undefined ? range : [head, ...range.filter((e) => e.head === undefined)];\n\n\tconst messages: RequestMessage[] = [];\n\tfor (const e of entries) {\n\t\tconst edit = edits.get(e.id);\n\t\tif (edit?.action === \"omit\") continue;\n\t\tif (edit?.action === \"replace\") {\n\t\t\tmessages.push(...(edit.messages ?? []));\n\t\t\tcontinue;\n\t\t}\n\t\tif (e.model) messages.push(...e.model);\n\t}\n\treturn { head, entries, messages: reorderToolResults(messages) };\n}\n\n/** Results are appended as tools finish; put them back in call order, synthesising a missing one after a fork cut. */\ntype StoredAssistant = Extract<StoredMessage, { role: \"assistant\" }>;\ntype StoredToolResult = Extract<StoredMessage, { role: \"toolResult\" }>;\ntype StoredToolCall = Extract<StoredAssistant[\"content\"][number], { type: \"toolCall\" }>;\nfunction reorderToolResults(messages: RequestMessage[]): RequestMessage[] {\n\tconst out: RequestMessage[] = [];\n\tfor (let i = 0; i < messages.length; i++) {\n\t\tconst m = messages[i]!;\n\t\tout.push(m);\n\t\tif (m.role !== \"assistant\") continue;\n\t\tconst calls = (m as StoredAssistant).content.filter((c): c is StoredToolCall => c.type === \"toolCall\");\n\t\tif (calls.length === 0) continue;\n\t\tconst results = new Map<string, StoredToolResult>();\n\t\tlet j = i + 1;\n\t\twhile (j < messages.length && messages[j]!.role === \"toolResult\") {\n\t\t\tconst r = messages[j] as StoredToolResult;\n\t\t\tresults.set(r.toolCallId, r);\n\t\t\tj++;\n\t\t}\n\t\tfor (const call of calls) {\n\t\t\tout.push(\n\t\t\t\tresults.get(call.id) ??\n\t\t\t\t\t({\n\t\t\t\t\t\trole: \"toolResult\",\n\t\t\t\t\t\ttoolCallId: call.id,\n\t\t\t\t\t\ttoolName: call.name,\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{ type: \"text\", text: \"Tool result unavailable: history ends before this call completed.\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\tdetails: { reason: \"missing_after_fork\" },\n\t\t\t\t\t\ttimestamp: (m as StoredAssistant).timestamp,\n\t\t\t\t\t} as StoredToolResult),\n\t\t\t);\n\t\t}\n\t\ti = j - 1;\n\t}\n\treturn out;\n}\n"]}