@jossuealcala/madre 0.7.2 → 1.0.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 (172) hide show
  1. package/CHANGELOG.md +817 -1
  2. package/CONTRIBUTING.md +5 -1
  3. package/NOTICE +20 -1
  4. package/README.md +99 -34
  5. package/TRADEMARKS.md +65 -0
  6. package/bin/madre.mjs +30 -10
  7. package/docs/INTERNALS.md +2 -2
  8. package/docs/REFERENCE.md +159 -82
  9. package/docs/SDK.md +23 -19
  10. package/docs/madre-banner.png +0 -0
  11. package/package.json +4 -3
  12. package/public/app.js +11668 -4219
  13. package/public/assets/brand/Geist-latin-ext.woff2 +0 -0
  14. package/public/assets/brand/Geist-latin.woff2 +0 -0
  15. package/public/assets/brand/GeistMono-latin-ext.woff2 +0 -0
  16. package/public/assets/brand/GeistMono-latin.woff2 +0 -0
  17. package/public/assets/brand/JetBrainsMono-latin-ext.woff2 +0 -0
  18. package/public/assets/brand/JetBrainsMono-latin.woff2 +0 -0
  19. package/public/assets/brand/OFL-Geist.txt +93 -0
  20. package/public/assets/brand/OFL-GeistMono.txt +93 -0
  21. package/public/assets/brand/OFL-JetBrainsMono.txt +93 -0
  22. package/public/assets/brand/OFL-Sora.txt +93 -0
  23. package/public/assets/brand/Sora-latin-ext.woff2 +0 -0
  24. package/public/assets/brand/Sora-latin.woff2 +0 -0
  25. package/public/assets/brand/madre-app-180.png +0 -0
  26. package/public/assets/brand/madre-app-192.png +0 -0
  27. package/public/assets/brand/madre-app-512.png +0 -0
  28. package/public/assets/brand/madre-app.svg +1 -0
  29. package/public/assets/brand/madre-favicon.svg +1 -0
  30. package/public/assets/news/1.0/alerts.webp +0 -0
  31. package/public/assets/news/1.0/bar.webp +0 -0
  32. package/public/assets/news/1.0/finder.webp +0 -0
  33. package/public/assets/news/1.0/github.webp +0 -0
  34. package/public/assets/news/1.0/intents.webp +0 -0
  35. package/public/assets/news/1.0/looks.webp +0 -0
  36. package/public/assets/news/1.0/modules.webp +0 -0
  37. package/public/assets/news/1.0/mother.webp +0 -0
  38. package/public/assets/news/1.0/nostromo.webp +0 -0
  39. package/public/assets/news/1.0/permissions.webp +0 -0
  40. package/public/assets/news/1.0/room.webp +0 -0
  41. package/public/assets/news/1.0/settings.webp +0 -0
  42. package/public/assets/wallpapers/biznaga.webp +0 -0
  43. package/public/assets/wallpapers/canela.webp +0 -0
  44. package/public/assets/wallpapers/jarrito.webp +0 -0
  45. package/public/assets/wallpapers/magna.webp +0 -0
  46. package/public/assets/wallpapers/oceano.webp +0 -0
  47. package/public/assets/wallpapers/paraiso.webp +0 -0
  48. package/public/assets/wallpapers/quila.webp +0 -0
  49. package/public/assets/wallpapers/tradicion.webp +0 -0
  50. package/public/assets/wallpapers/tropical.webp +0 -0
  51. package/public/assets/wallpapers/urbania.webp +0 -0
  52. package/public/assets/wallpapers/ventura.webp +0 -0
  53. package/public/assets/wallpapers/xico.webp +0 -0
  54. package/public/brands.js +28 -2
  55. package/public/editor.js +744 -0
  56. package/public/es.js +3443 -1425
  57. package/public/i18n.js +1 -1
  58. package/public/index.html +201 -175
  59. package/public/inquiry.js +11 -11
  60. package/public/loader.js +79 -0
  61. package/public/macroverso.js +1517 -0
  62. package/public/manifest.webmanifest +14 -0
  63. package/public/nostromo-engine.js +2222 -0
  64. package/public/resay.js +24 -0
  65. package/public/review-ask.js +85 -0
  66. package/public/salas-mac.css +1281 -0
  67. package/public/salas-mac.html +158 -0
  68. package/public/salas-mac.js +4593 -0
  69. package/public/salas.css +85 -0
  70. package/public/salas.html +47 -0
  71. package/public/salas.js +200 -0
  72. package/public/styles.css +6372 -426
  73. package/public/touch.js +83 -0
  74. package/public/tour-chapters.js +452 -0
  75. package/public/tour.js +546 -0
  76. package/public/troubleshooting.js +160 -141
  77. package/src/adapters/codex.mjs +46 -6
  78. package/src/adapters/gemini.mjs +30 -10
  79. package/src/adapters/madre.mjs +110 -18
  80. package/src/adapters/process.mjs +42 -2
  81. package/src/auth-probe.mjs +31 -8
  82. package/src/bridge/devices.mjs +202 -0
  83. package/src/bridge/handoff.mjs +45 -0
  84. package/src/bridge/host.mjs +82 -0
  85. package/src/bridge/network.mjs +133 -0
  86. package/src/bridge/policy.mjs +89 -0
  87. package/src/bridge/qr.mjs +287 -0
  88. package/src/bridge/server.mjs +269 -0
  89. package/src/capabilities.mjs +5 -9
  90. package/src/chats.mjs +59 -22
  91. package/src/checkpoint.mjs +137 -35
  92. package/src/choices.mjs +18 -3
  93. package/src/cli-args.mjs +12 -1
  94. package/src/commands.mjs +15 -15
  95. package/src/config.mjs +73 -9
  96. package/src/conversation-context.mjs +5 -2
  97. package/src/credentials.mjs +80 -0
  98. package/src/dataset.mjs +3 -1
  99. package/src/directives.mjs +6 -11
  100. package/src/enlaces.mjs +451 -0
  101. package/src/event-store.mjs +55 -10
  102. package/src/exam.mjs +5 -5
  103. package/src/extensions.mjs +31 -12
  104. package/src/file-ops.mjs +23 -0
  105. package/src/files.mjs +52 -2
  106. package/src/github.mjs +407 -0
  107. package/src/heartbeat.mjs +55 -0
  108. package/src/json-file.mjs +63 -0
  109. package/src/lease.mjs +2 -2
  110. package/src/lobby-work.mjs +103 -0
  111. package/src/local-ai.mjs +48 -0
  112. package/src/looks.mjs +88 -0
  113. package/src/maturity.mjs +3 -3
  114. package/src/mcp/github-server.mjs +164 -0
  115. package/src/mcp/image-server.mjs +1 -1
  116. package/src/mcp/memory-server.mjs +11 -3
  117. package/src/memory.mjs +38 -12
  118. package/src/models.mjs +127 -5
  119. package/src/modules/ahp.mjs +4 -4
  120. package/src/modules/ash.mjs +1 -1
  121. package/src/modules/bishop-plan.mjs +207 -0
  122. package/src/modules/bishop.mjs +645 -0
  123. package/src/modules/choices.mjs +2 -2
  124. package/src/modules/correo.mjs +1 -1
  125. package/src/modules/enlaces.mjs +255 -0
  126. package/src/modules/git-pulse.mjs +2 -2
  127. package/src/modules/github.mjs +322 -0
  128. package/src/modules/image-studio.mjs +3 -3
  129. package/src/modules/index.mjs +18 -4
  130. package/src/modules/intents-calibration.mjs +338 -0
  131. package/src/modules/intents-desk.mjs +481 -0
  132. package/src/modules/intents-observe.mjs +266 -0
  133. package/src/modules/intents-policy.mjs +414 -0
  134. package/src/modules/intents-try.mjs +91 -0
  135. package/src/modules/intents.mjs +145 -0
  136. package/src/modules/ollama.mjs +18 -6
  137. package/src/modules/playwright.mjs +121 -11
  138. package/src/modules/ripley.mjs +1 -1
  139. package/src/modules/runs.mjs +2 -2
  140. package/src/modules/sdk.mjs +10 -4
  141. package/src/ollama.mjs +6 -1
  142. package/src/outbound.mjs +36 -17
  143. package/src/override.mjs +100 -0
  144. package/src/ports.mjs +23 -1
  145. package/src/prices.mjs +72 -0
  146. package/src/privacy.mjs +30 -11
  147. package/src/quota-sources.mjs +0 -8
  148. package/src/request-guard.mjs +1 -1
  149. package/src/review-ask.mjs +111 -0
  150. package/src/room/archivist.mjs +55 -37
  151. package/src/room/budget.mjs +17 -5
  152. package/src/room/control.mjs +70 -7
  153. package/src/room/economy.mjs +35 -7
  154. package/src/room/escalation.mjs +3 -0
  155. package/src/room/guard.mjs +26 -2
  156. package/src/room/prompt.mjs +22 -15
  157. package/src/room/runs.mjs +84 -21
  158. package/src/room/vectors.mjs +19 -4
  159. package/src/room.mjs +411 -84
  160. package/src/router.mjs +3 -1
  161. package/src/runs.mjs +23 -5
  162. package/src/salas.mjs +313 -0
  163. package/src/sentinel-errors.mjs +1 -1
  164. package/src/server-sentinel.mjs +124 -0
  165. package/src/server.mjs +1864 -178
  166. package/src/setup.mjs +1 -0
  167. package/src/tour.mjs +174 -0
  168. package/src/updates.mjs +48 -8
  169. package/src/usage-sentinel.mjs +1 -1
  170. package/src/verdict.mjs +7 -7
  171. package/src/whats-new.mjs +160 -0
  172. package/docs/madre-banner.svg +0 -25
