Skip to content

fix(tui): autocomplete plugin commands like active-memory#73984

Open
hpt wants to merge 4 commits into
openclaw:mainfrom
hpt:fix/tui-plugin-command-autocomplete
Open

fix(tui): autocomplete plugin commands like active-memory#73984
hpt wants to merge 4 commits into
openclaw:mainfrom
hpt:fix/tui-plugin-command-autocomplete

Conversation

@hpt

@hpt hpt commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Merge remote command entries from commands.list into TUI slash-command autocomplete so plugin commands (for example /active-memory) appear in suggestions.
  • Refresh remote command suggestions when command context changes (/agent, /model, and session changes that alter agent/provider), while preserving local command argument-completion behavior on name collisions.
  • Align embedded and gateway command listing paths and add targeted TUI tests for command list hydration and refresh behavior.

Test plan

  • pnpm test src/tui/tui.test.ts
  • pnpm test src/tui/tui-command-handlers.test.ts
  • Manual: run pnpm tui, switch via /agents to claude-4, type /act, confirm /active-memory appears in autocomplete.
  • Manual: run /model <provider/model> and verify autocomplete updates to the current command surface.

Made with Cursor

@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed May 30, 2026, 12:57 AM ET / 04:57 UTC.

Summary
Review failed before ClawSweeper could summarize the requested change.

PR surface: Source +156, Tests +121. Total +277 across 12 files.

Reproducibility: unclear. The review failed before ClawSweeper could establish a reproduction path.

Review metrics: none identified.

Merge readiness
Overall: 🌊 off-meta tidepool
Proof: 🌊 off-meta tidepool
Patch quality: 🌊 off-meta tidepool
Result: rating does not apply to this item.

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

Risk before merge

  • [P1] No close action taken because the review did not complete.

Maintainer options:

  1. Decide the mitigation before merge
    Retry the Codex review after fixing the execution failure.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Next step before merge

  • [P1] Review did not complete, so no work-lane recommendation was made.
Review details

Best possible solution:

Retry the Codex review after fixing the execution failure.

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

Unclear. The review failed before ClawSweeper could establish a reproduction path.

Is this the best way to solve the issue?

Unclear. Retry the review first so ClawSweeper can evaluate the actual issue and fix direction.

AGENTS.md: unclear because the file could not be read completely.

Codex review notes: model gpt-5.5, reasoning high; reviewed against b9933b2ec119.

Label changes

Label justifications:

  • rating: 🌊 off-meta tidepool: Overall readiness is 🌊 off-meta tidepool; proof is 🌊 off-meta tidepool and patch quality is 🌊 off-meta tidepool.
Evidence reviewed

PR surface:

Source +156, Tests +121. Total +277 across 12 files.

View PR surface stats
Area Files Added Removed Net
Source 7 185 29 +156
Tests 5 136 15 +121
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 12 321 44 +277

What I checked:

  • failure reason: codex execution failed.
  • codex failure detail: Codex review failed for this PR with exit 1.
  • codex stdout: Per-item Codex failure; continuing with the rest of the shard.

Likely related people:

  • unknown: Codex failed before it could trace repository history. (role: review did not complete; confidence: low)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@greptile-apps

greptile-apps Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR introduces listCommands on TuiBackend and wires it into the autocomplete pipeline so plugin commands like /active-memory surface as TUI slash-command suggestions, with cache invalidation on /agent and /model changes.

  • Stale autocomplete on concurrent refresh: when refreshRemoteCommands(true) is called while another fetch is already in flight, the function awaits the existing promise and returns without issuing a new fetch for the updated context (new agent or provider). The cache key is then written with the old context, so the wrong command set is displayed until the user triggers another context change (see comment on tui.ts lines 591–594).
  • The refreshKey closure captures currentAgentId/modelProvider before the async fetch, so a mid-flight external session change can write a stale cache key even when the seq guard is active.

Confidence Score: 3/5

Safe to merge for the happy path, but the concurrent-refresh race can leave plugin commands stale after rapid agent/model switching.

One P1 concurrency defect (forced refresh defers to in-flight, never issues a catch-up fetch for the new context) caps the score at 4; the additional stale-closure concern on the cache key pulls it to 3. Both are in newly added TUI logic not covered by the existing tests for the race scenario.

