diff --git a/navi/api/routes/auth.py b/navi/api/routes/auth.py index c3d096f..e1b45f8 100644 --- a/navi/api/routes/auth.py +++ b/navi/api/routes/auth.py @@ -23,11 +23,11 @@ router = APIRouter(prefix="/auth", tags=["auth"]) -def _get_redirect_uri(request: Request) -> str: - """Build redirect_uri from the incoming request, respecting reverse proxies.""" - # FastAPI's request.base_url includes scheme+host+port; strip trailing slash - base = str(request.base_url).rstrip("/") - return f"{base}/auth/callback" +def _get_redirect_uri() -> str: + """Return the configured redirect_uri.""" + # Always use the configured redirect_uri so reverse proxies are handled + # correctly (request.base_url would return the internal address). + return settings.gnauth_redirect_uri def _auth_configured() -> bool: @@ -40,7 +40,7 @@ if not _auth_configured(): raise HTTPException(status_code=503, detail="OAuth is not configured. Set GNAUTH_CLIENT_ID and GNAUTH_CLIENT_SECRET in .env") - redirect_uri = _get_redirect_uri(request) + redirect_uri = _get_redirect_uri() client = get_gauth_client(redirect_uri=redirect_uri) auth_request = client.build_authorization_request( @@ -58,7 +58,7 @@ if not _auth_configured(): raise HTTPException(status_code=503, detail="OAuth is not configured. Set GNAUTH_CLIENT_ID and GNAUTH_CLIENT_SECRET in .env") - redirect_uri = _get_redirect_uri(request) + redirect_uri = _get_redirect_uri() client = get_gauth_client(redirect_uri=redirect_uri) encryptor = get_encryptor() diff --git a/navi/api/websocket.py b/navi/api/websocket.py index 82a40cd..ed04f25 100644 --- a/navi/api/websocket.py +++ b/navi/api/websocket.py @@ -25,7 +25,7 @@ from typing import Annotated from navi.api.deps import get_session_store -from navi.auth.deps import get_current_user_ws +from navi.auth.deps import get_current_user, get_current_user_ws from navi.auth import User from navi.auth.deps import check_session_access from navi.core import Agent, SessionStore @@ -174,7 +174,7 @@ async def stop_session( session_id: str, store: Annotated[SessionStore, Depends(get_session_store)], - user: Annotated[User | None, Depends(get_current_user_ws)] = None, + user: Annotated[User | None, Depends(get_current_user)] = None, ) -> dict: """Signal the running agent for this session to stop cooperatively.""" if user is not None: diff --git a/navi/core/agent.py b/navi/core/agent.py index 842880d..2ecca9e 100644 --- a/navi/core/agent.py +++ b/navi/core/agent.py @@ -338,7 +338,12 @@ tool_schemas = [t.schema() for t in tools] llm = self._get_backend(profile.llm_backend) - mem = await self._ctx_builder._memory_msg(user_id=session.user_id) + user_id = None + if parent_session_id and self._sessions: + parent_session = await self._sessions.get(parent_session_id) + if parent_session: + user_id = parent_session.user_id + mem = await self._ctx_builder._memory_msg(user_id=user_id) # Build subagent system prompt — completely separate from the parent's system prompt. # No persona, no orchestrator instructions, no profiles block. diff --git a/pyproject.toml b/pyproject.toml index 197ee2f..559a1e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ "httpx>=0.27", "asyncssh>=2.14", "ddgs>=1.0", + "playwright>=1.40", # Auth "gnexus-gauth",