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 agente = ref(null)
|
||||||
const error = ref('')
|
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 ───────────────────────────────────────────────────
|
// ─── Base de conocimiento ───────────────────────────────────────────────────
|
||||||
const documentos = ref([])
|
const documentos = ref([])
|
||||||
@@ -299,15 +305,29 @@ async function enviarChatPrueba() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const tabs = [
|
// Al dueño le importa qué le preguntan sus clientes y poder probarlo; la
|
||||||
['conocimiento', 'Base de conocimiento'],
|
// configuración la toca una vez. Al staff, al revés.
|
||||||
['herramientas', 'Herramientas'],
|
const tabs = computed(() =>
|
||||||
['canales', 'Canales'],
|
contexto.esPortal
|
||||||
['conexiones', 'Conexiones'],
|
? [
|
||||||
['chat', 'Chat de prueba'],
|
['conversaciones', 'Conversaciones'],
|
||||||
['conversaciones', 'Conversaciones'],
|
['chat', 'Probar'],
|
||||||
['auditoria', 'Auditoría'],
|
['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 ────────────────────────────────────────────────────────────────
|
// ─── Auditoría ────────────────────────────────────────────────────────────────
|
||||||
const eventos = ref([])
|
const eventos = ref([])
|
||||||
|
|||||||
@@ -1,14 +1,54 @@
|
|||||||
<script setup>
|
<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>
|
</script>
|
||||||
|
|
||||||
<template>
|
<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>
|
<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' }}
|
{{ contexto.esPortal ? 'Elegí tu espacio de la izquierda' : 'Elegí un tenant de la izquierda' }}
|
||||||
</h1>
|
</h1>
|
||||||
<p class="text-sm text-gray-400 dark:text-gray-500 mt-1">
|
<p class="text-sm text-tenue mt-1">
|
||||||
{{ contexto.esPortal
|
{{ contexto.esPortal
|
||||||
? 'Adentro vas a poder crear y configurar tus agentes.'
|
? 'Adentro vas a poder crear y configurar tus agentes.'
|
||||||
: 'o creá uno nuevo para empezar a configurar su agente.' }}
|
: '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 charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>uMind Studio</title>
|
<title>uMind Studio</title>
|
||||||
<script type="module" crossorigin src="/orchestrator/assets/index-B67EqHas.js"></script>
|
<script type="module" crossorigin src="/orchestrator/assets/index-CUSjvRBR.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/orchestrator/assets/index-D_GQdYSJ.css">
|
<link rel="stylesheet" crossorigin href="/orchestrator/assets/index-DUjBJRtl.css">
|
||||||
</head>
|
</head>
|
||||||
<!-- Sin clase de fondo: el color lo pone body en style.css desde los tokens,
|
<!-- 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
|
que son los que cambian con el tema. Una utilidad acá le ganaba a la
|
||||||
|
|||||||
Reference in New Issue
Block a user