Sync/upstream 2026 04 01#114
Conversation
…esponses API
Tools with no parameters produce { type: "object" } schemas without a
properties field. The OpenAI Responses API rejects these, silently
crashing entire sessions.
Add properties: {} injection in normalizeToolParameters() and
convertTools() to ensure all object-type schemas include a properties
field.
Closes openclaw#58246
Strip `reasoning.effort: "none"` from OpenAI-compatible payloads so GPT-5 models do not receive the unsupported value when thinking is off. Cover both the shared payload wrapper path and the websocket `response.create` builder with regression tests. Regeneration-Prompt: | Fix the OpenAI request-building bug where thinking set to off still forwards a reasoning payload with effort "none". GPT-5 mini rejects that value with a 400, so disabled reasoning must be represented by omitting the reasoning parameter entirely. Keep the change additive: sanitize OpenAI-compatible payloads in OpenClaw’s wrapper layer, make the websocket request builder stop emitting a reasoning block for "none", and add focused regression tests for both code paths.
… (thanks @ngutman) * fix(pairing): restore qr bootstrap onboarding handoff * fix(pairing): tighten bootstrap handoff follow-ups * fix(pairing): migrate legacy gateway device auth * fix(pairing): narrow qr bootstrap handoff scope * fix(pairing): clear ios tls trust on onboarding reset * fix(pairing): restore qr bootstrap onboarding handoff (openclaw#58382) (thanks @ngutman)
* refactor(tasks): add owner-key task access boundaries * test(acp): update task owner-key assertion * fix(tasks): align owner key checks and migration scope
* fix: preserve bundled channel plugin compat * fix: preserve bundled channel plugin compat (openclaw#58873) * fix: scope channel plugin compat to bundled plugins (openclaw#58873)
…58674) Slash commands like /model and /new were silently ignored when the inbound message body included metadata prefix blocks (Conversation info, Sender info, timestamps) injected by buildInboundUserContextPrefix. The command detection functions (hasControlCommand, isControlCommandMessage, parseSendPolicyCommand) now call stripInboundMetadata before normalizeCommandBody so embedded slash commands are correctly recognized.
* fix(agent): treat webchat exec approvals as native UI * docs(changelog): note webchat exec approval UI fix * test(agent): cover webchat native approval guidance
…osure (openclaw#58895) * qqbot: harden /bot-logs authorization fallback * fix(qqbot): harden bot logs allowlist guard * fix(qqbot): normalize bot logs allowlist entries
openclaw#58879) Merged via squash. Prepared head SHA: 87eb27d Co-authored-by: ryanlee-gemini <181323138+ryanlee-gemini@users.noreply.github.com> Co-authored-by: odysseus0 <8635094+odysseus0@users.noreply.github.com> Reviewed-by: @odysseus0
* feat(gateway): make chat history max chars configurable * fix(gateway): address review feedback * docs(changelog): note configurable chat history limits
@chinar-amrutkar) * fix(telegram): traverse error .cause chain in formatErrorMessage and match grammY HttpError grammY wraps network failures in HttpError with message 'Network request for ... failed!' and the original error in .cause. formatErrorMessage only checked err.message, so shouldRetry never fired for the most common transient failure class. Changes: - formatErrorMessage now traverses .cause chain, appending nested error messages (with cycle protection) - Added 'Network request' to TELEGRAM_RETRY_RE as belt-and-suspenders - Added tests for .cause traversal, circular references, and grammY HttpError retry behavior Fixes openclaw#51525 * style: fix oxfmt formatting in retry-policy.ts * fix: add braces to satisfy oxlint requirement * fix(telegram): keep send retries strict * test(telegram): cover wrapped retry paths * fix(telegram): retry rate-limited sends safely * fix: retry safe wrapped Telegram send failures (openclaw#51895) (thanks @chinar-amrutkar) * fix: preserve wrapped Telegram rate-limit retries (openclaw#51895) (thanks @chinar-amrutkar) --------- Co-authored-by: chinar-amrutkar <chinar-amrutkar@users.noreply.github.com> Co-authored-by: Ayaan Zaidi <hi@obviy.us>
…penclaw#57317) * feat(web-search): add bundled searxng plugin * test(web-search): cover searxng config wiring * test(web-search): include searxng in bundled provider inventory * test(web-search): keep searxng ordering aligned * fix(web-search): sanitize searxng result rows --------- Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* test: add anthropic thinking replay regressions * fix: preserve anthropic thinking blocks on replay * fix: preserve anthropic thinking replay (openclaw#58916) * fix: move anthropic replay changelog entry (openclaw#58916)
There was a problem hiding this comment.
Code Review
This pull request updates OpenClaw to version 2026.4.1 across mobile platforms and introduces major automation enhancements, including ClawFlow orchestration and background task tracking. It refines architecture boundaries, expands memory engine capabilities with QMD and Honcho support, and clarifies security models for HTTP endpoints and plugin installation. A new streaming heap snapshot parser was added to improve memory leak investigations. Feedback suggests improving the string search logic in the new scanner to handle self-overlapping prefixes more robustly.
| async find(sequence) { | ||
| let matched = 0; | ||
| while (true) { | ||
| const char = await this.next(); | ||
| if (char === null) { | ||
| fail(`Could not find ${sequence}`); | ||
| } | ||
| if (char === sequence[matched]) { | ||
| matched += 1; | ||
| if (matched === sequence.length) { | ||
| return; | ||
| } | ||
| continue; | ||
| } | ||
| matched = char === sequence[0] ? 1 : 0; | ||
| if (matched === sequence.length) { | ||
| return; | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
The find method implements a naive string search that can miss matches if the target sequence has self-overlapping prefixes (e.g., searching for "ABAC" in "ABABAC"). While likely safe for the specific JSON keys being searched in this script, a more robust implementation would use a standard algorithm like KMP to ensure correctness across all inputs.
No description provided.