Skip to content

Control UI: refresh slash commands from runtime command list#65620

Merged
BunsDev merged 7 commits into
mainfrom
okcode/control-ui-slash-commands-1
Apr 13, 2026
Merged

Control UI: refresh slash commands from runtime command list#65620
BunsDev merged 7 commits into
mainfrom
okcode/control-ui-slash-commands-1

Conversation

@BunsDev

@BunsDev BunsDev commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Summary

Describe the problem and fix in 2–5 bullets:

  • Problem: the Control UI chat composer and command palette built their slash-command list from built-in definitions only, so they missed runtime-discovered commands.
  • Why it matters: users could not discover or tab-complete dock commands, plugin commands, or direct skill aliases that the gateway already supports on the text command surface.
  • What changed: the Control UI now refreshes slash commands from commands.list for the active agent, keeps local UI-only commands layered on top, and reuses that live list in the command palette.
  • What did NOT change (scope boundary): command execution behavior was not broadened beyond the existing text command surface, and native-only channel commands are still not shown in the Control UI chat page.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

  • Closes #
  • Related #
  • This PR fixes a bug or regression

Root Cause (if applicable)

For bug fixes or regressions, explain why this happened, not just what changed. Otherwise write N/A. If the cause is unclear, write Unknown.

  • Root cause: the Control UI used buildBuiltinChatCommands() directly instead of the gateway’s live commands.list surface, so runtime-generated dock commands, plugin commands, and skill aliases never reached the chat UI.
  • Missing detection / guardrail: UI tests covered built-in slash-command parsing but not live command discovery from the runtime command catalog.
  • Contributing context (if known): the command palette reused the same static array, so the stale view was duplicated in both chat discovery surfaces.

Regression Test Plan (if applicable)

For bug fixes or regressions, name the smallest reliable test coverage that should catch this. Otherwise write N/A.

  • Coverage level that should have caught this:
    • Unit test
    • Seam / integration test
    • End-to-end test
    • Existing coverage already sufficient
  • Target test or file: ui/src/ui/chat/slash-commands.node.test.ts, ui/src/ui/views/command-palette.test.ts
  • Scenario the test should lock in: refreshing from commands.list should surface runtime dock/plugin/skill commands in both the composer slash menu source and the command palette.
  • Why this is the smallest reliable guardrail: the bug lives in the UI-side command source selection and can be verified without a full browser or gateway integration lane.
  • Existing test that already covers this (if any): none for runtime-discovered commands before this PR.
  • If no new test is added, why not: N/A

Post-review Security Fixes

  • Reserved trusted local commands remain authoritative even after loading remote commands.list data.
  • Remote command names and aliases must match a strict single-token slash identifier pattern before they enter the composer menu or command palette.
  • Remote command entries are always treated as remote for execution classification; they cannot become executeLocal by name collision.
  • commands.list payloads are now bounded on both the gateway and Control UI sides so oversized command catalogs, aliases, args, choices, or descriptions are truncated before they can pressure the UI.
  • Stale async slash-command refresh responses are ignored so an older command set cannot overwrite a newer agent/session view.
  • Session switches now trigger a fresh slash-command load for the new agent/session context.

User-visible / Behavior Changes

List user-visible changes (including defaults/config).
If none, write None.

  • The Control UI chat slash-command menu now shows runtime text commands from the gateway, including dock commands, bundled/plugin commands, and direct skill aliases when available.
  • The top command palette now stays in sync with the same live slash-command catalog instead of showing a built-in-only subset.
  • Post-review hardening: remote commands.list entries cannot mark themselves local, cannot shadow reserved local UI commands, and must pass strict slash-identifier validation before appearing in the UI.
  • Post-review hardening: session switches now refresh the live slash-command set immediately, and stale async refresh responses are ignored.

Diagram (if applicable)

For UI changes or non-trivial logic flows, include a small ASCII diagram reviewers can scan quickly. Otherwise write N/A.

Before:
[user opens / menu] -> [built-in-only list] -> [runtime commands missing]

After:
[user opens / menu] -> [commands.list for active agent] -> [live text command catalog] -> [composer + palette show matching commands]

