@jossuealcala/madre 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.md +281 -0
  5. package/bin/madre.mjs +134 -0
  6. package/docs/madre-banner.svg +25 -0
  7. package/package.json +63 -0
  8. package/public/app.js +4031 -0
  9. package/public/brands.js +59 -0
  10. package/public/index.html +231 -0
  11. package/public/styles.css +976 -0
  12. package/public/troubleshooting.js +460 -0
  13. package/src/adapters/claude.mjs +105 -0
  14. package/src/adapters/codex.mjs +84 -0
  15. package/src/adapters/gemini.mjs +335 -0
  16. package/src/adapters/opencode.mjs +148 -0
  17. package/src/adapters/process.mjs +132 -0
  18. package/src/ashcode.mjs +64 -0
  19. package/src/auth-probe.mjs +145 -0
  20. package/src/capabilities.mjs +126 -0
  21. package/src/checkpoint.mjs +106 -0
  22. package/src/cli-args.mjs +38 -0
  23. package/src/commands.mjs +98 -0
  24. package/src/config.mjs +59 -0
  25. package/src/conversation-context.mjs +59 -0
  26. package/src/directives.mjs +70 -0
  27. package/src/distiller.mjs +78 -0
  28. package/src/embeddings.mjs +80 -0
  29. package/src/event-store.mjs +152 -0
  30. package/src/extensions.mjs +263 -0
  31. package/src/files.mjs +177 -0
  32. package/src/image-studio.mjs +25 -0
  33. package/src/lease.mjs +83 -0
  34. package/src/mcp/image-server.mjs +169 -0
  35. package/src/mcp/memory-server.mjs +221 -0
  36. package/src/memory-tools.mjs +34 -0
  37. package/src/memory.mjs +543 -0
  38. package/src/models.mjs +78 -0
  39. package/src/mother.mjs +163 -0
  40. package/src/quota-monitor.mjs +119 -0
  41. package/src/quota-sources.mjs +161 -0
  42. package/src/room.mjs +1159 -0
  43. package/src/router.mjs +13 -0
  44. package/src/runtime-detection.mjs +85 -0
  45. package/src/server.mjs +693 -0
  46. package/src/setup.mjs +192 -0
  47. package/src/usage-sentinel.mjs +65 -0
