"""Scheduled recalls attached to a session."""
from typing import Annotated
from fastapi import Depends, HTTPException
from navi.api.deps import get_scheduler, get_session_store, require_user
from navi.auth import User
from navi.auth.deps import check_session_access
from navi.core import SessionStore
from navi.core.scheduler import RecallScheduler
from ._router import router # the shared /sessions router
from .common import _recall_payload
@router.get("/{session_id}/recall")
async def get_session_recall(
session_id: str,
store: Annotated[SessionStore, Depends(get_session_store)],
user: Annotated[User, Depends(require_user)],
scheduler: Annotated[RecallScheduler, Depends(get_scheduler)],
) -> dict:
session = await store.get(session_id)
if session is None:
raise HTTPException(status_code=404, detail="Session not found")
check_session_access(session, user)
return {"recall": _recall_payload(await scheduler.get_pending_recall(session_id))}
@router.delete("/{session_id}/recall")
async def cancel_session_recall(
session_id: str,
store: Annotated[SessionStore, Depends(get_session_store)],
user: Annotated[User, Depends(require_user)],
scheduler: Annotated[RecallScheduler, Depends(get_scheduler)],
) -> dict:
session = await store.get(session_id)
if session is None:
raise HTTPException(status_code=404, detail="Session not found")
check_session_access(session, user)
ok = await scheduler.cancel_recall(session_id)
if ok:
from navi.core.event_bus import get_event_bus
from navi.core.events import RecallUpdate
await get_event_bus().publish(
RecallUpdate(session_id=session_id, status="cancelled", action="cancelled")
)
return {"ok": ok}
@router.post("/{session_id}/recall/skip")
async def skip_session_recall(
session_id: str,
store: Annotated[SessionStore, Depends(get_session_store)],
user: Annotated[User, Depends(require_user)],
scheduler: Annotated[RecallScheduler, Depends(get_scheduler)],
) -> dict:
session = await store.get(session_id)
if session is None:
raise HTTPException(status_code=404, detail="Session not found")
check_session_access(session, user)
ok = await scheduler.skip_next_recall(session_id)
if ok:
from navi.core.event_bus import get_event_bus
from navi.core.events import RecallUpdate
await get_event_bus().publish(
RecallUpdate(session_id=session_id, status="pending", action="rescheduled")
)
return {"ok": ok}