From 026cc7753bb4fb2664754f719f4f6b81efc5482b Mon Sep 17 00:00:00 2001 From: ErickHub192 Date: Fri, 21 Aug 2026 15:11:34 -0600 Subject: [PATCH] El agente elige donde viven los datos segun quien los usa Co-Authored-By: Claude Opus 5 --- server/src/agent/loop.ts | 46 +++++++++++++++++++++++++++--------- server/src/demos/publicar.ts | 19 +++++++++++++++ web/src/i18n.tsx | 4 ++-- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/server/src/agent/loop.ts b/server/src/agent/loop.ts index 86d664a..2149e4a 100644 --- a/server/src/agent/loop.ts +++ b/server/src/agent/loop.ts @@ -85,17 +85,41 @@ créalo con bash: es tu trabajo, no preguntes por dónde empezar. - El proyecto vive en un volumen montado, donde los eventos de archivo del sistema no cruzan. Configura el watcher de tu stack por SONDEO (polling) o los cambios no se verán en vivo y la sala se quedará mirando una pantalla congelada. -- Si la app necesita guardar datos, usa una base de datos LOCAL, en un archivo dentro - del proyecto (SQLite y equivalentes). No pidas credenciales ni servicios en la nube. - Con Node tienes node:sqlite sin instalar nada. - Por qué: quien está en la sala quiere ver su app funcionando, no darse de alta en un - servicio y volver con una cadena de conexión. Un archivo se crea solo y arranca al - instante. - El archivo de la base NO entra al historial (está en el .gitignore): lo de aquí son - datos de prueba. Deja el esquema en el código o en una migración, para que la app - arranque sola en una base vacía. - Si te dan credenciales de una base externa, úsalas: estarán en el .env. Léelo antes - de asumir que no hay ninguna. +- Del contenedor sale UN SOLO puerto: el del dev server. Todo lo demás queda adentro. + Si montas el dev server dentro de otro servidor tuyo, pásale ese servidor HTTP para + que el canal de recarga en vivo viaje por el mismo puerto que la página. Y si tu app + necesita un backend, que escuche en ese mismo puerto, no en otro. + Por qué: un puerto propio para el canal de recarga no existe fuera del contenedor. + La página carga bien, así que parece que todo está en orden, pero los cambios dejan + de verse solos y la sala tiene que recargar a mano sin saber por qué. Pasó de verdad, + y llevó una tarde encontrarlo porque el síntoma no apunta a la causa. +- Deja en paz la configuración del canal de recarga en vivo. Se sirve a través de un + proxy y se deduce sola del origen desde el que se cargó la página: fijarle un host o + un puerto a mano es lo que la rompe. +- Si la app necesita guardar datos, mira antes el .env: si ya hay credenciales de una + base, úsalas. Si no, decide TÚ por el uso, sin preguntar cuál prefieren: + * Datos de una sola persona (sus hábitos, sus notas, su lista) → base LOCAL, en un + archivo dentro del proyecto. Con Node tienes node:sqlite sin instalar nada. + Un archivo se crea solo y arranca al instante, sin que nadie se dé de alta en + ningún lado. + * Datos que VARIAS personas comparten y ven al mismo tiempo (un registro que + llenan entre todos, un inventario de un equipo) → eso no cabe en una base local. + Pide las credenciales de una base externa por el panel de Variables, diciendo + los nombres exactos que vas a leer, y ofrece dejar la app andando con datos de + prueba mientras llegan. + El archivo de una base local NO entra al historial (está en el .gitignore): lo de + ahí son datos de prueba. Deja el esquema en el código o en una migración, para que + la app arranque sola en una base vacía. + Y dilo al cerrar, en una línea: una base local vive SOLO en esta sala y no viaja + cuando alguien publica la app, así que para publicarla con sus datos hay que + conectar una externa desde Variables. Mejor saberlo ahora que descubrirlo al darle + al botón. +- Las variables que va a leer el NAVEGADOR necesitan el prefijo que pida tu stack + (VITE_, NEXT_PUBLIC_, PUBLIC_…). Cuando pidas credenciales, di el nombre completo + con su prefijo. + Por qué: sin él la variable no entra a la compilación, y entonces la app publicada + no encuentra su base. No falla al compilar ni avisa nada: simplemente no conecta, + y desde fuera parece que la app está rota. diff --git a/server/src/demos/publicar.ts b/server/src/demos/publicar.ts index 3702b9e..8da2913 100644 --- a/server/src/demos/publicar.ts +++ b/server/src/demos/publicar.ts @@ -127,6 +127,25 @@ async function main() { check("sin URL en la salida, no se inventa una", sacarUrl("todo mal", "una-sala") === null); } + console.log("\n10. Una app con servidor propio no cabe, y se dice antes de subir"); + { + /** + * El caso real: el agente montó un Express con su base en un archivo, la + * sala lo vio funcionar durante horas, y al darle a Publicar no había nada + * que subir. Publicar sirve archivos, así que un proceso que escucha no + * entra. + * + * Aquí se comprueba la señal que lo detecta: un proyecto que compila pero no + * deja carpeta de salida. El aviso de que va a pasar es cosa del prompt del + * agente, que ahora elige base local o externa según quién usa los datos. + */ + const servidor = await createWorkspace("demo-publicar-servidor", { clean: true }); + await conScripts(servidor.dir, { dev: "node server.js", build: "echo sin front" }); + + check("el build se detecta igual", (await detectBuild(servidor.dir))?.args.join(" ") === "run build"); + check("pero no hay carpeta que subir", buscarSalida(servidor.dir) === null); + } + console.log(`\n${pass} pasaron, ${fail} fallaron\n`); process.exit(fail > 0 ? 1 : 0); } diff --git a/web/src/i18n.tsx b/web/src/i18n.tsx index a775191..0bcc0d2 100644 --- a/web/src/i18n.tsx +++ b/web/src/i18n.tsx @@ -79,7 +79,7 @@ const TEXTOS = { envBoton: "Variables", envTitulo: "Variables del proyecto", envNota: - "Van al .env de esta sala: la app y el agente las leen. Son de la sala, así que las ve quien entre.", + "Van al .env de esta sala: la app y el agente las leen. Son de la sala, así que las ve quien entre. Las que la app lee desde el navegador necesitan el prefijo de su framework (VITE_, NEXT_PUBLIC_); sin él no llegan a la app publicada.", envVacio: "Todavía no hay ninguna.", envNombre: "NOMBRE", envValor: "valor", @@ -264,7 +264,7 @@ const TEXTOS = { envBoton: "Variables", envTitulo: "Project variables", envNota: - "They go in this room's .env: the app and the agent read them. They belong to the room, so anyone who joins can see them.", + "They go in this room's .env: the app and the agent read them. They belong to the room, so anyone who joins can see them. The ones the app reads from the browser need its framework's prefix (VITE_, NEXT_PUBLIC_); without it they never reach the published app.", envVacio: "None yet.", envNombre: "NAME", envValor: "value",