@elizaos/plugin-training 2.0.3-beta.5 → 2.0.3-beta.7

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 (363) hide show
  1. package/dist/backends/native.d.ts +96 -0
  2. package/dist/backends/native.d.ts.map +1 -0
  3. package/dist/backends/native.js +308 -0
  4. package/dist/backends/native.js.map +1 -0
  5. package/dist/cli/train.d.ts +22 -0
  6. package/dist/cli/train.d.ts.map +1 -0
  7. package/dist/cli/train.js +219 -0
  8. package/dist/cli/train.js.map +1 -0
  9. package/dist/core/action-benchmark-runner.d.ts +55 -0
  10. package/dist/core/action-benchmark-runner.d.ts.map +1 -0
  11. package/dist/core/action-benchmark-runner.js +341 -0
  12. package/dist/core/action-benchmark-runner.js.map +1 -0
  13. package/dist/core/artifact-store.d.ts +72 -0
  14. package/dist/core/artifact-store.d.ts.map +1 -0
  15. package/dist/core/artifact-store.js +50 -0
  16. package/dist/core/artifact-store.js.map +1 -0
  17. package/dist/core/benchmark-matrix-artifact.d.ts +102 -0
  18. package/dist/core/benchmark-matrix-artifact.d.ts.map +1 -0
  19. package/dist/core/benchmark-matrix-artifact.js +381 -0
  20. package/dist/core/benchmark-matrix-artifact.js.map +1 -0
  21. package/dist/core/benchmark-vs-cerebras-runner.d.ts +37 -0
  22. package/dist/core/benchmark-vs-cerebras-runner.d.ts.map +1 -0
  23. package/dist/core/benchmark-vs-cerebras-runner.js +151 -0
  24. package/dist/core/benchmark-vs-cerebras-runner.js.map +1 -0
  25. package/dist/core/cerebras-eval-model.d.ts +54 -0
  26. package/dist/core/cerebras-eval-model.d.ts.map +1 -0
  27. package/dist/core/cerebras-eval-model.js +249 -0
  28. package/dist/core/cerebras-eval-model.js.map +1 -0
  29. package/dist/core/cli.d.ts +15 -0
  30. package/dist/core/cli.d.ts.map +1 -0
  31. package/dist/core/cli.js +1003 -0
  32. package/dist/core/cli.js.map +1 -0
  33. package/dist/core/context-audit.d.ts +51 -0
  34. package/dist/core/context-audit.d.ts.map +1 -0
  35. package/dist/core/context-audit.js +166 -0
  36. package/dist/core/context-audit.js.map +1 -0
  37. package/dist/core/context-catalog.d.ts +47 -0
  38. package/dist/core/context-catalog.d.ts.map +1 -0
  39. package/dist/core/context-catalog.js +269 -0
  40. package/dist/core/context-catalog.js.map +1 -0
  41. package/dist/core/context-types.d.ts +3 -0
  42. package/dist/core/context-types.d.ts.map +1 -0
  43. package/dist/core/context-types.js +18 -0
  44. package/dist/core/context-types.js.map +1 -0
  45. package/dist/core/dataset-generator.d.ts +135 -0
  46. package/dist/core/dataset-generator.d.ts.map +1 -0
  47. package/dist/core/dataset-generator.js +895 -0
  48. package/dist/core/dataset-generator.js.map +1 -0
  49. package/dist/core/eliza1-benchmark-recipe.d.ts +18 -0
  50. package/dist/core/eliza1-benchmark-recipe.d.ts.map +1 -0
  51. package/dist/core/eliza1-benchmark-recipe.js +64 -0
  52. package/dist/core/eliza1-benchmark-recipe.js.map +1 -0
  53. package/dist/core/eliza1-bundle-stager.d.ts +57 -0
  54. package/dist/core/eliza1-bundle-stager.d.ts.map +1 -0
  55. package/dist/core/eliza1-bundle-stager.js +149 -0
  56. package/dist/core/eliza1-bundle-stager.js.map +1 -0
  57. package/dist/core/ensure-cron-job.d.ts +53 -0
  58. package/dist/core/ensure-cron-job.d.ts.map +1 -0
  59. package/dist/core/ensure-cron-job.js +51 -0
  60. package/dist/core/ensure-cron-job.js.map +1 -0
  61. package/dist/core/eval-comparison-artifact.d.ts +72 -0
  62. package/dist/core/eval-comparison-artifact.d.ts.map +1 -0
  63. package/dist/core/eval-comparison-artifact.js +281 -0
  64. package/dist/core/eval-comparison-artifact.js.map +1 -0
  65. package/dist/core/feed-generation-runner.d.ts +37 -0
  66. package/dist/core/feed-generation-runner.d.ts.map +1 -0
  67. package/dist/core/feed-generation-runner.js +232 -0
  68. package/dist/core/feed-generation-runner.js.map +1 -0
  69. package/dist/core/html-escape.d.ts +5 -0
  70. package/dist/core/html-escape.d.ts.map +1 -0
  71. package/dist/core/html-escape.js +11 -0
  72. package/dist/core/html-escape.js.map +1 -0
  73. package/dist/core/huggingface-dataset-ingest.d.ts +52 -0
  74. package/dist/core/huggingface-dataset-ingest.d.ts.map +1 -0
  75. package/dist/core/huggingface-dataset-ingest.js +134 -0
  76. package/dist/core/huggingface-dataset-ingest.js.map +1 -0
  77. package/dist/core/index.d.ts +29 -0
  78. package/dist/core/index.d.ts.map +1 -0
  79. package/dist/core/index.js +204 -0
  80. package/dist/core/index.js.map +1 -0
  81. package/dist/core/privacy-filter.d.ts +95 -0
  82. package/dist/core/privacy-filter.d.ts.map +1 -0
  83. package/dist/core/privacy-filter.js +324 -0
  84. package/dist/core/privacy-filter.js.map +1 -0
  85. package/dist/core/promotion-gate.d.ts +117 -0
  86. package/dist/core/promotion-gate.d.ts.map +1 -0
  87. package/dist/core/promotion-gate.js +85 -0
  88. package/dist/core/promotion-gate.js.map +1 -0
  89. package/dist/core/promotion-persist.d.ts +116 -0
  90. package/dist/core/promotion-persist.d.ts.map +1 -0
  91. package/dist/core/promotion-persist.js +93 -0
  92. package/dist/core/promotion-persist.js.map +1 -0
  93. package/dist/core/prompt-compare.d.ts +99 -0
  94. package/dist/core/prompt-compare.d.ts.map +1 -0
  95. package/dist/core/prompt-compare.js +210 -0
  96. package/dist/core/prompt-compare.js.map +1 -0
  97. package/dist/core/replay-validator.d.ts +136 -0
  98. package/dist/core/replay-validator.d.ts.map +1 -0
  99. package/dist/core/replay-validator.js +312 -0
  100. package/dist/core/replay-validator.js.map +1 -0
  101. package/dist/core/roleplay-executor.d.ts +123 -0
  102. package/dist/core/roleplay-executor.d.ts.map +1 -0
  103. package/dist/core/roleplay-executor.js +675 -0
  104. package/dist/core/roleplay-executor.js.map +1 -0
  105. package/dist/core/roleplay-trajectories.d.ts +54 -0
  106. package/dist/core/roleplay-trajectories.d.ts.map +1 -0
  107. package/dist/core/roleplay-trajectories.js +88 -0
  108. package/dist/core/roleplay-trajectories.js.map +1 -0
  109. package/dist/core/scenario-blueprints.d.ts +62 -0
  110. package/dist/core/scenario-blueprints.d.ts.map +1 -0
  111. package/dist/core/scenario-blueprints.js +850 -0
  112. package/dist/core/scenario-blueprints.js.map +1 -0
  113. package/dist/core/scenario-runner.d.ts +36 -0
  114. package/dist/core/scenario-runner.d.ts.map +1 -0
  115. package/dist/core/scenario-runner.js +216 -0
  116. package/dist/core/scenario-runner.js.map +1 -0
  117. package/dist/core/skill-scoring-cron.d.ts +57 -0
  118. package/dist/core/skill-scoring-cron.d.ts.map +1 -0
  119. package/dist/core/skill-scoring-cron.js +180 -0
  120. package/dist/core/skill-scoring-cron.js.map +1 -0
  121. package/dist/core/test-trajectory-collector.d.ts +37 -0
  122. package/dist/core/test-trajectory-collector.d.ts.map +1 -0
  123. package/dist/core/test-trajectory-collector.js +225 -0
  124. package/dist/core/test-trajectory-collector.js.map +1 -0
  125. package/dist/core/track-c-queue-task.d.ts +37 -0
  126. package/dist/core/track-c-queue-task.d.ts.map +1 -0
  127. package/dist/core/track-c-queue-task.js +104 -0
  128. package/dist/core/track-c-queue-task.js.map +1 -0
  129. package/dist/core/training-analysis-index.d.ts +104 -0
  130. package/dist/core/training-analysis-index.d.ts.map +1 -0
  131. package/dist/core/training-analysis-index.js +3297 -0
  132. package/dist/core/training-analysis-index.js.map +1 -0
  133. package/dist/core/training-collection-runner.d.ts +508 -0
  134. package/dist/core/training-collection-runner.d.ts.map +1 -0
  135. package/dist/core/training-collection-runner.js +2299 -0
  136. package/dist/core/training-collection-runner.js.map +1 -0
  137. package/dist/core/training-config.d.ts +52 -0
  138. package/dist/core/training-config.d.ts.map +1 -0
  139. package/dist/core/training-config.js +117 -0
  140. package/dist/core/training-config.js.map +1 -0
  141. package/dist/core/training-orchestrator.d.ts +112 -0
  142. package/dist/core/training-orchestrator.d.ts.map +1 -0
  143. package/dist/core/training-orchestrator.js +729 -0
  144. package/dist/core/training-orchestrator.js.map +1 -0
  145. package/dist/core/training-readiness-report.d.ts +52 -0
  146. package/dist/core/training-readiness-report.d.ts.map +1 -0
  147. package/dist/core/training-readiness-report.js +765 -0
  148. package/dist/core/training-readiness-report.js.map +1 -0
  149. package/dist/core/trajectory-consumer.d.ts +15 -0
  150. package/dist/core/trajectory-consumer.d.ts.map +1 -0
  151. package/dist/core/trajectory-consumer.js +61 -0
  152. package/dist/core/trajectory-consumer.js.map +1 -0
  153. package/dist/core/trajectory-export-bundle.d.ts +95 -0
  154. package/dist/core/trajectory-export-bundle.d.ts.map +1 -0
  155. package/dist/core/trajectory-export-bundle.js +561 -0
  156. package/dist/core/trajectory-export-bundle.js.map +1 -0
  157. package/dist/core/trajectory-export-cron.d.ts +57 -0
  158. package/dist/core/trajectory-export-cron.d.ts.map +1 -0
  159. package/dist/core/trajectory-export-cron.js +170 -0
  160. package/dist/core/trajectory-export-cron.js.map +1 -0
  161. package/dist/core/trajectory-hf-upload.d.ts +50 -0
  162. package/dist/core/trajectory-hf-upload.d.ts.map +1 -0
  163. package/dist/core/trajectory-hf-upload.js +111 -0
  164. package/dist/core/trajectory-hf-upload.js.map +1 -0
  165. package/dist/core/trajectory-task-datasets.d.ts +62 -0
  166. package/dist/core/trajectory-task-datasets.d.ts.map +1 -0
  167. package/dist/core/trajectory-task-datasets.js +427 -0
  168. package/dist/core/trajectory-task-datasets.js.map +1 -0
  169. package/dist/core/wait-for-service.d.ts +25 -0
  170. package/dist/core/wait-for-service.d.ts.map +1 -0
  171. package/dist/core/wait-for-service.js +19 -0
  172. package/dist/core/wait-for-service.js.map +1 -0
  173. package/dist/core/workspace-runtime.d.ts +4 -0
  174. package/dist/core/workspace-runtime.d.ts.map +1 -0
  175. package/dist/core/workspace-runtime.js +25 -0
  176. package/dist/core/workspace-runtime.js.map +1 -0
  177. package/dist/dspy/artifact.d.ts +54 -0
  178. package/dist/dspy/artifact.d.ts.map +1 -0
  179. package/dist/dspy/artifact.js +61 -0
  180. package/dist/dspy/artifact.js.map +1 -0
  181. package/dist/dspy/chain-of-thought.d.ts +27 -0
  182. package/dist/dspy/chain-of-thought.d.ts.map +1 -0
  183. package/dist/dspy/chain-of-thought.js +43 -0
  184. package/dist/dspy/chain-of-thought.js.map +1 -0
  185. package/dist/dspy/examples.d.ts +72 -0
  186. package/dist/dspy/examples.d.ts.map +1 -0
  187. package/dist/dspy/examples.js +105 -0
  188. package/dist/dspy/examples.js.map +1 -0
  189. package/dist/dspy/index.d.ts +15 -0
  190. package/dist/dspy/index.d.ts.map +1 -0
  191. package/dist/dspy/index.js +40 -0
  192. package/dist/dspy/index.js.map +1 -0
  193. package/dist/dspy/lm-adapter.d.ts +100 -0
  194. package/dist/dspy/lm-adapter.d.ts.map +1 -0
  195. package/dist/dspy/lm-adapter.js +81 -0
  196. package/dist/dspy/lm-adapter.js.map +1 -0
  197. package/dist/dspy/optimizers/dspy-bootstrap-fewshot.d.ts +23 -0
  198. package/dist/dspy/optimizers/dspy-bootstrap-fewshot.d.ts.map +1 -0
  199. package/dist/dspy/optimizers/dspy-bootstrap-fewshot.js +85 -0
  200. package/dist/dspy/optimizers/dspy-bootstrap-fewshot.js.map +1 -0
  201. package/dist/dspy/optimizers/dspy-copro.d.ts +29 -0
  202. package/dist/dspy/optimizers/dspy-copro.d.ts.map +1 -0
  203. package/dist/dspy/optimizers/dspy-copro.js +141 -0
  204. package/dist/dspy/optimizers/dspy-copro.js.map +1 -0
  205. package/dist/dspy/optimizers/dspy-mipro.d.ts +37 -0
  206. package/dist/dspy/optimizers/dspy-mipro.d.ts.map +1 -0
  207. package/dist/dspy/optimizers/dspy-mipro.js +194 -0
  208. package/dist/dspy/optimizers/dspy-mipro.js.map +1 -0
  209. package/dist/dspy/optimizers/index.d.ts +5 -0
  210. package/dist/dspy/optimizers/index.d.ts.map +1 -0
  211. package/dist/dspy/optimizers/index.js +11 -0
  212. package/dist/dspy/optimizers/index.js.map +1 -0
  213. package/dist/dspy/optimizers/types.d.ts +39 -0
  214. package/dist/dspy/optimizers/types.d.ts.map +1 -0
  215. package/dist/dspy/optimizers/types.js +1 -0
  216. package/dist/dspy/optimizers/types.js.map +1 -0
  217. package/dist/dspy/predict.d.ts +49 -0
  218. package/dist/dspy/predict.d.ts.map +1 -0
  219. package/dist/dspy/predict.js +73 -0
  220. package/dist/dspy/predict.js.map +1 -0
  221. package/dist/dspy/signature.d.ts +88 -0
  222. package/dist/dspy/signature.d.ts.map +1 -0
  223. package/dist/dspy/signature.js +205 -0
  224. package/dist/dspy/signature.js.map +1 -0
  225. package/dist/index.d.ts +15 -0
  226. package/dist/index.d.ts.map +1 -0
  227. package/dist/index.js +15 -0
  228. package/dist/index.js.map +1 -0
  229. package/dist/optimizers/bootstrap-fewshot.d.ts +42 -0
  230. package/dist/optimizers/bootstrap-fewshot.d.ts.map +1 -0
  231. package/dist/optimizers/bootstrap-fewshot.js +92 -0
  232. package/dist/optimizers/bootstrap-fewshot.js.map +1 -0
  233. package/dist/optimizers/gepa.d.ts +63 -0
  234. package/dist/optimizers/gepa.d.ts.map +1 -0
  235. package/dist/optimizers/gepa.js +232 -0
  236. package/dist/optimizers/gepa.js.map +1 -0
  237. package/dist/optimizers/index.d.ts +7 -0
  238. package/dist/optimizers/index.d.ts.map +1 -0
  239. package/dist/optimizers/index.js +51 -0
  240. package/dist/optimizers/index.js.map +1 -0
  241. package/dist/optimizers/instruction-search.d.ts +39 -0
  242. package/dist/optimizers/instruction-search.d.ts.map +1 -0
  243. package/dist/optimizers/instruction-search.js +108 -0
  244. package/dist/optimizers/instruction-search.js.map +1 -0
  245. package/dist/optimizers/prompt-evolution.d.ts +39 -0
  246. package/dist/optimizers/prompt-evolution.d.ts.map +1 -0
  247. package/dist/optimizers/prompt-evolution.js +101 -0
  248. package/dist/optimizers/prompt-evolution.js.map +1 -0
  249. package/dist/optimizers/scoring.d.ts +139 -0
  250. package/dist/optimizers/scoring.d.ts.map +1 -0
  251. package/dist/optimizers/scoring.js +299 -0
  252. package/dist/optimizers/scoring.js.map +1 -0
  253. package/dist/optimizers/types.d.ts +105 -0
  254. package/dist/optimizers/types.d.ts.map +1 -0
  255. package/dist/optimizers/types.js +1 -0
  256. package/dist/optimizers/types.js.map +1 -0
  257. package/dist/register-runtime.d.ts +3 -0
  258. package/dist/register-runtime.d.ts.map +1 -0
  259. package/dist/register-runtime.js +60 -0
  260. package/dist/register-runtime.js.map +1 -0
  261. package/dist/register-terminal-view.d.ts +15 -0
  262. package/dist/register-terminal-view.d.ts.map +1 -0
  263. package/dist/register-terminal-view.js +31 -0
  264. package/dist/register-terminal-view.js.map +1 -0
  265. package/dist/routes/experience-routes.d.ts +21 -0
  266. package/dist/routes/experience-routes.d.ts.map +1 -0
  267. package/dist/routes/experience-routes.js +513 -0
  268. package/dist/routes/experience-routes.js.map +1 -0
  269. package/dist/routes/index.d.ts +5 -0
  270. package/dist/routes/index.d.ts.map +1 -0
  271. package/dist/routes/index.js +17 -0
  272. package/dist/routes/index.js.map +1 -0
  273. package/dist/routes/training-routes.d.ts +10 -0
  274. package/dist/routes/training-routes.d.ts.map +1 -0
  275. package/dist/routes/training-routes.js +1239 -0
  276. package/dist/routes/training-routes.js.map +1 -0
  277. package/dist/routes/training-vast-routes.d.ts +35 -0
  278. package/dist/routes/training-vast-routes.d.ts.map +1 -0
  279. package/dist/routes/training-vast-routes.js +249 -0
  280. package/dist/routes/training-vast-routes.js.map +1 -0
  281. package/dist/routes/trajectory-routes.d.ts +19 -0
  282. package/dist/routes/trajectory-routes.d.ts.map +1 -0
  283. package/dist/routes/trajectory-routes.js +1122 -0
  284. package/dist/routes/trajectory-routes.js.map +1 -0
  285. package/dist/services/index.d.ts +9 -0
  286. package/dist/services/index.d.ts.map +1 -0
  287. package/dist/services/index.js +63 -0
  288. package/dist/services/index.js.map +1 -0
  289. package/dist/services/training-backend-check.d.ts +8 -0
  290. package/dist/services/training-backend-check.d.ts.map +1 -0
  291. package/dist/services/training-backend-check.js +31 -0
  292. package/dist/services/training-backend-check.js.map +1 -0
  293. package/dist/services/training-service-like.d.ts +40 -0
  294. package/dist/services/training-service-like.d.ts.map +1 -0
  295. package/dist/services/training-service-like.js +1 -0
  296. package/dist/services/training-service-like.js.map +1 -0
  297. package/dist/services/training-service-registry.d.ts +4 -0
  298. package/dist/services/training-service-registry.d.ts.map +1 -0
  299. package/dist/services/training-service-registry.js +12 -0
  300. package/dist/services/training-service-registry.js.map +1 -0
  301. package/dist/services/training-service.d.ts +59 -0
  302. package/dist/services/training-service.d.ts.map +1 -0
  303. package/dist/services/training-service.js +154 -0
  304. package/dist/services/training-service.js.map +1 -0
  305. package/dist/services/training-trigger.d.ts +177 -0
  306. package/dist/services/training-trigger.d.ts.map +1 -0
  307. package/dist/services/training-trigger.js +300 -0
  308. package/dist/services/training-trigger.js.map +1 -0
  309. package/dist/services/training-vast-service.d.ts +149 -0
  310. package/dist/services/training-vast-service.d.ts.map +1 -0
  311. package/dist/services/training-vast-service.js +648 -0
  312. package/dist/services/training-vast-service.js.map +1 -0
  313. package/dist/services/vast-inference-stats.d.ts +37 -0
  314. package/dist/services/vast-inference-stats.d.ts.map +1 -0
  315. package/dist/services/vast-inference-stats.js +81 -0
  316. package/dist/services/vast-inference-stats.js.map +1 -0
  317. package/dist/services/vast-job-store.d.ts +74 -0
  318. package/dist/services/vast-job-store.d.ts.map +1 -0
  319. package/dist/services/vast-job-store.js +194 -0
  320. package/dist/services/vast-job-store.js.map +1 -0
  321. package/dist/services/vast-subprocess.d.ts +27 -0
  322. package/dist/services/vast-subprocess.d.ts.map +1 -0
  323. package/dist/services/vast-subprocess.js +78 -0
  324. package/dist/services/vast-subprocess.js.map +1 -0
  325. package/dist/setup-routes.d.ts +17 -0
  326. package/dist/setup-routes.d.ts.map +1 -0
  327. package/dist/setup-routes.js +319 -0
  328. package/dist/setup-routes.js.map +1 -0
  329. package/dist/ui/FineTuningSpatialView.d.ts +49 -0
  330. package/dist/ui/FineTuningSpatialView.d.ts.map +1 -0
  331. package/dist/ui/FineTuningSpatialView.js +154 -0
  332. package/dist/ui/FineTuningSpatialView.js.map +1 -0
  333. package/dist/ui/FineTuningView.d.ts +7 -0
  334. package/dist/ui/FineTuningView.d.ts.map +1 -0
  335. package/dist/ui/FineTuningView.helpers.d.ts +17 -0
  336. package/dist/ui/FineTuningView.helpers.d.ts.map +1 -0
  337. package/dist/ui/FineTuningView.helpers.js +30 -0
  338. package/dist/ui/FineTuningView.helpers.js.map +1 -0
  339. package/dist/ui/FineTuningView.interact.d.ts +2 -0
  340. package/dist/ui/FineTuningView.interact.d.ts.map +1 -0
  341. package/dist/ui/FineTuningView.interact.js +300 -0
  342. package/dist/ui/FineTuningView.interact.js.map +1 -0
  343. package/dist/ui/FineTuningView.js +4653 -0
  344. package/dist/ui/FineTuningView.js.map +1 -0
  345. package/dist/ui/fine-tuning-panels.d.ts +100 -0
  346. package/dist/ui/fine-tuning-panels.d.ts.map +1 -0
  347. package/dist/ui/fine-tuning-panels.helpers.d.ts +19 -0
  348. package/dist/ui/fine-tuning-panels.helpers.d.ts.map +1 -0
  349. package/dist/ui/fine-tuning-panels.helpers.js +77 -0
  350. package/dist/ui/fine-tuning-panels.helpers.js.map +1 -0
  351. package/dist/ui/fine-tuning-panels.js +928 -0
  352. package/dist/ui/fine-tuning-panels.js.map +1 -0
  353. package/dist/ui/index.d.ts +5 -0
  354. package/dist/ui/index.d.ts.map +1 -0
  355. package/dist/ui/index.js +5 -0
  356. package/dist/ui/index.js.map +1 -0
  357. package/dist/ui/training-view-bundle.d.ts +3 -0
  358. package/dist/ui/training-view-bundle.d.ts.map +1 -0
  359. package/dist/ui/training-view-bundle.js +7 -0
  360. package/dist/ui/training-view-bundle.js.map +1 -0
  361. package/dist/views/bundle.js +5312 -0
  362. package/dist/views/bundle.js.map +1 -0
  363. package/package.json +7 -7
