Un protocolo bidireccional y agnóstico al transporte para la comunicación entre agentes de IA y superficies de renderizado. Un agente, cada pantalla.
Los agentes de IA producen salidas estructuradas — tablas, formularios, gráficos, mensajes de estado, bloques de código — pero el renderizado de esa salida está fuertemente acoplado al transporte y al framework de frontend. Un agente construido para un chat web no puede renderizarse en una aplicación de escritorio. Un agente detrás de un flujo SSE no puede servir a un cliente móvil que espera un protocolo diferente.
Cada nueva superficie de renderizado requiere código de integración personalizado.
ARP define un protocolo — no un framework, no una biblioteca. Igual que Wayland desacopló las aplicaciones de los servidores de pantalla, ARP desacopla los agentes de los renderizadores.
El agente decide qué mostrar. El renderizador decide cómo mostrarlo.
Agent (backend) Renderer (web, CLI, mobile)
─────────────── ──────────────────────────
Owns surfaces ── render / delta ──► Owns display
Owns UI state ◄── input events ──── Owns input routingtable con headers y rows — no HTML.Cada mensaje ARP es JSON con al menos { v: 1, type: "<type>" }.
| Tipo | Propósito |
|---|---|
hello | Negociación de capacidades al conectar |
delta | Fragmento de texto incremental |
tool_start | Ejecución de herramienta iniciada |
tool_end | Ejecución de herramienta finalizada |
render | Componente de UI generativa |
patch | Actualización incremental de componente |
error | Evento de error |
commit | Stream completo |
| Tipo | Tipo de Entrada | Propósito |
|---|---|---|
input | text | Mensaje de texto del usuario |
input | action | Clic de botón / acción de UI |
input | form_submit | Envío de formulario |
Todo renderizador conforme a ARP debe soportar al menos text. Los componentes declaran cadenas de respaldo — chart recurre a table, que recurre a text.
/_arp/v1import { ArpClient } from '@haira/arp'
const client = new ArpClient('ws://localhost:8080/_arp/v1', {
onDelta: (text) => appendToChat(text),
onRender: (event) => renderComponent(event.component, event.props),
onDone: () => markStreamComplete(),
})
client.connect()
client.sendText('Show me the sales data')import { ArpChat } from '@haira/arp-react'
function App() {
return (
<ArpChat
url="ws://localhost:8080/_arp/v1"
theme="dark"
title="Data Explorer"
/>
)
}También disponibles: @haira/arp-vue para Vue 3 y github.com/haira-lang/arp-go para backends en Go.
Todo servidor Haira habla ARP de forma nativa. Sin configuración necesaria.
import "ui"
tool query_database(query: string) -> any {
"""Executes a SQL query and displays results."""
rows, err = postgres.query(db, query)
if err != nil {
return ui.status_card("error", "Query Failed", conv.to_string(err))
}
return ui.table("Query Results", headers, rows)
}
agent DataExplorer {
provider: OpenAI
tools: [query_database]
ui: ui
}
@webhook("/chat")
workflow Chat(message: string, session_id: string) -> stream {
return DataExplorer.stream(message, session: session_id)
}Los nuevos componentes siguen un ciclo de vida de tres fases inspirado en Wayland:
x-vendor-names-name| Nivel | Componentes Requeridos | Objetivo |
|---|---|---|
| Mínimo | text + entrada de texto | Asistentes de voz, IoT |
| Básico | text, table, form, confirm, choices | Terminales CLI |
| Estándar | Todos los componentes del núcleo, modelo de objeto completo | Web / escritorio |
| Completo | Estándar + streaming, multi-superficie, subida de archivos | Aplicaciones web ricas |