Skip to content

feat(workspaces): show agent status and custom-widget decisions#101826

Merged
steipete merged 9 commits into
openclaw:mainfrom
100yenadmin:feat/dashboard-ops-widgets
Jul 17, 2026
Merged

feat(workspaces): show agent status and custom-widget decisions#101826
steipete merged 9 commits into
openclaw:mainfrom
100yenadmin:feat/dashboard-ops-widgets

Conversation

@100yenadmin

@100yenadmin 100yenadmin commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

Workspaces lacked a compact way to see current agent activity and decide pending custom-widget code without leaving the workspace tab.

Why This Change Was Made

This adds two narrowly owned built-ins: builtin:agent-status renders bounded Busy/Idle rows from sessions.list, and builtin:custom-widget-approvals renders only pending entries from the Workspaces custom-widget registry. This is not a general approval center: it does not expose exec, plugin, system-agent, or other approval classes. Decision controls require operator.approvals and stay disabled until authenticated scope is known.

Session events refresh only sessions.list bindings; unrelated workspace data stays cached. Custom-widget decisions remain locked until the refreshed registry confirms the transition, preventing duplicate or opposite submissions.

Exact-head CI also exposed a latest-main declaration drift in the release checklist helper. The included declaration-only repair matches the existing runtime export and restores the repository-wide test-type gate.

User Impact

Operators can monitor bounded agent status and approve or reject pending custom workspace widgets from accessible controls. Connections without approval scope retain read-only visibility. English source strings are included; the repository's isolated locale-refresh workflow owns generated translations after merge.

Evidence

@100yenadmin
100yenadmin requested a review from a team as a code owner July 7, 2026 17:09
@100yenadmin

Copy link
Copy Markdown
Contributor Author

On the dependency-guard check: stacked on the not-yet-merged Wave 1 (#101098), so the cumulative diff inherits Wave 1's single new-plugin pnpm-lock.yaml importer entry. This PR adds no new dependency. Verified green locally by the submitting orchestrator (not just agent-reported): extensions/dashboard 79 tests, UI dashboard 100 tests, ui:i18n:check clean, pnpm ui:build, full type-aware oxlint.

@chatgpt-codex-connector

Copy link
Copy Markdown
Contributor

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@openclaw-barnacle openclaw-barnacle Bot added the app: web-ui App: web-ui label Jul 7, 2026
@github-actions github-actions Bot added the dependencies-changed PR changes dependency-related files label Jul 7, 2026
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Dependency graph guard cleared

This PR no longer has blocked dependency graph changes. A future dependency graph change requires a fresh /allow-dependencies-change comment after the guard blocks that new head SHA.

  • Current SHA: ac170b37510663c8ce5ec68033049fddc7299dd7

@clawsweeper

clawsweeper Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 13, 2026, 8:36 AM ET / 12:36 UTC.

Summary
The PR adds Workspaces agent-status and pending custom-widget approval widgets with UI rendering, approval decision wiring, English strings, styles, schema registration, and focused tests.

PR surface: Source +267, Tests +86. Total +353 across 10 files.

Reproducibility: yes. at source level: mount the agent-status built-in, change a session's active-run state without changing the workspace, and the PR adds no session-event subscription or refetch path to update the rendered snapshot. A real browser reproduction has not been supplied.

Review metrics: 1 noteworthy metric.

  • Built-in widget schema surface: 2 added. Both identifiers become accepted Workspaces document kinds, so their data freshness and authority contracts should be settled before merge.

Merge readiness
Overall: 🧂 unranked krab
Proof: 🧂 unranked krab
Patch quality: 🦐 gold shrimp
Result: blocked until real behavior proof from a real setup is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P1] Subscribe or refetch session-backed widget values on canonical session activity changes and add transition coverage.
  • Obtain the Workspaces owner's decision on composable approval controls and complete generated locale synchronization.
  • [P1] Post redacted browser proof of an actual status transition and successful authorized approve/reject flow.

Proof guidance:

  • [P1] Needs real behavior proof before merge: The PR supplies focused tests and CI but no after-fix browser evidence showing a real Busy/Idle transition and an authorized approve/reject flow; add a redacted recording or screenshots with live diagnostics, update the PR body to trigger review, and ask a maintainer for @clawsweeper re-review if it does not retrigger automatically.

