@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.
- 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/scenario-blueprints.ts"],"sourcesContent":["/**\n * Scenario blueprints for synthetic training data generation.\n *\n * Each blueprint describes a canonical conversation scenario. The generator\n * expands each blueprint into multiple variants by randomizing:\n * - Agent name (prevents statistical name pollution)\n * - Participant names and count\n * - Platform (telegram, discord, slack, etc.)\n * - Tone, length, and distractor turns\n * - Context specificity (subtle → explicit)\n *\n * Blueprints are categorized by:\n * 1. Decision type: RESPOND | IGNORE | STOP\n * 2. Context domain: general, wallet, knowledge, etc.\n * 3. Conversation pattern: group_chat, group_noise, multi_turn_intent, etc.\n */\n\nimport { ACTION_CONTEXT_MAP, PROVIDER_CONTEXT_MAP } from \"./context-catalog.js\";\nimport { AGENT_CONTEXTS, type AgentContext } from \"./context-types.js\";\n\nexport interface ScenarioBlueprint {\n /** Unique blueprint ID */\n id: string;\n /** Expected shouldRespond decision */\n decision: \"RESPOND\" | \"IGNORE\" | \"STOP\";\n /** Expected primary context */\n primaryContext: AgentContext;\n /** Expected secondary contexts */\n secondaryContexts?: AgentContext[];\n /** Conversation pattern type */\n pattern:\n | \"group_direct_mention\"\n | \"group_reply_chain\"\n | \"group_subtle_mention\"\n | \"group_noise\"\n | \"group_about_agent\"\n | \"group_multi_turn_intent\"\n | \"group_stop_request\"\n | \"group_wrong_agent\"\n | \"group_long_context\"\n | \"group_action_emergence\";\n /** Brief description of the scenario */\n description: string;\n /** Minimum turns before the key message */\n minContextTurns: number;\n /** Maximum turns before the key message */\n maxContextTurns: number;\n /** Action that should be triggered (if RESPOND + action-bearing) */\n expectedAction?: string;\n /** Keywords that should appear in the conversation to ground the scenario */\n groundingKeywords: string[];\n /** Prompt hint for the teacher model when generating this scenario */\n generationHint: string;\n}\n\ntype ScenarioPattern = ScenarioBlueprint[\"pattern\"];\n\n// ==================== RESPOND scenarios ====================\n\nconst respondGeneral: ScenarioBlueprint[] = [\n {\n id: \"respond-general-direct-mention-001\",\n decision: \"RESPOND\",\n primaryContext: \"general\",\n pattern: \"group_direct_mention\",\n description: \"Someone directly asks the agent a general question\",\n minContextTurns: 2,\n maxContextTurns: 8,\n groundingKeywords: [\"hey\", \"what do you think\", \"can you help\"],\n generationHint:\n \"Generate a group chat where participants discuss random topics, then one person directly addresses the agent by name with a general question.\",\n },\n {\n id: \"respond-general-reply-chain-001\",\n decision: \"RESPOND\",\n primaryContext: \"general\",\n pattern: \"group_reply_chain\",\n description: \"Agent is in an active reply chain and should continue\",\n minContextTurns: 4,\n maxContextTurns: 12,\n groundingKeywords: [\"thanks\", \"follow up\", \"what about\"],\n generationHint:\n \"Generate a group chat where the agent has been actively replying, and the conversation continues with follow-up questions directed at the agent.\",\n },\n {\n id: \"respond-general-subtle-mention-001\",\n decision: \"RESPOND\",\n primaryContext: \"general\",\n pattern: \"group_subtle_mention\",\n description:\n \"Agent's name is mentioned subtly in a question that requires response\",\n minContextTurns: 3,\n maxContextTurns: 10,\n groundingKeywords: [\"mentioned\", \"asked\"],\n generationHint:\n \"Generate a group chat where someone mentions the agent's name mid-sentence while asking it something. The mention should be natural, not a formal address.\",\n },\n];\n\nconst respondWallet: ScenarioBlueprint[] = [\n {\n id: \"respond-wallet-balance-001\",\n decision: \"RESPOND\",\n primaryContext: \"wallet\",\n pattern: \"group_direct_mention\",\n description: \"Someone asks the agent to check a token balance\",\n minContextTurns: 1,\n maxContextTurns: 5,\n expectedAction: \"CHECK_BALANCE\",\n groundingKeywords: [\"balance\", \"tokens\", \"how much\", \"wallet\"],\n generationHint:\n \"Generate a group chat about crypto, then someone asks the agent by name to check their token balance.\",\n },\n {\n id: \"respond-wallet-swap-001\",\n decision: \"RESPOND\",\n primaryContext: \"wallet\",\n secondaryContexts: [\"automation\"],\n pattern: \"group_direct_mention\",\n description: \"Someone asks the agent to swap tokens\",\n minContextTurns: 2,\n maxContextTurns: 6,\n expectedAction: \"SWAP_TOKEN\",\n groundingKeywords: [\"swap\", \"exchange\", \"trade\", \"convert\"],\n generationHint:\n \"Generate a group chat where users discuss token prices, then someone asks the agent to swap ETH for USDC or similar.\",\n },\n {\n id: \"respond-wallet-send-001\",\n decision: \"RESPOND\",\n primaryContext: \"wallet\",\n pattern: \"group_direct_mention\",\n description: \"Someone asks the agent to send tokens\",\n minContextTurns: 1,\n maxContextTurns: 4,\n expectedAction: \"SEND_TOKEN\",\n groundingKeywords: [\"send\", \"transfer\", \"to address\"],\n generationHint:\n \"Generate a group chat where someone asks the agent to send tokens to a specific address.\",\n },\n {\n id: \"respond-wallet-multi-turn-001\",\n decision: \"RESPOND\",\n primaryContext: \"wallet\",\n pattern: \"group_multi_turn_intent\",\n description:\n \"Wallet intent emerges over multiple turns of discussion before explicit request\",\n minContextTurns: 6,\n maxContextTurns: 15,\n expectedAction: \"SWAP_TOKEN\",\n groundingKeywords: [\"price\", \"market\", \"dip\", \"buy\", \"swap\", \"good time\"],\n generationHint:\n \"Generate a long group chat where users discuss market conditions, token prices, and eventually one person decides to ask the agent to execute a swap. The intent should emerge gradually over several messages.\",\n },\n];\n\nconst respondKnowledge: ScenarioBlueprint[] = [\n {\n id: \"respond-knowledge-search-001\",\n decision: \"RESPOND\",\n primaryContext: \"documents\",\n pattern: \"group_direct_mention\",\n description: \"Someone asks the agent to look something up\",\n minContextTurns: 2,\n maxContextTurns: 6,\n expectedAction: \"DOCUMENT\",\n groundingKeywords: [\"search\", \"find\", \"look up\", \"what is\"],\n generationHint:\n \"Generate a group chat where someone asks the agent a factual question that requires knowledge lookup.\",\n },\n {\n id: \"respond-knowledge-summarize-001\",\n decision: \"RESPOND\",\n primaryContext: \"documents\",\n pattern: \"group_reply_chain\",\n description: \"Agent is asked to summarize a discussion\",\n minContextTurns: 8,\n maxContextTurns: 20,\n expectedAction: \"SUMMARIZE\",\n groundingKeywords: [\"summarize\", \"tldr\", \"recap\", \"main points\"],\n generationHint:\n \"Generate a long group discussion about a complex topic, then someone asks the agent to summarize the key points.\",\n },\n];\n\nconst respondMedia: ScenarioBlueprint[] = [\n {\n id: \"respond-media-image-001\",\n decision: \"RESPOND\",\n primaryContext: \"media\",\n pattern: \"group_direct_mention\",\n description: \"Someone asks the agent to generate an image\",\n minContextTurns: 1,\n maxContextTurns: 5,\n expectedAction: \"GENERATE_MEDIA\",\n groundingKeywords: [\"generate\", \"create\", \"make\", \"image\", \"picture\"],\n generationHint:\n \"Generate a group chat where someone asks the agent to generate an image of something specific.\",\n },\n {\n id: \"respond-media-describe-001\",\n decision: \"RESPOND\",\n primaryContext: \"media\",\n secondaryContexts: [\"documents\"],\n pattern: \"group_direct_mention\",\n description: \"Someone shares an image and asks the agent to describe it\",\n minContextTurns: 1,\n maxContextTurns: 4,\n expectedAction: \"DESCRIBE_IMAGE\",\n groundingKeywords: [\"describe\", \"what is this\", \"what do you see\"],\n generationHint:\n \"Generate a group chat where someone shares an image attachment and asks the agent what it shows.\",\n },\n];\n\nconst respondAutomation: ScenarioBlueprint[] = [\n {\n id: \"respond-automation-cron-001\",\n decision: \"RESPOND\",\n primaryContext: \"automation\",\n pattern: \"group_direct_mention\",\n description: \"Someone asks the agent to set up a scheduled task\",\n minContextTurns: 2,\n maxContextTurns: 6,\n expectedAction: \"CREATE_CRON\",\n groundingKeywords: [\n \"schedule\",\n \"every day\",\n \"remind me\",\n \"recurring\",\n \"cron\",\n ],\n generationHint:\n \"Generate a group chat where someone asks the agent to set up a daily reminder or scheduled task.\",\n },\n];\n\nconst respondSocial: ScenarioBlueprint[] = [\n {\n id: \"respond-social-contact-001\",\n decision: \"RESPOND\",\n primaryContext: \"social\",\n pattern: \"group_direct_mention\",\n description: \"Someone asks the agent to look up contact information\",\n minContextTurns: 1,\n maxContextTurns: 5,\n expectedAction: \"SEARCH_CONTACTS\",\n groundingKeywords: [\"contact\", \"who is\", \"find\", \"look up\"],\n generationHint:\n \"Generate a group chat where someone asks the agent to find information about a contact.\",\n },\n];\n\nconst respondCode: ScenarioBlueprint[] = [\n {\n id: \"respond-code-task-001\",\n decision: \"RESPOND\",\n primaryContext: \"code\",\n secondaryContexts: [\"automation\"],\n pattern: \"group_direct_mention\",\n description: \"Someone asks the agent to spawn a sub-agent for a task\",\n minContextTurns: 3,\n maxContextTurns: 8,\n expectedAction: \"SPAWN_AGENT\",\n groundingKeywords: [\"agent\", \"spawn\", \"create\", \"task\", \"automate\"],\n generationHint:\n \"Generate a group chat where developers discuss a problem, then someone asks the agent to spawn a sub-agent to handle a specific automated task.\",\n },\n];\n\nconst respondSystem: ScenarioBlueprint[] = [\n {\n id: \"respond-system-config-001\",\n decision: \"RESPOND\",\n primaryContext: \"system\",\n pattern: \"group_direct_mention\",\n description: \"Someone asks the agent to change a configuration setting\",\n minContextTurns: 1,\n maxContextTurns: 4,\n expectedAction: \"CONFIGURE\",\n groundingKeywords: [\"config\", \"setting\", \"change\", \"update\"],\n generationHint:\n \"Generate a group chat where someone asks the agent to update a runtime configuration.\",\n },\n];\n\n// ==================== IGNORE scenarios ====================\n\nconst ignoreScenarios: ScenarioBlueprint[] = [\n {\n id: \"ignore-noise-001\",\n decision: \"IGNORE\",\n primaryContext: \"general\",\n pattern: \"group_noise\",\n description:\n \"Group chat with unrelated conversation - agent not mentioned at all\",\n minContextTurns: 5,\n maxContextTurns: 15,\n groundingKeywords: [],\n generationHint:\n \"Generate a group chat where people discuss lunch plans, weekend activities, or other casual topics. The agent's name should NOT appear at all.\",\n },\n {\n id: \"ignore-noise-002\",\n decision: \"IGNORE\",\n primaryContext: \"general\",\n pattern: \"group_noise\",\n description:\n \"Technical discussion between humans with no agent involvement\",\n minContextTurns: 4,\n maxContextTurns: 12,\n groundingKeywords: [\"code\", \"bug\", \"fix\", \"deploy\"],\n generationHint:\n \"Generate a group chat where developers discuss code reviews and deployment issues among themselves. The agent should NOT be mentioned.\",\n },\n {\n id: \"ignore-about-agent-001\",\n decision: \"IGNORE\",\n primaryContext: \"general\",\n pattern: \"group_about_agent\",\n description:\n \"People talk ABOUT the agent but not TO the agent - should still IGNORE\",\n minContextTurns: 3,\n maxContextTurns: 8,\n groundingKeywords: [\"it\", \"the bot\", \"that agent\"],\n generationHint:\n 'Generate a group chat where people discuss the agent in third person (\"the bot did X\", \"I think it can do Y\") but never address it directly. The agent should IGNORE this.',\n },\n {\n id: \"ignore-about-agent-002\",\n decision: \"IGNORE\",\n primaryContext: \"wallet\",\n pattern: \"group_about_agent\",\n description:\n \"People discuss the agent's wallet capabilities without addressing it\",\n minContextTurns: 4,\n maxContextTurns: 10,\n groundingKeywords: [\"can it swap\", \"does it support\", \"the bot handles\"],\n generationHint:\n \"Generate a group chat where users discuss the agent's DeFi capabilities in third person without addressing it directly.\",\n },\n {\n id: \"ignore-wrong-agent-001\",\n decision: \"IGNORE\",\n primaryContext: \"general\",\n pattern: \"group_wrong_agent\",\n description: \"Someone addresses a DIFFERENT bot by name in the group\",\n minContextTurns: 3,\n maxContextTurns: 8,\n groundingKeywords: [\"hey\", \"can you\"],\n generationHint:\n \"Generate a group chat with TWO different bots present. Someone addresses the OTHER bot by name. The agent being tested should IGNORE this.\",\n },\n {\n id: \"ignore-wrong-agent-002\",\n decision: \"IGNORE\",\n primaryContext: \"wallet\",\n pattern: \"group_wrong_agent\",\n description: \"Someone asks a DIFFERENT bot to do a wallet operation\",\n minContextTurns: 2,\n maxContextTurns: 6,\n groundingKeywords: [\"swap\", \"send\", \"balance\"],\n generationHint:\n \"Generate a group chat where someone asks a DIFFERENT bot (not our agent) to check a wallet balance or swap tokens.\",\n },\n {\n id: \"ignore-long-noise-001\",\n decision: \"IGNORE\",\n primaryContext: \"general\",\n pattern: \"group_long_context\",\n description:\n \"Very long group conversation with no agent involvement at all\",\n minContextTurns: 15,\n maxContextTurns: 30,\n groundingKeywords: [],\n generationHint:\n \"Generate a very long group chat (20+ messages) of casual conversation between friends. The agent should NOT be mentioned at all.\",\n },\n {\n id: \"ignore-partial-name-001\",\n decision: \"IGNORE\",\n primaryContext: \"general\",\n pattern: \"group_noise\",\n description:\n \"Someone mentions a word that partially matches the agent's name but is a different word\",\n minContextTurns: 3,\n maxContextTurns: 8,\n groundingKeywords: [],\n generationHint:\n \"Generate a group chat where someone uses a word that partially contains the agent's name (e.g., if agent is 'Max', someone says 'maximize'). The agent should IGNORE this.\",\n },\n];\n\n// ==================== STOP scenarios ====================\n\nconst stopScenarios: ScenarioBlueprint[] = [\n {\n id: \"stop-explicit-001\",\n decision: \"STOP\",\n primaryContext: \"general\",\n pattern: \"group_stop_request\",\n description: \"Someone explicitly tells the agent to stop talking\",\n minContextTurns: 4,\n maxContextTurns: 10,\n groundingKeywords: [\"stop\", \"shut up\", \"be quiet\", \"enough\"],\n generationHint:\n \"Generate a group chat where the agent has been participating, and then someone tells it to stop or be quiet.\",\n },\n {\n id: \"stop-polite-001\",\n decision: \"STOP\",\n primaryContext: \"general\",\n pattern: \"group_stop_request\",\n description: \"Someone politely asks the agent to stop\",\n minContextTurns: 3,\n maxContextTurns: 8,\n groundingKeywords: [\n \"please stop\",\n \"that's enough\",\n \"no more\",\n \"thanks but\",\n ],\n generationHint:\n \"Generate a group chat where the agent has been active, and someone politely asks it to stop responding or take a break.\",\n },\n {\n id: \"stop-mute-001\",\n decision: \"STOP\",\n primaryContext: \"general\",\n pattern: \"group_stop_request\",\n description: \"Someone asks to mute the agent in the channel\",\n minContextTurns: 2,\n maxContextTurns: 6,\n groundingKeywords: [\"mute\", \"disable\", \"turn off\", \"silence\"],\n generationHint:\n \"Generate a group chat where someone asks to mute or disable the agent in the current channel.\",\n },\n];\n\n// ==================== Multi-turn intent emergence ====================\n\nconst multiTurnIntentScenarios: ScenarioBlueprint[] = [\n {\n id: \"respond-multi-turn-wallet-001\",\n decision: \"RESPOND\",\n primaryContext: \"wallet\",\n pattern: \"group_action_emergence\",\n description:\n \"Over several turns, users discuss token prices and one gradually decides to swap\",\n minContextTurns: 8,\n maxContextTurns: 20,\n expectedAction: \"SWAP_TOKEN\",\n groundingKeywords: [\n \"price\",\n \"market\",\n \"down\",\n \"buy the dip\",\n \"should I\",\n \"let's do it\",\n ],\n generationHint:\n \"Generate a LONG group conversation where 3-4 users discuss crypto market conditions. One user gradually moves from observing to deciding to trade. The intent to swap should emerge naturally over 5+ messages. The final message should clearly direct the agent to execute.\",\n },\n {\n id: \"respond-multi-turn-knowledge-001\",\n decision: \"RESPOND\",\n primaryContext: \"documents\",\n pattern: \"group_action_emergence\",\n description:\n \"Group debates a topic, eventually asks agent to research and settle the argument\",\n minContextTurns: 6,\n maxContextTurns: 15,\n expectedAction: \"DOCUMENT\",\n groundingKeywords: [\n \"actually\",\n \"I think\",\n \"no way\",\n \"look it up\",\n \"settle this\",\n ],\n generationHint:\n \"Generate a group chat where people argue about a factual question. After several turns of disagreement, someone asks the agent to look it up and settle the debate.\",\n },\n {\n id: \"respond-multi-turn-automation-001\",\n decision: \"RESPOND\",\n primaryContext: \"automation\",\n pattern: \"group_action_emergence\",\n description:\n \"Team discusses a recurring problem, eventually asks agent to automate a solution\",\n minContextTurns: 6,\n maxContextTurns: 15,\n expectedAction: \"CREATE_CRON\",\n groundingKeywords: [\n \"keeps happening\",\n \"every time\",\n \"automate\",\n \"daily\",\n \"schedule\",\n ],\n generationHint:\n \"Generate a group chat where team members discuss a recurring manual task that frustrates them. Over several turns, they realize the agent could automate it. Someone finally asks the agent to set up a scheduled job.\",\n },\n];\n\ntype LeadInStyle = {\n id: string;\n description: string;\n hint: string;\n extraKeywords: string[];\n};\n\ntype ScenarioRecipe = {\n id: string;\n pattern: ScenarioPattern;\n minContextTurns: number;\n maxContextTurns: number;\n description: string;\n hint: string;\n};\n\nconst GENERATED_ACTION_SKIP = new Set([\"NONE\", \"IGNORE\", \"STOP\"]);\n\nconst CONTEXT_KEYWORDS: Record<AgentContext, string[]> = {\n general: [\"question\", \"follow up\", \"chat\", \"group\"],\n finance: [\"money\", \"balance\", \"portfolio\", \"account\"],\n crypto: [\"crypto\", \"token\", \"defi\", \"onchain\"],\n wallet: [\"wallet\", \"token\", \"swap\", \"balance\"],\n payments: [\"payment\", \"invoice\", \"billing\", \"transfer\"],\n documents: [\"research\", \"lookup\", \"answer\", \"facts\"],\n browser: [\"link\", \"site\", \"page\", \"browser\"],\n code: [\"repo\", \"patch\", \"bug\", \"script\"],\n media: [\"image\", \"audio\", \"video\", \"describe\"],\n automation: [\"schedule\", \"workflow\", \"repeat\", \"automate\"],\n social: [\"contact\", \"message\", \"reply\", \"people\"],\n system: [\"setting\", \"runtime\", \"config\", \"permissions\"],\n};\n\nconst LEAD_IN_STYLES: LeadInStyle[] = [\n {\n id: \"casual\",\n description: \"casual chatter\",\n hint: \"Start with lightweight group-chat banter before the key ask lands.\",\n extraKeywords: [\"hey\", \"lol\", \"anyway\"],\n },\n {\n id: \"operational\",\n description: \"operational planning\",\n hint: \"Frame the lead-in as a practical coordination thread with real constraints.\",\n extraKeywords: [\"need\", \"today\", \"ship\"],\n },\n {\n id: \"debate\",\n description: \"debate and disagreement\",\n hint: \"Make the lead-in a mild disagreement where the ask resolves uncertainty or friction.\",\n extraKeywords: [\"actually\", \"wait\", \"settle\"],\n },\n];\n\nconst ACTION_RECIPES: ScenarioRecipe[] = [\n {\n id: \"direct-short\",\n pattern: \"group_direct_mention\",\n minContextTurns: 1,\n maxContextTurns: 5,\n description: \"direct short request\",\n hint: \"The final message should directly address the agent by name with an explicit request.\",\n },\n {\n id: \"subtle-short\",\n pattern: \"group_subtle_mention\",\n minContextTurns: 2,\n maxContextTurns: 7,\n description: \"subtle mention request\",\n hint: \"Mention the agent naturally mid-sentence instead of using a formal command.\",\n },\n {\n id: \"reply-chain\",\n pattern: \"group_reply_chain\",\n minContextTurns: 4,\n maxContextTurns: 10,\n description: \"reply-chain continuation\",\n hint: \"Treat the ask as a continuation of an active thread where the agent has already been part of the exchange.\",\n },\n {\n id: \"multi-turn-intent\",\n pattern: \"group_multi_turn_intent\",\n minContextTurns: 5,\n maxContextTurns: 12,\n description: \"multi-turn intent buildup\",\n hint: \"The same user should build intent across several messages before finally asking the agent to act.\",\n },\n {\n id: \"action-emergence\",\n pattern: \"group_action_emergence\",\n minContextTurns: 8,\n maxContextTurns: 18,\n description: \"long action emergence\",\n hint: \"Let the action intent emerge gradually from a longer group conversation before the final explicit ask.\",\n },\n {\n id: \"long-context\",\n pattern: \"group_long_context\",\n minContextTurns: 10,\n maxContextTurns: 22,\n description: \"long-context request\",\n hint: \"Make the lead-in long and partly unrelated so the messageHandler router must use the recent window rather than just the final line.\",\n },\n];\n\nconst PROVIDER_RECIPES: ScenarioRecipe[] = [\n {\n id: \"provider-direct\",\n pattern: \"group_direct_mention\",\n minContextTurns: 2,\n maxContextTurns: 6,\n description: \"direct provider request\",\n hint: \"The final ask should clearly require pulling in contextual data before answering.\",\n },\n {\n id: \"provider-subtle\",\n pattern: \"group_subtle_mention\",\n minContextTurns: 3,\n maxContextTurns: 8,\n description: \"subtle provider request\",\n hint: \"The request should be natural and indirect but still require the provider-backed context.\",\n },\n];\n\nconst IGNORE_RECIPES: ScenarioRecipe[] = [\n {\n id: \"noise\",\n pattern: \"group_noise\",\n minContextTurns: 4,\n maxContextTurns: 12,\n description: \"pure human conversation\",\n hint: \"The agent should not be mentioned at all.\",\n },\n {\n id: \"about-agent\",\n pattern: \"group_about_agent\",\n minContextTurns: 4,\n maxContextTurns: 12,\n description: \"people talking about the agent\",\n hint: \"Participants may reference the agent in third person, but they must not talk to it.\",\n },\n {\n id: \"wrong-agent\",\n pattern: \"group_wrong_agent\",\n minContextTurns: 3,\n maxContextTurns: 10,\n description: \"another assistant is addressed\",\n hint: \"A different assistant should be addressed directly while the trained agent should stay uninvolved.\",\n },\n {\n id: \"long-noise\",\n pattern: \"group_long_context\",\n minContextTurns: 12,\n maxContextTurns: 24,\n description: \"long unrelated thread\",\n hint: \"Keep the chat long enough that the agent has to ignore a noisy but context-heavy conversation.\",\n },\n];\n\nconst STOP_RECIPES: ScenarioRecipe[] = [\n {\n id: \"explicit\",\n pattern: \"group_stop_request\",\n minContextTurns: 3,\n maxContextTurns: 9,\n description: \"explicit stop request\",\n hint: \"Someone should clearly tell the agent to stop responding in the channel.\",\n },\n {\n id: \"polite\",\n pattern: \"group_stop_request\",\n minContextTurns: 3,\n maxContextTurns: 8,\n description: \"polite stop request\",\n hint: \"The stop request should be polite but unambiguous.\",\n },\n {\n id: \"moderator\",\n pattern: \"group_stop_request\",\n minContextTurns: 4,\n maxContextTurns: 10,\n description: \"moderator intervention\",\n hint: \"Frame the stop request as a moderator or channel-owner intervention.\",\n },\n];\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction humanizeToken(value: string): string {\n return value.toLowerCase().replace(/_/g, \" \");\n}\n\nfunction uniqueList(values: string[]): string[] {\n return [...new Set(values.filter((value) => value.trim().length > 0))];\n}\n\nfunction describeActionIntent(\n actionName: string,\n primaryContext: AgentContext,\n): string {\n const readable = humanizeToken(actionName);\n switch (primaryContext) {\n case \"finance\":\n return `answer or act on a financial request for \"${readable}\"`;\n case \"crypto\":\n return `handle a crypto or DeFi request for \"${readable}\"`;\n case \"wallet\":\n return `perform the wallet action \"${readable}\"`;\n case \"payments\":\n return `handle a payment or billing request for \"${readable}\"`;\n case \"documents\":\n return `help with a knowledge task around \"${readable}\"`;\n case \"browser\":\n return `use browser capabilities to \"${readable}\"`;\n case \"code\":\n return `handle a coding or tooling task to \"${readable}\"`;\n case \"media\":\n return `handle a media workflow to \"${readable}\"`;\n case \"automation\":\n return `set up or run automation to \"${readable}\"`;\n case \"social\":\n return `help with a social coordination task to \"${readable}\"`;\n case \"system\":\n return `apply a runtime or system change to \"${readable}\"`;\n default:\n return `handle the request \"${readable}\"`;\n }\n}\n\nfunction buildGroundingKeywords(\n seed: string[],\n primaryContext: AgentContext,\n leadIn: LeadInStyle,\n): string[] {\n return uniqueList([\n ...seed,\n ...CONTEXT_KEYWORDS[primaryContext],\n ...leadIn.extraKeywords,\n ]).slice(0, 8);\n}\n\nfunction createGeneratedActionScenarios(): ScenarioBlueprint[] {\n const blueprints: ScenarioBlueprint[] = [];\n\n for (const [actionName, contexts] of Object.entries(ACTION_CONTEXT_MAP)) {\n if (GENERATED_ACTION_SKIP.has(actionName)) continue;\n const [primaryContext, ...secondaryContexts] = contexts;\n if (!primaryContext) continue;\n\n for (const recipe of ACTION_RECIPES) {\n for (const leadIn of LEAD_IN_STYLES) {\n const readableAction = humanizeToken(actionName);\n blueprints.push({\n id: `generated-respond-${slugify(actionName)}-${recipe.id}-${leadIn.id}`,\n decision: \"RESPOND\",\n primaryContext,\n secondaryContexts,\n pattern: recipe.pattern,\n description: `${describeActionIntent(actionName, primaryContext)} in ${leadIn.description} using ${recipe.description}`,\n minContextTurns: recipe.minContextTurns,\n maxContextTurns: recipe.maxContextTurns,\n expectedAction: actionName,\n groundingKeywords: buildGroundingKeywords(\n readableAction.split(\" \"),\n primaryContext,\n leadIn,\n ),\n generationHint: [\n `Generate a group chat where the final user intent is to ${describeActionIntent(actionName, primaryContext)}.`,\n `The conversation should clearly live in the ${primaryContext} context.`,\n recipe.hint,\n leadIn.hint,\n secondaryContexts.length > 0\n ? `Blend in these secondary contexts when natural: ${secondaryContexts.join(\", \")}.`\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \"),\n });\n }\n }\n }\n\n return blueprints;\n}\n\nfunction createGeneratedProviderScenarios(): ScenarioBlueprint[] {\n const blueprints: ScenarioBlueprint[] = [];\n\n for (const [providerName, contexts] of Object.entries(PROVIDER_CONTEXT_MAP)) {\n const [primaryContext, ...secondaryContexts] = contexts;\n if (!primaryContext) continue;\n\n for (const recipe of PROVIDER_RECIPES) {\n for (const leadIn of LEAD_IN_STYLES) {\n blueprints.push({\n id: `generated-provider-${slugify(providerName)}-${recipe.id}-${leadIn.id}`,\n decision: \"RESPOND\",\n primaryContext,\n secondaryContexts,\n pattern: recipe.pattern,\n description: `request that should require the \"${providerName}\" provider in ${leadIn.description}`,\n minContextTurns: recipe.minContextTurns,\n maxContextTurns: recipe.maxContextTurns,\n groundingKeywords: buildGroundingKeywords(\n providerName\n .split(/(?=[A-Z])|_/)\n .map((token) => token.toLowerCase()),\n primaryContext,\n leadIn,\n ),\n generationHint: [\n `Generate a group chat where answering well requires provider-backed context similar to \"${providerName}\".`,\n `Keep the primary context in ${primaryContext}.`,\n recipe.hint,\n leadIn.hint,\n ].join(\" \"),\n });\n }\n }\n }\n\n return blueprints;\n}\n\nfunction createGeneratedIgnoreScenarios(): ScenarioBlueprint[] {\n const blueprints: ScenarioBlueprint[] = [];\n\n for (const context of AGENT_CONTEXTS) {\n for (const recipe of IGNORE_RECIPES) {\n for (const leadIn of LEAD_IN_STYLES.slice(0, 2)) {\n blueprints.push({\n id: `generated-ignore-${context}-${recipe.id}-${leadIn.id}`,\n decision: \"IGNORE\",\n primaryContext: context,\n pattern: recipe.pattern,\n description: `ignore case for ${context} during ${recipe.description} with ${leadIn.description}`,\n minContextTurns: recipe.minContextTurns,\n maxContextTurns: recipe.maxContextTurns,\n groundingKeywords: buildGroundingKeywords([], context, leadIn),\n generationHint: [\n `Generate a ${context}-flavored group chat that should still be ignored by the agent.`,\n recipe.hint,\n leadIn.hint,\n `Do not create a valid direct ask for the agent in this sample.`,\n ].join(\" \"),\n });\n }\n }\n }\n\n return blueprints;\n}\n\nfunction createGeneratedStopScenarios(): ScenarioBlueprint[] {\n return STOP_RECIPES.flatMap((recipe) =>\n LEAD_IN_STYLES.map((leadIn) => ({\n id: `generated-stop-${recipe.id}-${leadIn.id}`,\n decision: \"STOP\" as const,\n primaryContext: \"general\" as const,\n pattern: recipe.pattern,\n description: `${recipe.description} after ${leadIn.description}`,\n minContextTurns: recipe.minContextTurns,\n maxContextTurns: recipe.maxContextTurns,\n groundingKeywords: buildGroundingKeywords(\n [\"stop\", \"quiet\", \"enough\"],\n \"general\",\n leadIn,\n ),\n generationHint: [\n \"Generate a group chat where the agent has been active enough for a stop request to make sense.\",\n recipe.hint,\n leadIn.hint,\n ].join(\" \"),\n })),\n );\n}\n\nconst generatedActionScenarios = createGeneratedActionScenarios();\nconst generatedProviderScenarios = createGeneratedProviderScenarios();\nconst generatedIgnoreScenarios = createGeneratedIgnoreScenarios();\nconst generatedStopScenarios = createGeneratedStopScenarios();\n\nfunction dedupeBlueprints(\n blueprints: ScenarioBlueprint[],\n): ScenarioBlueprint[] {\n const seen = new Set<string>();\n return blueprints.filter((blueprint) => {\n if (seen.has(blueprint.id)) return false;\n seen.add(blueprint.id);\n return true;\n });\n}\n\n// ==================== View switching (navigation) ====================\n// GEPA/MIPRO optimization seed for the `action_planner` task: navigation\n// requests — explicit (\"open my calendar\"), passive/implicit (\"what's on my\n// calendar\"), and NON-ENGLISH — must resolve to the VIEWS action with the\n// matching view. These blueprints generate the synthetic training data that\n// teaches the planner to treat view switching as a common, default response;\n// scorePlannerAction rewards picking VIEWS. Multilingual generationHints make\n// the optimizer cover es/fr/de/zh navigation too (Eliza is local-first; small\n// models need the reinforcement).\nconst viewSwitchingScenarios: ScenarioBlueprint[] = [\n {\n id: \"respond-views-active-direct-001\",\n decision: \"RESPOND\",\n primaryContext: \"general\",\n pattern: \"group_direct_mention\",\n description:\n \"User explicitly asks the agent to open/switch to a named app view\",\n minContextTurns: 1,\n maxContextTurns: 4,\n expectedAction: \"VIEWS\",\n groundingKeywords: [\n \"open\",\n \"show me\",\n \"go to\",\n \"take me to\",\n \"switch to\",\n \"calendar\",\n \"wallet\",\n \"inbox\",\n ],\n generationHint:\n \"Generate a short chat where the user directly asks the agent to open or switch to a specific app surface — e.g. 'open my calendar', 'show me my wallet', 'take me to my inbox', 'go to settings'. The agent should navigate via the VIEWS action (action=show, the matching view id). Vary the named surface across calendar/inbox/wallet/finances/goals/health/todos/documents.\",\n },\n {\n id: \"respond-views-passive-intent-001\",\n decision: \"RESPOND\",\n primaryContext: \"general\",\n pattern: \"group_action_emergence\",\n description:\n \"User expresses an intent that implies seeing a surface, without naming a view\",\n minContextTurns: 2,\n maxContextTurns: 8,\n expectedAction: \"VIEWS\",\n groundingKeywords: [\n \"what's on my\",\n \"check my\",\n \"how much did I spend\",\n \"I need to focus\",\n \"I want to add a feature\",\n \"who do I know\",\n ],\n generationHint:\n \"Generate a chat where the user expresses an intent that maps to an app surface WITHOUT saying 'view' — e.g. 'what's on my calendar this week', 'check my messages', 'how much did I spend this month' (finances), 'I need to focus' (focus), 'I want to add a new feature to my app' (task-coordinator), 'who do I know at Acme' (relationships). The agent should proactively open the matching view via VIEWS action=show. Reinforce that opening the relevant surface — not just answering in text — is the preferred response.\",\n },\n {\n id: \"respond-views-multilingual-001\",\n decision: \"RESPOND\",\n primaryContext: \"general\",\n pattern: \"group_direct_mention\",\n description:\n \"Non-English navigation request must still route to the VIEWS action\",\n minContextTurns: 1,\n maxContextTurns: 4,\n expectedAction: \"VIEWS\",\n groundingKeywords: [\n \"muéstrame\",\n \"mi calendario\",\n \"montre-moi\",\n \"mon portefeuille\",\n \"我的待办\",\n \"zeig mir\",\n ],\n generationHint:\n \"Generate short navigation requests in NON-ENGLISH languages and route each to the VIEWS action with the matching view id. Cover Spanish ('muéstrame mi calendario'→calendar, 'revisa mi correo'→inbox, 'mis finanzas'→finances), French ('montre-moi mon portefeuille'→wallet, 'mes tâches'→todos), German ('zeig mir meine ziele'→goals), and Chinese ('我的待办事项'→todos, '我的日历'→calendar). The agent replies in the user's language and opens the view via VIEWS action=show.\",\n },\n {\n id: \"respond-views-followup-002\",\n decision: \"RESPOND\",\n primaryContext: \"system\",\n pattern: \"group_multi_turn_intent\",\n description:\n \"After discussing a domain, the user asks to actually see it — open the view\",\n minContextTurns: 3,\n maxContextTurns: 10,\n expectedAction: \"VIEWS\",\n groundingKeywords: [\n \"let me see it\",\n \"pull it up\",\n \"show that\",\n \"open it\",\n \"can I see\",\n ],\n generationHint:\n \"Generate a multi-turn conversation about a domain (e.g. upcoming meetings, spending, unread mail) where the user finally asks to SEE it — 'let me see it', 'pull it up', 'can you show that'. The agent resolves the in-context surface and opens it with VIEWS action=show <view id>.\",\n },\n];\n\n/**\n * All scenario blueprints, flattened.\n */\nexport const ALL_BLUEPRINTS: ScenarioBlueprint[] = dedupeBlueprints([\n ...viewSwitchingScenarios,\n ...respondGeneral,\n ...respondWallet,\n ...respondKnowledge,\n ...respondMedia,\n ...respondAutomation,\n ...respondSocial,\n ...respondCode,\n ...respondSystem,\n ...ignoreScenarios,\n ...stopScenarios,\n ...multiTurnIntentScenarios,\n ...generatedActionScenarios,\n ...generatedProviderScenarios,\n ...generatedIgnoreScenarios,\n ...generatedStopScenarios,\n]);\n\nexport const BLUEPRINT_STATS = {\n manualCount:\n respondGeneral.length +\n respondWallet.length +\n respondKnowledge.length +\n respondMedia.length +\n respondAutomation.length +\n respondSocial.length +\n respondCode.length +\n respondSystem.length +\n ignoreScenarios.length +\n stopScenarios.length +\n multiTurnIntentScenarios.length +\n viewSwitchingScenarios.length,\n generatedActionCount: generatedActionScenarios.length,\n generatedProviderCount: generatedProviderScenarios.length,\n generatedIgnoreCount: generatedIgnoreScenarios.length,\n generatedStopCount: generatedStopScenarios.length,\n totalCount: ALL_BLUEPRINTS.length,\n} as const;\n\n/**\n * Get blueprints by decision type.\n */\nexport function getBlueprintsByDecision(\n decision: \"RESPOND\" | \"IGNORE\" | \"STOP\",\n): ScenarioBlueprint[] {\n return ALL_BLUEPRINTS.filter((b) => b.decision === decision);\n}\n\n/**\n * Get blueprints by context.\n */\nexport function getBlueprintsByContext(\n context: AgentContext,\n): ScenarioBlueprint[] {\n return ALL_BLUEPRINTS.filter(\n (b) =>\n b.primaryContext === context || b.secondaryContexts?.includes(context),\n );\n}\n"],"mappings":"AAiBA,SAAS,oBAAoB,4BAA4B;AACzD,SAAS,sBAAyC;AAyClD,MAAM,iBAAsC;AAAA,EAC1C;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,OAAO,qBAAqB,cAAc;AAAA,IAC9D,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,UAAU,aAAa,YAAY;AAAA,IACvD,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,aAAa,OAAO;AAAA,IACxC,gBACE;AAAA,EACJ;AACF;AAEA,MAAM,gBAAqC;AAAA,EACzC;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,WAAW,UAAU,YAAY,QAAQ;AAAA,IAC7D,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,YAAY;AAAA,IAChC,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,QAAQ,YAAY,SAAS,SAAS;AAAA,IAC1D,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,QAAQ,YAAY,YAAY;AAAA,IACpD,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,SAAS,UAAU,OAAO,OAAO,QAAQ,WAAW;AAAA,IACxE,gBACE;AAAA,EACJ;AACF;AAEA,MAAM,mBAAwC;AAAA,EAC5C;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,UAAU,QAAQ,WAAW,SAAS;AAAA,IAC1D,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,aAAa,QAAQ,SAAS,aAAa;AAAA,IAC/D,gBACE;AAAA,EACJ;AACF;AAEA,MAAM,eAAoC;AAAA,EACxC;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,YAAY,UAAU,QAAQ,SAAS,SAAS;AAAA,IACpE,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,WAAW;AAAA,IAC/B,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,YAAY,gBAAgB,iBAAiB;AAAA,IACjE,gBACE;AAAA,EACJ;AACF;AAEA,MAAM,oBAAyC;AAAA,EAC7C;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBACE;AAAA,EACJ;AACF;AAEA,MAAM,gBAAqC;AAAA,EACzC;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,WAAW,UAAU,QAAQ,SAAS;AAAA,IAC1D,gBACE;AAAA,EACJ;AACF;AAEA,MAAM,cAAmC;AAAA,EACvC;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,YAAY;AAAA,IAChC,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,SAAS,SAAS,UAAU,QAAQ,UAAU;AAAA,IAClE,gBACE;AAAA,EACJ;AACF;AAEA,MAAM,gBAAqC;AAAA,EACzC;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB,CAAC,UAAU,WAAW,UAAU,QAAQ;AAAA,IAC3D,gBACE;AAAA,EACJ;AACF;AAIA,MAAM,kBAAuC;AAAA,EAC3C;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC;AAAA,IACpB,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,QAAQ,OAAO,OAAO,QAAQ;AAAA,IAClD,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,MAAM,WAAW,YAAY;AAAA,IACjD,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,eAAe,mBAAmB,iBAAiB;AAAA,IACvE,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,OAAO,SAAS;AAAA,IACpC,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,QAAQ,QAAQ,SAAS;AAAA,IAC7C,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC;AAAA,IACpB,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC;AAAA,IACpB,gBACE;AAAA,EACJ;AACF;AAIA,MAAM,gBAAqC;AAAA,EACzC;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,QAAQ,WAAW,YAAY,QAAQ;AAAA,IAC3D,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,mBAAmB,CAAC,QAAQ,WAAW,YAAY,SAAS;AAAA,IAC5D,gBACE;AAAA,EACJ;AACF;AAIA,MAAM,2BAAgD;AAAA,EACpD;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBACE;AAAA,EACJ;AACF;AAkBA,MAAM,wBAAwB,oBAAI,IAAI,CAAC,QAAQ,UAAU,MAAM,CAAC;AAEhE,MAAM,mBAAmD;AAAA,EACvD,SAAS,CAAC,YAAY,aAAa,QAAQ,OAAO;AAAA,EAClD,SAAS,CAAC,SAAS,WAAW,aAAa,SAAS;AAAA,EACpD,QAAQ,CAAC,UAAU,SAAS,QAAQ,SAAS;AAAA,EAC7C,QAAQ,CAAC,UAAU,SAAS,QAAQ,SAAS;AAAA,EAC7C,UAAU,CAAC,WAAW,WAAW,WAAW,UAAU;AAAA,EACtD,WAAW,CAAC,YAAY,UAAU,UAAU,OAAO;AAAA,EACnD,SAAS,CAAC,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC3C,MAAM,CAAC,QAAQ,SAAS,OAAO,QAAQ;AAAA,EACvC,OAAO,CAAC,SAAS,SAAS,SAAS,UAAU;AAAA,EAC7C,YAAY,CAAC,YAAY,YAAY,UAAU,UAAU;AAAA,EACzD,QAAQ,CAAC,WAAW,WAAW,SAAS,QAAQ;AAAA,EAChD,QAAQ,CAAC,WAAW,WAAW,UAAU,aAAa;AACxD;AAEA,MAAM,iBAAgC;AAAA,EACpC;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,MAAM;AAAA,IACN,eAAe,CAAC,OAAO,OAAO,QAAQ;AAAA,EACxC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,MAAM;AAAA,IACN,eAAe,CAAC,QAAQ,SAAS,MAAM;AAAA,EACzC;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,MAAM;AAAA,IACN,eAAe,CAAC,YAAY,QAAQ,QAAQ;AAAA,EAC9C;AACF;AAEA,MAAM,iBAAmC;AAAA,EACvC;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AACF;AAEA,MAAM,mBAAqC;AAAA,EACzC;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AACF;AAEA,MAAM,iBAAmC;AAAA,EACvC;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AACF;AAEA,MAAM,eAAiC;AAAA,EACrC;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AACF;AAEA,SAAS,QAAQ,OAAuB;AACtC,SAAO,MACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AACzB;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MAAM,YAAY,EAAE,QAAQ,MAAM,GAAG;AAC9C;AAEA,SAAS,WAAW,QAA4B;AAC9C,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,CAAC,UAAU,MAAM,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AACvE;AAEA,SAAS,qBACP,YACA,gBACQ;AACR,QAAM,WAAW,cAAc,UAAU;AACzC,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO,6CAA6C,QAAQ;AAAA,IAC9D,KAAK;AACH,aAAO,wCAAwC,QAAQ;AAAA,IACzD,KAAK;AACH,aAAO,8BAA8B,QAAQ;AAAA,IAC/C,KAAK;AACH,aAAO,4CAA4C,QAAQ;AAAA,IAC7D,KAAK;AACH,aAAO,sCAAsC,QAAQ;AAAA,IACvD,KAAK;AACH,aAAO,gCAAgC,QAAQ;AAAA,IACjD,KAAK;AACH,aAAO,uCAAuC,QAAQ;AAAA,IACxD,KAAK;AACH,aAAO,+BAA+B,QAAQ;AAAA,IAChD,KAAK;AACH,aAAO,gCAAgC,QAAQ;AAAA,IACjD,KAAK;AACH,aAAO,4CAA4C,QAAQ;AAAA,IAC7D,KAAK;AACH,aAAO,wCAAwC,QAAQ;AAAA,IACzD;AACE,aAAO,uBAAuB,QAAQ;AAAA,EAC1C;AACF;AAEA,SAAS,uBACP,MACA,gBACA,QACU;AACV,SAAO,WAAW;AAAA,IAChB,GAAG;AAAA,IACH,GAAG,iBAAiB,cAAc;AAAA,IAClC,GAAG,OAAO;AAAA,EACZ,CAAC,EAAE,MAAM,GAAG,CAAC;AACf;AAEA,SAAS,iCAAsD;AAC7D,QAAM,aAAkC,CAAC;AAEzC,aAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AACvE,QAAI,sBAAsB,IAAI,UAAU,EAAG;AAC3C,UAAM,CAAC,gBAAgB,GAAG,iBAAiB,IAAI;AAC/C,QAAI,CAAC,eAAgB;AAErB,eAAW,UAAU,gBAAgB;AACnC,iBAAW,UAAU,gBAAgB;AACnC,cAAM,iBAAiB,cAAc,UAAU;AAC/C,mBAAW,KAAK;AAAA,UACd,IAAI,qBAAqB,QAAQ,UAAU,CAAC,IAAI,OAAO,EAAE,IAAI,OAAO,EAAE;AAAA,UACtE,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,SAAS,OAAO;AAAA,UAChB,aAAa,GAAG,qBAAqB,YAAY,cAAc,CAAC,OAAO,OAAO,WAAW,UAAU,OAAO,WAAW;AAAA,UACrH,iBAAiB,OAAO;AAAA,UACxB,iBAAiB,OAAO;AAAA,UACxB,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,YACjB,eAAe,MAAM,GAAG;AAAA,YACxB;AAAA,YACA;AAAA,UACF;AAAA,UACA,gBAAgB;AAAA,YACd,2DAA2D,qBAAqB,YAAY,cAAc,CAAC;AAAA,YAC3G,+CAA+C,cAAc;AAAA,YAC7D,OAAO;AAAA,YACP,OAAO;AAAA,YACP,kBAAkB,SAAS,IACvB,mDAAmD,kBAAkB,KAAK,IAAI,CAAC,MAC/E;AAAA,UACN,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mCAAwD;AAC/D,QAAM,aAAkC,CAAC;AAEzC,aAAW,CAAC,cAAc,QAAQ,KAAK,OAAO,QAAQ,oBAAoB,GAAG;AAC3E,UAAM,CAAC,gBAAgB,GAAG,iBAAiB,IAAI;AAC/C,QAAI,CAAC,eAAgB;AAErB,eAAW,UAAU,kBAAkB;AACrC,iBAAW,UAAU,gBAAgB;AACnC,mBAAW,KAAK;AAAA,UACd,IAAI,sBAAsB,QAAQ,YAAY,CAAC,IAAI,OAAO,EAAE,IAAI,OAAO,EAAE;AAAA,UACzE,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,SAAS,OAAO;AAAA,UAChB,aAAa,oCAAoC,YAAY,iBAAiB,OAAO,WAAW;AAAA,UAChG,iBAAiB,OAAO;AAAA,UACxB,iBAAiB,OAAO;AAAA,UACxB,mBAAmB;AAAA,YACjB,aACG,MAAM,aAAa,EACnB,IAAI,CAAC,UAAU,MAAM,YAAY,CAAC;AAAA,YACrC;AAAA,YACA;AAAA,UACF;AAAA,UACA,gBAAgB;AAAA,YACd,2FAA2F,YAAY;AAAA,YACvG,+BAA+B,cAAc;AAAA,YAC7C,OAAO;AAAA,YACP,OAAO;AAAA,UACT,EAAE,KAAK,GAAG;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iCAAsD;AAC7D,QAAM,aAAkC,CAAC;AAEzC,aAAW,WAAW,gBAAgB;AACpC,eAAW,UAAU,gBAAgB;AACnC,iBAAW,UAAU,eAAe,MAAM,GAAG,CAAC,GAAG;AAC/C,mBAAW,KAAK;AAAA,UACd,IAAI,oBAAoB,OAAO,IAAI,OAAO,EAAE,IAAI,OAAO,EAAE;AAAA,UACzD,UAAU;AAAA,UACV,gBAAgB;AAAA,UAChB,SAAS,OAAO;AAAA,UAChB,aAAa,mBAAmB,OAAO,WAAW,OAAO,WAAW,SAAS,OAAO,WAAW;AAAA,UAC/F,iBAAiB,OAAO;AAAA,UACxB,iBAAiB,OAAO;AAAA,UACxB,mBAAmB,uBAAuB,CAAC,GAAG,SAAS,MAAM;AAAA,UAC7D,gBAAgB;AAAA,YACd,cAAc,OAAO;AAAA,YACrB,OAAO;AAAA,YACP,OAAO;AAAA,YACP;AAAA,UACF,EAAE,KAAK,GAAG;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,+BAAoD;AAC3D,SAAO,aAAa;AAAA,IAAQ,CAAC,WAC3B,eAAe,IAAI,CAAC,YAAY;AAAA,MAC9B,IAAI,kBAAkB,OAAO,EAAE,IAAI,OAAO,EAAE;AAAA,MAC5C,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,aAAa,GAAG,OAAO,WAAW,UAAU,OAAO,WAAW;AAAA,MAC9D,iBAAiB,OAAO;AAAA,MACxB,iBAAiB,OAAO;AAAA,MACxB,mBAAmB;AAAA,QACjB,CAAC,QAAQ,SAAS,QAAQ;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,MACT,EAAE,KAAK,GAAG;AAAA,IACZ,EAAE;AAAA,EACJ;AACF;AAEA,MAAM,2BAA2B,+BAA+B;AAChE,MAAM,6BAA6B,iCAAiC;AACpE,MAAM,2BAA2B,+BAA+B;AAChE,MAAM,yBAAyB,6BAA6B;AAE5D,SAAS,iBACP,YACqB;AACrB,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,WAAW,OAAO,CAAC,cAAc;AACtC,QAAI,KAAK,IAAI,UAAU,EAAE,EAAG,QAAO;AACnC,SAAK,IAAI,UAAU,EAAE;AACrB,WAAO;AAAA,EACT,CAAC;AACH;AAWA,MAAM,yBAA8C;AAAA,EAClD;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,aACE;AAAA,IACF,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,gBACE;AAAA,EACJ;AACF;AAKO,MAAM,iBAAsC,iBAAiB;AAAA,EAClE,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,CAAC;AAEM,MAAM,kBAAkB;AAAA,EAC7B,aACE,eAAe,SACf,cAAc,SACd,iBAAiB,SACjB,aAAa,SACb,kBAAkB,SAClB,cAAc,SACd,YAAY,SACZ,cAAc,SACd,gBAAgB,SAChB,cAAc,SACd,yBAAyB,SACzB,uBAAuB;AAAA,EACzB,sBAAsB,yBAAyB;AAAA,EAC/C,wBAAwB,2BAA2B;AAAA,EACnD,sBAAsB,yBAAyB;AAAA,EAC/C,oBAAoB,uBAAuB;AAAA,EAC3C,YAAY,eAAe;AAC7B;AAKO,SAAS,wBACd,UACqB;AACrB,SAAO,eAAe,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAC7D;AAKO,SAAS,uBACd,SACqB;AACrB,SAAO,eAAe;AAAA,IACpB,CAAC,MACC,EAAE,mBAAmB,WAAW,EAAE,mBAAmB,SAAS,OAAO;AAAA,EACzE;AACF;","names":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface ScenarioRunOptions {
|
|
2
|
+
workspaceRoot?: string;
|
|
3
|
+
bun?: string;
|
|
4
|
+
scenarioDir?: string;
|
|
5
|
+
outputDir?: string;
|
|
6
|
+
runId?: string;
|
|
7
|
+
scenario?: string;
|
|
8
|
+
fileGlobs?: string[];
|
|
9
|
+
exportNative?: boolean;
|
|
10
|
+
useDeterministicProxy?: boolean;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ScenarioRunResult {
|
|
14
|
+
workspaceRoot: string;
|
|
15
|
+
scenarioRunnerRoot: string;
|
|
16
|
+
scenarioDir: string;
|
|
17
|
+
outputDir: string;
|
|
18
|
+
runId: string;
|
|
19
|
+
matrixPath: string;
|
|
20
|
+
viewerHtmlPath: string;
|
|
21
|
+
nativeJsonlPath: string | null;
|
|
22
|
+
nativeManifestPath: string | null;
|
|
23
|
+
command: string[];
|
|
24
|
+
env: Record<string, string>;
|
|
25
|
+
stdout: string;
|
|
26
|
+
stderr: string;
|
|
27
|
+
exitCode: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function buildScenarioRunCommand(options: ScenarioRunOptions, resolved: {
|
|
30
|
+
scenarioDir: string;
|
|
31
|
+
outputDir: string;
|
|
32
|
+
runId: string;
|
|
33
|
+
nativeJsonlPath: string | null;
|
|
34
|
+
}): string[];
|
|
35
|
+
export declare function runScenarios(options?: ScenarioRunOptions): Promise<ScenarioRunResult>;
|
|
36
|
+
//# sourceMappingURL=scenario-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario-runner.d.ts","sourceRoot":"","sources":["../../src/core/scenario-runner.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAoFD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE;IACR,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,GACA,MAAM,EAAE,CAoBV;AAED,wBAAsB,YAAY,CAChC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAiI5B"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { trainingStateRoot } from "./training-config.js";
|
|
5
|
+
import { defaultBunCommand, resolveWorkspaceRoot } from "./workspace-runtime.js";
|
|
6
|
+
function safeTimestamp(value) {
|
|
7
|
+
return value.replace(/[:.]/g, "-");
|
|
8
|
+
}
|
|
9
|
+
function safeSegment(value) {
|
|
10
|
+
return value.replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
11
|
+
}
|
|
12
|
+
async function countJsonlRows(path) {
|
|
13
|
+
try {
|
|
14
|
+
const text = await readFile(path, "utf8");
|
|
15
|
+
return text.split(/\r?\n/).filter((line) => line.trim().length > 0).length;
|
|
16
|
+
} catch {
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function writeScenarioNativeManifest(input) {
|
|
21
|
+
if (!input.nativeJsonlPath) return null;
|
|
22
|
+
const manifestPath = join(input.outputDir, "scenario-native.manifest.json");
|
|
23
|
+
const rows = await countJsonlRows(input.nativeJsonlPath);
|
|
24
|
+
const manifest = {
|
|
25
|
+
schema: "eliza_scenario_native_export",
|
|
26
|
+
schemaVersion: 1,
|
|
27
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
28
|
+
source: {
|
|
29
|
+
kind: "scenario_native_export",
|
|
30
|
+
runId: input.runId,
|
|
31
|
+
scenario: input.scenario?.trim() || null,
|
|
32
|
+
dryRun: input.dryRun
|
|
33
|
+
},
|
|
34
|
+
outputDir: input.outputDir,
|
|
35
|
+
runDir: input.outputDir,
|
|
36
|
+
jsonlPath: input.nativeJsonlPath,
|
|
37
|
+
manifestPath,
|
|
38
|
+
runIds: [input.runId],
|
|
39
|
+
scenarioIds: input.scenario?.trim() ? [input.scenario.trim()] : [],
|
|
40
|
+
counts: {
|
|
41
|
+
rows,
|
|
42
|
+
jsonlRows: rows,
|
|
43
|
+
parsedTrajectories: rows
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}
|
|
47
|
+
`, "utf8");
|
|
48
|
+
return manifestPath;
|
|
49
|
+
}
|
|
50
|
+
function collectProcess(command, args, cwd, env) {
|
|
51
|
+
return new Promise((resolvePromise, reject) => {
|
|
52
|
+
const child = spawn(command, args, {
|
|
53
|
+
cwd,
|
|
54
|
+
env,
|
|
55
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
56
|
+
});
|
|
57
|
+
let stdout = "";
|
|
58
|
+
let stderr = "";
|
|
59
|
+
child.stdout.setEncoding("utf-8");
|
|
60
|
+
child.stderr.setEncoding("utf-8");
|
|
61
|
+
child.stdout.on("data", (chunk) => {
|
|
62
|
+
stdout += chunk;
|
|
63
|
+
});
|
|
64
|
+
child.stderr.on("data", (chunk) => {
|
|
65
|
+
stderr += chunk;
|
|
66
|
+
});
|
|
67
|
+
child.on("error", reject);
|
|
68
|
+
child.on("close", (code) => {
|
|
69
|
+
resolvePromise({ stdout, stderr, exitCode: code ?? 1 });
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function buildScenarioRunCommand(options, resolved) {
|
|
74
|
+
const args = [
|
|
75
|
+
"src/cli.ts",
|
|
76
|
+
"run",
|
|
77
|
+
resolved.scenarioDir,
|
|
78
|
+
"--run-dir",
|
|
79
|
+
resolved.outputDir,
|
|
80
|
+
"--runId",
|
|
81
|
+
resolved.runId
|
|
82
|
+
];
|
|
83
|
+
if (resolved.nativeJsonlPath) {
|
|
84
|
+
args.push("--export-native", resolved.nativeJsonlPath);
|
|
85
|
+
}
|
|
86
|
+
if (options.scenario?.trim()) {
|
|
87
|
+
args.push("--scenario", options.scenario.trim());
|
|
88
|
+
}
|
|
89
|
+
for (const glob of options.fileGlobs ?? []) {
|
|
90
|
+
if (glob.trim()) args.push(glob.trim());
|
|
91
|
+
}
|
|
92
|
+
return args;
|
|
93
|
+
}
|
|
94
|
+
async function runScenarios(options = {}) {
|
|
95
|
+
const workspaceRoot = resolveWorkspaceRoot(options.workspaceRoot);
|
|
96
|
+
const scenarioRunnerRoot = join(workspaceRoot, "packages", "scenario-runner");
|
|
97
|
+
const stamp = safeTimestamp((/* @__PURE__ */ new Date()).toISOString());
|
|
98
|
+
const runId = options.runId?.trim() || `training-scenarios-${stamp}`;
|
|
99
|
+
const outputDir = options.outputDir ?? join(trainingStateRoot(), "scenarios", safeSegment(runId));
|
|
100
|
+
const scenarioDir = resolve(
|
|
101
|
+
options.scenarioDir ?? join(scenarioRunnerRoot, "test", "scenarios")
|
|
102
|
+
);
|
|
103
|
+
const nativeJsonlPath = options.exportNative === false ? null : join(outputDir, "scenario-native.jsonl");
|
|
104
|
+
const nativeManifestPath = nativeJsonlPath ? join(outputDir, "scenario-native.manifest.json") : null;
|
|
105
|
+
const matrixPath = join(outputDir, "matrix.json");
|
|
106
|
+
const viewerHtmlPath = join(outputDir, "viewer", "index.html");
|
|
107
|
+
await mkdir(outputDir, { recursive: true });
|
|
108
|
+
const command = options.bun ?? defaultBunCommand();
|
|
109
|
+
const args = buildScenarioRunCommand(options, {
|
|
110
|
+
scenarioDir,
|
|
111
|
+
outputDir,
|
|
112
|
+
runId,
|
|
113
|
+
nativeJsonlPath
|
|
114
|
+
});
|
|
115
|
+
const env = {};
|
|
116
|
+
if (options.useDeterministicProxy !== false) {
|
|
117
|
+
env.SCENARIO_USE_LLM_PROXY = "1";
|
|
118
|
+
}
|
|
119
|
+
if (options.dryRun) {
|
|
120
|
+
await mkdir(join(outputDir, "viewer"), { recursive: true });
|
|
121
|
+
if (nativeJsonlPath) await writeFile(nativeJsonlPath, "", "utf8");
|
|
122
|
+
await writeFile(
|
|
123
|
+
matrixPath,
|
|
124
|
+
`${JSON.stringify(
|
|
125
|
+
{
|
|
126
|
+
schema: "eliza_scenario_run_viewer_v1",
|
|
127
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
128
|
+
runId,
|
|
129
|
+
runDir: outputDir,
|
|
130
|
+
providerName: options.useDeterministicProxy === false ? "configured-provider" : "deterministic-proxy",
|
|
131
|
+
scenarios: [
|
|
132
|
+
{
|
|
133
|
+
id: options.scenario?.trim() || "dry-run",
|
|
134
|
+
status: "skipped",
|
|
135
|
+
durationMs: 0
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
totalCount: 0,
|
|
139
|
+
passedCount: 0,
|
|
140
|
+
failedCount: 0,
|
|
141
|
+
skippedCount: 1,
|
|
142
|
+
dryRun: true
|
|
143
|
+
},
|
|
144
|
+
null,
|
|
145
|
+
2
|
|
146
|
+
)}
|
|
147
|
+
`,
|
|
148
|
+
"utf8"
|
|
149
|
+
);
|
|
150
|
+
await writeFile(
|
|
151
|
+
viewerHtmlPath,
|
|
152
|
+
"<!doctype html><title>Scenario Dry Run</title><pre>Scenario dry run manifest only.</pre>\n",
|
|
153
|
+
"utf8"
|
|
154
|
+
);
|
|
155
|
+
await writeScenarioNativeManifest({
|
|
156
|
+
outputDir,
|
|
157
|
+
runId,
|
|
158
|
+
scenario: options.scenario,
|
|
159
|
+
nativeJsonlPath,
|
|
160
|
+
dryRun: true
|
|
161
|
+
});
|
|
162
|
+
return {
|
|
163
|
+
workspaceRoot,
|
|
164
|
+
scenarioRunnerRoot,
|
|
165
|
+
scenarioDir,
|
|
166
|
+
outputDir,
|
|
167
|
+
runId,
|
|
168
|
+
matrixPath,
|
|
169
|
+
viewerHtmlPath,
|
|
170
|
+
nativeJsonlPath,
|
|
171
|
+
nativeManifestPath,
|
|
172
|
+
command: [command, ...args],
|
|
173
|
+
env,
|
|
174
|
+
stdout: "[DRY RUN] Would run scenario runner.",
|
|
175
|
+
stderr: "",
|
|
176
|
+
exitCode: 0
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const proc = await collectProcess(command, args, scenarioRunnerRoot, {
|
|
180
|
+
...process.env,
|
|
181
|
+
...env
|
|
182
|
+
});
|
|
183
|
+
if (proc.exitCode !== 0) {
|
|
184
|
+
throw new Error(
|
|
185
|
+
`eliza-scenarios exited with code ${proc.exitCode}: ${proc.stderr || proc.stdout}`
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
await writeScenarioNativeManifest({
|
|
189
|
+
outputDir,
|
|
190
|
+
runId,
|
|
191
|
+
scenario: options.scenario,
|
|
192
|
+
nativeJsonlPath,
|
|
193
|
+
dryRun: false
|
|
194
|
+
});
|
|
195
|
+
return {
|
|
196
|
+
workspaceRoot,
|
|
197
|
+
scenarioRunnerRoot,
|
|
198
|
+
scenarioDir,
|
|
199
|
+
outputDir,
|
|
200
|
+
runId,
|
|
201
|
+
matrixPath,
|
|
202
|
+
viewerHtmlPath,
|
|
203
|
+
nativeJsonlPath,
|
|
204
|
+
nativeManifestPath,
|
|
205
|
+
command: [command, ...args],
|
|
206
|
+
env,
|
|
207
|
+
stdout: proc.stdout,
|
|
208
|
+
stderr: proc.stderr,
|
|
209
|
+
exitCode: proc.exitCode
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
export {
|
|
213
|
+
buildScenarioRunCommand,
|
|
214
|
+
runScenarios
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=scenario-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/scenario-runner.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { trainingStateRoot } from \"./training-config.js\";\nimport { defaultBunCommand, resolveWorkspaceRoot } from \"./workspace-runtime.js\";\n\nexport interface ScenarioRunOptions {\n workspaceRoot?: string;\n bun?: string;\n scenarioDir?: string;\n outputDir?: string;\n runId?: string;\n scenario?: string;\n fileGlobs?: string[];\n exportNative?: boolean;\n useDeterministicProxy?: boolean;\n dryRun?: boolean;\n}\n\nexport interface ScenarioRunResult {\n workspaceRoot: string;\n scenarioRunnerRoot: string;\n scenarioDir: string;\n outputDir: string;\n runId: string;\n matrixPath: string;\n viewerHtmlPath: string;\n nativeJsonlPath: string | null;\n nativeManifestPath: string | null;\n command: string[];\n env: Record<string, string>;\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nfunction safeTimestamp(value: string): string {\n return value.replace(/[:.]/g, \"-\");\n}\n\nfunction safeSegment(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n}\n\nasync function countJsonlRows(path: string): Promise<number> {\n try {\n const text = await readFile(path, \"utf8\");\n return text.split(/\\r?\\n/).filter((line) => line.trim().length > 0).length;\n } catch {\n return 0;\n }\n}\n\nasync function writeScenarioNativeManifest(input: {\n outputDir: string;\n runId: string;\n scenario: string | undefined;\n nativeJsonlPath: string | null;\n dryRun: boolean;\n}): Promise<string | null> {\n if (!input.nativeJsonlPath) return null;\n const manifestPath = join(input.outputDir, \"scenario-native.manifest.json\");\n const rows = await countJsonlRows(input.nativeJsonlPath);\n const manifest = {\n schema: \"eliza_scenario_native_export\",\n schemaVersion: 1,\n generatedAt: new Date().toISOString(),\n source: {\n kind: \"scenario_native_export\",\n runId: input.runId,\n scenario: input.scenario?.trim() || null,\n dryRun: input.dryRun,\n },\n outputDir: input.outputDir,\n runDir: input.outputDir,\n jsonlPath: input.nativeJsonlPath,\n manifestPath,\n runIds: [input.runId],\n scenarioIds: input.scenario?.trim() ? [input.scenario.trim()] : [],\n counts: {\n rows,\n jsonlRows: rows,\n parsedTrajectories: rows,\n },\n };\n await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf8\");\n return manifestPath;\n}\n\nfunction collectProcess(\n command: string,\n args: string[],\n cwd: string,\n env: NodeJS.ProcessEnv,\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return new Promise((resolvePromise, reject) => {\n const child = spawn(command, args, {\n cwd,\n env,\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 buildScenarioRunCommand(\n options: ScenarioRunOptions,\n resolved: {\n scenarioDir: string;\n outputDir: string;\n runId: string;\n nativeJsonlPath: string | null;\n },\n): string[] {\n const args = [\n \"src/cli.ts\",\n \"run\",\n resolved.scenarioDir,\n \"--run-dir\",\n resolved.outputDir,\n \"--runId\",\n resolved.runId,\n ];\n if (resolved.nativeJsonlPath) {\n args.push(\"--export-native\", resolved.nativeJsonlPath);\n }\n if (options.scenario?.trim()) {\n args.push(\"--scenario\", options.scenario.trim());\n }\n for (const glob of options.fileGlobs ?? []) {\n if (glob.trim()) args.push(glob.trim());\n }\n return args;\n}\n\nexport async function runScenarios(\n options: ScenarioRunOptions = {},\n): Promise<ScenarioRunResult> {\n const workspaceRoot = resolveWorkspaceRoot(options.workspaceRoot);\n const scenarioRunnerRoot = join(workspaceRoot, \"packages\", \"scenario-runner\");\n const stamp = safeTimestamp(new Date().toISOString());\n const runId = options.runId?.trim() || `training-scenarios-${stamp}`;\n const outputDir =\n options.outputDir ??\n join(trainingStateRoot(), \"scenarios\", safeSegment(runId));\n const scenarioDir = resolve(\n options.scenarioDir ?? join(scenarioRunnerRoot, \"test\", \"scenarios\"),\n );\n const nativeJsonlPath =\n options.exportNative === false\n ? null\n : join(outputDir, \"scenario-native.jsonl\");\n const nativeManifestPath = nativeJsonlPath\n ? join(outputDir, \"scenario-native.manifest.json\")\n : null;\n const matrixPath = join(outputDir, \"matrix.json\");\n const viewerHtmlPath = join(outputDir, \"viewer\", \"index.html\");\n await mkdir(outputDir, { recursive: true });\n const command = options.bun ?? defaultBunCommand();\n const args = buildScenarioRunCommand(options, {\n scenarioDir,\n outputDir,\n runId,\n nativeJsonlPath,\n });\n const env: Record<string, string> = {};\n if (options.useDeterministicProxy !== false) {\n env.SCENARIO_USE_LLM_PROXY = \"1\";\n }\n if (options.dryRun) {\n await mkdir(join(outputDir, \"viewer\"), { recursive: true });\n if (nativeJsonlPath) await writeFile(nativeJsonlPath, \"\", \"utf8\");\n await writeFile(\n matrixPath,\n `${JSON.stringify(\n {\n schema: \"eliza_scenario_run_viewer_v1\",\n generatedAt: new Date().toISOString(),\n runId,\n runDir: outputDir,\n providerName:\n options.useDeterministicProxy === false\n ? \"configured-provider\"\n : \"deterministic-proxy\",\n scenarios: [\n {\n id: options.scenario?.trim() || \"dry-run\",\n status: \"skipped\",\n durationMs: 0,\n },\n ],\n totalCount: 0,\n passedCount: 0,\n failedCount: 0,\n skippedCount: 1,\n dryRun: true,\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n await writeFile(\n viewerHtmlPath,\n \"<!doctype html><title>Scenario Dry Run</title><pre>Scenario dry run manifest only.</pre>\\n\",\n \"utf8\",\n );\n await writeScenarioNativeManifest({\n outputDir,\n runId,\n scenario: options.scenario,\n nativeJsonlPath,\n dryRun: true,\n });\n return {\n workspaceRoot,\n scenarioRunnerRoot,\n scenarioDir,\n outputDir,\n runId,\n matrixPath,\n viewerHtmlPath,\n nativeJsonlPath,\n nativeManifestPath,\n command: [command, ...args],\n env,\n stdout: \"[DRY RUN] Would run scenario runner.\",\n stderr: \"\",\n exitCode: 0,\n };\n }\n\n const proc = await collectProcess(command, args, scenarioRunnerRoot, {\n ...process.env,\n ...env,\n });\n if (proc.exitCode !== 0) {\n throw new Error(\n `eliza-scenarios exited with code ${proc.exitCode}: ${\n proc.stderr || proc.stdout\n }`,\n );\n }\n await writeScenarioNativeManifest({\n outputDir,\n runId,\n scenario: options.scenario,\n nativeJsonlPath,\n dryRun: false,\n });\n return {\n workspaceRoot,\n scenarioRunnerRoot,\n scenarioDir,\n outputDir,\n runId,\n matrixPath,\n viewerHtmlPath,\n nativeJsonlPath,\n nativeManifestPath,\n command: [command, ...args],\n env,\n stdout: proc.stdout,\n stderr: proc.stderr,\n exitCode: proc.exitCode,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nightly skill-scoring cron job.
|
|
3
|
+
*
|
|
4
|
+
* For every curated skill (active + disabled), pull the most recent
|
|
5
|
+
* trajectories that referenced the skill, run `scoreSkill`, and rewrite the
|
|
6
|
+
* SKILL.md frontmatter with the new `provenance.lastEvalScore`.
|
|
7
|
+
*
|
|
8
|
+
* The job is registered via the runtime cron/Task scheduling path at agent boot.
|
|
9
|
+
* Failure to compute a score for a single skill never aborts the
|
|
10
|
+
* batch — we surface per-skill errors via the logger and continue.
|
|
11
|
+
*/
|
|
12
|
+
interface MinimalLogger {
|
|
13
|
+
info: (message: string) => void;
|
|
14
|
+
warn: (message: string) => void;
|
|
15
|
+
error: (message: string) => void;
|
|
16
|
+
debug: (message: string) => void;
|
|
17
|
+
}
|
|
18
|
+
interface RuntimeLike {
|
|
19
|
+
getService: (name: string) => unknown;
|
|
20
|
+
logger?: MinimalLogger;
|
|
21
|
+
registerEvent?: (name: string, handler: (payload: unknown) => Promise<void>) => void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Rewrite a SKILL.md file's `provenance.lastEvalScore` field in place.
|
|
25
|
+
*
|
|
26
|
+
* Implemented as a targeted text replacement to preserve the rest of the
|
|
27
|
+
* frontmatter exactly (no YAML round-trip). Adds `lastEvalScore` to the
|
|
28
|
+
* provenance block when the field is missing.
|
|
29
|
+
*/
|
|
30
|
+
export declare function applyScoreToSkillFile(filePath: string, score: number): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Score every curated active skill against the most recent trajectories from
|
|
33
|
+
* the runtime's trajectory store. Returns a per-skill report (kept small so
|
|
34
|
+
* tests can assert on it).
|
|
35
|
+
*/
|
|
36
|
+
export declare function runSkillScoringBatch(runtime: RuntimeLike, options?: {
|
|
37
|
+
trajectoryLimit?: number;
|
|
38
|
+
}): Promise<Array<{
|
|
39
|
+
name: string;
|
|
40
|
+
score: number;
|
|
41
|
+
updated: boolean;
|
|
42
|
+
error?: string;
|
|
43
|
+
}>>;
|
|
44
|
+
/**
|
|
45
|
+
* Register the nightly skill-scoring cron job + event handler against the
|
|
46
|
+
* agent runtime. Safe to call multiple times — we reuse any existing job and
|
|
47
|
+
* prune duplicate persisted registrations by name.
|
|
48
|
+
*
|
|
49
|
+
* Schedule defaults to "5 3 * * *" (03:05 local time) so it runs after the
|
|
50
|
+
* trajectory-export cron (which runs at 03:00).
|
|
51
|
+
*/
|
|
52
|
+
export declare function registerSkillScoringCron(runtime: RuntimeLike, options?: {
|
|
53
|
+
schedule?: string;
|
|
54
|
+
tz?: string;
|
|
55
|
+
}): Promise<void>;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=skill-scoring-cron.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-scoring-cron.d.ts","sourceRoot":"","sources":["../../src/core/skill-scoring-cron.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,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;IACjC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,UAAU,WAAW;IACnB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,KACzC,IAAI,CAAC;CACX;AAgCD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAkDT;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACrC,OAAO,CACR,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CACzE,CAyDA;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
|