Add ephemeral Control UI Activity tab#86059
Conversation
|
Codex review: needs changes before merge. Reviewed May 25, 2026, 12:19 AM ET / 04:19 UTC. Summary PR surface: Source +2273, Tests +274, Docs +9. Total +2556 across 76 files. Reproducibility: yes. source inspection gives a high-confidence reproduction path: emit a Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Copy recommended automerge instructionNext step before merge Security Review findings
Review detailsBest possible solution: Keep the ephemeral Activity tab design, but harden preview redaction and regression coverage for common secret formats before merging the user-visible feature. Do we have a high-confidence way to reproduce the issue? Yes, source inspection gives a high-confidence reproduction path: emit a Is this the best way to solve the issue? No, not yet; reusing Full review comments:
Overall correctness: patch is incorrect Codex review notes: model gpt-5.5, reasoning high; reviewed against deb54b5dab08. Label changesLabel justifications:
Evidence reviewedPR surface: Source +2273, Tests +274, Docs +9. Total +2556 across 76 files. View PR surface stats
Security concerns:
Acceptance criteria:
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
9e73098 to
812ec39
Compare
There was a problem hiding this comment.
Pull request overview
Adds a new Control UI Activity tab (/activity) that shows an ephemeral, browser-local stream of tool activity derived from existing session.tool events, with redaction/truncation to avoid persisting raw tool args/results in Activity state.
Changes:
- Introduces an Activity view + model (bounded in-memory entries, redacted output previews, filters, expand/collapse, auto-follow scrolling).
- Wires Activity into Control UI navigation/rendering/lifecycle + tool-event handling (reusing existing tool stream path).
- Updates tests, styles, docs, changelog, and Control UI i18n bundles/metadata.
Reviewed changes
Copilot reviewed 74 out of 74 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| ui/src/ui/views/activity.ts | New Activity tab UI (filters, list rendering, expand/collapse, durations). |
| ui/src/ui/navigation.ts | Adds activity tab to Control group, paths, and icon mapping. |
| ui/src/ui/navigation.test.ts | Updates navigation unit tests for the new tab. |
| ui/src/ui/icons.ts | Adds an activity SVG icon. |
| ui/src/ui/app.ts | Adds Activity state + scroll handlers to the main app element. |
| ui/src/ui/app-view-state.ts | Extends AppViewState with Activity state + handlers. |
| ui/src/ui/app-tool-stream.ts | Updates tool event handling to also update Activity entries. |
| ui/src/ui/app-tool-stream.node.test.ts | Adds tests ensuring Activity summaries don’t store raw args and previews are redacted/truncated; validates bounded list. |
| ui/src/ui/app-settings.ts | Adds an activity case to tab refresh routing (no-op). |
| ui/src/ui/app-scroll.ts | Adds Activity scroll scheduling + scroll-state tracking. |
| ui/src/ui/app-render.ts | Lazy-loads and renders Activity tab; wires UI callbacks to state. |
| ui/src/ui/app-render.helpers.ts | Resets Activity state on session switch. |
| ui/src/ui/app-lifecycle.ts | Cancels Activity scroll frames on disconnect; schedules auto-follow on updates. |
| ui/src/ui/app-gateway.node.test.ts | Extends gateway tests to assert Activity updates from session.tool delivery. |
| ui/src/ui/activity-model.ts | New Activity entry model: redaction, preview building, ring buffer, tool-event projection. |
| ui/src/styles/activity.css | New styles for Activity page/stream. |
| ui/src/styles.css | Imports Activity styles into global UI styles. |
| ui/src/i18n/locales/en.ts | Adds Activity translation keys (source). |
| ui/src/i18n/locales/ar.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/de.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/es.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/fa.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/fr.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/id.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/it.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/ja-JP.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/ko.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/nl.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/pl.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/pt-BR.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/th.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/tr.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/uk.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/vi.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/zh-CN.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/locales/zh-TW.ts | Adds Activity keys (some untranslated / fallback). |
| ui/src/i18n/.i18n/ar.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/de.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/es.tm.jsonl | Updates translation memory entries for Activity keys. |
| ui/src/i18n/.i18n/es.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/fa.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/fr.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/id.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/it.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/ja-JP.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/ko.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/nl.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/pl.tm.jsonl | Updates translation memory entries for Activity keys. |
| ui/src/i18n/.i18n/pl.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/pt-BR.tm.jsonl | Updates translation memory entries for Activity keys. |
| ui/src/i18n/.i18n/pt-BR.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/th.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/tr.tm.jsonl | Updates translation memory entries for Activity keys. |
| ui/src/i18n/.i18n/tr.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/uk.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/vi.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/zh-CN.tm.jsonl | Updates translation memory entries for Activity keys. |
| ui/src/i18n/.i18n/zh-CN.meta.json | Updates generated i18n metadata for new keys. |
| ui/src/i18n/.i18n/zh-TW.tm.jsonl | Updates translation memory entries for Activity keys. |
| ui/src/i18n/.i18n/zh-TW.meta.json | Updates generated i18n metadata for new keys. |
| docs/web/control-ui.md | Documents the new Activity tab behavior and privacy properties. |
| CHANGELOG.md | Adds a changelog entry for the new Activity tab and adjusts formatting. |
812ec39 to
9799716
Compare
|
ClawSweeper PR egg 🔥 Warming up: real-behavior proof passed; findings, security review, or rank-up moves are still in progress. Hatch commandComment Hatchability rules:
What is this egg doing here?
|
|
Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details. Warning Firewall rules blocked me from connecting to one or more addresses (expand for details)I tried to connect to the following addresses, but was blocked by firewall rules:
If you need me to access, download, or install something from one of these locations, you can either:
|
|
Maintainer verification before merge:
|
Summary
/activityunder the Control nav group.session.tool/ tool-event path without adding a new Gateway event family, SSE endpoint, protocol version, TUI pane, observer stream, verbose setting, or durable store.Fixes #12831.
Follow-ups intentionally left open as distinct scope: #54577 timeline CLI/export, #37816 Telegram durable activity, and #47386 WebChat summary mode.
Verification
pnpm ui:i18n:syncgit diff --checknode scripts/run-vitest.mjs ui/src/ui/app-tool-stream.node.test.ts ui/src/ui/app-gateway.node.test.ts ui/src/ui/chat/build-chat-items.test.ts ui/src/ui/views/chat.test.ts ui/src/ui/navigation.test.ts src/gateway/server-chat.agent-events.test.ts src/gateway/server-methods/chat.directive-tags.test.tsnode scripts/run-vitest.mjs ui/src/ui/navigation-groups.test.ts ui/src/ui/navigation.test.ts ui/src/ui/app-tool-stream.node.test.ts ui/src/ui/app-scroll.test.tssession.toolevent; verified the Activity tab rendered one event, argument values stayed hidden, and output showed redacted/truncated preview text without the raw command, token, or path.node scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox --blacksmith-workflow .github/workflows/ci-check-testbox.yml --blacksmith-job check --shell -- "pnpm check:changed"(tbx_01ksd3qkr8ydn75jfttp6hvkpd, https://github.com/openclaw/openclaw/actions/runs/26362948981)node scripts/run-vitest.mjs ui/src/ui/views/activity.test.ts ui/src/ui/app-tool-stream.node.test.ts ui/src/ui/app-gateway.node.test.ts ui/src/ui/navigation.test.ts ui/src/ui/navigation-groups.test.ts ui/src/ui/app-scroll.test.ts(131 tests), targeted oxlint, desktop/mobile Playwright smoke for Activity layout, semantic list labels, mobile disclosure chevron, and no horizontal overflow.node scripts/run-vitest.mjs ui/src/ui/views/activity.test.ts ui/src/ui/app-tool-stream.node.test.ts ui/src/ui/app-gateway.node.test.ts ui/src/ui/navigation.test.ts ui/src/ui/navigation-groups.test.ts ui/src/ui/app-scroll.test.ts(132 tests), targeted oxlint,git diff --check, and desktop/mobile Playwright smoke confirmed the shell is the only Activity heading, toolbar count remains visible, list semantics remain intact, and mobile has no horizontal overflow.node scripts/crabbox-wrapper.mjs run --provider blacksmith-testbox --blacksmith-workflow .github/workflows/ci-check-testbox.yml --blacksmith-job check --shell -- "pnpm check:changed"(tbx_01ksen33c79b8rywayf6cxww4r, https://github.com/openclaw/openclaw/actions/runs/26382677304)Real behavior proof
Behavior addressed: Control UI now exposes an ephemeral Activity tab that observes live tool activity from the existing
session.tool/ tool-event delivery while keeping Chat tool-call hiding independent from the sanitized Activity summaries.Real environment tested: Local Vite Control UI in a browser connected to a local fake Gateway WebSocket that emitted the client
session.tooldelivery shape; Blacksmith Testbox ran the repo changed-check lane on the rebased pushed diff.Exact steps or command run after this patch: Started
pnpm --dir ui dev, connected/activity?gatewayUrl=ws://127.0.0.1:18889#token=smoke, emitted a livesession.toolevent with argument fields plus sensitive-looking output, exercised the Activity filters/disclosure controls/scroll area, ran the focused Vitest commands above, regenerated i18n, rangit diff --check, and ran Testboxpnpm check:changed.Evidence after fix: The Activity tab displayed the live tool event as a sanitized row with hidden argument count and redacted preview (
Authorization: [redacted] file=[redacted path] ok); no raw command, token, absolute path, args JSON, or full result was visible in the Activity UI or stored in Activity state by the new model tests.Observed result after fix: Activity survives in-app navigation through browser memory, resets on session switch and reload by design, supports Clear, filtering, expand/collapse, and scroll auto-follow, and leaves #54577, #37816, and #47386 as separate follow-up tracks.
What was not tested: A real production Gateway session with real user tool calls was not used; the browser smoke used a local fake Gateway event with the same Control UI
session.tooldelivery shape.