55 Commits

Author SHA1 Message Date
Aleksei Pavlov cdd507f1c5 feat(postcast-tool): AutogenTab — категории, темы, ротация
Новая вкладка «Автогенерация» в ChannelView:

Настройки:
  - Включить/выключить автогенерацию
  - posts_per_day: 1-20 (каждый пользователь настраивает сам)
  - Час и минута запуска генерации

Планируется сегодня:
  - Черновики сегодняшней генерации с кнопкой «Открыть»
  - Пустое состояние с временем следующей генерации

Категории контента:
  - Список с бейджами «сегодня» / «не сегодня» (ротация)
  - Форма создания: иконка, название, slug, описание, цвет
  - Каждая категория раскрывается с панелью тем:
    · Список тем с жанровыми бейджами [ТУТОРИАЛ][СРАВНЕНИЕ][МНЕНИЕ][ДАЙДЖЕСТ][КЕЙС]
    · Toggle is_used (✓ / ○)
    · Добавить тему вручную (Enter или кнопка)
    · AI-генерация N тем (5/10/15/20/30/50)
    · Удалить тему

Ротация на 7 дней:
  - Preview скользящего окна — видно что выйдет в каждый день
  - Подпись «X из Y категорий» с объяснением алгоритма

API proxy:
  /api/engine/channels/:channelId/[[...path]] — catch-all к engine :3035
2026-06-24 20:05:41 +03:00
Nik (Claude) 69367da665 feat: spending — 2 separate provider blocks side by side 2026-06-16 14:11:25 +03:00
Nik (Claude) 3815ac767c feat: spending — beautiful provider cards with progress bar 2026-06-16 14:08:36 +03:00
Nik (Claude) ef843768af feat: spending section — all providers breakdown, default period=all 2026-06-16 13:53:18 +03:00
Nik (Claude) 58e6092b7c fix: SETTING_LABELS in AdminPanel.js (correct file) 2026-06-16 13:28:32 +03:00
Nik (Claude) d51f696976 fix: SETTING_LABELS correct placement in SystemSettings 2026-06-16 13:22:37 +03:00
Nik (Claude) 9a72f604c3 fix: human-readable section names in system settings 2026-06-16 13:12:40 +03:00
Nik (Claude) a789cb17db feat: human-readable labels for system settings 2026-06-16 12:53:13 +03:00
Nik (Claude) abf6a0b121 rebrand: PostCast identity + indigo color scheme 2026-06-15 23:25:48 +03:00
Alexey Pavlov 68fb51fc0a fix: system settings — show description as title, key as small monospace hint 2026-06-15 10:39:03 +03:00
Alexey Pavlov 33c11049f1 merge: resolve ChannelView icon conflict, keep History + Search/Camera/ExternalLink/Link2 2026-06-15 10:28:42 +03:00
Alexey Pavlov 5be51d88f7 feat: channel history page — published posts with search 2026-06-15 10:28:07 +03:00
Ник (Claude) 836e20e57e fix: React error #301 — load() in render body → useEffect
Причина: load() вызывался прямо в теле компонента (не в useEffect),
что триггерило setState → re-render → load() → бесконечный цикл.

Исправлено в AdminPanel.js:
  SpendingSection: if (!data && !loading) load(period) → useEffect
  DashboardSection: if (!data...) { load() } × 2 → useEffect
  SettingsSection: if (!loaded && !loading) → useEffect
  PlansSection: if (loading && !plans.length) → useEffect

Добавлен useEffect в import.
2026-06-13 23:31:51 +03:00
Ник (Claude) a3c1fa0c65 feat: registration + public landing page
/register: полноценная страница регистрации с валидацией
  email, пароль (6+ символов), подтверждение, имя (optional)
  После регистрации → /onboarding (создать первый канал)
  50 кредитов при регистрации
/landing: публичный лендинг для незалогиненных
  Hero, Features (6), How it works (3 шага), Pricing (4 тарифа), CTA, Footer
page.js: незалогиненный → redirect /landing (не /login)
Header: Settings2 в импорт, PublicHeader экспорт для лендинга
2026-06-13 15:05:46 +03:00
Ник (Claude) 789cfe10db feat: admin panel — SMTP, topic bank, maintenance mode UI
AdminTopicBank.js: банк тем блога по категориям
  Аккордеон: неиспользованные + использованные темы
  Прогресс-бар использования, кнопка +10 AI (фоновая генерация)
  Мультистрочное добавление (одна строка = одна тема)
