Consolida o trabalho desta branch de abril/2026 em um bloco pronto pra testar em staging antes do merge pra main. ## Correções de memória semântica - ExtractionService: Princípio Zero + Regra de Ouro (ação consumada vs intenção). - Cenário Daniela_Reservas: Passo 0 de classificação (consulta/intenção/fora). ## Roleta da Sorte (end-to-end) - Schema Supabase + 7 RPCs atômicas (server-side, idempotentes). - Services: Offer, Redeem, WeeklyReport. - Jobs: OfferRouletteJob (hook em ConfirmationService após Pix pago), NotifyRevealed + Scheduler de fallback. - Tool manual GenerateRoletaLinkTool + endpoint público /roleta/notify. - Dashboard /captain/roleta com Resgate + Relatório + anomaly detection. ## Cenário Reclamacoes_Ouvidoria - Triagem P1-P4, framework LAST, Three-level listening, Self-check. - Sem compensação material, detecção de cliente frustrado eleva prioridade. ## Analytics - Funil de conversão /captain/funnel: 5 etapas via regex, zero LLM. - Detector de churn via ChurnOutreach* (cron dias úteis 10h-17h BRT). ## Trabalho pré-existente incluído - Captain Executive Reports (ceo_digest, mattermost_delivery). - get_reserva_preco_tool, Lifecycle ajustes, Reservations UI polimentos. ## Outros - .gitignore: patterns pra credenciais. - Migrations de scenarios idempotentes. - i18n completa pt_BR+en pra roleta/funnel. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
185 lines
5.5 KiB
JavaScript
185 lines
5.5 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 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/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,
|
|
},
|
|
],
|
|
},
|
|
];
|