@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/training-routes.ts"],"sourcesContent":["import type { Trajectory } from \"@elizaos/agent\";\nimport type {\n AgentRuntime,\n RouteHelpers,\n RouteRequestContext,\n} from \"@elizaos/core\";\nimport { parsePositiveInteger } from \"@elizaos/shared\";\nimport { runActionBenchmark } from \"../core/action-benchmark-runner.js\";\nimport {\n writeBenchmarkMatrixArtifact,\n writeBenchmarkMatrixArtifactFromArtifacts,\n} from \"../core/benchmark-matrix-artifact.js\";\nimport { runBenchmarkVsCerebras } from \"../core/benchmark-vs-cerebras-runner.js\";\nimport { AGENT_CONTEXTS, type AgentContext } from \"../core/context-types.js\";\nimport { stageEliza1Bundle } from \"../core/eliza1-bundle-stager.js\";\nimport {\n runLocalEvalComparison,\n writeEvalComparisonArtifact,\n} from \"../core/eval-comparison-artifact.js\";\nimport { runFeedGeneration } from \"../core/feed-generation-runner.js\";\nimport { ingestHuggingFaceDataset } from \"../core/huggingface-dataset-ingest.js\";\nimport { createHashAnonymizer } from \"../core/privacy-filter.js\";\nimport { runScenarios } from \"../core/scenario-runner.js\";\nimport { buildTrainingAnalysisIndex } from \"../core/training-analysis-index.js\";\nimport {\n buildTrainingCollectionPreflightWithProbes,\n listTrainingCollections,\n runTrainingCollection,\n} from \"../core/training-collection-runner.js\";\nimport {\n ALL_TRAINING_BACKENDS,\n ALL_TRAINING_TASKS,\n loadTrainingConfig,\n normalizeTrainingConfig,\n saveTrainingConfig,\n type TrainingBackend,\n} from \"../core/training-config.js\";\nimport {\n listRuns,\n loadRun,\n triggerTraining,\n} from \"../core/training-orchestrator.js\";\nimport { writeTrainingReadinessReport } from \"../core/training-readiness-report.js\";\nimport { resolveHfUploadConfig } from \"../core/trajectory-hf-upload.js\";\nimport {\n buildTaskRecord,\n type TrajectoryTaskDatasetExport,\n type TrajectoryTrainingTask,\n} from \"../core/trajectory-task-datasets.js\";\nimport { detectAvailableBackends } from \"../services/training-backend-check.js\";\nimport { isNotImplementedError } from \"../services/training-service.js\";\nimport type { TrainingServiceLike } from \"../services/training-service-like.js\";\nimport {\n type RegisteredTrainingTriggerEntry,\n TRAINING_TRIGGER_SERVICE,\n} from \"../services/training-trigger.js\";\n\nexport type TrainingRouteHelpers = RouteHelpers;\n\nexport interface TrainingRouteContext extends RouteRequestContext {\n runtime: AgentRuntime | null;\n trainingService: TrainingServiceLike;\n isLoopbackHost: (host: string) => boolean;\n}\n\nfunction resolveStringSetting(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction resolveBooleanSetting(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\n/**\n * Map a thrown service error onto an HTTP status. `NotImplementedError` (the\n * training service does not synthesize GPU fine-tunes or model ops) becomes a\n * 501 with the error's own message; anything else falls back to `status`.\n */\nfunction sendServiceError<R>(\n error: (res: R, message: string, status?: number) => void,\n res: R,\n err: unknown,\n status = 400,\n): void {\n if (isNotImplementedError(err)) {\n error(res, err.message, 501);\n return;\n }\n error(res, String(err), status);\n}\n\nfunction emptyTaskCounters(): Record<TrajectoryTrainingTask, number> {\n return buildTaskRecord<number>(() => 0);\n}\n\nfunction getTriggerEntry(\n runtime: AgentRuntime | null,\n): RegisteredTrainingTriggerEntry | null {\n if (!runtime) return null;\n const services = (\n runtime as {\n services?: Map<string, unknown[]>;\n }\n ).services;\n if (!services) return null;\n const entries = services.get(TRAINING_TRIGGER_SERVICE);\n if (!Array.isArray(entries) || entries.length === 0) return null;\n const candidate = entries[0] as unknown;\n if (\n candidate &&\n typeof candidate === \"object\" &&\n typeof (candidate as { notifyTrajectoryCompleted?: unknown })\n .notifyTrajectoryCompleted === \"function\"\n ) {\n return candidate as RegisteredTrainingTriggerEntry;\n }\n return null;\n}\n\nconst AGENT_DECISIONS = [\"RESPOND\", \"IGNORE\", \"STOP\"] as const;\ntype AgentDecision = (typeof AGENT_DECISIONS)[number];\n\nfunction narrowAgentContexts(input: unknown): AgentContext[] | undefined {\n if (!Array.isArray(input)) return undefined;\n const out: AgentContext[] = [];\n for (const entry of input) {\n if (\n typeof entry === \"string\" &&\n (AGENT_CONTEXTS as readonly string[]).includes(entry)\n ) {\n out.push(entry as AgentContext);\n }\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction narrowAgentDecisions(input: unknown): AgentDecision[] | undefined {\n if (!Array.isArray(input)) return undefined;\n const out: AgentDecision[] = [];\n for (const entry of input) {\n if (\n typeof entry === \"string\" &&\n (AGENT_DECISIONS as readonly string[]).includes(entry)\n ) {\n out.push(entry as AgentDecision);\n }\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction narrowTrainingTasks(\n input: unknown,\n): readonly TrajectoryTrainingTask[] | undefined {\n if (!Array.isArray(input)) return undefined;\n const out: TrajectoryTrainingTask[] = [];\n for (const entry of input) {\n if (\n typeof entry === \"string\" &&\n (ALL_TRAINING_TASKS as readonly string[]).includes(entry)\n ) {\n out.push(entry as TrajectoryTrainingTask);\n }\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction normalizeRunId(input: unknown): string | undefined {\n return typeof input === \"string\" && input.trim().length > 0\n ? input.trim()\n : undefined;\n}\n\nfunction trajectoryHasRunId(trajectory: Trajectory, runId: string): boolean {\n const record = trajectory as Trajectory & {\n runId?: unknown;\n metadata?: Record<string, unknown>;\n };\n if (normalizeRunId(record.runId) === runId) return true;\n if (normalizeRunId(record.metadata?.runId) === runId) return true;\n if (normalizeRunId(record.metadata?.appRunId) === runId) return true;\n\n for (const step of trajectory.steps ?? []) {\n for (const call of step.llmCalls ?? []) {\n if (normalizeRunId(call.runId) === runId) return true;\n }\n for (const access of step.providerAccesses ?? []) {\n if (normalizeRunId(access.runId) === runId) return true;\n }\n }\n return false;\n}\n\nfunction parseTaskOrNull(input: unknown): {\n value?: TrajectoryTrainingTask;\n error?: string;\n} {\n if (input === undefined || input === null || input === \"\") return {};\n if (typeof input !== \"string\") {\n return { error: \"task must be a string\" };\n }\n if (!(ALL_TRAINING_TASKS as readonly string[]).includes(input)) {\n return {\n error: `task must be one of: ${ALL_TRAINING_TASKS.join(\", \")}`,\n };\n }\n return { value: input as TrajectoryTrainingTask };\n}\n\nfunction parseBackendOrNull(input: unknown): {\n value?: TrainingBackend;\n error?: string;\n} {\n if (input === undefined || input === null || input === \"\") return {};\n if (typeof input !== \"string\") {\n return { error: \"backend must be a string\" };\n }\n if (!(ALL_TRAINING_BACKENDS as readonly string[]).includes(input)) {\n return {\n error: `backend must be one of: ${ALL_TRAINING_BACKENDS.join(\", \")}`,\n };\n }\n return { value: input as TrainingBackend };\n}\n\nfunction resolveOllamaUrlRejection(\n rawUrl: string,\n isLoopbackHost: (host: string) => boolean,\n): string | null {\n const trimmed = rawUrl.trim();\n if (!trimmed) return null;\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n return \"ollamaUrl must be a valid URL\";\n }\n\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return \"ollamaUrl must use http:// or https://\";\n }\n\n if (!isLoopbackHost(parsed.hostname)) {\n return \"ollamaUrl must target a loopback host (localhost, 127.0.0.1, or ::1)\";\n }\n\n return null;\n}\n\nexport async function handleTrainingRoutes(\n ctx: TrainingRouteContext,\n): Promise<boolean> {\n const {\n req,\n res,\n method,\n pathname,\n runtime,\n trainingService,\n json,\n error,\n readJsonBody,\n isLoopbackHost,\n } = ctx;\n\n if (!pathname.startsWith(\"/api/training\")) return false;\n\n if (method === \"GET\" && pathname === \"/api/training/status\") {\n const status = trainingService.getStatus();\n const trigger = getTriggerEntry(runtime);\n const triggerStatus = trigger?.getStatus() ?? null;\n json(res, {\n ...status,\n runtimeAvailable: runtime !== null,\n autoTrain: triggerStatus,\n });\n return true;\n }\n\n // ── Auto-training trigger surface ───────────────────────────────────────\n if (method === \"GET\" && pathname === \"/api/training/auto/status\") {\n const trigger = getTriggerEntry(runtime);\n if (!trigger) {\n const config = loadTrainingConfig();\n json(res, {\n autoTrainEnabled: config.autoTrain,\n triggerThreshold: config.triggerThreshold,\n cooldownHours: config.triggerCooldownHours,\n counters: emptyTaskCounters(),\n lastTrain: {},\n perTaskThresholds: emptyTaskCounters(),\n perTaskCooldownMs: emptyTaskCounters(),\n serviceRegistered: false,\n });\n return true;\n }\n const snapshot = trigger.getStatus();\n json(res, { ...snapshot, serviceRegistered: true });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/auto/trigger\") {\n const body = await readJsonBody<{\n task?: string;\n backend?: string;\n dryRun?: boolean;\n }>(req, res);\n if (!body) return true;\n\n const taskRejection = parseTaskOrNull(body.task);\n if (taskRejection.error) {\n error(res, taskRejection.error, 400);\n return true;\n }\n const backendRejection = parseBackendOrNull(body.backend);\n if (backendRejection.error) {\n error(res, backendRejection.error, 400);\n return true;\n }\n if (!runtime) {\n error(res, \"Runtime is required to trigger training\", 503);\n return true;\n }\n\n const trigger = getTriggerEntry(runtime);\n const record = trigger\n ? await trigger.runManually({\n task: taskRejection.value,\n backend: backendRejection.value,\n dryRun: body.dryRun === true,\n })\n : await triggerTraining(runtime, {\n task: taskRejection.value,\n backend: backendRejection.value,\n source: \"manual\",\n dryRun: body.dryRun === true,\n });\n json(res, { runId: record.runId, status: record.status, run: record }, 201);\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/auto/runs\") {\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n const limit = parsePositiveInteger(url.searchParams.get(\"limit\"), 20);\n const runs = await listRuns(limit);\n json(res, { runs });\n return true;\n }\n\n const runMatch = /^\\/api\\/training\\/auto\\/runs\\/([^/]+)$/.exec(pathname);\n if (method === \"GET\" && runMatch) {\n const runId = decodeURIComponent(runMatch[1]);\n const run = await loadRun(runId);\n if (!run) {\n error(res, \"Run not found\", 404);\n return true;\n }\n json(res, { run });\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/auto/config\") {\n json(res, { config: loadTrainingConfig() });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/auto/config\") {\n const body = await readJsonBody<Record<string, unknown>>(req, res);\n if (!body) return true;\n const merged = normalizeTrainingConfig({\n ...loadTrainingConfig(),\n ...body,\n });\n saveTrainingConfig(merged);\n json(res, { config: merged });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/analysis/index\") {\n const body = await readJsonBody<{\n roots?: unknown;\n outputDir?: unknown;\n preflightOnly?: unknown;\n maxDepth?: unknown;\n }>(req, res);\n if (!body) return true;\n const roots = Array.isArray(body.roots)\n ? body.roots.filter(\n (root): root is string =>\n typeof root === \"string\" && root.trim().length > 0,\n )\n : undefined;\n const outputDir =\n typeof body.outputDir === \"string\" && body.outputDir.trim().length > 0\n ? body.outputDir.trim()\n : undefined;\n const maxDepth =\n typeof body.maxDepth === \"number\" && Number.isFinite(body.maxDepth)\n ? Math.max(0, Math.floor(body.maxDepth))\n : undefined;\n try {\n const index = await buildTrainingAnalysisIndex({\n roots,\n outputDir,\n maxDepth,\n });\n json(\n res,\n {\n outputDir: index.outputDir,\n indexHtmlPath: index.indexHtmlPath,\n manifestPath: index.manifestPath,\n manifest: index.manifest,\n },\n 201,\n );\n } catch (err) {\n error(res, `Training analysis index failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/analysis/readiness\") {\n const body = await readJsonBody<{\n roots?: unknown;\n outputDir?: unknown;\n maxDepth?: unknown;\n reportOutputDir?: unknown;\n reportPath?: unknown;\n }>(req, res);\n if (!body) return true;\n const roots = Array.isArray(body.roots)\n ? body.roots.filter(\n (entry): entry is string =>\n typeof entry === \"string\" && entry.trim().length > 0,\n )\n : undefined;\n try {\n const index = await buildTrainingAnalysisIndex({\n roots,\n outputDir: resolveStringSetting(body.outputDir),\n maxDepth:\n typeof body.maxDepth === \"number\" && Number.isFinite(body.maxDepth)\n ? Math.max(1, Math.floor(body.maxDepth))\n : undefined,\n });\n const result = await writeTrainingReadinessReport(index, {\n outputDir: resolveStringSetting(body.reportOutputDir),\n reportPath: resolveStringSetting(body.reportPath),\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Training readiness report failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/datasets/ingest-hf\") {\n const body = await readJsonBody<{\n repoId?: unknown;\n revision?: unknown;\n files?: unknown;\n outputDir?: unknown;\n token?: unknown;\n dryRun?: unknown;\n }>(req, res);\n if (!body) return true;\n try {\n const result = await ingestHuggingFaceDataset({\n repoId: resolveStringSetting(body.repoId),\n revision: resolveStringSetting(body.revision),\n files: Array.isArray(body.files)\n ? body.files.filter(\n (file): file is string =>\n typeof file === \"string\" && file.trim().length > 0,\n )\n : undefined,\n outputDir: resolveStringSetting(body.outputDir),\n token: resolveStringSetting(body.token),\n dryRun: body.dryRun === true,\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Hugging Face dataset ingest failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/feed/generate\") {\n const body = await readJsonBody<{\n workspaceRoot?: unknown;\n bun?: unknown;\n archetypes?: unknown;\n numAgents?: unknown;\n ticks?: unknown;\n parallel?: unknown;\n managerId?: unknown;\n cleanup?: unknown;\n dryRun?: unknown;\n outputDir?: unknown;\n }>(req, res);\n if (!body) return true;\n try {\n const result = await runFeedGeneration({\n workspaceRoot: resolveStringSetting(body.workspaceRoot),\n bun: resolveStringSetting(body.bun),\n archetypes: resolveStringSetting(body.archetypes),\n numAgents:\n typeof body.numAgents === \"number\" && Number.isFinite(body.numAgents)\n ? Math.max(1, Math.floor(body.numAgents))\n : undefined,\n ticks:\n typeof body.ticks === \"number\" && Number.isFinite(body.ticks)\n ? Math.max(1, Math.floor(body.ticks))\n : undefined,\n parallel:\n typeof body.parallel === \"number\" && Number.isFinite(body.parallel)\n ? Math.max(1, Math.floor(body.parallel))\n : undefined,\n managerId: resolveStringSetting(body.managerId),\n cleanup: body.cleanup === true,\n dryRun: body.dryRun === true,\n outputDir: resolveStringSetting(body.outputDir),\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Feed generation failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/scenarios/run\") {\n const body = await readJsonBody<{\n workspaceRoot?: unknown;\n bun?: unknown;\n scenarioDir?: unknown;\n outputDir?: unknown;\n runId?: unknown;\n scenario?: unknown;\n fileGlobs?: unknown;\n exportNative?: unknown;\n useDeterministicProxy?: unknown;\n dryRun?: unknown;\n }>(req, res);\n if (!body) return true;\n try {\n const result = await runScenarios({\n workspaceRoot: resolveStringSetting(body.workspaceRoot),\n bun: resolveStringSetting(body.bun),\n scenarioDir: resolveStringSetting(body.scenarioDir),\n outputDir: resolveStringSetting(body.outputDir),\n runId: resolveStringSetting(body.runId),\n scenario: resolveStringSetting(body.scenario),\n fileGlobs: Array.isArray(body.fileGlobs)\n ? body.fileGlobs.filter(\n (glob): glob is string => typeof glob === \"string\",\n )\n : undefined,\n exportNative:\n typeof body.exportNative === \"boolean\"\n ? body.exportNative\n : undefined,\n useDeterministicProxy:\n typeof body.useDeterministicProxy === \"boolean\"\n ? body.useDeterministicProxy\n : undefined,\n dryRun: body.dryRun === true,\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Scenario run failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/collections\") {\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n const limit = parsePositiveInteger(url.searchParams.get(\"limit\"), 20);\n const root = resolveStringSetting(url.searchParams.get(\"root\"));\n try {\n const result = await listTrainingCollections({ root, limit });\n json(res, result);\n } catch (err) {\n error(res, `Training collection listing failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/collect\") {\n const body = await readJsonBody<{\n outputDir?: unknown;\n workspaceRoot?: unknown;\n preflightOnly?: unknown;\n preflightProbe?: unknown;\n includeHuggingFace?: unknown;\n includeFeed?: unknown;\n includeNaturalTrajectories?: unknown;\n includeTestTrajectories?: unknown;\n includeScenarios?: unknown;\n includeEvalComparison?: unknown;\n includeActionBenchmark?: unknown;\n includeBenchmarkVsCerebras?: unknown;\n includeEliza1ModelRegistry?: unknown;\n includeEliza1BundleStage?: unknown;\n includeBenchmarkMatrix?: unknown;\n huggingFace?: unknown;\n feed?: unknown;\n naturalTrajectories?: unknown;\n testTrajectories?: unknown;\n scenarios?: unknown;\n evalComparison?: unknown;\n actionBenchmark?: unknown;\n actionBenchmarkPair?: unknown;\n actionBenchmarkPairs?: unknown;\n benchmarkVsCerebras?: unknown;\n eliza1BundleStage?: unknown;\n benchmarkMatrix?: unknown;\n analysis?: unknown;\n }>(req, res);\n if (!body) return true;\n const objectSetting = (\n value: unknown,\n ): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n const objectArraySetting = (\n value: unknown,\n ): Record<string, unknown>[] | undefined =>\n Array.isArray(value)\n ? value.filter(\n (item): item is Record<string, unknown> =>\n item !== null && typeof item === \"object\" && !Array.isArray(item),\n )\n : undefined;\n const actionBenchmarkPairsSetting = (\n value: unknown,\n ): Record<string, unknown>[] | string | undefined =>\n typeof value === \"string\" ? value : objectArraySetting(value);\n const naturalTrajectoryOptions = objectSetting(body.naturalTrajectories);\n const naturalTrajectoryIds = Array.isArray(\n naturalTrajectoryOptions?.trajectoryIds,\n )\n ? naturalTrajectoryOptions.trajectoryIds.filter(\n (id): id is string => typeof id === \"string\" && id.trim().length > 0,\n )\n : [];\n const naturalRunId = resolveStringSetting(naturalTrajectoryOptions?.runId);\n const naturalLimit =\n typeof naturalTrajectoryOptions?.limit === \"number\" &&\n Number.isFinite(naturalTrajectoryOptions.limit)\n ? Math.max(1, Math.floor(naturalTrajectoryOptions.limit))\n : 100;\n try {\n let naturalTrajectories:\n | (Record<string, unknown> & { trajectories?: Trajectory[] })\n | undefined = naturalTrajectoryOptions;\n if (\n body.includeNaturalTrajectories === true &&\n body.preflightOnly !== true &&\n !naturalTrajectoryOptions?.sanitizedJsonlPath &&\n !naturalTrajectoryOptions?.rawJsonlPath\n ) {\n const listedTrajectories =\n naturalTrajectoryIds.length > 0\n ? null\n : await trainingService.listTrajectories({\n limit: naturalLimit,\n offset: 0,\n runId: naturalRunId,\n });\n const ids =\n naturalTrajectoryIds.length > 0\n ? naturalTrajectoryIds\n : (listedTrajectories?.trajectories ?? [])\n .map((item) => item.id)\n .filter((id) => id.length > 0);\n const details = (\n await Promise.all(\n ids.map((trajectoryId) =>\n trainingService.getTrajectoryById(trajectoryId),\n ),\n )\n ).filter((trajectory): trajectory is Trajectory => trajectory !== null);\n naturalTrajectories = {\n ...(naturalTrajectoryOptions ?? {}),\n trajectories: naturalRunId\n ? details.filter((trajectory) =>\n trajectoryHasRunId(trajectory, naturalRunId),\n )\n : details,\n source: {\n kind: \"training_collection_natural_trajectories\",\n ...objectSetting(naturalTrajectoryOptions?.source),\n runId: naturalRunId,\n metadata: {\n ...objectSetting(\n objectSetting(naturalTrajectoryOptions?.source)?.metadata,\n ),\n requestedLimit: naturalLimit,\n requestedRunId: naturalRunId ?? null,\n explicitTrajectoryIds: naturalTrajectoryIds.length,\n selectedTrajectoryIds: ids.length,\n loadedTrajectories: details.length,\n },\n },\n };\n }\n const collectionOptions = {\n preflightOnly: body.preflightOnly === true,\n preflightProbe: body.preflightProbe === true,\n outputDir: resolveStringSetting(body.outputDir),\n workspaceRoot: resolveStringSetting(body.workspaceRoot),\n includeHuggingFace:\n typeof body.includeHuggingFace === \"boolean\"\n ? body.includeHuggingFace\n : undefined,\n includeFeed:\n typeof body.includeFeed === \"boolean\" ? body.includeFeed : undefined,\n includeNaturalTrajectories:\n typeof body.includeNaturalTrajectories === \"boolean\"\n ? body.includeNaturalTrajectories\n : undefined,\n includeTestTrajectories:\n typeof body.includeTestTrajectories === \"boolean\"\n ? body.includeTestTrajectories\n : undefined,\n includeScenarios:\n typeof body.includeScenarios === \"boolean\"\n ? body.includeScenarios\n : undefined,\n includeEvalComparison:\n typeof body.includeEvalComparison === \"boolean\"\n ? body.includeEvalComparison\n : undefined,\n includeActionBenchmark:\n typeof body.includeActionBenchmark === \"boolean\"\n ? body.includeActionBenchmark\n : undefined,\n includeBenchmarkVsCerebras:\n typeof body.includeBenchmarkVsCerebras === \"boolean\"\n ? body.includeBenchmarkVsCerebras\n : undefined,\n includeEliza1ModelRegistry:\n typeof body.includeEliza1ModelRegistry === \"boolean\"\n ? body.includeEliza1ModelRegistry\n : undefined,\n includeEliza1BundleStage:\n typeof body.includeEliza1BundleStage === \"boolean\"\n ? body.includeEliza1BundleStage\n : undefined,\n includeBenchmarkMatrix:\n typeof body.includeBenchmarkMatrix === \"boolean\"\n ? body.includeBenchmarkMatrix\n : undefined,\n huggingFace: objectSetting(body.huggingFace),\n feed: objectSetting(body.feed),\n naturalTrajectories,\n testTrajectories: objectSetting(body.testTrajectories),\n scenarios: objectSetting(body.scenarios),\n evalComparison: objectSetting(body.evalComparison),\n actionBenchmark: objectSetting(body.actionBenchmark),\n actionBenchmarkPair: objectSetting(body.actionBenchmarkPair),\n actionBenchmarkPairs: actionBenchmarkPairsSetting(\n body.actionBenchmarkPairs,\n ),\n benchmarkVsCerebras: objectSetting(body.benchmarkVsCerebras),\n eliza1BundleStage: objectSetting(body.eliza1BundleStage),\n benchmarkMatrix: objectSetting(body.benchmarkMatrix),\n analysis: objectSetting(body.analysis),\n };\n if (body.preflightOnly === true) {\n json(\n res,\n {\n preflight: await buildTrainingCollectionPreflightWithProbes({\n options: collectionOptions,\n workspaceRoot: collectionOptions.workspaceRoot,\n trainingRoot: collectionOptions.workspaceRoot\n ? `${collectionOptions.workspaceRoot}/packages/training`\n : undefined,\n }),\n },\n 200,\n );\n return true;\n }\n const result = await runTrainingCollection(collectionOptions);\n json(res, result, 201);\n } catch (err) {\n error(res, `Training collection failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname === \"/api/training/benchmarks/action-selection/run\"\n ) {\n const body = await readJsonBody<{\n workspaceRoot?: unknown;\n bun?: unknown;\n outputDir?: unknown;\n useMocks?: unknown;\n forceTrajectoryCapture?: unknown;\n filter?: unknown;\n runsPerCase?: unknown;\n provider?: unknown;\n modelId?: unknown;\n runtimeModel?: unknown;\n smallModel?: unknown;\n largeModel?: unknown;\n baseUrl?: unknown;\n variant?: unknown;\n tier?: unknown;\n benchmark?: unknown;\n datasetVersion?: unknown;\n codeCommit?: unknown;\n dryRun?: unknown;\n }>(req, res);\n if (!body) return true;\n try {\n const result = await runActionBenchmark({\n workspaceRoot: resolveStringSetting(body.workspaceRoot),\n bun: resolveStringSetting(body.bun),\n outputDir: resolveStringSetting(body.outputDir),\n useMocks: resolveBooleanSetting(body.useMocks),\n forceTrajectoryCapture:\n body.forceTrajectoryCapture === false ? false : undefined,\n filter: resolveStringSetting(body.filter),\n runsPerCase:\n typeof body.runsPerCase === \"number\" &&\n Number.isFinite(body.runsPerCase)\n ? Math.max(1, Math.floor(body.runsPerCase))\n : undefined,\n provider: resolveStringSetting(body.provider),\n modelId: resolveStringSetting(body.modelId),\n runtimeModel: resolveStringSetting(body.runtimeModel),\n smallModel: resolveStringSetting(body.smallModel),\n largeModel: resolveStringSetting(body.largeModel),\n baseUrl: resolveStringSetting(body.baseUrl),\n variant:\n body.variant === \"reference\" ||\n body.variant === \"base\" ||\n body.variant === \"trained\"\n ? body.variant\n : undefined,\n tier: resolveStringSetting(body.tier),\n benchmark: resolveStringSetting(body.benchmark),\n datasetVersion: resolveStringSetting(body.datasetVersion),\n codeCommit: resolveStringSetting(body.codeCommit),\n dryRun: body.dryRun === true,\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Action benchmark failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname === \"/api/training/evals/record-comparison\"\n ) {\n const body = await readJsonBody<{\n report?: unknown;\n reportPath?: unknown;\n outputDir?: unknown;\n source?: unknown;\n }>(req, res);\n if (!body) return true;\n if (\n !body.report ||\n typeof body.report !== \"object\" ||\n Array.isArray(body.report)\n ) {\n error(res, \"report must be a JSON object\", 400);\n return true;\n }\n try {\n const result = await writeEvalComparisonArtifact({\n report: body.report as Record<string, unknown>,\n reportPath: resolveStringSetting(body.reportPath),\n outputDir: resolveStringSetting(body.outputDir),\n source:\n body.source &&\n typeof body.source === \"object\" &&\n !Array.isArray(body.source)\n ? (body.source as Record<string, unknown>)\n : undefined,\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Eval comparison artifact failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname === \"/api/training/evals/run-local-comparison\"\n ) {\n const body = await readJsonBody<{\n trainingRoot?: unknown;\n python?: unknown;\n manifestPath?: unknown;\n model?: unknown;\n trainedModelPath?: unknown;\n backend?: unknown;\n promptFile?: unknown;\n maxTokens?: unknown;\n systemPrompt?: unknown;\n outputPath?: unknown;\n outputDir?: unknown;\n dryRun?: unknown;\n }>(req, res);\n if (!body) return true;\n const backend =\n body.backend === \"mlx\" ||\n body.backend === \"cuda\" ||\n body.backend === \"cpu\"\n ? body.backend\n : undefined;\n try {\n const result = await runLocalEvalComparison({\n trainingRoot: resolveStringSetting(body.trainingRoot),\n python: resolveStringSetting(body.python),\n manifestPath: resolveStringSetting(body.manifestPath),\n model: resolveStringSetting(body.model),\n trainedModelPath: resolveStringSetting(body.trainedModelPath),\n backend,\n promptFile: resolveStringSetting(body.promptFile),\n maxTokens:\n typeof body.maxTokens === \"number\" && Number.isFinite(body.maxTokens)\n ? Math.max(1, Math.floor(body.maxTokens))\n : undefined,\n systemPrompt: resolveStringSetting(body.systemPrompt),\n outputPath: resolveStringSetting(body.outputPath),\n outputDir: resolveStringSetting(body.outputDir),\n dryRun: body.dryRun === true,\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Local eval comparison failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/benchmarks/matrix\") {\n const body = await readJsonBody<{\n rows?: unknown;\n outputDir?: unknown;\n generatedAt?: unknown;\n referenceModelId?: unknown;\n source?: unknown;\n }>(req, res);\n if (!body) return true;\n if (!Array.isArray(body.rows)) {\n error(res, \"rows must be an array\", 400);\n return true;\n }\n const rows = body.rows.filter(\n (\n row,\n ): row is {\n modelId: string;\n benchmark: string;\n score: number;\n variant: \"reference\" | \"base\" | \"trained\";\n tier?: string;\n provider?: string;\n datasetVersion?: string;\n codeCommit?: string;\n ts?: number | string;\n metrics?: Record<string, unknown>;\n raw?: Record<string, unknown>;\n } =>\n row !== null &&\n typeof row === \"object\" &&\n !Array.isArray(row) &&\n typeof (row as { modelId?: unknown }).modelId === \"string\" &&\n typeof (row as { benchmark?: unknown }).benchmark === \"string\" &&\n typeof (row as { score?: unknown }).score === \"number\" &&\n ((row as { variant?: unknown }).variant === \"reference\" ||\n (row as { variant?: unknown }).variant === \"base\" ||\n (row as { variant?: unknown }).variant === \"trained\"),\n );\n if (rows.length !== body.rows.length) {\n error(\n res,\n \"each row must include modelId, benchmark, numeric score, and variant reference|base|trained\",\n 400,\n );\n return true;\n }\n try {\n const result = await writeBenchmarkMatrixArtifact({\n rows,\n outputDir: resolveStringSetting(body.outputDir),\n generatedAt: resolveStringSetting(body.generatedAt),\n referenceModelId: resolveStringSetting(body.referenceModelId),\n source:\n body.source &&\n typeof body.source === \"object\" &&\n !Array.isArray(body.source)\n ? (body.source as Record<string, unknown>)\n : undefined,\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Benchmark matrix artifact failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname === \"/api/training/benchmarks/matrix/from-artifacts\"\n ) {\n const body = await readJsonBody<{\n artifacts?: unknown;\n outputDir?: unknown;\n generatedAt?: unknown;\n referenceModelId?: unknown;\n source?: unknown;\n }>(req, res);\n if (!body) return true;\n if (!Array.isArray(body.artifacts)) {\n error(res, \"artifacts must be an array\", 400);\n return true;\n }\n const artifacts = body.artifacts.filter(\n (\n artifact,\n ): artifact is {\n path: string;\n modelId?: string;\n benchmark?: string;\n variant?: \"reference\" | \"base\" | \"trained\";\n tier?: string;\n provider?: string;\n datasetVersion?: string;\n codeCommit?: string;\n } =>\n artifact !== null &&\n typeof artifact === \"object\" &&\n !Array.isArray(artifact) &&\n typeof (artifact as { path?: unknown }).path === \"string\" &&\n ((artifact as { variant?: unknown }).variant === undefined ||\n (artifact as { variant?: unknown }).variant === \"reference\" ||\n (artifact as { variant?: unknown }).variant === \"base\" ||\n (artifact as { variant?: unknown }).variant === \"trained\"),\n );\n if (artifacts.length !== body.artifacts.length) {\n error(\n res,\n \"each artifact must include path and optional variant reference|base|trained\",\n 400,\n );\n return true;\n }\n try {\n const result = await writeBenchmarkMatrixArtifactFromArtifacts({\n artifacts,\n outputDir: resolveStringSetting(body.outputDir),\n generatedAt: resolveStringSetting(body.generatedAt),\n referenceModelId: resolveStringSetting(body.referenceModelId),\n source:\n body.source &&\n typeof body.source === \"object\" &&\n !Array.isArray(body.source)\n ? (body.source as Record<string, unknown>)\n : undefined,\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Benchmark matrix from artifacts failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname === \"/api/training/benchmarks/run-vs-cerebras\"\n ) {\n const body = await readJsonBody<{\n trainingRoot?: unknown;\n python?: unknown;\n tiers?: unknown;\n benchmark?: unknown;\n variants?: unknown;\n cerebrasModel?: unknown;\n maxSamples?: unknown;\n outputDir?: unknown;\n checkpointsDir?: unknown;\n trainedModelPath?: unknown;\n dryRun?: unknown;\n resultsDb?: unknown;\n datasetVersion?: unknown;\n codeCommit?: unknown;\n matrixOutputDir?: unknown;\n }>(req, res);\n if (!body) return true;\n const benchmark =\n body.benchmark === \"clawbench\" ||\n body.benchmark === \"eliza_harness_action_selection\" ||\n body.benchmark === \"hermes\" ||\n body.benchmark === \"all\"\n ? body.benchmark\n : undefined;\n const variants =\n body.variants === \"trained\" ||\n body.variants === \"base\" ||\n body.variants === \"both\"\n ? body.variants\n : undefined;\n try {\n const result = await runBenchmarkVsCerebras({\n trainingRoot: resolveStringSetting(body.trainingRoot),\n python: resolveStringSetting(body.python),\n tiers: resolveStringSetting(body.tiers),\n benchmark,\n variants,\n cerebrasModel: resolveStringSetting(body.cerebrasModel),\n maxSamples:\n typeof body.maxSamples === \"number\" &&\n Number.isFinite(body.maxSamples)\n ? Math.max(1, Math.floor(body.maxSamples))\n : undefined,\n outputDir: resolveStringSetting(body.outputDir),\n checkpointsDir: resolveStringSetting(body.checkpointsDir),\n trainedModelPath: resolveStringSetting(body.trainedModelPath),\n dryRun: body.dryRun === true,\n resultsDb: resolveStringSetting(body.resultsDb),\n datasetVersion: resolveStringSetting(body.datasetVersion),\n codeCommit: resolveStringSetting(body.codeCommit),\n matrixOutputDir: resolveStringSetting(body.matrixOutputDir),\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Benchmark vs Cerebras failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname === \"/api/training/models/stage-eliza1-bundle\"\n ) {\n const body = await readJsonBody<{\n trainingRoot?: unknown;\n python?: unknown;\n repoId?: unknown;\n tier?: unknown;\n localDir?: unknown;\n outputDir?: unknown;\n maxBytes?: unknown;\n apply?: unknown;\n }>(req, res);\n if (!body) return true;\n try {\n const result = await stageEliza1Bundle({\n trainingRoot: resolveStringSetting(body.trainingRoot),\n python: resolveStringSetting(body.python),\n repoId: resolveStringSetting(body.repoId),\n tier: resolveStringSetting(body.tier),\n localDir: resolveStringSetting(body.localDir),\n outputDir: resolveStringSetting(body.outputDir),\n maxBytes:\n typeof body.maxBytes === \"number\" && Number.isFinite(body.maxBytes)\n ? Math.max(1, Math.floor(body.maxBytes))\n : undefined,\n apply: body.apply === true,\n });\n json(res, result, 201);\n } catch (err) {\n error(res, `Eliza-1 bundle staging failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/trajectories\") {\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n const limit = parsePositiveInteger(url.searchParams.get(\"limit\"), 100);\n const offset = Math.max(0, Number(url.searchParams.get(\"offset\") ?? \"0\"));\n const result = await trainingService.listTrajectories({ limit, offset });\n json(res, result);\n return true;\n }\n\n const trajectoryMatch = /^\\/api\\/training\\/trajectories\\/([^/]+)$/.exec(\n pathname,\n );\n if (method === \"GET\" && trajectoryMatch) {\n const trajectoryId = decodeURIComponent(trajectoryMatch[1]);\n const detail = await trainingService.getTrajectoryById(trajectoryId);\n if (!detail) {\n error(res, \"Trajectory not found\", 404);\n return true;\n }\n json(res, { trajectory: detail });\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/datasets\") {\n json(res, { datasets: trainingService.listDatasets() });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/datasets/build\") {\n const body = await readJsonBody<{\n limit?: number;\n minLlmCallsPerTrajectory?: number;\n }>(req, res);\n if (!body) return true;\n\n try {\n const dataset = await trainingService.buildDataset({\n limit: body.limit,\n minLlmCallsPerTrajectory: body.minLlmCallsPerTrajectory,\n });\n json(res, { dataset }, 201);\n } catch (err) {\n sendServiceError(error, res, err, 500);\n }\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/backends\") {\n const backends = await detectAvailableBackends();\n json(res, { backends });\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/jobs\") {\n json(res, { jobs: trainingService.listJobs() });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/jobs\") {\n const body = await readJsonBody<{\n datasetId?: string;\n maxTrajectories?: number;\n backend?: \"mlx\" | \"cuda\" | \"cpu\";\n model?: string;\n iterations?: number;\n batchSize?: number;\n learningRate?: number;\n }>(req, res);\n if (!body) return true;\n\n if (body.backend && body.backend !== \"cpu\") {\n const backends = await detectAvailableBackends();\n if (!backends[body.backend]) {\n const available = (Object.entries(backends) as [string, boolean][])\n .filter(([, ok]) => ok)\n .map(([name]) => name)\n .join(\", \");\n error(\n res,\n `Backend '${body.backend}' is not available on this system. Available backends: ${available}`,\n 400,\n );\n return true;\n }\n }\n\n try {\n const job = await trainingService.startTrainingJob({\n datasetId: body.datasetId,\n maxTrajectories: body.maxTrajectories,\n backend: body.backend,\n model: body.model,\n iterations: body.iterations,\n batchSize: body.batchSize,\n learningRate: body.learningRate,\n });\n json(res, { job }, 201);\n } catch (err) {\n sendServiceError(error, res, err, 400);\n }\n return true;\n }\n\n const jobMatch = /^\\/api\\/training\\/jobs\\/([^/]+)$/.exec(pathname);\n if (method === \"GET\" && jobMatch) {\n const jobId = decodeURIComponent(jobMatch[1]);\n const job = trainingService.getJob(jobId);\n if (!job) {\n error(res, \"Training job not found\", 404);\n return true;\n }\n json(res, { job });\n return true;\n }\n\n const cancelMatch = /^\\/api\\/training\\/jobs\\/([^/]+)\\/cancel$/.exec(pathname);\n if (method === \"POST\" && cancelMatch) {\n const jobId = decodeURIComponent(cancelMatch[1]);\n try {\n const job = await trainingService.cancelJob(jobId);\n json(res, { job });\n } catch (err) {\n sendServiceError(error, res, err, 404);\n }\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/models\") {\n json(res, { models: trainingService.listModels() });\n return true;\n }\n\n const importMatch = /^\\/api\\/training\\/models\\/([^/]+)\\/import-ollama$/.exec(\n pathname,\n );\n if (method === \"POST\" && importMatch) {\n const modelId = decodeURIComponent(importMatch[1]);\n const body = await readJsonBody<{\n modelName?: string;\n baseModel?: string;\n ollamaUrl?: string;\n }>(req, res);\n if (!body) return true;\n\n if (body.ollamaUrl !== undefined && typeof body.ollamaUrl !== \"string\") {\n error(res, \"ollamaUrl must be a string\", 400);\n return true;\n }\n if (typeof body.ollamaUrl === \"string\") {\n const ollamaUrlRejection = resolveOllamaUrlRejection(\n body.ollamaUrl,\n isLoopbackHost,\n );\n if (ollamaUrlRejection) {\n error(res, ollamaUrlRejection, 400);\n return true;\n }\n }\n\n try {\n const model = await trainingService.importModelToOllama(modelId, body);\n json(res, { model });\n } catch (err) {\n sendServiceError(error, res, err, 400);\n }\n return true;\n }\n\n const activateMatch = /^\\/api\\/training\\/models\\/([^/]+)\\/activate$/.exec(\n pathname,\n );\n if (method === \"POST\" && activateMatch) {\n const modelId = decodeURIComponent(activateMatch[1]);\n const body = await readJsonBody<{ providerModel?: string }>(req, res);\n if (!body) return true;\n try {\n const result = await trainingService.activateModel(\n modelId,\n body.providerModel,\n );\n json(res, result);\n } catch (err) {\n sendServiceError(error, res, err, 400);\n }\n return true;\n }\n\n const benchmarkMatch = /^\\/api\\/training\\/models\\/([^/]+)\\/benchmark$/.exec(\n pathname,\n );\n if (method === \"POST\" && benchmarkMatch) {\n const modelId = decodeURIComponent(benchmarkMatch[1]);\n try {\n const result = await trainingService.benchmarkModel(modelId);\n json(res, result);\n } catch (err) {\n sendServiceError(error, res, err, 400);\n }\n return true;\n }\n\n // === Synthetic dataset generation ===\n\n if (method === \"GET\" && pathname === \"/api/training/blueprints\") {\n const { ALL_BLUEPRINTS, BLUEPRINT_STATS } = await import(\n \"../core/scenario-blueprints.js\"\n );\n json(res, {\n count: ALL_BLUEPRINTS.length,\n stats: BLUEPRINT_STATS,\n blueprints: ALL_BLUEPRINTS.map((b) => ({\n id: b.id,\n decision: b.decision,\n primaryContext: b.primaryContext,\n pattern: b.pattern,\n description: b.description,\n })),\n });\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/context-catalog\") {\n const { ACTION_CONTEXT_MAP, PROVIDER_CONTEXT_MAP, ALL_CONTEXTS } =\n await import(\"../core/context-catalog.js\");\n json(res, {\n contexts: ALL_CONTEXTS,\n actions: ACTION_CONTEXT_MAP,\n providers: PROVIDER_CONTEXT_MAP,\n });\n return true;\n }\n\n if (method === \"GET\" && pathname === \"/api/training/context-audit\") {\n if (\n !runtime ||\n !Array.isArray((runtime as { plugins?: unknown }).plugins)\n ) {\n error(\n res,\n \"Runtime with loaded plugins is required for context audit\",\n 503,\n );\n return true;\n }\n\n const { auditRuntimeContextCoverage, hasContextAuditGaps } = await import(\n \"../core/context-audit.js\"\n );\n const audit = auditRuntimeContextCoverage(\n runtime as AgentRuntime & {\n plugins: NonNullable<AgentRuntime[\"plugins\"]>;\n },\n );\n\n json(res, {\n audit,\n hasGaps: hasContextAuditGaps(audit),\n });\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/generate-dataset\") {\n const body = await readJsonBody<{\n variantsPerBlueprint?: number;\n filterContexts?: string[];\n filterDecisions?: string[];\n limitBlueprints?: number;\n concurrency?: number;\n includeRoleplay?: boolean;\n }>(req, res);\n if (!body) return true;\n\n const cerebrasKey = process.env.CEREBRAS_API_KEY;\n const trainProvider =\n process.env.TRAIN_MODEL_PROVIDER?.trim() ??\n process.env.TRAINING_PROVIDER?.trim();\n const anthropicKey =\n resolveStringSetting(runtime?.getSetting?.(\"ANTHROPIC_API_KEY\")) ??\n process.env.ANTHROPIC_API_KEY;\n const openaiKey =\n resolveStringSetting(runtime?.getSetting?.(\"OPENAI_API_KEY\")) ??\n process.env.OPENAI_API_KEY;\n\n if (!cerebrasKey && !anthropicKey && !openaiKey) {\n error(\n res,\n \"No teacher model API key found. Set CEREBRAS_API_KEY (preferred), ANTHROPIC_API_KEY, or OPENAI_API_KEY.\",\n 400,\n );\n return true;\n }\n\n const {\n generateDataset,\n exportToElizaNativeJSONL,\n createAnthropicTeacher,\n createCerebrasTeacher,\n createOpenAITeacher,\n } = await import(\"../core/dataset-generator.js\");\n const { buildRoleplayEpisodes, exportRoleplayEpisodes } = await import(\n \"../core/roleplay-trajectories.js\"\n );\n\n const teacher =\n trainProvider === \"cerebras\" && cerebrasKey\n ? createCerebrasTeacher(runtime ?? undefined)\n : anthropicKey\n ? createAnthropicTeacher(anthropicKey, runtime ?? undefined)\n : createOpenAITeacher(openaiKey!, runtime ?? undefined);\n\n const outputDir = `.tmp/training-data-${Date.now()}`;\n\n try {\n const samples = await generateDataset({\n variantsPerBlueprint: body.variantsPerBlueprint ?? 5,\n teacher,\n outputDir,\n concurrency: body.concurrency ?? 5,\n limitBlueprints: body.limitBlueprints,\n filterContexts: narrowAgentContexts(body.filterContexts),\n filterDecisions: narrowAgentDecisions(body.filterDecisions),\n });\n\n const { validateDataset } = await import(\"../core/replay-validator.js\");\n const report = validateDataset(samples);\n\n const paths = await exportToElizaNativeJSONL(samples, outputDir);\n const roleplayPaths =\n body.includeRoleplay === false\n ? undefined\n : await exportRoleplayEpisodes(\n buildRoleplayEpisodes(samples),\n samples,\n outputDir,\n );\n\n json(\n res,\n {\n samplesGenerated: samples.length,\n report,\n paths,\n roleplayPaths,\n outputDir,\n },\n 201,\n );\n } catch (err) {\n error(res, `Dataset generation failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/generate-roleplay\") {\n const body = await readJsonBody<{\n variantsPerBlueprint?: number;\n filterContexts?: string[];\n filterDecisions?: string[];\n limitBlueprints?: number;\n concurrency?: number;\n }>(req, res);\n if (!body) return true;\n\n const cerebrasKey = process.env.CEREBRAS_API_KEY;\n const trainProvider =\n process.env.TRAIN_MODEL_PROVIDER?.trim() ??\n process.env.TRAINING_PROVIDER?.trim();\n const anthropicKey =\n resolveStringSetting(runtime?.getSetting?.(\"ANTHROPIC_API_KEY\")) ??\n process.env.ANTHROPIC_API_KEY;\n const openaiKey =\n resolveStringSetting(runtime?.getSetting?.(\"OPENAI_API_KEY\")) ??\n process.env.OPENAI_API_KEY;\n\n if (!cerebrasKey && !anthropicKey && !openaiKey) {\n error(\n res,\n \"No teacher model API key found. Set CEREBRAS_API_KEY (preferred), ANTHROPIC_API_KEY, or OPENAI_API_KEY.\",\n 400,\n );\n return true;\n }\n\n const {\n generateDataset,\n createAnthropicTeacher,\n createCerebrasTeacher,\n createOpenAITeacher,\n } = await import(\"../core/dataset-generator.js\");\n const { buildRoleplayEpisodes, exportRoleplayEpisodes } = await import(\n \"../core/roleplay-trajectories.js\"\n );\n\n const teacher =\n trainProvider === \"cerebras\" && cerebrasKey\n ? createCerebrasTeacher(runtime ?? undefined)\n : anthropicKey\n ? createAnthropicTeacher(anthropicKey, runtime ?? undefined)\n : createOpenAITeacher(openaiKey!, runtime ?? undefined);\n const outputDir = `.tmp/training-roleplay-${Date.now()}`;\n\n try {\n const samples = await generateDataset({\n variantsPerBlueprint: body.variantsPerBlueprint ?? 3,\n teacher,\n outputDir,\n concurrency: body.concurrency ?? 5,\n limitBlueprints: body.limitBlueprints,\n filterContexts: narrowAgentContexts(body.filterContexts),\n filterDecisions: narrowAgentDecisions(body.filterDecisions),\n });\n const episodes = buildRoleplayEpisodes(samples);\n const paths = await exportRoleplayEpisodes(episodes, samples, outputDir);\n\n json(\n res,\n {\n samplesGenerated: samples.length,\n episodesGenerated: episodes.length,\n outputDir,\n paths,\n },\n 201,\n );\n } catch (err) {\n error(res, `Roleplay generation failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/roleplay/execute\") {\n const body = await readJsonBody<{\n episodesPath?: string;\n manifestPath?: string;\n outputDir?: string;\n timeoutMs?: number;\n executeAllParticipantTurns?: boolean;\n }>(req, res);\n if (!body) return true;\n\n if (!runtime) {\n error(res, \"Runtime is required to execute roleplay episodes\", 503);\n return true;\n }\n\n const inputPath = body.episodesPath ?? body.manifestPath;\n if (!inputPath) {\n error(res, \"episodesPath or manifestPath is required\", 400);\n return true;\n }\n\n const {\n buildRoleplayExecutionReport,\n executeRoleplayEpisodes,\n exportRoleplayExecutionResults,\n loadRoleplayEpisodesFromPath,\n } = await import(\"../core/roleplay-executor.js\");\n\n try {\n const episodes = await loadRoleplayEpisodesFromPath(inputPath);\n const executions = await executeRoleplayEpisodes(episodes, {\n runtime,\n timeoutMs: body.timeoutMs,\n executeAllParticipantTurns: body.executeAllParticipantTurns ?? false,\n });\n const outputDir =\n body.outputDir ?? `.tmp/training-roleplay-execution-${Date.now()}`;\n const paths = await exportRoleplayExecutionResults(executions, outputDir);\n const report = buildRoleplayExecutionReport(\n executions,\n paths.trajectoryDataset?.summary ?? null,\n );\n\n json(\n res,\n {\n episodesExecuted: executions.length,\n report,\n outputDir,\n paths,\n },\n 201,\n );\n } catch (err) {\n error(res, `Roleplay execution failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/trajectories/export\") {\n const body = await readJsonBody<{\n limit?: number;\n trajectoryIds?: string[];\n agentName?: string;\n outputPath?: string;\n outputDir?: string;\n splitByTask?: boolean;\n bundle?: boolean;\n exportBundle?: boolean;\n includeRaw?: boolean;\n includeRawJsonl?: boolean;\n tasks?: string[];\n runId?: string;\n }>(req, res);\n if (!body) return true;\n\n if (body.runId !== undefined && !normalizeRunId(body.runId)) {\n error(res, \"runId must be a non-empty string\", 400);\n return true;\n }\n\n const outputPath =\n body.outputPath ?? `.tmp/training-trajectory-export-${Date.now()}.jsonl`;\n\n try {\n const explicitIds = Array.isArray(body.trajectoryIds)\n ? body.trajectoryIds.filter((id) => typeof id === \"string\" && id.trim())\n : [];\n const listedTrajectories =\n explicitIds.length > 0\n ? null\n : await trainingService.listTrajectories({\n limit: body.limit ?? 100,\n offset: 0,\n runId: normalizeRunId(body.runId),\n });\n const trajectoryIds =\n explicitIds.length > 0\n ? explicitIds\n : (listedTrajectories?.trajectories ?? [])\n .map((item) => item.id)\n .filter((id) => id.length > 0);\n\n const details = (\n await Promise.all(\n trajectoryIds.map((trajectoryId: string) =>\n trainingService.getTrajectoryById(trajectoryId),\n ),\n )\n ).filter((t): t is Trajectory => t !== null);\n\n if (body.bundle || body.exportBundle) {\n const requestedRunId = normalizeRunId(body.runId);\n const bundleTrajectories = requestedRunId\n ? details.filter((trajectory) =>\n trajectoryHasRunId(trajectory, requestedRunId),\n )\n : details;\n const { buildTrajectoryExportBundle } = await import(\n \"../core/trajectory-export-bundle.js\"\n );\n const bundle = await buildTrajectoryExportBundle({\n trajectories: bundleTrajectories,\n outputDir:\n body.outputDir ?? `.tmp/training-trajectory-bundle-${Date.now()}`,\n includeRawJsonl:\n body.includeRawJsonl === true || body.includeRaw === true,\n tasks: narrowTrainingTasks(body.tasks),\n source: {\n kind: \"training-trajectories-export-route\",\n runId: requestedRunId,\n metadata: {\n requestedLimit: body.limit ?? 100,\n requestedRunId: requestedRunId ?? null,\n explicitTrajectoryIds: explicitIds.length,\n selectedTrajectoryIds: trajectoryIds.length,\n loadedTrajectories: details.length,\n bundledTrajectories: bundleTrajectories.length,\n },\n },\n });\n\n json(\n res,\n {\n trajectoriesConsidered: trajectoryIds.length,\n trajectoriesBundled: bundleTrajectories.length,\n outputDir: bundle.outputDir,\n manifestPath: bundle.manifestPath,\n bundle: bundle.manifest,\n },\n 201,\n );\n return true;\n }\n\n let exported = 0;\n let taskDataset:\n | Pick<TrajectoryTaskDatasetExport, \"counts\" | \"paths\" | \"summary\">\n | undefined;\n\n if (body.splitByTask || body.outputDir || body.tasks?.length) {\n const { exportTrajectoryTaskDatasets } = await import(\n \"../core/trajectory-task-datasets.js\"\n );\n const dataset = await exportTrajectoryTaskDatasets(\n details,\n body.outputDir ?? `.tmp/training-trajectory-export-${Date.now()}`,\n narrowTrainingTasks(body.tasks),\n );\n exported =\n dataset.counts.should_respond +\n dataset.counts.context_routing +\n dataset.counts.action_planner +\n dataset.counts.response +\n dataset.counts.media_description;\n taskDataset = {\n counts: dataset.counts,\n paths: dataset.paths,\n summary: dataset.summary,\n };\n } else {\n const { exportTrajectoriesAsTraining } = await import(\n \"../core/dataset-generator.js\"\n );\n exported = await exportTrajectoriesAsTraining(\n details,\n body.agentName ?? runtime?.character?.name ?? \"Agent\",\n outputPath,\n );\n }\n\n json(\n res,\n {\n exportedExamples: exported,\n trajectoriesConsidered: trajectoryIds.length,\n outputPath,\n taskDataset,\n },\n 201,\n );\n } catch (err) {\n error(res, `Trajectory export failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n if (method === \"POST\" && pathname === \"/api/training/trajectories/publish\") {\n const hfConfig = resolveHfUploadConfig();\n if (!hfConfig) {\n error(\n res,\n \"HuggingFace publishing is not configured. Set ELIZA_TRAJECTORY_HF_REPO and an HF token (HF_TOKEN, with HUGGINGFACE_HUB_TOKEN / HUGGING_FACE_HUB_TOKEN accepted as fallbacks).\",\n 409,\n );\n return true;\n }\n\n const body = await readJsonBody<{\n limit?: number;\n trajectoryIds?: string[];\n outputDir?: string;\n tasks?: string[];\n }>(req, res);\n if (!body) return true;\n\n try {\n const explicitIds = Array.isArray(body.trajectoryIds)\n ? body.trajectoryIds.filter((id) => typeof id === \"string\" && id.trim())\n : [];\n const listed =\n explicitIds.length > 0\n ? null\n : await trainingService.listTrajectories({\n limit: body.limit ?? 500,\n offset: 0,\n });\n const trajectoryIds =\n explicitIds.length > 0\n ? explicitIds\n : (listed?.trajectories ?? [])\n .map((item) => item.id)\n .filter((id) => id.length > 0);\n\n const details = (\n await Promise.all(\n trajectoryIds.map((trajectoryId: string) =>\n trainingService.getTrajectoryById(trajectoryId),\n ),\n )\n ).filter((t): t is Trajectory => t !== null);\n\n const { buildTrajectoryExportBundle } = await import(\n \"../core/trajectory-export-bundle.js\"\n );\n const bundle = await buildTrajectoryExportBundle({\n trajectories: details,\n outputDir:\n body.outputDir ?? `.tmp/training-trajectory-publish-${Date.now()}`,\n tasks: narrowTrainingTasks(body.tasks),\n // Privacy filter forced on with the default hash anonymizer.\n privacy: {\n apply: true,\n options: { anonymizer: createHashAnonymizer() },\n },\n uploadToHuggingFace: hfConfig,\n source: {\n kind: \"training-trajectories-publish-route\",\n metadata: {\n requestedLimit: body.limit ?? 500,\n explicitTrajectoryIds: explicitIds.length,\n selectedTrajectoryIds: trajectoryIds.length,\n loadedTrajectories: details.length,\n },\n },\n });\n\n if (!bundle.manifest.cloudUpload.uploadedToHuggingFace) {\n error(\n res,\n `HuggingFace upload failed: ${bundle.manifest.cloudUpload.huggingFaceError ?? \"unknown error\"}`,\n 502,\n );\n return true;\n }\n\n json(\n res,\n {\n trajectoriesConsidered: trajectoryIds.length,\n trajectoriesPublished: bundle.manifest.counts.sanitizedTrajectoryRows,\n outputDir: bundle.outputDir,\n manifestPath: bundle.manifestPath,\n cloudUpload: bundle.manifest.cloudUpload,\n },\n 201,\n );\n } catch (err) {\n error(res, `Trajectory publish failed: ${String(err)}`, 500);\n }\n return true;\n }\n\n return false;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Vast.ai training-job HTTP routes.
3
+ *
4
+ * Mirrors the node:http handler-delegate shape used by `training-routes.ts`:
5
+ * a single `handleVastTrainingRoutes(ctx)` that returns `true` once it has
6
+ * matched + responded to a request, `false` otherwise. Wired into the
7
+ * existing plugin route registry from `setup-routes.ts`.
8
+ *
9
+ * Auth: enforced upstream by the runtime plugin route dispatcher, which
10
+ * rejects non-`public` routes when the caller is not authorized. We do not
11
+ * call `ensureRouteAuthorized` here.
12
+ *
13
+ * Route surface (all under `/api/training/vast/...`):
14
+ * POST /jobs → create job (201 + record)
15
+ * GET /jobs → list jobs
16
+ * GET /jobs/:id → fetch one job
17
+ * POST /jobs/:id/cancel → cancel a non-terminal job
18
+ * POST /jobs/:id/eval → run eval_checkpoint.py
19
+ * GET /jobs/:id/logs?tail=200 → tail per-job log
20
+ * GET /jobs/:id/budget → running cost snapshot (M9)
21
+ * GET /models?refresh=1 → registry listing
22
+ * GET /models/:short_name/checkpoints → checkpoints for a registry key
23
+ * GET /inference/endpoints → list inference endpoints
24
+ * POST /inference/endpoints → register an inference endpoint
25
+ * DELETE /inference/endpoints/:id → delete an inference endpoint
26
+ * GET /inference/stats?label=&last_minutes=30
27
+ */
28
+ import type { RouteHelpers, RouteRequestContext } from "@elizaos/core";
29
+ import { type VastTrainingService } from "../services/training-vast-service.js";
30
+ export type VastRouteHelpers = RouteHelpers;
31
+ export interface VastRouteContext extends RouteRequestContext {
32
+ service: VastTrainingService;
33
+ }
34
+ export declare function handleVastTrainingRoutes(ctx: VastRouteContext): Promise<boolean>;
35
+ //# sourceMappingURL=training-vast-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training-vast-routes.d.ts","sourceRoot":"","sources":["../../src/routes/training-vast-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,sCAAsC,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAE5C,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB;IAC3D,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAID,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,OAAO,CAAC,CAiMlB"}
@@ -0,0 +1,249 @@
1
+ import { logger } from "@elizaos/core";
2
+ import {
3
+ VastServiceError
4
+ } from "../services/training-vast-service.js";
5
+ const PREFIX = "/api/training/vast";
6
+ async function handleVastTrainingRoutes(ctx) {
7
+ const { req, res, method, pathname, service, json, error, readJsonBody } = ctx;
8
+ if (!pathname.startsWith(PREFIX)) return false;
9
+ const sub = pathname.slice(PREFIX.length);
10
+ try {
11
+ if (method === "GET" && sub === "/models") {
12
+ const url = new URL(
13
+ req.url ?? "/",
14
+ `http://${req.headers.host ?? "localhost"}`
15
+ );
16
+ const refresh = url.searchParams.get("refresh") === "1";
17
+ const out = await service.listRegistry(refresh);
18
+ json(res, out);
19
+ return true;
20
+ }
21
+ const checkpointsMatch = /^\/models\/([^/]+)\/checkpoints$/.exec(sub);
22
+ if (method === "GET" && checkpointsMatch) {
23
+ const shortName = decodeURIComponent(checkpointsMatch[1]);
24
+ const checkpoints = await service.listCheckpointsForRegistryKey(shortName);
25
+ json(res, { registry_key: shortName, checkpoints });
26
+ return true;
27
+ }
28
+ if (method === "POST" && sub === "/jobs") {
29
+ const body = await readJsonBody(req, res);
30
+ if (!body) return true;
31
+ const parsed = parseCreateJobInput(body);
32
+ if ("error" in parsed) {
33
+ error(res, parsed.error, 400);
34
+ return true;
35
+ }
36
+ const record = await service.createJob(parsed.input);
37
+ json(
38
+ res,
39
+ {
40
+ job_id: record.job_id,
41
+ run_name: record.run_name,
42
+ status: record.status,
43
+ job: record
44
+ },
45
+ 201
46
+ );
47
+ return true;
48
+ }
49
+ if (method === "GET" && sub === "/jobs") {
50
+ const jobs = await service.listJobs();
51
+ json(res, { jobs });
52
+ return true;
53
+ }
54
+ const jobMatch = /^\/jobs\/([^/]+)$/.exec(sub);
55
+ if (method === "GET" && jobMatch) {
56
+ const jobId = decodeURIComponent(jobMatch[1]);
57
+ const job = await service.getJob(jobId);
58
+ if (!job) {
59
+ error(res, "Job not found", 404);
60
+ return true;
61
+ }
62
+ json(res, { job });
63
+ return true;
64
+ }
65
+ const cancelMatch = /^\/jobs\/([^/]+)\/cancel$/.exec(sub);
66
+ if (method === "POST" && cancelMatch) {
67
+ const jobId = decodeURIComponent(cancelMatch[1]);
68
+ const job = await service.cancelJob(jobId);
69
+ json(res, { job });
70
+ return true;
71
+ }
72
+ const evalMatch = /^\/jobs\/([^/]+)\/eval$/.exec(sub);
73
+ if (method === "POST" && evalMatch) {
74
+ const jobId = decodeURIComponent(evalMatch[1]);
75
+ let body = {};
76
+ const contentLength = Number(req.headers["content-length"] ?? "0");
77
+ if (Number.isFinite(contentLength) && contentLength > 0) {
78
+ const parsedBody = await readJsonBody(
79
+ req,
80
+ res
81
+ );
82
+ if (!parsedBody) return true;
83
+ body = parsedBody;
84
+ }
85
+ const parsed = parseEvalInput(body);
86
+ if ("error" in parsed) {
87
+ error(res, parsed.error, 400);
88
+ return true;
89
+ }
90
+ const result = await service.runEval(jobId, parsed.input);
91
+ json(res, result);
92
+ return true;
93
+ }
94
+ const budgetMatch = /^\/jobs\/([^/]+)\/budget$/.exec(sub);
95
+ if (method === "GET" && budgetMatch) {
96
+ const jobId = decodeURIComponent(budgetMatch[1]);
97
+ const snapshot = await service.getJobBudget(jobId);
98
+ json(res, { job_id: jobId, budget: snapshot });
99
+ return true;
100
+ }
101
+ const logsMatch = /^\/jobs\/([^/]+)\/logs$/.exec(sub);
102
+ if (method === "GET" && logsMatch) {
103
+ const jobId = decodeURIComponent(logsMatch[1]);
104
+ const url = new URL(
105
+ req.url ?? "/",
106
+ `http://${req.headers.host ?? "localhost"}`
107
+ );
108
+ const tail = parsePositiveIntParam(url.searchParams.get("tail"), 200);
109
+ if (tail === null) {
110
+ error(res, "tail must be a positive integer \u2264 5000", 400);
111
+ return true;
112
+ }
113
+ const lines = await service.readJobLog(jobId, tail);
114
+ json(res, { job_id: jobId, tail, lines });
115
+ return true;
116
+ }
117
+ if (method === "GET" && sub === "/inference/endpoints") {
118
+ const endpoints = await service.listInferenceEndpoints();
119
+ json(res, { endpoints });
120
+ return true;
121
+ }
122
+ if (method === "POST" && sub === "/inference/endpoints") {
123
+ const body = await readJsonBody(req, res);
124
+ if (!body) return true;
125
+ const parsed = parseEndpointInput(body);
126
+ if ("error" in parsed) {
127
+ error(res, parsed.error, 400);
128
+ return true;
129
+ }
130
+ const record = await service.createInferenceEndpoint(parsed.input);
131
+ json(res, { endpoint: record }, 201);
132
+ return true;
133
+ }
134
+ const epMatch = /^\/inference\/endpoints\/([^/]+)$/.exec(sub);
135
+ if (method === "DELETE" && epMatch) {
136
+ const id = decodeURIComponent(epMatch[1]);
137
+ const ok = await service.deleteInferenceEndpoint(id);
138
+ if (!ok) {
139
+ error(res, "Inference endpoint not found", 404);
140
+ return true;
141
+ }
142
+ json(res, { ok: true, id });
143
+ return true;
144
+ }
145
+ if (method === "GET" && sub === "/inference/stats") {
146
+ const url = new URL(
147
+ req.url ?? "/",
148
+ `http://${req.headers.host ?? "localhost"}`
149
+ );
150
+ const labelParam = url.searchParams.get("label");
151
+ const label = labelParam?.trim() ? labelParam.trim() : null;
152
+ const lastMinutes = parsePositiveIntParam(
153
+ url.searchParams.get("last_minutes"),
154
+ 30
155
+ );
156
+ if (lastMinutes === null) {
157
+ error(res, "last_minutes must be a positive integer \u2264 1440", 400);
158
+ return true;
159
+ }
160
+ const stats = await service.getInferenceStats(label, lastMinutes);
161
+ json(res, stats);
162
+ return true;
163
+ }
164
+ return false;
165
+ } catch (err) {
166
+ if (err instanceof VastServiceError) {
167
+ error(res, err.message, err.status);
168
+ return true;
169
+ }
170
+ logger.error(
171
+ `[training-vast-routes] ${method} ${pathname} failed: ${err instanceof Error ? err.stack ?? err.message : String(err)}`
172
+ );
173
+ error(res, "Internal vast training route error", 500);
174
+ return true;
175
+ }
176
+ }
177
+ function parseCreateJobInput(body) {
178
+ const rk = body.registry_key;
179
+ if (typeof rk !== "string" || !rk.trim()) {
180
+ return { error: "registry_key is required" };
181
+ }
182
+ const epochsRaw = body.epochs;
183
+ if (typeof epochsRaw !== "number" || !Number.isInteger(epochsRaw) || epochsRaw < 1) {
184
+ return { error: "epochs must be a positive integer" };
185
+ }
186
+ let runName;
187
+ if (body.run_name !== void 0) {
188
+ if (typeof body.run_name !== "string" || !body.run_name.trim()) {
189
+ return { error: "run_name must be a non-empty string when provided" };
190
+ }
191
+ runName = body.run_name.trim();
192
+ }
193
+ return {
194
+ input: { registry_key: rk.trim(), epochs: epochsRaw, run_name: runName }
195
+ };
196
+ }
197
+ function parseEvalInput(body) {
198
+ const out = {};
199
+ if (body.checkpoint_dir !== void 0) {
200
+ if (typeof body.checkpoint_dir !== "string" || !body.checkpoint_dir.trim()) {
201
+ return { error: "checkpoint_dir must be a non-empty string" };
202
+ }
203
+ out.checkpoint_dir = body.checkpoint_dir.trim();
204
+ }
205
+ if (body.val_jsonl !== void 0) {
206
+ if (typeof body.val_jsonl !== "string" || !body.val_jsonl.trim()) {
207
+ return { error: "val_jsonl must be a non-empty string" };
208
+ }
209
+ out.val_jsonl = body.val_jsonl.trim();
210
+ }
211
+ if (body.max_examples !== void 0) {
212
+ if (typeof body.max_examples !== "number" || !Number.isInteger(body.max_examples) || body.max_examples < 1) {
213
+ return { error: "max_examples must be a positive integer" };
214
+ }
215
+ out.max_examples = body.max_examples;
216
+ }
217
+ return { input: out };
218
+ }
219
+ function parseEndpointInput(body) {
220
+ const label = body.label;
221
+ const baseUrl = body.base_url;
222
+ const registryKey = body.registry_key;
223
+ if (typeof label !== "string" || !label.trim()) {
224
+ return { error: "label is required" };
225
+ }
226
+ if (typeof baseUrl !== "string" || !baseUrl.trim()) {
227
+ return { error: "base_url is required" };
228
+ }
229
+ if (typeof registryKey !== "string" || !registryKey.trim()) {
230
+ return { error: "registry_key is required" };
231
+ }
232
+ return {
233
+ input: {
234
+ label: label.trim(),
235
+ base_url: baseUrl.trim(),
236
+ registry_key: registryKey.trim()
237
+ }
238
+ };
239
+ }
240
+ function parsePositiveIntParam(raw, defaultValue) {
241
+ if (raw === null || raw === "") return defaultValue;
242
+ const n = Number(raw);
243
+ if (!Number.isInteger(n) || n < 1 || n > 5e3) return null;
244
+ return n;
245
+ }
246
+ export {
247
+ handleVastTrainingRoutes
248
+ };
249
+ //# sourceMappingURL=training-vast-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/routes/training-vast-routes.ts"],"sourcesContent":["/**\n * Vast.ai training-job HTTP routes.\n *\n * Mirrors the node:http handler-delegate shape used by `training-routes.ts`:\n * a single `handleVastTrainingRoutes(ctx)` that returns `true` once it has\n * matched + responded to a request, `false` otherwise. Wired into the\n * existing plugin route registry from `setup-routes.ts`.\n *\n * Auth: enforced upstream by the runtime plugin route dispatcher, which\n * rejects non-`public` routes when the caller is not authorized. We do not\n * call `ensureRouteAuthorized` here.\n *\n * Route surface (all under `/api/training/vast/...`):\n * POST /jobs → create job (201 + record)\n * GET /jobs → list jobs\n * GET /jobs/:id → fetch one job\n * POST /jobs/:id/cancel → cancel a non-terminal job\n * POST /jobs/:id/eval → run eval_checkpoint.py\n * GET /jobs/:id/logs?tail=200 → tail per-job log\n * GET /jobs/:id/budget → running cost snapshot (M9)\n * GET /models?refresh=1 → registry listing\n * GET /models/:short_name/checkpoints → checkpoints for a registry key\n * GET /inference/endpoints → list inference endpoints\n * POST /inference/endpoints → register an inference endpoint\n * DELETE /inference/endpoints/:id → delete an inference endpoint\n * GET /inference/stats?label=&last_minutes=30\n */\n\nimport type { RouteHelpers, RouteRequestContext } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport {\n type CreateJobInput,\n type EvalCheckpointInput,\n VastServiceError,\n type VastTrainingService,\n} from \"../services/training-vast-service.js\";\n\nexport type VastRouteHelpers = RouteHelpers;\n\nexport interface VastRouteContext extends RouteRequestContext {\n service: VastTrainingService;\n}\n\nconst PREFIX = \"/api/training/vast\";\n\nexport async function handleVastTrainingRoutes(\n ctx: VastRouteContext,\n): Promise<boolean> {\n const { req, res, method, pathname, service, json, error, readJsonBody } =\n ctx;\n if (!pathname.startsWith(PREFIX)) return false;\n\n const sub = pathname.slice(PREFIX.length); // \"\" or \"/foo\"\n\n try {\n // ── Models / registry ──────────────────────────────────────────────\n if (method === \"GET\" && sub === \"/models\") {\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n const refresh = url.searchParams.get(\"refresh\") === \"1\";\n const out = await service.listRegistry(refresh);\n json(res, out);\n return true;\n }\n\n const checkpointsMatch = /^\\/models\\/([^/]+)\\/checkpoints$/.exec(sub);\n if (method === \"GET\" && checkpointsMatch) {\n const shortName = decodeURIComponent(checkpointsMatch[1]);\n const checkpoints =\n await service.listCheckpointsForRegistryKey(shortName);\n json(res, { registry_key: shortName, checkpoints });\n return true;\n }\n\n // ── Jobs ───────────────────────────────────────────────────────────\n if (method === \"POST\" && sub === \"/jobs\") {\n const body = await readJsonBody<Record<string, unknown>>(req, res);\n if (!body) return true;\n const parsed = parseCreateJobInput(body);\n if (\"error\" in parsed) {\n error(res, parsed.error, 400);\n return true;\n }\n const record = await service.createJob(parsed.input);\n json(\n res,\n {\n job_id: record.job_id,\n run_name: record.run_name,\n status: record.status,\n job: record,\n },\n 201,\n );\n return true;\n }\n\n if (method === \"GET\" && sub === \"/jobs\") {\n const jobs = await service.listJobs();\n json(res, { jobs });\n return true;\n }\n\n const jobMatch = /^\\/jobs\\/([^/]+)$/.exec(sub);\n if (method === \"GET\" && jobMatch) {\n const jobId = decodeURIComponent(jobMatch[1]);\n const job = await service.getJob(jobId);\n if (!job) {\n error(res, \"Job not found\", 404);\n return true;\n }\n json(res, { job });\n return true;\n }\n\n const cancelMatch = /^\\/jobs\\/([^/]+)\\/cancel$/.exec(sub);\n if (method === \"POST\" && cancelMatch) {\n const jobId = decodeURIComponent(cancelMatch[1]);\n const job = await service.cancelJob(jobId);\n json(res, { job });\n return true;\n }\n\n const evalMatch = /^\\/jobs\\/([^/]+)\\/eval$/.exec(sub);\n if (method === \"POST\" && evalMatch) {\n const jobId = decodeURIComponent(evalMatch[1]);\n let body: Record<string, unknown> = {};\n const contentLength = Number(req.headers[\"content-length\"] ?? \"0\");\n if (Number.isFinite(contentLength) && contentLength > 0) {\n const parsedBody = await readJsonBody<Record<string, unknown>>(\n req,\n res,\n );\n if (!parsedBody) return true;\n body = parsedBody;\n }\n const parsed = parseEvalInput(body);\n if (\"error\" in parsed) {\n error(res, parsed.error, 400);\n return true;\n }\n const result = await service.runEval(jobId, parsed.input);\n json(res, result);\n return true;\n }\n\n const budgetMatch = /^\\/jobs\\/([^/]+)\\/budget$/.exec(sub);\n if (method === \"GET\" && budgetMatch) {\n const jobId = decodeURIComponent(budgetMatch[1]);\n const snapshot = await service.getJobBudget(jobId);\n // Return 200 with `budget: null` when no instance is provisioned\n // yet — the UI distinguishes \"not provisioned\" from a 404.\n json(res, { job_id: jobId, budget: snapshot });\n return true;\n }\n\n const logsMatch = /^\\/jobs\\/([^/]+)\\/logs$/.exec(sub);\n if (method === \"GET\" && logsMatch) {\n const jobId = decodeURIComponent(logsMatch[1]);\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n const tail = parsePositiveIntParam(url.searchParams.get(\"tail\"), 200);\n if (tail === null) {\n error(res, \"tail must be a positive integer ≤ 5000\", 400);\n return true;\n }\n const lines = await service.readJobLog(jobId, tail);\n json(res, { job_id: jobId, tail, lines });\n return true;\n }\n\n // ── Inference endpoints ────────────────────────────────────────────\n if (method === \"GET\" && sub === \"/inference/endpoints\") {\n const endpoints = await service.listInferenceEndpoints();\n json(res, { endpoints });\n return true;\n }\n\n if (method === \"POST\" && sub === \"/inference/endpoints\") {\n const body = await readJsonBody<Record<string, unknown>>(req, res);\n if (!body) return true;\n const parsed = parseEndpointInput(body);\n if (\"error\" in parsed) {\n error(res, parsed.error, 400);\n return true;\n }\n const record = await service.createInferenceEndpoint(parsed.input);\n json(res, { endpoint: record }, 201);\n return true;\n }\n\n const epMatch = /^\\/inference\\/endpoints\\/([^/]+)$/.exec(sub);\n if (method === \"DELETE\" && epMatch) {\n const id = decodeURIComponent(epMatch[1]);\n const ok = await service.deleteInferenceEndpoint(id);\n if (!ok) {\n error(res, \"Inference endpoint not found\", 404);\n return true;\n }\n json(res, { ok: true, id });\n return true;\n }\n\n if (method === \"GET\" && sub === \"/inference/stats\") {\n const url = new URL(\n req.url ?? \"/\",\n `http://${req.headers.host ?? \"localhost\"}`,\n );\n const labelParam = url.searchParams.get(\"label\");\n const label = labelParam?.trim() ? labelParam.trim() : null;\n const lastMinutes = parsePositiveIntParam(\n url.searchParams.get(\"last_minutes\"),\n 30,\n );\n if (lastMinutes === null) {\n error(res, \"last_minutes must be a positive integer ≤ 1440\", 400);\n return true;\n }\n const stats = await service.getInferenceStats(label, lastMinutes);\n json(res, stats);\n return true;\n }\n\n // No vast subroute matched — fall through so other handlers can try.\n return false;\n } catch (err) {\n if (err instanceof VastServiceError) {\n error(res, err.message, err.status);\n return true;\n }\n logger.error(\n `[training-vast-routes] ${method} ${pathname} failed: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`,\n );\n error(res, \"Internal vast training route error\", 500);\n return true;\n }\n}\n\nfunction parseCreateJobInput(\n body: Record<string, unknown>,\n): { input: CreateJobInput } | { error: string } {\n const rk = body.registry_key;\n if (typeof rk !== \"string\" || !rk.trim()) {\n return { error: \"registry_key is required\" };\n }\n const epochsRaw = body.epochs;\n if (\n typeof epochsRaw !== \"number\" ||\n !Number.isInteger(epochsRaw) ||\n epochsRaw < 1\n ) {\n return { error: \"epochs must be a positive integer\" };\n }\n let runName: string | undefined;\n if (body.run_name !== undefined) {\n if (typeof body.run_name !== \"string\" || !body.run_name.trim()) {\n return { error: \"run_name must be a non-empty string when provided\" };\n }\n runName = body.run_name.trim();\n }\n return {\n input: { registry_key: rk.trim(), epochs: epochsRaw, run_name: runName },\n };\n}\n\nfunction parseEvalInput(\n body: Record<string, unknown>,\n): { input: Partial<EvalCheckpointInput> } | { error: string } {\n const out: Partial<EvalCheckpointInput> = {};\n if (body.checkpoint_dir !== undefined) {\n if (\n typeof body.checkpoint_dir !== \"string\" ||\n !body.checkpoint_dir.trim()\n ) {\n return { error: \"checkpoint_dir must be a non-empty string\" };\n }\n out.checkpoint_dir = body.checkpoint_dir.trim();\n }\n if (body.val_jsonl !== undefined) {\n if (typeof body.val_jsonl !== \"string\" || !body.val_jsonl.trim()) {\n return { error: \"val_jsonl must be a non-empty string\" };\n }\n out.val_jsonl = body.val_jsonl.trim();\n }\n if (body.max_examples !== undefined) {\n if (\n typeof body.max_examples !== \"number\" ||\n !Number.isInteger(body.max_examples) ||\n body.max_examples < 1\n ) {\n return { error: \"max_examples must be a positive integer\" };\n }\n out.max_examples = body.max_examples;\n }\n return { input: out };\n}\n\nfunction parseEndpointInput(\n body: Record<string, unknown>,\n):\n | { input: { label: string; base_url: string; registry_key: string } }\n | { error: string } {\n const label = body.label;\n const baseUrl = body.base_url;\n const registryKey = body.registry_key;\n if (typeof label !== \"string\" || !label.trim()) {\n return { error: \"label is required\" };\n }\n if (typeof baseUrl !== \"string\" || !baseUrl.trim()) {\n return { error: \"base_url is required\" };\n }\n if (typeof registryKey !== \"string\" || !registryKey.trim()) {\n return { error: \"registry_key is required\" };\n }\n return {\n input: {\n label: label.trim(),\n base_url: baseUrl.trim(),\n registry_key: registryKey.trim(),\n },\n };\n}\n\nfunction parsePositiveIntParam(\n raw: string | null,\n defaultValue: number,\n): number | null {\n if (raw === null || raw === \"\") return defaultValue;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1 || n > 5000) return null;\n return n;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Trajectory API routes for the Eliza Control UI.
3
+ *
4
+ * Provides endpoints for:
5
+ * - Listing and searching trajectories
6
+ * - Viewing trajectory details with LLM calls and provider accesses
7
+ * - Exporting trajectories to JSON, CSV, or ZIP
8
+ * - Deleting trajectories
9
+ * - Getting trajectory statistics
10
+ * - Enabling/disabling trajectory logging
11
+ *
12
+ * Uses the native trajectories service for data access.
13
+ */
14
+ import type http from "node:http";
15
+ import type { TrajectoryExportFormat } from "@elizaos/agent";
16
+ import { type AgentRuntime } from "@elizaos/core";
17
+ export type { TrajectoryExportFormat };
18
+ export declare function handleTrajectoryRoute(req: http.IncomingMessage, res: http.ServerResponse, runtime: AgentRuntime, pathname: string, method: string): Promise<boolean>;
19
+ //# sourceMappingURL=trajectory-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trajectory-routes.d.ts","sourceRoot":"","sources":["../../src/routes/trajectory-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAEV,sBAAsB,EASvB,MAAM,gBAAgB,CAAC;AAUxB,OAAO,EACL,KAAK,YAAY,EAKlB,MAAM,eAAe,CAAC;AAGvB,YAAY,EAAE,sBAAsB,EAAE,CAAC;AA6zDvC,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CA+ClB"}