qac-cli-commands #26

Merged
madrigal merged 15 commits from qac-cli-commands into main 2026-04-21 09:03:29 -04:00
2 changed files with 38 additions and 12 deletions
Showing only changes of commit 84f3a63e8b - Show all commits

View File

@ -38,16 +38,41 @@ def _cmd_detect(_args: argparse.Namespace) -> int:
def _cmd_register(args: argparse.Namespace) -> int: def _cmd_register(args: argparse.Namespace) -> int:
import urllib.request
hub_url = args.hub.rstrip("/")
url = f"{hub_url}/screens/agents/register"
body = json.dumps({"name": args.name or ""}).encode()
req = urllib.request.Request(
url,
data=body,
headers={
"Content-Type": "application/json",
"X-API-Key": args.api_key,
},
)
try:
with urllib.request.urlopen(req) as resp:
data = json.loads(resp.read())
except Exception as e:
print(f"error: registration failed: {e}", file=sys.stderr)
return 1
agent_id = data["agent_id"]
token = data["token"]
cfg = _config.load() cfg = _config.load()
cfg.hub_url = args.url cfg.hub_url = hub_url
cfg.token = args.token cfg.agent_id = agent_id
cfg.token = token
cfg.api_key = args.api_key
if args.name: if args.name:
cfg.name = args.name cfg.name = args.name
if args.agent_id:
cfg.agent_id = args.agent_id
cfg.insecure = bool(args.insecure) cfg.insecure = bool(args.insecure)
path = _config.save(cfg) path = _config.save(cfg)
print(f"Saved agent credentials to {path}")
print(f"Registered agent: {agent_id}")
print(f"Credentials saved to {path}")
return 0 return 0
@ -75,7 +100,7 @@ def _derive_ws_url(hub_url: str, agent_id: str) -> str:
base = "wss://" + base[len("https://"):] base = "wss://" + base[len("https://"):]
elif base.startswith("http://"): elif base.startswith("http://"):
base = "ws://" + base[len("http://"):] base = "ws://" + base[len("http://"):]
suffix = f"/api/agent/ws/{agent_id}" if agent_id else "/api/agent/ws" suffix = f"/screens/agent/ws?agent_id={agent_id}" if agent_id else "/screens/agent/ws"
return base + suffix return base + suffix
@ -93,12 +118,11 @@ def main() -> None:
sub.add_parser("run", help="Legacy long-poll agent (NodeAgent)") sub.add_parser("run", help="Legacy long-poll agent (NodeAgent)")
sub.add_parser("detect", help="List available SDR drivers") sub.add_parser("detect", help="List available SDR drivers")
p_reg = sub.add_parser("register", help="Save agent credentials to ~/.ria/agent.json") p_reg = sub.add_parser("register", help="Register agent with RIA Hub and save credentials")
p_reg.add_argument("--url", required=True, help="RIA Hub base URL") p_reg.add_argument("--hub", required=True, help="RIA Hub URL (e.g. http://whitehorse:3005)")
p_reg.add_argument("--token", required=True, help="Agent registration token") p_reg.add_argument("--api-key", dest="api_key", required=True, help="Hub API key")
p_reg.add_argument("--name", default=None) p_reg.add_argument("--name", default=None, help="Human-friendly agent name")
p_reg.add_argument("--agent-id", dest="agent_id", default=None) p_reg.add_argument("--insecure", action="store_true", help="Skip TLS verification")
p_reg.add_argument("--insecure", action="store_true")
p_stream = sub.add_parser("stream", help="Run the WebSocket IQ streamer") p_stream = sub.add_parser("stream", help="Run the WebSocket IQ streamer")
p_stream.add_argument("--url", default=None, help="Override WebSocket URL") p_stream.add_argument("--url", default=None, help="Override WebSocket URL")

View File

@ -28,6 +28,7 @@ class AgentConfig:
token: str = "" token: str = ""
name: str = "" name: str = ""
insecure: bool = False insecure: bool = False
api_key: str = ""
extra: dict = field(default_factory=dict) extra: dict = field(default_factory=dict)
@ -48,6 +49,7 @@ def load(path: Path | None = None) -> AgentConfig:
token=data.get("token", ""), token=data.get("token", ""),
name=data.get("name", ""), name=data.get("name", ""),
insecure=bool(data.get("insecure", False)), insecure=bool(data.get("insecure", False)),
api_key=data.get("api_key", ""),
extra=extra, extra=extra,
) )