Skip to content

Commit 3dd0e8e

Browse files
authored
feat(ui): add ephemeral Activity tab
Fixes #12831. Adds a Control UI Activity tab at `/activity` under the Control nav group. The tab derives browser-local, memory-only activity entries from the existing `session.tool` / tool-event delivery path and stores only sanitized summaries, hidden-argument counts, and redacted/truncated output previews. Includes filtering, tool selection, clear, expand/collapse, keyboard-native disclosure rows, auto-follow scrolling, navigation/i18n/docs/changelog coverage, and focused regression tests. Follow-up tracks #54577, #37816, and #47386 remain distinct and open. Verification: - `pnpm ui:i18n:sync` - `git diff --check` - Focused Vitest coverage for Activity, gateway/tool stream, chat item rendering, navigation, and gateway agent events - Desktop/mobile browser smoke for sanitized Activity rendering and header de-duplication - Testbox `pnpm check:changed`: `tbx_01ksen33c79b8rywayf6cxww4r` Thanks @BunsDev.
1 parent a5d5604 commit 3dd0e8e

76 files changed

Lines changed: 2650 additions & 94 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Docs: https://docs.openclaw.ai
66

77
### Changes
88

9+
- Control UI: add an ephemeral Activity tab for sanitized live tool activity summaries without persisting raw telemetry. Fixes #12831. Thanks @BunsDev.
10+
911
### Fixes
1012

1113
- Agents/commitments: serialize commitment store load-modify-save writes so concurrent heartbeat and CLI updates no longer lose dismissal, sent, or attempt state. (#81153) Thanks @ai-hpc.

docs/web/control-ui.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
summary: "Browser-based control UI for the Gateway (chat, nodes, config)"
2+
summary: "Browser-based control UI for the Gateway (chat, activity, nodes, config)"
33
read_when:
44
- You want to operate the Gateway from a browser
55
- You want Tailnet access without SSH tunnels
@@ -103,6 +103,7 @@ Imported themes are stored only in the current browser profile. They are not wri
103103
- Chat history refreshes request a bounded recent window with per-message text caps so large sessions do not force the browser to render a full transcript payload before the chat becomes usable.
104104
- Talk through browser realtime sessions. OpenAI uses direct WebRTC, Google Live uses a constrained one-use browser token over WebSocket, and backend-only realtime voice plugins use the Gateway relay transport. Client-owned provider sessions start with `talk.client.create`; Gateway relay sessions start with `talk.session.create`. The relay keeps provider credentials on the Gateway while the browser streams microphone PCM through `talk.session.appendAudio`, forwards `openclaw_agent_consult` provider tool calls through `talk.client.toolCall` for Gateway policy and the larger configured OpenClaw model, and routes active-run voice steering through `talk.client.steer` or `talk.session.steer`.
105105
- Stream tool calls + live tool output cards in Chat (agent events).
106+
- Activity tab with browser-local, redaction-first summaries of live tool activity from existing `session.tool` / tool event delivery.
106107

107108
</Accordion>
108109
<Accordion title="Channels, instances, sessions, dreams">
@@ -152,6 +153,12 @@ Imported themes are stored only in the current browser profile. They are not wri
152153
</Accordion>
153154
</AccordionGroup>
154155

156+
## Activity tab
157+
158+
The Activity tab is an ephemeral browser-local observer for live tool activity. It is derived from the same Gateway `session.tool` / tool event stream that powers Chat tool cards; it does not add another Gateway event family, endpoint, durable activity store, metrics feed, or external observer stream.
159+
160+
Activity entries keep only sanitized summaries and redacted, truncated output previews. Tool argument values are not stored in Activity state; the UI shows that arguments are hidden and records only the argument field count. The in-memory list follows the current browser tab, survives navigation within the Control UI, and resets on page reload, session switch, or **Clear**.
161+
155162
## Chat behavior
156163

157164
<AccordionGroup>

ui/src/i18n/.i18n/ar.meta.json

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,36 @@
11
{
2-
"fallbackKeys": [],
3-
"generatedAt": "2026-05-23T05:40:09.583Z",
2+
"fallbackKeys": [
3+
"activity.allTools",
4+
"activity.argumentHiddenOne",
5+
"activity.argumentsHidden",
6+
"activity.autoFollow",
7+
"activity.collapseAll",
8+
"activity.duration.minutes",
9+
"activity.duration.ms",
10+
"activity.duration.seconds",
11+
"activity.empty",
12+
"activity.emptyFiltered",
13+
"activity.entrySummary",
14+
"activity.expandAll",
15+
"activity.filtersLabel",
16+
"activity.noOutputPreview",
17+
"activity.outputTruncated",
18+
"activity.searchPlaceholder",
19+
"activity.statusFilters",
20+
"activity.streamLabel",
21+
"activity.subtitle",
22+
"activity.title",
23+
"activity.toolCallId",
24+
"activity.visibleCount",
25+
"subtitles.activity",
26+
"tabs.activity"
27+
],
28+
"generatedAt": "2026-05-25T03:52:18.827Z",
429
"locale": "ar",
530
"model": "claude-opus-4-7",
631
"provider": "anthropic",
7-
"sourceHash": "2e6cfef7fe4490f7f524e448706ee7bfb8441ff88e1c79f479b7521f0db6e7cb",
8-
"totalKeys": 1122,
9-
"translatedKeys": 1122,
32+
"sourceHash": "e760668abcba0b56572e1f4772f221e2716a7f39bc7f91669fd3c3db0210f593",
33+
"totalKeys": 1154,
34+
"translatedKeys": 1130,
1035
"workflow": 1
1136
}

ui/src/i18n/.i18n/ar.tm.jsonl

Lines changed: 8 additions & 0 deletions
Large diffs are not rendered by default.

ui/src/i18n/.i18n/de.meta.json

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,36 @@
11
{
2-
"fallbackKeys": [],
3-
"generatedAt": "2026-05-23T05:38:58.326Z",
2+
"fallbackKeys": [
3+
"activity.allTools",
4+
"activity.argumentHiddenOne",
5+
"activity.argumentsHidden",
6+
"activity.autoFollow",
7+
"activity.collapseAll",
8+
"activity.duration.minutes",
9+
"activity.duration.ms",
10+
"activity.duration.seconds",
11+
"activity.empty",
12+
"activity.emptyFiltered",
13+
"activity.entrySummary",
14+
"activity.expandAll",
15+
"activity.filtersLabel",
16+
"activity.noOutputPreview",
17+
"activity.outputTruncated",
18+
"activity.searchPlaceholder",
19+
"activity.statusFilters",
20+
"activity.streamLabel",
21+
"activity.subtitle",
22+
"activity.title",
23+
"activity.toolCallId",
24+
"activity.visibleCount",
25+
"subtitles.activity",
26+
"tabs.activity"
27+
],
28+
"generatedAt": "2026-05-25T03:52:17.364Z",
429
"locale": "de",
530
"model": "claude-opus-4-7",
631
"provider": "anthropic",
7-
"sourceHash": "2e6cfef7fe4490f7f524e448706ee7bfb8441ff88e1c79f479b7521f0db6e7cb",
8-
"totalKeys": 1122,
9-
"translatedKeys": 1122,
32+
"sourceHash": "e760668abcba0b56572e1f4772f221e2716a7f39bc7f91669fd3c3db0210f593",
33+
"totalKeys": 1154,
34+
"translatedKeys": 1130,
1035
"workflow": 1
1136
}

0 commit comments

Comments
 (0)