@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
package/dist/proxy.js ADDED
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Proxy stream function for apps that route LLM calls through a server.
3
+ * The server manages auth and proxies requests to LLM providers.
4
+ */
5
+ // Internal import for JSON parsing utility
6
+ import { EventStream, parseStreamingJson, } from "@earendil-works/pi-ai";
7
+ // Create stream class matching ProxyMessageEventStream
8
+ class ProxyMessageEventStream extends EventStream {
9
+ constructor() {
10
+ super((event) => event.type === "done" || event.type === "error", (event) => {
11
+ if (event.type === "done")
12
+ return event.message;
13
+ if (event.type === "error")
14
+ return event.error;
15
+ throw new Error("Unexpected event type");
16
+ });
17
+ }
18
+ }
19
+ /**
20
+ * Stream function that proxies through a server instead of calling LLM providers directly.
21
+ * The server strips the partial field from delta events to reduce bandwidth.
22
+ * We reconstruct the partial message client-side.
23
+ *
24
+ * Use this as the `streamFn` option when creating an Agent that needs to go through a proxy.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const agent = new Agent({
29
+ * streamFn: (model, context, options) =>
30
+ * streamProxy(model, context, {
31
+ * ...options,
32
+ * authToken: await getAuthToken(),
33
+ * proxyUrl: "https://genai.example.com",
34
+ * }),
35
+ * });
36
+ * ```
37
+ */
38
+ function buildProxyRequestOptions(options) {
39
+ return {
40
+ temperature: options.temperature,
41
+ samplingParams: options.samplingParams,
42
+ maxTokens: options.maxTokens,
43
+ reasoning: options.reasoning,
44
+ cacheRetention: options.cacheRetention,
45
+ sessionId: options.sessionId,
46
+ headers: options.headers,
47
+ metadata: options.metadata,
48
+ transport: options.transport,
49
+ thinkingBudgets: options.thinkingBudgets,
50
+ maxRetryDelayMs: options.maxRetryDelayMs,
51
+ };
52
+ }
53
+ export function streamProxy(model, context, options) {
54
+ const stream = new ProxyMessageEventStream();
55
+ (async () => {
56
+ // Initialize the partial message that we'll build up from events
57
+ const partial = {
58
+ role: "assistant",
59
+ stopReason: "pending",
60
+ content: [],
61
+ api: model.api,
62
+ provider: model.provider,
63
+ model: model.id,
64
+ usage: {
65
+ input: 0,
66
+ output: 0,
67
+ cacheRead: 0,
68
+ cacheWrite: 0,
69
+ totalTokens: 0,
70
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
71
+ },
72
+ timestamp: Date.now(),
73
+ };
74
+ let reader;
75
+ const abortHandler = () => {
76
+ if (reader) {
77
+ reader.cancel("Request aborted by user").catch(() => { });
78
+ }
79
+ };
80
+ if (options.signal) {
81
+ options.signal.addEventListener("abort", abortHandler);
82
+ }
83
+ try {
84
+ const response = await fetch(`${options.proxyUrl}/api/stream`, {
85
+ method: "POST",
86
+ headers: {
87
+ Authorization: `Bearer ${options.authToken}`,
88
+ "Content-Type": "application/json",
89
+ },
90
+ body: JSON.stringify({
91
+ model,
92
+ context,
93
+ options: buildProxyRequestOptions(options),
94
+ }),
95
+ signal: options.signal,
96
+ });
97
+ if (!response.ok) {
98
+ let errorMessage = `Proxy error: ${response.status} ${response.statusText}`;
99
+ try {
100
+ const errorData = (await response.json());
101
+ if (errorData.error) {
102
+ errorMessage = `Proxy error: ${errorData.error}`;
103
+ }
104
+ }
105
+ catch {
106
+ // Couldn't parse error response
107
+ }
108
+ throw new Error(errorMessage);
109
+ }
110
+ reader = response.body.getReader();
111
+ const decoder = new TextDecoder();
112
+ let buffer = "";
113
+ let sawTerminalEvent = false;
114
+ const processLine = (line) => {
115
+ if (!line.startsWith("data: "))
116
+ return;
117
+ const data = line.slice(6).trim();
118
+ if (!data)
119
+ return;
120
+ const proxyEvent = JSON.parse(data);
121
+ const event = processProxyEvent(proxyEvent, partial);
122
+ if (event) {
123
+ if (event.type === "done" || event.type === "error")
124
+ sawTerminalEvent = true;
125
+ stream.push(event);
126
+ }
127
+ };
128
+ while (true) {
129
+ const { done, value } = await reader.read();
130
+ if (done)
131
+ break;
132
+ if (options.signal?.aborted) {
133
+ throw new Error("Request aborted by user");
134
+ }
135
+ buffer += decoder.decode(value, { stream: true });
136
+ const lines = buffer.split("\n");
137
+ buffer = lines.pop() || "";
138
+ for (const line of lines) {
139
+ processLine(line);
140
+ }
141
+ }
142
+ if (options.signal?.aborted) {
143
+ throw new Error("Request aborted by user");
144
+ }
145
+ // The final event may not be newline-terminated; flush the decoder and
146
+ // process whatever is left in the buffer.
147
+ buffer += decoder.decode();
148
+ if (buffer) {
149
+ processLine(buffer);
150
+ }
151
+ if (!sawTerminalEvent) {
152
+ // A clean EOF without a done/error event means the server dropped the
153
+ // response mid-stream. Surface it as an error instead of leaving
154
+ // consumers waiting on a result that never arrives.
155
+ partial.stopReason = "error";
156
+ partial.errorMessage = "Connection closed by proxy server before the response completed";
157
+ stream.push({
158
+ type: "error",
159
+ reason: "error",
160
+ error: partial,
161
+ });
162
+ }
163
+ stream.end();
164
+ }
165
+ catch (error) {
166
+ const errorMessage = error instanceof Error ? error.message : String(error);
167
+ const reason = options.signal?.aborted ? "aborted" : "error";
168
+ partial.stopReason = reason;
169
+ partial.errorMessage = errorMessage;
170
+ stream.push({
171
+ type: "error",
172
+ reason,
173
+ error: partial,
174
+ });
175
+ stream.end();
176
+ }
177
+ finally {
178
+ if (options.signal) {
179
+ options.signal.removeEventListener("abort", abortHandler);
180
+ }
181
+ }
182
+ })();
183
+ return stream;
184
+ }
185
+ /**
186
+ * Process a proxy event and update the partial message.
187
+ */
188
+ function processProxyEvent(proxyEvent, partial) {
189
+ switch (proxyEvent.type) {
190
+ case "start":
191
+ return { type: "start", partial };
192
+ case "text_start":
193
+ partial.content[proxyEvent.contentIndex] = { type: "text", text: "" };
194
+ return { type: "text_start", contentIndex: proxyEvent.contentIndex, partial };
195
+ case "text_delta": {
196
+ const content = partial.content[proxyEvent.contentIndex];
197
+ if (content?.type === "text") {
198
+ content.text += proxyEvent.delta;
199
+ return {
200
+ type: "text_delta",
201
+ contentIndex: proxyEvent.contentIndex,
202
+ delta: proxyEvent.delta,
203
+ partial,
204
+ };
205
+ }
206
+ throw new Error("Received text_delta for non-text content");
207
+ }
208
+ case "text_end": {
209
+ const content = partial.content[proxyEvent.contentIndex];
210
+ if (content?.type === "text") {
211
+ content.textSignature = proxyEvent.contentSignature;
212
+ return {
213
+ type: "text_end",
214
+ contentIndex: proxyEvent.contentIndex,
215
+ content: content.text,
216
+ partial,
217
+ };
218
+ }
219
+ throw new Error("Received text_end for non-text content");
220
+ }
221
+ case "thinking_start":
222
+ partial.content[proxyEvent.contentIndex] = { type: "thinking", thinking: "" };
223
+ return { type: "thinking_start", contentIndex: proxyEvent.contentIndex, partial };
224
+ case "thinking_delta": {
225
+ const content = partial.content[proxyEvent.contentIndex];
226
+ if (content?.type === "thinking") {
227
+ content.thinking += proxyEvent.delta;
228
+ return {
229
+ type: "thinking_delta",
230
+ contentIndex: proxyEvent.contentIndex,
231
+ delta: proxyEvent.delta,
232
+ partial,
233
+ };
234
+ }
235
+ throw new Error("Received thinking_delta for non-thinking content");
236
+ }
237
+ case "thinking_end": {
238
+ const content = partial.content[proxyEvent.contentIndex];
239
+ if (content?.type === "thinking") {
240
+ content.thinkingSignature = proxyEvent.contentSignature;
241
+ return {
242
+ type: "thinking_end",
243
+ contentIndex: proxyEvent.contentIndex,
244
+ content: content.thinking,
245
+ partial,
246
+ };
247
+ }
248
+ throw new Error("Received thinking_end for non-thinking content");
249
+ }
250
+ case "toolcall_start":
251
+ partial.content[proxyEvent.contentIndex] = {
252
+ type: "toolCall",
253
+ id: proxyEvent.id,
254
+ name: proxyEvent.toolName,
255
+ arguments: {},
256
+ partialJson: "",
257
+ };
258
+ return { type: "toolcall_start", contentIndex: proxyEvent.contentIndex, partial };
259
+ case "toolcall_delta": {
260
+ const content = partial.content[proxyEvent.contentIndex];
261
+ if (content?.type === "toolCall") {
262
+ content.partialJson += proxyEvent.delta;
263
+ content.arguments = parseStreamingJson(content.partialJson) || {};
264
+ partial.content[proxyEvent.contentIndex] = { ...content }; // Trigger reactivity
265
+ return {
266
+ type: "toolcall_delta",
267
+ contentIndex: proxyEvent.contentIndex,
268
+ delta: proxyEvent.delta,
269
+ partial,
270
+ };
271
+ }
272
+ throw new Error("Received toolcall_delta for non-toolCall content");
273
+ }
274
+ case "toolcall_end": {
275
+ const content = partial.content[proxyEvent.contentIndex];
276
+ if (content?.type === "toolCall") {
277
+ Object.assign(content, proxyEvent.toolCall);
278
+ delete content.partialJson;
279
+ return {
280
+ type: "toolcall_end",
281
+ contentIndex: proxyEvent.contentIndex,
282
+ toolCall: content,
283
+ partial,
284
+ };
285
+ }
286
+ return undefined;
287
+ }
288
+ case "done":
289
+ partial.stopReason = proxyEvent.reason;
290
+ partial.usage = proxyEvent.usage;
291
+ if (proxyEvent.providerThinkingLevel !== undefined) {
292
+ partial.providerThinkingLevel = proxyEvent.providerThinkingLevel;
293
+ }
294
+ return { type: "done", reason: proxyEvent.reason, message: partial };
295
+ case "error":
296
+ partial.stopReason = proxyEvent.reason;
297
+ partial.errorMessage = proxyEvent.errorMessage;
298
+ partial.usage = proxyEvent.usage;
299
+ if (proxyEvent.providerThinkingLevel !== undefined) {
300
+ partial.providerThinkingLevel = proxyEvent.providerThinkingLevel;
301
+ }
302
+ return { type: "error", reason: proxyEvent.reason, error: partial };
303
+ default: {
304
+ const _exhaustiveCheck = proxyEvent;
305
+ console.warn(`Unhandled proxy event type: ${proxyEvent.type}`);
306
+ return undefined;
307
+ }
308
+ }
309
+ }
310
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Proxy stream function for apps that route LLM calls through a server.\n * The server manages auth and proxies requests to LLM providers.\n */\n\n// Internal import for JSON parsing utility\nimport {\n\ttype AssistantMessage,\n\ttype AssistantMessageEvent,\n\tEventStream,\n\ttype Model,\n\tparseStreamingJson,\n\ttype SimpleStreamOptions,\n\ttype StopReason,\n\ttype ToolCall,\n\ttype TranscriptContext,\n} from \"@earendil-works/pi-ai\";\n\n// Create stream class matching ProxyMessageEventStream\nclass ProxyMessageEventStream extends EventStream<AssistantMessageEvent, AssistantMessage> {\n\tconstructor() {\n\t\tsuper(\n\t\t\t(event) => event.type === \"done\" || event.type === \"error\",\n\t\t\t(event) => {\n\t\t\t\tif (event.type === \"done\") return event.message;\n\t\t\t\tif (event.type === \"error\") return event.error;\n\t\t\t\tthrow new Error(\"Unexpected event type\");\n\t\t\t},\n\t\t);\n\t}\n}\n\n/**\n * Proxy event types - server sends these with partial field stripped to reduce bandwidth.\n */\nexport type ProxyAssistantMessageEvent =\n\t| { type: \"start\" }\n\t| { type: \"text_start\"; contentIndex: number }\n\t| { type: \"text_delta\"; contentIndex: number; delta: string }\n\t| { type: \"text_end\"; contentIndex: number; contentSignature?: string }\n\t| { type: \"thinking_start\"; contentIndex: number }\n\t| { type: \"thinking_delta\"; contentIndex: number; delta: string }\n\t| { type: \"thinking_end\"; contentIndex: number; contentSignature?: string }\n\t| { type: \"toolcall_start\"; contentIndex: number; id: string; toolName: string }\n\t| { type: \"toolcall_delta\"; contentIndex: number; delta: string }\n\t| { type: \"toolcall_end\"; contentIndex: number; toolCall: ToolCall }\n\t| {\n\t\t\ttype: \"done\";\n\t\t\treason: Extract<StopReason, \"stop\" | \"length\" | \"toolUse\">;\n\t\t\tusage: AssistantMessage[\"usage\"];\n\t\t\tproviderThinkingLevel?: string;\n\t }\n\t| {\n\t\t\ttype: \"error\";\n\t\t\treason: Extract<StopReason, \"aborted\" | \"error\">;\n\t\t\terrorMessage?: string;\n\t\t\tusage: AssistantMessage[\"usage\"];\n\t\t\tproviderThinkingLevel?: string;\n\t };\n\ntype ProxySerializableStreamOptions = Pick<\n\tSimpleStreamOptions,\n\t| \"temperature\"\n\t| \"samplingParams\"\n\t| \"maxTokens\"\n\t| \"reasoning\"\n\t| \"cacheRetention\"\n\t| \"sessionId\"\n\t| \"headers\"\n\t| \"metadata\"\n\t| \"transport\"\n\t| \"thinkingBudgets\"\n\t| \"maxRetryDelayMs\"\n>;\n\nexport interface ProxyStreamOptions extends ProxySerializableStreamOptions {\n\t/** Local abort signal for the proxy request */\n\tsignal?: AbortSignal;\n\t/** Auth token for the proxy server */\n\tauthToken: string;\n\t/** Proxy server URL (e.g., \"https://genai.example.com\") */\n\tproxyUrl: string;\n}\n\n/**\n * Stream function that proxies through a server instead of calling LLM providers directly.\n * The server strips the partial field from delta events to reduce bandwidth.\n * We reconstruct the partial message client-side.\n *\n * Use this as the `streamFn` option when creating an Agent that needs to go through a proxy.\n *\n * @example\n * ```typescript\n * const agent = new Agent({\n * streamFn: (model, context, options) =>\n * streamProxy(model, context, {\n * ...options,\n * authToken: await getAuthToken(),\n * proxyUrl: \"https://genai.example.com\",\n * }),\n * });\n * ```\n */\nfunction buildProxyRequestOptions(options: ProxyStreamOptions): ProxySerializableStreamOptions {\n\treturn {\n\t\ttemperature: options.temperature,\n\t\tsamplingParams: options.samplingParams,\n\t\tmaxTokens: options.maxTokens,\n\t\treasoning: options.reasoning,\n\t\tcacheRetention: options.cacheRetention,\n\t\tsessionId: options.sessionId,\n\t\theaders: options.headers,\n\t\tmetadata: options.metadata,\n\t\ttransport: options.transport,\n\t\tthinkingBudgets: options.thinkingBudgets,\n\t\tmaxRetryDelayMs: options.maxRetryDelayMs,\n\t};\n}\n\nexport function streamProxy(\n\tmodel: Model<any>,\n\tcontext: TranscriptContext,\n\toptions: ProxyStreamOptions,\n): ProxyMessageEventStream {\n\tconst stream = new ProxyMessageEventStream();\n\n\t(async () => {\n\t\t// Initialize the partial message that we'll build up from events\n\t\tconst partial: AssistantMessage = {\n\t\t\trole: \"assistant\",\n\t\t\tstopReason: \"pending\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\n\t\tlet reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n\n\t\tconst abortHandler = () => {\n\t\t\tif (reader) {\n\t\t\t\treader.cancel(\"Request aborted by user\").catch(() => {});\n\t\t\t}\n\t\t};\n\n\t\tif (options.signal) {\n\t\t\toptions.signal.addEventListener(\"abort\", abortHandler);\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await fetch(`${options.proxyUrl}/api/stream`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${options.authToken}`,\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tmodel,\n\t\t\t\t\tcontext,\n\t\t\t\t\toptions: buildProxyRequestOptions(options),\n\t\t\t\t}),\n\t\t\t\tsignal: options.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `Proxy error: ${response.status} ${response.statusText}`;\n\t\t\t\ttry {\n\t\t\t\t\tconst errorData = (await response.json()) as { error?: string };\n\t\t\t\t\tif (errorData.error) {\n\t\t\t\t\t\terrorMessage = `Proxy error: ${errorData.error}`;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Couldn't parse error response\n\t\t\t\t}\n\t\t\t\tthrow new Error(errorMessage);\n\t\t\t}\n\n\t\t\treader = response.body!.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\tlet buffer = \"\";\n\t\t\tlet sawTerminalEvent = false;\n\n\t\t\tconst processLine = (line: string): void => {\n\t\t\t\tif (!line.startsWith(\"data: \")) return;\n\t\t\t\tconst data = line.slice(6).trim();\n\t\t\t\tif (!data) return;\n\t\t\t\tconst proxyEvent = JSON.parse(data) as ProxyAssistantMessageEvent;\n\t\t\t\tconst event = processProxyEvent(proxyEvent, partial);\n\t\t\t\tif (event) {\n\t\t\t\t\tif (event.type === \"done\" || event.type === \"error\") sawTerminalEvent = true;\n\t\t\t\t\tstream.push(event);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\n\t\t\t\tif (options.signal?.aborted) {\n\t\t\t\t\tthrow new Error(\"Request aborted by user\");\n\t\t\t\t}\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\t\tbuffer = lines.pop() || \"\";\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tprocessLine(line);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options.signal?.aborted) {\n\t\t\t\tthrow new Error(\"Request aborted by user\");\n\t\t\t}\n\n\t\t\t// The final event may not be newline-terminated; flush the decoder and\n\t\t\t// process whatever is left in the buffer.\n\t\t\tbuffer += decoder.decode();\n\t\t\tif (buffer) {\n\t\t\t\tprocessLine(buffer);\n\t\t\t}\n\n\t\t\tif (!sawTerminalEvent) {\n\t\t\t\t// A clean EOF without a done/error event means the server dropped the\n\t\t\t\t// response mid-stream. Surface it as an error instead of leaving\n\t\t\t\t// consumers waiting on a result that never arrives.\n\t\t\t\tpartial.stopReason = \"error\";\n\t\t\t\tpartial.errorMessage = \"Connection closed by proxy server before the response completed\";\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\treason: \"error\",\n\t\t\t\t\terror: partial,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\tconst reason = options.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\tpartial.stopReason = reason;\n\t\t\tpartial.errorMessage = errorMessage;\n\t\t\tstream.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\treason,\n\t\t\t\terror: partial,\n\t\t\t});\n\t\t\tstream.end();\n\t\t} finally {\n\t\t\tif (options.signal) {\n\t\t\t\toptions.signal.removeEventListener(\"abort\", abortHandler);\n\t\t\t}\n\t\t}\n\t})();\n\n\treturn stream;\n}\n\n/**\n * Process a proxy event and update the partial message.\n */\nfunction processProxyEvent(\n\tproxyEvent: ProxyAssistantMessageEvent,\n\tpartial: AssistantMessage,\n): AssistantMessageEvent | undefined {\n\tswitch (proxyEvent.type) {\n\t\tcase \"start\":\n\t\t\treturn { type: \"start\", partial };\n\n\t\tcase \"text_start\":\n\t\t\tpartial.content[proxyEvent.contentIndex] = { type: \"text\", text: \"\" };\n\t\t\treturn { type: \"text_start\", contentIndex: proxyEvent.contentIndex, partial };\n\n\t\tcase \"text_delta\": {\n\t\t\tconst content = partial.content[proxyEvent.contentIndex];\n\t\t\tif (content?.type === \"text\") {\n\t\t\t\tcontent.text += proxyEvent.delta;\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"text_delta\",\n\t\t\t\t\tcontentIndex: proxyEvent.contentIndex,\n\t\t\t\t\tdelta: proxyEvent.delta,\n\t\t\t\t\tpartial,\n\t\t\t\t};\n\t\t\t}\n\t\t\tthrow new Error(\"Received text_delta for non-text content\");\n\t\t}\n\n\t\tcase \"text_end\": {\n\t\t\tconst content = partial.content[proxyEvent.contentIndex];\n\t\t\tif (content?.type === \"text\") {\n\t\t\t\tcontent.textSignature = proxyEvent.contentSignature;\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"text_end\",\n\t\t\t\t\tcontentIndex: proxyEvent.contentIndex,\n\t\t\t\t\tcontent: content.text,\n\t\t\t\t\tpartial,\n\t\t\t\t};\n\t\t\t}\n\t\t\tthrow new Error(\"Received text_end for non-text content\");\n\t\t}\n\n\t\tcase \"thinking_start\":\n\t\t\tpartial.content[proxyEvent.contentIndex] = { type: \"thinking\", thinking: \"\" };\n\t\t\treturn { type: \"thinking_start\", contentIndex: proxyEvent.contentIndex, partial };\n\n\t\tcase \"thinking_delta\": {\n\t\t\tconst content = partial.content[proxyEvent.contentIndex];\n\t\t\tif (content?.type === \"thinking\") {\n\t\t\t\tcontent.thinking += proxyEvent.delta;\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"thinking_delta\",\n\t\t\t\t\tcontentIndex: proxyEvent.contentIndex,\n\t\t\t\t\tdelta: proxyEvent.delta,\n\t\t\t\t\tpartial,\n\t\t\t\t};\n\t\t\t}\n\t\t\tthrow new Error(\"Received thinking_delta for non-thinking content\");\n\t\t}\n\n\t\tcase \"thinking_end\": {\n\t\t\tconst content = partial.content[proxyEvent.contentIndex];\n\t\t\tif (content?.type === \"thinking\") {\n\t\t\t\tcontent.thinkingSignature = proxyEvent.contentSignature;\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"thinking_end\",\n\t\t\t\t\tcontentIndex: proxyEvent.contentIndex,\n\t\t\t\t\tcontent: content.thinking,\n\t\t\t\t\tpartial,\n\t\t\t\t};\n\t\t\t}\n\t\t\tthrow new Error(\"Received thinking_end for non-thinking content\");\n\t\t}\n\n\t\tcase \"toolcall_start\":\n\t\t\tpartial.content[proxyEvent.contentIndex] = {\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tid: proxyEvent.id,\n\t\t\t\tname: proxyEvent.toolName,\n\t\t\t\targuments: {},\n\t\t\t\tpartialJson: \"\",\n\t\t\t} satisfies ToolCall & { partialJson: string } as ToolCall;\n\t\t\treturn { type: \"toolcall_start\", contentIndex: proxyEvent.contentIndex, partial };\n\n\t\tcase \"toolcall_delta\": {\n\t\t\tconst content = partial.content[proxyEvent.contentIndex];\n\t\t\tif (content?.type === \"toolCall\") {\n\t\t\t\t(content as any).partialJson += proxyEvent.delta;\n\t\t\t\tcontent.arguments = parseStreamingJson((content as any).partialJson) || {};\n\t\t\t\tpartial.content[proxyEvent.contentIndex] = { ...content }; // Trigger reactivity\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\tcontentIndex: proxyEvent.contentIndex,\n\t\t\t\t\tdelta: proxyEvent.delta,\n\t\t\t\t\tpartial,\n\t\t\t\t};\n\t\t\t}\n\t\t\tthrow new Error(\"Received toolcall_delta for non-toolCall content\");\n\t\t}\n\n\t\tcase \"toolcall_end\": {\n\t\t\tconst content = partial.content[proxyEvent.contentIndex];\n\t\t\tif (content?.type === \"toolCall\") {\n\t\t\t\tObject.assign(content, proxyEvent.toolCall);\n\t\t\t\tdelete (content as any).partialJson;\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\tcontentIndex: proxyEvent.contentIndex,\n\t\t\t\t\ttoolCall: content,\n\t\t\t\t\tpartial,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcase \"done\":\n\t\t\tpartial.stopReason = proxyEvent.reason;\n\t\t\tpartial.usage = proxyEvent.usage;\n\t\t\tif (proxyEvent.providerThinkingLevel !== undefined) {\n\t\t\t\tpartial.providerThinkingLevel = proxyEvent.providerThinkingLevel;\n\t\t\t}\n\t\t\treturn { type: \"done\", reason: proxyEvent.reason, message: partial };\n\n\t\tcase \"error\":\n\t\t\tpartial.stopReason = proxyEvent.reason;\n\t\t\tpartial.errorMessage = proxyEvent.errorMessage;\n\t\t\tpartial.usage = proxyEvent.usage;\n\t\t\tif (proxyEvent.providerThinkingLevel !== undefined) {\n\t\t\t\tpartial.providerThinkingLevel = proxyEvent.providerThinkingLevel;\n\t\t\t}\n\t\t\treturn { type: \"error\", reason: proxyEvent.reason, error: partial };\n\n\t\tdefault: {\n\t\t\tconst _exhaustiveCheck: never = proxyEvent;\n\t\t\tconsole.warn(`Unhandled proxy event type: ${(proxyEvent as any).type}`);\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,29 @@
1
+ export interface SearchQuery {
2
+ text: string;
3
+ limit?: number;
4
+ }
5
+ export interface SessionSearchHit {
6
+ sessionId: string;
7
+ score?: number;
8
+ top?: {
9
+ entryId: string;
10
+ snippet?: string;
11
+ timestamp: number;
12
+ };
13
+ }
14
+ export interface EntrySearchHit {
15
+ sessionId: string;
16
+ entryId: string;
17
+ timestamp: number;
18
+ snippet?: string;
19
+ score?: number;
20
+ }
21
+ export interface SessionSearchService {
22
+ searchSessions(query: SearchQuery): Promise<SessionSearchHit[]>;
23
+ searchEntries?(query: SearchQuery): Promise<EntrySearchHit[]>;
24
+ sync(): Promise<void>;
25
+ notify(sessionId: string): void;
26
+ remove(sessionId: string): Promise<void>;
27
+ close(): Promise<void>;
28
+ }
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACpC,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAChE,aAAa,CAAC,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"","sourcesContent":["export interface SearchQuery {\n\ttext: string;\n\tlimit?: number;\n}\n\nexport interface SessionSearchHit {\n\tsessionId: string;\n\tscore?: number;\n\ttop?: { entryId: string; snippet?: string; timestamp: number };\n}\n\nexport interface EntrySearchHit {\n\tsessionId: string;\n\tentryId: string;\n\ttimestamp: number;\n\tsnippet?: string;\n\tscore?: number;\n}\n\nexport interface SessionSearchService {\n\tsearchSessions(query: SearchQuery): Promise<SessionSearchHit[]>;\n\tsearchEntries?(query: SearchQuery): Promise<EntrySearchHit[]>;\n\tsync(): Promise<void>;\n\tnotify(sessionId: string): void;\n\tremove(sessionId: string): Promise<void>;\n\tclose(): Promise<void>;\n}\n"]}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Vendored copy of the `pi-ai` assistant-message frame API.
3
+ *
4
+ * Upstream removed `AssistantMessageFrame`, `AssistantMessageFrameEncoder` and
5
+ * `reduceAssistantMessageFrames` in `pi-ai@1.3.0` ("remove unused assistant-message
6
+ * frame API"); the changelog notes they only served the experimental agent harness
7
+ * that Pi 1.0 deleted. This harness still needs them, so they live here rather than
8
+ * pinning the whole package to an old `pi-ai`.
9
+ *
10
+ * Extracted verbatim from `earendil-works/pi@0.99.2`
11
+ * `packages/ai/src/utils/assistant-message-frame.ts`. Only the imports changed: the
12
+ * content types now come from `@earendil-works/pi-ai` itself, and `parseStreamingJson`
13
+ * is imported from the published package instead of a sibling file (it still ships in
14
+ * `pi-ai@1.3.0`).
15
+ *
16
+ * Do not "fix up" this file to track upstream. It is deliberately frozen so that frames
17
+ * written by this package stay byte-compatible with 0.99.2 sessions.
18
+ *
19
+ * Known gap: `pi-ai@1.3.0` added `ToolCall.argumentsError` (set when a finished call's
20
+ * arguments are not a JSON object). Frames predate it, so `toolcall_end` and
21
+ * `cloneToolCall` drop it. Live turns are unaffected: they settle from the stream's final
22
+ * message. Only a message rebuilt from persisted frames after an interruption loses it, and
23
+ * that message is always settled with `stopReason: "error"`.
24
+ */
25
+ import type { AssistantMessage, AssistantMessageEvent, TextContent, ThinkingContent, ToolCall } from "@earendil-works/pi-ai";
26
+ /**
27
+ * Compact, replayable assistant-message progress. Terminal settlement is
28
+ * intentionally excluded and must be persisted separately.
29
+ */
30
+ export type AssistantMessageFrame = {
31
+ type: "start";
32
+ partial: AssistantMessage;
33
+ } | {
34
+ type: "text_start";
35
+ contentIndex: number;
36
+ content: TextContent;
37
+ } | {
38
+ type: "text_delta";
39
+ contentIndex: number;
40
+ delta: string;
41
+ } | {
42
+ type: "text_end";
43
+ contentIndex: number;
44
+ content: string;
45
+ textSignature?: string;
46
+ } | {
47
+ type: "thinking_start";
48
+ contentIndex: number;
49
+ content: ThinkingContent;
50
+ } | {
51
+ type: "thinking_delta";
52
+ contentIndex: number;
53
+ delta: string;
54
+ } | {
55
+ type: "thinking_end";
56
+ contentIndex: number;
57
+ content: string;
58
+ thinkingSignature?: string;
59
+ redacted?: boolean;
60
+ } | {
61
+ type: "toolcall_start";
62
+ contentIndex: number;
63
+ toolCall: ToolCall;
64
+ } | {
65
+ type: "toolcall_checkpoint";
66
+ contentIndex: number;
67
+ json: string;
68
+ } | {
69
+ type: "toolcall_delta";
70
+ contentIndex: number;
71
+ delta: string;
72
+ } | {
73
+ type: "toolcall_end";
74
+ contentIndex: number;
75
+ id: string;
76
+ name: string;
77
+ arguments: ToolCall["arguments"];
78
+ thoughtSignature?: string;
79
+ namespace?: string;
80
+ };
81
+ /**
82
+ * Encodes one assistant stream. `partial` remains a shared live accumulator;
83
+ * the encoder uses per-block offsets to avoid replaying deltas already visible
84
+ * when an older queued event is consumed.
85
+ */
86
+ export declare class AssistantMessageFrameEncoder {
87
+ private started;
88
+ private terminal;
89
+ private readonly blocks;
90
+ encode(event: AssistantMessageEvent): AssistantMessageFrame | undefined;
91
+ private startBlock;
92
+ private block;
93
+ private endBlock;
94
+ private encodeTextDelta;
95
+ }
96
+ /**
97
+ * Replay compact frames without mutating them. Returns `undefined` when the
98
+ * iterable contains no start frame.
99
+ */
100
+ export declare function reduceAssistantMessageFrames(frames: Iterable<AssistantMessageFrame>): AssistantMessage | undefined;
101
+ //# sourceMappingURL=assistant-message-frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant-message-frame.d.ts","sourceRoot":"","sources":["../../src/shims/assistant-message-frame.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EACX,gBAAgB,EAChB,qBAAqB,EACrB,WAAW,EACX,eAAe,EACf,QAAQ,EACR,MAAM,uBAAuB,CAAC;AAG/B;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CAClB,GACD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/D;IACA,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAqGL;;;;GAIG;AACH,qBAAa,4BAA4B;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAE/D,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,qBAAqB,GAAG,SAAS,CA6ItE;IAED,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,eAAe;CAgBvB;AA0CD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,gBAAgB,GAAG,SAAS,CAsHlH"}