src/tui/tui.ts — refreshRemoteCommands function (lines 583–627)

Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/tui/tui.ts
Line: 591-594

Comment:
**Stale autocomplete after concurrent forced refresh**

When `force=true` arrives while another fetch is already in flight, the function awaits the existing promise and returns without issuing a new fetch for the *current* context. After the in-flight completes, `remoteCommandsCacheKey` is set to the *old* context key. Because the non-forced path then sees the key as a cache hit, the wrong command set persists until the next agent/model/session change.

A realistic trigger: `/agent Work` starts a fetch tagged `work:openai`; the user immediately runs `/model anthropic/<model>` which calls `refreshRemoteCommands(true)` for `work:anthropic`. That second call defers to the first in-flight and returns — provider-specific plugin commands are never fetched.

The fix is to re-check the context key after the awaited in-flight resolves, and recurse if it has drifted from `remoteCommandsCacheKey`.

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

---

This is a comment left during a code review.
Path: src/tui/tui.ts
Line: 613

Comment:
**`refreshKey` closure captures pre-fetch context**

`refreshKey` is captured before the `await client.listCommands` call at line 587, so if `currentAgentId` or `sessionInfo.modelProvider` changes during the fetch (via an external session event), `remoteCommandsCacheKey` will be set to the stale key even though `seq === remoteCommandsRefreshSeq`. Consider re-computing the cache key from the live state at completion time, or ensure the seq guard is sufficient to invalidate it.

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

---

This is a comment left during a code review.
Path: src/tui/tui-backend.ts
Line: 116

Comment:
**`listCommands` is optional on the interface but always called without a null-check in tests**

Marking `listCommands?` as optional is fine for backward-compat, but the call sites in `tui.ts` guard with `typeof client.listCommands !== "function"` while `tui-command-handlers.test.ts` always provides the mock. Consider documenting that implementations should provide the method, or make the guard explicit in all call sites to avoid a silent no-op when a new backend type omits it.

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

Reviews (1): Last reviewed commit: "fix(tui): autocomplete plugin commands l..." | Re-trigger Greptile

Comment thread src/tui/tui.ts
Comment on lines +591 to +594
if (remoteCommandsRefreshInFlight) {
await remoteCommandsRefreshInFlight;
return;
}

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.

P1 Stale autocomplete after concurrent forced refresh

When force=true arrives while another fetch is already in flight, the function awaits the existing promise and returns without issuing a new fetch for the current context. After the in-flight completes, remoteCommandsCacheKey is set to the old context key. Because the non-forced path then sees the key as a cache hit, the wrong command set persists until the next agent/model/session change.

A realistic trigger: /agent Work starts a fetch tagged work:openai; the user immediately runs /model anthropic/<model> which calls refreshRemoteCommands(true) for work:anthropic. That second call defers to the first in-flight and returns — provider-specific plugin commands are never fetched.

The fix is to re-check the context key after the awaited in-flight resolves, and recurse if it has drifted from remoteCommandsCacheKey.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/tui/tui.ts
Line: 591-594

Comment:
**Stale autocomplete after concurrent forced refresh**

When `force=true` arrives while another fetch is already in flight, the function awaits the existing promise and returns without issuing a new fetch for the *current* context. After the in-flight completes, `remoteCommandsCacheKey` is set to the *old* context key. Because the non-forced path then sees the key as a cache hit, the wrong command set persists until the next agent/model/session change.

A realistic trigger: `/agent Work` starts a fetch tagged `work:openai`; the user immediately runs `/model anthropic/<model>` which calls `refreshRemoteCommands(true)` for `work:anthropic`. That second call defers to the first in-flight and returns — provider-specific plugin commands are never fetched.

The fix is to re-check the context key after the awaited in-flight resolves, and recurse if it has drifted from `remoteCommandsCacheKey`.

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

Comment thread src/tui/tui.ts
}))
.filter((command) => Boolean(command.name))
: [];
remoteCommandsCacheKey = refreshKey;

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 refreshKey closure captures pre-fetch context