AdminPanel: + Email/SMTP + Банк тем блога + Mail иконка
SmtpTestButton: тест отправки прямо в разделе SMTP
API routes: /api/admin/blog-topics, /[id], /generate, /api/admin/email/test
2026-06-13 11:46:10 +03:00
Ник (Claude) 2e9f099b95 feat: AdminContent — content defaults UI
AdminContent.js: настройки дефолтов по 4 группам
  Контент: язык, стиль, цель, длина (select)
  Форматирование: изображения, эмодзи, хештеги (toggle)
  Авто-черновики: кол-во в день, время генерации
  AI-инструкции: базовый промт (textarea)
Инлайн сохранение — кнопка Сохранить появляется только при изменении
Подсказка: изменения применяются только к новым каналам
AdminPanel: раздел Контент-дефолты с Sliders иконкой
2026-06-13 11:22:56 +03:00
Ник (Claude) 06340ab24e feat: AdminAutogen — blog autogeneration UI
AdminAutogen.js для каждой категории (ai-tools, ai-dev, automation, cybersec):
  - Toggle вкл/выкл + статус (статей за 7д, тем в банке, время след.запуска)
  - Настройки: статей/день, час, минута + кнопка Сохранить
  - Кнопка Запустить прямо сейчас (фоновая генерация)
  - Последний/следующий запуск с датами
Очередь тем: добавить тему с категорией и приоритетом, удалить
AdminPanel: раздел Автогенерация с BookOpen иконкой
API routes: /api/admin/autogen, /[category], /[category]/run, /queue/[id]
2026-06-13 10:36:38 +03:00
Ник (Claude) a07cc224a9 feat: AdminLogs — error log viewer
AdminLogs.js:
  Топ-5 частых ошибок с прогресс-баром
  Фильтр по источнику (все/генерация/AI/публикация)
  Список с раскрываемыми карточками:
    - Левая граница цветом по типу (timeout/auth/model/other)
    - Краткое и полное описание ошибки
    - Контекстные подсказки (ссылка на настройки, объяснение причины)
  Классификация: Таймаут/Rate limit/Модель/Пустой ответ/Сеть/Авторизация
AdminPanel: раздел Логи ошибок с AlertTriangle иконкой
API route: /api/admin/logs
2026-06-13 10:24:12 +03:00
Ник (Claude) 92872ed59c feat: AdminQueue — generation queue UI
AdminQueue.js: статистика по статусам + список 30 последних задач
  4 счётчика (done/processing/pending/failed) с цветами
  Алерт для застрявших задач + кнопка Сбросить
  Фильтр по статусу, retry для failed задач
  Детали: тип, тема, ошибка, токены, время
AdminPanel: раздел Очередь между Движком и Тарифами
API routes: /api/admin/queue (GET+DELETE), /api/admin/queue/[id]/retry
2026-06-13 10:14:10 +03:00
Ник (Claude) b620927c25 feat: promo codes UI + apply on /billing
AdminPromos.js: создание/список/toggle/удаление промокодов
  auto-generated code, type (credits/%), max_uses, expires, description
AdminPanel: раздел Промокоды между Тарифами и Пользователями
/billing page: кнопка '🎁 Есть промокод?' → форма ввода → apply-promo API
API routes: /api/admin/promos, /api/admin/promos/[id], /api/billing/apply-promo
2026-06-13 09:37:19 +03:00
Ник (Claude) e5f6662aed feat: AdminUsers — full user management UI
AdminUsers.js: список пользователей с поиском
  Детальная страница пользователя:
    - Профиль (email, дата рег, статус)
    - Баланс кредитов и тариф
    - Список каналов с платформами
    - История транзакций (20 последних)
    - Кнопки: начислить кредиты, сменить тариф, заблокировать/разблокировать
AdminPanel: billing раздел → AdminUsers (был AdminBilling)
API routes: /api/admin/users/[id] (GET+PATCH), /api/admin/credit (POST)
2026-06-13 00:14:59 +03:00
Ник (Claude) 92b743512c feat: admin dashboard UI — DashboardSection as default panel
AdminPanel: Сводка раздел первый (initialSection='dashboard')
DashboardSection: users stats, channels by platform, posts stats,
  revenue vs AI costs cards, drafts pending alert, registrations bar chart 14d
