@draht/agent-core 2026.7.30 → 2026.10.4-2

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 (456) hide show
  1. package/dist/agent-loop.d.ts +27 -2
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +181 -63
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/agent.d.ts +14 -4
  6. package/dist/agent.d.ts.map +1 -1
  7. package/dist/agent.js +68 -19
  8. package/dist/agent.js.map +1 -1
  9. package/dist/harness/agent-harness.d.ts +713 -91
  10. package/dist/harness/agent-harness.d.ts.map +1 -1
  11. package/dist/harness/agent-harness.js +5 -950
  12. package/dist/harness/agent-harness.js.map +1 -1
  13. package/dist/harness/compaction/branch-summarization.d.ts +23 -10
  14. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  15. package/dist/harness/compaction/branch-summarization.js +39 -36
  16. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  17. package/dist/harness/compaction/compaction.d.ts +37 -18
  18. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  19. package/dist/harness/compaction/compaction.js +74 -97
  20. package/dist/harness/compaction/compaction.js.map +1 -1
  21. package/dist/harness/config.d.ts +9 -0
  22. package/dist/harness/config.d.ts.map +1 -0
  23. package/dist/harness/config.js +35 -0
  24. package/dist/harness/config.js.map +1 -0
  25. package/dist/harness/context.d.ts +9 -0
  26. package/dist/harness/context.d.ts.map +1 -0
  27. package/dist/harness/context.js +13 -0
  28. package/dist/harness/context.js.map +1 -0
  29. package/dist/harness/env/nodejs.d.ts +25 -27
  30. package/dist/harness/env/nodejs.d.ts.map +1 -1
  31. package/dist/harness/env/nodejs.js +355 -110
  32. package/dist/harness/env/nodejs.js.map +1 -1
  33. package/dist/harness/events.d.ts +24 -0
  34. package/dist/harness/events.d.ts.map +1 -0
  35. package/dist/harness/events.js +233 -0
  36. package/dist/harness/events.js.map +1 -0
  37. package/dist/harness/execution/assistant.d.ts +42 -0
  38. package/dist/harness/execution/assistant.d.ts.map +1 -0
  39. package/dist/harness/execution/assistant.js +82 -0
  40. package/dist/harness/execution/assistant.js.map +1 -0
  41. package/dist/harness/execution/effect-gate.d.ts +22 -0
  42. package/dist/harness/execution/effect-gate.d.ts.map +1 -0
  43. package/dist/harness/execution/effect-gate.js +49 -0
  44. package/dist/harness/execution/effect-gate.js.map +1 -0
  45. package/dist/harness/execution/tools.d.ts +67 -0
  46. package/dist/harness/execution/tools.d.ts.map +1 -0
  47. package/dist/harness/execution/tools.js +119 -0
  48. package/dist/harness/execution/tools.js.map +1 -0
  49. package/dist/harness/hooks.d.ts +38 -0
  50. package/dist/harness/hooks.d.ts.map +1 -0
  51. package/dist/harness/hooks.js +406 -0
  52. package/dist/harness/hooks.js.map +1 -0
  53. package/dist/harness/messages.d.ts +4 -4
  54. package/dist/harness/messages.d.ts.map +1 -1
  55. package/dist/harness/messages.js +4 -3
  56. package/dist/harness/messages.js.map +1 -1
  57. package/dist/harness/pico3/bash.d.ts +10 -0
  58. package/dist/harness/pico3/bash.d.ts.map +1 -0
  59. package/dist/harness/pico3/bash.js +25 -0
  60. package/dist/harness/pico3/bash.js.map +1 -0
  61. package/dist/harness/pico3/bounded.d.ts +21 -0
  62. package/dist/harness/pico3/bounded.d.ts.map +1 -0
  63. package/dist/harness/pico3/bounded.js +98 -0
  64. package/dist/harness/pico3/bounded.js.map +1 -0
  65. package/dist/harness/pico3/chord.d.ts +41 -0
  66. package/dist/harness/pico3/chord.d.ts.map +1 -0
  67. package/dist/harness/pico3/chord.js +147 -0
  68. package/dist/harness/pico3/chord.js.map +1 -0
  69. package/dist/harness/pico3/context.d.ts +16 -0
  70. package/dist/harness/pico3/context.d.ts.map +1 -0
  71. package/dist/harness/pico3/context.js +88 -0
  72. package/dist/harness/pico3/context.js.map +1 -0
  73. package/dist/harness/pico3/harness.d.ts +198 -0
  74. package/dist/harness/pico3/harness.d.ts.map +1 -0
  75. package/dist/harness/pico3/harness.js +654 -0
  76. package/dist/harness/pico3/harness.js.map +1 -0
  77. package/dist/harness/pico3/hooks.d.ts +10 -0
  78. package/dist/harness/pico3/hooks.d.ts.map +1 -0
  79. package/dist/harness/pico3/hooks.js +33 -0
  80. package/dist/harness/pico3/hooks.js.map +1 -0
  81. package/dist/harness/pico3/index.d.ts +19 -0
  82. package/dist/harness/pico3/index.d.ts.map +1 -0
  83. package/dist/harness/pico3/index.js +15 -0
  84. package/dist/harness/pico3/index.js.map +1 -0
  85. package/dist/harness/pico3/jsonl.d.ts +58 -0
  86. package/dist/harness/pico3/jsonl.d.ts.map +1 -0
  87. package/dist/harness/pico3/jsonl.js +325 -0
  88. package/dist/harness/pico3/jsonl.js.map +1 -0
  89. package/dist/harness/pico3/kinds/collapse.d.ts +49 -0
  90. package/dist/harness/pico3/kinds/collapse.d.ts.map +1 -0
  91. package/dist/harness/pico3/kinds/collapse.js +191 -0
  92. package/dist/harness/pico3/kinds/collapse.js.map +1 -0
  93. package/dist/harness/pico3/kinds/entries.d.ts +78 -0
  94. package/dist/harness/pico3/kinds/entries.d.ts.map +1 -0
  95. package/dist/harness/pico3/kinds/entries.js +13 -0
  96. package/dist/harness/pico3/kinds/entries.js.map +1 -0
  97. package/dist/harness/pico3/kinds/frames.d.ts +9 -0
  98. package/dist/harness/pico3/kinds/frames.d.ts.map +1 -0
  99. package/dist/harness/pico3/kinds/frames.js +75 -0
  100. package/dist/harness/pico3/kinds/frames.js.map +1 -0
  101. package/dist/harness/pico3/kinds/generation.d.ts +94 -0
  102. package/dist/harness/pico3/kinds/generation.d.ts.map +1 -0
  103. package/dist/harness/pico3/kinds/generation.js +504 -0
  104. package/dist/harness/pico3/kinds/generation.js.map +1 -0
  105. package/dist/harness/pico3/kinds/job.d.ts +44 -0
  106. package/dist/harness/pico3/kinds/job.d.ts.map +1 -0
  107. package/dist/harness/pico3/kinds/job.js +143 -0
  108. package/dist/harness/pico3/kinds/job.js.map +1 -0
  109. package/dist/harness/pico3/kinds/plugin.d.ts +15 -0
  110. package/dist/harness/pico3/kinds/plugin.d.ts.map +1 -0
  111. package/dist/harness/pico3/kinds/plugin.js +35 -0
  112. package/dist/harness/pico3/kinds/plugin.js.map +1 -0
  113. package/dist/harness/pico3/kinds/post-tools.d.ts +22 -0
  114. package/dist/harness/pico3/kinds/post-tools.d.ts.map +1 -0
  115. package/dist/harness/pico3/kinds/post-tools.js +145 -0
  116. package/dist/harness/pico3/kinds/post-tools.js.map +1 -0
  117. package/dist/harness/pico3/kinds/task-api.d.ts +3 -0
  118. package/dist/harness/pico3/kinds/task-api.d.ts.map +1 -0
  119. package/dist/harness/pico3/kinds/task-api.js +45 -0
  120. package/dist/harness/pico3/kinds/task-api.js.map +1 -0
  121. package/dist/harness/pico3/kinds/tool.d.ts +43 -0
  122. package/dist/harness/pico3/kinds/tool.d.ts.map +1 -0
  123. package/dist/harness/pico3/kinds/tool.js +373 -0
  124. package/dist/harness/pico3/kinds/tool.js.map +1 -0
  125. package/dist/harness/pico3/legacy-tracker.d.ts +11 -0
  126. package/dist/harness/pico3/legacy-tracker.d.ts.map +1 -0
  127. package/dist/harness/pico3/legacy-tracker.js +41 -0
  128. package/dist/harness/pico3/legacy-tracker.js.map +1 -0
  129. package/dist/harness/pico3/membrane.d.ts +23 -0
  130. package/dist/harness/pico3/membrane.d.ts.map +1 -0
  131. package/dist/harness/pico3/membrane.js +141 -0
  132. package/dist/harness/pico3/membrane.js.map +1 -0
  133. package/dist/harness/pico3/memory.d.ts +53 -0
  134. package/dist/harness/pico3/memory.d.ts.map +1 -0
  135. package/dist/harness/pico3/memory.js +264 -0
  136. package/dist/harness/pico3/memory.js.map +1 -0
  137. package/dist/harness/pico3/scheduler.d.ts +49 -0
  138. package/dist/harness/pico3/scheduler.d.ts.map +1 -0
  139. package/dist/harness/pico3/scheduler.js +438 -0
  140. package/dist/harness/pico3/scheduler.js.map +1 -0
  141. package/dist/harness/pico3/session.d.ts +264 -0
  142. package/dist/harness/pico3/session.d.ts.map +1 -0
  143. package/dist/harness/pico3/session.js +1348 -0
  144. package/dist/harness/pico3/session.js.map +1 -0
  145. package/dist/harness/pico3/system.d.ts +126 -0
  146. package/dist/harness/pico3/system.d.ts.map +1 -0
  147. package/dist/harness/pico3/system.js +244 -0
  148. package/dist/harness/pico3/system.js.map +1 -0
  149. package/dist/harness/pico3/types.d.ts +973 -0
  150. package/dist/harness/pico3/types.d.ts.map +1 -0
  151. package/dist/harness/pico3/types.js +106 -0
  152. package/dist/harness/pico3/types.js.map +1 -0
  153. package/dist/harness/pico3/view.d.ts +34 -0
  154. package/dist/harness/pico3/view.d.ts.map +1 -0
  155. package/dist/harness/pico3/view.js +411 -0
  156. package/dist/harness/pico3/view.js.map +1 -0
  157. package/dist/harness/prompt-templates.d.ts +3 -2
  158. package/dist/harness/prompt-templates.d.ts.map +1 -1
  159. package/dist/harness/prompt-templates.js +18 -23
  160. package/dist/harness/prompt-templates.js.map +1 -1
  161. package/dist/harness/result.d.ts +133 -0
  162. package/dist/harness/result.d.ts.map +1 -0
  163. package/dist/harness/result.js +81 -0
  164. package/dist/harness/result.js.map +1 -0
  165. package/dist/harness/runtime/drive/boundary.d.ts +28 -0
  166. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
  167. package/dist/harness/runtime/drive/boundary.js +173 -0
  168. package/dist/harness/runtime/drive/boundary.js.map +1 -0
  169. package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
  170. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
  171. package/dist/harness/runtime/drive/checkpoint.js +133 -0
  172. package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
  173. package/dist/harness/runtime/drive/deferred.d.ts +15 -0
  174. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
  175. package/dist/harness/runtime/drive/deferred.js +179 -0
  176. package/dist/harness/runtime/drive/deferred.js.map +1 -0
  177. package/dist/harness/runtime/drive/generation.d.ts +8 -0
  178. package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
  179. package/dist/harness/runtime/drive/generation.js +205 -0
  180. package/dist/harness/runtime/drive/generation.js.map +1 -0
  181. package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
  182. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
  183. package/dist/harness/runtime/drive/reconcile.js +140 -0
  184. package/dist/harness/runtime/drive/reconcile.js.map +1 -0
  185. package/dist/harness/runtime/drive/recovery.d.ts +8 -0
  186. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
  187. package/dist/harness/runtime/drive/recovery.js +85 -0
  188. package/dist/harness/runtime/drive/recovery.js.map +1 -0
  189. package/dist/harness/runtime/drive/response.d.ts +23 -0
  190. package/dist/harness/runtime/drive/response.d.ts.map +1 -0
  191. package/dist/harness/runtime/drive/response.js +394 -0
  192. package/dist/harness/runtime/drive/response.js.map +1 -0
  193. package/dist/harness/runtime/drive/retry.d.ts +4 -0
  194. package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
  195. package/dist/harness/runtime/drive/retry.js +34 -0
  196. package/dist/harness/runtime/drive/retry.js.map +1 -0
  197. package/dist/harness/runtime/drive/structural.d.ts +32 -0
  198. package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
  199. package/dist/harness/runtime/drive/structural.js +929 -0
  200. package/dist/harness/runtime/drive/structural.js.map +1 -0
  201. package/dist/harness/runtime/drive/terminal.d.ts +7 -0
  202. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
  203. package/dist/harness/runtime/drive/terminal.js +49 -0
  204. package/dist/harness/runtime/drive/terminal.js.map +1 -0
  205. package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
  206. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
  207. package/dist/harness/runtime/drive/tool-placement.js +219 -0
  208. package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
  209. package/dist/harness/runtime/drive/tools.d.ts +6 -0
  210. package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
  211. package/dist/harness/runtime/drive/tools.js +449 -0
  212. package/dist/harness/runtime/drive/tools.js.map +1 -0
  213. package/dist/harness/runtime/drive.d.ts +6 -0
  214. package/dist/harness/runtime/drive.d.ts.map +1 -0
  215. package/dist/harness/runtime/drive.js +93 -0
  216. package/dist/harness/runtime/drive.js.map +1 -0
  217. package/dist/harness/runtime/harness.d.ts +59 -0
  218. package/dist/harness/runtime/harness.d.ts.map +1 -0
  219. package/dist/harness/runtime/harness.js +311 -0
  220. package/dist/harness/runtime/harness.js.map +1 -0
  221. package/dist/harness/runtime/index.d.ts +2 -0
  222. package/dist/harness/runtime/index.d.ts.map +1 -0
  223. package/dist/harness/runtime/index.js +2 -0
  224. package/dist/harness/runtime/index.js.map +1 -0
  225. package/dist/harness/runtime/lane.d.ts +118 -0
  226. package/dist/harness/runtime/lane.d.ts.map +1 -0
  227. package/dist/harness/runtime/lane.js +1575 -0
  228. package/dist/harness/runtime/lane.js.map +1 -0
  229. package/dist/harness/runtime/progress.d.ts +15 -0
  230. package/dist/harness/runtime/progress.d.ts.map +1 -0
  231. package/dist/harness/runtime/progress.js +66 -0
  232. package/dist/harness/runtime/progress.js.map +1 -0
  233. package/dist/harness/runtime/reducer.d.ts +5 -0
  234. package/dist/harness/runtime/reducer.d.ts.map +1 -0
  235. package/dist/harness/runtime/reducer.js +240 -0
  236. package/dist/harness/runtime/reducer.js.map +1 -0
  237. package/dist/harness/runtime/restore.d.ts +24 -0
  238. package/dist/harness/runtime/restore.d.ts.map +1 -0
  239. package/dist/harness/runtime/restore.js +117 -0
  240. package/dist/harness/runtime/restore.js.map +1 -0
  241. package/dist/harness/runtime/transcript.d.ts +21 -0
  242. package/dist/harness/runtime/transcript.d.ts.map +1 -0
  243. package/dist/harness/runtime/transcript.js +72 -0
  244. package/dist/harness/runtime/transcript.js.map +1 -0
  245. package/dist/harness/runtime/types.d.ts +105 -0
  246. package/dist/harness/runtime/types.d.ts.map +1 -0
  247. package/dist/harness/runtime/types.js +61 -0
  248. package/dist/harness/runtime/types.js.map +1 -0
  249. package/dist/harness/session/commit.d.ts +53 -0
  250. package/dist/harness/session/commit.d.ts.map +1 -0
  251. package/dist/harness/session/commit.js +57 -0
  252. package/dist/harness/session/commit.js.map +1 -0
  253. package/dist/harness/session/context.d.ts +10 -0
  254. package/dist/harness/session/context.d.ts.map +1 -0
  255. package/dist/harness/session/context.js +49 -0
  256. package/dist/harness/session/context.js.map +1 -0
  257. package/dist/harness/session/fork-policy.d.ts +21 -0
  258. package/dist/harness/session/fork-policy.d.ts.map +1 -0
  259. package/dist/harness/session/fork-policy.js +55 -0
  260. package/dist/harness/session/fork-policy.js.map +1 -0
  261. package/dist/harness/session/fork.d.ts +16 -0
  262. package/dist/harness/session/fork.d.ts.map +1 -0
  263. package/dist/harness/session/fork.js +79 -0
  264. package/dist/harness/session/fork.js.map +1 -0
  265. package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
  266. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
  267. package/dist/harness/session/in-memory-storage-state.js +276 -0
  268. package/dist/harness/session/in-memory-storage-state.js.map +1 -0
  269. package/dist/harness/session/index.d.ts +11 -0
  270. package/dist/harness/session/index.d.ts.map +1 -0
  271. package/dist/harness/session/index.js +9 -0
  272. package/dist/harness/session/index.js.map +1 -0
  273. package/dist/harness/session/jsonl/codec.d.ts +21 -0
  274. package/dist/harness/session/jsonl/codec.d.ts.map +1 -0
  275. package/dist/harness/session/jsonl/codec.js +45 -0
  276. package/dist/harness/session/jsonl/codec.js.map +1 -0
  277. package/dist/harness/session/jsonl/fork.d.ts +38 -0
  278. package/dist/harness/session/jsonl/fork.d.ts.map +1 -0
  279. package/dist/harness/session/jsonl/fork.js +264 -0
  280. package/dist/harness/session/jsonl/fork.js.map +1 -0
  281. package/dist/harness/session/jsonl/index.d.ts +4 -0
  282. package/dist/harness/session/jsonl/index.d.ts.map +1 -0
  283. package/dist/harness/session/jsonl/index.js +4 -0
  284. package/dist/harness/session/jsonl/index.js.map +1 -0
  285. package/dist/harness/session/jsonl/io.d.ts +14 -0
  286. package/dist/harness/session/jsonl/io.d.ts.map +1 -0
  287. package/dist/harness/session/jsonl/io.js +86 -0
  288. package/dist/harness/session/jsonl/io.js.map +1 -0
  289. package/dist/harness/session/jsonl/legacy-v3.d.ts +44 -0
  290. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
  291. package/dist/harness/session/jsonl/legacy-v3.js +462 -0
  292. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
  293. package/dist/harness/session/jsonl/repo.d.ts +35 -0
  294. package/dist/harness/session/jsonl/repo.d.ts.map +1 -0
  295. package/dist/harness/session/jsonl/repo.js +301 -0
  296. package/dist/harness/session/jsonl/repo.js.map +1 -0
  297. package/dist/harness/session/jsonl/storage.d.ts +41 -0
  298. package/dist/harness/session/jsonl/storage.d.ts.map +1 -0
  299. package/dist/harness/session/jsonl/storage.js +200 -0
  300. package/dist/harness/session/jsonl/storage.js.map +1 -0
  301. package/dist/harness/session/jsonl/types.d.ts +39 -0
  302. package/dist/harness/session/jsonl/types.d.ts.map +1 -0
  303. package/dist/harness/session/jsonl/types.js +3 -0
  304. package/dist/harness/session/jsonl/types.js.map +1 -0
  305. package/dist/harness/session/memory.d.ts +48 -0
  306. package/dist/harness/session/memory.d.ts.map +1 -0
  307. package/dist/harness/session/memory.js +369 -0
  308. package/dist/harness/session/memory.js.map +1 -0
  309. package/dist/harness/session/mutation-line.d.ts +8 -0
  310. package/dist/harness/session/mutation-line.d.ts.map +1 -0
  311. package/dist/harness/session/mutation-line.js +21 -0
  312. package/dist/harness/session/mutation-line.js.map +1 -0
  313. package/dist/harness/session/session.d.ts +79 -46
  314. package/dist/harness/session/session.d.ts.map +1 -1
  315. package/dist/harness/session/session.js +320 -220
  316. package/dist/harness/session/session.js.map +1 -1
  317. package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
  318. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
  319. package/dist/harness/session/testing/benchmark/datasets.js +24 -0
  320. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
  321. package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
  322. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
  323. package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
  324. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
  325. package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
  326. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
  327. package/dist/harness/session/testing/benchmark/storage.js +114 -0
  328. package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
  329. package/dist/harness/session/testing/conformance/session-repo.d.ts +23 -0
  330. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
  331. package/dist/harness/session/testing/conformance/session-repo.js +809 -0
  332. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
  333. package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
  334. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
  335. package/dist/harness/session/testing/conformance/storage.js +600 -0
  336. package/dist/harness/session/testing/conformance/storage.js.map +1 -0
  337. package/dist/harness/session/testing/gating-storage.d.ts +26 -0
  338. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
  339. package/dist/harness/session/testing/gating-storage.js +100 -0
  340. package/dist/harness/session/testing/gating-storage.js.map +1 -0
  341. package/dist/harness/session/testing/index.d.ts +10 -0
  342. package/dist/harness/session/testing/index.d.ts.map +1 -0
  343. package/dist/harness/session/testing/index.js +9 -0
  344. package/dist/harness/session/testing/index.js.map +1 -0
  345. package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
  346. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
  347. package/dist/harness/session/testing/instrumented-storage.js +16 -0
  348. package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
  349. package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
  350. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
  351. package/dist/harness/session/testing/storage-decorator.js +41 -0
  352. package/dist/harness/session/testing/storage-decorator.js.map +1 -0
  353. package/dist/harness/session/testing/types.d.ts +12 -0
  354. package/dist/harness/session/testing/types.d.ts.map +1 -0
  355. package/dist/harness/session/testing/types.js +2 -0
  356. package/dist/harness/session/testing/types.js.map +1 -0
  357. package/dist/harness/session/types.d.ts +512 -0
  358. package/dist/harness/session/types.d.ts.map +1 -0
  359. package/dist/harness/session/types.js +9 -0
  360. package/dist/harness/session/types.js.map +1 -0
  361. package/dist/harness/session/values.d.ts +95 -0
  362. package/dist/harness/session/values.d.ts.map +1 -0
  363. package/dist/harness/session/values.js +81 -0
  364. package/dist/harness/session/values.js.map +1 -0
  365. package/dist/harness/skills.d.ts +6 -4
  366. package/dist/harness/skills.d.ts.map +1 -1
  367. package/dist/harness/skills.js +59 -44
  368. package/dist/harness/skills.js.map +1 -1
  369. package/dist/harness/telemetry.d.ts +1242 -0
  370. package/dist/harness/telemetry.d.ts.map +1 -0
  371. package/dist/harness/telemetry.js +527 -0
  372. package/dist/harness/telemetry.js.map +1 -0
  373. package/dist/harness/tools/bash.d.ts +4 -4
  374. package/dist/harness/tools/bash.d.ts.map +1 -1
  375. package/dist/harness/tools/bash.js +66 -93
  376. package/dist/harness/tools/bash.js.map +1 -1
  377. package/dist/harness/tools/edit.d.ts.map +1 -1
  378. package/dist/harness/tools/edit.js +24 -11
  379. package/dist/harness/tools/edit.js.map +1 -1
  380. package/dist/harness/tools/file-mutation-queue.d.ts +2 -1
  381. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  382. package/dist/harness/tools/file-mutation-queue.js +5 -5
  383. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  384. package/dist/harness/tools/image.js +1 -1
  385. package/dist/harness/tools/image.js.map +1 -1
  386. package/dist/harness/tools/path-utils.d.ts +3 -2
  387. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  388. package/dist/harness/tools/path-utils.js +5 -5
  389. package/dist/harness/tools/path-utils.js.map +1 -1
  390. package/dist/harness/tools/read.d.ts +2 -1
  391. package/dist/harness/tools/read.d.ts.map +1 -1
  392. package/dist/harness/tools/read.js +4 -6
  393. package/dist/harness/tools/read.js.map +1 -1
  394. package/dist/harness/tools/write.d.ts.map +1 -1
  395. package/dist/harness/tools/write.js +7 -7
  396. package/dist/harness/tools/write.js.map +1 -1
  397. package/dist/harness/types.d.ts +126 -502
  398. package/dist/harness/types.d.ts.map +1 -1
  399. package/dist/harness/types.js +10 -16
  400. package/dist/harness/types.js.map +1 -1
  401. package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
  402. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
  403. package/dist/harness/utils/adaptive-publisher.js +79 -0
  404. package/dist/harness/utils/adaptive-publisher.js.map +1 -0
  405. package/dist/harness/utils/output-capture.d.ts +31 -0
  406. package/dist/harness/utils/output-capture.d.ts.map +1 -0
  407. package/dist/harness/utils/output-capture.js +217 -0
  408. package/dist/harness/utils/output-capture.js.map +1 -0
  409. package/dist/harness/utils/shell-output.d.ts +12 -5
  410. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  411. package/dist/harness/utils/shell-output.js +64 -174
  412. package/dist/harness/utils/shell-output.js.map +1 -1
  413. package/dist/harness/utils/truncate.d.ts +1 -0
  414. package/dist/harness/utils/truncate.d.ts.map +1 -1
  415. package/dist/harness/utils/truncate.js +1 -1
  416. package/dist/harness/utils/truncate.js.map +1 -1
  417. package/dist/harness/utils/usage.d.ts +4 -0
  418. package/dist/harness/utils/usage.d.ts.map +1 -0
  419. package/dist/harness/utils/usage.js +33 -0
  420. package/dist/harness/utils/usage.js.map +1 -0
  421. package/dist/index.d.ts +13 -9
  422. package/dist/index.d.ts.map +1 -1
  423. package/dist/index.js +9 -13
  424. package/dist/index.js.map +1 -1
  425. package/dist/proxy.d.ts +6 -3
  426. package/dist/proxy.d.ts.map +1 -1
  427. package/dist/proxy.js +42 -10
  428. package/dist/proxy.js.map +1 -1
  429. package/dist/search/index.d.ts +29 -0
  430. package/dist/search/index.d.ts.map +1 -0
  431. package/dist/search/index.js +2 -0
  432. package/dist/search/index.js.map +1 -0
  433. package/dist/types.d.ts +113 -31
  434. package/dist/types.d.ts.map +1 -1
  435. package/dist/types.js.map +1 -1
  436. package/package.json +50 -4
  437. package/dist/harness/session/jsonl-repo.d.ts +0 -26
  438. package/dist/harness/session/jsonl-repo.d.ts.map +0 -1
  439. package/dist/harness/session/jsonl-repo.js +0 -100
  440. package/dist/harness/session/jsonl-repo.js.map +0 -1
  441. package/dist/harness/session/jsonl-storage.d.ts +0 -42
  442. package/dist/harness/session/jsonl-storage.d.ts.map +0 -1
  443. package/dist/harness/session/jsonl-storage.js +0 -286
  444. package/dist/harness/session/jsonl-storage.js.map +0 -1
  445. package/dist/harness/session/memory-repo.d.ts +0 -18
  446. package/dist/harness/session/memory-repo.d.ts.map +0 -1
  447. package/dist/harness/session/memory-repo.js +0 -44
  448. package/dist/harness/session/memory-repo.js.map +0 -1
  449. package/dist/harness/session/memory-storage.d.ts +0 -33
  450. package/dist/harness/session/memory-storage.d.ts.map +0 -1
  451. package/dist/harness/session/memory-storage.js +0 -163
  452. package/dist/harness/session/memory-storage.js.map +0 -1
  453. package/dist/harness/session/repo-utils.d.ts +0 -11
  454. package/dist/harness/session/repo-utils.d.ts.map +0 -1
  455. package/dist/harness/session/repo-utils.js +0 -39
  456. package/dist/harness/session/repo-utils.js.map +0 -1
