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:
co-authored by
Claude Opus 5
parent
e2dab8117c
commit
1ebae791f6
@@ -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([])
|
||||
|
||||
@@ -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
+1
-1
File diff suppressed because one or more lines are too long
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user