refreshKey is captured before the await client.listCommands call at line 587, so if currentAgentId or sessionInfo.modelProvider changes during the fetch (via an external session event), remoteCommandsCacheKey will be set to the stale key even though seq === remoteCommandsRefreshSeq. Consider re-computing the cache key from the live state at completion time, or ensure the seq guard is sufficient to invalidate it.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/tui/tui.ts
Line: 613

Comment:
**`refreshKey` closure captures pre-fetch context**

`refreshKey` is captured before the `await client.listCommands` call at line 587, so if `currentAgentId` or `sessionInfo.modelProvider` changes during the fetch (via an external session event), `remoteCommandsCacheKey` will be set to the stale key even though `seq === remoteCommandsRefreshSeq`. Consider re-computing the cache key from the live state at completion time, or ensure the seq guard is sufficient to invalidate it.

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

Comment thread src/tui/tui-backend.ts
@@ -107,4 +112,5 @@ export type TuiBackend = {
resetSession: (key: string, reason?: "new" | "reset") => Promise<unknown>;
getGatewayStatus: () => Promise<unknown>;
listModels: () => Promise<TuiModelChoice[]>;
listCommands?: (opts?: { agentId?: string; provider?: string }) => Promise<TuiCommandChoice[]>;
};

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 listCommands is optional on the interface but always called without a null-check in tests

Marking listCommands? as optional is fine for backward-compat, but the call sites in tui.ts guard with typeof client.listCommands !== "function" while tui-command-handlers.test.ts always provides the mock. Consider documenting that implementations should provide the method, or make the guard explicit in all call sites to avoid a silent no-op when a new backend type omits it.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/tui/tui-backend.ts
Line: 116

Comment:
**`listCommands` is optional on the interface but always called without a null-check in tests**

Marking `listCommands?` as optional is fine for backward-compat, but the call sites in `tui.ts` guard with `typeof client.listCommands !== "function"` while `tui-command-handlers.test.ts` always provides the mock. Consider documenting that implementations should provide the method, or make the guard explicit in all call sites to avoid a silent no-op when a new backend type omits it.

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

@hpt hpt force-pushed the fix/tui-plugin-command-autocomplete branch 2 times, most recently from 7719365 to 69feb6c Compare April 29, 2026 03:47
@hpt

hpt commented Apr 29, 2026

Copy link
Copy Markdown
Contributor Author

Could a maintainer please rerun the failed checks for this PR?

I don’t have permission to rerun jobs in this repository.
From the logs, the current failures appear unrelated to the TUI changes in this PR:

check-lint: failing on existing lint issues in other files outside this PR’s touched surface.
checks-node-agentic-commands: shard timeout (no output for 180000ms, exit 143).
checks-node-core and check: aggregate failures caused by the two jobs above.
A rerun should help confirm whether these are transient/upstream issues.

hpt added 4 commits April 30, 2026 13:21
Merge remote plugin/active-memory command entries into TUI slash autocomplete and refresh them on agent/model/session context changes while preserving local argument completion behavior on name collisions.

Made-with: Cursor
Re-check command refresh context after awaiting an in-flight request and pin request agent/provider values to avoid dropping forced refreshes during rapid agent/model switches.

Made-with: Cursor
Replace the remaining getSlashCommands test call with getBuiltinSlashCommands to match the renamed API and avoid lint/test-types failures.

Made-with: Cursor
@hpt hpt force-pushed the fix/tui-plugin-command-autocomplete branch from 90d080d to 66217f6 Compare April 30, 2026 05:23
se7en-agent added a commit to se7en-agent/openclaw that referenced this pull request May 18, 2026
## Summary

- Problem: gateway-connected TUI slash autocomplete used its local/static command list, so plugin commands already exposed by the running Gateway through `commands.list` were invisible in TUI suggestions.
- Why it matters: users can verify plugin commands such as `/phone`, `/pair`, or `/dreaming` in the Gateway command surface, but typing the same prefix in `openclaw tui` did not suggest those plugin-owned commands.
- What changed: `GatewayChatClient` now exposes `commands.list`; TUI fetches text-scope command entries from the connected Gateway when supported and merges their aliases into slash autocomplete while keeping built-ins first.
- What did NOT change (scope boundary): this does not change plugin command registration, command execution/dispatch semantics, Discord native slash command sync, or embedded/local TUI command discovery.

