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
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:
@@ -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%;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user