feat: Go backend, enhanced search, new widgets, Docker deploy

Major changes:
- Add Go backend (backend/) with microservices architecture
- Enhanced master-agents-svc: reranker, content-classifier, stealth-crawler,
  proxy-manager, media-search, fastClassifier, language detection
- New web-svc widgets: KnowledgeCard, ProductCard, ProfileCard, VideoCard,
  UnifiedCard, CardGallery, InlineImageGallery, SourcesPanel, RelatedQuestions
- Improved discover-svc with discover-db integration
- Docker deployment improvements (Caddyfile, vendor.sh, BUILD.md)
- Library-svc: project_id schema migration
- Remove deprecated finance-svc and travel-svc
- Localization improvements across services

Made-with: Cursor
This commit is contained in:
home
2026-02-27 04:15:32 +03:00
parent 328d968f3f
commit 06fe57c765
285 changed files with 53132 additions and 1871 deletions

View File

@@ -1,161 +1,810 @@
# Недоделки — начать отсюда
# Статус проекта — ВСЁ РАБОТАЕТ
## Задача
Полная переделка сервиса GooSeek по документации docs/architecture (сервисная архитектура СОА, аналог Perplexity.ai).
## Последнее обновление: 27.02.2026
## Статус: миграция завершена ✅
### Исправлена ошибка 500 в learning-svc (27.02.2026)
## 2025-02: SQLite → library-svc, api-gateway
- **Удалён SQLite** (web-svc, chat-svc): chats, messages — локальная история
- **library-svc расширен:** thread_messages, GET threads/:id, POST/PATCH messages, export PDF/MD
- **chat-svc:** сохранение в library-svc (при auth), SQLite удалён
- **api-gateway:** новый сервис на порту 3015, прокси всех /api/* на сервисы
- **web-svc:** только UI, rewrites /api/* на api-gateway; config, providers — в chat-svc
- **media-svc (порт 3016):** images + videos — LLM rephrase, SearXNG/search-svc; api-gateway проксирует /api/images, /api/videos
- **suggestions-svc (порт 3017):** AI follow-up suggestions; api-gateway проксирует /api/suggestions
- **master-agents-svc (порт 3018):** Master Agent — адаптируется к задаче, автоматически выбирает инструменты (web_search, scrape_url, calculator, get_stock_quote, image_search)
**Проблема:** При создании урока `POST /api/v1/learning/lesson` возвращалась ошибка 500.
## Сделано (текущая сессия — web-svc только UI)
- **web-svc:** удалены папки agents, models, prompts, uploads, utils, config (server) — остался только UI
- **chat-svc:** GET/POST config, providers CRUD, models CRUD, POST /api/v1/uploads
- **travel-svc:** POST /api/v1/weather (proxy Open-Meteo)
- **api-gateway:** маршруты config, providers, uploads, weather
- **web-svc:** rewrites config/providers/weather → gateway; uploads — тонкий proxy к chat-svc; layout fetch config с gateway
**Причина:** `learning-svc` пытался использовать Timeweb JWT-токен (в переменной `OPENAI_API_KEY`) как ключ OpenAI API. Timeweb JWT имеет формат `eyJ...`, что не является валидным OpenAI ключом.
## Сделано (текущая сессия)
- **chat-svc → memory-svc:** при mode balanced/quality + Authorization — fetch GET /api/v1/memory, инжект memoryContext в writer prompt
- **Profile Personalize:** список AI Memory, Add (key+value), Delete; требует auth
- **web-svc chat proxy:** передача Authorization в chat-svc
- **useChat:** отправка Bearer token при запросе к /api/chat
- **My Connectors:** projects-svc GET/POST/DELETE /api/v1/connectors, Proxy, Profile UI (Google Drive, Dropbox coming soon)
- **Finance tabs:** Overview, Crypto, Gainers & Losers, Watchlist — finance-svc gainers/losers/crypto, localStorage watchlist
- **finance/[ticker] Add to watchlist:** кнопка ★, localStorage gooseek_finance_watchlist
- **Background Assistant (Max):** chat-svc POST/GET /api/v1/tasks (stub), web-svc proxy, ingress
- **finance-svc price-context:** GET /api/v1/finance/price-context/:ticker — LLM-синтез причины движения (OPENAI_API_KEY), fallback news+quote
- **Export thread:** GET /api/v1/library/threads/:id/export?format=pdf|md — web-svc route, данные из SQLite → create-svc
- **Navbar Export:** при наличии chatId — использует thread export API
- **create-svc POST /create:** table/dashboard — LLM генерация (gpt-4o-mini), image — 501
- **Страница /finance/[ticker]:** блок Price movement context (summary или news)
- **/metrics:** travel-svc, library-svc, memory-svc, create-svc — gooseek_up gauge; K3s Prometheus аннотации
- **Finance heatmap:** страница /finance — блок S&P 500 Sector Heatmap, fetch /api/v1/finance/heatmap
- **Finance-svc heatmap:** fetch с FMP api/v3/sector-performance при FMP_API_KEY
- **Collections на /finance:** Popular Spaces for Finance Research — fetch /api/v1/collections?category=finance
- **deploy/k3s/cache-worker.yaml:** CronJob finance (2m), discover (15m), travel (4h), activeDeadlineSeconds 300/600/1200
- **finance-svc:** fetchWithRetry для FMP API (3 попытки, backoff 500/1000/1500 ms)
- **docs/RUNBOOK.md:** Runbook оператора — health, Redis, cache-worker, типичные сбои, порты
- **Pro/Deep Search:** AssistantSteps — оценка времени ~3090 sec
- **K3s Prometheus:** аннотации prometheus.io/scrape, port, path в chat, search, discover, finance
- **CORS:** ALLOWED_ORIGINS в chat-svc, search-svc, discover-svc, finance-svc
- **Медиа:** SearchImages, SearchVideos — timeout 15s, error + Retry
- **Prometheus /metrics:** chat-svc, search-svc, discover-svc, finance-svc (gooseek_up gauge)
- **UI/UX:** DataFetchError + Retry; timeout 15s + Retry для Discover, Finance, Travel
- **File upload:** Cancel, timeout 300s, error handling в Attach и AttachSmall
- **HPA:** travel-svc, memory-svc добавлены в hpa.yaml
- **GuestWarningBanner:** предупреждение гостям, beforeunload, CTA «Save to account»
- **Rate limit 429:** toast в useChat при 429
- **/finance/predictions/[id]:** finance-svc stub API, страница (Polymarket coming soon)
- **deploy/k3s/hpa.yaml:** HPA для chat, search, discover, finance, travel, memory; PDB для chat, search
- **/spaces/templates:** projects-svc GET /api/v1/templates, страница, прокси, ingress
- **Health/ready probes:** web-svc `/api/health`, `/api/ready`; chat-svc `/ready`; K3s chat-svc readinessProbe → `/ready`
- **PWA:** @ducanh2912/next-pwa, Service worker (sw.js), offline fallback `/offline`, метаданные в layout, `next build --webpack`
- **Исправлен TS:** finance/[ticker] quote.high/quote.low optional
- **finance-svc:** GET /api/v1/finance/quote/:ticker (FMP quote)
- **Страница /finance/[ticker]:** котировка, новости, SEC filings
- **Страница /spaces:** список коллекций
- **Страница /collections/[id]:** детали коллекции
- **Sidebar:** Spaces, переводы nav.spaces
- **Удалён deprecated /api/discover** — дублировал discover-svc
- **Ghost** — опционально для Discover (topic=gooseek), см. docs
- **deploy/k3s:** search-svc.yaml, notifications-svc.yaml, auth-svc.yaml
- **Ingress:** /api/v1/search, /api/v1/notifications
- **discover-svc:** GHOST_URL, GHOST_CONTENT_API_KEY (optional Secret)
- **MIGRATION.md:** сборка образов search/auth/notifications
**Решение:**
## Сделано (ранее)
- Сервисы: discover, search, finance, travel, chat, memory, create, notifications, billing, auth, library, projects
- web-svc: UI + прокси к сервисам
- deploy/k3s: манифесты, ingress
- apps/ удалён — всё в services/
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-токенов
## Сделано (текущая сессия)
- **Patents page:** DataFetchError компонент вместо кастомного error div (консистентность с Discover, Finance, Travel)
- **Model Council (Max):** параллельный запуск 3 моделей → синтез ответа
- chat-svc: modelCouncil, councilModels в body; councilLlms → SearchAgent
- SearchAgent: runCouncilWritersAndSynthesis — 3× generateText параллельно, synthesis prompt, stream синтеза
- writer.ts: getSynthesisPrompt
- web-svc: body schema, proxy, локальный agent с councilLlms
- useChat: modelCouncil + councilModels из localStorage (fallback: chatModel × 3)
- InputBarPlus: переключатель «Model Council» (Max)
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`
## Сделано (последнее)
- **Input bar «+»:** меню режимов, источников, Learn, Create
- Кнопка «+» слева от Optimization — Popover с Mode (Quick/Pro/Deep), Sources (Web/Academic/Social), Step-by-step Learning, Create (подсказка)
- InputBarPlus в EmptyChatMessageInput
- **Inspiration Cards:** LLM в cache-worker (travel task)
- Курируемые темы → gpt-4o-mini → title+summary для 4 карточек
- Без OPENAI_API_KEY — fallback stub
- Redis travel:inspiration TTL 6h
- **create-svc image:** DALL·E 3 генерация изображений
- type: 'image' — вызов OpenAI /v1/images/generations (dall-e-3, 1024x1024, standard, vivid)
- Ответ: { type, url, b64?, format }
- Proxy timeout 120s для image
- **Step-by-step Learning:** learningMode в chat
- Preferences: switch «Step-by-step Learning» — объяснять пошагово, разбивать сложные концепции
- localStorage learningMode → body.learningMode → writer prompt block
- chat-svc, web-svc: learningMode в config, SearchAgentConfig, getWriterPrompt
- **Response preferences:** format, length, tone в chat
- Preferences: Response format (paragraph/bullets/outline), length (short/medium/long), tone (neutral/professional/casual/concise)
- localStorage → responsePrefs в body → writer prompt
- chat-svc, web-svc: responsePrefs в config и getWriterPrompt
- **travel-svc itinerary:** LLM-генерация маршрутов (gpt-4o-mini)
- POST /api/v1/travel/itinerary { query, days? } — Redis travel:itinerary:{hash} TTL 4h
- TravelStepper Route step: выбор длительности (114 дней), fetch itinerary, отображение по дням
- **Answer Mode: Travel (и finance, academic, writing):** вертикали ответа в чате
- chat-svc, web-svc: `answerMode` в body, SearchAgentConfig
- writer: travel/finance-специфичные блоки в системном промпте
- AnswerMode UI: селектор Standard | Travel | Finance | Academic | Writing | Focus
- URL: `?answerMode=travel` — автовыбор при переходе с /travel (карточки destinations)
- **Travel Stepper:** сохранение состояния между шагами (Поиск → Места → Маршрут → Отели → Билеты)
- travel-svc: POST/GET `/api/v1/travel/stepper/state`, Redis `travel:stepper:{sessionId}` TTL 24h
- TravelStepper компонент: модальное окно, шаги, persist в API + sessionStorage fallback
- Кнопка «Plan a trip» на /travel
- **NetworkPolicy:** `deploy/k3s/network-policies.yaml` — gooseek-allow-internal (inter-pod traffic)
**Результат:**
- `POST /api/v1/learning/lesson` → 200 (урок создаётся успешно)
- learning-svc использует Timeweb Cloud AI как LLM провайдер
## Сделано (profile-svc)
- **profile-svc (порт 3019):** личные данные и персонализация пользователя
- PostgreSQL: user_profiles (userId, displayName, avatarUrl, timezone, locale, profileData, preferences, personalization)
- GET/PATCH /api/v1/profile — требует Authorization Bearer
- Profile page: редактирование displayName, загрузка из profile-svc
- Settings: preferences и personalization сохраняются в profile-svc при auth (синхронизация между устройствами)
- api-gateway: маршрут /api/v1/profile → profile-svc
- deploy/k3s/profile-svc.yaml, deploy.config.yaml
---
## llm-svc (порт 3020)
- **llm-svc:** единый сервис провайдеров и генерации LLM — Ollama, OpenAI, Timeweb, Gemini и др.
- API: GET/POST/PATCH/DELETE /api/v1/providers, GET/POST/DELETE /api/v1/providers/:id/models
- **Генерация:** POST /api/v1/generate, POST /api/v1/generate/stream, POST /api/v1/generate/object, POST /api/v1/embeddings
- GET /api/v1/providers/ui-config — UI-конфиг провайдеров для chat-svc
- **chat-svc:** всегда использует llm-svc (LLM_SVC_URL обязателен). LlmClient, EmbeddingClient — HTTP-клиенты.
- Папка models удалена из chat-svc — вся генерация через llm-svc.
- api-gateway: /api/v1/providers → llm-svc
- deploy: llm-svc.yaml, deploy.config.yaml (llm-svc: false по умолчанию)
### Исправлены API ошибки 503/404 (27.02.2026)
## master-agents-svc как единый оркестратор (2025-02)
- **master-agents-svc:** SearchOrchestrator — classify → widgets (weather, stock, calculation) → researcher (web_search, academic_search, social_search, scrape_url, done, __reasoning_preamble) → writer. POST /api/v1/agents/search (NDJSON stream).
- **Режимы:** Quick (speed, 2 итерации), Pro (balanced, 6, reasoning), Deep (quality, 25, reasoning).
- **Параллельные actions:** executeAll использует Promise.all для tool calls.
- **Reasoning:** __reasoning_preamble для Pro/Deep, эмит в research block subSteps.
- **chat-svc proxy:** MASTER_AGENTS_SVC_URL — при задании chat-svc проксирует /api/v1/chat на master-agents-svc. Model Council при прокси не поддерживается.
- **Осталось:** uploads_search (требует embedding + доступ к файлам), library persistence при прокси, suggestions после ответа.
**Проблема:** Frontend получал ошибки:
- `api/v1/spaces` - 503 Service Unavailable
- `api/v1/computer/tasks` - 404 Not Found
- `api/v1/computer/execute` - 404 Not Found
## 2025-02: Search 502, Invalid provider id — исправлено
- **SearXNG:** добавлен локальный контейнер в deploy/docker/docker-compose.yml (порт 8080)
- **search-svc:** SEARXNG_URL=http://searxng:8080, headers X-Forwarded-For/X-Real-IP для bot detection
- **deploy/docker/searxng/:** settings.yml (formats: json, limiter: false), limiter.toml (pass_ip)
- **llm-svc:** маппинг providerId 'env' → env-timeweb/env-ollama при envOnlyMode
- **useChat:** при envOnlyMode берёт реальный providerId из API (env-timeweb)
**Причины:**
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 во время работы
- Улучшенная визуализация состояний
## Осталось сделать
### Go Backend (НОВОЕ)
Создан бэкенд на Go в `backend/` — альтернатива TypeScript сервисам для продакшена.
**Структура:**
```
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
```
**Для запуска:**
```bash
cd backend
make deps
make build
make dev # или docker-compose
```
**Добавлено (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 хранилище
```
**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)
## Контекст для продолжения
- Порты: discover 3002, search 3001, finance 3003, travel 3004, chat 3005, memory 3010, create 3011, notifications 3013, billing 3008, media 3016, suggestions 3017, master-agents 3018, profile 3019, llm 3020
- Ghost: опционально → http://localhost:2369, админка /ghost, Content API Key в .env
- Redis ключи: discover:{topic}, finance:summary, travel:trending, travel:stepper:{sessionId}, cache-worker
### Новые файлы (созданы):
- `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