Chat tabs, chat mode, own modes, compaction notice, CLI binaries again

- Terminals and file managers as tabs of a chat; chat terminals keep running on
  the server (no idle timeout) and re-attach from any device
- "Just chat" in New session and a built-in chat mode with a lean prompt and only
  web tools; custom modes with kind (coding/conversation), read-only and tool picker
- Mode selector as a dropdown
- The chat shows running compactions (automatic: tokens and share of the limit)
  and labels summaries
- Docker image builds and serves the terminal client binaries again
- Fix: atomic session updates; background title/usage writes no longer undo each
  other (auto compaction triggered one turn late)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-09 11:24:58 +01:00
1 parent 242b80605c
commit c850586a81
29 files changed
+831 -187

No files matched your search

+122
View File
@@ -3603,3 +3603,125 @@ button.danger-solid {
.plan-pct {
font-variant-numeric: tabular-nums;
}
/* --- chat tabs (chat + terminals) ---------------------------------------------- */
.chat-tabs {
display: flex;
align-items: center;
gap: 2px;
padding: 4px 10px 0;
border-bottom: 1px solid var(--bg3);
overflow-x: auto;
flex: none;
}
.chat-tab {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
border: none;
border-bottom: 2px solid transparent;
border-radius: 6px 6px 0 0;
background: none;
color: var(--fg2);
font-size: 13px;
white-space: nowrap;
cursor: pointer;
}
span.chat-tab {
padding: 0 4px 0 0;
}
span.chat-tab > button {
padding: 6px 4px 6px 12px;
color: inherit;
font-size: 13px;
display: inline-flex;
align-items: center;
gap: 6px;
}
.chat-tab .close {
padding: 2px 4px;
opacity: 0.6;
}
.chat-tab .close:hover {
opacity: 1;
}
.chat-tab:hover {
background: var(--bg1);
color: var(--fg0);
}
.chat-tab.active {
color: var(--fg0);
border-bottom-color: var(--accent);
background: var(--bg1);
}
.chat-tab.dead {
opacity: 0.55;
}
.chat-tab-add {
padding: 4px 8px;
}
.chat-pane {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
}
.chat-pane[hidden] {
display: none;
}
.files-embed-bar {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
border-bottom: 1px solid var(--bg3);
flex: none;
}
.files-embed-bar .path {
font-size: 12px;
color: var(--fg3);
font-family: var(--mono);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tool-picker .hint {
margin-bottom: 6px;
}
.tool-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
gap: 4px 12px;
}
.tool-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 12px;
cursor: pointer;
}
.tool-item.disabled {
opacity: 0.45;
cursor: default;
}
.mode-select {
font-weight: 600;
color: var(--accent);
}
.compacting-card {
display: flex;
align-items: center;
gap: 10px;
margin: 10px 0;
padding: 10px 14px;
border: 1px dashed var(--bg3);
border-radius: var(--radius);
background: var(--bg1);
font-size: 13px;
}
.compacting-card.auto {
border-color: color-mix(in srgb, var(--accent) 60%, var(--bg3));
}