Skip to content

Fix/preview sirve public - #21

Merged
ErickUser1 merged 7 commits into
mainfrom
fix/preview-sirve-public
Aug 9, 2026
Merged

Fix/preview sirve public#21
ErickUser1 merged 7 commits into
mainfrom
fix/preview-sirve-public

Conversation

@ErickUser1

Copy link
Copy Markdown
Owner

No description provided.

ErickHub192 and others added 7 commits August 5, 2026 23:20
Un bloque image en el formato neutral, y cada proveedor lo traduce a lo suyo:
Anthropic quiere source.base64 con media_type; los de formato OpenAI quieren un
data URI dentro de image_url. Los dos formatos verificados contra su doc oficial.

La imagen va antes del texto. Las dos documentaciones dicen lo mismo: el modelo
responde mejor viendo primero y leyendo la pregunta despues.

La bandera "ve" decide a quien se le manda. Quien no ve no se queda fuera:
recibe la ruta del adjunto y con eso puede meter el logo en el header. Lo unico
que no puede es decir de que color es. OpenRouter queda en false porque bajo un
mismo perfil revende modelos que ven y modelos que no.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…l agente quiere

Viven en <sala>.adjuntos, hermano del workspace, igual que los turnos y los
marcadores. La razon es la misma: una imagen que era platica no tiene por que
acabar en el repo que alguien se va a descargar.

La que si se va a usar entra por usar_adjunto, y esa decision es del agente
porque es quien sabe donde van los estaticos de su stack. De paso resuelve que
read_file lee utf8: el agente no lee el PNG, pide que se copie.

El nombre en disco es un uuid mas el nombre visible. El uuid delante impide que
dos capturas llamadas igual se pisen y que un nombre de fuera decida donde se
escribe; el nombre detras deja buscarlo sin llevar un indice aparte.

maxHttpBufferSize a 8MB. El default de socket.io es 1MB y lo peor de pasarse no
es el rechazo, es que el mensaje se descarta sin avisar: desde la sala parece
que le diste a enviar y no paso nada.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ctrl+V o arrastrarla al chat. Se ve en la sala para todos, vean o no vean sus
modelos, porque el chat entre personas es una cosa y lo que llega al agente es
otra. Al agente solo le llega si lo mencionas, igual que pasa hoy con el texto.

Las imagenes se encogen en el navegador antes de salir, con canvas. No es solo
el peso: una imagen cuesta tokens segun sus dimensiones y aqui paga cada quien
con su key, asi que mandar una captura de 4K en vez de reducirla significa que
quien invoque al agente paga tres veces mas por lo mismo. El limite de 1568px
sale de la doc de Anthropic, es lo que los modelos procesan sin reescalar.

En el mensaje las imagenes se piden al server por URL en vez de viajar en base64,
para que el navegador las cachee y entrar a una sala con historial largo no
arrastre megas.

Los GIF se mandan tal cual: redibujarlos en un canvas se quedaria con el primer
fotograma, y quien manda un GIF lo manda por el movimiento.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
El script existia solo en server/package.json, asi que "npm run
demo:imagenes" fallaba desde la raiz, que es como se documentan y se
corren todos los demas. Mismo hueco que tuvieron demo:agentes-se-ven y
demo:interrupcion.
Arrastrar y pegar ya funcionaban, pero no se ven: nadie adivina que puede
soltar un archivo en el chat si no hay una pista. Y en el telefono no
existe ninguna de las dos, asi que ahi no habia forma de subir nada.

Es un <input type="file"> escondido y un boton que lo dispara. Toda la
logica se reusa: el mismo esImagenAceptada que filtran onDrop y onPaste,
y la misma agregarImagenes. El dialogo del sistema usa la lista ACEPTADOS
(png, jpeg, webp, gif) para no ofrecer lo que el server va a rechazar.

El input se limpia despues de elegir: sin eso, escoger el MISMO archivo
dos veces seguidas no vuelve a disparar onChange y parece que se ignoro.
El agente puso un logo en public/ y escribio bien el <img src="/logo.png">,
pero salia el icono de imagen rota. El archivo estaba donde debia y la
ruta era correcta: lo que fallaba era el ruteo del proxy.

Habia una lista blanca de lo que si va al preview (/@vite/, /src/,
/node_modules/, ...). Servia mientras el proyecto solo pidiera modulos,
porque Vite los inyecta con rutas absolutas desde la raiz del origen y no
se pueden reconfigurar. Pero public/ puede tener cualquier cosa -- una
imagen, un favicon, una fuente, un PDF -- y nada de eso empieza con un
prefijo conocido, asi que el navegador recibia el HTML de la Sala en vez
del archivo.

Es el tercer bug del mismo ruteo por la misma causa: el preview en blanco
(los imports ES no mandan Referer), el HMR que no llegaba (Vite abre su
WebSocket contra "/"), y ahora las imagenes. Cada uno se parcheo
agregando otra entrada a la lista.

Ahora la lista es al reves: se enumera lo de la SALA, que es nuestro y
solo cambia cuando lo cambiamos nosotros. Lo del preview no se puede
enumerar porque depende del proyecto que construya el agente.

Con una guarda que hacia falta: "/" siempre es la Sala. La cookie del
preview sobrevive en la pestana, asi que sin eso abrir Multi despues de
ver un preview te daria la app del proyecto.

demo:proxy-rutas (24/24) fija los tres casos historicos y el nuevo.
Tu pregunta destapo un choque real: /assets/ lo usan los dos. Ahi compila
el front de Multi, pero Rails y Phoenix tambien sirven los suyos ahi, asi
que un proyecto en Rails no habria podido cargar sus assets.

Se desempata con el referer: si la peticion viene de dentro del preview,
es del proyecto; si no, es de la Sala. El referer si llega en un <script
src> o un <link href>, que es como se piden los assets compilados -- el
que falta es el de los imports de modulos ES, y para esos esta la cookie.

Y de paso confirma lo que preguntabas. La lista blanca vieja era
literalmente de Vite (/@vite/, /src/, /node_modules/), asi que un
proyecto en Django pidiendo /static/css/main.css habria fallado igual que
la imagen. Con la lista invertida ya no depende del stack: Django, Next,
Remix, SvelteKit, Astro, Rails y un livereload cualquiera pasan sin que
el proxy sepa nada de ellos.

demo:proxy-rutas pasa de 24 a 32.
@ErickUser1
ErickUser1 merged commit 69b140f into main Aug 9, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants