@jossuealcala/madre 0.3.3 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/CHANGELOG.md +497 -3
  2. package/CONTRIBUTING.md +3 -1
  3. package/README.md +68 -186
  4. package/SECURITY.md +2 -1
  5. package/bin/madre.mjs +56 -13
  6. package/docs/INTERNALS.md +16 -0
  7. package/docs/REFERENCE.md +249 -0
  8. package/docs/SDK.md +121 -0
  9. package/docs/room.png +0 -0
  10. package/docs/sdk/hello-module.mjs +51 -0
  11. package/package.json +9 -1
  12. package/public/app.js +3979 -867
  13. package/public/es.js +2258 -0
  14. package/public/i18n.js +66 -0
  15. package/public/index.html +96 -15
  16. package/public/inquiry.js +220 -0
  17. package/public/resay.js +77 -0
  18. package/public/styles.css +622 -65
  19. package/public/troubleshooting.js +255 -46
  20. package/src/adapters/claude.mjs +2 -1
  21. package/src/adapters/codex.mjs +2 -1
  22. package/src/adapters/gemini.mjs +6 -5
  23. package/src/adapters/opencode.mjs +2 -1
  24. package/src/adapters/process.mjs +79 -20
  25. package/src/asking.mjs +128 -0
  26. package/src/auth-probe.mjs +58 -1
  27. package/src/chats.mjs +193 -0
  28. package/src/checkpoint.mjs +1 -1
  29. package/src/cold.mjs +56 -0
  30. package/src/commands.mjs +6 -0
  31. package/src/conversation-context.mjs +35 -3
  32. package/src/credentials.mjs +145 -0
  33. package/src/dataset.mjs +56 -4
  34. package/src/distiller.mjs +12 -5
  35. package/src/event-store.mjs +14 -8
  36. package/src/exam.mjs +240 -0
  37. package/src/extensions.mjs +3 -2
  38. package/src/eyecat-watch.mjs +100 -0
  39. package/src/eyecat.mjs +169 -0
  40. package/src/i18n.mjs +47 -0
  41. package/src/image-studio.mjs +2 -0
  42. package/src/launch.mjs +61 -0
  43. package/src/maturity.mjs +94 -0
  44. package/src/mcp/image-server.mjs +36 -3
  45. package/src/mcp/memory-server.mjs +1 -1
  46. package/src/memory.mjs +325 -17
  47. package/src/modules/ahp.mjs +9 -7
  48. package/src/modules/ash.mjs +36 -0
  49. package/src/modules/git-pulse.mjs +5 -3
  50. package/src/modules/helpers.mjs +31 -0
  51. package/src/modules/image-studio.mjs +10 -4
  52. package/src/modules/index.mjs +141 -9
  53. package/src/modules/ollama.mjs +66 -10
  54. package/src/modules/playwright.mjs +44 -23
  55. package/src/modules/ripley.mjs +5 -3
  56. package/src/modules/sdk.mjs +93 -2
  57. package/src/modules/updates.mjs +81 -0
  58. package/src/ollama.mjs +5 -2
  59. package/src/outbound.mjs +297 -0
  60. package/src/privacy.mjs +54 -7
  61. package/src/room/context.mjs +4 -4
  62. package/src/room/economy.mjs +161 -0
  63. package/src/room/prompt.mjs +118 -46
  64. package/src/room.mjs +443 -44
  65. package/src/runtime-detection.mjs +27 -8
  66. package/src/sentinel-errors.mjs +19 -1
  67. package/src/server.mjs +709 -71
  68. package/src/setup.mjs +1 -1
  69. package/src/updates.mjs +4 -2
  70. package/src/usage-sentinel.mjs +13 -8
  71. package/src/verdict.mjs +74 -0
  72. package/src/ashcode.mjs +0 -64
  73. package/src/modules/ashcode.mjs +0 -28