@@ -0,0 +1,411 @@
1
+ import { applyImmutable } from "@draht/chord/delta";
2
+ import { track } from "./legacy-tracker.js";
3
+ export const WATCH_CAPACITY = 256;
4
+ export function applyEnvelope(view, envelope) {
5
+ return applyImmutable(view, envelope.ops);
6
+ }
7
+ export class ViewManager {
8
+ records = new Map();
9
+ deliveries = [];
10
+ session;
11
+ onReport;
12
+ constructor(session, onReport) {
13
+ this.session = session;
14
+ this.onReport = onReport;
15
+ }
16
+ watch(conversation, entries) {
17
+ let record = this.records.get(conversation.id);
18
+ if (record === undefined) {
19
+ const tracker = track(this.build(conversation, entries));
20
+ tracker.flush();
21
+ record = { conversationId: conversation.id, tracker, watchers: new Set(), revision: 0 };
22
+ this.records.set(conversation.id, record);
23
+ }
24
+ const watcher = new WatchImpl(structuredClone(record.tracker.target), record.revision, this.onReport, () => {
25
+ record.watchers.delete(watcher);
26
+ if (record.watchers.size === 0 && this.records.get(conversation.id) === record)
27
+ this.records.delete(conversation.id);
28
+ });
29
+ record.watchers.add(watcher);
30
+ return watcher;
31
+ }
32
+ /** Runs on the Session line after persistence and in-memory indexes update. */
33
+ update(result) {
34
+ for (const record of [...this.records.values()]) {
35
+ const conversation = this.session.conversationRecords.get(record.conversationId);
36
+ if (conversation === undefined)
37
+ continue;
38
+ try {
39
+ const changes = result.changes;
40
+ const appended = changes.entries.filter((entry) => entry.conversationId === record.conversationId);
41
+ const documentChanges = changes.docs.filter((change) => change.ref.doc === "session" || change.ref.conversationId === record.conversationId);
42
+ const taskChanged = changes.tasks.some((task) => task.conversationId === record.conversationId);
43
+ const events = changes.events
44
+ .filter((scoped) => scoped.conversationId === record.conversationId)
45
+ .map((scoped) => scoped.event);
46
+ if (appended.length === 0 && documentChanges.length === 0 && !taskChanged && events.length === 0)
47
+ continue;
48
+ const state = record.tracker.state;
49
+ applyEntries(state.entries, appended);
50
+ const rewindableChanged = documentChanges.some((change) => change.ref.doc === "rewindable" && change.ref.conversationId === record.conversationId);
51
+ const stickyChanged = documentChanges.some((change) => change.ref.doc === "sticky" && change.ref.conversationId === record.conversationId);
52
+ const configChanged = events.some((event) => event.type === "config.changed");
53
+ const pluginChanged = documentChanges.some((change) => touchesKey(change.ops, "plugins"));
54
+ const rewindable = rewindableChanged || configChanged || pluginChanged
55
+ ? this.document({ doc: "rewindable", conversationId: record.conversationId })
56
+ : undefined;
57
+ const sticky = stickyChanged || taskChanged || configChanged || pluginChanged
58
+ ? this.document({ doc: "sticky", conversationId: record.conversationId })
59
+ : undefined;
60
+ if (configChanged)
61
+ syncRecord(state.config, this.config(rewindable, sticky));
62
+ if (stickyChanged)
63
+ syncArray(state.inbox, structuredClone(sticky.inbox));
64
+ if (stickyChanged || taskChanged) {
65
+ syncOptional(state, "turn", this.turn(record.conversationId, sticky).turn);
66
+ syncOptional(state, "compaction", this.compaction(record.conversationId).compaction);
67
+ syncRecord(state.tasks, this.tasks(record.conversationId, sticky));
68
+ }
69
+ if (pluginChanged) {
70
+ const session = this.document({ doc: "session" });
71
+ syncRecord(state.plugins, this.plugins(rewindable, sticky, session));
72
+ }
73
+ const ops = record.tracker.flush();
74
+ if (ops.length === 0 && events.length === 0)
75
+ continue;
76
+ const envelope = Object.freeze({
77
+ revision: ++record.revision,
78
+ ops: Object.freeze(ops),
79
+ events: Object.freeze(events),
80
+ });
81
+ this.deliveries.push({ envelope, watchers: [...record.watchers] });
82
+ }
83
+ catch (error) {
84
+ this.records.delete(record.conversationId);
85
+ for (const watcher of [...record.watchers])
86
+ watcher.fail(error);
87
+ }
88
+ }
89
+ }
90
+ /** Runs after the Session line; listeners are synchronous and ordered. */
91
+ deliver() {
92
+ for (const delivery of this.deliveries.splice(0)) {
93
+ for (const watcher of delivery.watchers)
94
+ watcher.accept(delivery.envelope);
95
+ }
96
+ }
97
+ close() {
98
+ const records = [...this.records.values()];
99
+ this.records.clear();
100
+ this.deliveries.length = 0;
101
+ for (const record of records)
102
+ for (const watcher of [...record.watchers])
103
+ watcher.stop();
104
+ }
105
+ build(conversation, entries) {
106
+ const rewindable = this.document({ doc: "rewindable", conversationId: conversation.id });
107
+ const sticky = this.document({ doc: "sticky", conversationId: conversation.id });
108
+ const session = this.document({ doc: "session" });
109
+ const { sections: _sections, ...publicConversation } = conversation;
110
+ return {
111
+ conversation: structuredClone(publicConversation),
112
+ entries: structuredClone(entries),
113
+ config: this.config(rewindable, sticky),
114
+ inbox: structuredClone(sticky.inbox),
115
+ ...this.turn(conversation.id, sticky),
116
+ ...this.compaction(conversation.id),
117
+ tasks: this.tasks(conversation.id, sticky),
118
+ plugins: this.plugins(rewindable, sticky, session),
119
+ };
120
+ }
121
+ document(ref) {
122
+ const value = this.session.loadedDocument(ref);
123
+ if (value === undefined)
124
+ throw new Error(`view document ${ref.doc} is not loaded`);
125
+ return value;
126
+ }
127
+ config(rewindable, sticky) {
128
+ const out = {};
129
+ for (const [key, doc] of this.session.defaults.route) {
130
+ const source = doc === "rewindable" ? rewindable : sticky;
131
+ const value = key in source ? source[key] : this.session.defaults[doc][key];
132
+ if (value !== undefined)
133
+ out[key] = structuredClone(value);
134
+ }
135
+ return out;
136
+ }
137
+ turn(conversationId, sticky) {
138
+ const live = [...this.session.liveTasks.values()].filter((task) => task.conversationId === conversationId);
139
+ const turnTasks = live.filter((task) => this.session.kinds.get(task.kind)?.turn === true);
140
+ if (turnTasks.length === 0)
141
+ return {};
142
+ const generation = turnTasks.find((task) => task.kind === "pi.generation");
143
+ const postTools = turnTasks.find((task) => task.kind === "pi.post_tools");
144
+ const inputTask = generation ?? postTools;
145
+ const inputs = inputTask === undefined ? [] : inputIds(inputTask);
146
+ const turn = {
147
+ inputs,
148
+ ...(generation === undefined
149
+ ? {}
150
+ : { generation: generationStatus(generation, sticky.turn.message !== undefined) }),
151
+ ...(sticky.turn.message === undefined ? {} : { message: structuredClone(sticky.turn.message) }),
152
+ tools: sticky.turn.tools.map(stripPrivateToolState),
153
+ };
154
+ return { turn };
155
+ }
156
+ compaction(conversationId) {
157
+ const task = [...this.session.liveTasks.values()].find((candidate) => candidate.conversationId === conversationId && candidate.kind === "pi.collapse");
158
+ if (task === undefined)
159
+ return {};
160
+ const input = task.input;
161
+ const checkpoint = task.checkpoint;
162
+ return {
163
+ compaction: {
164
+ taskId: task.id,
165
+ reason: input.reason,
166
+ stage: checkpoint?.phase === "retrying" ? "retrying" : "summarizing",
167
+ attempt: checkpoint?.attempt ?? 1,
168
+ ...(checkpoint?.phase === "retrying" && checkpoint.untilMs !== undefined
169
+ ? { retryAt: checkpoint.untilMs }
170
+ : {}),
171
+ },
172
+ };
173
+ }
174
+ tasks(conversationId, sticky) {
175
+ const out = {};
176
+ for (const task of this.session.liveTasks.values()) {
177
+ const kind = this.session.kinds.get(task.kind);
178
+ if (task.conversationId !== conversationId ||
179
+ kind === undefined ||
180
+ kind.turn === true ||
181
+ task.kind === "pi.collapse")
182
+ continue;
183
+ const slot = sticky.tasks[task.id];
184
+ out[task.id] = {
185
+ kind: task.kind,
186
+ ...(task.background ? { background: true } : {}),
187
+ ...(task.abort ? { marked: true } : {}),
188
+ status: describe(kind, task, slot),
189
+ };
190
+ }
191
+ return out;
192
+ }
193
+ plugins(rewindable, sticky, session) {
194
+ const out = {};
195
+ const sessionPlugins = (session.plugins ?? {});
196
+ for (const [id, registration] of this.session.namespaces) {
197
+ if (registration.project === undefined)
198
+ continue;
199
+ const merged = {
200
+ ...registration.defaults.rewindable,
201
+ ...registration.defaults.sticky,
202
+ ...registration.defaults.session,
203
+ ...(rewindable.plugins[id] ?? {}),
204
+ ...(sticky.plugins[id] ?? {}),
205
+ ...(sessionPlugins[id] ?? {}),
206
+ };
207
+ out[id] = strictJson(registration.project(structuredClone(merged)), `namespace ${id} view`);
208
+ }
209
+ return out;
210
+ }
211
+ }
212
+ class WatchImpl {
213
+ view;
214
+ initialRevision;
215
+ onReport;
216
+ onStop;
217
+ listener;
218
+ buffer = [];
219
+ stopped = false;
220
+ constructor(view, revision, onReport, onStop) {
221
+ this.view = view;
222
+ this.initialRevision = revision;
223
+ this.onReport = onReport;
224
+ this.onStop = onStop;
225
+ }
226
+ get revision() {
227
+ return this.initialRevision;
228
+ }
229
+ get closed() {
230
+ return this.stopped;
231
+ }
232
+ start(listener) {
233
+ if (this.listener !== undefined || this.stopped)
234
+ return;
235
+ this.listener = listener;
236
+ for (const envelope of this.buffer.splice(0)) {
237
+ if (this.stopped)
238
+ break;
239
+ this.deliver(envelope);
240
+ }
241
+ }
242
+ stop() {
243
+ if (this.stopped)
244
+ return;
245
+ this.stopped = true;
246
+ this.buffer.length = 0;
247
+ this.onStop();
248
+ }
249
+ accept(envelope) {
250
+ if (this.stopped)
251
+ return;
252
+ if (this.listener === undefined) {
253
+ if (this.buffer.length >= WATCH_CAPACITY) {
254
+ this.stop();
255
+ this.report(new Error(`watch capacity ${WATCH_CAPACITY} exceeded before start()`));
256
+ return;
257
+ }
258
+ this.buffer.push(envelope);
259
+ return;
260
+ }
261
+ this.deliver(envelope);
262
+ }
263
+ deliver(envelope) {
264
+ try {
265
+ this.listener(envelope);
266
+ }
267
+ catch (error) {
268
+ this.fail(error);
269
+ }
270
+ }
271
+ fail(error) {
272
+ this.stop();
273
+ this.report(error);
274
+ }
275
+ report(error) {
276
+ try {
277
+ this.onReport(error);
278
+ }
279
+ catch { }
280
+ }
281
+ }
282
+ function applyEntries(entries, appended) {
283
+ for (const entry of appended) {
284
+ if (entry.head !== undefined) {
285
+ const retained = entries.findIndex((candidate) => candidate.id >= entry.head);
286
+ const remove = retained < 0 ? entries.length : retained;
287
+ if (remove > 0)
288
+ entries.splice(0, remove);
289
+ }
290
+ entries.push(structuredClone(entry));
291
+ }
292
+ }
293
+ function inputIds(task) {
294
+ const inputs = task.input.inputs;
295
+ return Array.isArray(inputs) ? inputs.filter((value) => typeof value === "number") : [];
296
+ }
297
+ function generationStatus(task, streaming) {
298
+ if (task.status === "pending" && task.after.length > 0)
299
+ return { stage: "waiting", on: "compaction" };
300
+ const checkpoint = task.checkpoint;
301
+ if (checkpoint?.phase === "requesting")
302
+ return { stage: streaming ? "streaming" : "requesting", attempt: checkpoint.attempt ?? 1 };
303
+ if (checkpoint?.phase === "retrying")
304
+ return {
305
+ stage: "retrying",
306
+ attempt: checkpoint.attempt ?? 1,
307
+ retryAt: checkpoint.untilMs ?? 0,
308
+ lastError: checkpoint.lastError ?? "",
309
+ };
310
+ if (checkpoint?.phase === "deferred")
311
+ return { stage: "deferred", attempt: checkpoint.attempt ?? 1, pollAt: checkpoint.pollAt ?? 0 };
312
+ return { stage: "preparing" };
313
+ }
314
+ function stripPrivateToolState(slot) {
315
+ const { memos: _memos, ...view } = structuredClone(slot);
316
+ return view;
317
+ }
318
+ function describe(kind, task, slot) {
319
+ if (typeof kind.describe !== "function")
320
+ return { phase: task.checkpoint?.phase ?? (task.status === "pending" ? "pending" : "running") };
321
+ const publicSlot = slot === undefined ? undefined : structuredClone(slot);
322
+ if (publicSlot !== undefined)
323
+ delete publicSlot.memos;
324
+ const value = kind.describe({
325
+ ...task,
326
+ ...(publicSlot === undefined ? {} : { slot: publicSlot }),
327
+ });
328
+ return strictJson(value, `task kind ${task.kind} describe`);
329
+ }
330
+ function strictJson(value, what) {
331
+ const encoded = JSON.stringify(value);
332
+ if (encoded === undefined)
333
+ throw new Error(`${what} returned a non-JSON value`);
334
+ return JSON.parse(encoded);
335
+ }
336
+ function touchesKey(ops, key) {
337
+ return ops.some((op) => op[0] === "r" || op[1][0] === key);
338
+ }
339
+ function syncOptional(target, key, next) {
340
+ const record = target;
341
+ if (next === undefined) {
342
+ delete record[key];
343
+ return;
344
+ }
345
+ const current = record[key];
346
+ if (same(current, next))
347
+ return;
348
+ if (isRecord(current) && isRecord(next))
349
+ syncRecord(current, next);
350
+ else
351
+ record[key] = structuredClone(next);
352
+ }
353
+ function syncRecord(target, next) {
354
+ for (const key of Object.keys(target))
355
+ if (!(key in next))
356
+ delete target[key];
357
+ for (const [key, value] of Object.entries(next)) {
358
+ const current = target[key];
359
+ if (same(current, value))
360
+ continue;
361
+ if (Array.isArray(current) && Array.isArray(value)) {
362
+ syncArray(current, value);
363
+ continue;
364
+ }
365
+ if (isRecord(current) && isRecord(value)) {
366
+ syncRecord(current, value);
367
+ continue;
368
+ }
369
+ target[key] = structuredClone(value);
370
+ }
371
+ }
372
+ function syncArray(target, next) {
373
+ let prefix = 0;
374
+ while (prefix < target.length && prefix < next.length) {
375
+ if (same(target[prefix], next[prefix])) {
376
+ prefix++;
377
+ continue;
378
+ }
379
+ const current = target[prefix];
380
+ const replacement = next[prefix];
381
+ if (!isRecord(current) || !isRecord(replacement) || !sameArrayItem(current, replacement))
382
+ break;
383
+ syncRecord(current, replacement);
384
+ prefix++;
385
+ }
386
+ if (prefix === target.length && prefix === next.length)
387
+ return;
388
+ if (prefix === target.length) {
389
+ target.push(...structuredClone(next.slice(prefix)));
390
+ return;
391
+ }
392
+ target.splice(prefix, target.length - prefix, ...structuredClone(next.slice(prefix)));
393
+ }
394
+ function sameArrayItem(current, next) {
395
+ if (typeof current.id === "number" || typeof next.id === "number")
396
+ return current.id === next.id;
397
+ if (typeof current.callId === "string" || typeof next.callId === "string")
398
+ return current.callId === next.callId;
399
+ if (typeof current.type === "string" || typeof next.type === "string")
400
+ return current.type === next.type;
401
+ return false;
402
+ }
403
+ function isRecord(value) {
404
+ return typeof value === "object" && value !== null && !Array.isArray(value);
405
+ }
406
+ function same(a, b) {
407
+ if (Object.is(a, b))
408
+ return true;
409
+ return JSON.stringify(a) === JSON.stringify(b);
410
+ }
411
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/harness/pico3/view.ts"],"names":[],"mappings":"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","sourcesContent":["import { applyImmutable, type Op } from \"@draht/chord/delta\";\nimport { type Tracker, track } from \"./legacy-tracker.ts\";\nimport type { CommitResult, Session } from \"./session.ts\";\nimport type {\n\tAnyKind,\n\tConversation,\n\tConversationView,\n\tDocRef,\n\tEnvelope,\n\tGenerationStatus,\n\tId,\n\tJsonObject,\n\tJsonValue,\n\tRewindableState,\n\tStickyState,\n\tTask,\n\tToolSlot,\n\tTurnView,\n\tViewEvent,\n} from \"./types.ts\";\n\nexport const WATCH_CAPACITY = 256;\n\nexport interface Watch {\n\treadonly view: ConversationView;\n\treadonly revision: number;\n\treadonly closed: boolean;\n\tstart(listener: (envelope: Envelope) => void): void;\n\tstop(): void;\n}\n\nexport function applyEnvelope(view: ConversationView, envelope: Envelope): ConversationView {\n\treturn applyImmutable(view, envelope.ops) as ConversationView;\n}\n\ntype Listener = (envelope: Envelope) => void;\ntype ViewRecord = {\n\treadonly conversationId: Id;\n\treadonly tracker: Tracker<ConversationView>;\n\treadonly watchers: Set<WatchImpl>;\n\trevision: number;\n};\ntype Delivery = { envelope: Envelope; watchers: WatchImpl[] };\n\nexport class ViewManager {\n\tprivate readonly records = new Map<Id, ViewRecord>();\n\tprivate readonly deliveries: Delivery[] = [];\n\tprivate readonly session: Session;\n\tprivate readonly onReport: (error: unknown) => void;\n\n\tconstructor(session: Session, onReport: (error: unknown) => void) {\n\t\tthis.session = session;\n\t\tthis.onReport = onReport;\n\t}\n\n\twatch(conversation: Conversation, entries: EntryList): Watch {\n\t\tlet record = this.records.get(conversation.id);\n\t\tif (record === undefined) {\n\t\t\tconst tracker = track(this.build(conversation, entries));\n\t\t\ttracker.flush();\n\t\t\trecord = { conversationId: conversation.id, tracker, watchers: new Set(), revision: 0 };\n\t\t\tthis.records.set(conversation.id, record);\n\t\t}\n\t\tconst watcher = new WatchImpl(structuredClone(record.tracker.target), record.revision, this.onReport, () => {\n\t\t\trecord!.watchers.delete(watcher);\n\t\t\tif (record!.watchers.size === 0 && this.records.get(conversation.id) === record)\n\t\t\t\tthis.records.delete(conversation.id);\n\t\t});\n\t\trecord.watchers.add(watcher);\n\t\treturn watcher;\n\t}\n\n\t/** Runs on the Session line after persistence and in-memory indexes update. */\n\tupdate(result: CommitResult<unknown>): void {\n\t\tfor (const record of [...this.records.values()]) {\n\t\t\tconst conversation = this.session.conversationRecords.get(record.conversationId);\n\t\t\tif (conversation === undefined) continue;\n\t\t\ttry {\n\t\t\t\tconst changes = result.changes;\n\t\t\t\tconst appended = changes.entries.filter((entry) => entry.conversationId === record.conversationId);\n\t\t\t\tconst documentChanges = changes.docs.filter(\n\t\t\t\t\t(change) => change.ref.doc === \"session\" || change.ref.conversationId === record.conversationId,\n\t\t\t\t);\n\t\t\t\tconst taskChanged = changes.tasks.some((task) => task.conversationId === record.conversationId);\n\t\t\t\tconst events = changes.events\n\t\t\t\t\t.filter((scoped) => scoped.conversationId === record.conversationId)\n\t\t\t\t\t.map((scoped) => scoped.event);\n\t\t\t\tif (appended.length === 0 && documentChanges.length === 0 && !taskChanged && events.length === 0) continue;\n\n\t\t\t\tconst state = record.tracker.state;\n\t\t\t\tapplyEntries(state.entries, appended);\n\t\t\t\tconst rewindableChanged = documentChanges.some(\n\t\t\t\t\t(change) => change.ref.doc === \"rewindable\" && change.ref.conversationId === record.conversationId,\n\t\t\t\t);\n\t\t\t\tconst stickyChanged = documentChanges.some(\n\t\t\t\t\t(change) => change.ref.doc === \"sticky\" && change.ref.conversationId === record.conversationId,\n\t\t\t\t);\n\t\t\t\tconst configChanged = events.some((event) => event.type === \"config.changed\");\n\t\t\t\tconst pluginChanged = documentChanges.some((change) => touchesKey(change.ops, \"plugins\"));\n\t\t\t\tconst rewindable =\n\t\t\t\t\trewindableChanged || configChanged || pluginChanged\n\t\t\t\t\t\t? this.document<RewindableState>({ doc: \"rewindable\", conversationId: record.conversationId })\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst sticky =\n\t\t\t\t\tstickyChanged || taskChanged || configChanged || pluginChanged\n\t\t\t\t\t\t? this.document<StickyState>({ doc: \"sticky\", conversationId: record.conversationId })\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tif (configChanged) syncRecord(state.config, this.config(rewindable!, sticky!));\n\t\t\t\tif (stickyChanged) syncArray(state.inbox, structuredClone(sticky!.inbox));\n\t\t\t\tif (stickyChanged || taskChanged) {\n\t\t\t\t\tsyncOptional(state, \"turn\", this.turn(record.conversationId, sticky!).turn);\n\t\t\t\t\tsyncOptional(state, \"compaction\", this.compaction(record.conversationId).compaction);\n\t\t\t\t\tsyncRecord(state.tasks, this.tasks(record.conversationId, sticky!));\n\t\t\t\t}\n\t\t\t\tif (pluginChanged) {\n\t\t\t\t\tconst session = this.document<JsonObject>({ doc: \"session\" });\n\t\t\t\t\tsyncRecord(state.plugins, this.plugins(rewindable!, sticky!, session));\n\t\t\t\t}\n\n\t\t\t\tconst ops = record.tracker.flush();\n\t\t\t\tif (ops.length === 0 && events.length === 0) continue;\n\t\t\t\tconst envelope = Object.freeze({\n\t\t\t\t\trevision: ++record.revision,\n\t\t\t\t\tops: Object.freeze(ops) as unknown as Op[],\n\t\t\t\t\tevents: Object.freeze(events) as unknown as ViewEvent[],\n\t\t\t\t}) satisfies Envelope;\n\t\t\t\tthis.deliveries.push({ envelope, watchers: [...record.watchers] });\n\t\t\t} catch (error) {\n\t\t\t\tthis.records.delete(record.conversationId);\n\t\t\t\tfor (const watcher of [...record.watchers]) watcher.fail(error);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Runs after the Session line; listeners are synchronous and ordered. */\n\tdeliver(): void {\n\t\tfor (const delivery of this.deliveries.splice(0)) {\n\t\t\tfor (const watcher of delivery.watchers) watcher.accept(delivery.envelope);\n\t\t}\n\t}\n\n\tclose(): void {\n\t\tconst records = [...this.records.values()];\n\t\tthis.records.clear();\n\t\tthis.deliveries.length = 0;\n\t\tfor (const record of records) for (const watcher of [...record.watchers]) watcher.stop();\n\t}\n\n\tprivate build(conversation: Conversation, entries: EntryList): ConversationView {\n\t\tconst rewindable = this.document<RewindableState>({ doc: \"rewindable\", conversationId: conversation.id });\n\t\tconst sticky = this.document<StickyState>({ doc: \"sticky\", conversationId: conversation.id });\n\t\tconst session = this.document<JsonObject>({ doc: \"session\" });\n\t\tconst { sections: _sections, ...publicConversation } = conversation;\n\t\treturn {\n\t\t\tconversation: structuredClone(publicConversation),\n\t\t\tentries: structuredClone(entries),\n\t\t\tconfig: this.config(rewindable, sticky),\n\t\t\tinbox: structuredClone(sticky.inbox),\n\t\t\t...this.turn(conversation.id, sticky),\n\t\t\t...this.compaction(conversation.id),\n\t\t\ttasks: this.tasks(conversation.id, sticky),\n\t\t\tplugins: this.plugins(rewindable, sticky, session),\n\t\t};\n\t}\n\n\tprivate document<T>(ref: DocRef): T {\n\t\tconst value = this.session.loadedDocument(ref);\n\t\tif (value === undefined) throw new Error(`view document ${ref.doc} is not loaded`);\n\t\treturn value as T;\n\t}\n\n\tprivate config(rewindable: RewindableState, sticky: StickyState): ConversationView[\"config\"] {\n\t\tconst out: ConversationView[\"config\"] = {};\n\t\tfor (const [key, doc] of this.session.defaults.route) {\n\t\t\tconst source = doc === \"rewindable\" ? rewindable : sticky;\n\t\t\tconst value = key in source ? source[key] : this.session.defaults[doc][key];\n\t\t\tif (value !== undefined) out[key] = structuredClone(value);\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate turn(conversationId: Id, sticky: StickyState): { turn?: TurnView } {\n\t\tconst live = [...this.session.liveTasks.values()].filter((task) => task.conversationId === conversationId);\n\t\tconst turnTasks = live.filter((task) => this.session.kinds.get(task.kind)?.turn === true);\n\t\tif (turnTasks.length === 0) return {};\n\t\tconst generation = turnTasks.find((task) => task.kind === \"pi.generation\");\n\t\tconst postTools = turnTasks.find((task) => task.kind === \"pi.post_tools\");\n\t\tconst inputTask = generation ?? postTools;\n\t\tconst inputs = inputTask === undefined ? [] : inputIds(inputTask);\n\t\tconst turn: TurnView = {\n\t\t\tinputs,\n\t\t\t...(generation === undefined\n\t\t\t\t? {}\n\t\t\t\t: { generation: generationStatus(generation, sticky.turn.message !== undefined) }),\n\t\t\t...(sticky.turn.message === undefined ? {} : { message: structuredClone(sticky.turn.message) }),\n\t\t\ttools: sticky.turn.tools.map(stripPrivateToolState),\n\t\t};\n\t\treturn { turn };\n\t}\n\n\tprivate compaction(conversationId: Id): { compaction?: ConversationView[\"compaction\"] } {\n\t\tconst task = [...this.session.liveTasks.values()].find(\n\t\t\t(candidate) => candidate.conversationId === conversationId && candidate.kind === \"pi.collapse\",\n\t\t);\n\t\tif (task === undefined) return {};\n\t\tconst input = task.input as { reason: \"threshold\" | \"manual\" | \"overflow\" };\n\t\tconst checkpoint = task.checkpoint as { phase?: string; attempt?: number; untilMs?: number } | undefined;\n\t\treturn {\n\t\t\tcompaction: {\n\t\t\t\ttaskId: task.id,\n\t\t\t\treason: input.reason,\n\t\t\t\tstage: checkpoint?.phase === \"retrying\" ? \"retrying\" : \"summarizing\",\n\t\t\t\tattempt: checkpoint?.attempt ?? 1,\n\t\t\t\t...(checkpoint?.phase === \"retrying\" && checkpoint.untilMs !== undefined\n\t\t\t\t\t? { retryAt: checkpoint.untilMs }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate tasks(conversationId: Id, sticky: StickyState): ConversationView[\"tasks\"] {\n\t\tconst out: ConversationView[\"tasks\"] = {};\n\t\tfor (const task of this.session.liveTasks.values()) {\n\t\t\tconst kind = this.session.kinds.get(task.kind);\n\t\t\tif (\n\t\t\t\ttask.conversationId !== conversationId ||\n\t\t\t\tkind === undefined ||\n\t\t\t\tkind.turn === true ||\n\t\t\t\ttask.kind === \"pi.collapse\"\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\tconst slot = sticky.tasks[task.id];\n\t\t\tout[task.id] = {\n\t\t\t\tkind: task.kind,\n\t\t\t\t...(task.background ? { background: true as const } : {}),\n\t\t\t\t...(task.abort ? { marked: true as const } : {}),\n\t\t\t\tstatus: describe(kind, task, slot),\n\t\t\t};\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate plugins(rewindable: RewindableState, sticky: StickyState, session: JsonObject): ConversationView[\"plugins\"] {\n\t\tconst out: ConversationView[\"plugins\"] = {};\n\t\tconst sessionPlugins = (session.plugins ?? {}) as { [key: string]: JsonObject };\n\t\tfor (const [id, registration] of this.session.namespaces) {\n\t\t\tif (registration.project === undefined) continue;\n\t\t\tconst merged: JsonObject = {\n\t\t\t\t...registration.defaults.rewindable,\n\t\t\t\t...registration.defaults.sticky,\n\t\t\t\t...registration.defaults.session,\n\t\t\t\t...(rewindable.plugins[id] ?? {}),\n\t\t\t\t...(sticky.plugins[id] ?? {}),\n\t\t\t\t...(sessionPlugins[id] ?? {}),\n\t\t\t};\n\t\t\tout[id] = strictJson(registration.project(structuredClone(merged)), `namespace ${id} view`);\n\t\t}\n\t\treturn out;\n\t}\n}\n\ntype EntryList = ConversationView[\"entries\"];\n\nclass WatchImpl implements Watch {\n\treadonly view: ConversationView;\n\tprivate readonly initialRevision: number;\n\tprivate readonly onReport: (error: unknown) => void;\n\tprivate readonly onStop: () => void;\n\tprivate listener: Listener | undefined;\n\tprivate readonly buffer: Envelope[] = [];\n\tprivate stopped = false;\n\n\tconstructor(view: ConversationView, revision: number, onReport: (error: unknown) => void, onStop: () => void) {\n\t\tthis.view = view;\n\t\tthis.initialRevision = revision;\n\t\tthis.onReport = onReport;\n\t\tthis.onStop = onStop;\n\t}\n\n\tget revision(): number {\n\t\treturn this.initialRevision;\n\t}\n\tget closed(): boolean {\n\t\treturn this.stopped;\n\t}\n\n\tstart(listener: Listener): void {\n\t\tif (this.listener !== undefined || this.stopped) return;\n\t\tthis.listener = listener;\n\t\tfor (const envelope of this.buffer.splice(0)) {\n\t\t\tif (this.stopped) break;\n\t\t\tthis.deliver(envelope);\n\t\t}\n\t}\n\n\tstop(): void {\n\t\tif (this.stopped) return;\n\t\tthis.stopped = true;\n\t\tthis.buffer.length = 0;\n\t\tthis.onStop();\n\t}\n\n\taccept(envelope: Envelope): void {\n\t\tif (this.stopped) return;\n\t\tif (this.listener === undefined) {\n\t\t\tif (this.buffer.length >= WATCH_CAPACITY) {\n\t\t\t\tthis.stop();\n\t\t\t\tthis.report(new Error(`watch capacity ${WATCH_CAPACITY} exceeded before start()`));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.buffer.push(envelope);\n\t\t\treturn;\n\t\t}\n\t\tthis.deliver(envelope);\n\t}\n\n\tprivate deliver(envelope: Envelope): void {\n\t\ttry {\n\t\t\tthis.listener!(envelope);\n\t\t} catch (error) {\n\t\t\tthis.fail(error);\n\t\t}\n\t}\n\n\tfail(error: unknown): void {\n\t\tthis.stop();\n\t\tthis.report(error);\n\t}\n\n\tprivate report(error: unknown): void {\n\t\ttry {\n\t\t\tthis.onReport(error);\n\t\t} catch {}\n\t}\n}\n\nfunction applyEntries(entries: EntryList, appended: EntryList): void {\n\tfor (const entry of appended) {\n\t\tif (entry.head !== undefined) {\n\t\t\tconst retained = entries.findIndex((candidate) => candidate.id >= entry.head!);\n\t\t\tconst remove = retained < 0 ? entries.length : retained;\n\t\t\tif (remove > 0) entries.splice(0, remove);\n\t\t}\n\t\tentries.push(structuredClone(entry));\n\t}\n}\n\nfunction inputIds(task: Task): Id[] {\n\tconst inputs = (task.input as { inputs?: JsonValue }).inputs;\n\treturn Array.isArray(inputs) ? inputs.filter((value): value is Id => typeof value === \"number\") : [];\n}\n\nfunction generationStatus(task: Task, streaming: boolean): GenerationStatus {\n\tif (task.status === \"pending\" && task.after.length > 0) return { stage: \"waiting\", on: \"compaction\" };\n\tconst checkpoint = task.checkpoint as\n\t\t| {\n\t\t\t\tphase?: string;\n\t\t\t\tattempt?: number;\n\t\t\t\tuntilMs?: number;\n\t\t\t\tlastError?: string;\n\t\t\t\tpollAt?: number;\n\t\t }\n\t\t| undefined;\n\tif (checkpoint?.phase === \"requesting\")\n\t\treturn { stage: streaming ? \"streaming\" : \"requesting\", attempt: checkpoint.attempt ?? 1 };\n\tif (checkpoint?.phase === \"retrying\")\n\t\treturn {\n\t\t\tstage: \"retrying\",\n\t\t\tattempt: checkpoint.attempt ?? 1,\n\t\t\tretryAt: checkpoint.untilMs ?? 0,\n\t\t\tlastError: checkpoint.lastError ?? \"\",\n\t\t};\n\tif (checkpoint?.phase === \"deferred\")\n\t\treturn { stage: \"deferred\", attempt: checkpoint.attempt ?? 1, pollAt: checkpoint.pollAt ?? 0 };\n\treturn { stage: \"preparing\" };\n}\n\nfunction stripPrivateToolState(slot: ToolSlot): Omit<ToolSlot, \"memos\"> {\n\tconst { memos: _memos, ...view } = structuredClone(slot);\n\treturn view;\n}\n\nfunction describe(kind: AnyKind, task: Task, slot: JsonObject | undefined): JsonValue {\n\tif (typeof kind.describe !== \"function\")\n\t\treturn { phase: task.checkpoint?.phase ?? (task.status === \"pending\" ? \"pending\" : \"running\") };\n\tconst publicSlot = slot === undefined ? undefined : structuredClone(slot);\n\tif (publicSlot !== undefined) delete publicSlot.memos;\n\tconst value = (kind.describe as (task: Task & { readonly slot?: Readonly<JsonObject> }) => JsonValue)({\n\t\t...task,\n\t\t...(publicSlot === undefined ? {} : { slot: publicSlot }),\n\t});\n\treturn strictJson(value, `task kind ${task.kind} describe`);\n}\n\nfunction strictJson(value: JsonValue, what: string): JsonValue {\n\tconst encoded = JSON.stringify(value);\n\tif (encoded === undefined) throw new Error(`${what} returned a non-JSON value`);\n\treturn JSON.parse(encoded) as JsonValue;\n}\n\nfunction touchesKey(ops: readonly Op[], key: string): boolean {\n\treturn ops.some((op) => op[0] === \"r\" || op[1][0] === key);\n}\n\nfunction syncOptional(target: object, key: string, next: unknown): void {\n\tconst record = target as Record<string, unknown>;\n\tif (next === undefined) {\n\t\tdelete record[key];\n\t\treturn;\n\t}\n\tconst current = record[key];\n\tif (same(current, next)) return;\n\tif (isRecord(current) && isRecord(next)) syncRecord(current, next);\n\telse record[key] = structuredClone(next);\n}\n\nfunction syncRecord(target: Record<string, unknown>, next: Record<string, unknown>): void {\n\tfor (const key of Object.keys(target)) if (!(key in next)) delete target[key];\n\tfor (const [key, value] of Object.entries(next)) {\n\t\tconst current = target[key];\n\t\tif (same(current, value)) continue;\n\t\tif (Array.isArray(current) && Array.isArray(value)) {\n\t\t\tsyncArray(current, value);\n\t\t\tcontinue;\n\t\t}\n\t\tif (isRecord(current) && isRecord(value)) {\n\t\t\tsyncRecord(current, value);\n\t\t\tcontinue;\n\t\t}\n\t\ttarget[key] = structuredClone(value);\n\t}\n}\n\nfunction syncArray(target: unknown[], next: unknown[]): void {\n\tlet prefix = 0;\n\twhile (prefix < target.length && prefix < next.length) {\n\t\tif (same(target[prefix], next[prefix])) {\n\t\t\tprefix++;\n\t\t\tcontinue;\n\t\t}\n\t\tconst current = target[prefix];\n\t\tconst replacement = next[prefix];\n\t\tif (!isRecord(current) || !isRecord(replacement) || !sameArrayItem(current, replacement)) break;\n\t\tsyncRecord(current, replacement);\n\t\tprefix++;\n\t}\n\tif (prefix === target.length && prefix === next.length) return;\n\tif (prefix === target.length) {\n\t\ttarget.push(...structuredClone(next.slice(prefix)));\n\t\treturn;\n\t}\n\ttarget.splice(prefix, target.length - prefix, ...structuredClone(next.slice(prefix)));\n}\n\nfunction sameArrayItem(current: Record<string, unknown>, next: Record<string, unknown>): boolean {\n\tif (typeof current.id === \"number\" || typeof next.id === \"number\") return current.id === next.id;\n\tif (typeof current.callId === \"string\" || typeof next.callId === \"string\") return current.callId === next.callId;\n\tif (typeof current.type === \"string\" || typeof next.type === \"string\") return current.type === next.type;\n\treturn false;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction same(a: unknown, b: unknown): boolean {\n\tif (Object.is(a, b)) return true;\n\treturn JSON.stringify(a) === JSON.stringify(b);\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { Context } from "./context.ts";
1
2
  import { type ExecutionEnv, type PromptTemplate } from "./types.ts";
2
3
  export type PromptTemplateDiagnosticCode = "file_info_failed" | "list_failed" | "read_failed" | "parse_failed";
3
4
  /** Warning produced while loading prompt templates. */
@@ -17,7 +18,7 @@ export interface PromptTemplateDiagnostic {
17
18
  * Directory inputs load direct `.md` children non-recursively. File inputs load explicit `.md` files. Missing paths and
18
19
  * non-markdown files are skipped. Read and parse failures are returned as diagnostics.
19
20
  */
20
- export declare function loadPromptTemplates(env: ExecutionEnv, paths: string | string[]): Promise<{
21
+ export declare function loadPromptTemplates(env: ExecutionEnv, paths: string | string[], context: Context): Promise<{
21
22
  promptTemplates: PromptTemplate[];
22
23
  diagnostics: PromptTemplateDiagnostic[];
23
24
  }>;
@@ -30,7 +31,7 @@ export declare function loadPromptTemplates(env: ExecutionEnv, paths: string | s
30
31
  export declare function loadSourcedPromptTemplates<TSource, TPromptTemplate extends PromptTemplate = PromptTemplate>(env: ExecutionEnv, inputs: Array<{
31
32
  path: string;
32
33
  source: TSource;
33
- }>, mapPromptTemplate?: (promptTemplate: PromptTemplate, source: TSource) => TPromptTemplate): Promise<{
34
+ }>, mapPromptTemplate: ((promptTemplate: PromptTemplate, source: TSource, context: Context) => TPromptTemplate) | undefined, context: Context): Promise<{
34
35
  promptTemplates: Array<{
35
36
  promptTemplate: TPromptTemplate;
36
37
  source: TSource;
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-templates.d.ts","sourceRoot":"","sources":["../../src/harness/prompt-templates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAiB,KAAK,cAAc,EAAwB,MAAM,YAAY,CAAC;AAEzG,MAAM,MAAM,4BAA4B,GAAG,kBAAkB,GAAG,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC;AAE/G,uDAAuD;AACvD,MAAM,WAAW,wBAAwB;IACxC,gEAAgE;IAChE,IAAI,EAAE,SAAS,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,4BAA4B,CAAC;IACnC,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACb;AAQD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GACtB,OAAO,CAAC;IAAE,eAAe,EAAE,cAAc,EAAE,CAAC;IAAC,WAAW,EAAE,wBAAwB,EAAE,CAAA;CAAE,CAAC,CA6BzF;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,eAAe,SAAS,cAAc,GAAG,cAAc,EAChH,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,EAChD,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,KAAK,eAAe,GACtF,OAAO,CAAC;IACV,eAAe,EAAE,KAAK,CAAC;QAAE,cAAc,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7E,WAAW,EAAE,KAAK,CAAC,wBAAwB,GAAG;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnE,CAAC,CAgBD;AAiID,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB7D;AAED,uHAAuH;AACvH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAatE;AAED,qEAAqE;AACrE,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,MAAM,CAEpG"}
1
+ {"version":3,"file":"prompt-templates.d.ts","sourceRoot":"","sources":["../../src/harness/prompt-templates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,KAAK,YAAY,EAAiB,KAAK,cAAc,EAAwB,MAAM,YAAY,CAAC;AAEzG,MAAM,MAAM,4BAA4B,GAAG,kBAAkB,GAAG,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC;AAE/G,uDAAuD;AACvD,MAAM,WAAW,wBAAwB;IACxC,gEAAgE;IAChE,IAAI,EAAE,SAAS,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,4BAA4B,CAAC;IACnC,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACb;AAQD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,OAAO,EAAE,OAAO,GACd,OAAO,CAAC;IAAE,eAAe,EAAE,cAAc,EAAE,CAAC;IAAC,WAAW,EAAE,wBAAwB,EAAE,CAAA;CAAE,CAAC,CA6BzF;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,eAAe,SAAS,cAAc,GAAG,cAAc,EAChH,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,EAChD,iBAAiB,EACd,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,eAAe,CAAC,GACxF,SAAS,EACZ,OAAO,EAAE,OAAO,GACd,OAAO,CAAC;IACV,eAAe,EAAE,KAAK,CAAC;QAAE,cAAc,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7E,WAAW,EAAE,KAAK,CAAC,wBAAwB,GAAG;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnE,CAAC,CAgBD;AA+HD,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB7D;AAED,uHAAuH;AACvH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAatE;AAED,qEAAqE;AACrE,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,MAAM,CAEpG"}
@@ -6,11 +6,11 @@ import { toError } from "./types.js";
6
6
  * Directory inputs load direct `.md` children non-recursively. File inputs load explicit `.md` files. Missing paths and
7
7
  * non-markdown files are skipped. Read and parse failures are returned as diagnostics.
8
8
  */
9
- export async function loadPromptTemplates(env, paths) {
9
+ export async function loadPromptTemplates(env, paths, context) {
10
10
  const promptTemplates = [];
11
11
  const diagnostics = [];
12
12
  for (const path of Array.isArray(paths) ? paths : [paths]) {
13
- const infoResult = await env.fileInfo(path);
13
+ const infoResult = await env.fileInfo(path, context);
14
14
  if (!infoResult.ok) {
15
15
  if (infoResult.error.code !== "not_found") {
16
16
  diagnostics.push({
@@ -23,14 +23,14 @@ export async function loadPromptTemplates(env, paths) {
23
23
  continue;
24
24
  }
25
25
  const info = infoResult.value;
26
- const kind = await resolveKind(env, info, diagnostics);
26
+ const kind = await resolveKind(env, info, diagnostics, context);
27
27
  if (kind === "directory") {
28
- const result = await loadTemplatesFromDir(env, info.path);
28
+ const result = await loadTemplatesFromDir(env, info.path, context);
29
29
  promptTemplates.push(...result.promptTemplates);
30
30
  diagnostics.push(...result.diagnostics);
31
31
  }
32
32
  else if (kind === "file" && info.name.endsWith(".md")) {
33
- const result = await loadTemplateFromFile(env, info.path);
33
+ const result = await loadTemplateFromFile(env, info.path, info.name, context);
34
34
  if (result.promptTemplate)
35
35
  promptTemplates.push(result.promptTemplate);
36
36
  diagnostics.push(...result.diagnostics);
@@ -44,15 +44,15 @@ export async function loadPromptTemplates(env, paths) {
44
44
  * Source values are preserved exactly and attached to every loaded prompt template and diagnostic. The agent package does
45
45
  * not interpret source values; applications define their own provenance shape.
46
46
  */
47
- export async function loadSourcedPromptTemplates(env, inputs, mapPromptTemplate) {
47
+ export async function loadSourcedPromptTemplates(env, inputs, mapPromptTemplate, context) {
48
48
  const promptTemplates = [];
49
49
  const diagnostics = [];
50
50
  for (const input of inputs) {
51
- const result = await loadPromptTemplates(env, input.path);
51
+ const result = await loadPromptTemplates(env, input.path, context);
52
52
  for (const promptTemplate of result.promptTemplates) {
53
53
  promptTemplates.push({
54
54
  promptTemplate: mapPromptTemplate
55
- ? mapPromptTemplate(promptTemplate, input.source)
55
+ ? mapPromptTemplate(promptTemplate, input.source, context)
56
56
  : promptTemplate,
57
57
  source: input.source,
58
58
  });
@@ -62,10 +62,10 @@ export async function loadSourcedPromptTemplates(env, inputs, mapPromptTemplate)
62
62
  }
63
63
  return { promptTemplates, diagnostics };
64
64
  }
65
- async function loadTemplatesFromDir(env, dir) {
65
+ async function loadTemplatesFromDir(env, dir, context) {
66
66
  const promptTemplates = [];
67
67
  const diagnostics = [];
68
- const entriesResult = await env.listDir(dir);
68
+ const entriesResult = await env.listDir(dir, context);
69
69
  if (!entriesResult.ok) {
70
70
  diagnostics.push({
71
71
  type: "warning",
@@ -77,19 +77,19 @@ async function loadTemplatesFromDir(env, dir) {
77
77
  }
78
78
  const entries = entriesResult.value;
79
79
  for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
80
- const kind = await resolveKind(env, entry, diagnostics);
80
+ const kind = await resolveKind(env, entry, diagnostics, context);
81
81
  if (kind !== "file" || !entry.name.endsWith(".md"))
82
82
  continue;
83
- const result = await loadTemplateFromFile(env, entry.path);
83
+ const result = await loadTemplateFromFile(env, entry.path, entry.name, context);
84
84
  if (result.promptTemplate)
85
85
  promptTemplates.push(result.promptTemplate);
86
86
  diagnostics.push(...result.diagnostics);
87
87
  }
88
88
  return { promptTemplates, diagnostics };
89
89
  }
90
- async function loadTemplateFromFile(env, filePath) {
90
+ async function loadTemplateFromFile(env, filePath, fileName, context) {
91
91
  const diagnostics = [];
92
- const rawContent = await env.readTextFile(filePath);
92
+ const rawContent = await env.readTextFile(filePath, context);
93
93
  if (!rawContent.ok) {
94
94
  diagnostics.push({
95
95
  type: "warning",
@@ -119,17 +119,17 @@ async function loadTemplateFromFile(env, filePath) {
119
119
  }
120
120
  return {
121
121
  promptTemplate: {
122
- name: basenameEnvPath(filePath).replace(/\.md$/i, ""),
122
+ name: fileName.replace(/\.md$/i, ""),
123
123
  description,
124
124
  content: body,
125
125
  },
126
126
  diagnostics,
127
127
  };
128
128
  }
129
- async function resolveKind(env, info, diagnostics) {
129
+ async function resolveKind(env, info, diagnostics, context) {
130
130
  if (info.kind === "file" || info.kind === "directory")
131
131
  return info.kind;
132
- const canonicalPath = await env.canonicalPath(info.path);
132
+ const canonicalPath = await env.canonicalPath(info.path, context);
133
133
  if (!canonicalPath.ok) {
134
134
  if (canonicalPath.error.code !== "not_found") {
135
135
  diagnostics.push({
@@ -141,7 +141,7 @@ async function resolveKind(env, info, diagnostics) {
141
141
  }
142
142
  return undefined;
143
143
  }
144
- const target = await env.fileInfo(canonicalPath.value);
144
+ const target = await env.fileInfo(canonicalPath.value, context);
145
145
  if (!target.ok) {
146
146
  if (target.error.code !== "not_found") {
147
147
  diagnostics.push({
@@ -171,11 +171,6 @@ function parseFrontmatter(content) {
171
171
  return { ok: false, error: toError(error) };
172
172
  }
173
173
  }
174
- function basenameEnvPath(path) {
175
- const normalized = path.replace(/\/+$/, "");
176
- const slashIndex = normalized.lastIndexOf("/");
177
- return slashIndex === -1 ? normalized : normalized.slice(slashIndex + 1);
178
- }
179
174
  /** Parse an argument string using simple shell-style single and double quotes. */
180
175
  export function parseCommandArgs(argsString) {
181
176
  const args = [];