@jossuealcala/madre 0.7.1 → 1.0.0

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 (165) hide show
  1. package/CHANGELOG.md +833 -1
  2. package/README.md +92 -28
  3. package/SECURITY.md +1 -0
  4. package/bin/madre.mjs +30 -10
  5. package/docs/REFERENCE.md +158 -79
  6. package/docs/SDK.md +23 -19
  7. package/package.json +1 -1
  8. package/public/app.js +11599 -4186
  9. package/public/assets/brand/Geist-latin-ext.woff2 +0 -0
  10. package/public/assets/brand/Geist-latin.woff2 +0 -0
  11. package/public/assets/brand/GeistMono-latin-ext.woff2 +0 -0
  12. package/public/assets/brand/GeistMono-latin.woff2 +0 -0
  13. package/public/assets/brand/JetBrainsMono-latin-ext.woff2 +0 -0
  14. package/public/assets/brand/JetBrainsMono-latin.woff2 +0 -0
  15. package/public/assets/brand/OFL-Geist.txt +93 -0
  16. package/public/assets/brand/OFL-GeistMono.txt +93 -0
  17. package/public/assets/brand/OFL-JetBrainsMono.txt +93 -0
  18. package/public/assets/brand/OFL-Sora.txt +93 -0
  19. package/public/assets/brand/Sora-latin-ext.woff2 +0 -0
  20. package/public/assets/brand/Sora-latin.woff2 +0 -0
  21. package/public/assets/brand/madre-app-180.png +0 -0
  22. package/public/assets/brand/madre-app-192.png +0 -0
  23. package/public/assets/brand/madre-app-512.png +0 -0
  24. package/public/assets/brand/madre-app.svg +1 -0
  25. package/public/assets/brand/madre-favicon.svg +1 -0
  26. package/public/assets/news/1.0/alerts.webp +0 -0
  27. package/public/assets/news/1.0/bar.webp +0 -0
  28. package/public/assets/news/1.0/finder.webp +0 -0
  29. package/public/assets/news/1.0/github.webp +0 -0
  30. package/public/assets/news/1.0/intents.webp +0 -0
  31. package/public/assets/news/1.0/looks.webp +0 -0
  32. package/public/assets/news/1.0/modules.webp +0 -0
  33. package/public/assets/news/1.0/mother.webp +0 -0
  34. package/public/assets/news/1.0/nostromo.webp +0 -0
  35. package/public/assets/news/1.0/permissions.webp +0 -0
  36. package/public/assets/news/1.0/room.webp +0 -0
  37. package/public/assets/news/1.0/settings.webp +0 -0
  38. package/public/assets/wallpapers/biznaga.webp +0 -0
  39. package/public/assets/wallpapers/canela.webp +0 -0
  40. package/public/assets/wallpapers/jarrito.webp +0 -0
  41. package/public/assets/wallpapers/magna.webp +0 -0
  42. package/public/assets/wallpapers/oceano.webp +0 -0
  43. package/public/assets/wallpapers/paraiso.webp +0 -0
  44. package/public/assets/wallpapers/quila.webp +0 -0
  45. package/public/assets/wallpapers/tradicion.webp +0 -0
  46. package/public/assets/wallpapers/tropical.webp +0 -0
  47. package/public/assets/wallpapers/urbania.webp +0 -0
  48. package/public/assets/wallpapers/ventura.webp +0 -0
  49. package/public/assets/wallpapers/xico.webp +0 -0
  50. package/public/brands.js +28 -2
  51. package/public/editor.js +744 -0
  52. package/public/es.js +2863 -1008
  53. package/public/i18n.js +1 -1
  54. package/public/index.html +201 -175
  55. package/public/inquiry.js +11 -11
  56. package/public/loader.js +79 -0
  57. package/public/macroverso.js +1497 -0
  58. package/public/manifest.webmanifest +14 -0
  59. package/public/nostromo-engine.js +2222 -0
  60. package/public/resay.js +24 -0
  61. package/public/review-ask.js +85 -0
  62. package/public/salas-mac.css +787 -0
  63. package/public/salas-mac.html +154 -0
  64. package/public/salas-mac.js +3264 -0
  65. package/public/salas.css +85 -0
  66. package/public/salas.html +47 -0
  67. package/public/salas.js +200 -0
  68. package/public/styles.css +6303 -414
  69. package/public/touch.js +83 -0
  70. package/public/tour-chapters.js +342 -0
  71. package/public/tour.js +510 -0
  72. package/public/troubleshooting.js +159 -140
  73. package/src/adapters/claude.mjs +4 -3
  74. package/src/adapters/codex.mjs +49 -8
  75. package/src/adapters/gemini.mjs +30 -10
  76. package/src/adapters/madre.mjs +110 -18
  77. package/src/adapters/process.mjs +42 -2
  78. package/src/auth-probe.mjs +2 -2
  79. package/src/bridge/devices.mjs +202 -0
  80. package/src/bridge/handoff.mjs +45 -0
  81. package/src/bridge/host.mjs +82 -0
  82. package/src/bridge/network.mjs +133 -0
  83. package/src/bridge/policy.mjs +89 -0
  84. package/src/bridge/qr.mjs +287 -0
  85. package/src/bridge/server.mjs +269 -0
  86. package/src/capabilities.mjs +5 -9
  87. package/src/chats.mjs +59 -22
  88. package/src/checkpoint.mjs +137 -35
  89. package/src/choices.mjs +45 -6
  90. package/src/cli-args.mjs +12 -1
  91. package/src/commands.mjs +15 -15
  92. package/src/config.mjs +73 -9
  93. package/src/conversation-context.mjs +5 -2
  94. package/src/dataset.mjs +3 -1
  95. package/src/directives.mjs +0 -5
  96. package/src/enlaces.mjs +451 -0
  97. package/src/event-store.mjs +55 -10
  98. package/src/exam.mjs +5 -5
  99. package/src/extensions.mjs +0 -2
  100. package/src/file-ops.mjs +42 -0
  101. package/src/files.mjs +52 -2
  102. package/src/github.mjs +407 -0
  103. package/src/json-file.mjs +63 -0
  104. package/src/lease.mjs +2 -2
  105. package/src/lobby-work.mjs +103 -0
  106. package/src/looks.mjs +55 -0
  107. package/src/maturity.mjs +3 -3
  108. package/src/mcp/github-server.mjs +164 -0
  109. package/src/mcp/image-server.mjs +1 -1
  110. package/src/mcp/memory-server.mjs +11 -3
  111. package/src/memory.mjs +38 -12
  112. package/src/models.mjs +109 -1
  113. package/src/modules/ahp.mjs +4 -4
  114. package/src/modules/ash.mjs +1 -1
  115. package/src/modules/bishop-plan.mjs +207 -0
  116. package/src/modules/bishop.mjs +645 -0
  117. package/src/modules/choices.mjs +2 -2
  118. package/src/modules/correo.mjs +1 -1
  119. package/src/modules/enlaces.mjs +255 -0
  120. package/src/modules/git-pulse.mjs +2 -2
  121. package/src/modules/github.mjs +322 -0
  122. package/src/modules/image-studio.mjs +3 -3
  123. package/src/modules/index.mjs +19 -4
  124. package/src/modules/intents-calibration.mjs +338 -0
  125. package/src/modules/intents-desk.mjs +481 -0
  126. package/src/modules/intents-observe.mjs +266 -0
  127. package/src/modules/intents-policy.mjs +414 -0
  128. package/src/modules/intents-try.mjs +91 -0
  129. package/src/modules/intents.mjs +145 -0
  130. package/src/modules/ollama.mjs +9 -5
  131. package/src/modules/playwright.mjs +121 -11
  132. package/src/modules/ripley.mjs +1 -1
  133. package/src/modules/runs.mjs +34 -0
  134. package/src/modules/sdk.mjs +10 -4
  135. package/src/ollama.mjs +25 -1
  136. package/src/outbound.mjs +19 -17
  137. package/src/override.mjs +100 -0
  138. package/src/ports.mjs +23 -1
  139. package/src/prices.mjs +72 -0
  140. package/src/privacy.mjs +30 -11
  141. package/src/quota-sources.mjs +0 -8
  142. package/src/request-guard.mjs +1 -1
  143. package/src/review-ask.mjs +111 -0
  144. package/src/room/archivist.mjs +55 -37
  145. package/src/room/budget.mjs +17 -5
  146. package/src/room/control.mjs +88 -8
  147. package/src/room/economy.mjs +35 -7
  148. package/src/room/escalation.mjs +2 -0
  149. package/src/room/guard.mjs +26 -2
  150. package/src/room/prompt.mjs +32 -13
  151. package/src/room/runs.mjs +151 -0
  152. package/src/room/vectors.mjs +19 -4
  153. package/src/room.mjs +402 -54
  154. package/src/router.mjs +3 -1
  155. package/src/runs.mjs +137 -0
  156. package/src/salas.mjs +313 -0
  157. package/src/sentinel-errors.mjs +1 -1
  158. package/src/server-sentinel.mjs +124 -0
  159. package/src/server.mjs +1578 -167
  160. package/src/setup.mjs +1 -0
  161. package/src/tour.mjs +159 -0
  162. package/src/updates.mjs +48 -8
  163. package/src/usage-sentinel.mjs +1 -1
  164. package/src/verdict.mjs +7 -7
  165. package/src/whats-new.mjs +160 -0
@@ -0,0 +1,154 @@
1
+ <!doctype html>
2
+ <html lang="es">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>MADRE · Lobby</title>
7
+ <link rel="icon" type="image/svg+xml" href="/assets/brand/madre-favicon.svg">
8
+ <link rel="stylesheet" href="/styles.css">
9
+ <link rel="stylesheet" href="/salas-mac.css">
10
+ <!-- Arriving from another MADRE page (a room, Home): a veil of the theme's ground over the first
11
+ frame, lifted as the page rises (styles.css, madre-arriving). Not on a reload, nor on Back. -->
12
+ <script>try { var nav = performance.getEntriesByType('navigation')[0]; var from = document.referrer ? new URL(document.referrer) : null; if (nav && nav.type === 'navigate' && from && /^(127\.0\.0\.1|localhost)$/.test(from.hostname) && from.href !== location.href) { var theme = localStorage.getItem('pulse.theme'); var light = theme === 'light' || (theme !== 'dark' && matchMedia('(prefers-color-scheme: light)').matches); var root = document.documentElement; root.style.setProperty('--arrive-veil', light ? '#f4f5f2' : '#050605'); root.classList.add('madre-arriving'); setTimeout(function () { root.classList.remove('madre-arriving'); }, 900); } } catch (e) {}</script>
13
+ </head>
14
+ <body class="salas-mac">
15
+ <!-- Arriving from RELOAD: the curtain is put back before the first frame with its loader (the
16
+ same markup as loader.js) at the share the page that left had reached; salas-mac.js fills
17
+ the bar once Home has read its projects, and lifts it. -->
18
+ <script>try { var kept = sessionStorage.getItem('madre.curtain'); if (kept) { sessionStorage.removeItem('madre.curtain'); var p = parseFloat(kept); if (!(p > 0 && p < 1)) p = 0.3; var curtain = document.createElement('div'); curtain.className = 'reload-curtain arrived'; curtain.id = 'reload-curtain'; curtain.innerHTML = '<div class="madre-loader" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="' + Math.round(p * 100) + '" data-p="' + p + '" style="--p: ' + p + '"><span class="madre-loader-mark"><svg viewBox="-2 -1 66 22" aria-hidden="true"><path class="madre-loader-trace" d="M1 10H16L20 10L23.5 2L28 18L32 10L35 10L37 6L39 10H52" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path class="madre-loader-beat" d="M1 10H16L20 10L23.5 2L28 18L32 10L35 10L37 6L39 10H52" pathLength="100" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><circle class="madre-loader-dot" cx="60" cy="10" r="3" fill="currentColor"/></svg></span><span class="madre-loader-bar"><i></i></span><span class="madre-loader-pct"></span><span class="madre-loader-said"></span></div>'; curtain.querySelector('.madre-loader-pct').textContent = Math.round(p * 100) + ' %'; if (curtain.showPopover) curtain.popover = 'manual'; document.body.appendChild(curtain); try { if (curtain.showPopover) curtain.showPopover(); } catch (e) {} setTimeout(function () { var still = document.getElementById('reload-curtain'); if (still && !still.classList.contains('leaving')) still.remove(); }, 15000); } } catch (e) {}</script>
19
+ <div class="sm-sky" aria-hidden="true"></div>
20
+ <!-- The lobby's bar, as a room's (index.html, #bar and #bar-home): the logo and where you are;
21
+ what is going on — the projects open, the agents and their sessions, who waits for you, a
22
+ newer MADRE, what is running —; and the keys. Filled by salas-mac.js (drawTopbar). -->
23
+ <header class="sm-top">
24
+ <nav class="sm-topbar" aria-label="Home">
25
+ <a id="sm-back-room" class="sm-back-room" href="/" hidden>
26
+ <svg viewBox="0 0 20 20" aria-hidden="true"><path d="M12.5 4.5 7 10l5.5 5.5" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/></svg><span></span>
27
+ </a>
28
+ <a id="sm-back" class="sm-brand" href="https://madre.run" target="_blank" rel="noopener noreferrer" aria-label="MADRE · madre.run" title="MADRE · madre.run">
29
+ <svg class="brand-logo" viewBox="-4.8 -4.8 377.1 49.6" aria-hidden="true"><g fill="none" stroke-linecap="round" stroke-linejoin="round"><g class="pulse" transform="translate(0 0) scale(2.5) translate(0 -2)"><path class="beat" d="M1 10H16L20 10L23.5 2L28 18L32 10L35 10L37 6L39 10H52" stroke-width="1.92" pathLength="100"/><circle class="beat-dot" cx="60" cy="10" r="3" stroke="none"/></g><g class="word" transform="translate(193.5 7)" stroke-width="4.8"><path d="M0 26V0L14 14.3L28 0V26"/><path transform="translate(36.5 0)" d="M0 26V7.8A7.8 7.8 0 0 1 7.8 0H17.2A7.8 7.8 0 0 1 25 7.8V26M0 15.6H25"/><path transform="translate(71.5 0)" d="M0 0H16A12 12 0 0 1 28 12V14A12 12 0 0 1 16 26H0Z"/><path transform="translate(110.5 0)" d="M0 26V0H20.85A7.15 7.15 0 0 1 28 7.15V7.15A7.15 7.15 0 0 1 20.85 14.3H0M15.12 14.3L28 26"/><path transform="translate(146 0)" d="M28 0H0V26H28M0 13H21"/></g></g></svg>
30
+ </a>
31
+ <span id="sm-crumb" class="sm-crumb">Home</span>
32
+ <span id="sm-live" class="sm-live" role="status"><i></i><span></span></span>
33
+ <div id="sm-tb-open" class="sm-tb-open" aria-label="Projects on the bar"></div>
34
+ <div id="sm-tb-agents" class="sm-tb-agents" aria-label="Agents"></div>
35
+ <span class="sm-spacer"></span>
36
+ <a id="sm-tb-waiting" class="sm-pill is-wait" href="/" hidden><i></i><span></span></a>
37
+ <span id="sm-tour-pill" class="tour-pill-slot" hidden></span>
38
+ <!-- A newer MADRE: it opens Home's Version, where Home restarts with it (salas-mac.js, fillRelease). -->
39
+ <button id="sm-tb-update" class="sm-pill is-update" type="button" hidden><svg viewBox="0 0 20 20" aria-hidden="true"><path d="M10 3.5v8.4M6.6 8.6 10 12l3.4-3.4M3.8 13.2v1.2a2.2 2.2 0 0 0 2.2 2.2h8a2.2 2.2 0 0 0 2.2-2.2v-1.2" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg><span></span></button>
40
+ <button id="sm-stop" class="sm-stop" type="button" hidden>
41
+ <svg viewBox="0 0 20 20" aria-hidden="true"><rect x="5" y="5" width="10" height="10" rx="2.6" fill="currentColor"/></svg>
42
+ <span>Stop all</span>
43
+ </button>
44
+ <button id="sm-tb-links" class="sm-barkey" type="button">
45
+ <svg viewBox="0 0 20 20" aria-hidden="true"><path d="M8.2 11.8 11.8 8.2M9 5.6 10.6 4a3.2 3.2 0 0 1 4.5 4.5L13.5 10M11 14.4 9.4 16a3.2 3.2 0 0 1-4.5-4.5L6.5 10" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
46
+ <span>Connections</span><b id="sm-tb-links-count" class="sm-badge" hidden></b>
47
+ </button>
48
+ <button id="sm-macro" class="sm-barkey sm-macro" type="button" hidden>
49
+ <svg viewBox="0 0 20 20" aria-hidden="true"><ellipse cx="10" cy="10" rx="8.2" ry="3.6" fill="none" stroke="currentColor" stroke-width="1.4" opacity=".6"/><circle cx="10" cy="10" r="2.2" fill="currentColor"/><circle cx="16.4" cy="8.6" r="1.5" fill="currentColor"/><circle cx="4.2" cy="11.6" r="1.1" fill="currentColor" opacity=".7"/></svg>
50
+ <span>Project map</span>
51
+ </button>
52
+ </nav>
53
+ <nav class="sm-topbar sm-tb-home" aria-label="Reload and settings">
54
+ <button id="sm-reload" class="sm-icon-key bar" type="button" aria-label="Reload the page" title="Reload the page">
55
+ <svg viewBox="0 0 20 20" aria-hidden="true"><path d="M16 10a6 6 0 1 1-1.76-4.24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/><path d="M16.1 3.6v3.6h-3.6" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></svg>
56
+ </button>
57
+ <button id="sm-gear" class="sm-icon-key bar" type="button" aria-label="Home settings" title="Home settings">
58
+ <svg viewBox="0 0 20 20" aria-hidden="true"><path fill-rule="evenodd" d="M8.65 3.85L8.92 1.97L11.08 1.97L11.35 3.85L13.40 4.69L14.91 3.56L16.44 5.09L15.31 6.60L16.15 8.65L18.03 8.92L18.03 11.08L16.15 11.35L15.31 13.40L16.44 14.91L14.91 16.44L13.40 15.31L11.35 16.15L11.08 18.03L8.92 18.03L8.65 16.15L6.60 15.31L5.09 16.44L3.56 14.91L4.69 13.40L3.85 11.35L1.97 11.08L1.97 8.92L3.85 8.65L4.69 6.60L3.56 5.09L5.09 3.56L6.60 4.69ZM12.6 10a2.6 2.6 0 1 1-5.2 0a2.6 2.6 0 1 1 5.2 0Z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>
59
+ </button>
60
+ </nav>
61
+ </header>
62
+ <main class="sm-main">
63
+ <section class="sm-hero">
64
+ <h1 id="sm-title" class="visually-hidden">Home</h1>
65
+ <div class="sm-tools">
66
+ <label class="settings-search sm-search">
67
+ <svg viewBox="0 0 20 20" aria-hidden="true"><circle cx="9" cy="9" r="5.2" fill="none" stroke="currentColor" stroke-width="1.6"/><path d="M13 13l3.5 3.5" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
68
+ <input id="sm-search" type="search" autocomplete="off" spellcheck="false" placeholder="Search a project…" aria-label="Search a project…">
69
+ </label>
70
+ <div id="sm-filter" class="sx-seg" role="radiogroup" aria-label="Show">
71
+ <button type="button" role="radio" data-filter="all" aria-checked="true">All projects</button>
72
+ <button type="button" role="radio" data-filter="open" aria-checked="false">Open projects</button>
73
+ <button type="button" role="radio" data-filter="asleep" aria-checked="false">Asleep projects</button>
74
+ </div>
75
+ <button id="sm-add" class="sm-btn primary sm-add" type="button">Add a project</button>
76
+ </div>
77
+ </section>
78
+
79
+ <div class="sm-bento">
80
+ <section id="sm-bishop" class="sm-tile sm-bishop c-8 r-3" aria-labelledby="sm-bishop-name">
81
+ <header class="sm-bishop-head">
82
+ <span id="sm-bishop-mark"></span>
83
+ <div class="sm-bishop-words">
84
+ <h2 id="sm-bishop-name">Coordinator</h2>
85
+ <p id="sm-bishop-state" class="sm-state"><i class="dot"></i><span></span></p>
86
+ </div>
87
+ <div class="sm-bishop-keys">
88
+ <a id="sm-bishop-go" class="sm-btn primary" href="/">Talk to the Coordinator</a>
89
+ <a id="sm-bishop-tab" class="sm-icon-key" href="/" target="_blank" rel="noopener" aria-label="Open the Coordinator in a new tab" title="Open the Coordinator in a new tab">
90
+ <svg viewBox="0 0 20 20" aria-hidden="true"><path d="M11.5 4.5h4v4M15.5 4.5 9 11M8.5 5.5H6.2a1.7 1.7 0 0 0-1.7 1.7v6.6a1.7 1.7 0 0 0 1.7 1.7h6.6a1.7 1.7 0 0 0 1.7-1.7v-2.3" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>
91
+ </a>
92
+ </div>
93
+ </header>
94
+ <p id="sm-bishop-about" class="sm-bishop-about">Your coordinator. It reads across your projects, signs the connections between them and carries an order from one to another.</p>
95
+ <div id="sm-bishop-asks" class="sm-bishop-asks" hidden></div>
96
+ <p id="sm-bishop-error" class="sm-error" hidden></p>
97
+ <section id="sm-work" class="sm-work" aria-labelledby="sm-work-title">
98
+ <header class="sm-work-head">
99
+ <h3 id="sm-work-title">Recent summary</h3>
100
+ <span id="sm-work-by" class="sm-work-by"></span>
101
+ <button id="sm-work-again" class="sm-btn small" type="button">Summarise again</button>
102
+ </header>
103
+ <ul id="sm-work-list" class="sm-work-list"></ul>
104
+ <p id="sm-work-note" class="sm-hint"></p>
105
+ </section>
106
+ </section>
107
+
108
+ <section id="sm-waiting" class="sm-tile sm-waiting c-4 r-1" aria-labelledby="sm-waiting-title">
109
+ <header class="sm-tile-head"><h2 id="sm-waiting-title">Waiting for you</h2><b id="sm-waiting-count" class="sm-big">0</b></header>
110
+ <div id="sm-waiting-body" class="sm-waiting-body"></div>
111
+ </section>
112
+
113
+ <section id="sm-links-tile" class="sm-tile sm-links-tile c-4 r-2" aria-labelledby="sm-links-tile-title">
114
+ <header class="sm-tile-head"><h2 id="sm-links-tile-title">Connections</h2><button id="sm-link" class="sm-btn small" type="button">Connect projects</button></header>
115
+ <div id="sm-map" class="sm-map"></div>
116
+ <footer class="sm-tile-foot"><span id="sm-links-sum" class="sm-hint"></span><button id="sm-links-all" class="sm-btn ghost small" type="button">See the connections</button></footer>
117
+ </section>
118
+ </div>
119
+
120
+ <div id="sm-projects" class="sm-bento sm-projects" aria-live="polite"></div>
121
+ <p id="sm-none" class="sm-none" hidden></p>
122
+
123
+ <div class="sm-bento sm-low">
124
+ <section id="sm-decisions" class="sm-tile c-5" aria-labelledby="sm-decisions-title">
125
+ <header class="sm-tile-head"><h2 id="sm-decisions-title">Recent decisions</h2></header>
126
+ <ol id="sm-decisions-list" class="sm-decisions"></ol>
127
+ </section>
128
+ <section id="sm-attention" class="sm-tile c-4" aria-labelledby="sm-attention-title">
129
+ <header class="sm-tile-head"><h2 id="sm-attention-title">Needs you</h2><span id="sm-attention-count" class="sm-chip port"></span></header>
130
+ <ul id="sm-attention-list" class="sm-attention"></ul>
131
+ </section>
132
+ <section id="sm-memory" class="sm-tile c-3" aria-labelledby="sm-memory-title">
133
+ <header class="sm-tile-head"><h2 id="sm-memory-title">Memory</h2><span id="sm-memory-total" class="sm-chip port"></span></header>
134
+ <div id="sm-memory-body" class="sm-memory-body"></div>
135
+ </section>
136
+ </div>
137
+ <!-- The foot: what Home is, and the room's own corner — which MADRE this is, and whose. -->
138
+ <footer class="sm-foot-row">
139
+ <p id="sm-foot" class="sm-foot"></p>
140
+ <small id="sm-colophon" class="colophon sm-colophon" aria-label="MADRE version" hidden></small>
141
+ </footer>
142
+ </main>
143
+
144
+ <dialog id="sm-links-sheet" class="sm-sheet sm-wide">
145
+ <div class="sm-sheet-body">
146
+ <header class="sm-sheet-head"><h3 id="sm-links-title">Connections</h3><span class="surface-modes"><button id="sm-links-close" class="surface-mode close x-close x-only" type="button" aria-label="Close"><span class="x-icon"><svg viewBox="0 0 20 20" focusable="false" aria-hidden="true"><path d="M5.5 5.5l9 9M14.5 5.5l-9 9" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg></span></button></span></header>
147
+ <p id="sm-links-note" class="hint"></p>
148
+ <div id="sm-links" class="sm-link-list"></div>
149
+ <div class="actions"><button id="sm-link-more" class="sm-btn primary" type="button">Connect projects</button></div>
150
+ </div>
151
+ </dialog>
152
+ <script type="module" src="/salas-mac.js"></script>
153
+ </body>
154
+ </html>