[feature][ai-chat] Настраиваемый авто-запуск роли («скилла»): тумблер autoStart + поле «сообщение для запуска» #149
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Кратко
Сейчас «скиллы» (агентные роли, agent roles — карточки ролей в окне AI-чата) всегда запускаются автоматически: клик по карточке роли мгновенно отправляет жёстко зашитое сообщение
"Take a look at the current document"и стартует диалог. Нужно сделать это поведение настраиваемым на уровне роли:autoStart) — включать/выключать авто-старт диалога при выборе роли.launchMessage) — настраиваемый текст, который отправляется при авто-старте вместо текущей захардкоженной строки.Текущее поведение
Карточки ролей рендерятся как empty-state нового чата. По клику роль привязывается к новому чату и сразу отправляется зашитое сообщение:
Проблемы:
Желаемое поведение (матрица)
autoStartlaunchMessagetruelaunchMessage(новый кастомный текст)truenullt("Take a look at the current document")(текущее поведение)falseДефолты для существующих ролей:
autoStart = true,launchMessage = NULL→ старое поведение сохраняется без изменений (back-compat).Объём изменений (full-stack)
1. БД / схема
Новая аддитивная миграция (не править существующую
20260620T120000-ai-agent-roles.ts) — добавить вai_agent_rolesдве колонки:auto_start boolean NOT NULL DEFAULT truelaunch_message text(nullable)Обновить тип таблицы
AiAgentRolesвapps/server/src/database/types/db.d.ts:2. Сервер
apps/server/src/core/ai-chat/roles/dto/agent-role.dto.ts— вCreateAgentRoleDtoиUpdateAgentRoleDtoдобавить:autoStart?: boolean(@IsOptional() @IsBoolean());launchMessage?: string(@IsOptional() @IsString() @MaxLength(...), например 2000; обрезка пробелов через@Transform, как уchatModel).apps/server/src/database/repos/ai-agent-roles/ai-agent-roles.repo.ts— проброситьautoStart/launchMessageвinsertи вupdate(с семантикойundefined => не менять,'' => nullдляlaunchMessage).apps/server/src/core/ai-chat/roles/ai-agent-roles.service.ts:AgentRoleViewи вAgentRolePickerView(см. примечание ниже), и вtoView/toPickerView;create/updateс нормализацией (пустойlaunchMessage→null, дефолтautoStart ?? true).3. Клиент
apps/client/src/features/ai-chat/types/ai-chat.types.ts:IAiRole:autoStart: boolean; launchMessage: string | null;IAiRoleCreate/IAiRoleUpdate: опциональныеautoStart?,launchMessage?.apps/client/src/features/workspace/components/settings/components/ai-agent-role-form.tsx:Switch«Запускать автоматически» (autoStart);Textarea«Сообщение для запуска» (launchMessage), с подсказкой, что при пустом значении используется дефолт, а при выключенном тумблере поле игнорируется;formSchema,initialValues, эффект ре-гидратации (useEffectпоrole?.id) и в payloadcreate/update.apps/client/src/features/ai-chat/components/chat-thread.tsx(handleRolePick):roleIdRef.current = role.id; onRolePicked?.(role);role.autoStart:sendMessage({ text: role.launchMessage?.trim() || t("Take a look at the current document") });!role.autoStart: ничего не отправлять; перевести empty-state из карточек в composer с выбранной ролью.showRoleCards = chatId === null && roles.length > 0. Если роль выбрана без отправки сообщения,chatIdвсё ещёnull, и карточки не спрячутся. Нужен дополнительный признак «роль выбрана, сообщение ещё не отправлено» (локальный state вchat-thread/окне), чтобы скрыть карточки и показать composer с индикатором выбранной роли.roleIdRefуже выставлен синхронно, поэтомуprepareSendMessagesRequestподставитroleIdв первый ручной запрос пользователя.4. i18n
Новые строки UI (label тумблера, label/description поля, подсказки) добавить в словари. Дефолтный текст
"Take a look at the current document"оставить как fallback.Тесты (обновить/добавить)
apps/server/src/core/ai-chat/roles/dto/agent-role.dto.spec.ts— валидацияautoStart/launchMessage(тип, MaxLength, обрезка пробелов).apps/server/src/core/ai-chat/roles/ai-agent-roles.service.spec.ts—create/updateпробрасывают и нормализуют новые поля; дефолтautoStart=true; пустойlaunchMessage → null.autoStart/launchMessageприсутствуют для не-админов, аinstructions/modelConfig— нет.apps/server/src/database/repos/ai-agent-roles/ai-agent-roles.repo.spec.ts— insert/update новых колонок.handleRolePick(клиент): авто-старт vs. кастомное сообщение vs. без отправки.Критерии приёмки (DoD)
auto_start/launch_message; существующие роли работают как раньше (auto-start с дефолтным текстом).autoStart=trueи заданномlaunchMessageклик по карточке отправляет именно кастомный текст.autoStart=trueбезlaunchMessageотправляется дефолтная строка (текущее поведение).autoStart=falseклик по карточке только выбирает роль; сообщение не отправляется; composer показывает выбранную роль; роль уходит вroleIdпервого сообщения пользователя.launchMessage/autoStartотдаются в picker-view обычным участникам;instructions/modelConfigпо-прежнему только админам.Issue спроектировано по итогам анализа кода в
apps/client/src/features/ai-chatиapps/server/src/core/ai-chat/roles.Ghost referenced this issue2026-06-24 12:38:17 +03:00
Ghost referenced this issue2026-06-24 12:42:54 +03:00