@@ -0,0 +1,561 @@
1
+ import { copyFile, mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { escapeHtml, escapeScriptJson } from "./html-escape.js";
4
+ import {
5
+ applyPrivacyFilter
6
+ } from "./privacy-filter.js";
7
+ import {
8
+ resolveHfUploadConfig,
9
+ uploadTrajectoryJsonlToHuggingFace
10
+ } from "./trajectory-hf-upload.js";
11
+ import {
12
+ buildTaskRecord,
13
+ exportTrajectoryTaskDatasets
14
+ } from "./trajectory-task-datasets.js";
15
+ const TRAJECTORY_EXPORT_BUNDLE_SCHEMA = "eliza_trajectory_export_bundle";
16
+ const TRAJECTORY_EXPORT_BUNDLE_VERSION = 1;
17
+ function taskPathMap(paths) {
18
+ return {
19
+ should_respond: paths.shouldRespondPath,
20
+ context_routing: paths.contextRoutingPath,
21
+ action_planner: paths.actionPlannerPath,
22
+ response: paths.responsePath,
23
+ media_description: paths.mediaDescriptionPath,
24
+ view_context: paths.viewContextPath,
25
+ calendar_extract: paths.calendarExtractPath,
26
+ schedule_plan: paths.schedulePlanPath,
27
+ reminder_dispatch: paths.reminderDispatchPath,
28
+ inbox_triage: paths.inboxTriagePath,
29
+ meeting_prep: paths.meetingPrepPath,
30
+ morning_brief: paths.morningBriefPath,
31
+ health_checkin: paths.healthCheckinPath,
32
+ screentime_recap: paths.screentimeRecapPath
33
+ };
34
+ }
35
+ function sortJsonValue(value) {
36
+ if (Array.isArray(value)) {
37
+ return value.map(sortJsonValue);
38
+ }
39
+ if (!value || typeof value !== "object") {
40
+ return value;
41
+ }
42
+ const sorted = {};
43
+ for (const key of Object.keys(value).sort()) {
44
+ sorted[key] = sortJsonValue(value[key]);
45
+ }
46
+ return sorted;
47
+ }
48
+ function stableJson(value) {
49
+ return JSON.stringify(sortJsonValue(value));
50
+ }
51
+ function jsonl(rows) {
52
+ if (rows.length === 0) return "";
53
+ return `${rows.map(stableJson).join("\n")}
54
+ `;
55
+ }
56
+ function countJsonlRows(payload) {
57
+ return payload.split("\n").map((line) => line.trim()).filter(Boolean).length;
58
+ }
59
+ function parseJsonlRows(text) {
60
+ if (!text) return [];
61
+ const rows = [];
62
+ for (const line of text.split("\n")) {
63
+ const trimmed = line.trim();
64
+ if (!trimmed) continue;
65
+ try {
66
+ rows.push(JSON.parse(trimmed));
67
+ } catch {
68
+ rows.push({ parseError: true, line: trimmed });
69
+ }
70
+ }
71
+ return rows;
72
+ }
73
+ function buildViewerHtml(input) {
74
+ const data = {
75
+ manifest: input.manifest,
76
+ sanitizedTrajectories: input.sanitizedTrajectories,
77
+ taskExamples: input.taskExamples
78
+ };
79
+ return `<!doctype html>
80
+ <html lang="en">
81
+ <head>
82
+ <meta charset="utf-8">
83
+ <meta name="viewport" content="width=device-width, initial-scale=1">
84
+ <title>Eliza Trajectory Export Viewer</title>
85
+ <style>
86
+ :root {
87
+ color-scheme: light dark;
88
+ --bg: #f7f4ee;
89
+ --ink: #161514;
90
+ --muted: #69635a;
91
+ --line: #d8d0c4;
92
+ --panel: #fffdfa;
93
+ --accent: #b7431f;
94
+ --accent-ink: #fff7f2;
95
+ --code: #22201d;
96
+ }
97
+ @media (prefers-color-scheme: dark) {
98
+ :root {
99
+ --bg: #161514;
100
+ --ink: #f5efe6;
101
+ --muted: #bdb3a5;
102
+ --line: #3a352f;
103
+ --panel: #201e1b;
104
+ --accent: #e66d37;
105
+ --accent-ink: #21120b;
106
+ --code: #f8efe3;
107
+ }
108
+ }
109
+ * { box-sizing: border-box; }
110
+ body {
111
+ margin: 0;
112
+ background: var(--bg);
113
+ color: var(--ink);
114
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
115
+ line-height: 1.45;
116
+ }
117
+ header {
118
+ border-bottom: 1px solid var(--line);
119
+ padding: 24px clamp(16px, 4vw, 48px) 18px;
120
+ }
121
+ h1 {
122
+ font-size: clamp(24px, 4vw, 42px);
123
+ margin: 0 0 8px;
124
+ letter-spacing: 0;
125
+ }
126
+ .meta {
127
+ color: var(--muted);
128
+ display: flex;
129
+ flex-wrap: wrap;
130
+ gap: 10px 18px;
131
+ font-size: 14px;
132
+ }
133
+ main {
134
+ padding: 18px clamp(16px, 4vw, 48px) 48px;
135
+ }
136
+ .tabs {
137
+ display: flex;
138
+ flex-wrap: wrap;
139
+ gap: 8px;
140
+ margin-bottom: 16px;
141
+ }
142
+ button {
143
+ border: 1px solid var(--line);
144
+ background: var(--panel);
145
+ color: var(--ink);
146
+ border-radius: 6px;
147
+ padding: 9px 12px;
148
+ cursor: pointer;
149
+ font: inherit;
150
+ }
151
+ button[aria-selected="true"] {
152
+ background: var(--accent);
153
+ border-color: var(--accent);
154
+ color: var(--accent-ink);
155
+ }
156
+ .grid {
157
+ display: grid;
158
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
159
+ gap: 10px;
160
+ margin-bottom: 18px;
161
+ }
162
+ .metric, .row {
163
+ background: var(--panel);
164
+ border: 1px solid var(--line);
165
+ border-radius: 8px;
166
+ padding: 12px;
167
+ }
168
+ .metric strong {
169
+ display: block;
170
+ font-size: 24px;
171
+ }
172
+ .metric span, .label {
173
+ color: var(--muted);
174
+ font-size: 13px;
175
+ }
176
+ .split {
177
+ display: grid;
178
+ grid-template-columns: minmax(220px, 320px) 1fr;
179
+ gap: 14px;
180
+ align-items: start;
181
+ }
182
+ .list {
183
+ display: grid;
184
+ gap: 8px;
185
+ max-height: 70vh;
186
+ overflow: auto;
187
+ }
188
+ .row {
189
+ text-align: left;
190
+ width: 100%;
191
+ }
192
+ .row.active {
193
+ outline: 2px solid var(--accent);
194
+ outline-offset: 1px;
195
+ }
196
+ pre {
197
+ margin: 0;
198
+ white-space: pre-wrap;
199
+ overflow-wrap: anywhere;
200
+ background: var(--panel);
201
+ border: 1px solid var(--line);
202
+ border-radius: 8px;
203
+ color: var(--code);
204
+ padding: 14px;
205
+ max-height: 76vh;
206
+ overflow: auto;
207
+ font-size: 12px;
208
+ }
209
+ .hidden { display: none; }
210
+ @media (max-width: 760px) {
211
+ .split { grid-template-columns: 1fr; }
212
+ pre { max-height: none; }
213
+ }
214
+ </style>
215
+ </head>
216
+ <body>
217
+ <header>
218
+ <h1>Eliza Trajectory Export</h1>
219
+ <div class="meta">
220
+ <span>Generated ${escapeHtml(input.manifest.generatedAt)}</span>
221
+ <span>Source ${escapeHtml(input.manifest.source.kind)}</span>
222
+ <span>Run ${escapeHtml(input.manifest.runId ?? "mixed")}</span>
223
+ <span>${input.manifest.counts.sanitizedTrajectoryRows} sanitized trajectories</span>
224
+ <span>${input.manifest.counts.taskExamples} task examples</span>
225
+ </div>
226
+ </header>
227
+ <main>
228
+ <nav class="tabs" aria-label="Viewer sections">
229
+ <button type="button" data-tab="overview" aria-selected="true">Overview</button>
230
+ <button type="button" data-tab="trajectories" aria-selected="false">Trajectories</button>
231
+ <button type="button" data-tab="tasks" aria-selected="false">Task Datasets</button>
232
+ <button type="button" data-tab="manifest" aria-selected="false">Manifest</button>
233
+ </nav>
234
+ <section id="overview"></section>
235
+ <section id="trajectories" class="hidden"></section>
236
+ <section id="tasks" class="hidden"></section>
237
+ <section id="manifest" class="hidden"></section>
238
+ </main>
239
+ <script type="application/json" id="viewer-data">${escapeScriptJson(data)}</script>
240
+ <script>
241
+ const data = JSON.parse(document.getElementById("viewer-data").textContent);
242
+ const tasks = ["should_respond", "context_routing", "action_planner", "response", "media_description", "view_context"];
243
+ const pretty = (value) => JSON.stringify(value, null, 2);
244
+ const metric = (label, value) => '<div class="metric"><strong>' + value + '</strong><span>' + label + '</span></div>';
245
+ function renderOverview() {
246
+ const m = data.manifest;
247
+ const target = document.getElementById("overview");
248
+ target.innerHTML =
249
+ '<div class="grid">' +
250
+ metric("Input trajectories", m.source.inputTrajectoryCount) +
251
+ metric("Sanitized trajectories", m.source.sanitizedTrajectoryCount) +
252
+ metric("Dropped trajectories", m.source.droppedTrajectoryCount) +
253
+ metric("LLM calls", m.counts.llmCalls ?? "n/a") +
254
+ metric("Task files", m.counts.taskFiles) +
255
+ metric("Task examples", m.counts.taskExamples) +
256
+ '</div><pre></pre>';
257
+ target.querySelector("pre").textContent = pretty({
258
+ paths: m.paths,
259
+ taskRows: m.counts.taskRows,
260
+ privacy: m.privacy,
261
+ cloudUpload: m.cloudUpload
262
+ });
263
+ }
264
+ function renderSelectable(targetId, rows, labelFor) {
265
+ const target = document.getElementById(targetId);
266
+ if (rows.length === 0) {
267
+ target.innerHTML = '<pre>No rows were exported for this section.</pre>';
268
+ return;
269
+ }
270
+ target.innerHTML = '<div class="split"><div class="list"></div><pre></pre></div>';
271
+ const list = target.querySelector(".list");
272
+ const detail = target.querySelector("pre");
273
+ rows.forEach((row, index) => {
274
+ const button = document.createElement("button");
275
+ button.type = "button";
276
+ button.className = "row" + (index === 0 ? " active" : "");
277
+ const label = document.createElement("div");
278
+ label.className = "label";
279
+ label.textContent = String(index + 1);
280
+ const title = document.createElement("strong");
281
+ title.textContent = String(labelFor(row, index));
282
+ button.append(label, title);
283
+ button.addEventListener("click", () => {
284
+ for (const item of list.querySelectorAll(".row")) item.classList.remove("active");
285
+ button.classList.add("active");
286
+ detail.textContent = pretty(row);
287
+ });
288
+ list.appendChild(button);
289
+ });
290
+ detail.textContent = pretty(rows[0]);
291
+ }
292
+ function renderTrajectories() {
293
+ renderSelectable("trajectories", data.sanitizedTrajectories, (row, index) =>
294
+ row.trajectoryId || row.id || row.callId || "trajectory-" + (index + 1)
295
+ );
296
+ }
297
+ function renderTasks() {
298
+ const rows = tasks.flatMap((task) => (data.taskExamples[task] || []).map((example) => ({ task, example })));
299
+ renderSelectable("tasks", rows, (row, index) =>
300
+ row.task + " / " + (row.example.trajectoryId || row.example.callId || index + 1)
301
+ );
302
+ }
303
+ function renderManifest() {
304
+ const target = document.getElementById("manifest");
305
+ target.innerHTML = '<pre></pre>';
306
+ target.querySelector("pre").textContent = pretty(data.manifest);
307
+ }
308
+ renderOverview();
309
+ renderTrajectories();
310
+ renderTasks();
311
+ renderManifest();
312
+ for (const button of document.querySelectorAll("[data-tab]")) {
313
+ button.addEventListener("click", () => {
314
+ const selected = button.dataset.tab;
315
+ for (const tab of document.querySelectorAll("[data-tab]")) {
316
+ tab.setAttribute("aria-selected", String(tab === button));
317
+ }
318
+ for (const section of document.querySelectorAll("main > section")) {
319
+ section.classList.toggle("hidden", section.id !== selected);
320
+ }
321
+ });
322
+ }
323
+ </script>
324
+ </body>
325
+ </html>
326
+ `;
327
+ }
328
+ function normalizePrivacyStats(privacyResult, explicitStats, applied) {
329
+ if (explicitStats) {
330
+ return explicitStats;
331
+ }
332
+ if (privacyResult) {
333
+ return {
334
+ applied: true,
335
+ redactionCount: privacyResult.redactionCount,
336
+ anonymizationCount: privacyResult.anonymizationCount,
337
+ droppedCount: privacyResult.dropped.length,
338
+ dropped: privacyResult.dropped
339
+ };
340
+ }
341
+ return {
342
+ applied,
343
+ redactionCount: null,
344
+ anonymizationCount: null,
345
+ droppedCount: 0,
346
+ dropped: []
347
+ };
348
+ }
349
+ function buildTaskFiles(dataset) {
350
+ if (!dataset) return {};
351
+ const pathsByTask = taskPathMap(dataset.paths);
352
+ const tasks = {};
353
+ for (const task of dataset.summary.tasks) {
354
+ const metrics = dataset.summary.taskMetrics[task];
355
+ tasks[task] = {
356
+ path: pathsByTask[task],
357
+ exampleCount: metrics.exampleCount,
358
+ sourceCallCount: metrics.sourceCallCount,
359
+ sourceTrajectoryCount: metrics.sourceTrajectoryCount
360
+ };
361
+ }
362
+ return tasks;
363
+ }
364
+ function emptyTaskCounts() {
365
+ return buildTaskRecord(() => 0);
366
+ }
367
+ function emptyTaskExamples() {
368
+ return buildTaskRecord(() => []);
369
+ }
370
+ function normalizeRunId(value) {
371
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
372
+ }
373
+ function addRunId(runIds, value) {
374
+ const runId = normalizeRunId(value);
375
+ if (runId) runIds.add(runId);
376
+ }
377
+ function collectTrajectoryRunIds(trajectories) {
378
+ const runIds = /* @__PURE__ */ new Set();
379
+ for (const trajectory of trajectories) {
380
+ const record = trajectory;
381
+ addRunId(runIds, record.runId);
382
+ addRunId(runIds, record.metadata?.runId);
383
+ addRunId(runIds, record.metadata?.appRunId);
384
+ for (const step of trajectory.steps ?? []) {
385
+ for (const call of step.llmCalls ?? []) {
386
+ addRunId(runIds, call.runId);
387
+ }
388
+ for (const access of step.providerAccesses ?? []) {
389
+ addRunId(runIds, access.runId);
390
+ }
391
+ }
392
+ }
393
+ return [...runIds].sort();
394
+ }
395
+ function resolveBundleRunIds(source, trajectories) {
396
+ const runIds = new Set(collectTrajectoryRunIds(trajectories));
397
+ addRunId(runIds, source?.runId);
398
+ for (const runId of source?.runIds ?? []) {
399
+ addRunId(runIds, runId);
400
+ }
401
+ const sorted = [...runIds].sort();
402
+ const explicitRunId = normalizeRunId(source?.runId);
403
+ return {
404
+ runId: explicitRunId ?? (sorted.length === 1 ? sorted[0] : null),
405
+ runIds: sorted
406
+ };
407
+ }
408
+ async function buildTrajectoryExportBundle(options) {
409
+ await mkdir(options.outputDir, { recursive: true });
410
+ const inputTrajectories = options.trajectories ?? [];
411
+ const exportableTrajectories = inputTrajectories;
412
+ const hasPreSanitizedInput = options.sanitizedTrajectories !== void 0 || options.sanitizedJsonlPath !== void 0;
413
+ const shouldApplyPrivacy = options.privacy?.apply ?? !hasPreSanitizedInput;
414
+ const privacyResult = shouldApplyPrivacy && exportableTrajectories.length > 0 ? applyPrivacyFilter(exportableTrajectories, options.privacy?.options) : null;
415
+ const sanitizedTrajectories = options.sanitizedTrajectories ?? privacyResult?.trajectories ?? [];
416
+ const privacy = normalizePrivacyStats(
417
+ privacyResult,
418
+ options.privacy?.stats,
419
+ shouldApplyPrivacy
420
+ );
421
+ let rawTrajectoryRows = 0;
422
+ let rawJsonlPath;
423
+ if (options.includeRawJsonl) {
424
+ await mkdir(join(options.outputDir, "raw"), { recursive: true });
425
+ rawJsonlPath = join(options.outputDir, "raw", "trajectories.raw.jsonl");
426
+ if (options.rawJsonlPath) {
427
+ await copyFile(options.rawJsonlPath, rawJsonlPath);
428
+ rawTrajectoryRows = countJsonlRows(await readFile(rawJsonlPath, "utf8"));
429
+ } else {
430
+ await writeFile(rawJsonlPath, jsonl(inputTrajectories));
431
+ rawTrajectoryRows = inputTrajectories.length;
432
+ }
433
+ }
434
+ let sanitizedTrajectoryRows = sanitizedTrajectories.length;
435
+ let sanitizedJsonlPath;
436
+ let sanitizedJsonlText = null;
437
+ if (options.sanitizedJsonlPath) {
438
+ await mkdir(join(options.outputDir, "sanitized"), { recursive: true });
439
+ sanitizedJsonlPath = join(
440
+ options.outputDir,
441
+ "sanitized",
442
+ "trajectories.sanitized.jsonl"
443
+ );
444
+ await copyFile(options.sanitizedJsonlPath, sanitizedJsonlPath);
445
+ sanitizedJsonlText = await readFile(sanitizedJsonlPath, "utf8");
446
+ sanitizedTrajectoryRows = countJsonlRows(sanitizedJsonlText);
447
+ } else if (sanitizedTrajectories.length > 0 || inputTrajectories.length > 0) {
448
+ await mkdir(join(options.outputDir, "sanitized"), { recursive: true });
449
+ sanitizedJsonlPath = join(
450
+ options.outputDir,
451
+ "sanitized",
452
+ "trajectories.sanitized.jsonl"
453
+ );
454
+ sanitizedJsonlText = jsonl(sanitizedTrajectories);
455
+ await writeFile(sanitizedJsonlPath, sanitizedJsonlText);
456
+ }
457
+ let cloudUpload = {
458
+ uploadedToHuggingFace: false
459
+ };
460
+ if (options.uploadToHuggingFace && sanitizedJsonlPath) {
461
+ const uploadConfig = options.uploadToHuggingFace === true ? resolveHfUploadConfig() : options.uploadToHuggingFace;
462
+ if (uploadConfig) {
463
+ const pathInRepo = `trajectories/${(options.now?.() ?? /* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}.jsonl`;
464
+ const uploadResult = await uploadTrajectoryJsonlToHuggingFace(
465
+ sanitizedJsonlPath,
466
+ pathInRepo,
467
+ uploadConfig
468
+ );
469
+ cloudUpload = {
470
+ uploadedToHuggingFace: uploadResult.uploaded,
471
+ huggingFaceRepo: uploadResult.repo ?? void 0,
472
+ huggingFacePath: uploadResult.pathInRepo ?? void 0,
473
+ huggingFaceError: uploadResult.error ?? void 0
474
+ };
475
+ } else {
476
+ cloudUpload = {
477
+ uploadedToHuggingFace: false,
478
+ huggingFaceError: "HuggingFace upload requested but not configured (set ELIZA_TRAJECTORY_HF_REPO and an HF token)"
479
+ };
480
+ }
481
+ }
482
+ let taskDataset = null;
483
+ if (sanitizedJsonlText !== null || sanitizedTrajectories.length > 0) {
484
+ const taskDatasetDir = join(options.outputDir, "tasks");
485
+ taskDataset = await exportTrajectoryTaskDatasets(
486
+ sanitizedJsonlText !== null && options.sanitizedJsonlPath ? sanitizedJsonlText : sanitizedTrajectories,
487
+ taskDatasetDir,
488
+ options.tasks
489
+ );
490
+ }
491
+ const taskFiles = buildTaskFiles(taskDataset);
492
+ const taskExamples = Object.values(taskFiles).reduce(
493
+ (sum, task) => sum + task.exampleCount,
494
+ 0
495
+ );
496
+ const taskCounts = taskDataset?.counts ?? emptyTaskCounts();
497
+ const manifestPath = join(options.outputDir, "manifest.json");
498
+ const viewerHtmlPath = join(options.outputDir, "index.html");
499
+ const generatedAt = (options.now?.() ?? /* @__PURE__ */ new Date()).toISOString();
500
+ const runLineage = resolveBundleRunIds(options.source, [
501
+ ...inputTrajectories,
502
+ ...sanitizedTrajectories
503
+ ]);
504
+ const manifest = {
505
+ schema: TRAJECTORY_EXPORT_BUNDLE_SCHEMA,
506
+ schemaVersion: TRAJECTORY_EXPORT_BUNDLE_VERSION,
507
+ generatedAt,
508
+ runId: runLineage.runId,
509
+ source: {
510
+ kind: options.source?.kind ?? "trajectory-export-bundle",
511
+ runId: runLineage.runId ?? void 0,
512
+ runIds: runLineage.runIds,
513
+ inputTrajectoryCount: inputTrajectories.length || rawTrajectoryRows,
514
+ sanitizedTrajectoryCount: sanitizedTrajectoryRows,
515
+ droppedTrajectoryCount: privacy.droppedCount,
516
+ metadata: options.source?.metadata ? sortJsonValue(options.source.metadata) : void 0
517
+ },
518
+ paths: {
519
+ bundleDir: options.outputDir,
520
+ manifestPath,
521
+ viewerHtmlPath,
522
+ rawJsonlPath,
523
+ sanitizedJsonlPath,
524
+ taskDatasetDir: taskDataset ? join(options.outputDir, "tasks") : void 0,
525
+ taskDatasetSummaryPath: taskDataset?.paths.summaryPath
526
+ },
527
+ counts: {
528
+ rawTrajectoryRows,
529
+ sanitizedTrajectoryRows,
530
+ taskRows: taskCounts,
531
+ taskFiles: Object.keys(taskFiles).length,
532
+ taskExamples,
533
+ llmCalls: taskDataset?.summary.llmCallCount ?? null,
534
+ skippedNonNativeRows: taskDataset?.summary.skippedNonNativeRows ?? null
535
+ },
536
+ tasks: taskFiles,
537
+ privacy,
538
+ cloudUpload
539
+ };
540
+ await writeFile(
541
+ viewerHtmlPath,
542
+ buildViewerHtml({
543
+ manifest,
544
+ sanitizedTrajectories: sanitizedJsonlText !== null ? parseJsonlRows(sanitizedJsonlText) : sanitizedTrajectories,
545
+ taskExamples: taskDataset?.examples ?? emptyTaskExamples()
546
+ })
547
+ );
548
+ await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}
549
+ `);
550
+ return {
551
+ outputDir: options.outputDir,
552
+ manifestPath,
553
+ manifest
554
+ };
555
+ }
556
+ export {
557
+ TRAJECTORY_EXPORT_BUNDLE_SCHEMA,
558
+ TRAJECTORY_EXPORT_BUNDLE_VERSION,
559
+ buildTrajectoryExportBundle
560
+ };
561
+ //# sourceMappingURL=trajectory-export-bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/trajectory-export-bundle.ts"],"sourcesContent":["import { copyFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Trajectory } from \"@elizaos/agent\";\nimport { escapeHtml, escapeScriptJson } from \"./html-escape.js\";\nimport {\n applyPrivacyFilter,\n type FilterableTrajectory,\n type FilterResult,\n type PrivacyFilterOptions,\n} from \"./privacy-filter.js\";\nimport {\n type HfUploadConfig,\n resolveHfUploadConfig,\n uploadTrajectoryJsonlToHuggingFace,\n} from \"./trajectory-hf-upload.js\";\nimport {\n buildTaskRecord,\n type ElizaNativeTrainingExample,\n exportTrajectoryTaskDatasets,\n type TrajectoryTaskDatasetExport,\n type TrajectoryTrainingTask,\n} from \"./trajectory-task-datasets.js\";\n\nexport const TRAJECTORY_EXPORT_BUNDLE_SCHEMA = \"eliza_trajectory_export_bundle\";\nexport const TRAJECTORY_EXPORT_BUNDLE_VERSION = 1;\n\ntype ExportableTrajectory = Trajectory & FilterableTrajectory;\n\nexport interface TrajectoryExportBundleSource {\n kind: string;\n runId?: string;\n runIds?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface TrajectoryExportBundlePrivacyStats {\n applied: boolean;\n redactionCount: number | null;\n anonymizationCount: number | null;\n droppedCount: number;\n dropped: Array<{ trajectoryId?: string; reason: string }>;\n}\n\nexport interface TrajectoryExportBundleTaskFile {\n path: string;\n exampleCount: number;\n sourceCallCount: number;\n sourceTrajectoryCount: number;\n}\n\nexport interface TrajectoryExportBundleCloudUpload {\n uploadedToHuggingFace: boolean;\n huggingFaceRepo?: string;\n huggingFacePath?: string;\n huggingFaceError?: string;\n}\n\nexport interface TrajectoryExportBundleManifest {\n schema: typeof TRAJECTORY_EXPORT_BUNDLE_SCHEMA;\n schemaVersion: typeof TRAJECTORY_EXPORT_BUNDLE_VERSION;\n generatedAt: string;\n runId: string | null;\n source: TrajectoryExportBundleSource & {\n inputTrajectoryCount: number;\n sanitizedTrajectoryCount: number;\n droppedTrajectoryCount: number;\n };\n paths: {\n bundleDir: string;\n manifestPath: string;\n viewerHtmlPath?: string;\n rawJsonlPath?: string;\n sanitizedJsonlPath?: string;\n taskDatasetDir?: string;\n taskDatasetSummaryPath?: string;\n };\n counts: {\n rawTrajectoryRows: number;\n sanitizedTrajectoryRows: number;\n taskRows: Record<TrajectoryTrainingTask, number>;\n taskFiles: number;\n taskExamples: number;\n llmCalls: number | null;\n skippedNonNativeRows: number | null;\n };\n tasks: Partial<\n Record<TrajectoryTrainingTask, TrajectoryExportBundleTaskFile>\n >;\n privacy: TrajectoryExportBundlePrivacyStats;\n cloudUpload: TrajectoryExportBundleCloudUpload;\n}\n\nexport interface TrajectoryExportBundle {\n outputDir: string;\n manifestPath: string;\n manifest: TrajectoryExportBundleManifest;\n}\n\nexport interface BuildTrajectoryExportBundleOptions {\n outputDir: string;\n trajectories?: Trajectory[];\n sanitizedTrajectories?: Trajectory[];\n rawJsonlPath?: string;\n sanitizedJsonlPath?: string;\n includeRawJsonl?: boolean;\n tasks?: readonly TrajectoryTrainingTask[];\n source?: TrajectoryExportBundleSource;\n privacy?: {\n apply?: boolean;\n options?: PrivacyFilterOptions;\n stats?: TrajectoryExportBundlePrivacyStats;\n };\n /**\n * Upload the sanitized JSONL to a HuggingFace dataset repo. `true` resolves\n * the config from the environment (`ELIZA_TRAJECTORY_HF_REPO` + HF token);\n * pass an explicit `HfUploadConfig` to override. Defaults to no upload.\n */\n uploadToHuggingFace?: boolean | HfUploadConfig;\n now?: () => Date;\n}\n\nfunction taskPathMap(\n paths: TrajectoryTaskDatasetExport[\"paths\"],\n): Record<TrajectoryTrainingTask, string> {\n return {\n should_respond: paths.shouldRespondPath,\n context_routing: paths.contextRoutingPath,\n action_planner: paths.actionPlannerPath,\n response: paths.responsePath,\n media_description: paths.mediaDescriptionPath,\n view_context: paths.viewContextPath,\n calendar_extract: paths.calendarExtractPath,\n schedule_plan: paths.schedulePlanPath,\n reminder_dispatch: paths.reminderDispatchPath,\n inbox_triage: paths.inboxTriagePath,\n meeting_prep: paths.meetingPrepPath,\n morning_brief: paths.morningBriefPath,\n health_checkin: paths.healthCheckinPath,\n screentime_recap: paths.screentimeRecapPath,\n };\n}\n\nfunction sortJsonValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortJsonValue);\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(value).sort()) {\n sorted[key] = sortJsonValue((value as Record<string, unknown>)[key]);\n }\n return sorted;\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(sortJsonValue(value));\n}\n\nfunction jsonl(rows: readonly unknown[]): string {\n if (rows.length === 0) return \"\";\n return `${rows.map(stableJson).join(\"\\n\")}\\n`;\n}\n\nfunction countJsonlRows(payload: string): number {\n return payload\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean).length;\n}\n\nfunction parseJsonlRows(text: string | null): unknown[] {\n if (!text) return [];\n const rows: unknown[] = [];\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n rows.push(JSON.parse(trimmed));\n } catch {\n rows.push({ parseError: true, line: trimmed });\n }\n }\n return rows;\n}\n\nfunction buildViewerHtml(input: {\n manifest: TrajectoryExportBundleManifest;\n sanitizedTrajectories: unknown[];\n taskExamples: Record<TrajectoryTrainingTask, ElizaNativeTrainingExample[]>;\n}): string {\n const data = {\n manifest: input.manifest,\n sanitizedTrajectories: input.sanitizedTrajectories,\n taskExamples: input.taskExamples,\n };\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Eliza Trajectory Export Viewer</title>\n <style>\n :root {\n color-scheme: light dark;\n --bg: #f7f4ee;\n --ink: #161514;\n --muted: #69635a;\n --line: #d8d0c4;\n --panel: #fffdfa;\n --accent: #b7431f;\n --accent-ink: #fff7f2;\n --code: #22201d;\n }\n @media (prefers-color-scheme: dark) {\n :root {\n --bg: #161514;\n --ink: #f5efe6;\n --muted: #bdb3a5;\n --line: #3a352f;\n --panel: #201e1b;\n --accent: #e66d37;\n --accent-ink: #21120b;\n --code: #f8efe3;\n }\n }\n * { box-sizing: border-box; }\n body {\n margin: 0;\n background: var(--bg);\n color: var(--ink);\n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n line-height: 1.45;\n }\n header {\n border-bottom: 1px solid var(--line);\n padding: 24px clamp(16px, 4vw, 48px) 18px;\n }\n h1 {\n font-size: clamp(24px, 4vw, 42px);\n margin: 0 0 8px;\n letter-spacing: 0;\n }\n .meta {\n color: var(--muted);\n display: flex;\n flex-wrap: wrap;\n gap: 10px 18px;\n font-size: 14px;\n }\n main {\n padding: 18px clamp(16px, 4vw, 48px) 48px;\n }\n .tabs {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 16px;\n }\n button {\n border: 1px solid var(--line);\n background: var(--panel);\n color: var(--ink);\n border-radius: 6px;\n padding: 9px 12px;\n cursor: pointer;\n font: inherit;\n }\n button[aria-selected=\"true\"] {\n background: var(--accent);\n border-color: var(--accent);\n color: var(--accent-ink);\n }\n .grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 10px;\n margin-bottom: 18px;\n }\n .metric, .row {\n background: var(--panel);\n border: 1px solid var(--line);\n border-radius: 8px;\n padding: 12px;\n }\n .metric strong {\n display: block;\n font-size: 24px;\n }\n .metric span, .label {\n color: var(--muted);\n font-size: 13px;\n }\n .split {\n display: grid;\n grid-template-columns: minmax(220px, 320px) 1fr;\n gap: 14px;\n align-items: start;\n }\n .list {\n display: grid;\n gap: 8px;\n max-height: 70vh;\n overflow: auto;\n }\n .row {\n text-align: left;\n width: 100%;\n }\n .row.active {\n outline: 2px solid var(--accent);\n outline-offset: 1px;\n }\n pre {\n margin: 0;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--panel);\n border: 1px solid var(--line);\n border-radius: 8px;\n color: var(--code);\n padding: 14px;\n max-height: 76vh;\n overflow: auto;\n font-size: 12px;\n }\n .hidden { display: none; }\n @media (max-width: 760px) {\n .split { grid-template-columns: 1fr; }\n pre { max-height: none; }\n }\n </style>\n</head>\n<body>\n <header>\n <h1>Eliza Trajectory Export</h1>\n <div class=\"meta\">\n <span>Generated ${escapeHtml(input.manifest.generatedAt)}</span>\n <span>Source ${escapeHtml(input.manifest.source.kind)}</span>\n <span>Run ${escapeHtml(input.manifest.runId ?? \"mixed\")}</span>\n <span>${input.manifest.counts.sanitizedTrajectoryRows} sanitized trajectories</span>\n <span>${input.manifest.counts.taskExamples} task examples</span>\n </div>\n </header>\n <main>\n <nav class=\"tabs\" aria-label=\"Viewer sections\">\n <button type=\"button\" data-tab=\"overview\" aria-selected=\"true\">Overview</button>\n <button type=\"button\" data-tab=\"trajectories\" aria-selected=\"false\">Trajectories</button>\n <button type=\"button\" data-tab=\"tasks\" aria-selected=\"false\">Task Datasets</button>\n <button type=\"button\" data-tab=\"manifest\" aria-selected=\"false\">Manifest</button>\n </nav>\n <section id=\"overview\"></section>\n <section id=\"trajectories\" class=\"hidden\"></section>\n <section id=\"tasks\" class=\"hidden\"></section>\n <section id=\"manifest\" class=\"hidden\"></section>\n </main>\n <script type=\"application/json\" id=\"viewer-data\">${escapeScriptJson(data)}</script>\n <script>\n const data = JSON.parse(document.getElementById(\"viewer-data\").textContent);\n const tasks = [\"should_respond\", \"context_routing\", \"action_planner\", \"response\", \"media_description\", \"view_context\"];\n const pretty = (value) => JSON.stringify(value, null, 2);\n const metric = (label, value) => '<div class=\"metric\"><strong>' + value + '</strong><span>' + label + '</span></div>';\n function renderOverview() {\n const m = data.manifest;\n const target = document.getElementById(\"overview\");\n target.innerHTML =\n '<div class=\"grid\">' +\n metric(\"Input trajectories\", m.source.inputTrajectoryCount) +\n metric(\"Sanitized trajectories\", m.source.sanitizedTrajectoryCount) +\n metric(\"Dropped trajectories\", m.source.droppedTrajectoryCount) +\n metric(\"LLM calls\", m.counts.llmCalls ?? \"n/a\") +\n metric(\"Task files\", m.counts.taskFiles) +\n metric(\"Task examples\", m.counts.taskExamples) +\n '</div><pre></pre>';\n target.querySelector(\"pre\").textContent = pretty({\n paths: m.paths,\n taskRows: m.counts.taskRows,\n privacy: m.privacy,\n cloudUpload: m.cloudUpload\n });\n }\n function renderSelectable(targetId, rows, labelFor) {\n const target = document.getElementById(targetId);\n if (rows.length === 0) {\n target.innerHTML = '<pre>No rows were exported for this section.</pre>';\n return;\n }\n target.innerHTML = '<div class=\"split\"><div class=\"list\"></div><pre></pre></div>';\n const list = target.querySelector(\".list\");\n const detail = target.querySelector(\"pre\");\n rows.forEach((row, index) => {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"row\" + (index === 0 ? \" active\" : \"\");\n const label = document.createElement(\"div\");\n label.className = \"label\";\n label.textContent = String(index + 1);\n const title = document.createElement(\"strong\");\n title.textContent = String(labelFor(row, index));\n button.append(label, title);\n button.addEventListener(\"click\", () => {\n for (const item of list.querySelectorAll(\".row\")) item.classList.remove(\"active\");\n button.classList.add(\"active\");\n detail.textContent = pretty(row);\n });\n list.appendChild(button);\n });\n detail.textContent = pretty(rows[0]);\n }\n function renderTrajectories() {\n renderSelectable(\"trajectories\", data.sanitizedTrajectories, (row, index) =>\n row.trajectoryId || row.id || row.callId || \"trajectory-\" + (index + 1)\n );\n }\n function renderTasks() {\n const rows = tasks.flatMap((task) => (data.taskExamples[task] || []).map((example) => ({ task, example })));\n renderSelectable(\"tasks\", rows, (row, index) =>\n row.task + \" / \" + (row.example.trajectoryId || row.example.callId || index + 1)\n );\n }\n function renderManifest() {\n const target = document.getElementById(\"manifest\");\n target.innerHTML = '<pre></pre>';\n target.querySelector(\"pre\").textContent = pretty(data.manifest);\n }\n renderOverview();\n renderTrajectories();\n renderTasks();\n renderManifest();\n for (const button of document.querySelectorAll(\"[data-tab]\")) {\n button.addEventListener(\"click\", () => {\n const selected = button.dataset.tab;\n for (const tab of document.querySelectorAll(\"[data-tab]\")) {\n tab.setAttribute(\"aria-selected\", String(tab === button));\n }\n for (const section of document.querySelectorAll(\"main > section\")) {\n section.classList.toggle(\"hidden\", section.id !== selected);\n }\n });\n }\n </script>\n</body>\n</html>\n`;\n}\n\nfunction normalizePrivacyStats(\n privacyResult: FilterResult<ExportableTrajectory> | null,\n explicitStats: TrajectoryExportBundlePrivacyStats | undefined,\n applied: boolean,\n): TrajectoryExportBundlePrivacyStats {\n if (explicitStats) {\n return explicitStats;\n }\n if (privacyResult) {\n return {\n applied: true,\n redactionCount: privacyResult.redactionCount,\n anonymizationCount: privacyResult.anonymizationCount,\n droppedCount: privacyResult.dropped.length,\n dropped: privacyResult.dropped,\n };\n }\n return {\n applied,\n redactionCount: null,\n anonymizationCount: null,\n droppedCount: 0,\n dropped: [],\n };\n}\n\nfunction buildTaskFiles(\n dataset: TrajectoryTaskDatasetExport | null,\n): Partial<Record<TrajectoryTrainingTask, TrajectoryExportBundleTaskFile>> {\n if (!dataset) return {};\n const pathsByTask = taskPathMap(dataset.paths);\n const tasks: Partial<\n Record<TrajectoryTrainingTask, TrajectoryExportBundleTaskFile>\n > = {};\n for (const task of dataset.summary.tasks) {\n const metrics = dataset.summary.taskMetrics[task];\n tasks[task] = {\n path: pathsByTask[task],\n exampleCount: metrics.exampleCount,\n sourceCallCount: metrics.sourceCallCount,\n sourceTrajectoryCount: metrics.sourceTrajectoryCount,\n };\n }\n return tasks;\n}\n\nfunction emptyTaskCounts(): Record<TrajectoryTrainingTask, number> {\n return buildTaskRecord<number>(() => 0);\n}\n\nfunction emptyTaskExamples(): Record<\n TrajectoryTrainingTask,\n ElizaNativeTrainingExample[]\n> {\n return buildTaskRecord<ElizaNativeTrainingExample[]>(() => []);\n}\n\nfunction normalizeRunId(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : null;\n}\n\nfunction addRunId(runIds: Set<string>, value: unknown): void {\n const runId = normalizeRunId(value);\n if (runId) runIds.add(runId);\n}\n\nfunction collectTrajectoryRunIds(\n trajectories: readonly Trajectory[],\n): string[] {\n const runIds = new Set<string>();\n for (const trajectory of trajectories) {\n const record = trajectory as Trajectory & {\n runId?: unknown;\n metadata?: Record<string, unknown>;\n };\n addRunId(runIds, record.runId);\n addRunId(runIds, record.metadata?.runId);\n addRunId(runIds, record.metadata?.appRunId);\n\n for (const step of trajectory.steps ?? []) {\n for (const call of step.llmCalls ?? []) {\n addRunId(runIds, call.runId);\n }\n for (const access of step.providerAccesses ?? []) {\n addRunId(runIds, access.runId);\n }\n }\n }\n return [...runIds].sort();\n}\n\nfunction resolveBundleRunIds(\n source: TrajectoryExportBundleSource | undefined,\n trajectories: readonly Trajectory[],\n): { runId: string | null; runIds: string[] } {\n const runIds = new Set<string>(collectTrajectoryRunIds(trajectories));\n addRunId(runIds, source?.runId);\n for (const runId of source?.runIds ?? []) {\n addRunId(runIds, runId);\n }\n\n const sorted = [...runIds].sort();\n const explicitRunId = normalizeRunId(source?.runId);\n return {\n runId: explicitRunId ?? (sorted.length === 1 ? sorted[0] : null),\n runIds: sorted,\n };\n}\n\nexport async function buildTrajectoryExportBundle(\n options: BuildTrajectoryExportBundleOptions,\n): Promise<TrajectoryExportBundle> {\n await mkdir(options.outputDir, { recursive: true });\n\n const inputTrajectories = options.trajectories ?? [];\n const exportableTrajectories = inputTrajectories as ExportableTrajectory[];\n const hasPreSanitizedInput =\n options.sanitizedTrajectories !== undefined ||\n options.sanitizedJsonlPath !== undefined;\n const shouldApplyPrivacy = options.privacy?.apply ?? !hasPreSanitizedInput;\n const privacyResult =\n shouldApplyPrivacy && exportableTrajectories.length > 0\n ? applyPrivacyFilter(exportableTrajectories, options.privacy?.options)\n : null;\n const sanitizedTrajectories =\n options.sanitizedTrajectories ??\n (privacyResult?.trajectories as Trajectory[] | undefined) ??\n [];\n const privacy = normalizePrivacyStats(\n privacyResult,\n options.privacy?.stats,\n shouldApplyPrivacy,\n );\n\n let rawTrajectoryRows = 0;\n let rawJsonlPath: string | undefined;\n if (options.includeRawJsonl) {\n await mkdir(join(options.outputDir, \"raw\"), { recursive: true });\n rawJsonlPath = join(options.outputDir, \"raw\", \"trajectories.raw.jsonl\");\n if (options.rawJsonlPath) {\n await copyFile(options.rawJsonlPath, rawJsonlPath);\n rawTrajectoryRows = countJsonlRows(await readFile(rawJsonlPath, \"utf8\"));\n } else {\n await writeFile(rawJsonlPath, jsonl(inputTrajectories));\n rawTrajectoryRows = inputTrajectories.length;\n }\n }\n\n let sanitizedTrajectoryRows = sanitizedTrajectories.length;\n let sanitizedJsonlPath: string | undefined;\n let sanitizedJsonlText: string | null = null;\n if (options.sanitizedJsonlPath) {\n await mkdir(join(options.outputDir, \"sanitized\"), { recursive: true });\n sanitizedJsonlPath = join(\n options.outputDir,\n \"sanitized\",\n \"trajectories.sanitized.jsonl\",\n );\n await copyFile(options.sanitizedJsonlPath, sanitizedJsonlPath);\n sanitizedJsonlText = await readFile(sanitizedJsonlPath, \"utf8\");\n sanitizedTrajectoryRows = countJsonlRows(sanitizedJsonlText);\n } else if (sanitizedTrajectories.length > 0 || inputTrajectories.length > 0) {\n await mkdir(join(options.outputDir, \"sanitized\"), { recursive: true });\n sanitizedJsonlPath = join(\n options.outputDir,\n \"sanitized\",\n \"trajectories.sanitized.jsonl\",\n );\n sanitizedJsonlText = jsonl(sanitizedTrajectories);\n await writeFile(sanitizedJsonlPath, sanitizedJsonlText);\n }\n\n // Upload the sanitized JSONL to HuggingFace when requested. The privacy\n // filter has already run above — this only ever touches the sanitized file.\n let cloudUpload: TrajectoryExportBundleCloudUpload = {\n uploadedToHuggingFace: false,\n };\n if (options.uploadToHuggingFace && sanitizedJsonlPath) {\n const uploadConfig =\n options.uploadToHuggingFace === true\n ? resolveHfUploadConfig()\n : options.uploadToHuggingFace;\n if (uploadConfig) {\n const pathInRepo = `trajectories/${(options.now?.() ?? new Date())\n .toISOString()\n .replace(/[:.]/g, \"-\")}.jsonl`;\n const uploadResult = await uploadTrajectoryJsonlToHuggingFace(\n sanitizedJsonlPath,\n pathInRepo,\n uploadConfig,\n );\n cloudUpload = {\n uploadedToHuggingFace: uploadResult.uploaded,\n huggingFaceRepo: uploadResult.repo ?? undefined,\n huggingFacePath: uploadResult.pathInRepo ?? undefined,\n huggingFaceError: uploadResult.error ?? undefined,\n };\n } else {\n cloudUpload = {\n uploadedToHuggingFace: false,\n huggingFaceError:\n \"HuggingFace upload requested but not configured (set ELIZA_TRAJECTORY_HF_REPO and an HF token)\",\n };\n }\n }\n\n let taskDataset: TrajectoryTaskDatasetExport | null = null;\n if (sanitizedJsonlText !== null || sanitizedTrajectories.length > 0) {\n const taskDatasetDir = join(options.outputDir, \"tasks\");\n taskDataset = await exportTrajectoryTaskDatasets(\n sanitizedJsonlText !== null && options.sanitizedJsonlPath\n ? sanitizedJsonlText\n : sanitizedTrajectories,\n taskDatasetDir,\n options.tasks,\n );\n }\n\n const taskFiles = buildTaskFiles(taskDataset);\n const taskExamples = Object.values(taskFiles).reduce(\n (sum, task) => sum + task.exampleCount,\n 0,\n );\n const taskCounts = taskDataset?.counts ?? emptyTaskCounts();\n const manifestPath = join(options.outputDir, \"manifest.json\");\n const viewerHtmlPath = join(options.outputDir, \"index.html\");\n const generatedAt = (options.now?.() ?? new Date()).toISOString();\n const runLineage = resolveBundleRunIds(options.source, [\n ...inputTrajectories,\n ...sanitizedTrajectories,\n ]);\n const manifest: TrajectoryExportBundleManifest = {\n schema: TRAJECTORY_EXPORT_BUNDLE_SCHEMA,\n schemaVersion: TRAJECTORY_EXPORT_BUNDLE_VERSION,\n generatedAt,\n runId: runLineage.runId,\n source: {\n kind: options.source?.kind ?? \"trajectory-export-bundle\",\n runId: runLineage.runId ?? undefined,\n runIds: runLineage.runIds,\n inputTrajectoryCount: inputTrajectories.length || rawTrajectoryRows,\n sanitizedTrajectoryCount: sanitizedTrajectoryRows,\n droppedTrajectoryCount: privacy.droppedCount,\n metadata: options.source?.metadata\n ? (sortJsonValue(options.source.metadata) as Record<string, unknown>)\n : undefined,\n },\n paths: {\n bundleDir: options.outputDir,\n manifestPath,\n viewerHtmlPath,\n rawJsonlPath,\n sanitizedJsonlPath,\n taskDatasetDir: taskDataset\n ? join(options.outputDir, \"tasks\")\n : undefined,\n taskDatasetSummaryPath: taskDataset?.paths.summaryPath,\n },\n counts: {\n rawTrajectoryRows,\n sanitizedTrajectoryRows,\n taskRows: taskCounts,\n taskFiles: Object.keys(taskFiles).length,\n taskExamples,\n llmCalls: taskDataset?.summary.llmCallCount ?? null,\n skippedNonNativeRows: taskDataset?.summary.skippedNonNativeRows ?? null,\n },\n tasks: taskFiles,\n privacy,\n cloudUpload,\n };\n\n await writeFile(\n viewerHtmlPath,\n buildViewerHtml({\n manifest,\n sanitizedTrajectories:\n sanitizedJsonlText !== null\n ? parseJsonlRows(sanitizedJsonlText)\n : sanitizedTrajectories,\n taskExamples: taskDataset?.examples ?? emptyTaskExamples(),\n }),\n );\n await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`);\n\n return {\n outputDir: options.outputDir,\n manifestPath,\n manifest,\n };\n}\n"],"mappings":"AAAA,SAAS,UAAU,OAAO,UAAU,iBAAiB;AACrD,SAAS,YAAY;AAErB,SAAS,YAAY,wBAAwB;AAC7C;AAAA,EACE;AAAA,OAIK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAEA;AAAA,OAGK;AAEA,MAAM,kCAAkC;AACxC,MAAM,mCAAmC;AAiGhD,SAAS,YACP,OACwC;AACxC,SAAO;AAAA,IACL,gBAAgB,MAAM;AAAA,IACtB,iBAAiB,MAAM;AAAA,IACvB,gBAAgB,MAAM;AAAA,IACtB,UAAU,MAAM;AAAA,IAChB,mBAAmB,MAAM;AAAA,IACzB,cAAc,MAAM;AAAA,IACpB,kBAAkB,MAAM;AAAA,IACxB,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,IACzB,cAAc,MAAM;AAAA,IACpB,cAAc,MAAM;AAAA,IACpB,eAAe,MAAM;AAAA,IACrB,gBAAgB,MAAM;AAAA,IACtB,kBAAkB,MAAM;AAAA,EAC1B;AACF;AAEA,SAAS,cAAc,OAAyB;AAC9C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,aAAa;AAAA,EAChC;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,SAAkC,CAAC;AACzC,aAAW,OAAO,OAAO,KAAK,KAAK,EAAE,KAAK,GAAG;AAC3C,WAAO,GAAG,IAAI,cAAe,MAAkC,GAAG,CAAC;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAwB;AAC1C,SAAO,KAAK,UAAU,cAAc,KAAK,CAAC;AAC5C;AAEA,SAAS,MAAM,MAAkC;AAC/C,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,SAAO,GAAG,KAAK,IAAI,UAAU,EAAE,KAAK,IAAI,CAAC;AAAA;AAC3C;AAEA,SAAS,eAAe,SAAyB;AAC/C,SAAO,QACJ,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EAAE;AACrB;AAEA,SAAS,eAAe,MAAgC;AACtD,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAM,OAAkB,CAAC;AACzB,aAAW,QAAQ,KAAK,MAAM,IAAI,GAAG;AACnC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,QAAI;AACF,WAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,IAC/B,QAAQ;AACN,WAAK,KAAK,EAAE,YAAY,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC/C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAId;AACT,QAAM,OAAO;AAAA,IACX,UAAU,MAAM;AAAA,IAChB,uBAAuB,MAAM;AAAA,IAC7B,cAAc,MAAM;AAAA,EACtB;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBA6Ie,WAAW,MAAM,SAAS,WAAW,CAAC;AAAA,qBACzC,WAAW,MAAM,SAAS,OAAO,IAAI,CAAC;AAAA,kBACzC,WAAW,MAAM,SAAS,SAAS,OAAO,CAAC;AAAA,cAC/C,MAAM,SAAS,OAAO,uBAAuB;AAAA,cAC7C,MAAM,SAAS,OAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAeK,iBAAiB,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwF3E;AAEA,SAAS,sBACP,eACA,eACA,SACoC;AACpC,MAAI,eAAe;AACjB,WAAO;AAAA,EACT;AACA,MAAI,eAAe;AACjB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,gBAAgB,cAAc;AAAA,MAC9B,oBAAoB,cAAc;AAAA,MAClC,cAAc,cAAc,QAAQ;AAAA,MACpC,SAAS,cAAc;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,cAAc;AAAA,IACd,SAAS,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,eACP,SACyE;AACzE,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,QAAM,cAAc,YAAY,QAAQ,KAAK;AAC7C,QAAM,QAEF,CAAC;AACL,aAAW,QAAQ,QAAQ,QAAQ,OAAO;AACxC,UAAM,UAAU,QAAQ,QAAQ,YAAY,IAAI;AAChD,UAAM,IAAI,IAAI;AAAA,MACZ,MAAM,YAAY,IAAI;AAAA,MACtB,cAAc,QAAQ;AAAA,MACtB,iBAAiB,QAAQ;AAAA,MACzB,uBAAuB,QAAQ;AAAA,IACjC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAA0D;AACjE,SAAO,gBAAwB,MAAM,CAAC;AACxC;AAEA,SAAS,oBAGP;AACA,SAAO,gBAA8C,MAAM,CAAC,CAAC;AAC/D;AAEA,SAAS,eAAe,OAA+B;AACrD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IACtD,MAAM,KAAK,IACX;AACN;AAEA,SAAS,SAAS,QAAqB,OAAsB;AAC3D,QAAM,QAAQ,eAAe,KAAK;AAClC,MAAI,MAAO,QAAO,IAAI,KAAK;AAC7B;AAEA,SAAS,wBACP,cACU;AACV,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,cAAc,cAAc;AACrC,UAAM,SAAS;AAIf,aAAS,QAAQ,OAAO,KAAK;AAC7B,aAAS,QAAQ,OAAO,UAAU,KAAK;AACvC,aAAS,QAAQ,OAAO,UAAU,QAAQ;AAE1C,eAAW,QAAQ,WAAW,SAAS,CAAC,GAAG;AACzC,iBAAW,QAAQ,KAAK,YAAY,CAAC,GAAG;AACtC,iBAAS,QAAQ,KAAK,KAAK;AAAA,MAC7B;AACA,iBAAW,UAAU,KAAK,oBAAoB,CAAC,GAAG;AAChD,iBAAS,QAAQ,OAAO,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK;AAC1B;AAEA,SAAS,oBACP,QACA,cAC4C;AAC5C,QAAM,SAAS,IAAI,IAAY,wBAAwB,YAAY,CAAC;AACpE,WAAS,QAAQ,QAAQ,KAAK;AAC9B,aAAW,SAAS,QAAQ,UAAU,CAAC,GAAG;AACxC,aAAS,QAAQ,KAAK;AAAA,EACxB;AAEA,QAAM,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK;AAChC,QAAM,gBAAgB,eAAe,QAAQ,KAAK;AAClD,SAAO;AAAA,IACL,OAAO,kBAAkB,OAAO,WAAW,IAAI,OAAO,CAAC,IAAI;AAAA,IAC3D,QAAQ;AAAA,EACV;AACF;AAEA,eAAsB,4BACpB,SACiC;AACjC,QAAM,MAAM,QAAQ,WAAW,EAAE,WAAW,KAAK,CAAC;AAElD,QAAM,oBAAoB,QAAQ,gBAAgB,CAAC;AACnD,QAAM,yBAAyB;AAC/B,QAAM,uBACJ,QAAQ,0BAA0B,UAClC,QAAQ,uBAAuB;AACjC,QAAM,qBAAqB,QAAQ,SAAS,SAAS,CAAC;AACtD,QAAM,gBACJ,sBAAsB,uBAAuB,SAAS,IAClD,mBAAmB,wBAAwB,QAAQ,SAAS,OAAO,IACnE;AACN,QAAM,wBACJ,QAAQ,yBACP,eAAe,gBAChB,CAAC;AACH,QAAM,UAAU;AAAA,IACd;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,oBAAoB;AACxB,MAAI;AACJ,MAAI,QAAQ,iBAAiB;AAC3B,UAAM,MAAM,KAAK,QAAQ,WAAW,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,mBAAe,KAAK,QAAQ,WAAW,OAAO,wBAAwB;AACtE,QAAI,QAAQ,cAAc;AACxB,YAAM,SAAS,QAAQ,cAAc,YAAY;AACjD,0BAAoB,eAAe,MAAM,SAAS,cAAc,MAAM,CAAC;AAAA,IACzE,OAAO;AACL,YAAM,UAAU,cAAc,MAAM,iBAAiB,CAAC;AACtD,0BAAoB,kBAAkB;AAAA,IACxC;AAAA,EACF;AAEA,MAAI,0BAA0B,sBAAsB;AACpD,MAAI;AACJ,MAAI,qBAAoC;AACxC,MAAI,QAAQ,oBAAoB;AAC9B,UAAM,MAAM,KAAK,QAAQ,WAAW,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AACrE,yBAAqB;AAAA,MACnB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,oBAAoB,kBAAkB;AAC7D,yBAAqB,MAAM,SAAS,oBAAoB,MAAM;AAC9D,8BAA0B,eAAe,kBAAkB;AAAA,EAC7D,WAAW,sBAAsB,SAAS,KAAK,kBAAkB,SAAS,GAAG;AAC3E,UAAM,MAAM,KAAK,QAAQ,WAAW,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AACrE,yBAAqB;AAAA,MACnB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACA,yBAAqB,MAAM,qBAAqB;AAChD,UAAM,UAAU,oBAAoB,kBAAkB;AAAA,EACxD;AAIA,MAAI,cAAiD;AAAA,IACnD,uBAAuB;AAAA,EACzB;AACA,MAAI,QAAQ,uBAAuB,oBAAoB;AACrD,UAAM,eACJ,QAAQ,wBAAwB,OAC5B,sBAAsB,IACtB,QAAQ;AACd,QAAI,cAAc;AAChB,YAAM,aAAa,iBAAiB,QAAQ,MAAM,KAAK,oBAAI,KAAK,GAC7D,YAAY,EACZ,QAAQ,SAAS,GAAG,CAAC;AACxB,YAAM,eAAe,MAAM;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,oBAAc;AAAA,QACZ,uBAAuB,aAAa;AAAA,QACpC,iBAAiB,aAAa,QAAQ;AAAA,QACtC,iBAAiB,aAAa,cAAc;AAAA,QAC5C,kBAAkB,aAAa,SAAS;AAAA,MAC1C;AAAA,IACF,OAAO;AACL,oBAAc;AAAA,QACZ,uBAAuB;AAAA,QACvB,kBACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAkD;AACtD,MAAI,uBAAuB,QAAQ,sBAAsB,SAAS,GAAG;AACnE,UAAM,iBAAiB,KAAK,QAAQ,WAAW,OAAO;AACtD,kBAAc,MAAM;AAAA,MAClB,uBAAuB,QAAQ,QAAQ,qBACnC,qBACA;AAAA,MACJ;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,YAAY,eAAe,WAAW;AAC5C,QAAM,eAAe,OAAO,OAAO,SAAS,EAAE;AAAA,IAC5C,CAAC,KAAK,SAAS,MAAM,KAAK;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,aAAa,aAAa,UAAU,gBAAgB;AAC1D,QAAM,eAAe,KAAK,QAAQ,WAAW,eAAe;AAC5D,QAAM,iBAAiB,KAAK,QAAQ,WAAW,YAAY;AAC3D,QAAM,eAAe,QAAQ,MAAM,KAAK,oBAAI,KAAK,GAAG,YAAY;AAChE,QAAM,aAAa,oBAAoB,QAAQ,QAAQ;AAAA,IACrD,GAAG;AAAA,IACH,GAAG;AAAA,EACL,CAAC;AACD,QAAM,WAA2C;AAAA,IAC/C,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA,OAAO,WAAW;AAAA,IAClB,QAAQ;AAAA,MACN,MAAM,QAAQ,QAAQ,QAAQ;AAAA,MAC9B,OAAO,WAAW,SAAS;AAAA,MAC3B,QAAQ,WAAW;AAAA,MACnB,sBAAsB,kBAAkB,UAAU;AAAA,MAClD,0BAA0B;AAAA,MAC1B,wBAAwB,QAAQ;AAAA,MAChC,UAAU,QAAQ,QAAQ,WACrB,cAAc,QAAQ,OAAO,QAAQ,IACtC;AAAA,IACN;AAAA,IACA,OAAO;AAAA,MACL,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,cACZ,KAAK,QAAQ,WAAW,OAAO,IAC/B;AAAA,MACJ,wBAAwB,aAAa,MAAM;AAAA,IAC7C;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,WAAW,OAAO,KAAK,SAAS,EAAE;AAAA,MAClC;AAAA,MACA,UAAU,aAAa,QAAQ,gBAAgB;AAAA,MAC/C,sBAAsB,aAAa,QAAQ,wBAAwB;AAAA,IACrE;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,MACd;AAAA,MACA,uBACE,uBAAuB,OACnB,eAAe,kBAAkB,IACjC;AAAA,MACN,cAAc,aAAa,YAAY,kBAAkB;AAAA,IAC3D,CAAC;AAAA,EACH;AACA,QAAM,UAAU,cAAc,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAEtE,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB;AAAA,IACA;AAAA,EACF;AACF;","names":[]}