<svg width="100%" viewBox="0 0 880 380" role="img" xmlns="http://www.w3.org/2000/svg">
  <title>Proactive — the agent reaches out</title>
  <desc>A cronjob fires or the agent calls send_message; the chosen plugin pushes to the right surface (voice-bridge for voice, sudo-api SSE for chat, Twilio REST for whatsapp).</desc>
  <style>
    text{font-family:"Anthropic Sans",-apple-system,system-ui,"Segoe UI",sans-serif}
    .t{font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central}
    .s{font-size:12px;text-anchor:middle;dominant-baseline:central}
    .lbl{font-size:11px;fill:#9c9a92;text-anchor:middle}
    rect{stroke-width:.5}
    .blue{fill:#1f3b7a;stroke:#8aaef0}    .bt{fill:#cfdcf4} .bs{fill:#8aaef0}
    .orange{fill:#712b13;stroke:#f0997b}  .ot{fill:#f5c4b3} .os{fill:#f0997b}
    .purple{fill:#3c3489;stroke:#afa9ec}  .pt{fill:#ceccf6} .ps{fill:#afa9ec}
    .arrow{fill:none;stroke:#9c9a92;stroke-width:1.5}
    .arrow-warn{fill:none;stroke:#d97757;stroke-width:1.5}
    .callout{fill:none;stroke:#d97757;stroke-width:.5;stroke-dasharray:4 3;opacity:.7}
  </style>
  <defs>
    <marker id="a" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
      <path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
    </marker>
  </defs>

  <rect class="orange" x="40" y="140" width="240" height="84" rx="8"/>
  <text class="t ot" x="160" y="166">🧠  hermes (your agent)</text>
  <text class="s os" x="160" y="188">cronjob(deliver=…)</text>
  <text class="s os" x="160" y="206">send_message(target=…)</text>

  <rect class="blue" x="560" y="40"  width="280" height="64" rx="8"/>
  <text class="t bt" x="700" y="64">sudo_voice  →  voice-bridge</text>
  <text class="s bs" x="700" y="84">POST :18087/v1/internal/voice/say</text>

  <rect class="blue" x="560" y="148" width="280" height="64" rx="8"/>
  <text class="t bt" x="700" y="172">sudo_chat  →  sudo-api</text>
  <text class="s bs" x="700" y="192">/v1/internal/chat/push → SSE fan-out</text>

  <rect class="purple" x="560" y="256" width="280" height="64" rx="8"/>
  <text class="t pt" x="700" y="280">twilio_whatsapp  →  Twilio</text>
  <text class="s ps" x="700" y="300">Messages REST</text>

  <path class="arrow" d="M 280 160 L 558 72"  marker-end="url(#a)"/>
  <text class="lbl"   x="380" y="118">target=sudo_voice</text>
  <path class="arrow" d="M 280 182 L 558 180" marker-end="url(#a)"/>
  <text class="lbl"   x="380" y="172">target=sudo_chat</text>
  <path class="arrow" d="M 280 204 L 558 288" marker-end="url(#a)"/>
  <text class="lbl"   x="380" y="246">target=twilio_whatsapp</text>

  <rect class="callout" x="560" y="335" width="280" height="30" rx="8"/>
  <text x="700" y="354" class="s" fill="#d97757" text-anchor="middle">sudo_voice 404 → fall back to another surface</text>
</svg>
