feat(activity,api,settings): activity panel v0 over conversation events sse

This commit is contained in:
hh
2026-08-28 17:01:02 +02:00
parent 755a475f27
commit a1bf4db905
12 changed files with 1179 additions and 153 deletions
+158
View File
@@ -0,0 +1,158 @@
/* Beaver: activity panel (plain DOM, v0). Theme through Obsidian variables. */
.beaver-activity {
font-size: var(--font-ui-small);
line-height: 1.4;
user-select: text;
}
.beaver-activity-head {
position: sticky;
top: 0;
padding-bottom: var(--size-4-2);
margin-bottom: var(--size-4-2);
border-bottom: 1px solid var(--background-modifier-border);
background: var(--background-primary);
}
.beaver-activity-title {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--size-4-2);
font-weight: var(--font-semibold);
color: var(--text-normal);
}
.beaver-activity-conn {
font-size: var(--font-ui-smaller);
font-weight: var(--font-normal);
color: var(--text-faint);
white-space: nowrap;
}
.beaver-activity-conn::before {
content: "";
display: inline-block;
width: 7px;
height: 7px;
border-radius: 50%;
margin-right: 4px;
background: var(--text-faint);
}
.beaver-activity-conn.is-open::before { background: var(--color-green); }
.beaver-activity-conn.is-connecting::before,
.beaver-activity-conn.is-retrying::before { background: var(--color-yellow); }
.beaver-activity-conn.is-failed::before { background: var(--color-red); }
.beaver-activity-meta {
display: flex;
flex-wrap: wrap;
gap: var(--size-4-1) var(--size-4-2);
color: var(--text-muted);
font-size: var(--font-ui-smaller);
}
.beaver-activity-meta .is-running { color: var(--color-yellow); }
.beaver-activity-meta .is-pending { color: var(--color-orange); }
.beaver-activity-note {
margin-top: var(--size-4-1);
font-size: var(--font-ui-smaller);
color: var(--text-muted);
}
.beaver-activity-note.is-failed { color: var(--color-red); }
.beaver-activity-empty {
color: var(--text-muted);
padding: var(--size-4-2) 0;
}
.beaver-activity-turn {
padding: var(--size-4-2) 0;
border-bottom: 1px solid var(--background-modifier-border);
}
.beaver-activity-turn:last-child { border-bottom: none; }
.beaver-activity-turn-line {
display: flex;
align-items: baseline;
gap: var(--size-4-2);
color: var(--text-muted);
font-size: var(--font-ui-smaller);
}
.beaver-activity-status {
font-weight: var(--font-semibold);
text-transform: uppercase;
letter-spacing: 0.04em;
}
.beaver-activity-turn.is-running .beaver-activity-status { color: var(--color-yellow); }
.beaver-activity-turn.is-done .beaver-activity-status { color: var(--color-green); }
.beaver-activity-turn.is-interrupted .beaver-activity-status { color: var(--color-orange); }
.beaver-activity-turn.is-error .beaver-activity-status { color: var(--color-red); }
.beaver-activity-duration { margin-left: auto; color: var(--text-faint); white-space: nowrap; }
.beaver-activity-usage {
color: var(--text-faint);
font-size: var(--font-ui-smaller);
font-variant-numeric: tabular-nums;
}
.beaver-activity-say {
display: flex;
gap: var(--size-4-1);
margin-top: var(--size-4-1);
color: var(--text-normal);
}
.beaver-activity-icon svg { width: 14px; height: 14px; vertical-align: -2px; }
.beaver-activity-tree { margin-top: var(--size-4-1); }
.beaver-activity-tool-row {
display: flex;
align-items: baseline;
gap: var(--size-4-1);
padding: 1px 0;
cursor: pointer;
min-width: 0;
}
.beaver-activity-tool-row:hover { background: var(--background-modifier-hover); }
.beaver-activity-dot {
flex: none;
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--text-faint);
align-self: center;
}
.beaver-activity-tool.is-running > .beaver-activity-tool-row .beaver-activity-dot {
background: var(--color-yellow);
animation: beaver-activity-pulse 1.2s ease-in-out infinite;
}
.beaver-activity-tool.is-done > .beaver-activity-tool-row .beaver-activity-dot { background: var(--color-green); }
.beaver-activity-tool.is-error > .beaver-activity-tool-row .beaver-activity-dot { background: var(--color-red); }
.beaver-activity-tool.is-aborted > .beaver-activity-tool-row .beaver-activity-dot { background: var(--color-orange); }
@keyframes beaver-activity-pulse {
50% { opacity: 0.3; }
}
.beaver-activity-tool-name {
flex: none;
font-family: var(--font-monospace);
font-size: var(--font-ui-smaller);
color: var(--text-normal);
}
.beaver-activity-tool-summary {
flex: 1 1 auto;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--text-muted);
}
.beaver-activity-tool-details pre {
margin: var(--size-4-1) 0 var(--size-4-1) 12px;
padding: var(--size-4-1) var(--size-4-2);
max-height: 240px;
overflow: auto;
font-size: var(--font-ui-smaller);
white-space: pre-wrap;
word-break: break-word;
background: var(--background-secondary);
border-radius: var(--radius-s);
}
.beaver-activity-tool-details pre.is-result { border-left: 2px solid var(--color-green); }
.beaver-activity-tool.is-error > .beaver-activity-tool-details pre.is-result { border-left-color: var(--color-red); }
.beaver-activity-children {
margin-left: 12px;
padding-left: var(--size-4-2);
border-left: 1px solid var(--background-modifier-border);
}