feat: RAG, memory, plugins, lessons, file editor, split panes, Markdown rendering, PWA + UI overhaul
All checks were successful
Stable Release / stable (push) Successful in 1m34s

Major additions:
- RAG pipeline (indexing, chunking, search) with sidebar upload button
- Memory system with CRUD API
- Plugins and lessons modules
- MCP discovery and MCP server
- Advanced skills (auto-create, conditional, improver)
- Agent browser/image support, delegate, sessions
- File editor with CodeMirror in split panes
- Markdown rendering via react-markdown + KaTeX + highlight.js
- Raw markdown toggle
- PWA manifest + service worker
- Extension UI redesign with new design tokens and studio-style chat
- Pipeline API for chat streaming
- Mobile responsive layout

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
This commit is contained in:
Augustin
2026-04-27 21:01:08 +02:00
parent 62c20eb174
commit 4523bbd42c
50 changed files with 11144 additions and 469 deletions

View File

@@ -1313,6 +1313,90 @@ input::placeholder { color: var(--text-disabled); }
color: var(--accent-muted) !important;
}
.config-ai-tools-grid {
/* ── KaTeX overrides ── */
.katex { font-size: 1em; color: var(--text-primary); }
.katex-display { margin: 12px 0; overflow-x: auto; }
/* ── Raw Markdown Toggle ── */
.studio-raw-markdown {
font-family: var(--font-mono);
font-size: 13px;
line-height: 1.5;
color: var(--text-secondary);
white-space: pre-wrap;
word-break: break-word;
background: var(--bg);
padding: 12px 16px;
border-radius: var(--radius);
border: 1px solid var(--border);
}
/* ── ReactMarkdown prose styles ── */
.feed-content > div:not(.studio-code-block):not(.studio-mermaid-container) {
line-height: 1.6;
}
.feed-content h1 { font-size: 20px; font-weight: 800; color: var(--accent); margin: 16px 0 8px; }
.feed-content h2 { font-size: 17px; font-weight: 700; color: var(--text-primary); margin: 12px 0 6px; }
.feed-content h3 { font-size: 15px; font-weight: 700; color: var(--text-primary); margin: 10px 0 4px; }
.feed-content h4 { font-size: 13px; font-weight: 600; color: var(--text-secondary); margin: 8px 0 3px; }
.feed-content h5 { font-size: 12px; font-weight: 600; color: var(--text-tertiary); margin: 6px 0 2px; }
.feed-content h6 { font-size: 11px; font-weight: 600; color: var(--text-tertiary); margin: 6px 0 2px; text-transform: uppercase; }
.feed-content p { margin: 4px 0; }
.feed-content ul { padding-left: 20px; margin: 4px 0; }
.feed-content ol { padding-left: 20px; margin: 4px 0; }
.feed-content li { margin: 2px 0; }
.feed-content blockquote {
border-left: 3px solid var(--accent-dim);
padding: 4px 12px;
margin: 8px 0;
color: var(--text-tertiary);
background: var(--bg-surface);
border-radius: 0 var(--radius) var(--radius) 0;
}
.feed-content hr { border: none; border-top: 1px solid var(--border); margin: 12px 0; }
.feed-content strong { color: var(--accent-light); font-weight: 700; }
.feed-content em { color: var(--text-secondary); }
.feed-content a { color: var(--accent); text-decoration: underline; }
.feed-content img { max-width: 100%; border-radius: var(--radius); }
.feed-content input[type="checkbox"] {
margin-right: 6px;
accent-color: var(--accent);
}
.feed-content del { color: var(--text-disabled); text-decoration: line-through; }
.feed-content sup { font-size: 0.75em; color: var(--text-tertiary); vertical-align: super; }
/* ── highlight.js overrides for dark theme ── */
.hljs { background: var(--bg) !important; color: var(--text-primary) !important; }
.hljs-keyword { color: var(--accent-muted) !important; }
.hljs-string { color: var(--success) !important; }
.hljs-comment { color: var(--text-disabled) !important; font-style: italic; }
.hljs-function { color: var(--accent-light) !important; }
.hljs-number { color: var(--warning) !important; }
/* ── Responsive / Mobile ── */
@media (max-width: 768px) {
:root { --sidebar-w: 100%; --header-h: 46px; }
.header { padding: 0 12px; gap: 8px; }
.header-nav { margin-left: 12px; gap: 2px; }
.nav-tab { padding: 6px 10px; font-size: 12px; }
.header-brand { gap: 6px; }
.header-logo { font-size: 15px; letter-spacing: 2px; }
.studio-feed { padding: 12px 8px; }
.studio-input-area { padding: 8px 8px 4px; }
.feed-item { padding: 6px 8px; }
.feed-avatar { width: 24px; height: 24px; }
.dash-grid { grid-template-columns: 1fr; grid-template-rows: auto; height: auto; overflow: auto; }
.dash-span-2 { grid-column: span 1; }
.grid-2 { grid-template-columns: 1fr; }
.split-horizontal { flex-direction: column; }
.split-right { width: 100%; border-left: none; border-top: 1px solid var(--border); max-height: 300px; }
.shell-ai-col { width: 100%; max-width: 100%; border-left: none; border-top: 1px solid var(--border); max-height: 50vh; }
.config-card-row { flex-wrap: wrap; gap: 8px; }
.config-card-label { width: 100%; }
}
.config-ai-tools-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
@@ -1360,3 +1444,228 @@ input::placeholder { color: var(--text-disabled); }
margin-bottom: 10px;
flex: 1;
}
/* === Split Panes === */
.shell-split-btn {
background: transparent;
border: 1px solid var(--border);
padding: 4px 8px;
border-radius: var(--radius-sm);
color: var(--text-tertiary);
cursor: pointer;
display: flex;
align-items: center;
gap: 4px;
font-size: 12px;
transition: all 0.15s;
}
.shell-split-btn:hover {
background: var(--bg-hover);
border-color: var(--accent-dim);
color: var(--accent);
}
.shell-agent-indicator {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 10px;
background: var(--accent-dim);
color: var(--accent);
font-size: 11px;
font-weight: 600;
animation: agent-pulse 2s ease-in-out infinite;
}
.shell-agent-count {
min-width: 12px;
text-align: center;
}
@keyframes agent-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.6; }
}
.shell-xterm-wrapper.has-splits {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
}
.split-pane-split {
display: flex;
flex: 1;
min-height: 0;
min-width: 0;
}
.split-pane-split.row {
flex-direction: row;
}
.split-pane-split.column {
flex-direction: column;
}
.split-pane-child {
min-height: 0;
min-width: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}
.split-pane-resizer {
flex-shrink: 0;
background: var(--border);
transition: background 0.15s;
z-index: 10;
}
.split-pane-split.row > .split-pane-resizer {
width: 4px;
cursor: col-resize;
}
.split-pane-split.column > .split-pane-resizer {
height: 4px;
cursor: row-resize;
}
.split-pane-resizer:hover,
.split-pane-resizer:active {
background: var(--accent);
}
.split-pane-leaf {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
min-width: 0;
overflow: hidden;
border: 1px solid transparent;
}
.split-pane-leaf.active {
border-color: var(--accent-dim);
}
.split-pane-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 2px 8px;
background: var(--bg-surface);
border-bottom: 1px solid var(--border);
font-size: 11px;
color: var(--text-tertiary);
flex-shrink: 0;
}
.split-pane-title {
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.split-pane-close {
background: transparent;
border: none;
color: var(--text-disabled);
cursor: pointer;
padding: 2px;
display: flex;
align-items: center;
font-size: 10px;
}
.split-pane-close:hover {
color: var(--error);
}
.split-pane-content {
flex: 1;
min-height: 0;
overflow: hidden;
}
.split-pane-leaf.empty {
display: flex;
align-items: center;
justify-content: center;
}
.split-pane-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px;
color: var(--text-disabled);
}
/* === File Editor === */
.file-editor-panel {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
overflow: hidden;
}
.file-editor-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 4px 10px;
background: var(--bg-surface);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.file-editor-title {
font-size: 12px;
font-weight: 600;
color: var(--text-primary);
display: flex;
align-items: center;
gap: 6px;
}
.file-editor-dirty {
color: var(--accent);
font-size: 14px;
}
.file-editor-actions {
display: flex;
align-items: center;
gap: 6px;
}
.file-editor-lang-badge {
font-size: 10px;
padding: 1px 6px;
border-radius: 4px;
background: var(--bg-card);
color: var(--text-tertiary);
text-transform: uppercase;
font-weight: 600;
letter-spacing: 0.5px;
}
.file-editor-body {
flex: 1;
min-height: 0;
overflow: hidden;
}
.file-editor-body .cm-editor {
height: 100%;
}