Merged
Conversation
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
6aa9e11 to
7c7c34f
Compare
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
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.historyandchat.sendnever complete even though the socket opens.Verification
npx tsc --pretty falsenpx vitest run2026.3.13GET /config/openclaw-connectreturns signed connect params withoperator.read+operator.writeGET /chatshows persisted Robin/Wingman messages after a live exchangeCloses #15