@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 @@
1
+ {"version":3,"sources":["../../src/routes/trajectory-routes.ts"],"sourcesContent":["/**\n * Trajectory API routes for the Eliza Control UI.\n *\n * Provides endpoints for:\n * - Listing and searching trajectories\n * - Viewing trajectory details with LLM calls and provider accesses\n * - Exporting trajectories to JSON, CSV, or ZIP\n * - Deleting trajectories\n * - Getting trajectory statistics\n * - Enabling/disabling trajectory logging\n *\n * Uses the native trajectories service for data access.\n */\n\nimport type http from \"node:http\";\nimport type {\n Trajectory,\n TrajectoryExportFormat,\n TrajectoryExportOptions,\n TrajectoryExportResult,\n TrajectoryListItem,\n TrajectoryListOptions,\n TrajectoryListResult,\n TrajectoryLlmCall,\n TrajectoryStatus,\n TrajectoryStep,\n} from \"@elizaos/agent\";\nimport {\n createZipArchive,\n enrichTrajectoryLlmCall,\n executeRawSql,\n extractRows,\n type PersistedStep,\n type PersistedTrajectory,\n saveTrajectory,\n} from \"@elizaos/agent\";\nimport {\n type AgentRuntime,\n ELIZA_NATIVE_TRAJECTORY_FORMAT,\n readJsonBody as parseJsonBody,\n sendJson,\n sendJsonError,\n} from \"@elizaos/core\";\nimport { listTrajectoryCallEntries } from \"../core/trajectory-consumer.js\";\n\nexport type { TrajectoryExportFormat };\n\ninterface TrajectoryLoggerApi {\n isEnabled(): boolean;\n setEnabled(enabled: boolean): void;\n listTrajectories(\n options: TrajectoryListOptions,\n ): Promise<TrajectoryListResult>;\n getTrajectoryDetail(trajectoryId: string): Promise<Trajectory | null>;\n getStats(): Promise<unknown>;\n deleteTrajectories(trajectoryIds: string[]): Promise<number>;\n clearAllTrajectories(): Promise<number>;\n exportTrajectories(\n options: RouteTrajectoryExportOptions,\n ): Promise<TrajectoryExportResult>;\n exportTrajectoriesZip?: (\n options: TrajectoryZipExportOptions,\n ) => Promise<TrajectoryZipExportResult>;\n}\n\ntype TrajectoryZipExportOptions = {\n includePrompts?: boolean;\n trajectoryIds?: string[];\n startDate?: string;\n endDate?: string;\n scenarioId?: string;\n batchId?: string;\n};\n\ntype TrajectoryZipExportResult = {\n filename: string;\n entries: Array<{ name: string; data: string }>;\n};\n\n// UI Compatible Types\n\ninterface UITrajectoryRecord {\n id: string;\n agentId: string;\n roomId: string | null;\n entityId: string | null;\n conversationId: string | null;\n source: string;\n status: \"active\" | \"completed\" | \"error\";\n startTime: number;\n endTime: number | null;\n durationMs: number | null;\n llmCallCount: number;\n providerAccessCount: number;\n totalPromptTokens: number;\n totalCompletionTokens: number;\n scenarioId?: string | null;\n batchId?: string | null;\n metadata: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface UILlmCall {\n id: string;\n trajectoryId: string;\n stepId: string;\n model: string;\n systemPrompt: string;\n userPrompt: string;\n response: string;\n temperature: number;\n maxTokens: number;\n purpose: string;\n actionType: string;\n stepType: string;\n tags: string[];\n latencyMs: number;\n promptTokens?: number;\n completionTokens?: number;\n timestamp: number;\n createdAt: string;\n}\n\ninterface UIProviderAccess {\n id: string;\n trajectoryId: string;\n stepId: string;\n providerName: string;\n purpose: string;\n data: Record<string, unknown>;\n query?: Record<string, unknown>;\n timestamp: number;\n createdAt: string;\n}\n\ninterface UITrajectoryDetailResult {\n trajectory: UITrajectoryRecord;\n llmCalls: UILlmCall[];\n providerAccesses: UIProviderAccess[];\n events?: UITrajectoryEvent[];\n contextEvents?: UIContextEvent[];\n toolEvents?: UINativeToolCallEvent[];\n evaluationEvents?: UIEvaluationEvent[];\n cacheObservations?: UICacheObservation[];\n cacheStats?: UICacheStats;\n contextDiffs?: UIContextDiff[];\n}\n\ntype UIContextEvent = Record<string, unknown> & {\n id: string;\n type: string;\n createdAt?: number;\n source?: string;\n metadata?: Record<string, unknown>;\n};\n\ninterface UITrajectoryEventBase {\n id: string;\n trajectoryId?: string;\n stepId?: string;\n stage?: string;\n timestamp?: number;\n createdAt?: string;\n metadata?: Record<string, unknown>;\n}\n\ntype UIToolCallStatus =\n | \"queued\"\n | \"running\"\n | \"completed\"\n | \"skipped\"\n | \"failed\";\n\ninterface UINativeToolCallEvent extends UITrajectoryEventBase {\n type: \"tool_call\" | \"tool_result\" | \"tool_error\";\n callId?: string;\n toolCallId?: string;\n actionName?: string;\n toolName?: string;\n name?: string;\n args?: Record<string, unknown>;\n input?: Record<string, unknown>;\n result?: unknown;\n output?: unknown;\n status?: UIToolCallStatus;\n success?: boolean;\n durationMs?: number;\n duration?: number;\n error?: string;\n}\n\ninterface UIEvaluationEvent extends UITrajectoryEventBase {\n type: \"evaluation\" | \"evaluator\";\n evaluatorName?: string;\n name?: string;\n status?: UIToolCallStatus;\n success?: boolean;\n decision?: string;\n thought?: string;\n result?: unknown;\n durationMs?: number;\n error?: string;\n}\n\ninterface UICacheObservation extends UITrajectoryEventBase {\n type: \"cache_observation\" | \"cache\";\n cacheName?: string;\n key?: string;\n scope?: string;\n hit: boolean;\n reason?: string;\n ttlMs?: number;\n ageMs?: number;\n sizeBytes?: number;\n tokenCount?: number;\n}\n\ninterface UIContextDiffChange {\n type: string;\n path?: string;\n before?: unknown;\n after?: unknown;\n summary?: string;\n tokenDelta?: number;\n}\n\ninterface UIContextDiff extends UITrajectoryEventBase {\n type: \"context_diff\";\n label?: string;\n beforeContextId?: string;\n afterContextId?: string;\n added?: number;\n removed?: number;\n changed?: number;\n tokenDelta?: number;\n changes?: UIContextDiffChange[];\n before?: unknown;\n after?: unknown;\n}\n\ntype UITrajectoryEvent =\n | UINativeToolCallEvent\n | UIEvaluationEvent\n | UICacheObservation\n | UIContextDiff\n | (UITrajectoryEventBase & { type: string; [key: string]: unknown });\n\ninterface UICacheStats {\n hits: number;\n misses: number;\n total: number;\n hitRate: number;\n tokenCount?: number;\n sizeBytes?: number;\n}\n\ntype RouteTrajectoryJsonShape = typeof ELIZA_NATIVE_TRAJECTORY_FORMAT;\n\ntype RouteTrajectoryExportOptions = Omit<\n TrajectoryExportOptions,\n \"jsonShape\"\n> & {\n jsonShape?: RouteTrajectoryJsonShape;\n};\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction isRouteCompatibleTrajectoryLogger(\n candidate: unknown,\n): candidate is TrajectoryLoggerApi {\n if (!candidate || typeof candidate !== \"object\") return false;\n const logger = candidate as Partial<TrajectoryLoggerApi>;\n\n return (\n typeof logger.isEnabled === \"function\" &&\n typeof logger.setEnabled === \"function\" &&\n typeof logger.listTrajectories === \"function\" &&\n typeof logger.getTrajectoryDetail === \"function\" &&\n typeof logger.getStats === \"function\" &&\n typeof logger.deleteTrajectories === \"function\" &&\n typeof logger.clearAllTrajectories === \"function\" &&\n typeof logger.exportTrajectories === \"function\"\n );\n}\n\ntype TrajectoryLoggerRuntimeLike = AgentRuntime & {\n getServicesByType?: (serviceType: string) => unknown;\n getService?: (serviceType: string) => unknown;\n getServiceLoadPromise?: (serviceType: string) => Promise<unknown>;\n getServiceRegistrationStatus?: (\n serviceType: string,\n ) => \"pending\" | \"registering\" | \"registered\" | \"failed\" | \"unknown\";\n};\n\nfunction collectCandidates(\n runtimeLike: TrajectoryLoggerRuntimeLike,\n): unknown[] {\n const seen = new Set<unknown>();\n const candidates: unknown[] = [];\n const add = (candidate: unknown): void => {\n if (!candidate || seen.has(candidate)) return;\n seen.add(candidate);\n candidates.push(candidate);\n };\n\n if (typeof runtimeLike.getServicesByType === \"function\") {\n const byType = runtimeLike.getServicesByType(\"trajectories\");\n if (Array.isArray(byType)) {\n for (const candidate of byType) {\n add(candidate);\n }\n } else {\n add(byType);\n }\n }\n\n if (typeof runtimeLike.getService === \"function\") {\n add(runtimeLike.getService(\"trajectories\"));\n }\n\n return candidates;\n}\n\nfunction findCompatibleLogger(\n candidates: unknown[],\n): TrajectoryLoggerApi | null {\n for (const candidate of candidates) {\n if (isRouteCompatibleTrajectoryLogger(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nasync function getTrajectoryLogger(\n runtime: AgentRuntime,\n): Promise<TrajectoryLoggerApi | null> {\n const runtimeLike = runtime as TrajectoryLoggerRuntimeLike;\n\n // Fast path: service already available.\n const immediate = findCompatibleLogger(collectCandidates(runtimeLike));\n if (immediate) return immediate;\n\n // The service may still be starting — wait for it if the runtime supports it.\n const status =\n typeof runtimeLike.getServiceRegistrationStatus === \"function\"\n ? runtimeLike.getServiceRegistrationStatus(\"trajectories\")\n : \"unknown\";\n\n if (\n (status === \"pending\" || status === \"registering\") &&\n typeof runtimeLike.getServiceLoadPromise === \"function\"\n ) {\n try {\n await Promise.race([\n runtimeLike.getServiceLoadPromise(\"trajectories\"),\n new Promise<void>((resolve) => setTimeout(resolve, 5000)),\n ]);\n } catch {\n // Service failed to start — fall through to return null.\n }\n\n // Re-check after waiting.\n return findCompatibleLogger(collectCandidates(runtimeLike));\n }\n\n return null;\n}\n\nfunction toNullableString(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction toFiniteNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction toOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction toOptionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction toCacheHit(value: unknown): boolean | null {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"hit\" || normalized === \"true\") return true;\n if (normalized === \"miss\" || normalized === \"false\") return false;\n }\n return null;\n}\n\nfunction toToolCallStatus(value: unknown): UIToolCallStatus | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim().toLowerCase();\n return normalized === \"queued\" ||\n normalized === \"running\" ||\n normalized === \"completed\" ||\n normalized === \"skipped\" ||\n normalized === \"failed\"\n ? normalized\n : undefined;\n}\n\nfunction normalizeCreatedAt(\n value: unknown,\n timestamp?: number,\n): string | undefined {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n if (typeof timestamp === \"number\" && Number.isFinite(timestamp)) {\n return new Date(timestamp).toISOString();\n }\n return undefined;\n}\n\nfunction timestampFromRecord(\n record: Record<string, unknown>,\n): number | undefined {\n const timestamp = toFiniteNumber(record.timestamp);\n if (timestamp !== null) return timestamp;\n\n const createdAt = toFiniteNumber(record.createdAt);\n if (createdAt !== null) return createdAt;\n\n if (typeof record.createdAt === \"string\") {\n const parsed = Date.parse(record.createdAt);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n return undefined;\n}\n\nfunction eventBaseFromRecord(\n record: Record<string, unknown>,\n trajectoryId: string,\n fallbackId: string,\n): UITrajectoryEventBase {\n const timestamp = timestampFromRecord(record);\n return {\n id: toOptionalString(record.id) ?? fallbackId,\n trajectoryId,\n stepId: toOptionalString(record.stepId),\n stage: toOptionalString(record.stage),\n timestamp,\n createdAt: normalizeCreatedAt(record.createdAt, timestamp),\n metadata: asRecord(record.metadata) ?? undefined,\n };\n}\n\nfunction normalizeContextEvent(\n event: unknown,\n index: number,\n): UIContextEvent | null {\n const record = asRecord(event);\n const type = toOptionalString(record?.type);\n if (!record || !type) return null;\n return {\n ...record,\n id: toOptionalString(record.id) ?? `context-event-${index}`,\n type,\n metadata: asRecord(record.metadata) ?? undefined,\n } as UIContextEvent;\n}\n\nfunction hasV5ContextEvents(traj: Trajectory): boolean {\n const record = asRecord(traj);\n const metadata = asRecord(traj.metadata);\n return Boolean(\n asRecord(record?.contextObject) ||\n asRecord(metadata?.contextObject) ||\n Array.isArray(record?.contextEvents) ||\n Array.isArray(metadata?.contextEvents) ||\n record?.contextObjectVersion === 5,\n );\n}\n\nfunction readContextEventsFromObject(value: unknown): unknown[] | null {\n const record = asRecord(value);\n return Array.isArray(record?.events) ? record.events : null;\n}\n\nfunction extractContextEventsForRoute(traj: Trajectory): unknown[] {\n const record = asRecord(traj);\n const metadata = asRecord(traj.metadata);\n\n return (\n readContextEventsFromObject(record?.contextObject) ??\n readContextEventsFromObject(metadata?.contextObject) ??\n (Array.isArray(record?.contextEvents) ? record.contextEvents : null) ??\n (Array.isArray(metadata?.contextEvents) ? metadata.contextEvents : null) ??\n (record?.contextObjectVersion === 5 && Array.isArray(record.events)\n ? record.events\n : null) ??\n []\n );\n}\n\nfunction readRecordArray(\n record: Record<string, unknown> | null,\n key: string,\n): Record<string, unknown>[] {\n const value = record?.[key];\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is Record<string, unknown> =>\n Boolean(asRecord(item)),\n );\n}\n\nfunction normalizeToolEvent(\n record: Record<string, unknown>,\n trajectoryId: string,\n fallbackId: string,\n): UINativeToolCallEvent | null {\n const type = toOptionalString(record.type);\n if (type !== \"tool_call\" && type !== \"tool_result\" && type !== \"tool_error\") {\n return null;\n }\n const tool = asRecord(record.tool);\n return {\n ...eventBaseFromRecord(record, trajectoryId, fallbackId),\n type,\n callId: toOptionalString(record.callId),\n toolCallId: toOptionalString(record.toolCallId),\n actionName: toOptionalString(record.actionName),\n toolName: toOptionalString(record.toolName) ?? toOptionalString(tool?.name),\n name: toOptionalString(record.name),\n args: asRecord(record.args) ?? undefined,\n input: asRecord(record.input) ?? undefined,\n result: record.result,\n output: record.output,\n status: toToolCallStatus(record.status),\n success: toOptionalBoolean(record.success),\n durationMs: toFiniteNumber(record.durationMs) ?? undefined,\n duration: toFiniteNumber(record.duration) ?? undefined,\n error: toOptionalString(record.error),\n };\n}\n\nfunction normalizeEvaluationEvent(\n record: Record<string, unknown>,\n trajectoryId: string,\n fallbackId: string,\n): UIEvaluationEvent | null {\n const type = toOptionalString(record.type);\n if (type !== \"evaluation\" && type !== \"evaluator\") return null;\n return {\n ...eventBaseFromRecord(record, trajectoryId, fallbackId),\n type,\n evaluatorName: toOptionalString(record.evaluatorName),\n name: toOptionalString(record.name),\n status: toToolCallStatus(record.status),\n success: toOptionalBoolean(record.success),\n decision: toOptionalString(record.decision),\n thought: toOptionalString(record.thought),\n result: record.result,\n durationMs: toFiniteNumber(record.durationMs) ?? undefined,\n error: toOptionalString(record.error),\n };\n}\n\nfunction normalizeCacheObservation(\n record: Record<string, unknown>,\n trajectoryId: string,\n fallbackId: string,\n): UICacheObservation | null {\n const type = toOptionalString(record.type);\n if (type !== \"cache_observation\" && type !== \"cache\") return null;\n const hit =\n toCacheHit(record.hit) ??\n toCacheHit(record.cacheHit) ??\n toCacheHit(record.result) ??\n toCacheHit(record.status);\n if (hit === null) return null;\n return {\n ...eventBaseFromRecord(record, trajectoryId, fallbackId),\n type,\n cacheName:\n toOptionalString(record.cacheName) ?? toOptionalString(record.name),\n key: toOptionalString(record.key),\n scope: toOptionalString(record.scope),\n hit,\n reason: toOptionalString(record.reason),\n ttlMs: toFiniteNumber(record.ttlMs) ?? undefined,\n ageMs: toFiniteNumber(record.ageMs) ?? undefined,\n sizeBytes: toFiniteNumber(record.sizeBytes) ?? undefined,\n tokenCount:\n toFiniteNumber(record.tokenCount) ??\n toFiniteNumber(record.cachedInputTokens) ??\n toFiniteNumber(record.cacheReadInputTokens) ??\n undefined,\n };\n}\n\nfunction normalizeContextDiffChange(\n value: unknown,\n): UIContextDiffChange | null {\n const record = asRecord(value);\n const type = toOptionalString(record?.type);\n if (!record || !type) return null;\n return {\n type,\n path: toOptionalString(record.path) ?? toOptionalString(record.key),\n before: record.before ?? record.previous,\n after: record.after ?? record.current,\n summary: toOptionalString(record.summary),\n tokenDelta: toFiniteNumber(record.tokenDelta) ?? undefined,\n };\n}\n\nfunction normalizeContextDiff(\n record: Record<string, unknown>,\n trajectoryId: string,\n fallbackId: string,\n): UIContextDiff | null {\n if (toOptionalString(record.type) !== \"context_diff\") return null;\n const summary = asRecord(record.summary);\n const changes = Array.isArray(record.changes)\n ? record.changes\n .map((change) => normalizeContextDiffChange(change))\n .filter((change): change is UIContextDiffChange => change !== null)\n : undefined;\n return {\n ...eventBaseFromRecord(record, trajectoryId, fallbackId),\n type: \"context_diff\",\n label: toOptionalString(record.label),\n beforeContextId: toOptionalString(record.beforeContextId),\n afterContextId: toOptionalString(record.afterContextId),\n added:\n toFiniteNumber(record.added) ??\n toFiniteNumber(summary?.added) ??\n undefined,\n removed:\n toFiniteNumber(record.removed) ??\n toFiniteNumber(summary?.removed) ??\n undefined,\n changed:\n toFiniteNumber(record.changed) ??\n toFiniteNumber(summary?.changed) ??\n undefined,\n tokenDelta:\n toFiniteNumber(record.tokenDelta) ??\n toFiniteNumber(summary?.tokenDelta) ??\n undefined,\n changes,\n before: record.before,\n after: record.after,\n };\n}\n\nfunction normalizeTrajectoryEvent(\n record: Record<string, unknown>,\n trajectoryId: string,\n fallbackId: string,\n): UITrajectoryEvent | null {\n const specialized =\n normalizeToolEvent(record, trajectoryId, fallbackId) ??\n normalizeEvaluationEvent(record, trajectoryId, fallbackId) ??\n normalizeCacheObservation(record, trajectoryId, fallbackId) ??\n normalizeContextDiff(record, trajectoryId, fallbackId);\n if (specialized) return specialized;\n\n const type = toOptionalString(record.type);\n if (!type) return null;\n return {\n ...record,\n ...eventBaseFromRecord(record, trajectoryId, fallbackId),\n type,\n } as UITrajectoryEvent;\n}\n\nfunction normalizeCacheStats(value: unknown): UICacheStats | null {\n const record = asRecord(value);\n if (!record) return null;\n const hits = toFiniteNumber(record.hits);\n const misses = toFiniteNumber(record.misses);\n const total = toFiniteNumber(record.total);\n if (hits === null || misses === null || total === null) return null;\n return {\n hits,\n misses,\n total,\n hitRate: toFiniteNumber(record.hitRate) ?? hits / Math.max(total, 1),\n tokenCount: toFiniteNumber(record.tokenCount) ?? undefined,\n sizeBytes: toFiniteNumber(record.sizeBytes) ?? undefined,\n };\n}\n\nfunction cacheStatsFromObservations(\n observations: UICacheObservation[],\n): UICacheStats | undefined {\n if (observations.length === 0) return undefined;\n const hits = observations.filter((observation) => observation.hit).length;\n const total = observations.length;\n const tokenCount = observations.reduce(\n (sum, observation) => sum + (observation.tokenCount ?? 0),\n 0,\n );\n const sizeBytes = observations.reduce(\n (sum, observation) => sum + (observation.sizeBytes ?? 0),\n 0,\n );\n return {\n hits,\n misses: total - hits,\n total,\n hitRate: hits / Math.max(total, 1),\n ...(tokenCount > 0 ? { tokenCount } : {}),\n ...(sizeBytes > 0 ? { sizeBytes } : {}),\n };\n}\n\nfunction contextEventToTrajectoryEvent(\n event: UIContextEvent,\n trajectoryId: string,\n index: number,\n): UITrajectoryEvent {\n const { createdAt: _createdAt, ...eventWithoutCreatedAt } = event;\n const stage =\n event.type === \"tool\"\n ? \"actions\"\n : event.type === \"cache\"\n ? \"cache\"\n : \"context\";\n const base = eventBaseFromRecord(\n { ...event, stage: event.stage ?? stage },\n trajectoryId,\n `context-event-${index}`,\n );\n return {\n ...eventWithoutCreatedAt,\n ...base,\n createdAt: base.createdAt,\n type: event.type,\n } as UITrajectoryEvent;\n}\n\nfunction embeddedEventRecordsFromContextEvent(\n event: UIContextEvent,\n): Record<string, unknown>[] {\n const metadata = asRecord(event.metadata);\n const value = event.type === \"metadata\" ? asRecord(event.value) : null;\n return [\n asRecord(event.event),\n asRecord(event.trajectoryEvent),\n asRecord(event.toolEvent),\n asRecord(event.cacheObservation),\n asRecord(event.contextDiff),\n asRecord(metadata?.event),\n asRecord(metadata?.trajectoryEvent),\n asRecord(metadata?.toolEvent),\n asRecord(metadata?.cacheObservation),\n asRecord(metadata?.contextDiff),\n value && toOptionalString(event.key) === \"toolEvent\"\n ? { ...value, type: value.type ?? \"tool_call\" }\n : null,\n value && toOptionalString(event.key) === \"cacheObservation\"\n ? { ...value, type: value.type ?? \"cache_observation\" }\n : null,\n value && toOptionalString(event.key) === \"contextDiff\"\n ? { ...value, type: value.type ?? \"context_diff\" }\n : null,\n ].filter((record): record is Record<string, unknown> => record !== null);\n}\n\nfunction cacheStatsFromContextEvents(\n events: UIContextEvent[],\n): UICacheStats | null {\n for (const event of events) {\n if (\n event.type === \"metadata\" &&\n (event.key === \"cacheStats\" || event.key === \"cache_stats\")\n ) {\n const stats = normalizeCacheStats(event.value);\n if (stats) return stats;\n }\n const metadata = asRecord(event.metadata);\n const stats = normalizeCacheStats(metadata?.cacheStats);\n if (stats) return stats;\n }\n return null;\n}\n\nfunction dedupeTrajectoryEvents<T extends { id?: string; type?: string }>(\n events: T[],\n): T[] {\n const seen = new Set<string>();\n const deduped: T[] = [];\n for (const [index, event] of events.entries()) {\n const key = `${event.type ?? \"event\"}:${event.id ?? index}`;\n if (seen.has(key)) continue;\n seen.add(key);\n deduped.push(event);\n }\n return deduped;\n}\n\nfunction buildUIEventFields(\n traj: Trajectory,\n trajectoryId: string,\n): Omit<\n UITrajectoryDetailResult,\n \"trajectory\" | \"llmCalls\" | \"providerAccesses\"\n> {\n const root = asRecord(traj);\n const metadata = asRecord(traj.metadata);\n const contextEvents = hasV5ContextEvents(traj)\n ? extractContextEventsForRoute(traj)\n .map((event, index) => normalizeContextEvent(event, index))\n .filter((event): event is UIContextEvent => event !== null)\n : [];\n\n const explicitRecords = [\n ...readRecordArray(root, \"events\"),\n ...readRecordArray(metadata, \"events\"),\n ...readRecordArray(metadata, \"trajectoryEvents\"),\n ...contextEvents,\n ...contextEvents.flatMap(embeddedEventRecordsFromContextEvent),\n ];\n\n const toolEvents = dedupeTrajectoryEvents(\n [\n ...readRecordArray(root, \"toolEvents\"),\n ...readRecordArray(metadata, \"toolEvents\"),\n ...explicitRecords,\n ]\n .map((record, index) =>\n normalizeToolEvent(record, trajectoryId, `tool-event-${index}`),\n )\n .filter((event): event is UINativeToolCallEvent => event !== null),\n );\n\n const evaluationEvents = dedupeTrajectoryEvents(\n [\n ...readRecordArray(root, \"evaluationEvents\"),\n ...readRecordArray(metadata, \"evaluationEvents\"),\n ...explicitRecords,\n ]\n .map((record, index) =>\n normalizeEvaluationEvent(\n record,\n trajectoryId,\n `evaluation-event-${index}`,\n ),\n )\n .filter((event): event is UIEvaluationEvent => event !== null),\n );\n\n const cacheObservations = dedupeTrajectoryEvents(\n [\n ...readRecordArray(root, \"cacheObservations\"),\n ...readRecordArray(metadata, \"cacheObservations\"),\n ...explicitRecords,\n ]\n .map((record, index) =>\n normalizeCacheObservation(\n record,\n trajectoryId,\n `cache-observation-${index}`,\n ),\n )\n .filter((event): event is UICacheObservation => event !== null),\n );\n\n const contextDiffs = dedupeTrajectoryEvents(\n [\n ...readRecordArray(root, \"contextDiffs\"),\n ...readRecordArray(metadata, \"contextDiffs\"),\n ...explicitRecords,\n ]\n .map((record, index) =>\n normalizeContextDiff(record, trajectoryId, `context-diff-${index}`),\n )\n .filter((event): event is UIContextDiff => event !== null),\n );\n\n const events = dedupeTrajectoryEvents([\n ...explicitRecords\n .map((record, index) =>\n normalizeTrajectoryEvent(record, trajectoryId, `event-${index}`),\n )\n .filter((event): event is UITrajectoryEvent => event !== null),\n ...contextEvents.map((event, index) =>\n contextEventToTrajectoryEvent(event, trajectoryId, index),\n ),\n ...toolEvents,\n ...evaluationEvents,\n ...cacheObservations,\n ...contextDiffs,\n ]);\n\n const cacheStats =\n normalizeCacheStats(root?.cacheStats) ??\n normalizeCacheStats(metadata?.cacheStats) ??\n cacheStatsFromContextEvents(contextEvents) ??\n cacheStatsFromObservations(cacheObservations);\n\n return {\n ...(events.length > 0 ? { events } : {}),\n ...(contextEvents.length > 0 ? { contextEvents } : {}),\n ...(toolEvents.length > 0 ? { toolEvents } : {}),\n ...(evaluationEvents.length > 0 ? { evaluationEvents } : {}),\n ...(cacheObservations.length > 0 ? { cacheObservations } : {}),\n ...(cacheStats ? { cacheStats } : {}),\n ...(contextDiffs.length > 0 ? { contextDiffs } : {}),\n };\n}\n\nfunction estimateTokenCount(text: string): number {\n return Math.max(1, Math.ceil(text.length / 4));\n}\n\nfunction buildDisplayMetadata(traj: Trajectory): Record<string, unknown> {\n const metadata = { ...(asRecord(traj.metadata) ?? {}) };\n const calls = listTrajectoryCallEntries(traj).map((entry) => entry.call);\n if (\n calls.length > 0 &&\n !calls.every((call) => isSyntheticTrajectoryCall(call))\n ) {\n delete metadata.syntheticLlmCall;\n delete metadata.syntheticLlmCallSource;\n }\n return metadata;\n}\n\nfunction normalizePersistedStatus(value: unknown): TrajectoryStatus {\n const normalized = String(value ?? \"\")\n .trim()\n .toLowerCase();\n if (\n normalized === \"active\" ||\n normalized === \"completed\" ||\n normalized === \"error\" ||\n normalized === \"timeout\"\n ) {\n return normalized;\n }\n return normalized.length > 0 ? \"completed\" : \"active\";\n}\n\nfunction toPersistedTrajectory(traj: Trajectory): PersistedTrajectory {\n const metadata = buildDisplayMetadata(traj);\n const status = normalizePersistedStatus(\n traj.metrics?.finalStatus ??\n (typeof traj.endTime === \"number\" ? \"completed\" : \"active\"),\n );\n const persistedSteps: PersistedStep[] = (traj.steps ?? []).map(\n (step, index) => ({\n stepId:\n typeof step.stepId === \"string\" && step.stepId.trim().length > 0\n ? step.stepId.trim()\n : `${traj.trajectoryId}-step-${index + 1}`,\n stepNumber: index,\n timestamp:\n typeof step.timestamp === \"number\" && Number.isFinite(step.timestamp)\n ? step.timestamp\n : traj.startTime,\n llmCalls: (step.llmCalls ?? []).map((call, callIndex) => {\n const normalizedCall = enrichTrajectoryLlmCall(\n call as Record<string, unknown>,\n ) as TrajectoryLlmCall;\n return {\n callId:\n typeof normalizedCall.callId === \"string\" &&\n normalizedCall.callId.trim().length > 0\n ? normalizedCall.callId.trim()\n : `${traj.trajectoryId}-call-${index + 1}-${callIndex + 1}`,\n timestamp:\n typeof normalizedCall.timestamp === \"number\" &&\n Number.isFinite(normalizedCall.timestamp)\n ? normalizedCall.timestamp\n : step.timestamp,\n model:\n typeof normalizedCall.model === \"string\"\n ? normalizedCall.model\n : \"unknown\",\n systemPrompt:\n typeof normalizedCall.systemPrompt === \"string\"\n ? normalizedCall.systemPrompt\n : \"\",\n userPrompt:\n typeof normalizedCall.userPrompt === \"string\"\n ? normalizedCall.userPrompt\n : \"\",\n response:\n typeof normalizedCall.response === \"string\"\n ? normalizedCall.response\n : \"\",\n temperature: toFiniteNumber(normalizedCall.temperature) ?? 0,\n maxTokens: toFiniteNumber(normalizedCall.maxTokens) ?? 0,\n purpose:\n typeof normalizedCall.purpose === \"string\"\n ? normalizedCall.purpose\n : \"\",\n actionType:\n typeof normalizedCall.actionType === \"string\"\n ? normalizedCall.actionType\n : \"\",\n stepType:\n typeof normalizedCall.stepType === \"string\"\n ? normalizedCall.stepType\n : undefined,\n tags: Array.isArray(normalizedCall.tags)\n ? normalizedCall.tags.filter(\n (tag): tag is string => typeof tag === \"string\",\n )\n : undefined,\n latencyMs: toFiniteNumber(normalizedCall.latencyMs) ?? 0,\n promptTokens:\n toFiniteNumber(normalizedCall.promptTokens) ?? undefined,\n completionTokens:\n toFiniteNumber(normalizedCall.completionTokens) ?? undefined,\n };\n }),\n providerAccesses: (step.providerAccesses ?? []).map(\n (access, accessIndex) => ({\n providerId:\n typeof access.providerId === \"string\" &&\n access.providerId.trim().length > 0\n ? access.providerId.trim()\n : `${traj.trajectoryId}-provider-${index + 1}-${accessIndex + 1}`,\n providerName:\n typeof access.providerName === \"string\"\n ? access.providerName\n : \"unknown\",\n timestamp:\n typeof access.timestamp === \"number\" &&\n Number.isFinite(access.timestamp)\n ? access.timestamp\n : step.timestamp,\n data: asRecord(access.data) ?? {},\n query: asRecord(access.query) ?? undefined,\n purpose: typeof access.purpose === \"string\" ? access.purpose : \"\",\n }),\n ),\n }),\n );\n\n return {\n id: traj.trajectoryId,\n source: toNullableString(metadata.source) ?? \"runtime\",\n status,\n startTime: traj.startTime,\n endTime: typeof traj.endTime === \"number\" ? traj.endTime : null,\n scenarioId:\n typeof traj.scenarioId === \"string\" ? traj.scenarioId : undefined,\n batchId: typeof traj.batchId === \"string\" ? traj.batchId : undefined,\n steps: persistedSteps,\n metadata,\n totalReward: 0,\n createdAt: new Date(traj.startTime).toISOString(),\n updatedAt: new Date(\n typeof traj.endTime === \"number\" ? traj.endTime : Date.now(),\n ).toISOString(),\n };\n}\n\nfunction listItemToUIRecord(item: TrajectoryListItem): UITrajectoryRecord {\n const status =\n item.status === \"timeout\" || item.status === \"error\"\n ? \"error\"\n : item.status;\n return {\n id: item.id,\n agentId: item.agentId,\n roomId: null,\n entityId: null,\n conversationId: null,\n source: item.source,\n status: status as \"active\" | \"completed\" | \"error\",\n startTime: item.startTime,\n endTime: item.endTime,\n durationMs: item.durationMs,\n llmCallCount: item.llmCallCount,\n providerAccessCount: item.providerAccessCount,\n totalPromptTokens: item.totalPromptTokens,\n totalCompletionTokens: item.totalCompletionTokens,\n ...(item.scenarioId ? { scenarioId: item.scenarioId } : {}),\n ...(item.batchId ? { batchId: item.batchId } : {}),\n metadata: {\n ...(item.metadata ?? {}),\n ...(item.scenarioId ? { scenarioId: item.scenarioId } : {}),\n ...(item.batchId ? { batchId: item.batchId } : {}),\n },\n createdAt: item.createdAt,\n updatedAt: item.updatedAt ?? item.createdAt,\n };\n}\n\nfunction trajectoryToUIDetail(traj: Trajectory): UITrajectoryDetailResult {\n const finalStatus = (traj.metrics?.finalStatus as string) ?? \"completed\";\n const normalizedEndTime =\n typeof traj.endTime === \"number\" && traj.endTime > 0 ? traj.endTime : null;\n const status: \"active\" | \"completed\" | \"error\" =\n finalStatus === \"timeout\" ||\n finalStatus === \"terminated\" ||\n finalStatus === \"error\"\n ? \"error\"\n : finalStatus === \"completed\"\n ? \"completed\"\n : normalizedEndTime\n ? \"completed\"\n : \"active\";\n\n const llmCalls: UILlmCall[] = [];\n const providerAccesses: UIProviderAccess[] = [];\n\n let totalPromptTokens = 0;\n let totalCompletionTokens = 0;\n\n const trajectoryId = String(traj.trajectoryId);\n for (const entry of listTrajectoryCallEntries(traj)) {\n const call = enrichTrajectoryLlmCall(\n entry.call as Record<string, unknown>,\n ) as TrajectoryLlmCall;\n llmCalls.push({\n id: call.callId || `${entry.stepId}-call-${entry.callIndex}`,\n trajectoryId,\n stepId: entry.stepId,\n model: call.model || \"unknown\",\n systemPrompt: call.systemPrompt || \"\",\n userPrompt: call.userPrompt || \"\",\n response: call.response || \"\",\n temperature: typeof call.temperature === \"number\" ? call.temperature : 0,\n maxTokens: typeof call.maxTokens === \"number\" ? call.maxTokens : 0,\n purpose: call.purpose || \"\",\n actionType: call.actionType || \"\",\n stepType: call.stepType || \"\",\n tags: Array.isArray(call.tags)\n ? call.tags.filter((tag): tag is string => typeof tag === \"string\")\n : [],\n latencyMs: call.latencyMs || 0,\n promptTokens: call.promptTokens,\n completionTokens: call.completionTokens,\n timestamp: call.timestamp || entry.step.timestamp,\n createdAt: new Date(call.timestamp || entry.step.timestamp).toISOString(),\n });\n totalPromptTokens += call.promptTokens || 0;\n totalCompletionTokens += call.completionTokens || 0;\n }\n\n for (let i = 0; i < (traj.steps || []).length; i++) {\n const step = traj.steps?.[i];\n if (!step) continue;\n const stepId = typeof step.stepId === \"string\" ? step.stepId : `step-${i}`;\n const providerAccessList = step.providerAccesses ?? [];\n for (let k = 0; k < providerAccessList.length; k++) {\n const access = providerAccessList[k];\n providerAccesses.push({\n id: access.providerId || `${stepId}-provider-${k}`,\n trajectoryId,\n stepId,\n providerName: access.providerName || \"unknown\",\n purpose: access.purpose || \"\",\n data: access.data || {},\n query: access.query,\n timestamp: access.timestamp || step.timestamp,\n createdAt: new Date(access.timestamp || step.timestamp).toISOString(),\n });\n }\n }\n\n const metadata = buildDisplayMetadata(traj);\n const normalizedDurationMs =\n status === \"active\"\n ? null\n : typeof traj.durationMs === \"number\"\n ? traj.durationMs\n : null;\n const updatedAtMs = normalizedEndTime ?? (traj.startTime || Date.now());\n\n const trajectory: UITrajectoryRecord = {\n id: trajectoryId,\n agentId: String(traj.agentId),\n roomId: toNullableString(metadata.roomId),\n entityId: toNullableString(metadata.entityId),\n conversationId: toNullableString(metadata.conversationId),\n source: toNullableString(metadata.source) ?? \"chat\",\n status,\n startTime: traj.startTime,\n endTime: normalizedEndTime,\n durationMs: normalizedDurationMs,\n llmCallCount: llmCalls.length,\n providerAccessCount: providerAccesses.length,\n totalPromptTokens,\n totalCompletionTokens,\n metadata,\n createdAt: new Date(traj.startTime).toISOString(),\n updatedAt: new Date(updatedAtMs).toISOString(),\n };\n\n return {\n trajectory,\n llmCalls,\n providerAccesses,\n ...buildUIEventFields(traj, trajectoryId),\n };\n}\n\nconst LEGACY_SYNTHETIC_RESPONSE_MARKER = \"place\" + \"holder call inserted\";\n\nfunction isSyntheticTrajectoryCall(call: TrajectoryLlmCall): boolean {\n const model = String(call.model ?? \"\").toLowerCase();\n const systemPrompt = String(call.systemPrompt ?? \"\").toLowerCase();\n const response = String(call.response ?? \"\").toLowerCase();\n\n return (\n model.includes(\"synthetic\") ||\n systemPrompt.includes(\"[synthetic]\") ||\n response.includes(LEGACY_SYNTHETIC_RESPONSE_MARKER)\n );\n}\n\nfunction needsConversationBackfill(traj: Trajectory): boolean {\n const calls = listTrajectoryCallEntries(traj).map((entry) => entry.call);\n if (calls.length === 0) {\n return true;\n }\n return calls.every((call) => isSyntheticTrajectoryCall(call));\n}\n\nfunction extractMessageText(memory: unknown): string {\n if (!memory || typeof memory !== \"object\") return \"\";\n const content = (memory as { content?: { text?: unknown } }).content;\n return typeof content?.text === \"string\" ? content.text.trim() : \"\";\n}\n\nfunction isTextGenerationLogRow(\n type: string,\n body: Record<string, unknown>,\n): boolean {\n if (!type.startsWith(\"useModel:\")) return false;\n const modelType =\n typeof body.modelType === \"string\" && body.modelType.trim().length > 0\n ? body.modelType.trim().toUpperCase()\n : type.slice(\"useModel:\".length).trim().toUpperCase();\n return (\n modelType === \"TEXT_SMALL\" ||\n modelType === \"TEXT_LARGE\" ||\n modelType === \"TEXT_COMPLETION\" ||\n modelType === \"REASONING_SMALL\" ||\n modelType === \"REASONING_LARGE\"\n );\n}\n\nasync function maybeBackfillTrajectoryFromUseModelLogs(\n runtime: AgentRuntime,\n traj: Trajectory,\n): Promise<Trajectory> {\n if (!needsConversationBackfill(traj)) {\n return traj;\n }\n\n const metadata = (traj.metadata ?? {}) as Record<string, unknown>;\n const messageId = toNullableString(metadata.messageId);\n const roomId = toNullableString(metadata.roomId);\n if (!messageId && !roomId) {\n return traj;\n }\n\n try {\n const result = await executeRawSql(\n runtime,\n \"SELECT type, body, room_id, created_at FROM logs ORDER BY created_at DESC LIMIT 500\",\n );\n const rows = extractRows(result);\n if (!Array.isArray(rows) || rows.length === 0) {\n return traj;\n }\n\n const normalizedRows = rows\n .map((row) => {\n const record = asRecord(row);\n if (!record) return null;\n const bodyValue = record.body;\n const body =\n asRecord(bodyValue) ??\n (typeof bodyValue === \"string\"\n ? asRecord(JSON.parse(bodyValue))\n : null);\n if (!body) return null;\n return {\n type: typeof record.type === \"string\" ? record.type : \"\",\n roomId: toNullableString(record.room_id),\n createdAt:\n typeof record.created_at === \"string\" ? record.created_at : null,\n body,\n };\n })\n .filter((row): row is NonNullable<typeof row> => row !== null);\n\n const runEventCandidates = normalizedRows.filter((row) => {\n if (row.type !== \"run_event\") return false;\n const body = row.body;\n if (typeof body.runId !== \"string\" || body.runId.trim().length === 0) {\n return false;\n }\n if (messageId && body.messageId === messageId) {\n return true;\n }\n const loggedRoomId = toNullableString(body.roomId) ?? row.roomId;\n const startTime = toFiniteNumber(body.startTime);\n const endTime = toFiniteNumber(body.endTime) ?? startTime;\n return (\n !!roomId &&\n loggedRoomId === roomId &&\n startTime !== null &&\n endTime !== null &&\n endTime >= traj.startTime - 60_000 &&\n startTime <= (traj.endTime ?? traj.startTime + 120_000) + 60_000\n );\n });\n\n if (runEventCandidates.length === 0) {\n return traj;\n }\n\n runEventCandidates.sort((left, right) => {\n const leftStart = toFiniteNumber(left.body.startTime) ?? 0;\n const rightStart = toFiniteNumber(right.body.startTime) ?? 0;\n return (\n Math.abs(leftStart - traj.startTime) -\n Math.abs(rightStart - traj.startTime)\n );\n });\n\n const runId = String(runEventCandidates[0].body.runId);\n const useModelRows = normalizedRows\n .filter(\n (row) =>\n row.body.runId === runId &&\n isTextGenerationLogRow(row.type, row.body),\n )\n .sort((left, right) => {\n const leftTs =\n toFiniteNumber(left.body.timestamp) ??\n Date.parse(left.createdAt ?? \"\");\n const rightTs =\n toFiniteNumber(right.body.timestamp) ??\n Date.parse(right.createdAt ?? \"\");\n return leftTs - rightTs;\n });\n\n if (useModelRows.length === 0) {\n return traj;\n }\n\n const baseSteps: TrajectoryStep[] =\n traj.steps && traj.steps.length > 0\n ? traj.steps.map((step) => ({\n ...step,\n llmCalls: [] as TrajectoryLlmCall[],\n }))\n : [\n {\n stepId: traj.trajectoryId,\n timestamp: traj.startTime,\n llmCalls: [] as TrajectoryLlmCall[],\n providerAccesses: [],\n },\n ];\n\n const firstCallTimestamp =\n toFiniteNumber(useModelRows[0]?.body.timestamp) ?? traj.startTime;\n baseSteps[0] = {\n ...baseSteps[0],\n timestamp:\n typeof baseSteps[0].timestamp === \"number\"\n ? Math.min(baseSteps[0].timestamp, firstCallTimestamp)\n : firstCallTimestamp,\n llmCalls: useModelRows.map((row, index) => {\n const body = row.body;\n const systemPrompt =\n typeof body.systemPrompt === \"string\" ? body.systemPrompt : \"\";\n const userPrompt = typeof body.prompt === \"string\" ? body.prompt : \"\";\n const response = typeof body.response === \"string\" ? body.response : \"\";\n const modelKey =\n typeof body.modelKey === \"string\" && body.modelKey.trim().length > 0\n ? body.modelKey.trim()\n : row.type.slice(\"useModel:\".length);\n const provider =\n typeof body.provider === \"string\" && body.provider.trim().length > 0\n ? body.provider.trim()\n : \"\";\n const model =\n provider && modelKey.toUpperCase().startsWith(\"TEXT_\")\n ? `${provider}/${modelKey}`\n : modelKey || provider || \"unknown\";\n return {\n callId: `${traj.trajectoryId}-log-${index + 1}`,\n timestamp:\n toFiniteNumber(body.timestamp) ?? Date.parse(row.createdAt ?? \"\"),\n model,\n systemPrompt,\n userPrompt,\n response,\n temperature: toFiniteNumber(body.temperature) ?? 0,\n maxTokens: toFiniteNumber(body.maxTokens) ?? 0,\n purpose: \"chat\",\n actionType: \"runtime.useModel\",\n latencyMs: Math.max(\n 0,\n Math.round(toFiniteNumber(body.executionTime) ?? 0),\n ),\n promptTokens: estimateTokenCount(systemPrompt + userPrompt),\n completionTokens: estimateTokenCount(response),\n };\n }),\n };\n\n const nextMetadata: Record<string, unknown> = {\n ...metadata,\n llmCallBackfillSource: \"logs\",\n };\n delete nextMetadata.syntheticLlmCall;\n delete nextMetadata.syntheticLlmCallSource;\n\n const enriched: Trajectory = {\n ...traj,\n steps: baseSteps,\n metadata: nextMetadata as Trajectory[\"metadata\"],\n };\n\n try {\n await saveTrajectory(runtime, toPersistedTrajectory(enriched));\n } catch {\n // Best-effort persistence only; still return the enriched detail payload.\n }\n\n return enriched;\n } catch {\n return traj;\n }\n}\n\nasync function maybeBackfillTrajectoryFromConversationMemory(\n runtime: AgentRuntime,\n traj: Trajectory,\n): Promise<Trajectory> {\n const metadata = (traj.metadata ?? {}) as Record<string, unknown>;\n const roomId = toNullableString(metadata.roomId);\n if (!roomId) {\n return traj;\n }\n\n try {\n const memories = await runtime.getMemories({\n roomId,\n tableName: \"messages\",\n limit: 100,\n });\n if (!Array.isArray(memories) || memories.length === 0) {\n return traj;\n }\n\n const sortedMemories = [...memories].sort(\n (a, b) => Number(a.createdAt ?? 0) - Number(b.createdAt ?? 0),\n );\n const endTime =\n typeof traj.endTime === \"number\"\n ? traj.endTime\n : traj.startTime + 120_000;\n\n const userMemory = [...sortedMemories].reverse().find((memory) => {\n const createdAt = Number(memory.createdAt ?? 0);\n if (!Number.isFinite(createdAt)) return false;\n if (createdAt < traj.startTime - 60_000 || createdAt > endTime + 5_000) {\n return false;\n }\n return (\n memory.entityId !== runtime.agentId &&\n extractMessageText(memory).length > 0\n );\n });\n if (!userMemory) {\n return traj;\n }\n\n const userCreatedAt = Number(userMemory.createdAt ?? traj.startTime);\n const assistantMemory = sortedMemories.find((memory) => {\n const createdAt = Number(memory.createdAt ?? 0);\n if (!Number.isFinite(createdAt)) return false;\n if (createdAt < userCreatedAt || createdAt > endTime + 30_000) {\n return false;\n }\n return (\n memory.entityId === runtime.agentId &&\n extractMessageText(memory).length > 0\n );\n });\n if (!assistantMemory) {\n return traj;\n }\n\n const userPrompt = extractMessageText(userMemory);\n const response = extractMessageText(assistantMemory);\n if (!userPrompt || !response) {\n return traj;\n }\n\n const normalizedUserPrompt = userPrompt.toLowerCase();\n const normalizedResponse = response.toLowerCase();\n const existingCalls = (traj.steps ?? []).flatMap(\n (step) => step.llmCalls ?? [],\n );\n const alreadyCapturedConversation = existingCalls.some((call) => {\n const callPrompt = String(call.userPrompt ?? \"\")\n .trim()\n .toLowerCase();\n if (\n callPrompt &&\n (callPrompt.includes(normalizedUserPrompt) ||\n normalizedUserPrompt.includes(callPrompt))\n ) {\n return true;\n }\n\n const callResponse = String(call.response ?? \"\")\n .trim()\n .toLowerCase();\n return (\n callResponse.length > 0 &&\n (callResponse.includes(normalizedResponse) ||\n normalizedResponse.includes(callResponse))\n );\n });\n if (alreadyCapturedConversation) {\n return traj;\n }\n\n const baseSteps: TrajectoryStep[] =\n traj.steps && traj.steps.length > 0\n ? traj.steps.map((step) => ({\n ...step,\n llmCalls: [...(step.llmCalls ?? [])],\n }))\n : [\n {\n stepId: traj.trajectoryId,\n timestamp: traj.startTime,\n llmCalls: [] as TrajectoryLlmCall[],\n providerAccesses: [],\n },\n ];\n\n baseSteps[0] = {\n ...baseSteps[0],\n timestamp:\n typeof baseSteps[0].timestamp === \"number\"\n ? baseSteps[0].timestamp\n : userCreatedAt,\n llmCalls: [\n {\n callId: `${traj.trajectoryId}-conversation-memory`,\n timestamp: userCreatedAt,\n model: \"eliza/conversation-memory-backfill\",\n systemPrompt:\n \"[backfilled from conversation memory because the trajectory logger did not capture the live LLM call]\",\n userPrompt,\n response,\n temperature: 0,\n maxTokens: 0,\n purpose: \"chat\",\n actionType: \"conversation-memory-backfill\",\n latencyMs: Math.max(\n 0,\n Number(assistantMemory.createdAt ?? endTime) - userCreatedAt,\n ),\n },\n ...(baseSteps[0].llmCalls ?? []),\n ],\n };\n\n const nextMetadata: Record<string, unknown> = {\n ...metadata,\n llmCallBackfillSource: \"conversation-memory\",\n };\n delete nextMetadata.syntheticLlmCall;\n delete nextMetadata.syntheticLlmCallSource;\n\n const enriched: Trajectory = {\n ...traj,\n steps: baseSteps,\n metadata: nextMetadata as Trajectory[\"metadata\"],\n };\n try {\n await saveTrajectory(runtime, toPersistedTrajectory(enriched));\n } catch {\n // Best-effort persistence only; still return the enriched detail payload.\n }\n return enriched;\n } catch {\n return traj;\n }\n}\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nasync function handleGetTrajectories(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n runtime: AgentRuntime,\n): Promise<void> {\n const logger = await getTrajectoryLogger(runtime);\n if (!logger) {\n sendJsonError(res, \"Trajectories service not available\", 503);\n return;\n }\n\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n\n const options: TrajectoryListOptions = {\n limit: Math.min(\n 500,\n Math.max(1, Number(url.searchParams.get(\"limit\")) || 50),\n ),\n offset: Math.max(0, Number(url.searchParams.get(\"offset\")) || 0),\n source: url.searchParams.get(\"source\") || undefined,\n status:\n (url.searchParams.get(\"status\") as\n | \"active\"\n | \"completed\"\n | \"error\"\n | \"timeout\") || undefined,\n startDate: url.searchParams.get(\"startDate\") || undefined,\n endDate: url.searchParams.get(\"endDate\") || undefined,\n search: url.searchParams.get(\"search\") || undefined,\n scenarioId: url.searchParams.get(\"scenarioId\") || undefined,\n batchId: url.searchParams.get(\"batchId\") || undefined,\n isTrainingData: url.searchParams.has(\"isTrainingData\")\n ? url.searchParams.get(\"isTrainingData\") === \"true\"\n : undefined,\n };\n const limit = options.limit ?? 50;\n const offset = options.offset ?? 0;\n\n // Search is delegated to the SQL reader: `buildTrajectoryWhereClauses`\n // matches `search` against id/scenario_id/batch_id/metadata and the full\n // `steps_json` blob (which carries every llmCall systemPrompt/userPrompt/\n // response and providerAccess body). That covers the same surface as the\n // old in-memory filter, so `total` is the DB-wide COUNT and pagination\n // spans every match instead of only the first 500 rows.\n const result = await logger.listTrajectories(options);\n\n const uiResult = {\n trajectories: result.trajectories.map(listItemToUIRecord),\n total: result.total,\n offset,\n limit,\n };\n\n sendJson(res, uiResult);\n}\n\nasync function handleGetTrajectoryDetail(\n _req: http.IncomingMessage,\n res: http.ServerResponse,\n runtime: AgentRuntime,\n trajectoryId: string,\n): Promise<void> {\n const logger = await getTrajectoryLogger(runtime);\n if (!logger) {\n sendJsonError(res, \"Trajectories service not available\", 503);\n return;\n }\n\n const trajectory = await logger.getTrajectoryDetail(trajectoryId);\n if (!trajectory) {\n sendJsonError(res, `Trajectory \"${trajectoryId}\" not found`, 404);\n return;\n }\n\n const uiDetail = trajectoryToUIDetail(\n await maybeBackfillTrajectoryFromConversationMemory(\n runtime,\n await maybeBackfillTrajectoryFromUseModelLogs(runtime, trajectory),\n ),\n );\n sendJson(res, uiDetail);\n}\n\nasync function handleGetStats(\n _req: http.IncomingMessage,\n res: http.ServerResponse,\n runtime: AgentRuntime,\n): Promise<void> {\n const logger = await getTrajectoryLogger(runtime);\n if (!logger) {\n sendJsonError(res, \"Trajectories service not available\", 503);\n return;\n }\n\n const stats = await logger.getStats();\n sendJson(res, stats);\n}\n\nasync function handleGetConfig(\n _req: http.IncomingMessage,\n res: http.ServerResponse,\n runtime: AgentRuntime,\n): Promise<void> {\n const logger = await getTrajectoryLogger(runtime);\n if (!logger) {\n sendJsonError(res, \"Trajectories service not available\", 503);\n return;\n }\n\n sendJson(res, {\n enabled: logger.isEnabled(),\n });\n}\n\nasync function handlePutConfig(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n runtime: AgentRuntime,\n): Promise<void> {\n const logger = await getTrajectoryLogger(runtime);\n if (!logger) {\n sendJsonError(res, \"Trajectories service not available\", 503);\n return;\n }\n\n const body = await parseJsonBody<{ enabled?: boolean }>(req, res);\n if (!body) return;\n\n if (typeof body.enabled === \"boolean\") {\n logger.setEnabled(body.enabled);\n }\n\n sendJson(res, {\n enabled: logger.isEnabled(),\n });\n}\n\nasync function handleExportTrajectories(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n runtime: AgentRuntime,\n): Promise<void> {\n const logger = await getTrajectoryLogger(runtime);\n if (!logger) {\n sendJsonError(res, \"Trajectories service not available\", 503);\n return;\n }\n\n const body = await parseJsonBody<{\n format?: string;\n includePrompts?: boolean;\n trajectoryIds?: string[];\n startDate?: string;\n endDate?: string;\n scenarioId?: string;\n batchId?: string;\n jsonShape?: string;\n }>(req, res);\n if (!body) return;\n\n if (body.format === \"zip\") {\n if (typeof logger.exportTrajectoriesZip !== \"function\") {\n sendJsonError(\n res,\n \"Trajectory ZIP export is unavailable in the active logger\",\n 503,\n );\n return;\n }\n\n const zipOptions: TrajectoryZipExportOptions = {\n includePrompts: body.includePrompts,\n trajectoryIds: body.trajectoryIds,\n startDate: body.startDate,\n endDate: body.endDate,\n scenarioId: body.scenarioId,\n batchId: body.batchId,\n };\n const zipResult = await logger.exportTrajectoriesZip(zipOptions);\n const archive = createZipArchive(zipResult.entries);\n\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"application/zip\");\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"${zipResult.filename}\"`,\n );\n res.end(archive);\n return;\n }\n\n if (\n body.format !== \"json\" &&\n body.format !== \"jsonl\" &&\n body.format !== \"csv\" &&\n body.format !== \"art\"\n ) {\n sendJsonError(\n res,\n \"Format must be 'json', 'jsonl', 'csv', 'art', or 'zip'\",\n 400,\n );\n return;\n }\n\n const jsonShape =\n body.jsonShape === ELIZA_NATIVE_TRAJECTORY_FORMAT\n ? body.jsonShape\n : undefined;\n if (body.jsonShape !== undefined && !jsonShape) {\n sendJsonError(res, \"jsonShape must be 'eliza_native_v1'\", 400);\n return;\n }\n\n const result = await logger.exportTrajectories({\n format: body.format as TrajectoryExportFormat,\n includePrompts: body.includePrompts,\n trajectoryIds: body.trajectoryIds,\n startDate: body.startDate,\n endDate: body.endDate,\n scenarioId: body.scenarioId,\n batchId: body.batchId,\n ...((body.format === \"json\" || body.format === \"jsonl\") && jsonShape\n ? { jsonShape }\n : {}),\n });\n\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", result.mimeType);\n res.setHeader(\n \"Content-Disposition\",\n `attachment; filename=\"${result.filename}\"`,\n );\n res.end(result.data);\n}\n\nasync function handleDeleteTrajectories(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n runtime: AgentRuntime,\n): Promise<void> {\n const logger = await getTrajectoryLogger(runtime);\n if (!logger) {\n sendJsonError(res, \"Trajectories service not available\", 503);\n return;\n }\n\n const body = await parseJsonBody<{\n trajectoryIds?: string[];\n all?: boolean;\n clearAll?: boolean;\n }>(req, res);\n if (!body) return;\n\n if (body.clearAll || body.all) {\n const deletedCount = await logger.clearAllTrajectories();\n sendJson(res, { deleted: deletedCount });\n return;\n }\n\n if (Array.isArray(body.trajectoryIds) && body.trajectoryIds.length > 0) {\n const deletedCount = await logger.deleteTrajectories(body.trajectoryIds);\n sendJson(res, { deleted: deletedCount });\n return;\n }\n\n sendJson(res, { deleted: 0 });\n}\n\n// ============================================================================\n// Main Router\n// ============================================================================\n\nexport async function handleTrajectoryRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n runtime: AgentRuntime,\n pathname: string,\n method: string,\n): Promise<boolean> {\n if (!pathname.startsWith(\"/api/trajectories\")) return false;\n\n // GET /api/trajectories/config\n if (pathname === \"/api/trajectories/config\" && method === \"GET\") {\n await handleGetConfig(req, res, runtime);\n return true;\n }\n\n // PUT /api/trajectories/config\n if (pathname === \"/api/trajectories/config\" && method === \"PUT\") {\n await handlePutConfig(req, res, runtime);\n return true;\n }\n\n // POST /api/trajectories/export\n if (pathname === \"/api/trajectories/export\" && method === \"POST\") {\n await handleExportTrajectories(req, res, runtime);\n return true;\n }\n\n // DELETE /api/trajectories\n if (pathname === \"/api/trajectories\" && method === \"DELETE\") {\n await handleDeleteTrajectories(req, res, runtime);\n return true;\n }\n\n // GET /api/trajectories/stats\n if (pathname === \"/api/trajectories/stats\" && method === \"GET\") {\n await handleGetStats(req, res, runtime);\n return true;\n }\n\n // GET /api/trajectories/:id\n const detailMatch = pathname.match(/^\\/api\\/trajectories\\/([^/]+)$/);\n if (detailMatch && method === \"GET\") {\n await handleGetTrajectoryDetail(req, res, runtime, detailMatch[1]);\n return true;\n }\n\n // GET /api/trajectories\n if (pathname === \"/api/trajectories\" && method === \"GET\") {\n await handleGetTrajectories(req, res, runtime);\n return true;\n }\n\n return false;\n}\n"],"mappings":"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","names":["stats"]}
@@ -0,0 +1,9 @@
1
+ export { type BackendAvailability, clearBackendCache, detectAvailableBackends, } from "./training-backend-check.js";
2
+ export { isNotImplementedError, NotImplementedError, TrainingService, } from "./training-service.js";
3
+ export type { TrainingServiceLike, TrainingServiceWithRuntime, } from "./training-service-like.js";
4
+ export { type BootstrapOptimizationOptions, bootstrapOptimizationFromAccumulatedTrajectories, type RegisteredTrainingTriggerEntry, registerTrainingTriggerService, TRAINING_TRIGGER_SERVICE, TrainingTriggerService, type TrainingTriggerServiceOptions, type TriggerStatusSnapshot, } from "./training-trigger.js";
5
+ export { type CheckpointInfo, type CreateJobInput, type EvalCheckpointInput, type RegistryListing, type VastRegistry, type VastRegistryEntry, VastServiceError, VastTrainingService, type VastTrainingServiceOptions, } from "./training-vast-service.js";
6
+ export { aggregateInferenceStats, emptyInferenceStatsAggregate, type InferenceStatRow, type InferenceStatsAggregate, parseStatRow, } from "./vast-inference-stats.js";
7
+ export { appendJobLog, type InferenceEndpointRecord, inferenceStatsPath, jobLogPath, readInferenceEndpoints, readJobLogTail, type VastJobRecord, type VastJobStatus, VastJobStore, type VastJobUpdate, writeInferenceEndpoints, } from "./vast-job-store.js";
8
+ export { runCapture, runDetachedToLog, type SpawnImpl, } from "./vast-subprocess.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EACxB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,KAAK,4BAA4B,EACjC,gDAAgD,EAChD,KAAK,8BAA8B,EACnC,8BAA8B,EAC9B,wBAAwB,EACxB,sBAAsB,EACtB,KAAK,6BAA6B,EAClC,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,0BAA0B,GAChC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,YAAY,GACb,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,YAAY,EACZ,KAAK,uBAAuB,EAC5B,kBAAkB,EAClB,UAAU,EACV,sBAAsB,EACtB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,YAAY,EACZ,KAAK,aAAa,EAClB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,SAAS,GACf,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import {
2
+ clearBackendCache,
3
+ detectAvailableBackends
4
+ } from "./training-backend-check.js";
5
+ import {
6
+ isNotImplementedError,
7
+ NotImplementedError,
8
+ TrainingService
9
+ } from "./training-service.js";
10
+ import {
11
+ bootstrapOptimizationFromAccumulatedTrajectories,
12
+ registerTrainingTriggerService,
13
+ TRAINING_TRIGGER_SERVICE,
14
+ TrainingTriggerService
15
+ } from "./training-trigger.js";
16
+ import {
17
+ VastServiceError,
18
+ VastTrainingService
19
+ } from "./training-vast-service.js";
20
+ import {
21
+ aggregateInferenceStats,
22
+ emptyInferenceStatsAggregate,
23
+ parseStatRow
24
+ } from "./vast-inference-stats.js";
25
+ import {
26
+ appendJobLog,
27
+ inferenceStatsPath,
28
+ jobLogPath,
29
+ readInferenceEndpoints,
30
+ readJobLogTail,
31
+ VastJobStore,
32
+ writeInferenceEndpoints
33
+ } from "./vast-job-store.js";
34
+ import {
35
+ runCapture,
36
+ runDetachedToLog
37
+ } from "./vast-subprocess.js";
38
+ export {
39
+ NotImplementedError,
40
+ TRAINING_TRIGGER_SERVICE,
41
+ TrainingService,
42
+ TrainingTriggerService,
43
+ VastJobStore,
44
+ VastServiceError,
45
+ VastTrainingService,
46
+ aggregateInferenceStats,
47
+ appendJobLog,
48
+ bootstrapOptimizationFromAccumulatedTrajectories,
49
+ clearBackendCache,
50
+ detectAvailableBackends,
51
+ emptyInferenceStatsAggregate,
52
+ inferenceStatsPath,
53
+ isNotImplementedError,
54
+ jobLogPath,
55
+ parseStatRow,
56
+ readInferenceEndpoints,
57
+ readJobLogTail,
58
+ registerTrainingTriggerService,
59
+ runCapture,
60
+ runDetachedToLog,
61
+ writeInferenceEndpoints
62
+ };
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/index.ts"],"sourcesContent":["export {\n type BackendAvailability,\n clearBackendCache,\n detectAvailableBackends,\n} from \"./training-backend-check.js\";\nexport {\n isNotImplementedError,\n NotImplementedError,\n TrainingService,\n} from \"./training-service.js\";\nexport type {\n TrainingServiceLike,\n TrainingServiceWithRuntime,\n} from \"./training-service-like.js\";\nexport {\n type BootstrapOptimizationOptions,\n bootstrapOptimizationFromAccumulatedTrajectories,\n type RegisteredTrainingTriggerEntry,\n registerTrainingTriggerService,\n TRAINING_TRIGGER_SERVICE,\n TrainingTriggerService,\n type TrainingTriggerServiceOptions,\n type TriggerStatusSnapshot,\n} from \"./training-trigger.js\";\nexport {\n type CheckpointInfo,\n type CreateJobInput,\n type EvalCheckpointInput,\n type RegistryListing,\n type VastRegistry,\n type VastRegistryEntry,\n VastServiceError,\n VastTrainingService,\n type VastTrainingServiceOptions,\n} from \"./training-vast-service.js\";\nexport {\n aggregateInferenceStats,\n emptyInferenceStatsAggregate,\n type InferenceStatRow,\n type InferenceStatsAggregate,\n parseStatRow,\n} from \"./vast-inference-stats.js\";\nexport {\n appendJobLog,\n type InferenceEndpointRecord,\n inferenceStatsPath,\n jobLogPath,\n readInferenceEndpoints,\n readJobLogTail,\n type VastJobRecord,\n type VastJobStatus,\n VastJobStore,\n type VastJobUpdate,\n writeInferenceEndpoints,\n} from \"./vast-job-store.js\";\nexport {\n runCapture,\n runDetachedToLog,\n type SpawnImpl,\n} from \"./vast-subprocess.js\";\n"],"mappings":"AAAA;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAKP;AAAA,EAEE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EAOE;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;","names":[]}
@@ -0,0 +1,8 @@
1
+ export interface BackendAvailability {
2
+ mlx: boolean;
3
+ cuda: boolean;
4
+ cpu: boolean;
5
+ }
6
+ export declare function detectAvailableBackends(): Promise<BackendAvailability>;
7
+ export declare function clearBackendCache(): void;
8
+ //# sourceMappingURL=training-backend-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training-backend-check.d.ts","sourceRoot":"","sources":["../../src/services/training-backend-check.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC;CACd;AAcD,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAe5E;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,31 @@
1
+ import { execFile } from "node:child_process";
2
+ let cached = null;
3
+ const CACHE_TTL_MS = 6e4;
4
+ function probe(command, args) {
5
+ return new Promise((resolve) => {
6
+ const child = execFile(command, args, { timeout: 3e3 }, (err) => {
7
+ resolve(!err);
8
+ });
9
+ child.stdin?.end();
10
+ });
11
+ }
12
+ async function detectAvailableBackends() {
13
+ if (cached && Date.now() < cached.expiresAt) {
14
+ return cached.result;
15
+ }
16
+ const [mlx, cuda] = await Promise.all([
17
+ process.platform === "darwin" ? probe("python3", ["-c", "import mlx"]) : Promise.resolve(false),
18
+ probe("nvidia-smi", [])
19
+ ]);
20
+ const result = { mlx, cuda, cpu: true };
21
+ cached = { result, expiresAt: Date.now() + CACHE_TTL_MS };
22
+ return result;
23
+ }
24
+ function clearBackendCache() {
25
+ cached = null;
26
+ }
27
+ export {
28
+ clearBackendCache,
29
+ detectAvailableBackends
30
+ };
31
+ //# sourceMappingURL=training-backend-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/training-backend-check.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\n\nexport interface BackendAvailability {\n mlx: boolean;\n cuda: boolean;\n cpu: boolean;\n}\n\nlet cached: { result: BackendAvailability; expiresAt: number } | null = null;\nconst CACHE_TTL_MS = 60_000;\n\nfunction probe(command: string, args: string[]): Promise<boolean> {\n return new Promise((resolve) => {\n const child = execFile(command, args, { timeout: 3_000 }, (err) => {\n resolve(!err);\n });\n child.stdin?.end();\n });\n}\n\nexport async function detectAvailableBackends(): Promise<BackendAvailability> {\n if (cached && Date.now() < cached.expiresAt) {\n return cached.result;\n }\n\n const [mlx, cuda] = await Promise.all([\n process.platform === \"darwin\"\n ? probe(\"python3\", [\"-c\", \"import mlx\"])\n : Promise.resolve(false),\n probe(\"nvidia-smi\", []),\n ]);\n\n const result: BackendAvailability = { mlx, cuda, cpu: true };\n cached = { result, expiresAt: Date.now() + CACHE_TTL_MS };\n return result;\n}\n\nexport function clearBackendCache(): void {\n cached = null;\n}\n"],"mappings":"AAAA,SAAS,gBAAgB;AAQzB,IAAI,SAAoE;AACxE,MAAM,eAAe;AAErB,SAAS,MAAM,SAAiB,MAAkC;AAChE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,QAAQ,SAAS,SAAS,MAAM,EAAE,SAAS,IAAM,GAAG,CAAC,QAAQ;AACjE,cAAQ,CAAC,GAAG;AAAA,IACd,CAAC;AACD,UAAM,OAAO,IAAI;AAAA,EACnB,CAAC;AACH;AAEA,eAAsB,0BAAwD;AAC5E,MAAI,UAAU,KAAK,IAAI,IAAI,OAAO,WAAW;AAC3C,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,CAAC,KAAK,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpC,QAAQ,aAAa,WACjB,MAAM,WAAW,CAAC,MAAM,YAAY,CAAC,IACrC,QAAQ,QAAQ,KAAK;AAAA,IACzB,MAAM,cAAc,CAAC,CAAC;AAAA,EACxB,CAAC;AAED,QAAM,SAA8B,EAAE,KAAK,MAAM,KAAK,KAAK;AAC3D,WAAS,EAAE,QAAQ,WAAW,KAAK,IAAI,IAAI,aAAa;AACxD,SAAO;AACT;AAEO,SAAS,oBAA0B;AACxC,WAAS;AACX;","names":[]}
@@ -0,0 +1,40 @@
1
+ import type { Trajectory, TrajectoryListResult } from "@elizaos/agent";
2
+ export interface TrainingServiceLike {
3
+ getStatus(): Record<string, unknown>;
4
+ listTrajectories(options: {
5
+ limit?: number;
6
+ offset?: number;
7
+ runId?: string;
8
+ }): Promise<TrajectoryListResult>;
9
+ getTrajectoryById(trajectoryId: string): Promise<Trajectory | null>;
10
+ listDatasets(): Record<string, unknown>[];
11
+ buildDataset(options: {
12
+ limit?: number;
13
+ minLlmCallsPerTrajectory?: number;
14
+ }): Promise<Record<string, unknown>>;
15
+ listJobs(): Record<string, unknown>[];
16
+ startTrainingJob(options: {
17
+ datasetId?: string;
18
+ maxTrajectories?: number;
19
+ backend?: "mlx" | "cuda" | "cpu";
20
+ model?: string;
21
+ iterations?: number;
22
+ batchSize?: number;
23
+ learningRate?: number;
24
+ }): Promise<Record<string, unknown>>;
25
+ getJob(jobId: string): Record<string, unknown> | null;
26
+ cancelJob(jobId: string): Promise<Record<string, unknown>>;
27
+ listModels(): Record<string, unknown>[];
28
+ importModelToOllama(modelId: string, body: {
29
+ modelName?: string;
30
+ baseModel?: string;
31
+ ollamaUrl?: string;
32
+ }): Promise<Record<string, unknown>>;
33
+ activateModel(modelId: string, providerModel?: string): Promise<Record<string, unknown>>;
34
+ benchmarkModel(modelId: string): Promise<Record<string, unknown>>;
35
+ }
36
+ export interface TrainingServiceWithRuntime extends TrainingServiceLike {
37
+ initialize(): Promise<void>;
38
+ subscribe(listener: (event: unknown) => void): () => void;
39
+ }
40
+ //# sourceMappingURL=training-service-like.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training-service-like.d.ts","sourceRoot":"","sources":["../../src/services/training-service-like.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,gBAAgB,CAAC,OAAO,EAAE;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClC,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACpE,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC1C,YAAY,CAAC,OAAO,EAAE;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,wBAAwB,CAAC,EAAE,MAAM,CAAC;KACnC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACtC,gBAAgB,CAAC,OAAO,EAAE;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACxC,mBAAmB,CACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QACJ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpC,aAAa,CACX,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,0BAA2B,SAAQ,mBAAmB;IACrE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC3D"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=training-service-like.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,4 @@
1
+ import type { TrainingServiceWithRuntime } from "./training-service-like.js";
2
+ export declare function setActiveTrainingService(service: TrainingServiceWithRuntime | null): void;
3
+ export declare function getActiveTrainingService(): TrainingServiceWithRuntime | null;
4
+ //# sourceMappingURL=training-service-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training-service-registry.d.ts","sourceRoot":"","sources":["../../src/services/training-service-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAI7E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,0BAA0B,GAAG,IAAI,GACzC,IAAI,CAEN;AAED,wBAAgB,wBAAwB,IAAI,0BAA0B,GAAG,IAAI,CAE5E"}
@@ -0,0 +1,12 @@
1
+ let activeTrainingService = null;
2
+ function setActiveTrainingService(service) {
3
+ activeTrainingService = service;
4
+ }
5
+ function getActiveTrainingService() {
6
+ return activeTrainingService;
7
+ }
8
+ export {
9
+ getActiveTrainingService,
10
+ setActiveTrainingService
11
+ };
12
+ //# sourceMappingURL=training-service-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/training-service-registry.ts"],"sourcesContent":["import type { TrainingServiceWithRuntime } from \"./training-service-like.js\";\n\nlet activeTrainingService: TrainingServiceWithRuntime | null = null;\n\nexport function setActiveTrainingService(\n service: TrainingServiceWithRuntime | null,\n): void {\n activeTrainingService = service;\n}\n\nexport function getActiveTrainingService(): TrainingServiceWithRuntime | null {\n return activeTrainingService;\n}\n"],"mappings":"AAEA,IAAI,wBAA2D;AAExD,SAAS,yBACd,SACM;AACN,0BAAwB;AAC1B;AAEO,SAAS,2BAA8D;AAC5E,SAAO;AACT;","names":[]}
@@ -0,0 +1,59 @@
1
+ import type { Trajectory, TrajectoryListResult } from "@elizaos/agent";
2
+ import type { AgentRuntime } from "@elizaos/core";
3
+ import type { TrainingServiceWithRuntime } from "./training-service-like.js";
4
+ /**
5
+ * Thrown for endpoints whose real implementation lives on another surface
6
+ * (GPU fine-tunes on `/api/training/vast/jobs`, prompt optimization on
7
+ * `/api/training/auto/trigger`). The route layer maps this to a 501 with the
8
+ * message verbatim — we do not fabricate success responses for unwired flows.
9
+ */
10
+ export declare class NotImplementedError extends Error {
11
+ constructor(message: string);
12
+ }
13
+ export declare function isNotImplementedError(err: unknown): err is NotImplementedError;
14
+ interface TrainingServiceOptions {
15
+ getRuntime: () => AgentRuntime | null;
16
+ getConfig: () => unknown;
17
+ setConfig: (nextConfig: unknown) => void;
18
+ }
19
+ /**
20
+ * Public training API service. Reads trajectories from the runtime
21
+ * `trajectories` DB service and builds privacy-filtered export bundles via
22
+ * `buildTrajectoryExportBundle`. GPU fine-tunes, Ollama import, model
23
+ * activation, and benchmarking are handled by other surfaces — this service
24
+ * does not emulate them.
25
+ */
26
+ export declare class TrainingService implements TrainingServiceWithRuntime {
27
+ private readonly options;
28
+ private readonly listeners;
29
+ constructor(options: TrainingServiceOptions);
30
+ initialize(): Promise<void>;
31
+ subscribe(listener: (event: unknown) => void): () => void;
32
+ private emit;
33
+ private trajectoryService;
34
+ getStatus(): Record<string, unknown>;
35
+ listTrajectories(options: {
36
+ limit?: number;
37
+ offset?: number;
38
+ runId?: string;
39
+ }): Promise<TrajectoryListResult>;
40
+ getTrajectoryById(trajectoryId: string): Promise<Trajectory | null>;
41
+ /** Datasets are produced as export bundles on disk; there is no persisted list. */
42
+ listDatasets(): Record<string, unknown>[];
43
+ buildDataset(options: {
44
+ limit?: number;
45
+ minLlmCallsPerTrajectory?: number;
46
+ }): Promise<Record<string, unknown>>;
47
+ /** GPU fine-tune jobs live under `/api/training/vast/jobs`. */
48
+ listJobs(): Record<string, unknown>[];
49
+ startTrainingJob(): Promise<Record<string, unknown>>;
50
+ getJob(): Record<string, unknown> | null;
51
+ cancelJob(): Promise<Record<string, unknown>>;
52
+ /** Trained models are tracked by the Vast registry under `/api/training/vast/models`. */
53
+ listModels(): Record<string, unknown>[];
54
+ importModelToOllama(): Promise<Record<string, unknown>>;
55
+ activateModel(): Promise<Record<string, unknown>>;
56
+ benchmarkModel(): Promise<Record<string, unknown>>;
57
+ }
58
+ export {};
59
+ //# sourceMappingURL=training-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training-service.d.ts","sourceRoot":"","sources":["../../src/services/training-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAE7E;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,GACX,GAAG,IAAI,mBAAmB,CAE5B;AAED,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAWD;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,0BAA0B;IAGpD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;gBAEpC,OAAO,EAAE,sBAAsB;IAEtD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAEjC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAKzD,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,iBAAiB;IAkBzB,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAM9B,gBAAgB,CAAC,OAAO,EAAE;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAI3B,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIzE,mFAAmF;IACnF,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAInC,YAAY,CAAC,OAAO,EAAE;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,wBAAwB,CAAC,EAAE,MAAM,CAAC;KACnC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA4EpC,+DAA+D;IAC/D,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAI/B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAM1D,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIlC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMnD,yFAAyF;IACzF,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAIjC,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMvD,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMjD,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAKzD"}