@elizaos/plugin-training 2.0.3-beta.6 → 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/core/dataset-generator.ts"],"sourcesContent":["/**\n * Synthetic dataset generator for fine-tuning the shouldRespond + context-routing\n * messageHandler router and the action planner.\n *\n * Architecture:\n * 1. Takes scenario blueprints and expands each into N variants\n * 2. Uses a teacher model (Claude/GPT-5) to generate realistic conversations\n * 3. Randomizes agent name per sample to prevent statistical pollution\n * 4. Exports in eliza_native_v1 model-boundary JSONL format\n *\n * Teacher model selection:\n * - ANTHROPIC_API_KEY → Claude Sonnet 4\n * - OPENAI_API_KEY → GPT-5 / GPT-4o\n * - Falls back to whichever is available\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Trajectory } from \"@elizaos/agent\";\nimport type { IAgentRuntime, RecordLlmCallDetails } from \"@elizaos/core\";\nimport * as ElizaCore from \"@elizaos/core\";\nimport {\n buildElizaNativeTrajectoryRows,\n ELIZA_NATIVE_TRAJECTORY_FORMAT,\n type ElizaNativeTrajectoryRow,\n iterateTrajectoryLlmCalls,\n} from \"@elizaos/core\";\nimport {\n ACTION_CONTEXT_MAP,\n ALL_CONTEXTS,\n PROVIDER_CONTEXT_MAP,\n} from \"./context-catalog.js\";\nimport type { AgentContext } from \"./context-types.js\";\nimport {\n ALL_BLUEPRINTS,\n type ScenarioBlueprint,\n} from \"./scenario-blueprints.js\";\n\nconst SHOULD_RESPOND_PROMPT_TEMPLATE = `task: Decide whether {{agentName}} should respond, ignore, or stop.\n\ncontext:\n{{providers}}\n\navailable_contexts:\n{{availableContexts}}\n\nrules[6]:\n- direct mention of {{agentName}} -> RESPOND\n- different assistant name or talking to someone else -> IGNORE unless {{agentName}} is also directly addressed\n- prior participation by {{agentName}} in the thread is not enough by itself; the newest message must still clearly expect {{agentName}} -> otherwise IGNORE\n- request to stop or be quiet directed at {{agentName}} -> STOP\n- if multiple people are mentioned and {{agentName}} is one of the addressees -> RESPOND\n- if unsure whether the speaker is talking to {{agentName}}, prefer IGNORE over hallucinating relevance\n\nmessage_handler:\n- action: RESPOND, IGNORE, or STOP\n- contexts: list of available_contexts needed for planner/tool/provider work; [\"simple\"] for direct replies (the reply is the full answer); [] for IGNORE or STOP\n- thought: short internal routing rationale\n- reply: required user-visible reply when contexts is [\"simple\"]\n\ndecision_note:\n- respond only when the latest message is talking TO {{agentName}}\n- talking TO {{agentName}} means name mention, reply chain, or a clear follow-up that still expects {{agentName}} to answer\n- casual conversation between other users is not enough\n- if another assistant already answered and nobody re-addressed {{agentName}}, IGNORE\n- if {{agentName}} already replied recently and nobody re-addressed {{agentName}}, IGNORE\n- talking ABOUT {{agentName}} or continuing a room conversation around them is not enough\n\noutput:\nJSON object only. No prose, markdown, XML, or hidden reasoning.\n\nExample:\n{\"messageHandler\":{\"action\":\"RESPOND\",\"contexts\":[\"wallet\"],\"thought\":\"Direct mention and clear follow-up needs wallet context.\",\"reply\":\"\"}}\n\nExample:\n{\"messageHandler\":{\"action\":\"IGNORE\",\"contexts\":[],\"thought\":\"The latest message is not addressed to {{agentName}}.\",\"reply\":\"\"}}`;\n\n// ==================== Types ====================\n\nexport interface TrainingSample {\n /** Unique sample ID */\n id: string;\n /** Source blueprint ID */\n blueprintId: string;\n /** The randomized agent name used in this sample */\n agentName: string;\n /** The conversation messages (multi-turn) */\n messages: ConversationMessage[];\n /** Expected messageHandler routing output */\n expectedOutput: RoutingOutput;\n /** Metadata for filtering/analysis */\n metadata: SampleMetadata;\n}\n\nexport interface ConversationMessage {\n role: \"user\" | \"assistant\" | \"system\";\n /** Speaker name (for group chat context) */\n name?: string;\n content: string;\n}\n\nexport interface RoutingOutput {\n decision: \"RESPOND\" | \"IGNORE\" | \"STOP\";\n primaryContext: AgentContext;\n secondaryContexts: AgentContext[];\n reasoning: string;\n expectedAction?: string;\n}\n\nexport interface MessageHandlerTrainingOutput {\n messageHandler: {\n action: RoutingOutput[\"decision\"];\n simple: boolean;\n contexts: AgentContext[];\n thought: string;\n reply: string;\n };\n}\n\nexport interface SampleMetadata {\n platform: string;\n pattern: string;\n turnCount: number;\n generatedBy: string;\n generatedAt: string;\n variant: number;\n totalVariants: number;\n}\n\nexport type ElizaNativeTrainingExample = ElizaNativeTrajectoryRow;\n\n// ==================== Name pools ====================\n\nconst AGENT_NAMES = [\n \"Nova\",\n \"Kai\",\n \"Echo\",\n \"Luna\",\n \"Atlas\",\n \"Vex\",\n \"Iris\",\n \"Cypher\",\n \"Sage\",\n \"Bolt\",\n \"Pixel\",\n \"Nyx\",\n \"Orion\",\n \"Zephyr\",\n \"Flux\",\n \"Aria\",\n \"Cosmo\",\n \"Dash\",\n \"Ember\",\n \"Ghost\",\n \"Helix\",\n \"Jade\",\n \"Karma\",\n \"Lux\",\n \"Muse\",\n \"Neo\",\n \"Onyx\",\n \"Proto\",\n \"Qubit\",\n \"Rune\",\n \"Spark\",\n \"Titan\",\n \"Uno\",\n \"Volt\",\n \"Wren\",\n \"Xeno\",\n \"Yara\",\n \"Zen\",\n \"Chip\",\n \"Delta\",\n \"Ava\",\n \"Rex\",\n \"Sky\",\n \"Zara\",\n];\n\nconst PARTICIPANT_NAMES = [\n \"Alice\",\n \"Bob\",\n \"Charlie\",\n \"Dave\",\n \"Eve\",\n \"Frank\",\n \"Grace\",\n \"Hank\",\n \"Ivy\",\n \"Jack\",\n \"Karen\",\n \"Leo\",\n \"Mia\",\n \"Nick\",\n \"Olivia\",\n \"Pete\",\n \"Quinn\",\n \"Rose\",\n \"Sam\",\n \"Tina\",\n \"Uma\",\n \"Vince\",\n \"Wendy\",\n \"Xavier\",\n \"Yuki\",\n \"Zack\",\n \"Maya\",\n \"Raj\",\n \"Sofia\",\n \"Tyler\",\n \"Aisha\",\n \"Ben\",\n \"Chloe\",\n \"Dan\",\n \"Elena\",\n \"Finn\",\n \"Gabe\",\n \"Hannah\",\n \"Isaac\",\n \"Jade\",\n];\n\nconst OTHER_BOT_NAMES = [\n \"AssistBot\",\n \"Helper\",\n \"Cortana\",\n \"Alexa\",\n \"Siri\",\n \"Bard\",\n \"CoPilot\",\n \"Genie\",\n \"Oracle\",\n \"Alfred\",\n \"Jarvis\",\n \"Friday\",\n];\n\nconst PLATFORMS = [\"telegram\", \"discord\", \"slack\", \"matrix\", \"irc\"];\n\n// ==================== Teacher model interface ====================\n\nexport interface TeacherModel {\n name: string;\n generate(systemPrompt: string, userPrompt: string): Promise<string>;\n}\n\nconst recordLlmCall =\n \"recordLlmCall\" in ElizaCore && typeof ElizaCore.recordLlmCall === \"function\"\n ? ElizaCore.recordLlmCall\n : async <T>(\n _runtime: IAgentRuntime | undefined,\n _details: RecordLlmCallDetails,\n callback: () => Promise<T> | T,\n ): Promise<T> => await callback();\n\nconst withStandaloneTrajectory =\n \"withStandaloneTrajectory\" in ElizaCore &&\n typeof ElizaCore.withStandaloneTrajectory === \"function\"\n ? ElizaCore.withStandaloneTrajectory\n : async <T>(\n _runtime: IAgentRuntime | undefined,\n _options: Record<string, unknown>,\n callback: () => Promise<T>,\n ): Promise<T> => await callback();\n\n/**\n * Create a teacher model using the Anthropic API.\n */\nexport function createAnthropicTeacher(\n apiKey: string,\n runtime?: IAgentRuntime,\n): TeacherModel {\n return {\n name: \"anthropic/claude-sonnet-4.6\",\n async generate(systemPrompt: string, userPrompt: string): Promise<string> {\n return await withStandaloneTrajectory(\n runtime,\n {\n source: \"training\",\n metadata: {\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n purpose: \"teacher\",\n },\n },\n async () => {\n const details: RecordLlmCallDetails = {\n model: \"anthropic/claude-sonnet-4.6\",\n modelVersion: \"claude-sonnet-4-6\",\n systemPrompt,\n userPrompt,\n temperature: 1,\n maxTokens: 4096,\n purpose: \"training.teacher\",\n actionType: \"training.teacher.anthropic.generate\",\n };\n return await recordLlmCall(runtime, details, async () => {\n const response = await fetch(\n \"https://api.anthropic.com/v1/messages\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: \"claude-sonnet-4-6\",\n max_tokens: 4096,\n temperature: 1,\n system: systemPrompt,\n messages: [{ role: \"user\", content: userPrompt }],\n }),\n },\n );\n if (!response.ok) {\n throw new Error(\n `Anthropic API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as {\n content: Array<{ type: string; text: string }>;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n };\n details.promptTokens = data.usage?.input_tokens;\n details.completionTokens = data.usage?.output_tokens;\n return data.content[0]?.text ?? \"\";\n });\n },\n );\n },\n };\n}\n\n/**\n * Create a teacher model using the OpenAI API.\n */\nexport function createOpenAITeacher(\n apiKey: string,\n runtime?: IAgentRuntime,\n): TeacherModel {\n return {\n name: \"openai/gpt-5.4\",\n async generate(systemPrompt: string, userPrompt: string): Promise<string> {\n return await withStandaloneTrajectory(\n runtime,\n {\n source: \"training\",\n metadata: {\n provider: \"openai\",\n model: \"gpt-5.4\",\n purpose: \"teacher\",\n },\n },\n async () => {\n const details: RecordLlmCallDetails = {\n model: \"openai/gpt-5.4\",\n modelVersion: \"gpt-5.4\",\n systemPrompt,\n userPrompt,\n temperature: 0.9,\n maxTokens: 4096,\n purpose: \"training.teacher\",\n actionType: \"training.teacher.openai.generate\",\n };\n return await recordLlmCall(runtime, details, async () => {\n const response = await fetch(\n \"https://api.openai.com/v1/chat/completions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: \"gpt-5.4\",\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n max_tokens: 4096,\n temperature: 0.9,\n }),\n },\n );\n if (!response.ok) {\n throw new Error(\n `OpenAI API error: ${response.status} ${await response.text()}`,\n );\n }\n const data = (await response.json()) as {\n model?: string;\n choices: Array<{ message: { content: string } }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n };\n details.modelVersion = data.model;\n details.promptTokens = data.usage?.prompt_tokens;\n details.completionTokens = data.usage?.completion_tokens;\n return data.choices[0]?.message?.content ?? \"\";\n });\n },\n );\n },\n };\n}\n\n/**\n * Create a teacher model that talks to Cerebras (gpt-oss-120b by default).\n *\n * This is the standing default for lifeops training: the teacher generates\n * synthetic conversations, not the agent's responses. The agent under test\n * still runs on Anthropic Opus 4.7. We never use the agent's provider to\n * generate training data for itself.\n */\nexport function createCerebrasTeacher(runtime?: IAgentRuntime): TeacherModel {\n const model =\n process.env.TRAIN_MODEL?.trim() ??\n process.env.CEREBRAS_MODEL?.trim() ??\n \"gpt-oss-120b\";\n return {\n name: `cerebras/${model}`,\n async generate(systemPrompt: string, userPrompt: string): Promise<string> {\n return await withStandaloneTrajectory(\n runtime,\n {\n source: \"training\",\n metadata: { provider: \"cerebras\", model, purpose: \"teacher\" },\n },\n async () => {\n const details: RecordLlmCallDetails = {\n model: `cerebras/${model}`,\n modelVersion: model,\n systemPrompt,\n userPrompt,\n temperature: 0.9,\n maxTokens: 4096,\n purpose: \"training.teacher\",\n actionType: \"training.teacher.cerebras.generate\",\n };\n return await recordLlmCall(runtime, details, async () => {\n const { getTrainingModelClient } = await import(\n \"./cerebras-eval-model.js\"\n );\n const client = getTrainingModelClient();\n const result = await client({\n prompt: userPrompt,\n systemPrompt,\n temperature: 0.9,\n maxTokens: 4096,\n });\n details.promptTokens = result.usage?.promptTokens;\n details.completionTokens = result.usage?.completionTokens;\n return result.text;\n });\n },\n );\n },\n };\n}\n\n// ==================== Randomization utilities ====================\n\nfunction pickRandom<T>(arr: T[]): T {\n const value = arr[Math.floor(Math.random() * arr.length)];\n if (value === undefined) {\n throw new Error(\"Cannot pick a random value from an empty array\");\n }\n return value;\n}\n\nfunction pickN<T>(arr: T[], n: number): T[] {\n const shuffled = [...arr].sort(() => Math.random() - 0.5);\n return shuffled.slice(0, n);\n}\n\nfunction randomAgentName(exclude: string[] = []): string {\n const available = AGENT_NAMES.filter(\n (n) => !exclude.map((e) => e.toLowerCase()).includes(n.toLowerCase()),\n );\n return pickRandom(available.length > 0 ? available : AGENT_NAMES);\n}\n\nfunction randomParticipants(count: number, exclude: string[] = []): string[] {\n const available = PARTICIPANT_NAMES.filter(\n (n) => !exclude.map((e) => e.toLowerCase()).includes(n.toLowerCase()),\n );\n return pickN(available, count);\n}\n\n// ==================== Prompt construction ====================\n\nfunction buildTeacherSystemPrompt(): string {\n return `Generate synthetic multi-turn group chat conversations for training an AI agent's v5 messageHandler router.\nYour task is to generate realistic multi-turn group chat conversations.\n\nIMPORTANT RULES:\n1. Output ONLY a JSON object. No markdown, no explanation, no preamble.\n2. Each message must have \"name\" (speaker name) and \"content\" (message text).\n3. Messages should feel natural - casual, varied length, sometimes with typos.\n4. Group chats should have 3-6 participants plus optionally the agent.\n5. The agent's messages (when present) should be clearly from an AI assistant.\n6. NEVER include the expected messageHandler routing output in the conversation itself.\n7. Messages should be diverse in tone: some short, some long, some with emoji.\n\nOutput format:\n{\"messages\":[{\"name\":\"Alice\",\"content\":\"hey everyone\"},{\"name\":\"Bob\",\"content\":\"what's up\"}]}`;\n}\n\nfunction buildTeacherUserPrompt(\n blueprint: ScenarioBlueprint,\n agentName: string,\n participants: string[],\n platform: string,\n otherBotName?: string,\n variant: number = 0,\n): string {\n const turnRange = `${blueprint.minContextTurns}-${blueprint.maxContextTurns}`;\n const participantList = participants.join(\", \");\n\n let extraInstructions = \"\";\n\n if (blueprint.pattern === \"group_wrong_agent\" && otherBotName) {\n extraInstructions = `There is ANOTHER bot named \"${otherBotName}\" in the chat. Someone addresses \"${otherBotName}\" (not \"${agentName}\"). \"${agentName}\" should NOT be addressed.`;\n }\n\n if (blueprint.pattern === \"group_about_agent\") {\n extraInstructions = `People talk ABOUT \"${agentName}\" in third person (\"the bot\", \"it\", \"${agentName} can do X\") but NEVER address it directly. No \"@${agentName}\" or \"${agentName}, can you...\".`;\n }\n\n if (blueprint.pattern === \"group_noise\") {\n extraInstructions = `\"${agentName}\" should NOT appear in any message at all. This is pure human conversation.`;\n }\n\n if (blueprint.pattern === \"group_action_emergence\") {\n extraInstructions = `The intent to perform an action should emerge GRADUALLY over multiple messages. Users discuss the topic, one user's intent builds up, and finally they ask the agent to execute. The last 1-2 messages should clearly direct the agent.`;\n }\n\n if (blueprint.pattern === \"group_multi_turn_intent\") {\n extraInstructions = `The action intent should build across 3+ messages from the same user. They start by observing/discussing, then express desire, then finally ask the agent to act.`;\n }\n\n const keywordsHint =\n blueprint.groundingKeywords.length > 0\n ? `Try to naturally include some of these words/phrases: ${blueprint.groundingKeywords.join(\", \")}`\n : \"\";\n\n return `Generate variant #${variant + 1} of a ${platform} group chat conversation.\n\nSCENARIO: ${blueprint.description}\nAGENT NAME: ${agentName}\nPARTICIPANTS: ${participantList}\nPLATFORM: ${platform}\nTARGET TURNS: ${turnRange} messages\nCONVERSATION PATTERN: ${blueprint.pattern}\n${keywordsHint}\n${extraInstructions}\n\n${blueprint.generationHint}\n\nRemember:\n- Output ONLY a JSON object with a messages array\n- Each message has \"name\" and \"content\"\n- Make it feel natural and realistic\n- Vary message lengths and tones\n- The last message should be the one the messageHandler router evaluates`;\n}\n\nfunction stripOutputFences(raw: string): string {\n return raw\n .replace(/^```[a-z0-9_-]*\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\")\n .trim();\n}\n\nfunction parseTeacherJsonMessages(raw: string): {\n messages: Array<{ name: string; content: string }>;\n} {\n const cleaned = stripOutputFences(raw);\n const parsed = JSON.parse(cleaned) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Teacher output must be a JSON object\");\n }\n const messages = (parsed as Record<string, unknown>).messages;\n if (!Array.isArray(messages)) {\n throw new Error(\"Teacher JSON output must include a messages array\");\n }\n const parsedMessages = messages\n .filter(\n (message): message is Record<string, unknown> =>\n Boolean(message) &&\n typeof message === \"object\" &&\n !Array.isArray(message),\n )\n .map((message) => ({\n name: String(message.name ?? \"\").trim(),\n content: String(message.content ?? \"\").trim(),\n }))\n .filter((message) => message.name.length > 0 && message.content.length > 0);\n if (parsedMessages.length === 0) {\n throw new Error(\"Teacher JSON output did not include valid messages\");\n }\n return {\n messages: parsedMessages,\n };\n}\n\nfunction parseTeacherLegacyMessages(raw: string): {\n messages: Array<{ name: string; content: string }>;\n} {\n const text = stripOutputFences(raw);\n const lines = text.split(/\\r?\\n/);\n const messages: Array<{ name: string; content: string }> = [];\n let current: { name?: string; content?: string } | null = null;\n\n const flush = () => {\n if (current?.name && current.content !== undefined) {\n messages.push({\n name: current.name.trim(),\n content: current.content.trim(),\n });\n }\n current = null;\n };\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || /^messages(?::|\\[)/i.test(trimmed)) continue;\n\n const rowMatch = trimmed.match(/^-\\s*([^|:]+?)\\s*\\|\\s*(.*)$/);\n if (rowMatch) {\n flush();\n messages.push({\n name: (rowMatch[1] ?? \"\").trim(),\n content: (rowMatch[2] ?? \"\").trim(),\n });\n continue;\n }\n\n const itemNameMatch = trimmed.match(/^-\\s*name:\\s*(.*)$/i);\n if (itemNameMatch) {\n flush();\n current = { name: (itemNameMatch[1] ?? \"\").trim() };\n continue;\n }\n\n const nameMatch = trimmed.match(/^name:\\s*(.*)$/i);\n if (nameMatch) {\n current ??= {};\n current.name = (nameMatch[1] ?? \"\").trim();\n continue;\n }\n\n const contentMatch = trimmed.match(/^content:\\s*(.*)$/i);\n if (contentMatch) {\n current ??= {};\n current.content = (contentMatch[1] ?? \"\").trim();\n }\n }\n\n flush();\n\n if (messages.length === 0) {\n throw new Error(\"No teacher messages found in legacy output\");\n }\n\n return { messages };\n}\n\n// ==================== Core generation ====================\n\n/**\n * Generate a single training sample from a blueprint.\n */\nexport async function generateSample(\n blueprint: ScenarioBlueprint,\n teacher: TeacherModel,\n variant: number,\n totalVariants: number,\n): Promise<TrainingSample> {\n const agentName = randomAgentName();\n const participantCount = 3 + Math.floor(Math.random() * 3); // 3-5\n const participants = randomParticipants(participantCount, [agentName]);\n const platform = pickRandom(PLATFORMS);\n const otherBotName =\n blueprint.pattern === \"group_wrong_agent\"\n ? pickRandom(OTHER_BOT_NAMES)\n : undefined;\n\n const systemPrompt = buildTeacherSystemPrompt();\n const userPrompt = buildTeacherUserPrompt(\n blueprint,\n agentName,\n participants,\n platform,\n otherBotName,\n variant,\n );\n\n const raw = await teacher.generate(systemPrompt, userPrompt);\n\n // Parse the teacher's output\n let parsed: { messages: Array<{ name: string; content: string }> };\n try {\n parsed = parseTeacherJsonMessages(raw);\n } catch {\n try {\n parsed = parseTeacherLegacyMessages(raw);\n } catch {\n // If parsing fails, create a minimal sample\n const [firstParticipant = \"Alice\", secondParticipant = \"Bob\"] =\n participants;\n parsed = {\n messages: [\n { name: firstParticipant, content: \"Hey everyone\" },\n {\n name: secondParticipant,\n content:\n blueprint.decision === \"RESPOND\"\n ? `${agentName}, can you help?`\n : \"What's for lunch?\",\n },\n ],\n };\n }\n }\n\n // Convert to training format\n const messages: ConversationMessage[] = parsed.messages.map((m) => ({\n role:\n m.name.trim().toLowerCase() === agentName.trim().toLowerCase()\n ? (\"assistant\" as const)\n : (\"user\" as const),\n name: m.name,\n content: m.content,\n }));\n\n const expectedOutput: RoutingOutput = {\n decision: blueprint.decision,\n primaryContext: blueprint.primaryContext,\n secondaryContexts: blueprint.secondaryContexts ?? [],\n reasoning: blueprint.description,\n expectedAction: blueprint.expectedAction,\n };\n\n return {\n id: randomUUID(),\n blueprintId: blueprint.id,\n agentName,\n messages,\n expectedOutput,\n metadata: {\n platform,\n pattern: blueprint.pattern,\n turnCount: messages.length,\n generatedBy: teacher.name,\n generatedAt: new Date().toISOString(),\n variant,\n totalVariants,\n },\n };\n}\n\n// ==================== Batch generation ====================\n\nexport interface GenerationConfig {\n /** Number of variants per blueprint */\n variantsPerBlueprint: number;\n /** Teacher model to use */\n teacher: TeacherModel;\n /** Output directory */\n outputDir: string;\n /** Optional filter: only generate for these contexts */\n filterContexts?: AgentContext[];\n /** Optional filter: only generate for these decisions */\n filterDecisions?: Array<\"RESPOND\" | \"IGNORE\" | \"STOP\">;\n /** Optional hard cap on the number of canonical blueprints to expand */\n limitBlueprints?: number;\n /** Concurrency limit for teacher API calls */\n concurrency?: number;\n /** Progress callback */\n onProgress?: (\n completed: number,\n total: number,\n sample: TrainingSample,\n ) => void;\n}\n\n/**\n * Generate the full synthetic dataset.\n */\nexport async function generateDataset(\n config: GenerationConfig,\n): Promise<TrainingSample[]> {\n let blueprints = ALL_BLUEPRINTS;\n\n if (config.filterContexts) {\n const ctxSet = new Set(config.filterContexts);\n blueprints = blueprints.filter(\n (b) =>\n ctxSet.has(b.primaryContext) ||\n b.secondaryContexts?.some((c) => ctxSet.has(c)),\n );\n }\n\n if (config.filterDecisions) {\n const decSet = new Set(config.filterDecisions);\n blueprints = blueprints.filter((b) => decSet.has(b.decision));\n }\n\n if (config.limitBlueprints && config.limitBlueprints > 0) {\n blueprints = blueprints.slice(0, config.limitBlueprints);\n }\n\n const totalSamples = blueprints.length * config.variantsPerBlueprint;\n const samples: TrainingSample[] = [];\n let completed = 0;\n\n const concurrency = config.concurrency ?? 5;\n\n // Process in batches to respect concurrency\n const tasks: Array<() => Promise<TrainingSample>> = [];\n for (const blueprint of blueprints) {\n for (let v = 0; v < config.variantsPerBlueprint; v++) {\n tasks.push(() =>\n generateSample(\n blueprint,\n config.teacher,\n v,\n config.variantsPerBlueprint,\n ),\n );\n }\n }\n\n // Execute with concurrency limit\n for (let i = 0; i < tasks.length; i += concurrency) {\n const batch = tasks.slice(i, i + concurrency);\n const results = await Promise.allSettled(batch.map((fn) => fn()));\n\n for (const result of results) {\n completed++;\n if (result.status === \"fulfilled\") {\n samples.push(result.value);\n config.onProgress?.(completed, totalSamples, result.value);\n } else {\n console.error(`Failed to generate sample: ${result.reason}`);\n }\n }\n }\n\n return samples;\n}\n\n// ==================== Export formats ====================\n\n/**\n * Convert a training sample to the canonical Eliza native model-boundary format.\n * The system message contains the shouldRespond prompt template,\n * the user message contains the conversation, and response.text contains the\n * expected native JSON output.\n */\nexport function toElizaNativeFormat(\n sample: TrainingSample,\n includeContextRouting: boolean = true,\n): ElizaNativeTrainingExample {\n const systemContent = buildShouldRespondSystemPrompt(\n sample,\n includeContextRouting,\n );\n const userContent = buildShouldRespondUserPrompt(sample);\n const responseText = buildMessageHandlerJsonResponse(\n sample,\n includeContextRouting,\n );\n\n return {\n format: ELIZA_NATIVE_TRAJECTORY_FORMAT,\n schemaVersion: 1,\n boundary: \"vercel_ai_sdk.generateText\",\n trajectoryId: sample.id,\n agentId: sample.agentName,\n source: \"app-training\",\n status: \"completed\",\n stepId: `${sample.id}:message-handler`,\n callId: `${sample.id}:message-handler:call-1`,\n stepIndex: 0,\n callIndex: 0,\n timestamp: Date.parse(sample.metadata.generatedAt) || Date.now(),\n purpose: \"should_respond\",\n actionType: \"app-training.synthetic.message_handler\",\n stepType: includeContextRouting ? \"context_routing\" : \"should_respond\",\n tags: [\"synthetic\", \"message_handler\"],\n model: \"teacher\",\n request: {\n messages: [\n { role: \"system\", content: systemContent },\n { role: \"user\", content: userContent },\n ],\n },\n response: {\n text: responseText,\n },\n metadata: {\n task_type: includeContextRouting ? \"context_routing\" : \"should_respond\",\n source_dataset: \"app_training_synthetic\",\n trajectory_id: sample.id,\n step_id: `${sample.id}:message-handler`,\n call_id: `${sample.id}:message-handler:call-1`,\n agent_id: sample.agentName,\n blueprint_id: sample.blueprintId,\n platform: sample.metadata.platform,\n pattern: sample.metadata.pattern,\n },\n trajectoryTotals: {\n stepCount: 1,\n llmCallCount: 1,\n providerAccessCount: 0,\n promptTokens: 0,\n completionTokens: 0,\n cacheReadInputTokens: 0,\n cacheCreationInputTokens: 0,\n },\n cacheStats: {\n totalInputTokens: 0,\n promptTokens: 0,\n completionTokens: 0,\n cacheReadInputTokens: 0,\n cacheCreationInputTokens: 0,\n cachedCallCount: 0,\n cacheReadCallCount: 0,\n cacheWriteCallCount: 0,\n tokenUsageEstimatedCallCount: 0,\n },\n };\n}\n\nfunction renderTemplate(\n template: string,\n values: Record<string, string>,\n): string {\n return template.replace(/{{(\\w+)}}/g, (_match, key) => values[key] ?? \"\");\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.filter((value) => value.trim().length > 0))];\n}\n\nfunction listContextsForSample(sample: TrainingSample): AgentContext[] {\n const contexts = new Set<AgentContext>([\n \"general\",\n sample.expectedOutput.primaryContext,\n ...sample.expectedOutput.secondaryContexts,\n ]);\n\n if (sample.expectedOutput.expectedAction) {\n for (const actionContext of ACTION_CONTEXT_MAP[\n sample.expectedOutput.expectedAction\n ] ?? []) {\n contexts.add(actionContext);\n }\n }\n\n return [...contexts];\n}\n\nfunction listMessageHandlerContextsForSample(\n sample: TrainingSample,\n): AgentContext[] {\n const contexts = new Set<AgentContext>([\n sample.expectedOutput.primaryContext,\n ...sample.expectedOutput.secondaryContexts,\n ]);\n\n if (sample.expectedOutput.expectedAction) {\n for (const actionContext of ACTION_CONTEXT_MAP[\n sample.expectedOutput.expectedAction\n ] ?? []) {\n contexts.add(actionContext);\n }\n }\n\n contexts.delete(\"general\");\n return [...contexts];\n}\n\nfunction getRelevantActions(sample: TrainingSample): string[] {\n const activeContexts = new Set(listContextsForSample(sample));\n const contextualActions = Object.entries(ACTION_CONTEXT_MAP)\n .filter(([, contexts]) =>\n contexts.some((context) => activeContexts.has(context)),\n )\n .map(([actionName]) => actionName);\n\n return uniqueStrings([\n sample.expectedOutput.expectedAction ?? \"\",\n ...contextualActions,\n ]).slice(0, 18);\n}\n\nfunction getRelevantProviders(sample: TrainingSample): string[] {\n const activeContexts = new Set(listContextsForSample(sample));\n return Object.entries(PROVIDER_CONTEXT_MAP)\n .filter(([, contexts]) =>\n contexts.some((context) => activeContexts.has(context)),\n )\n .map(([providerName]) => providerName)\n .slice(0, 12);\n}\n\nfunction buildProvidersBlock(sample: TrainingSample): string {\n const actions = getRelevantActions(sample);\n const providers = getRelevantProviders(sample);\n\n return [\n `platform: ${sample.metadata.platform}`,\n \"actions:\",\n ...(actions.length > 0 ? actions : [\"REPLY\"]).map(\n (action) => `- ${action}`,\n ),\n \"providers:\",\n ...(providers.length > 0 ? providers : [\"recentMessages\"]).map(\n (provider) => `- ${provider}`,\n ),\n ].join(\"\\n\");\n}\n\nfunction buildShouldRespondSystemPrompt(\n sample: TrainingSample,\n includeContextRouting: boolean,\n): string {\n const baseTemplate = includeContextRouting\n ? SHOULD_RESPOND_PROMPT_TEMPLATE\n : SHOULD_RESPOND_PROMPT_TEMPLATE.replace(\n /\\nmessage_handler:[\\s\\S]*?\\ndecision_note:/m,\n \"\\ndecision_note:\",\n ).replace(\n /\\nExample:\\n\\{\"messageHandler\":\\{\"action\":\"RESPOND\"[\\s\\S]*$/m,\n '\\nExample:\\n{\"messageHandler\":{\"action\":\"RESPOND\",\"simple\":true,\"contexts\":[],\"thought\":\"Direct mention can be answered directly.\",\"reply\":\"\"}}',\n );\n\n return renderTemplate(baseTemplate, {\n agentName: sample.agentName,\n providers: buildProvidersBlock(sample),\n availableContexts: listContextsForSample(sample).join(\", \"),\n }).trim();\n}\n\nfunction buildShouldRespondUserPrompt(sample: TrainingSample): string {\n const conversationLines = sample.messages\n .map((message, index) => {\n const turnId = `turn-${String(index + 1).padStart(3, \"0\")}`;\n const speaker =\n message.role === \"assistant\"\n ? sample.agentName\n : (message.name ?? \"user\");\n return `[${turnId}] ${speaker}: ${message.content}`;\n })\n .join(\"\\n\");\n\n return [\n `platform: ${sample.metadata.platform}`,\n `agent_name: ${sample.agentName}`,\n \"conversation:\",\n conversationLines,\n \"decision_target: evaluate the final message in this group-chat window.\",\n ].join(\"\\n\");\n}\n\nfunction buildMessageHandlerJsonResponse(\n sample: TrainingSample,\n includeContextRouting: boolean,\n): string {\n const contexts =\n includeContextRouting && sample.expectedOutput.decision === \"RESPOND\"\n ? listMessageHandlerContextsForSample(sample)\n : [];\n const output: MessageHandlerTrainingOutput = {\n messageHandler: {\n action: sample.expectedOutput.decision,\n simple:\n sample.expectedOutput.decision === \"RESPOND\" && contexts.length === 0,\n contexts,\n thought: sample.expectedOutput.reasoning,\n reply: \"\",\n },\n };\n\n return JSON.stringify(output);\n}\n\nfunction normalizeMessageHandlerJson(response: string): string | null {\n const trimmed = response\n .trim()\n .replace(/^```(?:json)?\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\");\n if (!trimmed.startsWith(\"{\")) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n const record = parsed as Record<string, unknown>;\n const candidate =\n record.messageHandler &&\n typeof record.messageHandler === \"object\" &&\n !Array.isArray(record.messageHandler)\n ? (record.messageHandler as Record<string, unknown>)\n : record;\n const action = candidate.action;\n if (action !== \"RESPOND\" && action !== \"IGNORE\" && action !== \"STOP\") {\n return null;\n }\n const contexts = Array.isArray(candidate.contexts)\n ? candidate.contexts.filter(\n (context): context is AgentContext => typeof context === \"string\",\n )\n : [];\n return JSON.stringify({\n messageHandler: {\n action,\n contexts,\n thought: typeof candidate.thought === \"string\" ? candidate.thought : \"\",\n reply: typeof candidate.reply === \"string\" ? candidate.reply : \"\",\n },\n });\n } catch {\n return null;\n }\n}\n\n/**\n * Export the full dataset to JSONL files for Eliza native model-boundary tuning.\n * Creates separate files for should_respond and context_routing.\n */\nexport async function exportToElizaNativeJSONL(\n samples: TrainingSample[],\n outputDir: string,\n): Promise<{\n shouldRespondPath: string;\n contextRoutingPath: string;\n combinedPath: string;\n}> {\n await mkdir(outputDir, { recursive: true });\n\n // Combined (shouldRespond + context routing)\n const combinedPath = join(outputDir, \"combined_training.eliza-native.jsonl\");\n const combinedLines = samples\n .map((s) => JSON.stringify(toElizaNativeFormat(s, true)))\n .join(\"\\n\");\n await writeFile(combinedPath, `${combinedLines}\\n`);\n\n // shouldRespond only (no context routing — for Flash Lite)\n const shouldRespondPath = join(\n outputDir,\n \"should_respond_training.eliza-native.jsonl\",\n );\n const srLines = samples\n .map((s) => JSON.stringify(toElizaNativeFormat(s, false)))\n .join(\"\\n\");\n await writeFile(shouldRespondPath, `${srLines}\\n`);\n\n // Context routing only (for samples where decision is RESPOND)\n const contextRoutingPath = join(\n outputDir,\n \"context_routing_training.eliza-native.jsonl\",\n );\n const crLines = samples\n .filter((s) => s.expectedOutput.decision === \"RESPOND\")\n .map((s) => JSON.stringify(toElizaNativeFormat(s, true)))\n .join(\"\\n\");\n await writeFile(contextRoutingPath, `${crLines}\\n`);\n\n // Also write the raw samples for analysis\n const rawPath = join(outputDir, \"raw_samples.json\");\n await writeFile(rawPath, JSON.stringify(samples, null, 2));\n\n // Write stats\n const stats = {\n totalSamples: samples.length,\n byDecision: {\n RESPOND: samples.filter((s) => s.expectedOutput.decision === \"RESPOND\")\n .length,\n IGNORE: samples.filter((s) => s.expectedOutput.decision === \"IGNORE\")\n .length,\n STOP: samples.filter((s) => s.expectedOutput.decision === \"STOP\").length,\n },\n byContext: Object.fromEntries(\n ALL_CONTEXTS.map((ctx) => [\n ctx,\n samples.filter((s) => s.expectedOutput.primaryContext === ctx).length,\n ]),\n ),\n byPattern: Object.fromEntries(\n [...new Set(samples.map((s) => s.metadata.pattern))].map((p) => [\n p,\n samples.filter((s) => s.metadata.pattern === p).length,\n ]),\n ),\n uniqueAgentNames: new Set(samples.map((s) => s.agentName)).size,\n avgTurnCount:\n samples.reduce((sum, s) => sum + s.metadata.turnCount, 0) /\n samples.length,\n generatedAt: new Date().toISOString(),\n };\n await writeFile(\n join(outputDir, \"stats.json\"),\n JSON.stringify(stats, null, 2),\n );\n\n return { shouldRespondPath, contextRoutingPath, combinedPath };\n}\n\n/**\n * Export from existing Eliza trajectories to training format.\n * Converts real trajectory data into the same JSONL format.\n */\nexport async function exportTrajectoriesAsTraining(\n trajectories: Trajectory[],\n agentName: string,\n outputPath: string,\n): Promise<number> {\n const examples: ElizaNativeTrainingExample[] = [];\n let skippedNonNativeRows = 0;\n void agentName;\n\n for (const trajectory of trajectories) {\n for (const call of iterateTrajectoryLlmCalls(trajectory)) {\n if (call.purpose === \"should_respond\") {\n const response = normalizeMessageHandlerJson(call.response ?? \"\");\n if (!response) {\n skippedNonNativeRows += 1;\n console.warn(\n `[dataset-generator] skipped non-native should_respond row from trajectory ${trajectory.trajectoryId} call ${call.callId}; expected native messageHandler JSON`,\n );\n continue;\n }\n\n const row = buildElizaNativeTrajectoryRows([trajectory]).find(\n (candidate) => candidate.callId === call.callId,\n );\n if (row) {\n examples.push({\n ...row,\n response: { ...row.response, text: response },\n metadata: {\n ...row.metadata,\n task_type: \"should_respond\",\n source_dataset: \"runtime_trajectory_boundary\",\n },\n });\n }\n }\n }\n }\n\n const content = examples.map((e) => JSON.stringify(e)).join(\"\\n\");\n await writeFile(outputPath, `${content}\\n`);\n\n if (skippedNonNativeRows > 0) {\n console.warn(\n `[dataset-generator] skipped ${skippedNonNativeRows} non-native should_respond rows while exporting ${outputPath}`,\n );\n }\n\n return examples.length;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,18 @@
1
+ export declare const ELIZA_ONE_BENCHMARK_TIERS: readonly ["2b", "4b", "9b", "27b"];
2
+ export type ElizaOneBenchmarkTier = (typeof ELIZA_ONE_BENCHMARK_TIERS)[number];
3
+ export type ElizaOneBenchmarkVariant = "base" | "trained";
4
+ export declare const ELIZA_ONE_BENCHMARK_TIER_LIST: string;
5
+ export declare function normalizeElizaOneBenchmarkTier(value: string | null | undefined): string | undefined;
6
+ export declare function canonicalElizaOneTierSort(left: string | null | undefined, right: string | null | undefined): number;
7
+ export declare function parseElizaOneBenchmarkTiers(value: string | undefined, fallback?: readonly string[]): string[];
8
+ export declare function elizaOneBenchmarkModelId(tier: string | undefined, variant: ElizaOneBenchmarkVariant): string | undefined;
9
+ export declare function elizaOneActionBenchmarkPairs(tiers?: readonly string[]): Array<{
10
+ tier: string;
11
+ base: {
12
+ variant: "base";
13
+ };
14
+ trained: {
15
+ variant: "trained";
16
+ };
17
+ }>;
18
+ //# sourceMappingURL=eliza1-benchmark-recipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eliza1-benchmark-recipe.d.ts","sourceRoot":"","sources":["../../src/core/eliza1-benchmark-recipe.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,oCAK5B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC/E,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D,eAAO,MAAM,6BAA6B,QACL,CAAC;AAEtC,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,GAAG,SAAS,CASpB;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,CAeR;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,GAAE,SAAS,MAAM,EAAW,GACnC,MAAM,EAAE,CAWV;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,wBAAwB,GAChC,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,GAAE,SAAS,MAAM,EAA8B,GACnD,KAAK,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,OAAO,EAAE;QAAE,OAAO,EAAE,SAAS,CAAA;KAAE,CAAC;CACjC,CAAC,CAMD"}
@@ -0,0 +1,64 @@
1
+ const ELIZA_ONE_BENCHMARK_TIERS = [
2
+ "2b",
3
+ "4b",
4
+ "9b",
5
+ "27b"
6
+ ];
7
+ const ELIZA_ONE_BENCHMARK_TIER_LIST = ELIZA_ONE_BENCHMARK_TIERS.join(",");
8
+ function normalizeElizaOneBenchmarkTier(value) {
9
+ const raw = value?.trim();
10
+ if (!raw) return void 0;
11
+ const normalized = raw.toLowerCase();
12
+ if (normalized.includes("27b")) return "27b";
13
+ if (normalized.includes("9b")) return "9b";
14
+ if (normalized.includes("4b")) return "4b";
15
+ if (normalized.includes("2b")) return "2b";
16
+ return raw;
17
+ }
18
+ function canonicalElizaOneTierSort(left, right) {
19
+ const leftValue = normalizeElizaOneBenchmarkTier(left) ?? "";
20
+ const rightValue = normalizeElizaOneBenchmarkTier(right) ?? "";
21
+ const leftIndex = ELIZA_ONE_BENCHMARK_TIERS.indexOf(
22
+ leftValue
23
+ );
24
+ const rightIndex = ELIZA_ONE_BENCHMARK_TIERS.indexOf(
25
+ rightValue
26
+ );
27
+ if (leftIndex !== -1 || rightIndex !== -1) {
28
+ if (leftIndex === -1) return 1;
29
+ if (rightIndex === -1) return -1;
30
+ return leftIndex - rightIndex;
31
+ }
32
+ return leftValue.localeCompare(rightValue);
33
+ }
34
+ function parseElizaOneBenchmarkTiers(value, fallback = ["2b"]) {
35
+ const raw = value?.trim();
36
+ const tiers = (raw ? raw.split(/\r?\n|,/) : [...fallback]).map((tier) => tier.trim()).filter(Boolean);
37
+ if (tiers.some((tier) => tier.toLowerCase() === "all")) {
38
+ return [...ELIZA_ONE_BENCHMARK_TIERS];
39
+ }
40
+ return Array.from(
41
+ new Set(tiers.map((tier) => normalizeElizaOneBenchmarkTier(tier) ?? tier))
42
+ );
43
+ }
44
+ function elizaOneBenchmarkModelId(tier, variant) {
45
+ const normalizedTier = normalizeElizaOneBenchmarkTier(tier);
46
+ return normalizedTier ? `eliza-1-${normalizedTier}-${variant}` : void 0;
47
+ }
48
+ function elizaOneActionBenchmarkPairs(tiers = ELIZA_ONE_BENCHMARK_TIERS) {
49
+ return tiers.map((tier) => ({
50
+ tier,
51
+ base: { variant: "base" },
52
+ trained: { variant: "trained" }
53
+ }));
54
+ }
55
+ export {
56
+ ELIZA_ONE_BENCHMARK_TIERS,
57
+ ELIZA_ONE_BENCHMARK_TIER_LIST,
58
+ canonicalElizaOneTierSort,
59
+ elizaOneActionBenchmarkPairs,
60
+ elizaOneBenchmarkModelId,
61
+ normalizeElizaOneBenchmarkTier,
62
+ parseElizaOneBenchmarkTiers
63
+ };
64
+ //# sourceMappingURL=eliza1-benchmark-recipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/eliza1-benchmark-recipe.ts"],"sourcesContent":["export const ELIZA_ONE_BENCHMARK_TIERS = [\n \"2b\",\n \"4b\",\n \"9b\",\n \"27b\",\n] as const;\n\nexport type ElizaOneBenchmarkTier = (typeof ELIZA_ONE_BENCHMARK_TIERS)[number];\nexport type ElizaOneBenchmarkVariant = \"base\" | \"trained\";\n\nexport const ELIZA_ONE_BENCHMARK_TIER_LIST =\n ELIZA_ONE_BENCHMARK_TIERS.join(\",\");\n\nexport function normalizeElizaOneBenchmarkTier(\n value: string | null | undefined,\n): string | undefined {\n const raw = value?.trim();\n if (!raw) return undefined;\n const normalized = raw.toLowerCase();\n if (normalized.includes(\"27b\")) return \"27b\";\n if (normalized.includes(\"9b\")) return \"9b\";\n if (normalized.includes(\"4b\")) return \"4b\";\n if (normalized.includes(\"2b\")) return \"2b\";\n return raw;\n}\n\nexport function canonicalElizaOneTierSort(\n left: string | null | undefined,\n right: string | null | undefined,\n): number {\n const leftValue = normalizeElizaOneBenchmarkTier(left) ?? \"\";\n const rightValue = normalizeElizaOneBenchmarkTier(right) ?? \"\";\n const leftIndex = ELIZA_ONE_BENCHMARK_TIERS.indexOf(\n leftValue as ElizaOneBenchmarkTier,\n );\n const rightIndex = ELIZA_ONE_BENCHMARK_TIERS.indexOf(\n rightValue as ElizaOneBenchmarkTier,\n );\n if (leftIndex !== -1 || rightIndex !== -1) {\n if (leftIndex === -1) return 1;\n if (rightIndex === -1) return -1;\n return leftIndex - rightIndex;\n }\n return leftValue.localeCompare(rightValue);\n}\n\nexport function parseElizaOneBenchmarkTiers(\n value: string | undefined,\n fallback: readonly string[] = [\"2b\"],\n): string[] {\n const raw = value?.trim();\n const tiers = (raw ? raw.split(/\\r?\\n|,/) : [...fallback])\n .map((tier) => tier.trim())\n .filter(Boolean);\n if (tiers.some((tier) => tier.toLowerCase() === \"all\")) {\n return [...ELIZA_ONE_BENCHMARK_TIERS];\n }\n return Array.from(\n new Set(tiers.map((tier) => normalizeElizaOneBenchmarkTier(tier) ?? tier)),\n );\n}\n\nexport function elizaOneBenchmarkModelId(\n tier: string | undefined,\n variant: ElizaOneBenchmarkVariant,\n): string | undefined {\n const normalizedTier = normalizeElizaOneBenchmarkTier(tier);\n return normalizedTier ? `eliza-1-${normalizedTier}-${variant}` : undefined;\n}\n\nexport function elizaOneActionBenchmarkPairs(\n tiers: readonly string[] = ELIZA_ONE_BENCHMARK_TIERS,\n): Array<{\n tier: string;\n base: { variant: \"base\" };\n trained: { variant: \"trained\" };\n}> {\n return tiers.map((tier) => ({\n tier,\n base: { variant: \"base\" },\n trained: { variant: \"trained\" },\n }));\n}\n"],"mappings":"AAAO,MAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,MAAM,gCACX,0BAA0B,KAAK,GAAG;AAE7B,SAAS,+BACd,OACoB;AACpB,QAAM,MAAM,OAAO,KAAK;AACxB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,aAAa,IAAI,YAAY;AACnC,MAAI,WAAW,SAAS,KAAK,EAAG,QAAO;AACvC,MAAI,WAAW,SAAS,IAAI,EAAG,QAAO;AACtC,MAAI,WAAW,SAAS,IAAI,EAAG,QAAO;AACtC,MAAI,WAAW,SAAS,IAAI,EAAG,QAAO;AACtC,SAAO;AACT;AAEO,SAAS,0BACd,MACA,OACQ;AACR,QAAM,YAAY,+BAA+B,IAAI,KAAK;AAC1D,QAAM,aAAa,+BAA+B,KAAK,KAAK;AAC5D,QAAM,YAAY,0BAA0B;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,aAAa,0BAA0B;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,cAAc,MAAM,eAAe,IAAI;AACzC,QAAI,cAAc,GAAI,QAAO;AAC7B,QAAI,eAAe,GAAI,QAAO;AAC9B,WAAO,YAAY;AAAA,EACrB;AACA,SAAO,UAAU,cAAc,UAAU;AAC3C;AAEO,SAAS,4BACd,OACA,WAA8B,CAAC,IAAI,GACzB;AACV,QAAM,MAAM,OAAO,KAAK;AACxB,QAAM,SAAS,MAAM,IAAI,MAAM,SAAS,IAAI,CAAC,GAAG,QAAQ,GACrD,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACjB,MAAI,MAAM,KAAK,CAAC,SAAS,KAAK,YAAY,MAAM,KAAK,GAAG;AACtD,WAAO,CAAC,GAAG,yBAAyB;AAAA,EACtC;AACA,SAAO,MAAM;AAAA,IACX,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,+BAA+B,IAAI,KAAK,IAAI,CAAC;AAAA,EAC3E;AACF;AAEO,SAAS,yBACd,MACA,SACoB;AACpB,QAAM,iBAAiB,+BAA+B,IAAI;AAC1D,SAAO,iBAAiB,WAAW,cAAc,IAAI,OAAO,KAAK;AACnE;AAEO,SAAS,6BACd,QAA2B,2BAK1B;AACD,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B;AAAA,IACA,MAAM,EAAE,SAAS,OAAO;AAAA,IACxB,SAAS,EAAE,SAAS,UAAU;AAAA,EAChC,EAAE;AACJ;","names":[]}
@@ -0,0 +1,57 @@
1
+ export declare const ELIZA1_BUNDLE_STAGE_SCHEMA = "eliza1_bundle_stage";
2
+ export declare const ELIZA1_BUNDLE_STAGE_VERSION = 1;
3
+ export interface StageEliza1BundleOptions {
4
+ trainingRoot?: string;
5
+ python?: string;
6
+ repoId?: string;
7
+ tier?: string;
8
+ localDir?: string;
9
+ outputDir?: string;
10
+ maxBytes?: number;
11
+ apply?: boolean;
12
+ }
13
+ export interface Eliza1BundleStageManifest {
14
+ schema: typeof ELIZA1_BUNDLE_STAGE_SCHEMA;
15
+ schemaVersion: typeof ELIZA1_BUNDLE_STAGE_VERSION;
16
+ generatedAt: string;
17
+ trainingRoot: string;
18
+ outputDir: string;
19
+ manifestPath: string;
20
+ command: string[];
21
+ exitCode: number;
22
+ repoId: string | null;
23
+ tier: string | null;
24
+ bundleDir: string | null;
25
+ fileCount: number | null;
26
+ plannedBytes: number | null;
27
+ maxBytes: number | null;
28
+ apply: boolean;
29
+ stagedCount: number;
30
+ plan: Record<string, unknown> | null;
31
+ }
32
+ export interface StageEliza1BundleResult {
33
+ trainingRoot: string;
34
+ outputDir: string;
35
+ manifestPath: string;
36
+ manifest: Eliza1BundleStageManifest;
37
+ command: string[];
38
+ stdout: string;
39
+ stderr: string;
40
+ exitCode: number;
41
+ plan: Record<string, unknown> | null;
42
+ }
43
+ export declare function parseStageEliza1BundlePlan(stdout: string): Record<string, unknown> | null;
44
+ export declare function buildStageEliza1BundleArgs(options: StageEliza1BundleOptions, resolved: {
45
+ trainingRoot: string;
46
+ }): string[];
47
+ export declare function buildEliza1BundleStageManifest(input: {
48
+ generatedAt: string;
49
+ trainingRoot: string;
50
+ outputDir: string;
51
+ manifestPath: string;
52
+ command: string[];
53
+ exitCode: number;
54
+ plan: Record<string, unknown> | null;
55
+ }): Eliza1BundleStageManifest;
56
+ export declare function stageEliza1Bundle(options?: StageEliza1BundleOptions): Promise<StageEliza1BundleResult>;
57
+ //# sourceMappingURL=eliza1-bundle-stager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eliza1-bundle-stager.d.ts","sourceRoot":"","sources":["../../src/core/eliza1-bundle-stager.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,0BAA0B,wBAAwB,CAAC;AAChE,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,OAAO,0BAA0B,CAAC;IAC1C,aAAa,EAAE,OAAO,2BAA2B,CAAC;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACtC;AA6BD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWhC;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GACjC,MAAM,EAAE,CAmBV;AA2BD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACtC,GAAG,yBAAyB,CAoB5B;AAED,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAmDlC"}
@@ -0,0 +1,149 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { join, resolve } from "node:path";
4
+ import { trainingStateRoot } from "./training-config.js";
5
+ const ELIZA1_BUNDLE_STAGE_SCHEMA = "eliza1_bundle_stage";
6
+ const ELIZA1_BUNDLE_STAGE_VERSION = 1;
7
+ function collectProcess(command, args, cwd) {
8
+ return new Promise((resolvePromise, reject) => {
9
+ const child = spawn(command, args, {
10
+ cwd,
11
+ stdio: ["ignore", "pipe", "pipe"]
12
+ });
13
+ let stdout = "";
14
+ let stderr = "";
15
+ child.stdout.setEncoding("utf-8");
16
+ child.stderr.setEncoding("utf-8");
17
+ child.stdout.on("data", (chunk) => {
18
+ stdout += chunk;
19
+ });
20
+ child.stderr.on("data", (chunk) => {
21
+ stderr += chunk;
22
+ });
23
+ child.on("error", reject);
24
+ child.on("close", (code) => {
25
+ resolvePromise({ stdout, stderr, exitCode: code ?? 1 });
26
+ });
27
+ });
28
+ }
29
+ function parseStageEliza1BundlePlan(stdout) {
30
+ const trimmed = stdout.trim();
31
+ if (!trimmed) return null;
32
+ try {
33
+ const parsed = JSON.parse(trimmed);
34
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
35
+ } catch {
36
+ return null;
37
+ }
38
+ }
39
+ function buildStageEliza1BundleArgs(options, resolved) {
40
+ const scriptPath = join(
41
+ resolved.trainingRoot,
42
+ "scripts",
43
+ "manifest",
44
+ "stage_hf_eliza1_bundle.py"
45
+ );
46
+ const args = [scriptPath, "--tier", options.tier ?? "2b"];
47
+ if (options.repoId?.trim()) args.push("--repo-id", options.repoId.trim());
48
+ if (options.localDir?.trim())
49
+ args.push("--local-dir", resolve(options.localDir.trim()));
50
+ if (typeof options.maxBytes === "number" && Number.isFinite(options.maxBytes)) {
51
+ args.push("--max-bytes", String(Math.max(1, Math.floor(options.maxBytes))));
52
+ }
53
+ if (options.apply === true) args.push("--apply");
54
+ return args;
55
+ }
56
+ function safeTimestamp(value) {
57
+ return value.replace(/[:.]/g, "-");
58
+ }
59
+ function stringField(record, key) {
60
+ const value = record?.[key];
61
+ return typeof value === "string" && value.trim() ? value : null;
62
+ }
63
+ function numberField(record, key) {
64
+ const value = record?.[key];
65
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
66
+ }
67
+ function stagedCount(record) {
68
+ const staged = record?.staged;
69
+ return Array.isArray(staged) ? staged.length : 0;
70
+ }
71
+ function buildEliza1BundleStageManifest(input) {
72
+ return {
73
+ schema: ELIZA1_BUNDLE_STAGE_SCHEMA,
74
+ schemaVersion: ELIZA1_BUNDLE_STAGE_VERSION,
75
+ generatedAt: input.generatedAt,
76
+ trainingRoot: input.trainingRoot,
77
+ outputDir: input.outputDir,
78
+ manifestPath: input.manifestPath,
79
+ command: input.command,
80
+ exitCode: input.exitCode,
81
+ repoId: stringField(input.plan, "repoId"),
82
+ tier: stringField(input.plan, "tier"),
83
+ bundleDir: stringField(input.plan, "bundleDir"),
84
+ fileCount: numberField(input.plan, "fileCount"),
85
+ plannedBytes: numberField(input.plan, "plannedBytes"),
86
+ maxBytes: numberField(input.plan, "maxBytes"),
87
+ apply: input.plan?.apply === true,
88
+ stagedCount: stagedCount(input.plan),
89
+ plan: input.plan
90
+ };
91
+ }
92
+ async function stageEliza1Bundle(options = {}) {
93
+ const trainingRoot = resolve(
94
+ options.trainingRoot ?? join(process.cwd(), "packages", "training")
95
+ );
96
+ const command = options.python ?? "python3";
97
+ const args = buildStageEliza1BundleArgs(options, { trainingRoot });
98
+ const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
99
+ const outputDir = options.outputDir ?? join(
100
+ trainingStateRoot(),
101
+ "models",
102
+ "staged-bundles",
103
+ `${options.tier ?? "2b"}-${safeTimestamp(generatedAt)}`
104
+ );
105
+ await mkdir(outputDir, { recursive: true });
106
+ const proc = await collectProcess(command, args, trainingRoot);
107
+ if (proc.exitCode !== 0) {
108
+ throw new Error(
109
+ `stage_hf_eliza1_bundle.py exited with code ${proc.exitCode}: ${proc.stderr || proc.stdout}`
110
+ );
111
+ }
112
+ const plan = parseStageEliza1BundlePlan(proc.stdout);
113
+ const manifestPath = join(outputDir, "eliza1-bundle-stage-manifest.json");
114
+ const manifest = buildEliza1BundleStageManifest({
115
+ generatedAt,
116
+ trainingRoot,
117
+ outputDir,
118
+ manifestPath,
119
+ command: [command, ...args],
120
+ exitCode: proc.exitCode,
121
+ plan
122
+ });
123
+ await writeFile(
124
+ manifestPath,
125
+ `${JSON.stringify(manifest, null, 2)}
126
+ `,
127
+ "utf8"
128
+ );
129
+ return {
130
+ trainingRoot,
131
+ outputDir,
132
+ manifestPath,
133
+ manifest,
134
+ command: [command, ...args],
135
+ stdout: proc.stdout,
136
+ stderr: proc.stderr,
137
+ exitCode: proc.exitCode,
138
+ plan
139
+ };
140
+ }
141
+ export {
142
+ ELIZA1_BUNDLE_STAGE_SCHEMA,
143
+ ELIZA1_BUNDLE_STAGE_VERSION,
144
+ buildEliza1BundleStageManifest,
145
+ buildStageEliza1BundleArgs,
146
+ parseStageEliza1BundlePlan,
147
+ stageEliza1Bundle
148
+ };
149
+ //# sourceMappingURL=eliza1-bundle-stager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/eliza1-bundle-stager.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { trainingStateRoot } from \"./training-config.js\";\n\nexport const ELIZA1_BUNDLE_STAGE_SCHEMA = \"eliza1_bundle_stage\";\nexport const ELIZA1_BUNDLE_STAGE_VERSION = 1;\n\nexport interface StageEliza1BundleOptions {\n trainingRoot?: string;\n python?: string;\n repoId?: string;\n tier?: string;\n localDir?: string;\n outputDir?: string;\n maxBytes?: number;\n apply?: boolean;\n}\n\nexport interface Eliza1BundleStageManifest {\n schema: typeof ELIZA1_BUNDLE_STAGE_SCHEMA;\n schemaVersion: typeof ELIZA1_BUNDLE_STAGE_VERSION;\n generatedAt: string;\n trainingRoot: string;\n outputDir: string;\n manifestPath: string;\n command: string[];\n exitCode: number;\n repoId: string | null;\n tier: string | null;\n bundleDir: string | null;\n fileCount: number | null;\n plannedBytes: number | null;\n maxBytes: number | null;\n apply: boolean;\n stagedCount: number;\n plan: Record<string, unknown> | null;\n}\n\nexport interface StageEliza1BundleResult {\n trainingRoot: string;\n outputDir: string;\n manifestPath: string;\n manifest: Eliza1BundleStageManifest;\n command: string[];\n stdout: string;\n stderr: string;\n exitCode: number;\n plan: Record<string, unknown> | null;\n}\n\nfunction collectProcess(\n command: string,\n args: string[],\n cwd: string,\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return new Promise((resolvePromise, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.setEncoding(\"utf-8\");\n child.stderr.setEncoding(\"utf-8\");\n child.stdout.on(\"data\", (chunk) => {\n stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk;\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolvePromise({ stdout, stderr, exitCode: code ?? 1 });\n });\n });\n}\n\nexport function parseStageEliza1BundlePlan(\n stdout: string,\n): Record<string, unknown> | null {\n const trimmed = stdout.trim();\n if (!trimmed) return null;\n try {\n const parsed = JSON.parse(trimmed);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\nexport function buildStageEliza1BundleArgs(\n options: StageEliza1BundleOptions,\n resolved: { trainingRoot: string },\n): string[] {\n const scriptPath = join(\n resolved.trainingRoot,\n \"scripts\",\n \"manifest\",\n \"stage_hf_eliza1_bundle.py\",\n );\n const args = [scriptPath, \"--tier\", options.tier ?? \"2b\"];\n if (options.repoId?.trim()) args.push(\"--repo-id\", options.repoId.trim());\n if (options.localDir?.trim())\n args.push(\"--local-dir\", resolve(options.localDir.trim()));\n if (\n typeof options.maxBytes === \"number\" &&\n Number.isFinite(options.maxBytes)\n ) {\n args.push(\"--max-bytes\", String(Math.max(1, Math.floor(options.maxBytes))));\n }\n if (options.apply === true) args.push(\"--apply\");\n return args;\n}\n\nfunction safeTimestamp(value: string): string {\n return value.replace(/[:.]/g, \"-\");\n}\n\nfunction stringField(\n record: Record<string, unknown> | null,\n key: string,\n): string | null {\n const value = record?.[key];\n return typeof value === \"string\" && value.trim() ? value : null;\n}\n\nfunction numberField(\n record: Record<string, unknown> | null,\n key: string,\n): number | null {\n const value = record?.[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction stagedCount(record: Record<string, unknown> | null): number {\n const staged = record?.staged;\n return Array.isArray(staged) ? staged.length : 0;\n}\n\nexport function buildEliza1BundleStageManifest(input: {\n generatedAt: string;\n trainingRoot: string;\n outputDir: string;\n manifestPath: string;\n command: string[];\n exitCode: number;\n plan: Record<string, unknown> | null;\n}): Eliza1BundleStageManifest {\n return {\n schema: ELIZA1_BUNDLE_STAGE_SCHEMA,\n schemaVersion: ELIZA1_BUNDLE_STAGE_VERSION,\n generatedAt: input.generatedAt,\n trainingRoot: input.trainingRoot,\n outputDir: input.outputDir,\n manifestPath: input.manifestPath,\n command: input.command,\n exitCode: input.exitCode,\n repoId: stringField(input.plan, \"repoId\"),\n tier: stringField(input.plan, \"tier\"),\n bundleDir: stringField(input.plan, \"bundleDir\"),\n fileCount: numberField(input.plan, \"fileCount\"),\n plannedBytes: numberField(input.plan, \"plannedBytes\"),\n maxBytes: numberField(input.plan, \"maxBytes\"),\n apply: input.plan?.apply === true,\n stagedCount: stagedCount(input.plan),\n plan: input.plan,\n };\n}\n\nexport async function stageEliza1Bundle(\n options: StageEliza1BundleOptions = {},\n): Promise<StageEliza1BundleResult> {\n const trainingRoot = resolve(\n options.trainingRoot ?? join(process.cwd(), \"packages\", \"training\"),\n );\n const command = options.python ?? \"python3\";\n const args = buildStageEliza1BundleArgs(options, { trainingRoot });\n const generatedAt = new Date().toISOString();\n const outputDir =\n options.outputDir ??\n join(\n trainingStateRoot(),\n \"models\",\n \"staged-bundles\",\n `${options.tier ?? \"2b\"}-${safeTimestamp(generatedAt)}`,\n );\n await mkdir(outputDir, { recursive: true });\n const proc = await collectProcess(command, args, trainingRoot);\n if (proc.exitCode !== 0) {\n throw new Error(\n `stage_hf_eliza1_bundle.py exited with code ${proc.exitCode}: ${\n proc.stderr || proc.stdout\n }`,\n );\n }\n const plan = parseStageEliza1BundlePlan(proc.stdout);\n const manifestPath = join(outputDir, \"eliza1-bundle-stage-manifest.json\");\n const manifest = buildEliza1BundleStageManifest({\n generatedAt,\n trainingRoot,\n outputDir,\n manifestPath,\n command: [command, ...args],\n exitCode: proc.exitCode,\n plan,\n });\n await writeFile(\n manifestPath,\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\",\n );\n return {\n trainingRoot,\n outputDir,\n manifestPath,\n manifest,\n command: [command, ...args],\n stdout: proc.stdout,\n stderr: proc.stderr,\n exitCode: proc.exitCode,\n plan,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,53 @@
1
+ interface MinimalLogger {
2
+ info: (message: string) => void;
3
+ warn: (message: string) => void;
4
+ error: (message: string) => void;
5
+ }
6
+ export interface CronServiceJobInput {
7
+ name: string;
8
+ description?: string;
9
+ enabled?: boolean;
10
+ schedule: {
11
+ kind: "cron";
12
+ expr: string;
13
+ tz?: string;
14
+ } | {
15
+ kind: "every";
16
+ everyMs: number;
17
+ };
18
+ payload: {
19
+ kind: "event";
20
+ eventName: string;
21
+ payload?: Record<string, unknown>;
22
+ } | {
23
+ kind: "prompt";
24
+ text: string;
25
+ } | {
26
+ kind: "action";
27
+ actionName: string;
28
+ params?: Record<string, unknown>;
29
+ };
30
+ metadata?: Record<string, unknown>;
31
+ }
32
+ interface CronJobLike {
33
+ id: string;
34
+ name: string;
35
+ createdAtMs: number;
36
+ updatedAtMs: number;
37
+ }
38
+ export interface CronServiceLike {
39
+ createJob: (input: CronServiceJobInput) => Promise<unknown>;
40
+ listJobs?: (filter?: {
41
+ includeDisabled?: boolean;
42
+ }) => Promise<CronJobLike[]>;
43
+ deleteJob?: (jobId: string) => Promise<boolean>;
44
+ }
45
+ export declare function ensureNamedCronJob(cronService: CronServiceLike, job: CronServiceJobInput, options?: {
46
+ log?: MinimalLogger;
47
+ logPrefix?: string;
48
+ }): Promise<"created" | "existing">;
49
+ export declare function registerRuntimeEventOnce(runtime: {
50
+ registerEvent?: (name: string, handler: (payload: unknown) => Promise<void>) => void;
51
+ }, eventName: string, handler: (payload: unknown) => Promise<void>): boolean;
52
+ export {};
53
+ //# sourceMappingURL=ensure-cron-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-cron-job.d.ts","sourceRoot":"","sources":["../../src/core/ensure-cron-job.ts"],"names":[],"mappings":"AAAA,UAAU,aAAa;IACrB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EACJ;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3C;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,OAAO,EACH;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GACvE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAChC;QACE,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC;IACN,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9E,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD;AAID,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,eAAe,EAC5B,GAAG,EAAE,mBAAmB,EACxB,OAAO,CAAC,EAAE;IACR,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,CAmCjC;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE;IACP,aAAa,CAAC,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,KACzC,IAAI,CAAC;CACX,EACD,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAC3C,OAAO,CAkBT"}
@@ -0,0 +1,51 @@
1
+ const registeredRuntimeEvents = /* @__PURE__ */ new WeakMap();
2
+ async function ensureNamedCronJob(cronService, job, options) {
3
+ const logPrefix = options?.logPrefix ?? "[CronRegistration]";
4
+ const matchingJobs = typeof cronService.listJobs === "function" ? (await cronService.listJobs({ includeDisabled: true })).filter((entry) => entry.name === job.name).sort((left, right) => {
5
+ if (right.updatedAtMs !== left.updatedAtMs) {
6
+ return right.updatedAtMs - left.updatedAtMs;
7
+ }
8
+ return right.createdAtMs - left.createdAtMs;
9
+ }) : [];
10
+ if (matchingJobs.length > 1 && typeof cronService.deleteJob === "function") {
11
+ for (const duplicate of matchingJobs.slice(1)) {
12
+ const deleted = await cronService.deleteJob(duplicate.id);
13
+ if (!deleted) {
14
+ options?.log?.warn(
15
+ `${logPrefix} could not remove duplicate cron "${job.name}" (${duplicate.id})`
16
+ );
17
+ }
18
+ }
19
+ options?.log?.info(
20
+ `${logPrefix} removed ${matchingJobs.length - 1} duplicate cron registration${matchingJobs.length === 2 ? "" : "s"} for "${job.name}"`
21
+ );
22
+ return "existing";
23
+ }
24
+ if (matchingJobs.length > 0) {
25
+ return "existing";
26
+ }
27
+ await cronService.createJob(job);
28
+ return "created";
29
+ }
30
+ function registerRuntimeEventOnce(runtime, eventName, handler) {
31
+ if (typeof runtime.registerEvent !== "function") {
32
+ return false;
33
+ }
34
+ const runtimeKey = runtime;
35
+ let registeredEvents = registeredRuntimeEvents.get(runtimeKey);
36
+ if (!registeredEvents) {
37
+ registeredEvents = /* @__PURE__ */ new Set();
38
+ registeredRuntimeEvents.set(runtimeKey, registeredEvents);
39
+ }
40
+ if (registeredEvents.has(eventName)) {
41
+ return false;
42
+ }
43
+ runtime.registerEvent(eventName, handler);
44
+ registeredEvents.add(eventName);
45
+ return true;
46
+ }
47
+ export {
48
+ ensureNamedCronJob,
49
+ registerRuntimeEventOnce
50
+ };
51
+ //# sourceMappingURL=ensure-cron-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/ensure-cron-job.ts"],"sourcesContent":["interface MinimalLogger {\n info: (message: string) => void;\n warn: (message: string) => void;\n error: (message: string) => void;\n}\n\nexport interface CronServiceJobInput {\n name: string;\n description?: string;\n enabled?: boolean;\n schedule:\n | { kind: \"cron\"; expr: string; tz?: string }\n | { kind: \"every\"; everyMs: number };\n payload:\n | { kind: \"event\"; eventName: string; payload?: Record<string, unknown> }\n | { kind: \"prompt\"; text: string }\n | {\n kind: \"action\";\n actionName: string;\n params?: Record<string, unknown>;\n };\n metadata?: Record<string, unknown>;\n}\n\ninterface CronJobLike {\n id: string;\n name: string;\n createdAtMs: number;\n updatedAtMs: number;\n}\n\nexport interface CronServiceLike {\n createJob: (input: CronServiceJobInput) => Promise<unknown>;\n listJobs?: (filter?: { includeDisabled?: boolean }) => Promise<CronJobLike[]>;\n deleteJob?: (jobId: string) => Promise<boolean>;\n}\n\nconst registeredRuntimeEvents = new WeakMap<object, Set<string>>();\n\nexport async function ensureNamedCronJob(\n cronService: CronServiceLike,\n job: CronServiceJobInput,\n options?: {\n log?: MinimalLogger;\n logPrefix?: string;\n },\n): Promise<\"created\" | \"existing\"> {\n const logPrefix = options?.logPrefix ?? \"[CronRegistration]\";\n const matchingJobs =\n typeof cronService.listJobs === \"function\"\n ? (await cronService.listJobs({ includeDisabled: true }))\n .filter((entry) => entry.name === job.name)\n .sort((left, right) => {\n if (right.updatedAtMs !== left.updatedAtMs) {\n return right.updatedAtMs - left.updatedAtMs;\n }\n return right.createdAtMs - left.createdAtMs;\n })\n : [];\n\n if (matchingJobs.length > 1 && typeof cronService.deleteJob === \"function\") {\n for (const duplicate of matchingJobs.slice(1)) {\n const deleted = await cronService.deleteJob(duplicate.id);\n if (!deleted) {\n options?.log?.warn(\n `${logPrefix} could not remove duplicate cron \"${job.name}\" (${duplicate.id})`,\n );\n }\n }\n options?.log?.info(\n `${logPrefix} removed ${matchingJobs.length - 1} duplicate cron registration${matchingJobs.length === 2 ? \"\" : \"s\"} for \"${job.name}\"`,\n );\n return \"existing\";\n }\n\n if (matchingJobs.length > 0) {\n return \"existing\";\n }\n\n await cronService.createJob(job);\n return \"created\";\n}\n\nexport function registerRuntimeEventOnce(\n runtime: {\n registerEvent?: (\n name: string,\n handler: (payload: unknown) => Promise<void>,\n ) => void;\n },\n eventName: string,\n handler: (payload: unknown) => Promise<void>,\n): boolean {\n if (typeof runtime.registerEvent !== \"function\") {\n return false;\n }\n\n const runtimeKey = runtime as object;\n let registeredEvents = registeredRuntimeEvents.get(runtimeKey);\n if (!registeredEvents) {\n registeredEvents = new Set<string>();\n registeredRuntimeEvents.set(runtimeKey, registeredEvents);\n }\n if (registeredEvents.has(eventName)) {\n return false;\n }\n\n runtime.registerEvent(eventName, handler);\n registeredEvents.add(eventName);\n return true;\n}\n"],"mappings":"AAqCA,MAAM,0BAA0B,oBAAI,QAA6B;AAEjE,eAAsB,mBACpB,aACA,KACA,SAIiC;AACjC,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,eACJ,OAAO,YAAY,aAAa,cAC3B,MAAM,YAAY,SAAS,EAAE,iBAAiB,KAAK,CAAC,GAClD,OAAO,CAAC,UAAU,MAAM,SAAS,IAAI,IAAI,EACzC,KAAK,CAAC,MAAM,UAAU;AACrB,QAAI,MAAM,gBAAgB,KAAK,aAAa;AAC1C,aAAO,MAAM,cAAc,KAAK;AAAA,IAClC;AACA,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,CAAC,IACH,CAAC;AAEP,MAAI,aAAa,SAAS,KAAK,OAAO,YAAY,cAAc,YAAY;AAC1E,eAAW,aAAa,aAAa,MAAM,CAAC,GAAG;AAC7C,YAAM,UAAU,MAAM,YAAY,UAAU,UAAU,EAAE;AACxD,UAAI,CAAC,SAAS;AACZ,iBAAS,KAAK;AAAA,UACZ,GAAG,SAAS,qCAAqC,IAAI,IAAI,MAAM,UAAU,EAAE;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AACA,aAAS,KAAK;AAAA,MACZ,GAAG,SAAS,YAAY,aAAa,SAAS,CAAC,+BAA+B,aAAa,WAAW,IAAI,KAAK,GAAG,SAAS,IAAI,IAAI;AAAA,IACrI;AACA,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,UAAU,GAAG;AAC/B,SAAO;AACT;AAEO,SAAS,yBACd,SAMA,WACA,SACS;AACT,MAAI,OAAO,QAAQ,kBAAkB,YAAY;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,aAAa;AACnB,MAAI,mBAAmB,wBAAwB,IAAI,UAAU;AAC7D,MAAI,CAAC,kBAAkB;AACrB,uBAAmB,oBAAI,IAAY;AACnC,4BAAwB,IAAI,YAAY,gBAAgB;AAAA,EAC1D;AACA,MAAI,iBAAiB,IAAI,SAAS,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,UAAQ,cAAc,WAAW,OAAO;AACxC,mBAAiB,IAAI,SAAS;AAC9B,SAAO;AACT;","names":[]}