docs(architecture): correct CP/tenant split in hero diagram + animate + surface widely #70
@@ -24,6 +24,11 @@ export default function HomePage() {
|
||||
View on Gitea
|
||||
</Link>
|
||||
</div>
|
||||
<img
|
||||
src="/diagrams/platform-architecture.svg"
|
||||
alt="Molecule AI platform architecture: operator surfaces reach a thin central Control Plane (orgs, billing, tenant provisioning, LLM proxy, provider registry) that provisions one isolated tenant per org. Each tenant runs its own control core — the workspace-server with provisioner, registry/discovery, A2A proxy, WebSocket hub, scheduler, secrets, audit, and its own Postgres + Redis — above a hierarchy of workspaces, each one agent on its own machine, communicating peer-to-peer over A2A. Runtimes and model providers are pluggable."
|
||||
className="mt-16 w-full max-w-5xl rounded-xl border border-fd-border shadow-sm"
|
||||
/>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ Molecule AI is an **open-source operating system for AI agent organizations**
|
||||
|
||||
<img
|
||||
src="/diagrams/platform-architecture.svg"
|
||||
alt="Molecule AI platform architecture: operator surfaces (Canvas, CLI, MCP server, channels, REST) drive a Go control plane (provisioner, registry/discovery with CanCommunicate ACL, A2A proxy, WebSocket hub, scheduler, secrets, audit) backed by Postgres and Redis; the control plane provisions an isolated org tenant of workspace containers that communicate directly peer-to-peer over A2A governed by the org hierarchy; runtimes (claude-code, langgraph, autogen, openclaw, hermes, codex, google-adk, external) and model providers (Anthropic, OpenAI, Google Vertex, OpenRouter) are pluggable integrations."
|
||||
alt="Molecule AI platform architecture: operator surfaces (Canvas, CLI, MCP server, channels, REST) reach a thin central Control Plane (org & member management, billing & credits, tenant provisioning over EC2/Cloudflare/secrets, LLM proxy, provider-registry SSOT) that provisions one isolated tenant per org. Each tenant runs its OWN control core — the workspace-server (provisioner, registry/discovery with CanCommunicate ACL, A2A proxy, WebSocket hub, scheduler, secrets, audit, event store, channels) backed by the tenant's own Postgres and Redis — above a hierarchy of workspaces, each one agent on its own dedicated machine communicating peer-to-peer over A2A governed by the org hierarchy. Runtimes (claude-code, langgraph, autogen, openclaw, hermes, codex, google-adk, external) and model providers (Anthropic, OpenAI, Google Vertex, OpenRouter) are pluggable integrations."
|
||||
style={{ width: '100%', height: 'auto', margin: '1rem 0' }}
|
||||
/>
|
||||
|
||||
|
||||
@@ -17,6 +17,14 @@ For the full picture — control plane, tenant isolation, governance, and how ex
|
||||
style={{ width: '100%', height: 'auto', margin: '1rem 0' }}
|
||||
/>
|
||||
|
||||
The full platform architecture — the thin central control plane, each tenant's own control core (the workspace-server), and the pluggable runtime / provider layers:
|
||||
|
||||
<img
|
||||
src="/diagrams/platform-architecture.svg"
|
||||
alt="Molecule AI platform architecture: operator surfaces reach a thin central Control Plane (orgs, billing, tenant provisioning, LLM proxy, provider registry) that provisions one isolated tenant per org. Each tenant runs its own control core — the workspace-server with provisioner, registry/discovery, A2A proxy, WebSocket hub, scheduler, secrets, audit, and its own Postgres + Redis — above a hierarchy of workspaces, each one agent on its own machine, communicating peer-to-peer over A2A. Runtimes and model providers are pluggable."
|
||||
style={{ width: '100%', height: 'auto', margin: '1rem 0' }}
|
||||
/>
|
||||
|
||||
## Workspaces
|
||||
|
||||
A **workspace** is a real Docker container running a real LLM agent. Each
|
||||
|
||||
@@ -9,6 +9,12 @@ multi-agent organisations. You define your team in one YAML file
|
||||
talk on, schedule their recurring work — and the platform takes care of the
|
||||
rest.
|
||||
|
||||
<img
|
||||
src="/diagrams/platform-architecture.svg"
|
||||
alt="Molecule AI platform architecture: operator surfaces reach a thin central Control Plane (orgs, billing, tenant provisioning, LLM proxy, provider registry) that provisions one isolated tenant per org. Each tenant runs its own control core — the workspace-server with provisioner, registry/discovery, A2A proxy, WebSocket hub, scheduler, secrets, audit, and its own Postgres + Redis — above a hierarchy of workspaces, each one agent on its own machine, communicating peer-to-peer over A2A. Runtimes and model providers are pluggable."
|
||||
style={{ width: '100%', height: 'auto', margin: '1.5rem 0' }}
|
||||
/>
|
||||
|
||||
## Try it now
|
||||
|
||||
| | |
|
||||
|
||||
@@ -1,11 +1,23 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1360 1240" font-family="Inter, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1360 1284" font-family="Inter, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif">
|
||||
<defs>
|
||||
<style>
|
||||
@keyframes mol-flow { to { stroke-dashoffset: -18; } }
|
||||
@keyframes mol-pulse { 0%,100% { opacity: .5; } 50% { opacity: 1; } }
|
||||
@keyframes mol-beat { 0%,100% { opacity: .85; } 50% { opacity: 1; } }
|
||||
.mol-flow { stroke-dasharray: 6 5; animation: mol-flow 1.05s linear infinite; }
|
||||
.mol-flow-slow { stroke-dasharray: 5 4; animation: mol-flow 1.6s linear infinite; }
|
||||
.mol-pulse { animation: mol-pulse 2.4s ease-in-out infinite; }
|
||||
.mol-beat { transform-box: fill-box; transform-origin: center; animation: mol-beat 2.8s ease-in-out infinite; }
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.mol-flow, .mol-flow-slow, .mol-pulse, .mol-beat { animation: none; }
|
||||
}
|
||||
</style>
|
||||
<filter id="sh" x="-20%" y="-20%" width="140%" height="140%"><feDropShadow dx="0" dy="2" stdDeviation="4" flood-color="#0b1220" flood-opacity="0.10"/></filter>
|
||||
<marker id="a" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#64748b"/></marker>
|
||||
<marker id="ai" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#4f46e5"/></marker>
|
||||
<marker id="ag" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#10b981"/></marker>
|
||||
</defs>
|
||||
<rect width="1360" height="1240" fill="#fbfcfe"/>
|
||||
<rect width="1360" height="1284" fill="#fbfcfe"/>
|
||||
|
||||
<!-- ===== Title ===== -->
|
||||
<text x="44" y="48" font-size="26" font-weight="700" fill="#15181f">Molecule AI — the open-source OS for AI agent organizations</text>
|
||||
@@ -33,7 +45,7 @@
|
||||
<text x="1180" y="192" font-size="13" font-weight="700" fill="#15181f" text-anchor="middle">REST API / SDK</text>
|
||||
<text x="1180" y="211" font-size="10.5" fill="#5b6472" text-anchor="middle">automate everything</text>
|
||||
|
||||
<g stroke="#64748b" stroke-width="1.3" fill="none">
|
||||
<g stroke="#64748b" stroke-width="1.3" fill="none" class="mol-flow">
|
||||
<path d="M160,226 L160,250" marker-end="url(#a)"/>
|
||||
<path d="M406,226 L406,250" marker-end="url(#a)"/>
|
||||
<path d="M652,226 L652,250" marker-end="url(#a)"/>
|
||||
@@ -41,161 +53,163 @@
|
||||
<path d="M1180,226 L1180,250" marker-end="url(#a)"/>
|
||||
</g>
|
||||
|
||||
<!-- ===== CONTROL PLANE ===== -->
|
||||
<g filter="url(#sh)"><rect x="44" y="252" width="1272" height="196" rx="16" fill="#eef2ff" stroke="#4f46e5" stroke-width="1.7"/></g>
|
||||
<text x="66" y="282" font-size="17" font-weight="700" fill="#3730a3">Control Plane · Platform</text>
|
||||
<text x="300" y="282" font-size="12" fill="#6366f1">Go / Gin — the orchestration core (open source)</text>
|
||||
<!-- ===== CONTROL PLANE (thin central SaaS) ===== -->
|
||||
<g filter="url(#sh)"><rect x="44" y="252" width="1272" height="116" rx="16" fill="#eef2ff" stroke="#4f46e5" stroke-width="1.7"/></g>
|
||||
<text x="66" y="280" font-size="17" font-weight="700" fill="#3730a3">Control Plane · Platform</text>
|
||||
<text x="300" y="280" font-size="12" fill="#6366f1">Go / Gin — central SaaS: manages orgs & provisions tenants (open source)</text>
|
||||
<g font-size="11.5" fill="#15181f" text-anchor="middle">
|
||||
<rect x="66" y="298" width="232" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="182" y="320" font-weight="600">Provisioner</text><text x="182" y="334" font-size="10" fill="#5b6472">spawns workspace machines</text>
|
||||
<rect x="312" y="298" width="248" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="436" y="320" font-weight="600">Registry + Discovery</text><text x="436" y="334" font-size="10" fill="#5b6472">CanCommunicate (hierarchy ACL)</text>
|
||||
<rect x="574" y="298" width="186" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="667" y="320" font-weight="600">A2A Proxy</text><text x="667" y="334" font-size="10" fill="#5b6472">canvas → agent</text>
|
||||
<rect x="774" y="298" width="200" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="874" y="320" font-weight="600">WebSocket Hub</text><text x="874" y="334" font-size="10" fill="#5b6472">live event fan-out</text>
|
||||
<rect x="988" y="298" width="150" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="1063" y="320" font-weight="600">Scheduler</text><text x="1063" y="334" font-size="10" fill="#5b6472">cron → A2A</text>
|
||||
<rect x="1152" y="298" width="142" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="1223" y="320" font-weight="600">Secrets</text><text x="1223" y="334" font-size="10" fill="#5b6472">per-workspace</text>
|
||||
<rect x="66" y="350" width="180" height="38" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="156" y="373" font-weight="600">Budget & metrics</text>
|
||||
<rect x="260" y="350" width="160" height="38" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="340" y="373" font-weight="600">Audit ledger</text>
|
||||
<rect x="434" y="350" width="190" height="38" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="529" y="373" font-weight="600">Event store (sourced)</text>
|
||||
<rect x="638" y="350" width="150" height="38" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="713" y="373" font-weight="600">Channels</text>
|
||||
<rect x="66" y="294" width="222" height="44" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="177" y="316" font-weight="600">Org & member mgmt</text><text x="177" y="330" font-size="10" fill="#5b6472">accounts · roles · auth</text>
|
||||
<rect x="300" y="294" width="200" height="44" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="400" y="316" font-weight="600">Billing & credits</text><text x="400" y="330" font-size="10" fill="#5b6472">metering · sweep</text>
|
||||
<rect x="512" y="294" width="320" height="44" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="672" y="316" font-weight="600">Tenant provisioning</text><text x="672" y="330" font-size="10" fill="#5b6472">EC2 · Cloudflare · secrets infra</text>
|
||||
<rect x="844" y="294" width="210" height="44" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="949" y="316" font-weight="600">LLM proxy</text><text x="949" y="330" font-size="10" fill="#5b6472">platform-managed routing</text>
|
||||
<rect x="1066" y="294" width="228" height="44" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="1180" y="316" font-weight="600">Provider registry</text><text x="1180" y="330" font-size="10" fill="#5b6472">runtimes & models (SSOT)</text>
|
||||
</g>
|
||||
<text x="66" y="358" font-size="11.5" fill="#6366f1">Manages tenants & billing — never in the agent↔agent data path. Self-host: same binary, your infrastructure.</text>
|
||||
|
||||
<!-- CP -> tenant arrows -->
|
||||
<g stroke="#4f46e5" stroke-width="1.6" fill="none" class="mol-flow">
|
||||
<path d="M300,368 L300,402" marker-end="url(#ai)"/><text x="308" y="392" font-size="11" font-weight="700" fill="#4338ca">provisions tenant</text>
|
||||
<path d="M780,402 L780,368" marker-end="url(#ai)" stroke-dasharray="5 4"/><text x="788" y="392" font-size="10.5" fill="#6366f1">register · heartbeat · billing</text>
|
||||
</g>
|
||||
|
||||
<!-- ===== ORG TENANT — its own control + workspace hierarchy ===== -->
|
||||
<g filter="url(#sh)"><rect x="44" y="404" width="1272" height="400" rx="16" fill="#ffffff" stroke="#cdd3df" stroke-width="1.7"/></g>
|
||||
<text x="66" y="432" font-size="16" font-weight="700" fill="#0f172a">Org Tenant — its own control + a hierarchy of Workspaces</text>
|
||||
<text x="560" y="432" font-size="12" fill="#64748b">one isolated tenant per org · own EC2 · each Workspace = one agent on its OWN machine</text>
|
||||
|
||||
<!-- Tenant control core band (workspace-server) -->
|
||||
<rect x="60" y="446" width="1240" height="126" rx="12" fill="#f7f8ff" stroke="#c7cdf5" stroke-width="1.3" stroke-dasharray="6 4"/>
|
||||
<text x="76" y="468" font-size="12.5" font-weight="700" fill="#3730a3">Tenant control core · workspace-server <tspan font-size="10.5" font-weight="500" fill="#6366f1">(Go / Gin :8080 — runs on the tenant, Postgres + Redis are the tenant's own)</tspan></text>
|
||||
<g font-size="11" fill="#15181f" text-anchor="middle">
|
||||
<rect x="76" y="476" width="232" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="192" y="497" font-weight="600">Provisioner</text><text x="192" y="510" font-size="9.5" fill="#5b6472">spawns workspace machines</text>
|
||||
<rect x="320" y="476" width="248" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="444" y="497" font-weight="600">Registry + Discovery</text><text x="444" y="510" font-size="9.5" fill="#5b6472">CanCommunicate (hierarchy ACL)</text>
|
||||
<rect x="580" y="476" width="186" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="673" y="497" font-weight="600">A2A Proxy</text><text x="673" y="510" font-size="9.5" fill="#5b6472">canvas → agent</text>
|
||||
<rect x="778" y="476" width="200" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="878" y="497" font-weight="600">WebSocket Hub</text><text x="878" y="510" font-size="9.5" fill="#5b6472">live event fan-out</text>
|
||||
<rect x="990" y="476" width="150" height="42" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="1065" y="497" font-weight="600">Scheduler</text><text x="1065" y="510" font-size="9.5" fill="#5b6472">cron → A2A</text>
|
||||
<rect x="76" y="526" width="150" height="40" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="151" y="551" font-weight="600">Secrets</text>
|
||||
<rect x="238" y="526" width="150" height="40" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="313" y="551" font-weight="600">Audit ledger</text>
|
||||
<rect x="400" y="526" width="180" height="40" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="490" y="551" font-weight="600">Event store (sourced)</text>
|
||||
<rect x="592" y="526" width="130" height="40" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="657" y="551" font-weight="600">Channels</text>
|
||||
<rect x="734" y="526" width="180" height="40" rx="8" fill="#fff" stroke="#c7cdf5"/><text x="824" y="551" font-weight="600">Budget & metrics</text>
|
||||
</g>
|
||||
<g filter="url(#sh)">
|
||||
<rect x="1004" y="350" width="140" height="42" rx="9" fill="#ffffff" stroke="#94a3b8"/>
|
||||
<rect x="1156" y="350" width="138" height="42" rx="9" fill="#ffffff" stroke="#94a3b8"/>
|
||||
<rect x="926" y="526" width="150" height="40" rx="9" fill="#ffffff" stroke="#94a3b8"/>
|
||||
<rect x="1088" y="526" width="120" height="40" rx="9" fill="#ffffff" stroke="#94a3b8"/>
|
||||
</g>
|
||||
<text x="1074" y="368" font-size="12" font-weight="700" fill="#15181f" text-anchor="middle">Postgres</text>
|
||||
<text x="1074" y="383" font-size="9.5" fill="#5b6472" text-anchor="middle">event-sourced SoT</text>
|
||||
<text x="1225" y="368" font-size="12" font-weight="700" fill="#15181f" text-anchor="middle">Redis</text>
|
||||
<text x="1225" y="383" font-size="9.5" fill="#5b6472" text-anchor="middle">liveness · pub/sub</text>
|
||||
<text x="66" y="418" font-size="11.5" fill="#4338ca">In the <tspan font-weight="700">discovery / provisioning / governance</tspan> path — never in the agent↔agent data path.</text>
|
||||
<text x="66" y="436" font-size="11.5" fill="#6366f1">SaaS: one isolated tenant per org. Self-host: same binary, your infrastructure.</text>
|
||||
<text x="1001" y="543" font-size="11.5" font-weight="700" fill="#15181f" text-anchor="middle">Postgres</text>
|
||||
<text x="1001" y="557" font-size="9" fill="#5b6472" text-anchor="middle">event-sourced SoT</text>
|
||||
<text x="1148" y="543" font-size="11.5" font-weight="700" fill="#15181f" text-anchor="middle">Redis</text>
|
||||
<text x="1148" y="557" font-size="9" fill="#5b6472" text-anchor="middle">liveness · pub/sub</text>
|
||||
|
||||
<g stroke="#4f46e5" stroke-width="1.6" fill="none">
|
||||
<path d="M300,448 L300,486" marker-end="url(#ai)"/><text x="308" y="472" font-size="11" font-weight="700" fill="#4338ca">provision</text>
|
||||
<path d="M620,486 L620,448" marker-end="url(#ai)" stroke-dasharray="5 4"/><text x="628" y="472" font-size="10.5" fill="#6366f1">register · heartbeat</text>
|
||||
<path d="M900,448 L900,486" marker-end="url(#ai)" stroke-dasharray="5 4"/><text x="908" y="472" font-size="10.5" fill="#6366f1">events</text>
|
||||
</g>
|
||||
<!-- workspace hierarchy -->
|
||||
<g filter="url(#sh)"><rect x="585" y="588" width="190" height="52" rx="10" fill="#0f172a"/></g>
|
||||
<text x="680" y="611" font-size="13" font-weight="700" fill="#fff" text-anchor="middle">Org Lead</text>
|
||||
<text x="680" y="628" font-size="9.5" fill="#cbd5e1" text-anchor="middle">root · own machine</text>
|
||||
|
||||
<!-- ===== ORG TENANT — physical-machine isolation ===== -->
|
||||
<g filter="url(#sh)"><rect x="44" y="488" width="1272" height="276" rx="16" fill="#ffffff" stroke="#cdd3df" stroke-width="1.7"/></g>
|
||||
<text x="66" y="516" font-size="16" font-weight="700" fill="#0f172a">Org Tenant — a hierarchy of Workspaces</text>
|
||||
<text x="430" y="516" font-size="12" fill="#64748b">each Workspace = one agent on its OWN dedicated machine · pluggable runtime · per-workspace token</text>
|
||||
|
||||
<!-- root machine -->
|
||||
<g filter="url(#sh)"><rect x="585" y="536" width="190" height="58" rx="10" fill="#0f172a"/></g>
|
||||
<text x="680" y="560" font-size="13" font-weight="700" fill="#fff" text-anchor="middle">Org Lead</text>
|
||||
<text x="680" y="578" font-size="9.5" fill="#cbd5e1" text-anchor="middle">root · own machine</text>
|
||||
|
||||
<!-- three child machines, each in its own hard-gated box -->
|
||||
<g filter="url(#sh)">
|
||||
<rect x="300" y="636" width="220" height="84" rx="11" fill="#f8fafc" stroke="#5b5bd6" stroke-width="1.4"/>
|
||||
<rect x="570" y="636" width="220" height="84" rx="11" fill="#f8fafc" stroke="#5b5bd6" stroke-width="1.4"/>
|
||||
<rect x="840" y="636" width="220" height="84" rx="11" fill="#f8fafc" stroke="#5b5bd6" stroke-width="1.4"/>
|
||||
<rect x="300" y="676" width="220" height="84" rx="11" fill="#f8fafc" stroke="#5b5bd6" stroke-width="1.4"/>
|
||||
<rect x="570" y="676" width="220" height="84" rx="11" fill="#f8fafc" stroke="#5b5bd6" stroke-width="1.4"/>
|
||||
<rect x="840" y="676" width="220" height="84" rx="11" fill="#f8fafc" stroke="#5b5bd6" stroke-width="1.4"/>
|
||||
</g>
|
||||
<!-- machine chrome line per box -->
|
||||
<g font-size="9" fill="#94a3b8" text-anchor="middle">
|
||||
<text x="410" y="654">▢ dedicated EC2 · own OS · own filesystem</text>
|
||||
<text x="680" y="654">▢ dedicated EC2 · own OS · own filesystem</text>
|
||||
<text x="950" y="654">▢ dedicated EC2 · own OS · own filesystem</text>
|
||||
<text x="410" y="694">▢ dedicated EC2 · own OS · own filesystem</text>
|
||||
<text x="680" y="694">▢ dedicated EC2 · own OS · own filesystem</text>
|
||||
<text x="950" y="694">▢ dedicated EC2 · own OS · own filesystem</text>
|
||||
</g>
|
||||
<text x="410" y="682" font-size="13" font-weight="700" fill="#15181f" text-anchor="middle">Agent</text>
|
||||
<text x="410" y="700" font-size="10" fill="#5b6472" text-anchor="middle">runtime · tier · skills · secrets</text>
|
||||
<text x="680" y="682" font-size="13" font-weight="700" fill="#15181f" text-anchor="middle">Team Lead</text>
|
||||
<text x="680" y="700" font-size="10" fill="#5b6472" text-anchor="middle">coordinator</text>
|
||||
<text x="950" y="682" font-size="13" font-weight="700" fill="#15181f" text-anchor="middle">Agent</text>
|
||||
<text x="950" y="700" font-size="10" fill="#5b6472" text-anchor="middle">specialist</text>
|
||||
<text x="410" y="722" font-size="13" font-weight="700" fill="#15181f" text-anchor="middle">Agent</text>
|
||||
<text x="410" y="740" font-size="10" fill="#5b6472" text-anchor="middle">runtime · tier · skills · secrets</text>
|
||||
<text x="680" y="722" font-size="13" font-weight="700" fill="#15181f" text-anchor="middle">Team Lead</text>
|
||||
<text x="680" y="740" font-size="10" fill="#5b6472" text-anchor="middle">coordinator</text>
|
||||
<text x="950" y="722" font-size="13" font-weight="700" fill="#15181f" text-anchor="middle">Agent</text>
|
||||
<text x="950" y="740" font-size="10" fill="#5b6472" text-anchor="middle">specialist</text>
|
||||
|
||||
<!-- structure connectors -->
|
||||
<g stroke="#94a3b8" stroke-width="1.4" fill="none">
|
||||
<path d="M680,594 L680,614 L410,614 L410,636"/>
|
||||
<path d="M680,614 L680,636"/>
|
||||
<path d="M680,614 L950,614 L950,636"/>
|
||||
<path d="M680,640 L680,656 L410,656 L410,676"/>
|
||||
<path d="M680,656 L680,676"/>
|
||||
<path d="M680,656 L950,656 L950,676"/>
|
||||
</g>
|
||||
|
||||
<!-- hard gates between machines -->
|
||||
<g>
|
||||
<line x1="545" y1="632" x2="545" y2="724" stroke="#ef4444" stroke-width="2" stroke-dasharray="3 4"/>
|
||||
<line x1="815" y1="632" x2="815" y2="724" stroke="#ef4444" stroke-width="2" stroke-dasharray="3 4"/>
|
||||
<line x1="545" y1="672" x2="545" y2="764" stroke="#ef4444" stroke-width="2" stroke-dasharray="3 4"/>
|
||||
<line x1="815" y1="672" x2="815" y2="764" stroke="#ef4444" stroke-width="2" stroke-dasharray="3 4"/>
|
||||
</g>
|
||||
<text x="545" y="740" font-size="10" fill="#dc2626" text-anchor="middle">hard gate</text>
|
||||
<text x="815" y="740" font-size="10" fill="#dc2626" text-anchor="middle">hard gate</text>
|
||||
<text x="545" y="780" font-size="10" fill="#dc2626" text-anchor="middle">hard gate</text>
|
||||
<text x="815" y="780" font-size="10" fill="#dc2626" text-anchor="middle">hard gate</text>
|
||||
|
||||
<!-- A2A only-channel arcs (siblings allowed) -->
|
||||
<path d="M520,648 C545,624 570,624 570,648" stroke="#10b981" stroke-width="2.2" fill="none" marker-end="url(#ag)" marker-start="url(#ag)"/>
|
||||
<path d="M790,648 C815,624 840,624 840,648" stroke="#10b981" stroke-width="2.2" fill="none" marker-end="url(#ag)" marker-start="url(#ag)"/>
|
||||
<text x="1086" y="650" font-size="12" font-weight="700" fill="#047857">A2A — the ONLY channel</text>
|
||||
<text x="1086" y="668" font-size="10.5" fill="#0f766e">network-only · hierarchy-gated.</text>
|
||||
<text x="1086" y="684" font-size="10.5" fill="#dc2626">No shared FS / env / secrets —</text>
|
||||
<text x="1086" y="699" font-size="10.5" fill="#dc2626">a workspace cannot touch another's.</text>
|
||||
<path class="mol-pulse" d="M520,688 C545,664 570,664 570,688" stroke="#10b981" stroke-width="2.2" fill="none" marker-end="url(#ag)" marker-start="url(#ag)"/>
|
||||
<path class="mol-pulse" d="M790,688 C815,664 840,664 840,688" stroke="#10b981" stroke-width="2.2" fill="none" marker-end="url(#ag)" marker-start="url(#ag)"/>
|
||||
<text x="1086" y="690" font-size="12" font-weight="700" fill="#047857">A2A — the ONLY channel</text>
|
||||
<text x="1086" y="708" font-size="10.5" fill="#0f766e">network-only · hierarchy-gated.</text>
|
||||
<text x="1086" y="724" font-size="10.5" fill="#dc2626">No shared FS / env / secrets —</text>
|
||||
<text x="1086" y="739" font-size="10.5" fill="#dc2626">a workspace cannot touch another's.</text>
|
||||
|
||||
<!-- governance chip -->
|
||||
<rect x="66" y="636" width="200" height="84" rx="10" fill="#ecfdf5" stroke="#10b981" stroke-width="1.2"/>
|
||||
<text x="82" y="660" font-size="12" font-weight="700" fill="#047857">Governance layer</text>
|
||||
<text x="82" y="680" font-size="10" fill="#0f766e">discovery · access-control</text>
|
||||
<text x="82" y="696" font-size="10" fill="#0f766e">memory scope · approvals</text>
|
||||
<text x="82" y="712" font-size="10" fill="#0f766e">the org chart IS the ACL</text>
|
||||
<rect x="66" y="676" width="200" height="84" rx="10" fill="#ecfdf5" stroke="#10b981" stroke-width="1.2"/>
|
||||
<text x="82" y="700" font-size="12" font-weight="700" fill="#047857">Governance layer</text>
|
||||
<text x="82" y="720" font-size="10" fill="#0f766e">discovery · access-control</text>
|
||||
<text x="82" y="736" font-size="10" fill="#0f766e">memory scope · approvals</text>
|
||||
<text x="82" y="752" font-size="10" fill="#0f766e">the org chart IS the ACL</text>
|
||||
|
||||
<!-- ===== DEEP MEMORY ===== -->
|
||||
<g filter="url(#sh)"><rect x="44" y="784" width="1272" height="150" rx="16" fill="#fff7ed" stroke="#f59e0b" stroke-width="1.6"/></g>
|
||||
<text x="66" y="811" font-size="16" font-weight="700" fill="#b45309">Deep memory — hierarchical & namespaced (HMA)</text>
|
||||
<text x="610" y="811" font-size="11.5" fill="#92560a">durable per-workspace namespace · scoped reach follows the org tree</text>
|
||||
<!-- nested scopes -->
|
||||
<rect x="66" y="826" width="700" height="92" rx="10" fill="#fffdf7" stroke="#f4b860"/>
|
||||
<text x="84" y="848" font-size="12.5" font-weight="700" fill="#b45309">GLOBAL</text>
|
||||
<text x="150" y="848" font-size="10.5" fill="#92560a">read-all · write from root — org-wide knowledge</text>
|
||||
<rect x="84" y="856" width="540" height="54" rx="9" fill="#fff8ee" stroke="#f4c98a"/>
|
||||
<text x="100" y="876" font-size="12.5" font-weight="700" fill="#b45309">TEAM</text>
|
||||
<text x="152" y="876" font-size="10.5" fill="#92560a">parent + siblings — shared team context</text>
|
||||
<rect x="100" y="884" width="320" height="20" rx="6" fill="#fff" stroke="#f4d3a4"/>
|
||||
<text x="116" y="899" font-size="11.5" font-weight="700" fill="#b45309">LOCAL</text>
|
||||
<text x="166" y="899" font-size="10" fill="#92560a">self only — private working memory</text>
|
||||
<!-- surfaces + promotion -->
|
||||
<text x="800" y="850" font-size="11.5" font-weight="700" fill="#92560a">Surfaces</text>
|
||||
<text x="800" y="868" font-size="10.5" fill="#92560a">• agent_memories (scoped) • KV / canvas memory</text>
|
||||
<text x="800" y="884" font-size="10.5" fill="#92560a">• session recall (search) • awareness namespace</text>
|
||||
<text x="800" y="906" font-size="10.5" font-weight="600" fill="#b45309">promotion: memory → repeated success → skill (hot-reload)</text>
|
||||
<g filter="url(#sh)"><rect x="44" y="824" width="1272" height="150" rx="16" fill="#fff7ed" stroke="#f59e0b" stroke-width="1.6"/></g>
|
||||
<text x="66" y="851" font-size="16" font-weight="700" fill="#b45309">Deep memory — hierarchical & namespaced (HMA)</text>
|
||||
<text x="610" y="851" font-size="11.5" fill="#92560a">durable per-workspace namespace · scoped reach follows the org tree</text>
|
||||
<rect x="66" y="866" width="700" height="92" rx="10" fill="#fffdf7" stroke="#f4b860"/>
|
||||
<text x="84" y="888" font-size="12.5" font-weight="700" fill="#b45309">GLOBAL</text>
|
||||
<text x="150" y="888" font-size="10.5" fill="#92560a">read-all · write from root — org-wide knowledge</text>
|
||||
<rect x="84" y="896" width="540" height="54" rx="9" fill="#fff8ee" stroke="#f4c98a"/>
|
||||
<text x="100" y="916" font-size="12.5" font-weight="700" fill="#b45309">TEAM</text>
|
||||
<text x="152" y="916" font-size="10.5" fill="#92560a">parent + siblings — shared team context</text>
|
||||
<rect x="100" y="924" width="320" height="20" rx="6" fill="#fff" stroke="#f4d3a4"/>
|
||||
<text x="116" y="939" font-size="11.5" font-weight="700" fill="#b45309">LOCAL</text>
|
||||
<text x="166" y="939" font-size="10" fill="#92560a">self only — private working memory</text>
|
||||
<text x="800" y="890" font-size="11.5" font-weight="700" fill="#92560a">Surfaces</text>
|
||||
<text x="800" y="908" font-size="10.5" fill="#92560a">• agent_memories (scoped) • KV / canvas memory</text>
|
||||
<text x="800" y="924" font-size="10.5" fill="#92560a">• session recall (search) • awareness namespace</text>
|
||||
<text x="800" y="946" font-size="10.5" font-weight="600" fill="#b45309">promotion: memory → repeated success → skill (hot-reload)</text>
|
||||
|
||||
<!-- arrow tenant -> runtimes -->
|
||||
<path d="M410,720 L410,756 L300,756 L300,968" stroke="#64748b" stroke-width="1.4" fill="none" marker-end="url(#a)"/>
|
||||
<text x="312" y="958" font-size="10.5" fill="#475569">each workspace selects a runtime ▸</text>
|
||||
<path class="mol-flow-slow" d="M300,804 L300,1008" stroke="#64748b" stroke-width="1.4" fill="none" marker-end="url(#a)"/>
|
||||
<text x="312" y="998" font-size="10.5" fill="#475569">each workspace selects a runtime ▸</text>
|
||||
|
||||
<!-- ===== PLUGGABLE RUNTIMES + DEVICES ===== -->
|
||||
<text x="44" y="970" font-size="12" font-weight="700" fill="#64748b" letter-spacing="0.4">PLUGGABLE RUNTIMES — any agent, any device (one BaseAdapter contract)</text>
|
||||
<g filter="url(#sh)"><rect x="44" y="980" width="860" height="222" rx="14" fill="#f8fafc" stroke="#0ea5e9" stroke-width="1.5"/></g>
|
||||
<text x="44" y="1010" font-size="12" font-weight="700" fill="#64748b" letter-spacing="0.4">PLUGGABLE RUNTIMES — any agent, any device (one BaseAdapter contract)</text>
|
||||
<g filter="url(#sh)"><rect x="44" y="1020" width="860" height="222" rx="14" fill="#f8fafc" stroke="#0ea5e9" stroke-width="1.5"/></g>
|
||||
|
||||
<text x="66" y="1006" font-size="13" font-weight="700" fill="#0369a1">Software agent frameworks</text>
|
||||
<text x="66" y="1046" font-size="13" font-weight="700" fill="#0369a1">Software agent frameworks</text>
|
||||
<g font-size="11.5" font-weight="600" text-anchor="middle">
|
||||
<rect x="66" y="1016" width="148" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="140" y="1037" fill="#15181f">claude-code</text>
|
||||
<rect x="224" y="1016" width="130" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="289" y="1037" fill="#15181f">langgraph</text>
|
||||
<rect x="364" y="1016" width="120" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="424" y="1037" fill="#15181f">autogen</text>
|
||||
<rect x="494" y="1016" width="130" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="559" y="1037" fill="#15181f">openclaw</text>
|
||||
<rect x="66" y="1056" width="110" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="121" y="1077" fill="#15181f">hermes</text>
|
||||
<rect x="186" y="1056" width="110" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="241" y="1077" fill="#15181f">codex</text>
|
||||
<rect x="306" y="1056" width="150" height="32" rx="8" fill="#fff7ed" stroke="#f4b860"/><text x="381" y="1077" fill="#b45309">google-adk</text>
|
||||
<rect x="466" y="1056" width="190" height="32" rx="8" fill="#faf5ff" stroke="#d8b4fe"/><text x="561" y="1077" fill="#7c3aed">external / BYO agent</text>
|
||||
<rect x="66" y="1056" width="148" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="140" y="1077" fill="#15181f">claude-code</text>
|
||||
<rect x="224" y="1056" width="130" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="289" y="1077" fill="#15181f">langgraph</text>
|
||||
<rect x="364" y="1056" width="120" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="424" y="1077" fill="#15181f">autogen</text>
|
||||
<rect x="494" y="1056" width="130" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="559" y="1077" fill="#15181f">openclaw</text>
|
||||
<rect x="66" y="1096" width="110" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="121" y="1117" fill="#15181f">hermes</text>
|
||||
<rect x="186" y="1096" width="110" height="32" rx="8" fill="#fff" stroke="#bae6fd"/><text x="241" y="1117" fill="#15181f">codex</text>
|
||||
<rect x="306" y="1096" width="150" height="32" rx="8" fill="#fff7ed" stroke="#f4b860"/><text x="381" y="1117" fill="#b45309">google-adk</text>
|
||||
<rect x="466" y="1096" width="190" height="32" rx="8" fill="#faf5ff" stroke="#d8b4fe"/><text x="561" y="1117" fill="#7c3aed">external / BYO agent</text>
|
||||
</g>
|
||||
|
||||
<line x1="66" y1="1104" x2="884" y2="1104" stroke="#e2e8f0" stroke-width="1"/>
|
||||
<text x="66" y="1126" font-size="13" font-weight="700" fill="#0369a1">Embodied & edge devices <tspan font-size="10.5" font-weight="500" fill="#94a3b8">— roadmap</tspan></text>
|
||||
<line x1="66" y1="1144" x2="884" y2="1144" stroke="#e2e8f0" stroke-width="1"/>
|
||||
<text x="66" y="1166" font-size="13" font-weight="700" fill="#0369a1">Embodied & edge devices <tspan font-size="10.5" font-weight="500" fill="#94a3b8">— roadmap</tspan></text>
|
||||
<g font-size="11.5" font-weight="600" text-anchor="middle" fill="#0f172a">
|
||||
<rect x="66" y="1136" width="150" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="141" y="1158">smart glasses</text>
|
||||
<rect x="226" y="1136" width="120" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="286" y="1158">watches</text>
|
||||
<rect x="356" y="1136" width="120" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="416" y="1158">robots</text>
|
||||
<rect x="486" y="1136" width="170" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="571" y="1158">home / building systems</text>
|
||||
<rect x="666" y="1136" width="150" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="741" y="1158">vehicles · IoT · …</text>
|
||||
<rect x="66" y="1176" width="150" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="141" y="1198">smart glasses</text>
|
||||
<rect x="226" y="1176" width="120" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="286" y="1198">watches</text>
|
||||
<rect x="356" y="1176" width="120" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="416" y="1198">robots</text>
|
||||
<rect x="486" y="1176" width="170" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="571" y="1198">home / building systems</text>
|
||||
<rect x="666" y="1176" width="150" height="34" rx="8" fill="#f0f9ff" stroke="#7dd3fc"/><text x="741" y="1198">vehicles · IoT · …</text>
|
||||
</g>
|
||||
<text x="66" y="1192" font-size="10.5" fill="#5b6472">Any A2A/MCP-speaking endpoint — a software agent OR an intelligent device — registers as a governed workspace in the org.</text>
|
||||
<text x="66" y="1232" font-size="10.5" fill="#5b6472">Any A2A/MCP-speaking endpoint — a software agent OR an intelligent device — registers as a governed workspace in the org.</text>
|
||||
|
||||
<!-- providers -->
|
||||
<g filter="url(#sh)"><rect x="920" y="980" width="396" height="222" rx="14" fill="#e8f0fe" stroke="#4285f4" stroke-width="1.5"/></g>
|
||||
<text x="942" y="1006" font-size="13" font-weight="700" fill="#1a56c4">Model providers</text>
|
||||
<text x="942" y="1024" font-size="10.5" fill="#3b6fd4">runtimes call whichever the model id names</text>
|
||||
<g filter="url(#sh)"><rect x="920" y="1020" width="396" height="222" rx="14" fill="#e8f0fe" stroke="#4285f4" stroke-width="1.5"/></g>
|
||||
<text x="942" y="1046" font-size="13" font-weight="700" fill="#1a56c4">Model providers</text>
|
||||
<text x="942" y="1064" font-size="10.5" fill="#3b6fd4">runtimes call whichever the model id names</text>
|
||||
<g font-size="11.5" font-weight="600" text-anchor="middle">
|
||||
<rect x="942" y="1036" width="354" height="32" rx="8" fill="#fff" stroke="#9cc0fb"/><text x="1119" y="1057" fill="#15181f">Anthropic (Claude)</text>
|
||||
<rect x="942" y="1076" width="354" height="32" rx="8" fill="#fff" stroke="#9cc0fb"/><text x="1119" y="1097" fill="#15181f">OpenAI & OpenAI-compatible</text>
|
||||
<rect x="942" y="1116" width="354" height="32" rx="8" fill="#fff" stroke="#4285f4" stroke-width="1.5"/><text x="1119" y="1137" fill="#1a56c4">Google Vertex AI · Gemini</text>
|
||||
<rect x="942" y="1076" width="354" height="32" rx="8" fill="#fff" stroke="#9cc0fb"/><text x="1119" y="1097" fill="#15181f">Anthropic (Claude)</text>
|
||||
<rect x="942" y="1116" width="354" height="32" rx="8" fill="#fff" stroke="#9cc0fb"/><text x="1119" y="1137" fill="#15181f">OpenAI & OpenAI-compatible</text>
|
||||
<rect x="942" y="1156" width="354" height="32" rx="8" fill="#fff" stroke="#4285f4" stroke-width="1.5"/><text x="1119" y="1177" fill="#1a56c4">Google Vertex AI · Gemini</text>
|
||||
</g>
|
||||
<text x="942" y="1172" font-size="10" fill="#3b6fd4">+ OpenRouter and any OpenAI-compatible gateway.</text>
|
||||
<text x="942" y="1190" font-size="10" fill="#7c8aa3">Orchestration core is provider-agnostic — all swappable.</text>
|
||||
<text x="942" y="1212" font-size="10" fill="#3b6fd4">+ OpenRouter and any OpenAI-compatible gateway.</text>
|
||||
<text x="942" y="1230" font-size="10" fill="#7c8aa3">Orchestration core is provider-agnostic — all swappable.</text>
|
||||
|
||||
<!-- runtime -> provider -->
|
||||
<path d="M904,1090 L920,1090" stroke="#64748b" stroke-width="1.6" fill="none" marker-end="url(#a)"/>
|
||||
<path class="mol-flow-slow" d="M904,1130 L920,1130" stroke="#64748b" stroke-width="1.6" fill="none" marker-end="url(#a)"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
Reference in New Issue
Block a user