--- index_bot.php
+++ index_bot.php
@@ -33,2 +33,4 @@
 }
+// Функции истории используют существующее соединение PostgreSQL из users.php.
+include_once __DIR__ . '/ai_history.php';
 error_reporting(E_ALL);
@@ -467,3 +469,22 @@
         $text = trim((string)$bot->message()->text);
-    
+
+        // Сохраняем входящий текст даже когда AI отключён или клиент в HUMAN.
+        // Существующий индекс таблицы предотвращает дубли при повторах webhook.
+        $historySaved = ai_history_save(
+            (int)$telegramUserId,
+            'user',
+            $text,
+            'telegram_in',
+            (string)$messageId,
+            isset($bot->message()->date) ? (int)$bot->message()->date : null
+        );
+        if (!$historySaved) {
+            logAiRouter([
+                'event' => 'ai_history_save_failed',
+                'telegram_user_id' => $telegramUserId,
+                'telegram_message_id' => $messageId,
+                'role' => 'user',
+            ]);
+        }
+
         // 1. Сначала зеркалим сообщение клиента в amoCRM
@@ -880,3 +901,18 @@
 
-            $aiResult = ask_cooleso_ai($text);
+            // Последние реплики текущей сессии без текущего вопроса.
+            // ai_history_recent учитывает возраст и временные разрывы.
+            $conversationHistory = ai_history_recent(
+                (int)$telegramUserId,
+                'telegram_in',
+                (string)$messageId
+            );
+
+            logAiRouter([
+                'event' => 'ai_history_loaded',
+                'telegram_user_id' => $telegramUserId,
+                'telegram_message_id' => $messageId,
+                'history_count' => count($conversationHistory),
+            ]);
+
+            $aiResult = ask_cooleso_ai($text, $conversationHistory);
 
@@ -911,2 +947,18 @@
 
+        // Пишем только ответ, отправка которого подтверждена Telegram API.
+        if (!ai_history_save(
+            (int)$telegramUserId,
+            'assistant',
+            $aiAnswer,
+            'ai_reply',
+            (string)$messageId
+        )) {
+            logAiRouter([
+                'event' => 'ai_history_save_failed',
+                'telegram_user_id' => $telegramUserId,
+                'telegram_message_id' => $messageId,
+                'role' => 'assistant',
+            ]);
+        }
+
         logAiRouter([
@@ -1045,2 +1097,10 @@
         text: $handoffText
+    );
+
+    ai_history_save(
+        (int)$telegramUserId,
+        'assistant',
+        $handoffText,
+        'ai_handoff',
+        (string)$messageId
     );
@@ -1132,2 +1192,10 @@
                 text: $handoffText
+            );
+
+            ai_history_save(
+                (int)$telegramUserId,
+                'assistant',
+                $handoffText,
+                'ai_error_reply',
+                (string)$messageId
             );
