diff --git a/molecule_agent/client.py b/molecule_agent/client.py index d198215..f4f0713 100644 --- a/molecule_agent/client.py +++ b/molecule_agent/client.py @@ -498,6 +498,7 @@ class RemoteAgentClient: reported = self.reported_url or "remote://no-inbound" resp = self._session.post( f"{self.platform_url}/registry/register", + headers=self._auth_headers(), json={ "id": self.workspace_id, "url": reported, @@ -1061,13 +1062,14 @@ class RemoteAgentClient: """ key = idempotency_key if idempotency_key else make_idempotency_key(task) resp = self._session.post( - f"{self.platform_url}/workspaces/{target_id}/delegate", + f"{self.platform_url}/workspaces/{self.workspace_id}/delegate", headers={ **self._auth_headers(), "X-Workspace-ID": self.workspace_id, "Content-Type": "application/json", }, json={ + "target_id": target_id, "task": task, "idempotency_key": key, }, @@ -1305,4 +1307,3 @@ __all__ = [ "verify_plugin_sha256", "make_idempotency_key", ] - diff --git a/tests/test_remote_agent.py b/tests/test_remote_agent.py index 4abed2a..5f1bb35 100644 --- a/tests/test_remote_agent.py +++ b/tests/test_remote_agent.py @@ -117,6 +117,36 @@ def test_register_saves_token_when_issued(client: RemoteAgentClient): assert kwargs["json"]["agent_card"] == {"name": "test-agent"} +def test_register_sends_saas_routing_headers(tmp_token_dir: Path): + session = MagicMock() + c = RemoteAgentClient( + workspace_id="ws-saas", + platform_url="https://tenant.example.com", + org_id="org-uuid-123", + origin="https://tenant.example.com", + token_dir=tmp_token_dir, + session=session, + ) + session.post.return_value = FakeResponse(200, {"status": "registered"}) + + c.register() + + kwargs = session.post.call_args[1] + assert kwargs["headers"]["X-Molecule-Org-Id"] == "org-uuid-123" + assert kwargs["headers"]["Origin"] == "https://tenant.example.com" + assert "Authorization" not in kwargs["headers"] + + +def test_register_includes_cached_token_when_present(client: RemoteAgentClient): + client.save_token("cached-token") + client._session.post.return_value = FakeResponse(200, {"status": "registered"}) + + client.register() + + kwargs = client._session.post.call_args[1] + assert kwargs["headers"]["Authorization"] == "Bearer cached-token" + + def test_register_keeps_cached_token_when_platform_omits(client: RemoteAgentClient): # Simulate re-register of an already-tokened workspace: platform returns # no auth_token, SDK must keep using the cached one. @@ -773,7 +803,7 @@ from molecule_agent.client import make_idempotency_key, strip_a2a_boundary def test_delegate_posts_task_and_idempotency_key(client: RemoteAgentClient): - """delegate() sends task + auto-generated idempotency_key to /delegate.""" + """delegate() sends source in URL and target_id in the body.""" client.save_token("tok") client._session.post.return_value = FakeResponse(200, {"status": "ok"}) @@ -781,8 +811,9 @@ def test_delegate_posts_task_and_idempotency_key(client: RemoteAgentClient): assert result["status"] == "ok" url = client._session.post.call_args[0][0] - assert url == "http://platform.test/workspaces/peer-ws/delegate" + assert url == "http://platform.test/workspaces/ws-abc-123/delegate" body = client._session.post.call_args[1]["json"] + assert body["target_id"] == "peer-ws" assert body["task"] == "index the docs" assert body["idempotency_key"] is not None assert len(body["idempotency_key"]) == 64 # SHA-256 hex