Skip to content
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
588e41e
feat(convDatabase): add sqlalchemy and alembic
clementb49 Feb 15, 2026
2b59aa7
feat(convDatabase): implement a first version of the conversation dat…
clementb49 Feb 15, 2026
6387ac4
chore: ignore claude code settings
clementb49 Feb 15, 2026
12c19c1
refactor(convDatabase): optimize subsequent save query
clementb49 Feb 15, 2026
d8c4e82
feat(convDatabase): add settings and private mode
clementb49 Feb 15, 2026
6dbdc7e
refactor(convDatabase): manage database singleton inside wx app singl…
clementb49 Feb 15, 2026
2837b76
refactor(convDatabase): optimize database manager code
clementb49 Feb 15, 2026
7416c7c
fix(convDatabase): code review comment
clementb49 Feb 15, 2026
c9a5144
fix(convDatabase): use correct method name
clementb49 Feb 16, 2026
4fbfd0e
fix(convDatabase): disable btn when no conversation history is selected
clementb49 Feb 16, 2026
908f26e
Merge remote-tracking branch 'origin/master' into convDatabase
clementb49 Feb 17, 2026
7474845
fix(build_exe): add missing package for sqlalchemy and alembic
clementb49 Feb 17, 2026
ebe5538
feat: move alembic version in resource dir to simplify fhrozen version
clementb49 Feb 21, 2026
f17512c
fix(frozenAPP): move alembic dir in resource
clementb49 Feb 21, 2026
35eb5d5
style: fix docstring
clementb49 Feb 21, 2026
87d0795
fix: address review findings across database, GUI, and test layers
clementb49 Feb 21, 2026
6b0d02f
Merge remote-tracking branch 'origin/master' into convDatabase
clementb49 Feb 21, 2026
9a1f3f9
feat(database): add cleanup_orphan_attachments to reclaim orphaned blobs
clementb49 Feb 21, 2026
ca85b9b
test(conversation): reduce setup duplication across database and conv…
clementb49 Feb 21, 2026
e1be4a3
fix: save draft prompt after model and account selection
clementb49 Feb 21, 2026
cdc3d6b
chore: remove claude file
clementb49 Feb 21, 2026
92d4ace
Merge remote-tracking branch 'origin/master' into convDatabase
clementb49 Feb 22, 2026
e66f1bc
fix: flush the draft before closing tab
clementb49 Feb 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions basilisk/config/main_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ class ConversationSettings(BaseModel):
shift_enter_mode: bool = Field(default=False)
use_accessible_output: bool = Field(default=True)
focus_history_after_send: bool = Field(default=False)
auto_save_to_db: bool = Field(default=True)
auto_save_draft: bool = Field(default=True)
reopen_last_conversation: bool = Field(default=False)
last_active_conversation_id: int | None = Field(default=None)


class ImagesSettings(BaseModel):
Expand Down
1 change: 1 addition & 0 deletions basilisk/conversation/attached_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ class AttachmentFile(BaseModel):
description: str | None = None
size: int | None = None
mime_type: str | None = None
db_id: int | None = Field(default=None, exclude=True)

@field_serializer("location", mode="wrap")
@classmethod
Expand Down
15 changes: 15 additions & 0 deletions basilisk/conversation/conversation_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ class SystemMessage(BaseMessage):
"""Represents a system message in a conversation. The system message is used to provide instructions or context to the assistant."""

role: MessageRoleEnum = Field(default=MessageRoleEnum.SYSTEM)
db_id: int | None = Field(default=None, exclude=True)

@field_validator("role", mode="after")
@classmethod
Expand Down Expand Up @@ -117,6 +118,19 @@ def __hash__(self):
"""
return hash((self.role, self.content))

def __eq__(self, other: object) -> bool:
"""Compare system messages by role and content, ignoring db_id.

Args:
other: The object to compare against.

Returns:
True if role and content match, False otherwise.
"""
if not isinstance(other, SystemMessage):
return NotImplemented
return self.role == other.role and self.content == other.content


class MessageBlock(BaseModel):
"""Represents a block of messages in a conversation. The block may contain a user message, an AI model request, and an AI model response."""
Expand All @@ -131,6 +145,7 @@ class MessageBlock(BaseModel):
stream: bool = Field(default=False)
created_at: datetime = Field(default_factory=datetime.now)
updated_at: datetime = Field(default_factory=datetime.now)
db_id: int | None = Field(default=None, exclude=True)

@field_validator("response", mode="after")
@classmethod
Expand Down
5 changes: 5 additions & 0 deletions basilisk/conversation/database/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
"""Database package for conversation persistence."""

from .manager import ConversationDatabase

__all__ = ["ConversationDatabase"]
Loading