@jossuealcala/madre 1.0.1 → 1.0.2

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/ADDITIONAL-TERMS.md +93 -0
  2. package/CHANGELOG.en.md +1945 -0
  3. package/CHANGELOG.md +34 -1
  4. package/CONTRIBUTING.md +1 -1
  5. package/LICENSE +661 -202
  6. package/NOTICE +26 -14
  7. package/README.en.md +245 -0
  8. package/README.md +19 -10
  9. package/TRADEMARKS.en.md +50 -0
  10. package/TRADEMARKS.md +33 -16
  11. package/bin/madre.mjs +2 -0
  12. package/docs/INTERNALS.md +6 -0
  13. package/docs/REFERENCE.md +11 -2
  14. package/docs/en/INTERNALS.md +103 -0
  15. package/docs/en/REFERENCE.md +339 -0
  16. package/docs/en/SDK.md +306 -0
  17. package/docs/en/training/README.md +59 -0
  18. package/docs/training/README.md +20 -8
  19. package/docs/training/train.sh +2 -1
  20. package/package.json +11 -3
  21. package/public/abduction.js +2 -0
  22. package/public/app.js +1549 -409
  23. package/public/attribution.js +71 -0
  24. package/public/brands.js +3 -1
  25. package/public/editor.js +2 -0
  26. package/public/es.js +620 -400
  27. package/public/i18n.js +25 -1
  28. package/public/index.html +13 -10
  29. package/public/inquiry.js +2 -0
  30. package/public/loader.js +2 -0
  31. package/public/macroverso.js +2 -0
  32. package/public/nostromo-engine.js +2 -0
  33. package/public/resay.js +6 -0
  34. package/public/review-ask.js +2 -0
  35. package/public/routing.js +23 -1
  36. package/public/salas-mac.css +21 -4
  37. package/public/salas-mac.html +5 -1
  38. package/public/salas-mac.js +53 -28
  39. package/public/salas.css +2 -0
  40. package/public/salas.html +1 -0
  41. package/public/salas.js +4 -2
  42. package/public/styles.css +957 -18
  43. package/public/syntax.js +2 -0
  44. package/public/touch.js +2 -0
  45. package/public/tour-chapters.js +2 -0
  46. package/public/tour.js +37 -0
  47. package/public/troubleshooting.js +18 -16
  48. package/src/adapters/claude.mjs +2 -0
  49. package/src/adapters/codex.mjs +2 -0
  50. package/src/adapters/gemini.mjs +3 -1
  51. package/src/adapters/madre.mjs +3 -1
  52. package/src/adapters/opencode.mjs +7 -3
  53. package/src/adapters/process.mjs +2 -0
  54. package/src/asking.mjs +2 -0
  55. package/src/auth-probe.mjs +3 -1
  56. package/src/bridge/devices.mjs +2 -0
  57. package/src/bridge/handoff.mjs +2 -0
  58. package/src/bridge/host.mjs +2 -0
  59. package/src/bridge/network.mjs +2 -0
  60. package/src/bridge/policy.mjs +3 -1
  61. package/src/bridge/qr.mjs +2 -0
  62. package/src/bridge/server.mjs +2 -0
  63. package/src/capabilities.mjs +2 -0
  64. package/src/chats.mjs +2 -0
  65. package/src/checkpoint.mjs +2 -0
  66. package/src/choices.mjs +2 -0
  67. package/src/cli-args.mjs +2 -0
  68. package/src/cold.mjs +2 -0
  69. package/src/commands.mjs +2 -0
  70. package/src/config.mjs +2 -0
  71. package/src/conversation-context.mjs +15 -1
  72. package/src/credentials.mjs +32 -3
  73. package/src/dataset.mjs +2 -0
  74. package/src/directives.mjs +2 -0
  75. package/src/distiller.mjs +2 -0
  76. package/src/embeddings.mjs +2 -0
  77. package/src/enlaces.mjs +6 -4
  78. package/src/event-store.mjs +2 -0
  79. package/src/exam.mjs +6 -4
  80. package/src/extensions.mjs +2 -0
  81. package/src/eyecat-watch.mjs +2 -0
  82. package/src/eyecat.mjs +2 -0
  83. package/src/file-ops.mjs +2 -0
  84. package/src/files.mjs +32 -0
  85. package/src/github.mjs +2 -0
  86. package/src/heartbeat.mjs +2 -0
  87. package/src/i18n.mjs +15 -1
  88. package/src/image-studio.mjs +2 -0
  89. package/src/json-file.mjs +2 -0
  90. package/src/launch.mjs +2 -0
  91. package/src/lease.mjs +5 -1
  92. package/src/lobby-work.mjs +2 -0
  93. package/src/local-ai.mjs +2 -0
  94. package/src/looks.mjs +2 -0
  95. package/src/maturity.mjs +3 -1
  96. package/src/mcp/connect.mjs +345 -0
  97. package/src/mcp/github-server.mjs +2 -0
  98. package/src/mcp/image-server.mjs +2 -0
  99. package/src/mcp/memory-server.mjs +2 -0
  100. package/src/mcp/proxy.mjs +153 -0
  101. package/src/mcp/smtp-server.mjs +2 -0
  102. package/src/memory-dashboard.mjs +2 -0
  103. package/src/memory-tools.mjs +2 -0
  104. package/src/memory.mjs +2 -0
  105. package/src/models.mjs +45 -3
  106. package/src/modules/ahp.mjs +2 -0
  107. package/src/modules/ash-policy.mjs +2 -0
  108. package/src/modules/ash.mjs +3 -1
  109. package/src/modules/bishop-plan.mjs +5 -3
  110. package/src/modules/bishop.mjs +13 -11
  111. package/src/modules/choices.mjs +2 -0
  112. package/src/modules/correo.mjs +2 -0
  113. package/src/modules/enlaces.mjs +2 -0
  114. package/src/modules/git-pulse.mjs +2 -0
  115. package/src/modules/github.mjs +2 -0
  116. package/src/modules/helpers.mjs +2 -0
  117. package/src/modules/image-studio.mjs +3 -1
  118. package/src/modules/index.mjs +4 -1
  119. package/src/modules/intents-calibration.mjs +2 -0
  120. package/src/modules/intents-desk.mjs +4 -2
  121. package/src/modules/intents-observe.mjs +2 -0
  122. package/src/modules/intents-policy.mjs +4 -1
  123. package/src/modules/intents-try.mjs +2 -0
  124. package/src/modules/intents.mjs +8 -6
  125. package/src/modules/mcp-connect.mjs +293 -0
  126. package/src/modules/ollama.mjs +3 -1
  127. package/src/modules/playwright.mjs +25 -10
  128. package/src/modules/ripley.mjs +2 -0
  129. package/src/modules/runs.mjs +5 -3
  130. package/src/modules/sdk.mjs +2 -0
  131. package/src/modules/updates.mjs +2 -0
  132. package/src/mother.mjs +2 -0
  133. package/src/ollama.mjs +2 -0
  134. package/src/outbound.mjs +7 -5
  135. package/src/override.mjs +2 -0
  136. package/src/ports.mjs +2 -0
  137. package/src/prices.mjs +2 -0
  138. package/src/privacy.mjs +2 -0
  139. package/src/quota-monitor.mjs +2 -0
  140. package/src/quota-sources.mjs +2 -0
  141. package/src/request-guard.mjs +2 -0
  142. package/src/review-ask.mjs +2 -0
  143. package/src/room/archivist.mjs +2 -0
  144. package/src/room/attachments.mjs +2 -0
  145. package/src/room/budget.mjs +2 -0
  146. package/src/room/context.mjs +2 -0
  147. package/src/room/control.mjs +7 -1
  148. package/src/room/copilot.mjs +76 -0
  149. package/src/room/economy.mjs +2 -0
  150. package/src/room/escalation.mjs +2 -0
  151. package/src/room/ghost.mjs +2 -0
  152. package/src/room/guard.mjs +2 -0
  153. package/src/room/prompt.mjs +13 -4
  154. package/src/room/returns.mjs +82 -0
  155. package/src/room/runs.mjs +4 -0
  156. package/src/room/vectors.mjs +2 -0
  157. package/src/room.mjs +209 -31
  158. package/src/router.mjs +2 -0
  159. package/src/runs.mjs +2 -0
  160. package/src/runtime-detection.mjs +2 -0
  161. package/src/salas.mjs +2 -0
  162. package/src/sentinel-errors.mjs +2 -0
  163. package/src/server-sentinel.mjs +2 -0
  164. package/src/server.mjs +141 -34
  165. package/src/setup.mjs +2 -0
  166. package/src/smtp.mjs +2 -0
  167. package/src/tour.mjs +2 -0
  168. package/src/updates.mjs +2 -0
  169. package/src/usage-sentinel.mjs +2 -0
  170. package/src/vault.mjs +2 -0
  171. package/src/verdict.mjs +3 -1
  172. package/src/whats-new.mjs +2 -0
package/public/styles.css CHANGED
@@ -1,3 +1,5 @@
1
+ /* SPDX-License-Identifier: AGPL-3.0-only
2
+ MADRE · © 2026 Jossue Alcalá · GNU AGPL v3 with additional terms (Section 7): ADDITIONAL-TERMS.md */
1
3
  /* MADRE — a conversation, not a log.
2
4
  iMessage for the dialogue, a terminal for the metadata, MOTHER for the mood. */
3
5
 
@@ -41,6 +43,9 @@
41
43
  --text-3: #626a5f;
42
44
 
43
45
  --phosphor: #9bff66; /* MOTHER */
46
+ /* MADRE's own green, which an accent never repaints: the copilot wears it (2026-10-14). */
47
+ --madre-green: #9bff66;
48
+ --madre-green-ink: #0a1405;
44
49
  --brew: #28fe14; /* Terminal.app 'Homebrew' green */
45
50
  --brew-ink: #041004;
46
51
  --phosphor-ink: #0a1405;
@@ -121,6 +126,8 @@
121
126
  --text-2: #5a615a;
122
127
  --text-3: #767d75;
123
128
  --phosphor: #2f8a1c;
129
+ --madre-green: #2f8a1c;
130
+ --madre-green-ink: #ffffff;
124
131
  --brew: #178f0c;
125
132
  --brew-ink: #ffffff;
126
133
  --phosphor-ink: #ffffff;
@@ -157,6 +164,8 @@
157
164
  --text-2: #5a615a;
158
165
  --text-3: #767d75;
159
166
  --phosphor: #2f8a1c;
167
+ --madre-green: #2f8a1c;
168
+ --madre-green-ink: #ffffff;
160
169
  --brew: #178f0c;
161
170
  --brew-ink: #ffffff;
162
171
  --phosphor-ink: #ffffff;
@@ -829,6 +838,9 @@ textarea::placeholder { color: var(--text-3); }
829
838
  .composer.m2 { --mode: var(--mode-2); --mode-ink: var(--mode-2-ink); }
830
839
  .composer.m3 { --mode: var(--mode-3); --mode-ink: var(--mode-3-ink); }
831
840
  .composer.m4 { --mode: var(--mode-4); --mode-ink: var(--mode-4-ink); }
841
+ /* Under the copilot #3 is MADRE's green, not EDIT's red: the chip, the send and the ring follow. */
842
+ .composer.m3.copilot { --mode: var(--madre-green); --mode-ink: var(--madre-green-ink); }
843
+ .composer.copilot .picker .mode-chip.m3 { --mode: var(--madre-green); }
832
844
  .field button[type="submit"] { width: 34px; height: 34px; padding: 0; border: 0; border-radius: 50%; background: var(--mode, var(--phosphor)); color: var(--mode-ink, var(--phosphor-ink)); cursor: pointer; display: grid; place-items: center; box-shadow: var(--lift-1); transition: background calc(250ms * var(--motion-scale)), box-shadow calc(250ms * var(--motion-scale)); }
833
845
  .field button[type="submit"] svg { width: 18px; height: 18px; }
834
846
  .field button[type="submit"]:hover { filter: brightness(1.06); }
@@ -1184,7 +1196,11 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
1184
1196
 
1185
1197
  .model-menu.effort-menu { --tone: var(--agent, var(--phosphor)); width: min(400px, calc(100vw - 24px)); padding: 12px 14px 10px; }
1186
1198
  .effort-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 2px 2px 12px; }
1187
- .effort-head .model-menu-title { margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1199
+ /* The title on the left and AUTO in the right corner, on the same line (2026-10-14): the title
1200
+ keeps its room and is cut before it is covered; a long AUTO reading is cut instead of the title. */
1201
+ .effort-head .model-menu-title { flex: 1 1 auto; min-width: 0; margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 1.4; }
1202
+ .effort-head .effort-auto { margin-left: auto; max-width: 52%; }
1203
+ .effort-head .effort-auto .hint { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1188
1204
  /* Letting the CLI decide: a small switch beside the title, lit while it is the choice. */
1189
1205
  .effort-auto { display: inline-flex; align-items: center; gap: 7px; flex: none; height: 26px; padding: 0 10px 0 9px; border: 1px solid var(--line-2); border-radius: 999px; background: transparent; color: var(--text-2); font: inherit; cursor: pointer; transition: color var(--motion) var(--ease-out), border-color var(--motion) var(--ease-out), background-color var(--motion) var(--ease-out); }
1190
1206
  .effort-auto .auto-dot { width: 7px; height: 7px; border-radius: 50%; border: 1.5px solid currentColor; transition: background-color var(--motion) var(--ease-out); }
@@ -1521,6 +1537,8 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
1521
1537
  .viewer-nav { display: inline-flex; gap: 4px; }
1522
1538
  .viewer-nav .nav { width: 26px; height: 26px; display: grid; place-items: center; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); border-radius: 7px; cursor: pointer; font: inherit; font-size: 14px; line-height: 1; }
1523
1539
  .viewer-nav .nav:hover { color: var(--text); border-color: var(--text-3); }
1540
+ /* The browser's reload is the bar's reload mark (2026-10-14), the same drawing, still. */
1541
+ .viewer-nav .nav.reload svg { width: 14px; height: 14px; }
1524
1542
  .viewer-nav .nav:disabled { opacity: .35; cursor: default; }
1525
1543
  .viewer-errors { display: grid; gap: 6px; padding: 8px 16px; border-bottom: 1px solid color-mix(in srgb, var(--danger) 40%, transparent); background: color-mix(in srgb, var(--danger) 7%, transparent); font-family: var(--mono); font-size: 11px; }
1526
1544
  .viewer-errors:not([hidden]) + .viewer-body { height: auto; max-height: calc(100% - 46px); }
@@ -1910,6 +1928,13 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
1910
1928
  .mode-what { min-width: 0; font-size: 13px; line-height: 1.45; color: var(--text); }
1911
1929
  .mode-what .who { display: inline; margin: 0; padding: 0; font: inherit; font-weight: 700; letter-spacing: 0; text-transform: none; color: var(--agent, var(--text)); }
1912
1930
  .mode-why { font-size: 11.5px; line-height: 1.45; color: var(--text-2); }
1931
+ .mode-what .mode-time { font-family: var(--mono); font-size: 11px; letter-spacing: .04em; color: var(--text-2); }
1932
+ /* How long the permission holds: the time the agent asked for, preselected; the human may change it. */
1933
+ .mode-windows { display: inline-flex; flex-wrap: wrap; gap: 4px; padding: 3px; border-radius: 999px; background: color-mix(in srgb, var(--text) 5%, transparent); justify-self: start; }
1934
+ .mode-window { border: 0; border-radius: 999px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 10px; letter-spacing: .08em; padding: 5px 10px; cursor: pointer; transition: background .18s ease, color .18s ease; }
1935
+ .mode-window:hover { color: var(--text); }
1936
+ .mode-window[aria-checked="true"] { background: var(--panel, #fff); color: var(--text); box-shadow: 0 1px 2px rgb(0 0 0 / .12); }
1937
+ .mode-window:focus-visible { outline: 2px solid color-mix(in srgb, var(--warn, #e2a022) 60%, transparent); outline-offset: 1px; }
1913
1938
  .mode-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 4px; }
1914
1939
  .mode-alt { border: 1px solid var(--line-2); border-radius: 7px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 10px; letter-spacing: .1em; padding: 6px 11px; cursor: pointer; }
1915
1940
  .mode-alt:hover { color: var(--text); border-color: var(--text-3); }
@@ -1967,6 +1992,16 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
1967
1992
  .run-request .run-line.ran .choice-tag { border-color: var(--ok, var(--phosphor)); color: var(--ok, var(--phosphor)); }
1968
1993
  .run-request .run-line.failed .choice-tag { border-color: var(--crit); color: var(--crit); }
1969
1994
  .run-request .run-summary { margin: 10px 2px 0; font-family: var(--mono); font-size: 10.5px; color: var(--text-2); }
1995
+ /* RUN ALL and the hand-back: quiet buttons in the agent's colour, under the summary. */
1996
+ .run-request .run-actions { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 2px 0; }
1997
+ .run-request .run-actions:empty { display: none; }
1998
+ .run-request :is(.run-all, .run-back) { border: 1px solid color-mix(in srgb, var(--agent, var(--phosphor)) 55%, transparent); border-radius: 999px; background: transparent; color: var(--agent, var(--text)); font-family: var(--mono); font-size: 10px; letter-spacing: .1em; padding: 6px 12px; cursor: pointer; transition: background .18s ease; }
1999
+ .run-request :is(.run-all, .run-back):hover:not(:disabled) { background: color-mix(in srgb, var(--agent, var(--phosphor)) 10%, transparent); }
2000
+ .run-request :is(.run-all, .run-back):disabled { opacity: .5; cursor: progress; }
2001
+ .run-request.returned .run-summary { color: var(--ok, var(--phosphor)); }
2002
+ .run-request.returned .run-all { display: none; }
2003
+ /* A message MADRE wrote for the human: the results of commands going back. Same bubble, quieter. */
2004
+ #messages .row.user.auto .bubble { opacity: .82; }
1970
2005
  .run-request .run-progress-track { position: relative; flex: 1 1 100%; height: 3px; overflow: hidden; border-radius: 3px; background: color-mix(in srgb, var(--agent, var(--phosphor)) 18%, transparent); }
1971
2006
  .run-request .run-progress-track::after { content: ''; position: absolute; inset: 0 auto 0 0; width: 32%; border-radius: inherit; background: var(--agent, var(--phosphor)); animation: run-travel 1.6s ease-in-out infinite alternate; }
1972
2007
  @keyframes run-travel { from { transform: translateX(0); } to { transform: translateX(220%); } }
@@ -2228,6 +2263,31 @@ dialog.intents-window { width: 760px; height: 640px; }
2228
2263
  .command-card .undo { margin: 0 12px 10px; border: 1px solid var(--terror); background: color-mix(in srgb, var(--terror) 12%, transparent); color: var(--terror); font: inherit; font-family: var(--mono); font-size: 10px; letter-spacing: .16em; padding: 7px 12px; border-radius: 8px; cursor: pointer; }
2229
2264
  .command-card .undo:hover { background: color-mix(in srgb, var(--terror) 22%, transparent); }
2230
2265
  .command-card .undo:disabled { opacity: .5; cursor: default; }
2266
+ /* What a terminal said, folded (2026-10-14): one line — the command, how it ended, how long, who
2267
+ asked — and its last line beneath; the output opens on a click, without a jump. */
2268
+ .command-card.terminal .term-head { all: unset; box-sizing: border-box; display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 12px; cursor: pointer; font-family: var(--mono); font-size: 11.5px; color: var(--text-2); }
2269
+ .command-card.terminal .term-head:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 55%, transparent); outline-offset: -2px; border-radius: 12px; }
2270
+ .command-card.terminal .term-tag { flex: none; font-size: 9.5px; letter-spacing: .14em; font-weight: 600; color: var(--text-3); }
2271
+ .command-card.terminal code.term-line { padding: 0; border: 0; background: none; }
2272
+ .command-card.terminal .term-line { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--mono); font-size: 12px; color: var(--text); }
2273
+ .command-card.terminal .term-status { flex: none; padding: 2px 9px; border-radius: 999px; font-size: 10px; letter-spacing: .03em; white-space: nowrap; color: var(--text-2); background: color-mix(in srgb, var(--text) 6%, transparent); }
2274
+ .command-card.terminal .term-status.ok { color: var(--ok, #2f9e44); background: color-mix(in srgb, var(--ok, #2f9e44) 12%, transparent); }
2275
+ .command-card.terminal .term-status.failed { color: var(--crit); background: color-mix(in srgb, var(--crit) 12%, transparent); }
2276
+ .command-card.terminal .term-who { flex: none; font-size: 10.5px; color: var(--agent, var(--text-3)); }
2277
+ .command-card.terminal .term-count { flex: none; font-size: 10px; color: var(--text-3); white-space: nowrap; }
2278
+ .command-card.terminal .term-head .chev-icon { flex: none; display: inline-flex; color: var(--text-3); transition: transform .22s ease; }
2279
+ .command-card.terminal.open .term-head .chev-icon { transform: rotate(180deg); }
2280
+ .command-card.terminal .term-peek { margin-top: -4px; padding: 0 12px 9px; font-family: var(--mono); font-size: 11px; color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2281
+ .command-card.terminal.open .term-peek { display: none; }
2282
+ .command-card.terminal .term-out { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .24s ease; }
2283
+ .command-card.terminal.open .term-out { grid-template-rows: 1fr; }
2284
+ .command-card.terminal .term-clip { min-height: 0; overflow: hidden; }
2285
+ .command-card.terminal pre { max-height: 420px; border-top: 1px solid var(--line-2); background: color-mix(in srgb, var(--text) 3%, transparent); }
2286
+ .command-card.terminal pre .l-bad { color: var(--crit); }
2287
+ .command-card.terminal pre .l-good { color: var(--ok, #2f9e44); }
2288
+ .command-card.terminal .undo { margin-top: 10px; }
2289
+ @media (max-width: 560px) { .command-card.terminal .term-count, .command-card.terminal .term-tag { display: none; } }
2290
+ @media (prefers-reduced-motion: reduce) { .command-card.terminal .term-out, .command-card.terminal .term-head .chev-icon { transition: none; } }
2231
2291
  .command-card .outcome { display: inline-block; margin: 0 12px 10px; font-family: var(--mono); font-size: 10px; letter-spacing: .16em; color: var(--phosphor); }
2232
2292
 
2233
2293
  .module-card select { border: 1px solid var(--ph-dim); background: #000; color: var(--ph); font: inherit; font-size: 10.5px; letter-spacing: .06em; padding: 6px 8px; }
@@ -2594,6 +2654,12 @@ dialog.intents-window { width: 760px; height: 640px; }
2594
2654
 
2595
2655
  /* A file an agent wrote in this room, in that agent's own colour. */
2596
2656
  .tree .node .touched { width: 6px; height: 6px; border-radius: 50%; background: var(--agent, var(--ph)); box-shadow: none; flex: 0 0 auto; margin-left: 2px; }
2657
+ /* The way down to what changed: a folder carries the dot of the last touch beneath it, hollow, so
2658
+ the filled one is always the file itself. */
2659
+ .tree .node .touched.trail { background: transparent; box-shadow: inset 0 0 0 1.5px var(--agent, var(--ph)); }
2660
+ .tree-head .tree-refresh.spin svg { animation: tree-spin .6s ease; }
2661
+ @keyframes tree-spin { to { transform: rotate(360deg); } }
2662
+ @media (prefers-reduced-motion: reduce) { .tree-head .tree-refresh.spin svg { animation: none; } }
2597
2663
 
2598
2664
  /* Read by what the file is. Six roles, the room's own phosphor: enough to find a string or a
2599
2665
  comment at a glance, and never so many colours that the code stops being the thing you see. */
@@ -2855,11 +2921,6 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
2855
2921
  border-radius: 16px; background: var(--panel); color: var(--text); border: 1px solid var(--line-2);
2856
2922
  box-shadow: 0 18px 50px rgba(0, 0, 0, .4); animation: wn-in calc(300ms * var(--motion-scale)) cubic-bezier(.2, .8, .2, 1);
2857
2923
  }
2858
- .hint-card.beside::before { content: none; }
2859
- .hint-card::before {
2860
- content: ''; position: absolute; top: -7px; left: calc(var(--arrow, 24px) - 6px); width: 12px; height: 12px;
2861
- background: var(--panel); border-left: 1px solid var(--line-2); border-top: 1px solid var(--line-2); transform: rotate(45deg);
2862
- }
2863
2924
  @media (prefers-reduced-motion: reduce) { .hint-card { animation: none; } }
2864
2925
  .hint-card h3 { margin: 0 0 6px; font-size: 15px; font-weight: 700; }
2865
2926
  .hint-card p { margin: 0; font-size: 13.5px; line-height: 1.5; color: var(--text-2); }
@@ -5209,6 +5270,37 @@ dialog.custom-window::backdrop { display: none; }
5209
5270
  height: 26px; padding: 0 10px 0 12px; border: 0; border-radius: 999px; background: transparent; box-shadow: none;
5210
5271
  }
5211
5272
  :root[data-scheme] .composer > .pick-options :is(.mode-chip, .model-chip, .effort-chip):is(:hover, :focus-visible, [aria-expanded="true"]) { background: color-mix(in srgb, currentColor 12%, transparent); }
5273
+ /* THE COPILOT (2026-10-14): a robot beside mode · model · effort, in the same glass; MADRE's green
5274
+ when it is on, with the time it has left. Its menu says what it does, its switch and how long. */
5275
+ .picker .pick-label > .copilot-chip { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 9px; border: 0; border-radius: 999px; background: transparent; color: var(--text-2); font: inherit; letter-spacing: .06em; cursor: pointer; transition: background .18s ease, color .18s ease; }
5276
+ .picker .pick-label > .copilot-chip:is(:hover, :focus-visible) { background: color-mix(in srgb, currentColor 12%, transparent); outline: none; }
5277
+ .copilot-icon { display: inline-flex; width: 16px; height: 16px; }
5278
+ .copilot-icon svg { width: 100%; height: 100%; }
5279
+ .picker .pick-label > .copilot-chip.on { color: var(--madre-green); background: color-mix(in srgb, var(--madre-green) 14%, transparent); }
5280
+ .picker .pick-label > .copilot-chip .left { font-size: 10px; }
5281
+ .copilot-menu { display: grid; gap: 8px; }
5282
+ .copilot-menu .copilot-title { display: flex; align-items: center; gap: 8px; margin: 2px 2px 0; color: var(--text); }
5283
+ .copilot-menu .copilot-title b { flex: 1; color: var(--text); font-size: 11px; }
5284
+ .copilot-menu .copilot-title .copilot-icon { color: var(--madre-green); }
5285
+ .copilot-menu .copilot-body { display: grid; gap: 8px; padding: 0 2px 2px; font-family: var(--read, inherit); letter-spacing: 0; }
5286
+ /* Three weights (2026-10-14): what it does reads first; what it never does is the small print. */
5287
+ .copilot-menu .copilot-body p { margin: 0; font-size: 12.5px; line-height: 1.45; color: var(--text-2); }
5288
+ .copilot-menu .copilot-body .copilot-lead { font-size: 14px; line-height: 1.45; color: var(--text); font-weight: 400; }
5289
+ .copilot-menu .copilot-body .copilot-never { padding-top: 8px; border-top: 1px solid var(--line); font-size: 11.5px; line-height: 1.5; color: color-mix(in srgb, var(--text) 46%, transparent); }
5290
+ .copilot-menu .copilot-body .copilot-state { color: var(--madre-green); font-weight: 600; }
5291
+ .copilot-menu .copilot-body .copilot-foot { font-size: 11px; color: var(--text-3); }
5292
+ .copilot-menu .copilot-how { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 12px; color: var(--text-2); }
5293
+ /* A message under the copilot: the box wears green, not EDIT's red. */
5294
+ .composer.copilot .field { border-color: var(--madre-green); --ring: 0 0 0 3px color-mix(in srgb, var(--madre-green) 16%, transparent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--madre-green) 16%, transparent); }
5295
+ .composer.copilot .crew-label { color: var(--madre-green); }
5296
+ /* The reply written as the copilot: a green round robot on the agent's own circle, shown on every
5297
+ reply of a run of them, so a glance down the thread says which ones the copilot wrote. */
5298
+ #messages .row.copilot > .avatar { position: relative; overflow: visible; }
5299
+ #messages .row.copilot.compact > .avatar { visibility: visible; }
5300
+ #messages .row.copilot.compact > .avatar > :not(.copilot-badge) { visibility: hidden; }
5301
+ #messages .row.copilot > .avatar .copilot-badge { position: absolute; right: -6px; bottom: -6px; z-index: 1; visibility: visible; display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; padding: 3px; border-radius: 50%; background: var(--madre-green); color: var(--madre-green-ink); box-shadow: 0 0 0 2px var(--bg), 0 2px 6px rgb(0 0 0 / .18); }
5302
+ #messages .row.copilot > .avatar .copilot-badge svg { width: 100%; height: 100%; }
5303
+ #messages .who .badge.copilot { color: var(--madre-green); background: color-mix(in srgb, var(--madre-green) 14%, transparent); }
5212
5304
  /* The lines of the room that carry a chip: the box's radius follows the chip it holds. */
5213
5305
  :is(:root[data-wallpaper] #messages, .look-preview[data-wallpaper]:not([data-wallpaper="default"])) .system:not(.mother-alert) { border-radius: 18px; padding: 8px 16px 9px; }
5214
5306
 
@@ -5600,7 +5692,9 @@ dialog.mother { --mono: "JetBrains Mono", ui-monospace, Menlo, Consolas, monospa
5600
5692
  /* Dark theme: the box is its own black, a neutral graphite rather than the room's green-black,
5601
5693
  and the row of mode, model and effort under it steps back so it never competes with it. */
5602
5694
  :root:not([data-scheme="light"]) .shell .composer .field { background-color: color-mix(in srgb, #1a1b1d 96%, transparent); }
5603
- :root:not([data-scheme="light"]) .composer > .pick-options .pick-label { background: color-mix(in srgb, var(--bg) 45%, transparent); box-shadow: none; }
5695
+ /* Dark glass reads on a dark ground (2026-10-14): the ground at 45% over the ground was invisible,
5696
+ so it takes a breath of the text colour, a half-pixel rim and the same blur as in light. */
5697
+ :root:not([data-scheme="light"]) .composer > .pick-options .pick-label { background: color-mix(in srgb, var(--text) 13%, color-mix(in srgb, var(--bg) 52%, transparent)); box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 20%, transparent), inset 0 1px 0 rgb(255 255 255 / .09), 0 6px 18px rgb(0 0 0 / .28); -webkit-backdrop-filter: blur(20px) saturate(1.7); backdrop-filter: blur(20px) saturate(1.7); }
5604
5698
  :root:not([data-scheme="light"]) .composer > .pick-options :is(.mode-chip, .model-chip, .effort-chip) { opacity: .78; }
5605
5699
  :root:not([data-scheme="light"]) .composer > .pick-options :is(.mode-chip, .model-chip, .effort-chip):is(:hover, :focus-visible, [aria-expanded="true"]) { opacity: 1; }
5606
5700
 
@@ -5938,6 +6032,28 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
5938
6032
  .sx-chips { display: flex; flex-wrap: wrap; gap: 6px; }
5939
6033
  .sx-field { display: flex; gap: 8px; }
5940
6034
  .sx-field .sx-input { flex: 1; }
6035
+ /* Settings › Connect MCP (2026-10-14): a row per server — what it is and where, how it stands,
6036
+ the one thing to do, and from which mode its tools that act travel. */
6037
+ .mcp-row { gap: 10px; }
6038
+ .mcp-row .mcp-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; width: 100%; }
6039
+ .mcp-row .mcp-top .sx-words { min-width: 0; display: grid; gap: 4px; }
6040
+ .mcp-row .mcp-where { display: block; font-family: var(--mono); font-size: 11.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 52ch; }
6041
+ .mcp-row.off .mcp-top .sx-words > b { color: var(--text-2); }
6042
+ .mcp-problem { margin: 0; font-size: 12px; line-height: 1.45; color: var(--danger); overflow-wrap: anywhere; }
6043
+ .mcp-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
6044
+ .mcp-block > .mcp-actions { padding: 4px 16px 14px; }
6045
+ .mcp-from { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
6046
+ .mcp-tools { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
6047
+ .mcp-tools li { display: inline-flex; align-items: center; gap: 6px; padding: 3px 8px; border-radius: 7px; background: color-mix(in srgb, var(--text) 6%, transparent); font-size: 11.5px; }
6048
+ .mcp-tools li code { font-family: var(--mono); font-size: 11.5px; }
6049
+ .mcp-tools .mcp-tool-kind { font-size: 10px; letter-spacing: .04em; color: var(--text-3); }
6050
+ .mcp-tools li.acts .mcp-tool-kind { color: #d9a90f; }
6051
+ .mcp-vars { display: grid; gap: 6px; width: 100%; }
6052
+ .mcp-vars .sx-field { align-items: center; }
6053
+ .mcp-secret { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--text-2); white-space: nowrap; }
6054
+ .mcp-pick { display: inline-flex; align-items: center; }
6055
+ .mcp-block .sx-row .sx-hint { overflow-wrap: anywhere; }
6056
+ .mcp-pick input, .mcp-secret input { width: 16px; height: 16px; accent-color: var(--phosphor); }
5941
6057
  .sx-command { display: flex; align-items: center; gap: 8px; padding: 4px 4px 4px 10px; border-radius: 9px; background: color-mix(in srgb, var(--text) 5%, transparent); }
5942
6058
  .sx-command code { flex: 1; min-width: 0; overflow-x: auto; white-space: nowrap; font-family: var(--mono); font-size: 11.5px; color: var(--text); scrollbar-width: none; }
5943
6059
  .sx-more { border-top: 1px solid color-mix(in srgb, var(--text) 7%, transparent); }
@@ -5948,7 +6064,15 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
5948
6064
  .sx-more > :not(summary) { margin: 0 16px 14px; }
5949
6065
  .sx-steps { display: grid; gap: 12px; margin: 10px 16px 16px; padding-left: 18px; }
5950
6066
  .sx-steps li { display: grid; gap: 6px; font-size: 12.5px; }
5951
- .sx-steps li b { font-weight: 500; }
6067
+ .sx-steps li b { font-weight: 600; color: var(--text); }
6068
+ /* The training recipe, numbered and explained (2026-10-14). */
6069
+ .sx-steps { counter-reset: step; list-style: none; padding-left: 0; gap: 14px; }
6070
+ .sx-steps li { position: relative; padding-left: 34px; counter-increment: step; }
6071
+ .sx-steps li::before { content: counter(step); position: absolute; left: 0; top: -1px; display: grid; place-items: center; width: 22px; height: 22px; border-radius: 50%; background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); font: 600 11.5px/1 var(--read); }
6072
+ .sx-steps li .sx-hint { font-size: 12px; line-height: 1.45; color: var(--text-2); }
6073
+ .sx-train-what { margin: 0 16px 10px; font-size: 12.5px; line-height: 1.5; color: var(--text-2); }
6074
+ .sx-train-platform { margin: 10px 16px 6px; }
6075
+ .sx-more > .sx-hint { margin: 0 16px; }
5952
6076
 
5953
6077
  /* An agent's card: its colour on the avatar and the name, where it lives in small print. */
5954
6078
  .sx-agent .sx-head { align-items: center; }
@@ -6040,6 +6164,8 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
6040
6164
  .settings-detail .sx-analysis :is(.mem-strip-head b, .mem-strip-head span, .mem-axis span, summary b, summary .caret, th, td, .mem-signal .top b, .mem-bar .name, .exams > .note, .exam-head b, .exam-head .verdict, .exam-bullet span, .exam > .note:not(.about), .exam .actions button, .exam .actions .note)::first-letter { text-transform: uppercase; }
6041
6165
  .settings-detail .sx-analysis .mem-strip-head b, .settings-detail .sx-analysis .mem-bar .name { color: var(--text); }
6042
6166
  .settings-detail .sx-analysis .mem-signal .top b, .settings-detail .sx-analysis .exam-head b { font-size: 12.5px; font-weight: 500; }
6167
+ /* The review's questions are written in sentence case; lowering them would turn «IA» into «ia». */
6168
+ .settings-detail .sx-analysis .exam-head b { text-transform: none; }
6043
6169
  .settings-detail .sx-analysis .exams .said { font-family: var(--read); font-size: 12.5px; line-height: 1.5; }
6044
6170
  .settings-detail .sx-analysis .mem-cols i:not(.zero) { background: color-mix(in srgb, #3fb6d9 70%, transparent); }
6045
6171
  .settings-detail .sx-analysis .mem-cols i.now { background: #3fb6d9; }
@@ -6337,9 +6463,13 @@ dialog.surface.window:is(.settings-window, .module-window).lifted { background-c
6337
6463
  .bar-left .connection { position: relative; align-self: flex-start; margin: 9px 0 0 -2px; padding: 4px; text-transform: none; cursor: default; }
6338
6464
  .bar-left .connection :is(.connection-icon .bar-glyph, .connection-label) { display: none; }
6339
6465
  .bar-left .connection .connection-dot { width: 7px; height: 7px; background: var(--text-3); box-shadow: none; }
6340
- .bar-left .connection[data-state="live"] .connection-dot { background: #34d058; animation: live-glow 3.2s ease-in-out infinite; }
6341
- .bar-left .connection[data-state="reconnecting"] .connection-dot { background: var(--warn); animation: live-glow 1.2s ease-in-out infinite; }
6342
- @keyframes live-glow { 0%, 100% { opacity: .55; box-shadow: 0 0 0 0 rgba(52, 208, 88, 0); } 50% { opacity: 1; box-shadow: 0 0 6px 2px rgba(52, 208, 88, .55); } }
6466
+ .bar-left .connection[data-state="live"] .connection-dot { background: #34d058; animation: state-pulse 2.6s ease-in-out infinite; }
6467
+ .bar-left .connection[data-state="reconnecting"] .connection-dot { background: var(--warn); animation: state-pulse 1.1s ease-in-out infinite; }
6468
+ .bar-left .connection:is([data-state="offline"], [data-state="closed"], [data-state="disconnected"]) .connection-dot { background: var(--danger, #e5484d); animation: none; }
6469
+ /* The project's state is a dot that breathes, nothing more (2026-10-14): from its size to a little
6470
+ larger and back, in the colour of the state. No glow around it. */
6471
+ @keyframes state-pulse { 0%, 100% { transform: scale(.85); } 50% { transform: scale(1.15); } }
6472
+ :root.just-arrived .bar-left .connection[data-state="live"] .connection-dot { animation: state-pulse 2.6s ease-in-out infinite; }
6343
6473
  .bar-left .connection::after { content: attr(data-said); position: absolute; top: calc(100% + 8px); left: 50%; translate: -50% 0; padding: 4px 9px; border-radius: 8px; font-family: var(--read); font-size: 12px; font-weight: 500; white-space: nowrap; color: var(--text); background: var(--surface, var(--panel)); box-shadow: var(--key-rest); opacity: 0; pointer-events: none; transition: opacity var(--motion-fast) var(--ease-out); z-index: 60; }
6344
6474
  .bar-left .connection:hover::after { opacity: 1; }
6345
6475
  .bar-left .connection::first-letter { text-transform: none; }
@@ -6683,7 +6813,9 @@ dialog.mods-window { width: 1040px; height: 720px; container: modswin / inline-s
6683
6813
  display: inline-flex; align-items: center; gap: 9px;
6684
6814
  padding: 9px 16px 9px 13px; border: 0; border-radius: 20px;
6685
6815
  background: var(--surface, var(--panel)); color: var(--text);
6686
- box-shadow: 0 1px 2px rgba(0, 0, 0, .18), 0 6px 16px -8px rgba(0, 0, 0, .4);
6816
+ /* It floats over the canvas (2026-10-14): a rim, a near shadow and a far one, so it reads lifted
6817
+ off any wallpaper or thread under it. */
6818
+ box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 14%, transparent), inset 0 1px 0 rgb(255 255 255 / .06), 0 2px 4px rgba(0, 0, 0, .24), 0 12px 28px -6px rgba(0, 0, 0, .5), 0 28px 60px -18px rgba(0, 0, 0, .45);
6687
6819
  font-family: var(--read); font-size: 13px; font-weight: 450; line-height: 1.4; text-align: left;
6688
6820
  max-width: min(560px, calc(100% - 32px)); width: max-content;
6689
6821
  }
@@ -6708,7 +6840,7 @@ dialog.mods-window { width: 1040px; height: 720px; container: modswin / inline-s
6708
6840
  #messages .row > .avatar.gradient { box-shadow: none !important; }
6709
6841
  #messages .row > .avatar svg { width: 64%; height: 64%; opacity: 1; }
6710
6842
 
6711
- :root[data-scheme="light"] .toast:not([hidden]) { box-shadow: 0 1px 2px rgba(20, 30, 20, .1), 0 6px 16px -8px rgba(20, 30, 20, .28); }
6843
+ :root[data-scheme="light"] .toast:not([hidden]) { box-shadow: 0 0 0 .5px rgba(20, 30, 20, .08), 0 2px 4px rgba(20, 30, 20, .1), 0 12px 28px -6px rgba(20, 30, 20, .22), 0 28px 60px -18px rgba(20, 30, 20, .2); }
6712
6844
 
6713
6845
  /* ==========================================================================================
6714
6846
  MU/TH/UR · the remedies, as a window of the room
@@ -6878,6 +7010,9 @@ dialog.room-ask:not(.console) .room-ask-choice.danger:hover { background: var(--
6878
7010
  /* The key, quieter: one sentence of what it allows, a smaller one of what keeps it safe, the
6879
7011
  ceiling note when there is one, and a field whose label says what to type. */
6880
7012
  dialog.key-ask .room-ask-body { color: var(--text); font-size: 14px; }
7013
+ /* «Don't ask again…» under the memory gate: a quiet link to Settings › Permissions › Memory access. */
7014
+ .key-skip { display: block; margin: 4px auto 0; padding: 4px 8px; border: 0; border-radius: 8px; background: none; font: 500 12px/1.3 var(--sans); color: var(--text-2); cursor: pointer; text-decoration: underline; text-decoration-color: color-mix(in srgb, var(--text-2) 40%, transparent); text-underline-offset: 3px; }
7015
+ .key-skip:hover, .key-skip:focus-visible { color: var(--text); background: color-mix(in srgb, var(--text) 6%, transparent); outline: 0; }
6881
7016
  .key-safe { margin: -4px 0 0; font-family: var(--read); font-size: 12.5px; line-height: 1.45; color: color-mix(in srgb, var(--text) 58%, transparent); }
6882
7017
  .key-raise { margin: 0; padding: 4px 10px; border-radius: 999px; background: color-mix(in srgb, var(--mode-3) 14%, transparent); color: color-mix(in srgb, var(--mode-3) 70%, var(--text)); font-family: var(--read); font-size: 12px; font-weight: 550; }
6883
7018
  dialog.key-ask.m4 .key-raise { background: color-mix(in srgb, var(--mode-4) 14%, transparent); color: color-mix(in srgb, var(--mode-4) 70%, var(--text)); }
@@ -7596,7 +7731,7 @@ html.via-phone[data-wallpaper]:not([data-wallpaper="default"]) { --phone-ground:
7596
7731
  :root:not(.via-phone) .shell > .bar.with-home {
7597
7732
  width: auto; justify-self: stretch;
7598
7733
  margin-left: max(20px, calc((100% - 1440px) / 2));
7599
- margin-right: calc(max(20px, calc((100% - 1440px) / 2)) + var(--home-w, 150px) + 10px);
7734
+ margin-right: calc(max(20px, calc((100% - 1440px) / 2)) + var(--home-w, 150px) + 16px);
7600
7735
  }
7601
7736
  /* With the second bar beside it the room's bar is ~120px narrower, so the pulse alone takes the
7602
7737
  wordmark's place a little earlier: before the brand is cut instead of folded. */
@@ -7731,6 +7866,32 @@ dialog.viewer .viewer-seg .viewer-seg-btn:not([hidden]) + .viewer-open { margin-
7731
7866
  .agent-pop .pop-group dd { font-family: var(--read, var(--sans)); font-size: 12.5px; line-height: 1.35; color: var(--text); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
7732
7867
  .agent-pop .caps { margin-top: 12px !important; padding-top: 12px; border-top: 1px solid var(--line); }
7733
7868
  .agent-pop .foot { margin-top: 10px; font-size: 9px; line-height: 1.5; }
7869
+ /* The agent's card, ordered (2026-10-14): name and session, one figure, four numbers, the plan, a
7870
+ line for the connection, what it can do and the way to its settings. */
7871
+ .agent-pop .head { gap: 10px; }
7872
+ .agent-pop .pop-who { display: grid; gap: 1px; min-width: 0; }
7873
+ .agent-pop .pop-who .vendor { margin: 0; font-family: var(--read, var(--sans)); font-size: 11.5px; letter-spacing: 0; color: var(--text-3); }
7874
+ .agent-pop .pop-session { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; height: 22px; padding: 0 9px; border-radius: 999px; background: color-mix(in srgb, var(--text) 6%, transparent); font-family: var(--read, var(--sans)); font-size: 11.5px; color: var(--text-2); white-space: nowrap; }
7875
+ .agent-pop .pop-session::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--text-3); }
7876
+ .agent-pop .pop-session.ok::before { background: #34c759; }
7877
+ .agent-pop .pop-session.wait::before { background: var(--warn); }
7878
+ .agent-pop .pop-session.bad::before { background: var(--danger); }
7879
+ .agent-pop .pop-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding: 12px 0; border-bottom: 1px solid var(--line); }
7880
+ .agent-pop .pop-stat { display: grid; gap: 3px; padding: 9px 11px; border-radius: 11px; background: color-mix(in srgb, var(--text) 4.5%, transparent); min-width: 0; }
7881
+ .agent-pop .pop-stat span { font-family: var(--read, var(--sans)); font-size: 11px; color: var(--text-3); }
7882
+ .agent-pop .pop-stat b { font-family: var(--read, var(--sans)); font-size: 14px; font-weight: 600; color: var(--text); font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7883
+ .agent-pop .pop-provider { display: grid; gap: 5px; padding: 11px 0; border-bottom: 1px solid var(--line); }
7884
+ .agent-pop .pop-provider h4 { margin: 0 0 2px; font-family: var(--read, var(--sans)); font-size: 12px; font-weight: 600; color: var(--text); letter-spacing: 0; text-transform: none; }
7885
+ .agent-pop .pop-limit { display: flex; justify-content: space-between; gap: 12px; font-family: var(--read, var(--sans)); font-size: 12px; color: var(--text-2); }
7886
+ .agent-pop .pop-limit b { font-weight: 500; color: var(--text); font-variant-numeric: tabular-nums; }
7887
+ .agent-pop .pop-limit.hot b { color: var(--crit); }
7888
+ .agent-pop .pop-note { margin: 0; font-family: var(--read, var(--sans)); font-size: 12px; line-height: 1.45; color: var(--text-2); }
7889
+ .agent-pop .pop-meta { margin: 10px 0 0; font-family: var(--read, var(--sans)); font-size: 11.5px; line-height: 1.45; color: var(--text-3); }
7890
+ .agent-pop .caps { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px !important; padding-top: 0; border-top: 0; }
7891
+ .agent-pop .caps .cap { padding: 3px 8px; border: 0; border-radius: 999px; background: color-mix(in srgb, var(--text) 5%, transparent); font-family: var(--read, var(--sans)); font-size: 11px; letter-spacing: 0; text-transform: none; color: var(--text-3); }
7892
+ .agent-pop .caps .cap.on { background: color-mix(in srgb, var(--agent, var(--phosphor)) 13%, transparent); color: color-mix(in srgb, var(--agent, var(--phosphor)) 75%, var(--text)); }
7893
+ .agent-pop .pop-go { width: 100%; margin-top: 12px; height: 32px; border: 0; border-radius: 10px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); font-family: var(--read, var(--sans)); font-size: 12.5px; font-weight: 500; cursor: pointer; }
7894
+ .agent-pop .pop-go:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--text) 12%, transparent); outline: 0; }
7734
7895
 
7735
7896
  /* The agent picker: the chosen agent at full colour; the others dimmed, until the pointer finds one. */
7736
7897
  .picker .avatar.pick:not([aria-checked="true"]) { filter: saturate(.55) brightness(.94); opacity: .55; transition: opacity calc(160ms * var(--motion-scale, 1)) var(--ease-out), filter calc(160ms * var(--motion-scale, 1)) var(--ease-out); }
@@ -7822,6 +7983,37 @@ dialog#core .mother-close { height: 30px; padding: 0 13px; border: 0; border-rad
7822
7983
  dialog#core .mother-close:hover { box-shadow: var(--key-over, var(--key-rest)); color: var(--phosphor); }
7823
7984
  dialog#core .mother-close:active { box-shadow: var(--key-down, var(--key-rest)); }
7824
7985
  dialog#core .mother-boot { display: none; }
7986
+ /* «Lo que se envía» in the room's hand (2026-10-14): the title over its line on the left, the
7987
+ buttons every window has on the right, centred tabs, and the console's capitals gone from what
7988
+ used to be MU/TH/UR's (the verdict, «next», the memory review, the roles and fields). */
7989
+ dialog#core .mother-head { display: grid; grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "title actions" "sub actions"; align-items: center; gap: 2px 16px; padding: 16px 16px 14px 24px; }
7990
+ dialog#core .mother-title { grid-area: title; line-height: 1.25; }
7991
+ dialog#core .mother-sub { grid-area: sub; flex: none; line-height: 1.35; }
7992
+ dialog#core .mother-actions { grid-area: actions; align-items: center; gap: 10px; }
7993
+ dialog#core .core-copy-all { height: 30px; font-family: var(--read); font-size: 12.5px; font-weight: 550; letter-spacing: 0; text-transform: none; }
7994
+ dialog#core .core-tab { display: grid; justify-items: center; text-align: center; }
7995
+ dialog#core .core-tab .meta { max-width: 100%; }
7996
+ dialog#core .mem-verdict .says, dialog#core .mem-verdict > p:not(.maturity-next) { margin: 0; font-family: var(--read); font-size: 13px; line-height: 1.5; letter-spacing: 0; text-transform: none; color: var(--text-2); text-shadow: none; }
7997
+ dialog#core .mem-verdict .says b { margin-right: 6px; font-size: 13px; letter-spacing: 0; color: var(--text); }
7998
+ dialog#core .mem-verdict .maturity-next { padding: 11px 14px; border: 0; border-radius: 12px; background: color-mix(in srgb, var(--text) 5%, transparent); box-shadow: none; font-family: var(--read); font-size: 12.5px; line-height: 1.5; letter-spacing: 0; text-transform: none; color: var(--text); }
7999
+ dialog#core .mem-verdict .maturity-next b { margin-right: 8px; font-size: 12.5px; font-weight: 600; letter-spacing: 0; color: var(--phosphor); }
8000
+ dialog#core .mem-verdict .maturity-next .where { font-size: 12px; letter-spacing: 0; color: var(--text-3); }
8001
+ dialog#core :is(.exams, .exam .verdict, .exam-head b, .exams .note, .exam .note, .exam-bullet span, .exam .said, .exam .actions button) { font-family: var(--read); letter-spacing: 0; text-transform: none; text-shadow: none; }
8002
+ dialog#core .exam-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
8003
+ dialog#core .exam-head b { font-size: 13px; font-weight: 600; color: var(--text); }
8004
+ dialog#core .exam .verdict { flex: none; padding: 2px 8px; border: 0; border-radius: 7px; font-size: 11.5px; background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text-2); }
8005
+ dialog#core .exam.passed .verdict { background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); }
8006
+ dialog#core .exam.failed .verdict { background: color-mix(in srgb, var(--warn) 16%, transparent); color: var(--warn); }
8007
+ dialog#core .exam :is(.note, .said) { font-size: 12.5px; line-height: 1.5; color: var(--text-2); }
8008
+ dialog#core .exam-bullet span { font-size: 11.5px; color: var(--text-3); }
8009
+ dialog#core .exam .actions button { height: 28px; padding: 0 12px; border: 0; border-radius: 8px; background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text); font-size: 12px; box-shadow: none; cursor: pointer; }
8010
+ dialog#core .exam .actions button.primary { background: var(--phosphor); color: var(--phosphor-ink); }
8011
+ dialog#core .core-role { color: var(--text); }
8012
+ dialog#core .core-role input { width: 15px; height: 15px; accent-color: var(--phosphor); }
8013
+ dialog#core .core-role-words b { font-family: var(--read); font-size: 13px; font-weight: 500; letter-spacing: 0; text-transform: none; color: var(--text); }
8014
+ dialog#core .core-role-words .detail { font-family: var(--read); font-size: 12px; letter-spacing: 0; color: var(--text-3); }
8015
+ dialog#core .core-field { font-family: var(--read); font-size: 12px; letter-spacing: 0; text-transform: none; color: var(--text-3); }
8016
+ dialog#core .core-pick select, dialog#core .core-field select { font-family: var(--read) !important; font-size: 12.5px !important; letter-spacing: 0 !important; text-transform: none !important; }
7825
8017
  dialog#core .mother-foot { padding: 9px 22px 11px; border-top: 1px solid var(--line); font-family: var(--read); font-size: 11.5px; letter-spacing: 0; text-transform: none; color: var(--text-3); text-align: center; }
7826
8018
  /* The body: tabs, the strip that says for whom, the pane, and the question line. */
7827
8019
  dialog#core .core-body { min-height: 0; gap: 12px; padding: 14px 22px 14px; }
@@ -7991,6 +8183,74 @@ dialog#core .mother-cmd .copy { position: absolute; top: 8px; right: 8px; displa
7991
8183
  width: fit-content; max-width: min(92%, 560px); margin-inline: auto; padding: 8px 16px 9px; border: 0; border-radius: 18px;
7992
8184
  }
7993
8185
  #messages#messages .row > .col > .who { width: fit-content; max-width: 100%; padding: 3px 10px; border-radius: 999px; }
8186
+ /* A failure wears the room's own card (2026-10-14): rounded, as wide as its words, in its red
8187
+ tint — it was a square box of another app. Its RETRY and UNDO stay under it. */
8188
+ #messages#messages .thread-inner > .system.fail {
8189
+ width: fit-content; max-width: min(92%, 560px); margin-inline: auto; padding: 10px 18px 11px; border: 0; border-radius: 18px;
8190
+ background: color-mix(in srgb, var(--danger) 9%, var(--plane-solid, var(--panel))) !important;
8191
+ box-shadow: 0 0 0 .5px color-mix(in srgb, var(--danger) 30%, transparent) !important;
8192
+ }
8193
+ #messages#messages .thread-inner > .system.fail .label { font-family: var(--mono); letter-spacing: .14em; }
8194
+
8195
+ /* ==========================================================================================
8196
+ NOTICES THAT FOLD INTO DOTS (2026-10-14)
8197
+ ------------------------------------------------------------------------------------------
8198
+ A notice says its piece and, ten seconds later, folds into a row of the notices around it.
8199
+ Folded, the row is one small dot in the colour of its first notice and «+N» for the rest, on
8200
+ the same glass as mode · model · effort so it reads on any wallpaper. A click opens the row as
8201
+ one card with every notice in order, each with its dot; another click, or Escape, folds it.
8202
+ Red is a diagnostic, amber a permission or a warning, green something that went well, grey the
8203
+ rest. Sizes carry !important: the wallpaper's rules for the room's lines would otherwise give a
8204
+ folded notice their width and padding (it was a dot 0 px wide, only its ring showing).
8205
+ ========================================================================================== */
8206
+ #messages#messages .thread-inner > .system.folding { animation: notice-fold .22s ease forwards; }
8207
+ @keyframes notice-fold { to { opacity: 0; transform: scale(.94); } }
8208
+ #messages .sys-dots {
8209
+ display: flex; align-items: center; gap: 6px; width: fit-content; max-width: min(92%, 560px); margin: 6px auto; padding: 4px 9px 4px 7px;
8210
+ border-radius: 999px; cursor: pointer; font-family: var(--mono); font-size: 10px; letter-spacing: .06em; color: var(--text-2);
8211
+ background: color-mix(in srgb, var(--bg) 62%, transparent); border: .5px solid color-mix(in srgb, var(--text) 10%, transparent);
8212
+ -webkit-backdrop-filter: blur(18px) saturate(1.6); backdrop-filter: blur(18px) saturate(1.6);
8213
+ transition: background .18s ease;
8214
+ }
8215
+ #messages .sys-dots:hover, #messages .sys-dots:focus-visible { background: color-mix(in srgb, var(--bg) 78%, transparent); outline: none; }
8216
+ #messages .sys-dots > .sys-more { font: inherit; color: inherit; }
8217
+ #messages .sys-dots.single { padding: 6px; gap: 0; justify-content: center; }
8218
+ #messages#messages .sys-dots > .system.folded { --dot: var(--text-3); margin: 0; cursor: inherit; }
8219
+ #messages#messages .sys-dots > .system.folded[data-tone="crit"] { --dot: var(--terror, #d33); }
8220
+ #messages#messages .sys-dots > .system.folded[data-tone="warn"] { --dot: var(--warn, #e2a022); }
8221
+ #messages#messages .sys-dots > .system.folded[data-tone="ok"] { --dot: var(--ok, var(--phosphor, #2f9e44)); }
8222
+ /* Folded: the first notice is the dot; the rest are counted in «+N». */
8223
+ #messages#messages .sys-dots:not(.open) > .system.folded {
8224
+ flex: none; width: 8px !important; height: 8px !important; min-width: 0 !important; max-width: none !important; padding: 0 !important; border: 0 !important; border-radius: 50% !important;
8225
+ overflow: hidden; font-size: 0; line-height: 0; color: transparent; text-shadow: none !important;
8226
+ background: var(--dot) !important; box-shadow: 0 0 0 2px color-mix(in srgb, var(--dot) 22%, transparent) !important;
8227
+ -webkit-backdrop-filter: none !important; backdrop-filter: none !important;
8228
+ animation: dot-in .28s cubic-bezier(.2, .9, .3, 1.25);
8229
+ }
8230
+ #messages#messages .sys-dots:not(.open) > .system.folded:not(:first-child) { display: none !important; }
8231
+ #messages#messages .sys-dots:not(.open) > .system.folded > * { display: none !important; }
8232
+ #messages#messages .sys-dots > .system.folded.quiet { animation: none; }
8233
+ @keyframes dot-in { from { transform: scale(.3); opacity: 0; } to { transform: scale(1); opacity: 1; } }
8234
+ /* Open: one card, every notice in order, each with its dot. No bar on the side. */
8235
+ #messages .sys-dots.open {
8236
+ display: grid; gap: 2px; width: min(92%, 560px); padding: 6px; border-radius: 16px; cursor: default;
8237
+ background: color-mix(in srgb, var(--bg) 88%, transparent); border-color: color-mix(in srgb, var(--text) 12%, transparent);
8238
+ box-shadow: 0 10px 30px -12px rgb(0 0 0 / .35); animation: notice-peek .2s ease;
8239
+ }
8240
+ #messages#messages .sys-dots.open > .system.folded { color: var(--text-2) !important; }
8241
+ #messages#messages .sys-dots.open > .system.folded {
8242
+ position: relative; width: auto !important; max-width: none !important; margin: 0 !important; padding: 7px 12px 8px 26px !important; border: 0 !important; border-radius: 10px !important;
8243
+ text-align: left; background: transparent !important; box-shadow: none !important; -webkit-backdrop-filter: none !important; backdrop-filter: none !important;
8244
+ }
8245
+ #messages#messages .sys-dots.open > .system.folded:hover { background: color-mix(in srgb, var(--text) 4%, transparent) !important; }
8246
+ #messages#messages .sys-dots.open > .system.folded::before { content: ''; position: absolute; left: 11px; top: 12px; width: 7px; height: 7px; border-radius: 50%; background: var(--dot); }
8247
+ #messages#messages .sys-dots.open > .system.folded > b:first-child { display: inline; margin-right: 6px; }
8248
+ #messages .sys-dots.open > .sys-more { justify-self: center; margin-top: 2px; padding: 3px 10px; border-radius: 999px; cursor: pointer; color: var(--text-3); }
8249
+ #messages .sys-dots.open > .sys-more:hover { color: var(--text); }
8250
+ @keyframes notice-peek { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
8251
+ @media (prefers-reduced-motion: reduce) {
8252
+ #messages#messages .sys-dots > .system.folded, #messages .sys-dots.open, #messages#messages .thread-inner > .system.folding { animation: none !important; transition: none !important; }
8253
+ }
7994
8254
 
7995
8255
  /* ==========================================================================================
7996
8256
  SIGUE ABIERTO AQUÍ, THE SAME GLASS AS MODE · MODEL · EFFORT (2026-10-09)
@@ -8002,9 +8262,9 @@ dialog#core .mother-cmd .copy { position: absolute; top: 8px; right: 8px; displa
8002
8262
  (`#composer#composer` only outranks CHIPS IN FLAT TONE, which had flattened them into tags.)
8003
8263
  ========================================================================================== */
8004
8264
  :root {
8005
- --lq-fill: color-mix(in srgb, var(--bg) 45%, transparent);
8006
- --lq-fill-over: color-mix(in srgb, var(--bg) 62%, transparent);
8007
- --lq-rim: none;
8265
+ --lq-fill: color-mix(in srgb, var(--text) 7%, color-mix(in srgb, var(--bg) 45%, transparent));
8266
+ --lq-fill-over: color-mix(in srgb, var(--text) 11%, color-mix(in srgb, var(--bg) 62%, transparent));
8267
+ --lq-rim: 0 0 0 .5px color-mix(in srgb, var(--text) 12%, transparent), inset 0 1px 0 rgb(255 255 255 / .05);
8008
8268
  }
8009
8269
  :root[data-scheme="light"] {
8010
8270
  --lq-fill: color-mix(in srgb, var(--bg) 62%, transparent);
@@ -8339,6 +8599,32 @@ dialog.tour-bonjour::backdrop { background: transparent; }
8339
8599
  .tour-pill-go { height: 28px; padding: 0 6px 0 12px; border: 0; background: transparent; font: inherit; font-family: var(--read); font-size: 12.5px; font-weight: 600; white-space: nowrap; color: color-mix(in srgb, var(--tour-acc) 70%, var(--text)); cursor: pointer; }
8340
8600
  .tour-pill-x { display: grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 50%; color: var(--text-2); background: transparent; cursor: pointer; }
8341
8601
  .tour-pill-x svg { width: 11px; height: 11px; }
8602
+ /* A phone's room bar (2026-10-14): only what keeps it whole — the pulse, the live light, DETENER
8603
+ TODO and «more» on the left; Inicio, the projects and Ajustes on the right. Reload is the page's
8604
+ own pull, and the tour goes on from Ajustes › Versión. */
8605
+ @media (max-width: 560px) {
8606
+ .shell > .bar { gap: 8px; }
8607
+ .shell > .bar .brand { width: 40px; overflow: hidden; flex: none; }
8608
+ .shell > .bar .tour-pill-slot, .shell > .bar-home #reload-button { display: none !important; }
8609
+ }
8610
+ /* The room's bar knows its own width (2026-10-14): split beside a second conversation and the
8611
+ browser it is narrow on a wide screen, where the screen's media queries never fire. */
8612
+ /* Both names: «bar» is the one every older fold of the bar asks for; with only «roombar» here
8613
+ (2026-10-14) none of them fired and a narrow bar kept its wide keys. */
8614
+ .shell > .bar:not(.bar-home) { container: bar roombar / inline-size; }
8615
+ @container roombar (max-width: 760px) {
8616
+ .tour-pill-go[data-short] { font-size: 0; }
8617
+ .tour-pill-go[data-short]::after { content: attr(data-short); font-size: 12px; }
8618
+ }
8619
+ @container roombar (max-width: 470px) {
8620
+ .bar-left .brand { width: 40px; overflow: hidden; flex: none; }
8621
+ .tour-pill-slot { display: none !important; }
8622
+ }
8623
+ /* A narrow bar (2026-10-14): the pill says «Recorrido · 3/13»; the full sentence stays its name. */
8624
+ @media (max-width: 1180px) {
8625
+ .tour-pill-go[data-short] { font-size: 0; }
8626
+ .tour-pill-go[data-short]::after { content: attr(data-short); font-size: 12px; }
8627
+ }
8342
8628
  .tour-pill-x:hover { color: var(--text); background: color-mix(in srgb, var(--text) 10%, transparent); }
8343
8629
 
8344
8630
  /* A hint: one line, once, beside the place it speaks of, in the top layer — a bubble, no beak. And
@@ -8495,10 +8781,663 @@ dialog.tour-bonjour::backdrop { background: transparent; }
8495
8781
  .ts-widgets .ts-card:nth-child(2) i { animation-delay: .15s; } .ts-widgets .ts-card:nth-child(3) i { animation-delay: .3s; } .ts-widgets .ts-card:nth-child(4) i { animation-delay: .45s; }
8496
8782
  }
8497
8783
  @keyframes ts-fill { from { background-size: 0 100%; background-repeat: no-repeat; } to { background-size: 100% 100%; background-repeat: no-repeat; } }
8498
- .hint-card.in-modal::before { content: none; }
8499
8784
 
8500
8785
  /* The tables of what was renamed or moved: a long new name wraps under itself, never past the box. */
8501
8786
  .ts-moved-row .now { overflow-wrap: anywhere; line-height: 1.35; }
8502
8787
 
8503
8788
  /* The welcome and its chapters are dialogs too: their own ring is not drawn around them. */
8504
8789
  dialog.tour-bonjour:focus, dialog.tour-bonjour:focus-visible, dialog.whats-new:focus, dialog.whats-new:focus-visible { outline: none; }
8790
+
8791
+ /* ==========================================================================================
8792
+ RESPUESTAS SIN BURBUJA (2026-10-15). La forma de siempre es C · piezas con carril difuso (app.js
8793
+ pone data-reply="pieces" y data-reply-legible="lane"); las demás quedan para comparar, por atributos en
8794
+ <html> que pone el selector de prueba (app.js, ?reply=): data-reply = doc (A · regla bajo la
8795
+ cabecera), doc-inline (A · el avatar entra a la cabecera), pieces (C · plan en tarjeta),
8796
+ pieces-edge (C · tarjeta con el filo de cada agente). data-reply-legible = lane (vidrio difuso
8797
+ detrás de cada respuesta), column (una columna de lectura detrás de toda la conversación), halo
8798
+ (sin plano: un halo en las letras), stripe (franja que se desvanece a la derecha). El carril solo
8799
+ existe sobre un fondo de pantalla.
8800
+ ========================================================================================== */
8801
+ :root[data-reply] #messages#messages .row.assistant { max-width: min(760px, 88%); }
8802
+ :root[data-reply] #messages#messages .row.assistant .bubble { background: transparent !important; box-shadow: none !important; border: 0 !important; border-radius: 0 !important; padding: 2px 0 0 !important; }
8803
+ :root[data-reply] #messages#messages .row.assistant .who { margin-left: 0; }
8804
+ :root[data-reply] #messages#messages .row.assistant .bubble-foot { margin-top: 6px; }
8805
+ :root[data-reply] #messages#messages .row.assistant .stamp > span { font-family: var(--mono); }
8806
+ /* A · regla bajo la cabecera */
8807
+ :root[data-reply="doc"] #messages#messages .row.assistant .who { padding-bottom: 7px; margin-bottom: 6px; border-bottom: 1px solid var(--line); }
8808
+ /* A · avatar en la cabecera: la fila es una sola columna y el agente se dice con un punto de su color. */
8809
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant { grid-template-columns: minmax(0, 1fr); }
8810
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant > .avatar { display: none; }
8811
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant .who { align-items: center; margin-bottom: 4px; }
8812
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant .who::before { content: ''; flex: none; width: 18px; height: 18px; border-radius: 50%; background: var(--agent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--agent) 18%, transparent); }
8813
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant .who > span:first-child { font-size: 11.5px; font-weight: 600; }
8814
+ /* C · lo accionable en tarjeta */
8815
+ :root[data-reply^="pieces"] #messages#messages .row.assistant .plan-card { border: 0; border-radius: 14px; padding: 10px 14px; background: var(--panel); box-shadow: var(--lift-1); }
8816
+ :root[data-reply="pieces-edge"] #messages#messages .row.assistant .plan-card li { list-style: none; margin: 6px 0 6px -18px; padding: 5px 0 5px 10px; border-left: 3px solid var(--agent); border-radius: 2px; }
8817
+ :root[data-reply="pieces-edge"] #messages#messages .row.assistant .plan-card { border-left: 3px solid var(--agent); }
8818
+ /* Los carriles, solo sobre un fondo de pantalla */
8819
+ :root[data-reply][data-reply-legible][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .col { position: relative; isolation: isolate; }
8820
+ :root[data-reply][data-reply-legible="lane"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .col::before,
8821
+ :root[data-reply][data-reply-legible="stripe"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .col::before {
8822
+ content: ''; position: absolute; inset: -10px -18px -8px -14px; z-index: -1; border-radius: 22px;
8823
+ background: color-mix(in srgb, var(--bg) 62%, transparent);
8824
+ -webkit-backdrop-filter: blur(18px) saturate(1.15); backdrop-filter: blur(18px) saturate(1.15);
8825
+ -webkit-mask-image: radial-gradient(120% 140% at 40% 50%, #000 62%, transparent 100%); mask-image: radial-gradient(120% 140% at 40% 50%, #000 62%, transparent 100%);
8826
+ }
8827
+ :root[data-reply][data-reply-legible="stripe"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .col::before {
8828
+ inset: -10px -60px -8px -14px; border-radius: 18px 0 0 18px; background: color-mix(in srgb, var(--bg) 70%, transparent);
8829
+ -webkit-mask-image: linear-gradient(90deg, #000 0, #000 68%, transparent 100%); mask-image: linear-gradient(90deg, #000 0, #000 68%, transparent 100%);
8830
+ }
8831
+ :root[data-reply][data-reply-legible="column"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .thread-inner {
8832
+ border-radius: 26px; background: color-mix(in srgb, var(--bg) 52%, transparent);
8833
+ -webkit-backdrop-filter: blur(20px) saturate(1.15); backdrop-filter: blur(20px) saturate(1.15);
8834
+ box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 8%, transparent);
8835
+ padding-left: 18px; padding-right: 18px;
8836
+ }
8837
+ :root[data-reply][data-reply-legible="halo"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant :is(.bubble, .who) {
8838
+ text-shadow: 0 0 1px var(--bg), 0 0 6px var(--bg), 0 0 14px color-mix(in srgb, var(--bg) 85%, transparent), 0 0 24px color-mix(in srgb, var(--bg) 60%, transparent);
8839
+ }
8840
+ :root[data-reply][data-reply-legible="halo"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .bubble { font-weight: 400; }
8841
+ /* El selector de la prueba: solo existe con ?reply= (app.js, PRUEBA · respuestas sin burbuja). */
8842
+ .reply-lab { position: fixed; left: 50%; top: 66px; z-index: 90; transform: translateX(-50%); display: grid; gap: 4px; padding: 6px; border-radius: 14px; background: color-mix(in srgb, var(--panel) 90%, transparent); -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); box-shadow: 0 0 0 .5px var(--line-2), 0 10px 28px -8px rgba(0, 0, 0, .45); font-family: var(--read); }
8843
+ .reply-lab .lab-row { display: flex; align-items: center; gap: 3px; }
8844
+ .reply-lab b { width: 58px; padding: 0 6px; font: 600 10px var(--mono); letter-spacing: .14em; text-transform: uppercase; color: var(--text-3); }
8845
+ .reply-lab button { white-space: nowrap; height: 27px; padding: 0 10px; border: 0; border-radius: 9px; background: transparent; color: var(--text-2); font: 500 12px var(--read); cursor: pointer; }
8846
+ .reply-lab button:hover { background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); }
8847
+ .reply-lab button.on { background: var(--phosphor); color: var(--phosphor-ink); }
8848
+ .reply-lab button:disabled { opacity: .4; cursor: default; }
8849
+ .reply-lab .lab-sample { margin-left: auto; box-shadow: inset 0 0 0 1px var(--line-2); }
8850
+
8851
+ /* ==========================================================================================
8852
+ PIEZAS QUE SE USAN (2026-10-15): la petición de comandos y la tarjeta de @madre local, con la
8853
+ letra de lectura y botones que se sienten botones. Solo forma: lo que hacen no cambia.
8854
+ ========================================================================================== */
8855
+ /* «@agente te pide correr» */
8856
+ #messages#messages .choice.run-request .choice-q { margin: 2px 2px 14px; font-family: var(--read); font-size: 16px; font-weight: 600; line-height: 1.4; }
8857
+ #messages#messages .choice.run-request .run-line { grid-template-columns: 22px minmax(0, 1fr) auto; align-items: center; gap: 12px; padding: 10px 10px 10px 12px; border: 0 !important; border-radius: 12px; background: color-mix(in srgb, var(--text) 4%, transparent) !important; box-shadow: inset 0 0 0 1px var(--line) !important; }
8858
+ #messages#messages .choice.run-request .run-line + .run-line, #messages#messages .choice.run-request .run-why + .run-line { margin-top: 6px; }
8859
+ #messages#messages .choice.run-request .run-line:hover:not(:disabled) { background: color-mix(in srgb, var(--text) 7%, transparent) !important; box-shadow: inset 0 0 0 1px var(--line-2) !important; }
8860
+ #messages#messages .choice.run-request .run-line .choice-key { width: 22px; height: 22px; margin: 0; border: 0 !important; border-radius: 6px; background: color-mix(in srgb, var(--text) 7%, transparent) !important; box-shadow: none !important; color: var(--text-3); font-size: 11.5px; }
8861
+ #messages#messages .choice.run-request .run-line .choice-text { padding: 0 !important; border: 0 !important; background: transparent !important; box-shadow: none !important; color: var(--text) !important; font-family: var(--mono); font-size: 13px; line-height: 1.45; }
8862
+ #messages#messages .choice.run-request .run-line .choice-tag { display: inline-flex; align-items: center; gap: 5px; height: 26px; padding: 0 11px; border: 0 !important; border-radius: 999px; background: color-mix(in srgb, var(--text) 9%, transparent) !important; box-shadow: none !important; color: var(--text) !important; font-family: var(--read); font-size: 12px; font-weight: 500; letter-spacing: 0; text-transform: lowercase; white-space: nowrap; }
8863
+ #messages#messages .choice.run-request .run-line .choice-tag::first-letter { text-transform: uppercase; }
8864
+ #messages#messages .choice.run-request .run-line:not(.ran):not(.failed):not(.refused):not(.running):not(.serving) .choice-tag { background: var(--agent, var(--phosphor)) !important; color: var(--agent-on, var(--phosphor-ink)) !important; }
8865
+ #messages#messages .choice.run-request .run-line.ran .choice-tag { background: color-mix(in srgb, var(--ok, var(--phosphor)) 15%, transparent) !important; color: var(--ok, var(--phosphor)) !important; }
8866
+ #messages#messages .choice.run-request .run-line.ran .choice-tag { position: relative; padding-left: 26px; }
8867
+ #messages#messages .choice.run-request .run-line.ran .choice-tag::before { content: '✓'; position: absolute; left: 11px; text-transform: none; }
8868
+ #messages#messages .choice.run-request .run-line.failed .choice-tag { background: color-mix(in srgb, var(--crit) 15%, transparent) !important; color: var(--crit) !important; }
8869
+ #messages#messages .choice.run-request .run-line.refused { opacity: 1; }
8870
+ #messages#messages .choice.run-request .run-line.refused .choice-text { color: var(--text-3) !important; }
8871
+ #messages#messages .choice.run-request .run-line.refused .choice-tag { background: transparent !important; box-shadow: inset 0 0 0 1px var(--line-2) !important; color: var(--text-3) !important; }
8872
+ #messages#messages .choice.run-request .run-why { margin: 6px 0 0 46px; font-family: var(--read); font-size: 12.5px; line-height: 1.45; letter-spacing: 0; text-transform: none; color: var(--text-3); }
8873
+ #messages#messages .choice.run-request .run-summary { display: inline-flex; align-items: center; margin: 12px 2px 0; padding: 4px 11px; border-radius: 999px; background: color-mix(in srgb, var(--text) 6%, transparent); font-family: var(--read); font-size: 12.5px; letter-spacing: 0; color: var(--text-2); }
8874
+ #messages#messages .choice.run-request.returned .run-summary { background: color-mix(in srgb, var(--ok, var(--phosphor)) 13%, transparent); color: var(--ok, var(--phosphor)); }
8875
+ #messages#messages .choice.run-request :is(.run-all, .run-back) { height: 30px; padding: 0 13px; border: 0 !important; border-radius: 9px; background: color-mix(in srgb, var(--text) 8%, transparent) !important; color: var(--text) !important; font-family: var(--read); font-size: 12.5px; font-weight: 500; letter-spacing: 0; text-transform: none; }
8876
+ #messages#messages .choice.run-request .choice-foot { margin: 14px 2px 0; font-family: var(--read); font-size: 12px; line-height: 1.5; letter-spacing: 0; text-transform: none; color: var(--text-3); }
8877
+ /* @madre local: una tarjeta que se lee, a la izquierda, y su botón como el de las demás. */
8878
+ #messages#messages .system.local-model { justify-items: start; gap: 6px; padding: 14px 16px; text-align: left; }
8879
+ #messages#messages .system.local-model .head { display: inline-flex; align-items: center; gap: 6px; font-family: var(--mono); font-size: 10.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-3); }
8880
+ #messages#messages .system.local-model .head .who { padding: 2px 8px; border-radius: 999px; background: color-mix(in srgb, var(--agent, var(--phosphor)) 14%, transparent); color: var(--agent, var(--phosphor)); }
8881
+ #messages#messages .system.local-model .says { max-width: 62ch; font-family: var(--read); font-size: 14px; line-height: 1.5; letter-spacing: 0; text-transform: none; color: var(--text); text-align: left; }
8882
+ #messages#messages .system.local-model .says.small { font-size: 12.5px; color: var(--text-3); }
8883
+ #messages#messages .system.local-model .acts { justify-content: flex-start; margin-top: 4px; }
8884
+ #messages#messages .system.local-model .acts button { height: 30px; padding: 0 14px; border: 0 !important; border-radius: 9px; background: var(--phosphor) !important; box-shadow: none !important; color: var(--phosphor-ink) !important; font-family: var(--read); font-size: 12.5px; font-weight: 600; letter-spacing: 0; text-transform: lowercase; }
8885
+ #messages#messages .system.local-model .acts button::first-letter { text-transform: uppercase; }
8886
+ #messages#messages .system.local-model .acts button + button { background: color-mix(in srgb, var(--text) 8%, transparent) !important; color: var(--text) !important; }
8887
+ .reply-lab .lab-code { margin-left: auto; padding: 4px 10px; border-radius: 8px; background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); font: 600 12px var(--mono); letter-spacing: .08em; }
8888
+
8889
+ /* «#3 EDITAR concedido»: un estado pequeño en el color de su modo, no una franja punteada. */
8890
+ #messages#messages .mode-ask.settled { display: inline-flex !important; grid-template-columns: none; justify-self: start; align-self: flex-start; width: fit-content !important; max-width: 100%; margin-left: 0 !important; margin-right: auto !important; padding: 5px 12px 5px 10px; border: 0 !important; border-radius: 999px; background: color-mix(in srgb, var(--mode-c, var(--ok, var(--phosphor))) 13%, transparent) !important; box-shadow: none !important; }
8891
+ #messages#messages .mode-ask.settled .mode-what { display: inline-flex; align-items: center; gap: 7px; font-family: var(--read); font-size: 12.5px; font-weight: 500; letter-spacing: 0; color: var(--mode-c, var(--ok, var(--phosphor))); }
8892
+ #messages#messages .mode-ask.settled .mode-what::before { content: '✓'; font-weight: 700; }
8893
+ #messages#messages .mode-ask.settled[data-mode="1"] { --mode-c: var(--mode-1); }
8894
+ #messages#messages .mode-ask.settled[data-mode="2"] { --mode-c: var(--mode-2); }
8895
+ #messages#messages .mode-ask.settled[data-mode="3"] { --mode-c: var(--mode-3); }
8896
+ #messages#messages .mode-ask.settled[data-mode="4"] { --mode-c: var(--mode-4); }
8897
+
8898
+ /* ==========================================================================================
8899
+ PRUEBA · las tarjetas de /run en cuatro formas (2026-10-15), por data-term en <html>:
8900
+ line (a), window (b), pill (c), step (d). Sin el atributo, la de siempre.
8901
+ ========================================================================================== */
8902
+ /* a · línea: el comando primero, el estado y quién a la derecha, la última línea debajo. */
8903
+ :root[data-term="line"] #messages#messages .command-card.terminal { border-radius: 14px; }
8904
+ :root[data-term="line"] #messages .command-card.terminal :is(.term-tag, .term-count) { display: none; }
8905
+ :root[data-term="line"] #messages .command-card.terminal .term-head { gap: 10px; padding: 10px 12px; }
8906
+ :root[data-term="line"] #messages .command-card.terminal .term-head .chev-icon { order: -1; }
8907
+ :root[data-term="line"] #messages .command-card.terminal .term-line { font-size: 13px; }
8908
+ :root[data-term="line"] #messages .command-card.terminal .term-status { font-family: var(--read); font-size: 12px; padding: 3px 10px; }
8909
+ :root[data-term="line"] #messages .command-card.terminal .term-who { font-family: var(--read); font-size: 12px; }
8910
+ :root[data-term="line"] #messages .command-card.terminal .term-peek { padding: 0 12px 10px 38px; font-size: 12px; }
8911
+ :root[data-term="line"] #messages .command-card.terminal .term-peek::before { content: '→ '; color: var(--text-3); }
8912
+ /* b · ventana: una terminal pequeña, oscura en los dos temas, con su salida a la vista. */
8913
+ :root[data-term="window"] #messages#messages .command-card.terminal { overflow: hidden; border-radius: 14px; border: 0 !important; background: #0d100d !important; box-shadow: 0 0 0 .5px rgba(255, 255, 255, .1), var(--lift-1) !important; color: #e9ede6; }
8914
+ :root[data-term="window"] #messages .command-card.terminal .term-head { padding: 9px 12px; background: rgba(255, 255, 255, .05); border-bottom: 1px solid rgba(255, 255, 255, .07); }
8915
+ :root[data-term="window"] #messages .command-card.terminal .term-head::before { content: ''; flex: none; width: 34px; height: 10px; background: radial-gradient(circle at 5px 5px, #ff5f57 4px, transparent 4.5px), radial-gradient(circle at 17px 5px, #febc2e 4px, transparent 4.5px), radial-gradient(circle at 29px 5px, #28c840 4px, transparent 4.5px); opacity: .85; }
8916
+ :root[data-term="window"] #messages .command-card.terminal :is(.term-tag, .term-count) { display: none; }
8917
+ :root[data-term="window"] #messages .command-card.terminal .term-line { color: #e9ede6; font-size: 12.5px; }
8918
+ :root[data-term="window"] #messages .command-card.terminal .term-who { color: #9aa197; }
8919
+ :root[data-term="window"] #messages .command-card.terminal .term-peek { margin: 0; padding: 10px 14px 12px; font-size: 12px; color: #b8c2b4; white-space: pre-wrap; }
8920
+ :root[data-term="window"] #messages .command-card.terminal .term-peek::before { content: '› '; color: #28c840; }
8921
+ :root[data-term="window"] #messages .command-card.terminal pre { background: transparent; border-top-color: rgba(255, 255, 255, .07); color: #e9ede6; }
8922
+ /* c · píldora: como las llamadas a herramientas de los chats, una línea del ancho de lo que dice. */
8923
+ :root[data-term="pill"] #messages#messages .command-card.terminal:not(.open) { justify-self: start; width: fit-content; max-width: 100%; border-radius: 999px; }
8924
+ :root[data-term="pill"] #messages .command-card.terminal:not(.open) .term-peek, :root[data-term="pill"] #messages .command-card.terminal :is(.term-tag, .term-count) { display: none; }
8925
+ :root[data-term="pill"] #messages .command-card.terminal:not(.open) .term-head { padding: 6px 12px 6px 8px; gap: 8px; }
8926
+ :root[data-term="pill"] #messages .command-card.terminal .term-status { order: -1; font-family: var(--read); font-size: 12px; }
8927
+ :root[data-term="pill"] #messages .command-card.terminal .term-line { font-size: 12.5px; }
8928
+ :root[data-term="pill"] #messages .command-card.terminal .term-who { font-family: var(--read); font-size: 12px; }
8929
+ :root[data-term="pill"] #messages#messages .command-card.terminal.open { border-radius: 14px; }
8930
+ /* d · paso: sin tarjeta; un punto de estado en un hilo, el comando y debajo quién, cuánto y qué dijo. */
8931
+ :root[data-term="step"] #messages#messages .command-card.terminal { position: relative; padding-left: 26px; border: 0 !important; background: transparent !important; box-shadow: none !important; }
8932
+ :root[data-term="step"] #messages#messages .command-card.terminal::before { content: ''; position: absolute; left: 7px; top: 0; bottom: 0; width: 2px; border-radius: 2px; background: color-mix(in srgb, var(--text) 12%, transparent); }
8933
+ :root[data-term="step"] #messages#messages .command-card.terminal::after { content: '✓'; position: absolute; left: 0; top: 9px; display: grid; place-items: center; width: 16px; height: 16px; border-radius: 50%; background: var(--ok, var(--phosphor)); color: var(--bg); font: 700 10px var(--read); }
8934
+ :root[data-term="step"] #messages#messages .command-card.terminal.failed::after { content: '✕'; background: var(--crit); }
8935
+ :root[data-term="step"] #messages .command-card.terminal :is(.term-tag, .term-count) { display: none; }
8936
+ :root[data-term="step"] #messages .command-card.terminal .term-head { flex-wrap: wrap; padding: 6px 0; row-gap: 2px; }
8937
+ :root[data-term="step"] #messages .command-card.terminal .term-line { flex: 1 1 calc(100% - 40px); font-size: 13px; }
8938
+ :root[data-term="step"] #messages .command-card.terminal .term-head .chev-icon { order: 0; }
8939
+ :root[data-term="step"] #messages .command-card.terminal .term-status { order: 2; padding: 0; background: none !important; font-family: var(--read); font-size: 12px; }
8940
+ :root[data-term="step"] #messages .command-card.terminal .term-who { order: 3; font-family: var(--read); font-size: 12px; }
8941
+ :root[data-term="step"] #messages .command-card.terminal .term-who::before { content: '· '; color: var(--text-3); }
8942
+ :root[data-term="step"] #messages .command-card.terminal .term-peek { padding: 0 0 6px; font-size: 12px; }
8943
+ :root[data-term="step"] #messages .command-card.terminal pre { border: 0; border-radius: 10px; margin-bottom: 6px; }
8944
+ :root[data-term="step"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .command-card.terminal { padding-right: 12px; border-radius: 0 14px 14px 0; background: color-mix(in srgb, var(--bg) 62%, transparent) !important; -webkit-backdrop-filter: blur(18px) saturate(1.15); backdrop-filter: blur(18px) saturate(1.15); }
8945
+ #messages#messages .mode-ask.settled { background: color-mix(in srgb, var(--mode-c, var(--phosphor)) 16%, color-mix(in srgb, var(--bg) 78%, transparent)) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mode-c, var(--phosphor)) 45%, transparent) !important; -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); }
8946
+ #messages#messages .mode-ask.settled .mode-what { color: color-mix(in srgb, var(--mode-c, var(--phosphor)) 70%, var(--text)); }
8947
+
8948
+ /* ==========================================================================================
8949
+ LABORATORIO DEL CHAT (2026-10-15): el panel de ?lab (app.js) y las cinco formas de cada
8950
+ elemento, por data-labNN en <html>. A es siempre como se ve hoy.
8951
+ ========================================================================================== */
8952
+ .lab-panel { position: fixed; top: 64px; right: 12px; bottom: 12px; z-index: 95; width: 300px; display: flex; flex-direction: column; border-radius: 16px; background: color-mix(in srgb, var(--panel) 92%, transparent); -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px); box-shadow: 0 0 0 .5px var(--line-2), 0 18px 40px -12px rgba(0, 0, 0, .5); font-family: var(--read); }
8953
+ .lab-panel.folded { bottom: auto; width: auto; }
8954
+ .lab-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--line); }
8955
+ .lab-head b { font: 600 13px var(--read); }
8956
+ .lab-fold { width: 26px; height: 26px; border: 0; border-radius: 8px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); cursor: pointer; }
8957
+ .lab-code { margin-left: auto; padding: 4px 9px; border-radius: 8px; background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); font: 600 12px var(--mono); letter-spacing: .06em; }
8958
+ .lab-copy, .lab-again { height: 28px; padding: 0 11px; border: 0; border-radius: 8px; background: var(--phosphor); color: var(--phosphor-ink); font: 600 12px var(--read); cursor: pointer; }
8959
+ .lab-copy { flex: 1 1 100%; }
8960
+ .lab-list { flex: 1; overflow: auto; padding: 6px 8px; display: grid; gap: 2px; align-content: start; }
8961
+ .lab-row { display: grid; gap: 3px; padding: 7px 6px; border-radius: 10px; }
8962
+ .lab-row:hover { background: color-mix(in srgb, var(--text) 4%, transparent); }
8963
+ .lab-top { display: flex; align-items: center; gap: 8px; }
8964
+ .lab-n { font: 600 10.5px var(--mono); color: var(--text-3); }
8965
+ .lab-name { flex: 1; min-width: 0; font-size: 12.5px; font-weight: 600; color: var(--text); }
8966
+ .lab-keys { display: inline-flex; gap: 2px; padding: 2px; border-radius: 8px; background: color-mix(in srgb, var(--text) 6%, transparent); }
8967
+ .lab-keys button { width: 22px; height: 22px; border: 0; border-radius: 6px; background: none; color: var(--text-2); font: 600 11px var(--mono); cursor: pointer; }
8968
+ .lab-keys button.on { background: var(--phosphor); color: var(--phosphor-ink); }
8969
+ .lab-desc { padding-left: 26px; font-size: 11.5px; color: var(--text-3); }
8970
+ .lab-again { margin: 8px 12px 12px; background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text); }
8971
+ :root[data-lab="on"] .shell { padding-right: 312px; }
8972
+ @media (max-width: 900px) { :root[data-lab="on"] .shell { padding-right: 0; } .lab-panel { width: 260px; } }
8973
+ /* 01 · Mensaje del humano */
8974
+ :root[data-lab01="B"] #messages#messages .row.user .bubble { background: var(--panel-2) !important; color: var(--text) !important; border-radius: 20px !important; box-shadow: none !important; }
8975
+ :root[data-lab01="C"] #messages#messages .row.user .bubble { background: transparent !important; color: var(--text) !important; box-shadow: none !important; padding: 0 !important; text-align: right; }
8976
+ :root[data-lab01="D"] #messages#messages .row.user { justify-self: stretch; max-width: 100%; }
8977
+ :root[data-lab01="D"] #messages#messages .row.user .col { justify-items: stretch; }
8978
+ :root[data-lab01="D"] #messages#messages .row.user .bubble { background: var(--panel) !important; color: var(--text) !important; border-radius: 14px !important; box-shadow: 0 0 0 1px var(--line-2) !important; text-align: left; }
8979
+ :root[data-lab01="D"] #messages#messages .row.user .who { justify-content: flex-start; }
8980
+ :root[data-lab01="E"] #messages#messages .row.user .bubble { background: var(--panel-2) !important; color: var(--text) !important; border-radius: 20px !important; box-shadow: inset 0 0 0 1px var(--line) !important; }
8981
+ :root[data-lab01="E"] #messages#messages .row.user .stamp .to { order: -1; font-size: 12px; color: var(--text); }
8982
+ /* 02 · Adjuntos */
8983
+ :root[data-lab02="B"] #messages .row.user .files { display: flex; flex-wrap: wrap; gap: 6px; }
8984
+ :root[data-lab02="B"] #messages .row.user .file-tile { display: inline-flex; align-items: center; gap: 6px; width: auto; height: 28px; padding: 0 10px; border: 0; border-radius: 999px; background: color-mix(in srgb, var(--text) 8%, transparent); }
8985
+ :root[data-lab02="C"] #messages .row.user .file-tile { display: inline-grid; grid-template-columns: 30px auto; align-items: center; gap: 10px; width: auto; height: auto; padding: 8px 12px 8px 8px; border: 0; border-radius: 12px; background: var(--panel); box-shadow: var(--lift-1); color: var(--text); }
8986
+ :root[data-lab02="C"] #messages .row.user .file-tile .kind { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; background: color-mix(in srgb, var(--text) 8%, transparent); }
8987
+ :root[data-lab02="D"] #messages .row.user .files { display: flex; flex-wrap: wrap; gap: 4px 10px; }
8988
+ :root[data-lab02="D"] #messages .row.user .file-tile { width: auto; height: auto; padding: 0; border: 0; background: none; color: inherit; opacity: .75; font-size: 12px; }
8989
+ :root[data-lab02="D"] #messages .row.user .file-tile .kind { display: none; }
8990
+ :root[data-lab02="D"] #messages .row.user .file-tile .name::before { content: '📎 '; }
8991
+ :root[data-lab02="E"] #messages .row.user .bubble { display: flex; flex-direction: column; }
8992
+ :root[data-lab02="E"] #messages .row.user .files { order: -1; margin: 0 0 8px; }
8993
+ /* 03 · Pensando */
8994
+ :root[data-lab03="B"] #messages .row.thinking .bubble > i { display: none; }
8995
+ :root[data-lab03="B"] #messages .row.thinking .bubble { background: transparent !important; box-shadow: none !important; }
8996
+ :root[data-lab03="B"] #messages .row.thinking .bubble::before { content: 'Pensando…'; background: linear-gradient(90deg, var(--text-3) 0%, var(--text) 50%, var(--text-3) 100%); background-size: 200% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; animation: lab-shimmer 2.2s linear infinite; font-weight: 500; }
8997
+ @keyframes lab-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
8998
+ :root[data-lab03="C"] #messages .row.thinking .bubble { background: transparent !important; box-shadow: none !important; }
8999
+ :root[data-lab03="C"] #messages .row.thinking .bubble > i { display: none; }
9000
+ :root[data-lab03="C"] #messages .row.thinking > .avatar { animation: lab-pulse 1.4s ease-in-out infinite; }
9001
+ @keyframes lab-pulse { 0%, 100% { transform: scale(.92); } 50% { transform: scale(1.08); } }
9002
+ :root[data-lab03="D"] #messages .row.thinking .bubble > i { display: none; }
9003
+ :root[data-lab03="D"] #messages .row.thinking .bubble { width: 140px; height: 4px; padding: 0 !important; border-radius: 4px !important; overflow: hidden; background: color-mix(in srgb, var(--text) 10%, transparent) !important; box-shadow: none !important; }
9004
+ :root[data-lab03="D"] #messages .row.thinking .bubble::before { content: ''; display: block; width: 40%; height: 100%; border-radius: inherit; background: var(--agent, var(--phosphor)); animation: lab-bar 1.4s ease-in-out infinite; }
9005
+ @keyframes lab-bar { 0% { transform: translateX(-100%); } 100% { transform: translateX(260%); } }
9006
+ :root[data-lab03="E"] #messages .row.thinking .bubble > i { display: none; }
9007
+ :root[data-lab03="E"] #messages .row.thinking .bubble { display: inline-flex !important; align-items: center; gap: 6px; padding: 4px 12px !important; border-radius: 999px !important; background: color-mix(in srgb, var(--agent, var(--text)) 12%, transparent) !important; box-shadow: none !important; font-size: 12.5px; }
9008
+ :root[data-lab03="E"] #messages .row.thinking .bubble::before { content: 'pensando'; color: var(--agent, var(--text)); font-weight: 500; }
9009
+ /* 04 · Cabecera del agente */
9010
+ :root[data-lab04="B"] #messages#messages .row.assistant .who > span:first-child { font-family: var(--read); font-size: 14px; font-weight: 600; letter-spacing: 0; text-transform: none; color: var(--text); }
9011
+ :root[data-lab04="B"] #messages#messages .row.assistant .who .badge:not(.mode) { background: none !important; padding: 0; font-family: var(--read); letter-spacing: 0; text-transform: none; color: var(--text-3); }
9012
+ :root[data-lab04="C"] #messages#messages .row.assistant .who > span:first-child { padding: 3px 10px; border-radius: 999px; background: color-mix(in srgb, var(--agent) 15%, transparent); font-weight: 600; }
9013
+ :root[data-lab04="D"] #messages#messages .row.assistant .who > :not(:first-child) { opacity: 0; transition: opacity .2s; }
9014
+ :root[data-lab04="D"] #messages#messages .row.assistant:hover .who > :not(:first-child) { opacity: 1; }
9015
+ :root[data-lab04="E"] #messages#messages .row.assistant { grid-template-columns: minmax(0, 1fr); }
9016
+ :root[data-lab04="E"] #messages#messages .row.assistant > .avatar { display: none; }
9017
+ :root[data-lab04="E"] #messages#messages .row.assistant .who { align-items: center; }
9018
+ :root[data-lab04="E"] #messages#messages .row.assistant .who::before { content: ''; flex: none; width: 18px; height: 18px; border-radius: 50%; background: var(--agent); }
9019
+ /* 05 · Cuerpo de la respuesta (hoy: prosa libre con carril) */
9020
+ :root[data-lab05="B"] #messages#messages .row.assistant .bubble { background: var(--panel) !important; box-shadow: var(--lift-1) !important; border-radius: 20px 20px 20px 6px !important; padding: 12px 16px !important; }
9021
+ :root[data-lab05="C"] #messages#messages .row.assistant .bubble { background: var(--panel) !important; box-shadow: 0 0 0 1px var(--line-2) !important; border-radius: 14px !important; padding: 12px 16px !important; }
9022
+ :root[data-lab05="D"] #messages#messages .row.assistant .bubble { padding: 4px 0 4px 14px !important; border-left: 3px solid var(--agent) !important; }
9023
+ :root[data-lab05="E"] #messages#messages .row.assistant .who { padding-bottom: 7px; margin-bottom: 6px; border-bottom: 1px solid var(--line); }
9024
+ :root[data-lab05]:not([data-lab05="A"]) #messages#messages .row.assistant .col::before { display: none; }
9025
+ :root[data-lab05="D"] #messages#messages .row.assistant .col::before, :root[data-lab05="E"] #messages#messages .row.assistant .col::before { display: block; }
9026
+ /* 06 · Memoria citada */
9027
+ :root[data-lab06="B"] #messages .cite { font-family: var(--mono); font-size: 10px; vertical-align: super; padding: 1px 4px; border-radius: 4px; background: color-mix(in srgb, var(--madre-green) 16%, transparent); color: var(--madre-green); }
9028
+ :root[data-lab06="C"] #messages .cite { display: inline-flex; padding: 1px 8px; border-radius: 999px; background: color-mix(in srgb, var(--madre-green) 14%, transparent); color: var(--madre-green); font: 500 11.5px var(--mono); }
9029
+ :root[data-lab06="D"] #messages .cite { text-decoration: underline dotted var(--madre-green); text-decoration-thickness: 2px; text-underline-offset: 4px; }
9030
+ :root[data-lab06="E"] #messages .cite { font-size: .8em; color: var(--text-3); }
9031
+ /* 07 · Plan */
9032
+ :root[data-lab07="B"] #messages .plan-card ol { list-style: none; padding-left: 0; }
9033
+ :root[data-lab07="B"] #messages .plan-card li { position: relative; padding: 6px 0 6px 26px; }
9034
+ :root[data-lab07="B"] #messages .plan-card li::before { content: ''; position: absolute; left: 0; top: 8px; width: 16px; height: 16px; border-radius: 5px; box-shadow: inset 0 0 0 1.5px var(--line-2); }
9035
+ :root[data-lab07="C"] #messages .plan-card ol { padding-left: 22px; }
9036
+ :root[data-lab07="C"] #messages .plan-card li { padding: 8px 0; border-top: 1px dashed var(--line-2); }
9037
+ :root[data-lab07="C"] #messages .plan-card li:first-child { border-top: 0; }
9038
+ :root[data-lab07="D"] #messages .plan-card ol { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; padding: 0; list-style: none; }
9039
+ :root[data-lab07="D"] #messages .plan-card li { display: grid; gap: 4px; margin: 0; padding: 10px 12px; border-radius: 12px; background: color-mix(in srgb, var(--agent) 10%, transparent); }
9040
+ :root[data-lab07="E"] #messages .plan-card ol { list-style: none; padding-left: 0; }
9041
+ :root[data-lab07="E"] #messages .plan-card li { position: relative; margin: 0; padding: 6px 0 10px 24px; }
9042
+ :root[data-lab07="E"] #messages .plan-card li::before { content: ''; position: absolute; left: 0; top: 9px; width: 12px; height: 12px; border-radius: 50%; background: var(--agent); }
9043
+ :root[data-lab07="E"] #messages .plan-card li:not(:last-child)::after { content: ''; position: absolute; left: 5px; top: 23px; bottom: -2px; width: 2px; background: var(--line-2); }
9044
+ /* 08 · Bloque de código */
9045
+ :root[data-lab08="B"] #messages .codeblock { overflow: hidden; border: 0 !important; border-radius: 12px; background: var(--panel) !important; box-shadow: var(--lift-1); }
9046
+ :root[data-lab08="B"] #messages .codeblock .lang, :root[data-lab08="B"] #messages .codeblock .copy { font-family: var(--read); letter-spacing: 0; text-transform: none; }
9047
+ :root[data-lab08="C"] #messages .codeblock .lang { display: none; }
9048
+ :root[data-lab08="C"] #messages .codeblock .copy { opacity: 0; transition: opacity .2s; }
9049
+ :root[data-lab08="C"] #messages .codeblock:hover .copy { opacity: 1; }
9050
+ :root[data-lab08="C"] #messages .codeblock { border: 0 !important; background: color-mix(in srgb, var(--text) 5%, transparent) !important; }
9051
+ :root[data-lab08="D"] #messages .codeblock { border: 0 !important; background: #0d100d !important; color: #e9ede6; }
9052
+ :root[data-lab08="D"] #messages .codeblock :is(pre, code, .lang, .copy) { color: #e9ede6 !important; background: transparent !important; }
9053
+ :root[data-lab08="E"] #messages .codeblock pre { max-height: 7.5em; overflow: hidden; -webkit-mask-image: linear-gradient(#000 55%, transparent); mask-image: linear-gradient(#000 55%, transparent); }
9054
+ /* 09 · Pie de la respuesta */
9055
+ :root[data-lab09="B"] #messages .row.assistant .bubble-foot .stamp { display: none; }
9056
+ :root[data-lab09="B"] #messages .row.assistant .bubble-foot { opacity: 0; transition: opacity .2s; }
9057
+ :root[data-lab09="B"] #messages .row.assistant:hover .bubble-foot { opacity: 1; }
9058
+ :root[data-lab09="C"] #messages .row.assistant .bubble-foot .stamp { padding: 3px 10px; border-radius: 999px; background: color-mix(in srgb, var(--text) 7%, transparent); }
9059
+ :root[data-lab09="D"] #messages .row.assistant .bubble-actions .act { border-radius: 8px; background: color-mix(in srgb, var(--text) 7%, transparent); }
9060
+ :root[data-lab09="E"] #messages .row.assistant .bubble-foot .stamp { opacity: .45; transition: opacity .2s; }
9061
+ :root[data-lab09="E"] #messages .row.assistant:hover .bubble-foot .stamp { opacity: 1; }
9062
+ /* 10 · Elección */
9063
+ :root[data-lab10="B"] #messages .choice:not(.run-request) .choice-list { display: flex; flex-wrap: wrap; gap: 6px; }
9064
+ :root[data-lab10="B"] #messages .choice:not(.run-request) .choice-option { width: auto; display: inline-flex; padding: 7px 14px; border-radius: 999px; }
9065
+ :root[data-lab10="B"] #messages .choice:not(.run-request) .choice-key { display: none; }
9066
+ :root[data-lab10="C"] #messages .choice:not(.run-request) .choice-option { border: 0; border-top: 1px solid var(--line); border-radius: 0; background: none; }
9067
+ :root[data-lab10="D"] #messages .choice:not(.run-request) .choice-list { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
9068
+ :root[data-lab10="D"] #messages .choice:not(.run-request) .choice-option { grid-template-columns: 1fr; align-content: start; min-height: 74px; }
9069
+ :root[data-lab10="E"] #messages .choice:not(.run-request) { background: transparent !important; box-shadow: none !important; border: 0 !important; padding: 0 !important; }
9070
+ :root[data-lab10="E"] #messages .choice:not(.run-request) .choice-list { display: flex; flex-wrap: wrap; gap: 6px; }
9071
+ :root[data-lab10="E"] #messages .choice:not(.run-request) .choice-option { width: auto; padding: 7px 14px; border-radius: 9px; }
9072
+ :root[data-lab10="E"] #messages .choice:not(.run-request) .choice-option.recommended { background: var(--agent, var(--phosphor)); color: var(--agent-on, var(--phosphor-ink)); }
9073
+ :root[data-lab10="E"] #messages .choice:not(.run-request) :is(.choice-key, .choice-kicker, .choice-foot) { display: none; }
9074
+ /* 11 · Petición de permiso */
9075
+ :root[data-lab11="B"] #messages .mode-ask:not(.settled) { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; }
9076
+ :root[data-lab11="B"] #messages .mode-ask:not(.settled) .mode-why { display: none; }
9077
+ :root[data-lab11="C"] #messages .mode-ask:not(.settled) { border: 0 !important; border-left: 4px solid var(--mode-2) !important; border-radius: 6px 14px 14px 6px !important; background: var(--panel) !important; }
9078
+ :root[data-lab11="D"] #messages .mode-ask:not(.settled) { position: sticky; bottom: 8px; z-index: 5; box-shadow: 0 10px 28px -8px rgba(0, 0, 0, .45) !important; }
9079
+ :root[data-lab11="E"] #messages .mode-ask:not(.settled) { background: transparent !important; border: 1px solid var(--line-2) !important; box-shadow: none !important; }
9080
+ /* 12 · Permiso concedido */
9081
+ :root[data-lab12="B"] #messages#messages .mode-ask.settled { align-self: stretch; width: auto !important; background: none !important; box-shadow: none !important; gap: 10px; }
9082
+ :root[data-lab12="B"] #messages#messages .mode-ask.settled::before, :root[data-lab12="B"] #messages#messages .mode-ask.settled::after { content: ''; flex: 1; align-self: center; height: 1px; background: var(--line-2); }
9083
+ :root[data-lab12="C"] #messages#messages .mode-ask.settled { align-self: center; background: none !important; box-shadow: none !important; }
9084
+ :root[data-lab12="C"] #messages#messages .mode-ask.settled .mode-what { color: var(--text-3); font-weight: 400; }
9085
+ :root[data-lab12="C"] #messages#messages .mode-ask.settled .mode-what::before { content: none; }
9086
+ :root[data-lab12="D"] #messages#messages .mode-ask.settled .mode-what::before { content: '🔓'; }
9087
+ :root[data-lab12="E"] #messages#messages .mode-ask.settled { background: none !important; box-shadow: none !important; }
9088
+ :root[data-lab12="E"] #messages#messages .mode-ask.settled .mode-what { color: var(--text-2); font-weight: 400; }
9089
+ :root[data-lab12="E"] #messages#messages .mode-ask.settled .mode-what::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--mode-c, var(--phosphor)); }
9090
+ /* 13 · Petición de comandos */
9091
+ :root[data-lab13="B"] #messages#messages .choice.run-request .run-line { background: transparent !important; box-shadow: none !important; border-radius: 0; border-top: 1px solid var(--line) !important; }
9092
+ :root[data-lab13="C"] #messages#messages .choice.run-request .run-line { background: #0d100d !important; }
9093
+ :root[data-lab13="C"] #messages#messages .choice.run-request .run-line .choice-text { color: #e9ede6 !important; }
9094
+ :root[data-lab13="D"] #messages#messages .choice.run-request .choice-list { counter-reset: lab-run; }
9095
+ :root[data-lab13="D"] #messages#messages .choice.run-request .run-line { counter-increment: lab-run; }
9096
+ :root[data-lab13="D"] #messages#messages .choice.run-request .run-line .choice-key { font-size: 0 !important; }
9097
+ :root[data-lab13="D"] #messages#messages .choice.run-request .run-line .choice-key::after { content: counter(lab-run); font: 600 11.5px var(--mono); color: var(--text-2); }
9098
+ :root[data-lab13="E"] #messages#messages .choice.run-request .run-line:not(.refused):not(:hover) .choice-tag { opacity: 0; }
9099
+ /* 15 · Avisos del sistema (abiertos en B–E) */
9100
+ :root[data-lab15]:not([data-lab15="A"]) #messages#messages .sys-dots.open { background: none !important; box-shadow: none !important; -webkit-backdrop-filter: none; backdrop-filter: none; }
9101
+ :root[data-lab15]:not([data-lab15="A"]) #messages#messages .sys-dots.open > .sys-more { display: none; }
9102
+ :root[data-lab15="B"] #messages#messages .sys-dots.open > .system.folded { text-align: center; padding-left: 12px !important; background: none !important; }
9103
+ :root[data-lab15="B"] #messages#messages .sys-dots.open > .system.folded::before { display: none; }
9104
+ :root[data-lab15="C"] #messages#messages .sys-dots.open > .system.folded { text-align: center; padding: 8px 12px !important; border-top: 1px solid var(--line-2); border-radius: 0 !important; background: none !important; }
9105
+ :root[data-lab15="C"] #messages#messages .sys-dots.open > .system.folded::before { display: none; }
9106
+ :root[data-lab15="D"] #messages#messages .sys-dots.open { justify-items: start; }
9107
+ :root[data-lab15="D"] #messages#messages .sys-dots.open > .system.folded { justify-self: start; border-radius: 999px !important; background: color-mix(in srgb, var(--panel) 88%, transparent) !important; box-shadow: var(--lift-1); }
9108
+ :root[data-lab15="E"] #messages#messages .sys-dots.open { gap: 8px; }
9109
+ :root[data-lab15="E"] #messages#messages .sys-dots.open > .system.folded { border-radius: 14px !important; background: var(--panel) !important; box-shadow: var(--lift-1); }
9110
+ /* 16 · Error y diagnóstico */
9111
+ :root[data-lab16="B"] #messages#messages .thread-inner > .system.fail { justify-self: start; margin-left: 40px; text-align: left; }
9112
+ :root[data-lab16="B"] #messages#messages .thread-inner > .system.fail::before { content: '⚠ '; }
9113
+ :root[data-lab16="C"] #messages#messages .thread-inner > .system.fail { width: 100%; max-width: 100%; border-radius: 10px; text-align: left; }
9114
+ :root[data-lab16="D"] #messages#messages .thread-inner > .system.fail { background: none !important; box-shadow: none !important; padding: 0; font-size: 12.5px; }
9115
+ :root[data-lab16="E"] #messages#messages .thread-inner > .system.fail { background: var(--panel) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--danger) 45%, transparent), var(--lift-1) !important; color: var(--text); }
9116
+ /* 17 · Espacio entre turnos */
9117
+ :root[data-lab17="B"] #messages .thread-inner > * + * { margin-top: 4px !important; }
9118
+ :root[data-lab17="C"] #messages .thread-inner > * + * { margin-top: 28px !important; }
9119
+ :root[data-lab17="D"] #messages .thread-inner > .row + .row { padding-top: 14px; border-top: 1px solid var(--line); }
9120
+ :root[data-lab17="E"] #messages .thread-inner > .row.assistant + .row.assistant { margin-top: 2px !important; }
9121
+ :root[data-lab17="E"] #messages .thread-inner > :is(.row.assistant[data-agent="claude"] + .row.assistant[data-agent="claude"], .row.assistant[data-agent="codex"] + .row.assistant[data-agent="codex"], .row.assistant[data-agent="gemini"] + .row.assistant[data-agent="gemini"], .row.assistant[data-agent="opencode"] + .row.assistant[data-agent="opencode"], .row.assistant[data-agent="madre"] + .row.assistant[data-agent="madre"]) .who { display: none; }
9122
+ :root[data-lab17="E"] #messages .thread-inner > :is(.row.assistant[data-agent="claude"] + .row.assistant[data-agent="claude"], .row.assistant[data-agent="codex"] + .row.assistant[data-agent="codex"], .row.assistant[data-agent="gemini"] + .row.assistant[data-agent="gemini"], .row.assistant[data-agent="opencode"] + .row.assistant[data-agent="opencode"], .row.assistant[data-agent="madre"] + .row.assistant[data-agent="madre"]) > .avatar { visibility: hidden; }
9123
+ :root[data-lab15="B"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .sys-dots.open > .system.folded,
9124
+ :root[data-lab15="C"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .sys-dots.open > .system.folded { background: color-mix(in srgb, var(--bg) 62%, transparent) !important; -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); border-radius: 12px !important; }
9125
+
9126
+ /* ==========================================================================================
9127
+ CHAT · ACCC-BABA-ECBB-DCAA-C (2026-10-15). Lo que se eligió en el laboratorio (?lab), hecho
9128
+ forma de la sala: adjuntos en tarjeta, avatar que late al pensar, el agente en una píldora, la
9129
+ respuesta en burbuja, el plan como lista de tareas, la hora sola al pie, elecciones en lista con
9130
+ número, el permiso en una línea, el concedido como divisoria, comandos en pasos, cada /run en
9131
+ píldora (data-term="pill", app.js) y aire entre turnos. Cada regla se aparta cuando el
9132
+ laboratorio compara otra forma de su elemento (data-labNN en <html>). Sin backdrop-filter en el
9133
+ hilo, como dicen los planos: sobre un fondo de pantalla, cada pieza lleva su propio material.
9134
+ ========================================================================================== */
9135
+
9136
+ /* 02 · Adjuntos: una tarjeta por archivo, con su tipo, su nombre y su tamaño. */
9137
+ :root:not([data-lab02]) #messages#messages .bubble .files { gap: 8px; margin-top: 10px; }
9138
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile:not(.image) {
9139
+ display: inline-grid; grid-template-columns: 34px minmax(0, auto); align-items: center; column-gap: 10px;
9140
+ max-width: min(100%, 280px); padding: 7px 14px 7px 7px; border: 0; border-radius: 12px;
9141
+ background: var(--plane-solid); color: var(--text); text-align: left;
9142
+ box-shadow: 0 0 0 .5px rgb(var(--plane-ink) / .14), 0 1px 2px rgb(var(--plane-ink) / .1);
9143
+ transition: transform calc(160ms * var(--motion-scale)) ease, box-shadow calc(160ms * var(--motion-scale)) ease;
9144
+ }
9145
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile:not(.image):hover { transform: translateY(-1px); box-shadow: 0 0 0 .5px rgb(var(--plane-ink) / .18), 0 4px 10px -4px rgb(var(--plane-ink) / .28); }
9146
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 70%, transparent); outline-offset: 2px; }
9147
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile .kind { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 9px; background: color-mix(in srgb, var(--phosphor) 12%, transparent); color: var(--phosphor); font: 600 9.5px var(--mono); letter-spacing: .06em; }
9148
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile .file-text { display: grid; gap: 1px; min-width: 0; }
9149
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 500 13px/1.3 var(--read); letter-spacing: 0; }
9150
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile .meta { font: 400 11.5px/1.3 var(--read); font-variant-numeric: tabular-nums; color: var(--text-3); }
9151
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile.image { overflow: hidden; border-radius: 12px; box-shadow: 0 0 0 .5px rgb(var(--plane-ink) / .14); }
9152
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile.image img { border-radius: 0; }
9153
+
9154
+ /* 03 · Pensando: sin globo. El avatar respira y deja un anillo en su color; al lado, lo que hace y
9155
+ cuánto lleva. Sobre un fondo de pantalla, la línea va en el material de las etiquetas. */
9156
+ :root:not([data-lab03]) #messages#messages .row.thinking .bubble { gap: 0; padding: 4px 6px 4px 2px; border-radius: 999px; background: transparent !important; box-shadow: none !important; }
9157
+ :root:not([data-lab03]) #messages#messages .row.thinking .bubble > i { display: none; }
9158
+ :root:not([data-lab03]) #messages#messages .row.thinking .status { margin-left: 0; font-size: 14px; font-style: normal; color: var(--text-2); }
9159
+ :root:not([data-lab03]) #messages#messages .row.thinking .status::after { display: none; }
9160
+ :root:not([data-lab03]) #messages#messages .row.thinking :is(.elapsed, .tokens) { margin-left: 10px; font-size: 11px; letter-spacing: 0; font-variant-numeric: tabular-nums; }
9161
+ :root:not([data-lab03]) #messages#messages .row.thinking .stop-turn { margin-left: 6px; }
9162
+ :root:not([data-lab03]) #messages#messages .row.thinking > .avatar { position: relative; animation: think-breathe calc(2.4s * var(--motion-scale) / .7) ease-in-out infinite; }
9163
+ :root:not([data-lab03]) #messages#messages .row.thinking > .avatar::after { content: ''; position: absolute; inset: 0; border-radius: 50%; pointer-events: none; animation: think-ring calc(2.4s * var(--motion-scale) / .7) ease-out infinite; }
9164
+ :root:not([data-lab03])[data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.thinking .bubble { padding: 4px 8px 4px 14px; background: var(--plane-meta) !important; }
9165
+ @keyframes think-breathe { 0%, 100% { transform: scale(1); } 50% { transform: scale(.9); } }
9166
+ @keyframes think-ring {
9167
+ 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--agent, var(--phosphor)) 50%, transparent); }
9168
+ 70%, 100% { box-shadow: 0 0 0 9px color-mix(in srgb, var(--agent, var(--phosphor)) 0%, transparent); }
9169
+ }
9170
+
9171
+ /* 04 · Cabecera: el nombre del agente en su píldora, en letra de lectura; modelo y esfuerzo detrás,
9172
+ en píldoras neutras (AJUSTES EN LA SALA REAL, al final); el modo conserva su color. */
9173
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who { align-items: center; gap: 8px; padding: 3px 10px 3px 3px; }
9174
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who > span:first-child { padding: 2px 10px; border-radius: 999px; background: color-mix(in srgb, var(--agent) 15%, transparent); color: color-mix(in srgb, var(--agent) 82%, var(--text)); font: 600 12.5px/1.4 var(--read); letter-spacing: 0; text-transform: none; }
9175
+
9176
+ /* 05 · Cuerpo: la burbuja, con la esquina corta hacia el avatar, que va abajo. */
9177
+ :root:not([data-reply]) #messages#messages .row.assistant:not(.delegated) .bubble { border-radius: 20px 20px 20px 6px; padding: 13px 17px 10px; }
9178
+
9179
+ /* 07 · Plan: una lista de tareas; cada casilla en el color de quien la hará. */
9180
+ :root:not([data-lab07]) #messages#messages .plan-card { margin: 10px 0 8px; padding: 10px 14px 8px; border: 0; border-radius: 14px; background: color-mix(in srgb, var(--text) 4%, transparent); }
9181
+ :root:not([data-lab07]) #messages#messages .plan-card .plan-label { display: block; margin-bottom: 4px; }
9182
+ :root:not([data-lab07]) #messages#messages .plan-card ol { margin: 0; padding: 0; list-style: none; }
9183
+ :root:not([data-lab07]) #messages#messages .plan-card li { position: relative; margin: 0; padding: 6px 0 6px 28px; font-size: 14px; line-height: 1.45; }
9184
+ :root:not([data-lab07]) #messages#messages .plan-card li::before { content: ''; position: absolute; left: 0; top: calc(6px + (1.45em - 17px) / 2); width: 17px; height: 17px; box-sizing: border-box; border-radius: 5px; background: color-mix(in srgb, var(--agent) 8%, var(--plane-solid)); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--agent) 55%, var(--line-2)); }
9185
+ :root:not([data-lab07]) #messages#messages .plan-card li + li { border-top: 1px solid color-mix(in srgb, var(--text) 6%, transparent); }
9186
+
9187
+ /* 09 · Pie: la hora sola; lo que costó aparece al pasar o al enfocar la respuesta. */
9188
+ :root:not([data-lab09]) #messages#messages .row.assistant .bubble-foot .stamp > span:not(:first-child) { opacity: 0; transition: opacity calc(180ms * var(--motion-scale)) ease; }
9189
+ :root:not([data-lab09]) #messages#messages .row.assistant:is(:hover, :focus-within) .bubble-foot .stamp > span { opacity: 1; }
9190
+ :root:not([data-lab09]) #messages#messages .row.assistant .bubble-foot .stamp > span:first-child { font-variant-numeric: tabular-nums; }
9191
+ @media (hover: none) { :root:not([data-lab09]) #messages#messages .row.assistant .bubble-foot .stamp > span { opacity: 1; } }
9192
+
9193
+ /* 10 · Elección: una lista con número, como las de los chats; cada fila es una frase que se presiona. */
9194
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-list { gap: 0; overflow: hidden; border-radius: 14px; box-shadow: inset 0 0 0 1px var(--line-2); }
9195
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option { grid-template-columns: 24px minmax(0, 1fr) auto; align-items: center; gap: 12px; padding: 11px 14px; border: 0; border-radius: 0; background: transparent; font-size: 14.5px; line-height: 1.45; }
9196
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option + .choice-option { box-shadow: inset 0 1px 0 var(--line); }
9197
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option:hover { background: color-mix(in srgb, var(--agent, var(--text)) 6%, transparent); }
9198
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option:focus-visible { outline-offset: -2px; }
9199
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-key { display: grid; place-items: center; width: 24px; height: 24px; border: 0; border-radius: 50%; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text-2); font: 600 11.5px var(--mono); }
9200
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option.recommended { background: color-mix(in srgb, var(--agent, var(--phosphor)) 5%, transparent); }
9201
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option.recommended .choice-key,
9202
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option.picked .choice-key { background: var(--agent, var(--phosphor)); color: var(--agent-on, var(--bg)); }
9203
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option.picked { background: color-mix(in srgb, var(--agent, var(--phosphor)) 10%, transparent); }
9204
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-tag { padding: 3px 9px; border: 0; border-radius: 999px; background: color-mix(in srgb, var(--agent, var(--phosphor)) 13%, transparent); color: color-mix(in srgb, var(--agent, var(--phosphor)) 85%, var(--text)); font: 500 11.5px var(--read); letter-spacing: 0; text-transform: lowercase; }
9205
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-tag::first-letter { text-transform: uppercase; }
9206
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-foot { margin-top: 12px; font: 400 12px/1.5 var(--read); letter-spacing: 0; text-transform: none; color: var(--text-3); }
9207
+
9208
+ /* 11 · Permiso: en una línea, como Claude Code: qué pide y por cuánto, los botones a la derecha, y
9209
+ debajo, en letra secundaria, cómo se confirma. */
9210
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; margin: 10px 0 2px; padding: 10px 12px 10px 14px; border: 0; border-radius: 14px; background: color-mix(in srgb, var(--warn, #e2a022) 7%, var(--plane-solid)) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--warn, #e2a022) 38%, transparent), 0 1px 2px rgb(var(--plane-ink) / .08) !important; -webkit-backdrop-filter: none; backdrop-filter: none; }
9211
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-what { flex: 1 1 260px; font: 400 14px/1.45 var(--read); }
9212
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-what .who { padding: 0; border-radius: 0; background: none !important; font-weight: 600; }
9213
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-time { font: 400 13px var(--read); letter-spacing: 0; color: var(--text-2); }
9214
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-why { order: 9; flex: 1 1 100%; font: 400 12.5px/1.45 var(--read); color: var(--text-3); }
9215
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-windows { flex-wrap: nowrap; max-width: 100%; overflow-x: auto; scrollbar-width: none; }
9216
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-window { flex: none; font: 500 12px var(--read); letter-spacing: 0; padding: 4px 9px; white-space: nowrap; }
9217
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-actions { margin: 0; gap: 6px; }
9218
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) :is(.mode-go, .mode-alt) { height: 30px; padding: 0 13px; border-radius: 9px; font: 500 12.5px var(--read); letter-spacing: 0; text-transform: lowercase; white-space: nowrap; transition: background calc(150ms * var(--motion-scale)), color calc(150ms * var(--motion-scale)); }
9219
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) :is(.mode-go, .mode-alt)::first-letter { text-transform: uppercase; }
9220
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-go { font-weight: 600; box-shadow: none; }
9221
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-alt { border: 0; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); }
9222
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-alt:hover { background: color-mix(in srgb, var(--text) 12%, transparent); }
9223
+
9224
+ /* 12 · Concedido: una divisoria a lo ancho de la respuesta, con el permiso al centro en su color. */
9225
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled { display: flex !important; align-items: center; gap: 12px; justify-self: stretch; align-self: stretch; width: auto !important; margin: 12px 0 2px !important; padding: 0; background: none !important; box-shadow: none !important; }
9226
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled::before,
9227
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled::after { content: ''; flex: 1; height: 1px; background: color-mix(in srgb, var(--mode-c, var(--ok, var(--phosphor))) 40%, var(--line-2)); animation: settle-line calc(420ms * var(--motion-scale) / .7) cubic-bezier(.2, .7, .2, 1) both; }
9228
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled::before { transform-origin: right; }
9229
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled::after { transform-origin: left; }
9230
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled .mode-what { flex: none; padding: 4px 12px; border-radius: 999px; background: color-mix(in srgb, var(--mode-c, var(--ok, var(--phosphor))) 14%, var(--plane-solid)); color: color-mix(in srgb, var(--mode-c, var(--ok, var(--phosphor))) 80%, var(--text)); }
9231
+ @keyframes settle-line { from { transform: scaleX(0); opacity: 0; } }
9232
+
9233
+ /* 13 · Petición de comandos: pasos numerados; el paso que corrió dice ✓ y el que falló ✕. */
9234
+ :root:not([data-lab13]) #messages#messages .choice.run-request .choice-list { counter-reset: run-step; }
9235
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line { counter-increment: run-step; }
9236
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line .choice-key { font-size: 0 !important; border-radius: 50%; }
9237
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line .choice-key::after { content: counter(run-step); font: 600 11.5px var(--mono); color: var(--text-2); }
9238
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.ran .choice-key { background: color-mix(in srgb, var(--ok, var(--phosphor)) 16%, transparent) !important; }
9239
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.ran .choice-key::after { content: '✓'; color: var(--ok, var(--phosphor)); font-family: var(--read); }
9240
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.failed .choice-key { background: color-mix(in srgb, var(--crit) 15%, transparent) !important; }
9241
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.failed .choice-key::after { content: '✕'; color: var(--crit); font-family: var(--read); }
9242
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.refused .choice-key::after { color: var(--text-3); }
9243
+ :root:not([data-lab13]) #messages#messages .choice.run-request :is(.run-all, .run-back) { text-transform: lowercase; }
9244
+ :root:not([data-lab13]) #messages#messages .choice.run-request :is(.run-all, .run-back)::first-letter { text-transform: uppercase; }
9245
+
9246
+ /* 17 · Aire entre turnos, como en los chats de hoy; lo que es del mismo turno queda junto. */
9247
+ :root:not([data-lab17]) #messages#messages .thread-inner > * + * { margin-top: 28px; }
9248
+ :root:not([data-lab17]) #messages#messages .thread-inner > :is(.command-card, .sys-dots) + :is(.command-card, .sys-dots),
9249
+ :root:not([data-lab17]) #messages#messages .thread-inner > .row.assistant + :is(.choice, .command-card) { margin-top: 0; }
9250
+
9251
+ @media (prefers-reduced-motion: reduce) {
9252
+ #messages#messages .row.thinking > .avatar, #messages#messages .row.thinking > .avatar::after, #messages#messages .mode-ask.settled::before, #messages#messages .mode-ask.settled::after { animation: none !important; }
9253
+ #messages#messages .row.thinking > .avatar::after { box-shadow: 0 0 0 3px color-mix(in srgb, var(--agent, var(--phosphor)) 30%, transparent); }
9254
+ #messages#messages .bubble .file-tile:hover { transform: none; }
9255
+ }
9256
+
9257
+ /* ==========================================================================================
9258
+ AJUSTES EN LA SALA REAL (2026-10-15, tras ACCC-BABA-ECBB-DCAA-C)
9259
+ ========================================================================================== */
9260
+
9261
+ /* El conjunto de un agente en un solo carril: la cabecera, la burbuja, lo que pide (elección,
9262
+ comandos) y sus /run empiezan donde empieza la burbuja, a la derecha del avatar. */
9263
+ :root:not([data-reply]) #messages#messages .row.assistant { column-gap: 14px; }
9264
+ :root:not([data-reply]) #messages#messages .row.assistant .col > .who { margin-left: 0; }
9265
+ :root:not([data-reply]) #messages#messages .thread-inner > :is(.choice, .command-card) { --agent-lane: 42px; margin-left: var(--agent-lane) !important; margin-right: 0; max-width: min(760px, calc(100% - var(--agent-lane))); }
9266
+ :root:not([data-reply])[data-term="pill"] #messages#messages .thread-inner > .command-card.terminal.open { width: auto; }
9267
+
9268
+ /* La cabecera: un plano con píldoras dentro, que se leen como una pieza. El plano deja 3 px
9269
+ alrededor de todo (radio 14 = 11 de la píldora + 3), las píldoras van a 4 px entre sí, todas de
9270
+ 22 px, letra de lectura de 12 px y el mismo material: sólido, con un filo de medio píxel; el
9271
+ color solo tiñe. El texto suelto (la pregunta citada, lo cobrado) lleva el mismo aire que una
9272
+ píldora. En angosto se acomoda en renglones en vez de desbordarse. */
9273
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who { flex-wrap: wrap; align-items: center; gap: 4px; row-gap: 4px; max-width: 100%; padding: 3px; box-sizing: border-box; border-radius: 14px; box-shadow: inset 0 0 0 .5px rgb(var(--plane-ink) / .1) !important; }
9274
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who > span:first-child,
9275
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who :is(.badge, .to-agent) {
9276
+ --chip: var(--text); --chip-mix: 5%;
9277
+ display: inline-block; flex: none; height: 22px; max-width: 100%; padding: 0 10px; box-sizing: border-box; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
9278
+ border: 0; border-radius: 11px; background: color-mix(in srgb, var(--chip) var(--chip-mix), var(--plane-solid)) !important;
9279
+ box-shadow: inset 0 0 0 .5px color-mix(in srgb, var(--chip) 18%, transparent);
9280
+ color: color-mix(in srgb, var(--chip) 80%, var(--text)); font: 500 12px/22px var(--read); letter-spacing: 0; text-transform: none;
9281
+ }
9282
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who :is(.badge, .to-agent) { --chip: var(--text-2); }
9283
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who > span:first-child { --chip: var(--agent); --chip-mix: 15%; font-weight: 600; }
9284
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .to-agent { --chip: var(--agent); --chip-mix: 13%; }
9285
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.ash { --chip: var(--phosphor); --chip-mix: 13%; text-transform: lowercase; }
9286
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge:not(.model, .mode)::first-letter,
9287
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.model.effort::first-letter { text-transform: uppercase; }
9288
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.mode { font-family: var(--mono); font-size: 10.5px; font-weight: 600; letter-spacing: .06em; }
9289
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who :is(.reply, .spent) { padding: 0 7px; line-height: 22px; letter-spacing: 0; text-transform: none; }
9290
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .reply { flex: 1 1 140px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11.5px; }
9291
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .spent { flex: none; padding-left: 4px; font: 400 11px/22px var(--mono); font-variant-numeric: tabular-nums; color: var(--text-3); }
9292
+
9293
+ /* Modo · modelo · esfuerzo en claro: el mismo vidrio blanco que ya tiene en oscuro. */
9294
+ :root[data-scheme="light"] .composer > .pick-options .pick-label {
9295
+ background: rgb(255 255 255 / .6);
9296
+ box-shadow: 0 0 0 .5px rgb(20 30 20 / .1), inset 0 1px 0 #ffffff, 0 6px 18px rgb(20 30 20 / .1);
9297
+ -webkit-backdrop-filter: blur(20px) saturate(1.6); backdrop-filter: blur(20px) saturate(1.6);
9298
+ }
9299
+
9300
+ /* Cambiar de proyecto: al pasar, el cuadro de atrás se despega un poco; al presionar, o con la
9301
+ ventana abierta, se ilumina el de enfrente. */
9302
+ .switch-button svg > path { transition: transform calc(220ms * var(--motion-scale) / .7) cubic-bezier(.2, .8, .2, 1); }
9303
+ .switch-button:is(:hover, :focus-visible) svg > path { transform: translate(1.3px, -1.3px); }
9304
+ .switch-button svg > .ic-f { transition: fill calc(160ms * var(--motion-scale)) ease, filter calc(160ms * var(--motion-scale)) ease; }
9305
+ .switch-button:active svg > .ic-f, body:has(dialog.room-switch[open]) .switch-button svg > .ic-f { fill: currentColor; fill-opacity: .9; filter: drop-shadow(0 0 3px color-mix(in srgb, currentColor 45%, transparent)); }
9306
+ @media (prefers-reduced-motion: reduce) { .switch-button svg > path { transition: none; } .switch-button:is(:hover, :focus-visible) svg > path { transform: none; } }
9307
+
9308
+ /* El foco de un aviso de primera vez (spotlight, tour.js): lo que el aviso nombra se ve claro, con
9309
+ un aro suave del acento, y el resto de la página baja un poco. Sin pico en la tarjeta. */
9310
+ .hint-spot {
9311
+ position: fixed; z-index: 2147482999; pointer-events: none; box-sizing: border-box;
9312
+ box-shadow: 0 0 0 200vmax rgb(14 20 16 / .16), 0 0 0 2px color-mix(in srgb, var(--accent, var(--phosphor)) 55%, transparent), 0 0 24px 2px color-mix(in srgb, var(--accent, var(--phosphor)) 32%, transparent);
9313
+ background: rgb(255 255 255 / .06);
9314
+ animation: hint-spot-in calc(360ms * var(--motion-scale, .7) / .7) cubic-bezier(.2, .8, .2, 1) both;
9315
+ transition: left .2s ease, top .2s ease, width .2s ease, height .2s ease;
9316
+ }
9317
+ .hint-spot[hidden] { display: none; }
9318
+ :root:not([data-scheme="light"]) .hint-spot { box-shadow: 0 0 0 200vmax rgb(0 0 0 / .3), 0 0 0 2px color-mix(in srgb, var(--accent, var(--phosphor)) 60%, transparent), 0 0 26px 3px color-mix(in srgb, var(--accent, var(--phosphor)) 30%, transparent); }
9319
+ @keyframes hint-spot-in { from { opacity: 0; transform: scale(1.06); } }
9320
+ @media (prefers-reduced-motion: reduce) { .hint-spot { animation: none; transition: none; } }
9321
+
9322
+ /* La fila de avisos dice con una flecha que se despliega: hacia abajo junto a «+N» cerrada, hacia
9323
+ arriba en «Plegar» abierta. La flecha es la misma, girada, y va centrada con el texto. */
9324
+ #messages .sys-dots { --chev: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 10 8 6l4 4' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
9325
+ #messages .sys-dots > .sys-more::after {
9326
+ content: ''; display: inline-block; flex: none; width: 10px; height: 10px; background: currentColor;
9327
+ -webkit-mask: var(--chev) center / contain no-repeat; mask: var(--chev) center / contain no-repeat;
9328
+ transition: transform calc(180ms * var(--motion-scale)) ease;
9329
+ }
9330
+ #messages#messages .sys-dots:not(.open) > .sys-more:not([hidden]) { display: inline-flex; align-items: center; gap: 4px; line-height: 1; }
9331
+ #messages#messages .sys-dots:not(.open) > .sys-more::after { transform: rotate(180deg); opacity: .8; }
9332
+ #messages#messages .sys-dots:not(.open):hover > .sys-more::after { transform: rotate(180deg) translateY(-1px); opacity: 1; }
9333
+ /* «Plegar»: una tecla de 26 px, la palabra y su flecha en la misma línea media. */
9334
+ #messages#messages .sys-dots.open > .sys-more {
9335
+ display: inline-block; height: 26px; margin-top: 4px; padding: 0 11px 0 13px; box-sizing: border-box; border-radius: 999px;
9336
+ font: 500 12.5px/26px var(--read); letter-spacing: 0; text-transform: lowercase; white-space: nowrap; color: var(--text-2);
9337
+ transition: background calc(150ms * var(--motion-scale)) ease, color calc(150ms * var(--motion-scale)) ease;
9338
+ }
9339
+ #messages#messages .sys-dots.open > .sys-more::first-letter { text-transform: uppercase; }
9340
+ #messages#messages .sys-dots.open > .sys-more::after { width: 11px; height: 11px; margin-left: 6px; vertical-align: middle; position: relative; top: -1px; }
9341
+ #messages#messages .sys-dots.open > .sys-more:hover { background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); }
9342
+ #messages#messages .sys-dots.open > .sys-more:hover::after { transform: translateY(-1px); }
9343
+ @media (prefers-reduced-motion: reduce) { #messages .sys-dots > .sys-more::after { transition: none; } }
9344
+
9345
+ /* Los avisos abiertos como una lista que se lee (2026-10-15): cada uno con su punto, la etiqueta
9346
+ pequeña arriba y lo que dice debajo en letra de lectura; una línea fina entre uno y otro; la
9347
+ memoria, las barras de límite y los comandos alineados a la izquierda como lo demás; lo repetido
9348
+ seguido, una sola vez con «×N» (groupRepeats, app.js). */
9349
+ #messages#messages .sys-dots.open { gap: 0; width: min(92%, 600px); padding: 6px 6px 8px; border-radius: 18px; }
9350
+ #messages#messages .sys-dots.open > .system.folded {
9351
+ display: block; padding: 11px 14px 12px 34px !important; border-radius: 12px !important;
9352
+ font: 400 13.5px/1.5 var(--read) !important; letter-spacing: 0 !important; text-transform: none !important; text-align: left !important;
9353
+ color: var(--text-2) !important;
9354
+ }
9355
+ #messages#messages .sys-dots.open > .system.folded + .system.folded:not(.repeat)::after { content: ''; position: absolute; left: 34px; right: 14px; top: 0; height: 1px; background: color-mix(in srgb, var(--text) 7%, transparent); }
9356
+ #messages#messages .sys-dots.open > .system.folded:hover::after, #messages#messages .sys-dots.open > .system.folded:hover + .system.folded::after { opacity: 0; }
9357
+ #messages#messages .sys-dots.open > .system.folded::before { left: 14px; top: 16px; width: 8px; height: 8px; box-shadow: 0 0 0 3px color-mix(in srgb, var(--dot) 18%, transparent); }
9358
+ #messages#messages .sys-dots.open > .system.folded.repeat { display: none !important; }
9359
+ /* La etiqueta: su propia línea, pequeña, en el tono del aviso. */
9360
+ #messages#messages .sys-dots.open > .system.folded > b:first-child {
9361
+ display: block; width: fit-content; margin: 0 0 3px; font: 600 10px/1.4 var(--mono); letter-spacing: .14em; text-transform: uppercase;
9362
+ color: color-mix(in srgb, var(--dot) 70%, var(--text-2));
9363
+ }
9364
+ #messages#messages .sys-dots.open > .system.folded:is([data-tone="info"], :not([data-tone])) > b:first-child { color: var(--text-3); }
9365
+ #messages#messages .sys-dots.open > .system.folded[data-times] > b:first-child::after { content: var(--times); margin-left: 8px; padding: 1px 6px; border-radius: 999px; background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text-2); font-weight: 600; letter-spacing: .04em; }
9366
+ #messages#messages .sys-dots.open > .system.folded > b:not(:first-child) { font-weight: 600; color: var(--text); }
9367
+ /* La barra de un límite: bajo el texto, a la izquierda, fina. */
9368
+ #messages#messages .sys-dots.open > .system.folded .gauge { display: block; width: min(100%, 280px); height: 4px; margin: 9px 0 1px; border-radius: 4px; background: color-mix(in srgb, var(--text) 10%, transparent); overflow: hidden; }
9369
+ #messages#messages .sys-dots.open > .system.folded .gauge .now { display: block; height: 100%; border-radius: inherit; background: var(--dot); }
9370
+ /* El comando de un módulo: un trozo de código, no una caja con borde. */
9371
+ #messages#messages .sys-dots.open > .system.folded .cmd { display: block; width: fit-content; max-width: 100%; box-sizing: border-box; margin: 7px 0 0; padding: 3px 9px; border: 0 !important; box-shadow: none !important; outline: 0; border-radius: 7px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); font: 400 12px/1.5 var(--mono); letter-spacing: 0; text-transform: none; overflow-wrap: anywhere; }
9372
+ /* La memoria: como los demás, a la izquierda; quién, en su píldora; la cuenta en voz baja. */
9373
+ #messages#messages .sys-dots.open > .system.folded.claim { display: block; width: auto; }
9374
+ #messages#messages .sys-dots.open > .system.folded.claim > .claim-head { font-size: 10px; }
9375
+ #messages#messages .sys-dots.open > .system.folded.claim > .claim-head .who { display: inline-block; margin-left: 4px; padding: 0 7px; border-radius: 999px; background: color-mix(in srgb, var(--agent, var(--text)) 14%, transparent); color: color-mix(in srgb, var(--agent, var(--text)) 80%, var(--text)); letter-spacing: .06em; }
9376
+ #messages#messages .sys-dots.open > .system.folded.claim .claim-body { display: block; font-size: 13.5px; color: var(--text-2); }
9377
+ #messages#messages .sys-dots.open > .system.folded.claim .claim-note { display: block; margin-top: 2px; font: 400 12px/1.5 var(--read); letter-spacing: 0; text-transform: none; color: var(--text-3); }
9378
+ #messages#messages .sys-dots.open > .system.folded.claim .claim-acts { justify-content: flex-start; }
9379
+ #messages#messages .sys-dots.open > .sys-more { justify-self: center; margin-top: 8px; }
9380
+ #messages#messages .sys-dots.open > .system.folded.claim > * { margin-left: 0 !important; margin-right: 0 !important; max-width: none !important; text-align: left !important; justify-self: start !important; }
9381
+ /* La cabecera en una sola línea (2026-10-15): lo primero que cede es la pregunta citada (se corta
9382
+ con «…»), luego modelo, esfuerzo y las demás insignias; el nombre y lo cobrado no se cortan. */
9383
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who { flex-wrap: nowrap; border-radius: 14px; }
9384
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who > span:first-child,
9385
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .spent { flex: none; }
9386
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who :is(.badge, .to-agent) { flex: none; }
9387
+ /* Solo lo que es una frase (de dónde viene una orden, «orden 1 de 1 · …») puede cortarse. */
9388
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge:not(.model, .mode, .ash) { flex: 0 1 auto; min-width: 60px; }
9389
+ /* Con el chat angosto se callan primero los que se pueden leer en otro lado: el esfuerzo (lo dice
9390
+ el sello de tu mensaje) y, más angosto, el ahorro de tokens (lo dice la caja de escribir). */
9391
+ #messages .thread-inner { container: thread / inline-size; }
9392
+ @container thread (max-width: 540px) { :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.effort { display: none; } }
9393
+ @container thread (max-width: 430px) { :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.ash { display: none; } }
9394
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .reply { flex: 1 1 0; min-width: 0; max-width: max-content; }
9395
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .reply:empty { display: none; }
9396
+ /* El punto de un aviso solo (2026-10-15): más chico y casi transparente, para no ensuciar el
9397
+ lienzo; vuelve a verse entero al pasar o al enfocarlo. La fila con «+N» se atenúa menos. */
9398
+ #messages#messages .sys-dots.single { padding: 3px; margin-block: 2px; border-color: transparent; background: color-mix(in srgb, var(--bg) 30%, transparent); -webkit-backdrop-filter: none; backdrop-filter: none; opacity: .5; transition: opacity calc(180ms * var(--motion-scale)) ease, background calc(180ms * var(--motion-scale)) ease; }
9399
+ #messages#messages .sys-dots.single > .system.folded { width: 6px !important; height: 6px !important; box-shadow: none !important; }
9400
+ #messages#messages .sys-dots:not(.open):not(.single) { opacity: .8; transition: opacity calc(180ms * var(--motion-scale)) ease; }
9401
+ #messages#messages .sys-dots:not(.open):is(:hover, :focus-visible) { opacity: 1; background: color-mix(in srgb, var(--bg) 78%, transparent); }
9402
+ /* El contexto compartido no lleva etiqueta: empieza con palabras y sus @agentes van en la frase. */
9403
+ #messages#messages .sys-dots.open > .system.folded.handoff > b:first-child { display: inline; margin: 0; font: 600 13.5px/1.5 var(--read); letter-spacing: 0; text-transform: none; color: var(--text); }
9404
+
9405
+ /* Lo que queda detrás de la caja de escribir (2026-10-15): la conversación se desvanece en los últimos
9406
+ ~10 px antes del borde de la caja de escribir (--type-gap; más largo se veía como un resplandor) (--dock-h la mide app.js, measureDock) en vez de asomarse bajo modo · modelo y detrás
9407
+ de la versión. El final de la conversación sigue subiendo por encima: el hilo ya deja ese aire. */
9408
+ :root:not(.via-phone) #messages.thread {
9409
+ -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - var(--type-gap, var(--dock-h, 0px)) - 10px), transparent calc(100% - var(--type-gap, var(--dock-h, 0px)) + 2px));
9410
+ mask-image: linear-gradient(to bottom, #000 calc(100% - var(--type-gap, var(--dock-h, 0px)) - 10px), transparent calc(100% - var(--type-gap, var(--dock-h, 0px)) + 2px));
9411
+ }
9412
+ /* La barra del proyecto junto a dos paneles (2026-10-15): angosta en una pantalla ancha. Por
9413
+ debajo de 760 px «Primeros pasos» queda en su anillo y su cuenta (la frase sigue en su nombre y
9414
+ su título) y las teclas se juntan, para que todo quepa sin pisar Inicio · Proyectos · Ajustes y
9415
+ el nombre del proyecto no sea lo primero en irse. */
9416
+ @container roombar (max-width: 760px) {
9417
+ .shell > .bar:not(.bar-home) { gap: 10px; }
9418
+ #steps-pill .steps-label { display: none; }
9419
+ #steps-pill { gap: 6px; padding-inline: 9px 11px; }
9420
+ /* El nombre del proyecto se queda; el título de la conversación es el que se corta con «…». */
9421
+ .shell > .bar:not(.bar-home) .project:not(.chat-here) { font-size: 11px; }
9422
+ .shell > .bar:not(.bar-home) .project:not(.chat-here)::after { content: none; }
9423
+ }
9424
+ /* Cerrada, la salida de un /run no da su ancho a la píldora (2026-10-15): sus líneas largas (un
9425
+ `cloc`, una tabla) la estiraban de lado a lado aunque no se vieran. Ocupa el ancho de la píldora
9426
+ sin pedirlo; abierta, vuelve a medir lo suyo. */
9427
+ :root[data-term="pill"] #messages#messages .command-card.terminal:not(.open) .term-out { width: 0; min-width: 100%; }
9428
+ /* La esquina de quién hizo MADRE (public/attribution.js): un enlace a su autor, con aire bajo
9429
+ modo · modelo · esfuerzo para no pegarse a su vidrio cuando el centro es angosto. */
9430
+ .shell > .colophon { margin-top: 8px; }
9431
+ .colophon-link { color: inherit; text-decoration: none; border-radius: inherit; }
9432
+ .colophon-link:hover { text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1px; }
9433
+ .colophon-link:focus-visible { outline: 2px solid var(--accent, var(--phosphor)); outline-offset: 3px; }
9434
+ /* Lo que está fuera de la pantalla no se dibuja (2026-10-15): cada pieza de la conversación lleva
9435
+ content-visibility:auto, así que el navegador no la mide ni la pinta hasta que se acerca, y
9436
+ recuerda su alto una vez vista (contain-intrinsic-size: auto). Buscar con ⌘F, seleccionar y
9437
+ saltar a una cita siguen funcionando. El margen de recorte deja ver las sombras y los anillos
9438
+ que salen un poco de su caja. */
9439
+ #messages .thread-inner > :is(.row, .choice, .command-card, .system, .sys-dots) {
9440
+ content-visibility: auto;
9441
+ contain-intrinsic-size: auto 140px;
9442
+ overflow-clip-margin: 28px;
9443
+ }