
Al abrir la app eliges tu mundo y la carpeta donde trabaja tu equipo.
Imagina un equipo donde cada integrante es una IA. Tú hablas con el coordinador y él reparte el trabajo: uno programa, otro investiga, otro revisa. Todo pasa dentro de un mundo en pixel art donde ves quién está trabajando, quién está libre y en qué va cada quien.
ISyCo Worlds nació como fork de Munder Difflin, de Chaitanya Giri. Hoy es su propio producto: ISyCo Worlds 0.3v. Munder Difflin sigue disponible como mundo, con sus créditos.
ISyCo Worlds 0.3v es la primera versión del producto. La app de escritorio se usa de punta a punta: eliges mundo, carpeta y equipo, y el trabajo se ve en el mapa. Monster Village se recorre, se construye con clic y puede crecer. Quedan acabados menores: el Marketplace sigue en vitrina, el panel de GUS está en inglés y las apps de celular todavía llevan la piel de la oficina.
| 🌍 Elige tu mundo | Munder Difflin, la oficina original con Michael y su equipo, o Monster Village, donde el Profesor coordina a entrenadores y sus monstruos evolucionan al terminar trabajo. |
| ✦ GUS, tu guía | Un ayudante opcional que te explica qué está pasando y te propone qué agentes poner a trabajar. Nada se lanza sin tu aprobación. |
| 📱 Tu equipo en el celular | iPhone y Android: contesta preguntas, revisa el tablero y manda trabajo, protegido con Face ID, huella o PIN. |
| 🔗 Dos computadoras, un equipo | Tu laptop le pasa trabajo a la PC grande. Cada una tiene su coordinador y se ayudan. |
| 💬 ChatGPT como un compañero más | ChatGPT puede ver tu equipo y mandarle trabajo, con los permisos que tú le des. |
| 🛟 Se levanta sola si se cae | Si la app se cierra por error, se vuelve a abrir sin que hagas nada. |
| 🧠 No olvida al reiniciar | Cierras y abres la app, y cada agente sigue en su misma conversación. |
| 🗣️ En tu idioma | Español, inglés, chino, árabe y japonés. |
1. Instala un «cerebro» para tus agentes. La app no trae IA propia: usa la que ya tienes. Lo más fácil es Claude Code. También sirven Codex, Gemini, OpenCode, Copilot y otros.
2. Baja ISyCo Worlds 0.4v. ISyCo Worlds 0.4v incluye builds de GitHub Actions para Windows, Linux y macOS. El instalador de Windows y el AppImage de Linux pasan pruebas de instalación y arranque en CI.
| Tu computadora | Qué buscar en la release |
|---|---|
| 🪟 Windows | el instalador .exe o la versión portable |
| 🐧 Linux | el .AppImage o el .deb |
| 🍎 Mac | el .dmg |
Si la página todavía no muestra el instalador de tu sistema, clona la etiqueta
v0.4y arranca connpm installynpm run dev.
3. Ábrela. Eliges idioma, tu mundo y la carpeta donde trabajará tu equipo, y tocas Entrar a este mundo. Luego toca agregar agente y listo.
💡 Abre la app una sola vez. Si la abres dos veces, la segunda copia se cierra sola para no pelearse con la primera.
Arriba tienes cuatro botones:
| Botón | Para qué es |
|---|---|
| Mundo | Tu mundo con tu equipo. Abajo están las tarjetas de cada agente; a la derecha, el Centro de comando (terminal, tareas, preguntas, historial, memoria…) y el Registro del mundo: cuántos compañeros hay, cuántos trabajan y cuántos necesitan tu atención. |
| Configuración ▾ | Todos los ajustes, a un clic: agentes y modelos, Enlace entre mundos, voz, memoria y Mundos. |
| Marketplace | Próximamente: aquí vas a encontrar extensiones y nuevos mundos. Por ahora solo es la vitrina y lo dice claro. |
| ✦ GUS | Abre a tu guía (ver abajo). |
Cambiar de botón no detiene a nadie: tus agentes siguen trabajando aunque estés viendo otra cosa.
Cada mundo es una forma distinta de ver y organizar a tu equipo. Cambias de mundo en Configuración → General → Mundos: la app se reinicia en el mundo elegido y tu carpeta de trabajo sigue siendo la misma.
| Mundo | Cómo es |
|---|---|
| Munder Difflin | La oficina original de Chaitanya Giri: Michael coordina y el equipo trabaja en sus escritorios. |
| Monster Village | Empieza en Starter Village. El Profesor coordina, tus agentes son los siete entrenadores y sus monstruos evolucionan al terminar trabajo. En Explorar recorres la aldea. En Construir eliges una pieza y la pones con un clic. Wider, Taller y Expand agrandan el mapa. La rueda hace zoom y Fit vuelve a mostrar la ciudad entera, sin barras de desplazamiento. |

Monster Village con el panel de GUS abierto.
Cada mundo dice quién lo hizo. En Configuración → Mundos ves los créditos del mundo elegido: autor, licencia, código fuente, de qué obra viene y de quién es su arte. Cualquier mundo nuevo, incluidos los que lleguen por el Marketplace, tiene que traer esos créditos o no entra.
GUS es un ayudante opcional. Le cuentas qué quieres hacer («mantener un repo, investigar bugs y preparar PRs») y él:
- te explica qué está pasando en tu mundo;
- te propone qué agentes poner a trabajar y con qué papel;
- te sugiere qué mundo encaja mejor con lo que haces.
Tú decides siempre. GUS solo propone: ningún agente se lanza ni se cambia de mundo sin que lo apruebes.
Cómo activarlo: toca ✦ GUS, elige un proveedor (NVIDIA NIM, que puede tener acceso gratuito, OpenAI o Anthropic), un modelo y pega tu API key. La llave se guarda cifrada en tu equipo, la usa solo GUS y tus agentes no la heredan. Si no quieres usarlo, toca Skip for now.
Por ahora el panel de GUS está en inglés, aunque elijas otro idioma.
Tu coordinador te hace una pregunta y no estás en la compu. Contéstale desde el celular y tu equipo sigue trabajando. La app móvil se conecta a Worlds. En 0.3v el escritorio ya es el producto; el celular sigue con la piel de la oficina y los nombres MunderMobile de algunos instaladores.
Las tres primeras son del simulador (modo demo); la última es un iPhone 12 real conectado por Tailscale.
| Pestaña | Qué haces ahí |
|---|---|
| Oficina | Ves si tu coordinador está ocupado, cuántos agentes están libres y le escribes a él o a cualquiera del equipo. Arriba puedes cambiarte a tus otras computadoras. |
| Preguntas | Contestas lo que te preguntaron. Tu coordinador lo recibe al instante. |
| Tablero | Tareas bloqueadas, en curso, por hacer y terminadas. |
| Enlace | Tus otras oficinas y a dónde se conecta el celular. |
Si alguien toma tu celular, no puede ver tu oficina ni hacer cambios:
- La app abre bloqueada y pide Face ID (o el código del iPhone).
- Si la dejas en segundo plano más de un minuto, se vuelve a bloquear.
- Mandar algo, contestar, delegar o borrar vuelve a pedir Face ID.
- Munder nunca ve tu cara ni tu código: el iPhone solo le dice «sí es el dueño» o «no».
- Baja la app: en Releases descarga
MunderMobile-unsigned.ipa. Para la versión más nueva, en Actions → iOS (Munder Mobile) abre la última corrida en verde demainy descarga MunderMobile-unsigned-ipa. - Instálala en tu iPhone con iloader y tu Apple ID gratuito (también sirven SideStore o AltStore).
- Confía en la app: en el iPhone, Ajustes → General → VPN y administración de dispositivos, y activa el Modo de desarrollador si te lo pide.
- Prende el enlace en la computadora: en la app, Configuración → Enlace entre mundos → Encender. Ahí mismo, en Celulares, aparece la dirección para el iPhone.
- Empareja: escribe esa dirección en la app, toca Emparejar y en la computadora acepta el código de 6 dígitos solo si es el mismo que ves en el celular.
🌎 ¿Fuera de casa? Instala Tailscale en la computadora y en el iPhone, y usa la dirección de Tailscale (la que empieza con
100.). La app aprende las dos direcciones y usa la que conteste: la de tu red en casa y la de Tailscale en la calle.
⏳ Con un Apple ID gratuito la app dura 7 días. Luego la vuelves a firmar con iloader y sigue funcionando con tu mismo emparejamiento.
Guía completa: ios/MunderMobile/README.md. ¿Sin iPhone? También hay una versión web que se instala desde el navegador: tools/munder/LINK.md.
La misma app del iPhone, como APK nativo (Kotlin + Compose). No es otra forma de conectarse: el celular es solo un sustrato y los dos pasan por los mismos procesos — mismos ops (overview peers answer ask delegate panel.state panel.action), misma autoridad, mismos bytes cifrados (munder-remote@1) y la misma cara pixel-art con el elenco.
Las cuatro son del CI en JVM con la oficina demo; las 18 capturas (incluidos modo oscuro, bloqueo y arranque de cada pestaña) están en docs/isyco/mobile/android/.
Trae una pestaña más que el iPhone no tenía al principio: Panel. Desde ahí abres y cierras la app, prendes y apagas el enlace, enciendes GPT y manejas el revividor — los mismos botones del Panel de escritorio, ejecutando lo mismo. Eso sí: emparejar no da ese poder; se concede en la computadora con worlds link panel <celular>.
Igual que en el iPhone, pero con lo de Android:
- La app abre bloqueada y pide tu huella o el PIN.
- Si la dejas en segundo plano más de un minuto, se vuelve a bloquear.
- Mandar algo, contestar, delegar, tocar el Panel o borrar vuelve a pedir que seas tú.
- La llave de sesión vive en el Keystore cifrado del aparato. Worlds nunca ve tu huella ni tu PIN.
- Baja el APK: en Releases descarga
MunderMobile-debug.apk. Para la versión más nueva, en Actions → Android (Munder Mobile) abre la última corrida en verde demainy descarga MunderMobile-debug-apk. - Instálalo en tu Android (permite instalar de fuentes desconocidas).
- Prende el enlace en la computadora: en la app, Configuración → Enlace entre mundos → Encender.
- Empareja: escribe la dirección en la app, toca Emparejar y en la computadora acepta el código de 6 dígitos solo si es el mismo que ves en el celular.
🌎 ¿Fuera de casa? Igual que el iPhone: instala Tailscale en la computadora y en el Android, y usa la dirección de Tailscale (la que empieza con
100.).✅ En Android la app no caduca: no hay que firmarla cada 7 días como en el iPhone.
🔜 Las próximas releases traerán el APK firmado siempre con la misma llave, para que cada versión se instale encima de la anterior. Si hoy tienes el de pruebas (
debug), la primera vez tendrás que instalar el nuevo como una app aparte y volver a emparejar.
Guía completa: android/MunderMobile/README.md.
¿Tienes una laptop y una PC con más RAM? Enlázalas y tu coordinador le pasa trabajo al de la otra, por tu red de casa o por Tailscale. Ninguna toca los archivos de la otra: la tarea le llega al otro coordinador y él decide cómo hacerla.
Cómo: en las dos computadoras, Configuración → Enlace entre mundos → Encender → Buscar. Elige la otra, confirma que el código de 6 dígitos sea igual en las dos pantallas, y listo.
Todo lo que viaja entre oficinas va cifrado y firmado.
Conecta ChatGPT y pídele cosas como «dile a Michael que revise las pruebas» o «¿qué está haciendo la computadora del Xeon?».
- Tú decides cuánto puede hacer: solo ver, ver y pedir, o todo.
- Cada conexión la apruebas tú con un código, y la quitas cuando quieras.
- Todo queda anotado a nombre de ChatGPT, para que sepas qué hizo.
Cómo conectarlo: tools/munder/GPT.md.
Un ayudante chiquito que vive junto a la app:
- Si la app se cae, la vuelve a abrir. Lo intenta unas cuantas veces y, si no puede, te avisa en vez de insistir para siempre.
- Si la cerraste tú, lo respeta y la deja cerrada.
- Desde el celular o ChatGPT puedes preguntar «¿está viva?» y levantarla, aunque esté totalmente caída.
Cómo activarlo: tools/munder/REVIVER.md.
- 🧰 Oficinas listas para tu negocio. Arranca con un equipo ya armado para servicios del hogar, servicios profesionales, restaurante, tienda o consultoría.
- 📄 Tus agentes leen tus documentos. Word, Excel, PowerPoint y PDF. Si un archivo no se puede leer, te lo dicen en vez de inventar.
- 🧑🎨 Ponte tú en la oficina. Describe tu personaje («piel morena, blusa rosa, gafas») y entra al piso de Munder Difflin en pixel art como uno más del equipo.
![]()
Personajes creados solo con una descripción.
| Pasa esto | Prueba esto |
|---|---|
| La app se cierra sola al abrirla | Ya hay otra copia abierta. Búscala en tu barra de tareas y usa esa. |
| El celular dice «No alcanzo la oficina» | En la computadora, Configuración → Enlace entre mundos debe estar encendido. Revisa que los dos estén en la misma red Wi-Fi, o los dos con Tailscale prendido. |
| El celular dice que la hora no coincide | Activa la hora automática en el celular y en la computadora. |
| El celular dice que ya no lo reconocen | Lo olvidaron en la computadora. En la app toca Olvidar en este celular y vuelve a emparejar. |
| La app del iPhone dejó de abrir | Pasaron los 7 días del Apple ID gratuito: fírmala otra vez con iloader. |
| No encuentra la otra computadora | Usa Tailscale en las dos, o pídele a quien sepa que abra los puertos 47831 y 47832 en el firewall. |
| Un agente empezó una conversación nueva | La primera vez después de actualizar es normal. A partir de ahí, cada reinicio retoma la misma conversación. |
| Cambié de mundo y la app se reinició | Es normal: cada mundo tiene su propio equipo. Tu carpeta de trabajo y los datos del otro mundo se conservan. |
| GUS no contesta | Revisa en ✦ GUS que la API key sea válida para el proveedor elegido. Si falla, solo GUS se detiene: tu mundo y tus agentes siguen igual. |
⌨️ Para quien usa la terminal: el comando worlds
Todo lo de arriba también se hace desde la terminal. Instálalo una vez con ./tools/munder/install.sh.
| Quiero… | Comando |
|---|---|
| Abrir, cerrar o reiniciar la app | worlds start · worlds stop · worlds restart |
| Ver si está corriendo y sus logs | worlds status · worlds logs -f |
| Ver o armar el equipo | worlds sesion ver · worlds sesion armar |
| Oficina lista para tu giro | worlds sesion packs · worlds sesion armar --pack retail-shop |
| Enlazar otra computadora | worlds link conectar |
| Dirección para el celular | worlds link encender · worlds link celular |
| Aceptar un celular | worlds link aceptar <código> |
| Mantener Worlds disponible | worlds reviver init · worlds reviver instalar |
| Conectar ChatGPT | worlds gpt perfil full · worlds gpt encender · worlds gpt aprobar <código> |
| Mandar una tarea a un harness externo | worlds harness run <adaptador> "tarea" --cwd <carpeta> |
| Crear un avatar | worlds avatar compilar "descripción" |
Desde el código: git clone, npm install y ./start.sh (Node 18+ y herramientas de C++). Detalle en tools/munder/README.md.
Para desarrolladores: todo lo que cambia este fork, con detalle técnico
Selector de idioma en el onboarding (en/es/zh-CN/ar/ja). El inglés sigue siendo el idioma por defecto: nada cambia hasta que eliges otro en Settings. es.json está completo, en Title Case y sin artefactos de traducción automática. ja.json salió del loop de IntentLang: el pipeline M0–M4 (roundtrip 100%) aporta la capa de diccionario y el resto está escrito a mano — mismo veredicto que es y ar cuando la prosa del materializador sale en ensalada.
Canal solo de loopback, con un token 0600 guardado en userData. Rutas: worlds ctl ping, GET /salud, GET /sesion, POST/DELETE /sesion/agentes, y repintado bajo demanda sin reiniciar. Sin token se rehúsa, y nada de este puerto sale de la máquina.
Arregla el congelamiento «Detenido»:
- Electron se despega de la terminal con
setsid, y su salida va a~/.local/state/munder-difflin/run-*.log. - Sin terminal de control, el job control ya no le manda
SIGTSTP. - Si falla la GPU, reintenta con renderizado por software.
- Guardia singleton por userData;
--fges solo para depurar.
Ver ./start.sh --check.
- Router caído: si hay outbox encolado y el router murió, el beat de 8 s lo rearma y drena (peor caso ~9.5 s, log
router-supervise). - Eventos sin
tool_input(Pi bridge, plugin OpenCode): ya no cuentan como loop idéntico. Las reglas de velocity, error-storm y no-progress siguen igual.
Ver docs/delivery-reliability-decision.md.
useCanvasRepaintrepinta los retratos 2D después de que muere el proceso de GPU (heartbeat de 30 s, más focus/visible).terminal:openAtFolderabre tu terminal (gnome-terminal > ptyxis > konsole > …) en vez delopen -ade macOS.
- Harness: botón «create new config» en HivePicker, homes anidados en fresh mode,
.gitignoreautomático en cada home, y sesiones paralelas con--user-data-dir. - Avatares: son procedurales y comparten motor entre la app y el CLI (
composeAvatar,AVATAR_VOCAB). El mismo texto da el mismo PNG, sin drift.
modelCatalog.jsontrae la familiaopenisy.mcpCatalog.tstraeoffice-bridge(stdio local, conHIVE_ROOTinyectado) y sus herramientas:compose_submit/task_get/task_message/task_cancel/office_status.
Guía sin rutas personales en src/mcp/office-bridge/GUIA.md.
El CLI público es worlds; el lanzador munder se conserva como alias histórico de compatibilidad. tools/munder/munder es Node puro, sin dependencias. Comandos: start / stop / restart / status / logs -f, sesion ver / armar / quitar / proveedor / packs, ctl ping / repaint, avatar compilar / inspect / inyectar, link …. Receta de avatares para modelos en tools/munder/AVATAR_AGENTES.md.
- Cómo entra:
firstFreeCharacter()elige un slot libre (nuncamichael, que es del GOD) einjectAvatarAs()le inyecta tu receta e invalida sus cachés. - Qué no cambia: el comportamiento y el hitbox (la clase
Characteres genérica). Las líneas de diálogo son las del slot prestado. - Persistencia:
worlds avatar inyectar … --slot autoguarda la receta enavatar-overrides.json, y la app la aplica al arrancar.
- Delegación: el peer nunca toca tu hive ni tus PTYs. Deja la tarea en el inbox de tu Michael, en formato Office Bridge.
- Seguridad de cada llamada: firmada con Ed25519 y cifrada con X25519 + AES-256-GCM, con anti-replay y
reque liga cada respuesta a su petición. - Emparejamiento: código SAS de 6 dígitos (sas@2, que incluye las llaves de cifrado).
/pairtiene rate limit, y el descubrimiento UDP solo contesta a IPs privadas. - Respuestas: las tareas externas se marcan
link.external;origin_refenruta las respuestas de vuelta.
Guía: tools/munder/LINK.md.
- Qué es: un servidor MCP local (
src/mcp/munder-chatgpt-link/) que verifica peer + ruta (loopback, misma LAN o Tailscale) antes de cada llamada. Expone 7 herramientas:verify/peers/status/submit/get/message/cancel. selfcontrapeers:munder_link_peersdevuelveselfaparte depeers, ymunder_office_status("self")lee esta máquina directo, sin red. Delegar aselfrespondeself_not_a_peer.- Probado end-to-end (2026-09-25): chatgpt.com → fachada → link por LAN → Michael remoto.
compose_submitllegóacceptedcon recibo (task-1790331110686-46d4bbdb, same_lan vía wlo1, 22 ms). - Túnel: cada quien levanta el suyo con
chatgpt-tunnel.sh. Tu URL es pública y de vida corta, y la de otra persona no te sirve a ti.
- Mismo motor que el CLI:
src/main/linkPanel.tses una capa delgada sobrelib-link.cjs, con la misma identidad, los mismos peers y el mismo archivo pid. Lo que prendes en la app lo apagas en la terminal, y al revés. - Sin llaves en la pantalla: el renderer nunca maneja llaves; solo un token de un uso que emite el proceso principal.
- Guardia del hive: un hook
PreToolUseniega losWrite/Edit/MultiEdit/NotebookEditfuera de lo que le toca a cada agente: sumemory.md, su inbox/outbox ytasks.json; el GOD ademásboard.mdyspawn-requests/. - Piso de versión: si pides un modelo más nuevo que tu Claude Code (Opus 5.5 pide 2.1.280+), arranca con el más nuevo que tu CLI soporta.
Plantillas core más cinco giros. Las de packs importados limitan a «pedir permiso» todo lo que envía, publica, paga o borra.
- La base de conocimiento convierte Word/Excel/PowerPoint/PDF fuera del proceso main, en vez de indexar bytes como texto.
- Si no puede leer un archivo, lo dice en lugar de guardar basura.
- Los agentes tienen
doc-textpara leerlos.
Cada push compila y corre la suite en los tres sistemas. Encontró un bug real: en Windows, borrar un worktree podía seguir el junction de node_modules hasta el checkout principal. Hoy un test con un must-survive.txt lo vigila.
- PWA: el daemon de Link sirve la app web en
/appy su API sellada en/remote/v1/*, entools/munder/lib-remote.cjs. - Emparejamiento commit-reveal: el nonce del celular va comprometido antes de ver el de la oficina, así nadie en medio puede probar nonces hasta que coincidan los códigos.
- Llamadas: ChaCha20-Poly1305 bajo X25519 + HKDF, con hora y anti-replay.
- Criptografía de la PWA: va en JS puro (
remote-app/remote-crypto.js) porque el navegador no da WebCrypto porhttp://. Los tests la comparan byte a byte con Node. - App iOS nativa:
ios/MunderMobile/implementa el mismo protocolomunder-remote@1en SwiftUI, guarda las llaves en el Keychain y prueba las direcciones LAN/Tailscale de la oficina. - App Android nativa:
android/MunderMobile/es el gemelo del iPhone en Kotlin + Compose — mismos ops, misma autoridadOP_AUTHORITY, mismos bytes (BouncyCastle en vez de CryptoKit), Keystore en vez de Keychain y BiometricPrompt en vez de Face ID. La red va enDispatchers.IOy elapplicationIdes el mismo bundle (mx.isyco.munder.mobile). - Generado y verificado:
scripts/make-assets.cjsproduce retratos, icono, vectores y fixtures; el CI falla si quedan viejos y los tests del simulador comparan los bytes con la oficina.android/.../scripts/check-assets.cjsexige que el APK lleve copias byte por byte y la misma listaPANEL_OFF. - Capturas reales: el job
Simulator screenshots (demo office)publica las pantallas del iPhone en el artifact y las copias de referencia quedan endocs/isyco/mobile/ios/. El jobScreenshots (Roborazzi, demo office)hace lo mismo con Android en JVM — sin emulador, porque los runners hospedados no tienen KVM ni HVF — y las copias quedan endocs/isyco/mobile/android/. - Dónde viven los celulares: en
remotes.json, nunca enpeers.json. - Operaciones:
overview,peers,answer(igual que ASK ME),askydelegate, más el estrato Panel (panel.state,panel.action).
- Independiente:
tools/munder/lib-reviver.cjsusa solo builtins de Node y tiene su propia llave y sus propios clientes. No necesita a Munder, Link, el hive ni Electron. - Sano = cuatro pruebas: el proceso del destino configurado,
/saludcon el token de ese arranque, el mismo pid y eloffice_idfijado. Para eso/saludahora dicepid,versionyoffice_id. - Sin shell: solo
status,start,restartystop. El destino vive enconfig.json. - Protocolo: Ed25519 en los dos sentidos, con nonce de un solo uso, ±60 s de hora y la petición atada al reviver y a la oficina.
- Para solo lo que es suyo:
- fuerza únicamente al proceso principal y a sus helpers
--type=; - nunca toca el daemon de Link, la terminal de un humano ni un
opencodeajeno; - ante la duda, falla cerrado.
- fuerza únicamente al proceso principal y a sus helpers
- Watchdog acotado: 3 intentos en 10 min, con espera entre ellos, y luego un estado
failed. Distingue un cierre limpio de una caída. - Instalación: systemd
--userconKillMode=process; en Windows, tarea al iniciar sesión conRestartOnFailure. - ChatGPT: un conector MCP aparte (
reviver-mcp.cjs,chatgpt-tunnel.sh --reviver) con el mismo filtro de red quemunder-chatgpt-link.
- Autoridad: ChatGPT es un principal de Munder con perfil
lectura,operadorofull. Cada permiso tiene el perfil actual como tope, caduca y se puede revocar. - OAuth 2.1 con builtins de Node:
- registro dinámico;
- PKCE S256;
- aprobación del operador en la terminal con un código de 6 dígitos;
- tokens guardados solo como hash;
- refresh que rota.
- Probado contra el cliente OAuth oficial del SDK de MCP.
- Buzón:
"to": "gpt"se entrega en<hive>/gpt/inboxsolo siworlds gptlo creó; si no, rebota como antes. - Inventario: clasifica cada operación de Remote, Link, el canal de control y el Reviver. Un test lee esas fuentes y falla si aparece una sin clasificar.
- Link intacto: por Link, GPT es un peer y solo ve lo que esta oficina delegó.
- Una sola Configuración:
components/globalNavModel.tstiene la lista de secciones que pintan el menú ySettingsModal; el menú abre el mismo modal en esa sección. - Marketplace como capa: se pinta encima del piso sin desmontarlo; terminales y agentes siguen vivos. Sin catálogo todavía (
MARKETPLACE_CATALOG_CONNECTED = false). - Accesible: botón de menú ARIA con teclado completo; densidad por ancho (≥1180 / 900–1179 / <900 px). Auditoría y capturas en
docs/ui-shell/.
- El plugin puente reporta el
session_idraíz (nunca el de un subagente) yhive.recordSessionlo guarda. - Los presets usan
--session <id>, pero solo si la sesión sigue enopencode.dbo en el storage JSON; si no, arranca limpio en vez de morir con «Session not found». opencode.json/tui.jsondel agente se fusionan (mergeJsonFile), ya no se reescriben con solo el tema.
- ATS: solo
NSAllowsArbitraryLoads. ConNSAllowsLocalNetworkingpresente, iOS 10+ ignora la primera y bloqueaba las IP de Tailscale (100.64.0.0/10).test/ios-ats.test.cjslo vigila; el contenido ya va cifrado porRemoteCrypto. - Bloqueo:
AppLockyLockPolicyenMunderMobileCore, con.deviceOwnerAuthentication(Face ID con el código de respaldo). Bloquea al abrir y tras 60 s en segundo plano; reautentica cada acción que cambia la oficina fuera de una ventana de 30 s; tapa la captura del selector de apps. Un iPhone sin código abre con aviso.
- El celular ya es un cliente del estrato del Panel, no un clon:
panel.stateypanel.actionviajan por el mismo sellomunder-remote@1y ejecutan los mismos motores (lib-panel.cjsACTIONS) que los botones de escritorio. Un solo protocolo, y la app nativa no reimplementa la oficina: la pide. - El código de emparejamiento no abre la computadora. Da la oficina (tablero, preguntas, la gente). Los ops que tocan el host llevan clase de autoridad
machiney se niegan conno_authorityhasta que alguien en la máquina lo concede:worlds link panel <celular>(o el botónlink.phoneAuthoritydel Panel, que es de escritorio y no está en el set del celular — un teléfono no puede ampliarse su propia autoridad).--quitarla devuelve. - Por clase de autoridad y no por lista:
app.restartapaga tu Munder ygpt.approveautoriza un agente. Compartir credencial conanswerhabría convertido el teléfono en control remoto de la máquina con la misma llave que usa para leer el tablero.OP_AUTHORITYes fail-closed: un op sin declarar se trata comomachine. - Techo medido, no supuesto:
panel.statepesa 0,5% del límite de 256 KiB en una oficina viva y 17,8% en el peor caso construido con formas reales (100 peers, 50 celulares, 200 grants). Ningún op necesita paginación todavía.ARG_MAXdeclara el tope de cada argumento en el camino del celular, porque el Panel de escritorio no tenía ninguno. shortcut.installylink.phoneAuthorityquedan fuera del celular (PANEL_OFF): escriben en una pantalla que el teléfono no ve, y el segundo sería circular.
worlds harnessentrega una tarea acodex exec(JSONL) o a cualquier agente ACP v1, como DeepSeek Harness (dsh --profile acp), con selección explícita y sin ruteo.- Worlds decide el veredicto, mide los artefactos con git, escribe el recibo, borra secretos por nombre, forma y valor, y corta la recursión con
MUNDER_HARNESS_CHAIN. - Contrato en
tools/munder/HARNESS_CONTRACT.md; auditoría entools/munder/EXTERNAL_HARNESS_AUDIT.md.
WORLD_IDS(src/shared/worlds.ts) es una lista cerrada: un id guardado nunca elige código arbitrario del renderer.- Cada mundo es un perfil de capacidades con su propio hive y runtime; cambiar de perfil reinicia el harness con confirmación y conserva los datos del perfil anterior. El espacio de trabajo es compartido.
- La parte visual corre en un
WebContentsViewaparte (sandbox,contextIsolation, sin Node, preload mínimoworldHost.ts), supervisado porWorldPresentationSupervisor: se puede reiniciar sin tocar el hive, las PTY ni la sesión. Niega ventanas nuevas y navegación. - La pantalla de inicio unificada (
startup/WorldStartScreen.tsx) elige mundo y espacio de trabajo antes de entrar.
- Vive en el proceso main (
worldHelperHost.ts) y se dibuja en su propioWebContentsViewsandboxeado, encima del mundo, con CSP propia y sinunsafe-eval. Cada IPC del overlay verifica que el remitente sea esa vista. - Proveedores: NVIDIA NIM, OpenAI y Anthropic, con streaming SSE. La API key se guarda en el almacén de secretos de integraciones y nunca cruza al renderer ni a los logs.
- El texto que llega en streaming no tiene autoridad: solo una respuesta completa que valida contra el esquema cerrado crea una propuesta, y lanzar trabajadores exige aprobación explícita. Contrato del rol en
src/main/agents/gus.md.
src/shared/worldManifests/<id>.world.json: autor, licencia, código fuente,derivedFrom, assets con licencia yredistribution, y avisos. Validador puro ensrc/shared/worldManifest.ts.test/world-manifest.test.cjsexige que cada archivo deassets/{tilesets,maps,worlds}/esté reclamado por un manifiesto y que elnamecoincida con la etiqueta de la app en los 5 idiomas. Formato endocs/worlds/MANIFEST.md.
- Android:
assembleReleasefirmado con la llave de Secrets y verificado conapksignercontravars.ANDROID_SIGNING_CERT_SHA256; sin secretos, el job falla en vez de publicar otra firma. Un testigo con llave desechable corre en cada PR que toca Android. - Apple:
CSC_LINKse escribe enGITHUB_ENVcon delimitador multilínea (scripts/github-env.cjs). Configuración endocs/release-signing/README.md.
- Identidad del proyecto:
originpublica en DannyBaanks/ISyCo-Worlds; el upstream de origen es chaitanyagiri/munder-difflin. Munder Difflin conserva su crédito como mundo de origen. - Sin llaves en el repo. Solo hay placeholders (
xoxb-...) en docs y comentarios. avatar-engine.cjsno se edita a mano. Se genera desdeportraitArt.tsconnode tools/munder/sync-avatar-engine.cjs, y la suite verifica su hash.- Tests:
npm run test:focused(los mismos en los tres sistemas)node --test tools/munder/link.test.cjs tools/munder/remote.test.cjs tools/munder/avatar.test.cjs tools/munder/reviver.test.cjs tools/munder/gpt.test.cjs tools/munder/harness.test.cjsnode --test test/world-manifest.test.cjs(procedencia de los mundos)npm run typecheck
- Gate de release:
node tools/check-release-links.cjs --livecomprueba que cada descarga anunciada exista de verdad.
El código es MIT; ver LICENSE. ISyCo Worlds nació como fork de Munder Difflin de Chaitanya Giri, también MIT, y conserva su aviso de copyright.
Cada mundo trae su propio manifiesto con autor, licencia y créditos de su arte (docs/worlds/MANIFEST.md), y la app los muestra en Configuración → Mundos:
- Munder Difflin: mundo original de Chaitanya Giri. Sus tilesets son Modern Interiors - RPG Tileset [16X16] de LimeZu, con licencia Complete Version que exige crédito, prohíbe redistribuirlos como assets y no está cubierta por el MIT; ver
LICENSE-ASSETS. Los mapas vienen de shahar061/the-office (ISC). Los personajes son procedurales y propios del proyecto. Es una parodia afectuosa, sin fines de lucro y sin afiliación con NBCUniversal, The Office ni Dunder Mifflin. - Monster Village: mundo y arte originales de DannyBaanks (ISyCo), MIT; detalle en
src/renderer/src/assets/ATTRIBUTION.md. Sin afiliación con Pokémon, Nintendo, Game Freak ni The Pokémon Company.