SECTIONS: +Dashboard, +Engine (Движок)
API route: /api/admin/dashboard proxy
2026-06-13 00:10:40 +03:00
Ник (Claude) a5f6c080bd feat: admin panel improvements
Header: убрана кнопка Система (дубль Админ), убраны устаревшие импорты
AdminPanel: 6 разделов (AI-провайдеры, Движок, ЮKassa, Расходы AI, Тарифы, Пользователи)
  Тарифы: редактор планов (цена/кредиты/каналы) + стоимость операций
  Движок: ENGINE_PUBLIC_URL, APP_PUBLIC_URL, TELEGRAM_API_BASE, AUTO_DRAFT_*
PlansSection: inline-редактирование тарифов и credit_costs
API routes: /api/admin/plans/[id], /api/admin/credit-costs/[operation]
2026-06-13 00:02:52 +03:00
Ник (Claude) 1fbdc9f9b9 feat: unified admin panel + back buttons everywhere
AdminPanel.js: sidebar nav с 4 разделами (Настройки API, ЮKassa, Расходы AI, Пользователи)
  Встроены: SettingsSection (API-ключи), SpendingSection (расходы), AdminBilling
  Breadcrumb навигация
/system/page.js: теперь рендерит AdminPanel
Header: 'Расходы' → 'Админ' (ссылка на /system), убран TrendingUp
BackButton.js: переиспользуемая кнопка назад
  Добавлена на /drafts, /billing, /plans
2026-06-12 23:57:38 +03:00
Ник (Claude) 5bf01ec394 feat: drafts UI — /drafts review page + batch generate button
/drafts page: список черновиков по статусам (pending/approved/rejected)
  Одобрить + выбрать время → scheduled_post в календарь
  Редактировать текст inline, отклонить, удалить
Header: ссылка 'Черновики' (FileText иконка)
ChannelView: кнопка 'Авто ×N' для batch-генерации (async)
ChannelEdit AI-стиль: секция авто-черновиков (toggle + count + time)
API routes: /api/drafts, /api/drafts/[id]/{approve,reject}
  /api/channels/[channelId]/drafts/generate
