Skip to content

fix: restore stock OpenClaw Wingman chat#16

Merged
hydro13 merged 5 commits intomainfrom
codex/openclaw-gateway-chat
Mar 17, 2026
Merged

fix: restore stock OpenClaw Wingman chat#16
hydro13 merged 5 commits intomainfrom
codex/openclaw-gateway-chat

Conversation

@hydro13
Copy link
Owner

@hydro13 hydro13 commented Mar 17, 2026

Summary

  • sign a real Tandem-owned OpenClaw device identity for the Wingman gateway handshake
  • switch stock OpenClaw chat to the official gateway-first send/receive path and persist replies into Tandem chat history
  • update the renderer to handle current gateway response frames and show honest OpenClaw connection state

Root cause

Issue #15 described the symptom correctly, but the deeper break was that stock Tandem was connecting to the OpenClaw gateway without a signed device identity. Current OpenClaw clears the requested operator scopes in that case, so chat.history and chat.send never complete even though the socket opens.

Verification

  • npx tsc --pretty false
  • npx vitest run
  • manual local round-trip in the Wingman panel against OpenClaw 2026.3.13
  • GET /config/openclaw-connect returns signed connect params with operator.read + operator.write
  • GET /chat shows persisted Robin/Wingman messages after a live exchange

Closes #15

hydro13 added 3 commits March 17, 2026 18:51
What was built/changed:
- New files: src/openclaw/connect.ts
- Modified files: src/api/routes/data.ts, src/api/tests/routes/data.test.ts, src/ipc/handlers.ts, src/panel/manager.ts, src/preload.ts, shell/chat/openclaw-backend.js, shell/chat/router.js, shell/js/wingman.js, TODO.md, CHANGELOG.md
- New API endpoints: GET /config/openclaw-connect
- Chat send/persist flow now stores Robin and Wingman messages without depending on the old local tandem-chat skill

Why this approach:
- Stock Tandem now signs a real OpenClaw device identity for the gateway WebSocket handshake and uses the same operator read/write chat flow as the official OpenClaw webchat
- This removes the hidden dependency on a local /chat polling bridge and fixes the misleading connected state in the panel

Tested:
- npx tsc --pretty false: zero errors
- npx vitest run: 34 files, 1036 passed, 39 skipped
- Manual: verified local OpenClaw gateway chat round-trip in the Wingman panel, GET /config/openclaw-connect, and persisted replies via GET /chat
What was built/changed:
- Modified files: CHANGELOG.md
- Removed stale Unreleased text and an unrelated duplicated v0.62.14 entry that came across while splitting the fix onto a fresh branch

Why this approach:
- Keeps the PR diff and release notes aligned with the actual code on top of origin/main

Tested:
- Manual: verified changelog now contains only the intended v0.62.14 chat entry above v0.62.13
@hydro13 hydro13 force-pushed the codex/openclaw-gateway-chat branch from 6aa9e11 to 7c7c34f Compare March 17, 2026 17:53
hydro13 added 2 commits March 17, 2026 18:59
What was built/changed:
- Modified files: src/api/routes/data.ts
- Swapped the OpenClaw token/connect route limiters to a CodeQL-recognized express-rate-limit middleware while keeping the existing request caps and messages

Why this approach:
- The endpoint was already protected by the custom limiter, but CodeQL does not treat that middleware as a proven rate limiter for this filesystem-backed handler
- Using a standard limiter on the sensitive OpenClaw config routes removes the false-positive gate without changing the user-visible behavior

Tested:
- npx tsc --pretty false: zero errors
- npx vitest run src/api/tests/routes/data.test.ts: 52 passed
@hydro13 hydro13 merged commit a7099aa into main Mar 17, 2026
4 checks passed
@hydro13 hydro13 deleted the codex/openclaw-gateway-chat branch March 17, 2026 18:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Wingman chat bridge is one-way — OpenClaw replies don't reach the panel

1 participant