@@ -0,0 +1,249 @@
1
+ # MADRE · REFERENCIA
2
+
3
+ Todo lo que MADRE hace, con los números exactos. Para empezar en cinco minutos, el [README](../README.md).
4
+
5
+ - [Arranque](#arranque--los-primeros-cinco-minutos) · [La sala](#la-sala) · [Idioma](#idioma)
6
+ - [Modos de permiso](#modos-de-permiso) · [Qué puede cada agente](#qué-puede-cada-agente) · [Delegación](#delegación)
7
+ - [Memoria](#memoria) · [MADRE AI](#madre-ai--tu-propio-modelo) · [El núcleo](#el-núcleo) · [MU/TH/UR](#muthur) · [Módulos](#módulos)
8
+ - [Lo que sale de la máquina](#lo-que-sale-de-la-máquina) · [Config y variables](#referencia)
9
+
10
+ ---
11
+
12
+ ## ARRANQUE · LOS PRIMEROS CINCO MINUTOS
13
+
14
+ Necesitas Node 22.5 o superior y al menos una de estas CLIs con sesión iniciada: **Codex**, **Claude Code**, **Gemini CLI**, **OpenCode**. Si además corre **Ollama** con un modelo de chat, la sala tiene un quinto agente local.
15
+
16
+ 1. Entra a la carpeta del proyecto y corre `npx @jossuealcala/madre start`. La sala abre siempre, tengas agentes o no. Si no hay ninguno, lo primero que ves es el puente: cada agente con su botón para instalarlo y firmarlo, ahí mismo. MADRE muestra el comando exacto antes de correrlo y transmite cada línea. En cuanto uno queda listo, la sala se desbloquea sola.
17
+ 2. La sala abre en `http://127.0.0.1:4317`. Elige un agente en el selector o escribe `@claude …`. El chip junto a `to @agente` dice en qué modo sale el mensaje; `#1 EXCHANGE`, solo lectura, es el predeterminado.
18
+ 3. Para sumar o reconectar una IA más tarde: `⚙ CONNECTIONS` en MU/TH/UR, donde la tripulación vive junto al resto de los ajustes. Codex y Claude Code se firman con un clic; Gemini y OpenCode aceptan su llave ahí mismo. MADRE no guarda credenciales: cada llave va al archivo de su propio CLI.
19
+ 4. Con Ollama, `MODULES → OLLAMA` ya está encendido: la memoria se embebe localmente y `@madre` aparece en la fila.
20
+ 5. `⚙ CONNECTIONS → MEMORY` ajusta quién destila la memoria y cada cuánto. `◉ NOSTROMO` muestra lo que la sala recuerda.
21
+
22
+ ```bash
23
+ npx @jossuealcala/madre doctor # qué agentes hay, quién tiene sesión, si hay versión nueva
24
+ npx @jossuealcala/madre setup # el mismo alta, desde la terminal, si la prefieres
25
+ npx @jossuealcala/madre start --no-open --project RUTA
26
+ ```
27
+
28
+ **Tres nombres.** **MADRE** es el producto. **MU/TH/UR** es su voz operativa: diagnóstico, conexiones, ajustes. **PULSE** es el canal sobre el que corre la sala: el registro de eventos, el bloque de delegación, la carpeta `.pulse/` donde caen los artefactos; por eso esos identificadores conservan su nombre.
29
+
30
+ ---
31
+
32
+ ## LA SALA
33
+
34
+ **El puente.** Sin agentes en línea la sala abre en el puente: una tarjeta por agente con su estado real y la única acción que le toca, `INSTALL` o `SIGN IN`. Todo corre en tu máquina, con el comando a la vista, y la salida se transmite a la misma pantalla. Codex y Claude Code se firman con un clic porque su CLI abre el navegador; Gemini y OpenCode aceptan su llave ahí mismo, que MADRE escribe donde ese CLI la busca, con el archivo cerrado a tu usuario y sin guardar copia en ninguna parte, solo desde esta computadora. Cada tarjeta dice además con qué cuenta se firma ese agente y si hay una entrada sin pagar, para que elegir no sea a ciegas. El puente se repliega en cuanto un agente queda listo y no vuelve: es el primer contacto de una sala sin nadie dentro. A partir de ahí la tripulación vive en `⚙ CONNECTIONS`, con los mismos botones y, al lado, los modos, los permisos y las llaves de cada agente.
35
+
36
+ **La barra.** La marca con su latido, la raíz del proyecto, la tripulación, `LIVE`, las alertas (`STOP ALL`, versión nueva), `MODULES`, `MU/TH/UR`, tema y panel de archivos. Cada esfera de agente lleva un anillo con su consumo: el límite real del proveedor cuando el CLI lo publica, si no, la ventana local de MADRE. Un clic la despliega.
37
+
38
+ **Las burbujas.** Cada respuesta dice quién habla, a quién, en qué modo y con qué modelo; debajo, hora, tokens del turno y acumulado. Markdown completo, tablas, bloques de código con COPY. Las rutas que un agente menciona (`src/room.mjs:42`) abren el visor. Al pasar el ratón: valorar bien o mal, copiar, responder con otro agente.
39
+
40
+ **El compositor.**
41
+
42
+ | Escribes | Pasa |
43
+ |---|---|
44
+ | `@codex`, `@claude`, `@gemini`, `@opencode`, `@madre` | Menciona a un agente; `@` abre la lista |
45
+ | `!src/room.mjs:12-20` | Adjunta un archivo del proyecto, con líneas si las das; `!` busca entre los archivos |
46
+ | `#0` a `#4` | Fija el modo de permiso de ese mensaje. `#3` y `#4` abren la anulación, igual que el chip: un modo que pide dos llaves con el ratón no sale gratis por teclearlo |
47
+ | `/create …`, `/image …`, `/stopall`, `/git …`, `/ahp …` | Comandos; `/` abre el menú. `/git push` muestra qué saldría; solo `/git push confirm` lo envía |
48
+ | `STOPALL` | Freno maestro |
49
+ | Clip, arrastrar o pegar una imagen | Adjunto para la sala, nunca en el proyecto |
50
+ | `@madre, pregúntale al crew …` | Mesa redonda: un paso por agente en línea, cierre citado |
51
+
52
+ Un segundo clic en la esfera elegida, o el chip `default model ▾`, elige el modelo de esa petición: Codex, Claude, Gemini y OpenCode con sus listas reales, o un nombre libre. Se recuerda por agente.
53
+
54
+ **Archivos.** El icono de la derecha abre el árbol del proyecto en solo lectura. El visor numera líneas; clic y Shift+clic seleccionan un rango y `REVIEW WITH` lo manda a un agente. Con **RIPLEY** encendido en `MODULES`, HTML, SVG y Markdown se renderizan en un marco sellado en lugar de mostrar su código, con barra atrás/recargar y recarga automática cuando un agente cambia el archivo.
55
+
56
+ **Tema.** Sol/luna en la barra: automático, claro u oscuro. El claro no brilla; la pantalla de MU/TH/UR sigue siendo fósforo.
57
+
58
+ **Idioma.** La sala habla **español** por defecto. El botón `EN` de la barra la pasa a inglés y el navegador lo recuerda; `PULSE_LANGUAGE=en` manda sobre el config en el siguiente arranque. Un idioma es solo cómo se lee: lo que quedó escrito en el ledger conserva las palabras con que se escribió, y al mostrarse se vuelve a decir en el idioma de la sala.
59
+
60
+ La **terminal sigue en inglés a propósito**: `madre doctor` y el arranque imprimen lo que la gente pega en un issue o busca en un motor, y en inglés se encuentra. Lo que imprime un CLI por su cuenta tampoco se toca nunca.
61
+
62
+ ---
63
+
64
+ ## MODOS DE PERMISO
65
+
66
+ Cada mensaje sale con un modo. Tu modo es el techo de cualquier plan que ese mensaje arranque.
67
+
68
+ | Modo | Nombre | Qué permite |
69
+ |---|---|---|
70
+ | `#0` | **GHOST** | Fuera del registro. No se escribe en el ledger, nadie lo recuerda, desaparece al recargar. Los tokens sí cuentan. |
71
+ | `#1` | **EXCHANGE** | Leer el proyecto y coordinar. El predeterminado. |
72
+ | `#2` | **CREATE** | Añadir archivos y carpetas nuevos donde corresponda en el proyecto. Lo que ya existía no cambia: si un agente lo toca, MADRE lo restaura al terminar y lo dice. |
73
+ | `#3` | **CONTROL** | Editar el proyecto real sin aprobación por acción. Un titular por sala, checkpoint antes, lista de cambios y `UNDO` después. |
74
+ | `#4` | **AIRLOCK** | Todo lo de CONTROL más ejecutar comandos: pruebas, builds, `git push`, deploys con las CLIs y sesiones que ya hay en la máquina. Los archivos vuelven con `UNDO`; lo que sale de la nave, no. La anulación pide dos llaves: la designación y la palabra `AIRLOCK`. |
75
+
76
+ **CREATE por dentro.** El agente decide dónde va lo nuevo según las convenciones del proyecto, y crea carpetas si hace falta; `.pulse/out/<turno>/` queda como borrador para lo que no tiene sitio. MADRE toma un checkpoint antes del turno y, al terminar, conserva lo que apareció, lo muestra bajo la respuesta como artefactos, y restaura cualquier archivo previo que se haya modificado, renombrado o borrado, avisando en la sala. Las CLIs reciben sus herramientas de escritura sobre el proyecto y la instrucción de no tocar lo existente; la garantía la da la restauración de MADRE al terminar, no la regla previa.
77
+
78
+ **CONTROL por dentro.** Antes del turno, un commit real bajo `refs/madre/checkpoints/` que no toca tu rama, tu índice ni tu stash. Durante el turno, `.git/`, `.pulse/`, `.madre/`, los `.env` y `.claude/settings.local.json` quedan en solo lectura a nivel de sistema de archivos y recuperan sus permisos al terminar. Después, la lista de archivos añadidos, modificados y borrados, y `UNDO` restaura el checkpoint. Armar `#3` pide la designación del proyecto; armar `#4` pide además la palabra `AIRLOCK`. En `#4` cada CLI recibe su herramienta de comandos (Codex sin sandbox de red, Claude `Bash`, Gemini `run_shell_command`, OpenCode `bash`) y la instrucción de decir en una línea qué va a salir y adónde antes de que salga.
79
+
80
+ **Escalación.** Si un plan en `#1` llega a un paso que pide crear algo, la sala se detiene y pregunta: `GRANT ONCE · GRANT FOR PLAN · DENY`, con cronómetro de tres minutos. Solo el humano concede; un permiso escrito por un agente dentro de la conversación no cuenta.
81
+
82
+ **Modo por paso.** Un orquestador puede pedir el modo de cada paso: `@codex #2: crea la página`, `@claude #3: arregla el router`. MADRE lo acota al modo de tu mensaje y al `MAX MODE` de ese agente. Con tu mensaje en `#3`, la palabra del orquestador basta; con tu mensaje en `#1`, un paso `#2` pasa por la escalación.
83
+
84
+ **Dos controles por agente.** En `⚙ CONNECTIONS` cada agente tiene `MAX MODE`, hasta dónde puede llegar un mensaje dirigido a él, y `DEFAULT MODE`, dónde empieza: `#1` solo lectura hasta que armes CREATE, o `#2` para que cada turno pueda añadir archivos sin pedirlo. Aparte, dos habilidades: generar imágenes y web.
85
+
86
+ ---
87
+
88
+ ## QUÉ PUEDE CADA AGENTE
89
+
90
+ | | Lee el proyecto | Recibe imágenes | Crea archivos acotado | Genera imágenes | Web |
91
+ |---|---|---|---|---|---|
92
+ | **Codex** | sí | `-i` | sandbox de escritura | sí, nativo, con su cuenta de ChatGPT | `web_search` |
93
+ | **Claude Code** | sí | lectura de la ruta | reglas de permiso por ruta | sí, con **Image Studio** | WebFetch / WebSearch |
94
+ | **Gemini CLI** | sí | `read_file` | política por patrón | sí, con **Image Studio** | `google_web_search` |
95
+ | **OpenCode** | sí | `-f` | permisos `edit` por patrón | sí, con **Image Studio** | webfetch / websearch |
96
+ | **@madre** | la memoria | no | no | no | no |
97
+
98
+ **Image Studio** es un módulo de MADRE: un servidor MCP propio que expone `generate_image` sobre los modelos de imagen de la API de Gemini, con tu propia key y tus créditos. Hoy **solo Gemini**, y por una razón: es la única cuenta de la tripulación cuya llave MADRE ya encuentra sin pedirte una nueva, y tiene capa gratis. Anthropic no genera imágenes —Claude las lee, no las hace—, la cuenta de ChatGPT con la que se firma Codex no da acceso a la API de imágenes, y OpenCode depende del proveedor al que lo apuntes. Se conecta a Claude, Gemini y OpenCode solo dentro de un permiso CREATE con el alcance de imágenes encendido, en sus homes aislados, y la imagen cae en la carpeta del turno como cualquier artefacto. `/image <petición>` arma el permiso y enruta al agente que puede generar. Con los cuatro agentes puedes pedir una imagen; Codex la hace con lo suyo, los demás con Image Studio.
99
+
100
+ El acceso web es un permiso permanente por agente, apagado por defecto, que se enciende en `⚙ CONNECTIONS`.
101
+
102
+ ---
103
+
104
+ ## DELEGACIÓN
105
+
106
+ Un agente puede poner a trabajar a los demás. Si le pides coordinar, termina su respuesta con un bloque `pulse`, un paso por línea:
107
+
108
+ ```
109
+ @gemini: Sintetiza en un párrafo quién es el autor, separando hechos de inferencias.
110
+ @codex: Misma pregunta; señala la afirmación menos sustentada.
111
+ @claude: Compara ambas síntesis y marca dónde divergen.
112
+ ```
113
+
114
+ MADRE ejecuta los pasos como turnos normales: cada uno queda en el ledger, pasa por handoff, presupuesto y timeout. El paso dirigido al orquestador es su turno de cierre. Los delegados no delegan, así que todo plan termina. Máximo cuatro pasos más el cierre.
115
+
116
+ **STOP ALL.** El botón de la barra, `STOPALL` en el compositor o `curl -X POST http://127.0.0.1:4317/api/stop-all` detienen todos los planes y matan todos los procesos de agente. MU/TH/UR avisa en rojo cuando la sala se escapa: tres agentes a la vez, un agente con dos turnos cruzados, un plan de más de cinco minutos.
117
+
118
+ ---
119
+
120
+ ## MEMORIA
121
+
122
+ Todo lo dicho fuera de GHOST queda indexado junto al ledger, en `~/.pulse/rooms/<sala>/memory.sqlite`. Nada de esto requiere un comando: ocurre solo.
123
+
124
+ **Recall.** Cuando la conversación excede la ventana de contexto, cada turno recibe los intercambios anteriores que coinciden con la petición, citados con su número de secuencia, para cualquier agente.
125
+
126
+ **Notas destiladas.** Cada diez intercambios o tras diez minutos de reposo, el archivista lee lo no destilado y guarda hasta cinco notas tipadas: decisión, hecho, preferencia, pregunta abierta. El archivista es el agente más barato permitido; con Ollama es el modelo local y no cuesta nada.
127
+
128
+ **Por significado.** Con Ollama (`nomic-embed-text`) o con una key de Gemini, intercambios y notas se embeben en segundo plano; una pregunta en español encuentra una decisión escrita en inglés.
129
+
130
+ **Herramientas.** Cada turno lleva adjunto el servidor MCP `pulse-memory`: `memory_search`, `memory_recall`, `memory_notes`, `memory_timeline`, `project_state` y `memory_note`, que guarda una nota cuando tú pides explícitamente recordar algo. La burbuja muestra `◉ memory saved`.
131
+
132
+ **NOSTROMO.** El mapa de la memoria, detrás de la designación del proyecto: MADRE es un sol rojo que late, cada memoria un planeta en el color de su tipo, unidos por venas que pulsan. Se navega, se lee y solo se puede borrar, con doble confirmación. Ocho toques al corazón activan CODE000 y sellan el archivo diez minutos.
133
+
134
+ **@madre.** Con Ollama y un modelo de chat, la memoria habla: `@madre` responde desde todo el archivo con citas `[#n]`, dice cuando la sala nunca discutió algo, no escribe ni ejecuta, y convoca al crew si se lo pides. Sus tokens son locales y no cuentan. Cuando existe un modelo entrenado con la sala, lo usa.
135
+
136
+ **Ajustes.** `⚙ CONNECTIONS → MEMORY`: quién destila, quiénes pueden, cada cuánto, dónde se embebe, cuánto contexto puede ocupar el recall. Todo en `~/.pulse/config.json`, sin reiniciar.
137
+
138
+ **Privacidad.** Una CLI corre con su propio contexto privado y puede escribirlo en una respuesta. En `⚙ CONNECTIONS → PRIVACY` nombras los términos que no deben viajar por la sala: MADRE los sustituye por `[ENTIDAD-ORG]` antes de que lleguen al ledger, al archivista, a los demás agentes o al dataset, y `PURGE ROOM` limpia lo que la sala ya tenía. Los términos viven en `config.json`; la sala solo registra cuántos.
139
+
140
+ ---
141
+
142
+ ## MADRE AI · TU PROPIO MODELO
143
+
144
+ La sala acumula material de entrenamiento mientras trabajas. `MEMORY` muestra en vivo cuántos pares limpios lleva hacia un LoRA, con 300 como objetivo: turnos humano→agente, pasos delegados y notas destiladas; fuera quedan las respuestas de `@madre`, las enlatadas y lo que marques como mala respuesta con el pulgar de cada burbuja.
145
+
146
+ `EXPORT DATASET` escribe `train.jsonl` y `valid.jsonl` junto al ledger, redactados. La tarjeta `TRAIN` trae los comandos ya rellenados con tu carpeta de sala y el modelo base que cabe en tu máquina. El entrenamiento corre fuera de MADRE, con mlx en Apple Silicon; la receta vive en [`docs/training/`](training/README.md). En cuanto Ollama tiene un modelo `madre-<proyecto>`, `@madre` responde con él y las demás CLIs reciben la indicación de preguntarle primero: la memoria del proyecto deja de costar tokens.
147
+
148
+ **Ollama.** Si corre en la máquina, MADRE lo usa sin configurar nada: embeddings locales, archivista local, `@madre`. `MODULES → OLLAMA` muestra servidor, modelos y roles, descarga los recomendados con `PULL` y deja apagar cada rol. `qwen2.5:7b` en 16 GB, `qwen2.5:3b` en 8 GB; MADRE prefiere modelos de chat general sobre los `-coder`.
149
+
150
+ ---
151
+
152
+ ## EL CORE
153
+
154
+ Entra a **◉ NOSTROMO** y haz clic en el núcleo, la estrella del centro. Cada turno, la sala escribe un documento en tu nombre y se lo entrega a un proceso; hasta ahora ese documento existía solo el instante en que el proceso lo leía. Ahí está entero: bloque por bloque, con lo que pesa cada uno y las palabras exactas que el agente recibe.
155
+
156
+ Cambia a quién va y las palabras cambian; sube el modo y aparece el permiso que se le daría, escrito —sin crear carpeta ni tomar checkpoint para enseñarlo—. Preguntar qué diría la sala no es la sala diciéndolo: nada se cuenta, nada se guarda, nada sale. Y se lee, nunca se escribe: lo que MADRE promete sobre la tripulación es cierto porque esas palabras son fijas.
157
+
158
+ **THE LAUNCH.** Debajo del documento, el comando exacto que MADRE correría para entregarlo: el ejecutable, el directorio, cada bandera y el lugar donde entra el briefing. No es una descripción — lo arman los mismos adaptadores que lo armarían de verdad. Debajo, lo que mantiene la corrida dentro del turno (la sesión que no persiste, el hogar temporal que se borra al terminar) y los servidores MCP que podría llamar, con sus herramientas contadas. **De ese comando nunca se imprime un valor de entorno, solo los nombres**: una línea de comandos es algo que la gente fotografía.
159
+
160
+ **Lo que salió de esta máquina.** El registro de salidas: cada destino al que MADRE o un agente llamó, con su cuenta. Nunca cuerpos, ni cabeceras, ni valores de consulta — solo a dónde y cuántas veces.
161
+
162
+ **La consola.** Dentro del núcleo, MU/TH/UR contesta desde lo que la sala ya tiene. Tres respuestas que no entiende y la interfaz se cierra.
163
+
164
+ ## MU/TH/UR
165
+
166
+ El botón de la barra abre la pantalla de diagnóstico. Escribe un síntoma, un agente o una palabra y MU/TH/UR clasifica las condiciones registradas en esta sala contra su catálogo, con el remedio para tu sistema operativo. El mismo catálogo en terminal: `madre doctor --catalog [texto]`.
167
+
168
+ | Sección | Qué hace |
169
+ |---|---|
170
+ | `⚙ CONNECTIONS` | Sesión, versión y ruta de cada CLI; `SIGN IN` y `RECHECK`; `MAX MODE`, `DEFAULT MODE` y habilidades; timeouts, presupuesto, delegación, modelo de OpenCode; MEMORY y PRIVACY |
171
+ | `◉ NOSTROMO` | El mapa de la memoria |
172
+ | `SENTINEL` | Fallos que ninguna condición explica y caídas del proceso, con rutas, usuarios, correos y claves eliminados. Cada reporte tiene `REPORT ON GITHUB ↗` para leerlo antes de publicarlo; `AUTO-REPORT`, apagado por defecto, envía los nuevos al colector del proyecto |
173
+ | `RELEASE CHANNEL` | Una consulta a npm al día. Si hay versión nueva, una alerta en la barra y aquí `RESTART WITH x.y.z`: la sala cierra, instala y vuelve en la misma dirección; o el comando para hacerlo tú. Nunca mientras los agentes trabajan |
174
+ | `✎ FEEDBACK` | Un issue en blanco con tu entorno ya escrito |
175
+ | `?` | El recorrido de cuatro pasos, el mismo que se abre la primera vez |
176
+
177
+ ---
178
+
179
+ ## MÓDULOS
180
+
181
+ `MODULES` en la barra lista los disponibles y su estado. Ninguno escribe en el proyecto salvo la instalación de AHP+, que muestra el comando y pide confirmación.
182
+
183
+ | Módulo | Qué añade |
184
+ |---|---|
185
+ | **Git Pulse** | `/git status`, `/git log [n]`, `/git diff`, `/git branches`: hechos del repositorio como tarjeta en el hilo, que los agentes también leen. `/git commit "mensaje"` y `/git push confirm`: tu mano sobre el repositorio, con vista previa de lo que saldría |
186
+ | **Image Studio** | `generate_image` para Claude, Gemini y OpenCode, con tu key de Gemini, dentro de CREATE |
187
+ | **RIPLEY** | El visor renderiza HTML, SVG y Markdown en un marco sellado, con recarga automática |
188
+ | **OLLAMA** | Embeddings, archivista y `@madre` en local, gratis y sin cuenta. Se instala, se despierta y descarga su modelo desde el puente |
189
+ | **PLAYWRIGHT** | Un navegador headless por turno que solo alcanza esta MADRE: abrir la vista previa de RIPLEY, hacer clic, leer consola, capturas al borrador del turno. Requiere `@playwright/mcp` |
190
+ | **Ash** | La economía de tokens de la sala. El interruptor pide a los agentes respuestas en prosa compacta; lo demás está siempre encendido y no se nota: el briefing lleva solo los bloques que el turno puede usar, lo que nunca cambia se lee primero para que el caché lo reconozca, y la transcripción se queda quieta en vez de deslizarse. Nada de lo que tú escribes se altera. En `⚙ CONNECTIONS` se ve a dónde se van los tokens |
191
+ | **AHP+** | Integración externa opcional: estado verificado del proyecto, checkpoints y handoffs en `.ahp/`; `/ahp status`, `/ahp check`, `/ahp context` |
192
+
193
+ Cada módulo es un archivo. Los tuyos van en `~/.pulse/modules/` (todas las salas) o en `<proyecto>/.madre/modules/` (ese proyecto): un `.mjs` con `export default { … }`, sin build ni registro, con interruptor, ajustes, comandos `/nombre`, herramientas MCP para los agentes y rutas propias. `RELOAD MODULES` lo recarga sin reiniciar. Guía y ejemplo listo para copiar en [`docs/SDK.md`](SDK.md). Cómo escribir uno, en [CONTRIBUTING.md](../CONTRIBUTING.md#writing-a-module).
194
+
195
+ ---
196
+
197
+ ## LO QUE SALE DE LA MÁQUINA
198
+
199
+ - **Nada por sí solo.** MADRE no tiene nube, cuenta ni backend. No guarda credenciales.
200
+ - **Lo que un agente lee, viaja a su proveedor.** Codex a OpenAI, Claude Code a Anthropic, Gemini CLI a Google, OpenCode a quien tenga configurado. Aplican su cuenta, sus límites y sus términos. `@madre` y el archivista con Ollama no salen de la máquina.
201
+ - **Dos envíos propios, ambos bajo tu interruptor.** El sentinel, apagado por defecto, envía reportes redactados al colector del proyecto. El canal de liberación, encendido por defecto, pregunta a npm por la última versión: viaja el nombre del paquete, nada más, la misma petición que hace `npx`. `PULSE_UPDATE_CHECK=0` lo apaga.
202
+ - **Escritura.** En `#1` nadie escribe. En `#2` solo se añade: lo que existía se restaura al terminar el turno. En `#3` todo el proyecto salvo las zonas prohibidas, con checkpoint y `UNDO`. En un proyecto sin git, MADRE guarda sus fotografías en un repositorio sombra fuera del proyecto.
203
+ - **Memoria.** Todo lo dicho fuera de GHOST queda en `~/.pulse/rooms/<sala>/` y vuelve a los prompts de todos los agentes de esa sala. GHOST es la salida para lo que no debe recordarse; PRIVACY, para los nombres que nunca deben aparecer.
204
+
205
+ ---
206
+
207
+ ## REFERENCIA
208
+
209
+ **`~/.pulse/config.json`**, o `PULSE_HOME/config.json`. Lo escribe MU/TH/UR; las variables de entorno mandan al siguiente arranque.
210
+
211
+ ```json
212
+ {
213
+ "opencode": { "model": "openai/gpt-5.6-sol" },
214
+ "timeouts": { "default": 300000, "claude": 600000 },
215
+ "room": { "softTokenBudget": 500000, "delegation": true, "maxPlanSteps": 4 },
216
+ "memory": { "archivist": "auto", "every": 10, "idleMinutes": 10, "embedProvider": "auto", "recallShare": 0.3 },
217
+ "privacy": { "terms": [], "marker": "[ENTIDAD-ORG]" },
218
+ "updates": { "check": true },
219
+ "telemetry": { "autoReport": false }
220
+ }
221
+ ```
222
+
223
+ **Variables de entorno**
224
+
225
+ | Variable | Predeterminado | Efecto |
226
+ |---|---|---|
227
+ | `PULSE_HOME` | `~/.pulse` | Raíz de las salas y del config |
228
+ | `PULSE_LANGUAGE` | del config, si no `es` | `es` o `en`; manda sobre el config y sobre lo que el navegador recuerde |
229
+ | `PULSE_SOFT_TOKEN_BUDGET` | `500000` | Presupuesto local de tokens por agente, ventana rodante de 5 h |
230
+ | `PULSE_CONTEXT_MAX_CHARS` | `16000` | Ventana de transcript inyectada |
231
+ | `PULSE_RECALL_SHARE` | `0.3` | Parte de la ventana para la memoria recordada (`0` la apaga) |
232
+ | `PULSE_DISTILL` · `_EVERY` · `_IDLE_MS` · `_MAX_CHARS` · `_AGENT` · `_MODEL` | `1` · `10` · `600000` · `6000` · — · — | Destilación de notas |
233
+ | `PULSE_EMBED` · `PULSE_EMBED_PROVIDER` | `1` · `auto` | Embeddings; `ollama`, `gemini`, `auto` |
234
+ | `PULSE_OLLAMA` · `_HOST` · `_MODEL` · `_EMBED_MODEL` | `1` · `http://127.0.0.1:11434` · el mejor · el mejor | Ollama |
235
+ | `PULSE_MEMORY_TOOLS` | `1` | Servidor MCP `pulse-memory` en cada turno |
236
+ | `PULSE_PRIVATE_TERMS` · `PULSE_PRIVATE_MARKER` | — · `[ENTIDAD-ORG]` | Términos privados extra y su marcador |
237
+ | `PULSE_UPDATE_CHECK` | `1` | `0` apaga la consulta diaria a npm |
238
+ | `PULSE_REPORT_URL` · `PULSE_AUTO_REPORT` | colector del proyecto · `0` | Sentinel |
239
+ | `PULSE_AGENT_TIMEOUT_MS` · `PULSE_<AGENTE>_TIMEOUT_MS` | `180000` · — | Timeouts |
240
+ | `PULSE_MAX_MESSAGE_CHARS` | `20000` | Tamaño máximo de un mensaje |
241
+ | `PULSE_DELEGATION` · `PULSE_MAX_PLAN_STEPS` | `1` · `4` | Delegación |
242
+ | `PULSE_ESCALATION_MS` | `180000` | Cronómetro de la escalación |
243
+ | `PULSE_OPENCODE_MODEL` | del config | `proveedor/modelo` para OpenCode |
244
+ | `PULSE_CLAUDE_USAGE` · `PULSE_OFFICIAL_QUOTA` | `0` · `1` | Cuota oficial de Claude (lee el llavero); `0` apaga todas las lecturas de proveedor |
245
+ | `PULSE_GEMINI_IDLE_MS` · `PULSE_GEMINI_RETRIES` · `PULSE_GEMINI_FALLBACK_MODEL` | `90000` · `1` · `gemini-2.5-flash` | Gemini bajo carga |
246
+
247
+ Cómo funcionan por dentro el ledger, el stream, la memoria, los adaptadores y la recuperación: [`docs/INTERNALS.md`](INTERNALS.md).
248
+
249
+ ---
package/docs/SDK.md ADDED
@@ -0,0 +1,121 @@
1
+ # MADRE SDK · escribe tus propios módulos
2
+
3
+ Un módulo de MADRE es **un archivo**. Sin build, sin dependencias, sin registrarse en ningún lado. Lo copias a una carpeta, pulsas RELOAD en MODULES y aparece con su interruptor. Puedes escribirlo a mano o pedírselo a una IA con este documento como contexto.
4
+
5
+ ## Dónde vive
6
+
7
+ | Carpeta | Alcance |
8
+ |---|---|
9
+ | `~/.pulse/modules/*.mjs` | Todas tus salas |
10
+ | `<proyecto>/.madre/modules/*.mjs` | Solo ese proyecto |
11
+
12
+ Ningún agente puede escribir ahí: `.madre/` es zona prohibida en CONTROL y AIRLOCK, y `~/.pulse` está fuera de todo proyecto. Un módulo entra a MADRE solo porque tú lo pusiste.
13
+
14
+ ## El archivo
15
+
16
+ El `export default` es un objeto plano. MADRE lo envuelve con `defineModule`. Copia [`docs/sdk/hello-module.mjs`](sdk/hello-module.mjs) y cámbialo: es un módulo completo con interruptor, un ajuste y un comando `/hello`.
17
+
18
+ ```js
19
+ export default {
20
+ id: 'hello', // kebab-case
21
+ name: 'HELLO',
22
+ summary: 'Qué hace, en una frase.',
23
+ settings: { enabled: false, greeting: 'hola' },
24
+ async status(ctx) { return { status: { installed: Boolean(ctx.settings.enabled), detail: ctx.settings.enabled ? 'on' : 'off' } }; },
25
+ slash: [{ name: 'hello', usage: '/hello [name]', summary: 'Saluda.', async execute(ctx, args) { return { ok: true, title: 'HELLO', text: `${ctx.settings.greeting}, ${args[0] ?? 'crew'}` }; } }],
26
+ };
27
+ ```
28
+
29
+ Si prefieres importar el SDK, también vale: `import { defineModule } from '@jossuealcala/madre/sdk'` y exporta el resultado. Y si necesitas hacer algo antes de definirlo, exporta una función `({ defineModule }) => defineModule({ … })`.
30
+
31
+ ## Lo que un módulo puede declarar
32
+
33
+ | Campo | Qué es |
34
+ |---|---|
35
+ | `id`, `name`, `vendor`, `summary`, `creates`, `requires` | Su ficha en MODULES. `summary` es una frase: qué hace. `creates` y `requires` son líneas cortas, una idea cada una |
36
+ | `version` | La tuya, y empieza en `1.0.0`. Si no la declaras, la ficha muestra la fecha del archivo |
37
+ | `tracks` | Si tu módulo envuelve algo de fuera, su versión no es la tuya: es la de esa cosa. Declara `{ name, npm }` o `{ name, github }` y devuelve la versión encontrada en `status(ctx)` como `runs: [{ name, version }]`. MADRE muestra esa versión y busca una más nueva sola, una vez al día, con el botón ↻ de la ficha para mirar ahora |
38
+ | `updatePlan(ctx, { latest })` | Cómo se trae esa versión nueva a esta computadora: `{ command, args, display, note, after }`. MADRE enseña `display` y no corre nada hasta que la humana lo leyó; la salida cae en la sala línea por línea. Sin comando, devuelve `{ command: null, note, download }` y la ficha manda a descargarlo |
39
+ | `updates` | `{ url }` https donde publicas **tu propio módulo**. Con eso su ficha trae un botón que va por el archivo, lo verifica igual que una instalación y lo reemplaza si pasa. Si lo instalaste desde un archivo, MADRE recuerda cuál y no necesitas declarar nada: edítalo y pide una copia nueva |
40
+ | `settings` | Valores por defecto. Viven en `~/.pulse/config.json` bajo `modules.<idEnCamelCase>`; `enabled` es el interruptor |
41
+ | `status(ctx)` | Qué muestra la tarjeta: `{ status: { installed, detail }, preflight: { ok, problems }, install: { display } }` |
42
+ | `status(ctx)` → `runs` | Lo que tu módulo maneja y no es MADRE: `[{ name, version, target }]`. `version` es lo que encontraste en esta computadora (`null` si no está), `target` lo que instalarías. Si coincide con `tracks.name`, esa es la versión de la ficha |
43
+ | `toggle(ctx, payload)` | Sustituye el interruptor por defecto; `confirm: 'texto'` pide confirmación antes de encender |
44
+ | `onToggle(ctx, enabled)` | Reacciona al interruptor |
45
+ | `slash` | Comandos `/nombre` que corren en el servidor con tu `ctx` y devuelven `{ ok, title, text }`. La sala los muestra como tarjeta y los agentes los leen |
46
+ | `toolsForTurn(ctx, turn)` | Servidores MCP para el turno de un agente: `[{ name, command, args, env, tools, brief }]`. MADRE los adjunta a la CLI en su corrida aislada y describe `brief` al agente |
47
+ | `routes` | Rutas HTTP propias: `{ method, path, handler(ctx, { payload, params, url }) }` → `{ status, body }` |
48
+ | `onEvent(ctx, event)` | Cada evento del ledger |
49
+ | `controls` | Los ajustes de tu módulo, declarados en vez de dibujados: `[{ key, label, type: 'select' \| 'switch' \| 'text', options, note, invert }]`. MADRE los pinta en la ficha y los guarda en tu bloque de `config.json` |
50
+ | `onSettings(ctx, settings)` | Te avisa cuando la humana cambió uno de tus `controls`, por si algo vivo tiene que enterarse |
51
+ | `conditions` | Entradas para el catálogo de MU/TH/UR, con remedio por plataforma |
52
+
53
+ ## Publicarlo
54
+
55
+ La ficha de un módulo tuyo trae **GET A NEWER FILE**: MADRE va por el archivo —a la `url` que declaraste o al archivo desde el que lo instalaste—, lo verifica en una copia aparte y solo reemplaza al instalado si carga, respeta las reglas de la casa y dice una versión distinta. Verificar no instala nada.
56
+
57
+ Y en la cabecera de MODULES hay **+ ADD A MODULE** para instalar el `.mjs` de alguien más. Pasa por la misma puerta que todo lo demás. Dicho claro, porque es lo que es: un módulo corre **dentro de MADRE, con los permisos de quien la abre**. MADRE comprueba que cargue y que no se salga de su corral —id propio, rutas solo bajo `/api/x/<id>/`, jamás encima de un módulo de MADRE—; lo que el código *pretende* no lo puede comprobar nadie más que tú.
58
+
59
+ ## La ficha
60
+
61
+ Todas las fichas de MODULES tienen los mismos pisos, en el mismo orden. No dibujas una tarjeta: declaras, y MADRE la arma. Es lo que hace que siete módulos —y el tuyo— se lean igual.
62
+
63
+ | Piso | Qué muestra | De dónde sale |
64
+ |---|---|---|
65
+ | 1 · Quién es | el nombre, `ON`/`OFF`, quién lo hizo, la versión, el botón `↻` y lo que encontró la última mirada | `name`, `vendor`, `version` o `tracks`, `status(ctx).status.detail` |
66
+ | 2 · Qué hace | una frase, no tres | `summary` |
67
+ | 3 · Qué toca | lo que escribe y lo que necesita, plegado, con su número al lado | `creates`, `requires` (y `commands`, en su propio pliegue) |
68
+ | 4 · Ajustes | lo tuyo: selectores, interruptores, campos | `controls`, y lo que tu módulo lea de sí mismo |
69
+ | 5 · El interruptor | install, enable o disable. Solo, y siempre abajo | `toggle` / `installCommand` |
70
+
71
+ El estado es una palabra y un punto —`ON` u `OFF`—, nunca un botón: lo único que se presiona en una ficha es lo de abajo. Un módulo apagado se atenúa entero menos ese botón.
72
+
73
+ ## El `ctx`
74
+
75
+ ```
76
+ ctx = {
77
+ projectRoot, stateRoot, // el proyecto y ~/.pulse
78
+ config, settings, // config.json completo y tus ajustes con defaults
79
+ env, agents, room, // agentes detectados; la sala (room.capabilities(), room.record(...))
80
+ readConfig(), updateConfig(patch),
81
+ record(type, payload), // escribe un evento en el ledger; tipo "algo.algo", nunca message.* ni agent.*
82
+ services: { imageKey, ollama, … } // lo que el servidor ofrece
83
+ }
84
+ ```
85
+
86
+ `turn`, en `toolsForTurn`: `{ agent, mode, lease, scratchDir, port, roomDir }`. `mode` va de 0 a 4; en 0 (GHOST) nada se guarda, decide si quieres entregar herramientas ahí.
87
+
88
+ ## Reglas de la casa
89
+
90
+ - **Nada sale de la máquina por su cuenta.** Si tu módulo habla con un servicio, dilo en `summary` y en `requires`, y hazlo solo cuando el humano lo pida.
91
+ - **No guardes credenciales.** Usa las sesiones que ya viven en la máquina.
92
+ - **No escribas en el proyecto** desde un módulo; para eso están los modos de los agentes. Un módulo que instala algo en el proyecto es `kind: 'installer'` y muestra el comando antes de correrlo.
93
+ - **Falla suave.** Una excepción en `toolsForTurn` entrega nada; en un comando, la tarjeta dice el error. Nunca rompas el turno de un agente.
94
+ - **Voz MADRE.** Rótulos en mayúsculas cortos, notas que digan qué no sale de la máquina, `MU/TH/UR › ` cuando hables en un aviso.
95
+
96
+ ## Que lo construya tu IA, en la sala
97
+
98
+ MADRE es modular y la sala puede construirse a sí misma. En `#2` o más, pídele a un agente: «crea un módulo que lea mis correos y lo prepare para instalar». Su briefing le dice dónde está esta guía y el ejemplo, y la regla: escribe **un solo archivo** llamado `<id>.module.mjs` en su carpeta de borrador. MADRE lo reconoce por el nombre y pone una tarjeta en la sala: `INSTALL FOR EVERY ROOM` o `INSTALL FOR THIS PROJECT`. Léelo, decide, un clic. MADRE lo valida en una copia, lo guarda como `<id>.mjs` en la carpeta que elegiste y aparece en MODULES con la etiqueta `DEV`.
99
+
100
+ Los agentes nunca escriben en `~/.pulse/modules` ni en `.madre/modules`: proponen, tú instalas.
101
+
102
+ Un módulo tuyo se quita desde MODULES → tarjeta `</>` → `REMOVE`; borra su archivo. Los módulos que vienen con MADRE no se quitan, se apagan.
103
+
104
+ ## Lo que un módulo no puede tocar
105
+
106
+ Un módulo corre dentro del proceso de MADRE con tus permisos: instala solo lo que leíste. MADRE, por su parte, protege su núcleo así:
107
+
108
+ - Sus rutas HTTP viven bajo `/api/x/<id>/`; un módulo con rutas fuera de ahí no carga, así ninguno puede suplantar `/api/state`, `/api/messages` o cualquier ruta propia de MADRE.
109
+ - No puede usar el `id` de un módulo integrado ni de otro ya cargado.
110
+ - `record()` rechaza los tipos de evento reservados (`message.*`, `agent.*`); no puede fabricar turnos ni mensajes.
111
+ - No recibe credenciales de nadie; usa, como MADRE, las sesiones que ya viven en la máquina.
112
+ - Un error en `toolsForTurn` entrega nada; en un comando, la tarjeta dice el error; al cargar, la tarjeta `</>` dice qué archivo y por qué. Nada de eso detiene la sala.
113
+
114
+ ## Probarlo
115
+
116
+ 1. Copia el archivo a `~/.pulse/modules/`.
117
+ 2. En la sala, MODULES → `RELOAD MODULES`. Si el archivo tiene un error, la tarjeta de desarrollo lo dice con la línea exacta.
118
+ 3. Enciéndelo con su interruptor. Escribe `/tu-comando` en el compositor.
119
+ 4. Cambia el archivo y vuelve a RELOAD: no hace falta reiniciar la sala.
120
+
121
+ Con una IA: pásale este documento y `hello-module.mjs`, describe lo que quieres y pídele un solo archivo `.mjs` con `export default { … }`. Lo demás lo hace MADRE.
package/docs/room.png ADDED
Binary file
@@ -0,0 +1,51 @@
1
+ // HELLO · a complete MADRE module in one file, no imports, no build.
2
+ //
3
+ // Copy this file to ~/.pulse/modules/hello.mjs (every project) or to
4
+ // <project>/.madre/modules/hello.mjs (this project), then MODULES → RELOAD.
5
+ // Switch it on in MODULES and type /hello in the room.
6
+ //
7
+ // The default export is a plain object: MADRE wraps it with defineModule.
8
+ // Everything is optional except id and name.
9
+
10
+ export default {
11
+ id: 'hello', // kebab-case; also the key under modules in ~/.pulse/config.json (camelCased)
12
+ name: 'HELLO', // how MODULES shows it
13
+ vendor: 'you', // a person, a team, a company
14
+ version: '0.1.0',
15
+ summary: 'Greets the room from the composer. The smallest possible module: a switch, one setting, one slash command.',
16
+ creates: ['nothing in the project'],
17
+ requires: [],
18
+ settings: { enabled: false, greeting: 'hola' }, // defaults; the human changes them in config.json
19
+
20
+ // What MODULES shows for this module. ctx.settings already has the defaults applied.
21
+ async status(ctx) {
22
+ return { status: { installed: Boolean(ctx.settings.enabled), detail: ctx.settings.enabled ? `on · says "${ctx.settings.greeting}"` : 'off' } };
23
+ },
24
+
25
+ // Slash commands: they run on the server, inside MADRE, and their answer lands in the room as a
26
+ // fact card that the human and every agent read. Only while the module is on.
27
+ slash: [
28
+ {
29
+ name: 'hello',
30
+ usage: '/hello [name]',
31
+ summary: 'Greets someone in the room.',
32
+ async execute(ctx, args) {
33
+ const who = args[0] ?? 'crew';
34
+ return { ok: true, title: 'HELLO', text: `${ctx.settings.greeting}, ${who}. Project: ${ctx.projectRoot.split('/').pop()}. Agents online: ${ctx.agents.filter((agent) => agent.ready).map((agent) => `@${agent.id}`).join(', ') || 'none'}.` };
35
+ },
36
+ },
37
+ ],
38
+
39
+ // Tools for every turn: return MCP server specs and MADRE attaches them to the agent's CLI for
40
+ // that turn only, in its isolated run, and tells the agent what it got. Delete this block if the
41
+ // module has no tools. `turn` = { agent, mode, lease, scratchDir, port, roomDir }.
42
+ // async toolsForTurn(ctx, turn) {
43
+ // return [{ name: 'my-tools', command: 'node', args: ['/absolute/path/to/my-mcp-server.mjs'], env: {}, tools: ['do_thing'], brief: 'what the agent can do with it' }];
44
+ // },
45
+
46
+ // Events of the room, if the module wants to react (message.created, control.changed, …).
47
+ // async onEvent(ctx, event) {},
48
+
49
+ // A condition MU/TH/UR recognises, with its remedy per platform.
50
+ // conditions: [{ id: 'hello-shy', severity: 'informational', title: 'HELLO is off', match: /hello is off/i, diagnosis: '…', remedy: '…', fixes: { darwin: [], linux: [], win32: [] } }],
51
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jossuealcala/madre",
3
- "version": "0.3.3",
3
+ "version": "0.4.1",
4
4
  "description": "MADRE · one local room where the AI coding agents already on your machine (Codex, Claude Code, Gemini CLI, OpenCode) work on a project together, with a shared memory every one of them recalls and a local @madre that speaks for it. Read-only by default, per-message permission modes up to a checkpointed CONTROL. Nothing leaves your machine on its own.",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -42,8 +42,12 @@
42
42
  "LICENSE",
43
43
  "NOTICE",
44
44
  "docs/madre-banner.svg",
45
+ "docs/room.png",
45
46
  "docs/training",
47
+ "docs/SDK.md",
48
+ "docs/sdk",
46
49
  "docs/INTERNALS.md",
50
+ "docs/REFERENCE.md",
47
51
  "SECURITY.md",
48
52
  "CONTRIBUTING.md"
49
53
  ],
@@ -64,5 +68,9 @@
64
68
  },
65
69
  "publishConfig": {
66
70
  "access": "public"
71
+ },
72
+ "exports": {
73
+ "./sdk": "./src/modules/sdk.mjs",
74
+ "./package.json": "./package.json"
67
75
  }
68
76
  }