Skip to content

feat(ui): dashboard-v2 views refactor (slice 3/3 of dashboard-v2)#41503

Merged
BunsDev merged 49 commits into
mainfrom
dashboard-v2-views-refactor
Mar 12, 2026
Merged

feat(ui): dashboard-v2 views refactor (slice 3/3 of dashboard-v2)#41503
BunsDev merged 49 commits into
mainfrom
dashboard-v2-views-refactor

Conversation

@BunsDev

@BunsDev BunsDev commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Final slice of the dashboard-v2-structure PR (#36853). Contains the complete views refactor and app wiring, building on:

New views

View Purpose
command-palette.ts Cmd+K command palette
login-gate.ts Authentication gate
bottom-tabs.ts Mobile tab navigation
overview-cards.ts Dashboard stat cards
overview-attention.ts Attention items panel
overview-event-log.ts Event log panel
overview-hints.ts Setup hints
overview-log-tail.ts Live log tail
overview-quick-actions.ts Quick action buttons
agents-panels-overview.ts Agent overview panel

Refactored views

  • chat.ts — Major refactor: STT, slash commands, search, export, pinned messages, input history
  • config.ts — Restructured config management with form improvements
  • agents.ts — Streamlined agent management with tools catalog
  • overview.ts — Modular composition from sub-views
  • sessions.ts — Enhanced session management

New controllers

  • controllers/health.ts — Health check monitoring
  • controllers/models.ts — Model catalog management

Core app changes

  • app.ts — New state properties for dashboard-v2
  • app-render.ts — Refactored render pipeline
  • app-settings.ts — Theme listener lifecycle fix + cron runs on tab load
  • app-gateway.ts — Refactored chat event handling
  • app-chat.ts — Slash command integration

Stats

Merge order

  1. feat(ui): add chat infrastructure modules (slice 1/3 of dashboard-v2) #41497 (slice 1) — no dependencies
  2. feat(ui): utilities, theming, and i18n updates (slice 2/3 of dashboard-v2) #41500 (slice 2) — no dependencies
  3. This PR (slice 3) — depends on 1 + 2

Screenshot 2026-03-10 at 9 31 26 PM

No more poking around

Screenshot 2026-03-10 at 9 38 16 PM

Privacy by default and warning / guidance included

Screenshot 2026-03-10 at 10 02 49 PM

Command + K

Screenshot 2026-03-10 at 10 39 12 PM

Example of how the config was refactored to optimize horizontal spacing.

Screenshot 2026-03-10 at 11 33 05 PM

Chat interface

BunsDev added 4 commits March 9, 2026 17:49
New self-contained chat modules extracted from dashboard-v2-structure:

- chat/slash-commands.ts: slash command definitions and completions
- chat/slash-command-executor.ts: execute slash commands via gateway RPC
- chat/slash-command-executor.node.test.ts: test coverage
- chat/speech.ts: speech-to-text (STT) support
- chat/input-history.ts: per-session input history navigation
- chat/pinned-messages.ts: pinned message management
- chat/deleted-messages.ts: deleted message tracking
- chat/export.ts: shared exportChatMarkdown helper
- chat-export.ts: re-export shim for backwards compat

Gateway fix:
- Restore usage/cost stripping in chat.history sanitization
- Add test coverage for sanitization behavior

These modules are additive and tree-shaken — no existing code
imports them yet. They will be wired in subsequent slices.
…ard-v2)

UI utilities and theming improvements extracted from dashboard-v2-structure:

Icons & formatting:
- icons.ts: expanded icon set for new dashboard views
- format.ts: date/number formatting helpers
- tool-labels.ts: human-readable tool name mappings

Theming:
- theme.ts: enhanced theme resolution and system theme support
- theme-transition.ts: simplified transition logic
- storage.ts: theme parsing improvements for settings persistence

Navigation & types:
- navigation.ts: extended tab definitions for dashboard-v2
- app-view-state.ts: expanded view state management
- types.ts: new type definitions (HealthSummary, ModelCatalogEntry, etc.)

Components:
- components/dashboard-header.ts: reusable header component

i18n:
- Updated en, pt-BR, zh-CN, zh-TW locales with new dashboard strings

