xml-pipeline/dashboard/index.html
dullfig 06eeea3dee
Some checks failed
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.13) (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / typecheck (push) Has been cancelled
CI / docker (push) Has been cancelled
Add AgentOS container foundation, security hardening, and management plane
Invert the agent model: the agent IS the computer. The message pump
becomes the kernel, handlers are sandboxed apps, and all access is
mediated by the platform.

Phase 1 — Container foundation:
- Multi-stage Dockerfile (python:3.12-slim, non-root user, /data volume)
- deploy/entrypoint.py with --dry-run config validation
- docker-compose.yml (cap_drop ALL, read_only, no-new-privileges)
- docker-compose.dev.yml overlay for development
- CI Docker build smoke test

Phase 2 — Security hardening:
- xml_pipeline/security/ module with default-deny container mode
- Permission gate: per-listener tool allowlist enforcement
- Network policy: egress control (only declared LLM backend domains)
- Shell tool: disabled in container mode
- File tool: restricted to /data and /config in container mode
- Fetch tool: integrates network egress policy
- Config loader: parses security and network YAML sections

Phase 3 — Management plane:
- Agent app (port 8080): minimal /health, /inject, /ws only
- Management app (port 9090): full API, audit log, dashboard
- SQLite-backed audit log for tool invocations and security events
- Static web dashboard (no framework, WebSocket-driven)
- CLI --split flag for dual-port serving

All 439 existing tests pass with zero regressions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 21:37:24 -08:00

124 lines
4.5 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AgentOS Dashboard</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<div class="header-left">
<h1>AgentOS</h1>
<span id="organism-name" class="organism-name">--</span>
</div>
<div class="header-right">
<span id="connection-status" class="status-indicator disconnected">Disconnected</span>
<span id="uptime" class="uptime">--</span>
</div>
</header>
<main>
<!-- Status Cards -->
<section class="cards">
<div class="card">
<div class="card-label">Agents</div>
<div class="card-value" id="agent-count">--</div>
<div class="card-detail" id="agent-detail">--</div>
</div>
<div class="card">
<div class="card-label">Active Threads</div>
<div class="card-value" id="thread-count">--</div>
<div class="card-detail" id="thread-detail">--</div>
</div>
<div class="card">
<div class="card-label">Messages</div>
<div class="card-value" id="message-count">--</div>
<div class="card-detail" id="message-rate">--</div>
</div>
<div class="card">
<div class="card-label">Token Usage</div>
<div class="card-value" id="token-count">--</div>
<div class="card-detail" id="token-cost">--</div>
</div>
</section>
<!-- Tabs -->
<nav class="tabs">
<button class="tab active" data-tab="agents">Agents</button>
<button class="tab" data-tab="threads">Threads</button>
<button class="tab" data-tab="messages">Messages</button>
<button class="tab" data-tab="audit">Audit Log</button>
</nav>
<!-- Agent List -->
<section id="tab-agents" class="tab-content active">
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>State</th>
<th>Peers</th>
<th>Messages</th>
</tr>
</thead>
<tbody id="agents-table">
<tr><td colspan="5" class="empty">Loading...</td></tr>
</tbody>
</table>
</section>
<!-- Thread List -->
<section id="tab-threads" class="tab-content">
<table>
<thead>
<tr>
<th>Thread ID</th>
<th>Status</th>
<th>Participants</th>
<th>Messages</th>
<th>Created</th>
</tr>
</thead>
<tbody id="threads-table">
<tr><td colspan="5" class="empty">Loading...</td></tr>
</tbody>
</table>
</section>
<!-- Message Log -->
<section id="tab-messages" class="tab-content">
<div id="message-log" class="log">
<div class="empty">Waiting for messages...</div>
</div>
</section>
<!-- Audit Log -->
<section id="tab-audit" class="tab-content">
<div class="audit-filters">
<select id="audit-severity">
<option value="">All severities</option>
<option value="info">Info</option>
<option value="warning">Warning</option>
<option value="error">Error</option>
<option value="critical">Critical</option>
</select>
<select id="audit-type">
<option value="">All types</option>
<option value="tool_invocation">Tool Invocation</option>
<option value="peer_violation">Peer Violation</option>
<option value="security_event">Security Event</option>
<option value="config_change">Config Change</option>
</select>
<button onclick="refreshAudit()">Refresh</button>
</div>
<div id="audit-log" class="log">
<div class="empty">No audit events</div>
</div>
</section>
</main>
<script src="dashboard.js"></script>
</body>
</html>