Skip to content

Web Dashboard

The web dashboard is a React single-page application served from the Gateway. It provides a graphical interface for managing agents, conversations, skills, channels, and security — all from your browser.

The dashboard uses a three-panel layout:

┌──────────┬────────────────────────┬──────────────┐
│ │ Top Bar (56px) │ │
│ Sidebar ├────────────────────────┤ Right Panel │
│ (260px) │ │ (320px) │
│ │ Main Content │ Collapsible │
│ Nav │ │ │
│ │ │ │
└──────────┴────────────────────────┴──────────────┘
ComponentPurpose
SidebarNavigation with page links, agent list, skill list
TopbarHeader with user profile, settings, and account menu
Main ContentActive page content
RightPanelCollapsible detail panel (context-sensitive)

The primary interface. Features a persistent prompt bar for conversing with agents in real time.

  • Real-time streaming — messages appear as the agent generates them via SignalR
  • Tool call cards — expanding cards show skill execution details (name, status, duration, result)
  • Typing indicators — visual feedback while the agent is processing
  • Welcome state — quick action buttons for common operations on first load
  • Agent switching — chat with different agents via /chat/{agentId} routes

Create, configure, and monitor AI agents:

  • Agent list — all agents with status indicators (online, offline, error)
  • Configuration — edit system prompts, models, enabled skills, allowed channels
  • Metrics — per-agent session count, message count, tool call count, uptime
  • Quick create — scaffold a new agent with defaults

Browse and manage installed skills:

  • Installed skills — view enabled/disabled status, toggle per-agent
  • Skill details — version, publisher, permissions, description
  • Permission management — grant/revoke permissions when installing

Browse the skill catalog at /marketplace:

  • Category browsing — filter by CRM, communication, scheduling, finance, etc.
  • Search — full-text search across skill names and descriptions
  • Skill detail pages — publisher info, version history, permission summary
  • One-click install — install and configure skills directly from the marketplace

Configure messaging channel adapters:

  • Channel list — all configured channels with connection status (connected, pending, disconnected)
  • Configuration — webhook URLs, API keys, bot tokens
  • Connectivity test — verify channel connections work end-to-end
  • Channel icons — visual indicators for each platform

Security dashboard at /security:

  • Prompt injection events — recent detection events with details
  • API token management — create, revoke, and rotate API tokens
  • MFA configuration — multi-factor authentication settings
  • Security overview — summary metrics and threat indicators

Full audit trail viewer at /audit:

  • Event stream — chronological list of all audited actions
  • Filtering — filter by event type, actor, agent, time range
  • Search — full-text search across audit entries
  • Export — download audit data for compliance reporting

Platform configuration at /settings:

  • User profile — name, email, avatar
  • AI provider keys — configure API keys for model providers
  • Theme — dark/light mode preferences
  • Billing — subscription and usage information

Authentication page at /login:

  • Email and password login
  • Token stored in session storage
  • Protected routes redirect to login when unauthenticated

The dashboard connects to the backend via SignalR for live updates:

EventDirectionDescription
SendMessageClient → ServerSend a message to the current agent
ReceiveMessageServer → ClientAgent response with content and message ID
AgentTypingServer → ClientTyping indicator (agent ID, isTyping flag)

Connection details:

  • Endpoint: /hubs/chat (WebSocket upgrade)
  • Authentication: JWT Bearer token
  • Users grouped by user ID (from JWT sub claim)
  • Reconnection: exponential backoff at 0s, 2s, 5s, 10s, 30s
StoreLibraryPersistencePurpose
AuthZustandsessionStorageUser, token, isAuthenticated
ChatZustandIn-memoryActive agent/session, messages, typing state
UIZustandIn-memorySidebar state, panel visibility
Server stateTanStack QueryCacheAgent configs, skills, channels, audit logs

The auth store persists to sessionStorage under the key komand-auth, so login state survives page refreshes but not browser restarts.

The frontend uses a typed fetchApi<T>() wrapper that:

  • Injects the Authorization: Bearer {token} header from the auth store
  • Generates a unique X-Request-Id for correlation tracing
  • Unwraps the ApiResponse<T> envelope, returning data on success
  • Throws with the error message on failure
  • Uses VITE_API_URL as the base URL (defaults to same origin)
TechnologyVersionPurpose
React19Component framework
TypeScript5.9Type safety (strict mode)
Vite7.3Build and dev server
TailwindCSS4Utility-first styling
React Router7Client-side routing
TanStack Query5Server state caching and synchronisation
Zustand5Lightweight client state
SignalR10Real-time WebSocket communication
Lucide ReactIcon library
SonnerToast notifications
  • Dark-first with light mode support
  • Primary background: #0a0a0f
  • Accent color: #4af0c0 (teal-green)
  • Code/brand font: JetBrains Mono
  • UI text font: DM Sans
  • Reusable component library: Button, Input, Card, Badge, Avatar, Spinner, Toggle, EmptyState, ErrorBoundary

The dashboard is built as a static SPA and embedded in the Gateway’s wwwroot/ directory during the Docker build. No separate hosting is required — the Gateway serves both the API and the frontend.

Dockerfile.gateway:
1. Node build stage → compiles React app to dist/
2. .NET build stage → compiles Gateway
3. Runtime stage → copies dist/ into wwwroot/