refactor: Transform daemon_boyfriend into Loyal Companion

Rebrand and personalize the bot as 'Bartender' - a companion for those
who love deeply and feel intensely.

Major changes:
- Rename package: daemon_boyfriend -> loyal_companion
- New default personality: Bartender - wise, steady, non-judgmental
- Grief-aware system prompt (no toxic positivity, attachment-informed)
- New relationship levels: New Face -> Close Friend progression
- Bartender-style mood modifiers (steady presence)
- New fact types: attachment_pattern, grief_context, coping_mechanism
- Lower mood decay (0.05) for emotional stability
- Higher fact extraction rate (0.4) - Bartender pays attention

Updated all imports, configs, Docker files, and documentation.
This commit is contained in:
2026-01-14 18:08:35 +01:00
parent 3d939201f0
commit dbd534d860
60 changed files with 310 additions and 381 deletions

View File

@@ -5,7 +5,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from daemon_boyfriend.models import (
from loyal_companion.models import (
BotOpinion,
BotState,
Conversation,
@@ -14,14 +14,14 @@ from daemon_boyfriend.models import (
UserFact,
UserRelationship,
)
from daemon_boyfriend.services.ai_service import AIService
from daemon_boyfriend.services.fact_extraction_service import FactExtractionService
from daemon_boyfriend.services.mood_service import MoodLabel, MoodService, MoodState
from daemon_boyfriend.services.opinion_service import OpinionService, extract_topics_from_message
from daemon_boyfriend.services.persistent_conversation import PersistentConversationManager
from daemon_boyfriend.services.relationship_service import RelationshipLevel, RelationshipService
from daemon_boyfriend.services.self_awareness_service import SelfAwarenessService
from daemon_boyfriend.services.user_service import UserService
from loyal_companion.services.ai_service import AIService
from loyal_companion.services.fact_extraction_service import FactExtractionService
from loyal_companion.services.mood_service import MoodLabel, MoodService, MoodState
from loyal_companion.services.opinion_service import OpinionService, extract_topics_from_message
from loyal_companion.services.persistent_conversation import PersistentConversationManager
from loyal_companion.services.relationship_service import RelationshipLevel, RelationshipService
from loyal_companion.services.self_awareness_service import SelfAwarenessService
from loyal_companion.services.user_service import UserService
class TestUserService:
@@ -577,8 +577,8 @@ class TestAIService:
def test_get_system_prompt_default(self, mock_settings):
"""Test getting default system prompt."""
with patch("daemon_boyfriend.services.ai_service.settings", mock_settings):
with patch("daemon_boyfriend.services.ai_service.AIService._init_provider"):
with patch("loyal_companion.services.ai_service.settings", mock_settings):
with patch("loyal_companion.services.ai_service.AIService._init_provider"):
service = AIService(mock_settings)
service._provider = MagicMock()
@@ -590,8 +590,8 @@ class TestAIService:
def test_get_system_prompt_custom(self, mock_settings):
"""Test getting custom system prompt."""
mock_settings.system_prompt = "Custom prompt"
with patch("daemon_boyfriend.services.ai_service.settings", mock_settings):
with patch("daemon_boyfriend.services.ai_service.AIService._init_provider"):
with patch("loyal_companion.services.ai_service.settings", mock_settings):
with patch("loyal_companion.services.ai_service.AIService._init_provider"):
service = AIService(mock_settings)
service._provider = MagicMock()
@@ -601,8 +601,8 @@ class TestAIService:
def test_provider_name(self, mock_settings):
"""Test getting provider name."""
with patch("daemon_boyfriend.services.ai_service.settings", mock_settings):
with patch("daemon_boyfriend.services.ai_service.AIService._init_provider"):
with patch("loyal_companion.services.ai_service.settings", mock_settings):
with patch("loyal_companion.services.ai_service.AIService._init_provider"):
service = AIService(mock_settings)
mock_provider = MagicMock()
mock_provider.provider_name = "openai"
@@ -612,8 +612,8 @@ class TestAIService:
def test_model_property(self, mock_settings):
"""Test getting model name."""
with patch("daemon_boyfriend.services.ai_service.settings", mock_settings):
with patch("daemon_boyfriend.services.ai_service.AIService._init_provider"):
with patch("loyal_companion.services.ai_service.settings", mock_settings):
with patch("loyal_companion.services.ai_service.AIService._init_provider"):
service = AIService(mock_settings)
service._provider = MagicMock()