
Conectar DeepSeek Harness a Buzz: Pasarela de Nostr
Integre DeepSeek Harness con Block Buzz mediante un puente Nostr. Configure auth NIP-42, streaming de mensajes in situ y espacios de trabajo para agentes IA.
Índice de contenidos

El plugin de DeepSeek Harness (DSH), dsh-message-gateway, extiende el asistente de DeepSeek Harness a múltiples plataformas de mensajería como Discord, Telegram y WeChat. El repositorio del plugin fue bifurcado y ampliado para incorporar la plataforma Cómo autoalojar Buzz de Block: Espacio de trabajo para agentes IA a la lista. El repositorio bifurcado está disponible en GitHub en https://github.com/Tech-Voyage-Dev/dsh-message-gateway.

Guía de requisitos previos
Cómo autoalojar Buzz de Block: Espacio de trabajo para agentes IA
Aprenda a autoalojar el relay de Buzz en un VPS con Ubuntu detrás de Cloudflare. Crea un espacio de trabajo seguro donde humanos y agentes de IA colaboran.
12 MIN DE LECTURAEl asistente de DSH se une a un relay de Buzz como miembro, recibe mensajes directos (DM) y mensajes de canal en los que se le @menciona, y responde mediante el mismo pipeline de agentes por chat que utiliza la interfaz web.
Arquitectura del plugin dsh-message-gateway
La arquitectura del plugin dsh-message-gateway se divide en dos componentes principales:
- Host (Node):
gateway-store(credenciales,~/.dsh/gateway.json),platforms.ts(definiciones de plataformas y pruebas de conectividad),routes.ts(endpoints/gateway/*) ybridge-manager.ts(los puentes residentes: sesiones de agentes independientes por chat y respuestas en streaming). - Cliente (navegador): la página "Message platforms" en la barra lateral, donde se guardan credenciales, se prueban conexiones y se monitoriza el estado del servicio.
Añadir una nueva plataforma implica los siguientes pasos:
- Una clase de puente (bridge): métodos
start/stop/statusjunto con un callbackonText(text, frame), reflejando la estructura dewecom-bridge.ts. - Conexión en bridge-manager: reutilizar el pipeline por chat existente (
ensureAgentForKey+pendingMap) e integrar el receptor de respuestas de la plataforma. - Persistencia y rutas: en
/gateway/savey/gateway/delete: guardar credenciales inicia el puente, eliminarlas lo detiene, además de una banderaautoStartXxxpara quedsh webreconecte automáticamente al arrancar.
Implementación del puente Buzz: Protocolo Nostr y ciclo de vida de eventos
Se utilizó DeepSeek Harness para implementar el puente hacia Buzz. La implementación se ajusta a las siguientes especificaciones del protocolo Nostr:
| Transporte | Un WebSocket autenticado mediante NIP-42; por defecto ws://localhost:3000; http(s):// se normaliza a ws(s):// |
|---|---|
| Autenticación | Evento AUTH kind 22242, etiquetas [["relay", url], ["challenge", challenge]], contenido vacío, firmado con la clave privada del agente |
| Suscripciones | Por canal: REQ {"kinds":[9], "#h":[<uuid>]} — un REQ por canal. Un REQ global kinds:[9] recibe EOSE pero nunca difunde eventos; el filtro #h con múltiples valores no funciona |
| Descubrimiento | REQ {kinds:[39000]} histórico para metadatos de canal (type == "dm" identifica canales de mensajes directos) |
| Membresía | REQ {kinds:[44100,44101], "#p":[nuestra pubkey], since: now-60s} en tiempo real — 44100 = añadido, 44101 = eliminado, portando p+h; actualiza suscripciones sin reconectar |
| Eventos de chat | kind 9 con etiquetas ["h", canal], opcional ["e", replyTo], ["p", mención] |
| Ediciones in situ | kind 40003 con h + e→objetivo; sustituye contenido; límite de 64 KB en relay → mantener payloads ≤ 60.000 B; respuestas grandes se fragmentan — el fragmento 0 viaja en la edición y los sobrantes se añaden como mensajes kind 9 en hilo (e→raíz) |
| Tramas CLOSED | auth-required antes de AUTH es normal durante el arranque (completar AUTH y reabrir subs); tras AUTH → reintento delimitado (3 intentos, backoff 0/1/2 s); reconectar reconstruye todo |
| Límites de relay | ≤ 2000 eventos históricos por suscripción, ordenados del más reciente al más antiguo incluso usando since |
| Control de menciones | Procesa kind 9 entrantes solo cuando: (a) la etiqueta p incluye nuestra pubkey, (b) el canal es DM, o (c) la raíz e es nuestro propio evento. Ignora nuestra pubkey (anti-bucle) |
| Menciones salientes | El texto saliente se publica tal cual — el relay no valida tokens @; las etiquetas p incluyen al autor entrante más hasta 7 pubkeys adicionales mencionadas (máx. 8) |
| Mensajes directos | Canales de texto plano delimitados al relay (metadatos type: "dm") — sin cifrado NIP-04/44 en este puente |
| Archivos adjuntos | NIP-92 imeta (url, sha256, m) → descarga http(s) estándar, verificación de SHA-256, límite de 20 MB, máx. 4 por mensaje; las imágenes salientes no están soportadas |
El siguiente diagrama ilustra el proceso de inicialización (bootstrap) del puente hacia Buzz:

Streaming en tiempo real mediante ediciones in situ de Nostr (Kind 40003)
Nostr no cuenta con indicador nativo de escritura y sus eventos son de solo adición. Para ofrecer una experiencia interactiva y dinámica, el puente de Buzz simula streaming mediante ediciones in situ:

- El puente de Buzz publica primero un evento marcador de posición
kind 9, luego lo reescribe progresivamente con ediciones in situkind 40003limitadas por frecuencia, y finalmente asienta la edición definitiva cuando el agente concluye su respuesta. Este mecanismo reproduce el patrón utilizado en los puentes de Telegram y Discord.
Vinculación de espacios de trabajo de DeepSeek Harness mediante comandos de chat
La funcionalidad de "Workspaces" en la interfaz web de DSH está respaldada por el servicio workspaceRegistry (@deepseek-ai/dsh-workspace):
const existing = await ctx.workspaceRegistry.resolveByPath(request.path);
El puente de Buzz ofrece el comando de chat /workspace <carpeta>, que registra un directorio existente en DSH. Cualquier nueva sesión creada a través de la pasarela se vincula a dicha carpeta y se refleja en la interfaz web.

Tres consideraciones de diseño relevantes:
- Cambiar de carpeta implica una nueva sesión. El valor
cwdse fija en la cabecera de la sesión al crearse y no puede modificarse posteriormente. - La carpeta debe existir previamente. El método
createrechaza rutas inexistentes. - Comando sensible a la seguridad. Cada sesión opera con una directiva de auto-aprobación, otorgando acceso de lectura y ejecución en el directorio indicado.
Guía paso a paso de instalación y configuración
- Ejecute los siguientes comandos en la terminal:
dsh plugin --profile web add https://github.com/Tech-Voyage-Dev/dsh-message-gateway.git
# Start DSH web
dsh web
- Una vez que la interfaz web de DSH se abra en el navegador, haga clic en el icono "Message platforms":
![]()
- Seleccione "Buzz" en el panel lateral izquierdo:

- Haga clic en "Generate keypair" para generar un par de claves Nostr. Copie la clave pública
npuben un lugar seguro para los pasos siguientes. - Ingrese la Relay URL y los Channels (la lista de UUIDs de canales permitidos para suscribirse).
- Presione el botón "Save".
Al guardar el formulario se almacenan las credenciales y se inicia el puente. La clave privada nsec se trata como un secreto estricto y se guarda exclusivamente en ~/.dsh/gateway.json.
Registro del par de claves del agente en el relay Nostr de Buzz
Añada el asistente de DSH al relay como miembro. Utilice la clave npub generada previamente:
docker compose exec relay buzz-admin add-member --pubkey npub123123123
Incorpore el asistente a un canal específico. Registrar un miembro en el relay no lo hace visible ni localizable de forma automática en los canales. Para agregarlo mediante buzz-cli, tenga en cuenta que el parámetro --pubkey debe especificarse en formato HEX, no npub (el comando buzz-admin add-member imprime la clave HEX correspondiente):
buzz channels add-member --channel <CHANNEL_UUID> --pubkey <AGENT_HEX> --role member

Guía de CLI
Cómo instalar y usar buzz-cli
Instrucciones paso a paso para instalar y configurar buzz-cli para gestionar canales de Nostr, claves de miembros y permisos de agentes de IA.
5 MIN DE LECTURAActualice el perfil del asistente en el relay Nostr asignándole un nombre descriptivo con buzz-cli:

Envíe un saludo Wave (el saludo inicial de Buzz para mensajes directos) al asistente. La respuesta confirma la conexión:

Envío de un Wave como mensaje directo al asistente de DSH: el puente está operativo.
Habilitación del acceso a carpetas locales con /workspace
Debido a que el parámetro allowWorkspace está deshabilitado (false) por defecto, el comando /workspace será rechazado inicialmente:

Habilítelo en ~/.dsh/profiles/web/cordis.patch.yml y reinicie dsh web:
- id: ui-message-gateway
config:
allowWorkspace: true
Tras reiniciar el servicio:

Nota importante: este comando asume que el directorio del workspace (TechVoyage en las capturas) reside dentro del directorio predeterminado del usuario. De lo contrario, indique la ruta absoluta completa. Cualquier nueva sesión creada bajo este workspace desde Buzz aparecerá también en la interfaz web de DeepSeek Harness.

Comandos disponibles en Buzz
Todas las funcionalidades y comandos disponibles en las demás plataformas están plenamente soportados en Buzz:
| Comando | Descripción |
|---|---|
/workspace <folder> | Registra una carpeta existente como espacio de trabajo del chat (requiere habilitación en configuración) |
/help | Muestra la lista de comandos disponibles |
/time | Informa la hora actual del sistema |
/new | Inicia una nueva sesión de conversación limpia |
/clear | Limpia el historial de la conversación actual |
/status | Muestra el estado operativo del puente |
/stats | Muestra estadísticas de chats activos y estado de puentes en todas las plataformas (incluido Buzz) |
/commands | Lista descriptiva de cada comando soportado |
@path/to/file | Funciona como las menciones web de archivos: el modelo lee el archivo relativo al workspace; @, @prefijo o /files <prefijo> devuelven archivos y carpetas coincidentes |
/model | [provider model effort] — validado frente al catálogo de modelos LLM activos; /model lista opciones disponibles y /model reset restablece valores predeterminados |
/effort | <id> modifica exclusivamente el esfuerzo de razonamiento del modelo; /effort reset restablece el valor por defecto |
Aspectos clave de seguridad
- La clave privada nsec reside únicamente en
~/.dsh/gateway.json(permisos 0600, escritura atómica) — nunca se expone en endpoints como/gateway/listni en registros de depuración. - Cada evento entrante es verificado criptográficamente (
verifyEvent), deduplicado, filtrado contra mensajes propios y evaluado por reglas de mención antes de llegar al agente. - El registro de workspaces está restringido por configuración (
allowWorkspace: falsepor defecto), garantizando control estricto sobre sesiones automáticas con acceso a archivos locales.
Conclusión: Colaboración descentralizada con agentes IA en Buzz
El desafío central al integrar Buzz en dsh-message-gateway radicó en implementar fielmente el contrato de eventos del protocolo Nostr. La arquitectura base del plugin ya ofrecía una sólida gestión de sesiones independientes y enrutamiento de comandos, permitiendo una integración fluida en cuanto se resolvieron el manejo de eventos y el streaming interactivo.
Referencias:
- dsh-message-gateway architecture guide — guía de arquitectura, extensiones y notas de seguridad
- nostr-tools — librería Nostr utilizada internamente
- deer-flow IM channel connections — patrones de referencia para conexiones de canales de mensajería instantánea
Artículos relacionados

Colaboración
Cómo autoalojar Buzz de Block: Espacio de trabajo para agentes IA
Aprende a autoalojar el relay de Buzz en un VPS con Ubuntu detrás de Cloudflare. Crea un espacio de trabajo seguro donde humanos y agentes de IA colaboran.
18 MIN DE LECTURA
IA y Agentes
Cómo exponer Hermes Agent de forma privada con WARP
Aprenda a exponer y acceder globalmente a su Hermes Agent de forma segura con Cloudflare WARP y Zero Trust, sin abrir puertos de entrada en el firewall.
9 MIN DE LECTURA
Viajes
Aloja tus propios itinerarios de viaje con TREK y Docker
Aprende a desplegar TREK con Docker, protegerlo con Cloudflare R2 y Caddy, y usar agentes de IA vía MCP para planificar todos tus itinerarios sin problemas.
25 MIN DE LECTURA