## Change Type (select all)

- [x] 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
- [x] UI / DX
- [ ] CI/CD / infra

## Linked Issue/PR

- Closes #
- Related openclaw#78347
- Related openclaw#73984
- Related openclaw#61966
- [x] This PR fixes a bug or regression

## Real behavior proof (required for external PRs)

- Behavior or issue addressed: plugin commands present in the running Gateway command registry did not appear in `openclaw tui` slash autocomplete.
- Real environment tested: patched OpenClaw Docker image built from this branch (`se7en/openclaw:tui-plugin-autocomplete-test`), OpenClaw `2026.5.17`, loopback Gateway, temporary plugin command setup.
- Exact steps or command run after this patch:
  1. Confirm a plugin command exists in the running Gateway text command surface. Example from an existing OpenClaw setup:
     ```bash
     openclaw gateway call commands.list --params '{"scope":"text","includeArgs":false}' --json \
       | jq '.commands[] | select(.name == "phone")'
     ```
  2. Start the patched TUI against a Gateway with a plugin command loaded.
  3. Type the plugin command prefix, for example `/pho` for `/phone` or `/nemo` in the temporary NemoClaw validation setup.
  4. Submit the plugin command through TUI.
- Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output):
  ```text
  Existing Gateway plugin command example:
  {
    "name": "phone",
    "textAliases": ["/phone"],
    "description": "Arm/disarm high-risk phone node commands (camera/screen/writes).",
    "source": "plugin",
    "scope": "both",
    "acceptsArgs": true
  }

  Patched Docker/TUI validation command surface contained:
  {
    "name": "nemoclaw",
    "nativeName": "nemoclaw",
    "textAliases": ["/nemoclaw"],
    "description": "NemoClaw sandbox management (status, eject).",
    "source": "plugin",
    "scope": "both",
    "acceptsArgs": true
  }

  openclaw tui autocomplete after typing /nemo showed:
  → nemoclaw    NemoClaw sandbox management (status, eject).

  openclaw tui --message '/nemoclaw status' returned:
  NemoClaw: No operations performed yet. Run nemoclaw onboard to get started.
  ```
- Observed result after fix: plugin command aliases from the running Gateway appeared in TUI slash autocomplete and the command could be submitted through the TUI/Gateway path.
- What was not tested: Discord native slash command registration/sync, `openclaw agent --message` plugin dispatch, and embedded/local TUI dynamic plugin discovery.
- Before evidence (optional but encouraged): current installed host OpenClaw `2026.5.12` and sandbox OpenClaw `2026.4.24` TUI bundles used static `getSlashCommands(...)` autocomplete and did not call `commands.list`.

## Root Cause (if applicable)

- Root cause: `src/tui/tui.ts` built its autocomplete provider from `getSlashCommands(...)`, which combined built-in/local command metadata but did not consume the running Gateway's plugin command registry.
- Missing detection / guardrail: there was no TUI-side regression coverage proving `commands.list` entries are requested and merged into slash autocomplete.
- Contributing context (if known): plugin commands can be registered and exposed by the Gateway independently from the static TUI command list, so a connected TUI needs to use the Gateway command surface as the source of truth for dynamic commands.

## Regression Test Plan (if applicable)

- Coverage level that should have caught this:
  - [x] Unit test
  - [x] Seam / integration test
  - [ ] End-to-end test
  - [ ] Existing coverage already sufficient
- Target test or file:
  - `src/tui/commands.test.ts`
  - `src/tui/gateway-chat.test.ts`
- Scenario the test should lock in: dynamic command entries from the Gateway are requested through `commands.list`, merged into TUI slash commands, deduplicated, and do not replace built-in commands on name collisions.
- Why this is the smallest reliable guardrail: it tests the TUI command merge behavior and the Gateway client RPC without requiring a real plugin package or a channel integration.
- Existing test that already covers this (if any): none before this change.
- If no new test is added, why not: N/A; focused tests were added.

## User-visible / Behavior Changes

