38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
|
|
"""Provider-neutral agent session source endpoints."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import asyncio
|
||
|
|
from datetime import UTC, datetime
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Depends
|
||
|
|
|
||
|
|
from app.api.deps import require_org_member
|
||
|
|
from app.schemas.agent_sessions import AgentSessionSourceRead, AgentSessionSourcesResponse
|
||
|
|
from app.services import agent_session_sources
|
||
|
|
from app.services.organizations import OrganizationContext
|
||
|
|
|
||
|
|
router = APIRouter(prefix="/agent-sessions", tags=["agent-sessions"])
|
||
|
|
ORG_MEMBER_DEP = Depends(require_org_member)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get(
|
||
|
|
"/sources",
|
||
|
|
response_model=AgentSessionSourcesResponse,
|
||
|
|
summary="List available agent session sources",
|
||
|
|
description=(
|
||
|
|
"Returns source cards for Claude Code, Codex CLI, and OpenAI API session "
|
||
|
|
"history. OpenAI API history is only marked available once Pipeline has an "
|
||
|
|
"owned local event source."
|
||
|
|
),
|
||
|
|
)
|
||
|
|
async def list_sources(
|
||
|
|
ctx: OrganizationContext = ORG_MEMBER_DEP,
|
||
|
|
) -> AgentSessionSourcesResponse:
|
||
|
|
sources = await asyncio.to_thread(agent_session_sources.list_sources)
|
||
|
|
scanned_at = datetime.now(UTC).replace(tzinfo=None)
|
||
|
|
return AgentSessionSourcesResponse(
|
||
|
|
sources=[AgentSessionSourceRead(**source) for source in sources],
|
||
|
|
last_scanned_at=scanned_at,
|
||
|
|
)
|