feat(studio): el cliente entra directo a su agente y ve primero las conversaciones

En el portal, un cliente con un solo espacio y un solo agente tenía que
elegir dos veces antes de llegar a lo suyo. Ahora entra directo.

Y la primera pestaña deja de ser configuración: lo que le importa al dueño
es qué le están preguntando sus clientes, y poder probarlo. Para el staff
el orden queda igual.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-17 18:26:46 -05:00
co-authored by Claude Opus 5
parent e2dab8117c
commit 1ebae791f6
6 changed files with 103 additions and 43 deletions
+30 -10
View File
@@ -13,7 +13,13 @@ const route = useRoute()
const agente = ref(null)
const error = ref('')
const tab = ref(typeof route.query.tab === 'string' ? route.query.tab : 'conocimiento')
const tab = ref(
typeof route.query.tab === 'string'
? route.query.tab
: contexto.esPortal
? 'conversaciones'
: 'conocimiento',
)
// ─── Base de conocimiento ───────────────────────────────────────────────────
const documentos = ref([])
@@ -299,15 +305,29 @@ async function enviarChatPrueba() {
}
}
const tabs = [
['conocimiento', 'Base de conocimiento'],
['herramientas', 'Herramientas'],
['canales', 'Canales'],
['conexiones', 'Conexiones'],
['chat', 'Chat de prueba'],
['conversaciones', 'Conversaciones'],
['auditoria', 'Auditoría'],
]
// Al dueño le importa qué le preguntan sus clientes y poder probarlo; la
// configuración la toca una vez. Al staff, al revés.
const tabs = computed(() =>
contexto.esPortal
? [
['conversaciones', 'Conversaciones'],
['chat', 'Probar'],
['conocimiento', 'Base de conocimiento'],
['herramientas', 'Herramientas'],
['canales', 'Canales'],
['conexiones', 'Conexiones'],
['auditoria', 'Auditoría'],
]
: [
['conocimiento', 'Base de conocimiento'],
['herramientas', 'Herramientas'],
['canales', 'Canales'],
['conexiones', 'Conexiones'],
['chat', 'Chat de prueba'],
['conversaciones', 'Conversaciones'],
['auditoria', 'Auditoría'],
],
)
// ─── Auditoría ────────────────────────────────────────────────────────────────
const eventos = ref([])
+44 -4
View File
@@ -1,14 +1,54 @@
<script setup>
import { contexto } from '../lib/contexto.js'
import { onMounted, ref } from 'vue'
import { useRouter } from 'vue-router'
import { api } from '../lib/api.js'
import { apiUmind, contexto } from '../lib/contexto.js'
const router = useRouter()
const cargando = ref(contexto.esPortal)
// El cliente no tiene "tenants": tiene SU asistente. Si solo hay un espacio
// con un agente —el caso normal— entrar obligándolo a elegir dos veces es
// jerarquía nuestra, no suya. Se salta directo al agente.
//
// Con varios espacios o varios agentes sí hace falta elegir, así que ahí se
// muestra la pantalla de siempre.
async function irAlAgenteSiEsUnoSolo() {
if (!contexto.esPortal) return
try {
const t = await api.get(apiUmind('/umind/tenants'))
const tenants = t.items || []
if (tenants.length !== 1) return
const tenantId = tenants[0].ID
const a = await api.get(apiUmind(`/umind/agentes?tenant_id=${tenantId}`))
const agentes = a.items || []
if (agentes.length === 1) {
router.replace(`/tenants/${tenantId}/agentes/${agentes[0].ID}`)
return
}
router.replace(`/tenants/${tenantId}`)
} catch {
// Si algo falla se queda en esta pantalla, que igual deja navegar.
} finally {
cargando.value = false
}
}
onMounted(irAlAgenteSiEsUnoSolo)
</script>
<template>
<div class="flex flex-col items-center justify-center text-center py-24">
<div v-if="cargando" class="flex flex-col items-center justify-center py-24 text-sm text-tenue">
Abriendo tu asistente
</div>
<div v-else class="flex flex-col items-center justify-center text-center py-24">
<div class="text-4xl mb-4">💬</div>
<h1 class="text-lg font-medium text-gray-700 dark:text-gray-200">
<h1 class="text-lg font-medium text-texto">
{{ contexto.esPortal ? 'Elegí tu espacio de la izquierda' : 'Elegí un tenant de la izquierda' }}
</h1>
<p class="text-sm text-gray-400 dark:text-gray-500 mt-1">
<p class="text-sm text-tenue mt-1">
{{ contexto.esPortal
? 'Adentro vas a poder crear y configurar tus agentes.'
: 'o creá uno nuevo para empezar a configurar su agente.' }}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -4,8 +4,8 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>uMind Studio</title>
<script type="module" crossorigin src="/orchestrator/assets/index-B67EqHas.js"></script>
<link rel="stylesheet" crossorigin href="/orchestrator/assets/index-D_GQdYSJ.css">
<script type="module" crossorigin src="/orchestrator/assets/index-CUSjvRBR.js"></script>
<link rel="stylesheet" crossorigin href="/orchestrator/assets/index-DUjBJRtl.css">
</head>
<!-- Sin clase de fondo: el color lo pone body en style.css desde los tokens,
que son los que cambian con el tema. Una utilidad acá le ganaba a la