Security Impact (required)

  • New permissions/capabilities? (Yes/No) No
  • Secrets/tokens handling changed? (Yes/No) No
  • New/changed network calls? (Yes/No) Yes
  • Command/tool execution surface changed? (Yes/No) No
  • Data access scope changed? (Yes/No) No
  • If any Yes, explain risk + mitigation: the UI now calls the existing authenticated gateway method commands.list; post-review hardening now keeps local command classification trusted-only, rejects unsafe remote slash identifiers, prevents remote collisions with reserved local commands, bounds command payload size on both the gateway and Control UI sides, and ignores stale refresh responses before they can overwrite a newer command set.

Repro + Verification

Environment

  • OS: macOS
  • Runtime/container: Node 22 / pnpm workspace
  • Model/provider: N/A
  • Integration/channel (if any): Control UI chat page
  • Relevant config (redacted): default local control-ui/gateway setup

Steps

  1. Open the Control UI chat page or command palette on a gateway that has runtime text commands beyond built-ins.
  2. Type / in chat or open the command palette.
  3. Check whether dock/plugin/skill commands appear.

Expected

  • The UI should show the same runtime text command surface the gateway exposes through commands.list.

Actual

  • Before this PR, the UI only showed built-ins plus UI-only commands.

Evidence

Attach at least one:

  • Failing test/log before + passing after
  • Trace/log snippets
  • Screenshot/recording
  • Perf numbers (if relevant)

Human Verification (required)

What you personally verified (not just CI), and how:

  • Verified scenarios: refreshed slash commands from the runtime command catalog, confirmed palette item generation follows the live command list, verified reserved local commands cannot be shadowed by remote entries, and verified existing local-command handling still compiles and passes targeted tests.
  • Edge cases checked: gateway-command refresh fallback path, dock command alias parsing, plugin command inclusion, direct skill command inclusion, unsafe remote identifier rejection, stale refresh response handling, and session-switch command refresh.
  • What you did not verify: manual browser interaction against a live gateway session.

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

If a bot review conversation is addressed by this PR, resolve that conversation yourself. Do not leave bot review conversation cleanup for maintainers.

Compatibility / Migration

  • Backward compatible? (Yes/No) Yes
  • Config/env changes? (Yes/No) No
  • Migration needed? (Yes/No) No
  • If yes, exact upgrade steps:

Risks and Mitigations

List only real risks for this PR. Add/remove entries as needed. If none, write None.

  • Risk: commands.list may temporarily fail or return a narrower set than expected for the active agent.
    • Mitigation: the UI falls back to the previous built-in command set instead of leaving slash discovery empty.
  • Risk: runtime command names may not map cleanly onto existing UI category/icon heuristics.
    • Mitigation: the change preserves existing overrides and uses conservative defaults for unknown commands.
  • Risk: remote command metadata is an untrusted input surface for the Control UI.
    • Mitigation: remote commands are normalized through strict identifier validation, cannot claim local execution behavior, cannot override reserved local UI commands, and stale async refreshes are dropped by sequence guard.

- Load live slash commands into the chat UI and command palette
- Keep builtin fallback behavior when runtime commands are unavailable
@openclaw-barnacle openclaw-barnacle Bot added app: web-ui App: web-ui size: M maintainer Maintainer-authored PR labels Apr 13, 2026
@greptile-apps

greptile-apps Bot commented Apr 13, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Replaces the static built-in slash-command list in the Control UI composer and command palette with a live commands.list fetch per active agent, layering UI-only commands on top and falling back to built-ins on error or when no client is available. The normalisation pipeline, dedup logic, and fallback path are all well-handled; the new tests cover dock, plugin, and skill command discovery including alias parsing.

Confidence Score: 5/5

Safe to merge; only a P2 concurrency refinement remains.

All correctness, fallback, and dedup logic is sound. The one open item is a stale-response race in refreshSlashCommands (no sequence guard), which is P2: it self-corrects on the next refresh and requires concurrent calls to manifest.

ui/src/ui/chat/slash-commands.ts — refreshSlashCommands lacks a concurrency guard

Prompt To Fix All With AI
This is a comment left during a code review.
Path: ui/src/ui/chat/slash-commands.ts
Line: 295-313

Comment:
**No concurrency guard against stale responses**

`SLASH_COMMANDS` is a shared mutable array. If `refreshChat` is called twice in quick succession (e.g., rapid agent switch or a reconnect event while the first request is still in-flight), both awaits resolve independently and whichever finishes *last* wins — which may be the older request's result. The fix is a simple sequence counter:

```suggestion
let _refreshSeq = 0;

export async function refreshSlashCommands(params: {
  client: GatewayBrowserClient | null;
  agentId?: string | null;
}): Promise<void> {
  const seq = ++_refreshSeq;
  const agentId = params.agentId?.trim();
  if (!params.client || !agentId) {
    replaceSlashCommands(buildFallbackSlashCommands());
    return;
  }
  try {
    const result = await params.client.request<CommandsListResult>("commands.list", {
      agentId,
      includeArgs: true,
      scope: "text",
    });
    if (seq !== _refreshSeq) return;
    replaceSlashCommands(buildSlashCommandsFromEntries(result?.commands ?? []));
  } catch {
    if (seq !== _refreshSeq) return;
    replaceSlashCommands(buildFallbackSlashCommands());
  }
}
```

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

Reviews (1): Last reviewed commit: "Refresh slash commands from runtime comm..." | Re-trigger Greptile

Comment thread ui/src/ui/chat/slash-commands.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: 18d2dae776

ℹ️ 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
@BunsDev BunsDev self-assigned this Apr 13, 2026
@BunsDev

BunsDev commented Apr 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the Aisle security findings and the stale-refresh note in a442db99ed.

What changed:

  • Remote commands no longer influence executeLocal classification. Local and remote command sources are separated, and executeLocal is only assigned for trusted local definitions.
  • Remote commands can no longer shadow reserved local names like /redirect, /kill, /clear, etc. The merge path now reserves local names first and ignores remote collisions.
  • Remote command identifiers are now validated before entering SLASH_COMMANDS. Unsafe names/aliases containing whitespace, colons, or other invalid characters are dropped, which also prevents palette insertion from turning into command/argument injection.
  • refreshSlashCommands now has a sequence guard so stale async responses do not overwrite a newer command set.
  • Session switches now refresh slash commands immediately, so agent-specific command surfaces do not stay stale after navigation.

Coverage added/updated:

  • ui/src/ui/chat/slash-commands.node.test.ts
    • remote/local collision protection
    • unsafe remote identifier rejection
    • stale refresh response guard
  • ui/src/ui/app-render.helpers.node.test.ts
    • session switch triggers slash-command refresh

Verification rerun after the fix:

  • pnpm test ui/src/ui/chat/slash-commands.node.test.ts ui/src/ui/views/command-palette.test.ts ui/src/ui/app-chat.test.ts ui/src/ui/app-render.helpers.node.test.ts
  • pnpm tsgo
  • pnpm build

@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: a442db99ed

ℹ️ 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-render.helpers.ts Outdated
@BunsDev

BunsDev commented Apr 13, 2026

Copy link
Copy Markdown
Contributor Author

Follow-up security fix landed in e953196247.

Additional hardening beyond the earlier command-trust fixes:

  • commands.list is now bounded at the gateway contract/serialization layer (src/gateway/protocol/schema/commands.ts, src/gateway/server-methods/commands.ts) so command count, aliases, args, choices, names, and descriptions are capped before they leave the server.
  • The Control UI keeps its own defensive caps in ui/src/ui/chat/slash-commands.ts, so an oversized runtime payload still gets truncated client-side before it can expand SLASH_COMMANDS or the command palette.
  • Coverage added in src/gateway/server-methods/commands.test.ts and ui/src/ui/chat/slash-commands.node.test.ts to lock in both caps.

Verification after the update:

  • pnpm test src/gateway/server-methods/commands.test.ts ui/src/ui/chat/slash-commands.node.test.ts ui/src/ui/views/command-palette.test.ts ui/src/ui/app-chat.test.ts ui/src/ui/app-render.helpers.node.test.ts
  • pnpm tsgo
  • pnpm build
  • pre-commit pnpm check

@openclaw-barnacle openclaw-barnacle Bot added the gateway Gateway runtime label Apr 13, 2026
@aisle-research-bot

aisle-research-bot Bot commented Apr 13, 2026

Copy link
Copy Markdown

🔒 Aisle Security Analysis

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

