Add file badges, menu icons, LSP diagnostics, robust compaction

- Files in chat: preview with type/size badges and file name; attachment chips
- Menu and settings tabs with icons
- Heatmap: distinct colour for empty hours, hourly labels
- Context chip shows used/total tokens (e.g. 221k/240k) plus percent
- LSP client: diagnostics appended to edit/write results and a diagnostics tool
  (typescript-language-server, pyright, rust-analyzer, gopls, clangd; sandboxed)
- Compaction summarizes a plain transcript and retries once on empty output
- files/stat endpoint

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-08 19:50:12 +01:00
1 parent 5b569b6835
commit ec1b9b4925
22 files changed
+1036 -48

No files matched your search

+114
View File
@@ -2090,3 +2090,117 @@ button.danger-solid {
gap: 4px;
min-width: 0;
}
/* --- files in chat (preview + type/size badges + name) ------------------------- */
.file-figure {
display: inline-flex;
flex-direction: column;
gap: 4px;
margin: 6px 8px 6px 0;
max-width: min(100%, 640px);
vertical-align: top;
}
.file-preview {
min-width: 128px;
position: relative;
display: inline-block;
max-width: 100%;
}
.file-preview img {
margin: 0 !important;
display: block;
}
.file-badge {
font-size: 10px;
font-weight: 600;
letter-spacing: 0.03em;
line-height: 1;
padding: 3px 6px;
border-radius: 4px;
background: color-mix(in srgb, var(--bg0) 82%, transparent);
color: var(--fg1);
border: 1px solid var(--bg3);
white-space: nowrap;
}
.file-preview .file-badge {
position: absolute;
top: 6px;
pointer-events: none;
backdrop-filter: blur(4px);
}
.file-preview .file-badge.left {
left: 6px;
}
.file-preview .file-badge.right {
right: 6px;
}
.file-figure figcaption {
font-size: 12px;
color: var(--fg3);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 100%;
}
.file-figure figcaption a {
color: inherit;
}
.file-figure.thumb img {
height: 140px;
max-width: 260px;
object-fit: contain;
}
.msg-user .file-figure img {
max-height: 160px;
border-radius: 6px;
}
.user-files {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 6px;
}
.file-chip {
display: inline-flex;
align-items: center;
gap: 6px;
max-width: 100%;
padding: 4px 8px;
border-radius: 6px;
border: 1px solid var(--bg3);
background: var(--bg1);
color: var(--fg1);
font-size: 12px;
text-decoration: none;
white-space: nowrap;
margin: 2px 0;
}
.file-chip:hover {
border-color: var(--accent);
}
.file-chip-name {
overflow: hidden;
text-overflow: ellipsis;
min-width: 0;
}
.file-chip-size {
color: var(--muted);
}
.file-chip .file-badge {
background: var(--bg2);
border: none;
}
.gallery .file-figure { margin: 0; max-width: none; display: flex; }
.nav-icon {
display: inline-block;
width: 1.3em;
margin-right: 6px;
text-align: center;
font-size: 0.95em;
}
.sidebar-foot button {
display: flex;
align-items: center;
justify-content: flex-start;
}