refactor(database): update default source values to 'surfsense' for chat threads and messages

This commit is contained in:
Anish Sarkar 2026-05-28 13:11:05 +05:30
parent c958fe5bc6
commit 3faaa25af6
4 changed files with 11 additions and 8 deletions

View file

@ -424,7 +424,7 @@ def upgrade() -> None:
if not _column_exists(conn, "new_chat_threads", "source"):
op.add_column(
"new_chat_threads",
sa.Column("source", sa.Text(), nullable=False, server_default="web"),
sa.Column("source", sa.Text(), nullable=False, server_default="surfsense"),
)
op.alter_column("new_chat_threads", "source", type_=sa.Text())
if not _column_exists(conn, "new_chat_threads", "external_chat_binding_id"):
@ -454,7 +454,7 @@ def upgrade() -> None:
if not _column_exists(conn, "new_chat_messages", "source"):
op.add_column(
"new_chat_messages",
sa.Column("source", sa.Text(), nullable=False, server_default="web"),
sa.Column("source", sa.Text(), nullable=False, server_default="surfsense"),
)
op.alter_column("new_chat_messages", "source", type_=sa.Text())
if not _column_exists(conn, "new_chat_messages", "platform_metadata"):

View file

@ -696,9 +696,9 @@ class NewChatThread(BaseModel, TimestampMixin):
# agent_llm_id changes). Unindexed: all reads are by primary key.
pinned_llm_config_id = Column(Integer, nullable=True)
# Surface metadata for web and external chat threads. Zero publishes all
# chat-message sources; the UI can decide which surfaces to render.
source = Column(Text, nullable=False, default="web", server_default="web")
# Surface metadata for first-party SurfSense and external chat threads.
# Zero publishes all chat-message sources; the UI can decide which surfaces to render.
source = Column(Text, nullable=False, default="surfsense", server_default="surfsense")
external_chat_binding_id = Column(
BigInteger,
ForeignKey("external_chat_bindings.id", ondelete="SET NULL"),
@ -786,7 +786,7 @@ class NewChatMessage(BaseModel, TimestampMixin):
# Mirrors the parent thread source for publication-level filtering.
# This denormalization avoids join-dependent logical replication rules.
source = Column(Text, nullable=False, default="web", server_default="web")
source = Column(Text, nullable=False, default="surfsense", server_default="surfsense")
platform_metadata = Column(JSONB, nullable=True)
# Relationships

View file

@ -88,7 +88,10 @@ async def call_agent_for_gateway(
await stream.aclose()
await session.execute(
update(NewChatMessage)
.where(NewChatMessage.thread_id == thread.id, NewChatMessage.source == "web")
.where(
NewChatMessage.thread_id == thread.id,
NewChatMessage.source == "surfsense",
)
.values(source="telegram")
)
await session.commit()

View file

@ -41,7 +41,7 @@ The backend is the core of SurfSense. Follow these steps to set it up:
### Optional: Telegram External Chat Surface
SurfSense can expose the same canonical chat agent through Telegram. The `external_chat_*` tables store adapter identity, delivery configuration, and durable inbox rows. The actual chat thread and messages remain in `new_chat_threads` and `new_chat_messages`, and all chat-message sources are eligible for Zero replication so a future SurfSense UI layer can render external chat surfaces. The web app initially shows pairing, health, revoke, and resume controls under **User Settings > Messaging Channels**.
SurfSense can expose the same canonical chat agent through Telegram. The `external_chat_*` tables store adapter identity, delivery configuration, and durable inbox rows. The actual chat thread and messages remain in `new_chat_threads` and `new_chat_messages`, with first-party web/desktop chats marked as `source="surfsense"` and external surfaces marked by platform, such as `source="telegram"`. All chat-message sources are eligible for Zero replication so a future SurfSense UI layer can render external chat surfaces. The web app initially shows pairing, health, revoke, and resume controls under **User Settings > Messaging Channels**.
Add these variables to `surfsense_backend/.env` when enabling the Telegram surface: