ui dashboard #3
Labels
No labels
prio_critical
prio_low
type_bug
type_contact
type_issue
type_lead
type_question
type_story
type_task
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
lhumina_code/hero_claude#3
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
hero_claude_ui
needs to have a full blown dashboard
use skills
/hero_ui_dashboard
/hero_ui_openrpc_proxy
then implement at least following functions
... basically everything needed to operate multiplate agents, sessions and its tasks
think carefully how is best way to do this put this in spec in details, how will user journey be
let user agree
ACP Admin Dashboard — Implementation Specification
Issue #3:
hero_claude_uiFull-Blown DashboardVersion: 1.0
Date: 2026-04-06
Status: DRAFT — awaiting user approval before implementation
1. Objective
Replace the current minimal
hero_claude_uisingle-page debug panel (inline HTML strings, CDN links, raw JSON<pre>dumps) with a production-quality Bootstrap 5.3.3 admin dashboard conforming to the Hero admin dashboard standard.The dashboard must allow an operator to:
openrpc.json2. Complete API Inventory
All methods come from
crates/hero_claude_server/openrpc.json.System Methods
acp.ping— Returnsok, service name, timestampacp.health— Status (ok/degraded/error), uptime_seconds, per-subsystem checks arrayAgent Methods (12 methods)
acp.agent.list,acp.agent.register,acp.agent.update,acp.agent.get,acp.agent.unregister,acp.agent.start,acp.agent.stop,acp.agent.restart,acp.agent.pause,acp.agent.resume,acp.agent.heartbeat,acp.agent.state,acp.agent.capabilitiesAgent statuses:
created,idle,running,paused,stopped,error,staleTask Methods (10 methods)
acp.task.submit,acp.task.get,acp.task.list,acp.task.cancel,acp.task.retry,acp.task.result,acp.task.messages,acp.task.input,acp.task.steps,acp.task.logsTask statuses:
queued,running,completed,failed,cancelled,timed_outEvent Methods (4 methods)
acp.event.list,acp.event.subscribe,acp.event.unsubscribe,acp.event.pollMetrics Methods
acp.metrics.get— scoped per agent or global, windowed (1m/5m/15m/1h/24h)3. User Journey
Default Load → Agents Tab
Agent Management
Task Management
Events Tab
Metrics Tab
Stats Tab
Admin Tab
Docs Tab
GET /openrpc.json, grouped by domain prefix4. Architecture
Follows the
hero_ui_openrpc_proxypattern:Key design decisions:
pollmode (no WebSocket/SSE needed)rust-embed(Bootstrap 5.3.3, Bootstrap Icons 1.13.1, Unpoly 3.12.1, Chart.js 4.4.3)5. File Structure
6. Implementation Steps (10 steps)
Step 1 — Update
Cargo.tomlAdd
askama,rust-embed(withdebug-embedfeature),mime_guessto dependencies. Addaskama.tomlat crate root.Step 2 — Create
scripts/download-assets.shDownload Bootstrap 5.3.3, Bootstrap Icons 1.13.1, Unpoly 3.12.1, Chart.js 4.4.3. Idempotent (skip existing).
Step 3 — Create
src/assets.rsrust-embedAsset struct embeddingstatic/. Static file handler forGET /static/*pathwith MIME detection.Step 4 — Create
static/css/dashboard.cssFull Hero standard CSS + ACP specifics: layout vars, dark/light theme, compact sizing, sidebar, tab bar, status badges (agent + task), task detail panel, message bubbles, log entry colors, docs layout.
Step 5 — Create
templates/index.htmlAskama template: full HTML shell with navbar, tab bar (Agents/Tasks/Events/Metrics/Stats/Admin/Docs), sidebar, content area div placeholders, task/agent detail panel overlays, toast container. Receives
versionandserver_socketvariables.Step 6 — Create
src/routes.rsSingle aggregation handler
GET /api/overview: fans out toacp.health+acp.agent.list{limit:1}+acp.task.list{limit:1}, returns combined JSON.Step 7 — Rewrite
src/main.rsFull Axum app:
openrpc_proxy!macro for/rpc+/openrpc.json, index handler with Askama template, all route registrations, preserved Unix socket listener loop.Step 8 — Create
static/js/dashboard.jsAll client-side logic in 12 sections:
Step 9 — Create
MakefileTargets:
run,dev,download-assets,test,installStep 10 — Create
scripts/smoke-test.sh9 smoke tests covering: index, health, openrpc.json, static assets, heroservice.json, RPC ping, api/overview, 404
7. Acceptance Criteria
GET /with full Bootstrap layout/static/*with correct MIME types — no CDN references/openrpc.jsonreturns ACP spec,POST /rpcwithacp.pingreturns valid result/api/overviewreturns health + totals/openrpc.json8. Notes
/docs.getRPC — documentation embedded as JS string constants indashboard.jsacp.agent.list{limit:1000}call, count client-side (avoids 7 separate RPC calls)pollmode only (no WebSocket/SSE)rust-embed debug-embed: reads from filesystem in debug builds — rundownload-assets.shfirstmain.rsfor hero_inspector proxy compatibility<style>blocks in templates (Hero dashboard rules)Build & Test Results — hero_claude_ui
cargo check
Result: PASS — clean build, zero warnings.
cargo test
Result: PASS — 0 unit tests defined (expected at this stage).
Files created / modified (relative to last commit)
Modified:
Cargo.tomlMakefileREADME.mdcrates/hero_claude/src/main.rscrates/hero_claude_examples/tests/integration.rscrates/hero_claude_server/openrpc.jsoncrates/hero_claude_ui/Cargo.tomlcrates/hero_claude_ui/src/main.rsNew (untracked):
.forgejo/workflows/ci.ymlcrates/hero_claude_server/openrpc.client.generated.rscrates/hero_claude_server/server.pycrates/hero_claude_ui/Makefilecrates/hero_claude_ui/askama.tomlcrates/hero_claude_ui/scripts/download-assets.shcrates/hero_claude_ui/scripts/smoke-test.shcrates/hero_claude_ui/src/assets.rscrates/hero_claude_ui/src/routes.rscrates/hero_claude_ui/static/— Bootstrap 5.3.3, Chart.js, Unpoly, Bootstrap Icons (CSS/JS/fonts)crates/hero_claude_ui/templates/index.htmlexamples/play.pySummary
cargo checkcargo testImplementation Complete ✅
The
hero_claude_uicrate has been upgraded to a full ACP Admin Dashboard.Files Created / Modified
crates/hero_claude_ui/Cargo.tomlaskama,rust-embed(debug-embed),mime_guesscrates/hero_claude_ui/askama.tomlcrates/hero_claude_ui/src/main.rscrates/hero_claude_ui/src/assets.rsrust-embedAsset struct + static file handler (GET /static/*path)crates/hero_claude_ui/src/routes.rs/api/overviewaggregation handler (health + agents + tasks)crates/hero_claude_ui/templates/index.htmlcrates/hero_claude_ui/static/css/dashboard.csscrates/hero_claude_ui/static/js/dashboard.jscrates/hero_claude_ui/static/favicon.svgcrates/hero_claude_ui/static/css/bootstrap.min.csscrates/hero_claude_ui/static/js/bootstrap.bundle.min.jscrates/hero_claude_ui/static/css/bootstrap-icons.min.csscrates/hero_claude_ui/static/fonts/bootstrap-icons.woff2crates/hero_claude_ui/static/js/unpoly.min.jscrates/hero_claude_ui/static/css/unpoly.min.csscrates/hero_claude_ui/static/js/chart.min.jscrates/hero_claude_ui/scripts/download-assets.shcrates/hero_claude_ui/scripts/smoke-test.shcrates/hero_claude_ui/Makefilerun,dev,build,download-assets,test,installtargetsDashboard Features
7 Tabs implemented:
/openrpc.json, static content for each API domainArchitecture:
openrpc_proxy!macro generatesPOST /rpc+GET /openrpc.json— proxies tohero_claude_server.sockrust-embed— no CDN, fully self-contained binaryBuild Results
cargo check -p hero_claude_ui— ✅ clean, zero warningscargo test -p hero_claude_ui— ✅ ok (0 defined unit tests)