2026-06-12 23:48:17 +03:00
Ник (Claude) ab4e340db9 feat: onboarding + topic bank UI + channel limit handling
/onboarding: 3-шаговый вайзард (платформа → название/ниша → готово)
login/page.js: новый пользователь → /onboarding, существующий → /
TopicBank.js: просмотр/пополнение/добавление/удаление тем
ChannelEdit AI-стиль: TopicBank компонент внизу вкладки
channels/new: при 402 CHANNEL_LIMIT_REACHED → ошибка + redirect /plans
lib/engine.js: ENGINE_URL дефолт 3040 → 3030
API routes: /api/topics-bank/[channelId]/{refill,add}, /item/[id]
2026-06-12 11:50:22 +03:00
Ник (Claude) 59016a7490 fix: restructure inbox API routes — channel/ and message/ namespaces
Next.js не позволяет [channelId] и [id] на одном уровне.
Решение: /api/inbox/channel/[channelId]/* и /api/inbox/message/[id]/*
InboxTab: все fetch пути обновлены
2026-06-11 20:14:40 +03:00
Ник (Claude) d262c2af7d feat: P6 Inbox UI — InboxTab + API routes
ChannelView: вкладка 'Inbox' рядом с 'Аналитика'
InboxTab.js:
  - Webhook setup кнопка (если не настроен)
  - Табы: Новые / Все / Отвечено / Игнорировано
  - Карточки сообщений с иконкой типа (question/praise/complaint/spam)
  - AI-предложенный ответ с кнопкой 'Использовать →'
  - Форма ответа прямо в карточке
  - Кнопки: Ответить / Игнорировать / Спам
API routes: /api/inbox/[channelId], /reply, /status, /setup-webhook
2026-06-11 20:13:08 +03:00
Ник (Claude) d0fd328011 feat: PollModal + HashtagSuggest UI
PollModal:
- Вопрос + 2-10 вариантов ответа
- Типы: обычный / викторина (с правильным ответом и объяснением)
- Настройки: анонимность, несколько ответов
- Отложенная публикация через datetime-local
- Кнопка «📊 Опрос» в ChannelView (только для TG каналов)

HashtagSuggest:
- Появляется под сгенерированным постом
- Запрос в /api/generate/hashtags → Claude Haiku
- Клик по тегу — выбор, кнопка «Добавить в пост»
- Обновление тегов, закрытие панели
2026-06-11 19:55:24 +03:00
Ник (Claude) 675d04c5ab feat: YuKassa payments category in SystemSettings 2026-06-11 19:41:09 +03:00
Ник (Claude) 9bd38bc645 feat: billing complete — plans page, admin billing, credit cost hints
/plans: страница тарифов с карточками, стоимостью операций, FAQ
/system → Биллинг: таблица пользователей с кредитами, ручное начисление
ChannelView: badge стоимости (2кр текст + 5кр картинка) под кнопкой генерации
  Ошибка INSUFFICIENT_CREDITS → понятное сообщение
  После генерации — event credits-updated → обновление badge в header
Header: подписка на credits-updated event
API роуты: /api/billing/plans, /api/billing/admin/users, /api/billing/admin/credit
2026-06-11 18:42:54 +03:00
Ник (Claude) 1cce478f27 feat: billing UI — balance in header + /billing transactions page
- Header: Coins badge с кредитами, ссылка на /billing
- app/billing/page.js: баланс, план, стоимость операций, история транзакций
- app/api/billing/balance/route.js, transactions/route.js — прокси к engine
- lib/engine.js: getBillingBalance, getTransactions, getBillingPlans, adminCreditUser
2026-06-11 18:28:56 +03:00
Ник (Claude) a8df9acbcb refactor: remove HD quality option from ChannelEdit AI-стиль tab
Вместо выбора standard/HD показываем информационный блок:
gpt-5-image-mini, routerai.ru, ~₽2.72/картинка, high quality
Убраны: imageQuality state, image_quality payload, HD модель gpt-5.4-image-2
2026-06-11 15:44:33 +03:00
Ник (Claude) 8d015add30 feat: custom prompt UI + AI-style tab in ChannelEdit
ChannelEdit:
- Вкладка «AI-стиль»: textarea для ai_style_prompt, выбор image_quality (standard/hd)
- Описание моделей: gpt-5-image-mini vs gpt-5.4-image-2 с ценами в кредитах

ChannelView:
- Коллапсируемое поле «Доп. инструкции для AI» под темой поста
- Индикатор (синяя точка) если промт заполнен
- customPrompt передаётся в /api/generate
2026-06-11 15:15:22 +03:00
Ник (Claude) f4860f0e70 feat: /spending page — AI cost dashboard (aiprimetech + routerai)
- app/spending/page.js: расходы по периодам, разбивка по провайдерам и типам
- app/api/usage/summary/route.js: прокси к engine /api/usage/summary
- Header.js: ссылка «Расходы» для admin (TrendingUp иконка)
2026-06-11 13:20:52 +03:00
Ник (Claude) 95c24d477a fix: инструкция подключения канала — @idbot вместо @userinfobot 2026-06-10 17:36:51 +03:00
Ник (Claude) 8244789f10 feat: multi-select image styles, fix descriptions
- IMAGE_STYLES: исправлены описания (realistic-photo = AI-фотореализм, не сток)
- Стиль изображений: single-select → multi-select (чередуется случайно)
- Добавлено пояснение: AI-генерация ≠ стоковые фото; реальный человек → поиск фото
- DB: channel_style.image_style varchar(30) → varchar(255)
2026-06-10 15:50:49 +03:00
Ник (Claude) e330ac3871 feat: вкладка Подключение в ChannelEdit (bot token, TG channel id, VK token) 2026-06-10 15:22:45 +03:00
Ник (Claude) 80e962463b fix: add Sparkles to lucide imports in ChannelEdit 2026-06-10 15:18:20 +03:00
Ник (Claude) 8ad9d19569 fix: goal+language in ChannelEdit, metrics 500 (await params)
ChannelEdit.js:
- Добавлены goal (multi-select + кастомные, как в форме создания)
- Добавлен language (select: ru/en/uk/kk)
- Импортированы Plus, X иконки и GOALS константа

app/api/metrics/channel/[channelId]/route.js:
app/api/metrics/best-time/[channelId]/route.js:
- await params (Next.js 16 требует), иначе 500
2026-06-10 15:10:33 +03:00
Ник (Claude) a3d881aeed refactor: убрать Заметки из навигации app.zeropost.ru 2026-06-09 11:55:55 +03:00
Ник (Claude) 3e04df32c5 feat: Notes manager — Заметки редактора в app.zeropost.ru
- app/notes/page.js: страница управления заметками (создать/редактировать/
  удалить/закрепить/скрыть). Список с превью, inline-форма.
- app/api/notes/route.js: GET+POST прокси к engine /api/notes
- app/api/notes/[id]/route.js: PATCH+DELETE прокси
- lib/engine.js: listNotes, createNote, updateNote, deleteNote
- Header.js: ссылка «Заметки» в навигации (MessageCircle иконка)
2026-06-09 11:44:33 +03:00
Ник (Claude) d413f5f018 feat: image_prompt_instructions in ChannelEdit
- Добавлен state imagePromptInstructions с дефолтом из style.image_prompt_instructions
- Новая карточка UI с textarea (макс 500 символов + счётчик)
- Поле включено в PATCH payload
- Размещено между палиткой и info-блоком «Как это работает»
2026-06-09 10:48:38 +03:00
Ник (Claude) 69226cbbde fix: Link2 undefined crash + goal multi-select + custom goal
ChannelView.js:
- Добавлен Link2 в import lucide-react (ReferenceError при открытии канала)
- Отображение goal учитывает множественные значения через split(',')

app/page.js:
- Аналогичный фикс отображения goal (split → map → join)

channels/new/page.js:
- Цель канала: single-select → multi-select (можно выбрать несколько)
- Кастомная цель: поле + кнопка «+», Enter, чипы с удалением
- Сохраняется как CSV строка (goal: goals.join(','))

DB:
- channels.goal varchar(50) → varchar(255) для длинных кастомных значений
2026-06-09 08:39:32 +03:00
Ник (Claude) 8f4dc1a386 system: AI-провайдеры + блок «Расход AI»
* components/SystemSettings.js: добавлен компонент UsageSummary сверху —
  сводка вызовов и стоимости с переключателем периода (Сегодня/Неделя/
  Месяц/Всё) и группировкой (по сервису/провайдеру/модели). Виджеты
  cost_rub/calls/tokens/images + таблица breakdown.

* components/SystemSettings.js: в массив CATEGORIES добавлена категория
  'ai_providers' первой — Aleksei видит все 11 строк (Текст/Картинки
  ключи+URL+модели + AI_USD_RUB_RATE + AI_PROVIDER_MARKUP) сверху.
  Существующая инфраструктура SettingRow (маскировка секретов, save+toast)
  переиспользуется без изменений.

* lib/engine.js: добавлены engine.usageSummary(params) и engine.usageRecent(limit).

* app/api/admin/usage/summary/route.js (новый): прокси-роут к engine
  /api/usage/summary через requireAdmin.

Verify:
* next build прошёл без ошибок.
* /system → 307 redirect на /login (неавторизованный — корректно).
* /api/admin/usage/summary → 403 Forbidden (не-админ — корректно).
2026-06-08 20:21:49 +03:00
aleksei b13f956099 fix(calendar): isoDay use local date parts — fixes MSK off-by-one day grouping 2026-06-08 16:32:51 +03:00
Nik (Claude) eac6e2ed13 feat: P4 ChannelAnalytics tab; P5 FromUrlModal + URL→draft in ChannelView 2026-06-08 11:09:03 +03:00
Nik (Claude) b8a570f04a feat: P3 PostTemplates — 7 post structure presets in ChannelView 2026-06-08 10:58:56 +03:00
Nik (Claude) 0c8ca23015 feat: P2 PostPreview — TG/VK/MAX preview with char counter, integrated in ChannelView 2026-06-08 10:57:38 +03:00
Nik (Claude) 999119d58d feat: P1 Calendar — CalendarView (month/week/list, drag&drop, channel filter) 2026-06-08 10:16:54 +03:00