All changes are additive or backwards-compatible. Build passes.
Part of #36853.
Complete views refactor from dashboard-v2-structure, building on
slice 1 (chat infra, #41497) and slice 2 (utilities/theming, #41500).

Core app wiring:
- app.ts: updated host component with new state properties
- app-render.ts: refactored render pipeline for new dashboard layout
- app-render.helpers.ts: extracted render helpers
- app-settings.ts: theme listener lifecycle fix, cron runs on tab load
- app-gateway.ts: refactored chat event handling
- app-chat.ts: slash command integration

New views:
- views/command-palette.ts: command palette (Cmd+K)
- views/login-gate.ts: authentication gate
- views/bottom-tabs.ts: mobile tab navigation
- views/overview-*.ts: modular overview dashboard (cards, attention,
  event log, hints, log tail, quick actions)
- views/agents-panels-overview.ts: agent overview panel

Refactored views:
- views/chat.ts: major refactor with STT, slash commands, search,
  export, pinned messages, input history
- views/config.ts: restructured config management
- views/agents.ts: streamlined agent management
- views/overview.ts: modular composition from sub-views
- views/sessions.ts: enhanced session management

Controllers:
- controllers/health.ts: new health check controller
- controllers/models.ts: new model catalog controller
- controllers/agents.ts: tools catalog improvements
- controllers/config.ts: config form enhancements

Tests & infrastructure:
- Updated test helpers, browser tests, node tests
- vite.config.ts: build configuration updates
- markdown.ts: rendering improvements

Build passes ✅ | 44 files | +6,626/-1,499
Part of #36853. Depends on #41497 and #41500.
@aisle-research-bot

aisle-research-bot Bot commented Mar 9, 2026

Copy link
Copy Markdown

🔒 Aisle Security Analysis

We found 6 potential security issue(s) in this PR:

# Severity Title
1 🟠 High Stream mode redaction ineffective: event log payload still rendered (no-op redacted class)
2 🟡 Medium Stream mode host/IP redaction ineffective (PII remains visible/in DOM) in Connected Instances view
3 🟡 Medium Stream-mode raw config redaction can be bypassed, leaking secrets into DOM
4 🟡 Medium Client-side /kill slash command can abort sub-agent sessions across other agents/sessions (over-broad target matching)
5 🔵 Low Unsafe download filename construction in chat markdown export (assistantName injection)
6 🔵 Low Stream mode does not remove gateway token/password from DOM inputs (can be read/revealed despite redaction)

1. 🟠 Stream mode redaction ineffective: event log payload still rendered (no-op redacted class)

Property Value
Severity High
CWE CWE-200
Location ui/src/ui/views/overview-event-log.ts:20-37

Description

The new Overview stream mode is intended to redact sensitive information, but renderOverviewEventLog() still renders the event payload even when redacted=true.

  • The code only adds a redacted CSS class to the container.
  • In the current codebase, there are no CSS rules for .redacted (and similarly none for .blur-digits), so the class does not actually hide/obscure content.
  • Result: potentially sensitive gateway event payloads (which may include tokens, URLs, identifiers, etc.) can be displayed during “redacted” mode.

Vulnerable code:

<div class="ov-event-log-list ${props.redacted ? "redacted" : ""}">
  ...
  ${formatEventPayload(entry.payload).slice(0, 120)}
</div>

Recommendation

Do not rely on CSS-only redaction for sensitive data.

Safer option (recommended): don’t render payload content at all when redacted is enabled.

const payloadText = props.redacted
  ? "[redacted]"
  : formatEventPayload(entry.payload).slice(0, 120);

... html`<span class="ov-event-log-payload muted">${payloadText}</span>`

Additionally:

  • Define and test redaction styles if you still want blurred UI (e.g., .redacted { filter: blur(...); }), but treat it as presentation only.
  • Consider server-side redaction or a dedicated “safe-for-stream” event feed if the payload can contain secrets.

2. 🟡 Stream mode host/IP redaction ineffective (PII remains visible/in DOM) in Connected Instances view

Property Value
Severity Medium
CWE CWE-200
Location ui/src/ui/views/instances.ts:15-40

Description

The Connected Instances view attempts to protect hostnames/IPs during streamMode by conditionally adding a redacted CSS class, but it still renders the real values into the DOM.

Impact:

  • PII exposure during streaming/screen sharing: host and ip are rendered as plain text nodes regardless of masking; if .redacted is missing/ineffective (and there is no .redacted rule in the repo CSS), the values will be fully visible.
  • DOM disclosure even with visual masking: even if .redacted were implemented as a blur, the raw values remain copyable/extractable from the DOM.
  • Latent reveal: the module-level hostsRevealed can be toggled while streamMode=true (button remains enabled). When stream mode is later disabled, hosts/IPs may become visible without an explicit post-stream reveal action.

Vulnerable code:

let hostsRevealed = false;

export function renderInstances(props: InstancesProps) {
  const masked = props.streamMode || !hostsRevealed;// ...
  <span class="${masked ? "redacted" : ""}">${host}</span>
  ${ip ? html`<span class="${masked ? "redacted" : ""}">${ip}</span>` : nothing}
}

Recommendation

Mitigate by ensuring secrets are not rendered when masked, and prevent latent reveal:

  1. Do not insert host/IP into the DOM while masked (render placeholders instead):
const hostText = masked ? "[redacted]" : host;
const ipText = masked ? null : ip;

return html`
  <div class="list-title">${hostText}</div>
  <div class="list-sub">
    ${ipText ? html`<span>${ipText}</span> ` : nothing}${mode} ${entry.version ?? ""}
  </div>
`;
  1. Disable the reveal toggle while streamMode is enabled and avoid toggling reveal state in that mode:
<button ?disabled=${props.streamMode} ...>
  1. Reset reveal state when entering stream mode (or lift hostsRevealed into app state and set it to false on stream mode enable), to prevent auto-reveal after streaming ends.

3. 🟡 Stream-mode raw config redaction can be bypassed, leaking secrets into DOM

Property Value
Severity Medium
CWE CWE-200
Location ui/src/ui/views/config.ts:1064-1124

Description

In renderConfig() raw editor mode, the decision to redact the raw textarea in streamMode relies on:

  • sensitiveCount from countSensitiveConfigValues(props.formValue, ...) (parsed/stale form state)
  • a limited containsSensitiveKeywords(props.raw) regex scan

If props.formValue is null, empty, or stale (e.g., user is editing raw JSON5 and the UI hasn't parsed it / parsing failed), and the raw content contains secrets under a sensitive key not covered by containsSensitiveKeywords (notably serviceAccount / serviceAccountRef, which is considered sensitive by isSensitiveConfigPath()), then blurred becomes false even while streamMode=true.

Result: the full props.raw (including secrets) is rendered into the <textarea> value, placing secrets in the DOM during stream mode.

Bypass example (stream mode ON, raw mode):

{ gateway: { auth: { serviceAccountRef: "<secret>" } } }
  • SENSITIVE_PATTERNS includes /serviceaccount(?:ref)?$/i but containsSensitiveKeywords() does not.
  • If props.formValue doesn’t currently include that path, sensitiveCount is 0.
  • rawHasSensitiveKeywords is false.
  • blurred is false ⇒ textarea shows the secret.

Recommendation

Fail closed in stream mode so secrets never enter the DOM.

Suggested options (prefer 1):

  1. Always redact raw textarea in stream mode (simplest, safest):
const blurred = props.streamMode || (!rawRevealed && (sensitiveCount > 0 || rawHasSensitiveKeywords));
const canReveal = !props.streamMode && (sensitiveCount > 0 || rawHasSensitiveKeywords);

…and keep .value empty while props.streamMode.

  1. If editing in stream mode must be supported, parse raw in a best-effort way and run the same sensitive detection used elsewhere; if parsing fails, redact:
let rawIsSensitive = true; // default redact
try {
  const parsed = JSON5.parse(props.raw);
  rawIsSensitive = hasSensitiveConfigData(parsed, [], props.uiHints);
} catch {}
const blurred = props.streamMode && rawIsSensitive;
  1. If keeping regex scanning, ensure it is derived from the same patterns as SENSITIVE_PATTERNS (including serviceaccount(?:ref)?) and consider hint-based keys; otherwise it will remain bypassable.

4. 🟡 Client-side /kill slash command can abort sub-agent sessions across other agents/sessions (over-broad target matching)

Property Value
Severity Medium
CWE CWE-284
Location ui/src/ui/chat/slash-command-executor.ts:287-355

Description

The new client-side slash command executor implements /kill by:

  • Fetching all sessions via sessions.list (no agent/session filter)
  • Selecting targets with resolveKillTargets() using broad matching rules
  • Issuing chat.abort RPC calls for every matched session key

Because resolveKillTargets() matches any subagent session key that ends with :subagent:<target> without restricting to the current agent/session, a user can accidentally (or intentionally) abort sub-agent runs that were not spawned by the current session/agent.

This meaningfully widens the blast radius compared to the prior server-side /kill handling (which enforced a “controlled subagent” relationship), and creates an availability/abuse risk in shared deployments.

Vulnerable code:

const sessions = await client.request<SessionsListResult>("sessions.list", {});
const matched = resolveKillTargets(sessions?.sessions ?? [], sessionKey, target);
...
matched.map((key) => client.request("chat.abort", { sessionKey: key }))

and the overly-permissive match logic:

const isMatch =
  normalizedTarget === "all" ||
  ...
  normalizedKey.endsWith(`:subagent:${normalizedTarget}`) ||
  ...

Recommendation

Tighten /kill authorization and target resolution.

Client-side guardrails (defense-in-depth):

  • Restrict matches to subagent sessions belonging to the current agent (or, preferably, the current session’s subagent tree).
  • For all, only abort subagents for the current agent/session.
  • Add a confirmation prompt for all and for multi-target aborts.

Server-side protection (primary fix):

  • Enforce that chat.abort can only abort sessions within an allowed scope for the caller (e.g., only the caller’s session and its spawned subagent sessions), or require an explicit admin-only method for cross-session aborts.

Example safer matching (agent-scoped only):

function resolveKillTargetsScoped(
  sessions: GatewaySessionRow[],
  currentSessionKey: string,
  target: string,
): string[] {
  const normalizedTarget = target.trim().toLowerCase();
  const currentParsed = parseAgentSessionKey(currentSessionKey);
  if (!currentParsed) return [];

  return sessions
    .map((s) => s.key?.trim())
    .filter((key): key is string => Boolean(key) && isSubagentSessionKey(key))
    .filter((key) => (parseAgentSessionKey(key)?.agentId ?? "") === currentParsed.agentId)
    .filter((key) =>
      normalizedTarget === "all" ||
      key.toLowerCase().endsWith(`:subagent:${normalizedTarget}`) ||
      key.toLowerCase() === normalizedTarget,
    );
}

5. 🔵 Unsafe download filename construction in chat markdown export (assistantName injection)

Property Value
Severity Low
CWE CWE-451
Location ui/src/ui/chat/export.ts:12-16

Description

The chat export feature constructs the downloaded filename using untrusted assistantName without sanitization.

  • assistantName is loaded from the gateway via agent.identity.get (remote-controlled data) and only trimmed/length-limited.
  • It is interpolated directly into the <a download> attribute.
  • This allows filename injection / UI deception via special characters (e.g., slashes, newlines, trailing dots/spaces) and Unicode bidi control characters (e.g., \u202E) that can visually spoof extensions or obscure the real filename in save dialogs.

Vulnerable code:

link.download = `chat-${assistantName}-${Date.now()}.md`;

Recommendation

Sanitize assistantName before using it in a filename.

  • Remove path separators and reserved filename characters
  • Strip ASCII control chars and Unicode bidi controls (RLO/LRO/RLI/LRI/FSI/PDI etc.)
  • Collapse whitespace, trim trailing dots/spaces
  • Enforce a conservative max length and provide a safe fallback

Example:

function sanitizeFilenameComponent(input: string, maxLen = 40): string {
  const bidi = /[\u200E\u200F\u202A-\u202E\u2066-\u2069]/g;
  const control = /[\u0000-\u001F\u007F]/g;
  const reserved = /[\\/<>:"|?*]/g;

  const cleaned = input
    .replaceAll(bidi, "")
    .replaceAll(control, "")
    .replaceAll(reserved, "-")
    .replaceAll(/\s+/g, "-")
    .replaceAll(/\.+$/g, "")
    .trim()
    .slice(0, maxLen);

  return cleaned || "assistant";
}

const safeAssistant = sanitizeFilenameComponent(assistantName);
link.download = `chat-${safeAssistant}-${Date.now()}.md`;

6. 🔵 Stream mode does not remove gateway token/password from DOM inputs (can be read/revealed despite redaction)

Property Value
Severity Low
CWE CWE-200
Location ui/src/ui/views/overview.ts:224-243

Description

In the Overview Access panel, enabling streamMode only adds a redacted CSS class to the form container, but the actual secrets are still written into DOM input values.

This means that even with stream mode enabled:

  • The gateway token is still assigned to the token input via Lit property binding (.value=${props.settings.token}) and can be read via document.querySelector(...).value, browser devtools, copy/paste, or by malicious extensions.
  • The password is still assigned to the password input (.value=${props.password}) with the same exposure.
  • The show/hide buttons remain enabled in stream mode; toggling them changes the input type to text, visually revealing the secret on-screen.
  • streamMode defaults to enabled (redacted) in app.ts, making the UI appear safe-by-default while still embedding secrets in the DOM.

Vulnerable code (token example):

<input
  type=${props.showGatewayToken ? "text" : "password"}
  .value=${props.settings.token}
  ...
​/>
<button @​click=${props.onToggleGatewayTokenVisibility}>...</button>

Locations:

  • ui/src/ui/views/overview.ts token/password inputs and toggles (see cited lines below)
  • ui/src/ui/app.ts stream mode default enabled (stored === null ? true : ...)

Recommendation

Treat stream mode as a data minimization mode, not just a visual effect:

  • When streamMode === true, do not bind real secret values into inputs.
  • Replace them with an empty value plus a redacted placeholder.
  • Make the secret inputs readonly/disabled in stream mode, and disable the show/hide buttons.

Example fix pattern:

const redactSecrets = props.streamMode;

<input
  type="password"
  autocomplete="off"
  .value=${redactSecrets ? "" : props.settings.token}
  placeholder=${redactSecrets ? "[redacted in stream mode]" : "OPENCLAW_GATEWAY_TOKEN"}
  ?readonly=${redactSecrets}
  @​input=${(e: Event) => {
    if (redactSecrets) return;
    props.onSettingsChange({ ...props.settings, token: (e.target as HTMLInputElement).value });
  }}/>
<button
  type="button"
  class="btn btn--icon"
  ?disabled=${redactSecrets}
  @​click=${() => { if (!redactSecrets) props.onToggleGatewayTokenVisibility(); }}
>...</button>

Also add a regression test asserting that when stream mode is on, token/password inputs have value === "" and visibility toggles are disabled.


Analyzed PR: #41503 at commit bad6cda

Last updated on: 2026-03-11T04:26:20Z

@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui gateway Gateway runtime size: XL maintainer Maintainer-authored PR labels Mar 9, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0dedb3251d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread ui/src/ui/chat/pinned-messages.ts Outdated
@greptile-apps

greptile-apps Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This is the final slice (3/3) of the dashboard-v2 refactor, introducing 10 new view components, 2 new controllers, and a major overhaul of the chat, config, agents, and overview views — adding features such as the ⌘K command palette, login gate, STT input, slash command integration, pinned messages, export, and per-session input history.

Key findings:

  • config.openFile Windows bug (src/gateway/server-methods/config.ts): The new exec-based file-open handler uses start "path" on Windows, which incorrectly treats the quoted path as the window title rather than the target file. The fix is start "" "path".
  • /kill <target> scope escape (ui/src/ui/chat/slash-command-executor.ts): The resolveKillTargets refactor only enforces isInCurrentTree for the /kill all path; named-target conditions have no session-scope guard, allowing /kill <id> to abort sub-agents belonging to other active sessions.
  • /kill graceful no-op removed (ui/src/ui/chat/slash-command-executor.ts): When matched sessions return {aborted: false} (nothing running), the new code throws "abort failed" rather than the previous friendly "No active sub-agent runs to abort" message.
  • Sequential model fetch (ui/src/ui/chat/slash-command-executor.ts): executeModel now issues sessions.list and models.list sequentially; these are independent and should be Promise.all'd as before.
  • The previously flagged PALETTE_ITEMS divergence from SLASH_COMMANDS has been correctly addressed — SLASH_PALETTE_ITEMS is now derived dynamically from SLASH_COMMANDS at module load.

Confidence Score: 2/5

  • Not safe to merge as-is — two logic bugs in /kill scoping and one platform bug in config.openFile need to be fixed first.
  • The PR is a well-structured, large refactor with solid new UI components. However, it contains three concrete bugs that will affect users in production: the Windows start command quirk silently breaking "open config file", the unscoped /kill <target> that can abort sub-agents from unrelated sessions, and the "abort failed" error shown when /kill finds sessions that are simply idle. These are straightforward to fix but should be addressed before merge.
  • src/gateway/server-methods/config.ts (Windows exec bug) and ui/src/ui/chat/slash-command-executor.ts (two /kill regressions) need attention before merging.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/gateway/server-methods/config.ts
Line: 544-546

Comment:
**`start` command interprets first quoted arg as window title on Windows**

On Windows, `start "C:\path\to\config"` treats the first double-quoted argument as the **window title**, not the file to open. The file is never opened; the command silently succeeds with no visible effect.

The fix is to pass an empty title string as the first argument before the file path:

```suggestion
    const cmd = platform === "darwin" ? "open" : platform === "win32" ? 'start ""' : "xdg-open";
    exec(`${cmd} ${JSON.stringify(configPath)}`, (err) => {
```

With `start "" "C:\path\to\config.yaml"`, Windows correctly interprets the second quoted argument as the target file.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: ui/src/ui/chat/slash-command-executor.ts
Line: 352-361

Comment:
**Named `/kill <target>` skips scope check — can abort sub-agents from other sessions**

`isInCurrentTree` is only enforced for the `/kill all` path (line 353). The next four conditions have no `isInCurrentTree` guard, so `/kill <someId>` will match and abort sub-agent sessions belonging to *any* active agent, not just the current session's subtree:

```typescript
normalizedKey === normalizedTarget ||                          // no scope check
(parsed?.agentId ?? "") === normalizedTarget ||               // no scope check
normalizedKey.endsWith(`:subagent:${normalizedTarget}`) ||    // no scope check
normalizedKey === `subagent:${normalizedTarget}` ||           // no scope check
```

The original `belongsToCurrentSession` guard wrapped **all** conditions (including named targets). The refactored code drops it for specific targets. Consider gating the named-target conditions as well:

```typescript
const isMatch =
  (normalizedTarget === "all" && isInCurrentTree) ||
  (isInCurrentTree && normalizedKey === normalizedTarget) ||
  (isInCurrentTree && (parsed?.agentId ?? "") === normalizedTarget) ||
  (isInCurrentTree && normalizedKey.endsWith(`:subagent:${normalizedTarget}`)) ||
  (isInCurrentTree && normalizedKey === `subagent:${normalizedTarget}`);
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: ui/src/ui/chat/slash-command-executor.ts
Line: 305-309

Comment:
**`/kill` throws "abort failed" when sessions exist but are already idle**

When sessions are matched but every `chat.abort` response returns `{ aborted: false }` (i.e., the sessions exist but have no active run), `successCount` is `0` and `firstFailure` is `undefined`. The code then throws `new Error("abort failed")`, which propagates to the catch block and shows the user `"Failed to abort: abort failed"`.

The previous code handled this case gracefully by returning `"No active sub-agent runs to abort."`. The new code treats the "nothing was running" state as an error.

```typescript
if (successCount === 0) {
  const firstFailure = results.find((entry) => entry.status === "rejected");
  throw firstFailure?.reason ?? new Error("abort failed");
```

Consider restoring the graceful path:

```typescript
if (successCount === 0) {
  const firstFailure = results.find((entry) => entry.status === "rejected");
  if (firstFailure) {
    throw firstFailure.reason;
  }
  return {
    content:
      target.toLowerCase() === "all"
        ? "No active sub-agent runs to abort."
        : `No active runs matched \`${target}\`.`,
  };
}
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: ui/src/ui/chat/slash-command-executor.ts
Line: 132-140

Comment:
**Sequential `sessions.list` / `models.list` is a performance regression**

The refactored `executeModel` now awaits `sessions.list` before issuing `models.list`, whereas the original fetched both in parallel with `Promise.all`. The two requests are independent — they can still run concurrently:

```suggestion
      const [sessions, modelsResult] = await Promise.all([
        client.request<SessionsListResult>("sessions.list", {}),
        client.request<{ models: ModelCatalogEntry[] }>("models.list", {}),
      ]);
      const session = sessions?.sessions?.find((s: GatewaySessionRow) => s.key === sessionKey);
      const model = session?.model || sessions?.defaults?.model || "default";
      const available = modelsResult?.models?.map((m: ModelCatalogEntry) => m.id) ?? [];
```

How can I resolve this? If you propose a fix, please make it concise.

Last reviewed commit: 823853b

Comment thread ui/src/ui/views/chat.ts Outdated
Comment thread ui/src/ui/views/chat.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 68698bd957

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread ui/src/ui/app-chat.ts
Comment thread ui/src/ui/chat/deleted-messages.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c0a7cfdbb6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread ui/src/ui/chat/export.ts Outdated
@BunsDev

BunsDev commented Mar 10, 2026

Copy link
Copy Markdown
Contributor Author

@greptile-apps this summary is now stale. It last reviewed 0dedb32, but the 2 cited chat issues were fixed in -79df and both Greptile review threads are resolved. Fixes also found here: -a149 and -206d

Please rescan PR #41503 and post an updated score against current HEAD 210d24a14410c2f1779a3523f5f80beee3ff206d.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 210d24a144

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread ui/src/ui/storage.ts
Comment thread ui/src/ui/app-settings.ts Outdated
Comment thread ui/src/ui/chat/slash-command-executor.ts Outdated
Comment thread ui/src/ui/views/chat.ts Outdated
Comment thread ui/src/ui/views/command-palette.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 45b99623d0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread ui/src/ui/views/chat.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a9159eee51

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread ui/src/ui/app-chat.ts Outdated
Comment thread ui/src/ui/app.ts
ogt-redknie pushed a commit to ogt-redknie/OPENX that referenced this pull request May 2, 2026
…enclaw#41503)

* feat(ui): add chat infrastructure modules (slice 1 of dashboard-v2)

New self-contained chat modules extracted from dashboard-v2-structure:

- chat/slash-commands.ts: slash command definitions and completions
- chat/slash-command-executor.ts: execute slash commands via gateway RPC
- chat/slash-command-executor.node.test.ts: test coverage
- chat/speech.ts: speech-to-text (STT) support
- chat/input-history.ts: per-session input history navigation
- chat/pinned-messages.ts: pinned message management
- chat/deleted-messages.ts: deleted message tracking
- chat/export.ts: shared exportChatMarkdown helper
- chat-export.ts: re-export shim for backwards compat

Gateway fix:
- Restore usage/cost stripping in chat.history sanitization
- Add test coverage for sanitization behavior

These modules are additive and tree-shaken — no existing code
imports them yet. They will be wired in subsequent slices.

* feat(ui): add utilities, theming, and i18n updates (slice 2 of dashboard-v2)

UI utilities and theming improvements extracted from dashboard-v2-structure:

Icons & formatting:
- icons.ts: expanded icon set for new dashboard views
- format.ts: date/number formatting helpers
- tool-labels.ts: human-readable tool name mappings

Theming:
- theme.ts: enhanced theme resolution and system theme support
- theme-transition.ts: simplified transition logic
- storage.ts: theme parsing improvements for settings persistence

Navigation & types:
- navigation.ts: extended tab definitions for dashboard-v2
- app-view-state.ts: expanded view state management
- types.ts: new type definitions (HealthSummary, ModelCatalogEntry, etc.)

Components:
- components/dashboard-header.ts: reusable header component

i18n:
- Updated en, pt-BR, zh-CN, zh-TW locales with new dashboard strings

All changes are additive or backwards-compatible. Build passes.
Part of openclaw#36853.

* feat(ui): dashboard-v2 views refactor (slice 3 of dashboard-v2)

Complete views refactor from dashboard-v2-structure, building on
slice 1 (chat infra, openclaw#41497) and slice 2 (utilities/theming, openclaw#41500).

Core app wiring:
- app.ts: updated host component with new state properties
- app-render.ts: refactored render pipeline for new dashboard layout
- app-render.helpers.ts: extracted render helpers
- app-settings.ts: theme listener lifecycle fix, cron runs on tab load
- app-gateway.ts: refactored chat event handling
- app-chat.ts: slash command integration

New views:
- views/command-palette.ts: command palette (Cmd+K)
- views/login-gate.ts: authentication gate
- views/bottom-tabs.ts: mobile tab navigation
- views/overview-*.ts: modular overview dashboard (cards, attention,
  event log, hints, log tail, quick actions)
- views/agents-panels-overview.ts: agent overview panel

Refactored views:
- views/chat.ts: major refactor with STT, slash commands, search,
  export, pinned messages, input history
- views/config.ts: restructured config management
- views/agents.ts: streamlined agent management
- views/overview.ts: modular composition from sub-views
- views/sessions.ts: enhanced session management

Controllers:
- controllers/health.ts: new health check controller
- controllers/models.ts: new model catalog controller
- controllers/agents.ts: tools catalog improvements
- controllers/config.ts: config form enhancements

Tests & infrastructure:
- Updated test helpers, browser tests, node tests
- vite.config.ts: build configuration updates
- markdown.ts: rendering improvements

Build passes ✅ | 44 files | +6,626/-1,499
Part of openclaw#36853. Depends on openclaw#41497 and openclaw#41500.

* UI: fix chat review follow-ups

* fix(ui): repair chat clear and attachment regressions

* fix(ui): address remaining chat review comments

* fix(ui): address review follow-ups

* fix(ui): replay queued local slash commands

* fix(ui): repair control-ui type drift

* fix(ui): restore control UI styling

* feat(ui): enhance layout and styling for config and topbar components

- Updated grid layout for the config layout to allow full-width usage.
- Introduced new styles for top tabs and search components to improve usability.
- Added theme mode toggle styling for better visual integration.
- Implemented tests for layout and theme mode components to ensure proper rendering and functionality.

* feat(ui): add config file opening functionality and enhance styles

- Implemented a new handler to open the configuration file using the default application based on the operating system.
- Updated various CSS styles across components for improved visual consistency and usability, including adjustments to padding, margins, and font sizes.
- Introduced new styles for the data table and sidebar components to enhance layout and interaction.
- Added tests for the collapsed navigation rail to ensure proper functionality in different states.

* refactor(ui): update CSS styles for improved layout and consistency

- Simplified font-body declaration in base.css for cleaner code.
- Adjusted transition properties in components.css for better readability.
- Added new .workspace-link class in components.css for enhanced link styling.
- Changed config layout from grid to flex in config.css for better responsiveness.
- Updated related tests to reflect layout changes in config-layout.browser.test.ts.

* feat(ui): enhance theme handling and loading states in chat interface

- Updated CSS to support new theme mode attributes for better styling consistency across light and dark themes.
- Introduced loading skeletons in the chat view to improve user experience during data fetching.
- Refactored command palette to manage focus more effectively, enhancing accessibility.
- Added tests for the appearance theme picker and loading states to ensure proper rendering and functionality.

* refactor(ui): streamline ephemeral state management in chat and config views

- Introduced interfaces for ephemeral state in chat and config views to encapsulate related variables.
- Refactored state management to utilize a single object for better organization and maintainability.
- Removed legacy state variables and updated related functions to reference the new state structure.
- Enhanced readability and consistency across the codebase by standardizing state handling.

* chore: remove test files to reduce PR scope

* fix(ui): resolve type errors in debug props and chat search

* refactor(ui): remove stream mode functionality across various components

- Eliminated stream mode related translations and CSS styles to streamline the user interface.
- Updated multiple components to remove references to stream mode, enhancing code clarity and maintainability.
- Adjusted rendering logic in views to ensure consistent behavior without stream mode.
- Improved overall readability by cleaning up unused variables and props.

* fix(ui): add msg-meta CSS and fix rebase type errors

* fix(ui): add CSS for chat footer action buttons (TTS, delete) and msg-meta

* feat(ui): add delete confirmation with remember-decision checkbox

* fix(ui): delete confirmation with remember, attention icon sizing

* fix(ui): open delete confirm popover to the left (not clipped)

* fix(ui): show all nav items in collapsed sidebar, remove gap

* fix(ui): address P1/P2 review feedback — session queue clear, kill scope, palette guard, stop button

* fix(ui): address Greptile re-review — kill scope, queue flush, idle handling, parallel fetch

- SECURITY: /kill <target> now enforces session tree scope (not just /kill all)
- /kill reports idle sessions gracefully instead of throwing
- Queue continues draining after local slash commands
- /model fetches sessions.list + models.list in parallel (perf fix)

* fix(ui): style update banner close button — SVG stroke + sizing

* fix(ui): update layout styles for sidebar and content spacing

* UI: restore colon slash command parsing

* UI: restore slash command session queries

* Refactor thinking resolution: Introduce resolveThinkingDefaultForModel function and update model-selection to utilize it. Add tests for new functionality in thinking.test.ts.

* fix(ui): constrain welcome state logo size, add missing CSS for new session view

---------

Co-authored-by: Vincent Koc <[email protected]>
ogt-redknie pushed a commit to ogt-redknie/OPENX that referenced this pull request May 2, 2026
…board-v2, highlighting the refreshed gateway dashboard with modular views and enhanced chat tools (openclaw#41503)
DexterSLamb pushed a commit to DexterSLamb/openclaw-tianjun that referenced this pull request May 3, 2026
…enclaw#41503)

* feat(ui): add chat infrastructure modules (slice 1 of dashboard-v2)

New self-contained chat modules extracted from dashboard-v2-structure:

- chat/slash-commands.ts: slash command definitions and completions
- chat/slash-command-executor.ts: execute slash commands via gateway RPC
- chat/slash-command-executor.node.test.ts: test coverage
- chat/speech.ts: speech-to-text (STT) support
- chat/input-history.ts: per-session input history navigation
- chat/pinned-messages.ts: pinned message management
- chat/deleted-messages.ts: deleted message tracking
- chat/export.ts: shared exportChatMarkdown helper
- chat-export.ts: re-export shim for backwards compat

Gateway fix:
- Restore usage/cost stripping in chat.history sanitization
- Add test coverage for sanitization behavior

These modules are additive and tree-shaken — no existing code
imports them yet. They will be wired in subsequent slices.

* feat(ui): add utilities, theming, and i18n updates (slice 2 of dashboard-v2)

UI utilities and theming improvements extracted from dashboard-v2-structure:

Icons & formatting:
- icons.ts: expanded icon set for new dashboard views
- format.ts: date/number formatting helpers
- tool-labels.ts: human-readable tool name mappings

Theming:
- theme.ts: enhanced theme resolution and system theme support
- theme-transition.ts: simplified transition logic
- storage.ts: theme parsing improvements for settings persistence

Navigation & types:
- navigation.ts: extended tab definitions for dashboard-v2
- app-view-state.ts: expanded view state management
- types.ts: new type definitions (HealthSummary, ModelCatalogEntry, etc.)

Components:
- components/dashboard-header.ts: reusable header component

i18n:
- Updated en, pt-BR, zh-CN, zh-TW locales with new dashboard strings

All changes are additive or backwards-compatible. Build passes.
Part of openclaw#36853.

* feat(ui): dashboard-v2 views refactor (slice 3 of dashboard-v2)

Complete views refactor from dashboard-v2-structure, building on
slice 1 (chat infra, openclaw#41497) and slice 2 (utilities/theming, openclaw#41500).

Core app wiring:
- app.ts: updated host component with new state properties
- app-render.ts: refactored render pipeline for new dashboard layout
- app-render.helpers.ts: extracted render helpers
- app-settings.ts: theme listener lifecycle fix, cron runs on tab load
- app-gateway.ts: refactored chat event handling
- app-chat.ts: slash command integration

New views:
- views/command-palette.ts: command palette (Cmd+K)
- views/login-gate.ts: authentication gate
- views/bottom-tabs.ts: mobile tab navigation
- views/overview-*.ts: modular overview dashboard (cards, attention,
  event log, hints, log tail, quick actions)
- views/agents-panels-overview.ts: agent overview panel

Refactored views:
- views/chat.ts: major refactor with STT, slash commands, search,
  export, pinned messages, input history
- views/config.ts: restructured config management
- views/agents.ts: streamlined agent management
- views/overview.ts: modular composition from sub-views
- views/sessions.ts: enhanced session management

Controllers:
- controllers/health.ts: new health check controller
- controllers/models.ts: new model catalog controller
- controllers/agents.ts: tools catalog improvements
- controllers/config.ts: config form enhancements

Tests & infrastructure:
- Updated test helpers, browser tests, node tests
- vite.config.ts: build configuration updates
- markdown.ts: rendering improvements

Build passes ✅ | 44 files | +6,626/-1,499
Part of openclaw#36853. Depends on openclaw#41497 and openclaw#41500.

* UI: fix chat review follow-ups

* fix(ui): repair chat clear and attachment regressions

* fix(ui): address remaining chat review comments

* fix(ui): address review follow-ups

* fix(ui): replay queued local slash commands

* fix(ui): repair control-ui type drift

* fix(ui): restore control UI styling

* feat(ui): enhance layout and styling for config and topbar components

- Updated grid layout for the config layout to allow full-width usage.
- Introduced new styles for top tabs and search components to improve usability.
- Added theme mode toggle styling for better visual integration.
- Implemented tests for layout and theme mode components to ensure proper rendering and functionality.

* feat(ui): add config file opening functionality and enhance styles

- Implemented a new handler to open the configuration file using the default application based on the operating system.
- Updated various CSS styles across components for improved visual consistency and usability, including adjustments to padding, margins, and font sizes.
- Introduced new styles for the data table and sidebar components to enhance layout and interaction.
- Added tests for the collapsed navigation rail to ensure proper functionality in different states.

* refactor(ui): update CSS styles for improved layout and consistency

- Simplified font-body declaration in base.css for cleaner code.
- Adjusted transition properties in components.css for better readability.
- Added new .workspace-link class in components.css for enhanced link styling.
- Changed config layout from grid to flex in config.css for better responsiveness.
- Updated related tests to reflect layout changes in config-layout.browser.test.ts.

* feat(ui): enhance theme handling and loading states in chat interface

- Updated CSS to support new theme mode attributes for better styling consistency across light and dark themes.
- Introduced loading skeletons in the chat view to improve user experience during data fetching.
- Refactored command palette to manage focus more effectively, enhancing accessibility.
- Added tests for the appearance theme picker and loading states to ensure proper rendering and functionality.

* refactor(ui): streamline ephemeral state management in chat and config views

- Introduced interfaces for ephemeral state in chat and config views to encapsulate related variables.
- Refactored state management to utilize a single object for better organization and maintainability.
- Removed legacy state variables and updated related functions to reference the new state structure.
- Enhanced readability and consistency across the codebase by standardizing state handling.

* chore: remove test files to reduce PR scope

* fix(ui): resolve type errors in debug props and chat search

* refactor(ui): remove stream mode functionality across various components

- Eliminated stream mode related translations and CSS styles to streamline the user interface.
- Updated multiple components to remove references to stream mode, enhancing code clarity and maintainability.
- Adjusted rendering logic in views to ensure consistent behavior without stream mode.
- Improved overall readability by cleaning up unused variables and props.

* fix(ui): add msg-meta CSS and fix rebase type errors

* fix(ui): add CSS for chat footer action buttons (TTS, delete) and msg-meta

* feat(ui): add delete confirmation with remember-decision checkbox

* fix(ui): delete confirmation with remember, attention icon sizing

* fix(ui): open delete confirm popover to the left (not clipped)

* fix(ui): show all nav items in collapsed sidebar, remove gap

* fix(ui): address P1/P2 review feedback — session queue clear, kill scope, palette guard, stop button

* fix(ui): address Greptile re-review — kill scope, queue flush, idle handling, parallel fetch

- SECURITY: /kill <target> now enforces session tree scope (not just /kill all)
- /kill reports idle sessions gracefully instead of throwing
- Queue continues draining after local slash commands
- /model fetches sessions.list + models.list in parallel (perf fix)

* fix(ui): style update banner close button — SVG stroke + sizing

* fix(ui): update layout styles for sidebar and content spacing

* UI: restore colon slash command parsing

* UI: restore slash command session queries

* Refactor thinking resolution: Introduce resolveThinkingDefaultForModel function and update model-selection to utilize it. Add tests for new functionality in thinking.test.ts.

* fix(ui): constrain welcome state logo size, add missing CSS for new session view

---------

Co-authored-by: Vincent Koc <[email protected]>
DexterSLamb pushed a commit to DexterSLamb/openclaw-tianjun that referenced this pull request May 3, 2026
…board-v2, highlighting the refreshed gateway dashboard with modular views and enhanced chat tools (openclaw#41503)
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 9, 2026
…enclaw#41503)

* feat(ui): add chat infrastructure modules (slice 1 of dashboard-v2)

New self-contained chat modules extracted from dashboard-v2-structure:

- chat/slash-commands.ts: slash command definitions and completions
- chat/slash-command-executor.ts: execute slash commands via gateway RPC
- chat/slash-command-executor.node.test.ts: test coverage
- chat/speech.ts: speech-to-text (STT) support
- chat/input-history.ts: per-session input history navigation
- chat/pinned-messages.ts: pinned message management
- chat/deleted-messages.ts: deleted message tracking
- chat/export.ts: shared exportChatMarkdown helper
- chat-export.ts: re-export shim for backwards compat

Gateway fix:
- Restore usage/cost stripping in chat.history sanitization
- Add test coverage for sanitization behavior

These modules are additive and tree-shaken — no existing code
imports them yet. They will be wired in subsequent slices.

* feat(ui): add utilities, theming, and i18n updates (slice 2 of dashboard-v2)

UI utilities and theming improvements extracted from dashboard-v2-structure:

Icons & formatting:
- icons.ts: expanded icon set for new dashboard views
- format.ts: date/number formatting helpers
- tool-labels.ts: human-readable tool name mappings

Theming:
- theme.ts: enhanced theme resolution and system theme support
- theme-transition.ts: simplified transition logic
- storage.ts: theme parsing improvements for settings persistence

Navigation & types:
- navigation.ts: extended tab definitions for dashboard-v2
- app-view-state.ts: expanded view state management
- types.ts: new type definitions (HealthSummary, ModelCatalogEntry, etc.)

Components:
- components/dashboard-header.ts: reusable header component

i18n:
- Updated en, pt-BR, zh-CN, zh-TW locales with new dashboard strings

All changes are additive or backwards-compatible. Build passes.
Part of openclaw#36853.

* feat(ui): dashboard-v2 views refactor (slice 3 of dashboard-v2)

Complete views refactor from dashboard-v2-structure, building on
slice 1 (chat infra, openclaw#41497) and slice 2 (utilities/theming, openclaw#41500).

Core app wiring:
- app.ts: updated host component with new state properties
- app-render.ts: refactored render pipeline for new dashboard layout
- app-render.helpers.ts: extracted render helpers
- app-settings.ts: theme listener lifecycle fix, cron runs on tab load
- app-gateway.ts: refactored chat event handling
- app-chat.ts: slash command integration

New views:
- views/command-palette.ts: command palette (Cmd+K)
- views/login-gate.ts: authentication gate
- views/bottom-tabs.ts: mobile tab navigation
- views/overview-*.ts: modular overview dashboard (cards, attention,
  event log, hints, log tail, quick actions)
- views/agents-panels-overview.ts: agent overview panel

Refactored views:
- views/chat.ts: major refactor with STT, slash commands, search,
  export, pinned messages, input history
- views/config.ts: restructured config management
- views/agents.ts: streamlined agent management
- views/overview.ts: modular composition from sub-views
- views/sessions.ts: enhanced session management

Controllers:
- controllers/health.ts: new health check controller
- controllers/models.ts: new model catalog controller
- controllers/agents.ts: tools catalog improvements
- controllers/config.ts: config form enhancements

Tests & infrastructure:
- Updated test helpers, browser tests, node tests
- vite.config.ts: build configuration updates
- markdown.ts: rendering improvements

Build passes ✅ | 44 files | +6,626/-1,499
Part of openclaw#36853. Depends on openclaw#41497 and openclaw#41500.

* UI: fix chat review follow-ups

* fix(ui): repair chat clear and attachment regressions

* fix(ui): address remaining chat review comments

* fix(ui): address review follow-ups

* fix(ui): replay queued local slash commands

* fix(ui): repair control-ui type drift

* fix(ui): restore control UI styling

* feat(ui): enhance layout and styling for config and topbar components

- Updated grid layout for the config layout to allow full-width usage.
- Introduced new styles for top tabs and search components to improve usability.
- Added theme mode toggle styling for better visual integration.
- Implemented tests for layout and theme mode components to ensure proper rendering and functionality.

* feat(ui): add config file opening functionality and enhance styles

- Implemented a new handler to open the configuration file using the default application based on the operating system.
- Updated various CSS styles across components for improved visual consistency and usability, including adjustments to padding, margins, and font sizes.
- Introduced new styles for the data table and sidebar components to enhance layout and interaction.
- Added tests for the collapsed navigation rail to ensure proper functionality in different states.

* refactor(ui): update CSS styles for improved layout and consistency

- Simplified font-body declaration in base.css for cleaner code.
- Adjusted transition properties in components.css for better readability.
- Added new .workspace-link class in components.css for enhanced link styling.
- Changed config layout from grid to flex in config.css for better responsiveness.
- Updated related tests to reflect layout changes in config-layout.browser.test.ts.

* feat(ui): enhance theme handling and loading states in chat interface

- Updated CSS to support new theme mode attributes for better styling consistency across light and dark themes.
- Introduced loading skeletons in the chat view to improve user experience during data fetching.
- Refactored command palette to manage focus more effectively, enhancing accessibility.
- Added tests for the appearance theme picker and loading states to ensure proper rendering and functionality.

* refactor(ui): streamline ephemeral state management in chat and config views

- Introduced interfaces for ephemeral state in chat and config views to encapsulate related variables.
- Refactored state management to utilize a single object for better organization and maintainability.
- Removed legacy state variables and updated related functions to reference the new state structure.
- Enhanced readability and consistency across the codebase by standardizing state handling.

* chore: remove test files to reduce PR scope

* fix(ui): resolve type errors in debug props and chat search

* refactor(ui): remove stream mode functionality across various components

- Eliminated stream mode related translations and CSS styles to streamline the user interface.
- Updated multiple components to remove references to stream mode, enhancing code clarity and maintainability.
- Adjusted rendering logic in views to ensure consistent behavior without stream mode.
- Improved overall readability by cleaning up unused variables and props.

* fix(ui): add msg-meta CSS and fix rebase type errors

* fix(ui): add CSS for chat footer action buttons (TTS, delete) and msg-meta

* feat(ui): add delete confirmation with remember-decision checkbox

* fix(ui): delete confirmation with remember, attention icon sizing

* fix(ui): open delete confirm popover to the left (not clipped)

* fix(ui): show all nav items in collapsed sidebar, remove gap

* fix(ui): address P1/P2 review feedback — session queue clear, kill scope, palette guard, stop button

* fix(ui): address Greptile re-review — kill scope, queue flush, idle handling, parallel fetch

- SECURITY: /kill <target> now enforces session tree scope (not just /kill all)
- /kill reports idle sessions gracefully instead of throwing
- Queue continues draining after local slash commands
- /model fetches sessions.list + models.list in parallel (perf fix)

* fix(ui): style update banner close button — SVG stroke + sizing

* fix(ui): update layout styles for sidebar and content spacing

* UI: restore colon slash command parsing

* UI: restore slash command session queries

* Refactor thinking resolution: Introduce resolveThinkingDefaultForModel function and update model-selection to utilize it. Add tests for new functionality in thinking.test.ts.

* fix(ui): constrain welcome state logo size, add missing CSS for new session view

---------

Co-authored-by: Vincent Koc <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 9, 2026
…board-v2, highlighting the refreshed gateway dashboard with modular views and enhanced chat tools (openclaw#41503)
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
…enclaw#41503)

* feat(ui): add chat infrastructure modules (slice 1 of dashboard-v2)

New self-contained chat modules extracted from dashboard-v2-structure:

- chat/slash-commands.ts: slash command definitions and completions
- chat/slash-command-executor.ts: execute slash commands via gateway RPC
- chat/slash-command-executor.node.test.ts: test coverage
- chat/speech.ts: speech-to-text (STT) support
- chat/input-history.ts: per-session input history navigation
- chat/pinned-messages.ts: pinned message management
- chat/deleted-messages.ts: deleted message tracking
- chat/export.ts: shared exportChatMarkdown helper
- chat-export.ts: re-export shim for backwards compat

Gateway fix:
- Restore usage/cost stripping in chat.history sanitization
- Add test coverage for sanitization behavior

These modules are additive and tree-shaken — no existing code
imports them yet. They will be wired in subsequent slices.

* feat(ui): add utilities, theming, and i18n updates (slice 2 of dashboard-v2)

UI utilities and theming improvements extracted from dashboard-v2-structure:

Icons & formatting:
- icons.ts: expanded icon set for new dashboard views
- format.ts: date/number formatting helpers
- tool-labels.ts: human-readable tool name mappings

Theming:
- theme.ts: enhanced theme resolution and system theme support
- theme-transition.ts: simplified transition logic
- storage.ts: theme parsing improvements for settings persistence

Navigation & types:
- navigation.ts: extended tab definitions for dashboard-v2
- app-view-state.ts: expanded view state management
- types.ts: new type definitions (HealthSummary, ModelCatalogEntry, etc.)

Components:
- components/dashboard-header.ts: reusable header component

i18n:
- Updated en, pt-BR, zh-CN, zh-TW locales with new dashboard strings

All changes are additive or backwards-compatible. Build passes.
Part of openclaw#36853.

* feat(ui): dashboard-v2 views refactor (slice 3 of dashboard-v2)

Complete views refactor from dashboard-v2-structure, building on
slice 1 (chat infra, openclaw#41497) and slice 2 (utilities/theming, openclaw#41500).

Core app wiring:
- app.ts: updated host component with new state properties
- app-render.ts: refactored render pipeline for new dashboard layout
- app-render.helpers.ts: extracted render helpers
- app-settings.ts: theme listener lifecycle fix, cron runs on tab load
- app-gateway.ts: refactored chat event handling
- app-chat.ts: slash command integration

New views:
- views/command-palette.ts: command palette (Cmd+K)
- views/login-gate.ts: authentication gate
- views/bottom-tabs.ts: mobile tab navigation
- views/overview-*.ts: modular overview dashboard (cards, attention,
  event log, hints, log tail, quick actions)
- views/agents-panels-overview.ts: agent overview panel

Refactored views:
- views/chat.ts: major refactor with STT, slash commands, search,
  export, pinned messages, input history
- views/config.ts: restructured config management
- views/agents.ts: streamlined agent management
- views/overview.ts: modular composition from sub-views
- views/sessions.ts: enhanced session management

Controllers:
- controllers/health.ts: new health check controller
- controllers/models.ts: new model catalog controller
- controllers/agents.ts: tools catalog improvements
- controllers/config.ts: config form enhancements

Tests & infrastructure:
- Updated test helpers, browser tests, node tests
- vite.config.ts: build configuration updates
- markdown.ts: rendering improvements

Build passes ✅ | 44 files | +6,626/-1,499
Part of openclaw#36853. Depends on openclaw#41497 and openclaw#41500.

* UI: fix chat review follow-ups

* fix(ui): repair chat clear and attachment regressions

* fix(ui): address remaining chat review comments

* fix(ui): address review follow-ups

* fix(ui): replay queued local slash commands

* fix(ui): repair control-ui type drift

* fix(ui): restore control UI styling

* feat(ui): enhance layout and styling for config and topbar components

- Updated grid layout for the config layout to allow full-width usage.
- Introduced new styles for top tabs and search components to improve usability.
- Added theme mode toggle styling for better visual integration.
- Implemented tests for layout and theme mode components to ensure proper rendering and functionality.

* feat(ui): add config file opening functionality and enhance styles

- Implemented a new handler to open the configuration file using the default application based on the operating system.
- Updated various CSS styles across components for improved visual consistency and usability, including adjustments to padding, margins, and font sizes.
- Introduced new styles for the data table and sidebar components to enhance layout and interaction.
- Added tests for the collapsed navigation rail to ensure proper functionality in different states.

* refactor(ui): update CSS styles for improved layout and consistency

- Simplified font-body declaration in base.css for cleaner code.
- Adjusted transition properties in components.css for better readability.
- Added new .workspace-link class in components.css for enhanced link styling.
- Changed config layout from grid to flex in config.css for better responsiveness.
- Updated related tests to reflect layout changes in config-layout.browser.test.ts.

* feat(ui): enhance theme handling and loading states in chat interface

- Updated CSS to support new theme mode attributes for better styling consistency across light and dark themes.
- Introduced loading skeletons in the chat view to improve user experience during data fetching.
- Refactored command palette to manage focus more effectively, enhancing accessibility.
- Added tests for the appearance theme picker and loading states to ensure proper rendering and functionality.

* refactor(ui): streamline ephemeral state management in chat and config views

- Introduced interfaces for ephemeral state in chat and config views to encapsulate related variables.
- Refactored state management to utilize a single object for better organization and maintainability.
- Removed legacy state variables and updated related functions to reference the new state structure.
- Enhanced readability and consistency across the codebase by standardizing state handling.

* chore: remove test files to reduce PR scope

* fix(ui): resolve type errors in debug props and chat search

* refactor(ui): remove stream mode functionality across various components

- Eliminated stream mode related translations and CSS styles to streamline the user interface.
- Updated multiple components to remove references to stream mode, enhancing code clarity and maintainability.
- Adjusted rendering logic in views to ensure consistent behavior without stream mode.
- Improved overall readability by cleaning up unused variables and props.

* fix(ui): add msg-meta CSS and fix rebase type errors

* fix(ui): add CSS for chat footer action buttons (TTS, delete) and msg-meta

* feat(ui): add delete confirmation with remember-decision checkbox

* fix(ui): delete confirmation with remember, attention icon sizing

* fix(ui): open delete confirm popover to the left (not clipped)

* fix(ui): show all nav items in collapsed sidebar, remove gap

* fix(ui): address P1/P2 review feedback — session queue clear, kill scope, palette guard, stop button

* fix(ui): address Greptile re-review — kill scope, queue flush, idle handling, parallel fetch

- SECURITY: /kill <target> now enforces session tree scope (not just /kill all)
- /kill reports idle sessions gracefully instead of throwing
- Queue continues draining after local slash commands
- /model fetches sessions.list + models.list in parallel (perf fix)

* fix(ui): style update banner close button — SVG stroke + sizing

* fix(ui): update layout styles for sidebar and content spacing

* UI: restore colon slash command parsing

* UI: restore slash command session queries

* Refactor thinking resolution: Introduce resolveThinkingDefaultForModel function and update model-selection to utilize it. Add tests for new functionality in thinking.test.ts.

* fix(ui): constrain welcome state logo size, add missing CSS for new session view

---------

Co-authored-by: Vincent Koc <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
…board-v2, highlighting the refreshed gateway dashboard with modular views and enhanced chat tools (openclaw#41503)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling app: web-ui App: web-ui gateway Gateway runtime maintainer Maintainer-authored PR size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants