Master control plane for EvoFlux — centralize agents, skills, MCP, and per-member usage/performance for a software project.
evo-conductor/
├── apps/
│ └── web/ # React console (Vite)
├── crates/
│ ├── conductor-domain/ # pure domain (no I/O)
│ ├── conductor-storage/ # SQLite repos / migrations
│ ├── conductor-auth/ # passwords, JWT, connection tokens
│ └── conductor-server/ # Axum HTTP + binary
├── docs/
├── data/ # local sqlite (gitignored)
├── Cargo.toml # Rust workspace
└── Makefile
| Crate | Responsibility |
|---|---|
conductor-domain |
Entities, roles, DTOs, domain errors |
conductor-storage |
Db + repos::{instance,users,roles,secrets,resources,dashboard} |
conductor-auth |
Argon2, JWT, evc_ token hashing |
conductor-server |
config + http::{routes,extractors,state} + thin main |
| Path | Responsibility |
|---|---|
app/ |
Router, boot gate |
features/*/ |
Feature pages (setup, auth, dashboard, …) |
shared/ |
API client, UI kit, stores, shell |
styles/ |
Design tokens (EvoFlux-aligned) |
| Primary | Capabilities |
|---|---|
| admin | Setup, SSO, members, sub-roles, resource policy, telemetry |
| contribute | Publish shared agents/skills/MCP, view team monitoring |
| user | Consume catalogs, create secrets, report usage |
Admin defines sub-roles (dev, ba, tester by default).
make devStarts API (:4700) and Vite (:5174, proxies /api) together. Open http://127.0.0.1:5174
Useful extras: make reset-db (fresh setup wizard), make kill-dev-ports, make help.
Default is SQLite. Switch via CONDUCTOR_DATABASE_URL:
# SQLite (default)
CONDUCTOR_DATABASE_URL=sqlite:data/conductor.db?mode=rwc
# Postgres
CONDUCTOR_DATABASE_URL=postgres://user:pass@127.0.0.1:5432/conductor
# MySQL
CONDUCTOR_DATABASE_URL=mysql://user:pass@127.0.0.1:3306/conductorGET /api/health reports the active dialect in database.
- Create an App Registration (Web) in Entra ID.
- Redirect URI:
http://127.0.0.1:4700/api/auth/sso/callback(or your public API URL). - Create a client secret.
- In Conductor setup, enable SSO → provider Microsoft Entra ID, issuer:
https://login.microsoftonline.com/{tenant-id}/v2.0 - Set Public URL to the web console origin (e.g.
http://127.0.0.1:5174) so callback can return to/auth/callback.
Flow: GET /api/auth/sso/start → Entra login → GET /api/auth/sso/callback → redirect to the console. Conductor uses authorization code + PKCE, validates state and nonce, and verifies the ID token against provider JWKS, issuer, and audience. The browser session is transferred in a URL fragment (never a query string) and kept in tab-scoped session storage.
Local and temporary passwords must be at least 12 characters. Password resets, password changes, and account disable/enable operations revoke existing browser sessions immediately. Disabling a member also blocks that member's EvoFlux connection secrets.
Conductor exposes a server-sent events invalidation plane at GET /api/v1/realtime/events and a Git-style smart-fetch data plane at POST /api/v1/resources/fetch. Both use an evc_… bearer secret with the subscribe_resources scope. EvoFlux negotiates its member-specific desired commit, downloads only missing immutable objects, verifies a complete staged tree, then switches generations atomically. The legacy full-snapshot endpoint remains temporarily for compatibility.
See docs/resource-fetch-protocol.md for the normative object/checkout contract and docs/evoflux-integration.md for realtime, capacity, reverse-proxy and rollout details.
The governed catalog supports draft/publish/archive lifecycle, version history, role/team/member access policies, idempotent member usage tracking, effectiveness charts and feedback. See docs/resource-catalog-product.md for the product model and permission matrix.
For a deterministic public-API load test covering 1,000 members, resource sync, inventory and attributed telemetry, see docs/fleet-simulator.md.
For Local, S3, Azure Blob and Git resource storage, credential handling and provider migration guarantees, see docs/object-storage.md.
See .env.example.