Risk before merge

  • [P1] Agent-status rows can remain stale after a run starts or finishes, causing operators to act on an outdated session-state projection.
  • [P1] Allowing agent-composable layouts to place privileged custom-widget approval controls changes where operators encounter a security-sensitive decision and needs explicit ownership approval.

Maintainer options:

  1. Finish the bounded design before merge (recommended)
    Add canonical session-event refresh, obtain approval for the composable decision surface, synchronize locales, and provide redacted browser proof of both widgets.
  2. Narrow to status visibility
    Remove the approvals widget and retain only the read-only agent-status feature with live refresh and browser proof.
  3. Pause without ownership sponsorship
    Keep the PR unmerged or close it if maintainers do not want privileged approval controls inside agent-composable layouts.

Next step before merge

  • [P1] A maintainer should decide the approval-control ownership boundary, then require the contributor to repair live session refresh, synchronize locales, and add real browser proof.

Maintainer decision needed

  • Question: Should pending custom-widget approve/reject controls be an agent-composable Workspaces built-in, or must they remain in a fixed operator-owned approval surface?
  • Rationale: The code reuses the existing operator-only decision path and registry-derived items, but repository policy cannot decide whether privileged controls may be placed by workspace composition; that is an intentional product and security-boundary choice.
  • Likely owner: steipete — The current Workspaces foundation and its approval boundary were merged through this person's recent area work.
  • Options:
    • Allow the bounded built-in (recommended): Approve the registry-derived, operator-gated approvals widget after session refresh, locale synchronization, and browser proof are complete.
    • Keep approvals operator-owned: Remove the approvals built-in from this PR and land only agent status, leaving approval controls in the fixed existing surface.
    • Pause operations widgets: Hold or close the PR if no owner wants to sponsor either the composable approval surface or its ongoing maintenance.

Security
Cleared: No concrete authorization bypass or supply-chain regression is visible: pending items come from the trusted workspace registry and decisions reuse the existing operator-gated approval path.

Review findings

  • [P2] Refresh agent status when session activity changes — ui/src/lib/workspace/widgets/index.ts:30
Review details

Best possible solution:

Keep both widgets bounded to server-authoritative data, refresh session-backed values from canonical session events, retain server-enforced operator authorization, synchronize generated locales, and prove the complete flow in a real browser before merge.

Do we have a high-confidence way to reproduce the issue?

Yes at source level: mount the agent-status built-in, change a session's active-run state without changing the workspace, and the PR adds no session-event subscription or refetch path to update the rendered snapshot. A real browser reproduction has not been supplied.

Is this the best way to solve the issue?

No, not yet: registry-derived approval data and reuse of the existing decision RPC are appropriately narrow, but the best solution also requires canonical session refresh, explicit approval-surface ownership, synchronized locales, and real browser proof.

Full review comments:

  • [P2] Refresh agent status when session activity changes — ui/src/lib/workspace/widgets/index.ts:30
    The new renderer only maps the sessions value it was last given, while this PR adds no session-event subscription or refetch path. A mounted widget can therefore continue showing Idle after a run starts, or Busy after it finishes, until an unrelated workspace refresh occurs; wire canonical session changes into the Workspaces value refresh and cover the transition.
    Confidence: 0.97

Overall correctness: patch is incorrect
Overall confidence: 0.94

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 5cb47597424e.

Label changes

Label justifications:

  • P2: This is a useful but non-urgent optional Workspaces feature with a bounded stale-status defect and an unresolved approval-surface decision.
  • merge-risk: 🚨 session-state: The new status projection has no changed session-activity refresh path, so Busy/Idle state can remain stale after runtime transitions.
  • merge-risk: 🚨 security-boundary: The PR makes privileged custom-widget approval decisions available through an agent-composable workspace surface, despite preserving server-side operator gating.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs real behavior proof before merge: The PR supplies focused tests and CI but no after-fix browser evidence showing a real Busy/Idle transition and an authorized approve/reject flow; add a redacted recording or screenshots with live diagnostics, update the PR body to trigger review, and ask a maintainer for @clawsweeper re-review if it does not retrigger automatically.
