Commit 536e643
feat: SciFi theme — full dark/light palette with Tailwind v4 token remaps (#320)
* Upload SciFi theme screenshot
* fix: stabilize workspace swarm process spawning (#302)
Co-authored-by: Jarno de Vries <jarno@match-day.nl>
* feat(theme): add SciFi theme (dark + light variants) (#303)
* feat(theme): add SciFi theme (dark + light variants)
- Add scifi-theme.css with neon accents, glow effects, gradient backgrounds
- Register SciFi in theme.ts with dark/light color schemes
- Add SciFi option in settings UI
- Import scifi-theme.css in styles.css
* docs: add SciFi theme screenshot
---------
Co-authored-by: Fungraphique <fungraphique@jarvis.local>
* fix(chat): cross-session response contamination + /new opens previous chat (#297, #300)
Two related session-routing bugs that landed responses (or new-chat
clicks) into the wrong session.
#297 — cross-session response contamination
When the user navigated to a new chat while a previous chat was still
streaming, the previous chat's response chunks would land in the
**new** chat. Three fixes:
* useStreamingMessage now bumps a streamGenerationRef on every
startStreaming call. The fetch-reader loop captures that token at
start and re-checks it on every reader.read() and between events
in the same batch. If the token has changed (because the user
started a different stream), the loop cancels the reader and exits
without dispatching anything. This closes the brief race between
abortController.abort() and the underlying fetch reader actually
stopping, during which buffered chunks were silently writing into
activeSessionKeyRef.current (which had already been switched to
the new session).
* chat-screen now cancels the in-flight stream on session-key change
via a useEffect keyed on (activeCanonicalKey, activeFriendlyId,
isNewChat). Previously nothing cancelled the stream on navigation
\u2014 only the user clicking the explicit Stop button (handleStop)
called cancelStreaming().
#300 — /new slash command opens last chat instead of new session
/new was calling navigate({ to: '/chat' }), but the /chat index route
unconditionally redirects to localStorage('claude-last-session'), so
/new always landed in whichever chat was last active. Fixed at three
entry points so all 'new chat' actions go through the explicit 'new'
sentinel:
* /new in chat-screen.handleUiSlashCommand
* /new in command-palette.runSlashCommand
* 'New Chat' quick-action tile in the search modal
The 'Chat' nav link in the sidebar still goes to /chat (= last session)
\u2014 that's the correct behaviour for a screen-level nav target. Only
'new' actions are routed to the new sentinel.
Closes #297, #300
* fix(terminal): keep PTY alive across SSE disconnects + auto-reattach (#298)
The browser terminal periodically 'reset back to prompt' during normal
use because any transient SSE disconnect (network blip, browser tab
suspension, HMR reload, dev-server restart) tore down the user's PTY
and dropped them into a fresh shell.
Root cause: terminal-stream's request.signal abort handler called
session.close(), which SIGTERM'd the underlying Python PTY helper.
There was also no auto-reconnect on the client \u2014 a single dropped
read terminated the loop, called /api/terminal-close, cleared the
tab's sessionId, and left the user with an idle tab.
Fix in three parts:
1) terminal-sessions: TerminalSession gains markDetached() and
markAttached(). markDetached() starts a TTL timer (default 5 min,
override via HERMES_TERMINAL_DETACH_TTL_MS) that reaps the PTY only
if no client reattaches in time. The map keeps the session live in
the meantime.
2) terminal-stream: accepts an optional sessionId in the POST body. If
the id matches a still-alive session, the route reattaches to it
instead of spawning a fresh PTY. The 'session' event payload now
includes a 'reattach' flag. On SSE abort, we just detach listeners
and call session.markDetached() \u2014 the PTY stays running.
3) terminal-workspace: passes sessionId on every connect, so reconnect
reattaches automatically. When the read loop ends and the tab still
has a sessionId, we attempt a single quick reattach with a
'[reconnecting...]' nudge to the user instead of tearing the tab
down. /api/terminal-close is no longer called on stream end \u2014 the
server-side TTL handles abandoned sessions.
Fixes #298
* fix(scifi-theme): remap amber tokens to cyan/teal — no more pale yellow in SciFi
Amber colors (used for warnings/alerts in usage meter, agent thinking,
inspector badges, etc.) were not remapped in the SciFi theme, causing:
- Pale yellow bg-amber-100 with light text → unreadable menu items
- Jarring yellow accents breaking the cyberpunk aesthetic
- Trigger pill and selection states with impossible contrast
Remap all --color-amber-* tokens:
- Dark theme: amber → cyan/teal gradient (#041418 → #ccfaff)
- Light theme: amber → teal gradient (#e8f4f6 → #0a1628)
This replaces the previous .bg-amber-100 !important hack which broke
the usage meter bar by forcing dark text on already-dark remapped
primary-50 backgrounds.
* fix(scifi-theme): tweak amber remap contrast values
Brighten the amber→cyan tokens slightly so bg-amber-100 is visible
on --theme-panel (#0d1b2a) and text colors have good contrast
on the darker backgrounds.
* fix(theme): SciFi — visible usage pill + selected menu item colors
- Brightened amber-100 to #0c3245 (was #0a2633, too dark on #060b18 bg)
- Brightened amber-50/200/300/400/500/600/700 gradient for better contrast
- Added !important overrides for .bg-amber-100 to force background and
text color, overriding MenuItem inline styles that were blocking
the selected menu item appearance in SciFi dark theme
* fix(scifi-theme): add yellow, neutral, and white overrides for dark mode
- Add --color-yellow-* remap to teal-warm tones (was missing entirely)
- Add --color-neutral-* remap to dark slate/navy tones
- Add .bg-white override to theme-card for dialog backgrounds
- Add .bg-amber-100 color override for MenuItem selected state
(MenuItem uses inline style color:var(--theme-text) which overwrites
Tailwind text-amber-800, now overridden with !important)
- Add scifi-light remaps for yellow, red, emerald, neutral tokens
- Fixes: pale yellow/white backgrounds in usage meter menu, View Details
dialog, status badges, progress bars, and tab pills in SciFi dark mode
* fix: replace bg-white with bg-primary-50 in usage-details-modal for theme compatibility
- All bg-white/bg-white/N in usage-details-modal replaced with bg-primary-50/N
which is properly remapped by the SciFi theme (--theme-card/panel)
- Active tab pill: bg-white → bg-primary-100, text-primary-900 → text-primary-800
- Set as Default button: bg-white → bg-primary-50, hover:bg-primary-50 → hover:bg-primary-100
- Removed aggressive bg-white !important overrides from scifi-theme.css that
broke borders, switches, and other elements using white elsewhere
* fix(scifi-theme): rewrite theme following nous pattern
- Replace hex values with var(--theme-*) references (same as nous theme)
- Remove broken red/emerald/yellow/neutral remaps that caused border/bg issues
- Add !important on dark-mode primary/accent remaps (needed for Tailwind v4 oklch)
- Move @import scifi-theme.css to END of styles.css (after .system dark rules)
- Keep essential .bg-amber-100 overrides for menu selected state
- Result: 238 lines (was 350+), clean structure matching nous theme pattern
Root cause: Tailwind v4 uses oklch color-mix internally for utility classes.
Simple --color-amber-100: #0f3547 overrides don't work because .border-primary-200
resolves via color-mix, not via the CSS custom property. Using var(--theme-*)
with !important ensures proper resolution.
* fix(scifi-theme): add !important to all dark mode token remaps
Tailwind v4 defines color tokens as oklch in @layer theme, which has
higher specificity than plain [data-theme] selectors. Without !important,
the remaps were ignored and components displayed native Tailwind colors
(white, amber, neutral-gray) instead of the SciFi palette.
Also remap --color-white to #0d1b2a so bg-white becomes dark navy
in SciFi dark mode (fixes chat-controls popover white background).
* feat(scifi): active tab indicator — cyan accent glow on Session/Providers tabs
* fix(scifi-theme): review fixes - 9 corrections
* fix: restore tab selector without role=tablist (component doesn't use it)
* fix(scifi): tab selector uses .bg-primary-50 > button instead of [role=tablist]
The usage-details-modal tabs don't use role=tablist ARIA attribute,
so [role=tablist] selector never matched. The tab container has
bg-primary-50 and direct child buttons with bg-primary-100 when active.
---------
Co-authored-by: jarnodevries-byte <jarnodevries@gmail.com>
Co-authored-by: Jarno de Vries <jarno@match-day.nl>
Co-authored-by: Fungraphique <fungraphique@jarvis.local>
Co-authored-by: Aurora release bot <release@outsourc-e.com>1 parent 274e9a2 commit 536e643
4 files changed
Lines changed: 258 additions & 34 deletions
File tree
- screenshots
- src
- components/usage-meter
Loading
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
335 | 335 | | |
336 | 336 | | |
337 | 337 | | |
338 | | - | |
| 338 | + | |
339 | 339 | | |
340 | 340 | | |
341 | 341 | | |
| |||
354 | 354 | | |
355 | 355 | | |
356 | 356 | | |
357 | | - | |
| 357 | + | |
358 | 358 | | |
359 | 359 | | |
360 | 360 | | |
361 | 361 | | |
362 | 362 | | |
363 | 363 | | |
364 | 364 | | |
365 | | - | |
| 365 | + | |
366 | 366 | | |
367 | 367 | | |
368 | 368 | | |
369 | 369 | | |
370 | 370 | | |
371 | 371 | | |
372 | 372 | | |
373 | | - | |
| 373 | + | |
374 | 374 | | |
375 | 375 | | |
376 | 376 | | |
| |||
380 | 380 | | |
381 | 381 | | |
382 | 382 | | |
383 | | - | |
| 383 | + | |
384 | 384 | | |
385 | 385 | | |
386 | 386 | | |
| |||
393 | 393 | | |
394 | 394 | | |
395 | 395 | | |
396 | | - | |
| 396 | + | |
397 | 397 | | |
398 | 398 | | |
399 | 399 | | |
| |||
411 | 411 | | |
412 | 412 | | |
413 | 413 | | |
414 | | - | |
| 414 | + | |
415 | 415 | | |
416 | 416 | | |
417 | 417 | | |
| |||
424 | 424 | | |
425 | 425 | | |
426 | 426 | | |
427 | | - | |
| 427 | + | |
428 | 428 | | |
429 | 429 | | |
430 | 430 | | |
| |||
485 | 485 | | |
486 | 486 | | |
487 | 487 | | |
488 | | - | |
| 488 | + | |
489 | 489 | | |
490 | 490 | | |
491 | 491 | | |
| |||
503 | 503 | | |
504 | 504 | | |
505 | 505 | | |
506 | | - | |
| 506 | + | |
507 | 507 | | |
508 | 508 | | |
509 | 509 | | |
| |||
561 | 561 | | |
562 | 562 | | |
563 | 563 | | |
564 | | - | |
| 564 | + | |
565 | 565 | | |
566 | 566 | | |
567 | 567 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
3 | | - | |
4 | | - | |
5 | | - | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
| 10 | + | |
9 | 11 | | |
10 | 12 | | |
11 | 13 | | |
| |||
53 | 55 | | |
54 | 56 | | |
55 | 57 | | |
| 58 | + | |
| 59 | + | |
56 | 60 | | |
57 | 61 | | |
58 | 62 | | |
| |||
118 | 122 | | |
119 | 123 | | |
120 | 124 | | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
135 | | - | |
136 | | - | |
137 | | - | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
138 | 142 | | |
139 | 143 | | |
140 | 144 | | |
141 | 145 | | |
142 | | - | |
143 | 146 | | |
144 | 147 | | |
145 | 148 | | |
| |||
157 | 160 | | |
158 | 161 | | |
159 | 162 | | |
| 163 | + | |
160 | 164 | | |
161 | 165 | | |
162 | 166 | | |
| |||
175 | 179 | | |
176 | 180 | | |
177 | 181 | | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
0 commit comments