feat(host-agent): Rust rewrite Phase 0 — multi-instance foundation, v2 wire protocol, real telemetry
All checks were successful
Test Asgard Runner / test (push) Successful in 3s
All checks were successful
Test Asgard Runner / test (push) Successful in 3s
New corrosion-host-agent/ crate (Go companion-agent stays as behavior
reference until parity). Wire protocol v2 per COA-B: instance-scoped
subjects corrosion.{license}.{instance}.* + host-level .host.* — spec
in PROTOCOL.md, designed for the license->host->instance fleet model.
- Multi-instance TOML config in the foundation, not retrofitted
- NATS layer on the Vigilance production profile (infinite reconnect,
capped backoff, 30s ping, 8192-msg offline buffer)
- Heartbeat with real sysinfo telemetry — Go agent shipped hardcoded
disk/cpu placeholders; this is the panel's first true Resources data
- Connectivity prober (outbound TCP, periodic + on-demand)
- Host cmd channel (ping/probe/sysinfo), going-offline beacon,
CancellationToken shutdown
- Live-fire verified against production NATS; artifacts: 3.7MB static
linux-musl, 3.8MB windows .exe (static CRT)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
30
corrosion-host-agent/src/subjects.rs
Normal file
30
corrosion-host-agent/src/subjects.rs
Normal file
@@ -0,0 +1,30 @@
|
||||
//! Corrosion wire protocol v2 subject scheme (see PROTOCOL.md).
|
||||
//!
|
||||
//! Host-level subjects live under `corrosion.{license}.host.*`; per-instance
|
||||
//! subjects under `corrosion.{license}.{instance_id}.*`. Instance ids are
|
||||
//! validated at config load so they can never collide with the reserved
|
||||
//! `host` segment or contain subject metacharacters.
|
||||
|
||||
pub fn host_heartbeat(license: &str) -> String {
|
||||
format!("corrosion.{license}.host.heartbeat")
|
||||
}
|
||||
|
||||
pub fn host_cmd(license: &str) -> String {
|
||||
format!("corrosion.{license}.host.cmd")
|
||||
}
|
||||
|
||||
pub fn host_going_offline(license: &str) -> String {
|
||||
format!("corrosion.{license}.host.going_offline")
|
||||
}
|
||||
|
||||
/// Phase 1: per-instance command channel (start/stop/restart/rcon/...).
|
||||
#[allow(dead_code)]
|
||||
pub fn instance_cmd(license: &str, instance: &str) -> String {
|
||||
format!("corrosion.{license}.{instance}.cmd")
|
||||
}
|
||||
|
||||
/// Phase 1: per-instance state-change events.
|
||||
#[allow(dead_code)]
|
||||
pub fn instance_status(license: &str, instance: &str) -> String {
|
||||
format!("corrosion.{license}.{instance}.status")
|
||||
}
|
||||
Reference in New Issue
Block a user