модули / faq
Один экран, две независимые панели: Модули — только-чтение, какие модули подключены на сайте (ago-chat); и База знаний — чтение и правка текста, которым отвечает AI-FAQ (ago-faq, отдельный бэкенд). Ровно как консоль рисует две формы на одной странице — у каждой своя загрузка, сохранение и ошибки, потому что это два разных бэкенда.
adr/0151/23-83 убрали все записи тенанта в /modules (регистрация, ротация, отзыв, проверка) — остался только GET. Подключает модуль владелец платформы, не тенант. Поэтому панель «Модули» — чтение, а не форма; это и есть паритет с консолью, а не урезание.
navigation.md называет эту строку «База знаний» в разделе Автоматизация. Строка рисуется только под правом site:configure (весь маршрут /automation/faq в консоли под ним). Открывает экран-вкладыш тем же способом openRowId, что и «Установка виджета».
Раздел без строк не рисуется (buildMoreSections), поэтому оператор без site:configure не видит и заголовка «Автоматизация».
Панель «Модули» сверху — читаемый список подключённых модулей. Панель «База знаний» ниже — редактор текста с кнопкой «Сохранить» и отметкой последнего сохранения. Две панели, две разные загрузки/сохранения — общей кнопки нет, потому что сохранение одной не сохраняет другую.
Панель «Модули» — только чтение. Показывает подключённые модули как есть из ответа GET: ключ, триггеры, точка входа, а также «Включено владельцем» и срок, если они есть. Правки нет — регистрация не действие тенанта (adr/0151).
Панель «База знаний» бьёт в ago-faq — другой бэкенд, тот же токен. Правит текст, сохраняет (эхо-ответ пересеивает поле), показывает время сохранения.
У ago-faq нет боевого развёртывания. Новый nullable AGO_FAQ_API_BASE_URL (по образцу calendarApiBaseUrl): адаптер всегда создаётся, а null отвечает NotConfigured первой же строкой — как KtorBookingsApi. Панель «Модули» при этом работает: другой бэкенд.
Пустой список модулей — копия консоли: «Ни один модуль не подключён — напишите нам», не ошибка. База знаний может редактироваться независимо — она на другом бэкенде и не требует подключённого модуля в ago-chat.
База знаний живёт на ago-faq — отдельном бэкенде. Приложению нужен новый nullable базовый URL, по образцу AGO_CALENDAR_API_BASE_URL: buildConfigField через agoOptionalProperty без дефолтного хоста; поле OidcConfig.faqApiBaseUrl: String?; проброс в provideOidcConfig. Адаптер KtorFaqKnowledgeBaseApi всегда создаётся; null отвечает NotConfigured, а не заставляет Hilt инжектить nullable-порт.
X-Ago-Active-Site общего клиента уходит и в ago-faq: на вебе консоль его туда не шлёт (CORS-preflight против чужой политики), но Android — не браузер, preflight нет, лишний заголовок безвреден, и переиспользовать один общий клиент здесь правильно.