# Severity Title
1 🟡 Medium Client-side DoS via unbounded processing of gateway-provided command arrays
1. 🟡 Client-side DoS via unbounded processing of gateway-provided command arrays
Property Value
Severity Medium
CWE CWE-400
Location ui/src/ui/chat/slash-commands.ts:394-402

Description

The UI builds slash-command completion entries from the commands.list gateway response without enforcing bounds before iterating over arrays. If the gateway is compromised/malicious (or a MitM exists), it can return extremely large arrays, causing heavy CPU/memory use and freezing the UI.

Observed issues:

  • getRemoteCommandEntries() iterates over the entire result.commands array using .map()/.filter() with no pre-slice.
  • getEntryArgs() iterates over the entire entry.args array (again .map()/.filter()) before normalizeCommandEntry() later slices to MAX_REMOTE_ARGS.
  • getArgChoices() iterates over the entire arg.choices array before normalizeCommandEntry() later slices to MAX_REMOTE_CHOICES.

Even though later code slices the number of commands/args/choices used, the initial mapping already incurs O(n) time and allocates intermediate arrays for the full payload.

Vulnerable code (examples):

return commands
  .map((entry) => asRecord(entry))
  .filter((entry): entry is CommandEntry => entry !== null);
return rawArgs
  .map((arg) => asRecord(arg))
  .filter((arg): arg is Record<string, unknown> => arg !== null);

Recommendation

Enforce bounds before mapping/filtering to avoid work proportional to attacker-controlled payload sizes.

Example fix:

function getRemoteCommandEntries(result: CommandsListResult | null | undefined): CommandEntry[] {
  const commands = result?.commands;
  if (!Array.isArray(commands)) return [];

  return commands
    .slice(0, MAX_REMOTE_COMMANDS) // bound first
    .map((entry) => asRecord(entry))
    .filter((entry): entry is CommandEntry => entry !== null);
}

function getEntryArgs(entry: CommandEntry | Record<string, unknown>): Array<Record<string, unknown>> {
  const rawArgs = "args" in entry ? entry.args : undefined;
  if (!Array.isArray(rawArgs)) return [];

  return rawArgs
    .slice(0, MAX_REMOTE_ARGS) // bound first
    .map((arg) => asRecord(arg))
    .filter((arg): arg is Record<string, unknown> => arg !== null);
}

function getArgChoices(arg: Record<string, unknown>): LocalArgChoice[] {
  if (arg.dynamic === true) return [];
  const rawChoices = arg.choices;
  if (!Array.isArray(rawChoices)) return [];

  return rawChoices
    .slice(0, MAX_REMOTE_CHOICES) // bound first
    .map(/* ... */)
    .filter(/* ... */);
}

Additionally, consider adding a maximum WebSocket frame/message size and/or schema validation at the transport layer in GatewayBrowserClient to reject oversized responses early (before allocating large JS objects).


Analyzed PR: #65620 at commit b82728e

Last updated on: 2026-04-13T01:39:40Z

@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: 1982d22ae6

ℹ️ 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".

COMMAND_NAME_MAX_LENGTH,
),
...(nativeName ? { nativeName: clampString(nativeName, COMMAND_NAME_MAX_LENGTH) } : {}),
textAliases: [`/${clampString(textSpec.name, COMMAND_NAME_MAX_LENGTH)}`],

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.

P2 Badge Clamp plugin alias length including slash prefix

buildPluginCommandEntries clamps textSpec.name to COMMAND_NAME_MAX_LENGTH and then prepends /, so a plugin command name of length 200 still produces a 201-character alias. That exceeds the new CommandEntrySchema bound for textAliases and breaks the stated payload-size guarantee for commands.list in cases with long plugin command names. This can surface as schema-validation failures for strict clients consuming the protocol.

Useful? React with 👍 / 👎.

@BunsDev

BunsDev commented Apr 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the malformed-payload security check in b82728e810.

What changed:

  • refreshSlashCommands now narrows result.commands to a real array before passing anything into the slash-command normalization path.
  • Nested remote payloads are also narrowed defensively: malformed args, choices, name, description, and category values are dropped or clamped instead of being trusted as typed data.
  • A malformed commands payload now degrades safely to the local built-in command set rather than throwing from .slice() or nested property access.

Coverage:

  • ui/src/ui/chat/slash-commands.node.test.ts
    • malformed top-level commands shape
    • malformed nested args / choices / scalar fields

