# Chat móvil — Cursor Bridge

Guía operativa para `http://<EQUIPITELLO>:8095/` (Tailscale recomendado).

## ¿Necesito tener los chats abiertos en Cursor?

**No.** Los chats del IDE se guardan en disco:

`%USERPROFILE%\.cursor\projects\<slug>\agent-transcripts\<uuid>\<uuid>.jsonl`

El bridge los lista en **Historial** aunque no estén abiertos en Cursor.

| Requisito | Motivo |
|-----------|--------|
| **Cursor abierto en EQUIPITELLO** | El SDK local ejecuta el agente en el PC |
| **Bridge :8095 activo** | Token + Tailscale |
| **Historial → Continuar en móvil** | Para enlazar un chat del IDE (contexto en el prompt) |
| **Continuar sesión** (opcional) | Solo reutiliza el último agente SDK del móvil, no el panel de chats del IDE |

## Flujo recomendado

1. Abre el bridge en el móvil (`http://` explícito, no HTTPS).
2. Elige proyecto.
3. Para seguir un chat del IDE: **Historial** → tarjeta → **Continuar en móvil**.
4. Escribe en Chat. Las respuestas se añaden al `.jsonl` (reabre el chat en Cursor para verlos).

## Recomendaciones IA (tarjetas del gestor)

Al pulsar **Aceptar** en una recomendación:

- Se activa **Modo revisión** (cambios pendientes en pestaña Cambios).
- **No** se activa «Continuar sesión» (evita reanudar un agente SDK viejo que falla en silencio).
- El prompt incluye el preámbulo `MODO BRIDGE — REVISIÓN OBLIGATORIA`.

## Problema conocido: bucle / texto duplicado / ERR_CONNECTION_RESET

**Síntomas (móvil):**

- Mismo párrafo repetido en el chat.
- Consola: muchos `GET /api/chat/stream/...` y `ERR_CONNECTION_RESET`.
- Pestaña Tools: herramientas en `running` (p. ej. varios `read` del mismo `error.log`).

**Causas:**

1. **SSE inestable en móvil** — Tailscale/Safari cierra la conexión larga; al reconectar se reaplicaban eventos.
2. **Lectura de logs enormes** — `read error.log` puede bloquear el agente minutos.
3. **`CURSOR_MODEL=composer-2.5`** — fallaba vía SDK (usar `auto`).
4. **Reanudar sesión SDK** tras recomendación — agente muerto, respuesta vacía.

**Correcciones (v live7):**

- Móvil usa **polling** cada 2,5 s (sin depender del SSE).
- Reconexión desktop **reconstruye** el estado desde `/api/chat/jobs/:id` (sin duplicar texto).
- **Detener** cancela el run del SDK + libera el lock.
- Preamble: no leer logs completos; usar tail.
- Herramientas `running` > 2 min → estado `stale` + aviso.

## Detener agente / procesos bloqueados

| Acción | Dónde |
|--------|--------|
| **Detener** (barra superior) | Cancela el job activo del bridge |
| **⏹ Detener agente bloqueado** (Tools) | Igual; visible si hay tools `running` |
| **System Manager** | `:8095/manager` — matar PID / detener servicio Windows |
| **Liberar lock** | Si Detener dice que no hay agente pero el chat no envía: se llama a `POST /api/agent/force-release` automáticamente |

Tras **Detener**, espera 2–3 s antes de un nuevo mensaje.

## Modelo y rendimiento

En `cursor-mobile-bridge/.env`:

```env
CURSOR_MODEL=auto
```

Reinicia el bridge tras cambiar `.env`:

```powershell
.\cursor-bridge-manager.ps1 -Restart
```

## URLs

| Recurso | URL |
|---------|-----|
| Bridge | `http://100.78.198.98:8095/` |
| System Manager | `http://100.78.198.98:8095/manager` |
| Mission Control mock | `http://100.78.198.98:8095/mock/` |

## Verificación rápida

```powershell
# Health
Invoke-RestMethod http://127.0.0.1:8095/health

# Chat de prueba (desde PC con token)
# Debe devolver PUENTE_OK en ~15s
```
