@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.
- package/dist/backends/native.d.ts +96 -0
- package/dist/backends/native.d.ts.map +1 -0
- package/dist/backends/native.js +308 -0
- package/dist/backends/native.js.map +1 -0
- package/dist/cli/train.d.ts +22 -0
- package/dist/cli/train.d.ts.map +1 -0
- package/dist/cli/train.js +219 -0
- package/dist/cli/train.js.map +1 -0
- package/dist/core/action-benchmark-runner.d.ts +55 -0
- package/dist/core/action-benchmark-runner.d.ts.map +1 -0
- package/dist/core/action-benchmark-runner.js +341 -0
- package/dist/core/action-benchmark-runner.js.map +1 -0
- package/dist/core/artifact-store.d.ts +72 -0
- package/dist/core/artifact-store.d.ts.map +1 -0
- package/dist/core/artifact-store.js +50 -0
- package/dist/core/artifact-store.js.map +1 -0
- package/dist/core/benchmark-matrix-artifact.d.ts +102 -0
- package/dist/core/benchmark-matrix-artifact.d.ts.map +1 -0
- package/dist/core/benchmark-matrix-artifact.js +381 -0
- package/dist/core/benchmark-matrix-artifact.js.map +1 -0
- package/dist/core/benchmark-vs-cerebras-runner.d.ts +37 -0
- package/dist/core/benchmark-vs-cerebras-runner.d.ts.map +1 -0
- package/dist/core/benchmark-vs-cerebras-runner.js +151 -0
- package/dist/core/benchmark-vs-cerebras-runner.js.map +1 -0
- package/dist/core/cerebras-eval-model.d.ts +54 -0
- package/dist/core/cerebras-eval-model.d.ts.map +1 -0
- package/dist/core/cerebras-eval-model.js +249 -0
- package/dist/core/cerebras-eval-model.js.map +1 -0
- package/dist/core/cli.d.ts +15 -0
- package/dist/core/cli.d.ts.map +1 -0
- package/dist/core/cli.js +1003 -0
- package/dist/core/cli.js.map +1 -0
- package/dist/core/context-audit.d.ts +51 -0
- package/dist/core/context-audit.d.ts.map +1 -0
- package/dist/core/context-audit.js +166 -0
- package/dist/core/context-audit.js.map +1 -0
- package/dist/core/context-catalog.d.ts +47 -0
- package/dist/core/context-catalog.d.ts.map +1 -0
- package/dist/core/context-catalog.js +269 -0
- package/dist/core/context-catalog.js.map +1 -0
- package/dist/core/context-types.d.ts +3 -0
- package/dist/core/context-types.d.ts.map +1 -0
- package/dist/core/context-types.js +18 -0
- package/dist/core/context-types.js.map +1 -0
- package/dist/core/dataset-generator.d.ts +135 -0
- package/dist/core/dataset-generator.d.ts.map +1 -0
- package/dist/core/dataset-generator.js +895 -0
- package/dist/core/dataset-generator.js.map +1 -0
- package/dist/core/eliza1-benchmark-recipe.d.ts +18 -0
- package/dist/core/eliza1-benchmark-recipe.d.ts.map +1 -0
- package/dist/core/eliza1-benchmark-recipe.js +64 -0
- package/dist/core/eliza1-benchmark-recipe.js.map +1 -0
- package/dist/core/eliza1-bundle-stager.d.ts +57 -0
- package/dist/core/eliza1-bundle-stager.d.ts.map +1 -0
- package/dist/core/eliza1-bundle-stager.js +149 -0
- package/dist/core/eliza1-bundle-stager.js.map +1 -0
- package/dist/core/ensure-cron-job.d.ts +53 -0
- package/dist/core/ensure-cron-job.d.ts.map +1 -0
- package/dist/core/ensure-cron-job.js +51 -0
- package/dist/core/ensure-cron-job.js.map +1 -0
- package/dist/core/eval-comparison-artifact.d.ts +72 -0
- package/dist/core/eval-comparison-artifact.d.ts.map +1 -0
- package/dist/core/eval-comparison-artifact.js +281 -0
- package/dist/core/eval-comparison-artifact.js.map +1 -0
- package/dist/core/feed-generation-runner.d.ts +37 -0
- package/dist/core/feed-generation-runner.d.ts.map +1 -0
- package/dist/core/feed-generation-runner.js +232 -0
- package/dist/core/feed-generation-runner.js.map +1 -0
- package/dist/core/html-escape.d.ts +5 -0
- package/dist/core/html-escape.d.ts.map +1 -0
- package/dist/core/html-escape.js +11 -0
- package/dist/core/html-escape.js.map +1 -0
- package/dist/core/huggingface-dataset-ingest.d.ts +52 -0
- package/dist/core/huggingface-dataset-ingest.d.ts.map +1 -0
- package/dist/core/huggingface-dataset-ingest.js +134 -0
- package/dist/core/huggingface-dataset-ingest.js.map +1 -0
- package/dist/core/index.d.ts +29 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +204 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/privacy-filter.d.ts +95 -0
- package/dist/core/privacy-filter.d.ts.map +1 -0
- package/dist/core/privacy-filter.js +324 -0
- package/dist/core/privacy-filter.js.map +1 -0
- package/dist/core/promotion-gate.d.ts +117 -0
- package/dist/core/promotion-gate.d.ts.map +1 -0
- package/dist/core/promotion-gate.js +85 -0
- package/dist/core/promotion-gate.js.map +1 -0
- package/dist/core/promotion-persist.d.ts +116 -0
- package/dist/core/promotion-persist.d.ts.map +1 -0
- package/dist/core/promotion-persist.js +93 -0
- package/dist/core/promotion-persist.js.map +1 -0
- package/dist/core/prompt-compare.d.ts +99 -0
- package/dist/core/prompt-compare.d.ts.map +1 -0
- package/dist/core/prompt-compare.js +210 -0
- package/dist/core/prompt-compare.js.map +1 -0
- package/dist/core/replay-validator.d.ts +136 -0
- package/dist/core/replay-validator.d.ts.map +1 -0
- package/dist/core/replay-validator.js +312 -0
- package/dist/core/replay-validator.js.map +1 -0
- package/dist/core/roleplay-executor.d.ts +123 -0
- package/dist/core/roleplay-executor.d.ts.map +1 -0
- package/dist/core/roleplay-executor.js +675 -0
- package/dist/core/roleplay-executor.js.map +1 -0
- package/dist/core/roleplay-trajectories.d.ts +54 -0
- package/dist/core/roleplay-trajectories.d.ts.map +1 -0
- package/dist/core/roleplay-trajectories.js +88 -0
- package/dist/core/roleplay-trajectories.js.map +1 -0
- package/dist/core/scenario-blueprints.d.ts +62 -0
- package/dist/core/scenario-blueprints.d.ts.map +1 -0
- package/dist/core/scenario-blueprints.js +850 -0
- package/dist/core/scenario-blueprints.js.map +1 -0
- package/dist/core/scenario-runner.d.ts +36 -0
- package/dist/core/scenario-runner.d.ts.map +1 -0
- package/dist/core/scenario-runner.js +216 -0
- package/dist/core/scenario-runner.js.map +1 -0
- package/dist/core/skill-scoring-cron.d.ts +57 -0
- package/dist/core/skill-scoring-cron.d.ts.map +1 -0
- package/dist/core/skill-scoring-cron.js +180 -0
- package/dist/core/skill-scoring-cron.js.map +1 -0
- package/dist/core/test-trajectory-collector.d.ts +37 -0
- package/dist/core/test-trajectory-collector.d.ts.map +1 -0
- package/dist/core/test-trajectory-collector.js +225 -0
- package/dist/core/test-trajectory-collector.js.map +1 -0
- package/dist/core/track-c-queue-task.d.ts +37 -0
- package/dist/core/track-c-queue-task.d.ts.map +1 -0
- package/dist/core/track-c-queue-task.js +104 -0
- package/dist/core/track-c-queue-task.js.map +1 -0
- package/dist/core/training-analysis-index.d.ts +104 -0
- package/dist/core/training-analysis-index.d.ts.map +1 -0
- package/dist/core/training-analysis-index.js +3297 -0
- package/dist/core/training-analysis-index.js.map +1 -0
- package/dist/core/training-collection-runner.d.ts +508 -0
- package/dist/core/training-collection-runner.d.ts.map +1 -0
- package/dist/core/training-collection-runner.js +2299 -0
- package/dist/core/training-collection-runner.js.map +1 -0
- package/dist/core/training-config.d.ts +52 -0
- package/dist/core/training-config.d.ts.map +1 -0
- package/dist/core/training-config.js +117 -0
- package/dist/core/training-config.js.map +1 -0
- package/dist/core/training-orchestrator.d.ts +112 -0
- package/dist/core/training-orchestrator.d.ts.map +1 -0
- package/dist/core/training-orchestrator.js +729 -0
- package/dist/core/training-orchestrator.js.map +1 -0
- package/dist/core/training-readiness-report.d.ts +52 -0
- package/dist/core/training-readiness-report.d.ts.map +1 -0
- package/dist/core/training-readiness-report.js +765 -0
- package/dist/core/training-readiness-report.js.map +1 -0
- package/dist/core/trajectory-consumer.d.ts +15 -0
- package/dist/core/trajectory-consumer.d.ts.map +1 -0
- package/dist/core/trajectory-consumer.js +61 -0
- package/dist/core/trajectory-consumer.js.map +1 -0
- package/dist/core/trajectory-export-bundle.d.ts +95 -0
- package/dist/core/trajectory-export-bundle.d.ts.map +1 -0
- package/dist/core/trajectory-export-bundle.js +561 -0
- package/dist/core/trajectory-export-bundle.js.map +1 -0
- package/dist/core/trajectory-export-cron.d.ts +57 -0
- package/dist/core/trajectory-export-cron.d.ts.map +1 -0
- package/dist/core/trajectory-export-cron.js +170 -0
- package/dist/core/trajectory-export-cron.js.map +1 -0
- package/dist/core/trajectory-hf-upload.d.ts +50 -0
- package/dist/core/trajectory-hf-upload.d.ts.map +1 -0
- package/dist/core/trajectory-hf-upload.js +111 -0
- package/dist/core/trajectory-hf-upload.js.map +1 -0
- package/dist/core/trajectory-task-datasets.d.ts +62 -0
- package/dist/core/trajectory-task-datasets.d.ts.map +1 -0
- package/dist/core/trajectory-task-datasets.js +427 -0
- package/dist/core/trajectory-task-datasets.js.map +1 -0
- package/dist/core/wait-for-service.d.ts +25 -0
- package/dist/core/wait-for-service.d.ts.map +1 -0
- package/dist/core/wait-for-service.js +19 -0
- package/dist/core/wait-for-service.js.map +1 -0
- package/dist/core/workspace-runtime.d.ts +4 -0
- package/dist/core/workspace-runtime.d.ts.map +1 -0
- package/dist/core/workspace-runtime.js +25 -0
- package/dist/core/workspace-runtime.js.map +1 -0
- package/dist/dspy/artifact.d.ts +54 -0
- package/dist/dspy/artifact.d.ts.map +1 -0
- package/dist/dspy/artifact.js +61 -0
- package/dist/dspy/artifact.js.map +1 -0
- package/dist/dspy/chain-of-thought.d.ts +27 -0
- package/dist/dspy/chain-of-thought.d.ts.map +1 -0
- package/dist/dspy/chain-of-thought.js +43 -0
- package/dist/dspy/chain-of-thought.js.map +1 -0
- package/dist/dspy/examples.d.ts +72 -0
- package/dist/dspy/examples.d.ts.map +1 -0
- package/dist/dspy/examples.js +105 -0
- package/dist/dspy/examples.js.map +1 -0
- package/dist/dspy/index.d.ts +15 -0
- package/dist/dspy/index.d.ts.map +1 -0
- package/dist/dspy/index.js +40 -0
- package/dist/dspy/index.js.map +1 -0
- package/dist/dspy/lm-adapter.d.ts +100 -0
- package/dist/dspy/lm-adapter.d.ts.map +1 -0
- package/dist/dspy/lm-adapter.js +81 -0
- package/dist/dspy/lm-adapter.js.map +1 -0
- package/dist/dspy/optimizers/dspy-bootstrap-fewshot.d.ts +23 -0
- package/dist/dspy/optimizers/dspy-bootstrap-fewshot.d.ts.map +1 -0
- package/dist/dspy/optimizers/dspy-bootstrap-fewshot.js +85 -0
- package/dist/dspy/optimizers/dspy-bootstrap-fewshot.js.map +1 -0
- package/dist/dspy/optimizers/dspy-copro.d.ts +29 -0
- package/dist/dspy/optimizers/dspy-copro.d.ts.map +1 -0
- package/dist/dspy/optimizers/dspy-copro.js +141 -0
- package/dist/dspy/optimizers/dspy-copro.js.map +1 -0
- package/dist/dspy/optimizers/dspy-mipro.d.ts +37 -0
- package/dist/dspy/optimizers/dspy-mipro.d.ts.map +1 -0
- package/dist/dspy/optimizers/dspy-mipro.js +194 -0
- package/dist/dspy/optimizers/dspy-mipro.js.map +1 -0
- package/dist/dspy/optimizers/index.d.ts +5 -0
- package/dist/dspy/optimizers/index.d.ts.map +1 -0
- package/dist/dspy/optimizers/index.js +11 -0
- package/dist/dspy/optimizers/index.js.map +1 -0
- package/dist/dspy/optimizers/types.d.ts +39 -0
- package/dist/dspy/optimizers/types.d.ts.map +1 -0
- package/dist/dspy/optimizers/types.js +1 -0
- package/dist/dspy/optimizers/types.js.map +1 -0
- package/dist/dspy/predict.d.ts +49 -0
- package/dist/dspy/predict.d.ts.map +1 -0
- package/dist/dspy/predict.js +73 -0
- package/dist/dspy/predict.js.map +1 -0
- package/dist/dspy/signature.d.ts +88 -0
- package/dist/dspy/signature.d.ts.map +1 -0
- package/dist/dspy/signature.js +205 -0
- package/dist/dspy/signature.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/optimizers/bootstrap-fewshot.d.ts +42 -0
- package/dist/optimizers/bootstrap-fewshot.d.ts.map +1 -0
- package/dist/optimizers/bootstrap-fewshot.js +92 -0
- package/dist/optimizers/bootstrap-fewshot.js.map +1 -0
- package/dist/optimizers/gepa.d.ts +63 -0
- package/dist/optimizers/gepa.d.ts.map +1 -0
- package/dist/optimizers/gepa.js +232 -0
- package/dist/optimizers/gepa.js.map +1 -0
- package/dist/optimizers/index.d.ts +7 -0
- package/dist/optimizers/index.d.ts.map +1 -0
- package/dist/optimizers/index.js +51 -0
- package/dist/optimizers/index.js.map +1 -0
- package/dist/optimizers/instruction-search.d.ts +39 -0
- package/dist/optimizers/instruction-search.d.ts.map +1 -0
- package/dist/optimizers/instruction-search.js +108 -0
- package/dist/optimizers/instruction-search.js.map +1 -0
- package/dist/optimizers/prompt-evolution.d.ts +39 -0
- package/dist/optimizers/prompt-evolution.d.ts.map +1 -0
- package/dist/optimizers/prompt-evolution.js +101 -0
- package/dist/optimizers/prompt-evolution.js.map +1 -0
- package/dist/optimizers/scoring.d.ts +139 -0
- package/dist/optimizers/scoring.d.ts.map +1 -0
- package/dist/optimizers/scoring.js +299 -0
- package/dist/optimizers/scoring.js.map +1 -0
- package/dist/optimizers/types.d.ts +105 -0
- package/dist/optimizers/types.d.ts.map +1 -0
- package/dist/optimizers/types.js +1 -0
- package/dist/optimizers/types.js.map +1 -0
- package/dist/register-runtime.d.ts +3 -0
- package/dist/register-runtime.d.ts.map +1 -0
- package/dist/register-runtime.js +60 -0
- package/dist/register-runtime.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +31 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/routes/experience-routes.d.ts +21 -0
- package/dist/routes/experience-routes.d.ts.map +1 -0
- package/dist/routes/experience-routes.js +513 -0
- package/dist/routes/experience-routes.js.map +1 -0
- package/dist/routes/index.d.ts +5 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +17 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/training-routes.d.ts +10 -0
- package/dist/routes/training-routes.d.ts.map +1 -0
- package/dist/routes/training-routes.js +1239 -0
- package/dist/routes/training-routes.js.map +1 -0
- package/dist/routes/training-vast-routes.d.ts +35 -0
- package/dist/routes/training-vast-routes.d.ts.map +1 -0
- package/dist/routes/training-vast-routes.js +249 -0
- package/dist/routes/training-vast-routes.js.map +1 -0
- package/dist/routes/trajectory-routes.d.ts +19 -0
- package/dist/routes/trajectory-routes.d.ts.map +1 -0
- package/dist/routes/trajectory-routes.js +1122 -0
- package/dist/routes/trajectory-routes.js.map +1 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +63 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/training-backend-check.d.ts +8 -0
- package/dist/services/training-backend-check.d.ts.map +1 -0
- package/dist/services/training-backend-check.js +31 -0
- package/dist/services/training-backend-check.js.map +1 -0
- package/dist/services/training-service-like.d.ts +40 -0
- package/dist/services/training-service-like.d.ts.map +1 -0
- package/dist/services/training-service-like.js +1 -0
- package/dist/services/training-service-like.js.map +1 -0
- package/dist/services/training-service-registry.d.ts +4 -0
- package/dist/services/training-service-registry.d.ts.map +1 -0
- package/dist/services/training-service-registry.js +12 -0
- package/dist/services/training-service-registry.js.map +1 -0
- package/dist/services/training-service.d.ts +59 -0
- package/dist/services/training-service.d.ts.map +1 -0
- package/dist/services/training-service.js +154 -0
- package/dist/services/training-service.js.map +1 -0
- package/dist/services/training-trigger.d.ts +177 -0
- package/dist/services/training-trigger.d.ts.map +1 -0
- package/dist/services/training-trigger.js +300 -0
- package/dist/services/training-trigger.js.map +1 -0
- package/dist/services/training-vast-service.d.ts +149 -0
- package/dist/services/training-vast-service.d.ts.map +1 -0
- package/dist/services/training-vast-service.js +648 -0
- package/dist/services/training-vast-service.js.map +1 -0
- package/dist/services/vast-inference-stats.d.ts +37 -0
- package/dist/services/vast-inference-stats.d.ts.map +1 -0
- package/dist/services/vast-inference-stats.js +81 -0
- package/dist/services/vast-inference-stats.js.map +1 -0
- package/dist/services/vast-job-store.d.ts +74 -0
- package/dist/services/vast-job-store.d.ts.map +1 -0
- package/dist/services/vast-job-store.js +194 -0
- package/dist/services/vast-job-store.js.map +1 -0
- package/dist/services/vast-subprocess.d.ts +27 -0
- package/dist/services/vast-subprocess.d.ts.map +1 -0
- package/dist/services/vast-subprocess.js +78 -0
- package/dist/services/vast-subprocess.js.map +1 -0
- package/dist/setup-routes.d.ts +17 -0
- package/dist/setup-routes.d.ts.map +1 -0
- package/dist/setup-routes.js +319 -0
- package/dist/setup-routes.js.map +1 -0
- package/dist/ui/FineTuningSpatialView.d.ts +49 -0
- package/dist/ui/FineTuningSpatialView.d.ts.map +1 -0
- package/dist/ui/FineTuningSpatialView.js +154 -0
- package/dist/ui/FineTuningSpatialView.js.map +1 -0
- package/dist/ui/FineTuningView.d.ts +7 -0
- package/dist/ui/FineTuningView.d.ts.map +1 -0
- package/dist/ui/FineTuningView.helpers.d.ts +17 -0
- package/dist/ui/FineTuningView.helpers.d.ts.map +1 -0
- package/dist/ui/FineTuningView.helpers.js +30 -0
- package/dist/ui/FineTuningView.helpers.js.map +1 -0
- package/dist/ui/FineTuningView.interact.d.ts +2 -0
- package/dist/ui/FineTuningView.interact.d.ts.map +1 -0
- package/dist/ui/FineTuningView.interact.js +300 -0
- package/dist/ui/FineTuningView.interact.js.map +1 -0
- package/dist/ui/FineTuningView.js +4653 -0
- package/dist/ui/FineTuningView.js.map +1 -0
- package/dist/ui/fine-tuning-panels.d.ts +100 -0
- package/dist/ui/fine-tuning-panels.d.ts.map +1 -0
- package/dist/ui/fine-tuning-panels.helpers.d.ts +19 -0
- package/dist/ui/fine-tuning-panels.helpers.d.ts.map +1 -0
- package/dist/ui/fine-tuning-panels.helpers.js +77 -0
- package/dist/ui/fine-tuning-panels.helpers.js.map +1 -0
- package/dist/ui/fine-tuning-panels.js +928 -0
- package/dist/ui/fine-tuning-panels.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/training-view-bundle.d.ts +3 -0
- package/dist/ui/training-view-bundle.d.ts.map +1 -0
- package/dist/ui/training-view-bundle.js +7 -0
- package/dist/ui/training-view-bundle.js.map +1 -0
- package/dist/views/bundle.js +5312 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/roleplay-executor.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Trajectory } from \"@elizaos/agent\";\nimport type {\n AgentRuntime,\n ChannelType,\n Content,\n Memory,\n UUID,\n} from \"@elizaos/core\";\nimport type {\n RoleplayEpisode,\n RoleplayManifestLine,\n RoleplayTurn,\n} from \"./roleplay-trajectories.js\";\nimport {\n exportTrajectoryTaskDatasets,\n type TrajectoryTaskDatasetExport,\n type TrajectoryTaskDatasetSummary,\n} from \"./trajectory-task-datasets.js\";\n\ntype RoleplayDecision = \"RESPOND\" | \"IGNORE\" | \"STOP\";\n\nexport interface RoleplayTurnExecution {\n turnId: string;\n speaker: string;\n role: RoleplayTurn[\"role\"];\n isEvaluationTarget: boolean;\n actualDecision?: \"RESPOND\" | \"IGNORE\" | \"STOP\";\n actualPrimaryContext?: string;\n actualSecondaryContexts: string[];\n selectedActions: string[];\n executedActions: string[];\n responseText: string;\n callbackTexts: string[];\n trajectoryId?: string;\n warnings: string[];\n}\n\nexport interface RoleplayEpisodeExecution {\n episodeId: string;\n blueprintId: string;\n agentName: string;\n pattern?: string;\n evaluationTurnId: string;\n expectedDecision: RoleplayDecision;\n actualDecision: RoleplayDecision;\n expectedPrimaryContext: string;\n actualPrimaryContext?: string;\n expectedSecondaryContexts: string[];\n actualSecondaryContexts: string[];\n expectedAction?: string;\n actualActions: string[];\n selectedActions: string[];\n executedActions: string[];\n decisionMatch: boolean;\n primaryContextMatch: boolean;\n secondaryContextExactMatch: boolean;\n routingMatch: boolean;\n actionMatch: boolean;\n selectedActionMatch: boolean;\n executedActionMatch: boolean;\n trajectoryCaptured: boolean;\n responseText: string;\n callbackTexts: string[];\n warnings: string[];\n turnExecutions: RoleplayTurnExecution[];\n trajectory?: Trajectory | null;\n}\n\nexport interface RoleplayBucketReport {\n totalEpisodes: number;\n decisionMatches: number;\n routingMatches: number;\n primaryContextMatches: number;\n secondaryContextExactMatches: number;\n actionRelevantEpisodes: number;\n actionMatches: number;\n selectedActionMatches: number;\n executedActionMatches: number;\n decisionAccuracy: number;\n routingAccuracy: number;\n primaryContextAccuracy: number;\n secondaryContextExactAccuracy: number;\n actionAccuracy: number;\n selectedActionAccuracy: number;\n executedActionAccuracy: number;\n}\n\nexport interface RoleplayExecutionReport {\n totalEpisodes: number;\n decisionMatches: number;\n routingMatches: number;\n primaryContextMatches: number;\n secondaryContextExactMatches: number;\n actionMatches: number;\n selectedActionMatches: number;\n executedActionMatches: number;\n trajectoryCaptured: number;\n decisionAccuracy: number;\n routingAccuracy: number;\n primaryContextAccuracy: number;\n secondaryContextExactAccuracy: number;\n actionAccuracy: number;\n selectedActionAccuracy: number;\n executedActionAccuracy: number;\n trajectoryCaptureRate: number;\n decisionConfusionMatrix: Record<\n RoleplayDecision,\n Record<RoleplayDecision, number>\n >;\n warningCounts: Record<string, number>;\n byPrimaryContext: Record<string, RoleplayBucketReport>;\n byPattern: Record<string, RoleplayBucketReport>;\n trajectoryDatasetSummary?: TrajectoryTaskDatasetSummary | null;\n mismatches: Array<{\n episodeId: string;\n pattern?: string;\n expectedDecision: string;\n actualDecision: string;\n expectedPrimaryContext: string;\n actualPrimaryContext?: string;\n expectedAction?: string;\n actualActions: string[];\n selectedActions: string[];\n executedActions: string[];\n warnings: string[];\n }>;\n}\n\nexport interface RoleplayExecutionExportPaths {\n executionsPath: string;\n reportPath: string;\n trajectoryDataset?: TrajectoryTaskDatasetExport;\n}\n\nexport interface ExecuteRoleplayOptions {\n runtime?: AgentRuntime;\n timeoutMs?: number;\n executeAllParticipantTurns?: boolean;\n outputDir?: string;\n}\n\ntype RuntimeLike = AgentRuntime & {\n ensureConnection?: (params: {\n entityId: UUID;\n roomId: UUID;\n worldId: UUID;\n userName: string;\n source: string;\n channelId: string;\n type: ChannelType;\n messageServerId: UUID;\n metadata?: Record<string, unknown>;\n }) => Promise<void>;\n createMemory: (memory: Memory, tableName?: string) => Promise<unknown>;\n messageService: NonNullable<AgentRuntime[\"messageService\"]>;\n getActionResults: (\n messageId: UUID,\n ) => Array<{ actionName?: string } | string>;\n getServicesByType?: (serviceType: string) => unknown;\n getService?: (serviceType: string) => unknown;\n};\n\nconst GROUP_CHANNEL = \"GROUP\" as ChannelType;\n\nfunction deterministicUuid(seed: string): UUID {\n const hex = createHash(\"sha1\").update(seed).digest(\"hex\").slice(0, 32);\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join(\"-\") as UUID;\n}\n\ntype TrajectoryLoggerLike = {\n getTrajectoryDetail?: (trajectoryId: string) => Promise<Trajectory | null>;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction parseDelimitedList(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(\n (entry, index, entries) =>\n entry.length > 0 && entries.indexOf(entry) === index,\n );\n}\n\nfunction stripOutputFences(response: string): string {\n return response\n .trim()\n .replace(/^```[a-z0-9_-]*\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\")\n .trim();\n}\n\nfunction parseJsonObject(response: string): Record<string, unknown> | null {\n const trimmed = stripOutputFences(response);\n if (!trimmed.startsWith(\"{\")) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\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\nfunction getMessageHandlerCandidate(\n parsed: Record<string, unknown>,\n): Record<string, unknown> | null {\n const nested = parsed.messageHandler;\n if (isRecord(nested)) {\n return nested;\n }\n\n if (typeof parsed.action === \"string\") {\n return parsed;\n }\n\n return null;\n}\n\nfunction readLegacyField(\n response: string,\n fieldName: string,\n): string | undefined {\n const lineMatch = new RegExp(`(^|\\\\n)${fieldName}:\\\\s*([^\\\\n]+)`, \"i\").exec(\n response,\n );\n if (lineMatch?.[2]) {\n const value = lineMatch[2].trim();\n return value.length > 0 ? value : undefined;\n }\n\n return undefined;\n}\n\nfunction parseRoutingDecision(response: string): {\n decision?: RoleplayDecision;\n primaryContext?: string;\n secondaryContexts: string[];\n} {\n const parsed = parseJsonObject(response);\n const candidate = parsed ? getMessageHandlerCandidate(parsed) : null;\n const rawAction =\n typeof candidate?.action === \"string\"\n ? candidate.action\n : readLegacyField(response, \"action\");\n const decision = rawAction?.toUpperCase();\n const contexts = Array.isArray(candidate?.contexts)\n ? candidate.contexts.filter(\n (context): context is string =>\n typeof context === \"string\" && context.trim().length > 0,\n )\n : [];\n const primaryContext =\n contexts[0] ?? readLegacyField(response, \"primaryContext\");\n const secondaryContexts =\n contexts.length > 1\n ? contexts.slice(1)\n : parseDelimitedList(\n readLegacyField(response, \"secondaryContexts\") ?? \"\",\n );\n\n return {\n decision:\n decision === \"RESPOND\" || decision === \"IGNORE\" || decision === \"STOP\"\n ? decision\n : undefined,\n primaryContext,\n secondaryContexts,\n };\n}\n\nfunction collectRuntimeCandidates(runtime: RuntimeLike): unknown[] {\n const candidates: unknown[] = [];\n const seen = new Set<unknown>();\n\n const push = (candidate: unknown): void => {\n if (!candidate || seen.has(candidate)) {\n return;\n }\n seen.add(candidate);\n candidates.push(candidate);\n };\n\n if (typeof runtime.getServicesByType === \"function\") {\n const value = runtime.getServicesByType(\"trajectories\");\n if (Array.isArray(value)) {\n for (const entry of value) {\n push(entry);\n }\n } else {\n push(value);\n }\n }\n\n if (typeof runtime.getService === \"function\") {\n push(runtime.getService(\"trajectories\"));\n }\n\n return candidates;\n}\n\nfunction getTrajectoryLogger(\n runtime: RuntimeLike,\n): TrajectoryLoggerLike | null {\n for (const candidate of collectRuntimeCandidates(runtime)) {\n if (\n candidate &&\n typeof candidate === \"object\" &&\n typeof (candidate as TrajectoryLoggerLike).getTrajectoryDetail ===\n \"function\"\n ) {\n return candidate as TrajectoryLoggerLike;\n }\n }\n\n return null;\n}\n\nasync function waitForTrajectoryDetail(\n logger: TrajectoryLoggerLike | null,\n trajectoryId: string,\n): Promise<Trajectory | null> {\n if (!logger?.getTrajectoryDetail) {\n return null;\n }\n\n for (let attempt = 0; attempt < 20; attempt += 1) {\n const detail = await logger.getTrajectoryDetail(trajectoryId);\n if (detail) {\n return detail;\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n return null;\n}\n\nfunction normalizeActionName(value: unknown): string {\n if (typeof value !== \"string\") {\n return \"\";\n }\n\n return value.trim().toUpperCase();\n}\n\nfunction collectActionNamesFromContent(\n content: Content | null | undefined,\n): string[] {\n if (!content?.actions) {\n return [];\n }\n\n return content.actions\n .map((action) => normalizeActionName(action))\n .filter(\n (action, index, actions) =>\n action.length > 0 && actions.indexOf(action) === index,\n );\n}\n\nfunction collectExecutedActionNames(\n runtime: RuntimeLike,\n messageId: UUID,\n): string[] {\n return runtime\n .getActionResults(messageId)\n .map((result) => {\n if (typeof result === \"string\") {\n return result;\n }\n\n const record = isRecord(result) ? result : null;\n if (!record) {\n return \"\";\n }\n\n if (typeof record.actionName === \"string\") {\n return record.actionName;\n }\n\n const data = isRecord(record.data) ? record.data : null;\n return typeof data?.actionName === \"string\" ? data.actionName : \"\";\n })\n .map((action) => normalizeActionName(action))\n .filter(\n (action, index, actions) =>\n action.length > 0 && actions.indexOf(action) === index,\n );\n}\n\nfunction resolveActualDecision(args: {\n didRespond: boolean;\n callbackContents: Content[];\n responseContent: Content | null;\n shouldRespondDecision?: RoleplayDecision;\n}): RoleplayDecision {\n const callbackActions = args.callbackContents.flatMap((content) =>\n collectActionNamesFromContent(content),\n );\n if (callbackActions.includes(\"STOP\")) {\n return \"STOP\";\n }\n if (callbackActions.includes(\"IGNORE\")) {\n return \"IGNORE\";\n }\n\n const responseActions = collectActionNamesFromContent(args.responseContent);\n if (responseActions.includes(\"STOP\")) {\n return \"STOP\";\n }\n if (responseActions.includes(\"IGNORE\") && !args.didRespond) {\n return \"IGNORE\";\n }\n\n if (args.shouldRespondDecision) {\n return args.shouldRespondDecision;\n }\n\n return args.didRespond ? \"RESPOND\" : \"IGNORE\";\n}\n\nfunction secondaryContextsEqual(expected: string[], actual: string[]): boolean {\n const normalizedExpected = [\n ...new Set(expected.map((value) => value.trim().toLowerCase())),\n ]\n .filter(Boolean)\n .sort();\n const normalizedActual = [\n ...new Set(actual.map((value) => value.trim().toLowerCase())),\n ]\n .filter(Boolean)\n .sort();\n\n return (\n JSON.stringify(normalizedExpected) === JSON.stringify(normalizedActual)\n );\n}\n\nfunction buildEmptyBucketReport(): RoleplayBucketReport {\n return {\n totalEpisodes: 0,\n decisionMatches: 0,\n routingMatches: 0,\n primaryContextMatches: 0,\n secondaryContextExactMatches: 0,\n actionRelevantEpisodes: 0,\n actionMatches: 0,\n selectedActionMatches: 0,\n executedActionMatches: 0,\n decisionAccuracy: 0,\n routingAccuracy: 0,\n primaryContextAccuracy: 0,\n secondaryContextExactAccuracy: 0,\n actionAccuracy: 0,\n selectedActionAccuracy: 0,\n executedActionAccuracy: 0,\n };\n}\n\nfunction finalizeBucketReport(\n bucket: RoleplayBucketReport,\n): RoleplayBucketReport {\n return {\n ...bucket,\n decisionAccuracy: bucket.decisionMatches / (bucket.totalEpisodes || 1),\n routingAccuracy: bucket.routingMatches / (bucket.totalEpisodes || 1),\n primaryContextAccuracy:\n bucket.primaryContextMatches / (bucket.totalEpisodes || 1),\n secondaryContextExactAccuracy:\n bucket.secondaryContextExactMatches / (bucket.totalEpisodes || 1),\n actionAccuracy: bucket.actionMatches / (bucket.actionRelevantEpisodes || 1),\n selectedActionAccuracy:\n bucket.selectedActionMatches / (bucket.actionRelevantEpisodes || 1),\n executedActionAccuracy:\n bucket.executedActionMatches / (bucket.actionRelevantEpisodes || 1),\n };\n}\n\nfunction updateBucketReport(\n bucket: RoleplayBucketReport,\n execution: RoleplayEpisodeExecution,\n): void {\n bucket.totalEpisodes += 1;\n if (execution.decisionMatch) {\n bucket.decisionMatches += 1;\n }\n if (execution.routingMatch) {\n bucket.routingMatches += 1;\n }\n if (execution.primaryContextMatch) {\n bucket.primaryContextMatches += 1;\n }\n if (execution.secondaryContextExactMatch) {\n bucket.secondaryContextExactMatches += 1;\n }\n if (execution.expectedAction) {\n bucket.actionRelevantEpisodes += 1;\n if (execution.actionMatch) {\n bucket.actionMatches += 1;\n }\n if (execution.selectedActionMatch) {\n bucket.selectedActionMatches += 1;\n }\n if (execution.executedActionMatch) {\n bucket.executedActionMatches += 1;\n }\n }\n}\n\nfunction createDecisionConfusionMatrix(): Record<\n RoleplayDecision,\n Record<RoleplayDecision, number>\n> {\n return {\n RESPOND: { RESPOND: 0, IGNORE: 0, STOP: 0 },\n IGNORE: { RESPOND: 0, IGNORE: 0, STOP: 0 },\n STOP: { RESPOND: 0, IGNORE: 0, STOP: 0 },\n };\n}\n\nfunction resolveMessageRoutingFallback(message: Memory): {\n primaryContext?: string;\n secondaryContexts: string[];\n} {\n const metadata =\n message.content.metadata && typeof message.content.metadata === \"object\"\n ? (message.content.metadata as Record<string, unknown>)\n : {};\n const responseContext =\n metadata.__responseContext && typeof metadata.__responseContext === \"object\"\n ? (metadata.__responseContext as Record<string, unknown>)\n : {};\n\n const secondaryContexts = Array.isArray(responseContext.secondaryContexts)\n ? responseContext.secondaryContexts.filter(\n (value): value is string =>\n typeof value === \"string\" && value.trim().length > 0,\n )\n : parseDelimitedList(String(responseContext.secondaryContexts ?? \"\"));\n\n return {\n primaryContext:\n typeof responseContext.primaryContext === \"string\"\n ? responseContext.primaryContext\n : undefined,\n secondaryContexts,\n };\n}\n\nfunction buildParticipantId(episodeId: string, speaker: string): UUID {\n return deterministicUuid(`roleplay-${episodeId}-${speaker.toLowerCase()}`);\n}\n\nfunction buildRoomIds(episodeId: string): {\n roomId: UUID;\n worldId: UUID;\n messageServerId: UUID;\n} {\n return {\n roomId: deterministicUuid(`roleplay-room-${episodeId}`),\n worldId: deterministicUuid(`roleplay-world-${episodeId}`),\n messageServerId: deterministicUuid(`roleplay-server-${episodeId}`),\n };\n}\n\nasync function seedTurnMemory(\n runtime: RuntimeLike,\n episode: RoleplayEpisode,\n turn: RoleplayTurn,\n roomIds: ReturnType<typeof buildRoomIds>,\n): Promise<void> {\n const entityId =\n turn.role === \"assistant\"\n ? runtime.agentId\n : buildParticipantId(episode.id, turn.speaker);\n\n await runtime.createMemory(\n {\n id: deterministicUuid(`roleplay-seed-${episode.id}-${turn.id}`),\n entityId,\n agentId: runtime.agentId,\n roomId: roomIds.roomId,\n createdAt: Date.now(),\n content: {\n text: turn.content,\n source: episode.platform,\n channelType: GROUP_CHANNEL,\n metadata: {\n entityName: turn.speaker,\n },\n },\n },\n \"messages\",\n );\n}\n\nasync function ensureRoleplayConnections(\n runtime: RuntimeLike,\n episode: RoleplayEpisode,\n roomIds: ReturnType<typeof buildRoomIds>,\n): Promise<void> {\n if (typeof runtime.ensureConnection !== \"function\") {\n return;\n }\n\n const participants = [\n ...new Set(\n episode.turns\n .filter((turn) => turn.role === \"participant\")\n .map((turn) => turn.speaker),\n ),\n ];\n\n for (const speaker of participants) {\n const entityId = buildParticipantId(episode.id, speaker);\n await runtime.ensureConnection({\n entityId,\n roomId: roomIds.roomId,\n worldId: roomIds.worldId,\n userName: speaker,\n source: episode.platform,\n channelId: `roleplay-${episode.id}`,\n type: GROUP_CHANNEL,\n messageServerId: roomIds.messageServerId,\n metadata: {\n ownership: {\n ownerId: entityId,\n },\n },\n });\n }\n}\n\nasync function resolveRuntime(runtime?: AgentRuntime): Promise<RuntimeLike> {\n if (runtime) {\n return runtime as RuntimeLike;\n }\n\n const { bootElizaRuntime } = await import(\"@elizaos/agent\");\n return (await bootElizaRuntime()) as RuntimeLike;\n}\n\nexport async function executeRoleplayEpisode(\n episode: RoleplayEpisode,\n options: ExecuteRoleplayOptions = {},\n): Promise<RoleplayEpisodeExecution> {\n const runtime = await resolveRuntime(options.runtime);\n const roomIds = buildRoomIds(episode.id);\n const logger = getTrajectoryLogger(runtime);\n const turnExecutions: RoleplayTurnExecution[] = [];\n\n await ensureRoleplayConnections(runtime, episode, roomIds);\n\n for (const turn of episode.turns) {\n if (turn.role === \"assistant\") {\n await seedTurnMemory(runtime, episode, turn, roomIds);\n turnExecutions.push({\n turnId: turn.id,\n speaker: turn.speaker,\n role: turn.role,\n isEvaluationTarget: turn.isEvaluationTarget,\n actualSecondaryContexts: [],\n selectedActions: [],\n executedActions: [],\n responseText: turn.content,\n callbackTexts: [],\n warnings: [],\n });\n continue;\n }\n\n if (!turn.isEvaluationTarget && !options.executeAllParticipantTurns) {\n await seedTurnMemory(runtime, episode, turn, roomIds);\n turnExecutions.push({\n turnId: turn.id,\n speaker: turn.speaker,\n role: turn.role,\n isEvaluationTarget: false,\n actualSecondaryContexts: [],\n selectedActions: [],\n executedActions: [],\n responseText: \"\",\n callbackTexts: [],\n warnings: [],\n });\n continue;\n }\n\n const trajectoryId = deterministicUuid(\n `roleplay-trajectory-${episode.id}-${turn.id}`,\n );\n const message: Memory = {\n id: deterministicUuid(`roleplay-message-${episode.id}-${turn.id}`),\n entityId: buildParticipantId(episode.id, turn.speaker),\n roomId: roomIds.roomId,\n agentId: runtime.agentId,\n createdAt: Date.now(),\n content: {\n text: turn.content,\n source: episode.platform,\n channelType: GROUP_CHANNEL,\n metadata: {\n entityName: turn.speaker,\n type: \"message\",\n trajectoryStepId: trajectoryId,\n },\n },\n };\n\n const callbackContents: Content[] = [];\n const result = await runtime.messageService.handleMessage(\n runtime,\n message,\n async (content) => {\n callbackContents.push(content);\n return [];\n },\n options.timeoutMs ? { timeoutDuration: options.timeoutMs } : undefined,\n );\n\n const trajectory = await waitForTrajectoryDetail(logger, trajectoryId);\n const shouldRespondCall = trajectory?.steps\n ?.flatMap((step) => step.llmCalls ?? [])\n .find((call) => normalizeActionName(call.purpose) === \"SHOULD_RESPOND\");\n const routingFromModel = shouldRespondCall?.response\n ? parseRoutingDecision(shouldRespondCall.response)\n : { secondaryContexts: [] as string[] };\n const routingFallback = resolveMessageRoutingFallback(message);\n\n const actualDecision = resolveActualDecision({\n didRespond: result.didRespond,\n callbackContents,\n responseContent: result.responseContent ?? null,\n shouldRespondDecision: routingFromModel.decision,\n });\n const actualPrimaryContext =\n routingFromModel.primaryContext ?? routingFallback.primaryContext;\n const actualSecondaryContexts =\n routingFromModel.secondaryContexts.length > 0\n ? routingFromModel.secondaryContexts\n : routingFallback.secondaryContexts;\n const selectedActions = [\n ...new Set([\n ...collectActionNamesFromContent(result.responseContent ?? null),\n ...callbackContents.flatMap((content) =>\n collectActionNamesFromContent(content),\n ),\n ]),\n ];\n if (!message.id) {\n throw new Error(`Roleplay message ${turn.id} is missing an ID`);\n }\n const executedActions = collectExecutedActionNames(runtime, message.id);\n const callbackTexts = callbackContents\n .map((content) => content.text?.trim() ?? \"\")\n .filter((text) => text.length > 0);\n const responseText =\n result.responseContent?.text?.trim() ??\n callbackTexts[callbackTexts.length - 1] ??\n \"\";\n const warnings: string[] = [];\n\n if (!trajectory) {\n warnings.push(\"trajectory_capture_missing\");\n }\n if (\n turn.isEvaluationTarget &&\n !routingFromModel.primaryContext &&\n !routingFallback.primaryContext\n ) {\n warnings.push(\"context_routing_missing\");\n }\n\n turnExecutions.push({\n turnId: turn.id,\n speaker: turn.speaker,\n role: turn.role,\n isEvaluationTarget: turn.isEvaluationTarget,\n actualDecision,\n actualPrimaryContext,\n actualSecondaryContexts,\n selectedActions,\n executedActions,\n responseText,\n callbackTexts,\n trajectoryId,\n warnings,\n });\n }\n\n const evaluationTurn = turnExecutions.find((turn) => turn.isEvaluationTarget);\n if (!evaluationTurn) {\n throw new Error(\n `Roleplay episode ${episode.id} has no evaluation target turn`,\n );\n }\n\n const actualActions = [\n ...new Set([\n ...evaluationTurn.selectedActions,\n ...evaluationTurn.executedActions,\n ]),\n ];\n const decisionMatch =\n evaluationTurn.actualDecision === episode.expectedDecision;\n const primaryContextMatch =\n (evaluationTurn.actualPrimaryContext ?? \"\").toLowerCase() ===\n episode.primaryContext.toLowerCase();\n const secondaryContextExactMatch = secondaryContextsEqual(\n episode.secondaryContexts,\n evaluationTurn.actualSecondaryContexts,\n );\n const routingMatch = primaryContextMatch && secondaryContextExactMatch;\n const normalizedExpectedAction = episode.expectedAction\n ? normalizeActionName(episode.expectedAction)\n : \"\";\n const selectedActionMatch = episode.expectedAction\n ? evaluationTurn.selectedActions.includes(normalizedExpectedAction)\n : true;\n const executedActionMatch = episode.expectedAction\n ? evaluationTurn.executedActions.includes(normalizedExpectedAction)\n : true;\n const actionMatch = episode.expectedAction\n ? actualActions.includes(normalizedExpectedAction)\n : true;\n const trajectory =\n evaluationTurn.trajectoryId && logger\n ? await waitForTrajectoryDetail(logger, evaluationTurn.trajectoryId)\n : null;\n\n return {\n episodeId: episode.id,\n blueprintId: episode.blueprintId,\n agentName: episode.agentName,\n pattern:\n typeof episode.metadata.pattern === \"string\"\n ? episode.metadata.pattern\n : undefined,\n evaluationTurnId: episode.evaluationTurnId,\n expectedDecision: episode.expectedDecision,\n actualDecision: evaluationTurn.actualDecision ?? \"IGNORE\",\n expectedPrimaryContext: episode.primaryContext,\n actualPrimaryContext: evaluationTurn.actualPrimaryContext,\n expectedSecondaryContexts: episode.secondaryContexts,\n actualSecondaryContexts: evaluationTurn.actualSecondaryContexts,\n expectedAction: episode.expectedAction,\n actualActions,\n selectedActions: evaluationTurn.selectedActions,\n executedActions: evaluationTurn.executedActions,\n decisionMatch,\n primaryContextMatch,\n secondaryContextExactMatch,\n routingMatch,\n actionMatch,\n selectedActionMatch,\n executedActionMatch,\n trajectoryCaptured: Boolean(trajectory),\n responseText: evaluationTurn.responseText,\n callbackTexts: evaluationTurn.callbackTexts,\n warnings: evaluationTurn.warnings,\n turnExecutions,\n trajectory,\n };\n}\n\nexport async function executeRoleplayEpisodes(\n episodes: RoleplayEpisode[],\n options: ExecuteRoleplayOptions = {},\n): Promise<RoleplayEpisodeExecution[]> {\n const runtime = await resolveRuntime(options.runtime);\n const executions: RoleplayEpisodeExecution[] = [];\n\n for (const episode of episodes) {\n executions.push(\n await executeRoleplayEpisode(episode, {\n ...options,\n runtime,\n }),\n );\n }\n\n return executions;\n}\n\nexport function buildRoleplayExecutionReport(\n executions: RoleplayEpisodeExecution[],\n trajectoryDatasetSummary?: TrajectoryTaskDatasetSummary | null,\n): RoleplayExecutionReport {\n const totalEpisodes = executions.length;\n const decisionMatches = executions.filter(\n (execution) => execution.decisionMatch,\n ).length;\n const routingMatches = executions.filter(\n (execution) => execution.routingMatch,\n ).length;\n const primaryContextMatches = executions.filter(\n (execution) => execution.primaryContextMatch,\n ).length;\n const secondaryContextExactMatches = executions.filter(\n (execution) => execution.secondaryContextExactMatch,\n ).length;\n const actionRelevantExecutions = executions.filter(\n (execution) => execution.expectedAction,\n );\n const actionMatches = actionRelevantExecutions.filter(\n (execution) => execution.actionMatch,\n ).length;\n const selectedActionMatches = actionRelevantExecutions.filter(\n (execution) => execution.selectedActionMatch,\n ).length;\n const executedActionMatches = actionRelevantExecutions.filter(\n (execution) => execution.executedActionMatch,\n ).length;\n const trajectoryCaptured = executions.filter(\n (execution) => execution.trajectoryCaptured,\n ).length;\n const decisionConfusionMatrix = createDecisionConfusionMatrix();\n const warningCounts: Record<string, number> = {};\n const byPrimaryContext: Record<string, RoleplayBucketReport> = {};\n const byPattern: Record<string, RoleplayBucketReport> = {};\n\n for (const execution of executions) {\n decisionConfusionMatrix[execution.expectedDecision][\n execution.actualDecision\n ] += 1;\n\n for (const warning of execution.warnings) {\n warningCounts[warning] = (warningCounts[warning] ?? 0) + 1;\n }\n\n const contextKey = execution.expectedPrimaryContext.toLowerCase();\n byPrimaryContext[contextKey] ??= buildEmptyBucketReport();\n updateBucketReport(byPrimaryContext[contextKey], execution);\n\n const patternKey = execution.pattern ?? \"unknown\";\n byPattern[patternKey] ??= buildEmptyBucketReport();\n updateBucketReport(byPattern[patternKey], execution);\n }\n\n return {\n totalEpisodes,\n decisionMatches,\n routingMatches,\n primaryContextMatches,\n secondaryContextExactMatches,\n actionMatches,\n selectedActionMatches,\n executedActionMatches,\n trajectoryCaptured,\n decisionAccuracy: decisionMatches / (totalEpisodes || 1),\n routingAccuracy: routingMatches / (totalEpisodes || 1),\n primaryContextAccuracy: primaryContextMatches / (totalEpisodes || 1),\n secondaryContextExactAccuracy:\n secondaryContextExactMatches / (totalEpisodes || 1),\n actionAccuracy: actionMatches / (actionRelevantExecutions.length || 1),\n selectedActionAccuracy:\n selectedActionMatches / (actionRelevantExecutions.length || 1),\n executedActionAccuracy:\n executedActionMatches / (actionRelevantExecutions.length || 1),\n trajectoryCaptureRate: trajectoryCaptured / (totalEpisodes || 1),\n decisionConfusionMatrix,\n warningCounts,\n byPrimaryContext: Object.fromEntries(\n Object.entries(byPrimaryContext).map(([context, bucket]) => [\n context,\n finalizeBucketReport(bucket),\n ]),\n ),\n byPattern: Object.fromEntries(\n Object.entries(byPattern).map(([pattern, bucket]) => [\n pattern,\n finalizeBucketReport(bucket),\n ]),\n ),\n trajectoryDatasetSummary,\n mismatches: executions\n .filter(\n (execution) =>\n !execution.decisionMatch ||\n !execution.routingMatch ||\n !execution.actionMatch ||\n !execution.selectedActionMatch ||\n !execution.executedActionMatch,\n )\n .map((execution) => ({\n episodeId: execution.episodeId,\n pattern: execution.pattern,\n expectedDecision: execution.expectedDecision,\n actualDecision: execution.actualDecision,\n expectedPrimaryContext: execution.expectedPrimaryContext,\n actualPrimaryContext: execution.actualPrimaryContext,\n expectedAction: execution.expectedAction,\n actualActions: execution.actualActions,\n selectedActions: execution.selectedActions,\n executedActions: execution.executedActions,\n warnings: execution.warnings,\n })),\n };\n}\n\nexport async function exportRoleplayExecutionResults(\n executions: RoleplayEpisodeExecution[],\n outputDir: string,\n): Promise<RoleplayExecutionExportPaths> {\n await mkdir(outputDir, { recursive: true });\n\n const executionsPath = join(outputDir, \"roleplay_execution_results.json\");\n const reportPath = join(outputDir, \"roleplay_execution_report.json\");\n const trajectories = executions\n .map((execution) => execution.trajectory)\n .filter((trajectory): trajectory is Trajectory => Boolean(trajectory));\n\n const trajectoryDataset =\n trajectories.length > 0\n ? await exportTrajectoryTaskDatasets(\n trajectories,\n join(outputDir, \"trajectory-datasets\"),\n )\n : undefined;\n const report = buildRoleplayExecutionReport(\n executions,\n trajectoryDataset?.summary ?? null,\n );\n\n await writeFile(executionsPath, JSON.stringify(executions, null, 2));\n await writeFile(reportPath, JSON.stringify(report, null, 2));\n\n return {\n executionsPath,\n reportPath,\n trajectoryDataset,\n };\n}\n\nexport async function loadRoleplayEpisodesFromPath(\n inputPath: string,\n): Promise<RoleplayEpisode[]> {\n const raw = await readFile(inputPath, \"utf-8\");\n\n if (inputPath.endsWith(\".jsonl\")) {\n return raw\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => JSON.parse(line) as RoleplayManifestLine)\n .map((line) => ({\n id: line.episodeId,\n blueprintId: line.blueprintId,\n agentName: line.agentName,\n platform: \"group-chat\",\n roomType: \"group\" as const,\n primaryContext: line.primaryContext,\n secondaryContexts: line.secondaryContexts,\n expectedDecision: line.expectedDecision,\n expectedAction: line.expectedAction,\n evaluationTurnId: line.evaluationTurnId,\n turns: line.conversation.map((turn) => ({\n id: turn.id,\n role: turn.role,\n speaker: turn.speaker,\n content: turn.content,\n isEvaluationTarget: turn.id === line.evaluationTurnId,\n })),\n metadata: {\n pattern: \"manifest-import\",\n generatedBy: \"manifest\",\n generatedAt: new Date().toISOString(),\n sourceSampleId: line.episodeId,\n },\n }));\n }\n\n const parsed = JSON.parse(raw) as RoleplayEpisode[];\n if (!Array.isArray(parsed)) {\n throw new Error(`Expected an array of roleplay episodes in ${inputPath}`);\n }\n return parsed;\n}\n"],"mappings":"AAAA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,YAAY;AAcrB;AAAA,EACE;AAAA,OAGK;AAiJP,MAAM,gBAAgB;AAEtB,SAAS,kBAAkB,MAAoB;AAC7C,QAAM,MAAM,WAAW,MAAM,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACrE,SAAO;AAAA,IACL,IAAI,MAAM,GAAG,CAAC;AAAA,IACd,IAAI,MAAM,GAAG,EAAE;AAAA,IACf,IAAI,MAAM,IAAI,EAAE;AAAA,IAChB,IAAI,MAAM,IAAI,EAAE;AAAA,IAChB,IAAI,MAAM,IAAI,EAAE;AAAA,EAClB,EAAE,KAAK,GAAG;AACZ;AAMA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,mBAAmB,OAAyB;AACnD,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B;AAAA,IACC,CAAC,OAAO,OAAO,YACb,MAAM,SAAS,KAAK,QAAQ,QAAQ,KAAK,MAAM;AAAA,EACnD;AACJ;AAEA,SAAS,kBAAkB,UAA0B;AACnD,SAAO,SACJ,KAAK,EACL,QAAQ,uBAAuB,EAAE,EACjC,QAAQ,YAAY,EAAE,EACtB,KAAK;AACV;AAEA,SAAS,gBAAgB,UAAkD;AACzE,QAAM,UAAU,kBAAkB,QAAQ;AAC1C,MAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IAC/D,SACD;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,2BACP,QACgC;AAChC,QAAM,SAAS,OAAO;AACtB,MAAI,SAAS,MAAM,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,OAAO,WAAW,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,UACA,WACoB;AACpB,QAAM,YAAY,IAAI,OAAO,UAAU,SAAS,kBAAkB,GAAG,EAAE;AAAA,IACrE;AAAA,EACF;AACA,MAAI,YAAY,CAAC,GAAG;AAClB,UAAM,QAAQ,UAAU,CAAC,EAAE,KAAK;AAChC,WAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,UAI5B;AACA,QAAM,SAAS,gBAAgB,QAAQ;AACvC,QAAM,YAAY,SAAS,2BAA2B,MAAM,IAAI;AAChE,QAAM,YACJ,OAAO,WAAW,WAAW,WACzB,UAAU,SACV,gBAAgB,UAAU,QAAQ;AACxC,QAAM,WAAW,WAAW,YAAY;AACxC,QAAM,WAAW,MAAM,QAAQ,WAAW,QAAQ,IAC9C,UAAU,SAAS;AAAA,IACjB,CAAC,YACC,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,SAAS;AAAA,EAC3D,IACA,CAAC;AACL,QAAM,iBACJ,SAAS,CAAC,KAAK,gBAAgB,UAAU,gBAAgB;AAC3D,QAAM,oBACJ,SAAS,SAAS,IACd,SAAS,MAAM,CAAC,IAChB;AAAA,IACE,gBAAgB,UAAU,mBAAmB,KAAK;AAAA,EACpD;AAEN,SAAO;AAAA,IACL,UACE,aAAa,aAAa,aAAa,YAAY,aAAa,SAC5D,WACA;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,SAAiC;AACjE,QAAM,aAAwB,CAAC;AAC/B,QAAM,OAAO,oBAAI,IAAa;AAE9B,QAAM,OAAO,CAAC,cAA6B;AACzC,QAAI,CAAC,aAAa,KAAK,IAAI,SAAS,GAAG;AACrC;AAAA,IACF;AACA,SAAK,IAAI,SAAS;AAClB,eAAW,KAAK,SAAS;AAAA,EAC3B;AAEA,MAAI,OAAO,QAAQ,sBAAsB,YAAY;AACnD,UAAM,QAAQ,QAAQ,kBAAkB,cAAc;AACtD,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,SAAS,OAAO;AACzB,aAAK,KAAK;AAAA,MACZ;AAAA,IACF,OAAO;AACL,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,eAAe,YAAY;AAC5C,SAAK,QAAQ,WAAW,cAAc,CAAC;AAAA,EACzC;AAEA,SAAO;AACT;AAEA,SAAS,oBACP,SAC6B;AAC7B,aAAW,aAAa,yBAAyB,OAAO,GAAG;AACzD,QACE,aACA,OAAO,cAAc,YACrB,OAAQ,UAAmC,wBACzC,YACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,wBACb,QACA,cAC4B;AAC5B,MAAI,CAAC,QAAQ,qBAAqB;AAChC,WAAO;AAAA,EACT;AAEA,WAAS,UAAU,GAAG,UAAU,IAAI,WAAW,GAAG;AAChD,UAAM,SAAS,MAAM,OAAO,oBAAoB,YAAY;AAC5D,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACxD;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAwB;AACnD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,KAAK,EAAE,YAAY;AAClC;AAEA,SAAS,8BACP,SACU;AACV,MAAI,CAAC,SAAS,SAAS;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,QAAQ,QACZ,IAAI,CAAC,WAAW,oBAAoB,MAAM,CAAC,EAC3C;AAAA,IACC,CAAC,QAAQ,OAAO,YACd,OAAO,SAAS,KAAK,QAAQ,QAAQ,MAAM,MAAM;AAAA,EACrD;AACJ;AAEA,SAAS,2BACP,SACA,WACU;AACV,SAAO,QACJ,iBAAiB,SAAS,EAC1B,IAAI,CAAC,WAAW;AACf,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,SAAS,MAAM,IAAI,SAAS;AAC3C,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,OAAO,eAAe,UAAU;AACzC,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,OAAO,SAAS,OAAO,IAAI,IAAI,OAAO,OAAO;AACnD,WAAO,OAAO,MAAM,eAAe,WAAW,KAAK,aAAa;AAAA,EAClE,CAAC,EACA,IAAI,CAAC,WAAW,oBAAoB,MAAM,CAAC,EAC3C;AAAA,IACC,CAAC,QAAQ,OAAO,YACd,OAAO,SAAS,KAAK,QAAQ,QAAQ,MAAM,MAAM;AAAA,EACrD;AACJ;AAEA,SAAS,sBAAsB,MAKV;AACnB,QAAM,kBAAkB,KAAK,iBAAiB;AAAA,IAAQ,CAAC,YACrD,8BAA8B,OAAO;AAAA,EACvC;AACA,MAAI,gBAAgB,SAAS,MAAM,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,SAAS,QAAQ,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,8BAA8B,KAAK,eAAe;AAC1E,MAAI,gBAAgB,SAAS,MAAM,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,SAAS,QAAQ,KAAK,CAAC,KAAK,YAAY;AAC1D,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,uBAAuB;AAC9B,WAAO,KAAK;AAAA,EACd;AAEA,SAAO,KAAK,aAAa,YAAY;AACvC;AAEA,SAAS,uBAAuB,UAAoB,QAA2B;AAC7E,QAAM,qBAAqB;AAAA,IACzB,GAAG,IAAI,IAAI,SAAS,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,YAAY,CAAC,CAAC;AAAA,EAChE,EACG,OAAO,OAAO,EACd,KAAK;AACR,QAAM,mBAAmB;AAAA,IACvB,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,YAAY,CAAC,CAAC;AAAA,EAC9D,EACG,OAAO,OAAO,EACd,KAAK;AAER,SACE,KAAK,UAAU,kBAAkB,MAAM,KAAK,UAAU,gBAAgB;AAE1E;AAEA,SAAS,yBAA+C;AACtD,SAAO;AAAA,IACL,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,8BAA8B;AAAA,IAC9B,wBAAwB;AAAA,IACxB,eAAe;AAAA,IACf,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,wBAAwB;AAAA,IACxB,+BAA+B;AAAA,IAC/B,gBAAgB;AAAA,IAChB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,EAC1B;AACF;AAEA,SAAS,qBACP,QACsB;AACtB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,kBAAkB,OAAO,mBAAmB,OAAO,iBAAiB;AAAA,IACpE,iBAAiB,OAAO,kBAAkB,OAAO,iBAAiB;AAAA,IAClE,wBACE,OAAO,yBAAyB,OAAO,iBAAiB;AAAA,IAC1D,+BACE,OAAO,gCAAgC,OAAO,iBAAiB;AAAA,IACjE,gBAAgB,OAAO,iBAAiB,OAAO,0BAA0B;AAAA,IACzE,wBACE,OAAO,yBAAyB,OAAO,0BAA0B;AAAA,IACnE,wBACE,OAAO,yBAAyB,OAAO,0BAA0B;AAAA,EACrE;AACF;AAEA,SAAS,mBACP,QACA,WACM;AACN,SAAO,iBAAiB;AACxB,MAAI,UAAU,eAAe;AAC3B,WAAO,mBAAmB;AAAA,EAC5B;AACA,MAAI,UAAU,cAAc;AAC1B,WAAO,kBAAkB;AAAA,EAC3B;AACA,MAAI,UAAU,qBAAqB;AACjC,WAAO,yBAAyB;AAAA,EAClC;AACA,MAAI,UAAU,4BAA4B;AACxC,WAAO,gCAAgC;AAAA,EACzC;AACA,MAAI,UAAU,gBAAgB;AAC5B,WAAO,0BAA0B;AACjC,QAAI,UAAU,aAAa;AACzB,aAAO,iBAAiB;AAAA,IAC1B;AACA,QAAI,UAAU,qBAAqB;AACjC,aAAO,yBAAyB;AAAA,IAClC;AACA,QAAI,UAAU,qBAAqB;AACjC,aAAO,yBAAyB;AAAA,IAClC;AAAA,EACF;AACF;AAEA,SAAS,gCAGP;AACA,SAAO;AAAA,IACL,SAAS,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA,IAC1C,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA,IACzC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,EAAE;AAAA,EACzC;AACF;AAEA,SAAS,8BAA8B,SAGrC;AACA,QAAM,WACJ,QAAQ,QAAQ,YAAY,OAAO,QAAQ,QAAQ,aAAa,WAC3D,QAAQ,QAAQ,WACjB,CAAC;AACP,QAAM,kBACJ,SAAS,qBAAqB,OAAO,SAAS,sBAAsB,WAC/D,SAAS,oBACV,CAAC;AAEP,QAAM,oBAAoB,MAAM,QAAQ,gBAAgB,iBAAiB,IACrE,gBAAgB,kBAAkB;AAAA,IAChC,CAAC,UACC,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAAA,EACvD,IACA,mBAAmB,OAAO,gBAAgB,qBAAqB,EAAE,CAAC;AAEtE,SAAO;AAAA,IACL,gBACE,OAAO,gBAAgB,mBAAmB,WACtC,gBAAgB,iBAChB;AAAA,IACN;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,WAAmB,SAAuB;AACpE,SAAO,kBAAkB,YAAY,SAAS,IAAI,QAAQ,YAAY,CAAC,EAAE;AAC3E;AAEA,SAAS,aAAa,WAIpB;AACA,SAAO;AAAA,IACL,QAAQ,kBAAkB,iBAAiB,SAAS,EAAE;AAAA,IACtD,SAAS,kBAAkB,kBAAkB,SAAS,EAAE;AAAA,IACxD,iBAAiB,kBAAkB,mBAAmB,SAAS,EAAE;AAAA,EACnE;AACF;AAEA,eAAe,eACb,SACA,SACA,MACA,SACe;AACf,QAAM,WACJ,KAAK,SAAS,cACV,QAAQ,UACR,mBAAmB,QAAQ,IAAI,KAAK,OAAO;AAEjD,QAAM,QAAQ;AAAA,IACZ;AAAA,MACE,IAAI,kBAAkB,iBAAiB,QAAQ,EAAE,IAAI,KAAK,EAAE,EAAE;AAAA,MAC9D;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,WAAW,KAAK,IAAI;AAAA,MACpB,SAAS;AAAA,QACP,MAAM,KAAK;AAAA,QACX,QAAQ,QAAQ;AAAA,QAChB,aAAa;AAAA,QACb,UAAU;AAAA,UACR,YAAY,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,0BACb,SACA,SACA,SACe;AACf,MAAI,OAAO,QAAQ,qBAAqB,YAAY;AAClD;AAAA,EACF;AAEA,QAAM,eAAe;AAAA,IACnB,GAAG,IAAI;AAAA,MACL,QAAQ,MACL,OAAO,CAAC,SAAS,KAAK,SAAS,aAAa,EAC5C,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,IAC/B;AAAA,EACF;AAEA,aAAW,WAAW,cAAc;AAClC,UAAM,WAAW,mBAAmB,QAAQ,IAAI,OAAO;AACvD,UAAM,QAAQ,iBAAiB;AAAA,MAC7B;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,UAAU;AAAA,MACV,QAAQ,QAAQ;AAAA,MAChB,WAAW,YAAY,QAAQ,EAAE;AAAA,MACjC,MAAM;AAAA,MACN,iBAAiB,QAAQ;AAAA,MACzB,UAAU;AAAA,QACR,WAAW;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAe,eAAe,SAA8C;AAC1E,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,gBAAgB;AAC1D,SAAQ,MAAM,iBAAiB;AACjC;AAEA,eAAsB,uBACpB,SACA,UAAkC,CAAC,GACA;AACnC,QAAM,UAAU,MAAM,eAAe,QAAQ,OAAO;AACpD,QAAM,UAAU,aAAa,QAAQ,EAAE;AACvC,QAAM,SAAS,oBAAoB,OAAO;AAC1C,QAAM,iBAA0C,CAAC;AAEjD,QAAM,0BAA0B,SAAS,SAAS,OAAO;AAEzD,aAAW,QAAQ,QAAQ,OAAO;AAChC,QAAI,KAAK,SAAS,aAAa;AAC7B,YAAM,eAAe,SAAS,SAAS,MAAM,OAAO;AACpD,qBAAe,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,MAAM,KAAK;AAAA,QACX,oBAAoB,KAAK;AAAA,QACzB,yBAAyB,CAAC;AAAA,QAC1B,iBAAiB,CAAC;AAAA,QAClB,iBAAiB,CAAC;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,eAAe,CAAC;AAAA,QAChB,UAAU,CAAC;AAAA,MACb,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,sBAAsB,CAAC,QAAQ,4BAA4B;AACnE,YAAM,eAAe,SAAS,SAAS,MAAM,OAAO;AACpD,qBAAe,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,MAAM,KAAK;AAAA,QACX,oBAAoB;AAAA,QACpB,yBAAyB,CAAC;AAAA,QAC1B,iBAAiB,CAAC;AAAA,QAClB,iBAAiB,CAAC;AAAA,QAClB,cAAc;AAAA,QACd,eAAe,CAAC;AAAA,QAChB,UAAU,CAAC;AAAA,MACb,CAAC;AACD;AAAA,IACF;AAEA,UAAM,eAAe;AAAA,MACnB,uBAAuB,QAAQ,EAAE,IAAI,KAAK,EAAE;AAAA,IAC9C;AACA,UAAM,UAAkB;AAAA,MACtB,IAAI,kBAAkB,oBAAoB,QAAQ,EAAE,IAAI,KAAK,EAAE,EAAE;AAAA,MACjE,UAAU,mBAAmB,QAAQ,IAAI,KAAK,OAAO;AAAA,MACrD,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,WAAW,KAAK,IAAI;AAAA,MACpB,SAAS;AAAA,QACP,MAAM,KAAK;AAAA,QACX,QAAQ,QAAQ;AAAA,QAChB,aAAa;AAAA,QACb,UAAU;AAAA,UACR,YAAY,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,mBAA8B,CAAC;AACrC,UAAM,SAAS,MAAM,QAAQ,eAAe;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,OAAO,YAAY;AACjB,yBAAiB,KAAK,OAAO;AAC7B,eAAO,CAAC;AAAA,MACV;AAAA,MACA,QAAQ,YAAY,EAAE,iBAAiB,QAAQ,UAAU,IAAI;AAAA,IAC/D;AAEA,UAAMA,cAAa,MAAM,wBAAwB,QAAQ,YAAY;AACrE,UAAM,oBAAoBA,aAAY,OAClC,QAAQ,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,EACtC,KAAK,CAAC,SAAS,oBAAoB,KAAK,OAAO,MAAM,gBAAgB;AACxE,UAAM,mBAAmB,mBAAmB,WACxC,qBAAqB,kBAAkB,QAAQ,IAC/C,EAAE,mBAAmB,CAAC,EAAc;AACxC,UAAM,kBAAkB,8BAA8B,OAAO;AAE7D,UAAM,iBAAiB,sBAAsB;AAAA,MAC3C,YAAY,OAAO;AAAA,MACnB;AAAA,MACA,iBAAiB,OAAO,mBAAmB;AAAA,MAC3C,uBAAuB,iBAAiB;AAAA,IAC1C,CAAC;AACD,UAAM,uBACJ,iBAAiB,kBAAkB,gBAAgB;AACrD,UAAM,0BACJ,iBAAiB,kBAAkB,SAAS,IACxC,iBAAiB,oBACjB,gBAAgB;AACtB,UAAM,kBAAkB;AAAA,MACtB,GAAG,oBAAI,IAAI;AAAA,QACT,GAAG,8BAA8B,OAAO,mBAAmB,IAAI;AAAA,QAC/D,GAAG,iBAAiB;AAAA,UAAQ,CAAC,YAC3B,8BAA8B,OAAO;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,CAAC,QAAQ,IAAI;AACf,YAAM,IAAI,MAAM,oBAAoB,KAAK,EAAE,mBAAmB;AAAA,IAChE;AACA,UAAM,kBAAkB,2BAA2B,SAAS,QAAQ,EAAE;AACtE,UAAM,gBAAgB,iBACnB,IAAI,CAAC,YAAY,QAAQ,MAAM,KAAK,KAAK,EAAE,EAC3C,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,UAAM,eACJ,OAAO,iBAAiB,MAAM,KAAK,KACnC,cAAc,cAAc,SAAS,CAAC,KACtC;AACF,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAACA,aAAY;AACf,eAAS,KAAK,4BAA4B;AAAA,IAC5C;AACA,QACE,KAAK,sBACL,CAAC,iBAAiB,kBAClB,CAAC,gBAAgB,gBACjB;AACA,eAAS,KAAK,yBAAyB;AAAA,IACzC;AAEA,mBAAe,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,oBAAoB,KAAK;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,eAAe,KAAK,CAAC,SAAS,KAAK,kBAAkB;AAC5E,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI;AAAA,MACR,oBAAoB,QAAQ,EAAE;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB,GAAG,oBAAI,IAAI;AAAA,MACT,GAAG,eAAe;AAAA,MAClB,GAAG,eAAe;AAAA,IACpB,CAAC;AAAA,EACH;AACA,QAAM,gBACJ,eAAe,mBAAmB,QAAQ;AAC5C,QAAM,uBACH,eAAe,wBAAwB,IAAI,YAAY,MACxD,QAAQ,eAAe,YAAY;AACrC,QAAM,6BAA6B;AAAA,IACjC,QAAQ;AAAA,IACR,eAAe;AAAA,EACjB;AACA,QAAM,eAAe,uBAAuB;AAC5C,QAAM,2BAA2B,QAAQ,iBACrC,oBAAoB,QAAQ,cAAc,IAC1C;AACJ,QAAM,sBAAsB,QAAQ,iBAChC,eAAe,gBAAgB,SAAS,wBAAwB,IAChE;AACJ,QAAM,sBAAsB,QAAQ,iBAChC,eAAe,gBAAgB,SAAS,wBAAwB,IAChE;AACJ,QAAM,cAAc,QAAQ,iBACxB,cAAc,SAAS,wBAAwB,IAC/C;AACJ,QAAM,aACJ,eAAe,gBAAgB,SAC3B,MAAM,wBAAwB,QAAQ,eAAe,YAAY,IACjE;AAEN,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,SACE,OAAO,QAAQ,SAAS,YAAY,WAChC,QAAQ,SAAS,UACjB;AAAA,IACN,kBAAkB,QAAQ;AAAA,IAC1B,kBAAkB,QAAQ;AAAA,IAC1B,gBAAgB,eAAe,kBAAkB;AAAA,IACjD,wBAAwB,QAAQ;AAAA,IAChC,sBAAsB,eAAe;AAAA,IACrC,2BAA2B,QAAQ;AAAA,IACnC,yBAAyB,eAAe;AAAA,IACxC,gBAAgB,QAAQ;AAAA,IACxB;AAAA,IACA,iBAAiB,eAAe;AAAA,IAChC,iBAAiB,eAAe;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,QAAQ,UAAU;AAAA,IACtC,cAAc,eAAe;AAAA,IAC7B,eAAe,eAAe;AAAA,IAC9B,UAAU,eAAe;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,UACA,UAAkC,CAAC,GACE;AACrC,QAAM,UAAU,MAAM,eAAe,QAAQ,OAAO;AACpD,QAAM,aAAyC,CAAC;AAEhD,aAAW,WAAW,UAAU;AAC9B,eAAW;AAAA,MACT,MAAM,uBAAuB,SAAS;AAAA,QACpC,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,6BACd,YACA,0BACyB;AACzB,QAAM,gBAAgB,WAAW;AACjC,QAAM,kBAAkB,WAAW;AAAA,IACjC,CAAC,cAAc,UAAU;AAAA,EAC3B,EAAE;AACF,QAAM,iBAAiB,WAAW;AAAA,IAChC,CAAC,cAAc,UAAU;AAAA,EAC3B,EAAE;AACF,QAAM,wBAAwB,WAAW;AAAA,IACvC,CAAC,cAAc,UAAU;AAAA,EAC3B,EAAE;AACF,QAAM,+BAA+B,WAAW;AAAA,IAC9C,CAAC,cAAc,UAAU;AAAA,EAC3B,EAAE;AACF,QAAM,2BAA2B,WAAW;AAAA,IAC1C,CAAC,cAAc,UAAU;AAAA,EAC3B;AACA,QAAM,gBAAgB,yBAAyB;AAAA,IAC7C,CAAC,cAAc,UAAU;AAAA,EAC3B,EAAE;AACF,QAAM,wBAAwB,yBAAyB;AAAA,IACrD,CAAC,cAAc,UAAU;AAAA,EAC3B,EAAE;AACF,QAAM,wBAAwB,yBAAyB;AAAA,IACrD,CAAC,cAAc,UAAU;AAAA,EAC3B,EAAE;AACF,QAAM,qBAAqB,WAAW;AAAA,IACpC,CAAC,cAAc,UAAU;AAAA,EAC3B,EAAE;AACF,QAAM,0BAA0B,8BAA8B;AAC9D,QAAM,gBAAwC,CAAC;AAC/C,QAAM,mBAAyD,CAAC;AAChE,QAAM,YAAkD,CAAC;AAEzD,aAAW,aAAa,YAAY;AAClC,4BAAwB,UAAU,gBAAgB,EAChD,UAAU,cACZ,KAAK;AAEL,eAAW,WAAW,UAAU,UAAU;AACxC,oBAAc,OAAO,KAAK,cAAc,OAAO,KAAK,KAAK;AAAA,IAC3D;AAEA,UAAM,aAAa,UAAU,uBAAuB,YAAY;AAChE,qBAAiB,UAAU,MAAM,uBAAuB;AACxD,uBAAmB,iBAAiB,UAAU,GAAG,SAAS;AAE1D,UAAM,aAAa,UAAU,WAAW;AACxC,cAAU,UAAU,MAAM,uBAAuB;AACjD,uBAAmB,UAAU,UAAU,GAAG,SAAS;AAAA,EACrD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,mBAAmB,iBAAiB;AAAA,IACtD,iBAAiB,kBAAkB,iBAAiB;AAAA,IACpD,wBAAwB,yBAAyB,iBAAiB;AAAA,IAClE,+BACE,gCAAgC,iBAAiB;AAAA,IACnD,gBAAgB,iBAAiB,yBAAyB,UAAU;AAAA,IACpE,wBACE,yBAAyB,yBAAyB,UAAU;AAAA,IAC9D,wBACE,yBAAyB,yBAAyB,UAAU;AAAA,IAC9D,uBAAuB,sBAAsB,iBAAiB;AAAA,IAC9D;AAAA,IACA;AAAA,IACA,kBAAkB,OAAO;AAAA,MACvB,OAAO,QAAQ,gBAAgB,EAAE,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM;AAAA,QAC1D;AAAA,QACA,qBAAqB,MAAM;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,IACA,WAAW,OAAO;AAAA,MAChB,OAAO,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM;AAAA,QACnD;AAAA,QACA,qBAAqB,MAAM;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,IACA;AAAA,IACA,YAAY,WACT;AAAA,MACC,CAAC,cACC,CAAC,UAAU,iBACX,CAAC,UAAU,gBACX,CAAC,UAAU,eACX,CAAC,UAAU,uBACX,CAAC,UAAU;AAAA,IACf,EACC,IAAI,CAAC,eAAe;AAAA,MACnB,WAAW,UAAU;AAAA,MACrB,SAAS,UAAU;AAAA,MACnB,kBAAkB,UAAU;AAAA,MAC5B,gBAAgB,UAAU;AAAA,MAC1B,wBAAwB,UAAU;AAAA,MAClC,sBAAsB,UAAU;AAAA,MAChC,gBAAgB,UAAU;AAAA,MAC1B,eAAe,UAAU;AAAA,MACzB,iBAAiB,UAAU;AAAA,MAC3B,iBAAiB,UAAU;AAAA,MAC3B,UAAU,UAAU;AAAA,IACtB,EAAE;AAAA,EACN;AACF;AAEA,eAAsB,+BACpB,YACA,WACuC;AACvC,QAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,QAAM,iBAAiB,KAAK,WAAW,iCAAiC;AACxE,QAAM,aAAa,KAAK,WAAW,gCAAgC;AACnE,QAAM,eAAe,WAClB,IAAI,CAAC,cAAc,UAAU,UAAU,EACvC,OAAO,CAAC,eAAyC,QAAQ,UAAU,CAAC;AAEvE,QAAM,oBACJ,aAAa,SAAS,IAClB,MAAM;AAAA,IACJ;AAAA,IACA,KAAK,WAAW,qBAAqB;AAAA,EACvC,IACA;AACN,QAAM,SAAS;AAAA,IACb;AAAA,IACA,mBAAmB,WAAW;AAAA,EAChC;AAEA,QAAM,UAAU,gBAAgB,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AACnE,QAAM,UAAU,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAE3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,6BACpB,WAC4B;AAC5B,QAAM,MAAM,MAAM,SAAS,WAAW,OAAO;AAE7C,MAAI,UAAU,SAAS,QAAQ,GAAG;AAChC,WAAO,IACJ,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAyB,EACtD,IAAI,CAAC,UAAU;AAAA,MACd,IAAI,KAAK;AAAA,MACT,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB,KAAK;AAAA,MACrB,mBAAmB,KAAK;AAAA,MACxB,kBAAkB,KAAK;AAAA,MACvB,gBAAgB,KAAK;AAAA,MACrB,kBAAkB,KAAK;AAAA,MACvB,OAAO,KAAK,aAAa,IAAI,CAAC,UAAU;AAAA,QACtC,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,oBAAoB,KAAK,OAAO,KAAK;AAAA,MACvC,EAAE;AAAA,MACF,UAAU;AAAA,QACR,SAAS;AAAA,QACT,aAAa;AAAA,QACb,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,gBAAgB,KAAK;AAAA,MACvB;AAAA,IACF,EAAE;AAAA,EACN;AAEA,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,IAAI,MAAM,6CAA6C,SAAS,EAAE;AAAA,EAC1E;AACA,SAAO;AACT;","names":["trajectory"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AgentContext } from "./context-types.js";
|
|
2
|
+
import type { TrainingSample } from "./dataset-generator.js";
|
|
3
|
+
export interface RoleplayTurn {
|
|
4
|
+
id: string;
|
|
5
|
+
role: "participant" | "assistant";
|
|
6
|
+
speaker: string;
|
|
7
|
+
content: string;
|
|
8
|
+
isEvaluationTarget: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface RoleplayEpisode {
|
|
11
|
+
id: string;
|
|
12
|
+
blueprintId: string;
|
|
13
|
+
agentName: string;
|
|
14
|
+
platform: string;
|
|
15
|
+
roomType: "group";
|
|
16
|
+
primaryContext: AgentContext;
|
|
17
|
+
secondaryContexts: AgentContext[];
|
|
18
|
+
expectedDecision: "RESPOND" | "IGNORE" | "STOP";
|
|
19
|
+
expectedAction?: string;
|
|
20
|
+
evaluationTurnId: string;
|
|
21
|
+
turns: RoleplayTurn[];
|
|
22
|
+
metadata: {
|
|
23
|
+
pattern: string;
|
|
24
|
+
generatedBy: string;
|
|
25
|
+
generatedAt: string;
|
|
26
|
+
sourceSampleId: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface RoleplayManifestLine {
|
|
30
|
+
episodeId: string;
|
|
31
|
+
blueprintId: string;
|
|
32
|
+
agentName: string;
|
|
33
|
+
evaluationTurnId: string;
|
|
34
|
+
expectedDecision: "RESPOND" | "IGNORE" | "STOP";
|
|
35
|
+
primaryContext: AgentContext;
|
|
36
|
+
secondaryContexts: AgentContext[];
|
|
37
|
+
expectedAction?: string;
|
|
38
|
+
conversation: Array<{
|
|
39
|
+
id: string;
|
|
40
|
+
role: "participant" | "assistant";
|
|
41
|
+
speaker: string;
|
|
42
|
+
content: string;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
export interface RoleplayExportPaths {
|
|
46
|
+
episodesPath: string;
|
|
47
|
+
manifestPath: string;
|
|
48
|
+
tuningPath: string;
|
|
49
|
+
}
|
|
50
|
+
export declare function buildRoleplayEpisode(sample: TrainingSample): RoleplayEpisode;
|
|
51
|
+
export declare function buildRoleplayEpisodes(samples: TrainingSample[]): RoleplayEpisode[];
|
|
52
|
+
export declare function toRoleplayManifestLine(episode: RoleplayEpisode): RoleplayManifestLine;
|
|
53
|
+
export declare function exportRoleplayEpisodes(episodes: RoleplayEpisode[], samples: TrainingSample[], outputDir: string): Promise<RoleplayExportPaths>;
|
|
54
|
+
//# sourceMappingURL=roleplay-trajectories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roleplay-trajectories.d.ts","sourceRoot":"","sources":["../../src/core/roleplay-trajectories.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAEV,cAAc,EACf,MAAM,wBAAwB,CAAC;AAGhC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,WAAW,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,YAAY,CAAC;IAC7B,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,gBAAgB,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAChD,cAAc,EAAE,YAAY,CAAC;IAC7B,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,aAAa,GAAG,WAAW,CAAC;QAClC,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAgC5E;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EAAE,GACxB,eAAe,EAAE,CAEnB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,GACvB,oBAAoB,CAiBtB;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,eAAe,EAAE,EAC3B,OAAO,EAAE,cAAc,EAAE,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CA0B9B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { toElizaNativeFormat } from "./dataset-generator.js";
|
|
5
|
+
function buildRoleplayEpisode(sample) {
|
|
6
|
+
const turns = sample.messages.map((message, index) => {
|
|
7
|
+
const turnId = `turn-${String(index + 1).padStart(3, "0")}`;
|
|
8
|
+
const isAssistant = message.role === "assistant";
|
|
9
|
+
return {
|
|
10
|
+
id: turnId,
|
|
11
|
+
role: isAssistant ? "assistant" : "participant",
|
|
12
|
+
speaker: isAssistant ? sample.agentName : message.name ?? "participant",
|
|
13
|
+
content: message.content,
|
|
14
|
+
isEvaluationTarget: index === sample.messages.length - 1
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
id: randomUUID(),
|
|
19
|
+
blueprintId: sample.blueprintId,
|
|
20
|
+
agentName: sample.agentName,
|
|
21
|
+
platform: sample.metadata.platform,
|
|
22
|
+
roomType: "group",
|
|
23
|
+
primaryContext: sample.expectedOutput.primaryContext,
|
|
24
|
+
secondaryContexts: sample.expectedOutput.secondaryContexts,
|
|
25
|
+
expectedDecision: sample.expectedOutput.decision,
|
|
26
|
+
expectedAction: sample.expectedOutput.expectedAction,
|
|
27
|
+
evaluationTurnId: turns[turns.length - 1]?.id ?? "turn-001",
|
|
28
|
+
turns,
|
|
29
|
+
metadata: {
|
|
30
|
+
pattern: sample.metadata.pattern,
|
|
31
|
+
generatedBy: sample.metadata.generatedBy,
|
|
32
|
+
generatedAt: sample.metadata.generatedAt,
|
|
33
|
+
sourceSampleId: sample.id
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function buildRoleplayEpisodes(samples) {
|
|
38
|
+
return samples.map(buildRoleplayEpisode);
|
|
39
|
+
}
|
|
40
|
+
function toRoleplayManifestLine(episode) {
|
|
41
|
+
return {
|
|
42
|
+
episodeId: episode.id,
|
|
43
|
+
blueprintId: episode.blueprintId,
|
|
44
|
+
agentName: episode.agentName,
|
|
45
|
+
evaluationTurnId: episode.evaluationTurnId,
|
|
46
|
+
expectedDecision: episode.expectedDecision,
|
|
47
|
+
primaryContext: episode.primaryContext,
|
|
48
|
+
secondaryContexts: episode.secondaryContexts,
|
|
49
|
+
expectedAction: episode.expectedAction,
|
|
50
|
+
conversation: episode.turns.map((turn) => ({
|
|
51
|
+
id: turn.id,
|
|
52
|
+
role: turn.role,
|
|
53
|
+
speaker: turn.speaker,
|
|
54
|
+
content: turn.content
|
|
55
|
+
}))
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function exportRoleplayEpisodes(episodes, samples, outputDir) {
|
|
59
|
+
await mkdir(outputDir, { recursive: true });
|
|
60
|
+
const episodesPath = join(outputDir, "roleplay_episodes.json");
|
|
61
|
+
const manifestPath = join(outputDir, "roleplay_manifest.jsonl");
|
|
62
|
+
const tuningPath = join(outputDir, "roleplay_tuning_examples.jsonl");
|
|
63
|
+
await writeFile(episodesPath, JSON.stringify(episodes, null, 2));
|
|
64
|
+
const manifestLines = episodes.map(
|
|
65
|
+
(episode) => JSON.stringify(toRoleplayManifestLine(episode))
|
|
66
|
+
);
|
|
67
|
+
await writeFile(manifestPath, `${manifestLines.join("\n")}
|
|
68
|
+
`);
|
|
69
|
+
const tuningLines = samples.map(
|
|
70
|
+
(sample) => JSON.stringify(
|
|
71
|
+
toElizaNativeFormat(sample, true)
|
|
72
|
+
)
|
|
73
|
+
);
|
|
74
|
+
await writeFile(tuningPath, `${tuningLines.join("\n")}
|
|
75
|
+
`);
|
|
76
|
+
return {
|
|
77
|
+
episodesPath,
|
|
78
|
+
manifestPath,
|
|
79
|
+
tuningPath
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
buildRoleplayEpisode,
|
|
84
|
+
buildRoleplayEpisodes,
|
|
85
|
+
exportRoleplayEpisodes,
|
|
86
|
+
toRoleplayManifestLine
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=roleplay-trajectories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/roleplay-trajectories.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { AgentContext } from \"./context-types.js\";\nimport type {\n ElizaNativeTrainingExample,\n TrainingSample,\n} from \"./dataset-generator.js\";\nimport { toElizaNativeFormat } from \"./dataset-generator.js\";\n\nexport interface RoleplayTurn {\n id: string;\n role: \"participant\" | \"assistant\";\n speaker: string;\n content: string;\n isEvaluationTarget: boolean;\n}\n\nexport interface RoleplayEpisode {\n id: string;\n blueprintId: string;\n agentName: string;\n platform: string;\n roomType: \"group\";\n primaryContext: AgentContext;\n secondaryContexts: AgentContext[];\n expectedDecision: \"RESPOND\" | \"IGNORE\" | \"STOP\";\n expectedAction?: string;\n evaluationTurnId: string;\n turns: RoleplayTurn[];\n metadata: {\n pattern: string;\n generatedBy: string;\n generatedAt: string;\n sourceSampleId: string;\n };\n}\n\nexport interface RoleplayManifestLine {\n episodeId: string;\n blueprintId: string;\n agentName: string;\n evaluationTurnId: string;\n expectedDecision: \"RESPOND\" | \"IGNORE\" | \"STOP\";\n primaryContext: AgentContext;\n secondaryContexts: AgentContext[];\n expectedAction?: string;\n conversation: Array<{\n id: string;\n role: \"participant\" | \"assistant\";\n speaker: string;\n content: string;\n }>;\n}\n\nexport interface RoleplayExportPaths {\n episodesPath: string;\n manifestPath: string;\n tuningPath: string;\n}\n\nexport function buildRoleplayEpisode(sample: TrainingSample): RoleplayEpisode {\n const turns: RoleplayTurn[] = sample.messages.map((message, index) => {\n const turnId = `turn-${String(index + 1).padStart(3, \"0\")}`;\n const isAssistant = message.role === \"assistant\";\n return {\n id: turnId,\n role: isAssistant ? \"assistant\" : \"participant\",\n speaker: isAssistant ? sample.agentName : (message.name ?? \"participant\"),\n content: message.content,\n isEvaluationTarget: index === sample.messages.length - 1,\n };\n });\n\n return {\n id: randomUUID(),\n blueprintId: sample.blueprintId,\n agentName: sample.agentName,\n platform: sample.metadata.platform,\n roomType: \"group\",\n primaryContext: sample.expectedOutput.primaryContext,\n secondaryContexts: sample.expectedOutput.secondaryContexts,\n expectedDecision: sample.expectedOutput.decision,\n expectedAction: sample.expectedOutput.expectedAction,\n evaluationTurnId: turns[turns.length - 1]?.id ?? \"turn-001\",\n turns,\n metadata: {\n pattern: sample.metadata.pattern,\n generatedBy: sample.metadata.generatedBy,\n generatedAt: sample.metadata.generatedAt,\n sourceSampleId: sample.id,\n },\n };\n}\n\nexport function buildRoleplayEpisodes(\n samples: TrainingSample[],\n): RoleplayEpisode[] {\n return samples.map(buildRoleplayEpisode);\n}\n\nexport function toRoleplayManifestLine(\n episode: RoleplayEpisode,\n): RoleplayManifestLine {\n return {\n episodeId: episode.id,\n blueprintId: episode.blueprintId,\n agentName: episode.agentName,\n evaluationTurnId: episode.evaluationTurnId,\n expectedDecision: episode.expectedDecision,\n primaryContext: episode.primaryContext,\n secondaryContexts: episode.secondaryContexts,\n expectedAction: episode.expectedAction,\n conversation: episode.turns.map((turn) => ({\n id: turn.id,\n role: turn.role,\n speaker: turn.speaker,\n content: turn.content,\n })),\n };\n}\n\nexport async function exportRoleplayEpisodes(\n episodes: RoleplayEpisode[],\n samples: TrainingSample[],\n outputDir: string,\n): Promise<RoleplayExportPaths> {\n await mkdir(outputDir, { recursive: true });\n\n const episodesPath = join(outputDir, \"roleplay_episodes.json\");\n const manifestPath = join(outputDir, \"roleplay_manifest.jsonl\");\n const tuningPath = join(outputDir, \"roleplay_tuning_examples.jsonl\");\n\n await writeFile(episodesPath, JSON.stringify(episodes, null, 2));\n\n const manifestLines = episodes.map((episode) =>\n JSON.stringify(toRoleplayManifestLine(episode)),\n );\n await writeFile(manifestPath, `${manifestLines.join(\"\\n\")}\\n`);\n\n const tuningLines = samples.map((sample) =>\n JSON.stringify(\n toElizaNativeFormat(sample, true) as ElizaNativeTrainingExample,\n ),\n );\n await writeFile(tuningPath, `${tuningLines.join(\"\\n\")}\\n`);\n\n return {\n episodesPath,\n manifestPath,\n tuningPath,\n };\n}\n"],"mappings":"AAAA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,iBAAiB;AACjC,SAAS,YAAY;AAMrB,SAAS,2BAA2B;AAqD7B,SAAS,qBAAqB,QAAyC;AAC5E,QAAM,QAAwB,OAAO,SAAS,IAAI,CAAC,SAAS,UAAU;AACpE,UAAM,SAAS,QAAQ,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AACzD,UAAM,cAAc,QAAQ,SAAS;AACrC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc,cAAc;AAAA,MAClC,SAAS,cAAc,OAAO,YAAa,QAAQ,QAAQ;AAAA,MAC3D,SAAS,QAAQ;AAAA,MACjB,oBAAoB,UAAU,OAAO,SAAS,SAAS;AAAA,IACzD;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO,SAAS;AAAA,IAC1B,UAAU;AAAA,IACV,gBAAgB,OAAO,eAAe;AAAA,IACtC,mBAAmB,OAAO,eAAe;AAAA,IACzC,kBAAkB,OAAO,eAAe;AAAA,IACxC,gBAAgB,OAAO,eAAe;AAAA,IACtC,kBAAkB,MAAM,MAAM,SAAS,CAAC,GAAG,MAAM;AAAA,IACjD;AAAA,IACA,UAAU;AAAA,MACR,SAAS,OAAO,SAAS;AAAA,MACzB,aAAa,OAAO,SAAS;AAAA,MAC7B,aAAa,OAAO,SAAS;AAAA,MAC7B,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF;AACF;AAEO,SAAS,sBACd,SACmB;AACnB,SAAO,QAAQ,IAAI,oBAAoB;AACzC;AAEO,SAAS,uBACd,SACsB;AACtB,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,kBAAkB,QAAQ;AAAA,IAC1B,kBAAkB,QAAQ;AAAA,IAC1B,gBAAgB,QAAQ;AAAA,IACxB,mBAAmB,QAAQ;AAAA,IAC3B,gBAAgB,QAAQ;AAAA,IACxB,cAAc,QAAQ,MAAM,IAAI,CAAC,UAAU;AAAA,MACzC,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IAChB,EAAE;AAAA,EACJ;AACF;AAEA,eAAsB,uBACpB,UACA,SACA,WAC8B;AAC9B,QAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,QAAM,eAAe,KAAK,WAAW,wBAAwB;AAC7D,QAAM,eAAe,KAAK,WAAW,yBAAyB;AAC9D,QAAM,aAAa,KAAK,WAAW,gCAAgC;AAEnE,QAAM,UAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAE/D,QAAM,gBAAgB,SAAS;AAAA,IAAI,CAAC,YAClC,KAAK,UAAU,uBAAuB,OAAO,CAAC;AAAA,EAChD;AACA,QAAM,UAAU,cAAc,GAAG,cAAc,KAAK,IAAI,CAAC;AAAA,CAAI;AAE7D,QAAM,cAAc,QAAQ;AAAA,IAAI,CAAC,WAC/B,KAAK;AAAA,MACH,oBAAoB,QAAQ,IAAI;AAAA,IAClC;AAAA,EACF;AACA,QAAM,UAAU,YAAY,GAAG,YAAY,KAAK,IAAI,CAAC;AAAA,CAAI;AAEzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scenario blueprints for synthetic training data generation.
|
|
3
|
+
*
|
|
4
|
+
* Each blueprint describes a canonical conversation scenario. The generator
|
|
5
|
+
* expands each blueprint into multiple variants by randomizing:
|
|
6
|
+
* - Agent name (prevents statistical name pollution)
|
|
7
|
+
* - Participant names and count
|
|
8
|
+
* - Platform (telegram, discord, slack, etc.)
|
|
9
|
+
* - Tone, length, and distractor turns
|
|
10
|
+
* - Context specificity (subtle → explicit)
|
|
11
|
+
*
|
|
12
|
+
* Blueprints are categorized by:
|
|
13
|
+
* 1. Decision type: RESPOND | IGNORE | STOP
|
|
14
|
+
* 2. Context domain: general, wallet, knowledge, etc.
|
|
15
|
+
* 3. Conversation pattern: group_chat, group_noise, multi_turn_intent, etc.
|
|
16
|
+
*/
|
|
17
|
+
import { type AgentContext } from "./context-types.js";
|
|
18
|
+
export interface ScenarioBlueprint {
|
|
19
|
+
/** Unique blueprint ID */
|
|
20
|
+
id: string;
|
|
21
|
+
/** Expected shouldRespond decision */
|
|
22
|
+
decision: "RESPOND" | "IGNORE" | "STOP";
|
|
23
|
+
/** Expected primary context */
|
|
24
|
+
primaryContext: AgentContext;
|
|
25
|
+
/** Expected secondary contexts */
|
|
26
|
+
secondaryContexts?: AgentContext[];
|
|
27
|
+
/** Conversation pattern type */
|
|
28
|
+
pattern: "group_direct_mention" | "group_reply_chain" | "group_subtle_mention" | "group_noise" | "group_about_agent" | "group_multi_turn_intent" | "group_stop_request" | "group_wrong_agent" | "group_long_context" | "group_action_emergence";
|
|
29
|
+
/** Brief description of the scenario */
|
|
30
|
+
description: string;
|
|
31
|
+
/** Minimum turns before the key message */
|
|
32
|
+
minContextTurns: number;
|
|
33
|
+
/** Maximum turns before the key message */
|
|
34
|
+
maxContextTurns: number;
|
|
35
|
+
/** Action that should be triggered (if RESPOND + action-bearing) */
|
|
36
|
+
expectedAction?: string;
|
|
37
|
+
/** Keywords that should appear in the conversation to ground the scenario */
|
|
38
|
+
groundingKeywords: string[];
|
|
39
|
+
/** Prompt hint for the teacher model when generating this scenario */
|
|
40
|
+
generationHint: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* All scenario blueprints, flattened.
|
|
44
|
+
*/
|
|
45
|
+
export declare const ALL_BLUEPRINTS: ScenarioBlueprint[];
|
|
46
|
+
export declare const BLUEPRINT_STATS: {
|
|
47
|
+
readonly manualCount: number;
|
|
48
|
+
readonly generatedActionCount: number;
|
|
49
|
+
readonly generatedProviderCount: number;
|
|
50
|
+
readonly generatedIgnoreCount: number;
|
|
51
|
+
readonly generatedStopCount: number;
|
|
52
|
+
readonly totalCount: number;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Get blueprints by decision type.
|
|
56
|
+
*/
|
|
57
|
+
export declare function getBlueprintsByDecision(decision: "RESPOND" | "IGNORE" | "STOP"): ScenarioBlueprint[];
|
|
58
|
+
/**
|
|
59
|
+
* Get blueprints by context.
|
|
60
|
+
*/
|
|
61
|
+
export declare function getBlueprintsByContext(context: AgentContext): ScenarioBlueprint[];
|
|
62
|
+
//# sourceMappingURL=scenario-blueprints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario-blueprints.d.ts","sourceRoot":"","sources":["../../src/core/scenario-blueprints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxC,+BAA+B;IAC/B,cAAc,EAAE,YAAY,CAAC;IAC7B,kCAAkC;IAClC,iBAAiB,CAAC,EAAE,YAAY,EAAE,CAAC;IACnC,gCAAgC;IAChC,OAAO,EACH,sBAAsB,GACtB,mBAAmB,GACnB,sBAAsB,GACtB,aAAa,GACb,mBAAmB,GACnB,yBAAyB,GACzB,oBAAoB,GACpB,mBAAmB,GACnB,oBAAoB,GACpB,wBAAwB,CAAC;IAC7B,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;CACxB;AAo7BD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,iBAAiB,EAiB5C,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;CAmBlB,CAAC;AAEX;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,GACtC,iBAAiB,EAAE,CAErB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,YAAY,GACpB,iBAAiB,EAAE,CAKrB"}
|