Verification rerun:

  • pnpm test ui/src/ui/chat/slash-commands.node.test.ts ui/src/ui/views/command-palette.test.ts ui/src/ui/app-chat.test.ts ui/src/ui/app-render.helpers.node.test.ts
  • pnpm tsgo
  • pre-commit pnpm check

@BunsDev
BunsDev merged commit d0c8377 into main Apr 13, 2026
10 checks passed
@BunsDev
BunsDev deleted the okcode/control-ui-slash-commands-1 branch April 13, 2026 01:38

@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: b82728e810

ℹ️ 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 on lines +486 to +489
await refreshSlashCommands({
client: host.client,
agentId: resolveAgentIdForSession(host),
});

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.

P2 Badge Avoid forcing "main" agent when refreshing slash commands

refreshChat now always calls refreshSlashCommands with resolveAgentIdForSession(host), and that resolver falls back to "main" when the session key is plain and snapshot.sessionDefaults is missing. Because sessionDefaults is optional in the gateway snapshot contract, this path can still happen (for older/partial snapshots), and in multi-agent configs where main is not a valid/default agent it makes commands.list fail and silently fall back to built-ins, so runtime dock/plugin/skill commands disappear right after chat refresh.

Useful? React with 👍 / 👎.

lovewanwan pushed a commit to lovewanwan/openclaw that referenced this pull request Apr 28, 2026
…w#65620)

* Refresh slash commands from runtime command list

- Load live slash commands into the chat UI and command palette
- Keep builtin fallback behavior when runtime commands are unavailable

* Apply suggestion from @greptile-apps[bot]

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Control UI: harden runtime slash command discovery

* Control UI: bound runtime slash command payloads

* Control UI: use default agent for plain session keys

* Control UI: guard malformed slash command payloads

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
ogt-redknie pushed a commit to ogt-redknie/OPENX that referenced this pull request May 2, 2026
…w#65620)

* Refresh slash commands from runtime command list

- Load live slash commands into the chat UI and command palette
- Keep builtin fallback behavior when runtime commands are unavailable

* Apply suggestion from @greptile-apps[bot]

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Control UI: harden runtime slash command discovery

* Control UI: bound runtime slash command payloads

* Control UI: use default agent for plain session keys

* Control UI: guard malformed slash command payloads

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 9, 2026
…w#65620)

* Refresh slash commands from runtime command list

- Load live slash commands into the chat UI and command palette
- Keep builtin fallback behavior when runtime commands are unavailable

* Apply suggestion from @greptile-apps[bot]

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Control UI: harden runtime slash command discovery

* Control UI: bound runtime slash command payloads

* Control UI: use default agent for plain session keys

* Control UI: guard malformed slash command payloads

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
globalcaos pushed a commit to globalcaos/tinkerclaw that referenced this pull request May 13, 2026
…w#65620)

* Refresh slash commands from runtime command list

- Load live slash commands into the chat UI and command palette
- Keep builtin fallback behavior when runtime commands are unavailable

* Apply suggestion from @greptile-apps[bot]

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Control UI: harden runtime slash command discovery

* Control UI: bound runtime slash command payloads

* Control UI: use default agent for plain session keys

* Control UI: guard malformed slash command payloads

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
…w#65620)

* Refresh slash commands from runtime command list

- Load live slash commands into the chat UI and command palette
- Keep builtin fallback behavior when runtime commands are unavailable

* Apply suggestion from @greptile-apps[bot]

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Control UI: harden runtime slash command discovery

* Control UI: bound runtime slash command payloads

* Control UI: use default agent for plain session keys

* Control UI: guard malformed slash command payloads

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
jameslcowan pushed a commit to jameslcowan/openclaw that referenced this pull request Jun 2, 2026
…w#65620)

* Refresh slash commands from runtime command list

- Load live slash commands into the chat UI and command palette
- Keep builtin fallback behavior when runtime commands are unavailable

* Apply suggestion from @greptile-apps[bot]

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Control UI: harden runtime slash command discovery

* Control UI: bound runtime slash command payloads

* Control UI: use default agent for plain session keys

* Control UI: guard malformed slash command payloads

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
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 gateway Gateway runtime maintainer Maintainer-authored PR size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant