Database and Repository Layer
SQLite is the central persistence mechanism. Runtime repositories provide CRUD-style access for users, conversations, memories, events, logs, faces, system state, local commands, personality metadata, and database metrics.
# cosmo/data/database/database.py
db = Database()
# Connection parameters:
database_path = "cosmo/data/database/cosmo.db"
row_type = sqlite3.Row
foreign_keys = ON
journal_mode = WAL
synchronous = NORMAL Schema Overview
erDiagram
users ||--o{ memories : has
users ||--o{ conversations : has
users ||--o{ faces : has
events {
integer id PK
text type
text payload
timestamp created_at
}
system_state {
text key PK
text value
}
local_commands {
integer id PK
text intent
text phrase
text language
integer active
timestamp created_at
}
logs {
integer id PK
text level
text logger
text message
text module
text function
integer line
text exception
timestamp created_at
}
faces {
integer id PK
integer user_id FK
text encoding_path
} Repository Types
| Repository | Path | Tables | Key methods |
|---|---|---|---|
| UserRepository | repositories/user_repository.py | users | get_or_create_user(), get_user_by_id(), update_last_seen(), save_face_id(). |
| ConversationRepository | repositories/conversation_repository.py | conversations | add_message(), get_recent_conversation_context(), clear_history(). |
| MemoryRepository | repositories/memory_repository.py | memories | add_memory(), add_memory_if_new(), get_recent_memories(), memory_exists(). |
| EventRepository | repositories/event_repository.py | events | emit_event(), get_recent_events(). |
| SystemRepository | repositories/system_repository.py | system_state | set_state(), get_state(), delete_state(). |
| FaceRepository | repositories/face_repository.py | faces | create_face(), get_faces_by_user(), delete_face(). |
| LocalCommandRepository | repositories/local_command_repository.py | local_commands | get_active_commands(), add_command_phrase(), disable_command_phrase(). |
| PersonalityCommandRepository | repositories/personality_command_repository.py | personality aliases, number words, command words | get_active_parameter_aliases(), get_active_number_words(), get_active_command_words(). |
| MemoryFilterRepository | repositories/memory_filter_repository.py | blocked terms, noise markers, settings | get_blocked_terms(), get_noise_markers(), get_setting(). |
| LogRepository | repositories/log_repository.py | logs | add_log(), get_recent_logs(). |
| DatabaseMetricsRepository | repositories/database_metrics_repository.py | all core tables | get_metrics(). |
Logging System
Cosmo logs to console, file, and SQLite simultaneously through LoggerManager. SQLite log rows are richer than the older logger_name-only shape.
CREATE TABLE logs (
id INTEGER PRIMARY KEY,
level TEXT,
logger TEXT,
message TEXT,
module TEXT,
function TEXT,
line INTEGER,
exception TEXT,
created_at TIMESTAMP
); | Column | Meaning |
|---|---|
id | SQLite row id. |
level | Log severity. |
logger | Logger name; logger_name is accepted as an input alias by LogRepository.add_log(). |
message | Rendered log message. |
module | Source module when available. |
function | Source function when available. |
line | Source line number when available. |
exception | Exception text/trace detail when available. |
created_at | Timestamp, defaulting to SQLite datetime('now'). |
Imported historical logs may infer module and function from message patterns and leave line as null.
Log Search
LogRepository.get_recent_logs() applies filters at SQL level before ORDER BY id DESC LIMIT ?. Search currently spans level, logger, message, module, function, line, exception, and created_at. Dedicated filters exist for level, logger_name, module, and function.
Database Metrics
The WebUI compact snapshot exposes database metrics through DatabaseMetricsRepository.get_metrics().
database_size_bytesanddatabase_size_human.users_count,memories_count,conversations_count,events_count,logs_count, andfaces_count.last_event_typeandlast_log_level.
Face Persistence
FaceRepository is present as a persistence layer for face records and encoding paths. It should be treated as groundwork for enrollment/recognition; the current vision pipeline detects faces but does not enroll users, generate identity embeddings, or match identities.
Async Event Bus Tracing
| Trace | Meaning |
|---|---|
queued [uuid] | Event accepted into queue. |
queue_wait [uuid] [seconds] | Time between creation and dispatch. |
high_queue_latency [uuid] | Queue wait exceeded 5 seconds. |
no_listeners [uuid] | No listeners were registered; event is still counted as completed. |
listener_timeout [uuid] [listener_name] | Listener exceeded 30s timeout. |
event_partial_failure [uuid] | Mixed success/failure. |

