From 5b7f487a5f9652339e5dea7227aa48ae1c13d041 Mon Sep 17 00:00:00 2001 From: jonny Date: Mon, 1 Jun 2026 13:05:11 -0400 Subject: [PATCH] feat(agent): default `ria-agent register --hub` to https://riahub.ai MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most users register against the production hub, so requiring --hub on every invocation was friction. Default the flag to https://riahub.ai via a module-level DEFAULT_HUB_URL constant; explicit --hub still wins, so dev and self-hosted setups (e.g. http://whitehorse:3005) keep working. The legacy `ria-agent run` path keeps its own --hub handling unchanged — it has a config-file fallback and existing operators rely on it. Bumps version to 0.1.8. Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 8 ++++ docs/source/conf.py | 2 +- pyproject.toml | 2 +- src/ria_toolkit_oss/agent/cli.py | 25 ++++++++--- tests/agent/test_cli_register_errors.py | 56 +++++++++++++++++++++++++ 5 files changed, 85 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6c9027..20aa394 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.1.8] - 2026-06-01 + +### Changed + +- **`ria-agent register --hub` now defaults to `https://riahub.ai`** — most users can run `ria-agent register --api-key ria_reg_...` without the `--hub` flag. Dev and self-hosted users keep the existing override (`--hub http://my-hub:3005`). The default lives in `ria_toolkit_oss.agent.cli.DEFAULT_HUB_URL`. + +--- + ## [0.1.7] - 2026-05-26 ### Added diff --git a/docs/source/conf.py b/docs/source/conf.py index 17499c5..9aa4e2a 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -14,7 +14,7 @@ sys.path.insert(0, os.path.abspath(os.path.join('..', '..'))) project = 'ria-toolkit-oss' copyright = '2026, Qoherent Inc' author = 'Qoherent Inc.' -release = '0.1.7' +release = '0.1.8' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/pyproject.toml b/pyproject.toml index 367058c..2134905 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ria-toolkit-oss" -version = "0.1.7" +version = "0.1.8" description = "An open-source version of the RIA Toolkit, including the fundamental tools to get started developing, testing, and deploying radio intelligence applications" license = { text = "AGPL-3.0-only" } readme = "README.md" diff --git a/src/ria_toolkit_oss/agent/cli.py b/src/ria_toolkit_oss/agent/cli.py index 37cb56a..0d73761 100644 --- a/src/ria_toolkit_oss/agent/cli.py +++ b/src/ria_toolkit_oss/agent/cli.py @@ -5,11 +5,13 @@ Subcommands: - ``ria-agent run [legacy args]`` — legacy long-poll NodeAgent (unchanged). - ``ria-agent stream`` — new WebSocket-based IQ streamer. - ``ria-agent detect`` — print SDR drivers whose modules import cleanly. -- ``ria-agent register --hub URL --api-key KEY`` — register with the hub - using a personal registration key (minted from **Settings → RIA Agents** - on the hub, shown once at mint time) and save credentials (and optional - TX interlocks) to ``~/.ria/agent.json``. The hub also accepts the legacy - shared ``[wac] API_KEY`` for back-compat, but that path is deprecated. +- ``ria-agent register --api-key KEY`` — register with the production hub + (``https://riahub.ai`` by default; override with ``--hub URL`` for dev + or self-hosted) using a personal registration key (minted from + **Settings → RIA Agents** on the hub, shown once at mint time) and save + credentials (and optional TX interlocks) to ``~/.ria/agent.json``. The + hub also accepts the legacy shared ``[wac] API_KEY`` for back-compat, + but that path is deprecated. Invoking ``ria-agent`` with no subcommand falls through to the legacy long-poll behavior for back-compatibility with existing deployments. @@ -52,6 +54,10 @@ def _user_agent() -> str: # small DB lookup + insert; anything past this is a stuck hub, not a slow one. _REGISTER_TIMEOUT_S = 15 +# Production hub URL — used as the default for `ria-agent register` so most +# users don't need to pass --hub. Dev / self-hosted users override explicitly. +DEFAULT_HUB_URL = "https://riahub.ai" + REGISTRATION_REASON_MESSAGES = { "invalid_key": ( @@ -226,7 +232,14 @@ def main() -> None: sub.add_parser("detect", help="List available SDR drivers") p_reg = sub.add_parser("register", help="Register agent with RIA Hub and save credentials") - p_reg.add_argument("--hub", required=True, help="RIA Hub URL (e.g. http://whitehorse:3005)") + p_reg.add_argument( + "--hub", + default=DEFAULT_HUB_URL, + help=( + f"RIA Hub URL (default: {DEFAULT_HUB_URL}). " + "Override for dev or self-hosted hubs, e.g. http://whitehorse:3005." + ), + ) p_reg.add_argument( "--api-key", dest="api_key", diff --git a/tests/agent/test_cli_register_errors.py b/tests/agent/test_cli_register_errors.py index 657dfb0..f2fe122 100644 --- a/tests/agent/test_cli_register_errors.py +++ b/tests/agent/test_cli_register_errors.py @@ -140,3 +140,59 @@ def test_register_surfaces_reason_on_http_error(tmp_path, capsys): assert "Settings → RIA Agents" in captured.err # Config must NOT be written on failure. assert not cfg_path.exists() + + +def test_default_hub_url_is_production(): + """Lock in the constant so a future typo doesn't silently redirect users.""" + assert agent_cli.DEFAULT_HUB_URL == "https://riahub.ai" + + +def test_register_defaults_hub_to_production(tmp_path): + """Omitting --hub uses the production hub URL constant.""" + cfg_path = tmp_path / "agent.json" + captured: dict = {} + + def _fake_urlopen(req, *args, **kwargs): + captured["url"] = req.full_url + raise urllib.error.HTTPError( + url=req.full_url, code=403, msg="", hdrs=None, # type: ignore[arg-type] + fp=BytesIO(_structured("invalid_key")), + ) + + with ( + patch.dict("os.environ", {"RIA_AGENT_CONFIG": str(cfg_path)}, clear=False), + patch("urllib.request.urlopen", side_effect=_fake_urlopen), + patch.object(sys, "argv", ["ria-agent", "register", "--api-key", "ria_reg_x"]), + ): + with pytest.raises(SystemExit): + agent_cli.main() + + assert captured["url"] == f"{agent_cli.DEFAULT_HUB_URL}/screens/agents/register" + + +def test_register_hub_override_wins_over_default(tmp_path): + """Explicit --hub still wins; default is only a fallback.""" + cfg_path = tmp_path / "agent.json" + captured: dict = {} + + def _fake_urlopen(req, *args, **kwargs): + captured["url"] = req.full_url + raise urllib.error.HTTPError( + url=req.full_url, code=403, msg="", hdrs=None, # type: ignore[arg-type] + fp=BytesIO(_structured("invalid_key")), + ) + + with ( + patch.dict("os.environ", {"RIA_AGENT_CONFIG": str(cfg_path)}, clear=False), + patch("urllib.request.urlopen", side_effect=_fake_urlopen), + patch.object( + sys, + "argv", + ["ria-agent", "register", "--hub", "http://whitehorse:3005", "--api-key", "ria_reg_x"], + ), + ): + with pytest.raises(SystemExit): + agent_cli.main() + + assert captured["url"] == "http://whitehorse:3005/screens/agents/register" + assert agent_cli.DEFAULT_HUB_URL not in captured["url"]