@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,729 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import {
5
+ applyPrivacyFilter
6
+ } from "./privacy-filter.js";
7
+ import {
8
+ gatedPersistNativeResult
9
+ } from "./promotion-persist.js";
10
+ import {
11
+ ALL_TRAINING_TASKS,
12
+ loadTrainingConfig,
13
+ resolveTaskPolicy,
14
+ trainingStateRoot
15
+ } from "./training-config.js";
16
+ import {
17
+ exportTrajectoryTaskDatasets
18
+ } from "./trajectory-task-datasets.js";
19
+ function runsDir() {
20
+ return join(trainingStateRoot(), "runs");
21
+ }
22
+ function newRunId() {
23
+ return `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
24
+ }
25
+ function nowIso() {
26
+ return (/* @__PURE__ */ new Date()).toISOString();
27
+ }
28
+ const PLANNER_BASELINE = `task: Plan the next native tool calls for the current ContextObject.
29
+
30
+ context_object:
31
+ {{contextObject}}
32
+
33
+ trajectory:
34
+ {{trajectory}}
35
+
36
+ rules:
37
+ - use only tools exposed in the current context object
38
+ - plan the smallest grounded queue of useful tool calls
39
+ - include arguments only when grounded in the user request or prior tool results
40
+ - if the task is complete or the only next step is speaking to the user, return no toolCalls and set messageToUser
41
+ - do not invent tool names, connector names, providers, ids, or benchmark ids
42
+
43
+ return:
44
+ JSON object only. No markdown, no prose, no XML, no legacy formats.`;
45
+ const SHOULD_RESPOND_BASELINE = `task: Decide whether the agent should respond to the current conversation turn.
46
+
47
+ context_object:
48
+ {{contextObject}}
49
+
50
+ trajectory:
51
+ {{trajectory}}
52
+
53
+ rules:
54
+ - choose respond when the user directly addresses the agent, asks for help, or the agent has a useful next action
55
+ - choose ignore for ambient chatter, messages clearly meant for someone else, or turns where responding would add noise
56
+ - choose stop when the conversation is complete or the user asks the agent to stop
57
+ - ground the decision in the provided context and trajectory only
58
+
59
+ return:
60
+ JSON object only with decision ("respond" | "ignore" | "stop") and concise reasoning.`;
61
+ const CONTEXT_ROUTING_BASELINE = `task: Route the current turn to the smallest useful execution context.
62
+
63
+ context_object:
64
+ {{contextObject}}
65
+
66
+ trajectory:
67
+ {{trajectory}}
68
+
69
+ rules:
70
+ - classify whether the turn needs ordinary reply generation, tool planning, memory/context lookup, media analysis, or no action
71
+ - prefer the narrowest context that can satisfy the user request
72
+ - do not invent capabilities that are absent from the context object
73
+ - if the current context is sufficient for a direct answer, keep routing simple
74
+
75
+ return:
76
+ JSON object only with context, requiresTool, candidateAction when grounded, and concise reasoning.`;
77
+ const RESPONSE_BASELINE = `task: Write the final user-facing response for the current turn.
78
+
79
+ context_object:
80
+ {{contextObject}}
81
+
82
+ trajectory:
83
+ {{trajectory}}
84
+
85
+ rules:
86
+ - answer directly using the available trajectory and context
87
+ - include relevant tool outputs or results instead of describing that tools were run
88
+ - be concise, concrete, and honest about any missing or failed evidence
89
+ - do not promise background work after this response
90
+ - do not include private chain-of-thought or implementation-only notes
91
+
92
+ return:
93
+ Natural language response text only.`;
94
+ const MEDIA_DESCRIPTION_BASELINE = `task: Describe the supplied media for downstream agent reasoning.
95
+
96
+ context_object:
97
+ {{contextObject}}
98
+
99
+ trajectory:
100
+ {{trajectory}}
101
+
102
+ rules:
103
+ - identify visible subjects, text, layout, actions, and notable details
104
+ - separate direct observations from uncertain inferences
105
+ - mention safety-relevant, UI-relevant, or task-relevant details when present
106
+ - avoid guessing identities or hidden intent without evidence
107
+
108
+ return:
109
+ JSON object only with summary, observations, text, uncertainty, and taskRelevantDetails.`;
110
+ const VIEW_CONTEXT_BASELINE = `task: Infer which app view fits the user's current situation when they did not name one.
111
+
112
+ context_object:
113
+ {{contextObject}}
114
+
115
+ trajectory:
116
+ {{trajectory}}
117
+
118
+ rules:
119
+ - only choose a view when the message clearly implies an activity that maps to one (e.g. coding work \u2192 task-coordinator, scheduling \u2192 calendar, spending \u2192 finances)
120
+ - return "none" when the message names a view directly (the navigation action handles those) or implies no specific surface
121
+ - never guess; ambiguous or chit-chat turns return "none"
122
+
123
+ return:
124
+ JSON object only with viewId (a registered view id or "none") and an optional reason.`;
125
+ const CALENDAR_EXTRACT_BASELINE = `task: Extract a structured calendar event from a natural-language request.
126
+
127
+ request:
128
+ {{request}}
129
+
130
+ rules:
131
+ - resolve relative dates/times against the owner's current local time
132
+ - infer end time from a stated duration; default to a 30-minute event when none is given
133
+ - only include attendees explicitly named in the request
134
+
135
+ return:
136
+ JSON object only: { title, start (ISO 8601), end (ISO 8601), recurrence (RRULE or null), attendees (array), location (string or null) }.`;
137
+ const SCHEDULE_PLAN_BASELINE = `task: Order the owner's pending commitments into a concrete plan for the available time.
138
+
139
+ commitments:
140
+ {{commitments}}
141
+
142
+ free_slots:
143
+ {{freeSlots}}
144
+
145
+ rules:
146
+ - never double-book a slot; respect hard deadlines and fixed-time events first
147
+ - keep travel/buffer time between location-bound items
148
+ - surface anything that does not fit rather than silently dropping it
149
+
150
+ return:
151
+ JSON object only: { schedule: [{ itemId, start, end }], unplaced: [itemId], notes }.`;
152
+ const REMINDER_DISPATCH_BASELINE = `task: Decide whether to fire a reminder now and compose its message.
153
+
154
+ reminder:
155
+ {{reminder}}
156
+
157
+ context:
158
+ {{context}}
159
+
160
+ rules:
161
+ - only fire when the trigger condition is met; otherwise return shouldFire false
162
+ - write a short, specific message in the owner's voice; no filler
163
+ - escalate channel only when the reminder is overdue or marked urgent
164
+
165
+ return:
166
+ JSON object only: { shouldFire (boolean), channel, message }.`;
167
+ const INBOX_TRIAGE_BASELINE = `task: Classify one inbox message for the owner.
168
+
169
+ message:
170
+ {{message}}
171
+
172
+ rules:
173
+ - category must be one of ignore, info, notify, needs_reply, urgent
174
+ - urgency must be low, medium, or high
175
+ - use needs_reply when someone asks a question or expects a response
176
+ - use urgent only for time-sensitive or critical owner attention
177
+
178
+ return:
179
+ JSON object only: { category, urgency, confidence, reasoning, suggestedResponse }.`;
180
+ const MEETING_PREP_BASELINE = `task: Produce a concise prebrief for an upcoming meeting.
181
+
182
+ meeting:
183
+ {{meeting}}
184
+
185
+ context:
186
+ {{context}}
187
+
188
+ rules:
189
+ - lead with the meeting's purpose and the owner's desired outcome
190
+ - include only attendees and prior-thread facts that matter for this meeting
191
+ - keep talking points actionable; no generic advice
192
+
193
+ return:
194
+ JSON object only: { purpose, attendees: [{ name, note }], agenda: [string], talkingPoints: [string] }.`;
195
+ const MORNING_BRIEF_BASELINE = `task: Compose the owner's morning brief.
196
+
197
+ calendar:
198
+ {{calendar}}
199
+
200
+ tasks:
201
+ {{tasks}}
202
+
203
+ inbox:
204
+ {{inbox}}
205
+
206
+ rules:
207
+ - lead with the single most important thing for the day
208
+ - group by calendar, then must-do tasks, then inbox items needing a reply
209
+ - be brief and scannable; no greetings or filler
210
+
211
+ return:
212
+ Markdown brief only.`;
213
+ const HEALTH_CHECKIN_BASELINE = `task: Generate a health/sleep check-in for the owner.
214
+
215
+ signals:
216
+ {{signals}}
217
+
218
+ rules:
219
+ - ground every observation in a provided signal; never fabricate metrics
220
+ - ask at most one follow-up question, and only when a signal is missing or anomalous
221
+ - keep an encouraging, non-clinical tone
222
+
223
+ return:
224
+ JSON object only: { observation, question (string or null), suggestion }.`;
225
+ const SCREENTIME_RECAP_BASELINE = `task: Summarize the owner's screen-time and propose a focus adjustment.
226
+
227
+ usage:
228
+ {{usage}}
229
+
230
+ rules:
231
+ - highlight the largest changes vs. the prior period, not raw totals alone
232
+ - tie any suggestion to an actual usage pattern in the data
233
+ - propose at most one concrete blocker/focus change
234
+
235
+ return:
236
+ JSON object only: { recap, topApps: [{ app, minutes }], suggestion }.`;
237
+ function defaultBaselineForTask(task) {
238
+ switch (task) {
239
+ case "should_respond":
240
+ return SHOULD_RESPOND_BASELINE;
241
+ case "context_routing":
242
+ return CONTEXT_ROUTING_BASELINE;
243
+ case "action_planner":
244
+ return PLANNER_BASELINE;
245
+ case "response":
246
+ return RESPONSE_BASELINE;
247
+ case "media_description":
248
+ return MEDIA_DESCRIPTION_BASELINE;
249
+ case "view_context":
250
+ return VIEW_CONTEXT_BASELINE;
251
+ case "calendar_extract":
252
+ return CALENDAR_EXTRACT_BASELINE;
253
+ case "schedule_plan":
254
+ return SCHEDULE_PLAN_BASELINE;
255
+ case "reminder_dispatch":
256
+ return REMINDER_DISPATCH_BASELINE;
257
+ case "inbox_triage":
258
+ return INBOX_TRIAGE_BASELINE;
259
+ case "meeting_prep":
260
+ return MEETING_PREP_BASELINE;
261
+ case "morning_brief":
262
+ return MORNING_BRIEF_BASELINE;
263
+ case "health_checkin":
264
+ return HEALTH_CHECKIN_BASELINE;
265
+ case "screentime_recap":
266
+ return SCREENTIME_RECAP_BASELINE;
267
+ }
268
+ }
269
+ function firstStringExport(promptModule, names) {
270
+ for (const name of names) {
271
+ const value = promptModule[name];
272
+ if (typeof value === "string" && value.trim().length > 0) {
273
+ return value;
274
+ }
275
+ if (Array.isArray(value) && value.every((entry) => typeof entry === "string")) {
276
+ const joined = value.join("\n").trim();
277
+ if (joined.length > 0) {
278
+ return joined;
279
+ }
280
+ }
281
+ }
282
+ return null;
283
+ }
284
+ async function importOptionalModule(specifier) {
285
+ try {
286
+ const imported = await import(specifier);
287
+ return imported;
288
+ } catch {
289
+ return null;
290
+ }
291
+ }
292
+ async function loadFirstStringExport(specifier, names, sourceSpecifier) {
293
+ if (sourceSpecifier) {
294
+ const sourceUrl = new URL(sourceSpecifier, import.meta.url);
295
+ const sourceModule = await importOptionalModule(sourceUrl.href);
296
+ const sourceExported = sourceModule ? firstStringExport(sourceModule, names) : null;
297
+ if (sourceExported) {
298
+ return sourceExported;
299
+ }
300
+ }
301
+ const promptModule = await importOptionalModule(specifier);
302
+ return promptModule ? firstStringExport(promptModule, names) : null;
303
+ }
304
+ async function loadLiveLifeOpsBaseline(task) {
305
+ switch (task) {
306
+ case "calendar_extract":
307
+ return loadFirstStringExport(
308
+ "@elizaos/plugin-calendar/actions/optimized-prompt-instructions",
309
+ ["CALENDAR_PLAN_INSTRUCTIONS"],
310
+ "../../../plugin-calendar/src/actions/optimized-prompt-instructions.ts"
311
+ );
312
+ case "schedule_plan":
313
+ return loadFirstStringExport(
314
+ "@elizaos/plugin-personal-assistant/lifeops/optimized-prompt-instructions",
315
+ ["SCHEDULE_PLAN_INSTRUCTIONS"],
316
+ "../../../plugin-personal-assistant/src/lifeops/optimized-prompt-instructions.ts"
317
+ );
318
+ case "reminder_dispatch":
319
+ return loadFirstStringExport(
320
+ "@elizaos/plugin-personal-assistant/lifeops/optimized-prompt-instructions",
321
+ ["REMINDER_DISPATCH_INSTRUCTIONS"],
322
+ "../../../plugin-personal-assistant/src/lifeops/optimized-prompt-instructions.ts"
323
+ );
324
+ case "inbox_triage":
325
+ return loadFirstStringExport(
326
+ "@elizaos/plugin-inbox/inbox/triage-classifier",
327
+ ["INBOX_TRIAGE_INSTRUCTIONS"],
328
+ "../../../plugin-inbox/src/inbox/triage-classifier.ts"
329
+ );
330
+ case "meeting_prep":
331
+ return loadFirstStringExport(
332
+ "@elizaos/plugin-personal-assistant/lifeops/optimized-prompt-instructions",
333
+ ["MEETING_PREP_INSTRUCTIONS"],
334
+ "../../../plugin-personal-assistant/src/lifeops/optimized-prompt-instructions.ts"
335
+ );
336
+ case "morning_brief":
337
+ return loadFirstStringExport(
338
+ "@elizaos/plugin-personal-assistant/lifeops/optimized-prompt-instructions",
339
+ ["BRIEF_NARRATIVE_INSTRUCTIONS"],
340
+ "../../../plugin-personal-assistant/src/lifeops/optimized-prompt-instructions.ts"
341
+ );
342
+ case "health_checkin":
343
+ return loadFirstStringExport(
344
+ "@elizaos/plugin-health/actions/optimized-prompt-instructions",
345
+ ["HEALTH_PLAN_INSTRUCTIONS"],
346
+ "../../../plugin-health/src/actions/optimized-prompt-instructions.ts"
347
+ );
348
+ case "screentime_recap":
349
+ return loadFirstStringExport(
350
+ "@elizaos/plugin-health/actions/optimized-prompt-instructions",
351
+ ["SCREENTIME_RECAP_INSTRUCTIONS"],
352
+ "../../../plugin-health/src/actions/optimized-prompt-instructions.ts"
353
+ );
354
+ default:
355
+ return null;
356
+ }
357
+ }
358
+ function pathForTask(paths, task) {
359
+ switch (task) {
360
+ case "should_respond":
361
+ return paths.shouldRespondPath;
362
+ case "context_routing":
363
+ return paths.contextRoutingPath;
364
+ case "action_planner":
365
+ return paths.actionPlannerPath;
366
+ case "response":
367
+ return paths.responsePath;
368
+ case "media_description":
369
+ return paths.mediaDescriptionPath;
370
+ case "view_context":
371
+ return paths.viewContextPath;
372
+ case "calendar_extract":
373
+ return paths.calendarExtractPath;
374
+ case "schedule_plan":
375
+ return paths.schedulePlanPath;
376
+ case "reminder_dispatch":
377
+ return paths.reminderDispatchPath;
378
+ case "inbox_triage":
379
+ return paths.inboxTriagePath;
380
+ case "meeting_prep":
381
+ return paths.meetingPrepPath;
382
+ case "morning_brief":
383
+ return paths.morningBriefPath;
384
+ case "health_checkin":
385
+ return paths.healthCheckinPath;
386
+ case "screentime_recap":
387
+ return paths.screentimeRecapPath;
388
+ }
389
+ }
390
+ function selectTask(config, explicit, counts) {
391
+ if (explicit) return explicit;
392
+ let bestTask = null;
393
+ let bestCount = 0;
394
+ for (const task of ALL_TRAINING_TASKS) {
395
+ const policy = resolveTaskPolicy(config, task);
396
+ const count = counts[task];
397
+ if (count > bestCount && count >= policy.threshold) {
398
+ bestCount = count;
399
+ bestTask = task;
400
+ }
401
+ }
402
+ return bestTask;
403
+ }
404
+ async function defaultDispatcher(input) {
405
+ switch (input.backend) {
406
+ case "native": {
407
+ const { runNativeBackend } = await import("../backends/native.js");
408
+ const useModelHandler = await extractUseModel(input.runtime);
409
+ if (!useModelHandler) {
410
+ return {
411
+ invoked: false,
412
+ notes: [
413
+ "native backend requires a runtime exposing useModel; skipped"
414
+ ]
415
+ };
416
+ }
417
+ const baselinePrompt = await loadBaselineForTask(input.task);
418
+ const optimizerName = process.env.TRAIN_OPTIMIZER?.trim() ?? "gepa";
419
+ const result = await runNativeBackend({
420
+ datasetPath: input.datasetPath,
421
+ task: input.task,
422
+ optimizer: optimizerName,
423
+ baselinePrompt,
424
+ runtime: { useModel: useModelHandler }
425
+ });
426
+ const notes = [...result.notes];
427
+ if (!result.invoked) {
428
+ return { invoked: false, notes };
429
+ }
430
+ const service = getOptimizedPromptService(input.runtime);
431
+ if (!service) {
432
+ notes.push(
433
+ "OptimizedPromptService unavailable; artifact not persisted"
434
+ );
435
+ return { invoked: true, notes };
436
+ }
437
+ return await gatedPersistNativeResult({
438
+ task: input.task,
439
+ datasetPath: input.datasetPath,
440
+ runId: input.runId,
441
+ baselinePrompt,
442
+ result,
443
+ service,
444
+ notesPrefix: notes
445
+ });
446
+ }
447
+ }
448
+ }
449
+ async function extractUseModel(runtime) {
450
+ const trainProvider = process.env.TRAIN_MODEL_PROVIDER?.trim() ?? process.env.TRAINING_PROVIDER?.trim();
451
+ if (trainProvider === "cerebras") {
452
+ const { getTrainingUseModelAdapter } = await import("./cerebras-eval-model.js");
453
+ return getTrainingUseModelAdapter();
454
+ }
455
+ const candidate = runtime;
456
+ if (typeof candidate.useModel !== "function") return null;
457
+ return async (input) => {
458
+ return await candidate.useModel?.("TEXT_LARGE", input);
459
+ };
460
+ }
461
+ function getOptimizedPromptService(runtime) {
462
+ const service = runtime.getService(
463
+ "optimized_prompt"
464
+ );
465
+ if (!service || typeof service.setPrompt !== "function") return null;
466
+ return service;
467
+ }
468
+ async function loadBaselineForTask(task) {
469
+ const prompts = await import("@elizaos/core").catch(() => null);
470
+ if (!prompts) {
471
+ return defaultBaselineForTask(task);
472
+ }
473
+ const promptModule = prompts;
474
+ switch (task) {
475
+ case "should_respond":
476
+ return firstStringExport(promptModule, [
477
+ "shouldRespondTemplate",
478
+ "messageHandlerTemplate"
479
+ ]) ?? defaultBaselineForTask(task);
480
+ case "context_routing":
481
+ return firstStringExport(promptModule, [
482
+ "messageHandlerTemplate",
483
+ "shouldRespondTemplate"
484
+ ]) ?? defaultBaselineForTask(task);
485
+ case "response":
486
+ return firstStringExport(promptModule, [
487
+ "messageHandlerTemplate",
488
+ "replyTemplate"
489
+ ]) ?? defaultBaselineForTask(task);
490
+ case "action_planner":
491
+ return firstStringExport(promptModule, [
492
+ "plannerTemplate",
493
+ "PLANNER_TEMPLATE"
494
+ ]) ?? PLANNER_BASELINE;
495
+ case "media_description":
496
+ return firstStringExport(promptModule, [
497
+ "imageDescriptionTemplate",
498
+ "IMAGE_DESCRIPTION_TEMPLATE"
499
+ ]) ?? defaultBaselineForTask(task);
500
+ case "view_context":
501
+ return defaultBaselineForTask(task);
502
+ case "calendar_extract":
503
+ case "schedule_plan":
504
+ case "reminder_dispatch":
505
+ case "inbox_triage":
506
+ case "meeting_prep":
507
+ case "morning_brief":
508
+ case "health_checkin":
509
+ case "screentime_recap": {
510
+ const liveBaseline = await loadLiveLifeOpsBaseline(task);
511
+ return liveBaseline ?? defaultBaselineForTask(task);
512
+ }
513
+ }
514
+ }
515
+ async function recordRun(record) {
516
+ const dir = runsDir();
517
+ await mkdir(dir, { recursive: true });
518
+ const path = join(dir, `${record.runId}.json`);
519
+ await writeFile(path, `${JSON.stringify(record, null, 2)}
520
+ `, "utf-8");
521
+ return path;
522
+ }
523
+ async function loadRun(runId) {
524
+ const path = join(runsDir(), `${runId}.json`);
525
+ if (!existsSync(path)) return null;
526
+ const raw = await readFile(path, "utf-8");
527
+ return JSON.parse(raw);
528
+ }
529
+ async function listRuns(limit = 20) {
530
+ const dir = runsDir();
531
+ if (!existsSync(dir)) return [];
532
+ const entries = await readdir(dir);
533
+ const runFiles = entries.filter((name) => name.endsWith(".json"));
534
+ runFiles.sort((a, b) => a < b ? 1 : -1);
535
+ const sliced = runFiles.slice(0, Math.max(0, limit));
536
+ const records = [];
537
+ for (const file of sliced) {
538
+ const raw = await readFile(join(dir, file), "utf-8");
539
+ records.push(JSON.parse(raw));
540
+ }
541
+ return records;
542
+ }
543
+ async function triggerTraining(runtime, options) {
544
+ const runId = newRunId();
545
+ const startedAt = nowIso();
546
+ const log = runtime.logger ?? {
547
+ info: () => {
548
+ },
549
+ warn: () => {
550
+ },
551
+ error: () => {
552
+ }
553
+ };
554
+ const config = options.config ?? loadTrainingConfig();
555
+ const trajectoryService = runtime.getService(
556
+ "trajectories"
557
+ );
558
+ if (!trajectoryService || typeof trajectoryService.listTrajectories !== "function" || typeof trajectoryService.getTrajectoryDetail !== "function") {
559
+ const finishedAt2 = nowIso();
560
+ const record2 = {
561
+ runId,
562
+ status: "skipped",
563
+ reason: "trajectories service unavailable",
564
+ task: options.task ?? null,
565
+ backend: options.backend ?? null,
566
+ source: options.source,
567
+ datasetSize: 0,
568
+ startedAt,
569
+ finishedAt: finishedAt2,
570
+ pulledTrajectories: 0,
571
+ filteredTrajectories: 0,
572
+ redactionCount: 0,
573
+ anonymizationCount: 0,
574
+ dryRun: options.dryRun ?? false
575
+ };
576
+ await recordRun(record2);
577
+ log.warn(
578
+ `[TrainingOrchestrator] ${runId} skipped: trajectories service unavailable`
579
+ );
580
+ return record2;
581
+ }
582
+ const limit = options.trajectoryLimit ?? 500;
583
+ const list = await trajectoryService.listTrajectories({ limit });
584
+ const trajectories = [];
585
+ for (const item of list.trajectories) {
586
+ const detail = await trajectoryService.getTrajectoryDetail(item.id);
587
+ if (detail) trajectories.push(detail);
588
+ }
589
+ const filtered = applyPrivacyFilter(trajectories, {
590
+ anonymizer: options.anonymizer
591
+ });
592
+ const outputDir = join(trainingStateRoot(), "runs", runId, "datasets");
593
+ await mkdir(outputDir, { recursive: true });
594
+ const dataset = await exportTrajectoryTaskDatasets(
595
+ filtered.trajectories,
596
+ outputDir
597
+ );
598
+ const task = selectTask(config, options.task, dataset.counts);
599
+ if (!task) {
600
+ const finishedAt2 = nowIso();
601
+ const record2 = {
602
+ runId,
603
+ status: "skipped",
604
+ reason: "no task reached its trigger threshold and none was specified explicitly",
605
+ task: null,
606
+ backend: options.backend ?? null,
607
+ source: options.source,
608
+ datasetSize: 0,
609
+ startedAt,
610
+ finishedAt: finishedAt2,
611
+ pulledTrajectories: trajectories.length,
612
+ filteredTrajectories: filtered.trajectories.length,
613
+ redactionCount: filtered.redactionCount,
614
+ anonymizationCount: filtered.anonymizationCount,
615
+ datasetPaths: dataset.paths,
616
+ perTaskCounts: dataset.counts,
617
+ dryRun: options.dryRun ?? false
618
+ };
619
+ await recordRun(record2);
620
+ log.info(
621
+ `[TrainingOrchestrator] ${runId} skipped: no task selected (counts=${JSON.stringify(dataset.counts)})`
622
+ );
623
+ return record2;
624
+ }
625
+ const policy = resolveTaskPolicy(config, task);
626
+ const backend = options.backend ?? policy.backend;
627
+ const datasetPath = pathForTask(dataset.paths, task);
628
+ const datasetSize = dataset.counts[task];
629
+ if (!backend) {
630
+ const finishedAt2 = nowIso();
631
+ const record2 = {
632
+ runId,
633
+ status: "skipped",
634
+ reason: "no backend configured",
635
+ task,
636
+ backend: null,
637
+ source: options.source,
638
+ datasetSize,
639
+ startedAt,
640
+ finishedAt: finishedAt2,
641
+ pulledTrajectories: trajectories.length,
642
+ filteredTrajectories: filtered.trajectories.length,
643
+ redactionCount: filtered.redactionCount,
644
+ anonymizationCount: filtered.anonymizationCount,
645
+ datasetPaths: dataset.paths,
646
+ perTaskCounts: dataset.counts,
647
+ dryRun: options.dryRun ?? false,
648
+ notes: [
649
+ "Set training.backends in <state>/training/config.json to enable dispatch."
650
+ ]
651
+ };
652
+ await recordRun(record2);
653
+ log.info(
654
+ `[TrainingOrchestrator] ${runId} skipped: no backend configured for task=${task}`
655
+ );
656
+ return record2;
657
+ }
658
+ if (options.dryRun) {
659
+ const finishedAt2 = nowIso();
660
+ const record2 = {
661
+ runId,
662
+ status: "succeeded",
663
+ reason: "dry run",
664
+ task,
665
+ backend,
666
+ source: options.source,
667
+ datasetSize,
668
+ startedAt,
669
+ finishedAt: finishedAt2,
670
+ pulledTrajectories: trajectories.length,
671
+ filteredTrajectories: filtered.trajectories.length,
672
+ redactionCount: filtered.redactionCount,
673
+ anonymizationCount: filtered.anonymizationCount,
674
+ datasetPaths: dataset.paths,
675
+ perTaskCounts: dataset.counts,
676
+ dryRun: true,
677
+ notes: [`dry run; would dispatch ${datasetPath} to backend=${backend}`]
678
+ };
679
+ await recordRun(record2);
680
+ log.info(
681
+ `[TrainingOrchestrator] ${runId} dry-run task=${task} backend=${backend} datasetSize=${datasetSize}`
682
+ );
683
+ return record2;
684
+ }
685
+ const dispatcher = options.dispatcher ?? defaultDispatcher;
686
+ const dispatchResult = await dispatcher({
687
+ task,
688
+ backend,
689
+ datasetPath,
690
+ runId,
691
+ outputDir,
692
+ runtime
693
+ });
694
+ const finishedAt = nowIso();
695
+ const status = dispatchResult.invoked ? "succeeded" : "skipped";
696
+ const record = {
697
+ runId,
698
+ status,
699
+ reason: dispatchResult.invoked ? void 0 : "backend declined to invoke",
700
+ task,
701
+ backend,
702
+ source: options.source,
703
+ datasetSize,
704
+ startedAt,
705
+ finishedAt,
706
+ pulledTrajectories: trajectories.length,
707
+ filteredTrajectories: filtered.trajectories.length,
708
+ redactionCount: filtered.redactionCount,
709
+ anonymizationCount: filtered.anonymizationCount,
710
+ datasetPaths: dataset.paths,
711
+ perTaskCounts: dataset.counts,
712
+ artifactPath: dispatchResult.artifactPath,
713
+ dryRun: false,
714
+ notes: dispatchResult.notes
715
+ };
716
+ await recordRun(record);
717
+ log.info(
718
+ `[TrainingOrchestrator] ${runId} ${status} task=${task} backend=${backend} datasetSize=${datasetSize}`
719
+ );
720
+ return record;
721
+ }
722
+ export {
723
+ listRuns,
724
+ loadBaselineForTask,
725
+ loadRun,
726
+ recordRun,
727
+ triggerTraining
728
+ };
729
+ //# sourceMappingURL=training-orchestrator.js.map