@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,373 +0,0 @@
1
- import { Errors } from "typebox/value";
2
- import { Bounded } from "../bounded.js";
3
- import { toStored, } from "../types.js";
4
- import { taskApi } from "./task-api.js";
5
- const synthetic = (text, code) => ({
6
- content: [{ type: "text", text }],
7
- isError: true,
8
- diagnostics: [{ severity: "error", message: text, code }],
9
- });
10
- /** Validate arguments with the tool's real schema (TypeBox 1.x). */
11
- export function invalid(declaration, call) {
12
- const errors = [...Errors(declaration.parameters, call.arguments)];
13
- return errors.length === 0 ? undefined : errors.map((e) => `${e.instancePath || "/"}: ${e.message}`).join("; ");
14
- }
15
- const sameIdentity = (a, b) => a.id === b.id && a.name === b.name && a.namespace === b.namespace;
16
- export const tool = {
17
- name: "pi.tool",
18
- turn: true,
19
- inflight: ["started"],
20
- // Offered-set check, lookup, validate, beforeTool, validate again; then write `started`
21
- // (the in-flight checkpoint) and invoke. A crash before `started` reruns all of this.
22
- async initial(task, rt, ctx) {
23
- const call = task.input.call;
24
- if (!task.input.offered.includes(call.name))
25
- return {
26
- done: close(task, synthetic(`tool ${call.name} was not offered`, "not_offered"), undefined, rt.now()),
27
- };
28
- const declaration = rt.tools.get(call.name);
29
- if (declaration === undefined)
30
- return {
31
- done: close(task, synthetic(`tool ${call.name} is not registered`, "missing_tool"), undefined, rt.now()),
32
- };
33
- const bad = invalid(declaration, call);
34
- if (bad !== undefined)
35
- return {
36
- done: close(task, synthetic(`invalid arguments: ${bad}`, "invalid_arguments"), declaration, rt.now()),
37
- };
38
- const hooked = await beforeTool(task, rt, call, ctx);
39
- if ("block" in hooked)
40
- return { done: close(task, synthetic(`blocked: ${hooked.block}`, "blocked"), declaration, rt.now()) };
41
- if (!sameIdentity(call, hooked.call))
42
- return { done: close(task, synthetic("blocked: call identity changed", "blocked"), declaration, rt.now()) };
43
- const badFinal = invalid(declaration, hooked.call);
44
- if (badFinal !== undefined)
45
- return {
46
- done: close(task, synthetic(`invalid arguments after hook: ${badFinal}`, "invalid_arguments"), declaration, rt.now()),
47
- };
48
- const final = toStored(hooked.call);
49
- await rt.commit((tx) => {
50
- tx.checkpoint({ phase: "started", replay: declaration.replay ?? "unsafe", call: final });
51
- const slot = tx.toolSlot(task);
52
- slot.status = "running";
53
- delete slot.waitingOn;
54
- tx.emit({ type: "tool.started", taskId: task.id, callId: final.id, name: final.name });
55
- }, ctx); // durable before the effect
56
- return { done: await invoke(task, final, declaration, rt, ctx) };
57
- },
58
- phases: {
59
- // Only entered by the scheduler after reopen. The stored final call is the evidence; beforeTool never reruns.
60
- async started(task, rt, ctx) {
61
- const cp = task.checkpoint;
62
- const declaration = rt.tools.get(cp.call.name);
63
- if (declaration === undefined)
64
- return {
65
- done: close(task, synthetic(`tool ${cp.call.name} unavailable after restart`, "unavailable"), undefined, rt.now(), cp.call),
66
- };
67
- if (cp.replay !== "safe" || (declaration.replay ?? "unsafe") !== "safe")
68
- return {
69
- done: close(task, synthetic(`tool ${cp.call.name} was interrupted`, "interrupted"), declaration, rt.now(), cp.call),
70
- };
71
- if (invalid(declaration, cp.call) !== undefined)
72
- return {
73
- done: close(task, synthetic(`tool ${cp.call.name} was interrupted; arguments no longer validate`, "interrupted"), declaration, rt.now(), cp.call),
74
- };
75
- return { done: await invoke(task, cp.call, declaration, rt, ctx) };
76
- },
77
- },
78
- async abort(task, rt, ctx) {
79
- for (const conversationId of task.owns) {
80
- const children = await rt.commit((tx) => tx.tasks({ conversationId, status: ["pending", "running"] }), ctx);
81
- for (const child of children)
82
- if (!child.background)
83
- await rt.abortTask(child.id, ctx);
84
- }
85
- return (tx, current) => {
86
- const call = task.checkpoint?.call ?? task.input.call;
87
- const entry = tx.appendEntry(current.conversationId, {
88
- kind: "pi.tool_result",
89
- model: [toMessage(call, synthetic("tool aborted", "aborted"), rt.now())],
90
- data: { diagnostics: [{ severity: "error", message: "aborted", code: "aborted" }] },
91
- });
92
- const slot = tx.sticky(current.conversationId).turn.tools[task.input.index];
93
- if (slot !== undefined) {
94
- slot.status = "aborted";
95
- slot.entry = entry;
96
- delete slot.waitingOn;
97
- }
98
- tx.emit({ type: "tool.aborted", taskId: current.id, callId: call.id, entry });
99
- return { entry };
100
- };
101
- },
102
- };
103
- /** The one point where a throwing handler blocks rather than being skipped. */
104
- async function beforeTool(task, rt, call, ctx) {
105
- let current = call;
106
- for (const binding of rt.hooks.handlers()) {
107
- function memo(name, candidateOrContext, context) {
108
- const targetContext = context ?? candidateOrContext;
109
- return rt.commit((tx) => {
110
- tx.plugins(binding.namespace);
111
- const slot = tx.toolSlot(task);
112
- if (!Object.hasOwn(slot, "memos"))
113
- slot.memos = {};
114
- const memos = slot.memos;
115
- const key = `hook:${binding.namespace.id}:${name}`;
116
- if (Object.hasOwn(memos, key))
117
- return structuredClone(memos[key]);
118
- if (context === undefined)
119
- return undefined;
120
- const candidate = structuredClone(candidateOrContext);
121
- memos[key] = candidate;
122
- return candidate;
123
- }, targetContext);
124
- }
125
- const api = {
126
- ...binding.api,
127
- callId: call.id,
128
- waiting: (context) => rt.commit((tx, currentTask) => {
129
- tx.plugins(binding.namespace);
130
- const slot = tx.toolSlot(currentTask);
131
- if (slot.waitingOn === binding.namespace.id)
132
- return;
133
- slot.waitingOn = binding.namespace.id;
134
- tx.emit({
135
- type: "tool.waiting",
136
- taskId: currentTask.id,
137
- callId: call.id,
138
- on: binding.namespace.id,
139
- });
140
- }, context),
141
- memo,
142
- emit: (name, data, context) => rt.commit((tx) => tx.emit(binding.namespace, name, data), context),
143
- };
144
- try {
145
- const value = await binding.handlers.beforeTool?.(current, api, ctx);
146
- if (!value)
147
- continue;
148
- if (value.block !== undefined)
149
- return { block: value.block };
150
- if (value.call !== undefined)
151
- current = value.call;
152
- }
153
- catch (error) {
154
- if (ctx.abortSignal?.aborted)
155
- throw error;
156
- return { block: `hook threw: ${String(error)}` };
157
- }
158
- }
159
- return { call: current };
160
- }
161
- export const DEFAULT_BOUNDS = { maxBytes: 64 * 1024, maxLines: 200, retain: "head" };
162
- async function invoke(task, call, declaration, rt, ctx) {
163
- // The kernel owns the stream: one bounded buffer, one throttle, one flush path. Flush failures are not swallowed.
164
- const b = { ...DEFAULT_BOUNDS, ...declaration.output };
165
- const buffer = new Bounded(b.maxBytes, b.maxLines, b.retain);
166
- let streamed = false;
167
- let lastFlush = 0;
168
- let flushing = Promise.resolve();
169
- let flushError;
170
- const flush = () => {
171
- lastFlush = rt.now();
172
- const text = buffer.text();
173
- flushing = flushing
174
- .then(() => rt.commit((tx) => {
175
- tx.toolSlot(task).output = text;
176
- }, ctx))
177
- .catch((e) => {
178
- flushError ??= e;
179
- });
180
- };
181
- const api = {
182
- ...taskApi(task, rt),
183
- // Only the free fields; identity (callId/name/args/output) is protected.
184
- progress: (update, c) => rt.commit((tx) => {
185
- const slot = tx.toolSlot(task);
186
- const free = {
187
- progress: slot.progress,
188
- details: slot.details,
189
- continuedBy: slot.continuedBy,
190
- };
191
- update(free);
192
- if (free.progress !== undefined)
193
- slot.progress = free.progress;
194
- else
195
- delete slot.progress;
196
- if (free.details !== undefined)
197
- slot.details = toStored(free.details);
198
- else
199
- delete slot.details;
200
- if (free.continuedBy !== undefined)
201
- slot.continuedBy = free.continuedBy;
202
- else
203
- delete slot.continuedBy;
204
- }, c),
205
- stream(chunk) {
206
- streamed = true;
207
- buffer.push(typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk);
208
- if (rt.now() - lastFlush >= 100)
209
- flush();
210
- },
211
- };
212
- function memo(name, candidateOrContext, context) {
213
- const targetContext = context ?? candidateOrContext;
214
- return rt.commit((tx) => {
215
- const slot = tx.toolSlot(task);
216
- if (!Object.hasOwn(slot, "memos"))
217
- slot.memos = {};
218
- const memos = slot.memos;
219
- const key = `tool:${name}`;
220
- if (Object.hasOwn(memos, key))
221
- return structuredClone(memos[key]);
222
- if (context === undefined)
223
- return undefined;
224
- const candidate = structuredClone(candidateOrContext);
225
- memos[key] = candidate;
226
- return candidate;
227
- }, targetContext);
228
- }
229
- const toolApi = { ...api, callId: call.id, memo };
230
- let result;
231
- try {
232
- result = await declaration.execute(call.arguments, toolApi, ctx);
233
- }
234
- catch (error) {
235
- if (ctx.abortSignal?.aborted)
236
- throw error;
237
- result = synthetic(`tool threw: ${String(error)}`, "threw");
238
- }
239
- if (streamed) {
240
- flush();
241
- await flushing;
242
- if (flushError !== undefined)
243
- throw flushError; // a persistence failure is never hidden
244
- if (result.content === undefined)
245
- result = {
246
- ...result,
247
- content: [{ type: "text", text: buffer.text() }],
248
- ...(buffer.dropped
249
- ? {
250
- diagnostics: [
251
- ...(result.diagnostics ?? []),
252
- {
253
- severity: "warn",
254
- code: "truncated",
255
- message: `${buffer.droppedBytes} bytes / ${buffer.droppedLines} lines dropped (${b.retain} ${b.maxBytes} retained)`,
256
- },
257
- ],
258
- }
259
- : {}),
260
- };
261
- }
262
- let final = result;
263
- await rt.hooks.each(ctx, (h, api) => h.afterTool?.(call, final, { ...api, callId: call.id }, ctx), (value) => {
264
- if (value !== undefined)
265
- final = value;
266
- });
267
- return close(task, final, declaration, rt.now(), call, streamed ? { bytes: buffer.droppedBytes, lines: buffer.droppedLines } : undefined);
268
- }
269
- /** Closure: bound the output, store the exact model message under the stored final call, rest as strict-JSON data. */
270
- function close(task, raw, declaration, now, call = task.input.call, streamTruncated) {
271
- return (tx, current) => {
272
- const bounded = bound({ ...raw, content: raw.content ?? [] }, declaration?.output);
273
- const result = bounded.result;
274
- const bytes = (bounded.truncated?.bytes ?? 0) + (streamTruncated?.bytes ?? 0);
275
- const lines = (bounded.truncated?.lines ?? 0) + (streamTruncated?.lines ?? 0);
276
- const truncated = bytes > 0 || lines > 0 ? { bytes, lines } : undefined;
277
- const data = {};
278
- if (result.details !== undefined)
279
- data.details = toStored(result.details);
280
- if (result.diagnostics !== undefined)
281
- data.diagnostics = toStored(result.diagnostics);
282
- if (result.control !== undefined)
283
- data.control = toStored(result.control);
284
- if (truncated !== undefined)
285
- data.truncated = truncated;
286
- const entry = tx.appendEntry(current.conversationId, {
287
- kind: "pi.tool_result",
288
- model: [toMessage(call, result, now)],
289
- data,
290
- });
291
- const slot = tx.toolSlot(task);
292
- slot.status = result.isError === true ? "error" : "done";
293
- slot.entry = entry;
294
- delete slot.waitingOn;
295
- tx.emit({
296
- type: "tool.finished",
297
- taskId: current.id,
298
- callId: call.id,
299
- entry,
300
- isError: result.isError === true,
301
- ...(result.control === undefined ? {} : { control: result.control }),
302
- });
303
- if (truncated !== undefined)
304
- tx.emit({
305
- type: "warning",
306
- source: "tool",
307
- message: `tool output truncated: ${truncated.bytes} bytes / ${truncated.lines} lines dropped`,
308
- });
309
- const completion = {
310
- status: "completed",
311
- result: { entry, ...(result.control === undefined ? {} : { control: toStored(result.control) }) },
312
- };
313
- return completion;
314
- };
315
- }
316
- function toMessage(call, result, now) {
317
- return toStored({
318
- role: "toolResult",
319
- toolCallId: call.id,
320
- toolName: call.name,
321
- content: result.content ?? [],
322
- isError: result.isError ?? false,
323
- timestamp: now,
324
- });
325
- }
326
- function bound(result, declared) {
327
- const bounds = { ...DEFAULT_BOUNDS, ...declared };
328
- const blocks = result.content ?? [];
329
- let text = blocks
330
- .filter((block) => block.type === "text")
331
- .map((block) => block.text)
332
- .join("");
333
- let droppedLines = 0;
334
- let droppedBytes = 0;
335
- const lines = text.split("\n");
336
- if (lines.length > bounds.maxLines) {
337
- droppedLines = lines.length - bounds.maxLines;
338
- text = (bounds.retain === "head" ? lines.slice(0, bounds.maxLines) : lines.slice(-bounds.maxLines)).join("\n");
339
- }
340
- const bytes = new TextEncoder().encode(text);
341
- if (bytes.length > bounds.maxBytes) {
342
- droppedBytes = bytes.length - bounds.maxBytes;
343
- text = new TextDecoder().decode(bounds.retain === "head" ? bytes.subarray(0, bounds.maxBytes) : bytes.subarray(-bounds.maxBytes));
344
- }
345
- if (droppedBytes === 0 && droppedLines === 0)
346
- return { result };
347
- let textIndex = -1;
348
- for (let index = 0; index < blocks.length; index++) {
349
- if (blocks[index].type !== "text")
350
- continue;
351
- if (bounds.retain === "head" && textIndex >= 0)
352
- continue;
353
- textIndex = index;
354
- }
355
- const content = [];
356
- for (let index = 0; index < blocks.length; index++) {
357
- const block = blocks[index];
358
- if (block.type !== "text")
359
- content.push(block);
360
- else if (index === textIndex)
361
- content.push({ ...block, text });
362
- }
363
- const note = {
364
- severity: "warn",
365
- code: "truncated",
366
- message: `output truncated: ${droppedLines} lines, ${droppedBytes} bytes dropped`,
367
- };
368
- return {
369
- result: { ...result, content, diagnostics: [...(result.diagnostics ?? []), note] },
370
- truncated: { bytes: droppedBytes, lines: droppedLines },
371
- };
372
- }
373
- //# sourceMappingURL=tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToolCall } from \"@draht/ai\";\nimport type { Context } from \"@draht/chord\";\nimport type { TSchema } from \"typebox\";\nimport { Errors } from \"typebox/value\";\nimport { Bounded } from \"../bounded.ts\";\nimport {\n\ttype AnyToolDeclaration,\n\ttype BeforeToolApi,\n\ttype Closure,\n\ttype Completion,\n\ttype CoreKind,\n\ttype CoreTx,\n\ttype HookInfo,\n\ttype HookResult,\n\ttype Id,\n\ttype JsonObject,\n\ttype JsonValue,\n\ttype Runtime,\n\ttype Step,\n\ttype Stored,\n\ttype Task,\n\ttype ToolApi,\n\ttype ToolControl,\n\ttype ToolResult,\n\ttype ToolSlot,\n\ttoStored,\n} from \"../types.ts\";\nimport { taskApi } from \"./task-api.ts\";\n\nexport type StoredToolCall = Stored<ToolCall>;\nexport type ToolInput = {\n\tassistant: Id;\n\tcall: StoredToolCall;\n\toffered: string[];\n\tindex: number; // position of the call in the assistant message; also this tool's slot in sticky.turn.tools\n};\nexport type ToolCheckpoint = { phase: \"started\"; replay: \"safe\" | \"unsafe\"; call: StoredToolCall };\nexport type ToolTaskResult = { entry: Id; control?: ToolControl };\n/** Hook points this kind calls. Register with `h.hooks(namespace, kinds.tool, { … })`. */\nexport interface ToolHooks {\n\t/** Before invocation, before `started`. Chain on `call`; `{ block }` stops it. A throw blocks. */\n\tbeforeTool(\n\t\tcall: StoredToolCall,\n\t\tapi: BeforeToolApi,\n\t\tctx: Context,\n\t): HookResult<{ call?: StoredToolCall; block?: string }>;\n\t/** After the tool returns; may replace the result. Chain. */\n\tafterTool(\n\t\tcall: StoredToolCall,\n\t\tresult: ToolResult,\n\t\tapi: HookInfo & { readonly callId: string },\n\t\tctx: Context,\n\t): HookResult<ToolResult>;\n}\n\ntype T = Task<ToolInput, ToolCheckpoint>;\ntype Rt = Runtime<ToolHooks, CoreTx>;\ntype Out = Closure<ToolTaskResult, never, CoreTx>;\n\nconst synthetic = (text: string, code: string): ToolResult => ({\n\tcontent: [{ type: \"text\", text }],\n\tisError: true,\n\tdiagnostics: [{ severity: \"error\", message: text, code }],\n});\n/** Validate arguments with the tool's real schema (TypeBox 1.x). */\nexport function invalid(declaration: AnyToolDeclaration, call: StoredToolCall): string | undefined {\n\tconst errors = [...Errors(declaration.parameters as TSchema, call.arguments)];\n\treturn errors.length === 0 ? undefined : errors.map((e) => `${e.instancePath || \"/\"}: ${e.message}`).join(\"; \");\n}\nconst sameIdentity = (a: StoredToolCall, b: StoredToolCall) =>\n\ta.id === b.id && a.name === b.name && a.namespace === b.namespace;\n\nexport const tool: CoreKind<ToolInput, ToolCheckpoint, ToolTaskResult, never, { entry: Id }, ToolHooks> = {\n\tname: \"pi.tool\",\n\tturn: true,\n\tinflight: [\"started\"],\n\n\t// Offered-set check, lookup, validate, beforeTool, validate again; then write `started`\n\t// (the in-flight checkpoint) and invoke. A crash before `started` reruns all of this.\n\tasync initial(task, rt, ctx) {\n\t\tconst call = task.input.call;\n\t\tif (!task.input.offered.includes(call.name))\n\t\t\treturn {\n\t\t\t\tdone: close(task, synthetic(`tool ${call.name} was not offered`, \"not_offered\"), undefined, rt.now()),\n\t\t\t};\n\t\tconst declaration = rt.tools.get(call.name);\n\t\tif (declaration === undefined)\n\t\t\treturn {\n\t\t\t\tdone: close(task, synthetic(`tool ${call.name} is not registered`, \"missing_tool\"), undefined, rt.now()),\n\t\t\t};\n\t\tconst bad = invalid(declaration, call);\n\t\tif (bad !== undefined)\n\t\t\treturn {\n\t\t\t\tdone: close(task, synthetic(`invalid arguments: ${bad}`, \"invalid_arguments\"), declaration, rt.now()),\n\t\t\t};\n\t\tconst hooked = await beforeTool(task, rt, call, ctx);\n\t\tif (\"block\" in hooked)\n\t\t\treturn { done: close(task, synthetic(`blocked: ${hooked.block}`, \"blocked\"), declaration, rt.now()) };\n\t\tif (!sameIdentity(call, hooked.call))\n\t\t\treturn { done: close(task, synthetic(\"blocked: call identity changed\", \"blocked\"), declaration, rt.now()) };\n\t\tconst badFinal = invalid(declaration, hooked.call);\n\t\tif (badFinal !== undefined)\n\t\t\treturn {\n\t\t\t\tdone: close(\n\t\t\t\t\ttask,\n\t\t\t\t\tsynthetic(`invalid arguments after hook: ${badFinal}`, \"invalid_arguments\"),\n\t\t\t\t\tdeclaration,\n\t\t\t\t\trt.now(),\n\t\t\t\t),\n\t\t\t};\n\t\tconst final = toStored(hooked.call);\n\t\tawait rt.commit((tx) => {\n\t\t\ttx.checkpoint({ phase: \"started\", replay: declaration.replay ?? \"unsafe\", call: final });\n\t\t\tconst slot = tx.toolSlot(task);\n\t\t\tslot.status = \"running\";\n\t\t\tdelete slot.waitingOn;\n\t\t\ttx.emit({ type: \"tool.started\", taskId: task.id, callId: final.id, name: final.name });\n\t\t}, ctx); // durable before the effect\n\t\treturn { done: await invoke(task, final, declaration, rt, ctx) };\n\t},\n\n\tphases: {\n\t\t// Only entered by the scheduler after reopen. The stored final call is the evidence; beforeTool never reruns.\n\t\tasync started(task, rt, ctx) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tconst declaration = rt.tools.get(cp.call.name);\n\t\t\tif (declaration === undefined)\n\t\t\t\treturn {\n\t\t\t\t\tdone: close(\n\t\t\t\t\t\ttask,\n\t\t\t\t\t\tsynthetic(`tool ${cp.call.name} unavailable after restart`, \"unavailable\"),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\trt.now(),\n\t\t\t\t\t\tcp.call,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\tif (cp.replay !== \"safe\" || (declaration.replay ?? \"unsafe\") !== \"safe\")\n\t\t\t\treturn {\n\t\t\t\t\tdone: close(\n\t\t\t\t\t\ttask,\n\t\t\t\t\t\tsynthetic(`tool ${cp.call.name} was interrupted`, \"interrupted\"),\n\t\t\t\t\t\tdeclaration,\n\t\t\t\t\t\trt.now(),\n\t\t\t\t\t\tcp.call,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\tif (invalid(declaration, cp.call) !== undefined)\n\t\t\t\treturn {\n\t\t\t\t\tdone: close(\n\t\t\t\t\t\ttask,\n\t\t\t\t\t\tsynthetic(`tool ${cp.call.name} was interrupted; arguments no longer validate`, \"interrupted\"),\n\t\t\t\t\t\tdeclaration,\n\t\t\t\t\t\trt.now(),\n\t\t\t\t\t\tcp.call,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\treturn { done: await invoke(task, cp.call, declaration, rt, ctx) };\n\t\t},\n\t},\n\n\tasync abort(task, rt, ctx) {\n\t\tfor (const conversationId of task.owns) {\n\t\t\tconst children = await rt.commit((tx) => tx.tasks({ conversationId, status: [\"pending\", \"running\"] }), ctx);\n\t\t\tfor (const child of children) if (!child.background) await rt.abortTask(child.id, ctx);\n\t\t}\n\t\treturn (tx, current) => {\n\t\t\tconst call = task.checkpoint?.call ?? task.input.call;\n\t\t\tconst entry = tx.appendEntry(current.conversationId, {\n\t\t\t\tkind: \"pi.tool_result\",\n\t\t\t\tmodel: [toMessage(call, synthetic(\"tool aborted\", \"aborted\"), rt.now())],\n\t\t\t\tdata: { diagnostics: [{ severity: \"error\", message: \"aborted\", code: \"aborted\" }] },\n\t\t\t});\n\t\t\tconst slot = tx.sticky(current.conversationId).turn.tools[task.input.index];\n\t\t\tif (slot !== undefined) {\n\t\t\t\tslot.status = \"aborted\";\n\t\t\t\tslot.entry = entry;\n\t\t\t\tdelete slot.waitingOn;\n\t\t\t}\n\t\t\ttx.emit({ type: \"tool.aborted\", taskId: current.id, callId: call.id, entry });\n\t\t\treturn { entry };\n\t\t};\n\t},\n};\n\n/** The one point where a throwing handler blocks rather than being skipped. */\nasync function beforeTool(\n\ttask: T,\n\trt: Rt,\n\tcall: StoredToolCall,\n\tctx: Context,\n): Promise<{ call: StoredToolCall } | { block: string }> {\n\tlet current = call;\n\tfor (const binding of rt.hooks.handlers()) {\n\t\tfunction memo<T extends JsonValue>(name: string, candidate: T, context: Context): Promise<T>;\n\t\tfunction memo<T extends JsonValue>(name: string, context: Context): Promise<T | undefined>;\n\t\tfunction memo<T extends JsonValue>(\n\t\t\tname: string,\n\t\t\tcandidateOrContext: T | Context,\n\t\t\tcontext?: Context,\n\t\t): Promise<T | undefined> {\n\t\t\tconst targetContext = context ?? (candidateOrContext as Context);\n\t\t\treturn rt.commit((tx) => {\n\t\t\t\ttx.plugins(binding.namespace);\n\t\t\t\tconst slot = tx.toolSlot(task);\n\t\t\t\tif (!Object.hasOwn(slot, \"memos\")) slot.memos = {};\n\t\t\t\tconst memos = slot.memos!;\n\t\t\t\tconst key = `hook:${binding.namespace.id}:${name}`;\n\t\t\t\tif (Object.hasOwn(memos, key)) return structuredClone(memos[key]) as T;\n\t\t\t\tif (context === undefined) return undefined;\n\t\t\t\tconst candidate = structuredClone(candidateOrContext as T);\n\t\t\t\tmemos[key] = candidate;\n\t\t\t\treturn candidate;\n\t\t\t}, targetContext);\n\t\t}\n\t\tconst api: BeforeToolApi = {\n\t\t\t...binding.api,\n\t\t\tcallId: call.id,\n\t\t\twaiting: (context) =>\n\t\t\t\trt.commit((tx, currentTask) => {\n\t\t\t\t\ttx.plugins(binding.namespace);\n\t\t\t\t\tconst slot = tx.toolSlot(currentTask as T);\n\t\t\t\t\tif (slot.waitingOn === binding.namespace.id) return;\n\t\t\t\t\tslot.waitingOn = binding.namespace.id;\n\t\t\t\t\ttx.emit({\n\t\t\t\t\t\ttype: \"tool.waiting\",\n\t\t\t\t\t\ttaskId: currentTask.id,\n\t\t\t\t\t\tcallId: call.id,\n\t\t\t\t\t\ton: binding.namespace.id,\n\t\t\t\t\t});\n\t\t\t\t}, context),\n\t\t\tmemo,\n\t\t\temit: (name, data, context) => rt.commit((tx) => tx.emit(binding.namespace, name, data), context),\n\t\t};\n\t\ttry {\n\t\t\tconst value = await binding.handlers.beforeTool?.(current, api, ctx);\n\t\t\tif (!value) continue;\n\t\t\tif (value.block !== undefined) return { block: value.block };\n\t\t\tif (value.call !== undefined) current = value.call;\n\t\t} catch (error) {\n\t\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\t\treturn { block: `hook threw: ${String(error)}` };\n\t\t}\n\t}\n\treturn { call: current };\n}\n\nexport const DEFAULT_BOUNDS = { maxBytes: 64 * 1024, maxLines: 200, retain: \"head\" as const };\n\nasync function invoke(\n\ttask: T,\n\tcall: StoredToolCall,\n\tdeclaration: AnyToolDeclaration,\n\trt: Rt,\n\tctx: Context,\n): Promise<Out> {\n\t// The kernel owns the stream: one bounded buffer, one throttle, one flush path. Flush failures are not swallowed.\n\tconst b = { ...DEFAULT_BOUNDS, ...declaration.output };\n\tconst buffer = new Bounded(b.maxBytes, b.maxLines, b.retain);\n\tlet streamed = false;\n\tlet lastFlush = 0;\n\tlet flushing: Promise<void> = Promise.resolve();\n\tlet flushError: unknown;\n\tconst flush = () => {\n\t\tlastFlush = rt.now();\n\t\tconst text = buffer.text();\n\t\tflushing = flushing\n\t\t\t.then(() =>\n\t\t\t\trt.commit((tx) => {\n\t\t\t\t\ttx.toolSlot(task).output = text;\n\t\t\t\t}, ctx),\n\t\t\t)\n\t\t\t.catch((e) => {\n\t\t\t\tflushError ??= e;\n\t\t\t});\n\t};\n\tconst api = {\n\t\t...taskApi(task, rt),\n\t\t// Only the free fields; identity (callId/name/args/output) is protected.\n\t\tprogress: (update: (slot: Pick<ToolSlot, \"progress\" | \"details\" | \"continuedBy\">) => void, c: Context) =>\n\t\t\trt.commit((tx) => {\n\t\t\t\tconst slot = tx.toolSlot(task);\n\t\t\t\tconst free: Pick<ToolSlot, \"progress\" | \"details\" | \"continuedBy\"> = {\n\t\t\t\t\tprogress: slot.progress,\n\t\t\t\t\tdetails: slot.details,\n\t\t\t\t\tcontinuedBy: slot.continuedBy,\n\t\t\t\t};\n\t\t\t\tupdate(free);\n\t\t\t\tif (free.progress !== undefined) slot.progress = free.progress;\n\t\t\t\telse delete slot.progress;\n\t\t\t\tif (free.details !== undefined) slot.details = toStored(free.details);\n\t\t\t\telse delete slot.details;\n\t\t\t\tif (free.continuedBy !== undefined) slot.continuedBy = free.continuedBy;\n\t\t\t\telse delete slot.continuedBy;\n\t\t\t}, c),\n\t\tstream(chunk: string | Uint8Array) {\n\t\t\tstreamed = true;\n\t\t\tbuffer.push(typeof chunk === \"string\" ? new TextEncoder().encode(chunk) : chunk);\n\t\t\tif (rt.now() - lastFlush >= 100) flush();\n\t\t},\n\t};\n\tfunction memo<T extends JsonValue>(name: string, candidate: T, context: Context): Promise<T>;\n\tfunction memo<T extends JsonValue>(name: string, context: Context): Promise<T | undefined>;\n\tfunction memo<T extends JsonValue>(\n\t\tname: string,\n\t\tcandidateOrContext: T | Context,\n\t\tcontext?: Context,\n\t): Promise<T | undefined> {\n\t\tconst targetContext = context ?? (candidateOrContext as Context);\n\t\treturn rt.commit((tx) => {\n\t\t\tconst slot = tx.toolSlot(task);\n\t\t\tif (!Object.hasOwn(slot, \"memos\")) slot.memos = {};\n\t\t\tconst memos = slot.memos!;\n\t\t\tconst key = `tool:${name}`;\n\t\t\tif (Object.hasOwn(memos, key)) return structuredClone(memos[key]) as T;\n\t\t\tif (context === undefined) return undefined;\n\t\t\tconst candidate = structuredClone(candidateOrContext as T);\n\t\t\tmemos[key] = candidate;\n\t\t\treturn candidate;\n\t\t}, targetContext);\n\t}\n\tconst toolApi: typeof api & Pick<ToolApi, \"callId\" | \"memo\"> = { ...api, callId: call.id, memo };\n\tlet result: ToolResult;\n\ttry {\n\t\tresult = await declaration.execute(call.arguments as never, toolApi, ctx);\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\tresult = synthetic(`tool threw: ${String(error)}`, \"threw\");\n\t}\n\tif (streamed) {\n\t\tflush();\n\t\tawait flushing;\n\t\tif (flushError !== undefined) throw flushError; // a persistence failure is never hidden\n\t\tif (result.content === undefined)\n\t\t\tresult = {\n\t\t\t\t...result,\n\t\t\t\tcontent: [{ type: \"text\", text: buffer.text() }],\n\t\t\t\t...(buffer.dropped\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tdiagnostics: [\n\t\t\t\t\t\t\t\t...(result.diagnostics ?? []),\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tseverity: \"warn\" as const,\n\t\t\t\t\t\t\t\t\tcode: \"truncated\",\n\t\t\t\t\t\t\t\t\tmessage: `${buffer.droppedBytes} bytes / ${buffer.droppedLines} lines dropped (${b.retain} ${b.maxBytes} retained)`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t};\n\t}\n\tlet final = result;\n\tawait rt.hooks.each(\n\t\tctx,\n\t\t(h, api) => h.afterTool?.(call, final, { ...api, callId: call.id }, ctx),\n\t\t(value) => {\n\t\t\tif (value !== undefined) final = value;\n\t\t},\n\t);\n\treturn close(\n\t\ttask,\n\t\tfinal,\n\t\tdeclaration,\n\t\trt.now(),\n\t\tcall,\n\t\tstreamed ? { bytes: buffer.droppedBytes, lines: buffer.droppedLines } : undefined,\n\t);\n}\n\n/** Closure: bound the output, store the exact model message under the stored final call, rest as strict-JSON data. */\nfunction close(\n\ttask: T,\n\traw: ToolResult,\n\tdeclaration: AnyToolDeclaration | undefined,\n\tnow: number,\n\tcall: StoredToolCall = task.input.call,\n\tstreamTruncated?: { bytes: number; lines: number },\n): Out {\n\treturn (tx, current) => {\n\t\tconst bounded = bound({ ...raw, content: raw.content ?? [] }, declaration?.output);\n\t\tconst result = bounded.result;\n\t\tconst bytes = (bounded.truncated?.bytes ?? 0) + (streamTruncated?.bytes ?? 0);\n\t\tconst lines = (bounded.truncated?.lines ?? 0) + (streamTruncated?.lines ?? 0);\n\t\tconst truncated = bytes > 0 || lines > 0 ? { bytes, lines } : undefined;\n\t\tconst data: JsonObject = {};\n\t\tif (result.details !== undefined) data.details = toStored(result.details);\n\t\tif (result.diagnostics !== undefined) data.diagnostics = toStored(result.diagnostics);\n\t\tif (result.control !== undefined) data.control = toStored(result.control);\n\t\tif (truncated !== undefined) data.truncated = truncated;\n\t\tconst entry = tx.appendEntry(current.conversationId, {\n\t\t\tkind: \"pi.tool_result\",\n\t\t\tmodel: [toMessage(call, result, now)],\n\t\t\tdata,\n\t\t});\n\t\tconst slot = tx.toolSlot(task);\n\t\tslot.status = result.isError === true ? \"error\" : \"done\";\n\t\tslot.entry = entry;\n\t\tdelete slot.waitingOn;\n\t\ttx.emit({\n\t\t\ttype: \"tool.finished\",\n\t\t\ttaskId: current.id,\n\t\t\tcallId: call.id,\n\t\t\tentry,\n\t\t\tisError: result.isError === true,\n\t\t\t...(result.control === undefined ? {} : { control: result.control }),\n\t\t});\n\t\tif (truncated !== undefined)\n\t\t\ttx.emit({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tsource: \"tool\",\n\t\t\t\tmessage: `tool output truncated: ${truncated.bytes} bytes / ${truncated.lines} lines dropped`,\n\t\t\t});\n\t\tconst completion: Completion<ToolTaskResult, never> = {\n\t\t\tstatus: \"completed\",\n\t\t\tresult: { entry, ...(result.control === undefined ? {} : { control: toStored(result.control) }) },\n\t\t};\n\t\treturn completion;\n\t};\n}\n\nfunction toMessage(call: StoredToolCall, result: ToolResult, now: number) {\n\treturn toStored({\n\t\trole: \"toolResult\" as const,\n\t\ttoolCallId: call.id,\n\t\ttoolName: call.name,\n\t\tcontent: result.content ?? [],\n\t\tisError: result.isError ?? false,\n\t\ttimestamp: now,\n\t});\n}\n\nfunction bound(\n\tresult: ToolResult,\n\tdeclared: AnyToolDeclaration[\"output\"],\n): { result: ToolResult; truncated?: { bytes: number; lines: number } } {\n\tconst bounds = { ...DEFAULT_BOUNDS, ...declared };\n\tconst blocks = result.content ?? [];\n\tlet text = blocks\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\");\n\tlet droppedLines = 0;\n\tlet droppedBytes = 0;\n\tconst lines = text.split(\"\\n\");\n\tif (lines.length > bounds.maxLines) {\n\t\tdroppedLines = lines.length - bounds.maxLines;\n\t\ttext = (bounds.retain === \"head\" ? lines.slice(0, bounds.maxLines) : lines.slice(-bounds.maxLines)).join(\"\\n\");\n\t}\n\tconst bytes = new TextEncoder().encode(text);\n\tif (bytes.length > bounds.maxBytes) {\n\t\tdroppedBytes = bytes.length - bounds.maxBytes;\n\t\ttext = new TextDecoder().decode(\n\t\t\tbounds.retain === \"head\" ? bytes.subarray(0, bounds.maxBytes) : bytes.subarray(-bounds.maxBytes),\n\t\t);\n\t}\n\tif (droppedBytes === 0 && droppedLines === 0) return { result };\n\tlet textIndex = -1;\n\tfor (let index = 0; index < blocks.length; index++) {\n\t\tif (blocks[index]!.type !== \"text\") continue;\n\t\tif (bounds.retain === \"head\" && textIndex >= 0) continue;\n\t\ttextIndex = index;\n\t}\n\tconst content: NonNullable<ToolResult[\"content\"]> = [];\n\tfor (let index = 0; index < blocks.length; index++) {\n\t\tconst block = blocks[index]!;\n\t\tif (block.type !== \"text\") content.push(block);\n\t\telse if (index === textIndex) content.push({ ...block, text });\n\t}\n\tconst note = {\n\t\tseverity: \"warn\" as const,\n\t\tcode: \"truncated\",\n\t\tmessage: `output truncated: ${droppedLines} lines, ${droppedBytes} bytes dropped`,\n\t};\n\treturn {\n\t\tresult: { ...result, content, diagnostics: [...(result.diagnostics ?? []), note] },\n\t\ttruncated: { bytes: droppedBytes, lines: droppedLines },\n\t};\n}\n\nexport type { Step };\n"]}
@@ -1,11 +0,0 @@
1
- import { type Op } from "@draht/chord/delta";
2
- /** Temporary compatibility surface for Pico3's flush-based document handling. */
3
- export interface Tracker<T extends object> {
4
- readonly state: T;
5
- readonly target: T;
6
- readonly dirty: boolean;
7
- flush(): Op[];
8
- rebase(): void;
9
- }
10
- export declare function track<T extends object>(initial: T): Tracker<T>;
11
- //# sourceMappingURL=legacy-tracker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"legacy-tracker.d.ts","sourceRoot":"","sources":["../../../src/harness/pico3/legacy-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,EAAE,EAGP,MAAM,oBAAoB,CAAC;AAE5B,iFAAiF;AACjF,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM;IACxC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,KAAK,IAAI,EAAE,EAAE,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;CACf;AA6CD,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE9D"}
@@ -1,41 +0,0 @@
1
- import { track as trackChord, } from "@draht/chord/delta";
2
- class LegacyTracker {
3
- tracker;
4
- change;
5
- forceBase = true;
6
- constructor(initial) {
7
- this.tracker = trackChord(initial);
8
- }
9
- get state() {
10
- this.change ??= this.tracker.beginChange();
11
- return this.change.state;
12
- }
13
- get target() {
14
- return this.tracker.value;
15
- }
16
- get dirty() {
17
- return this.forceBase || this.change !== undefined;
18
- }
19
- flush() {
20
- let prepared;
21
- if (this.change !== undefined) {
22
- const change = this.change;
23
- this.change = undefined;
24
- prepared = change.prepare();
25
- // Pico3 adopts before storage. A storage failure faults the owning Session.
26
- this.tracker.adopt(prepared);
27
- }
28
- if (this.forceBase) {
29
- this.forceBase = false;
30
- return [["r", this.tracker.value]];
31
- }
32
- return (prepared?.ops ?? []);
33
- }
34
- rebase() {
35
- this.forceBase = true;
36
- }
37
- }
38
- export function track(initial) {
39
- return new LegacyTracker(initial);
40
- }
41
- //# sourceMappingURL=legacy-tracker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"legacy-tracker.js","sourceRoot":"","sources":["../../../src/harness/pico3/legacy-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAMN,KAAK,IAAI,UAAU,GACnB,MAAM,oBAAoB,CAAC;AAW5B,MAAM,aAAa;IACD,OAAO,CAAkB;IAClC,MAAM,CAAwB;IAC9B,SAAS,GAAG,IAAI,CAAC;IAEzB,YAAY,OAAU;QACrB,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,KAAK;QACR,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,KAAU,CAAC;IAC/B,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;IACpD,CAAC;IAED,KAAK;QACJ,IAAI,QAAiC,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5B,4EAA4E;YAC5E,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,KAA6B,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAS,CAAC;IACtC,CAAC;IAED,MAAM;QACL,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,CAAC;CACD;AAED,MAAM,UAAU,KAAK,CAAmB,OAAU;IACjD,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import {\n\ttype Change,\n\ttype Tracker as ChordTracker,\n\ttype JsonValue,\n\ttype Op,\n\ttype Prepared,\n\ttrack as trackChord,\n} from \"@draht/chord/delta\";\n\n/** Temporary compatibility surface for Pico3's flush-based document handling. */\nexport interface Tracker<T extends object> {\n\treadonly state: T;\n\treadonly target: T;\n\treadonly dirty: boolean;\n\tflush(): Op[];\n\trebase(): void;\n}\n\nclass LegacyTracker<T extends object> implements Tracker<T> {\n\tprivate readonly tracker: ChordTracker<T>;\n\tprivate change: Change<T> | undefined;\n\tprivate forceBase = true;\n\n\tconstructor(initial: T) {\n\t\tthis.tracker = trackChord(initial);\n\t}\n\n\tget state(): T {\n\t\tthis.change ??= this.tracker.beginChange();\n\t\treturn this.change.state as T;\n\t}\n\n\tget target(): T {\n\t\treturn this.tracker.value;\n\t}\n\n\tget dirty(): boolean {\n\t\treturn this.forceBase || this.change !== undefined;\n\t}\n\n\tflush(): Op[] {\n\t\tlet prepared: Prepared<T> | undefined;\n\t\tif (this.change !== undefined) {\n\t\t\tconst change = this.change;\n\t\t\tthis.change = undefined;\n\t\t\tprepared = change.prepare();\n\t\t\t// Pico3 adopts before storage. A storage failure faults the owning Session.\n\t\t\tthis.tracker.adopt(prepared);\n\t\t}\n\t\tif (this.forceBase) {\n\t\t\tthis.forceBase = false;\n\t\t\treturn [[\"r\", this.tracker.value as unknown as JsonValue]];\n\t\t}\n\t\treturn (prepared?.ops ?? []) as Op[];\n\t}\n\n\trebase(): void {\n\t\tthis.forceBase = true;\n\t}\n}\n\nexport function track<T extends object>(initial: T): Tracker<T> {\n\treturn new LegacyTracker(initial);\n}\n"]}
@@ -1,23 +0,0 @@
1
- /**
2
- * A transaction-scoped revocable membrane over a Chord-tracked document.
3
- *
4
- * Every object reached through a document proxy is wrapped lazily; all wrappers of one
5
- * transaction share one liveness flag; identity is preserved by a WeakMap. Mutations forward
6
- * to the underlying Chord proxy so its tracker records ops. At transaction finish — success,
7
- * callback failure, validation failure, storage failure — `revoke()` flips the flag and every
8
- * retained wrapper, root or nested, throws on any operation.
9
- *
10
- * Assigning one wrapper into another (`a.list = b.list`) is rejected: Chord stores the value it
11
- * is given, and a stored proxy is the classic footgun. Assign plain values; splice in place.
12
- */
13
- export declare class Membrane {
14
- private alive;
15
- private readonly wrappers;
16
- private readonly isWrapper;
17
- private readonly what;
18
- constructor(what: string);
19
- revoke(): void;
20
- wrap<T extends object>(target: T): T;
21
- private assertPlainInput;
22
- }
23
- //# sourceMappingURL=membrane.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"membrane.d.ts","sourceRoot":"","sources":["../../../src/harness/pico3/membrane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,qBAAa,QAAQ;IACpB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B,YAAY,IAAI,EAAE,MAAM,EAEvB;IAED,MAAM,SAEL;IAED,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAoFnC;IAED,OAAO,CAAC,gBAAgB;CAUxB"}