provisioning-code/resources/diagrams/tries/arch-diag-v2 copy.svg
Jesús Pérez b1c8e38a61 init repo
2026-07-09 20:36:57 +01:00

476 lines
30 KiB
XML

<svg viewBox="0 0 1280 900" xmlns="http://www.w3.org/2000/svg">
<style>
.orbit-flow { animation: orbit-dash 4s linear infinite; }
@keyframes orbit-dash { from { stroke-dashoffset: 40; } to { stroke-dashoffset: 0; } }
.ring-glow { animation: ring-breathe 3s ease-in-out infinite; }
@keyframes ring-breathe { 0%,100% { opacity: 0.06; } 50% { opacity: 0.18; } }
.spoke { animation: spoke-dash 2s linear infinite; }
@keyframes spoke-dash { from { stroke-dashoffset: 16; } to { stroke-dashoffset: 0; } }
.health { animation: pulse 2.2s ease-in-out infinite; }
.health-d1 { animation-delay: 0.4s; }
.health-d2 { animation-delay: 0.8s; }
.health-d3 { animation-delay: 1.2s; }
.health-d4 { animation-delay: 1.6s; }
@keyframes pulse { 0%,100% { opacity: 0.35; } 50% { opacity: 1; } }
.https-beam { animation: https-p 4s ease-in-out infinite; }
@keyframes https-p { 0%,100% { opacity: 0.15; stroke-width: 1.5; } 50% { opacity: 0.7; stroke-width: 2.5; } }
.https-label { animation: https-lbl 4s ease-in-out infinite; }
@keyframes https-lbl { 0%,100% { opacity: 0.3; } 50% { opacity: 1; } }
.solid-border { animation: solid-glow 3.5s ease-in-out infinite; }
@keyframes solid-glow { 0%,100% { stroke-opacity: 0.3; } 50% { stroke-opacity: 0.7; } }
.hub-pulse { animation: hub-beat 3s ease-in-out infinite; }
@keyframes hub-beat { 0%,100% { opacity: 0.3; } 50% { opacity: 0.6; } }
.cred-dot { opacity: 0; }
.db-flow { animation: db-dash 2.5s linear infinite; }
@keyframes db-dash { from { stroke-dashoffset: 12; } to { stroke-dashoffset: 0; } }
</style>
<defs>
<filter id="glow-blue" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur in="SourceGraphic" stdDeviation="6" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<filter id="glow-orange" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur in="SourceGraphic" stdDeviation="5" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<filter id="glow-pink" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur in="SourceGraphic" stdDeviation="5" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<filter id="glow-purple" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur in="SourceGraphic" stdDeviation="5" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<filter id="glow-cyan" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur in="SourceGraphic" stdDeviation="5" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<filter id="glow-gold" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur in="SourceGraphic" stdDeviation="6" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<filter id="soft-shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="0" dy="2" stdDeviation="8" flood-color="#000" flood-opacity="0.5"/>
</filter>
<filter id="ring-glow-f" x="-20%" y="-20%" width="140%" height="140%">
<feGaussianBlur in="SourceGraphic" stdDeviation="8" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<radialGradient id="bg-radial" cx="50%" cy="42%" r="55%">
<stop offset="0%" stop-color="#111520"/>
<stop offset="100%" stop-color="#0a0c10"/>
</radialGradient>
<radialGradient id="hub-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#94a3b8" stop-opacity="0.15"/>
<stop offset="100%" stop-color="#94a3b8" stop-opacity="0"/>
</radialGradient>
<linearGradient id="orch-grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#2a2016"/><stop offset="100%" stop-color="#1a150f"/>
</linearGradient>
<linearGradient id="ctrl-grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#1a1630"/><stop offset="100%" stop-color="#110f1e"/>
</linearGradient>
<linearGradient id="vault-grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#2a1630"/><stop offset="100%" stop-color="#1a0f1e"/>
</linearGradient>
<linearGradient id="ext-grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#2a1620"/><stop offset="100%" stop-color="#1a0f14"/>
</linearGradient>
<linearGradient id="mcp-grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#0f2a2e"/><stop offset="100%" stop-color="#0a1c1e"/>
</linearGradient>
<linearGradient id="surreal-grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#1a1428"/><stop offset="100%" stop-color="#110e1c"/>
</linearGradient>
<linearGradient id="cli-grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#1a2a42"/><stop offset="100%" stop-color="#0f1a2e"/>
</linearGradient>
<marker id="arr-blue" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
<polygon points="0 0, 8 3, 0 6" fill="#4a9eff"/>
</marker>
<marker id="arr-silver" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
<polygon points="0 0, 8 3, 0 6" fill="#94a3b8"/>
</marker>
<marker id="arr-gold" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
<polygon points="0 0, 8 3, 0 6" fill="#fbbf24"/>
</marker>
<path id="orbit-cw" d="M 640,185 A 135,135 0 1,1 640,455 A 135,135 0 1,1 640,185 Z" fill="none"/>
<path id="orbit-ccw" d="M 640,185 A 135,135 0 1,0 640,455 A 135,135 0 1,0 640,185 Z" fill="none"/>
<path id="path-orch-vault" d="M 640,185 A 135,135 0 0,0 508,276" fill="none"/>
<path id="path-vault-orch" d="M 508,276 A 135,135 0 0,1 640,185" fill="none"/>
<path id="path-cli-orch" d="M 640,98 L 640,115" fill="none"/>
</defs>
<!-- ═══ BACKGROUND ═══ -->
<rect width="1280" height="900" fill="url(#bg-radial)"/>
<g opacity="0.03">
<pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
<path d="M 40 0 L 0 0 0 40" fill="none" stroke="#fff" stroke-width="0.5"/>
</pattern>
<rect width="1280" height="900" fill="url(#grid)"/>
</g>
<!-- Star field -->
<g opacity="0.35">
<circle cx="95" cy="145" r="0.8" fill="#fff"/><circle cx="340" cy="78" r="0.6" fill="#fff"/>
<circle cx="890" cy="115" r="1" fill="#fff"/><circle cx="1120" cy="210" r="0.7" fill="#fff"/>
<circle cx="180" cy="460" r="0.5" fill="#fff"/><circle cx="1160" cy="510" r="0.8" fill="#fff"/>
<circle cx="72" cy="660" r="0.6" fill="#fff"/><circle cx="960" cy="710" r="0.9" fill="#fff"/>
</g>
<!-- ═══ TITLE ═══ -->
<text x="640" y="28" text-anchor="middle" fill="#e2e6ee" font-family="'DM Sans',sans-serif" font-weight="700" font-size="17" letter-spacing="1.5">INFRASTRUCTURE PROVISIONING SYSTEM</text>
<text x="640" y="48" text-anchor="middle" fill="#5a6070" font-family="'IBM Plex Mono',monospace" font-size="10" letter-spacing="3">CONTROL PLANE ARCHITECTURE</text>
<line x1="510" y1="56" x2="770" y2="56" stroke="#333" stroke-width="0.8"/>
<!-- ═══ CLI ═══ -->
<g>
<rect x="535" y="64" width="210" height="34" rx="8" fill="url(#cli-grad)" filter="url(#soft-shadow)"/>
<rect x="535" y="64" width="210" height="34" rx="8" fill="none" stroke="#1c2a3a" stroke-width="1"/>
<rect x="535" y="67" width="3" height="28" rx="1.5" fill="#4a9eff" opacity="0.6"/>
<circle cx="556" cy="78" r="7" fill="#2d3748" stroke="#4a9eff" stroke-width="1" opacity="0.8"/>
<text x="556" y="81" text-anchor="middle" fill="#4a9eff" font-size="8" font-family="'IBM Plex Mono',monospace">$</text>
<text x="570" y="78" fill="#4a9eff" font-family="'DM Sans',sans-serif" font-weight="600" font-size="11">CLI</text>
<text x="548" y="92" fill="#6b8aaa" font-family="'IBM Plex Mono',monospace" font-size="8">provisioning create server</text>
</g>
<!-- Arrow: CLI → Orchestrator -->
<line x1="640" y1="98" x2="640" y2="115" stroke="#4a9eff" stroke-width="1.5" stroke-dasharray="5 3" class="spoke" opacity="0.7" marker-end="url(#arr-blue)"/>
<!-- ═══════════════════════════════════════ -->
<!-- NATS ORBITAL RING SYSTEM -->
<!-- ═══════════════════════════════════════ -->
<!-- Ring outer glow -->
<circle cx="640" cy="320" r="138" fill="none" stroke="#94a3b8" stroke-width="10" opacity="0.04" class="ring-glow" filter="url(#ring-glow-f)"/>
<!-- Main orbit ring (flowing dashes) -->
<circle cx="640" cy="320" r="135" fill="none" stroke="#94a3b8" stroke-width="2" stroke-dasharray="10 8" class="orbit-flow" opacity="0.45"/>
<!-- Inner engine ring (counter-rotating) -->
<circle cx="640" cy="320" r="80" fill="none" stroke="#5a6278" stroke-width="1" stroke-dasharray="6 6" opacity="0.3">
<animateTransform attributeName="transform" type="rotate" from="360 640 320" to="0 640 320" dur="15s" repeatCount="indefinite"/>
</circle>
<!-- Smallest inner ring (clockwise) -->
<circle cx="640" cy="320" r="45" fill="none" stroke="#3a4050" stroke-width="0.8" stroke-dasharray="4 4" opacity="0.2">
<animateTransform attributeName="transform" type="rotate" from="0 640 320" to="360 640 320" dur="25s" repeatCount="indefinite"/>
</circle>
<!-- Hub center glow -->
<circle cx="640" cy="320" r="40" fill="url(#hub-glow)" class="hub-pulse"/>
<!-- Hub core dot -->
<circle cx="640" cy="320" r="5" fill="#94a3b8" opacity="0.5" class="hub-pulse"/>
<!-- Hub labels -->
<text x="640" y="305" text-anchor="middle" fill="#c8d0dc" font-family="'DM Sans',sans-serif" font-weight="700" font-size="14" letter-spacing="1.5">NATS</text>
<text x="640" y="322" text-anchor="middle" fill="#8090a0" font-family="'IBM Plex Mono',monospace" font-size="9" letter-spacing="2">JETSTREAM</text>
<text x="640" y="336" text-anchor="middle" fill="#5a6278" font-family="'IBM Plex Mono',monospace" font-size="8">:4222</text>
<!-- ═══════════════════════════════════════ -->
<!-- SATELLITE SERVICES -->
<!-- ═══════════════════════════════════════ -->
<!-- ─── ORCHESTRATOR (top, 0°) ─── -->
<g>
<rect x="505" y="95" width="270" height="110" rx="14" fill="none" stroke="#f59e0b" stroke-width="1.5" stroke-dasharray="8 4" class="solid-border"/>
<rect x="515" y="105" width="250" height="90" rx="10" fill="url(#orch-grad)" filter="url(#soft-shadow)"/>
<rect x="515" y="105" width="250" height="90" rx="10" fill="none" stroke="#3a2e1c" stroke-width="1"/>
<rect x="515" y="108" width="3" height="84" rx="1.5" fill="#f59e0b" opacity="0.5"/>
<circle cx="537" cy="127" r="8" fill="#2d3748" stroke="#f59e0b" stroke-width="1" opacity="0.8"/>
<text x="537" y="131" text-anchor="middle" fill="#f59e0b" font-size="9"></text>
<text x="553" y="130" fill="#d8ccc0" font-family="'DM Sans',sans-serif" font-weight="600" font-size="12" letter-spacing="0.5">Orchestrator</text>
<text x="740" y="130" text-anchor="end" fill="#f59e0b" font-family="'IBM Plex Mono',monospace" font-size="8" opacity="0.5">:9011</text>
<circle cx="752" cy="127" r="3.5" fill="#f59e0b" class="health"/>
<g font-family="'IBM Plex Mono',monospace" font-size="8" fill="#6b6050">
<rect x="528" y="143" width="220" height="14" rx="4" fill="#1a150f" stroke="#3a2e1c" stroke-width="0.5"/>
<text x="638" y="153" text-anchor="middle" opacity="0.9">Task State Machine • Provider API • SSH</text>
<rect x="528" y="162" width="220" height="14" rx="4" fill="#1a150f" stroke="#3a2e1c" stroke-width="0.5"/>
<text x="638" y="172" text-anchor="middle" opacity="0.85">Webhooks • Rollback • Audit Collector</text>
</g>
</g>
<!-- ─── CONTROL CENTER (72°, upper-right) ─── -->
<g>
<rect x="750" y="200" width="250" height="110" rx="10" fill="url(#ctrl-grad)" filter="url(#soft-shadow)"/>
<rect x="750" y="200" width="250" height="110" rx="10" fill="none" stroke="#2e2848" stroke-width="1"/>
<rect x="996" y="203" width="3" height="104" rx="1.5" fill="#818cf8" opacity="0.5"/>
<circle cx="772" cy="222" r="8" fill="#2d3748" stroke="#818cf8" stroke-width="1" opacity="0.8"/>
<text x="772" y="226" text-anchor="middle" fill="#818cf8" font-size="9"></text>
<text x="788" y="225" fill="#c0c0d8" font-family="'DM Sans',sans-serif" font-weight="600" font-size="12" letter-spacing="0.5">Control Center</text>
<text x="980" y="225" text-anchor="end" fill="#818cf8" font-family="'IBM Plex Mono',monospace" font-size="8" opacity="0.5">:9012</text>
<circle cx="992" cy="222" r="3.5" fill="#818cf8" class="health health-d1"/>
<g font-family="'IBM Plex Mono',monospace" font-size="8" fill="#5a5878">
<rect x="763" y="238" width="220" height="14" rx="4" fill="#110f1e" stroke="#2e2848" stroke-width="0.5"/>
<text x="873" y="248" text-anchor="middle" opacity="0.9">Cedar Policies • JWT • Sessions</text>
<rect x="763" y="257" width="220" height="14" rx="4" fill="#110f1e" stroke="#2e2848" stroke-width="0.5"/>
<text x="873" y="267" text-anchor="middle" opacity="0.85">WebSocket • RBAC • Solo: auto-session</text>
</g>
</g>
<!-- ─── AI/MCP (144°, lower-right) ─── -->
<g>
<rect x="725" y="410" width="250" height="110" rx="10" fill="url(#mcp-grad)" filter="url(#soft-shadow)"/>
<rect x="725" y="410" width="250" height="110" rx="10" fill="none" stroke="#1c3038" stroke-width="1"/>
<rect x="971" y="413" width="3" height="104" rx="1.5" fill="#22d3ee" opacity="0.5"/>
<circle cx="747" cy="432" r="8" fill="#2d3748" stroke="#22d3ee" stroke-width="1" opacity="0.8"/>
<text x="747" y="436" text-anchor="middle" fill="#22d3ee" font-size="9">🧠</text>
<text x="763" y="435" fill="#c0d8d8" font-family="'DM Sans',sans-serif" font-weight="600" font-size="11" letter-spacing="0.5">AI • MCP</text>
<text x="960" y="435" text-anchor="end" fill="#22d3ee" font-family="'IBM Plex Mono',monospace" font-size="8" opacity="0.5">:9082</text>
<circle cx="972" cy="432" r="3.5" fill="#22d3ee" class="health health-d2"/>
<g font-family="'IBM Plex Mono',monospace" font-size="8" fill="#385a58">
<rect x="738" y="448" width="220" height="14" rx="4" fill="#0a1c1e" stroke="#1c3038" stroke-width="0.5"/>
<text x="848" y="458" text-anchor="middle" opacity="0.9">RAG Engine • MCP Server • Tools</text>
<rect x="738" y="467" width="220" height="14" rx="4" fill="#0a1c1e" stroke="#1c3038" stroke-width="0.5"/>
<text x="848" y="477" text-anchor="middle" opacity="0.85">Embeddings • Model Routing • KGraph</text>
</g>
</g>
<!-- ─── EXTENSION REGISTRY (216°, lower-left) ─── -->
<g>
<rect x="305" y="410" width="250" height="110" rx="10" fill="url(#ext-grad)" filter="url(#soft-shadow)"/>
<rect x="305" y="410" width="250" height="110" rx="10" fill="none" stroke="#3a1c28" stroke-width="1"/>
<rect x="305" y="413" width="3" height="104" rx="1.5" fill="#ef4444" opacity="0.5"/>
<circle cx="327" cy="432" r="8" fill="#2d3748" stroke="#ef4444" stroke-width="1" opacity="0.8"/>
<text x="327" y="436" text-anchor="middle" fill="#ef4444" font-size="9"></text>
<text x="343" y="435" fill="#d8c0c8" font-family="'DM Sans',sans-serif" font-weight="600" font-size="11" letter-spacing="0.5">Ext Registry</text>
<text x="530" y="435" text-anchor="end" fill="#ef4444" font-family="'IBM Plex Mono',monospace" font-size="8" opacity="0.5">:8084</text>
<circle cx="542" cy="432" r="3.5" fill="#ef4444" class="health health-d3"/>
<g font-family="'IBM Plex Mono',monospace" font-size="8" fill="#5a3848">
<rect x="318" y="448" width="220" height="14" rx="4" fill="#1a0f14" stroke="#3a1c28" stroke-width="0.5"/>
<text x="428" y="458" text-anchor="middle" opacity="0.9">Gitea • Forgejo • OCI • LRU</text>
<rect x="318" y="467" width="220" height="14" rx="4" fill="#1a0f14" stroke="#3a1c28" stroke-width="0.5"/>
<text x="428" y="477" text-anchor="middle" opacity="0.85">Providers • Taskservs • vault:// creds</text>
</g>
</g>
<!-- ─── VAULT SERVICE (288°, upper-left) ─── -->
<g>
<rect x="280" y="200" width="250" height="110" rx="10" fill="url(#vault-grad)" filter="url(#soft-shadow)"/>
<rect x="280" y="200" width="250" height="110" rx="10" fill="none" stroke="#3a1c30" stroke-width="1"/>
<rect x="280" y="203" width="3" height="104" rx="1.5" fill="#ec4899" opacity="0.5"/>
<circle cx="302" cy="222" r="8" fill="#2d3748" stroke="#ec4899" stroke-width="1" opacity="0.8"/>
<text x="302" y="226" text-anchor="middle" fill="#ec4899" font-size="9">🛡</text>
<text x="318" y="225" fill="#d8c0d0" font-family="'DM Sans',sans-serif" font-weight="600" font-size="12" letter-spacing="0.5">Vault Service</text>
<text x="510" y="225" text-anchor="end" fill="#ec4899" font-family="'IBM Plex Mono',monospace" font-size="8" opacity="0.5">:9094</text>
<circle cx="522" cy="222" r="3.5" fill="#ec4899" class="health health-d4"/>
<g font-family="'IBM Plex Mono',monospace" font-size="8" fill="#5a3850">
<rect x="293" y="238" width="220" height="14" rx="4" fill="#1a0f1e" stroke="#3a1c30" stroke-width="0.5"/>
<text x="403" y="248" text-anchor="middle" opacity="0.9">Lease Lifecycle • Key Management</text>
<rect x="293" y="257" width="220" height="14" rx="4" fill="#1a0f1e" stroke="#3a1c30" stroke-width="0.5"/>
<text x="403" y="267" text-anchor="middle" opacity="0.85">SOPS • Age • Secrets never in NATS</text>
</g>
</g>
<!-- ═══ HTTPS CREDENTIAL BEAM ═══ -->
<line x1="480" y1="250" x2="560" y2="160" stroke="#fbbf24" stroke-width="2" class="https-beam" filter="url(#glow-gold)"/>
<line x1="480" y1="250" x2="560" y2="160" stroke="#fbbf24" stroke-width="1" stroke-dasharray="4 3" class="https-beam" opacity="0.4"/>
<text x="495" y="200" fill="#fbbf24" font-family="'IBM Plex Mono',monospace" font-size="7" font-weight="700" class="https-label" transform="rotate(-65,495,200)">HTTPS</text>
<!-- ═══ ORBITAL PARTICLES ═══ -->
<circle r="3.5" fill="#f59e0b" opacity="0" filter="url(#glow-orange)">
<animateMotion dur="8s" begin="0s" repeatCount="indefinite">
<mpath href="#orbit-cw"/>
</animateMotion>
<animate attributeName="opacity" values="0;0.9;0.9;0" keyTimes="0;0.05;0.92;1" dur="8s" repeatCount="indefinite"/>
</circle>
<circle r="2.5" fill="#ec4899" opacity="0" filter="url(#glow-pink)">
<animateMotion dur="10s" begin="2s" repeatCount="indefinite">
<mpath href="#orbit-cw"/>
</animateMotion>
<animate attributeName="opacity" values="0;0.8;0.8;0" keyTimes="0;0.05;0.92;1" dur="10s" begin="2s" repeatCount="indefinite"/>
</circle>
<circle r="3" fill="#4a9eff" opacity="0" filter="url(#glow-blue)">
<animateMotion dur="7s" begin="1s" repeatCount="indefinite">
<mpath href="#orbit-ccw"/>
</animateMotion>
<animate attributeName="opacity" values="0;0.85;0.85;0" keyTimes="0;0.05;0.92;1" dur="7s" begin="1s" repeatCount="indefinite"/>
</circle>
<circle r="2.5" fill="#818cf8" opacity="0" filter="url(#glow-purple)">
<animateMotion dur="9s" begin="4s" repeatCount="indefinite">
<mpath href="#orbit-cw"/>
</animateMotion>
<animate attributeName="opacity" values="0;0.7;0.7;0" keyTimes="0;0.05;0.92;1" dur="9s" begin="4s" repeatCount="indefinite"/>
</circle>
<circle r="3" fill="#22d3ee" opacity="0" filter="url(#glow-cyan)">
<animateMotion dur="11s" begin="3s" repeatCount="indefinite">
<mpath href="#orbit-ccw"/>
</animateMotion>
<animate attributeName="opacity" values="0;0.75;0.75;0" keyTimes="0;0.05;0.92;1" dur="11s" begin="3s" repeatCount="indefinite"/>
</circle>
<circle r="2" fill="#ef4444" opacity="0" filter="url(#glow-orange)">
<animateMotion dur="12s" begin="5s" repeatCount="indefinite">
<mpath href="#orbit-cw"/>
</animateMotion>
<animate attributeName="opacity" values="0;0.7;0.7;0" keyTimes="0;0.05;0.92;1" dur="12s" begin="5s" repeatCount="indefinite"/>
</circle>
<!-- ═══ CREDENTIAL FLOW ═══ -->
<circle r="4" fill="#f59e0b" opacity="0" filter="url(#glow-gold)">
<animateMotion dur="2.5s" begin="0s" repeatCount="indefinite">
<mpath href="#path-orch-vault"/>
</animateMotion>
<animate attributeName="opacity" values="0;0.95;0.95;0" keyTimes="0;0.1;0.8;1" dur="2.5s" repeatCount="indefinite"/>
</circle>
<circle r="3.5" fill="#ec4899" opacity="0" filter="url(#glow-pink)">
<animateMotion dur="2.5s" begin="4s" repeatCount="indefinite">
<mpath href="#path-vault-orch"/>
</animateMotion>
<animate attributeName="opacity" values="0;0.9;0.9;0" keyTimes="0;0.1;0.8;1" dur="2.5s" begin="4s" repeatCount="indefinite"/>
</circle>
<circle r="3" fill="#4a9eff" opacity="0" filter="url(#glow-blue)">
<animateMotion dur="1.2s" begin="0s" repeatCount="indefinite">
<mpath href="#path-cli-orch"/>
</animateMotion>
<animate attributeName="opacity" values="0;0.85;0.85;0" keyTimes="0;0.15;0.7;1" dur="1.2s" repeatCount="indefinite"/>
</circle>
<!-- ═══ CONNECTIONS TO SURREALDB ═══ -->
<g opacity="0.3">
<line x1="640" y1="455" x2="640" y2="520" stroke="#a78bfa" stroke-width="1" stroke-dasharray="4 3" class="db-flow" marker-end="url(#arr-silver)"/>
<line x1="520" y1="430" x2="380" y2="520" stroke="#a78bfa" stroke-width="0.8" stroke-dasharray="4 3" class="db-flow" marker-end="url(#arr-silver)"/>
<line x1="760" y1="430" x2="900" y2="520" stroke="#a78bfa" stroke-width="0.8" stroke-dasharray="4 3" class="db-flow" marker-end="url(#arr-silver)"/>
</g>
<!-- ═══ SURREALDB ═══ -->
<g>
<rect x="120" y="522" width="1040" height="50" rx="8" fill="url(#surreal-grad)" filter="url(#soft-shadow)"/>
<rect x="120" y="522" width="1040" height="50" rx="8" fill="none" stroke="#2e2450" stroke-width="1"/>
<rect x="120" y="568" width="1040" height="4" rx="2" fill="#a78bfa" opacity="0.2"/>
<text x="640" y="537" text-anchor="middle" fill="#c4b5e0" font-family="'DM Sans',sans-serif" font-weight="700" font-size="11" letter-spacing="1">SURREALDB PERSISTENCE</text>
<text x="1120" y="537" text-anchor="end" fill="#a78bfa" font-family="'IBM Plex Mono',monospace" font-size="7" opacity="0.4">Solo: RocksDB • Multi: WebSocket</text>
<g font-family="'IBM Plex Mono',monospace" font-size="7">
<rect x="148" y="545" width="130" height="16" rx="3" fill="#110e1c" stroke="#2e2450" stroke-width="0.5"/>
<text x="213" y="556" text-anchor="middle" fill="#a78bfa" opacity="0.8">orchestrator</text>
<rect x="290" y="545" width="110" height="16" rx="3" fill="#110e1c" stroke="#2e2450" stroke-width="0.5"/>
<text x="345" y="556" text-anchor="middle" fill="#a78bfa" opacity="0.8">vault</text>
<rect x="412" y="545" width="140" height="16" rx="3" fill="#110e1c" stroke="#2e2450" stroke-width="0.5"/>
<text x="482" y="556" text-anchor="middle" fill="#a78bfa" opacity="0.8">control_center</text>
<rect x="564" y="545" width="90" height="16" rx="3" fill="#110e1c" stroke="#2e2450" stroke-width="0.5"/>
<text x="609" y="556" text-anchor="middle" fill="#a78bfa" opacity="0.8">audit</text>
<rect x="666" y="545" width="130" height="16" rx="3" fill="#110e1c" stroke="#2e2450" stroke-width="0.5"/>
<text x="731" y="556" text-anchor="middle" fill="#a78bfa" opacity="0.8">workspace</text>
<rect x="808" y="545" width="100" height="16" rx="3" fill="none" stroke="#2e2450" stroke-width="0.4"/>
<text x="858" y="556" text-anchor="middle" fill="#5a4878" opacity="0.6">Nickel config</text>
</g>
</g>
<!-- ═══ SOLID ENFORCEMENT ═══ -->
<g transform="translate(120, 585)">
<text x="0" y="0" fill="#3a3e48" font-family="'IBM Plex Mono',monospace" font-weight="600" font-size="8" letter-spacing="1.5">SOLID ENFORCEMENT LAYERS</text>
<g font-family="'IBM Plex Mono',monospace" font-size="7">
<rect x="0" y="8" width="80" height="12" rx="3" fill="#f59e0b" opacity="0.06" stroke="#f59e0b" stroke-width="0.4" stroke-opacity="0.2"/>
<text x="40" y="17" text-anchor="middle" fill="#f59e0b" opacity="0.6">Compile-time</text>
<rect x="88" y="8" width="68" height="12" rx="3" fill="#818cf8" opacity="0.06" stroke="#818cf8" stroke-width="0.4" stroke-opacity="0.2"/>
<text x="122" y="17" text-anchor="middle" fill="#818cf8" opacity="0.6">Dev-time</text>
<rect x="164" y="8" width="74" height="12" rx="3" fill="#ec4899" opacity="0.06" stroke="#ec4899" stroke-width="0.4" stroke-opacity="0.2"/>
<text x="201" y="17" text-anchor="middle" fill="#ec4899" opacity="0.6">Pre-commit</text>
<rect x="246" y="8" width="50" height="12" rx="3" fill="#ef4444" opacity="0.06" stroke="#ef4444" stroke-width="0.4" stroke-opacity="0.2"/>
<text x="271" y="17" text-anchor="middle" fill="#ef4444" opacity="0.6">CI/CD</text>
<rect x="304" y="8" width="60" height="12" rx="3" fill="#22d3ee" opacity="0.06" stroke="#22d3ee" stroke-width="0.4" stroke-opacity="0.2"/>
<text x="334" y="17" text-anchor="middle" fill="#22d3ee" opacity="0.6">Runtime</text>
<rect x="372" y="8" width="50" height="12" rx="3" fill="#94a3b8" opacity="0.06" stroke="#94a3b8" stroke-width="0.4" stroke-opacity="0.2"/>
<text x="397" y="17" text-anchor="middle" fill="#94a3b8" opacity="0.6">Audit</text>
</g>
<g font-family="'IBM Plex Mono',monospace" font-size="7" fill="#3a3e48" opacity="0.5">
<text x="480" y="12">Provider APIs: Orchestrator only | SSH: Orchestrator + Machines</text>
<text x="480" y="24">Auth: Control Center only | Secrets: Vault Service API only</text>
</g>
</g>
<!-- ═══ LEGEND ═══ -->
<g transform="translate(120, 625)" font-family="'IBM Plex Mono',monospace" font-size="8">
<text x="0" y="0" fill="#3a3e48" font-weight="600" font-size="8" letter-spacing="1.5">SERVICES</text>
<circle cx="7" cy="12" r="3" fill="#f59e0b"/><text x="15" y="16" fill="#6b6050">Orchestrator</text>
<circle cx="7" cy="24" r="3" fill="#818cf8"/><text x="15" y="28" fill="#5a5878">Control Center</text>
<circle cx="7" cy="36" r="3" fill="#ec4899"/><text x="15" y="40" fill="#5a3850">Vault Service</text>
<circle cx="7" cy="48" r="3" fill="#ef4444"/><text x="15" y="52" fill="#5a3848">Extension Registry</text>
<circle cx="7" cy="60" r="3" fill="#22d3ee"/><text x="15" y="64" fill="#385a58">AI • MCP</text>
<text x="340" y="0" fill="#3a3e48" font-weight="600" font-size="8" letter-spacing="1.5">INFRASTRUCTURE</text>
<circle cx="348" cy="12" r="5" fill="none" stroke="#94a3b8" stroke-width="1.2" stroke-dasharray="2 2"/>
<text x="360" y="16" fill="#5a6278">NATS Orbital Ring (:4222)</text>
<line x1="340" y1="24" x2="354" y2="24" stroke="#a78bfa" stroke-width="1.5"/>
<text x="360" y="28" fill="#5a4878">SurrealDB Persistence</text>
<line x1="340" y1="36" x2="354" y2="36" stroke="#fbbf24" stroke-width="1.5"/>
<text x="360" y="40" fill="#6b6050">HTTPS Credentials</text>
<text x="700" y="0" fill="#3a3e48" font-weight="600" font-size="8" letter-spacing="1.5">MODES</text>
<rect x="700" y="6" width="40" height="10" rx="2" fill="#34d399" opacity="0.1" stroke="#34d399" stroke-width="0.4"/>
<text x="720" y="14" text-anchor="middle" fill="#34d399" font-size="7" font-weight="600">SOLO</text>
<text x="750" y="14" fill="#4a7a5a" font-size="7">RocksDB + local NATS + auto-session</text>
<rect x="700" y="20" width="40" height="10" rx="2" fill="#818cf8" opacity="0.1" stroke="#818cf8" stroke-width="0.4"/>
<text x="720" y="28" text-anchor="middle" fill="#818cf8" font-size="7" font-weight="600">MULTI</text>
<text x="750" y="28" fill="#5a5878" font-size="7">WebSocket DB + NATS cluster + JWT+Cedar</text>
</g>
<!-- ═══ DEPLOYMENT ═══ -->
<g transform="translate(0, 750)" font-family="'IBM Plex Mono',monospace">
<rect x="160" y="0" width="120" height="30" rx="6" fill="#2a1515" stroke="#2a1010" stroke-width="0.8"/>
<circle cx="174" cy="11" r="3" fill="#ef4444"/><text x="182" y="14" fill="#d0a0a0" font-size="8" font-weight="500">Production</text>
<text x="174" y="26" fill="#5a3838" font-size="7" text-anchor="middle">Hetzner • AWS</text>
<rect x="300" y="0" width="120" height="30" rx="6" fill="#2a2010" stroke="#1a1810" stroke-width="0.8"/>
<circle cx="314" cy="11" r="3" fill="#f59e0b"/><text x="322" y="14" fill="#d0c0a0" font-size="8" font-weight="500">Staging</text>
<text x="314" y="26" fill="#5a5038" font-size="7" text-anchor="middle">K8s cluster</text>
<rect x="440" y="0" width="120" height="30" rx="6" fill="#1a2820" stroke="#0a1810" stroke-width="0.8"/>
<circle cx="454" cy="11" r="3" fill="#34d399"/><text x="462" y="14" fill="#a0d0b8" font-size="8" font-weight="500">Dev</text>
<text x="454" y="26" fill="#385a48" font-size="7" text-anchor="middle">Solo mode</text>
<rect x="580" y="0" width="120" height="30" rx="6" fill="#1a182a" stroke="#0a0a1a" stroke-width="0.8"/>
<circle cx="594" cy="11" r="3" fill="#818cf8"/><text x="602" y="14" fill="#b0b0d8" font-size="8" font-weight="500">Edge</text>
<text x="594" y="26" fill="#48486a" font-size="7" text-anchor="middle">On-prem • IoT</text>
<rect x="720" y="0" width="120" height="30" rx="6" fill="#1a2020" stroke="#0a1010" stroke-width="0.8"/>
<circle cx="734" cy="11" r="3" fill="#22d3ee"/><text x="742" y="14" fill="#a0c8c8" font-size="8" font-weight="500">Custom</text>
<text x="734" y="26" fill="#385858" font-size="7" text-anchor="middle">GitOps • Webhook</text>
</g>
<!-- ═══ VERSION ═══ -->
<text x="1180" y="880" text-anchor="end" fill="#5a6070" font-family="'IBM Plex Mono',monospace" font-size="9" letter-spacing="0.5">v4.0 • Orbital Control Plane</text>
</svg>