This commit is contained in:
@@ -92,6 +92,21 @@ export default function Dashboard({ api, refreshRef }) {
|
|||||||
const minimax = (quota || []).find(p => p.name === 'minimax')
|
const minimax = (quota || []).find(p => p.name === 'minimax')
|
||||||
const zai = (quota || []).find(p => p.name === 'zai')
|
const zai = (quota || []).find(p => p.name === 'zai')
|
||||||
|
|
||||||
|
const EXCLUDE_CMDS = ['ls', 'cd', 'pwd', 'clear', 'exit', 'history']
|
||||||
|
|
||||||
|
const topCmds = (() => {
|
||||||
|
const counts = {}
|
||||||
|
for (const c of recentCmds) {
|
||||||
|
const base = c.cmd.split(/\s+/)[0]
|
||||||
|
if (EXCLUDE_CMDS.includes(base) || !base) continue
|
||||||
|
counts[base] = (counts[base] || 0) + 1
|
||||||
|
}
|
||||||
|
return Object.entries(counts)
|
||||||
|
.sort((a, b) => b[1] - a[1])
|
||||||
|
.slice(0, 5)
|
||||||
|
.map(([cmd, count]) => ({ cmd, count }))
|
||||||
|
})()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="dash-grid">
|
<div className="dash-grid">
|
||||||
{/* CPU */}
|
{/* CPU */}
|
||||||
@@ -175,6 +190,16 @@ export default function Dashboard({ api, refreshRef }) {
|
|||||||
<div className="dash-card-head">
|
<div className="dash-card-head">
|
||||||
<span className="dash-label">Recent Commands</span>
|
<span className="dash-label">Recent Commands</span>
|
||||||
</div>
|
</div>
|
||||||
|
{topCmds.length > 0 && (
|
||||||
|
<div className="dash-cmd-top">
|
||||||
|
{topCmds.map((c, i) => (
|
||||||
|
<div key={i} className="dash-cmd-chip" onClick={() => navigator.clipboard.writeText(c.cmd)} title="Copier">
|
||||||
|
<span className="dash-cmd-chip-name">{c.cmd}</span>
|
||||||
|
<span className="dash-cmd-chip-count">{c.count}×</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
<div className="dash-cmd-list">
|
<div className="dash-cmd-list">
|
||||||
{recentCmds.length === 0 && <span className="dash-empty">No history</span>}
|
{recentCmds.length === 0 && <span className="dash-empty">No history</span>}
|
||||||
{recentCmds.map((c, i) => (
|
{recentCmds.map((c, i) => (
|
||||||
|
|||||||
@@ -686,6 +686,17 @@ input::placeholder { color: var(--text-disabled); }
|
|||||||
flex: 1; min-width: 0;
|
flex: 1; min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dash-cmd-top { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
|
||||||
|
.dash-cmd-chip {
|
||||||
|
display: flex; align-items: center; gap: 6px;
|
||||||
|
padding: 6px 12px; border-radius: var(--radius);
|
||||||
|
background: var(--bg-surface); border: 1px solid var(--border);
|
||||||
|
cursor: pointer; transition: all 0.15s;
|
||||||
|
}
|
||||||
|
.dash-cmd-chip:hover { border-color: var(--accent-dim); background: var(--accent-bg); }
|
||||||
|
.dash-cmd-chip-name { font-size: 13px; font-weight: 700; font-family: var(--font-mono); color: var(--text-primary); }
|
||||||
|
.dash-cmd-chip-count { font-size: 10px; font-family: var(--font-mono); color: var(--accent); }
|
||||||
|
|
||||||
/* Services */
|
/* Services */
|
||||||
.dash-services { display: flex; flex-direction: column; gap: 6px; }
|
.dash-services { display: flex; flex-direction: column; gap: 6px; }
|
||||||
.dash-svc-row {
|
.dash-svc-row {
|
||||||
|
|||||||
Reference in New Issue
Block a user