Tela "Construtor" no painel Captain (acessivel em sidebar pra admins) que permite criar novo agente Hermes via chat guiado com agente Construtor (profile Hermes separado). Backend (admin scope): - POST /api/v1/accounts/:id/captain/hermes_builder — manda mensagem do admin pro gateway do Construtor (Hermes na porta 8646) - GET — retorna historico da sessao (Rails.cache, TTL 4h) - DELETE /reset — limpa sessao - POST /webhooks/captain/builder_callback — recebe respostas async do Construtor via plugin captain-http-callback do Hermes - HermesBuilder::Storage (Rails.cache) — persiste msgs por session_key (account_id + user_id) com role/content/created_at - HermesBuilder::Dispatcher — encaminha pro webhook do Construtor com HMAC opcional via ENV HERMES_BUILDER_WEBHOOK_SECRET Frontend: - Pagina Vue HermesBuilder/Index.vue — chat simples com: * Lista de mensagens com bubbles user/construtor * Indicador "digitando..." enquanto aguarda resposta * Input com Enter pra enviar / Shift+Enter pra nova linha * Polling 2s pra novas msgs * Botao Limpar conversa - API client em api/captain/hermesBuilder.js - Rota captain_hermes_builder_index (admin only) - Item no sidebar Captain "Construtor (Hermes)" - i18n keys CAPTAIN.HERMES_BUILDER em pt_BR + en UX flow: Admin abre tela → digita "olá" → Construtor pergunta nome → admin responde → marca, persona, tabela (com opcao copiar de existente), regras, FAQs, identidade → resumo → confirmar → Construtor chama save_agent_spec → JSON salvo em /tmp/agent-specs/<slug>.json pra revisao posterior. NAO cria filesystem do profile nem registros DB (etapa SEPARADA, prox sessao). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
199 lines
5.9 KiB
JavaScript
199 lines
5.9 KiB
JavaScript
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
|
|
import { INSTALLATION_TYPES } from 'dashboard/constants/installationTypes';
|
|
import { frontendURL } from '../../../helper/URLHelper';
|
|
|
|
import CaptainPageRouteView from './pages/CaptainPageRouteView.vue';
|
|
import AssistantsIndexPage from './pages/AssistantsIndexPage.vue';
|
|
import AssistantEmptyStateIndex from './assistants/Index.vue';
|
|
|
|
import AssistantSettingsIndex from './assistants/settings/Settings.vue';
|
|
import AssistantInboxesIndex from './assistants/inboxes/Index.vue';
|
|
import AssistantPlaygroundIndex from './assistants/playground/Index.vue';
|
|
import AssistantGuardrailsIndex from './assistants/guardrails/Index.vue';
|
|
import AssistantGuidelinesIndex from './assistants/guidelines/Index.vue';
|
|
import AssistantScenariosIndex from './assistants/scenarios/Index.vue';
|
|
import DocumentsIndex from './documents/Index.vue';
|
|
import ResponsesIndex from './responses/Index.vue';
|
|
import ResponsesPendingIndex from './responses/Pending.vue';
|
|
import CustomToolsIndex from './tools/Index.vue';
|
|
import ReservationsIndex from './reservations/Index.vue';
|
|
import RoletaIndex from './roleta/Index.vue';
|
|
import HermesBuilderIndex from './builder/Index.vue';
|
|
import FunnelIndex from './funnel/Index.vue';
|
|
import LifecycleIndex from './lifecycle/Index.vue';
|
|
import LifecycleRules from './lifecycle/Rules.vue';
|
|
import LifecycleSettings from './lifecycle/Settings.vue';
|
|
import LifecycleHistory from './lifecycle/History.vue';
|
|
|
|
const meta = {
|
|
permissions: ['administrator', 'agent'],
|
|
featureFlag: FEATURE_FLAGS.CAPTAIN,
|
|
installationTypes: [INSTALLATION_TYPES.CLOUD, INSTALLATION_TYPES.ENTERPRISE],
|
|
};
|
|
|
|
const metaV2 = {
|
|
permissions: ['administrator', 'agent'],
|
|
featureFlag: FEATURE_FLAGS.CAPTAIN_V2,
|
|
installationTypes: [INSTALLATION_TYPES.CLOUD, INSTALLATION_TYPES.ENTERPRISE],
|
|
};
|
|
|
|
const assistantRoutes = [
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/:assistantId/faqs'),
|
|
component: ResponsesIndex,
|
|
name: 'captain_assistants_responses_index',
|
|
meta,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/:assistantId/documents'),
|
|
component: DocumentsIndex,
|
|
name: 'captain_assistants_documents_index',
|
|
meta,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/:assistantId/tools'),
|
|
component: CustomToolsIndex,
|
|
name: 'captain_tools_index',
|
|
meta: metaV2,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/:assistantId/scenarios'),
|
|
component: AssistantScenariosIndex,
|
|
name: 'captain_assistants_scenarios_index',
|
|
meta: metaV2,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/:assistantId/playground'),
|
|
component: AssistantPlaygroundIndex,
|
|
name: 'captain_assistants_playground_index',
|
|
meta,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/:assistantId/inboxes'),
|
|
component: AssistantInboxesIndex,
|
|
name: 'captain_assistants_inboxes_index',
|
|
meta,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/:assistantId/faqs/pending'),
|
|
component: ResponsesPendingIndex,
|
|
name: 'captain_assistants_responses_pending',
|
|
meta,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/:assistantId/settings'),
|
|
component: AssistantSettingsIndex,
|
|
name: 'captain_assistants_settings_index',
|
|
meta,
|
|
},
|
|
// Settings sub-pages (guardrails and guidelines)
|
|
{
|
|
path: frontendURL(
|
|
'accounts/:accountId/captain/:assistantId/settings/guardrails'
|
|
),
|
|
component: AssistantGuardrailsIndex,
|
|
name: 'captain_assistants_guardrails_index',
|
|
meta: metaV2,
|
|
},
|
|
{
|
|
path: frontendURL(
|
|
'accounts/:accountId/captain/:assistantId/settings/guidelines'
|
|
),
|
|
component: AssistantGuidelinesIndex,
|
|
name: 'captain_assistants_guidelines_index',
|
|
meta: metaV2,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/assistants'),
|
|
component: AssistantEmptyStateIndex,
|
|
name: 'captain_assistants_create_index',
|
|
meta: {
|
|
permissions: ['administrator', 'agent'],
|
|
installationTypes: [
|
|
INSTALLATION_TYPES.CLOUD,
|
|
INSTALLATION_TYPES.ENTERPRISE,
|
|
],
|
|
},
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/:navigationPath'),
|
|
component: AssistantsIndexPage,
|
|
name: 'captain_assistants_index',
|
|
meta,
|
|
},
|
|
];
|
|
|
|
export const routes = [
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain'),
|
|
component: CaptainPageRouteView,
|
|
redirect: to => {
|
|
return {
|
|
name: 'captain_assistants_index',
|
|
params: {
|
|
navigationPath: 'captain_assistants_responses_index',
|
|
...to.params,
|
|
},
|
|
};
|
|
},
|
|
children: [...assistantRoutes],
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/reservations'),
|
|
component: ReservationsIndex,
|
|
name: 'captain_reservations_index',
|
|
meta,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/roleta'),
|
|
component: RoletaIndex,
|
|
name: 'captain_roleta_index',
|
|
meta,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/hermes-builder'),
|
|
component: HermesBuilderIndex,
|
|
name: 'captain_hermes_builder_index',
|
|
meta: {
|
|
permissions: ['administrator'],
|
|
featureFlag: FEATURE_FLAGS.CAPTAIN,
|
|
installationTypes: [
|
|
INSTALLATION_TYPES.CLOUD,
|
|
INSTALLATION_TYPES.ENTERPRISE,
|
|
],
|
|
},
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/funnel'),
|
|
component: FunnelIndex,
|
|
name: 'captain_funnel_index',
|
|
meta,
|
|
},
|
|
{
|
|
path: frontendURL('accounts/:accountId/captain/lifecycle'),
|
|
component: LifecycleIndex,
|
|
meta,
|
|
redirect: { name: 'captain_lifecycle_rules' },
|
|
children: [
|
|
{
|
|
path: 'rules',
|
|
component: LifecycleRules,
|
|
name: 'captain_lifecycle_rules',
|
|
meta,
|
|
},
|
|
{
|
|
path: 'settings',
|
|
component: LifecycleSettings,
|
|
name: 'captain_lifecycle_settings',
|
|
meta,
|
|
},
|
|
{
|
|
path: 'history',
|
|
component: LifecycleHistory,
|
|
name: 'captain_lifecycle_history',
|
|
meta,
|
|
},
|
|
],
|
|
},
|
|
];
|