NodeConfig and MasterNodeConfig gain an optional addresses[] field
for fallback addresses tried in order after the primary address.
Provides resilience when Tailscale DNS is down or a node is only
reachable via LAN.
- dialAgentMulti: tries each address with a 3s health check, returns
first success
- forEachNode: uses multi-address dialing
- AgentPool.AddNodeMulti: master tries all addresses when connecting
- AllAddresses(): deduplicates primary + fallback addresses
Config example:
[[nodes]]
name = "rift"
address = "rift.scylla-hammerhead.ts.net:9444"
addresses = ["100.95.252.120:9444", "192.168.88.181:9444"]
Existing configs without addresses[] work unchanged.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AgentClient wraps a gRPC connection to a single agent with typed
forwarding methods (Deploy, UndeployService, SetupEdgeRoute, etc.).
AgentPool manages connections to multiple agents keyed by node name.
Follows the same TLS 1.3 + token interceptor pattern as cmd/mcp/dial.go
but runs server-side with the master's own MCIAS service token.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>