syntax = "proto3";
package conversation;
// Definición del servicio principal
service ConversationService {
// Stream de mensajes en tiempo real
rpc StreamMessages(Empty) returns (stream MessageEvent);
// Obtener árbol de conversaciones por proyecto y sesión
rpc GetConversationTree(TreeRequest) returns (TreeResponse);
// Búsqueda avanzada de conversaciones
rpc SearchConversations(SearchRequest) returns (SearchResponse);
// Marcar conversaciones como importantes
rpc MarkImportant(MarkRequest) returns (MarkResponse);
// Exportar conversación completa
rpc ExportConversation(ExportRequest) returns (ExportResponse);
// Obtener estadísticas en tiempo real
rpc GetLiveStats(Empty) returns (stream StatsEvent);
// Stream de sesiones activas en tiempo real
rpc StreamActiveSessions(Empty) returns (stream ActiveSessionUpdate);
// Suscripción a actualizaciones de conversaciones específicas
rpc SubscribeToUpdates(SubscribeRequest) returns (stream ConversationUpdate);
// Broadcast de métricas del sistema en tiempo real
rpc BroadcastMetrics(Empty) returns (stream MetricsUpdate);
}
// Mensajes base
message Empty {}
message MessageEvent {
string type = 1; // "new_message", "session_start", "session_end"
Message message = 2;
int64 timestamp = 3;
}
message Message {
string id = 1;
string session_id = 2;
string project_name = 3;
string message_type = 4; // "user", "assistant", "system"
string content = 5;
string hook_event = 6;
int64 timestamp = 7;
MessageMetadata metadata = 8;
}
message MessageMetadata {
string source = 1;
string model = 2;
TokenUsage usage = 3;
double cost_usd = 4;
int32 duration_ms = 5;
}
message TokenUsage {
int32 input_tokens = 1;
int32 output_tokens = 2;
int32 cache_creation_input_tokens = 3;
int32 cache_read_input_tokens = 4;
string service_tier = 5;
}
// Árbol de conversaciones
message TreeRequest {
string project_filter = 1; // Opcional: filtrar por proyecto
int32 limit = 2; // Límite de sesiones por proyecto
int32 hours_back = 3; // Horas hacia atrás (defecto: 24)
}
message TreeResponse {
repeated ProjectNode projects = 1;
int32 total_messages = 2;
int32 total_sessions = 3;
}
message ProjectNode {
string name = 1;
int32 message_count = 2;
repeated SessionNode sessions = 3;
int64 last_activity = 4;
}
message SessionNode {
string session_id = 1;
string short_id = 2; // Primeros 8 caracteres
int32 message_count = 3;
int64 start_time = 4;
int64 last_activity = 5;
bool is_active = 6; // Si tiene actividad en últimos 30min
bool is_marked = 7; // Si está marcado como importante
repeated Message recent_messages = 8; // Últimos 3 mensajes para preview
}
// Búsqueda
message SearchRequest {
string query = 1; // Texto a buscar
string project_filter = 2; // Opcional: proyecto específico
string session_filter = 3; // Opcional: sesión específica
string message_type_filter = 4; // Opcional: "user", "assistant", "system"
int64 start_date = 5; // Timestamp de inicio (opcional)
int64 end_date = 6; // Timestamp de fin (opcional)
bool only_marked = 7; // Solo conversaciones marcadas
int32 limit = 8; // Límite de resultados
int32 offset = 9; // Para paginación
}
message SearchResponse {
repeated SearchResult results = 1;
int32 total_count = 2;
int32 returned_count = 3;
bool has_more = 4;
}
message SearchResult {
Message message = 1;
repeated string highlights = 2; // Fragmentos del texto que coinciden
float relevance_score = 3;
SessionContext context = 4; // Contexto de la sesión
}
message SessionContext {
string session_id = 1;
string project_name = 2;
int32 total_messages = 3;
int64 session_start = 4;
bool is_marked = 5;
}
// Marcar como importante
message MarkRequest {
string session_id = 1;
bool is_marked = 2; // true para marcar, false para desmarcar
string note = 3; // Nota opcional del usuario
repeated string tags = 4; // Etiquetas personalizadas
}
message MarkResponse {
bool success = 1;
string message = 2;
}
// Exportación
message ExportRequest {
string session_id = 1;
string format = 2; // "json", "markdown", "txt"
bool include_metadata = 3;
}
message ExportResponse {
string content = 1;
string filename = 2;
string mime_type = 3;
int32 message_count = 4;
}
// Estadísticas en tiempo real
message StatsEvent {
string type = 1; // "message_count", "token_usage", "cost_update", "project_activity"
LiveStats stats = 2;
int64 timestamp = 3;
}
message LiveStats {
int32 total_messages = 1;
int32 total_sessions = 2;
int32 active_projects = 3;
double total_cost_usd = 4;
int64 total_tokens = 5;
repeated ProjectStats project_stats = 6;
RecentActivity recent_activity = 7;
}
message ProjectStats {
string name = 1;
int32 message_count = 2;
int32 session_count = 3;
int64 last_activity = 4;
}
message RecentActivity {
repeated Message last_messages = 1; // Últimos 10 mensajes
int32 messages_last_hour = 2;
int32 active_sessions = 3;
}
// Nuevos mensajes para streaming de sesiones activas
message ActiveSessionUpdate {
string type = 1; // "session_started", "session_updated", "session_ended"
ActiveSession session = 2;
int64 timestamp = 3;
}
message ActiveSession {
string session_id = 1;
string short_id = 2;
string project_name = 3;
int64 start_time = 4;
int64 last_activity = 5;
int32 message_count = 6;
int32 duration_seconds = 7; // Duración actual en segundos
bool is_marked = 8;
string current_status = 9; // "active", "idle", "ending"
repeated string active_tools = 10; // Herramientas siendo usadas
Message last_message = 11; // Último mensaje para preview
}
// Suscripción a actualizaciones específicas
message SubscribeRequest {
string type = 1; // "conversations", "search", "sessions"
string project_filter = 2; // Filtro opcional por proyecto
repeated string session_ids = 3; // Sesiones específicas a seguir
map<string, string> filters = 4; // Filtros adicionales
}
message ConversationUpdate {
string type = 1; // "new_message", "session_marked", "session_updated"
string session_id = 2;
string project_name = 3;
Message message = 4; // Opcional: mensaje nuevo
SessionMetadata session_metadata = 5; // Metadata actualizada
int64 timestamp = 6;
}
message SessionMetadata {
bool is_marked = 1;
string note = 2;
repeated string tags = 3;
string description = 4;
string category = 5;
}
// Métricas del sistema en tiempo real
message MetricsUpdate {
string type = 1; // "system", "performance", "database", "cache"
SystemMetrics system = 2;
PerformanceMetrics performance = 3;
DatabaseMetrics database = 4;
CacheMetrics cache = 5;
int64 timestamp = 6;
}
message SystemMetrics {
double cpu_usage = 1; // Porcentaje de CPU
double memory_usage = 2; // Porcentaje de memoria
int32 active_connections = 3;
int64 uptime_seconds = 4;
}
message PerformanceMetrics {
double avg_response_time = 1; // Tiempo promedio de respuesta en ms
double requests_per_second = 2;
double error_rate = 3; // Porcentaje de errores
double cache_hit_rate = 4; // Porcentaje de aciertos en caché
}
message DatabaseMetrics {
int64 total_documents = 1;
int64 documents_per_second = 2;
double avg_query_time = 3; // Tiempo promedio de query en ms
int32 active_connections = 4;
}
message CacheMetrics {
int64 total_keys = 1;
double hit_rate = 2; // Porcentaje de aciertos
int64 memory_usage_bytes = 3;
double ops_per_second = 4;
}