Evidence reviewed

PR surface:

Source +267, Tests +86. Total +353 across 10 files.

View PR surface stats
Area Files Added Removed Net
Source 8 267 0 +267
Tests 2 86 0 +86
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 10 353 0 +353

What I checked:

  • Agent status uses a snapshot: The new renderer derives Busy/Idle state from the supplied sessions payload, but the PR does not add a session-event subscription or other refresh mechanism when run activity changes. (ui/src/lib/workspace/widgets/agent-status.ts:53, 6b5c0c14a606)
  • No refresh wiring in the renderer registry: The changed registry only registers the new agent-status renderer; it does not connect that renderer to session activity updates. (ui/src/lib/workspace/widgets/index.ts:30, 6b5c0c14a606)
  • Workspace view change only wires approvals: The view constructs a server-backed approvals source and dispatches decisions through the existing approval helper, but the changed lines add no session-status refresh path. (ui/src/pages/plugin/workspace-view.ts:569, 6b5c0c14a606)
  • Approval items are registry-derived: The approvals widget only exposes pending custom-widget registry entries and translates decisions into the existing approved/rejected states, which limits the new authority surface but still makes privileged controls composable inside a workspace. (ui/src/lib/workspace/widgets/approvals.ts:25, 6b5c0c14a606)
  • Tests cover static rendering, not live transitions: Focused tests exercise mapping, limits, rendering, schema acceptance, and decision dispatch with supplied values; they do not demonstrate a running session changing Busy/Idle in the mounted Workspaces UI. (ui/src/lib/workspace/widgets/widgets.test.ts:44, 6b5c0c14a606)
  • Current Workspaces foundation: The current Workspaces architecture and custom-widget approval flow were merged in the foundation PR, establishing the plugin and UI ownership boundary this PR extends. (extensions/workspaces/src/schema.ts:70, 0af846713749)

