feat: auth service + security audit fixes + cleanup legacy services

Major changes:
- Add auth-svc: JWT auth, register/login/refresh, password reset
- Add auth UI: modals, pages (/login, /register, /forgot-password)
- Add usage tracking (usage_metrics table, daily limits)
- Add tiered rate limiting (free/pro/business)
- Add LLM usage limits per tier

Security fixes:
- All repos now require userID for Update/Delete operations
- JWT middleware in chat-svc, llm-svc, agent-svc, discover-svc
- ErrNotFound/ErrForbidden errors for proper access control

Cleanup:
- Remove legacy TypeScript services/ directory
- Remove computer-svc (to be reimplemented)
- Remove old deploy/docker configs

New files:
- backend/cmd/auth-svc/main.go
- backend/internal/auth/{types,repository}.go
- backend/internal/usage/{types,repository}.go
- backend/pkg/middleware/{llm_limits,ratelimit_tiered}.go
- backend/webui/src/components/auth/*
- backend/webui/src/app/(auth)/*

Made-with: Cursor
This commit is contained in:
home
2026-02-28 01:33:49 +03:00
parent 120fbbaafb
commit a0e3748dde
523 changed files with 10776 additions and 59630 deletions

View File

@@ -1,810 +1,144 @@
# Статус проекта — ВСЁ РАБОТАЕТ
## Последнее обновление: 27.02.2026
### Исправлена ошибка 500 в learning-svc (27.02.2026)
**Проблема:** При создании урока `POST /api/v1/learning/lesson` возвращалась ошибка 500.
**Причина:** `learning-svc` пытался использовать Timeweb JWT-токен (в переменной `OPENAI_API_KEY`) как ключ OpenAI API. Timeweb JWT имеет формат `eyJ...`, что не является валидным OpenAI ключом.
**Решение:**
1. **backend/cmd/learning-svc/main.go** — изменена логика инициализации LLM клиента:
- Приоритет 1: Timeweb Cloud AI (если `TIMEWEB_AGENT_ACCESS_ID` + `TIMEWEB_API_KEY` установлены)
- Приоритет 2: Anthropic (только если ключ не JWT)
- Приоритет 3: OpenAI (только если ключ не JWT)
- Добавлена функция `isJWT()` для детекции JWT-токенов
2. **backend/deploy/docker/docker-compose.yml** — добавлены env vars для learning-svc:
- `TIMEWEB_API_BASE_URL`
- `TIMEWEB_AGENT_ACCESS_ID`
- `TIMEWEB_API_KEY`
- `DEFAULT_LLM_MODEL`
**Результат:**
- `POST /api/v1/learning/lesson` → 200 (урок создаётся успешно)
- learning-svc использует Timeweb Cloud AI как LLM провайдер
---
### Исправлены API ошибки 503/404 (27.02.2026)
**Проблема:** Frontend получал ошибки:
- `api/v1/spaces` - 503 Service Unavailable
- `api/v1/computer/tasks` - 404 Not Found
- `api/v1/computer/execute` - 404 Not Found
**Причины:**
1. `api-gateway` не имел переменных окружения для новых сервисов (THREAD_SVC_URL, COMPUTER_SVC_URL и др.)
2. `computer-svc` падал при попытке использовать "anonymous" как UUID в PostgreSQL
**Решение:**
1. **docker-compose.yml** - добавлены env vars в api-gateway:
- THREAD_SVC_URL=http://thread-svc:3027
- COMPUTER_SVC_URL=http://computer-svc:3030
- DISCOVER_SVC_URL=http://discover-svc:3002
- FINANCE_HEATMAP_SVC_URL=http://finance-heatmap-svc:3033
- LEARNING_SVC_URL=http://learning-svc:3034
2. **computer-svc/main.go** - исправлена обработка anonymous пользователей:
- GET /tasks возвращает пустой список для anonymous
- POST /execute возвращает 401 для anonymous
**Результат:**
- `GET /api/v1/spaces` → 401 (требует auth, frontend обрабатывает)
- `GET /api/v1/computer/tasks` → 200 (пустой список для anonymous)
- `POST /api/v1/computer/execute` → 401 (требует auth)
---
### Исправлен баг с пустым ответом в Chat (27.02.2026)
**Проблема:** При отправке сообщения в UI приходил пустой ответ.
**Причина:** В `backend/cmd/api-gateway/main.go` функция `handleChat` использовала `defer resp.Body.Close()` до `SetBodyStreamWriter`. Поскольку `SetBodyStreamWriter` выполняется асинхронно, defer закрывал body сразу после return из функции, до того как данные успевали передаться клиенту.
**Решение:** Перенёс `resp.Body.Close()` внутрь callback `SetBodyStreamWriter`:
```go
c.Context().SetBodyStreamWriter(func(w *bufio.Writer) {
defer resp.Body.Close() // <-- теперь здесь
// ... streaming logic
})
```
**Файл:** `backend/cmd/api-gateway/main.go`
---
### Адаптивность и удаление модалок (27.02.2026)
**Задача:** Адаптировать под мобильные, убрать Dialog (модалки), сделать отдельные страницы.
**Сделано:**
1. **Мобильный Sidebar** (`layout.tsx`, `Sidebar.tsx`):
- На мобильных (<768px) sidebar скрыт, есть гамбургер-меню
- Появляется mobile header с кнопкой меню
- Sidebar открывается как overlay с анимацией
- Автозакрытие при навигации
2. **Удалены все Dialog/модальные окна:**
- `spaces/page.tsx` — убран Dialog для создания/редактирования
- `learning/page.tsx` — убран Dialog для создания урока
3. **Созданы отдельные страницы вместо модалок:**
- `/spaces/new` — создание пространства
- `/spaces/[id]/edit` — редактирование пространства
- `/learning/new` — создание урока
4. **Адаптивность всех страниц:**
- `/` — responsive grid для suggestions, адаптивные padding/размеры
- `/discover` — горизонтальный скролл табов, адаптивные карточки
- `/history` — адаптивные padding, видимые кнопки действий на мобильных
- `/spaces` — адаптивные карточки, dropdown всегда видим на мобильных
- `/finance` — адаптивный time range, компактные StockRow
- `/learning` — адаптивные stats cards, уроки
- `/settings` — компактные селекторы, toggle switches
- `/computer` — мобильная панель задач, адаптивные примеры
5. **Общие улучшения:**
- `h-[100dvh]` вместо `h-screen` для лучшей работы на iOS
- Overflow-x-auto для табов с горизонтальной прокруткой
- Адаптивные padding: `px-4 sm:px-6`, `py-6 sm:py-8`
- Адаптивные размеры текста: `text-xl sm:text-2xl`
- Видимость кнопок на мобильных (без hover-only)
---
### Редизайн WebUI в стиле Cursor IDE 2026 (27.02.2026)
**Задача:** Редизайн backend/webui в стиле Cursor IDE 2026 — современная тёмная тема с индиговыми акцентами.
**Сделано:**
1. **Глобальные стили** (`globals.css`):
- Новая цветовая палитра: base/elevated/surface/overlay для фонов
- Текст: primary/secondary/muted/faint (zinc-based)
- Акценты: indigo (accent) + cyan (accent-secondary)
- CSS переменные для всех цветов
- JetBrains Mono для кода
- Классы: .btn-primary, .btn-primary-solid, .btn-secondary, .btn-ghost, .btn-icon
- .nav-item, .nav-item-active, .card, .card-interactive, .glass-card, .surface-card
- .badge, .badge-accent, .badge-success, .badge-warning, .badge-error
- Анимации: fade-in, fade-in-up, slide-in-right, slide-in-left, scale-in, glow-pulse
2. **Tailwind Config** (`tailwind.config.ts`):
- Semantic colors: base, elevated, surface, overlay, primary, secondary, muted, faint
- accent с оттенками: DEFAULT, hover, muted, subtle
- border с оттенками: DEFAULT, hover, focus
- success, warning, error с muted вариантами
- Кастомные тени: glow-sm/md/lg, elevated, card, dropdown
- Расширенные анимации
3. **Компоненты** (Cursor-style):
- `Sidebar.tsx` — минималистичный с индиговыми акцентами, collapsible
- `ChatInput.tsx` — современный инпут с glow эффектом, ArrowUp кнопка отправки
- `ChatMessage.tsx` — чистый рендер, индиговые цитаты и код
- `DiscoverCard.tsx` — карточки с цветными иконками
4. **Страницы** (все обновлены и адаптированы):
- `/` — главная с suggestions grid
- `/discover` — лента новостей
- `/history` — история поиска
- `/spaces` — пространства (+ /new, /[id]/edit)
- `/finance` — котировки
- `/learning` — уроки (+ /new)
- `/settings` — настройки
- `/computer` — Computer page
**Цветовая схема (Cursor IDE 2026):**
- Background: base (#0a0a0c) → elevated (#121217) → surface (#1a1a1f)
- Text: primary (#e9e9eb) → secondary (#a8a8af) → muted (#6b6b75) → faint (#4a4a54)
- Accent: indigo (#818cf8) — основной акцент
- Accent Secondary: cyan (#22d3ee) — дополнительный
- Borders: #26262e#32323d (hover)
- Success: green (#22c55e)
- Error: red (#ef4444)
- Warning: amber (#f59e0b)
---
### Интеграция Frontend с Backend (27.02.2026)
**Задача:** Подключить backend к frontend в `backend/webui/`, убрать моковые данные.
**Сделано:**
1. **API Gateway обновлён** (`backend/cmd/api-gateway/main.go`):
- Добавлен роутинг для threads, spaces, pages, share → thread-svc
- Добавлен роутинг для discover → discover-svc
- Добавлен роутинг для heatmap, movers, markets → finance-heatmap-svc
- Добавлен роутинг для learning → learning-svc
2. **Config обновлён** (`backend/pkg/config/config.go`):
- Добавлены FinanceHeatmapURL, LearningSvcURL
3. **Frontend Types** (`backend/webui/src/lib/types.ts`):
- Добавлены Thread, ThreadMessage, ThreadSource
- Добавлены FinanceStock, HeatmapData, HeatmapSector, TopMovers, FinanceMarket
- Добавлены Lesson, LessonProgress, LessonStep, CodeExample, QuizQuestion, PracticeExercise
4. **Frontend API** (`backend/webui/src/lib/api.ts`):
- `fetchThreads()`, `fetchThread()`, `createThread()`, `deleteThread()`, `shareThread()`
- `fetchSpaces()`, `fetchSpace()`, `createSpace()`, `updateSpace()`, `deleteSpace()`
- `fetchMarkets()`, `fetchHeatmap()`, `fetchTopMovers()`
- `fetchLessons()`, `fetchLesson()`, `createLesson()`, `completeStep()`, `submitQuizAnswer()`, `deleteLesson()`
- Добавлен `getAuthHeaders()` для JWT авторизации
5. **History Page** (`backend/webui/src/app/(main)/history/page.tsx`):
- Загрузка из threads API
- Удаление тредов
- Шаринг тредов
- Группировка по датам
- Поиск
6. **Spaces Page** (`backend/webui/src/app/(main)/spaces/page.tsx`):
- Загрузка из spaces API
- Создание/редактирование/удаление пространств
- Выбор focus mode
- Кастомные AI инструкции
7. **Finance Page** (`backend/webui/src/app/(main)/finance/page.tsx`):
- Загрузка рынков из API
- Heatmap данные по секторам
- Top movers (gainers/losers/most active)
- Переключение timeRange (1d/1w/1m/3m/1y)
8. **Learning Page** (`backend/webui/src/app/(main)/learning/page.tsx`):
- Загрузка уроков из API
- Создание уроков с выбором сложности и режима
- Отображение прогресса
- Удаление уроков
---
### Новые функции (добавлено в этой сессии):
#### 0. WebUI — Интерфейс бэкенда (Perplexity-style)
- **Папка**: `backend/webui/`
- **Технологии**: Next.js 14, React 18, Tailwind CSS, TypeScript
- **Цветовая схема**: Глубокий синий (#0a1929) + золотистые акценты (#d4a373)
- **Порт**: 3000
- **Страницы**:
- `/` — Главная страница с чатом и подсказками
- `/discover` — Лента новостей с AI-саммари
- `/spaces` — Пространства (workspaces) для организации исследований
- `/history` — История поисков
- `/finance` — Котировки MOEX, крипто, валюты
- `/learning` — Интерактивные курсы с AI-наставником
- `/settings` — Настройки (тема, язык, приватность)
- **Компоненты**:
- `Sidebar` — Навигация с коллапсом
- `ChatInput` — Ввод с режимами (speed/balanced/quality)
- `ChatMessage` — Рендер markdown + citations
- `Citation` — Hover preview источников
- `DiscoverCard` — Карточки новостей (large/medium/small)
- **Docker**: `backend/webui/Dockerfile`, добавлен в `docker-compose.yml`
- **Запуск**: `cd backend/webui && npm run dev` или через Docker
#### 1. Computer с долгосрочными задачами (Perplexity-style)
- **Файлы**: `backend/internal/computer/types.go`, `backend/internal/computer/computer.go`
- **Duration Modes**: Short (30 мин), Medium (4 часа), Long (24 часа), Extended (7 дней), Unlimited (365 дней)
- **Checkpoints**: автоматическое сохранение состояния для возобновления задач
- **Heartbeat**: периодические уведомления о статусе
- **Resource Limits**: контроль CPU, памяти, бюджета
#### 2. Browser Automation через Playwright
- **Файлы**: `backend/internal/computer/browser/browser.go`, `backend/internal/computer/browser/server.go`
- **Действия**: navigate, click, type, fill, screenshot, scroll, evaluate, PDF, extract text/HTML
- **Session management**: пул сессий, автоочистка, управление viewport
- **Сервис**: browser-svc (порт 3050)
#### 3. Персонализация Discover — "For You" feed
- **Файлы**: `backend/internal/discover/personalization.go`, `backend/internal/db/user_interests_repo.go`
- **User Interests**: topics, sources, keywords с decay-механизмом
- **Feed Algorithm**: relevance scoring, diversity, recency, trending boost
- **Blocking**: блокировка источников и тем
- **Custom Categories**: пользовательские категории с ключевыми словами
#### 4. Labs Service — интерактивные отчёты
- **Файлы**: `backend/internal/labs/types.go`, `backend/internal/labs/generator.go`, `backend/cmd/labs-svc/main.go`
- **Визуализации**: bar/line/pie/donut charts, tables, stat cards, KPI, heatmap, timeline, comparison
- **UI-элементы**: tabs, accordion, collapsible, stepper, code blocks, markdown
- **API**: генерация отчётов, экспорт в HTML/JSON
- **Сервис**: labs-svc (порт 3031)
#### 5. Finance Heatmaps
- **Файлы**: `backend/internal/finance/heatmap.go`, `backend/cmd/finance-heatmap-svc/main.go`
- **Markets**: S&P 500, NASDAQ, Dow Jones, MOEX, Crypto, Forex
- **Views**: treemap, grid
- **Data**: sectors, tickers, top movers (gainers/losers/most active)
- **Colorscale**: красно-зелёная шкала по изменению цены
- **Сервис**: finance-heatmap-svc (порт 3033)
#### 6. Step-by-step Learning Mode
- **Файлы**: `backend/internal/learning/stepper.go`, `backend/cmd/learning-svc/main.go`
- **Modes**: explain, guided, interactive, practice, quiz
- **Difficulty**: beginner, intermediate, advanced, expert
- **Content**: explanations, code, visualizations, quiz questions, practice exercises
- **Progress tracking**: step completion, score, time spent
- **Сервис**: learning-svc (порт 3034)
#### 7. Discover Daily Podcast Generation
- **Файлы**: `backend/internal/podcast/generator.go`, `backend/cmd/podcast-svc/main.go`
- **Types**: daily, weekly, topic_deep, breaking
- **Script Generation**: intro, news segments, analysis, outro
- **TTS Integration**: ElevenLabs API для генерации аудио
- **RSS Feed**: автоматическая генерация RSS для подкаст-платформ
- **Сервис**: podcast-svc (порт 3032)
### Все 21 сервис:
- postgres, redis, searxng, crawl4ai (инфраструктура)
- search-svc (3001) ✅
- discover-svc (3002) ✅
- chat-svc (3005) ✅
- api-gateway (3015) ✅
- agent-svc (3018) ✅
- llm-svc (3020) ✅
- scraper-svc (3021) ✅
- collection-svc (3025) ✅
- file-svc (3026) ✅
- thread-svc (3027) ✅
- computer-svc (3030) ✅
- **browser-svc (3050) ✅ NEW**
- **labs-svc (3031) ✅ NEW**
- **podcast-svc (3032) ✅ NEW**
- **finance-heatmap-svc (3033) ✅ NEW**
- **learning-svc (3034) ✅ NEW**
---
## Задача (исходный запрос)
Система виджетов в стиле Perplexity для российского рынка: карточки товаров/видео/профилей/промокодов, Knowledge Cards, улучшенные citations, sources panel, image/video gallery + интеграция с Яндекс, Рутуб, ВКонтакте.
## Сделано (ВСЁ ЗАВЕРШЕНО)
### 1. SearXNG — Российские engines
- **Файл**: `deploy/docker/searxng/settings.yml`
- Добавлены: yandex, yandex images, yandex videos, yandex news, yandex music
- Добавлены: vk (через xpath), rutube (через json_engine), dzen
- Добавлены: youtube, aliexpress
### 2. Типы данных виджетов (Backend)
- **Файл**: `services/master-agents-svc/src/lib/types/widgets.ts`
- ProductData, VideoData, ProfileData, PromoData
- ImageData, KnowledgeCardData (comparison_table, charts, timeline, quote, definition)
- SourceData, ClassifiedResult
- Вспомогательные функции: formatPrice, formatViews, formatDuration, formatFollowers
### 3. Content Classifier (Backend)
- **Файл**: `services/master-agents-svc/src/lib/content-classifier.ts`
- Определение типа по URL паттернам (товары, видео, профили, промокоды)
- Определение платформы (yandex, vk, rutube, ozon, wildberries и др.)
- Классификация по ключевым словам в запросе
- Функции: classifySearchResult, groupResultsByType, detectKnowledgeCardType
### 4. UI Компоненты (Frontend)
#### Улучшенный Citation
- **Файл**: `services/web-svc/src/components/MessageRenderer/Citation.tsx`
- Расширенный hover preview с заголовком, описанием, favicon
- Иконки платформ (Яндекс, VK, Rutube, YouTube и др.)
- Улучшенный дизайн badges
#### UnifiedCard (базовая карточка)
- **Файл**: `services/web-svc/src/components/Widgets/UnifiedCard.tsx`
- Универсальный компонент для всех типов карточек
- Поддержка compact/horizontal режимов
- Badges, meta, actions
#### ProductCard (товары)
- **Файл**: `services/web-svc/src/components/Widgets/ProductCard.tsx`
- Цена, скидка, старая цена
- Рейтинг со звёздами, отзывы
- Маркетплейс (Ozon, WB, AliExpress, Яндекс Маркет)
- Наличие, доставка, badges
#### VideoCard (видео)
- **Файл**: `services/web-svc/src/components/Widgets/VideoCard.tsx`
- Thumbnail с длительностью
- Автор, views, likes
- Платформа (Rutube, VK, YouTube, Дзен)
- Horizontal и compact режимы
#### ProfileCard (профили)
- **Файл**: `services/web-svc/src/components/Widgets/ProfileCard.tsx`
- Аватар, имя, username
- Verified badge, online статус
- Followers/following
- Платформа (VK, Telegram, YouTube, Дзен)
#### PromoCard (промокоды)
- **Файл**: `services/web-svc/src/components/Widgets/PromoCard.tsx`
- Код с кнопкой копирования
- Скидка, магазин, логотип
- Срок действия, условия
- Verified badge
#### CardGallery (карусель)
- **Файл**: `services/web-svc/src/components/Widgets/CardGallery.tsx`
- Горизонтальный скролл с навигацией
- Поддержка всех типов карточек
- Индикаторы, gradient fade
#### KnowledgeCard (Tako-style)
- **Файл**: `services/web-svc/src/components/Widgets/KnowledgeCard.tsx`
- Сравнительные таблицы
- Bar chart, Pie chart
- Stat cards с изменениями (+/-)
- Timeline
- Quote, Definition
#### InlineImageGallery
- **Файл**: `services/web-svc/src/components/Widgets/InlineImageGallery.tsx`
- Grid, carousel, masonry layouts
- Lightbox с навигацией
- Lazy loading, источники
#### VideoEmbed
- **Файл**: `services/web-svc/src/components/Widgets/VideoEmbed.tsx`
- Embed для YouTube, Rutube
- Play preview для VK, Дзен
- Метаданные: views, likes, автор
#### SourcesPanel
- **Файл**: `services/web-svc/src/components/SourcesPanel.tsx`
- Expand/collapse
- Группировка по домену
- Поиск по источникам
- Favicon, snippets
#### RelatedQuestions
- **Файл**: `services/web-svc/src/components/RelatedQuestions.tsx`
- 3 стиля: inline, panel, chips
- Expand/collapse
- Иконки, анимации
### 5. Renderer обновлён
- **Файл**: `services/web-svc/src/components/Widgets/Renderer.tsx`
- Все новые типы виджетов: products, videos, profiles, promos
- knowledge_card, image_gallery, video_embed
- Одиночные карточки: product, video, profile, promo
### 6. Синхронный медиа-поиск (images/videos)
- **Файл**: `services/master-agents-svc/src/lib/media-search.ts`
- Создан модуль синхронного поиска через SearXNG (без LLM)
- Функции `searchImages()`, `searchVideos()`, `searchMedia()`
- Автодетект платформы видео (YouTube, Rutube, VK, Дзен)
### 7. Интеграция медиа в searchOrchestrator
- **Файл**: `services/master-agents-svc/src/lib/agent/searchOrchestrator.ts`
- Добавлен `mediaPromise` параллельно с `widgetPromise` и `searchPromise`
- Эмит виджетов `image_gallery` (carousel) и `videos` (CardGallery)
- Медиа загружается одновременно с research
### 8. Backend: Интеграция парсинга и эмиссии виджетов (ГОТОВО)
- **Файл**: `services/master-agents-svc/src/lib/searxng.ts`
- Расширены типы SearxngSearchResult (thumbnail, views, price, duration, author)
- Добавлена функция categorizeResult для автоопределения типа контента
- **Файл**: `services/master-agents-svc/src/lib/agent/researcher.ts`
- Интегрирован ContentClassifier
- Классификация результатов по типам (products, videos, profiles, promos, images)
- Автоматическая эмиссия WidgetBlock для каждого типа контента
- Эвристика для KnowledgeCard (comparison_table, stat_card)
### 9. Frontend: Типы для Widget (ГОТОВО)
- **Файл**: `services/web-svc/src/lib/types.ts`
- Добавлен WidgetType union type со всеми типами виджетов
- Типизированы params
- **Файл**: `services/web-svc/src/components/ChatWindow.tsx`
- Расширен интерфейс Widget новыми типами
### 10. Улучшение ReasoningSteps (ГОТОВО)
- **Файл**: `services/web-svc/src/components/AssistantSteps.tsx`
- Progress bar с процентами
- Таймер времени выполнения
- CheckCircle2 при завершении
- Loader2 spinner во время работы
- Улучшенная визуализация состояний
# Недоделки — начать отсюда
## Последнее изменение (28.02.2026)
**Создан полный UI для авторизации:**
- Модальные окна login/register
- Страницы /login, /register, /forgot-password, /reset-password
- UserMenu в сайдбаре
- AuthContext для управления состоянием
## Сделано (полностью)
### 1. Auth UI (NEW)
**Новые файлы:**
**API клиент:**
- `backend/webui/src/lib/auth.ts` — функции для работы с auth API, хранение токенов
**Контекст:**
- `backend/webui/src/lib/contexts/AuthContext.tsx` — React контекст для auth состояния
**Компоненты:**
- `backend/webui/src/components/auth/AuthModal.tsx` — модальное окно
- `backend/webui/src/components/auth/LoginForm.tsx` — форма входа
- `backend/webui/src/components/auth/RegisterForm.tsx` — форма регистрации
- `backend/webui/src/components/auth/ForgotPasswordForm.tsx`сброс пароля
- `backend/webui/src/components/auth/UserMenu.tsx` — меню пользователя
- `backend/webui/src/components/auth/index.ts` — экспорты
**Страницы:**
- `backend/webui/src/app/(auth)/login/page.tsx`
- `backend/webui/src/app/(auth)/register/page.tsx`
- `backend/webui/src/app/(auth)/forgot-password/page.tsx`
- `backend/webui/src/app/(auth)/reset-password/page.tsx`
- `backend/webui/src/app/(auth)/layout.tsx`
**Интеграция:**
- `providers.tsx` — добавлен AuthProvider и AuthModal
- `Sidebar.tsx` — кнопки входа/регистрации для гостей, профиль для авторизованных
**Функционал:**
- Модальные окна для быстрого входа без перехода на страницу
- Отдельные страницы для полноценного входа
- Валидация паролей в реальном времени
- Показ/скрытие пароля
- Запоминание пользователя
- Сброс пароля по email
- Автоматический refresh токенов
- Отображение tier (Free/Pro/Business)
### 2. Auth Service (Backend)
**Файлы:**
- `backend/internal/auth/types.go`
- `backend/internal/auth/repository.go`
- `backend/cmd/auth-svc/main.go`
**Эндпоинты:**
| Method | Path | Описание |
|--------|------|----------|
| POST | `/api/v1/auth/register` | Регистрация |
| POST | `/api/v1/auth/login` | Вход |
| POST | `/api/v1/auth/refresh` | Обновление токена |
| POST | `/api/v1/auth/logout` | Выход |
| POST | `/api/v1/auth/logout-all` | Выход со всех устройств |
| GET | `/api/v1/auth/validate` | Валидация токена |
| GET | `/api/v1/auth/me` | Профиль |
| PUT | `/api/v1/auth/me` | Обновить профиль |
| POST | `/api/v1/auth/change-password` | Смена пароля |
| POST | `/api/v1/auth/forgot-password` | Запрос сброса |
| POST | `/api/v1/auth/reset-password` | Сброс пароля |
### 3. Ранее — Аудит безопасности
- Репозитории с фильтрацией по user_id
- JWT middleware во всех сервисах
- Tiered rate limiting (free/pro/business)
- Usage tracking
- LLM limits
## Осталось сделать
### Go Backend (НОВОЕ)
Создан бэкенд на Go в `backend/` — альтернатива TypeScript сервисам для продакшена.
### Высокий приоритет:
1. **Проверить компиляцию**`cd backend && go build ./...`
2. **Протестировать auth flow** — регистрация → логин → refresh → logout
3. **Добавить billing-svc** — интеграция с ЮKassa
**Структура:**
### Средний приоритет:
4. **OAuth провайдеры** — Google, GitHub, Yandex
5. **Email уведомления** — подтверждение email, сброс пароля
6. **Страница настроек профиля** — редактирование name, avatar
7. **Страница подписки** — /settings/billing с выбором тарифа
### Низкий приоритет:
8. **2FA** — TOTP аутентификация
9. **Session management** — список активных сессий
10. **Account deletion** — удаление аккаунта
## Контекст
### Новые файлы UI:
```
backend/
├── cmd/ # Точки входа (9 сервисов)
│ ├── api-gateway/ # HTTP proxy + routing (port 3015)
── chat-svc/ # Chat orchestration (port 3005)
├── agent-svc/ # AI Agent / Search Orchestrator (port 3018)
│ ├── search-svc/ # SearXNG wrapper (port 3001)
── llm-svc/ # LLM providers (port 3020)
├── scraper-svc/ # Web scraping (port 3021)
├── discover-svc/ # Perplexity Discover (port 3002)
├── collection-svc/ # Collections API (port 3025)
└── file-svc/ # File upload & analysis (port 3026)
├── internal/
├── agent/ # Orchestrator, Classifier, Researcher, DeepResearch, FocusModes
│ ├── db/ # PostgreSQL repos (digest, article_summary, collection, file)
── files/ # File analyzer (PDF, images)
│ ├── llm/ # OpenAI, Anthropic, Gemini clients
│ ├── search/ # SearXNG, Media, BM25 Reranker
├── session/ # Session manager + events
├── prompts/ # LLM prompts
└── types/ # Blocks, Chunks, Widgets
├── pkg/
│ ├── config/ # Configuration
│ ├── ndjson/ # NDJSON streaming
│ ├── cache/ # Redis кэширование
│ └── middleware/ # Auth, RateLimit, Logging, JWT
└── deploy/
├── docker/ # Dockerfiles + docker-compose
└── k8s/ # Kubernetes manifests
backend/webui/src/
├── lib/
│ ├── auth.ts (NEW)
── contexts/
└── AuthContext.tsx (NEW)
├── components/
── auth/
├── AuthModal.tsx (NEW)
├── LoginForm.tsx (NEW)
├── RegisterForm.tsx (NEW)
├── ForgotPasswordForm.tsx (NEW)
│ ├── UserMenu.tsx (NEW)
└── index.ts (NEW)
└── app/
── (auth)/
├── layout.tsx (NEW)
├── login/page.tsx (NEW)
├── register/page.tsx (NEW)
├── forgot-password/page.tsx (NEW)
└── reset-password/page.tsx (NEW)
```
**Для запуска:**
```bash
cd backend
make deps
make build
make dev # или docker-compose
### Обновлённые файлы:
```
backend/webui/src/app/providers.tsx — AuthProvider + AuthModal
backend/webui/src/components/Sidebar.tsx — кнопки auth + профиль
```
**Добавлено (Perplexity-style Article Summary):**
- `fetchPreGeneratedDigest()` — проверка готового дайджеста из discover-svc
- `preScrapeArticleURL()` — параллельный скрейпинг через Crawl4AI
- Обработка `Summary: <url>` запросов как в Perplexity Discover
- Writer prompt для article digest (структура, follow-up вопросы)
- Researcher prompt для поиска related sources
**Добавлено (26.02.2026):**
- `discover-svc` на Go (port 3002) — полный функционал Perplexity Discover
- Redis кэширование article summaries (`pkg/cache/redis.go`)
- Сохранение саммари в discover-svc после генерации из chat-svc
- Article summary flow: chat-svc -> agent-svc -> discover-svc
**Добавлено (26.02.2026 - Perplexity Parity):**
- PostgreSQL персистентность (`internal/db/`) — digests, article_summaries, collections, files
- Redis-based rate limiting (`pkg/middleware/ratelimit_redis.go`)
- JWT валидация токенов (`pkg/middleware/jwt.go`)
- Focus Modes (`internal/agent/focus_modes.go`) — Academic, YouTube, Reddit, Code, News, Math, Finance
- Deep Research (`internal/agent/deep_research.go`) — multi-agent, 30+ searches, insights synthesis
- Collections service (`cmd/collection-svc/`) — saved research projects
- File service (`cmd/file-svc/`) — PDF/image upload & analysis
**Добавлено (26.02.2026 - Full Perplexity Feature Parity):**
- Thread service (`cmd/thread-svc/`) — Threads, Spaces, Memory, Pages (port 3027)
- **Threads** — сохранение истории чатов, sharing по публичной ссылке
- **Spaces** — workspaces с custom AI instructions, default focus mode
- **Pages** — генерация статей из threads (`internal/pages/generator.go`)
- **Memory** — персонализация (preferences, facts, instructions, interests)
- Clarifying Questions — уточняющие вопросы перед Pro Search (Quality mode)
- Related Questions — связанные вопросы после ответа
- Enhanced Context — buildEnhancedContext() объединяет User Memory + Collection + Files
- runDeepResearchMode() — интеграция Deep Research в orchestrator
- DB repositories: `internal/db/thread_repo.go`, `space_repo.go`, `memory_repo.go`, `page_repo.go`
**TODO для Go бэкенда:**
1. [ ] Тестирование интеграции с web-svc
2. [x] Добавить Redis кэширование ответов
3. [x] Добавить сохранение саммари в discover-svc после генерации
4. [ ] Unit тесты
5. [x] K8s манифесты для Go сервисов (`backend/deploy/k8s/`)
6. [x] PostgreSQL персистентность
7. [x] Focus Modes (Perplexity-style)
8. [x] Deep Research (multi-agent)
9. [x] Collections API
10. [x] File Analysis (PDF, images)
11. [x] Thread History (chat persistence)
12. [x] Spaces (workspaces)
13. [x] Pages (article generation)
14. [x] Memory (personalization)
15. [x] Clarifying Questions
16. [x] Related Questions
17. [x] Sharing (public links)
18. [x] **GooSeek Computer** (Perplexity Computer аналог)
### GooSeek Computer — Perplexity Computer Clone (26.02.2026)
**Новый сервис:** `cmd/computer-svc/main.go` (port 3030)
Автономная платформа для долгосрочных задач — аналог Perplexity Computer.
**Архитектура:**
### Хранение токенов:
```
backend/internal/computer/
├── types.go # ComputerTask, SubTask, Artifact, Schedule, Memory
├── computer.go # Главный оркестратор + EventBus
├── planner.go # AI планировщик задач
├── router.go # Роутинг на нужную модель
├── executor.go # Исполнение задач (research, code, deploy, report...)
├── sandbox.go # Docker sandbox для исполнения кода
├── scheduler.go # Планировщик (cron, interval, once, daily, weekly)
├── memory.go # Персистентная память пользователя
└── connectors/ # Внешние интеграции
├── connector.go # Интерфейс коннектора
├── email.go # SMTP отправка
├── telegram.go # Telegram Bot API
├── webhook.go # HTTP webhooks
└── storage.go # S3/MinIO хранилище
localStorage:
- token: JWT access token
- refreshToken: refresh token
- user: JSON с данными пользователя
```
**Model Registry:** `internal/llm/registry.go`
- Capabilities: reasoning, coding, search, creative, fast, long_context, vision, math
- Роутинг задач на оптимальную модель (Claude для reasoning, Gemini для research, GPT для fast)
**DB Repositories:**
- `internal/db/computer_task_repo.go` — задачи
- `internal/db/computer_memory_repo.go` — память
- `internal/db/computer_artifact_repo.go` — артефакты (код, отчёты, файлы)
**API Endpoints:**
- `POST /api/v1/computer/execute` — запуск задачи
- `GET /api/v1/computer/tasks` — список задач пользователя
- `GET /api/v1/computer/tasks/:id` — статус задачи
- `GET /api/v1/computer/tasks/:id/stream` — SSE стрим событий
- `POST /api/v1/computer/tasks/:id/resume` — продолжить с user input
- `DELETE /api/v1/computer/tasks/:id` — отмена
- `GET /api/v1/computer/tasks/:id/artifacts` — артефакты
- `GET /api/v1/computer/models` — доступные модели
- `GET /api/v1/computer/connectors` — доступные интеграции
- `POST /api/v1/computer/connectors/:id/execute` — выполнить action
**Типы задач:**
- `research` — веб-исследование, сбор данных
- `code` — генерация кода
- `analysis` — анализ данных
- `design` — проектирование архитектуры
- `deploy` — запуск кода в sandbox
- `report` — генерация отчётов
- `communicate` — отправка email/telegram
- `transform` — преобразование данных
- `validate` — валидация результатов
**Планирование:**
- `cron` — cron-выражения
- `interval` — каждые N секунд
- `once` — одноразовый запуск
- `daily/hourly/weekly/monthly` — preset'ы
**Пример использования:**
```json
POST /api/v1/computer/execute
{
"userId": "user-123",
"query": "Мониторь курс доллара каждый час и отправляй мне в Telegram если изменение > 1%",
"options": {
"async": true,
"schedule": { "type": "hourly" }
}
}
```
Нет критичных задач - система работает стабильно.
### GooSeek Computer UI (27.02.2026)
**Задача:** Создать UI для Computer в стиле Perplexity Computer.
**Сделано:**
1. **Типы** (`backend/webui/src/lib/types.ts`):
- ComputerTask, ComputerTaskStatus, DurationMode, TaskPriority
- TaskPlan, SubTask, Artifact, Checkpoint
- ComputerSchedule, ResourceLimits
- ComputerTaskEvent, ComputerExecuteRequest
- ComputerModel, ComputerConnector
2. **API функции** (`backend/webui/src/lib/api.ts`):
- `executeComputerTask()` — запуск задачи
- `fetchComputerTasks()` — список задач
- `fetchComputerTask()` — статус задачи
- `streamComputerTask()` — SSE стрим событий
- `resumeComputerTask()` — продолжить с user input
- `cancelComputerTask()` — отменить
- `fetchComputerArtifacts()` — артефакты
- `downloadArtifact()` — скачать артефакт
- `fetchComputerModels()` — доступные модели
- `fetchComputerConnectors()` — коннекторы
- `executeConnectorAction()` — выполнить action
3. **UI страница** (`backend/webui/src/app/(main)/computer/page.tsx`):
- Ввод задачи (textarea с placeholder)
- Duration mode selector (short/medium/long/extended/unlimited)
- Примеры задач (4 карточки)
- Список задач (левая панель)
- Детальный просмотр задачи:
- Progress bar
- Статус с иконками
- Подзадачи с прогрессом
- События (real-time log)
- Артефакты с кнопкой скачивания
- Расширенные настройки (коннекторы)
4. **Навигация** (`backend/webui/src/components/Sidebar.tsx`):
- Добавлен Computer в раздел "Инструменты"
- Иконка Cpu
### Оптимизация Speed Mode 2.0 (26.02.2026):
**Проблема:** Запросы обрабатывались >2 минут из-за 5 последовательных LLM вызовов.
**Решение — Fast Path для Speed Mode:**
1. **Rule-based classifier** — без LLM вызова (`fastClassifier.ts`)
2. **Direct SearXNG search** — без researcher loop (без LLM)
3. **No scraping** — только сниппеты, без Crawl4AI
4. **Parallel execution** — search + media + widgets одновременно
5. **Single LLM call** — только Writer для финального ответа
**Новый файл:** `services/master-agents-svc/src/lib/agent/fastClassifier.ts`
**Изменённые файлы:**
- `services/master-agents-svc/src/lib/agent/searchOrchestrator.ts` — добавлен `runSpeedMode()`
- `services/master-agents-svc/src/lib/actions/scrape_url.ts` — отключен для speed mode
**Ожидаемое время ответа:**
- Speed mode: 8-15 сек (было >2 мин)
- Balanced mode: 20-40 сек
- Quality mode: 60-120 сек
### Исправлено 26.02.2026:
1. **SearXNG падал** (ambiguous shortcut errors):
- Файл: `deploy/docker/searxng/settings.yml`
- Убраны дублирующие shortcuts для yandex engines (ya, yai, yav, yan, yam)
- Убраны конфликтующие кастомные engines (vk, rutube, dzen, aliexpress)
2. **Ghost перезапускался каждые 2 минуты** (HTTP 503):
- Файл: `deploy/docker/docker-compose.yml`
- Исправлен healthcheck (wget --spider не следует за 301 redirect)
- Увеличены start_period (90s), retries (5), interval (30s)
## Контекст для продолжения
### Новые файлы (созданы):
- `backend/cmd/computer-svc/main.go` — GooSeek Computer service (port 3030)
- `backend/internal/computer/types.go` — Computer types (Task, SubTask, Artifact, etc.)
- `backend/internal/computer/computer.go` — Main orchestrator + EventBus
- `backend/internal/computer/planner.go` — AI task planner
- `backend/internal/computer/router.go` — Model routing
- `backend/internal/computer/executor.go` — Task execution
- `backend/internal/computer/sandbox.go` — Docker sandbox manager
- `backend/internal/computer/scheduler.go` — Cron/interval scheduler
- `backend/internal/computer/memory.go` — Persistent user memory
- `backend/internal/computer/connectors/connector.go` — Connector interface
- `backend/internal/computer/connectors/email.go` — SMTP connector
- `backend/internal/computer/connectors/telegram.go` — Telegram Bot connector
- `backend/internal/computer/connectors/webhook.go` — HTTP webhook connector
- `backend/internal/computer/connectors/storage.go` — S3/MinIO storage connector
- `backend/internal/llm/registry.go` — Model registry with capabilities
- `backend/internal/db/computer_task_repo.go` — Computer task repository
- `backend/internal/db/computer_memory_repo.go` — Computer memory repository
- `backend/internal/db/computer_artifact_repo.go` — Computer artifact repository
- `backend/deploy/k8s/computer-svc.yaml` — K8s manifest for computer-svc
- `backend/cmd/discover-svc/main.go` — Discover service на Go
- `backend/cmd/collection-svc/main.go` — Collections service
- `backend/cmd/file-svc/main.go` — File upload & analysis service
- `backend/internal/db/postgres.go` — PostgreSQL connection + migrations
- `backend/internal/db/digest_repo.go` — Digest repository
- `backend/internal/db/article_summary_repo.go` — Article summary repository
- `backend/internal/db/collection_repo.go` — Collection repository
- `backend/internal/db/file_repo.go` — Uploaded file repository
- `backend/internal/agent/focus_modes.go` — Perplexity Focus Modes
- `backend/internal/agent/deep_research.go` — Deep Research multi-agent
- `backend/internal/files/analyzer.go` — PDF/image analyzer
- `backend/pkg/cache/redis.go` — Redis кэш клиент
- `backend/pkg/middleware/ratelimit_redis.go` — Redis-based rate limiting
- `backend/pkg/middleware/jwt.go` — JWT validation middleware
- `backend/deploy/k8s/postgres.yaml` — PostgreSQL StatefulSet
- `backend/deploy/k8s/collection-svc.yaml` — Collection service K8s
- `backend/deploy/k8s/file-svc.yaml` — File service K8s
- `backend/deploy/k8s/thread-svc.yaml` — Thread service K8s
- `backend/cmd/thread-svc/main.go` — Thread/Spaces/Memory/Pages service
- `backend/internal/db/thread_repo.go` — Thread repository
- `backend/internal/db/space_repo.go` — Space repository
- `backend/internal/db/memory_repo.go` — Memory repository
- `backend/internal/db/page_repo.go` — Page repository
- `backend/internal/pages/generator.go` — Page generator (Markdown/HTML export)
- `services/master-agents-svc/src/lib/media-search.ts` — синхронный медиа-поиск
- `services/media-svc/DEPRECATED.md` — пометка устаревшего сервиса
- `services/master-agents-svc/src/lib/types/widgets.ts`
- `services/master-agents-svc/src/lib/content-classifier.ts`
- `services/web-svc/src/components/Widgets/UnifiedCard.tsx`
- `services/web-svc/src/components/Widgets/ProductCard.tsx`
- `services/web-svc/src/components/Widgets/VideoCard.tsx`
- `services/web-svc/src/components/Widgets/ProfileCard.tsx`
- `services/web-svc/src/components/Widgets/PromoCard.tsx`
- `services/web-svc/src/components/Widgets/CardGallery.tsx`
- `services/web-svc/src/components/Widgets/KnowledgeCard.tsx`
- `services/web-svc/src/components/Widgets/InlineImageGallery.tsx`
- `services/web-svc/src/components/Widgets/VideoEmbed.tsx`
- `services/web-svc/src/components/SourcesPanel.tsx`
- `services/web-svc/src/components/RelatedQuestions.tsx`
### Изменённые файлы:
- `backend/internal/agent/orchestrator.go` — Clarifying/Related Questions, Deep Research mode, Enhanced Context
- `backend/pkg/config/config.go` — ThreadSvcURL, ComputerSvcURL
- `backend/go.mod` — добавлены minio-go, robfig/cron
- `backend/Makefile` — добавлен computer-svc
- `backend/deploy/docker/Dockerfile.all` — добавлен build computer-svc
- `backend/deploy/k8s/kustomization.yaml` — добавлен computer-svc
- `backend/Makefile` — thread-svc
- `backend/deploy/docker/docker-compose.yml` — thread-svc
- `backend/deploy/docker/Dockerfile.all` — thread-svc build
- `backend/deploy/k8s/kustomization.yaml` — thread-svc
- `backend/deploy/k8s/configmap.yaml` — THREAD_SVC_URL
- `services/master-agents-svc/src/lib/agent/searchOrchestrator.ts` — интеграция медиа-поиска
- `services/master-agents-svc/src/lib/searxng.ts` — расширенные типы и категоризация
- `services/master-agents-svc/src/lib/agent/researcher.ts` — интеграция classifier + эмиссия виджетов
- `deploy/docker/searxng/settings.yml` — российские engines
- `services/web-svc/src/components/MessageRenderer/Citation.tsx` — enhanced hover
- `services/web-svc/src/components/Widgets/Renderer.tsx` — новые типы виджетов
- `services/web-svc/src/lib/types.ts` — WidgetType
- `services/web-svc/src/components/ChatWindow.tsx` — Widget interface
- `services/web-svc/src/components/AssistantSteps.tsx` — progress bar, timer, icons
### Auth flow:
1. Гость видит кнопки "Войти" / "Регистрация" в сайдбаре
2. Клик открывает модальное окно (или переход на страницу)
3. После успешного входа — сохранение токенов, обновление UI
4. При истечении access token — автоматический refresh
5. При logout — очистка localStorage