feat: full-service agency pitch — outreach email + subject, richer Gemini brief

- Prompt now describes complete agency capabilities (everything web-related)
- Concrete pitch examples with business name + specific problem references
- New mandatory output fields: outreach_email (3-4 sentence ready-to-send ES)
  and email_subject (specific subject line)
- HOT/WARM/COLD scoring guide based on site deficiency count
- Modal: pitch box replaced with full outreach email + subject + Copy button
- max_output_tokens raised to 6000

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-14 08:34:37 +02:00
parent 6cea07f0f4
commit 88c27bfff5
2 changed files with 65 additions and 24 deletions

View File

@@ -237,10 +237,16 @@ tr:hover td{background:rgba(255,255,255,.025)}
</div>
</div>
<!-- Pitch -->
<!-- Outreach email -->
<div style="background:#6c63ff15;border:1px solid #6c63ff33;border-radius:6px;padding:10px;margin:8px 0">
<div style="font-size:10px;color:var(--muted);text-transform:uppercase;margin-bottom:4px">Cold Pitch (ES)</div>
<div style="font-size:13px;font-style:italic;color:var(--accent2)" x-text="modal.ai.pitch_angle||'—'"></div>
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px">
<div style="font-size:10px;color:var(--muted);text-transform:uppercase">Outreach Email (ES)</div>
<button class="btn bg sm" @click="copyEmail()" style="font-size:10px;padding:2px 8px">📋 Copy</button>
</div>
<div x-show="modal.ai.email_subject" style="font-size:11px;color:var(--muted);margin-bottom:4px">
<b>Subject:</b> <span x-text="modal.ai.email_subject"></span>
</div>
<div style="font-size:12px;font-style:italic;color:var(--accent2);line-height:1.5;white-space:pre-wrap" x-text="modal.ai.outreach_email || modal.ai.pitch_angle || '—'"></div>
</div>
<!-- Accessibility issues -->
@@ -657,6 +663,15 @@ function app() {
},
async restartAiWorker() { await fetch('/api/ai/worker/restart',{method:'POST'}); this.notify('AI worker restarted','info'); await this.loadAiStatus(); },
copyEmail() {
const subj = this.modal.ai.email_subject ? `Subject: ${this.modal.ai.email_subject}\n\n` : '';
const body = this.modal.ai.outreach_email || this.modal.ai.pitch_angle || '';
navigator.clipboard.writeText(subj + body).then(
() => this.notify('Email copied to clipboard', 'success'),
() => this.notify('Copy failed — select text manually', 'error'),
);
},
async resetAiStuck() { const r=await fetch('/api/ai/reset',{method:'POST'}); const d=await r.json(); this.notify(`Reset ${d.reset} stuck jobs → pending`,'success'); await this.loadAiStatus(); },
async startEnrich() { await fetch('/api/enrich/resume',{method:'POST'}); this.notify('Worker started','success'); await this.loadQueue(); },
async pauseEnrich() { await fetch('/api/enrich/pause',{method:'POST'}); this.notify('Worker paused','success'); await this.loadQueue(); },