Some checks failed
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>
124 lines
4.5 KiB
HTML
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>
|