feat(ui): add session yolo mode controls (#256)

## Summary
- add a per-session Yolo mode toggle for permission prompts and persist
its state
- move the control into the Status tab with clearer copy, an info
tooltip, and a visible header badge when it is enabled
- auto-accept queued permissions for any yolo-enabled session in the
instance, not only the currently focused session

## Why
- keeps this risky mode explicit and easy to audit from the session
status area
- matches the expected multi-session desktop behavior when several
sessions stay active in parallel

## Testing
- npm run typecheck --workspace @codenomad/ui
- npm run build --workspace @codenomad/ui

Closes #18
This commit is contained in:
Pascal André
2026-03-31 15:46:20 +02:00
committed by GitHub
parent 1d953dfe64
commit 64ac885157
14 changed files with 387 additions and 124 deletions

View File

@@ -412,6 +412,19 @@
background-color: var(--surface-secondary);
}
.right-panel-accordion-header-row {
@apply flex items-center gap-2;
}
.right-panel-accordion-header-row .right-panel-accordion-trigger {
flex: 1 1 auto;
}
.right-panel-accordion-header-row .section-info-trigger {
flex: 0 0 auto;
margin-inline-end: 0.75rem;
}
.right-panel-accordion-trigger {
@apply w-full flex items-center justify-between px-3 py-2.5 text-[11px] font-semibold uppercase tracking-wide transition-colors duration-150;
color: var(--text-secondary);
@@ -452,6 +465,8 @@
@apply inline-flex items-center justify-center p-0.5 rounded transition-all duration-150;
color: var(--text-muted);
flex-shrink: 0;
border: none;
background-color: transparent;
}
.section-info-trigger:hover {
@@ -459,6 +474,12 @@
background-color: var(--surface-hover);
}
.section-info-trigger:focus-visible {
@apply ring-2 ring-offset-1;
ring-color: var(--accent-primary);
ring-offset-color: var(--surface-secondary);
}
.section-label {
margin-inline-start: 2px;
}

View File

@@ -107,6 +107,28 @@
@apply w-full;
}
.session-sidebar-toggle {
display: inline-flex;
align-items: center;
justify-content: space-between;
gap: 0.5rem;
padding: 0.4rem 0.65rem;
border: 1px solid var(--border-base);
border-radius: 0.75rem;
background: var(--surface-base);
min-height: 2rem;
width: fit-content;
max-width: 100%;
margin-left: auto;
}
.session-sidebar-toggle-title {
font-size: 0.8rem;
font-weight: 500;
color: var(--text-primary);
line-height: 1.2;
}
.session-sidebar-controls .selector-trigger,
.session-sidebar-controls [data-model-selector-control],
.session-sidebar-controls .selector-trigger-label,
@@ -458,6 +480,16 @@ session-sidebar-controls .selector-trigger-primary {
border: 1px solid transparent;
}
.status-indicator.session-yolo-mode {
color: var(--accent-primary);
background-color: color-mix(in oklab, var(--accent-primary) 14%, transparent);
border-color: color-mix(in oklab, var(--accent-primary) 28%, transparent);
}
.status-indicator.session-yolo-mode .status-dot {
background-color: var(--accent-primary);
}
@media (max-width: 768px) {
.session-list-container {
min-width: 200px;