Gateway-connected `openclaw tui` can now suggest plugin-owned slash command aliases that are already exposed by the running Gateway command surface. Built-in/static suggestions remain first and keep priority on collisions.

## Diagram (if applicable)

```text
Before:
[user types /pho in openclaw tui]
  -> TUI local/static slash list only
  -> plugin command from Gateway commands.list is not suggested

After:
[user types /pho in openclaw tui]
  -> TUI local/static slash list
  -> Gateway commands.list text-scope entries
  -> merged autocomplete suggestions include plugin aliases such as /phone
```

## 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 TUI may call the existing authenticated Gateway RPC method `commands.list` over the already-established Gateway connection. This reads command metadata only; it does not execute commands or expose secrets. Failures are caught and ignored so autocomplete falls back to the existing static list.

## Repro + Verification

### Environment

- OS: Linux
- Runtime/container: Docker image built from patched OpenClaw source (`se7en/openclaw:tui-plugin-autocomplete-test`)
- Model/provider: not relevant for autocomplete; sandbox test used `nvidia/nemotron-3-super-120b-a12b` for the NemoClaw environment
- Integration/channel (if any): TUI connected to Gateway
- Relevant config (redacted): loopback Gateway with temporary local plugin registration; no secrets included in evidence

### Steps

1. Install or load a plugin that registers a slash command through `api.registerCommand(...)`.
2. Confirm the running Gateway exposes it:
   ```bash
   openclaw gateway call commands.list --params '{"scope":"text","includeArgs":false}' --json
   ```
3. Start `openclaw tui` against that Gateway and type the plugin command prefix.

### Expected

- TUI autocomplete includes plugin command aliases from the running Gateway command surface.

### Actual

- Before this patch, TUI autocomplete only included the local/static slash command list.
- After this patch, plugin command aliases from `commands.list` are merged into autocomplete.

## Evidence

Attach at least one:

- [x] Failing test/log before + passing after
- [x] Trace/log snippets
- [ ] Screenshot/recording
- [ ] Perf numbers (if relevant)

Focused verification run after the final narrowing change:

```bash
COREPACK_HOME=/tmp/corepack PNPM_HOME=/tmp/pnpm \
  node scripts/run-vitest.mjs run \
  src/tui/commands.test.ts \
  src/tui/gateway-chat.test.ts \
  src/tui/embedded-backend.test.ts
# 3 files passed, 43 tests passed

COREPACK_HOME=/tmp/corepack PNPM_HOME=/tmp/pnpm \
  pnpm exec tsc --noEmit --pretty false --project tsconfig.core.json
# passed

git diff --check
# passed
```

## Human Verification (required)

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

- Verified scenarios:
  - Patched Docker image built from the OpenClaw branch.
  - Gateway `commands.list` returned a plugin command entry for `/nemoclaw` in the temporary plugin validation setup.
  - Patched `openclaw tui` autocomplete showed `→ nemoclaw    NemoClaw sandbox management (status, eject).`
  - `/nemoclaw status` submitted through the patched TUI/Gateway path returned plugin output.
  - Focused TUI command merge/client tests passed after narrowing the code path to gateway backends.
- Edge cases checked:
  - Dynamic plugin commands do not override built-in command names.
  - `commands.list` failures are soft-failed and leave the static autocomplete list intact.
  - Backends without `listCommands` keep the previous behavior.
- What you did **not** verify:
  - Discord native slash command sync/ack behavior.
  - `openclaw agent --message` plugin command dispatch.
  - Embedded/local TUI dynamic plugin discovery.

## 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.

N/A — no PR review conversations exist yet.

## Compatibility / Migration

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

## Risks and Mitigations

- Risk: a Gateway may be older or may reject/fail `commands.list`.
  - Mitigation: the call is optional and failures are ignored; TUI keeps the existing static slash autocomplete.
- Risk: plugin command names could collide with built-in commands.
  - Mitigation: built-in/static commands are added first and dynamic commands are deduplicated without overriding them.
@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added stale Marked as stale due to inactivity triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 30, 2026
@clawsweeper clawsweeper Bot added the rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. label May 30, 2026
@barnacle-openclaw barnacle-openclaw Bot removed the stale Marked as stale due to inactivity label May 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. size: M triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant