controller.yaml
yaml
sha256:41d741fb345c4abdb640838aa3d847de02ccffd7a39fce04894e743e683b50d0
fix(security): pin patched transitive deps to clear Dependa…
Human
minor
⚠ breaking
7 days ago
| 1 | name: controller |
| 2 | title: Project content controller |
| 3 | description: | |
| 4 | Orchestrates the 6 conveyor-belt agents per project (script-writer, social-poster, |
| 5 | thumbnail-brief, clip-factory, blog-seo, newsletter) plus the 3 SaaS bridges |
| 6 | (heygen-render, elevenlabs-tts, descript-import). Watches budgets, surfaces drafts |
| 7 | in the Hub UI for human approval. One run produces a complete content package |
| 8 | (1 long-form + 5 shorts + blog + newsletter + 5 social captions + 1 thumbnail). |
| 9 | |
| 10 | # Controller is a deterministic pipeline runner, not an LLM. It uses no model. |
| 11 | # It reads the per-project config, kicks off the 6 conveyor agents in parallel |
| 12 | # (where dependencies allow), then chains the bridges sequentially. |
| 13 | type: pipeline |
| 14 | |
| 15 | inputs: |
| 16 | project: |
| 17 | type: enum |
| 18 | values: [born-free, store-free, knowtation] |
| 19 | required: true |
| 20 | topic: |
| 21 | type: string |
| 22 | required: true |
| 23 | max_length: 200 |
| 24 | dry_run: |
| 25 | type: boolean |
| 26 | default: false |
| 27 | kinds: |
| 28 | type: array |
| 29 | items: |
| 30 | enum: [script, social, thumbnail, clip, blog, newsletter] |
| 31 | default: [script, social, thumbnail, clip, blog, newsletter] |
| 32 | |
| 33 | # Dependency graph — each step lists its prerequisites. |
| 34 | # Paperclip topologically sorts and runs independent steps in parallel. |
| 35 | steps: |
| 36 | - id: research |
| 37 | skill: search-vault |
| 38 | args: |
| 39 | project: "{{project}}" |
| 40 | query: "{{topic}}" |
| 41 | limit: 8 |
| 42 | outputs: [research_results] |
| 43 | |
| 44 | - id: write_script |
| 45 | agent: script-writer |
| 46 | needs: [research] |
| 47 | when: "{{ 'script' in kinds }}" |
| 48 | inputs: |
| 49 | project: "{{project}}" |
| 50 | topic: "{{topic}}" |
| 51 | research: "{{research_results}}" |
| 52 | outputs: [script_path] |
| 53 | |
| 54 | - id: render_video |
| 55 | agent: heygen-render |
| 56 | needs: [write_script] |
| 57 | when: "{{ 'script' in kinds and not dry_run }}" |
| 58 | inputs: |
| 59 | project: "{{project}}" |
| 60 | script_path: "{{script_path}}" |
| 61 | outputs: [video_url] |
| 62 | timeout_seconds: 1200 # HeyGen Avatar IV can take 5-10 min for 5 min content |
| 63 | |
| 64 | - id: import_to_descript |
| 65 | agent: descript-import |
| 66 | needs: [render_video] |
| 67 | when: "{{ 'clip' in kinds and not dry_run }}" |
| 68 | inputs: |
| 69 | project: "{{project}}" |
| 70 | video_url: "{{video_url}}" |
| 71 | outputs: [descript_project_id] |
| 72 | |
| 73 | - id: write_social |
| 74 | agent: social-poster |
| 75 | needs: [write_script] |
| 76 | when: "{{ 'social' in kinds }}" |
| 77 | inputs: |
| 78 | project: "{{project}}" |
| 79 | topic: "{{topic}}" |
| 80 | script_path: "{{script_path}}" |
| 81 | outputs: [social_path] |
| 82 | |
| 83 | - id: write_thumbnail_brief |
| 84 | agent: thumbnail-brief |
| 85 | needs: [write_script] |
| 86 | when: "{{ 'thumbnail' in kinds }}" |
| 87 | inputs: |
| 88 | project: "{{project}}" |
| 89 | topic: "{{topic}}" |
| 90 | script_path: "{{script_path}}" |
| 91 | outputs: [thumbnail_path] |
| 92 | |
| 93 | - id: write_clips |
| 94 | agent: clip-factory |
| 95 | needs: [write_script] |
| 96 | when: "{{ 'clip' in kinds }}" |
| 97 | inputs: |
| 98 | project: "{{project}}" |
| 99 | topic: "{{topic}}" |
| 100 | script_path: "{{script_path}}" |
| 101 | outputs: [clips_path] |
| 102 | |
| 103 | - id: write_blog |
| 104 | agent: blog-seo |
| 105 | needs: [write_script] |
| 106 | when: "{{ 'blog' in kinds }}" |
| 107 | inputs: |
| 108 | project: "{{project}}" |
| 109 | topic: "{{topic}}" |
| 110 | script_path: "{{script_path}}" |
| 111 | outputs: [blog_path] |
| 112 | |
| 113 | - id: write_newsletter |
| 114 | agent: newsletter |
| 115 | needs: [write_script] |
| 116 | when: "{{ 'newsletter' in kinds }}" |
| 117 | inputs: |
| 118 | project: "{{project}}" |
| 119 | topic: "{{topic}}" |
| 120 | script_path: "{{script_path}}" |
| 121 | outputs: [newsletter_path] |
| 122 | |
| 123 | # Budget guards. Hard stop the controller (and therefore all agents) before this. |
| 124 | # Reset monthly. Visible in the Hub UI. |
| 125 | budgets: |
| 126 | per_run: |
| 127 | deepinfra_usd: 2.00 # one full content package across 6 agents @ Qwen 2.5-72B |
| 128 | heygen_credits: 100 # one Avatar IV render of ~5 min |
| 129 | elevenlabs_credits: 5000 # one ~5-min voice gen |
| 130 | descript_minutes: 30 # one media file imported |
| 131 | per_month_per_project: |
| 132 | deepinfra_usd: 80.00 |
| 133 | heygen_credits: 800 # ~40 min/mo of Avatar IV per project |
| 134 | elevenlabs_credits: 30000 # ~30 min/mo per project (90 min/mo across 3 projects vs 100 min Creator quota) |
| 135 | descript_minutes: 600 # ~10 hrs/mo per project (3.3 hrs/mo each on 10-hr plan) |
| 136 | |
| 137 | # What a successful run produces. |
| 138 | expected_artifacts: |
| 139 | - kind: script |
| 140 | path_pattern: "projects/{{project}}/drafts/{{date}}-script-*.md" |
| 141 | - kind: social |
| 142 | path_pattern: "projects/{{project}}/drafts/{{date}}-social-*.md" |
| 143 | - kind: thumbnail |
| 144 | path_pattern: "projects/{{project}}/drafts/{{date}}-thumbnail-*.md" |
| 145 | - kind: clip |
| 146 | path_pattern: "projects/{{project}}/drafts/{{date}}-clip-*.md" |
| 147 | - kind: blog |
| 148 | path_pattern: "projects/{{project}}/drafts/{{date}}-blog-*.md" |
| 149 | - kind: newsletter |
| 150 | path_pattern: "projects/{{project}}/drafts/{{date}}-newsletter-*.md" |
File History
1 commit
sha256:41d741fb345c4abdb640838aa3d847de02ccffd7a39fce04894e743e683b50d0
fix(security): pin patched transitive deps to clear Dependa…
Human
minor
⚠
7 days ago