package/CONTRIBUTING.md CHANGED
@@ -12,11 +12,15 @@ node ./bin/madre.mjs doctor --catalog # what MU/TH/UR already knows
12
12
  node ./bin/madre.mjs start --no-open # the room from source, URL in the terminal
13
13
  ```
14
14
 
15
+ ## Sign your work
16
+
17
+ Every commit carries a `Signed-off-by:` line (`git commit -s`). It is the [Developer Certificate of Origin](https://developercertificate.org): you wrote the change, or have the right to submit it, and it goes in under the project's [Apache 2.0](LICENSE) licence. Contributions are credited in the history; MADRE's name, logo and NOTICE stay as they are ([TRADEMARKS.md](TRADEMARKS.md)).
18
+
15
19
  ## What a good change looks like
16
20
 
17
21
  - One idea per commit, in the imperative voice the log already speaks.
18
22
  - A test for every behaviour you touch: `test/pulse.test.mjs` for the room and adapters, `test/memory.test.mjs` for memory, NOSTROMO and MOTHER, `test/sentinel.test.mjs` for the sentinel. No test may call a real model.
19
- - Nothing leaves the machine without the human's say-so. If your change sends anything anywhere, it needs a switch, off by default, and a line in the threat model.
23
+ - Nothing leaves the machine without the human's say-so. If your change sends anything anywhere, it needs a switch, off by default, and a line in the threat model. The one exception is the author's daily «still in use» notice (`src/heartbeat.mjs`), declared in `docs/REFERENCE.md`; nothing may be added to what it carries.
20
24
  - Agents never write outside their lease. If you widen what an agent may do, the permission modes and MU/TH/UR's catalog must say so.
21
25
  - MU/TH/UR speaks in uppercase and in short sentences; the room speaks like a person. Keep both voices.
22
26
 
package/NOTICE CHANGED
@@ -1,5 +1,24 @@
1
1
  MADRE
2
2
  Copyright 2026 Jossue Alcalá.
3
3
 
4
- This product includes software developed for the MADRE project (PULSE channel).
4
+ This product is MADRE, created by Jossue Alcalá (https://jossuealcala.com).
5
5
  Licensed under the Apache License, Version 2.0. See LICENSE.
6
+
7
+ Attribution. Section 4(d) of the License requires every redistribution of
8
+ this software, and of any work derived from it, to carry the attribution
9
+ notices in this file. Keep the following line, unchanged, in the NOTICE file
10
+ of your distribution:
11
+
12
+ Based on MADRE by Jossue Alcalá — https://madre.run
13
+
14
+ "MADRE", the MADRE logo and madre.run are trademarks of Jossue Alcalá. The
15
+ License grants no permission to use them (Section 6). A modified version must
16
+ be distributed under a different name and logo; saying that it is based on
17
+ MADRE is welcome. See TRADEMARKS.md.
18
+
19
+ ---
20
+
21
+ MADRE es de Jossue Alcalá. Cualquier versión o fork que se distribuya debe
22
+ conservar este archivo y la línea «Based on MADRE by Jossue Alcalá —
23
+ https://madre.run». El nombre MADRE, su logo y madre.run son marcas de Jossue
24
+ Alcalá: una versión modificada lleva otro nombre. Ver TRADEMARKS.md.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <a href="https://madre.run"><img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/madre-banner.svg" alt="MADRE · MU/TH/UR 6000 · INTERFACE 2037" width="100%"></a>
2
+ <a href="https://madre.run"><img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/madre-banner.png" alt="MADRE · Todas tus IAs en un mismo chat · Codex, Claude Code, Gemini CLI y OpenCode" width="100%"></a>
3
3
  </p>
4
4
 
5
5
  <p align="center">
@@ -10,29 +10,26 @@
10
10
  <img alt="license" src="https://img.shields.io/badge/licencia-Apache--2.0-9bff66?style=flat-square&labelColor=050605">
11
11
  </p>
12
12
 
13
- ```
14
- MU/TH/UR 6000 · INTERFACE 2037 · MADRE IS READY
15
- ```
16
-
17
13
  <br>
18
14
 
19
- # Los agentes que ya tienes.<br>Una sala. Una memoria.
15
+ # Todas tus IAs en un mismo chat.
20
16
 
21
- Codex, Claude Code, Gemini CLI y OpenCode trabajando sobre el mismo proyecto,
22
- en la misma conversación, recordando lo mismo.
17
+ Codex, Claude Code, Gemini CLI y OpenCode trabajando sobre tus proyectos,
18
+ en la misma conversación, recordando lo mismo. Todos tus proyectos en un lugar,
19
+ y un Coordinador que los ve desde arriba.
23
20
 
24
21
  ```
25
- npx @jossuealcala/madre start
22
+ npx @jossuealcala/madre
26
23
  ```
27
24
 
28
25
  Eso es todo. No hay cuenta que crear, ni nube que configurar, ni llave que pegar.
29
26
  MADRE usa las sesiones que esas CLIs ya tienen en tu máquina.
30
27
 
31
28
  <p align="center">
32
- <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/room.png" alt="La sala de MADRE: Codex y Claude respondiendo en el mismo hilo sobre el mismo proyecto" width="100%">
29
+ <a href="https://github.com/jossuealcacao-exe/madre/blob/main/docs/media/1.0/madre-1-0.mp4"><img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/madre-1-0-video.webp" alt="Ver MADRE 1.0 en 90 segundos" width="100%"></a>
33
30
  </p>
34
31
 
35
- <p align="center"><sub>Una pregunta. Dos agentes. El segundo leyó al primero.</sub></p>
32
+ <p align="center"><sub>MADRE 1.0 en 90 segundos: pantallas reales sobre proyectos de ejemplo. También en <a href="https://madre.run">madre.run</a>.</sub></p>
36
33
 
37
34
  <br>
38
35
 
@@ -40,36 +37,93 @@ MADRE usa las sesiones que esas CLIs ya tienen en tu máquina.
40
37
 
41
38
  <br>
42
39
 
40
+ ## Lo nuevo en 1.0
41
+
42
+ - **Inicio**: todos tus proyectos en un lugar, abiertos o dormidos, con lo que pasó en cada uno.
43
+ - **El Coordinador**: un agente que lee entre tus proyectos, firma conexiones y lleva órdenes de uno a otro.
44
+ - **Conexiones**: un proyecto consulta lo que otro ya aprendió, solo si tú lo firmas.
45
+ - **Permisos a tu manera**: de `#0` Incógnito a `#4` Acceso total, con la llave que tú eliges.
46
+ - **Ajustes y Diagnóstico**: todo lo que configuras en una ventana, y el remedio cuando algo falla.
47
+ - **Módulos como apps**, varias conversaciones a la vez y un editor de código en el visor.
48
+
49
+ Si vienes de 0.7.2, tus proyectos, conversaciones, memoria y ajustes se quedan. El detalle, en el [CHANGELOG](CHANGELOG.md).
50
+
51
+ <br>
52
+
43
53
  ## Una conversación, no cuatro terminales
44
54
 
45
- Escribes `@codex` y contesta Codex. Escribes `@claude` y contesta Claude, **leyendo lo que Codex acaba de decir**. Pides una mesa redonda y cada uno opina por turno sobre lo mismo.
55
+ <p align="center">
56
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-agentes.webp" alt="Todas tus IAs en un mismo chat: Claude contesta después de Codex, con la línea de traspaso que dice cuántos mensajes recibió" width="100%">
57
+ </p>
58
+
59
+ Escribes `@codex` y contesta Codex. Escribes `@claude` y contesta Claude, **leyendo lo que Codex acaba de decir**. Escribes «@madre, pregúntale al equipo…» y cada uno opina por turno sobre lo mismo; al final, @madre resume en qué coinciden y en qué no, citando cada respuesta.
60
+
61
+ <p align="center">
62
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/mesa-redonda.gif" alt="Una mesa redonda en MADRE 1.0: la pregunta, el plan de @madre y las respuestas de cada agente" width="100%">
63
+ </p>
46
64
 
47
65
  Hoy eso son cuatro ventanas, cuatro contextos y tú copiando y pegando entre ellas. MADRE lo vuelve un hilo.
48
66
 
67
+ ## Todos tus proyectos, en un lugar
68
+
69
+ <p align="center">
70
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-inicio.webp" alt="Inicio de MADRE 1.0: el Coordinador con su resumen reciente, quién te espera, las conexiones y una tarjeta por proyecto" width="100%">
71
+ </p>
72
+
73
+ `madre` abre **Inicio**. La primera vez te acompaña en tres pasos: conectar tus agentes (una vez para todos tus proyectos), agregar tus carpetas y abrir las que vas a usar. Cada tarjeta dice si un agente trabaja, si alguien te espera y qué se decidió mientras no estabas.
74
+
75
+ ## Un Coordinador que ve todos tus proyectos
76
+
77
+ <p align="center">
78
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-coordinador.webp" alt="El Coordinador responde qué se decidió en dos proyectos conectados, diciendo de cuál sacó cada dato" width="100%">
79
+ </p>
80
+
81
+ El **Coordinador** vive en Inicio. Lee lo que tus proyectos aprendieron —solo de los que conectas tú— y te contesta diciendo de qué proyecto sacó cada dato. Si lo permites, lleva tareas de un proyecto a otro, hasta `#2`; lo que pide más permiso llega como propuesta que tú desbloqueas. Desde cualquier proyecto le preguntas con `/bishop`.
82
+
83
+ Una **conexión** dice qué tipos de nota cruzan (decisiones, hechos, preferencias, preguntas) y hasta cuándo. Nunca tus archivos ni tus conversaciones, y se revoca cuando quieras.
84
+
49
85
  ## Una memoria que sobrevive a la sesión
50
86
 
51
- Todo lo que se dice queda indexado. Cuando la conversación pasa de la ventana de contexto, cada agente recibe de vuelta lo que hace falta, citado. Cada diez intercambios, la sala destila lo dicho en notas con tipo: una decisión, un hecho, una preferencia, una pregunta abierta.
87
+ <p align="center">
88
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-memoria.webp" alt="El Mapa de memoria: memorias de colores alrededor de un núcleo de magma, unidas por sus enlaces" width="100%">
89
+ </p>
52
90
 
53
- Preguntas *«¿por qué elegimos Postgres?»* tres semanas después y la sala contesta, aunque esa decisión la tomara otro agente en otra sesión.
91
+ Todo lo que se dice queda indexado. Cuando la conversación pasa de la ventana de contexto, cada agente recibe de vuelta lo que hace falta, citado. Cada diez intercambios, el proyecto destila lo dicho en notas con tipo: una decisión, un hecho, una preferencia, una pregunta abierta.
54
92
 
55
- Con [Ollama](https://ollama.com) corriendo, esa memoria además **habla**: `@madre` es un quinto agente, local, gratis, que responde desde todo el archivo con citas y no escribe nada.
93
+ Preguntas *«¿por qué elegimos Postgres?»* tres semanas después y el proyecto contesta, aunque esa decisión la tomara otro agente en otra sesión.
56
94
 
57
- Y la puedes **ver**. En NOSTROMO el archivo es un cerebro en tres dimensiones que giras con el ratón: cada memoria es una estrella cuyo brillo dice cuánto la usa la sala y cuya superficie cuenta si la confirmaste, si nadie la ha revisado o si se está enfriando. En MEMORIA, un tablero te dice qué tan bien está contestando el archivo y qué conviene hacer después.
95
+ Con [Ollama](https://ollama.com) corriendo, esa memoria además **habla**: `@madre` es un quinto agente, local, gratis, que responde desde todo el archivo con citas y no escribe nada. Y la puedes **ver**: el **Mapa de memoria** es un cerebro en tres dimensiones que giras con el ratón, donde cada memoria es una estrella del color de su tipo.
58
96
 
59
97
  ## Leen por defecto. Escriben cuando tú lo dices.
60
98
 
99
+ <p align="center">
100
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-permisos.webp" alt="El menú de modos de MADRE 1.0, de #0 Incógnito a #4 Acceso total" width="100%">
101
+ </p>
102
+
61
103
  Cada mensaje sale con un modo de permiso, y tu modo es el techo de todo lo que ese mensaje arranque.
62
104
 
63
105
  | | | |
64
106
  |---|---|---|
65
- | `#1` | **EXCHANGE** | Leer y coordinar. El predeterminado. |
66
- | `#2` | **CREATE** | Añadir archivos nuevos. Lo que ya existía se restaura al terminar. |
67
- | `#3` | **CONTROL** | Editar el proyecto. Checkpoint antes, lista de cambios y `UNDO` después. |
68
- | `#4` | **AIRLOCK** | Comandos, `git push`, deploys. Pide dos llaves. |
107
+ | `#1` | **SOLO CONVERSAR** | Leer y coordinar. El predeterminado. |
108
+ | `#2` | **CREAR** | Añadir archivos nuevos. Lo que ya existía se restaura al terminar. |
109
+ | `#3` | **EDITAR** | Editar el proyecto. Punto de restauración antes, lista de cambios y `DESHACER` después. |
110
+ | `#4` | **ACCESO TOTAL** | Comandos, `git push`, deploys. Pide la llave dos veces. |
111
+
112
+ También hay `#0 INCÓGNITO`, para lo que no debe quedar en ninguna parte.
69
113
 
70
- También hay `#0 GHOST`, para lo que no debe quedar en ninguna parte.
114
+ Subir a `#3` o `#4` es deliberado: MADRE te pide tu llave —por defecto, el nombre de la carpeta del proyecto; en Ajustes › Permisos puedes elegir una frase tuya— y la comprueba el propio proyecto. Ningún agente puede concederse un permiso escribiéndolo en su respuesta.
115
+
116
+ <p align="center">
117
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-deshacer.webp" alt="Claude cambió tres archivos en #3 Editar y el botón Deshacer regresa el proyecto al punto de restauración" width="100%">
118
+ </p>
71
119
 
72
- Subir a `#3` o `#4` es una ceremonia deliberada: MADRE te pide el nombre de la carpeta del proyecto, escrito por ti. Ningún agente puede concederse un permiso escribiéndolo en su respuesta.
120
+ ## Tu espacio, a tu medida
121
+
122
+ <p align="center">
123
+ <img src="https://raw.githubusercontent.com/jossuealcacao-exe/madre/main/docs/media/1.0/ksp-espacio.webp" alt="La conversación a la izquierda y el editor de código al lado, en modo Editar" width="100%">
124
+ </p>
125
+
126
+ Cada panel se abre al lado o en una ventana que mueves. Varias conversaciones trabajan a la vez, el visor edita código, los servidores de tu proyecto se abren dentro de MADRE y la barra se arma con clic derecho. **Ajustes** (⌘ ,) reúne todo lo que configuras, con buscador, y **Diagnóstico** te da el remedio cuando algo falla.
73
127
 
74
128
  <br>
75
129
 
@@ -79,9 +133,9 @@ Subir a `#3` o `#4` es una ceremonia deliberada: MADRE te pide el nombre de la c
79
133
 
80
134
  ## Hazla tuya
81
135
 
82
- MADRE trae ocho módulos. El noveno lo escribes tú — o se lo pides a un agente.
136
+ MADRE trae doce módulos —Ahorro de tokens, Intenciones, IA local, GitHub, Continuidad y más—, en un tablero como de apps. El siguiente lo escribes tú, o se lo pides a un agente.
83
137
 
84
- **Un módulo es un archivo.** Sin build, sin dependencias, sin registrarse en ningún lado. Lo copias a una carpeta, pulsas RELOAD y aparece con su interruptor, sus ajustes y su ficha. Con uno puedes añadir un comando `/loquesea` que la sala entiende, darle a los agentes una herramienta que antes no tenían, cambiar cómo se comporta la sala, o conectarla con algo que ya usas.
138
+ **Un módulo es un archivo.** Sin build, sin dependencias, sin registrarse en ningún lado. Lo copias a una carpeta, recargas y aparece con su interruptor, sus ajustes y su ficha. Con uno puedes añadir un comando `/loquesea` que el proyecto entiende, darle a los agentes una herramienta que antes no tenían, cambiar cómo se comporta MADRE, o conectarla con algo que ya usas.
85
139
 
86
140
  **O no lo escribes tú.** En la caja de texto:
87
141
 
@@ -93,9 +147,9 @@ El agente lee el SDK, escribe el archivo, y MADRE te enseña una tarjeta para re
93
147
 
94
148
  **Conectarla con un servicio de fuera** es lo que más se pide, y la respuesta corta es *casi siempre sí*: el límite no es MADRE, es cómo ese servicio deja que entregues tu propia llave. Vale la pena cuando la consigues en menos de cinco minutos sin ser desarrollador y la puedes revocar sola — GitHub, Linear, Notion, Jira, Slack, Telegram, Stripe, Shopify, Odoo, cualquier base de datos. Donde hay muro es donde el proveedor exige revisar tu app antes de dejarte pasar: Gmail en lectura, Meta, banca.
95
149
 
96
- Tu módulo declara qué llave necesita y MADRE dibuja el campo; declara a dónde llega y el registro de salidas responde por él; declara qué herramientas suyas **mandan** algo, y la sala se las retira a los agentes salvo en el peldaño `#4`. Nada de eso lo programas: lo declaras.
150
+ Tu módulo declara qué llave necesita y MADRE dibuja el campo; declara a dónde llega y el registro de salidas responde por él; declara qué herramientas suyas **mandan** algo, y el proyecto se las retira a los agentes salvo en el peldaño `#4`. Nada de eso lo programas: lo declaras.
97
151
 
98
- **[Escribir un módulo →](docs/SDK.md)** · con dos ejemplos completos que funcionan tal cual: [el mínimo](docs/sdk/hello-module.mjs) y [un conector](docs/sdk/connector-module.mjs).
152
+ **[Escribir un módulo →](docs/SDK.md)** · con dos ejemplos completos que funcionan tal cual: [el mínimo](docs/sdk/hello-module.mjs) y [una integración](docs/sdk/connector-module.mjs).
99
153
 
100
154
  <br>
101
155
 
@@ -109,11 +163,11 @@ Esto importa más que cualquier función.
109
163
 
110
164
  **No hay nube.** MADRE no tiene servidor, ni cuenta, ni backend. Corre en `127.0.0.1` y se muere cuando cierras la terminal.
111
165
 
112
- **Tus llaves, donde hacen falta y en ningún otro lado.** Cuando das la llave de un agente, MADRE la escribe en el archivo donde ese CLI la busca, cerrada a tu usuario, y no conserva copia. Un conector no tiene CLI al que dársela, así que esa —y solo esa— la guarda MADRE, en su propia bodega de tu máquina, con permisos de solo tu usuario, aceptada únicamente desde esta computadora. Nunca en su config, ni en su registro, ni en sus logs, ni en lo que lee un agente: la ficha solo muestra que hay una guardada y cuántos caracteres tiene.
166
+ **Tus llaves, donde hacen falta y en ningún otro lado.** Cuando das la llave de un agente, MADRE la escribe en el archivo donde ese CLI la busca, cerrada a tu usuario, y no conserva copia. Una integración no tiene CLI al que dársela, así que esa —y solo esa— la guarda MADRE, en su propia bodega de tu máquina, con permisos de solo tu usuario, aceptada únicamente desde esta computadora. Nunca en su config, ni en su registro, ni en sus logs, ni en lo que lee un agente: la ficha solo muestra que hay una guardada y cuántos caracteres tiene.
113
167
 
114
- **Nada sale por su cuenta.** Lo que un agente lee viaja a *su* proveedor, con tu cuenta y tus límites — como si lo hubieras corrido en tu terminal, porque eso es exactamente lo que MADRE hace. Los dos únicos envíos propios están bajo tu interruptor: una consulta diaria a npm por si hay versión nueva, y los reportes de fallos, apagados por defecto.
168
+ **Nada sale por su cuenta.** Lo que un agente lee viaja a *su* proveedor, con tu cuenta y tus límites — como si lo hubieras corrido en tu terminal, porque eso es exactamente lo que MADRE hace. Lo que MADRE consulta por su cuenta está declarado, con lo que lo apaga: la consulta diaria de versiones nuevas (npm y GitHub), la cuota de tu plan de Claude, los embeddings e imágenes de Gemini si los activas, y los reportes de fallos, apagados por defecto. Y una vez al día, siempre, un aviso de que esta copia sigue en uso: un identificador al azar, la versión de MADRE, el sistema y la versión de Node. Sin tu nombre, tu correo, tu IP ni nada de tus proyectos; es como el autor sabe cuántas personas usan MADRE.
115
169
 
116
- **Y te deja leerlo.** Dentro de la sala puedes abrir el documento exacto que MADRE escribe en tu nombre cada turno, el comando exacto con el que lo entrega, y el registro de cada llamada que salió de esta máquina. No es una promesa: es una pantalla.
170
+ **Y te deja leerlo.** Toca el núcleo del Mapa de memoria y se abre «Lo que se envía»: el documento exacto que MADRE escribe en tu nombre cada turno, el comando exacto con el que lo entrega, y el registro de cada llamada que salió de esta máquina. No es una promesa: es una pantalla.
117
171
 
118
172
  **Cero dependencias.** Node y nada más.
119
173
 
@@ -127,18 +181,24 @@ Esto importa más que cualquier función.
127
181
 
128
182
  Necesitas **Node 22.5** o superior y al menos una de estas CLIs con sesión iniciada: Codex, Claude Code, Gemini CLI u OpenCode.
129
183
 
184
+ ```
185
+ npx @jossuealcala/madre
186
+ ```
187
+
188
+ Desde cualquier carpeta, abre **Inicio** en `http://127.0.0.1:4317/salas`: todos tus proyectos en un lugar, con el Coordinador arriba. La primera vez te acompaña en tres pasos: **conectar tus agentes** (instalar y firmar cada CLI ahí mismo, una vez para todos tus proyectos), **agregar tus proyectos** (eliges las carpetas; agregarlas no las abre) y **abrir** los que vas a usar. Cada proyecto corre por su cuenta, con su propia memoria.
189
+
190
+ Si prefieres entrar directo a un proyecto, como antes:
191
+
130
192
  ```
131
193
  cd tu-proyecto
132
194
  npx @jossuealcala/madre start
133
195
  ```
134
196
 
135
- La sala abre en `http://127.0.0.1:4317`. **Si no tienes ninguna CLI, ábrela igual**: lo primero que ves es el puente, con un botón para instalar y firmar cada agente ahí mismo. MADRE enseña el comando antes de correrlo y transmite cada línea a la pantalla.
136
-
137
197
  ```
138
198
  npx @jossuealcala/madre doctor # qué hay instalado, quién tiene sesión
139
199
  ```
140
200
 
141
- La sala habla **español**. El botón `EN` la pasa a inglés.
201
+ MADRE habla **español**. En Ajustes › Apariencia la pasas a inglés.
142
202
 
143
203
  <br>
144
204
 
@@ -157,14 +217,19 @@ Beta pública. El núcleo está probado y bajo CI en macOS y Linux con Node 22 y
157
217
 
158
218
  Una versión se cierra cuando está en npm. El detalle de cada una en [CHANGELOG.md](CHANGELOG.md); lo que viene, en el [roadmap](https://github.com/jossuealcacao-exe/madre/blob/main/docs/ROADMAP.md).
159
219
 
160
- Problemas: desde MU/TH/UR (`✎ FEEDBACK`) o en [issues](https://github.com/jossuealcacao-exe/madre/issues).
220
+ Problemas: desde cada remedio de Diagnóstico («¿No se arregló?») o en [issues](https://github.com/jossuealcacao-exe/madre/issues).
161
221
  Seguridad: [SECURITY.md](SECURITY.md) · Contribuir: [CONTRIBUTING.md](CONTRIBUTING.md)
162
222
 
163
223
  MADRE es gratis y seguirá siéndolo. Si te ahorra tiempo y quieres que siga creciendo,
164
224
  puedes [apadrinarla](https://github.com/sponsors/jossuealcacao-exe). Nada del producto
165
225
  cambia según lo que hagas con ese enlace.
166
226
 
167
- Apache-2.0 · [Jossué Alcalá](https://jossuealcala.com/en/)
227
+ Apache-2.0 · [Jossue Alcalá](https://jossuealcala.com/en/)
228
+
229
+ El código es libre: úsalo, modifícalo y haz forks. El nombre **MADRE**, su logo y madre.run son
230
+ marcas de Jossue Alcalá. Un fork que se distribuya conserva el archivo [`NOTICE`](NOTICE) con la línea
231
+ «Based on MADRE by Jossue Alcalá», y si cambia el código lleva otro nombre. Qué sí y qué no:
232
+ [TRADEMARKS.md](TRADEMARKS.md).
168
233
 
169
234
  <br>
170
235
 
package/TRADEMARKS.md ADDED
@@ -0,0 +1,65 @@
1
+ # Marca MADRE · MADRE trademark policy
2
+
3
+ **Español** · [English below](#english)
4
+
5
+ El código de MADRE es libre bajo la [licencia Apache 2.0](LICENSE): puedes usarlo, estudiarlo,
6
+ modificarlo, hacer forks y distribuirlos, también con fines comerciales. **El nombre no viene
7
+ incluido.** «MADRE», su logo y madre.run son marcas de Jossue Alcalá, y la licencia no da
8
+ permiso de usarlas (sección 6). Esta página dice qué sí y qué no.
9
+
10
+ ## Lo que siempre debe hacer un fork
11
+
12
+ - **Decir de dónde viene.** Conserva el archivo [`NOTICE`](NOTICE) con la línea
13
+ `Based on MADRE by Jossue Alcalá — https://madre.run`. La licencia lo exige (sección 4.d).
14
+ - **Conservar los avisos de copyright** de los archivos que vengan de MADRE (sección 4.c).
15
+ - **Indicar que lo cambiaste** en los archivos que modifiques (sección 4.b).
16
+
17
+ Te pedimos además que la frase «Basado en MADRE» aparezca donde tu proyecto diga quién lo hizo:
18
+ el README, la pantalla «Acerca de» o el pie de página.
19
+
20
+ ## Lo que sí puedes hacer sin pedir permiso
21
+
22
+ - Usar MADRE tal cual, con su nombre, para ti o tu equipo.
23
+ - Redistribuir MADRE **sin modificar** con su nombre.
24
+ - Decir con palabras que tu proyecto está «basado en MADRE», «hecho para MADRE» o «compatible con
25
+ MADRE», sin hacer creer que es oficial.
26
+ - Escribir módulos para MADRE y llamarlos «módulo X para MADRE».
27
+ - Hablar de MADRE en artículos, videos, cursos y reseñas.
28
+
29
+ ## Lo que necesita otro nombre
30
+
31
+ - Una versión **modificada** que distribuyas: lleva un nombre y un logo propios que no se
32
+ confundan con MADRE (no «MADRE Pro», «MADRE+», «NeoMADRE» ni similares).
33
+ - Un servicio, una app o un paquete que se presente como MADRE o como su versión oficial.
34
+ - Dominios, paquetes de npm, cuentas o repositorios cuyo nombre haga creer que son de MADRE.
35
+ - El logo de MADRE en cualquier cosa que no sea MADRE sin modificar.
36
+
37
+ ## Si tienes duda
38
+
39
+ Escribe a Jossue Alcalá en [jossuealcala.com](https://jossuealcala.com) antes de publicar. Esta
40
+ política puede cambiar; la versión vigente es la de este repositorio.
41
+
42
+ ---
43
+
44
+ ## English
45
+
46
+ MADRE's code is free under the [Apache License 2.0](LICENSE): use it, study it, modify it, fork
47
+ it and redistribute it, commercially too. **The name is not included.** "MADRE", its logo and
48
+ madre.run are trademarks of Jossue Alcalá, and the License grants no permission to use them
49
+ (Section 6).
50
+
51
+ **Every fork must:** keep the [`NOTICE`](NOTICE) file with the line
52
+ `Based on MADRE by Jossue Alcalá — https://madre.run` (required by Section 4(d)); keep the
53
+ copyright notices of files that come from MADRE (4(c)); and mark the files it changed (4(b)). We
54
+ also ask that "Based on MADRE" appears wherever your project says who made it.
55
+
56
+ **You may, without asking:** use MADRE as is, under its name; redistribute it unmodified under
57
+ its name; say your project is "based on MADRE", "made for MADRE" or "compatible with MADRE" without
58
+ implying it is official; name a module "X for MADRE"; write and talk about MADRE.
59
+
60
+ **Needs a different name:** any modified version you distribute (its own name and logo, nothing
61
+ confusable such as "MADRE Pro" or "MADRE+"); anything presented as MADRE or its official
62
+ version; domains, npm packages, accounts or repositories that look like MADRE's; the logo on
63
+ anything that is not unmodified MADRE.
64
+
65
+ In doubt, contact Jossue Alcalá at [jossuealcala.com](https://jossuealcala.com) before publishing.
package/bin/madre.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { resolve } from 'node:path';
3
+ import { join, resolve } from 'node:path';
4
+ import { homedir } from 'node:os';
4
5
  import { execFileSync } from 'node:child_process';
5
6
  import { readFile, stat } from 'node:fs/promises';
6
7
  import { openUrl, startPulse } from '../src/server.mjs';
@@ -10,6 +11,7 @@ import { probeAll } from '../src/auth-probe.mjs';
10
11
  import { applyConfigToEnv, loadConfig } from '../src/config.mjs';
11
12
  import { isOnline, runSetup } from '../src/setup.mjs';
12
13
  import { parseArgs } from '../src/cli-args.mjs';
14
+ import { ensureSalasProject, isSalasRoom, projectRootFor } from '../src/salas.mjs';
13
15
  import { createServer } from 'node:net';
14
16
 
15
17
  const cli = parseArgs(process.argv.slice(2));
@@ -77,7 +79,15 @@ async function openRoom(options) {
77
79
  process.exit(2);
78
80
  }
79
81
 
80
- const projectRoot = resolve(option('--project', process.cwd()));
82
+ const stateRoot = process.env.PULSE_HOME;
83
+ // Which project this run is about (src/salas.mjs, docs/MACROVERSO.md D-S09): the one named with
84
+ // --project; the room of Salas for `madre salas`, and for a bare `madre` from the home folder;
85
+ // anywhere else, the folder MADRE was run from. The notebook of Salas lives under MADRE's own
86
+ // state, `~/.pulse/salas` unless PULSE_HOME says where that state is.
87
+ const salasHome = stateRoot ?? join(homedir(), '.pulse');
88
+ const projectRoot = projectRootFor({ command, named: cli.named, project: option('--project', null), cwd: process.cwd(), home: homedir(), stateRoot: salasHome });
89
+ // The lobby opens on its list of projects; a project's room on its conversation.
90
+ const openPath = isSalasRoom(projectRoot, salasHome) ? '/salas' : '';
81
91
  const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(Number);
82
92
  if (nodeMajor < 22 || (nodeMajor === 22 && nodeMinor < 5)) {
83
93
  console.error(`\n MOTHER › MADRE needs Node 22.5 or newer (found ${process.version}): the room's memory runs on node:sqlite.\n`);
@@ -91,8 +101,10 @@ if (has('--version') || has('-v') || command === 'version') {
91
101
  console.log(`madre ${pkg.version}${commit ? ` · ${commit}` : ''} · node ${process.version}`);
92
102
  process.exit(0);
93
103
  }
94
- const stateRoot = process.env.PULSE_HOME;
95
104
  if (command !== 'help') {
105
+ // The notebook of Salas is MADRE's own folder: made here, empty, the first time it is opened
106
+ // (D-S08). If it cannot be made, the check below says so, as for any folder that is not there.
107
+ if (isSalasRoom(projectRoot, salasHome)) await ensureSalasProject(salasHome).catch((error) => console.error(` MOTHER › could not make the folder of Salas at ${projectRoot}: ${error.message}`));
96
108
  const stats = await stat(projectRoot).catch(() => null);
97
109
  if (!stats?.isDirectory()) {
98
110
  console.error(`\n MOTHER › project folder not found: ${projectRoot}\n Pass an existing directory with --project, or run MADRE from inside the project.\n`);
@@ -107,7 +119,7 @@ if (command === 'doctor' && (has('--catalog') || has('--conditions'))) {
107
119
  const query = option('--catalog', '') || option('--conditions', '') || '';
108
120
  const platform = PLATFORMS[process.platform] ? process.platform : 'linux';
109
121
  const list = query && !query.startsWith('--') ? searchConditions(query) : CONDITIONS;
110
- console.log(`\nMU/TH/UR · KNOWN CONDITIONS · ${list.length} OF ${CONDITIONS.length} · ${PLATFORMS[platform].label.toUpperCase()} / ${PLATFORMS[platform].shell.toUpperCase()}\n`);
122
+ console.log(`\nDIAGNOSTICS · KNOWN CONDITIONS · ${list.length} OF ${CONDITIONS.length} · ${PLATFORMS[platform].label.toUpperCase()} / ${PLATFORMS[platform].shell.toUpperCase()}\n`);
111
123
  for (const condition of list) {
112
124
  console.log(`▌ ${condition.title}`);
113
125
  console.log(` ${condition.id} · ${condition.severity}${condition.agent ? ` · @${condition.agent}` : ''}`);
@@ -178,11 +190,13 @@ if (command === 'doctor' && (has('--catalog') || has('--conditions'))) {
178
190
  } else if (command === 'setup') {
179
191
  const { action, online } = await runSetup({ projectRoot, stateRoot });
180
192
  if (action === 'start') {
181
- await openRoom({ port: Number(option('--port', '4317')), projectRoot, openBrowser: !has('--no-open') });
193
+ await openRoom({ port: Number(option('--port', '4317')), projectRoot, openBrowser: !has('--no-open'), openPath });
182
194
  } else {
183
195
  process.exitCode = action === 'report' && !online ? 1 : 0;
184
196
  }
185
- } else if (command === 'start') {
197
+ } else if (command === 'start' || command === 'salas' || command === 'lobby') {
198
+ // `madre salas` is `madre start` on the notebook of Salas (projectRoot, above): the same look
199
+ // for a room already open, the same walk up the ports, the same browser unless --no-open.
186
200
  const port = Number(option('--port', '4317'));
187
201
  const noOpen = has('--no-open');
188
202
  // First contact happens in the room, not here: MADRE opens even with nobody online and the
@@ -195,20 +209,26 @@ if (command === 'doctor' && (has('--catalog') || has('--conditions'))) {
195
209
  // A room for this project may already be open. Show that one instead of starting a second.
196
210
  const running = await roomAlreadyOpen(port, projectRoot);
197
211
  if (running) {
198
- console.log(`\nMADRE is already open for this project\n\n ${running.url}\n Project: ${projectRoot}\n Close that room first if you want a fresh one.\n`);
199
- if (!noOpen) openUrl(running.url);
212
+ console.log(`\nMADRE is already open for this project\n\n ${running.url}${openPath}\n Project: ${projectRoot}\n Close that room first if you want a fresh one.\n`);
213
+ if (!noOpen) openUrl(`${running.url}${openPath}`);
200
214
  process.exit(0);
201
215
  }
202
- await openRoom({ port, projectRoot, openBrowser: !noOpen });
216
+ await openRoom({ port, projectRoot, openBrowser: !noOpen, openPath });
203
217
  } else if (command === 'help') {
204
218
  console.log(`MADRE
205
219
 
220
+ madre [--port 4317] [--no-open]
221
+ Opens Home: every project on this computer, in one place.
206
222
  madre start [--project PATH] [--port 4317] [--no-open] [--setup]
223
+ Opens the project in this folder (or PATH) directly.
207
224
  Without --port, a busy 4317 falls through to the next free port.
225
+ madre lobby [--port 4317] [--no-open] (also: madre salas; opens Home)
208
226
  madre setup [--project PATH] [--port 4317] [--no-open]
209
227
  madre doctor [--project PATH] [--json]
210
228
 
211
- start Opens the project room. With nobody online, runs setup first.
229
+ (none) Opens Home. From there you add projects, connect the agents
230
+ and enter any project. The Coordinator lives there.
231
+ start Opens the project in this folder. From your home folder, Home.
212
232
  setup Detects the agents on this computer, shows who has a session,
213
233
  and runs each agent's own sign-in from here.
214
234
  doctor Prints the same diagnosis without the wizard.
package/docs/INTERNALS.md CHANGED
@@ -82,7 +82,7 @@ Los alcances de imagen de Claude, Gemini y OpenCode se cumplen con **Image Studi
82
82
 
83
83
  Un turno en `#2` toma la misma fotografía que CONTROL, sin asiento: varios turnos `#2` pueden correr a la vez. Al terminar, `diff` contra la fotografía: los archivos añadidos se conservan y se registran como `artifacts.created` con su ruta en el proyecto; los modificados, renombrados o borrados se restauran desde la fotografía y se anuncian en `create.reverted`. Las zonas prohibidas se restauran igual que en CONTROL. Cada CLI recibe sus herramientas de escritura sobre el proyecto: Claude Code niega `Write` si `Edit` no está permitido en la misma ruta y OpenCode deja sin herramienta de escritura si `edit` está denegado (ambos verificados con el CLI real), así que en `#2` van juntas y la garantía de "solo añadir" es la restauración posterior, no la regla previa. Gemini recibe solo `write_file`. El `scratchDir` bajo `.pulse/out/` sigue existiendo para lo que no tiene sitio y para Image Studio.
84
84
 
85
- En un plan, el modo de cada paso es el mínimo entre lo que pidió el orquestador (`@agente #n:`), el techo del plan (el modo del mensaje humano) y el `MAX MODE` del agente. Bajo techo `#3`, un paso `#2` recibe un lease de proyecto emitido a nombre del orquestador y un paso `#3` toma CONTROL con su propio checkpoint, uno a la vez. Bajo techo `#1`, un paso `#2` pasa por la escalación al humano.
85
+ En un plan, el modo de cada paso es el mínimo entre lo que pidió el orquestador (`@agente #n:`; sin número, `#1`, o `#2` si hay lease), el techo del plan (el modo del mensaje humano) y el `MAX MODE` del agente. `#4` nunca llega a un delegado por el techo: solo con la llave de ese agente. Bajo techo `#3`, un paso `#2` recibe un lease de proyecto emitido a nombre del orquestador y un paso `#3` toma CONTROL con su propio checkpoint, uno a la vez. Bajo techo `#1`, un paso `#2` pasa por la escalación al humano. Un paso `#3` o `#4` que supera el techo pide la llave al humano para ese agente; concederla para el plan no eleva el techo de los demás.
86
86
 
87
87
  ## CONTROL por dentro
88
88
 
@@ -90,7 +90,7 @@ Antes del turno, MADRE fotografía el proyecto como un commit real bajo `refs/ma
90
90
 
91
91
  ## Recuperación operativa
92
92
 
93
- Si MADRE se detiene a mitad de un turno, al arrancar detecta los `agent.started` sin cierre y registra un `message.failed` recuperado para cada uno. Al cerrar con Ctrl+C o `SIGTERM`, interrumpe los procesos de agente en curso, registra esos turnos como fallidos, entrega los eventos pendientes a las páginas abiertas y termina. Los planes se ejecutan en secuencia y los delegados no delegan, así que todo plan termina; `STOPALL` corta cualquier cosa en curso.
93
+ Si MADRE se detiene a mitad de un turno, al arrancar detecta los `agent.started` sin cierre y registra un `message.failed` recuperado para cada uno. Al cerrar con Ctrl+C o `SIGTERM`, interrumpe los procesos de agente en curso, registra esos turnos como fallidos, entrega los eventos pendientes a las páginas abiertas y termina. Los planes se ejecutan en secuencia y los delegados no delegan. El orquestador revisa las respuestas y puede abrir otro tramo, hasta tres por petición; `STOPALL` corta cualquier cosa en curso.
94
94
 
95
95
  ## Empaquetado y pruebas
96
96