Phase 1: Activity and Error Log for Agent Tab

Backend: _log_agent_activity, _get_activity_log, _get_error_log. API: GET /api/agents/{id}/activity and /errors. Frontend: Activity and Errors tabs in agent detail overlay. CSS: activity-event-row, error-event-row. Config fix: Z.ai API key.
This commit is contained in:
Rose
2026-04-20 13:28:37 +02:00
parent 96977b576a
commit fbf79362a4
6 changed files with 1652 additions and 104 deletions

View File

@@ -1087,6 +1087,23 @@ body.resizing{user-select:none;cursor:col-resize;}
.settings-action-btn:hover{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.18);}
.settings-action-btn.danger{color:var(--accent);border-color:rgba(233,69,96,.25);}
.settings-action-btn.danger:hover{background:rgba(233,69,96,.08);border-color:rgba(233,69,96,.4);}
.logs-viewer{display:grid;grid-template-columns:200px minmax(0,1fr);gap:0;height:420px;border:1px solid var(--border2);border-radius:8px;overflow:hidden;margin-top:8px;}
.logs-sidebar{background:var(--code-bg);border-right:1px solid var(--border);overflow-y:auto;padding:8px 0;}
.logs-sidebar-item{display:flex;flex-direction:column;gap:2px;padding:8px 12px;cursor:pointer;border-left:3px solid transparent;transition:background .1s,border-color .1s;}
.logs-sidebar-item:hover{background:rgba(255,255,255,.05);}
.logs-sidebar-item.active{background:rgba(124,185,255,.1);border-left-color:var(--accent);}
.logs-sidebar-item.missing{opacity:.4;}
.logs-sidebar-name{font-size:12px;font-weight:600;color:var(--text);}
.logs-sidebar-meta{font-size:10px;color:var(--muted);}
.logs-content{display:flex;flex-direction:column;min-height:0;}
.logs-toolbar{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;border-bottom:1px solid var(--border);background:rgba(255,255,255,.02);gap:8px;}
.logs-toolbar-right{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.logs-filename{font-size:12px;font-weight:600;color:var(--text);}
.logs-pre{flex:1;overflow:auto;margin:0;padding:12px;font-family:'Fira Code','Cascadia Code',Monaco,monospace;font-size:11px;line-height:1.6;color:var(--text);background:var(--code-bg);white-space:pre-wrap;word-break:break-all;}
.logs-footer{display:flex;align-items:center;gap:8px;}
.log-level-btn{background:transparent;border:1px solid var(--border2);border-radius:4px;padding:2px 6px;font-size:10px;font-weight:700;cursor:pointer;color:var(--muted);transition:all .1s;}
.log-level-btn:hover,.log-level-btn.active{background:rgba(255,255,255,.08);color:var(--text);}
.settings-action-btn:disabled,.settings-action-btn.disabled{opacity:.45;cursor:not-allowed;}
.settings-action-btn:disabled:hover,.settings-action-btn.disabled:hover{background:var(--input-bg);border-color:var(--border2);}
.settings-field{margin-bottom:16px;}
@@ -1280,3 +1297,336 @@ body.resizing{user-select:none;cursor:col-resize;}
word-break: break-word;
white-space: pre-wrap;
}
/* ── Agent Detail Overlay ── */
.agent-detail-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px;
border-bottom: 1px solid var(--border);
gap: 12px;
}
.agent-detail-title {
display: flex;
align-items: center;
gap: 12px;
min-width: 0;
}
.agent-detail-status {
padding: 10px 16px;
border-bottom: 1px solid var(--border);
display: flex;
flex-direction: column;
gap: 3px;
}
.agent-status-row {
display: flex;
align-items: center;
gap: 6px;
}
.agent-status-dot.lg {
width: 10px;
height: 10px;
}
/* Toggle switch */
.agent-toggle-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 16px;
border-bottom: 1px solid var(--border);
}
.agent-toggle-btn {
width: 38px;
height: 20px;
border-radius: 10px;
background: var(--border);
border: none;
position: relative;
cursor: pointer;
transition: background 0.2s;
flex-shrink: 0;
}
.agent-toggle-btn.on {
background: var(--accent);
}
.agent-toggle-knob {
position: absolute;
top: 2px;
left: 2px;
width: 16px;
height: 16px;
border-radius: 50%;
background: white;
transition: transform 0.2s;
display: block;
}
.agent-toggle-btn.on .agent-toggle-knob {
transform: translateX(18px);
}
/* Actions bar */
.agent-detail-actions {
padding: 10px 16px;
border-bottom: 1px solid var(--border);
display: flex;
gap: 8px;
}
.agent-action-btn {
padding: 6px 14px;
border-radius: 8px;
border: 1px solid var(--border);
background: rgba(255,255,255,.04);
color: var(--text);
font-size: 12px;
cursor: pointer;
transition: background 0.15s, border-color 0.15s;
}
.agent-action-btn:hover {
background: rgba(255,255,255,.08);
border-color: var(--accent);
}
.agent-action-btn.primary {
background: rgba(var(--accent-rgb, 80,200,180), .15);
border-color: var(--accent);
color: var(--accent);
}
/* Tabs */
.agent-tabs {
display: flex;
border-bottom: 1px solid var(--border);
padding: 0 16px;
gap: 2px;
}
.agent-tab {
padding: 8px 14px;
background: none;
border: none;
border-bottom: 2px solid transparent;
color: var(--muted);
font-size: 11px;
font-weight: 500;
cursor: pointer;
transition: color 0.15s, border-color 0.15s;
display: flex;
align-items: center;
gap: 4px;
}
.agent-tab:hover {
color: var(--text);
}
.agent-tab.active {
color: var(--accent);
border-bottom-color: var(--accent);
}
/* Tab content */
.agent-tab-content {
overflow-y: auto;
max-height: calc(100vh - 420px);
min-height: 120px;
}
/* Overview tab */
.agent-overview {
padding: 4px 0;
}
.agent-info-row {
display: flex;
align-items: center;
padding: 7px 16px;
border-bottom: 1px solid rgba(255,255,255,.04);
gap: 12px;
}
.agent-info-row:last-child {
border-bottom: none;
}
.agent-info-label {
font-size: 10px;
font-weight: 600;
color: var(--muted);
text-transform: uppercase;
letter-spacing: .5px;
min-width: 80px;
flex-shrink: 0;
}
/* soul/memory editor */
.agent-edit-btn {
float: right;
background: rgba(255,255,255,.06);
border: 1px solid var(--border);
border-radius: 6px;
padding: 3px 8px;
color: var(--muted);
font-size: 10px;
cursor: pointer;
margin: 12px 16px 0 0;
}
.agent-edit-btn:hover {
border-color: var(--accent);
color: var(--accent);
}
.agent-md-content {
padding: 12px 16px;
font-size: 12px;
line-height: 1.7;
color: var(--text);
clear: right;
}
.agent-md-content h2 {
font-size: 15px;
font-weight: 700;
margin: 14px 0 6px;
color: var(--text);
}
.agent-md-content h3 {
font-size: 13px;
font-weight: 700;
margin: 10px 0 4px;
}
.agent-md-content h4 {
font-size: 12px;
font-weight: 700;
margin: 8px 0 4px;
}
.agent-md-content p {
margin: 6px 0;
}
.agent-md-content li {
margin: 3px 0 3px 14px;
}
/* Badges */
.agent-tier-badge {
font-size: 8px;
font-weight: 700;
padding: 1px 5px;
border-radius: 4px;
letter-spacing: .3px;
}
.agent-tier-badge.tier-1 {
background: rgba(255,182,193,.2);
color: #ffb6c1;
border: 1px solid rgba(255,182,193,.3);
}
.agent-tier-badge.tier-2 {
background: rgba(255,255,255,.06);
color: var(--muted);
border: 1px solid var(--border);
}
.agent-inbox-badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 18px;
height: 18px;
border-radius: 9px;
background: #ff5722;
color: white;
font-size: 9px;
font-weight: 700;
padding: 0 5px;
}
.agent-inbox-badge.sm {
min-width: 15px;
height: 15px;
border-radius: 7px;
font-size: 8px;
}
/* Inbox tab */
.inbox-messages-list {
overflow-y: auto;
max-height: calc(100vh - 480px);
}
.inbox-msg {
padding: 10px 16px;
border-bottom: 1px solid var(--border);
cursor: pointer;
transition: background 0.1s;
}
.inbox-msg:hover {
background: rgba(255,255,255,.02);
}
.inbox-msg.unread {
background: rgba(255,152,0,.05);
border-left: 2px solid #ff9800;
}
.inbox-msg.unread:hover {
background: rgba(255,152,0,.08);
}
.inbox-msg-header {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 3px;
}
.inbox-msg-subject {
font-size: 11px;
font-weight: 600;
color: var(--text);
margin-bottom: 2px;
}
.inbox-msg-body {
font-size: 10px;
color: var(--muted);
line-height: 1.5;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.inbox-msg.expanded .inbox-msg-body {
-webkit-line-clamp: unset;
}
.inbox-msg-actions {
margin-top: 6px;
}
.activity-list {
padding: 8px;
display: flex;
flex-direction: column;
gap: 4px;
}
.activity-event-row {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 8px 10px;
border-radius: 8px;
background: var(--card-bg);
border: 1px solid var(--border);
transition: background 0.15s;
}
.activity-event-row:hover {
background: var(--row-hover);
}
.error-list {
padding: 8px;
display: flex;
flex-direction: column;
gap: 4px;
}
.error-event-row {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 8px 10px;
border-radius: 8px;
background: rgba(244, 67, 54, 0.05);
border: 1px solid rgba(244, 67, 54, 0.2);
transition: background 0.15s;
}
.error-event-row:hover {
background: rgba(244, 67, 54, 0.1);
}