Likely related people:

  • steipete: Merged the current agent-composable Workspaces implementation and its custom-widget approval boundary, making this the strongest available routing signal for the new built-in widgets and approval-surface decision. (role: introduced current Workspaces foundation; confidence: high; commits: 0af846713749; files: extensions/workspaces, ui/src/lib/workspace, ui/src/pages/plugin/workspace-view.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

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
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (14 earlier review cycles; latest 8 shown)
  • reviewed 2026-07-08T00:01:01.690Z sha 6624e5b :: needs real behavior proof before merge. :: [P2] Keep hidden widgets hidden after refetch | [P2] Refresh agent status from session events | [P2] Store dashboard state in canonical SQLite storage
  • reviewed 2026-07-08T02:09:12.268Z sha 6624e5b :: needs real behavior proof before merge. :: [P2] Keep hidden widgets hidden after refetch | [P2] Refresh agent status from session events | [P2] Store dashboard state in canonical SQLite storage | [P3] Remove the local carve spec from the PR
  • reviewed 2026-07-08T04:28:57.426Z sha 6624e5b :: needs real behavior proof before merge. :: [P2] Keep hidden widgets hidden after refetch | [P2] Refresh agent status from session events | [P2] Store dashboard state in canonical SQLite storage | [P3] Remove the local carve spec from the PR
  • reviewed 2026-07-09T23:21:10.172Z sha e0ed2f5 :: needs real behavior proof before merge. :: [P2] Preserve hidden widgets when normalizing workspace state | [P2] Refresh session-backed widgets on session events | [P2] Store dashboard workspace state in SQLite/plugin state | [P3] Remove the local carve spec from the PR
  • reviewed 2026-07-10T08:41:08.796Z sha 680a641 :: needs real behavior proof before merge. :: [P2] Preserve hidden widgets when normalizing workspace state | [P2] Refresh session-backed widgets on session events | [P2] Store dashboard workspace state in SQLite | [P3] Remove the local carve spec from the PR
  • reviewed 2026-07-13T03:17:10.061Z sha ee64b82 :: needs real behavior proof before merge. :: [P2] Refresh agent status when session activity changes
  • reviewed 2026-07-13T07:38:13.433Z sha 5037a4f :: needs real behavior proof before merge. :: [P2] Refresh agent status when session activity changes
  • reviewed 2026-07-13T09:46:16.345Z sha 6cdc4c4 :: needs real behavior proof before merge. :: [P2] Refresh agent status when session activity changes

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. labels Jul 7, 2026
@100yenadmin

Copy link
Copy Markdown
Contributor Author

Fixed the P1 file-binding contract issue flagged here. resolveBinding (ui/src/lib/dashboard/index.ts) now calls dashboard.data.read with { binding } — the gateway's readParams whitelist accepts only that key, so the previous { path, pointer } call threw at runtime — and it returns the server's already-pointer-resolved data verbatim (the server applies the JSON pointer in resolveFileBinding; the client had been re-applying it, a double-resolve). The unit test had encoded the wrong contract (mocked the whole doc, asserted { path, pointer }); it's rewritten to assert the real gateway shape so a regression fails. The fix is in this PR's diff now and at the base #101098 the series stacks on.

The dependency-guard red and the large cumulative diff are both inherent to the base-first split (this stacks on the unmerged #101098; no new package enters the resolved graph — just the new plugin's lockfile importer entry needing the standard head-SHA authorization).

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jul 7, 2026
@100yenadmin
100yenadmin force-pushed the feat/dashboard-ops-widgets branch from 680a641 to 9cf60f0 Compare July 13, 2026 02:42
@100yenadmin 100yenadmin changed the title Dashboard: ops widgets — agent status + approvals queue Workspaces: add operations widgets Jul 13, 2026
@openclaw-barnacle openclaw-barnacle Bot added plugin: workspaces Agent-composable Workspaces plugin size: M and removed size: XL labels Jul 13, 2026
@github-actions github-actions Bot removed the dependencies-changed PR changes dependency-related files label Jul 13, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jul 13, 2026
@100yenadmin
100yenadmin force-pushed the feat/dashboard-ops-widgets branch from ee64b82 to 10640e4 Compare July 13, 2026 06:45
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. label Jul 13, 2026
@100yenadmin
100yenadmin force-pushed the feat/dashboard-ops-widgets branch from 5037a4f to 6cdc4c4 Compare July 13, 2026 09:03
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jul 13, 2026
@100yenadmin
100yenadmin force-pushed the feat/dashboard-ops-widgets branch from 6cdc4c4 to 6b5c0c1 Compare July 13, 2026 11:27
@steipete
steipete force-pushed the feat/dashboard-ops-widgets branch from 6b5c0c1 to facc593 Compare July 17, 2026 02:13
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation size: XL and removed size: M labels Jul 17, 2026
@steipete
steipete force-pushed the feat/dashboard-ops-widgets branch from facc593 to eee4264 Compare July 17, 2026 02:14
@steipete steipete changed the title Workspaces: add operations widgets feat(workspaces): show agent status and custom-widget decisions Jul 17, 2026
@steipete
steipete force-pushed the feat/dashboard-ops-widgets branch from b53ead8 to a6b3931 Compare July 17, 2026 02:31
@openclaw-barnacle openclaw-barnacle Bot added the scripts Repository scripts label Jul 17, 2026
@steipete
steipete force-pushed the feat/dashboard-ops-widgets branch from b76dc37 to eba3fef Compare July 17, 2026 02:43
@steipete
steipete merged commit 09575bd into openclaw:main Jul 17, 2026
118 of 119 checks passed
@steipete

Copy link
Copy Markdown
Contributor

Merged via squash.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 17, 2026
…claw#101826)

* feat(workspaces): add operations widgets

* fix(workspaces): format agent progress translation

* fix(workspaces): keep operations widget helpers private

* feat(workspaces): harden operations widgets

Co-authored-by: EVA <[email protected]>

* chore(i18n): defer generated locale refresh

* refactor(workspaces): isolate approval state

* fix(release): declare direct checklist execution

* fix(release): satisfy checklist declaration lint

* fix(release): align checklist declaration order

---------

Co-authored-by: Eva <[email protected]>
Co-authored-by: Peter Steinberger <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui docs Improvements or additions to documentation merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. plugin: workspaces Agent-composable Workspaces plugin rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. scripts Repository scripts size: L status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants