@taco-ai/pi-harness 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. package/LICENSE +26 -0
  2. package/LICENSE.upstream +21 -0
  3. package/README.md +170 -2
  4. package/README.zh-CN.md +165 -0
  5. package/dist/agent-loop.d.ts +49 -0
  6. package/dist/agent-loop.d.ts.map +1 -0
  7. package/dist/agent-loop.js +667 -0
  8. package/dist/agent-loop.js.map +1 -0
  9. package/dist/agent.d.ts +137 -0
  10. package/dist/agent.d.ts.map +1 -0
  11. package/dist/agent.js +437 -0
  12. package/dist/agent.js.map +1 -0
  13. package/dist/harness/agent-harness.d.ts +717 -0
  14. package/dist/harness/agent-harness.d.ts.map +1 -0
  15. package/dist/harness/agent-harness.js +6 -0
  16. package/dist/harness/agent-harness.js.map +1 -0
  17. package/dist/harness/compaction/branch-summarization.d.ts +68 -0
  18. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
  19. package/dist/harness/compaction/branch-summarization.js +176 -0
  20. package/dist/harness/compaction/branch-summarization.js.map +1 -0
  21. package/dist/harness/compaction/compaction.d.ts +126 -0
  22. package/dist/harness/compaction/compaction.d.ts.map +1 -0
  23. package/dist/harness/compaction/compaction.js +560 -0
  24. package/dist/harness/compaction/compaction.js.map +1 -0
  25. package/dist/harness/compaction/utils.d.ts +25 -0
  26. package/dist/harness/compaction/utils.d.ts.map +1 -0
  27. package/dist/harness/compaction/utils.js +120 -0
  28. package/dist/harness/compaction/utils.js.map +1 -0
  29. package/dist/harness/config.d.ts +9 -0
  30. package/dist/harness/config.d.ts.map +1 -0
  31. package/dist/harness/config.js +35 -0
  32. package/dist/harness/config.js.map +1 -0
  33. package/dist/harness/context.d.ts +9 -0
  34. package/dist/harness/context.d.ts.map +1 -0
  35. package/dist/harness/context.js +13 -0
  36. package/dist/harness/context.js.map +1 -0
  37. package/dist/harness/env/nodejs.d.ts +43 -0
  38. package/dist/harness/env/nodejs.d.ts.map +1 -0
  39. package/dist/harness/env/nodejs.js +865 -0
  40. package/dist/harness/env/nodejs.js.map +1 -0
  41. package/dist/harness/events.d.ts +25 -0
  42. package/dist/harness/events.d.ts.map +1 -0
  43. package/dist/harness/events.js +250 -0
  44. package/dist/harness/events.js.map +1 -0
  45. package/dist/harness/execution/assistant.d.ts +42 -0
  46. package/dist/harness/execution/assistant.d.ts.map +1 -0
  47. package/dist/harness/execution/assistant.js +82 -0
  48. package/dist/harness/execution/assistant.js.map +1 -0
  49. package/dist/harness/execution/effect-gate.d.ts +22 -0
  50. package/dist/harness/execution/effect-gate.d.ts.map +1 -0
  51. package/dist/harness/execution/effect-gate.js +49 -0
  52. package/dist/harness/execution/effect-gate.js.map +1 -0
  53. package/dist/harness/execution/tools.d.ts +67 -0
  54. package/dist/harness/execution/tools.d.ts.map +1 -0
  55. package/dist/harness/execution/tools.js +119 -0
  56. package/dist/harness/execution/tools.js.map +1 -0
  57. package/dist/harness/hooks.d.ts +38 -0
  58. package/dist/harness/hooks.d.ts.map +1 -0
  59. package/dist/harness/hooks.js +406 -0
  60. package/dist/harness/hooks.js.map +1 -0
  61. package/dist/harness/messages.d.ts +51 -0
  62. package/dist/harness/messages.d.ts.map +1 -0
  63. package/dist/harness/messages.js +103 -0
  64. package/dist/harness/messages.js.map +1 -0
  65. package/dist/harness/pico3/bash.d.ts +10 -0
  66. package/dist/harness/pico3/bash.d.ts.map +1 -0
  67. package/dist/harness/pico3/bash.js +25 -0
  68. package/dist/harness/pico3/bash.js.map +1 -0
  69. package/dist/harness/pico3/bounded.d.ts +21 -0
  70. package/dist/harness/pico3/bounded.d.ts.map +1 -0
  71. package/dist/harness/pico3/bounded.js +98 -0
  72. package/dist/harness/pico3/bounded.js.map +1 -0
  73. package/dist/harness/pico3/chord.d.ts +41 -0
  74. package/dist/harness/pico3/chord.d.ts.map +1 -0
  75. package/dist/harness/pico3/chord.js +147 -0
  76. package/dist/harness/pico3/chord.js.map +1 -0
  77. package/dist/harness/pico3/context.d.ts +16 -0
  78. package/dist/harness/pico3/context.d.ts.map +1 -0
  79. package/dist/harness/pico3/context.js +88 -0
  80. package/dist/harness/pico3/context.js.map +1 -0
  81. package/dist/harness/pico3/harness.d.ts +198 -0
  82. package/dist/harness/pico3/harness.d.ts.map +1 -0
  83. package/dist/harness/pico3/harness.js +654 -0
  84. package/dist/harness/pico3/harness.js.map +1 -0
  85. package/dist/harness/pico3/hooks.d.ts +10 -0
  86. package/dist/harness/pico3/hooks.d.ts.map +1 -0
  87. package/dist/harness/pico3/hooks.js +33 -0
  88. package/dist/harness/pico3/hooks.js.map +1 -0
  89. package/dist/harness/pico3/index.d.ts +19 -0
  90. package/dist/harness/pico3/index.d.ts.map +1 -0
  91. package/dist/harness/pico3/index.js +15 -0
  92. package/dist/harness/pico3/index.js.map +1 -0
  93. package/dist/harness/pico3/jsonl.d.ts +58 -0
  94. package/dist/harness/pico3/jsonl.d.ts.map +1 -0
  95. package/dist/harness/pico3/jsonl.js +325 -0
  96. package/dist/harness/pico3/jsonl.js.map +1 -0
  97. package/dist/harness/pico3/kinds/collapse.d.ts +49 -0
  98. package/dist/harness/pico3/kinds/collapse.d.ts.map +1 -0
  99. package/dist/harness/pico3/kinds/collapse.js +191 -0
  100. package/dist/harness/pico3/kinds/collapse.js.map +1 -0
  101. package/dist/harness/pico3/kinds/entries.d.ts +78 -0
  102. package/dist/harness/pico3/kinds/entries.d.ts.map +1 -0
  103. package/dist/harness/pico3/kinds/entries.js +13 -0
  104. package/dist/harness/pico3/kinds/entries.js.map +1 -0
  105. package/dist/harness/pico3/kinds/frames.d.ts +11 -0
  106. package/dist/harness/pico3/kinds/frames.d.ts.map +1 -0
  107. package/dist/harness/pico3/kinds/frames.js +76 -0
  108. package/dist/harness/pico3/kinds/frames.js.map +1 -0
  109. package/dist/harness/pico3/kinds/generation.d.ts +94 -0
  110. package/dist/harness/pico3/kinds/generation.d.ts.map +1 -0
  111. package/dist/harness/pico3/kinds/generation.js +505 -0
  112. package/dist/harness/pico3/kinds/generation.js.map +1 -0
  113. package/dist/harness/pico3/kinds/job.d.ts +44 -0
  114. package/dist/harness/pico3/kinds/job.d.ts.map +1 -0
  115. package/dist/harness/pico3/kinds/job.js +143 -0
  116. package/dist/harness/pico3/kinds/job.js.map +1 -0
  117. package/dist/harness/pico3/kinds/plugin.d.ts +15 -0
  118. package/dist/harness/pico3/kinds/plugin.d.ts.map +1 -0
  119. package/dist/harness/pico3/kinds/plugin.js +35 -0
  120. package/dist/harness/pico3/kinds/plugin.js.map +1 -0
  121. package/dist/harness/pico3/kinds/post-tools.d.ts +22 -0
  122. package/dist/harness/pico3/kinds/post-tools.d.ts.map +1 -0
  123. package/dist/harness/pico3/kinds/post-tools.js +145 -0
  124. package/dist/harness/pico3/kinds/post-tools.js.map +1 -0
  125. package/dist/harness/pico3/kinds/task-api.d.ts +3 -0
  126. package/dist/harness/pico3/kinds/task-api.d.ts.map +1 -0
  127. package/dist/harness/pico3/kinds/task-api.js +45 -0
  128. package/dist/harness/pico3/kinds/task-api.js.map +1 -0
  129. package/dist/harness/pico3/kinds/tool.d.ts +43 -0
  130. package/dist/harness/pico3/kinds/tool.d.ts.map +1 -0
  131. package/dist/harness/pico3/kinds/tool.js +373 -0
  132. package/dist/harness/pico3/kinds/tool.js.map +1 -0
  133. package/dist/harness/pico3/legacy-tracker.d.ts +11 -0
  134. package/dist/harness/pico3/legacy-tracker.d.ts.map +1 -0
  135. package/dist/harness/pico3/legacy-tracker.js +41 -0
  136. package/dist/harness/pico3/legacy-tracker.js.map +1 -0
  137. package/dist/harness/pico3/membrane.d.ts +23 -0
  138. package/dist/harness/pico3/membrane.d.ts.map +1 -0
  139. package/dist/harness/pico3/membrane.js +141 -0
  140. package/dist/harness/pico3/membrane.js.map +1 -0
  141. package/dist/harness/pico3/memory.d.ts +53 -0
  142. package/dist/harness/pico3/memory.d.ts.map +1 -0
  143. package/dist/harness/pico3/memory.js +264 -0
  144. package/dist/harness/pico3/memory.js.map +1 -0
  145. package/dist/harness/pico3/scheduler.d.ts +49 -0
  146. package/dist/harness/pico3/scheduler.d.ts.map +1 -0
  147. package/dist/harness/pico3/scheduler.js +438 -0
  148. package/dist/harness/pico3/scheduler.js.map +1 -0
  149. package/dist/harness/pico3/session.d.ts +264 -0
  150. package/dist/harness/pico3/session.d.ts.map +1 -0
  151. package/dist/harness/pico3/session.js +1348 -0
  152. package/dist/harness/pico3/session.js.map +1 -0
  153. package/dist/harness/pico3/system.d.ts +126 -0
  154. package/dist/harness/pico3/system.d.ts.map +1 -0
  155. package/dist/harness/pico3/system.js +244 -0
  156. package/dist/harness/pico3/system.js.map +1 -0
  157. package/dist/harness/pico3/types.d.ts +973 -0
  158. package/dist/harness/pico3/types.d.ts.map +1 -0
  159. package/dist/harness/pico3/types.js +96 -0
  160. package/dist/harness/pico3/types.js.map +1 -0
  161. package/dist/harness/pico3/view.d.ts +34 -0
  162. package/dist/harness/pico3/view.d.ts.map +1 -0
  163. package/dist/harness/pico3/view.js +411 -0
  164. package/dist/harness/pico3/view.js.map +1 -0
  165. package/dist/harness/prompt-templates.d.ts +49 -0
  166. package/dist/harness/prompt-templates.d.ts.map +1 -0
  167. package/dist/harness/prompt-templates.js +225 -0
  168. package/dist/harness/prompt-templates.js.map +1 -0
  169. package/dist/harness/result.d.ts +133 -0
  170. package/dist/harness/result.d.ts.map +1 -0
  171. package/dist/harness/result.js +81 -0
  172. package/dist/harness/result.js.map +1 -0
  173. package/dist/harness/runtime/drive/boundary.d.ts +28 -0
  174. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -0
  175. package/dist/harness/runtime/drive/boundary.js +173 -0
  176. package/dist/harness/runtime/drive/boundary.js.map +1 -0
  177. package/dist/harness/runtime/drive/checkpoint.d.ts +8 -0
  178. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -0
  179. package/dist/harness/runtime/drive/checkpoint.js +133 -0
  180. package/dist/harness/runtime/drive/checkpoint.js.map +1 -0
  181. package/dist/harness/runtime/drive/deferred.d.ts +15 -0
  182. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -0
  183. package/dist/harness/runtime/drive/deferred.js +179 -0
  184. package/dist/harness/runtime/drive/deferred.js.map +1 -0
  185. package/dist/harness/runtime/drive/generation.d.ts +8 -0
  186. package/dist/harness/runtime/drive/generation.d.ts.map +1 -0
  187. package/dist/harness/runtime/drive/generation.js +205 -0
  188. package/dist/harness/runtime/drive/generation.js.map +1 -0
  189. package/dist/harness/runtime/drive/reconcile.d.ts +5 -0
  190. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -0
  191. package/dist/harness/runtime/drive/reconcile.js +140 -0
  192. package/dist/harness/runtime/drive/reconcile.js.map +1 -0
  193. package/dist/harness/runtime/drive/recovery.d.ts +8 -0
  194. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -0
  195. package/dist/harness/runtime/drive/recovery.js +85 -0
  196. package/dist/harness/runtime/drive/recovery.js.map +1 -0
  197. package/dist/harness/runtime/drive/response.d.ts +23 -0
  198. package/dist/harness/runtime/drive/response.d.ts.map +1 -0
  199. package/dist/harness/runtime/drive/response.js +395 -0
  200. package/dist/harness/runtime/drive/response.js.map +1 -0
  201. package/dist/harness/runtime/drive/retry.d.ts +4 -0
  202. package/dist/harness/runtime/drive/retry.d.ts.map +1 -0
  203. package/dist/harness/runtime/drive/retry.js +34 -0
  204. package/dist/harness/runtime/drive/retry.js.map +1 -0
  205. package/dist/harness/runtime/drive/structural.d.ts +32 -0
  206. package/dist/harness/runtime/drive/structural.d.ts.map +1 -0
  207. package/dist/harness/runtime/drive/structural.js +929 -0
  208. package/dist/harness/runtime/drive/structural.js.map +1 -0
  209. package/dist/harness/runtime/drive/terminal.d.ts +7 -0
  210. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -0
  211. package/dist/harness/runtime/drive/terminal.js +49 -0
  212. package/dist/harness/runtime/drive/terminal.js.map +1 -0
  213. package/dist/harness/runtime/drive/tool-placement.d.ts +14 -0
  214. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -0
  215. package/dist/harness/runtime/drive/tool-placement.js +219 -0
  216. package/dist/harness/runtime/drive/tool-placement.js.map +1 -0
  217. package/dist/harness/runtime/drive/tools.d.ts +6 -0
  218. package/dist/harness/runtime/drive/tools.d.ts.map +1 -0
  219. package/dist/harness/runtime/drive/tools.js +449 -0
  220. package/dist/harness/runtime/drive/tools.js.map +1 -0
  221. package/dist/harness/runtime/drive.d.ts +6 -0
  222. package/dist/harness/runtime/drive.d.ts.map +1 -0
  223. package/dist/harness/runtime/drive.js +93 -0
  224. package/dist/harness/runtime/drive.js.map +1 -0
  225. package/dist/harness/runtime/harness.d.ts +59 -0
  226. package/dist/harness/runtime/harness.d.ts.map +1 -0
  227. package/dist/harness/runtime/harness.js +311 -0
  228. package/dist/harness/runtime/harness.js.map +1 -0
  229. package/dist/harness/runtime/index.d.ts +2 -0
  230. package/dist/harness/runtime/index.d.ts.map +1 -0
  231. package/dist/harness/runtime/index.js +2 -0
  232. package/dist/harness/runtime/index.js.map +1 -0
  233. package/dist/harness/runtime/lane.d.ts +118 -0
  234. package/dist/harness/runtime/lane.d.ts.map +1 -0
  235. package/dist/harness/runtime/lane.js +1576 -0
  236. package/dist/harness/runtime/lane.js.map +1 -0
  237. package/dist/harness/runtime/progress.d.ts +15 -0
  238. package/dist/harness/runtime/progress.d.ts.map +1 -0
  239. package/dist/harness/runtime/progress.js +66 -0
  240. package/dist/harness/runtime/progress.js.map +1 -0
  241. package/dist/harness/runtime/reducer.d.ts +5 -0
  242. package/dist/harness/runtime/reducer.d.ts.map +1 -0
  243. package/dist/harness/runtime/reducer.js +240 -0
  244. package/dist/harness/runtime/reducer.js.map +1 -0
  245. package/dist/harness/runtime/restore.d.ts +24 -0
  246. package/dist/harness/runtime/restore.d.ts.map +1 -0
  247. package/dist/harness/runtime/restore.js +117 -0
  248. package/dist/harness/runtime/restore.js.map +1 -0
  249. package/dist/harness/runtime/transcript.d.ts +21 -0
  250. package/dist/harness/runtime/transcript.d.ts.map +1 -0
  251. package/dist/harness/runtime/transcript.js +72 -0
  252. package/dist/harness/runtime/transcript.js.map +1 -0
  253. package/dist/harness/runtime/types.d.ts +105 -0
  254. package/dist/harness/runtime/types.d.ts.map +1 -0
  255. package/dist/harness/runtime/types.js +61 -0
  256. package/dist/harness/runtime/types.js.map +1 -0
  257. package/dist/harness/session/commit.d.ts +53 -0
  258. package/dist/harness/session/commit.d.ts.map +1 -0
  259. package/dist/harness/session/commit.js +57 -0
  260. package/dist/harness/session/commit.js.map +1 -0
  261. package/dist/harness/session/context.d.ts +10 -0
  262. package/dist/harness/session/context.d.ts.map +1 -0
  263. package/dist/harness/session/context.js +49 -0
  264. package/dist/harness/session/context.js.map +1 -0
  265. package/dist/harness/session/fork-policy.d.ts +21 -0
  266. package/dist/harness/session/fork-policy.d.ts.map +1 -0
  267. package/dist/harness/session/fork-policy.js +55 -0
  268. package/dist/harness/session/fork-policy.js.map +1 -0
  269. package/dist/harness/session/fork.d.ts +16 -0
  270. package/dist/harness/session/fork.d.ts.map +1 -0
  271. package/dist/harness/session/fork.js +79 -0
  272. package/dist/harness/session/fork.js.map +1 -0
  273. package/dist/harness/session/in-memory-storage-state.d.ts +39 -0
  274. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -0
  275. package/dist/harness/session/in-memory-storage-state.js +276 -0
  276. package/dist/harness/session/in-memory-storage-state.js.map +1 -0
  277. package/dist/harness/session/index.d.ts +11 -0
  278. package/dist/harness/session/index.d.ts.map +1 -0
  279. package/dist/harness/session/index.js +9 -0
  280. package/dist/harness/session/index.js.map +1 -0
  281. package/dist/harness/session/jsonl/codec.d.ts +21 -0
  282. package/dist/harness/session/jsonl/codec.d.ts.map +1 -0
  283. package/dist/harness/session/jsonl/codec.js +45 -0
  284. package/dist/harness/session/jsonl/codec.js.map +1 -0
  285. package/dist/harness/session/jsonl/fork.d.ts +38 -0
  286. package/dist/harness/session/jsonl/fork.d.ts.map +1 -0
  287. package/dist/harness/session/jsonl/fork.js +264 -0
  288. package/dist/harness/session/jsonl/fork.js.map +1 -0
  289. package/dist/harness/session/jsonl/index.d.ts +4 -0
  290. package/dist/harness/session/jsonl/index.d.ts.map +1 -0
  291. package/dist/harness/session/jsonl/index.js +4 -0
  292. package/dist/harness/session/jsonl/index.js.map +1 -0
  293. package/dist/harness/session/jsonl/io.d.ts +14 -0
  294. package/dist/harness/session/jsonl/io.d.ts.map +1 -0
  295. package/dist/harness/session/jsonl/io.js +86 -0
  296. package/dist/harness/session/jsonl/io.js.map +1 -0
  297. package/dist/harness/session/jsonl/legacy-v3.d.ts +44 -0
  298. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -0
  299. package/dist/harness/session/jsonl/legacy-v3.js +462 -0
  300. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -0
  301. package/dist/harness/session/jsonl/repo.d.ts +35 -0
  302. package/dist/harness/session/jsonl/repo.d.ts.map +1 -0
  303. package/dist/harness/session/jsonl/repo.js +301 -0
  304. package/dist/harness/session/jsonl/repo.js.map +1 -0
  305. package/dist/harness/session/jsonl/storage.d.ts +41 -0
  306. package/dist/harness/session/jsonl/storage.d.ts.map +1 -0
  307. package/dist/harness/session/jsonl/storage.js +200 -0
  308. package/dist/harness/session/jsonl/storage.js.map +1 -0
  309. package/dist/harness/session/jsonl/types.d.ts +39 -0
  310. package/dist/harness/session/jsonl/types.d.ts.map +1 -0
  311. package/dist/harness/session/jsonl/types.js +3 -0
  312. package/dist/harness/session/jsonl/types.js.map +1 -0
  313. package/dist/harness/session/memory.d.ts +48 -0
  314. package/dist/harness/session/memory.d.ts.map +1 -0
  315. package/dist/harness/session/memory.js +369 -0
  316. package/dist/harness/session/memory.js.map +1 -0
  317. package/dist/harness/session/mutation-line.d.ts +8 -0
  318. package/dist/harness/session/mutation-line.d.ts.map +1 -0
  319. package/dist/harness/session/mutation-line.js +21 -0
  320. package/dist/harness/session/mutation-line.js.map +1 -0
  321. package/dist/harness/session/session.d.ts +82 -0
  322. package/dist/harness/session/session.d.ts.map +1 -0
  323. package/dist/harness/session/session.js +361 -0
  324. package/dist/harness/session/session.js.map +1 -0
  325. package/dist/harness/session/testing/benchmark/datasets.d.ts +12 -0
  326. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -0
  327. package/dist/harness/session/testing/benchmark/datasets.js +24 -0
  328. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -0
  329. package/dist/harness/session/testing/benchmark/session-repo.d.ts +42 -0
  330. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -0
  331. package/dist/harness/session/testing/benchmark/session-repo.js +127 -0
  332. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -0
  333. package/dist/harness/session/testing/benchmark/storage.d.ts +25 -0
  334. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -0
  335. package/dist/harness/session/testing/benchmark/storage.js +114 -0
  336. package/dist/harness/session/testing/benchmark/storage.js.map +1 -0
  337. package/dist/harness/session/testing/conformance/session-repo.d.ts +23 -0
  338. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -0
  339. package/dist/harness/session/testing/conformance/session-repo.js +809 -0
  340. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -0
  341. package/dist/harness/session/testing/conformance/storage.d.ts +4 -0
  342. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -0
  343. package/dist/harness/session/testing/conformance/storage.js +600 -0
  344. package/dist/harness/session/testing/conformance/storage.js.map +1 -0
  345. package/dist/harness/session/testing/gating-storage.d.ts +26 -0
  346. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -0
  347. package/dist/harness/session/testing/gating-storage.js +100 -0
  348. package/dist/harness/session/testing/gating-storage.js.map +1 -0
  349. package/dist/harness/session/testing/index.d.ts +10 -0
  350. package/dist/harness/session/testing/index.d.ts.map +1 -0
  351. package/dist/harness/session/testing/index.js +9 -0
  352. package/dist/harness/session/testing/index.js.map +1 -0
  353. package/dist/harness/session/testing/instrumented-storage.d.ts +11 -0
  354. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -0
  355. package/dist/harness/session/testing/instrumented-storage.js +16 -0
  356. package/dist/harness/session/testing/instrumented-storage.js.map +1 -0
  357. package/dist/harness/session/testing/storage-decorator.d.ts +20 -0
  358. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -0
  359. package/dist/harness/session/testing/storage-decorator.js +41 -0
  360. package/dist/harness/session/testing/storage-decorator.js.map +1 -0
  361. package/dist/harness/session/testing/types.d.ts +12 -0
  362. package/dist/harness/session/testing/types.d.ts.map +1 -0
  363. package/dist/harness/session/testing/types.js +2 -0
  364. package/dist/harness/session/testing/types.js.map +1 -0
  365. package/dist/harness/session/types.d.ts +512 -0
  366. package/dist/harness/session/types.d.ts.map +1 -0
  367. package/dist/harness/session/types.js +9 -0
  368. package/dist/harness/session/types.js.map +1 -0
  369. package/dist/harness/session/values.d.ts +95 -0
  370. package/dist/harness/session/values.d.ts.map +1 -0
  371. package/dist/harness/session/values.js +81 -0
  372. package/dist/harness/session/values.js.map +1 -0
  373. package/dist/harness/skills.d.ts +46 -0
  374. package/dist/harness/skills.d.ts.map +1 -0
  375. package/dist/harness/skills.js +326 -0
  376. package/dist/harness/skills.js.map +1 -0
  377. package/dist/harness/system-prompt.d.ts +3 -0
  378. package/dist/harness/system-prompt.d.ts.map +1 -0
  379. package/dist/harness/system-prompt.js +30 -0
  380. package/dist/harness/system-prompt.js.map +1 -0
  381. package/dist/harness/telemetry.d.ts +1242 -0
  382. package/dist/harness/telemetry.d.ts.map +1 -0
  383. package/dist/harness/telemetry.js +527 -0
  384. package/dist/harness/telemetry.js.map +1 -0
  385. package/dist/harness/tools/bash.d.ts +27 -0
  386. package/dist/harness/tools/bash.d.ts.map +1 -0
  387. package/dist/harness/tools/bash.js +105 -0
  388. package/dist/harness/tools/bash.js.map +1 -0
  389. package/dist/harness/tools/edit-diff.d.ts +89 -0
  390. package/dist/harness/tools/edit-diff.d.ts.map +1 -0
  391. package/dist/harness/tools/edit-diff.js +386 -0
  392. package/dist/harness/tools/edit-diff.js.map +1 -0
  393. package/dist/harness/tools/edit.d.ts +19 -0
  394. package/dist/harness/tools/edit.d.ts.map +1 -0
  395. package/dist/harness/tools/edit.js +108 -0
  396. package/dist/harness/tools/edit.js.map +1 -0
  397. package/dist/harness/tools/file-mutation-queue.d.ts +5 -0
  398. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -0
  399. package/dist/harness/tools/file-mutation-queue.js +46 -0
  400. package/dist/harness/tools/file-mutation-queue.js.map +1 -0
  401. package/dist/harness/tools/image.d.ts +3 -0
  402. package/dist/harness/tools/image.d.ts.map +1 -0
  403. package/dist/harness/tools/image.js +106 -0
  404. package/dist/harness/tools/image.js.map +1 -0
  405. package/dist/harness/tools/index.d.ts +6 -0
  406. package/dist/harness/tools/index.d.ts.map +1 -0
  407. package/dist/harness/tools/index.js +5 -0
  408. package/dist/harness/tools/index.js.map +1 -0
  409. package/dist/harness/tools/path-utils.d.ts +5 -0
  410. package/dist/harness/tools/path-utils.d.ts.map +1 -0
  411. package/dist/harness/tools/path-utils.js +26 -0
  412. package/dist/harness/tools/path-utils.js.map +1 -0
  413. package/dist/harness/tools/read.d.ts +35 -0
  414. package/dist/harness/tools/read.d.ts.map +1 -0
  415. package/dist/harness/tools/read.js +108 -0
  416. package/dist/harness/tools/read.js.map +1 -0
  417. package/dist/harness/tools/tool-context.d.ts +6 -0
  418. package/dist/harness/tools/tool-context.d.ts.map +1 -0
  419. package/dist/harness/tools/tool-context.js +2 -0
  420. package/dist/harness/tools/tool-context.js.map +1 -0
  421. package/dist/harness/tools/write.d.ts +11 -0
  422. package/dist/harness/tools/write.d.ts.map +1 -0
  423. package/dist/harness/tools/write.js +31 -0
  424. package/dist/harness/tools/write.js.map +1 -0
  425. package/dist/harness/types.d.ts +305 -0
  426. package/dist/harness/types.d.ts.map +1 -0
  427. package/dist/harness/types.js +75 -0
  428. package/dist/harness/types.js.map +1 -0
  429. package/dist/harness/utils/adaptive-publisher.d.ts +24 -0
  430. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -0
  431. package/dist/harness/utils/adaptive-publisher.js +79 -0
  432. package/dist/harness/utils/adaptive-publisher.js.map +1 -0
  433. package/dist/harness/utils/output-capture.d.ts +31 -0
  434. package/dist/harness/utils/output-capture.d.ts.map +1 -0
  435. package/dist/harness/utils/output-capture.js +217 -0
  436. package/dist/harness/utils/output-capture.js.map +1 -0
  437. package/dist/harness/utils/shell-output.d.ts +29 -0
  438. package/dist/harness/utils/shell-output.d.ts.map +1 -0
  439. package/dist/harness/utils/shell-output.js +71 -0
  440. package/dist/harness/utils/shell-output.js.map +1 -0
  441. package/dist/harness/utils/truncate.d.ts +71 -0
  442. package/dist/harness/utils/truncate.d.ts.map +1 -0
  443. package/dist/harness/utils/truncate.js +296 -0
  444. package/dist/harness/utils/truncate.js.map +1 -0
  445. package/dist/harness/utils/usage.d.ts +4 -0
  446. package/dist/harness/utils/usage.d.ts.map +1 -0
  447. package/dist/harness/utils/usage.js +33 -0
  448. package/dist/harness/utils/usage.js.map +1 -0
  449. package/dist/index.d.ts +28 -0
  450. package/dist/index.d.ts.map +1 -0
  451. package/dist/index.js +26 -0
  452. package/dist/index.js.map +1 -0
  453. package/dist/node.d.ts +3 -0
  454. package/dist/node.d.ts.map +1 -0
  455. package/dist/node.js +3 -0
  456. package/dist/node.js.map +1 -0
  457. package/dist/proxy.d.ts +72 -0
  458. package/dist/proxy.d.ts.map +1 -0
  459. package/dist/proxy.js +310 -0
  460. package/dist/proxy.js.map +1 -0
  461. package/dist/search/index.d.ts +29 -0
  462. package/dist/search/index.d.ts.map +1 -0
  463. package/dist/search/index.js +2 -0
  464. package/dist/search/index.js.map +1 -0
  465. package/dist/shims/assistant-message-frame.d.ts +101 -0
  466. package/dist/shims/assistant-message-frame.d.ts.map +1 -0
  467. package/dist/shims/assistant-message-frame.js +425 -0
  468. package/dist/shims/assistant-message-frame.js.map +1 -0
  469. package/dist/shims/define-service.d.ts +46 -0
  470. package/dist/shims/define-service.d.ts.map +1 -0
  471. package/dist/shims/define-service.js +39 -0
  472. package/dist/shims/define-service.js.map +1 -0
  473. package/dist/stream-fn.d.ts +10 -0
  474. package/dist/stream-fn.d.ts.map +1 -0
  475. package/dist/stream-fn.js +17 -0
  476. package/dist/stream-fn.js.map +1 -0
  477. package/dist/types.d.ts +489 -0
  478. package/dist/types.d.ts.map +1 -0
  479. package/dist/types.js +2 -0
  480. package/dist/types.js.map +1 -0
  481. package/docs/telemetry-schema.md +383 -0
  482. package/package.json +99 -5
@@ -0,0 +1,411 @@
1
+ import { applyImmutable } from "@earendil-works/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 \"@earendil-works/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"]}
@@ -0,0 +1,49 @@
1
+ import type { Context } from "./context.ts";
2
+ import { type ExecutionEnv, type PromptTemplate } from "./types.ts";
3
+ export type PromptTemplateDiagnosticCode = "file_info_failed" | "list_failed" | "read_failed" | "parse_failed";
4
+ /** Warning produced while loading prompt templates. */
5
+ export interface PromptTemplateDiagnostic {
6
+ /** Diagnostic severity. Currently only warnings are emitted. */
7
+ type: "warning";
8
+ /** Stable diagnostic code. */
9
+ code: PromptTemplateDiagnosticCode;
10
+ /** Human-readable diagnostic message. */
11
+ message: string;
12
+ /** Path associated with the diagnostic. */
13
+ path: string;
14
+ }
15
+ /**
16
+ * Load prompt templates from one or more paths.
17
+ *
18
+ * Directory inputs load direct `.md` children non-recursively. File inputs load explicit `.md` files. Missing paths and
19
+ * non-markdown files are skipped. Read and parse failures are returned as diagnostics.
20
+ */
21
+ export declare function loadPromptTemplates(env: ExecutionEnv, paths: string | string[], context: Context): Promise<{
22
+ promptTemplates: PromptTemplate[];
23
+ diagnostics: PromptTemplateDiagnostic[];
24
+ }>;
25
+ /**
26
+ * Load prompt templates from source-tagged paths.
27
+ *
28
+ * Source values are preserved exactly and attached to every loaded prompt template and diagnostic. The agent package does
29
+ * not interpret source values; applications define their own provenance shape.
30
+ */
31
+ export declare function loadSourcedPromptTemplates<TSource, TPromptTemplate extends PromptTemplate = PromptTemplate>(env: ExecutionEnv, inputs: Array<{
32
+ path: string;
33
+ source: TSource;
34
+ }>, mapPromptTemplate: ((promptTemplate: PromptTemplate, source: TSource, context: Context) => TPromptTemplate) | undefined, context: Context): Promise<{
35
+ promptTemplates: Array<{
36
+ promptTemplate: TPromptTemplate;
37
+ source: TSource;
38
+ }>;
39
+ diagnostics: Array<PromptTemplateDiagnostic & {
40
+ source: TSource;
41
+ }>;
42
+ }>;
43
+ /** Parse an argument string using simple shell-style single and double quotes. */
44
+ export declare function parseCommandArgs(argsString: string): string[];
45
+ /** Substitute prompt template placeholders (`$1`, `$@`, `$ARGUMENTS`, `${@:N}`, `${@:N:L}`) with command arguments. */
46
+ export declare function substituteArgs(content: string, args: string[]): string;
47
+ /** Format a prompt template invocation with positional arguments. */
48
+ export declare function formatPromptTemplateInvocation(template: PromptTemplate, args?: string[]): string;
49
+ //# sourceMappingURL=prompt-templates.d.ts.map
@@ -0,0 +1 @@
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"}