pdo = $pdo ?? DatabaseFactory::content(); } public function findBySessionId(int $sessionId): array { $stmt = $this->pdo->prepare( 'SELECT * FROM chat_messages WHERE session_id = ? ORDER BY created_at ASC' ); $stmt->execute([$sessionId]); return $stmt->fetchAll(\PDO::FETCH_ASSOC); } public function save( int $sessionId, string $role, string $content, string $model, ?int $tokensInput = null, ?int $tokensOutput = null, ?array $sources = null, ?float $startMicrotime = null, ?float $endMicrotime = null, ?int $authorProfileId = null, ?int $systemPromptId = null, ?string $collectionsJson = null, ?int $contextLimit = null ): int { $stmt = $this->pdo->prepare( 'INSERT INTO chat_messages (session_id, role, content, model, tokens_input, tokens_output, sources, start_microtime, end_microtime, author_profile_id, system_prompt_id, collections, context_limit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' ); $stmt->execute([ $sessionId, $role, $content, $model, $tokensInput, $tokensOutput, $sources !== null ? json_encode($sources) : null, $startMicrotime, $endMicrotime, $authorProfileId, $systemPromptId, $collectionsJson, $contextLimit, ]); // Update session timestamp $this->pdo->prepare('UPDATE chat_sessions SET updated_at = NOW() WHERE id = ?') ->execute([$sessionId]); return (int) $this->pdo->lastInsertId(); } public function delete(int $id): void { $stmt = $this->pdo->prepare('DELETE FROM chat_messages WHERE id = ?'); $stmt->execute([$id]); } public function deleteBySessionId(int $sessionId): void { $stmt = $this->pdo->prepare('DELETE FROM chat_messages WHERE session_id = ?'); $stmt->execute([$sessionId]); } public function getSessionStats(int $sessionId): array { $stmt = $this->pdo->prepare( 'SELECT COUNT(*) as message_count, COALESCE(SUM(tokens_input), 0) as total_input_tokens, COALESCE(SUM(tokens_output), 0) as total_output_tokens, COALESCE(SUM(end_microtime - start_microtime), 0) as total_duration FROM chat_messages WHERE session_id = ?' ); $stmt->execute([$sessionId]); return $stmt->fetch(\PDO::FETCH_ASSOC); } }