From 9954a2d9609f2059fe7b3abba385c80e2eb54be2 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Wed, 24 Jun 2026 21:52:31 +0200 Subject: [PATCH] references: chat resolver --- .../agents/chat/runtime/references/chats.py | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 surfsense_backend/app/agents/chat/runtime/references/chats.py diff --git a/surfsense_backend/app/agents/chat/runtime/references/chats.py b/surfsense_backend/app/agents/chat/runtime/references/chats.py new file mode 100644 index 000000000..d19e7d4a1 --- /dev/null +++ b/surfsense_backend/app/agents/chat/runtime/references/chats.py @@ -0,0 +1,49 @@ +"""Resolve ``@chat`` mentions into pointer references. + +Chats are not KB-indexed, so a chat reference is a pointer only; its turns are +read on demand via the chat read tool, not injected here. Access checking is +delegated to the authoritative referenced-chat resolver so the rules live in one +place. +""" + +from __future__ import annotations + +from sqlalchemy.ext.asyncio import AsyncSession + +from app.agents.chat.runtime.referenced_chat_context.resolver import ( + resolve_referenced_chats, +) + +from .models import ReferenceKind, ResolvedReference + + +async def resolve_chat_references( + session: AsyncSession, + *, + search_space_id: int, + requesting_user_id: str | None, + current_chat_id: int, + thread_ids: list[int], +) -> list[ResolvedReference]: + """Map ``@chat`` thread ids to access-checked pointers (titles only).""" + if not thread_ids: + return [] + + chats = await resolve_referenced_chats( + session, + search_space_id=search_space_id, + requesting_user_id=requesting_user_id, + current_chat_id=current_chat_id, + mentioned_thread_ids=thread_ids, + ) + return [ + ResolvedReference( + kind=ReferenceKind.CHAT, + entity_id=chat.thread_id, + label=chat.title, + ) + for chat in chats + ] + + +__all__ = ["resolve_chat_references"]