@@ -0,0 +1,976 @@
1
+ /* MADRE — a conversation, not a log.
2
+ iMessage for the dialogue, a terminal for the metadata, MOTHER for the mood. */
3
+
4
+ :root {
5
+ color-scheme: dark;
6
+ font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", Inter, "Segoe UI", sans-serif;
7
+ --mono: "SF Mono", ui-monospace, Menlo, Consolas, monospace;
8
+
9
+ --bg: #050605;
10
+ --bg-2: #0b0d0b;
11
+ --panel: #101310;
12
+ --panel-2: #171b17;
13
+ --line: rgba(255, 255, 255, .07);
14
+ --line-2: rgba(255, 255, 255, .13);
15
+ --text: #eef1ea;
16
+ --text-2: #9aa197;
17
+ --text-3: #626a5f;
18
+
19
+ --phosphor: #9bff66; /* MOTHER */
20
+ --brew: #28fe14; /* ORDER 937: Terminal.app 'Homebrew' green */
21
+ --brew-ink: #041004;
22
+ --phosphor-ink: #0a1405;
23
+ --accent: var(--phosphor);
24
+ --accent-ink: var(--phosphor-ink);
25
+
26
+ --bubble: #1c201c; /* agent bubble */
27
+ --bubble-ink: #eef1ea;
28
+ --user: var(--phosphor); /* user bubble */
29
+ --user-ink: var(--phosphor-ink);
30
+
31
+ --danger: #ff7b72;
32
+ --warn: #ffd166;
33
+ --crit: #ff8a7a;
34
+ --terror: #ff2a1f; /* MOTHER, when she stops being polite */
35
+ --shadow: 0 1px 0 rgba(255,255,255,.03) inset, 0 12px 40px rgba(0,0,0,.45);
36
+
37
+ /* Permission modes: one colour each, read by the chip, the field, the send button and the menu. */
38
+ --mode-0: #8d978c; --mode-0-ink: #0b0d0b; /* GHOST · smoke */
39
+ --mode-1: var(--phosphor); --mode-1-ink: var(--phosphor-ink); /* EXCHANGE · phosphor */
40
+ --mode-2: #ffb000; --mode-2-ink: #1a1000; /* CREATE · amber phosphor */
41
+ --mode-3: var(--terror); --mode-3-ink: #fff3f1; /* CONTROL · the red screen */
42
+ }
43
+ @media (prefers-color-scheme: light) {
44
+ :root:not([data-theme="dark"]) {
45
+ color-scheme: light;
46
+ --bg: #f4f5f2;
47
+ --bg-2: #ffffff;
48
+ --panel: #ffffff;
49
+ --panel-2: #eef0ea;
50
+ --line: rgba(0, 0, 0, .07);
51
+ --line-2: rgba(0, 0, 0, .13);
52
+ --text: #121512;
53
+ --text-2: #5a615a;
54
+ --text-3: #8b928a;
55
+ --phosphor: #2f8a1c;
56
+ --brew: #178f0c;
57
+ --brew-ink: #ffffff;
58
+ --phosphor-ink: #ffffff;
59
+ --bubble: #e9ebe6;
60
+ --bubble-ink: #121512;
61
+ --danger: #b3261e;
62
+ --warn: #8a6a00;
63
+ --crit: #a1301f;
64
+ --shadow: 0 12px 40px rgba(0,0,0,.08);
65
+ --mode-0: #6f786e; --mode-0-ink: #ffffff;
66
+ --mode-2: #a06e00; --mode-2-ink: #ffffff;
67
+ --mode-3: #d81b12; --mode-3-ink: #ffffff;
68
+ }
69
+ }
70
+ :root[data-theme="light"] {
71
+ color-scheme: light;
72
+ --bg: #f4f5f2;
73
+ --bg-2: #ffffff;
74
+ --panel: #ffffff;
75
+ --panel-2: #eef0ea;
76
+ --line: rgba(0, 0, 0, .07);
77
+ --line-2: rgba(0, 0, 0, .13);
78
+ --text: #121512;
79
+ --text-2: #5a615a;
80
+ --text-3: #8b928a;
81
+ --phosphor: #2f8a1c;
82
+ --brew: #178f0c;
83
+ --brew-ink: #ffffff;
84
+ --phosphor-ink: #ffffff;
85
+ --bubble: #e9ebe6;
86
+ --bubble-ink: #121512;
87
+ --danger: #b3261e;
88
+ --warn: #8a6a00;
89
+ --crit: #a1301f;
90
+ --shadow: 0 12px 40px rgba(0,0,0,.08);
91
+ }
92
+
93
+ * { box-sizing: border-box; }
94
+ [hidden] { display: none !important; }
95
+ html, body { height: 100%; }
96
+ body {
97
+ margin: 0;
98
+ color: var(--text);
99
+ background:
100
+ linear-gradient(rgba(155,255,102,.035) 1px, transparent 1px) 0 0 / 100% 3px,
101
+ radial-gradient(ellipse at 50% -20%, var(--bg-2), var(--bg) 55%);
102
+ -webkit-font-smoothing: antialiased;
103
+ }
104
+ @media (prefers-color-scheme: light) { body { background: radial-gradient(ellipse at 50% -20%, var(--bg-2), var(--bg) 55%); } }
105
+
106
+ .shell {
107
+ --column: min(880px, 100% - 40px);
108
+ --gap: 12px;
109
+ height: 100dvh;
110
+ width: 100%;
111
+ display: grid;
112
+ grid-template-rows: auto 1fr auto auto auto;
113
+ }
114
+ .bar, .onboarding, .composer, .safety, .thread-inner { width: var(--column); margin-left: auto; margin-right: auto; }
115
+ .shell > .bar { grid-row: 1; } .shell > .onboarding { grid-row: 2; } .shell > .thread { grid-row: 3; } .shell > .composer { grid-row: 4; } .shell > .safety { grid-row: 5; }
116
+ .shell > .bar, .shell > .onboarding, .shell > .thread, .shell > .composer, .shell > .safety, .shell > .tree { grid-column: 1; }
117
+ .visually-hidden { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
118
+
119
+ /* ================= bar ================= */
120
+ .bar {
121
+ display: flex; align-items: center; gap: 18px;
122
+ padding: 18px 0 14px;
123
+ border-bottom: 1px solid var(--line);
124
+ font-family: var(--mono); font-size: 11px; letter-spacing: .04em;
125
+ color: var(--text-2);
126
+ }
127
+ .bar-left { display: flex; align-items: center; gap: 14px; min-width: 0; }
128
+ .brand { display: flex; align-items: center; gap: 10px; color: var(--text); font-weight: 700; letter-spacing: .22em; font-size: 11px; text-decoration: none; cursor: pointer; }
129
+ .brand:hover .brand-mark { filter: drop-shadow(0 0 10px var(--phosphor)); } .brand:hover .brand-word { color: var(--phosphor); }
130
+ .brand-mark { width: 64px; height: 18px; color: var(--phosphor); overflow: visible; filter: drop-shadow(0 0 6px color-mix(in srgb, var(--phosphor) 55%, transparent)); }
131
+ .brand-mark .beat { stroke-dasharray: 100; stroke-dashoffset: 100; animation: beat-draw 1.1s cubic-bezier(.2, .7, .2, 1) .15s forwards; }
132
+ .brand-mark .beat-dot { opacity: 0; transform-origin: 60px 10px; transform-box: view-box; animation: beat-dot 1s ease-out 1.05s forwards, beat-idle 2.6s ease-in-out 2.4s infinite; }
133
+ .brand-word { opacity: 0; transform: translateX(-6px); animation: word-in .6s ease-out 1.35s forwards; }
134
+ @keyframes beat-draw { to { stroke-dashoffset: 0; } }
135
+ @keyframes beat-dot { 0% { opacity: 0; transform: scale(.2); } 35% { opacity: 1; transform: scale(1.9); } 100% { opacity: 1; transform: scale(1); } }
136
+ @keyframes beat-idle { 0%, 100% { opacity: 1; transform: scale(1); } 14% { transform: scale(1.35); } 28% { transform: scale(1); } 42% { transform: scale(1.2); } 56% { transform: scale(1); } }
137
+ @keyframes word-in { to { opacity: 1; transform: none; } }
138
+ @media (prefers-reduced-motion: reduce) {
139
+ .brand-mark .beat { animation: none; stroke-dashoffset: 0; }
140
+ .brand-mark .beat-dot { animation: none; opacity: 1; }
141
+ .brand-word { animation: none; opacity: 1; transform: none; }
142
+ }
143
+ .project { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-3); }
144
+ .project::before { content: "/ "; }
145
+ .agents { display: flex; gap: 8px; margin-left: auto; }
146
+ .connection { display: inline-flex; align-items: center; gap: 6px; color: var(--text-3); text-transform: uppercase; font-size: 10px; }
147
+ .connection-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--text-3); }
148
+ .connection[data-state="live"] .connection-dot { background: var(--phosphor); box-shadow: 0 0 10px var(--phosphor); }
149
+ .connection[data-state="reconnecting"] .connection-dot { background: var(--warn); animation: blink 1s infinite; }
150
+ @keyframes blink { 50% { opacity: .2; } }
151
+
152
+ /* ================= avatars ================= */
153
+ .avatar {
154
+ --size: 28px; --pct: 0;
155
+ position: relative; display: inline-grid; place-items: center;
156
+ width: var(--size); height: var(--size); border-radius: 50%;
157
+ color: var(--agent); background: color-mix(in srgb, var(--agent) 14%, transparent);
158
+ flex: none;
159
+ }
160
+ .avatar svg { width: 58%; height: 58%; display: block; }
161
+ .avatar.ring::before {
162
+ content: ""; position: absolute; inset: -3px; border-radius: 50%;
163
+ background: conic-gradient(var(--agent) calc(var(--pct) * 1%), var(--line-2) 0);
164
+ -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 2px), #000 calc(100% - 1.5px));
165
+ mask: radial-gradient(farthest-side, transparent calc(100% - 2px), #000 calc(100% - 1.5px));
166
+ opacity: .9;
167
+ }
168
+ .avatar.ring.hot::before { background: conic-gradient(var(--crit) calc(var(--pct) * 1%), var(--line-2) 0); }
169
+ .avatar.offline { color: var(--text-3); background: transparent; border: 1px dashed var(--line-2); }
170
+ .avatar.detected { color: var(--text-2); background: transparent; border: 1px solid var(--line-2); }
171
+ .avatar.gradient svg { color: #fff; }
172
+ .avatar.gradient { background: var(--agent-gradient, var(--agent)); color: #fff; }
173
+ .agents .avatar { cursor: default; }
174
+
175
+ /* ================= thread ================= */
176
+ .thread {
177
+ overflow-y: auto;
178
+ scroll-behavior: smooth;
179
+ overscroll-behavior: contain;
180
+ }
181
+ .thread-inner {
182
+ min-height: 100%;
183
+ display: flex; flex-direction: column; gap: var(--gap);
184
+ padding: 36px 0 28px;
185
+ }
186
+ .empty { margin: auto; text-align: center; color: var(--text-3); display: grid; gap: 10px; max-width: 420px; justify-items: center; }
187
+ .empty-mark { width: 144px; height: 40px; color: var(--phosphor); margin-bottom: 6px; overflow: visible; filter: drop-shadow(0 0 10px color-mix(in srgb, var(--phosphor) 55%, transparent)); }
188
+ .empty-mark .beat { stroke-dasharray: 100; stroke-dashoffset: 100; animation: beat-draw 1.1s cubic-bezier(.2, .7, .2, 1) .15s forwards; }
189
+ .empty-mark .beat-dot { opacity: 0; transform-origin: 60px 10px; transform-box: view-box; animation: beat-dot 1s ease-out 1.05s forwards, beat-idle 2.6s ease-in-out 2.4s infinite; }
190
+ .empty strong { color: var(--text); font-size: 17px; letter-spacing: -.01em; font-weight: 600; }
191
+ .empty span { font-size: 13px; line-height: 1.5; }
192
+ code { font-family: var(--mono); font-size: .9em; color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); padding: 2px 5px; border-radius: 5px; }
193
+
194
+ /* rows */
195
+ .row { display: grid; grid-template-columns: 28px 1fr; gap: 12px; align-items: end; max-width: 76%; margin-top: 14px; }
196
+ .row.compact { margin-top: 0; }
197
+ .row.compact .avatar { visibility: hidden; }
198
+ .row.user { grid-template-columns: 1fr; align-self: flex-end; justify-items: end; }
199
+ .row .col { display: grid; gap: 6px; min-width: 0; }
200
+ .who { font-family: var(--mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--agent, var(--text-2)); margin: 0 0 2px 12px; display: flex; gap: 10px; align-items: baseline; }
201
+ .user .who { color: var(--text-3); margin: 0 12px 2px 0; justify-content: flex-end; }
202
+ .user .who b { color: var(--phosphor); font-weight: 600; }
203
+ .user.expendable .who b { color: var(--crit); }
204
+ .who .reply { color: var(--text-3); letter-spacing: 0; text-transform: none; font-style: italic; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 320px; }
205
+ .who .badge { color: var(--text-3); border: 1px solid var(--line-2); border-radius: 999px; padding: 1px 6px; letter-spacing: .08em; }
206
+
207
+ .bubble {
208
+ position: relative;
209
+ line-height: 1.5; font-size: 15px;
210
+ color: var(--bubble-ink); background: var(--bubble);
211
+ border-radius: 20px; padding: 12px 16px;
212
+ overflow-wrap: anywhere;
213
+ box-shadow: var(--shadow);
214
+ }
215
+ .assistant .bubble { border-bottom-left-radius: 6px; }
216
+ .user .bubble { background: var(--user); color: var(--user-ink); border-bottom-right-radius: 6px; white-space: pre-wrap; box-shadow: 0 8px 30px color-mix(in srgb, var(--user) 25%, transparent); }
217
+ .bubble > :first-child { margin-top: 0; }
218
+ .bubble > :last-child { margin-bottom: 0; }
219
+ .bubble p { margin: 0 0 9px; }
220
+ .bubble h1, .bubble h2, .bubble h3, .bubble h4 { margin: 12px 0 6px; font-size: 1em; font-weight: 650; letter-spacing: -.01em; }
221
+ .bubble h1 { font-size: 1.1em; }
222
+ .bubble ul, .bubble ol { margin: 0 0 9px; padding-left: 20px; }
223
+ .bubble li { margin: 3px 0; }
224
+ .bubble blockquote { margin: 0 0 9px; padding: 2px 12px; border-left: 2px solid var(--line-2); color: var(--text-2); }
225
+ .bubble a { color: var(--agent, var(--phosphor)); text-decoration-thickness: 1px; }
226
+ .bubble hr { border: 0; border-top: 1px solid var(--line-2); margin: 10px 0; }
227
+ .bubble code { color: var(--agent, var(--phosphor)); background: color-mix(in srgb, var(--agent, var(--phosphor)) 12%, transparent); }
228
+ .user .bubble code { color: inherit; background: rgba(0,0,0,.12); }
229
+
230
+ /* code blocks: the terminal inside the message */
231
+ .codeblock { position: relative; margin: 6px -6px 9px; border-radius: 12px; background: var(--bg); border: 1px solid var(--line-2); overflow: hidden; }
232
+ .codeblock pre { margin: 0; padding: 12px 14px; overflow-x: auto; font-family: var(--mono); font-size: 12.5px; line-height: 1.55; color: var(--phosphor); }
233
+ .codeblock code { background: transparent; color: inherit; padding: 0; font-size: inherit; }
234
+ .codeblock .lang { position: absolute; top: 7px; left: 12px; font-family: var(--mono); font-size: 9.5px; color: var(--text-3); letter-spacing: .14em; text-transform: uppercase; }
235
+ .codeblock .copy { position: absolute; top: 5px; right: 6px; height: 22px; padding: 0 8px; font-family: var(--mono); font-size: 10px; letter-spacing: .06em; border-radius: 6px; background: transparent; color: var(--text-3); border: 1px solid var(--line-2); cursor: pointer; }
236
+ .codeblock .copy:hover { color: var(--text); border-color: var(--text-3); }
237
+ .codeblock.has-lang pre { padding-top: 26px; }
238
+
239
+ /* delivery line under a bubble */
240
+ .stamp { font-family: var(--mono); font-size: 10px; color: var(--text-3); letter-spacing: .04em; display: flex; gap: 12px; margin: 2px 12px 0; }
241
+ .user.expendable .stamp .to { color: var(--crit); }
242
+ .user.expendable .bubble { animation: phosphor-flicker 1.1s steps(2, end) 1; }
243
+ @keyframes phosphor-flicker { 0%, 100% { filter: none; } 20% { filter: brightness(1.6) saturate(.4); } 40% { filter: brightness(.7); } 60% { filter: brightness(1.3); } }
244
+ .user .stamp { justify-content: flex-end; }
245
+ .stamp .to { color: var(--agent, var(--text-3)); }
246
+
247
+ /* typing indicator */
248
+ .row.thinking .bubble { display: inline-flex; gap: 5px; padding: 10px 14px; width: max-content; max-width: 100%; align-items: center; }
249
+ .row.thinking .status { font-size: 13.5px; color: var(--text-2); margin-left: 8px; font-style: italic; animation: status-in .35s ease; white-space: nowrap; }
250
+ .row.thinking .status::after { content: ''; display: inline-block; width: 2px; height: 14px; margin-left: 3px; vertical-align: -2px; background: var(--agent, var(--text-2)); animation: cursor-blink 1s steps(1) infinite; }
251
+ @keyframes status-in { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: none; } }
252
+ @keyframes cursor-blink { 50% { opacity: 0; } }
253
+ .row.thinking .elapsed { font-family: var(--mono); font-size: 10px; letter-spacing: .08em; color: var(--text-3); margin-left: 8px; }
254
+ .row.thinking .elapsed.late { color: var(--warn); }
255
+ .row.thinking i { width: 7px; height: 7px; border-radius: 50%; background: var(--agent, var(--text-2)); animation: bounce 1.2s infinite; opacity: .5; }
256
+ .row.thinking i:nth-child(2) { animation-delay: .18s; } .row.thinking i:nth-child(3) { animation-delay: .36s; }
257
+ @keyframes bounce { 0%, 80%, 100% { transform: translateY(0); opacity: .35; } 40% { transform: translateY(-4px); opacity: 1; } }
258
+
259
+ /* system lines: handoffs, sentinel, failures — MOTHER speaks in small caps */
260
+ .system {
261
+ align-self: center; text-align: center; max-width: 92%;
262
+ overflow-wrap: anywhere;
263
+ margin: 22px 0 8px;
264
+ font-family: var(--mono); font-size: 10.5px; letter-spacing: .08em; text-transform: uppercase;
265
+ color: var(--text-3); line-height: 1.6;
266
+ }
267
+ .system b { font-weight: 600; color: var(--text-2); }
268
+ .system .from { color: var(--from, var(--text-2)); } .system .to { color: var(--to, var(--text-2)); }
269
+ .system.warn { color: var(--warn); }
270
+ .system.memory { color: var(--text-3); } .system.memory .who { color: var(--agent, var(--text-2)); }
271
+
272
+ /* NOSTROMO: the archive as a small solar system. One colour per kind of memory. */
273
+ :root { --mem-decision: #ffb000; --mem-fact: #9bff66; --mem-preference: #d78cff; --mem-question: #5fd6ff; --nostromo-sun: #ff2a1f; }
274
+ .nostromo-button { color: var(--terror); border-color: color-mix(in srgb, var(--terror) 55%, transparent); }
275
+ .nostromo-button:hover { background: color-mix(in srgb, var(--terror) 14%, transparent); }
276
+ dialog.nostromo { color: #eef1ea; }
277
+ dialog.nostromo::backdrop { background: #000; }
278
+ .nostromo-frame { --ph: #ffb4ad; --ph-dim: rgba(255, 42, 31, .55); --ph-faint: rgba(255, 42, 31, .16); position: relative; height: 100%; background: #030203; font-family: var(--mono); overflow: hidden; display: grid; grid-template-rows: auto 1fr; }
279
+ .nostromo-head { display: grid; grid-template-columns: auto 1fr auto auto auto; gap: 18px; align-items: center; padding: 18px 26px 14px; border-bottom: 1px solid var(--ph-faint); color: var(--ph); position: relative; z-index: 2; }
280
+ .nostromo-head .mother-title { color: var(--nostromo-sun); text-shadow: 0 0 18px color-mix(in srgb, var(--nostromo-sun) 60%, transparent); }
281
+ .nostromo-head .mother-sub { color: var(--ph-dim); }
282
+ .nostromo-legend { display: flex; gap: 8px; }
283
+ .nostromo-legend .k { font-size: 9px; letter-spacing: .16em; padding: 3px 8px; border: 1px solid; border-radius: 999px; }
284
+ .nostromo-legend .k.decision { color: var(--mem-decision); } .nostromo-legend .k.fact { color: var(--mem-fact); } .nostromo-legend .k.preference { color: var(--mem-preference); } .nostromo-legend .k.question { color: var(--mem-question); }
285
+ .nostromo-frame .mother-close { color: var(--ph); border-color: var(--ph-dim); }
286
+ .nostromo-frame .mother-close:hover { background: var(--ph-faint); }
287
+ .nostromo-canvas { display: block; width: 100%; height: 100%; cursor: crosshair; }
288
+ .nostromo-canvas.over { cursor: pointer; }
289
+ .nostromo-canvas.dragging { cursor: grabbing; }
290
+ .nostromo-help { position: absolute; left: 26px; bottom: 16px; margin: 0; font-size: 9px; letter-spacing: .2em; color: var(--ph-dim); pointer-events: none; }
291
+ .nostromo-frame.shake { animation: override-shake .45s ease 2; }
292
+ /* MOTHER's answer when touched: a klaxon over everything, then silence. */
293
+ .nostromo-alert { position: absolute; inset: 0; z-index: 5; display: grid; place-items: center; cursor: pointer; }
294
+ .nostromo-alert .klaxon { position: absolute; inset: 0; background: radial-gradient(ellipse at center, rgba(255, 42, 31, .0) 30%, rgba(255, 42, 31, .55) 100%); animation: klaxon .55s steps(2) infinite; }
295
+ .nostromo-alert .panel { position: relative; padding: 30px 46px; border: 2px solid var(--nostromo-sun); background: rgba(20, 0, 2, .92); box-shadow: 0 0 0 6px rgba(255, 42, 31, .25), 0 0 120px rgba(255, 42, 31, .6); text-align: center; display: grid; gap: 10px; animation: alert-in .25s ease-out; max-width: min(720px, 92vw); }
296
+ .nostromo-alert .warn { font-size: clamp(22px, 4vw, 40px); font-weight: 700; letter-spacing: .32em; color: var(--nostromo-sun); text-shadow: 0 0 24px var(--nostromo-sun); animation: klaxon .55s steps(2) infinite; }
297
+ .nostromo-alert .line { font-size: clamp(13px, 1.8vw, 18px); letter-spacing: .24em; color: #ffd9d4; }
298
+ .nostromo-alert .line.big { font-size: clamp(16px, 2.4vw, 24px); font-weight: 700; color: #fff; text-shadow: 0 0 18px var(--nostromo-sun); margin-top: 6px; }
299
+ .nostromo-alert .sub { margin-top: 8px; font-size: 9.5px; letter-spacing: .28em; color: var(--ph-dim); }
300
+ @keyframes klaxon { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
301
+ @keyframes alert-in { from { transform: scale(.92); opacity: 0; } to { transform: none; opacity: 1; } }
302
+ @media (prefers-reduced-motion: reduce) { .nostromo-alert .klaxon, .nostromo-alert .warn, .nostromo-frame.shake { animation: none; } }
303
+ .nostromo-card { position: absolute; right: 26px; top: 96px; width: min(380px, calc(100vw - 52px)); padding: 18px 20px 16px; background: rgba(6, 3, 4, .92); border: 1px solid var(--kind, var(--ph-dim)); box-shadow: 0 0 0 1px rgba(0,0,0,.6), 0 0 40px color-mix(in srgb, var(--kind, var(--nostromo-sun)) 25%, transparent); backdrop-filter: blur(8px); display: grid; gap: 12px; z-index: 3; animation: mother-on .3s ease; }
304
+ .nostromo-card header { display: flex; justify-content: space-between; align-items: center; }
305
+ .nostromo-card .kind { font-size: 10px; letter-spacing: .22em; color: var(--kind, var(--ph)); text-shadow: 0 0 10px color-mix(in srgb, var(--kind, var(--ph)) 55%, transparent); }
306
+ .nostromo-card .text { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", Inter, sans-serif; font-size: 14px; line-height: 1.5; color: #eef1ea; }
307
+ .nostromo-card .meta { margin: 0; display: grid; grid-template-columns: auto 1fr; gap: 4px 14px; font-size: 10px; letter-spacing: .1em; }
308
+ .nostromo-card .meta dt { color: var(--ph-dim); } .nostromo-card .meta dd { margin: 0; color: #c9c2bf; }
309
+ .nostromo-card .forget { border: 1px solid var(--nostromo-sun); background: transparent; color: var(--nostromo-sun); font: inherit; font-size: 10px; letter-spacing: .18em; padding: 9px 12px; cursor: pointer; transition: background .2s; }
310
+ .nostromo-card .forget:hover { background: color-mix(in srgb, var(--nostromo-sun) 14%, transparent); }
311
+ .nostromo-card .forget.confirm { background: var(--nostromo-sun); color: #fff3f1; animation: blink 1s steps(1) infinite; }
312
+ .nostromo-card .forget:disabled { opacity: .5; cursor: default; animation: none; }
313
+ .nostromo-card .foot { margin: 0; font-size: 9px; letter-spacing: .1em; color: var(--ph-dim); line-height: 1.5; }
314
+ .nostromo-empty { position: absolute; inset: 50% 0 auto 0; margin: 0; text-align: center; font-size: 11px; letter-spacing: .22em; color: var(--ph-dim); }
315
+ @media (max-width: 720px) { .nostromo-head { grid-template-columns: auto 1fr auto; } .nostromo-legend { display: none; } .nostromo-card { right: 16px; left: 16px; width: auto; } }
316
+ .system.memory.forgotten { color: var(--terror); }
317
+ .system.mother-alert { display: grid; gap: 6px; justify-items: center; max-width: min(720px, 92%); padding: 12px 16px; border: 1px solid color-mix(in srgb, var(--terror) 60%, transparent); border-radius: 12px; background: color-mix(in srgb, var(--terror) 7%, transparent); color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 45%, transparent); }
318
+ .system.mother-alert .head b { color: var(--terror); font-weight: 700; }
319
+ .system.mother-alert .clear { color: var(--text); text-shadow: none; text-transform: none; letter-spacing: 0; font-size: 12px; }
320
+ .system.mother-alert .code { font-family: var(--mono); font-size: 10px; letter-spacing: .08em; color: color-mix(in srgb, var(--terror) 75%, var(--text-2)); text-shadow: none; text-transform: none; word-break: break-all; line-height: 1.6; opacity: .9; }
321
+ /* The hint under a bubble when its agent saved a memory on request. */
322
+ .memory-hint { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 6px 12px 0; animation: hint-in .6s cubic-bezier(.2, .7, .2, 1) 1; }
323
+ .memory-hint .lead { font-family: var(--mono); font-size: 9.5px; letter-spacing: .16em; text-transform: uppercase; color: var(--agent, var(--text-3)); }
324
+ .memory-hint .pill { display: inline-flex; align-items: center; gap: 6px; max-width: 100%; border: 1px solid color-mix(in srgb, var(--kind) 55%, transparent); background: color-mix(in srgb, var(--kind) 8%, transparent); color: var(--text-2); font: inherit; font-size: 11px; padding: 3px 10px; border-radius: 999px; cursor: pointer; text-align: left; box-shadow: 0 0 0 0 color-mix(in srgb, var(--kind) 45%, transparent); animation: hint-glow 2.4s ease-out 1; transition: background .2s, color .2s; }
325
+ .memory-hint .pill b { font-family: var(--mono); font-size: 9px; letter-spacing: .16em; text-transform: uppercase; color: var(--kind); }
326
+ .memory-hint .pill:hover { background: color-mix(in srgb, var(--kind) 18%, transparent); color: var(--text); }
327
+ .memory-hint .more { font-family: var(--mono); font-size: 9.5px; color: var(--text-3); }
328
+ @keyframes hint-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }
329
+ @keyframes hint-glow { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--kind) 55%, transparent); } 40% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--kind) 0%, transparent), 0 0 18px color-mix(in srgb, var(--kind) 45%, transparent); } 100% { box-shadow: 0 0 0 0 transparent; } }
330
+ @media (prefers-reduced-motion: reduce) { .memory-hint, .memory-hint .pill { animation: none; } }
331
+ .system.crit { color: var(--crit); }
332
+ .system.fail { color: var(--danger); text-transform: none; letter-spacing: 0; font-size: 11px; }
333
+ .system.fail .label { text-transform: uppercase; letter-spacing: .1em; font-size: 10px; display: block; opacity: .8; margin-bottom: 2px; }
334
+ .system.recovered { color: var(--text-3); }
335
+ .system.mother { color: var(--terror); text-shadow: 0 0 10px color-mix(in srgb, var(--terror) 70%, transparent), 0 0 28px color-mix(in srgb, var(--terror) 35%, transparent); letter-spacing: .16em; animation: terror-in 1.4s steps(3, end) 1; }
336
+ .system.mother b { color: var(--terror); }
337
+ @keyframes terror-in { 0% { opacity: 0; } 30% { opacity: 1; } 45% { opacity: .2; } 60% { opacity: 1; } 75% { opacity: .5; } 100% { opacity: 1; } }
338
+ .composer.expendable .crew-label { color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 60%, transparent); }
339
+ .composer.expendable textarea::placeholder { color: color-mix(in srgb, var(--terror) 75%, transparent); }
340
+ .user.expendable .who b, .user.expendable .stamp .to { color: var(--terror); }
341
+ .mother-button.arming { color: var(--terror); border-color: var(--terror); box-shadow: 0 0 16px color-mix(in srgb, var(--terror) 35%, transparent); transition: color 3s linear, border-color 3s linear; }
342
+ .system .gauge { display: block; width: 220px; max-width: 100%; height: 2px; margin: 8px auto 0; background: color-mix(in srgb, currentColor 22%, transparent); position: relative; overflow: hidden; }
343
+ .system .gauge .now { position: absolute; inset: 0 auto 0 0; background: currentColor; }
344
+ .system .gauge .next { position: absolute; inset: 0 auto 0 0; background: repeating-linear-gradient(90deg, currentColor 0 2px, transparent 2px 5px); opacity: .55; }
345
+
346
+ /* ================= onboarding ================= */
347
+ .onboarding { border: 1px solid var(--line-2); background: var(--panel); border-radius: 16px; padding: 22px 24px; margin-bottom: 12px; }
348
+ .onboarding-eyebrow { margin: 0 0 10px; font-family: var(--mono); font-size: 10px; letter-spacing: .18em; color: var(--phosphor); }
349
+ .onboarding h2 { margin: 0 0 6px; font-size: 18px; letter-spacing: -.01em; font-weight: 600; }
350
+ .onboarding p { margin: 0 0 14px; color: var(--text-2); font-size: 13px; line-height: 1.5; }
351
+ .onboarding-list { list-style: none; margin: 0 0 12px; padding: 0; display: grid; gap: 6px; }
352
+ .onboarding-list li { display: grid; grid-template-columns: 28px 100px 1fr; gap: 12px; align-items: center; padding: 8px 10px; border: 1px solid var(--line); border-radius: 12px; font-size: 13px; }
353
+ .onboarding-list .name { font-weight: 600; color: var(--text); }
354
+ .onboarding-list .state { color: var(--text-2); font-size: 12.5px; }
355
+ .onboarding-list .state b { color: var(--text); font-weight: 600; }
356
+ .onboarding .hint { margin: 0; font-size: 12px; color: var(--text-3); }
357
+
358
+ /* ================= composer ================= */
359
+ .composer { display: grid; gap: 12px; padding: 14px 0 0; }
360
+ .composer[aria-disabled="true"] { opacity: .45; pointer-events: none; }
361
+ .picker { display: flex; gap: 8px; align-items: center; padding: 0 4px; }
362
+ .picker .pick { --size: 30px; cursor: pointer; border: 1px solid transparent; background: color-mix(in srgb, var(--agent) 10%, transparent); transition: transform .12s ease, box-shadow .12s ease; }
363
+ .picker .pick:hover { transform: translateY(-1px); }
364
+ .picker .pick[aria-checked="true"] { box-shadow: 0 0 0 2px var(--bg), 0 0 0 3.5px var(--agent); background: color-mix(in srgb, var(--agent) 22%, transparent); }
365
+ .picker .pick-label { font-family: var(--mono); font-size: 10.5px; letter-spacing: .1em; text-transform: uppercase; color: var(--text-2); margin-left: 2px; }
366
+ .picker .pick-label b { color: var(--agent, var(--text)); font-weight: 600; }
367
+ .field { position: relative; display: grid; grid-template-columns: auto 1fr auto; gap: 10px; align-items: end; padding: 6px 6px 6px 18px; border: 1px solid var(--line-2); background: var(--panel); border-radius: 24px; }
368
+ .crew-label { align-self: center; font-family: var(--mono); font-size: 10px; letter-spacing: .18em; color: var(--text-3); white-space: nowrap; transition: color .4s ease; }
369
+ .field:focus-within .crew-label { color: var(--phosphor); }
370
+ .composer.expendable .crew-label { color: var(--crit); }
371
+ .composer.expendable textarea::placeholder { color: color-mix(in srgb, var(--crit) 70%, transparent); }
372
+ select, textarea, button { font: inherit; }
373
+ textarea { resize: none; min-height: 34px; max-height: 180px; padding: 7px 0; border: 0; outline: 0; color: var(--text); background: transparent; line-height: 1.4; font-size: 15px; }
374
+ textarea::placeholder { color: var(--text-3); }
375
+ .composer { --mode: var(--mode-1); --mode-ink: var(--mode-1-ink); }
376
+ .composer.m0 { --mode: var(--mode-0); --mode-ink: var(--mode-0-ink); }
377
+ .composer.m2 { --mode: var(--mode-2); --mode-ink: var(--mode-2-ink); }
378
+ .composer.m3 { --mode: var(--mode-3); --mode-ink: var(--mode-3-ink); }
379
+ .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: 0 0 18px color-mix(in srgb, var(--mode, var(--phosphor)) 45%, transparent); transition: background .25s, box-shadow .25s; }
380
+ .field button[type="submit"] svg { width: 18px; height: 18px; }
381
+ .field button[type="submit"]:hover { filter: brightness(1.06); }
382
+ .field button[type="submit"]:disabled { opacity: .4; cursor: default; box-shadow: none; }
383
+ .safety { margin: 14px auto 18px; color: var(--text-3); font-family: var(--mono); font-size: 9.5px; letter-spacing: .08em; text-transform: uppercase; text-align: center; }
384
+
385
+ /* toast */
386
+ .toast { position: fixed; left: var(--composer-center, 50%); bottom: calc(100vh - var(--composer-top, 70vh) + 22px); transform: translateX(-50%); text-align: center; padding: 9px 14px; animation: toast-in .22s ease; z-index: 40; border-radius: 12px; border: 1px solid color-mix(in srgb, var(--danger) 40%, transparent); background: var(--panel); color: var(--danger); font-size: 13px; box-shadow: var(--shadow); max-width: min(560px, calc(100% - 32px)); }
387
+
388
+ @keyframes toast-in { from { opacity: 0; transform: translate(-50%, 6px); } to { opacity: 1; transform: translate(-50%, 0); } }
389
+
390
+ @media (max-width: 680px) {
391
+ .bar { flex-wrap: wrap; gap: 10px; }
392
+ .project { display: none; }
393
+ .row { max-width: 92%; }
394
+ .who .reply { max-width: 150px; }
395
+ .system .gauge { width: 160px; }
396
+ .onboarding-list li { grid-template-columns: 28px 1fr; }
397
+ .onboarding-list .state { grid-column: 2; }
398
+ }
399
+
400
+ /* ================= MU/TH/UR: troubleshooting ================= */
401
+ .mother-button {
402
+ display: inline-flex; align-items: center; gap: 7px;
403
+ height: 26px; padding: 0 10px; border-radius: 6px;
404
+ border: 1px solid var(--line-2); background: transparent; color: var(--text-2);
405
+ font-family: var(--mono); font-size: 10px; letter-spacing: .18em; cursor: pointer;
406
+ }
407
+ .mother-button:hover { color: var(--phosphor); border-color: var(--phosphor); box-shadow: 0 0 14px color-mix(in srgb, var(--phosphor) 30%, transparent); }
408
+ .mother-glyph { width: 8px; height: 8px; border: 1px solid currentColor; }
409
+ .mother-count { min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; display: inline-grid; place-items: center; background: var(--danger); color: #fff; font-size: 9px; letter-spacing: 0; }
410
+
411
+ dialog.mother { border: 0; padding: 0; margin: 0; width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh; background: transparent; color: #9bff66; }
412
+ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(6px); }
413
+ .mother-frame {
414
+ --ph: #9bff66; --ph-dim: rgba(155, 255, 102, .45); --ph-faint: rgba(155, 255, 102, .14);
415
+ position: relative; height: 100%; overflow-y: auto;
416
+ padding: 26px clamp(16px, 5vw, 64px) 40px;
417
+ background:
418
+ linear-gradient(rgba(155, 255, 102, .05) 1px, transparent 1px) 0 0 / 100% 3px,
419
+ radial-gradient(ellipse at 50% 0%, #0a1506, #020402 70%);
420
+ font-family: var(--mono); color: var(--ph); letter-spacing: .04em;
421
+ text-shadow: 0 0 6px rgba(155, 255, 102, .45);
422
+ animation: mother-on .5s ease-out;
423
+ }
424
+ @keyframes mother-on { from { opacity: 0; transform: scaleY(.96); filter: brightness(2); } to { opacity: 1; transform: none; filter: none; } }
425
+ .mother-head { display: grid; grid-template-columns: auto 1fr auto; gap: 18px; align-items: baseline; padding-bottom: 14px; border-bottom: 1px solid var(--ph-dim); }
426
+ .mother-title { font-size: clamp(22px, 4vw, 34px); font-weight: 700; letter-spacing: .24em; }
427
+ .mother-sub { font-size: 10px; letter-spacing: .22em; color: var(--ph-dim); }
428
+ .mother-close { border: 1px solid var(--ph-dim); background: transparent; color: var(--ph); font: inherit; font-size: 10px; letter-spacing: .18em; padding: 6px 10px; cursor: pointer; }
429
+ .mother-close:hover { background: var(--ph-faint); }
430
+ .mother-boot { margin: 18px 0 8px; font: inherit; font-size: 12px; line-height: 1.7; white-space: pre-wrap; min-height: 3.4em; }
431
+ .mother-boot::after { content: "█"; animation: blink 1s steps(1) infinite; margin-left: 2px; }
432
+ .mother-query { display: grid; grid-template-columns: auto 1fr auto; gap: 12px; align-items: center; padding: 10px 0; border-top: 1px solid var(--ph-faint); border-bottom: 1px solid var(--ph-faint); }
433
+ .mother-prompt { font-size: 18px; }
434
+ .mother-query input { border: 0; outline: 0; background: transparent; color: var(--ph); font: inherit; font-size: 14px; letter-spacing: .08em; text-transform: uppercase; caret-color: var(--ph); }
435
+ .mother-query input::placeholder { color: var(--ph-dim); text-transform: none; letter-spacing: .04em; }
436
+ .mother-os { display: flex; gap: 1px; border: 1px solid var(--ph-dim); }
437
+ .mother-os button { border: 0; background: transparent; color: var(--ph-dim); font: inherit; font-size: 10px; letter-spacing: .16em; padding: 6px 10px; cursor: pointer; }
438
+ .mother-os button[aria-checked="true"] { background: var(--ph); color: #041004; text-shadow: none; }
439
+ .mother-answer { margin: 14px 0 6px; font-size: 12px; letter-spacing: .14em; min-height: 1.4em; }
440
+ .mother-section { margin-top: 22px; }
441
+ .mother-section h3 { margin: 0 0 12px; font-size: 10px; letter-spacing: .28em; color: var(--ph-dim); font-weight: 400; }
442
+ .mother-section h3::before { content: "▌ "; color: var(--ph); }
443
+ .mother-grid { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 380px), 1fr)); }
444
+ .mother-card { border: 1px solid var(--ph-dim); padding: 14px 16px; background: rgba(2, 6, 2, .6); display: grid; gap: 8px; align-content: start; }
445
+ .mother-card.hit { border-color: var(--ph); box-shadow: inset 0 0 0 1px var(--ph-faint), 0 0 22px rgba(155, 255, 102, .12); }
446
+ .mother-card .tags { display: flex; gap: 8px; flex-wrap: wrap; font-size: 9.5px; letter-spacing: .18em; color: var(--ph-dim); }
447
+ .mother-card .tags .agent { color: var(--agent, var(--ph)); }
448
+ .mother-card .tags .sev-blocking { color: #ff7b72; }
449
+ .mother-card .tags .sev-transient, .mother-card .tags .sev-tunable { color: #ffd166; }
450
+ .mother-card .tags .sev-fixed, .mother-card .tags .sev-informational { color: var(--ph-dim); }
451
+ .mother-card h4 { margin: 0; font-size: 14px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; }
452
+ .mother-card p { margin: 0; font-size: 12px; line-height: 1.6; color: rgba(210, 255, 190, .85); text-shadow: none; }
453
+ .mother-card p b { color: var(--ph); font-weight: 400; letter-spacing: .12em; font-size: 10px; display: block; margin-bottom: 2px; }
454
+ .mother-card p.remedy { color: #eaffdf; font-size: 13px; line-height: 1.65; padding: 10px 12px; border: 1px solid var(--ph); border-left-width: 4px; background: var(--ph-faint); text-shadow: 0 0 6px rgba(155, 255, 102, .25); }
455
+ .mother-card p.remedy b { color: var(--ph); font-weight: 700; letter-spacing: .2em; }
456
+ .mother-card .actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
457
+ .mother-card .actions .act { border: 1px solid var(--ph); background: color-mix(in srgb, var(--ph) 12%, transparent); color: var(--ph); font: inherit; font-size: 10.5px; letter-spacing: .16em; padding: 8px 12px; cursor: pointer; text-shadow: 0 0 6px rgba(155, 255, 102, .35); }
458
+ .mother-card .actions .act:hover { background: color-mix(in srgb, var(--ph) 24%, transparent); }
459
+ .mother-card .actions .act:disabled { opacity: .6; cursor: default; }
460
+ .mother-card .actions .note { font-size: 9px; letter-spacing: .14em; color: var(--ph-dim); }
461
+ .mother-card.hit p.remedy { box-shadow: 0 0 18px rgba(155, 255, 102, .18); animation: remedy-in .6s ease; }
462
+ @keyframes remedy-in { from { background: rgba(155, 255, 102, .35); } to { background: var(--ph-faint); } }
463
+ .mother-cmd { position: relative; margin: 4px 0 0; border: 1px solid var(--ph-faint); background: #000; padding: 10px 12px; }
464
+ .mother-cmd pre { margin: 0; font: inherit; font-size: 12px; line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--ph); }
465
+ .mother-cmd .c { color: var(--ph-dim); }
466
+ .mother-cmd .copy { position: absolute; top: 6px; right: 6px; border: 1px solid var(--ph-dim); background: #000; color: var(--ph-dim); font: inherit; font-size: 9.5px; letter-spacing: .16em; padding: 3px 7px; cursor: pointer; }
467
+ .mother-cmd .copy:hover { color: var(--ph); border-color: var(--ph); }
468
+ .mother-record { display: grid; grid-template-columns: 64px 92px 1fr auto; gap: 12px; align-items: baseline; padding: 8px 0; border-bottom: 1px solid var(--ph-faint); font-size: 12px; }
469
+ .mother-record .t { color: var(--ph-dim); }
470
+ .mother-record .a { color: var(--agent, var(--ph)); text-transform: uppercase; letter-spacing: .1em; }
471
+ .mother-record .e { color: rgba(210, 255, 190, .85); text-shadow: none; overflow-wrap: anywhere; }
472
+ .mother-record .k { display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
473
+ .mother-record .k button { border: 1px solid var(--ph-dim); background: transparent; color: var(--ph); font: inherit; font-size: 9.5px; letter-spacing: .12em; padding: 3px 7px; cursor: pointer; text-transform: uppercase; }
474
+ .mother-record .k button:hover { background: var(--ph-faint); }
475
+ .mother-record .k .none { color: var(--ph-dim); font-size: 9.5px; letter-spacing: .12em; }
476
+ .mother-record .e.more { cursor: pointer; }
477
+ .mother-record .e.more::after { content: ' ▸'; color: var(--ph-dim); }
478
+ .mother-record .e.more.open { white-space: pre-wrap; color: #eaffdf; }
479
+ .mother-record .e.more.open::after { content: ' ▾'; }
480
+ .mother-record .e.more:hover, .mother-record .e.more:focus-visible { color: var(--ph); outline: none; }
481
+ .mother-section h3.toggle { display: block; }
482
+ .mother-section h3.toggle::before { content: none; }
483
+ .mother-section h3.toggle button::before { content: "▌ "; color: var(--ph); }
484
+ .mother-section h3.toggle button > :first-child { flex: 1; }
485
+ .mother-section h3.toggle button { display: flex; width: 100%; justify-content: space-between; gap: 12px; border: 0; background: transparent; color: var(--ph-dim); font: inherit; letter-spacing: .28em; padding: 0; cursor: pointer; text-align: left; }
486
+ .mother-section h3.toggle button:hover { color: var(--ph); }
487
+ .mother-section h3.toggle .caret { color: var(--ph); letter-spacing: .18em; }
488
+ .mother-section.collapsed h3 { margin-bottom: 0; }
489
+ .mother-foot { margin-top: 32px; padding-top: 12px; border-top: 1px solid var(--ph-faint); font-size: 9.5px; letter-spacing: .24em; color: var(--ph-dim); text-align: center; }
490
+ @media (max-width: 680px) {
491
+ .mother-head { grid-template-columns: 1fr auto; }
492
+ .mother-sub { grid-column: 1 / -1; order: 3; }
493
+ .mother-query { grid-template-columns: auto 1fr; }
494
+ .mother-os { grid-column: 1 / -1; }
495
+ .mother-record { grid-template-columns: 64px 1fr; }
496
+ .mother-record .e, .mother-record .k { grid-column: 1 / -1; }
497
+ .mother-record .k { justify-content: flex-start; }
498
+ }
499
+
500
+ /* ================= MODULES ================= */
501
+ .modules-glyph { border-radius: 50%; }
502
+ .modules-count { min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; display: inline-grid; place-items: center; background: var(--phosphor); color: var(--phosphor-ink); font-size: 9px; letter-spacing: 0; }
503
+ .module-card { border: 1px solid var(--ph-dim); padding: 18px 20px; background: rgba(2, 6, 2, .6); display: grid; gap: 12px; max-width: 760px; min-width: 0; overflow-wrap: anywhere; }
504
+ .mother-grid > * { min-width: 0; }
505
+ .module-card .head { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 12px; align-items: start; }
506
+ .module-card h4 { margin: 0; font-size: 16px; letter-spacing: .1em; text-transform: uppercase; }
507
+ .module-card .vendor { font-size: 10px; letter-spacing: .18em; color: var(--ph-dim); }
508
+ .module-card .state { font-size: 10px; letter-spacing: .18em; padding: 4px 8px; border: 1px solid var(--ph-dim); color: var(--ph-dim); white-space: nowrap; }
509
+ .module-card .detail { font-size: 10px; letter-spacing: .12em; color: var(--ph-dim); }
510
+ .module-card .state.installed { color: var(--ph); border-color: var(--ph); }
511
+ .module-card .state.running { color: #ffd166; border-color: #ffd166; animation: blink 1s infinite; }
512
+ .module-card p { margin: 0; font-size: 12.5px; line-height: 1.6; color: rgba(210, 255, 190, .85); text-shadow: none; }
513
+ .module-card ul { margin: 0; padding-left: 18px; font-size: 12px; line-height: 1.7; color: rgba(210, 255, 190, .8); text-shadow: none; }
514
+ .module-card .actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
515
+ .module-card .actions button { border: 1px solid var(--ph); background: transparent; color: var(--ph); font: inherit; font-size: 10.5px; letter-spacing: .18em; padding: 8px 14px; cursor: pointer; }
516
+ .module-card .actions button.primary { background: var(--ph); color: #041004; text-shadow: none; }
517
+ .module-card .actions button:disabled { opacity: .4; cursor: default; }
518
+ .module-card .actions .note { font-size: 10px; letter-spacing: .12em; color: var(--ph-dim); }
519
+ .module-card .confirm { border: 1px dashed var(--ph); padding: 12px 14px; display: grid; gap: 10px; }
520
+ .module-card .confirm .warn { color: #ffd166; font-size: 11px; letter-spacing: .12em; }
521
+ .module-log { max-height: 260px; overflow-y: auto; border: 1px solid var(--ph-faint); background: #000; padding: 10px 12px; font-size: 11.5px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--ph); }
522
+ .module-log .err { color: #ff7b72; }
523
+ .system.module { color: var(--phosphor); }
524
+ .system.module .cmd { text-transform: none; letter-spacing: 0; color: var(--text-2); display: block; margin-top: 4px; }
525
+ .system.module.failed { color: var(--danger); }
526
+
527
+ /* ================= delegation ================= */
528
+ .plan-card { margin: 8px 0 4px; border: 1px dashed var(--line-2); border-radius: 12px; padding: 10px 12px 10px 14px; background: color-mix(in srgb, var(--panel) 70%, transparent); }
529
+ .plan-label { display: block; font-family: var(--mono); font-size: 9.5px; letter-spacing: .2em; text-transform: uppercase; color: var(--text-3); margin-bottom: 6px; }
530
+ .plan-card ol { margin: 0; padding-left: 18px; font-size: 13.5px; }
531
+ .plan-card li { margin: 4px 0; }
532
+ .plan-card li b { color: var(--agent); font-family: var(--mono); font-size: 11px; letter-spacing: .06em; }
533
+ .row.delegated .bubble { background: color-mix(in srgb, var(--bubble) 75%, transparent); border: 1px dashed var(--line-2); box-shadow: none; font-size: 14px; }
534
+ .who .to-agent { color: var(--agent); }
535
+ .system.plan .stop { margin-left: 10px; border: 1px solid var(--crit); background: transparent; color: var(--crit); font: inherit; font-size: 9.5px; letter-spacing: .16em; padding: 2px 8px; cursor: pointer; vertical-align: middle; }
536
+ .system.plan .stop:hover { background: color-mix(in srgb, var(--crit) 15%, transparent); }
537
+ .system.plan .stop:disabled { opacity: .4; cursor: default; }
538
+
539
+ /* ================= STOPALL ================= */
540
+ .stop-all { display: inline-flex; align-items: center; gap: 7px; height: 26px; padding: 0 10px; border-radius: 6px; border: 1px solid var(--line-2); background: transparent; color: var(--text-3); font-family: var(--mono); font-size: 10px; letter-spacing: .18em; cursor: default; opacity: .55; transition: color .3s, border-color .3s, opacity .3s; }
541
+ .stop-all:disabled { cursor: default; }
542
+ .stop-all.armed { opacity: 1; cursor: pointer; border-color: var(--terror); background: color-mix(in srgb, var(--terror) 12%, transparent); color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 60%, transparent); animation: blink 1.4s infinite; }
543
+ .stop-all.armed:hover { background: var(--terror); color: #fff; text-shadow: none; animation: none; }
544
+ .stop-all-glyph { width: 8px; height: 8px; background: currentColor; }
545
+ .system.alert { color: var(--terror); text-shadow: 0 0 10px color-mix(in srgb, var(--terror) 70%, transparent); letter-spacing: .14em; animation: terror-in 1.4s steps(3, end) 1; }
546
+ .system.alert b { color: var(--terror); }
547
+ .system.alert .cmd { display: inline-block; margin-left: 8px; padding: 1px 8px; border: 1px solid var(--terror); letter-spacing: .2em; }
548
+ .system.halted { color: var(--terror); }
549
+ .composer.stopall textarea { color: var(--terror); letter-spacing: .12em; text-transform: uppercase; }
550
+
551
+ /* ================= connections & settings (inside MU/TH/UR) ================= */
552
+ .mother-actions { display: flex; gap: 8px; }
553
+ .mother-close[aria-pressed="true"] { background: var(--ph); color: #041004; text-shadow: none; }
554
+ .settings .conn-grid { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 340px), 1fr)); }
555
+ .settings .conn-grid { align-items: stretch; }
556
+ .conn-card { border: 1px solid var(--ph-dim); padding: 16px 18px 18px; background: rgba(2, 6, 2, .6); display: grid; grid-template-rows: auto; gap: 14px; min-width: 0; overflow-wrap: anywhere; align-content: start; }
557
+ .conn-card .head { display: flex; align-items: center; gap: 10px; align-self: center; }
558
+ .conn-card .meta { align-self: start; }
559
+ .conn-card .row { align-self: start; padding-top: 4px; }
560
+ .conn-card .slot { min-height: 0; }
561
+ .conn-card .mother-cmd { margin: 0; } .conn-card .slot { display: grid; gap: 8px; }
562
+ .conn-card label { align-self: end; margin-top: 4px; }
563
+ .conn-card .head .avatar { --size: 26px; }
564
+ .conn-card h4 { margin: 0; font-size: 13px; letter-spacing: .12em; text-transform: uppercase; color: var(--agent, var(--ph)); }
565
+ .conn-card .vendor { font-size: 9.5px; letter-spacing: .16em; color: var(--ph-dim); }
566
+ .conn-card .session { margin-left: auto; font-size: 9.5px; letter-spacing: .16em; padding: 3px 8px; border: 1px solid var(--ph-dim); color: var(--ph-dim); white-space: nowrap; }
567
+ .conn-card .session.on { color: var(--ph); border-color: var(--ph); }
568
+ .conn-card .session.off { color: #ff7b72; border-color: #ff7b72; }
569
+ .conn-card .session.busy { color: #ffd166; border-color: #ffd166; animation: blink 1s infinite; }
570
+ .conn-card .meta { font-size: 11px; line-height: 1.6; color: rgba(210, 255, 190, .8); text-shadow: none; }
571
+ .conn-card .row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
572
+ .conn-card button, .settings .room-form button { border: 1px solid var(--ph-dim); background: transparent; color: var(--ph); font: inherit; font-size: 9.5px; letter-spacing: .16em; padding: 6px 10px; cursor: pointer; }
573
+ .conn-card button.primary, .settings .room-form button.primary { background: var(--ph); color: #041004; text-shadow: none; border-color: var(--ph); }
574
+ .conn-card button:disabled, .settings .room-form button:disabled { opacity: .4; cursor: default; }
575
+ .conn-card label, .settings .room-form label { display: grid; gap: 4px; font-size: 9.5px; letter-spacing: .16em; color: var(--ph-dim); }
576
+ .conn-card input, .settings .room-form input, .settings .room-form select { border: 1px solid var(--ph-dim); background: #000; color: var(--ph); font: inherit; font-size: 12px; padding: 6px 8px; letter-spacing: .04em; min-width: 0; }
577
+ .conn-card input:focus, .settings .room-form input:focus { outline: 1px solid var(--ph); }
578
+ .conn-card .login-log { max-height: 140px; overflow-y: auto; border: 1px solid var(--ph-faint); background: #000; padding: 8px 10px; font-size: 11px; line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; }
579
+ .conn-card .login-log a { color: var(--ph); }
580
+ .settings .room-form { border: 1px solid var(--ph-dim); padding: 14px 16px; display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); align-items: end; }
581
+ .settings .room-form .full { grid-column: 1 / -1; display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
582
+ .settings .room-form .toggle { display: flex; align-items: center; gap: 8px; font-size: 10px; letter-spacing: .16em; color: var(--ph); cursor: pointer; }
583
+ .settings .room-form .toggle input { width: auto; accent-color: #9bff66; }
584
+ .settings .note { font-size: 10px; letter-spacing: .1em; color: var(--ph-dim); }
585
+ .system.login { color: var(--phosphor); }
586
+ .system.login.failed { color: var(--danger); }
587
+
588
+ /* ================= agent popover (click on a sphere) ================= */
589
+ .agents .avatar { cursor: pointer; }
590
+ .agents .avatar.open { box-shadow: 0 0 0 2px var(--bg), 0 0 0 3.5px var(--agent); }
591
+ .agent-pop { position: fixed; z-index: 30; min-width: 250px; max-width: min(340px, calc(100vw - 32px)); padding: 12px 14px 12px; border: 1px solid var(--line-2); border-radius: 14px; background: var(--panel); color: var(--text); box-shadow: var(--shadow); font-family: var(--mono); font-size: 11px; letter-spacing: .04em; }
592
+ .agent-pop .head { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
593
+ .agent-pop .head b { color: var(--agent); letter-spacing: .14em; text-transform: uppercase; font-size: 11px; }
594
+ .agent-pop .head .vendor { color: var(--text-3); font-size: 10px; margin-left: auto; }
595
+ .agent-pop .big { font-size: 22px; letter-spacing: -.01em; font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", Inter, sans-serif; font-weight: 600; color: var(--text); }
596
+ .agent-pop .big small { font-size: 10px; color: var(--text-3); letter-spacing: .12em; text-transform: uppercase; margin-left: 6px; font-family: var(--mono); font-weight: 400; }
597
+ .agent-pop .gauge { height: 3px; background: var(--line-2); border-radius: 2px; overflow: hidden; margin: 6px 0 10px; }
598
+ .agent-pop .gauge i { display: block; height: 100%; width: 0; background: var(--agent); }
599
+ .agent-pop .gauge.hot i { background: var(--crit); }
600
+ .agent-pop dl { margin: 0; display: grid; grid-template-columns: auto 1fr; gap: 4px 12px; }
601
+ .agent-pop dt { color: var(--text-3); text-transform: uppercase; letter-spacing: .12em; font-size: 9.5px; }
602
+ .agent-pop dd { margin: 0; color: var(--text-2); text-align: right; }
603
+ .agent-pop dd.on { color: var(--phosphor); } .agent-pop dd.off { color: var(--danger); }
604
+ .agent-pop .foot { margin-top: 10px; font-size: 9.5px; color: var(--text-3); letter-spacing: .1em; text-transform: uppercase; }
605
+
606
+ /* model chip & menu in the composer */
607
+ .picker .model-chip { margin-left: 8px; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); font: inherit; font-family: var(--mono); font-size: 10px; letter-spacing: .08em; text-transform: none; padding: 2px 8px; border-radius: 999px; cursor: pointer; }
608
+ .picker .model-chip:hover { color: var(--agent, var(--text)); border-color: var(--agent, var(--line-2)); }
609
+ /* Permission mode chip: TO @agent #1 EXCHANGE ▾ model ▾ */
610
+ .picker .mode-chip { margin-left: 8px; border: 1px solid var(--mode); background: transparent; color: var(--mode); font: inherit; font-family: var(--mono); font-size: 10px; letter-spacing: .1em; padding: 2px 9px; border-radius: 999px; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; transition: background .2s, color .2s, border-color .2s; }
611
+ .picker .mode-chip b { font-weight: 700; color: inherit; }
612
+ .picker .mode-chip:hover { background: color-mix(in srgb, var(--mode) 12%, transparent); }
613
+ .picker .mode-chip.m0 { --mode: var(--mode-0); }
614
+ .picker .mode-chip.m1 { --mode: var(--mode-1); }
615
+ .picker .mode-chip.m2 { --mode: var(--mode-2); }
616
+ .picker .mode-chip.m3 { --mode: var(--mode-3); }
617
+ .mode-menu { width: min(380px, calc(100vw - 24px)); padding: 12px; }
618
+ .mode-menu .model-menu-title { margin: 4px 10px 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
619
+ .mode-menu .mode-ladder { display: grid; gap: 2px; }
620
+ .mode-menu .mode-option { --mode: var(--text-2); display: grid; grid-template-columns: 28px minmax(0, 1fr) auto; gap: 14px; align-items: baseline; width: 100%; text-align: left; border: 0; background: transparent; color: var(--text); font: inherit; font-family: var(--mono); padding: 12px 10px; border-radius: 8px; cursor: pointer; transition: background .15s, opacity .15s; }
621
+ .mode-menu .mode-option + .mode-option { border-top: 1px solid var(--line); border-radius: 0 0 8px 8px; }
622
+ .mode-menu .mode-option:hover { background: var(--line); }
623
+ .mode-menu .mode-option.o0.current { --mode: var(--mode-0); }
624
+ .mode-menu .mode-option.o1.current { --mode: var(--mode-1); }
625
+ .mode-menu .mode-option.o2.current { --mode: var(--mode-2); }
626
+ .mode-menu .mode-option.o3 { --mode: var(--mode-3); }
627
+ .mode-menu .mode-option.locked { opacity: .45; }
628
+ .mode-menu .mode-option.locked:hover { opacity: 1; }
629
+ .mode-menu .mode-option:disabled { opacity: .3; cursor: default; }
630
+ .mode-menu .mode-option:disabled:hover { background: transparent; }
631
+ .mode-menu .mode-option .n { font-weight: 700; color: var(--mode); font-size: 12px; }
632
+ .mode-menu .mode-option .body { display: grid; gap: 3px; min-width: 0; }
633
+ .mode-menu .mode-option .name { font-size: 11px; font-weight: 700; letter-spacing: .14em; color: var(--mode); }
634
+ .mode-menu .mode-option.current .name, .mode-menu .mode-option:hover .name { color: var(--mode); }
635
+ .mode-menu .mode-option:not(.current):not(.o3) .name { color: var(--text); }
636
+ .mode-menu .mode-option .body { gap: 5px; }
637
+ .mode-menu .mode-option .hint { display: block; font-size: 10.5px; line-height: 1.5; letter-spacing: 0; color: var(--text-2); text-transform: none; font-family: var(--sans, inherit); }
638
+ .mode-menu .mode-option .tag { display: inline-flex; align-items: center; gap: 7px; font-size: 8.5px; font-weight: 700; letter-spacing: .16em; color: var(--mode); white-space: nowrap; align-self: center; margin-left: 4px; }
639
+ .mode-menu .mode-option .tag.raise { border: 1px solid var(--mode-3); border-radius: 999px; padding: 3px 9px; }
640
+ .mode-menu .mode-option .tag .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--mode); box-shadow: 0 0 8px var(--mode); animation: mode-dot 1.4s ease-in-out infinite; }
641
+ @keyframes mode-dot { 0%, 100% { opacity: 1; } 50% { opacity: .15; } }
642
+ @media (prefers-reduced-motion: reduce) { .mode-menu .mode-option .tag .dot { animation: none; } }
643
+ /* Composer wears the mode */
644
+ .composer.ghost .field { border-style: dashed; border-color: var(--mode-0); box-shadow: none; opacity: .92; }
645
+ .composer.ghost .crew-label { color: var(--mode-0); }
646
+ .composer.ghost .editor textarea { color: transparent; }
647
+ .composer.ghost .editor .highlight { color: var(--text-2); font-style: italic; }
648
+ .composer.control { width: min(1180px, 100% - 40px); }
649
+ .composer.control .field { border-color: var(--terror); box-shadow: 0 0 0 3px color-mix(in srgb, var(--terror) 18%, transparent), 0 0 30px color-mix(in srgb, var(--terror) 20%, transparent); }
650
+ .composer.control .crew-label { color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 60%, transparent); }
651
+ .composer.intruder .crew-label { color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 60%, transparent); animation: blink 1.6s steps(1) infinite; }
652
+ /* Mode badges on bubbles and plan steps */
653
+ .who .badge.mode { font-weight: 700; letter-spacing: .1em; }
654
+ .who .badge.mode.m0 { color: var(--mode-0); border-color: color-mix(in srgb, var(--mode-0) 50%, transparent); } .who .badge.mode.m1 { color: var(--mode-1); border-color: color-mix(in srgb, var(--mode-1) 45%, transparent); } .who .badge.mode.m2 { color: var(--mode-2); border-color: color-mix(in srgb, var(--mode-2) 50%, transparent); } .who .badge.mode.m3 { color: var(--mode-3); border-color: var(--mode-3); }
655
+ .row.ghost .bubble { border: 1px dashed var(--line-2); background: transparent; opacity: .85; }
656
+ .row.ghost.user .bubble { background: transparent; color: var(--text); border-color: var(--text-3); }
657
+ .row.ghost .stamp::after { content: ' · not recorded'; color: var(--text-3); }
658
+ .system.plan .step-mode { margin-left: 3px; font-weight: 700; }
659
+ .system.plan .step-mode.m1 { color: var(--mode-1); } .system.plan .step-mode.m2 { color: var(--mode-2); }
660
+ /* Emergency command override: a small MOTHER terminal */
661
+ /* Only an open override is laid out; a closed <dialog> must stay display:none. */
662
+ dialog.override[open] { display: grid; place-items: center; }
663
+ .override-frame { width: min(680px, 92vw); height: auto; min-height: 0; padding: 26px 30px 22px; border: 1px solid var(--ph-dim); box-shadow: 0 0 0 1px var(--ph-faint), 0 0 60px rgba(155, 255, 102, .12); animation: mother-on .4s ease; }
664
+ .override-query { grid-template-columns: auto 1fr auto; }
665
+ .override-query .k { font-size: 11px; letter-spacing: .22em; color: var(--ph-dim); }
666
+ .override-query input { text-transform: none; letter-spacing: .12em; }
667
+ .override-reply { min-height: 22px; letter-spacing: .14em; }
668
+ .override-reply.denied { color: #ff7b72; text-shadow: 0 0 10px rgba(255, 123, 114, .6); animation: terror-in .8s steps(3, end) 1; }
669
+ .override-reply.granted { color: var(--ph); text-shadow: 0 0 10px rgba(155, 255, 102, .6); }
670
+ .override-frame.shake { animation: override-shake .35s ease; }
671
+ @keyframes override-shake { 0%, 100% { transform: none; } 25% { transform: translateX(-6px); } 50% { transform: translateX(6px); } 75% { transform: translateX(-3px); } }
672
+ .model-menu { position: fixed; z-index: 40; width: min(320px, calc(100vw - 24px)); padding: 10px; border: 1px solid var(--line-2); border-radius: 14px; background: var(--panel); box-shadow: var(--shadow); font-family: var(--mono); font-size: 11px; letter-spacing: .04em; color: var(--text); }
673
+ .model-menu-title { font-size: 10px; letter-spacing: .14em; text-transform: uppercase; color: var(--text-3); margin: 2px 4px 8px; }
674
+ .model-menu-title b { color: var(--agent); }
675
+ .model-list { display: grid; gap: 2px; max-height: 260px; overflow-y: auto; }
676
+ .model-option { text-align: left; border: 0; border-radius: 8px; background: transparent; color: var(--text); font: inherit; font-family: var(--mono); font-size: 12px; padding: 7px 10px; cursor: pointer; }
677
+ .model-option:hover { background: color-mix(in srgb, var(--agent) 12%, transparent); }
678
+ .model-option.current { background: color-mix(in srgb, var(--agent) 20%, transparent); color: var(--agent); }
679
+ .model-custom { margin-top: 8px; }
680
+ .model-custom input { width: 100%; border: 1px solid var(--line-2); border-radius: 8px; background: var(--bg); color: var(--text); font: inherit; font-family: var(--mono); font-size: 11px; padding: 6px 9px; outline: 0; }
681
+ .model-custom input:focus { border-color: var(--agent, var(--phosphor)); }
682
+ .model-note { margin: 8px 4px 0; font-size: 9.5px; color: var(--text-3); line-height: 1.5; }
683
+ .who .badge.model { color: var(--agent); border-color: color-mix(in srgb, var(--agent) 50%, transparent); text-transform: none; letter-spacing: .04em; }
684
+
685
+ /* ================= attachments, inline files & viewer ================= */
686
+ .field { grid-template-columns: auto minmax(0, 1fr) auto auto auto auto; }
687
+ .attach { width: 34px; height: 34px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--text-3); cursor: pointer; display: grid; place-items: center; }
688
+ .attach:hover { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); }
689
+ .attach svg { width: 18px; height: 18px; }
690
+ .composer.dropping .field { border-color: var(--phosphor); box-shadow: 0 0 0 3px color-mix(in srgb, var(--phosphor) 25%, transparent); }
691
+ .attachments { display: flex; gap: 8px; flex-wrap: wrap; padding: 0 6px; }
692
+ .attachment-chip { display: inline-flex; align-items: center; gap: 8px; padding: 4px 6px 4px 4px; border: 1px solid var(--line-2); border-radius: 10px; background: var(--panel); font-family: var(--mono); font-size: 10.5px; color: var(--text-2); max-width: 260px; }
693
+ .attachment-chip img { width: 28px; height: 28px; object-fit: cover; border-radius: 6px; }
694
+ .attachment-chip .kind { width: 28px; height: 28px; border-radius: 6px; display: grid; place-items: center; background: color-mix(in srgb, var(--phosphor) 12%, transparent); color: var(--phosphor); font-size: 9px; letter-spacing: .08em; }
695
+ .attachment-chip .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
696
+ .attachment-chip .remove { border: 0; background: transparent; color: var(--text-3); cursor: pointer; font-size: 13px; padding: 0 2px; }
697
+ .attachment-chip .remove:hover { color: var(--danger); }
698
+ .attachment-chip.uploading { opacity: .6; }
699
+ .bubble .files { display: flex; gap: 8px; flex-wrap: wrap; margin: 8px 0 0; }
700
+ .bubble .file-tile { display: inline-flex; align-items: center; gap: 8px; padding: 6px 10px 6px 6px; border-radius: 10px; border: 1px solid rgba(0,0,0,.15); background: rgba(0,0,0,.08); font-family: var(--mono); font-size: 10.5px; cursor: pointer; color: inherit; max-width: 100%; }
701
+ .assistant .bubble .file-tile { border-color: var(--line-2); background: var(--panel); color: var(--text-2); }
702
+ .bubble .file-tile img { width: 120px; height: 90px; object-fit: cover; border-radius: 6px; display: block; }
703
+ .bubble .file-tile.image { padding: 0; border: 0; background: transparent; }
704
+ .bubble img.inline { max-width: 100%; max-height: 420px; border-radius: 12px; display: block; margin: 6px 0; cursor: zoom-in; }
705
+ .bubble a.file-link { color: var(--agent, var(--phosphor)); text-decoration: none; border-bottom: 1px dashed currentColor; font-family: var(--mono); font-size: .92em; cursor: pointer; }
706
+ dialog.viewer { border: 0; padding: 0; width: min(1100px, 96vw); max-width: 96vw; height: min(88vh, 900px); background: var(--panel); color: var(--text); border-radius: 16px; box-shadow: var(--shadow); }
707
+ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px); }
708
+ .viewer-head { display: flex; align-items: center; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--line); font-family: var(--mono); font-size: 11px; }
709
+ .viewer-path { color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; }
710
+ .viewer-open { color: var(--phosphor); text-decoration: none; letter-spacing: .12em; font-size: 10px; }
711
+ .viewer-body { height: calc(100% - 46px); overflow: auto; display: grid; place-items: start center; padding: 16px; }
712
+ .viewer-body img { max-width: 100%; max-height: 100%; border-radius: 8px; }
713
+ .viewer-body pre { margin: 0; width: 100%; font-family: var(--mono); font-size: 12.5px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text); }
714
+ .viewer-body iframe { width: 100%; height: 100%; border: 0; background: #fff; border-radius: 8px; }
715
+ .viewer-body .err { color: var(--danger); font-family: var(--mono); }
716
+ .viewer-body iframe.ripley { background: #fff; box-shadow: 0 0 0 1px var(--line-2); }
717
+ .viewer-body .viewer-markdown { width: min(820px, 100%); justify-self: center; padding: 8px 4px 24px; font-size: 15px; line-height: 1.6; background: transparent; }
718
+ .viewer-body .viewer-hint { width: 100%; margin-bottom: 10px; padding: 8px 12px; border: 1px dashed var(--line-2); border-radius: 8px; font-family: var(--mono); font-size: 10px; letter-spacing: .1em; color: var(--text-3); }
719
+ .viewer-body .viewer-hint b { color: var(--phosphor); font-weight: 600; }
720
+ .viewer-mode { border-color: var(--text-3); color: var(--text-2); background: transparent; }
721
+ .viewer-mode:hover { color: var(--text); border-color: var(--text-2); background: var(--line); }
722
+ .viewer-body pre.code { display: grid; grid-template-columns: max-content 1fr; padding: 4px 0 24px; white-space: pre; overflow: visible; font-size: 12.5px; line-height: 1.6; counter-reset: none; }
723
+ .viewer-body pre.code .ln { position: sticky; left: 0; user-select: none; text-align: right; padding: 0 14px 0 10px; color: var(--text-3); cursor: pointer; border-right: 1px solid var(--line); background: var(--panel); }
724
+ .viewer-body pre.code .ln:hover { color: var(--phosphor); }
725
+ .viewer-body pre.code .tx { padding: 0 16px; white-space: pre-wrap; overflow-wrap: anywhere; min-width: 0; }
726
+ .viewer-body pre.code .ln.sel, .viewer-body pre.code .tx.sel { background: color-mix(in srgb, var(--phosphor) 14%, transparent); }
727
+ .viewer-body pre.code .ln.sel { color: var(--phosphor); border-right-color: var(--phosphor); }
728
+ .viewer-body pre.code .tx.sel { box-shadow: inset 0 -1px 0 color-mix(in srgb, var(--phosphor) 55%, transparent); }
729
+ .viewer-body pre.code .ln.hl, .viewer-body pre.code .tx.hl { background: color-mix(in srgb, var(--warn) 16%, transparent); }
730
+ .viewer-body pre.code .tx:hover { background: color-mix(in srgb, var(--text) 4%, transparent); }
731
+ .viewer-body:has(pre.code) { display: block; padding: 0; }
732
+ .viewer-selection { font-family: var(--mono); font-size: 10px; letter-spacing: .12em; color: var(--phosphor); white-space: nowrap; }
733
+ .viewer-review { border: 1px solid var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); color: var(--phosphor); font: inherit; font-family: var(--mono); font-size: 10px; letter-spacing: .14em; padding: 5px 10px; border-radius: 6px; cursor: pointer; white-space: nowrap; }
734
+ .viewer-review:hover { background: color-mix(in srgb, var(--phosphor) 20%, transparent); }
735
+ .viewer-menu { position: fixed; z-index: 50; min-width: 220px; border: 1px solid var(--line-2); background: var(--panel); border-radius: 12px; box-shadow: 0 14px 40px rgba(0, 0, 0, .35); padding: 6px; display: grid; gap: 2px; }
736
+ .viewer-menu .hint { padding: 4px 10px 6px; font-family: var(--mono); font-size: 10px; letter-spacing: .12em; color: var(--text-3); }
737
+ .viewer-menu .item { display: flex; gap: 10px; align-items: center; padding: 7px 10px; border-radius: 8px; border: 0; background: transparent; color: var(--text); font: inherit; font-size: 13px; cursor: pointer; text-align: left; }
738
+ .viewer-menu .item:hover { background: color-mix(in srgb, var(--agent, var(--phosphor)) 14%, transparent); }
739
+ .viewer-menu .item b { color: var(--agent, var(--phosphor)); font-family: var(--mono); font-size: 11.5px; letter-spacing: .06em; }
740
+ .viewer-menu .item.off { opacity: .5; }
741
+ .bubble .file-ref { font-family: var(--mono); font-size: 12.5px; color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); border: 1px solid color-mix(in srgb, var(--phosphor) 35%, transparent); border-radius: 6px; padding: 0 6px; cursor: pointer; }
742
+ .bubble .file-ref:hover { background: color-mix(in srgb, var(--phosphor) 18%, transparent); }
743
+ .caps { display: flex; gap: 6px; flex-wrap: wrap; }
744
+ .cap { font-family: var(--mono); font-size: 9px; letter-spacing: .12em; text-transform: uppercase; padding: 2px 6px; border-radius: 4px; border: 1px solid var(--line-2); color: var(--text-3); }
745
+ .cap.on { color: var(--agent, var(--phosphor)); border-color: color-mix(in srgb, var(--agent, var(--phosphor)) 50%, transparent); }
746
+ .conn-card .caps .cap.on { color: var(--ph); border-color: var(--ph-dim); }
747
+ .conn-card .caps .cap { color: var(--ph-dim); border-color: var(--ph-faint); }
748
+
749
+ /* ================= creation lease ================= */
750
+ .create-toggle { height: 30px; padding: 0 10px 0 8px; border-radius: 999px; border: 1px solid var(--line-2); background: transparent; color: var(--text-3); display: inline-flex; align-items: center; gap: 6px; cursor: pointer; font-family: var(--mono); font-size: 9.5px; letter-spacing: .16em; align-self: center; transition: color .2s, border-color .2s, background .2s; }
751
+ .create-toggle svg { width: 15px; height: 15px; }
752
+ .create-toggle:hover { color: var(--text); border-color: var(--text-3); }
753
+ .create-toggle[aria-pressed="true"] { color: var(--warn); border-color: var(--warn); background: color-mix(in srgb, var(--warn) 12%, transparent); text-shadow: 0 0 8px color-mix(in srgb, var(--warn) 50%, transparent); }
754
+ .create-toggle .lock.open { display: none; }
755
+ .create-toggle.standing { color: var(--warn); border-style: dashed; border-color: color-mix(in srgb, var(--warn) 60%, transparent); }
756
+ .create-toggle.standing .lock.closed { display: none; }
757
+ .create-toggle.standing .lock.open { display: block; }
758
+ .system.lease.missing { color: var(--warn); display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; justify-content: center; }
759
+ .system.lease.missing .actions { display: inline-flex; gap: 8px; flex-wrap: wrap; }
760
+ .system.lease.missing button { border: 1px solid color-mix(in srgb, var(--warn) 60%, transparent); background: color-mix(in srgb, var(--warn) 10%, transparent); color: var(--warn); font: inherit; font-family: var(--mono); font-size: 9.5px; letter-spacing: .14em; padding: 4px 9px; border-radius: 6px; cursor: pointer; }
761
+ .system.lease.missing button:hover { background: color-mix(in srgb, var(--warn) 20%, transparent); }
762
+ .system.lease.missing button:disabled { opacity: .6; cursor: default; }
763
+ .conn-card .scope.sub { margin-left: 22px; font-size: 9px; margin-top: -2px; }
764
+ .conn-card .ceiling { display: grid; grid-template-columns: auto auto; gap: 8px 12px; align-items: center; margin-top: 6px; padding-top: 12px; border-top: 1px solid var(--ph-faint); }
765
+ .conn-card .ceiling .k { font-size: 9.5px; letter-spacing: .16em; color: var(--ph-dim); }
766
+ .conn-card .ceiling .why { grid-column: 1 / -1; font-size: 9px; letter-spacing: .08em; color: var(--ph-dim); text-transform: none; line-height: 1.5; }
767
+ .conn-card .seg { display: inline-flex; border: 1px solid var(--ph-dim); }
768
+ .conn-card .seg-option { border: 0; border-right: 1px solid var(--ph-faint); background: transparent; color: var(--ph-dim); font: inherit; font-size: 10px; letter-spacing: .1em; padding: 4px 9px; cursor: pointer; }
769
+ .conn-card .seg-option:last-child { border-right: 0; }
770
+ .conn-card .seg-option:hover { background: var(--ph-faint); color: var(--ph); }
771
+ .conn-card .seg-option.current { background: var(--ph); color: #041004; font-weight: 700; }
772
+ .conn-card .seg-option.o3.current { background: #ff7b72; }
773
+ .conn-card .seg-option:disabled { opacity: .35; cursor: default; }
774
+ .create-toggle[aria-pressed="true"] .lock.closed { display: none; }
775
+ .create-toggle[aria-pressed="true"] .lock.open { display: block; }
776
+ /* ORDER 937: a bash prompt on a black terminal, Homebrew green. */
777
+ /* Off: a dormant prompt, grey like the other idle controls. On: the terminal lights up. */
778
+ .ashcode-toggle { height: 30px; padding: 0 10px 0 9px; border-radius: 7px; border: 1px dashed var(--line-2); background: transparent; color: var(--text-3); font-family: var(--mono); font-size: 10px; font-weight: 500; letter-spacing: .06em; text-transform: none; cursor: pointer; align-self: center; display: inline-flex; align-items: center; gap: 6px; opacity: .8; transition: color .2s, border-color .2s, box-shadow .2s, background .2s, opacity .2s; }
779
+ .ashcode-toggle::before { content: '$'; color: var(--text-3); font-weight: 700; }
780
+ .ashcode-toggle::after { content: ''; width: 7px; height: 12px; background: currentColor; opacity: .25; margin-left: 1px; }
781
+ .ashcode-toggle:hover { opacity: 1; color: var(--text-2); border-color: var(--text-3); }
782
+ .ashcode-toggle[aria-pressed="true"] { opacity: 1; border-style: solid; background: #070907; color: var(--brew); border-color: var(--brew); font-weight: 700; box-shadow: 0 0 0 1px color-mix(in srgb, var(--brew) 25%, transparent), 0 0 18px color-mix(in srgb, var(--brew) 40%, transparent), inset 0 0 12px color-mix(in srgb, var(--brew) 14%, transparent); text-shadow: 0 0 8px color-mix(in srgb, var(--brew) 70%, transparent); }
783
+ .ashcode-toggle[aria-pressed="true"]::before { color: color-mix(in srgb, var(--brew) 75%, transparent); }
784
+ .ashcode-toggle[aria-pressed="true"]::after { animation: cursor-blink 1s steps(1) infinite; opacity: 1; }
785
+ .ashcode-toggle[aria-pressed="true"]:hover { color: var(--brew); border-color: var(--brew); }
786
+ :root[data-theme="light"] .ashcode-toggle, .ashcode-toggle { /* stays a black terminal in every theme */ }
787
+
788
+ /* With ORDER 937 lit, the field widens like CREATE and glows Homebrew green. */
789
+ .composer.ordering { width: min(1180px, 100% - 40px); }
790
+ .composer.ordering .field { position: relative; border-color: color-mix(in srgb, var(--brew) 70%, transparent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--brew) 14%, transparent); }
791
+ .composer.ordering .crew-label { color: var(--brew); text-shadow: 0 0 8px color-mix(in srgb, var(--brew) 55%, transparent); }
792
+ .composer.ordering .editor textarea::placeholder { color: color-mix(in srgb, var(--brew) 60%, transparent); }
793
+ .composer.creating.ordering .field { border-color: var(--mode-2); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mode-2) 18%, transparent), inset 0 0 0 1px color-mix(in srgb, var(--brew) 45%, transparent); }
794
+
795
+ /* The wink to MOTHER when the order is given: a CRT sweep and scanlines that fade. */
796
+ .composer .field::before { content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; opacity: 0; z-index: 2;
797
+ background:
798
+ linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--brew) 0%, transparent) 40%, color-mix(in srgb, var(--brew) 38%, transparent) 50%, transparent 60%) no-repeat,
799
+ repeating-linear-gradient(0deg, color-mix(in srgb, var(--brew) 10%, transparent) 0 1px, transparent 1px 3px);
800
+ background-size: 60% 100%, 100% 100%; background-position: -60% 0, 0 0; }
801
+ .composer.ash-wink .field::before { animation: ash-sweep 1.5s cubic-bezier(.2, .7, .2, 1) 1; }
802
+ .composer.ash-wink .crew-label { animation: phosphor-flicker .8s steps(1) 2; }
803
+ .composer.ash-wink .editor textarea { animation: ash-type .9s steps(1) 1; }
804
+ @keyframes ash-sweep { 0% { opacity: 0; background-position: -60% 0, 0 0; } 12% { opacity: 1; } 70% { opacity: .9; background-position: 160% 0, 0 0; } 100% { opacity: 0; background-position: 160% 0, 0 0; } }
805
+ @keyframes ash-type { 0%, 30% { caret-color: var(--brew); } 40% { caret-color: transparent; } 55% { caret-color: var(--brew); } 100% { caret-color: var(--text); } }
806
+ .field .rain { position: absolute; inset: 0; width: 100%; height: 100%; border-radius: inherit; pointer-events: none; z-index: 3; }
807
+ .rain.global { position: fixed; inset: 0; width: 100vw; height: 100vh; pointer-events: none; z-index: 60; animation: rain-in .25s ease-out 1; }
808
+ @keyframes rain-in { from { opacity: 0; } to { opacity: 1; } }
809
+ /* GHOST: the field disintegrates into a grid of dots that shrink to nothing, then reintegrates dashed, in mode #0. */
810
+ @property --ghost-dot { syntax: '<length>'; inherits: false; initial-value: 7px; }
811
+ .composer.ghost-wink .field { animation: ghost-dissolve 1.3s cubic-bezier(.45, 0, .2, 1) 1;
812
+ -webkit-mask-image: radial-gradient(circle, #000 var(--ghost-dot), transparent calc(var(--ghost-dot) + .6px)); -webkit-mask-size: 8px 8px; -webkit-mask-position: 0 0;
813
+ mask-image: radial-gradient(circle, #000 var(--ghost-dot), transparent calc(var(--ghost-dot) + .6px)); mask-size: 8px 8px; mask-position: 0 0; }
814
+ @keyframes ghost-dissolve {
815
+ 0% { --ghost-dot: 7px; opacity: 1; border-style: solid; border-color: var(--line-2); filter: blur(0); }
816
+ 40% { --ghost-dot: 0px; opacity: .6; border-style: solid; border-color: var(--line-2); filter: blur(1.5px); }
817
+ 58% { --ghost-dot: 0px; opacity: .6; border-style: dashed; border-color: var(--mode-0); filter: blur(1.5px); }
818
+ 100% { --ghost-dot: 7px; opacity: .92; border-style: dashed; border-color: var(--mode-0); filter: blur(0); } }
819
+ .composer.control-wink .field::before { animation: control-sweep 2.2s cubic-bezier(.2, .7, .2, 1) 1;
820
+ background:
821
+ linear-gradient(90deg, transparent 0%, transparent 40%, color-mix(in srgb, var(--terror) 45%, transparent) 50%, transparent 60%) no-repeat,
822
+ repeating-linear-gradient(0deg, color-mix(in srgb, var(--terror) 14%, transparent) 0 1px, transparent 1px 3px);
823
+ background-size: 60% 100%, 100% 100%; }
824
+ .composer.control-wink .crew-label { animation: terror-flicker 1.1s steps(1) 2; }
825
+ .composer.control-wink .editor textarea { animation: control-type 1.4s steps(1) 1; }
826
+ @keyframes control-sweep { 0% { opacity: 0; background-position: -60% 0, 0 0; } 8% { opacity: 1; } 18% { opacity: .3; } 26% { opacity: 1; } 72% { opacity: .9; background-position: 160% 0, 0 0; } 100% { opacity: 0; background-position: 160% 0, 0 0; } }
827
+ @keyframes terror-flicker { 0%, 100% { filter: none; } 15% { filter: brightness(2) saturate(1.6); } 30% { filter: brightness(.5); } 45% { filter: brightness(1.8); } 60% { filter: brightness(.8); } }
828
+ @keyframes control-type { 0%, 30% { caret-color: var(--terror); } 40% { caret-color: transparent; } 55% { caret-color: var(--terror); } 100% { caret-color: var(--text); } }
829
+ @media (prefers-reduced-motion: reduce) { .composer.ash-wink .field::before, .composer.ash-wink .crew-label, .composer.ash-wink .editor textarea, .composer.control-wink .field::before, .composer.control-wink .crew-label, .composer.control-wink .editor textarea, .composer.ghost-wink .field, .rain.global { animation: none; } }
830
+
831
+ .who .badge.ash { color: var(--phosphor); border-color: color-mix(in srgb, var(--phosphor) 50%, transparent); }
832
+ .who .badge.ash.skipped { color: var(--text-3); border-color: var(--line-2); }
833
+ .ash-original { margin-top: 10px; border-top: 1px dashed var(--line-2); padding-top: 8px; }
834
+ .ash-original summary { color: var(--text-3); font-family: var(--mono); font-size: 10px; cursor: pointer; }
835
+ .ash-original pre { white-space: pre-wrap; overflow-wrap: anywhere; margin: 8px 0 0; font: inherit; color: var(--text-2); }
836
+ .ash-beta { color: var(--warn); font-size: 12px; }
837
+ .create-scopes { display: inline-flex; gap: 4px; margin-left: 4px; }
838
+ .create-scopes .cap { font-size: 8.5px; padding: 1px 5px; }
839
+ .create-scopes .cap.on { color: var(--warn); border-color: color-mix(in srgb, var(--warn) 55%, transparent); }
840
+ .create-scopes .cap.no { text-decoration: line-through; opacity: .7; }
841
+ .system.lease.refused { color: var(--danger); }
842
+ /* CONTROL cards */
843
+ .system.control { color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 45%, transparent); }
844
+ .system.control .who { color: var(--agent); }
845
+ .system.control code { font-family: var(--mono); font-size: 10.5px; padding: 1px 6px; border: 1px solid color-mix(in srgb, var(--terror) 45%, transparent); border-radius: 6px; }
846
+ .system.control.changed { display: grid; gap: 8px; justify-items: center; max-width: min(760px, 92%); padding: 12px 16px; border: 1px solid color-mix(in srgb, var(--terror) 55%, transparent); border-radius: 14px; background: color-mix(in srgb, var(--terror) 6%, transparent); text-shadow: none; text-transform: none; letter-spacing: 0; font-size: 12.5px; }
847
+ .system.control.changed .head { font-family: var(--mono); font-size: 10.5px; letter-spacing: .12em; text-transform: uppercase; }
848
+ .system.control.changed.quiet { border-style: dashed; color: var(--text-2); background: transparent; }
849
+ .system.control .files { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; justify-items: start; text-align: left; }
850
+ .system.control .files li { display: flex; gap: 8px; align-items: center; }
851
+ .system.control .files .st { font-family: var(--mono); font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-3); min-width: 64px; }
852
+ .system.control .files .st.A { color: var(--phosphor); } .system.control .files .st.M { color: var(--warn); } .system.control .files .st.D { color: var(--danger); }
853
+ .system.control .files .file-ref { font-family: var(--mono); font-size: 12px; color: var(--text); background: transparent; border: 0; border-bottom: 1px dashed var(--line-2); padding: 0; cursor: pointer; }
854
+ .system.control .files .file-ref:disabled { text-decoration: line-through; cursor: default; }
855
+ .system.control .stat { margin: 0; font-family: var(--mono); font-size: 10.5px; color: var(--text-3); white-space: pre-wrap; }
856
+ .system.control .forbidden { font-family: var(--mono); font-size: 10.5px; color: var(--danger); letter-spacing: .04em; }
857
+ .system.control .undo { 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; }
858
+ .system.control .undo:hover { background: color-mix(in srgb, var(--terror) 22%, transparent); }
859
+ .system.control .undo:disabled { opacity: .5; cursor: default; }
860
+ .system.control .outcome { font-family: var(--mono); font-size: 10px; letter-spacing: .16em; color: var(--phosphor); }
861
+ .system.control.reverted { color: var(--phosphor); text-shadow: none; }
862
+ /* Escalation card: the plan waits for the human, with a clock */
863
+ .system.escalation { color: var(--warn); display: grid; gap: 8px; justify-items: center; max-width: min(760px, 92%); padding: 12px 16px; border: 1px dashed color-mix(in srgb, var(--warn) 55%, transparent); border-radius: 14px; background: color-mix(in srgb, var(--warn) 6%, transparent); text-transform: none; letter-spacing: 0; font-size: 12.5px; }
864
+ .system.escalation .head { font-family: var(--mono); font-size: 10.5px; letter-spacing: .12em; text-transform: uppercase; }
865
+ .system.escalation .head .who { color: var(--agent); }
866
+ .system.escalation .quote { font-family: inherit; font-size: 13px; color: var(--text-2); font-style: italic; text-align: center; overflow-wrap: anywhere; }
867
+ .system.escalation .actions { display: inline-flex; gap: 8px; align-items: center; flex-wrap: wrap; justify-content: center; }
868
+ .system.escalation button { border: 1px solid color-mix(in srgb, var(--warn) 65%, transparent); background: color-mix(in srgb, var(--warn) 12%, transparent); color: var(--warn); font: inherit; font-family: var(--mono); font-size: 10px; letter-spacing: .14em; padding: 6px 11px; border-radius: 8px; cursor: pointer; }
869
+ .system.escalation button.plan { border-style: double; }
870
+ .system.escalation button.deny { color: var(--text-2); border-color: var(--line-2); background: transparent; }
871
+ .system.escalation button:hover { filter: brightness(1.1); background: color-mix(in srgb, var(--warn) 22%, transparent); }
872
+ .system.escalation button:disabled { opacity: .5; cursor: default; }
873
+ .system.escalation .clock { font-family: var(--mono); font-size: 11px; letter-spacing: .1em; color: var(--text-3); margin-left: 6px; }
874
+ .system.escalation .clock.late { color: var(--crit); animation: blink 1s infinite; }
875
+ .system.escalation .outcome { font-family: var(--mono); font-size: 10px; letter-spacing: .16em; }
876
+ .system.escalation.granted { border-style: solid; color: var(--phosphor); border-color: color-mix(in srgb, var(--phosphor) 50%, transparent); background: color-mix(in srgb, var(--phosphor) 6%, transparent); }
877
+ .system.escalation.denied { color: var(--text-3); border-color: var(--line-2); background: transparent; }
878
+ .composer.creating .field { border-color: var(--mode-2); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mode-2) 18%, transparent); }
879
+ .composer.creating .crew-label { color: var(--mode-2); }
880
+ .who .badge.lease { color: var(--warn); border-color: color-mix(in srgb, var(--warn) 50%, transparent); }
881
+ .user .stamp .lease { color: var(--warn); }
882
+ .system.lease { color: var(--warn); }
883
+ .bubble .artifacts { margin: 10px 0 0; padding-top: 8px; border-top: 1px dashed var(--line-2); }
884
+ .bubble .artifacts .label { display: block; font-family: var(--mono); font-size: 9.5px; letter-spacing: .16em; text-transform: uppercase; color: var(--warn); margin-bottom: 6px; }
885
+ @media (max-width: 680px) { .create-toggle .create-word { display: none; } .create-toggle { padding: 0 8px; } }
886
+
887
+ /* no horizontal overflow inside bubbles: wrap everything */
888
+ .bubble, .bubble * { min-width: 0; }
889
+ .bubble { max-width: 100%; overflow-x: hidden; }
890
+ .codeblock pre { white-space: pre-wrap; overflow-wrap: anywhere; overflow-x: hidden; }
891
+ .bubble table { display: block; max-width: 100%; overflow-x: auto; }
892
+ .bubble img.inline, .bubble .file-tile img { max-width: 100%; }
893
+ .plan-card li, .bubble li, .bubble p, .bubble a { overflow-wrap: anywhere; }
894
+ .bubble .table-wrap { overflow-x: auto; margin: 6px 0 10px; max-width: 100%; }
895
+ .bubble table { border-collapse: collapse; font-size: 13px; line-height: 1.45; min-width: 60%; }
896
+ .bubble th, .bubble td { border: 1px solid color-mix(in srgb, var(--bubble-ink) 14%, transparent); padding: 6px 10px; vertical-align: top; text-align: left; }
897
+ .bubble th { font-weight: 650; background: color-mix(in srgb, var(--bubble-ink) 6%, transparent); font-size: 12px; letter-spacing: .02em; }
898
+ .bubble tbody tr:nth-child(even) td { background: color-mix(in srgb, var(--bubble-ink) 3%, transparent); }
899
+ .row.user .bubble th, .row.user .bubble td { border-color: color-mix(in srgb, var(--user-ink) 25%, transparent); }
900
+ .row .col { max-width: 100%; }
901
+ .thread-inner { overflow-x: hidden; }
902
+ /* scope toggles in connection cards */
903
+ .conn-card .scopes { display: grid; gap: 10px; align-self: start; padding-top: 12px; border-top: 1px solid var(--ph-faint); }
904
+ .conn-card .scope .assist { margin-left: 6px; border: 1px solid var(--ph-dim); background: transparent; color: var(--ph); font: inherit; font-size: 8.5px; letter-spacing: .14em; padding: 1px 6px; cursor: pointer; text-transform: uppercase; }
905
+ .conn-card .scope .assist:hover { background: var(--ph-faint); }
906
+ .conn-card .scope { display: flex; align-items: center; gap: 8px; font-size: 10px; letter-spacing: .12em; color: var(--ph); cursor: pointer; }
907
+ .conn-card .scope input { accent-color: #9bff66; width: auto; }
908
+ .conn-card .scope.unavailable { color: var(--ph-dim); cursor: not-allowed; }
909
+ .conn-card .scope .why { margin-left: auto; font-size: 9px; letter-spacing: .08em; color: var(--ph-dim); text-transform: none; }
910
+
911
+ /* CREATE armed and text present: the field widens past the column; height follows line breaks only */
912
+ /* Field box: one line, always. It grows only with explicit line breaks
913
+ (max two, three visible lines) and scrolls beyond. It widens, keeping
914
+ one line, while CREATE is armed, so the longer lease prompt fits. */
915
+ .field { align-items: center; }
916
+ .composer { transition: width .3s ease; }
917
+ .composer.creating { width: min(1180px, 100% - 40px); }
918
+ .editor textarea::placeholder { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
919
+ .editor { position: relative; display: grid; min-width: 0; }
920
+ .editor textarea, .editor .highlight { grid-area: 1 / 1; margin: 0; padding: 7px 0; line-height: 21px; font-size: 15px; font-family: inherit; letter-spacing: normal; white-space: pre-wrap; overflow-wrap: anywhere; word-break: normal; box-sizing: content-box; min-height: 0; max-height: none; overflow-y: auto; }
921
+ .editor textarea { position: relative; z-index: 1; color: transparent; caret-color: var(--text); }
922
+ .editor textarea::selection { background: color-mix(in srgb, var(--phosphor) 30%, transparent); }
923
+ .composer.stopall .editor textarea { color: var(--terror); }
924
+ .composer.stopall .editor .highlight { visibility: hidden; }
925
+ .editor .highlight { color: var(--text); pointer-events: none; scrollbar-width: none; }
926
+ .editor .highlight::-webkit-scrollbar { display: none; }
927
+ .editor .highlight .chip { --chip-bg: color-mix(in srgb, var(--agent, var(--phosphor)) 16%, var(--panel)); border-radius: 5px; padding: 0; margin: 0; background: var(--chip-bg); color: var(--agent, var(--phosphor)); box-shadow: 0 0 0 3px var(--chip-bg), 0 0 0 4px color-mix(in srgb, var(--agent, var(--phosphor)) 40%, transparent); font-weight: 600; }
928
+ .editor .highlight .chip.cmd { --agent: var(--phosphor); font-family: var(--mono); font-size: 13px; letter-spacing: .04em; }
929
+ .editor .highlight .chip.file { --agent: var(--text-2); font-family: var(--mono); font-size: 13px; letter-spacing: 0; font-weight: 500; }
930
+ .editor .highlight .chip.unknown { --agent: var(--text-3); text-decoration: underline dotted; font-weight: 500; }
931
+ .slash-menu { position: absolute; left: -12px; bottom: calc(100% + 14px); z-index: 30; min-width: 280px; max-width: min(460px, 90vw); border: 1px solid var(--line-2); background: var(--panel); border-radius: 14px; box-shadow: 0 14px 40px rgba(0, 0, 0, .35); padding: 6px; display: grid; gap: 2px; }
932
+ .slash-menu .item { display: grid; grid-template-columns: auto 1fr; gap: 10px; align-items: baseline; padding: 7px 10px; border-radius: 9px; cursor: pointer; border: 0; background: transparent; color: var(--text); text-align: left; font: inherit; }
933
+ .slash-menu .item .key { font-family: var(--mono); font-size: 12.5px; color: var(--agent, var(--phosphor)); font-weight: 600; white-space: nowrap; }
934
+ .slash-menu .item .what { font-size: 12.5px; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
935
+ .slash-menu .item.off .key { color: var(--text-3); text-decoration: line-through; }
936
+ .slash-menu .item[aria-selected="true"], .slash-menu .item:hover { background: color-mix(in srgb, var(--agent, var(--phosphor)) 14%, transparent); }
937
+ .slash-menu .hint { padding: 4px 10px 6px; font-family: var(--mono); font-size: 10px; letter-spacing: .12em; color: var(--text-3); }
938
+ /* ---------- project files panel: lives in the free space right of the thread ---------- */
939
+ .tree-button { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 26px; border-radius: 6px; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); cursor: pointer; padding: 0; }
940
+ .tree-button svg { width: 16px; height: 16px; }
941
+ .theme-button svg { display: none; }
942
+ .theme-button[data-theme="auto"] .t-auto, .theme-button[data-theme="light"] .t-light, .theme-button[data-theme="dark"] .t-dark { display: block; }
943
+ .tree-button:hover, .tree-button[aria-pressed="true"] { color: var(--phosphor); border-color: var(--phosphor); box-shadow: 0 0 14px color-mix(in srgb, var(--phosphor) 30%, transparent); }
944
+ .tree { grid-row: 3; justify-self: end; align-self: stretch; z-index: 5; width: clamp(240px, calc((100% - var(--column)) / 2 - 36px), 420px); margin: 18px 20px 10px 0; min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1fr); border: 1px solid var(--line-2); border-radius: 18px; background: var(--panel); box-shadow: 0 10px 30px rgba(0, 0, 0, .06); overflow: hidden; animation: tree-in .22s ease; }
945
+ @keyframes tree-in { from { opacity: 0; transform: translateX(8px); } to { opacity: 1; transform: none; } }
946
+ .tree-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 12px 10px 16px; border-bottom: 1px solid var(--line); font-family: var(--mono); font-size: 10px; letter-spacing: .18em; color: var(--text-2); }
947
+ .tree-title { display: flex; gap: 8px; align-items: baseline; min-width: 0; }
948
+ .tree-root { color: var(--text-3); letter-spacing: .06em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
949
+ .tree-close { border: 0; background: transparent; color: var(--text-3); font: inherit; font-size: 16px; line-height: 1; cursor: pointer; padding: 2px 6px; border-radius: 6px; }
950
+ .tree-close:hover { color: var(--text); background: var(--line); }
951
+ .tree-body { overflow: auto; padding: 8px 8px 14px; font-family: var(--mono); font-size: 12px; letter-spacing: .01em; }
952
+ .tree-body ul { list-style: none; margin: 0; padding: 0; }
953
+ .tree-body ul ul { padding-left: 14px; border-left: 1px solid var(--line); margin-left: 9px; }
954
+ .tree-body li { margin: 0; }
955
+ .tree-body .node { display: flex; align-items: center; gap: 6px; width: 100%; border: 0; background: transparent; color: var(--text-2); font: inherit; text-align: left; padding: 4px 8px; border-radius: 7px; cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
956
+ .tree-body .node:hover { background: color-mix(in srgb, var(--phosphor) 10%, transparent); color: var(--text); }
957
+ .tree-body .node .caret { width: 10px; color: var(--text-3); flex: none; font-size: 10px; }
958
+ .tree-body .node .name { overflow: hidden; text-overflow: ellipsis; }
959
+ .tree-body .node.dir .name { color: var(--text); }
960
+ .tree-body .node.file .name::before { content: ''; display: inline-block; width: 6px; height: 6px; border-radius: 2px; margin-right: 7px; background: var(--line-2); vertical-align: 1px; }
961
+ .tree-body .node.file.image .name::before { background: var(--phosphor); }
962
+ .tree-body .node.file.code .name::before { background: color-mix(in srgb, var(--warn) 70%, transparent); }
963
+ .tree-body .node .size { margin-left: auto; color: var(--text-3); font-size: 10px; padding-left: 8px; }
964
+ .tree-body .node.shallow .name::after { content: ' · not walked'; color: var(--text-3); font-size: 10px; }
965
+ .tree-body .empty-dir, .tree-body .error { padding: 4px 24px; color: var(--text-3); font-size: 11px; }
966
+ @media (max-width: 1180px) { .tree, .tree-button { display: none !important; } }
967
+
968
+ .command-card { margin: 10px 0 6px; max-width: min(860px, 100%); border: 1px solid var(--line-2); border-radius: 12px; background: color-mix(in srgb, var(--panel) 80%, transparent); overflow: hidden; }
969
+ .command-card.failed { border-color: color-mix(in srgb, var(--crit) 60%, transparent); }
970
+ .command-card .head { display: flex; gap: 10px; align-items: baseline; padding: 8px 12px; font-family: var(--mono); font-size: 10.5px; letter-spacing: .14em; color: var(--text-2); border-bottom: 1px solid var(--line-2); }
971
+ .command-card .head b { color: var(--phosphor); font-weight: 600; }
972
+ .command-card .head .args { color: var(--text-3); letter-spacing: .04em; }
973
+ .command-card pre { margin: 0; padding: 10px 12px; max-height: 320px; overflow: auto; font-family: var(--mono); font-size: 12px; line-height: 1.55; color: var(--text); white-space: pre-wrap; overflow-wrap: anywhere; }
974
+ .command-card pre .h { color: var(--phosphor); font-weight: 600; }
975
+
976
+ .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; }