733 lines
42 KiB
XML
733 lines
42 KiB
XML
|
|
<svg viewBox="0 0 1280 900" xmlns="http://www.w3.org/2000/svg">
|
||
|
|
<style>
|
||
|
|
/* Flowing dashed lines */
|
||
|
|
.flow-down { animation: dash-down 1.8s linear infinite; }
|
||
|
|
.flow-up { animation: dash-up 1.8s linear infinite; }
|
||
|
|
.flow-right{ animation: dash-right 2.5s linear infinite; }
|
||
|
|
|
||
|
|
@keyframes dash-down { from { stroke-dashoffset: 24; } to { stroke-dashoffset: 0; } }
|
||
|
|
@keyframes dash-up { from { stroke-dashoffset: 0; } to { stroke-dashoffset: 24; } }
|
||
|
|
@keyframes dash-right { from { stroke-dashoffset: 24; } to { stroke-dashoffset: 0; } }
|
||
|
|
|
||
|
|
/* Service health pulse */
|
||
|
|
.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; r: 4; }
|
||
|
|
50% { opacity: 1; r: 5; }
|
||
|
|
}
|
||
|
|
|
||
|
|
/* NATS bus glow breathing */
|
||
|
|
.nats-glow { animation: nats-breathe 3s ease-in-out infinite; }
|
||
|
|
@keyframes nats-breathe {
|
||
|
|
0%, 100% { opacity: 0.12; }
|
||
|
|
50% { opacity: 0.25; }
|
||
|
|
}
|
||
|
|
|
||
|
|
/* NATS particle flow */
|
||
|
|
.nats-particle { opacity: 0; }
|
||
|
|
.np1 { animation: particle-lr 5s linear 0s infinite; }
|
||
|
|
.np2 { animation: particle-lr 5s linear 1.2s infinite; }
|
||
|
|
.np3 { animation: particle-lr 5s linear 2.4s infinite; }
|
||
|
|
.np4 { animation: particle-rl 6s linear 0.5s infinite; }
|
||
|
|
.np5 { animation: particle-rl 6s linear 2.8s infinite; }
|
||
|
|
|
||
|
|
@keyframes particle-lr {
|
||
|
|
0% { transform: translateX(0); opacity: 0; }
|
||
|
|
5% { opacity: 0.9; }
|
||
|
|
90% { opacity: 0.9; }
|
||
|
|
100% { transform: translateX(1100px); opacity: 0; }
|
||
|
|
}
|
||
|
|
@keyframes particle-rl {
|
||
|
|
0% { transform: translateX(0); opacity: 0; }
|
||
|
|
5% { opacity: 0.7; }
|
||
|
|
90% { opacity: 0.7; }
|
||
|
|
100% { transform: translateX(-1100px); opacity: 0; }
|
||
|
|
}
|
||
|
|
|
||
|
|
/* HTTPS credential line pulse */
|
||
|
|
.https-line { animation: https-pulse 4s ease-in-out infinite; }
|
||
|
|
@keyframes https-pulse {
|
||
|
|
0%, 100% { opacity: 0.25; stroke-width: 1.5; }
|
||
|
|
50% { opacity: 0.8; stroke-width: 2.5; }
|
||
|
|
}
|
||
|
|
|
||
|
|
.https-label { animation: https-label-pulse 4s ease-in-out infinite; }
|
||
|
|
@keyframes https-label-pulse {
|
||
|
|
0%, 100% { opacity: 0.4; }
|
||
|
|
50% { opacity: 1; }
|
||
|
|
}
|
||
|
|
|
||
|
|
/* SOLID boundary glow */
|
||
|
|
.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; }
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Infinite engine rotation */
|
||
|
|
.engine-outer { animation: engine-spin 20s linear infinite; transform-origin: 640px 365px; }
|
||
|
|
.engine-inner { animation: engine-spin-rev 12s linear infinite; transform-origin: 640px 365px; }
|
||
|
|
.engine-core { animation: engine-pulse 3s ease-in-out infinite; transform-origin: 640px 365px; }
|
||
|
|
|
||
|
|
@keyframes engine-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
|
||
|
|
@keyframes engine-spin-rev { from { transform: rotate(360deg); } to { transform: rotate(0deg); } }
|
||
|
|
@keyframes engine-pulse {
|
||
|
|
0%, 100% { opacity: 0.15; transform: scale(1); }
|
||
|
|
50% { opacity: 0.3; transform: scale(1.05); }
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Credential flow particles */
|
||
|
|
.cred-dot { opacity: 0; }
|
||
|
|
</style>
|
||
|
|
|
||
|
|
<defs>
|
||
|
|
<!-- Glow filters (preserved from v1) -->
|
||
|
|
<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-green" 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-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="nats-shadow" x="-10%" y="-30%" width="120%" height="160%">
|
||
|
|
<feGaussianBlur in="SourceAlpha" stdDeviation="12" result="blur"/>
|
||
|
|
<feFlood flood-color="#94a3b8" flood-opacity="0.15" result="color"/>
|
||
|
|
<feComposite in="color" in2="blur" operator="in"/>
|
||
|
|
<feMerge><feMergeNode/><feMergeNode in="SourceGraphic"/></feMerge>
|
||
|
|
</filter>
|
||
|
|
|
||
|
|
<!-- Gradients -->
|
||
|
|
<radialGradient id="bg-radial" cx="50%" cy="40%" r="55%">
|
||
|
|
<stop offset="0%" stop-color="#111520"/>
|
||
|
|
<stop offset="100%" stop-color="#0a0c10"/>
|
||
|
|
</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="nats-grad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||
|
|
<stop offset="0%" stop-color="#161b24"/>
|
||
|
|
<stop offset="100%" stop-color="#0e1118"/>
|
||
|
|
</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>
|
||
|
|
|
||
|
|
<!-- Arrow markers -->
|
||
|
|
<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-orange" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#f59e0b"/>
|
||
|
|
</marker>
|
||
|
|
<marker id="arr-pink" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#ec4899"/>
|
||
|
|
</marker>
|
||
|
|
<marker id="arr-purple" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#818cf8"/>
|
||
|
|
</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-red" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#ef4444"/>
|
||
|
|
</marker>
|
||
|
|
<marker id="arr-cyan" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
|
||
|
|
<polygon points="0 0, 8 3, 0 6" fill="#22d3ee"/>
|
||
|
|
</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>
|
||
|
|
|
||
|
|
<!-- Credential flow paths -->
|
||
|
|
<path id="path-orch-nats-vault"
|
||
|
|
d="M 585,315 L 585,365 L 205,365 L 205,315"
|
||
|
|
fill="none"/>
|
||
|
|
<path id="path-vault-nats-orch"
|
||
|
|
d="M 205,315 L 205,375 L 585,375 L 585,315"
|
||
|
|
fill="none"/>
|
||
|
|
<path id="path-task-cli-orch"
|
||
|
|
d="M 640,130 L 640,180"
|
||
|
|
fill="none"/>
|
||
|
|
<path id="path-status-nats-cli"
|
||
|
|
d="M 585,345 L 585,215 L 640,130"
|
||
|
|
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="#ffffff" stroke-width="0.5"/>
|
||
|
|
</pattern>
|
||
|
|
<rect width="1280" height="900" fill="url(#grid)"/>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- ═══ TITLE ═══ -->
|
||
|
|
<text x="640" y="30" 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="52" text-anchor="middle" fill="#5a6070" font-family="'IBM Plex Mono', monospace" font-weight="400" font-size="10" letter-spacing="3">CONTROL PLANE ARCHITECTURE</text>
|
||
|
|
<line x1="510" y1="62" x2="770" y2="62" stroke="#333" stroke-width="0.8"/>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═══ CLI INPUT ═══ -->
|
||
|
|
<g>
|
||
|
|
<rect x="510" y="76" width="260" height="50" rx="10" fill="url(#cli-grad)" filter="url(#soft-shadow)"/>
|
||
|
|
<rect x="510" y="76" width="260" height="50" rx="10" fill="none" stroke="#1c2a3a" stroke-width="1"/>
|
||
|
|
<rect x="510" y="80" width="4" height="42" rx="1.5" fill="#4a9eff" opacity="0.6"/>
|
||
|
|
|
||
|
|
<circle cx="536" cy="95" r="9" fill="#2d3748" stroke="#4a9eff" stroke-width="1" opacity="0.8"/>
|
||
|
|
<text x="536" y="99" text-anchor="middle" fill="#4a9eff" font-size="9" font-family="'IBM Plex Mono', monospace">$</text>
|
||
|
|
|
||
|
|
<text x="554" y="95" fill="#4a9eff" font-family="'DM Sans', sans-serif" font-weight="600" font-size="12" letter-spacing="0.6">CLI</text>
|
||
|
|
<text x="527" y="116" fill="#6b8aaa" font-family="'IBM Plex Mono', monospace" font-size="9">provisioning create server</text>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- Arrow: CLI → Orchestrator -->
|
||
|
|
<line x1="640" y1="126" x2="640" y2="176" stroke="#4a9eff" stroke-width="1.5" stroke-dasharray="6 4" class="flow-down" opacity="0.7" marker-end="url(#arr-blue)"/>
|
||
|
|
<rect x="614" y="141" width="52" height="14" rx="7" fill="#4a9eff" opacity="0.08"/>
|
||
|
|
<text x="640" y="152" text-anchor="middle" fill="#4a9eff" font-family="'IBM Plex Mono', monospace" font-size="7" font-weight="600" opacity="0.6">HTTP</text>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
<!-- UPPER SERVICE TIER -->
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<!-- ─── VAULT SERVICE (left) ─── -->
|
||
|
|
<g>
|
||
|
|
<rect x="60" y="180" width="290" height="132" rx="12" fill="url(#vault-grad)" filter="url(#soft-shadow)"/>
|
||
|
|
<rect x="60" y="180" width="290" height="132" rx="12" fill="none" stroke="#3a1c30" stroke-width="1"/>
|
||
|
|
<rect x="60" y="180" width="4" height="132" rx="2" fill="#ec4899" opacity="0.5"/>
|
||
|
|
|
||
|
|
<circle cx="88" cy="202" r="10" fill="#2d3748" stroke="#ec4899" stroke-width="1" opacity="0.8"/>
|
||
|
|
<text x="88" y="206" text-anchor="middle" fill="#ec4899" font-size="10">🛡</text>
|
||
|
|
|
||
|
|
<text x="106" y="206" fill="#d8c0d0" font-family="'DM Sans', sans-serif" font-weight="600" font-size="13" letter-spacing="0.7">Vault Service</text>
|
||
|
|
<text x="320" y="206" text-anchor="end" fill="#ec4899" font-family="'IBM Plex Mono', monospace" font-size="9" opacity="0.5">:9094</text>
|
||
|
|
<circle cx="336" cy="202" r="4" fill="#ec4899" class="health"/>
|
||
|
|
|
||
|
|
<g font-family="'IBM Plex Mono', monospace" font-size="9">
|
||
|
|
<rect x="78" y="220" width="104" height="19" rx="5" fill="#1a0f1e" stroke="#3a1c30" stroke-width="0.7"/>
|
||
|
|
<text x="130" y="233" text-anchor="middle" fill="#ec4899" opacity="0.85">Lease Lifecycle</text>
|
||
|
|
|
||
|
|
<rect x="190" y="220" width="104" height="19" rx="5" fill="#1a0f1e" stroke="#3a1c30" stroke-width="0.7"/>
|
||
|
|
<text x="242" y="233" text-anchor="middle" fill="#ec4899" opacity="0.85">Key Management</text>
|
||
|
|
|
||
|
|
<rect x="78" y="247" width="216" height="17" rx="4" fill="none" stroke="#3a1c30" stroke-width="0.5"/>
|
||
|
|
<text x="186" y="259" text-anchor="middle" fill="#5a3850" font-size="8">SOPS · Age · Seal/Unseal · Rotation</text>
|
||
|
|
|
||
|
|
<rect x="78" y="272" width="216" height="17" rx="4" fill="none" stroke="#3a1c30" stroke-width="0.5"/>
|
||
|
|
<text x="186" y="284" text-anchor="middle" fill="#5a3850" font-size="8">Secrets never in NATS — lease_id only</text>
|
||
|
|
</g>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- ─── ORCHESTRATOR (center, main) ─── -->
|
||
|
|
<g>
|
||
|
|
<!-- SOLID boundary overlay (animated glow) -->
|
||
|
|
<rect x="432" y="172" width="306" height="148" rx="16" fill="none"
|
||
|
|
stroke="#f59e0b" stroke-width="1.5" stroke-dasharray="8 4" class="solid-border"/>
|
||
|
|
|
||
|
|
<rect x="440" y="180" width="290" height="132" rx="12" fill="url(#orch-grad)" filter="url(#soft-shadow)"/>
|
||
|
|
<rect x="440" y="180" width="290" height="132" rx="12" fill="none" stroke="#3a2e1c" stroke-width="1"/>
|
||
|
|
<rect x="440" y="180" width="4" height="132" rx="2" fill="#f59e0b" opacity="0.5"/>
|
||
|
|
|
||
|
|
<circle cx="468" cy="202" r="10" fill="#2d3748" stroke="#f59e0b" stroke-width="1" opacity="0.8"/>
|
||
|
|
<text x="468" y="206" text-anchor="middle" fill="#f59e0b" font-size="10">▶</text>
|
||
|
|
|
||
|
|
<text x="486" y="206" fill="#d8ccc0" font-family="'DM Sans', sans-serif" font-weight="600" font-size="13" letter-spacing="0.7">Orchestrator</text>
|
||
|
|
<text x="700" y="206" text-anchor="end" fill="#f59e0b" font-family="'IBM Plex Mono', monospace" font-size="9" opacity="0.5">:9011</text>
|
||
|
|
<circle cx="716" cy="202" r="4" fill="#f59e0b" class="health health-d1"/>
|
||
|
|
|
||
|
|
<g font-family="'IBM Plex Mono', monospace" font-size="9">
|
||
|
|
<rect x="458" y="220" width="112" height="19" rx="5" fill="#1a150f" stroke="#3a2e1c" stroke-width="0.7"/>
|
||
|
|
<text x="514" y="233" text-anchor="middle" fill="#f59e0b" opacity="0.85">Task State Mach</text>
|
||
|
|
|
||
|
|
<rect x="578" y="220" width="92" height="19" rx="5" fill="#1a150f" stroke="#3a2e1c" stroke-width="0.7"/>
|
||
|
|
<text x="624" y="233" text-anchor="middle" fill="#f59e0b" opacity="0.85">Provider API</text>
|
||
|
|
|
||
|
|
<rect x="458" y="247" width="92" height="17" rx="4" fill="none" stroke="#3a2e1c" stroke-width="0.5"/>
|
||
|
|
<text x="504" y="259" text-anchor="middle" fill="#6b6050" font-size="8">SSH/Machines</text>
|
||
|
|
|
||
|
|
<rect x="558" y="247" width="92" height="17" rx="4" fill="none" stroke="#3a2e1c" stroke-width="0.5"/>
|
||
|
|
<text x="604" y="259" text-anchor="middle" fill="#6b6050" font-size="8">Webhooks</text>
|
||
|
|
|
||
|
|
<rect x="458" y="272" width="192" height="17" rx="4" fill="none" stroke="#3a2e1c" stroke-width="0.5"/>
|
||
|
|
<text x="554" y="284" text-anchor="middle" fill="#6b6050" font-size="8">Rollback · Audit Collector · Logs</text>
|
||
|
|
</g>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- SOLID badge on Orchestrator -->
|
||
|
|
<rect x="450" y="296" width="182" height="14" rx="7" fill="#f59e0b" opacity="0.1"/>
|
||
|
|
<text x="541" y="306" text-anchor="middle" fill="#f59e0b" font-family="'IBM Plex Mono', monospace" font-size="7" font-weight="700" letter-spacing="0.3" opacity="0.7">SOLID: SOLE PROVIDER + SSH ACCESS</text>
|
||
|
|
|
||
|
|
<!-- ─── CONTROL CENTER (right) ─── -->
|
||
|
|
<g>
|
||
|
|
<rect x="820" y="180" width="290" height="132" rx="12" fill="url(#ctrl-grad)" filter="url(#soft-shadow)"/>
|
||
|
|
<rect x="820" y="180" width="290" height="132" rx="12" fill="none" stroke="#2e2848" stroke-width="1"/>
|
||
|
|
<rect x="1106" y="180" width="4" height="132" rx="2" fill="#818cf8" opacity="0.5"/>
|
||
|
|
|
||
|
|
<circle cx="848" cy="202" r="10" fill="#2d3748" stroke="#818cf8" stroke-width="1" opacity="0.8"/>
|
||
|
|
<text x="848" y="206" text-anchor="middle" fill="#818cf8" font-size="10">◉</text>
|
||
|
|
|
||
|
|
<text x="866" y="206" fill="#c0c0d8" font-family="'DM Sans', sans-serif" font-weight="600" font-size="13" letter-spacing="0.7">Control Center</text>
|
||
|
|
<text x="1080" y="206" text-anchor="end" fill="#818cf8" font-family="'IBM Plex Mono', monospace" font-size="9" opacity="0.5">:9012</text>
|
||
|
|
<circle cx="1096" cy="202" r="4" fill="#818cf8" class="health health-d2"/>
|
||
|
|
|
||
|
|
<g font-family="'IBM Plex Mono', monospace" font-size="9">
|
||
|
|
<rect x="838" y="220" width="108" height="19" rx="5" fill="#110f1e" stroke="#2e2848" stroke-width="0.7"/>
|
||
|
|
<text x="892" y="233" text-anchor="middle" fill="#818cf8" opacity="0.85">Cedar Policies</text>
|
||
|
|
|
||
|
|
<rect x="954" y="220" width="100" height="19" rx="5" fill="#110f1e" stroke="#2e2848" stroke-width="0.7"/>
|
||
|
|
<text x="1004" y="233" text-anchor="middle" fill="#818cf8" opacity="0.85">JWT/Sessions</text>
|
||
|
|
|
||
|
|
<rect x="838" y="247" width="108" height="17" rx="4" fill="none" stroke="#2e2848" stroke-width="0.5"/>
|
||
|
|
<text x="892" y="259" text-anchor="middle" fill="#5a5878" font-size="8">WebSocket Bridge</text>
|
||
|
|
|
||
|
|
<rect x="954" y="247" width="100" height="17" rx="4" fill="none" stroke="#2e2848" stroke-width="0.5"/>
|
||
|
|
<text x="1004" y="259" text-anchor="middle" fill="#5a5878" font-size="8">RBAC/MFA</text>
|
||
|
|
|
||
|
|
<rect x="838" y="272" width="216" height="17" rx="4" fill="none" stroke="#2e2848" stroke-width="0.5"/>
|
||
|
|
<text x="946" y="284" text-anchor="middle" fill="#5a5878" font-size="8">Solo: auto-session · Multi: full auth</text>
|
||
|
|
</g>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═══ HTTPS CREDENTIAL LINE (Orch ↔ Vault, bypasses NATS) ═══ -->
|
||
|
|
<path d="M 440,248 C 415,180 395,180 350,248" fill="none"
|
||
|
|
stroke="#fbbf24" stroke-width="2" class="https-line" filter="url(#glow-gold)"/>
|
||
|
|
<path d="M 350,248 C 395,180 415,180 440,248" fill="none"
|
||
|
|
stroke="#fbbf24" stroke-width="1" stroke-dasharray="4 3" class="https-line" opacity="0.5"/>
|
||
|
|
|
||
|
|
<rect x="362" y="172" width="68" height="14" rx="7" fill="#fbbf24" opacity="0.08"/>
|
||
|
|
<text x="396" y="182" text-anchor="middle" fill="#fbbf24" font-family="'IBM Plex Mono', monospace" font-size="7" font-weight="700" class="https-label">HTTPS ONLY</text>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═══ CONNECTIONS: SERVICES → NATS ═══ -->
|
||
|
|
|
||
|
|
<!-- Vault → NATS -->
|
||
|
|
<line x1="205" y1="312" x2="205" y2="340" stroke="#ec4899" stroke-width="1.2" stroke-dasharray="5 4" class="flow-down" opacity="0.6" marker-end="url(#arr-pink)"/>
|
||
|
|
<!-- Orchestrator → NATS -->
|
||
|
|
<line x1="585" y1="312" x2="585" y2="340" stroke="#f59e0b" stroke-width="1.2" stroke-dasharray="5 4" class="flow-down" opacity="0.6" marker-end="url(#arr-orange)"/>
|
||
|
|
<!-- Control Center → NATS -->
|
||
|
|
<line x1="965" y1="312" x2="965" y2="340" stroke="#818cf8" stroke-width="1.2" stroke-dasharray="5 4" class="flow-down" opacity="0.6" marker-end="url(#arr-purple)"/>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
<!-- NATS JETSTREAM EVENT BUS -->
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<!-- Outer glow -->
|
||
|
|
<rect x="50" y="342" width="1180" height="46" rx="8" fill="#94a3b8" opacity="0.03" class="nats-glow"/>
|
||
|
|
<rect x="50" y="341" width="1180" height="48" rx="9" fill="none" stroke="#94a3b8" stroke-width="0.8" opacity="0.15" class="nats-glow"/>
|
||
|
|
|
||
|
|
<!-- Main band -->
|
||
|
|
<rect x="50" y="342" width="1180" height="46" rx="8" fill="url(#nats-grad)" filter="url(#nats-shadow)"/>
|
||
|
|
<rect x="50" y="342" width="1180" height="46" rx="8" fill="none" stroke="#2a3040" stroke-width="1"/>
|
||
|
|
|
||
|
|
<!-- Accent bars -->
|
||
|
|
<rect x="50" y="342" width="4" height="46" rx="2" fill="#94a3b8" opacity="0.4"/>
|
||
|
|
<rect x="1226" y="342" width="4" height="46" rx="2" fill="#94a3b8" opacity="0.4"/>
|
||
|
|
|
||
|
|
<!-- ═══ INFINITE ENGINE (perpetual motion at NATS hub core) ═══ -->
|
||
|
|
|
||
|
|
<!-- Outer gear ring — 6 teeth, slow clockwise 20s -->
|
||
|
|
<g class="engine-outer">
|
||
|
|
<circle cx="640" cy="365" r="20" fill="none" stroke="#94a3b8" stroke-width="1.5"
|
||
|
|
stroke-dasharray="5.24 5.24" opacity="0.18"/>
|
||
|
|
<line x1="640" y1="345" x2="640" y2="341" stroke="#94a3b8" stroke-width="2" stroke-linecap="round" opacity="0.18"/>
|
||
|
|
<line x1="657.32" y1="355" x2="660.78" y2="353" stroke="#94a3b8" stroke-width="2" stroke-linecap="round" opacity="0.18"/>
|
||
|
|
<line x1="657.32" y1="375" x2="660.78" y2="377" stroke="#94a3b8" stroke-width="2" stroke-linecap="round" opacity="0.18"/>
|
||
|
|
<line x1="640" y1="385" x2="640" y2="389" stroke="#94a3b8" stroke-width="2" stroke-linecap="round" opacity="0.18"/>
|
||
|
|
<line x1="622.68" y1="375" x2="619.22" y2="377" stroke="#94a3b8" stroke-width="2" stroke-linecap="round" opacity="0.18"/>
|
||
|
|
<line x1="622.68" y1="355" x2="619.22" y2="353" stroke="#94a3b8" stroke-width="2" stroke-linecap="round" opacity="0.18"/>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- Inner gear ring — 4 spokes, faster counter-clockwise 12s -->
|
||
|
|
<g class="engine-inner">
|
||
|
|
<circle cx="640" cy="365" r="12" fill="none" stroke="#c8d0dc" stroke-width="1"
|
||
|
|
stroke-dasharray="3.77 3.77" opacity="0.22"/>
|
||
|
|
<line x1="640" y1="353" x2="640" y2="356" stroke="#c8d0dc" stroke-width="1.5" stroke-linecap="round" opacity="0.22"/>
|
||
|
|
<line x1="652" y1="365" x2="649" y2="365" stroke="#c8d0dc" stroke-width="1.5" stroke-linecap="round" opacity="0.22"/>
|
||
|
|
<line x1="640" y1="377" x2="640" y2="374" stroke="#c8d0dc" stroke-width="1.5" stroke-linecap="round" opacity="0.22"/>
|
||
|
|
<line x1="628" y1="365" x2="631" y2="365" stroke="#c8d0dc" stroke-width="1.5" stroke-linecap="round" opacity="0.22"/>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- Engine core — breathing pulse 3s -->
|
||
|
|
<circle cx="640" cy="365" r="4" fill="#c8d0dc" class="engine-core"/>
|
||
|
|
|
||
|
|
<!-- Bus label -->
|
||
|
|
<text x="640" y="360" text-anchor="middle" fill="#c8d0dc" font-family="'DM Sans', sans-serif" font-weight="700" font-size="11" letter-spacing="1">NATS JETSTREAM EVENT BUS</text>
|
||
|
|
|
||
|
|
<!-- Subject lanes -->
|
||
|
|
<g font-family="'IBM Plex Mono', monospace" font-size="7" fill="#5a6278" opacity="0.7">
|
||
|
|
<text x="115" y="380">tasks.></text>
|
||
|
|
<text x="260" y="380">vault.></text>
|
||
|
|
<text x="415" y="380">auth.></text>
|
||
|
|
<text x="600" y="380">workspace.></text>
|
||
|
|
<text x="780" y="380">audit.></text>
|
||
|
|
<text x="940" y="380">health.></text>
|
||
|
|
|
||
|
|
<!-- Subject separators -->
|
||
|
|
<line x1="220" y1="370" x2="220" y2="385" stroke="#2a3040" stroke-width="0.5"/>
|
||
|
|
<line x1="375" y1="370" x2="375" y2="385" stroke="#2a3040" stroke-width="0.5"/>
|
||
|
|
<line x1="560" y1="370" x2="560" y2="385" stroke="#2a3040" stroke-width="0.5"/>
|
||
|
|
<line x1="740" y1="370" x2="740" y2="385" stroke="#2a3040" stroke-width="0.5"/>
|
||
|
|
<line x1="900" y1="370" x2="900" y2="385" stroke="#2a3040" stroke-width="0.5"/>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- Port label -->
|
||
|
|
<text x="1100" y="380" fill="#94a3b8" font-family="'IBM Plex Mono', monospace" font-size="7" opacity="0.4">:4222</text>
|
||
|
|
|
||
|
|
<!-- Animated particles flowing through NATS bus -->
|
||
|
|
<g>
|
||
|
|
<circle cx="70" cy="365" r="3" fill="#f59e0b" class="nats-particle np1" filter="url(#glow-orange)"/>
|
||
|
|
<circle cx="70" cy="362" r="2.5" fill="#ec4899" class="nats-particle np2" filter="url(#glow-pink)"/>
|
||
|
|
<circle cx="70" cy="368" r="2" fill="#818cf8" class="nats-particle np3" filter="url(#glow-purple)"/>
|
||
|
|
<circle cx="1200" cy="366" r="2.5" fill="#4a9eff" class="nats-particle np4" filter="url(#glow-blue)"/>
|
||
|
|
<circle cx="1200" cy="363" r="2" fill="#22d3ee" class="nats-particle np5" filter="url(#glow-cyan)"/>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═══ CONNECTIONS: NATS → LOWER SERVICES ═══ -->
|
||
|
|
|
||
|
|
<!-- NATS → Catalog Registry -->
|
||
|
|
<line x1="270" y1="388" x2="270" y2="418" stroke="#ef4444" stroke-width="1.2" stroke-dasharray="5 4" class="flow-down" opacity="0.6" marker-end="url(#arr-red)"/>
|
||
|
|
<!-- NATS → AI/MCP -->
|
||
|
|
<line x1="980" y1="388" x2="980" y2="418" stroke="#22d3ee" stroke-width="1.2" stroke-dasharray="5 4" class="flow-down" opacity="0.6" marker-end="url(#arr-cyan)"/>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
<!-- LOWER SERVICE TIER -->
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<!-- ─── EXTENSION REGISTRY (left) ─── -->
|
||
|
|
<g>
|
||
|
|
<rect x="80" y="420" width="320" height="115" rx="12" fill="url(#ext-grad)" filter="url(#soft-shadow)"/>
|
||
|
|
<rect x="80" y="420" width="320" height="115" rx="12" fill="none" stroke="#3a1c28" stroke-width="1"/>
|
||
|
|
<rect x="80" y="420" width="4" height="115" rx="2" fill="#ef4444" opacity="0.5"/>
|
||
|
|
|
||
|
|
<circle cx="108" cy="442" r="10" fill="#2d3748" stroke="#ef4444" stroke-width="1" opacity="0.8"/>
|
||
|
|
<text x="108" y="446" text-anchor="middle" fill="#ef4444" font-size="10">⚙️</text>
|
||
|
|
|
||
|
|
<text x="126" y="446" fill="#d8c0c8" font-family="'DM Sans', sans-serif" font-weight="600" font-size="13" letter-spacing="0.7">Catalog Registry</text>
|
||
|
|
<text x="370" y="446" text-anchor="end" fill="#ef4444" font-family="'IBM Plex Mono', monospace" font-size="9" opacity="0.5">:8084</text>
|
||
|
|
<circle cx="386" cy="442" r="4" fill="#ef4444" class="health health-d3"/>
|
||
|
|
|
||
|
|
<g font-family="'IBM Plex Mono', monospace" font-size="9">
|
||
|
|
<rect x="98" y="460" width="98" height="19" rx="5" fill="#1a0f14" stroke="#3a1c28" stroke-width="0.7"/>
|
||
|
|
<text x="147" y="473" text-anchor="middle" fill="#ef4444" opacity="0.85">Gitea/Forgejo</text>
|
||
|
|
|
||
|
|
<rect x="204" y="460" width="80" height="19" rx="5" fill="#1a0f14" stroke="#3a1c28" stroke-width="0.7"/>
|
||
|
|
<text x="244" y="473" text-anchor="middle" fill="#ef4444" opacity="0.85">OCI Dist</text>
|
||
|
|
|
||
|
|
<rect x="292" y="460" width="80" height="19" rx="5" fill="#1a0f14" stroke="#3a1c28" stroke-width="0.7"/>
|
||
|
|
<text x="332" y="473" text-anchor="middle" fill="#ef4444" opacity="0.85">LRU+TTL</text>
|
||
|
|
|
||
|
|
<rect x="98" y="487" width="272" height="17" rx="4" fill="none" stroke="#3a1c28" stroke-width="0.5"/>
|
||
|
|
<text x="234" y="499" text-anchor="middle" fill="#5a3848" font-size="8">Providers · Taskservs · Clusters · vault:// creds</text>
|
||
|
|
</g>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- Center: Webhook / Forgejo indicator -->
|
||
|
|
<g opacity="0.5">
|
||
|
|
<rect x="478" y="432" width="150" height="38" rx="8" fill="#0e1118" stroke="#2a3040" stroke-width="0.6"/>
|
||
|
|
<text x="553" y="449" text-anchor="middle" fill="#94a3b8" font-family="'IBM Plex Mono', monospace" font-size="8">Forgejo Webhook</text>
|
||
|
|
<text x="553" y="462" text-anchor="middle" fill="#5a6070" font-family="'IBM Plex Mono', monospace" font-size="7">workspace.*.deploy</text>
|
||
|
|
<!-- Arrow into NATS (upward) -->
|
||
|
|
<line x1="553" y1="432" x2="553" y2="390" stroke="#94a3b8" stroke-width="0.8" stroke-dasharray="3 3" class="flow-up" opacity="0.5" marker-end="url(#arr-silver)"/>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- ─── AI/MCP SERVICE (right) ─── -->
|
||
|
|
<g>
|
||
|
|
<rect x="760" y="420" width="320" height="115" rx="12" fill="url(#mcp-grad)" filter="url(#soft-shadow)"/>
|
||
|
|
<rect x="760" y="420" width="320" height="115" rx="12" fill="none" stroke="#1c3038" stroke-width="1"/>
|
||
|
|
<rect x="1076" y="420" width="4" height="115" rx="2" fill="#22d3ee" opacity="0.5"/>
|
||
|
|
|
||
|
|
<circle cx="788" cy="442" r="10" fill="#2d3748" stroke="#22d3ee" stroke-width="1" opacity="0.8"/>
|
||
|
|
<text x="788" y="446" text-anchor="middle" fill="#22d3ee" font-size="10">🧠</text>
|
||
|
|
|
||
|
|
<text x="806" y="446" fill="#c0d8d8" font-family="'DM Sans', sans-serif" font-weight="600" font-size="13" letter-spacing="0.7">AI · MCP</text>
|
||
|
|
<text x="1050" y="446" text-anchor="end" fill="#22d3ee" font-family="'IBM Plex Mono', monospace" font-size="9" opacity="0.5">:9082</text>
|
||
|
|
<circle cx="1066" cy="442" r="4" fill="#22d3ee" class="health health-d4"/>
|
||
|
|
|
||
|
|
<g font-family="'IBM Plex Mono', monospace" font-size="9">
|
||
|
|
<rect x="778" y="460" width="98" height="19" rx="5" fill="#0a1c1e" stroke="#1c3038" stroke-width="0.7"/>
|
||
|
|
<text x="827" y="473" text-anchor="middle" fill="#22d3ee" opacity="0.85">RAG Engine</text>
|
||
|
|
|
||
|
|
<rect x="884" y="460" width="98" height="19" rx="5" fill="#0a1c1e" stroke="#1c3038" stroke-width="0.7"/>
|
||
|
|
<text x="933" y="473" text-anchor="middle" fill="#22d3ee" opacity="0.85">MCP Server</text>
|
||
|
|
|
||
|
|
<rect x="990" y="460" width="62" height="19" rx="5" fill="#0a1c1e" stroke="#1c3038" stroke-width="0.7"/>
|
||
|
|
<text x="1021" y="473" text-anchor="middle" fill="#22d3ee" opacity="0.85">Tools</text>
|
||
|
|
|
||
|
|
<rect x="778" y="487" width="272" height="17" rx="4" fill="none" stroke="#1c3038" stroke-width="0.5"/>
|
||
|
|
<text x="914" y="499" text-anchor="middle" fill="#385a58" font-size="8">Embeddings · Model Routing · Knowledge Graph</text>
|
||
|
|
</g>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═══ CONNECTIONS: ALL SERVICES → SURREALDB ═══ -->
|
||
|
|
<g opacity="0.35">
|
||
|
|
<line x1="205" y1="535" x2="205" y2="570" stroke="#a78bfa" stroke-width="1" stroke-dasharray="4 3" class="flow-down" marker-end="url(#arr-silver)"/>
|
||
|
|
<line x1="585" y1="312" x2="585" y2="335" stroke="none"/>
|
||
|
|
<line x1="430" y1="535" x2="430" y2="570" stroke="#a78bfa" stroke-width="1" stroke-dasharray="4 3" class="flow-down" marker-end="url(#arr-silver)"/>
|
||
|
|
<line x1="640" y1="470" x2="640" y2="570" stroke="#a78bfa" stroke-width="1" stroke-dasharray="4 3" class="flow-down" marker-end="url(#arr-silver)"/>
|
||
|
|
<line x1="850" y1="535" x2="850" y2="570" stroke="#a78bfa" stroke-width="1" stroke-dasharray="4 3" class="flow-down" marker-end="url(#arr-silver)"/>
|
||
|
|
<line x1="1075" y1="535" x2="1075" y2="570" stroke="#a78bfa" stroke-width="1" stroke-dasharray="4 3" class="flow-down" marker-end="url(#arr-silver)"/>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
<!-- SURREALDB PERSISTENCE LAYER -->
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<g>
|
||
|
|
<rect x="50" y="572" width="1180" height="62" rx="8" fill="url(#surreal-grad)" filter="url(#soft-shadow)"/>
|
||
|
|
<rect x="50" y="572" width="1180" height="62" rx="8" fill="none" stroke="#2e2450" stroke-width="1"/>
|
||
|
|
|
||
|
|
<!-- Accent bars -->
|
||
|
|
<rect x="50" y="630" width="1180" height="4" rx="2" fill="#a78bfa" opacity="0.2"/>
|
||
|
|
|
||
|
|
<!-- Label -->
|
||
|
|
<text x="640" y="588" text-anchor="middle" fill="#c4b5e0" font-family="'DM Sans', sans-serif" font-weight="700" font-size="11" letter-spacing="1">SURREALDB PERSISTENCE</text>
|
||
|
|
|
||
|
|
<!-- Mode indicator -->
|
||
|
|
<text x="1170" y="588" text-anchor="end" fill="#a78bfa" font-family="'IBM Plex Mono', monospace" font-size="7" opacity="0.4">Solo: RocksDB · Multi: WebSocket</text>
|
||
|
|
|
||
|
|
<!-- 5 Namespace boxes -->
|
||
|
|
<g font-family="'IBM Plex Mono', monospace" font-size="8">
|
||
|
|
<rect x="78" y="598" width="170" height="22" rx="5" fill="#110e1c" stroke="#2e2450" stroke-width="0.6"/>
|
||
|
|
<text x="163" y="613" text-anchor="middle" fill="#a78bfa" opacity="0.8">orchestrator</text>
|
||
|
|
<text x="163" y="625" text-anchor="middle" fill="#5a4878" font-size="6">tasks · logs · config_hashes</text>
|
||
|
|
|
||
|
|
<rect x="262" y="598" width="140" height="22" rx="5" fill="#110e1c" stroke="#2e2450" stroke-width="0.6"/>
|
||
|
|
<text x="332" y="613" text-anchor="middle" fill="#a78bfa" opacity="0.8">vault</text>
|
||
|
|
<text x="332" y="625" text-anchor="middle" fill="#5a4878" font-size="6">secrets · keys · leases</text>
|
||
|
|
|
||
|
|
<rect x="416" y="598" width="170" height="22" rx="5" fill="#110e1c" stroke="#2e2450" stroke-width="0.6"/>
|
||
|
|
<text x="501" y="613" text-anchor="middle" fill="#a78bfa" opacity="0.8">control_center</text>
|
||
|
|
<text x="501" y="625" text-anchor="middle" fill="#5a4878" font-size="6">users · sessions · cedar</text>
|
||
|
|
|
||
|
|
<rect x="600" y="598" width="120" height="22" rx="5" fill="#110e1c" stroke="#2e2450" stroke-width="0.6"/>
|
||
|
|
<text x="660" y="613" text-anchor="middle" fill="#a78bfa" opacity="0.8">audit</text>
|
||
|
|
<text x="660" y="625" text-anchor="middle" fill="#5a4878" font-size="6">events · metrics</text>
|
||
|
|
|
||
|
|
<rect x="734" y="598" width="170" height="22" rx="5" fill="#110e1c" stroke="#2e2450" stroke-width="0.6"/>
|
||
|
|
<text x="819" y="613" text-anchor="middle" fill="#a78bfa" opacity="0.8">workspace</text>
|
||
|
|
<text x="819" y="625" text-anchor="middle" fill="#5a4878" font-size="6">registrations · deployments · git</text>
|
||
|
|
|
||
|
|
<!-- Config indicator -->
|
||
|
|
<rect x="918" y="598" width="130" height="22" rx="5" fill="none" stroke="#2e2450" stroke-width="0.4"/>
|
||
|
|
<text x="983" y="613" text-anchor="middle" fill="#5a4878" opacity="0.6">Nickel config</text>
|
||
|
|
<text x="983" y="625" text-anchor="middle" fill="#5a4878" font-size="6">platform-config crate</text>
|
||
|
|
</g>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
<!-- SOLID ENFORCEMENT INDICATORS -->
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<g transform="translate(50, 655)">
|
||
|
|
<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" fill="#5a6070">
|
||
|
|
<rect x="0" y="8" width="88" height="16" rx="4" fill="#f59e0b" opacity="0.06" stroke="#f59e0b" stroke-width="0.4" stroke-opacity="0.2"/>
|
||
|
|
<text x="44" y="20" text-anchor="middle" fill="#f59e0b" opacity="0.6">Compile-time</text>
|
||
|
|
|
||
|
|
<rect x="96" y="8" width="76" height="16" rx="4" fill="#818cf8" opacity="0.06" stroke="#818cf8" stroke-width="0.4" stroke-opacity="0.2"/>
|
||
|
|
<text x="134" y="20" text-anchor="middle" fill="#818cf8" opacity="0.6">Dev-time</text>
|
||
|
|
|
||
|
|
<rect x="180" y="8" width="82" height="16" rx="4" fill="#ec4899" opacity="0.06" stroke="#ec4899" stroke-width="0.4" stroke-opacity="0.2"/>
|
||
|
|
<text x="221" y="20" text-anchor="middle" fill="#ec4899" opacity="0.6">Pre-commit</text>
|
||
|
|
|
||
|
|
<rect x="270" y="8" width="56" height="16" rx="4" fill="#ef4444" opacity="0.06" stroke="#ef4444" stroke-width="0.4" stroke-opacity="0.2"/>
|
||
|
|
<text x="298" y="20" text-anchor="middle" fill="#ef4444" opacity="0.6">CI/CD</text>
|
||
|
|
|
||
|
|
<rect x="334" y="8" width="68" height="16" rx="4" fill="#22d3ee" opacity="0.06" stroke="#22d3ee" stroke-width="0.4" stroke-opacity="0.2"/>
|
||
|
|
<text x="368" y="20" text-anchor="middle" fill="#22d3ee" opacity="0.6">Runtime</text>
|
||
|
|
|
||
|
|
<rect x="410" y="8" width="56" height="16" rx="4" fill="#94a3b8" opacity="0.06" stroke="#94a3b8" stroke-width="0.4" stroke-opacity="0.2"/>
|
||
|
|
<text x="438" y="20" text-anchor="middle" fill="#94a3b8" opacity="0.6">Audit</text>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
<!-- Key rules -->
|
||
|
|
<g font-family="'IBM Plex Mono', monospace" font-size="7" fill="#3a3e48" opacity="0.5">
|
||
|
|
<text x="520" y="12">Provider APIs: Orchestrator only</text>
|
||
|
|
<text x="520" y="24">SSH: Orchestrator + Machines only</text>
|
||
|
|
<text x="780" y="12">Auth: Control Center only</text>
|
||
|
|
<text x="780" y="24">Secrets: Vault Service API only</text>
|
||
|
|
</g>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
<!-- ANIMATED CREDENTIAL FLOW -->
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<!-- Particle: Orch → NATS → Vault (lease request) -->
|
||
|
|
<circle r="3.5" fill="#f59e0b" class="cred-dot" filter="url(#glow-orange)">
|
||
|
|
<animateMotion dur="3s" begin="0s" repeatCount="indefinite" keyPoints="0;1" keyTimes="0;1" calcMode="linear">
|
||
|
|
<mpath href="#path-orch-nats-vault"/>
|
||
|
|
</animateMotion>
|
||
|
|
<animate attributeName="opacity" values="0;0.9;0.9;0" keyTimes="0;0.1;0.85;1" dur="3s" begin="0s" repeatCount="indefinite"/>
|
||
|
|
</circle>
|
||
|
|
|
||
|
|
<!-- Particle: Vault → NATS → Orch (lease issued) -->
|
||
|
|
<circle r="3" fill="#ec4899" class="cred-dot" filter="url(#glow-pink)">
|
||
|
|
<animateMotion dur="3s" begin="3.5s" repeatCount="indefinite" keyPoints="0;1" keyTimes="0;1" calcMode="linear">
|
||
|
|
<mpath href="#path-vault-nats-orch"/>
|
||
|
|
</animateMotion>
|
||
|
|
<animate attributeName="opacity" values="0;0.8;0.8;0" keyTimes="0;0.1;0.85;1" dur="3s" begin="3.5s" repeatCount="indefinite"/>
|
||
|
|
</circle>
|
||
|
|
|
||
|
|
<!-- Particle: CLI → Orch (task submission) -->
|
||
|
|
<circle r="3" fill="#4a9eff" class="cred-dot" filter="url(#glow-blue)">
|
||
|
|
<animateMotion dur="1.5s" begin="0s" repeatCount="indefinite" keyPoints="0;1" keyTimes="0;1" calcMode="linear">
|
||
|
|
<mpath href="#path-task-cli-orch"/>
|
||
|
|
</animateMotion>
|
||
|
|
<animate attributeName="opacity" values="0;0.8;0.8;0" keyTimes="0;0.15;0.7;1" dur="1.5s" begin="0s" repeatCount="indefinite"/>
|
||
|
|
</circle>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
<!-- LEGEND -->
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<g transform="translate(50, 700)" font-family="'IBM Plex Mono', monospace" font-size="9">
|
||
|
|
<!-- Column 1: Services -->
|
||
|
|
<text x="0" y="0" fill="#3a3e48" font-weight="600" font-size="8" letter-spacing="1.5">PLATFORM SERVICES</text>
|
||
|
|
|
||
|
|
<circle cx="8" cy="14" r="4" fill="#f59e0b" opacity="0.8"/>
|
||
|
|
<text x="18" y="18" fill="#6b6050">Orchestrator (tasks, provider, SSH)</text>
|
||
|
|
|
||
|
|
<circle cx="8" cy="30" r="4" fill="#818cf8" opacity="0.8"/>
|
||
|
|
<text x="18" y="34" fill="#5a5878">Control Center (auth, sessions, Cedar)</text>
|
||
|
|
|
||
|
|
<circle cx="8" cy="46" r="4" fill="#ec4899" opacity="0.8"/>
|
||
|
|
<text x="18" y="50" fill="#5a3850">Vault Service (secrets, leases, crypto)</text>
|
||
|
|
|
||
|
|
<circle cx="8" cy="62" r="4" fill="#ef4444" opacity="0.8"/>
|
||
|
|
<text x="18" y="66" fill="#5a3848">Catalog Registry (providers, OCI)</text>
|
||
|
|
|
||
|
|
<circle cx="8" cy="78" r="4" fill="#22d3ee" opacity="0.8"/>
|
||
|
|
<text x="18" y="82" fill="#385a58">AI · MCP (RAG, tools, models)</text>
|
||
|
|
|
||
|
|
<!-- Column 2: Infrastructure -->
|
||
|
|
<text x="380" y="0" fill="#3a3e48" font-weight="600" font-size="8" letter-spacing="1.5">INFRASTRUCTURE</text>
|
||
|
|
|
||
|
|
<line x1="380" y1="14" x2="404" y2="14" stroke="#94a3b8" stroke-width="2"/>
|
||
|
|
<text x="410" y="18" fill="#5a6278">NATS JetStream (event bus, :4222)</text>
|
||
|
|
|
||
|
|
<line x1="380" y1="30" x2="404" y2="30" stroke="#a78bfa" stroke-width="2"/>
|
||
|
|
<text x="410" y="34" fill="#5a4878">SurrealDB (global store, embedded/WS)</text>
|
||
|
|
|
||
|
|
<line x1="380" y1="46" x2="404" y2="46" stroke="#fbbf24" stroke-width="2"/>
|
||
|
|
<text x="410" y="50" fill="#6b6050">HTTPS direct (credentials only)</text>
|
||
|
|
|
||
|
|
<line x1="380" y1="62" x2="404" y2="62" stroke="#4a9eff" stroke-width="1.5" stroke-dasharray="4 3"/>
|
||
|
|
<text x="410" y="66" fill="#4a6a8a">CLI → HTTP → Orchestrator</text>
|
||
|
|
|
||
|
|
<!-- Column 3: Modes -->
|
||
|
|
<text x="740" y="0" fill="#3a3e48" font-weight="600" font-size="8" letter-spacing="1.5">MODES</text>
|
||
|
|
|
||
|
|
<rect x="740" y="8" width="52" height="14" rx="4" fill="#34d399" opacity="0.1" stroke="#34d399" stroke-width="0.4" stroke-opacity="0.3"/>
|
||
|
|
<text x="766" y="19" text-anchor="middle" fill="#34d399" font-size="7" font-weight="600">SOLO</text>
|
||
|
|
<text x="798" y="19" fill="#4a7a5a" font-size="8">Embedded RocksDB, local NATS, auto-session</text>
|
||
|
|
|
||
|
|
<rect x="740" y="28" width="52" height="14" rx="4" fill="#818cf8" opacity="0.1" stroke="#818cf8" stroke-width="0.4" stroke-opacity="0.3"/>
|
||
|
|
<text x="766" y="39" text-anchor="middle" fill="#818cf8" font-size="7" font-weight="600">MULTI</text>
|
||
|
|
<text x="798" y="39" fill="#5a5878" font-size="8">WS SurrealDB, NATS cluster, JWT+Cedar</text>
|
||
|
|
|
||
|
|
<!-- Architecture note -->
|
||
|
|
<text x="740" y="62" fill="#3a3e48" font-size="7" opacity="0.6">Same architecture, same NATS subjects,</text>
|
||
|
|
<text x="740" y="72" fill="#3a3e48" font-size="7" opacity="0.6">same schema. Only auth differs.</text>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
<!-- DEPLOYMENT TARGETS -->
|
||
|
|
<!-- ═════════════════════════════════════════ -->
|
||
|
|
|
||
|
|
<g transform="translate(0, 800)" font-family="'IBM Plex Mono', monospace">
|
||
|
|
<rect x="110" y="0" width="140" height="40" rx="8" fill="#2a1515" stroke="#2a1010" stroke-width="0.8"/>
|
||
|
|
<circle cx="128" cy="16" r="4" fill="#ef4444" opacity="0.8"/>
|
||
|
|
<text x="140" y="19" fill="#d0a0a0" font-size="10" font-weight="500">Production</text>
|
||
|
|
<text x="128" y="32" fill="#5a3838" font-size="8">Hetzner · AWS</text>
|
||
|
|
|
||
|
|
<rect x="278" y="0" width="140" height="40" rx="8" fill="#2a2010" stroke="#1a1810" stroke-width="0.8"/>
|
||
|
|
<circle cx="296" cy="16" r="4" fill="#f59e0b" opacity="0.8"/>
|
||
|
|
<text x="308" y="19" fill="#d0c0a0" font-size="10" font-weight="500">Staging</text>
|
||
|
|
<text x="296" y="32" fill="#5a5038" font-size="8">K8s cluster</text>
|
||
|
|
|
||
|
|
<rect x="446" y="0" width="140" height="40" rx="8" fill="#1a2820" stroke="#0a1810" stroke-width="0.8"/>
|
||
|
|
<circle cx="464" cy="16" r="4" fill="#34d399" opacity="0.8"/>
|
||
|
|
<text x="476" y="19" fill="#a0d0b8" font-size="10" font-weight="500">Dev</text>
|
||
|
|
<text x="464" y="32" fill="#385a48" font-size="8">Solo mode</text>
|
||
|
|
|
||
|
|
<rect x="614" y="0" width="140" height="40" rx="8" fill="#1a182a" stroke="#0a0a1a" stroke-width="0.8"/>
|
||
|
|
<circle cx="632" cy="16" r="4" fill="#818cf8" opacity="0.8"/>
|
||
|
|
<text x="644" y="19" fill="#b0b0d8" font-size="10" font-weight="500">Edge</text>
|
||
|
|
<text x="632" y="32" fill="#48486a" font-size="8">On-prem · IoT</text>
|
||
|
|
|
||
|
|
<rect x="782" y="0" width="140" height="40" rx="8" fill="#1a2020" stroke="#0a1010" stroke-width="0.8"/>
|
||
|
|
<circle cx="800" cy="16" r="4" fill="#22d3ee" opacity="0.8"/>
|
||
|
|
<text x="812" y="19" fill="#a0c8c8" font-size="10" font-weight="500">Custom</text>
|
||
|
|
<text x="800" y="32" fill="#385858" font-size="8">GitOps · Webhook</text>
|
||
|
|
</g>
|
||
|
|
|
||
|
|
|
||
|
|
<!-- ═══ VERSION + LOGO ═══ -->
|
||
|
|
<text x="1200" y="878" text-anchor="end" fill="#5a6070" font-family="'IBM Plex Mono', monospace" font-size="9" letter-spacing="0.5">v4.0 · Control Plane Architecture</text>
|
||
|
|
|
||
|
|
</svg>
|