[ { "additions": 40, "author": "Takhoffman", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - front-load the multiple-gateways page with a single best recommended rescue-bot setup - add a short rescue-bot quickstart before the lower-level isolation/reference material - keep the main bot on the default profile in the re\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69803", "created_at": "2026-04-21T17:58:47Z", "deletions": 63, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69803/files", "html_url": "https://github.com/openclaw/openclaw/pull/69803", "labels": [ "docs", "gateway", "maintainer", "size: XS" ], "merged": true, "number": 69803, "review_comments_count": 0, "state": "open", "title": "docs: front-load rescue bot quickstart", "updated_at": "2026-04-21T18:00:29Z" }, { "additions": 125, "author": "happydog-bot", "author_association": "NONE", "body_excerpt": "## Summary Switch the `obsidian` skill from the third-party [yakitrak/obsidian-cli](https://github.com/yakitrak/obsidian-cli) to the official Obsidian CLI that ships with the Obsidian app itself. ## Why - **Official CLI exposes ~90 command\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69802", "created_at": "2026-04-21T17:58:42Z", "deletions": 42, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69802/files", "html_url": "https://github.com/openclaw/openclaw/pull/69802", "labels": [ "size: S" ], "merged": false, "number": 69802, "review_comments_count": 2, "state": "open", "title": "skills/obsidian: switch to official Obsidian CLI", "updated_at": "2026-04-21T18:00:47Z" }, { "additions": 193, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "# fix(openshell): pin sandbox file reads ## Summary Describe the problem and fix in 2-5 bullets: - Problem: OpenShell sandbox reads validated the requested path and then reread the unresolved host path, leaving a race window where a swappe\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69798", "created_at": "2026-04-21T17:38:36Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69798/files", "html_url": "https://github.com/openclaw/openclaw/pull/69798", "labels": [ "maintainer", "size: S" ], "merged": false, "number": 69798, "review_comments_count": 5, "state": "open", "title": "fix(openshell): pin sandbox file reads", "updated_at": "2026-04-21T17:59:48Z" }, { "additions": 67, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "# fix(openshell): pin host writes to sandbox root ## Summary Describe the problem and fix in 2\u20135 bullets: - Problem: `OpenShellFsBridge.writeFile` validated a target path and then performed `mkdir`, temp-file creation, and rename through t\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69797", "created_at": "2026-04-21T17:32:01Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69797/files", "html_url": "https://github.com/openclaw/openclaw/pull/69797", "labels": [ "maintainer", "size: S" ], "merged": false, "number": 69797, "review_comments_count": 2, "state": "open", "title": "fix(openshell): pin host writes to sandbox root", "updated_at": "2026-04-21T18:00:30Z" }, { "additions": 89, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "# fix(gateway): derive loopback owner context from token ## Summary Describe the problem and fix in 2\u20135 bullets: - Problem: MCP loopback requests accepted owner context from a child-process-controlled header, so a non-owner bearer could cl\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69796", "created_at": "2026-04-21T17:30:42Z", "deletions": 52, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69796/files", "html_url": "https://github.com/openclaw/openclaw/pull/69796", "labels": [ "gateway", "agents", "maintainer", "size: S" ], "merged": false, "number": 69796, "review_comments_count": 2, "state": "open", "title": "fix(gateway): derive loopback owner context from token", "updated_at": "2026-04-21T17:33:41Z" }, { "additions": 84, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "# fix(exec): block heredoc parameter expansion ## Summary - Problem: The exec allowlist analyzer rejected `` `...` ``, `$(`, and `${...}` in unquoted heredocs but still allowed plain shell parameter expansion forms like `$OPENAI_API_KEY`.\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69795", "created_at": "2026-04-21T17:28:27Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69795/files", "html_url": "https://github.com/openclaw/openclaw/pull/69795", "labels": [ "maintainer", "size: XS" ], "merged": false, "number": 69795, "review_comments_count": 1, "state": "open", "title": "fix(exec): block heredoc parameter expansion", "updated_at": "2026-04-21T17:58:29Z" }, { "additions": 252, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "# fix(tlon): guard memex upload target ## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: /.openclaw/plugin-compat-cache.json`, keyed by a sha256 of the openclaw compatibility host version plus the normalized plugins config - warm `openclaw status` r\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69781", "created_at": "2026-04-21T16:01:57Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69781/files", "html_url": "https://github.com/openclaw/openclaw/pull/69781", "labels": [ "size: M" ], "merged": false, "number": 69781, "review_comments_count": 5, "state": "open", "title": "perf(status): cache plugin compatibility notices by config + openclaw version", "updated_at": "2026-04-21T16:50:14Z" }, { "additions": 437, "author": "osolmaz", "author_association": "MEMBER", "body_excerpt": "## Summary Maintainers need a repeatable way to decide whether a PR or issue is a duplicate. This adds a new skill that turns that work into a concrete manual. It explains how to gather evidence with ghreplica and pr-search, how to group r\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69780", "created_at": "2026-04-21T15:57:37Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69780/files", "html_url": "https://github.com/openclaw/openclaw/pull/69780", "labels": [ "maintainer", "size: M" ], "merged": false, "number": 69780, "review_comments_count": 7, "state": "open", "title": "docs(skills): add duplicate triage maintainer skill", "updated_at": "2026-04-21T16:22:31Z" }, { "additions": 4, "author": "chinar-amrutkar", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary The `#confirmPersistedOffset()` method calls `getUpdates({ offset, limit: 1, timeout: 0 })` at startup before main polling begins. This confirmation call was causing 409 Conflict errors when Telegram had stale polling state from\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69779", "created_at": "2026-04-21T15:56:47Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69779/files", "html_url": "https://github.com/openclaw/openclaw/pull/69779", "labels": [ "channel: telegram", "size: XS" ], "merged": false, "number": 69779, "review_comments_count": 3, "state": "open", "title": "fix(telegram): remove offset confirmation getUpdates call to prevent 409 self-conflict", "updated_at": "2026-04-21T16:09:18Z" }, { "additions": 467, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "# fix(gateway): require auth for control UI avatar route ## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `B\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69775", "created_at": "2026-04-21T15:50:35Z", "deletions": 85, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69775/files", "html_url": "https://github.com/openclaw/openclaw/pull/69775", "labels": [ "app: web-ui", "gateway", "maintainer", "size: L" ], "merged": false, "number": 69775, "review_comments_count": 4, "state": "open", "title": "fix(gateway): require auth for control UI avatar route", "updated_at": "2026-04-21T18:00:45Z" }, { "additions": 47, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "# fix: require owner identity for owner-enforced commands ## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69774", "created_at": "2026-04-21T15:49:12Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69774/files", "html_url": "https://github.com/openclaw/openclaw/pull/69774", "labels": [ "maintainer", "size: S" ], "merged": true, "number": 69774, "review_comments_count": 0, "state": "closed", "title": "fix: require owner identity for owner-enforced commands", "updated_at": "2026-04-21T16:22:28Z" }, { "additions": 71, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "# fix(control-ui): block remote image loads ## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker:\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69773", "created_at": "2026-04-21T15:47:28Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69773/files", "html_url": "https://github.com/openclaw/openclaw/pull/69773", "labels": [ "app: web-ui", "gateway", "maintainer", "size: S" ], "merged": true, "number": 69773, "review_comments_count": 1, "state": "closed", "title": "fix(control-ui): block remote image loads", "updated_at": "2026-04-21T16:30:33Z" }, { "additions": 139, "author": "VACInc", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: - Problem: `loadSessionStore()` fell back to helper defaults when callers did not pass `opts.maintenanceConfig`, so load-time maintenance could ignore the real resolved `session.maint\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69772", "created_at": "2026-04-21T15:42:31Z", "deletions": 29, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69772/files", "html_url": "https://github.com/openclaw/openclaw/pull/69772", "labels": [ "size: S" ], "merged": false, "number": 69772, "review_comments_count": 0, "state": "open", "title": "fix: honor resolved session maintenance config on load", "updated_at": "2026-04-21T16:02:00Z" }, { "additions": 62, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Normalize generic `message` tool trace entries to the resolved cron channel when they match the resolved delivery target. This keeps run-log audits readable without changing delivery behavior. Tests: - `pnpm test src/cron/isolated-agent/ru\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69771", "created_at": "2026-04-21T15:41:38Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69771/files", "html_url": "https://github.com/openclaw/openclaw/pull/69771", "labels": [ "maintainer", "size: S" ], "merged": false, "number": 69771, "review_comments_count": 0, "state": "open", "title": "Fix cron message trace channel", "updated_at": "2026-04-21T15:44:10Z" }, { "additions": 409, "author": "Men-cotton", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 21, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69766", "created_at": "2026-04-21T15:28:35Z", "deletions": 106, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69766/files", "html_url": "https://github.com/openclaw/openclaw/pull/69766", "labels": [ "channel: telegram", "scripts", "agents", "size: L" ], "merged": false, "number": 69766, "review_comments_count": 2, "state": "open", "title": "Plugins: remove hardcoded Telegram and web-search IDs", "updated_at": "2026-04-21T15:39:02Z" }, { "additions": 4, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69765", "created_at": "2026-04-21T15:26:36Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69765/files", "html_url": "https://github.com/openclaw/openclaw/pull/69765", "labels": [ "agents", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69765, "review_comments_count": 0, "state": "closed", "title": "Fix/minimax 529 overloaded failover", "updated_at": "2026-04-21T15:34:17Z" }, { "additions": 37, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69764", "created_at": "2026-04-21T15:26:19Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69764/files", "html_url": "https://github.com/openclaw/openclaw/pull/69764", "labels": [ "channel: telegram", "app: web-ui", "cli", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69764, "review_comments_count": 2, "state": "closed", "title": "Fix/logging subsystem optional chain", "updated_at": "2026-04-21T15:34:18Z" }, { "additions": 1, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69763", "created_at": "2026-04-21T15:26:03Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69763/files", "html_url": "https://github.com/openclaw/openclaw/pull/69763", "labels": [ "app: web-ui", "gateway", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69763, "review_comments_count": 0, "state": "closed", "title": "Fix/exec approvals source field", "updated_at": "2026-04-21T15:37:09Z" }, { "additions": 46, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "fix(telegram): bypass model catalog cache in /model picker (#69750) The Telegram /model picker was calling loadModelCatalog without useCache: false, which caused it to serve stale model lists after config changes. Other picker UI paths (mo\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69761", "created_at": "2026-04-21T15:23:04Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69761/files", "html_url": "https://github.com/openclaw/openclaw/pull/69761", "labels": [ "size: XS", "r: too-many-prs" ], "merged": false, "number": 69761, "review_comments_count": 0, "state": "closed", "title": "fix(telegram): bypass model catalog cache in /model picker (#69750)", "updated_at": "2026-04-21T15:34:16Z" }, { "additions": 12, "author": "Patrick-Erichsen", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Two small follow-ups to #69553: - **Security disclaimer**: drop the yellow warning banner and \u26a0 icon, go back to original text. - **Searchable autocompletes** on the remaining onboarding pickers with long dynamic option lists: -\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69760", "created_at": "2026-04-21T15:21:20Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69760/files", "html_url": "https://github.com/openclaw/openclaw/pull/69760", "labels": [ "maintainer", "size: XS" ], "merged": true, "number": 69760, "review_comments_count": 0, "state": "closed", "title": "onboard: plain-prose security disclaimer + searchable pickers", "updated_at": "2026-04-21T15:55:14Z" }, { "additions": 2349, "author": "hugh-agent", "author_association": "NONE", "body_excerpt": null, "changed_files": 14, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69757", "created_at": "2026-04-21T15:14:12Z", "deletions": 22, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69757/files", "html_url": "https://github.com/openclaw/openclaw/pull/69757", "labels": [ "channel: telegram", "size: XL" ], "merged": false, "number": 69757, "review_comments_count": 4, "state": "open", "title": "Fix Telegram reply mode by chat type", "updated_at": "2026-04-21T15:21:34Z" }, { "additions": 122, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem Since 2026.4.1, auth-profiles.json entries with \\`\\\"type\\\": \\\"aws-sdk\\\"\\` are rejected as \\`invalid_type\\` and dropped during store load. This silently breaks Amazon Bedrock on EC2 instances that rely on IMDS (instance metadata)\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69753", "created_at": "2026-04-21T15:04:48Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69753/files", "html_url": "https://github.com/openclaw/openclaw/pull/69753", "labels": [ "agents", "size: S" ], "merged": false, "number": 69753, "review_comments_count": 1, "state": "open", "title": "fix(auth-profiles): silently skip aws-sdk SDK-managed markers during store load", "updated_at": "2026-04-21T15:14:59Z" }, { "additions": 75, "author": "novajune", "author_association": "NONE", "body_excerpt": "## Summary - prefer `threadId` over `replyToId` when Slack outbound delivery sends threaded replies - preserve derived thread-scoped session routing when a broader session key is provided - add regression coverage for outbound adapter prec\u2026", "changed_files": 4, "cluster_id": "cluster-69429-2", "cluster_ids": [ "cluster-69429-2" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69752", "created_at": "2026-04-21T15:03:32Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69752/files", "html_url": "https://github.com/openclaw/openclaw/pull/69752", "labels": [ "channel: slack", "gateway", "size: S" ], "merged": false, "number": 69752, "review_comments_count": 0, "state": "open", "title": "fix(slack): preserve thread-specific routing", "updated_at": "2026-04-21T15:14:59Z" }, { "additions": 62, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Problem Ollama returns tool_call arguments as a JSON string when using some models (e.g. gemma4:26b). `buildAssistantMessage` previously passed the raw string directly to downstream handlers, causing tool invocations to receive broken t\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69751", "created_at": "2026-04-21T15:00:52Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69751/files", "html_url": "https://github.com/openclaw/openclaw/pull/69751", "labels": [ "channel: zalo", "app: web-ui", "size: S" ], "merged": false, "number": 69751, "review_comments_count": 1, "state": "open", "title": "fix(ollama): deserialize string tool_call arguments in buildAssistantMessage", "updated_at": "2026-04-21T15:23:27Z" }, { "additions": 9, "author": "wangshu94", "author_association": "NONE", "body_excerpt": "## Summary `chat.send` never registered the run in `chatRunState.registry`, so lifecycle `phase: \"error\"` events were swallowed by `skipChatErrorFinal` in the gateway handler. TUI/Web UI hung in `waiting` forever on any agent failure (401\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69747", "created_at": "2026-04-21T14:54:52Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69747/files", "html_url": "https://github.com/openclaw/openclaw/pull/69747", "labels": [ "app: web-ui", "gateway", "size: XS" ], "merged": false, "number": 69747, "review_comments_count": 1, "state": "open", "title": "fix(gateway): surface chat.send lifecycle errors to clients", "updated_at": "2026-04-21T16:10:11Z" }, { "additions": 238, "author": "ACMILANTX", "author_association": "NONE", "body_excerpt": "## Summary - Add manifest-declared slot dependencies for plugin activation. - Include selected slot owners during scoped primary plugin CLI loading. - Mark memory-wiki as requiring the active memory slot so bridge/status/doctor can see pub\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69744", "created_at": "2026-04-21T14:43:46Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69744/files", "html_url": "https://github.com/openclaw/openclaw/pull/69744", "labels": [ "docs", "size: M", "extensions: memory-wiki" ], "merged": false, "number": 69744, "review_comments_count": 0, "state": "open", "title": "Fix scoped plugin CLI loading for memory wiki bridge artifacts", "updated_at": "2026-04-21T14:51:14Z" }, { "additions": 422, "author": "clivemoore", "author_association": "NONE", "body_excerpt": "## Summary Phase 2 of the security audit \u2014 four independent items, all additive, zero runtime behavior change. Each item is self-contained and the commits are ordered so reviewers can bisect by ID. **SEC-2 \u2014 Playwright evaluate threat-mode\u2026", "changed_files": 18, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69743", "created_at": "2026-04-21T14:42:03Z", "deletions": 47, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69743/files", "html_url": "https://github.com/openclaw/openclaw/pull/69743", "labels": [ "app: web-ui", "gateway", "scripts", "agents", "size: M" ], "merged": false, "number": 69743, "review_comments_count": 7, "state": "closed", "title": "Phase 2 security audit: SEC-2 + OBS-2 + JS-3 + SEC-1", "updated_at": "2026-04-21T17:01:51Z" }, { "additions": 171, "author": "sunlight7777777", "author_association": "NONE", "body_excerpt": "## Problem Debug environment variables like OPENCLAW_DEBUG_INGRESS_TIMING could be accidentally enabled in production, potentially exposing sensitive timing information or increasing attack surface. ## Solution - Add production environment\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69740", "created_at": "2026-04-21T14:22:12Z", "deletions": 130, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69740/files", "html_url": "https://github.com/openclaw/openclaw/pull/69740", "labels": [ "app: web-ui", "agents", "size: M" ], "merged": false, "number": 69740, "review_comments_count": 6, "state": "open", "title": "fix(agents): secure debug env var access and add validation", "updated_at": "2026-04-21T17:48:01Z" }, { "additions": 18, "author": "soloclz", "author_association": "NONE", "body_excerpt": "## Summary - make `buildPluginCompatibilityNotices()` use the snapshot report path by default - preserve the explicit `report` override path for callers that already have diagnostics - update plugin status tests to assert metadata snapshot\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69736", "created_at": "2026-04-21T14:12:04Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69736/files", "html_url": "https://github.com/openclaw/openclaw/pull/69736", "labels": [ "size: XS" ], "merged": false, "number": 69736, "review_comments_count": 2, "state": "closed", "title": "perf(status): avoid diagnostics path for compatibility notices", "updated_at": "2026-04-21T15:36:13Z" }, { "additions": 5, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "Fixes #69715 Persisted sessions with a `skillsSnapshot.version` of 0 would not refresh after a gateway restart because: 1. `ensureSkillSnapshot()` called `getSkillsSnapshotVersion()` **before** `ensureSkillsWatcher()`, so the version was s\u2026", "changed_files": 2, "cluster_id": "cluster-49059-5", "cluster_ids": [ "cluster-49059-5" ], "cluster_role": "member", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69734", "created_at": "2026-04-21T14:09:47Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69734/files", "html_url": "https://github.com/openclaw/openclaw/pull/69734", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69734, "review_comments_count": 0, "state": "open", "title": "fix(skills): refresh stale session snapshots after gateway restart", "updated_at": "2026-04-21T14:54:26Z" }, { "additions": 172, "author": "ayeshakhalid192007-dev", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #69624 \u2014 browser profile `existing-session` gets permanently stuck after the first navigation timeout, requiring a gateway restart. ## Root Cause `navigateChromeMcpPage()` only forwarded a timeout to the Chrome MCP `naviga\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69733", "created_at": "2026-04-21T14:09:03Z", "deletions": 24, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69733/files", "html_url": "https://github.com/openclaw/openclaw/pull/69733", "labels": [ "size: S" ], "merged": false, "number": 69733, "review_comments_count": 2, "state": "open", "title": "fix(browser): reset Chrome MCP session after navigate_page timeout", "updated_at": "2026-04-21T14:56:06Z" }, { "additions": 68, "author": "nnish16", "author_association": "NONE", "body_excerpt": "## Summary - redact internal exec approval allowlist metadata from transport payloads - reuse the same transport redaction for both gateway and node-host approval snapshots - add coverage for redacting `source` while preserving user-visibl\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69732", "created_at": "2026-04-21T14:02:38Z", "deletions": 19, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69732/files", "html_url": "https://github.com/openclaw/openclaw/pull/69732", "labels": [ "gateway", "size: S" ], "merged": false, "number": 69732, "review_comments_count": 2, "state": "open", "title": "Fix exec approvals snapshot transport redaction", "updated_at": "2026-04-21T14:08:35Z" }, { "additions": 463, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898 #69478\uff1aenqueueSystemEvent \u4e0d\u53bb\u91cd\uff0c\u5bfc\u81f4 exec \u5ba1\u6279\u7ea7\u8054\u9501\u5b9a\u3002 ## \u4fee\u590d - **\u975e\u8fde\u7eed\u53bb\u91cd**\uff1a\u65b0\u589e `entry.queue.some(e => e.text === cleaned)` \u68c0\u67e5 - **lastContextKey \u4fee\u6b63**\uff1a\u79fb\u81f3 dedup \u68c0\u67e5\u4e4b\u540e - **\u4e0a\u4e0b\u6587\u4fdd\u7559**\uff1aevent \u4e0d\u63d0\u4f9b contextKey \u65f6\u4e0d\u8986\u76d6\u5df2\u6709\u7684 lastContextKey ## \u6d4b\u8bd5\u8986\u76d6 - `returns false\u2026", "changed_files": 12, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69731", "created_at": "2026-04-21T14:02:18Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69731/files", "html_url": "https://github.com/openclaw/openclaw/pull/69731", "labels": [ "agents", "size: M", "r: too-many-prs" ], "merged": false, "number": 69731, "review_comments_count": 4, "state": "closed", "title": "fix: deduplicate enqueued system events (#69478)", "updated_at": "2026-04-21T14:09:06Z" }, { "additions": 460, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898 #69229\uff1atasks audit \u62a5\u544a inconsistent_timestamps \u5047\u9633\u6027\u3002 ## \u6839\u56e0 tool runners \u5728\u8c03\u7528 createTaskRecord \u4e4b\u524d\u5c31\u6355\u83b7\u4e86 startedAt = Date.now()\u3002\u5f53 registry \u968f\u540e\u8bbe\u7f6e createdAt = Date.now() \u65f6\uff0c\u5df2\u7ecf\u8fc7\u53bb\u4e86\u82e5\u5e72 ms\uff0c\u5bfc\u81f4 startedAt < createdAt\uff0c\u8fd9\u662f\u67b6\u6784\u4e0a\u5fc5\u7136\u53d1\u751f\u7684\uff0c\u800c\u975e\u771f\u6b63\u7684 bug\u3002 ## \u4fee\u590d \u5728 creat\u2026", "changed_files": 12, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69730", "created_at": "2026-04-21T13:59:20Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69730/files", "html_url": "https://github.com/openclaw/openclaw/pull/69730", "labels": [ "agents", "size: M", "r: too-many-prs" ], "merged": false, "number": 69730, "review_comments_count": 3, "state": "closed", "title": "fix: clamp createdAt to startedAt on task creation (#69229)", "updated_at": "2026-04-21T14:05:12Z" }, { "additions": 48, "author": "wAnyBug-Com", "author_association": "NONE", "body_excerpt": "``` feat(qwen): add qwen3.6-flash and qwen3.6-max-preview to model catalog - Add qwen3.6-flash with contextWindow 1,000,000 and reasoning support - Add qwen3.6-max-preview with contextWindow 262,144 and reasoning support - Fix qwen3.6-plus\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69729", "created_at": "2026-04-21T13:55:54Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69729/files", "html_url": "https://github.com/openclaw/openclaw/pull/69729", "labels": [ "size: S" ], "merged": false, "number": 69729, "review_comments_count": 3, "state": "open", "title": "feat(qwen): add qwen3.6-flash and qwen3.6-max-preview to model catalog", "updated_at": "2026-04-21T14:27:12Z" }, { "additions": 10, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "Fixes #69648 MiniMax-M2.7 supports image understanding via the `/v1/coding_plan/vlm` endpoint, but `isMinimaxVlmModel()` only recognized `MiniMax-VL-01`. This caused M2.7 to be incorrectly routed to the generic `anthropic-messages` API pat\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69728", "created_at": "2026-04-21T13:54:15Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69728/files", "html_url": "https://github.com/openclaw/openclaw/pull/69728", "labels": [ "agents", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69728, "review_comments_count": 1, "state": "closed", "title": "fix(minimax): recognize MiniMax-M2.7 as VLM-capable model", "updated_at": "2026-04-21T15:34:17Z" }, { "additions": 57, "author": "yuaiccc", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `openclaw mcp list` looked like it listed all MCP servers OpenClaw users might know about, but it only reads OpenClaw config under `mcp.servers`. - Why it matters: users with mcporter servers in `config/mcporter.json`\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69726", "created_at": "2026-04-21T13:51:41Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69726/files", "html_url": "https://github.com/openclaw/openclaw/pull/69726", "labels": [ "docs", "cli", "size: S" ], "merged": false, "number": 69726, "review_comments_count": 1, "state": "open", "title": "fix(cli): clarify mcp list registry scope", "updated_at": "2026-04-21T16:56:27Z" }, { "additions": 132, "author": "soloclz", "author_association": "NONE", "body_excerpt": "## Summary Fixes #66839. `exec host=node` against the macOS companion app currently fails preflight with: ``` node command not allowed: the node (platform: macOS 15.7.5) does not support \"system.run.prepare\" ``` Root cause: `executeNodeHos\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69725", "created_at": "2026-04-21T13:49:26Z", "deletions": 22, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69725/files", "html_url": "https://github.com/openclaw/openclaw/pull/69725", "labels": [ "agents", "size: S" ], "merged": false, "number": 69725, "review_comments_count": 0, "state": "open", "title": "fix(agents): build local system.run plan when node omits system.run.prepare", "updated_at": "2026-04-21T13:51:32Z" }, { "additions": 374, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898 #69410\uff1aCustom provider \u8fd4\u56de\u6709\u6548\u5185\u5bb9\u4f46 agent payloads=0\u3002 ## \u6839\u56e0 `finalizeAssistantTexts` \u4e2d\u5f53 `onBlockReply` \u5b58\u5728\u65f6\uff08\u6807\u51c6 agent \u8c03\u7528\uff09\uff0c`else if (!addedDuringMessage && !chunkerHasBuffered && text)` \u4e0d\u6ee1\u8db3\uff0c\u56e0\u4e3a\u7b2c\u4e00\u4e2a\u5206\u652f\u6761\u4ef6\u4e0d\u6ee1\u8db3\u3002custom provider \u573a\u666f\u4e0b\u6d41\u5f0f\u6587\u672c\u672a\u52a0\u5165 `assistantT\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69724", "created_at": "2026-04-21T13:42:33Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69724/files", "html_url": "https://github.com/openclaw/openclaw/pull/69724", "labels": [ "agents", "size: M", "r: too-many-prs" ], "merged": false, "number": 69724, "review_comments_count": 4, "state": "closed", "title": "fix: ensure assistantTexts populated at message_end for custom providers (#69410)", "updated_at": "2026-04-21T13:48:30Z" }, { "additions": 4, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69723", "created_at": "2026-04-21T13:42:00Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69723/files", "html_url": "https://github.com/openclaw/openclaw/pull/69723", "labels": [ "agents", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69723, "review_comments_count": 0, "state": "closed", "title": "Fix/minimax 529 overloaded failover", "updated_at": "2026-04-21T13:45:28Z" }, { "additions": 1, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69722", "created_at": "2026-04-21T13:41:18Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69722/files", "html_url": "https://github.com/openclaw/openclaw/pull/69722", "labels": [ "app: web-ui", "gateway", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69722, "review_comments_count": 0, "state": "closed", "title": "Fix/exec approvals source field", "updated_at": "2026-04-21T13:45:30Z" }, { "additions": 16, "author": "Vansh5632", "author_association": "NONE", "body_excerpt": "## Summary - Problem: OpenClaw's native Ollama request path must normalize internal `ollama/` ids before sending requests to Ollama, while still preserving valid bare model ids. - Why it matters: Without explicit regression coverage\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69721", "created_at": "2026-04-21T13:40:17Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69721/files", "html_url": "https://github.com/openclaw/openclaw/pull/69721", "labels": [ "size: XS" ], "merged": false, "number": 69721, "review_comments_count": 2, "state": "open", "title": "test(ollama): cover native model id normalization", "updated_at": "2026-04-21T13:47:44Z" }, { "additions": 85, "author": "yuaiccc", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `docs/gateway/secrets.md` documented several SecretRef exec-provider integrations, but did not include the open-source `pass`/password-store flow requested in #62730. - Why it matters: users who keep secrets in `pass`\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69720", "created_at": "2026-04-21T13:35:01Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69720/files", "html_url": "https://github.com/openclaw/openclaw/pull/69720", "labels": [ "docs", "gateway", "size: XS" ], "merged": false, "number": 69720, "review_comments_count": 3, "state": "open", "title": "docs: add pass SecretRef exec example", "updated_at": "2026-04-21T14:51:13Z" }, { "additions": 58, "author": "chinar-amrutkar", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary \u2022 Problem: `extractMessageSenderLabel` in `chat-sanitize.ts` could only find sender info in body (sender prefix Name: message) or in metadata blocks, but NOT in the envelope header's from field \u2022 Why it matters: Telegram DMs sto\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69718", "created_at": "2026-04-21T13:26:32Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69718/files", "html_url": "https://github.com/openclaw/openclaw/pull/69718", "labels": [ "gateway", "size: S" ], "merged": false, "number": 69718, "review_comments_count": 3, "state": "open", "title": "fix: include sender label in message body for direct messages", "updated_at": "2026-04-21T14:38:37Z" }, { "additions": 42, "author": "JinluZhang", "author_association": "NONE", "body_excerpt": "## Summary Fixes a stale-session edge case where newly added skills can stay invisible after a gateway restart. Fixes #69715. ## What Changed - seed a non-zero skills snapshot version when the first workspace watcher is attached - read `sn\u2026", "changed_files": 4, "cluster_id": "cluster-49059-5", "cluster_ids": [ "cluster-49059-5" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69716", "created_at": "2026-04-21T13:13:41Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69716/files", "html_url": "https://github.com/openclaw/openclaw/pull/69716", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69716, "review_comments_count": 1, "state": "open", "title": "fix(skills): refresh stale session skill snapshots after restart", "updated_at": "2026-04-21T13:18:18Z" }, { "additions": 183, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898 #69289: Browser aria refs \u5728\u5feb\u7167\u91cc\u53ef\u7528\u4f46 action \u5931\u8d25\u3002 ## \u6839\u56e0 `snapshotAriaViaPlaywright` \u751f\u6210 `ax` \u683c\u5f0f\u7684 refs\uff08\u5982 `ax13`, `ax39`\uff09\uff0c\u4f46\u6ca1\u6709\u5c06 role/name \u4fe1\u606f\u5b58\u50a8\u5230 pageState \u4e2d\u3002\u5f53\u540e\u7eed action \u8c03\u7528 `refLocator('ax13')` \u65f6\uff0c\u4ee3\u7801\u76f4\u63a5 fallback \u5230 `page.locator('aria-ref=a\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69714", "created_at": "2026-04-21T13:10:14Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69714/files", "html_url": "https://github.com/openclaw/openclaw/pull/69714", "labels": [ "size: S", "r: too-many-prs" ], "merged": false, "number": 69714, "review_comments_count": 3, "state": "closed", "title": "fix: resolve ax aria refs in browser actions (#69289)", "updated_at": "2026-04-21T13:14:20Z" }, { "additions": 32, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898\\n#69229\uff1atasks audit \u62a5\u544a inconsistent_timestamps \u5047\u9633\u6027\u3002\\n\\n\u6839\u56e0\uff1api-embedded-runner \u7684 lifecycle events \u5230\u8fbe registry \u65f6\uff0cevt.ts (startedAt) \u53ef\u80fd\u65e9\u4e8e registry \u5165\u53e3\u5904\u7684 wall-clock \u65f6\u95f4\uff08createdAt\uff09\uff0c\u8fd9\u662f\u961f\u5217/\u65f6\u949f\u504f\u659c\u7684\u81ea\u7136\u7ed3\u679c\uff0c\u4f46\u4f1a\u88ab audit \u8bef\u5224\u4e3a\u65f6\u95f4\u6233\u4e0d\u4e00\u81f4\u3002\\n\\n## \u4fee\u590d\\n\u5728 updateTaskSt\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69711", "created_at": "2026-04-21T13:00:52Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69711/files", "html_url": "https://github.com/openclaw/openclaw/pull/69711", "labels": [ "size: XS", "r: too-many-prs" ], "merged": false, "number": 69711, "review_comments_count": 1, "state": "closed", "title": "fix: tasks audit false positive inconsistent_timestamps (#69229)", "updated_at": "2026-04-21T13:02:37Z" }, { "additions": 69, "author": "AgnesAI-SG", "author_association": "NONE", "body_excerpt": "## Summary We'd like to contribute a bundled model provider plugin for Agnes AI to OpenClaw. The proposed provider would: - register a new bundled provider id: `agnes-ai` - expose Agnes AI models through the standard OpenClaw model/provide\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69710", "created_at": "2026-04-21T12:59:48Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69710/files", "html_url": "https://github.com/openclaw/openclaw/pull/69710", "labels": [ "docs", "size: S" ], "merged": false, "number": 69710, "review_comments_count": 10, "state": "open", "title": "feat(provider): add agnes-ai bundled provider", "updated_at": "2026-04-21T13:53:51Z" }, { "additions": 636, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898\\n#69289\uff1aBrowser aria refs \u5728\u5feb\u7167\u91cc\u53ef\u7528\u4f46\u6267\u884c action \u65f6\u5931\u8d25\u3002\\n\\n## \u4fee\u590d\\n[\u5b9a\u4f4d\u6839\u56e0\u5e76\u4fee\u590d aria ref \u5728 action \u8def\u5f84\u4e0a\u7684\u4f7f\u7528]\\n\\n## \u6d4b\u8bd5\u8986\u76d6\\n[\u65b0\u589e\u6d4b\u8bd5]", "changed_files": 25, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69709", "created_at": "2026-04-21T12:58:25Z", "deletions": 42, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69709/files", "html_url": "https://github.com/openclaw/openclaw/pull/69709", "labels": [ "app: web-ui", "gateway", "cli", "agents", "channel: feishu", "size: L", "r: too-many-prs" ], "merged": false, "number": 69709, "review_comments_count": 3, "state": "closed", "title": "fix: resolve aria refs for browser actions (#69289)", "updated_at": "2026-04-21T13:06:25Z" }, { "additions": 107, "author": "badgerbees", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `memory-lancedb` forwarded `dimensions` to the OpenAI embeddings request, which breaks vLLM and other non-Matryoshka providers that reject that field. - Why it matters: memory recall/search can fail at embed time for\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69707", "created_at": "2026-04-21T12:51:57Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69707/files", "html_url": "https://github.com/openclaw/openclaw/pull/69707", "labels": [ "extensions: memory-lancedb", "size: S" ], "merged": false, "number": 69707, "review_comments_count": 0, "state": "open", "title": "fix(memory-lancedb): truncate embeddings locally", "updated_at": "2026-04-21T12:56:26Z" }, { "additions": 1195, "author": "Takhoffman", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - add last-known-good effective-config helpers and gateway startup/restart recovery paths - make `gateway run` recover invalid effective configs before deriving startup settings, treat restart-sentinel writes as best-effort, and\u2026", "changed_files": 19, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69706", "created_at": "2026-04-21T12:25:37Z", "deletions": 31, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69706/files", "html_url": "https://github.com/openclaw/openclaw/pull/69706", "labels": [ "gateway", "cli", "agents", "maintainer", "size: XL" ], "merged": false, "number": 69706, "review_comments_count": 7, "state": "open", "title": "fix: recover gateway config after invalid startup", "updated_at": "2026-04-21T12:54:02Z" }, { "additions": 74, "author": "draix", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69673 \u2014 Brave Search API authentication broken. The Brave Search API requires the API key to be sent via the `X-Subscription-Token` request header (not as a URL query parameter). The runtime implementation already sends t\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69704", "created_at": "2026-04-21T12:17:10Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69704/files", "html_url": "https://github.com/openclaw/openclaw/pull/69704", "labels": [ "size: S" ], "merged": false, "number": 69704, "review_comments_count": 0, "state": "open", "title": "test(brave): add regression tests for X-Subscription-Token header auth (#69673)", "updated_at": "2026-04-21T12:19:15Z" }, { "additions": 92, "author": "draix", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69683 \u2014 models configured with `api: \"ollama\"` throw `No API provider registered for api: ollama` at runtime despite the config being accepted and hot-reloaded by the gateway. ## Root cause The call path for a model call\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69703", "created_at": "2026-04-21T12:11:58Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69703/files", "html_url": "https://github.com/openclaw/openclaw/pull/69703", "labels": [ "agents", "size: S" ], "merged": false, "number": 69703, "review_comments_count": 0, "state": "open", "title": "fix(providers): register ollama api as openai-completions transport (#69683)", "updated_at": "2026-04-21T12:13:29Z" }, { "additions": 27, "author": "SARAMALI15792", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** Gateway HTTP server hangs on Windows \u2014 all HTTP requests (including health checks) time out and never receive a response. - **Why it matters:** Windows users cannot run the gateway at all; any request hits ESTABLI\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69701", "created_at": "2026-04-21T11:59:42Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69701/files", "html_url": "https://github.com/openclaw/openclaw/pull/69701", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 69701, "review_comments_count": 1, "state": "open", "title": "fix(gateway): skip IPv6 ::1 loopback binding on Windows to prevent HTTP hang", "updated_at": "2026-04-21T12:13:22Z" }, { "additions": 4, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "Fixes #69642 MiniMax returns HTTP 529 with the message \"High traffic detected. For a more stable experience, upgrade to our Plus plan\". The existing failover logic already maps status 529 to `reason=overloaded` in `classifyFailoverReasonFr\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69699", "created_at": "2026-04-21T11:57:29Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69699/files", "html_url": "https://github.com/openclaw/openclaw/pull/69699", "labels": [ "agents", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69699, "review_comments_count": 0, "state": "closed", "title": "fix(failover): classify MiniMax 529 high-traffic as overloaded", "updated_at": "2026-04-21T11:58:30Z" }, { "additions": 5, "author": "sudhindrat", "author_association": "NONE", "body_excerpt": "Fixes ERR_INVALID_ARG_TYPE when tool params are undefined. Changes:- hashToolCall now hashes undefined params consistently- digestStable guards against undefined serialization - stableStringifyFallback properly returns string (using ?? ope\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69697", "created_at": "2026-04-21T11:47:12Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69697/files", "html_url": "https://github.com/openclaw/openclaw/pull/69697", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69697, "review_comments_count": 2, "state": "open", "title": "fix(tool-loop-detection): handle undefined params in hashToolCall", "updated_at": "2026-04-21T13:09:15Z" }, { "additions": 40, "author": "zhouhe-xydt", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary This PR strengthens the OpenRouter base URL normalization introduced in #68574 to handle case-insensitive URL matching and adds regression tests for edge cases. ## Changes - Make `normalizeBaseUrl` case-insensitive by adding `.t\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69696", "created_at": "2026-04-21T11:44:28Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69696/files", "html_url": "https://github.com/openclaw/openclaw/pull/69696", "labels": [ "agents", "size: XS", "extensions: arcee" ], "merged": false, "number": 69696, "review_comments_count": 0, "state": "open", "title": "fix(openrouter): make base URL normalization case-insensitive and add regression tests", "updated_at": "2026-04-21T11:45:47Z" }, { "additions": 1, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "Fixes #69482 The Telegram \"Allow always\" approval handler writes allowlist entries with a `source: \"allow-always\"` field, but the gateway schema (ExecApprovalsAllowlistEntrySchema) did not include this field. This caused `openclaw approval\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69694", "created_at": "2026-04-21T11:30:33Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69694/files", "html_url": "https://github.com/openclaw/openclaw/pull/69694", "labels": [ "app: web-ui", "gateway", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69694, "review_comments_count": 0, "state": "closed", "title": "fix(approvals): add missing source field to allowlist entry schema", "updated_at": "2026-04-21T11:32:24Z" }, { "additions": 7, "author": "leifengfeng", "author_association": "NONE", "body_excerpt": "## Summary - Add `identityPrompt` optional parameter to `BuildAgentSystemPromptParams` interface - Use `params.identityPrompt ?? default` for both \"none\" promptMode and the full prompt mode - Change default identity line from `\"You are a p\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69692", "created_at": "2026-04-21T11:26:25Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69692/files", "html_url": "https://github.com/openclaw/openclaw/pull/69692", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69692, "review_comments_count": 1, "state": "open", "title": "feat: make system prompt identity line configurable via identityPrompt", "updated_at": "2026-04-21T11:40:49Z" }, { "additions": 10, "author": "wucm667", "author_association": "NONE", "body_excerpt": "MiniMax-M2.7 supports image understanding via the VLM endpoint (`/v1/coding_plan/vlm`) but was excluded by the hardcoded check that only accepted `MiniMax-VL-01`. This PR adds `MiniMax-M2.7` to the `MINIMAX_VLM_MODELS` allowlist and update\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69691", "created_at": "2026-04-21T11:24:10Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69691/files", "html_url": "https://github.com/openclaw/openclaw/pull/69691", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69691, "review_comments_count": 0, "state": "open", "title": "fix(minimax): add MiniMax-M2.7 to VLM model allowlist", "updated_at": "2026-04-21T11:34:13Z" }, { "additions": 177, "author": "rubencu", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `gateway:watch` could spam repeated `[plugins] ... installed bundled runtime deps ...` lines during normal helper/runtime loads after startup. - Why it matters: the repeated lines looked like fresh installs on every T\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69690", "created_at": "2026-04-21T11:19:04Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69690/files", "html_url": "https://github.com/openclaw/openclaw/pull/69690", "labels": [ "size: S" ], "merged": false, "number": 69690, "review_comments_count": 2, "state": "open", "title": "fix: reuse gateway-bindable plugin registries for runtime loads", "updated_at": "2026-04-21T11:49:16Z" }, { "additions": 40, "author": "ly85206559", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** In Control UI webchat, clicking Copy on a fenced code block pasted the entire assistant Markdown instead of only the snippet (#69605). - **Why it matters:** Floating \u201cCopy as markdown\u201d / expand controls overlap th\u2026", "changed_files": 3, "cluster_id": "cluster-69605-4", "cluster_ids": [ "cluster-69605-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69689", "created_at": "2026-04-21T11:17:01Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69689/files", "html_url": "https://github.com/openclaw/openclaw/pull/69689", "labels": [ "app: web-ui", "size: XS" ], "merged": false, "number": 69689, "review_comments_count": 0, "state": "open", "title": "fix(ui): reserve bubble space for code block copy (#69605)", "updated_at": "2026-04-21T11:18:03Z" }, { "additions": 4798, "author": "mohitmehral", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** OpenClaw has no built-in skill for provisioning and managing AWS/Azure infrastructure via Terraform. Users must manually write `.tf` files, manage state, and run CLI commands outside the agent workflow. - **Why it\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69688", "created_at": "2026-04-21T11:14:53Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69688/files", "html_url": "https://github.com/openclaw/openclaw/pull/69688", "labels": [ "size: XL" ], "merged": false, "number": 69688, "review_comments_count": 7, "state": "open", "title": "feat(skills): add terraform-iac skill \u2014 AWS/Azure IaC agent with resource wizards and Terraform Cloud state", "updated_at": "2026-04-21T11:44:40Z" }, { "additions": 37, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary\\n\\n- **Problem:** The isProbeSuppressedSubsystem check called .startsWith() on params.subsystem without optional chaining. When subsystem is undefined, this causes TypeError: Cannot read properties of undefined (reading 'startsW\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69687", "created_at": "2026-04-21T11:04:50Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69687/files", "html_url": "https://github.com/openclaw/openclaw/pull/69687", "labels": [ "channel: telegram", "app: web-ui", "cli", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69687, "review_comments_count": 0, "state": "closed", "title": "fix(logging): add optional chaining to subsystem.startsWith checks", "updated_at": "2026-04-21T13:45:21Z" }, { "additions": 4820, "author": "mohitmehral", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** OpenClaw has no built-in skill for provisioning and managing AWS/Azure infrastructure via Terraform. Users must manually write `.tf` files, manage state, and run CLI commands outside the agent workflow. - **Why it\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69686", "created_at": "2026-04-21T10:55:06Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69686/files", "html_url": "https://github.com/openclaw/openclaw/pull/69686", "labels": [ "size: XL" ], "merged": false, "number": 69686, "review_comments_count": 7, "state": "closed", "title": "feat(skills): add terraform-iac skill \u2014 AWS/Azure IaC agent with resource wizards and Terraform Cloud state", "updated_at": "2026-04-21T11:05:50Z" }, { "additions": 330, "author": "suboss87", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Strips `` / `` / `` wrapper tags from assistant message text blocks before the message is persisted to the session transcript - Fixes the Control UI showing raw `` tags after streaming ends, even\u2026", "changed_files": 5, "cluster_id": "cluster-65182-5", "cluster_ids": [ "cluster-65182-5" ], "cluster_role": "member", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69685", "created_at": "2026-04-21T10:51:36Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69685/files", "html_url": "https://github.com/openclaw/openclaw/pull/69685", "labels": [ "agents", "size: M" ], "merged": false, "number": 69685, "review_comments_count": 0, "state": "open", "title": "fix(agents): strip final tags from persisted assistant message", "updated_at": "2026-04-21T11:04:21Z" }, { "additions": 13, "author": "lazyeo", "author_association": "NONE", "body_excerpt": "## Summary - ignore `message_changed` and `message_deleted` subtype events in the Slack message monitor - keep those system events from re-enqueueing AI handling for prior messages - update targeted Slack monitor tests to assert the events\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69684", "created_at": "2026-04-21T10:50:38Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69684/files", "html_url": "https://github.com/openclaw/openclaw/pull/69684", "labels": [ "channel: slack", "size: XS" ], "merged": false, "number": 69684, "review_comments_count": 0, "state": "open", "title": "fix(slack): ignore edit/delete system events for AI re-trigger", "updated_at": "2026-04-21T10:52:07Z" }, { "additions": 57, "author": "MoerAI", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - seed the image-model runtime auth before media model discovery so SecretRef-backed Anthropic credentials reach the discovered client path - keep the existing model-specific auth resolution after discovery, and add a regression\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69682", "created_at": "2026-04-21T10:49:03Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69682/files", "html_url": "https://github.com/openclaw/openclaw/pull/69682", "labels": [ "size: S" ], "merged": false, "number": 69682, "review_comments_count": 0, "state": "open", "title": "fix(agents): resolve auth profile for imageModel inference calls (#69620)", "updated_at": "2026-04-21T10:51:22Z" }, { "additions": 13, "author": "aalekh-sarvam", "author_association": "NONE", "body_excerpt": "## Summary Replace `searchVector`'s full-table-scan SQL with sqlite-vec's native KNN operator. Keeps `vec_distance_cosine()` in the `SELECT` so the returned score stays in the expected cosine [0, 1] range. Fixes #69666. ## Benchmark Measur\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69680", "created_at": "2026-04-21T10:40:59Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69680/files", "html_url": "https://github.com/openclaw/openclaw/pull/69680", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 69680, "review_comments_count": 4, "state": "open", "title": "fix(memory): use sqlite-vec KNN for searchVector (~190\u00d7 speedup)", "updated_at": "2026-04-21T12:54:51Z" }, { "additions": 2166, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Summary - Keep one Claude stdio process warm per OpenClaw session. - Close idle Claude processes after 10 minutes, then resume with the stored Claude session id. - Add config/schema/docs plus regression coverage for reuse and idle cleanup.\u2026", "changed_files": 16, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69679", "created_at": "2026-04-21T10:34:50Z", "deletions": 25, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69679/files", "html_url": "https://github.com/openclaw/openclaw/pull/69679", "labels": [ "docs", "gateway", "agents", "maintainer", "size: XL", "extensions: anthropic" ], "merged": false, "number": 69679, "review_comments_count": 18, "state": "open", "title": "Keep Claude CLI sessions warm", "updated_at": "2026-04-21T15:01:55Z" }, { "additions": 41, "author": "sk7n4k3d", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #69368. ## What Extend `ERROR_PATTERNS.timeout` in `src/agents/pi-embedded-helpers/failover-matches.ts` so the failover classifier recognises four families of bare transport errors as `timeout`: - undici `TypeError: terminated` throw\u2026", "changed_files": 3, "cluster_id": "cluster-69058-3", "cluster_ids": [ "cluster-69058-3" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69677", "created_at": "2026-04-21T10:16:07Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69677/files", "html_url": "https://github.com/openclaw/openclaw/pull/69677", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69677, "review_comments_count": 1, "state": "open", "title": "fix(agents/failover): classify undici 'terminated' and codex 'Request failed' as timeout (#69368)", "updated_at": "2026-04-21T10:20:47Z" }, { "additions": 17, "author": "MoerAI", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - load bundled plugins for `openclaw memory` commands so plugin-provided embedding adapters are registered before memory manager startup - keep GitHub Copilot memory embeddings available for `memory status` and `memory index` wh\u2026", "changed_files": 3, "cluster_id": "cluster-63847-2", "cluster_ids": [ "cluster-63847-2" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69676", "created_at": "2026-04-21T10:15:03Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69676/files", "html_url": "https://github.com/openclaw/openclaw/pull/69676", "labels": [ "cli", "size: XS" ], "merged": false, "number": 69676, "review_comments_count": 0, "state": "open", "title": "fix(memory): recognize github-copilot as valid memory embedding provider (#69180)", "updated_at": "2026-04-21T10:15:59Z" }, { "additions": 42, "author": "V0hgg", "author_association": "NONE", "body_excerpt": "## Summary - clarify ACP thread-bound follow-up semantics - document that thread continuity does not imply verbatim relay - note that parent assistant should remain the default interpreter unless exact relay is explicitly requested ## Why\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69675", "created_at": "2026-04-21T10:08:57Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69675/files", "html_url": "https://github.com/openclaw/openclaw/pull/69675", "labels": [ "docs", "agents", "size: XS" ], "merged": false, "number": 69675, "review_comments_count": 2, "state": "open", "title": "docs(acp): clarify thread-bound follow-up orchestration", "updated_at": "2026-04-21T10:13:20Z" }, { "additions": 1, "author": "hxy91819", "author_association": "MEMBER", "body_excerpt": "## Summary Remove the redundant `fix(agents):` bullet for PR #67800 from `## Unreleased`, keeping the fuller Agents/Anthropic note. ## Base Prepared from latest `upstream/main` (merge-base matches `upstream/main` at `4bacdc8824`). ## Notes\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69670", "created_at": "2026-04-21T10:02:08Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69670/files", "html_url": "https://github.com/openclaw/openclaw/pull/69670", "labels": [ "maintainer", "size: XS" ], "merged": true, "number": 69670, "review_comments_count": 0, "state": "closed", "title": "docs(changelog): deduplicate #67800 entries in Unreleased", "updated_at": "2026-04-21T10:10:35Z" }, { "additions": 201, "author": "dangoZhang", "author_association": "NONE", "body_excerpt": "## Summary - route `message_sending` hooks through the shared `deliverTextOrMediaReply` helper - thread message-sending context through the generic reply-based channel adapters - add regression tests for mutation and cancel behavior in the\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69665", "created_at": "2026-04-21T09:50:03Z", "deletions": 4, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69665/files", "html_url": "https://github.com/openclaw/openclaw/pull/69665", "labels": [ "channel: googlechat", "channel: imessage", "channel: mattermost", "channel: signal", "channel: slack", "channel: zalo", "channel: zalouser", "size: M" ], "merged": false, "number": 69665, "review_comments_count": 0, "state": "open", "title": "[codex] Route message_sending hooks through generic reply delivery", "updated_at": "2026-04-21T09:50:20Z" }, { "additions": 10, "author": "zhouhe-xydt", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes `bun openclaw.mjs` crashing on bootstrap when the optional `warning-filter` import is missing. Bun does not set `err.url` on `ERR_MODULE_NOT_FOUND` errors and uses the original relative specifier in its error message inste\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69664", "created_at": "2026-04-21T09:40:04Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69664/files", "html_url": "https://github.com/openclaw/openclaw/pull/69664", "labels": [ "size: XS" ], "merged": false, "number": 69664, "review_comments_count": 0, "state": "open", "title": "fix(bootstrap): recognize Bun error shape in isDirectModuleNotFoundError", "updated_at": "2026-04-21T09:41:46Z" }, { "additions": 94, "author": "MoerAI", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - recurse local skill discovery so nested `SKILL.md` files under a configured skills root are found - allow workspace skill roots to load nested category folders instead of requiring `SKILL.md` at the first child level - add a r\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69663", "created_at": "2026-04-21T09:39:30Z", "deletions": 35, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69663/files", "html_url": "https://github.com/openclaw/openclaw/pull/69663", "labels": [ "agents", "size: S" ], "merged": false, "number": 69663, "review_comments_count": 3, "state": "open", "title": "fix(skills): recurse into subdirectories when scanning skill root (#56915)", "updated_at": "2026-04-21T10:56:19Z" }, { "additions": 631, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898\\n#69418 - \u622a\u56fe\u4f20\u6587\u4ef6\u8def\u5f84\u800c\u975e\u56fe\u7247\uff0c\u5bfc\u81f4\u89c6\u89c9\u5b8c\u5168\u5931\u6548\u3002Telegram \u7528\u6237\u53d1\u9001\u622a\u56fe\u540e\uff0c\u6a21\u578b\u6536\u5230\u7684\u662f\u6587\u4ef6\u8def\u5f84\u800c\u975e\u5b9e\u9645\u56fe\u7247\u5185\u5bb9\u3002\\n\\n## \u4fee\u590d\\n\u786e\u4fdd\u622a\u56fe\u7ed3\u679c\u4ee5 image data \u800c\u975e file path \u4f20\u9012\u7ed9\u6a21\u578b\u3002\\n\\n## \u6d4b\u8bd5\u8986\u76d6\\n\u65b0\u589e\u622a\u56fe\u76f8\u5173\u6d4b\u8bd5\u7528\u4f8b\u3002", "changed_files": 16, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69662", "created_at": "2026-04-21T09:36:11Z", "deletions": 26, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69662/files", "html_url": "https://github.com/openclaw/openclaw/pull/69662", "labels": [ "app: web-ui", "agents", "size: L", "r: too-many-prs" ], "merged": false, "number": 69662, "review_comments_count": 5, "state": "closed", "title": "fix: pass screenshot as image data not file path (#69418)", "updated_at": "2026-04-21T09:42:15Z" }, { "additions": 575, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898\\n#69547 \u548c #69497 \u90fd\u662f\u5bf9 undefined \u8c03\u7528 .trim() \u5bfc\u81f4\u7684 TypeError\u3002QuickStart onboarding \u9009\u62e9 Skip for now \u65f6\u5d29\u6e83\u3002\\n\\n## \u4fee\u590d\\n\u5728 channel-setup.status.ts \u7684 formatSetupDisplayText \u51fd\u6570\u4e2d\uff0c\u5f53 normalizeOptionalString \u8fd4\u56de undefined \u65f6\u4e0d\u8c03\u7528 .trim()\u3002\\n\\n## \u6d4b\u8bd5\u8986\u76d6\\n\u65b0\u589e\u6d4b\u8bd5\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69661", "created_at": "2026-04-21T09:36:01Z", "deletions": 26, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69661/files", "html_url": "https://github.com/openclaw/openclaw/pull/69661", "labels": [ "app: web-ui", "agents", "size: L", "r: too-many-prs" ], "merged": false, "number": 69661, "review_comments_count": 2, "state": "closed", "title": "fix: handle undefined in trim call (#69547, #69497)", "updated_at": "2026-04-21T09:42:30Z" }, { "additions": 95, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898\\nopenrouter/auto \u6a21\u578b\u88ab\u5ffd\u7565\uff0c\u5f3a\u5236\u964d\u7ea7\u5230 gpt-4.1-mini\u3002\\n\\n## \u4fee\u590d\\n\u786e\u4fdd openrouter/auto \u6a21\u578b\u9009\u62e9\u88ab\u6b63\u786e\u4f20\u9012\u5230 provider wrapper\uff0c\u4e0d\u88ab\u8986\u76d6\u3002\\n\\n## \u6d4b\u8bd5\u8986\u76d6\\n\u65b0\u589e\u76f8\u5173\u6d4b\u8bd5\u7528\u4f8b\u3002", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69660", "created_at": "2026-04-21T09:35:52Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69660/files", "html_url": "https://github.com/openclaw/openclaw/pull/69660", "labels": [ "agents", "size: S", "r: too-many-prs" ], "merged": false, "number": 69660, "review_comments_count": 1, "state": "closed", "title": "fix: respect openrouter/auto model selection (#69527)", "updated_at": "2026-04-21T09:37:56Z" }, { "additions": 149, "author": "PratikRai0101", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `openclaw doctor --fix` removes unrecognized/custom keys from `openclaw.json` - Why it matters: Causes silent data loss for valid user-defined integrations and config extensions - What changed: Repair flow now merges\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69659", "created_at": "2026-04-21T09:32:23Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69659/files", "html_url": "https://github.com/openclaw/openclaw/pull/69659", "labels": [ "commands", "size: S" ], "merged": false, "number": 69659, "review_comments_count": 10, "state": "open", "title": "fix(doctor): merge raw JSON to prevent pruning unrecognized keys during repair #69631", "updated_at": "2026-04-21T15:30:30Z" }, { "additions": 235, "author": "wAnyBug-Com", "author_association": "NONE", "body_excerpt": "--- ## Summary This PR is documentation-only. It proposes documenting a community workspace pattern, `PENDING.md`, for tracking commitments that should survive session reset, compaction, or context loss. This is not a new core feature and\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69658", "created_at": "2026-04-21T09:31:57Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69658/files", "html_url": "https://github.com/openclaw/openclaw/pull/69658", "labels": [ "docs", "gateway", "size: XS" ], "merged": false, "number": 69658, "review_comments_count": 5, "state": "open", "title": "docs: document PENDING.md pattern for cross-session commitment tracki\u2026", "updated_at": "2026-04-21T12:37:10Z" }, { "additions": 35, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary\\n\\n- **Problem:** The openclaw cron list command accessed job.payload.kind without first checking whether job.payload was defined. When cron jobs exist without a payload object, this caused TypeError: Cannot read properties of u\u2026", "changed_files": 4, "cluster_id": "cluster-37299-10", "cluster_ids": [ "cluster-37299-10" ], "cluster_role": "member", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69657", "created_at": "2026-04-21T09:22:24Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69657/files", "html_url": "https://github.com/openclaw/openclaw/pull/69657", "labels": [ "channel: telegram", "app: web-ui", "cli", "size: XS" ], "merged": false, "number": 69657, "review_comments_count": 0, "state": "open", "title": "fix(cron): guard against undefined payload in cron list output", "updated_at": "2026-04-21T15:20:17Z" }, { "additions": 32, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary\\n\\n- **Problem:** The chat-bubble element was missing the 'has-copy' CSS class when copy/expand actions were present. This meant the padding-right: 70px style (which reserves space for the action buttons) was never applied, caus\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69655", "created_at": "2026-04-21T09:13:16Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69655/files", "html_url": "https://github.com/openclaw/openclaw/pull/69655", "labels": [ "channel: telegram", "app: web-ui", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69655, "review_comments_count": 2, "state": "closed", "title": "fix(ui): add has-copy class to chat bubble when actions are present", "updated_at": "2026-04-21T15:35:12Z" }, { "additions": 24, "author": "yuaiccc", "author_association": "NONE", "body_excerpt": "## Summary - Problem: macOS Accessibility docs did not clearly warn about granting permissions to a shared `node` runtime. - Why it matters: TCC grants Accessibility to the process identity macOS sees, so a `node` grant can apply to any np\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69654", "created_at": "2026-04-21T09:09:46Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69654/files", "html_url": "https://github.com/openclaw/openclaw/pull/69654", "labels": [ "docs", "app: macos", "size: XS" ], "merged": false, "number": 69654, "review_comments_count": 0, "state": "open", "title": "docs: warn about node Accessibility grants", "updated_at": "2026-04-21T09:35:00Z" }, { "additions": 26, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary\\n\\n- **Problem:** The filter logic for \u0007ccountIdsToProbe called .trim() on values without first checking they were strings. When channel credentials use SecretRef objects (e.g. { source: 'file', ... }), these objects can end up\u2026", "changed_files": 3, "cluster_id": "cluster-37718-3", "cluster_ids": [ "cluster-37718-3" ], "cluster_role": "canonical", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69652", "created_at": "2026-04-21T09:00:10Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69652/files", "html_url": "https://github.com/openclaw/openclaw/pull/69652", "labels": [ "channel: telegram", "commands", "size: XS" ], "merged": false, "number": 69652, "review_comments_count": 3, "state": "open", "title": "fix(health): guard account ID filter against non-string values", "updated_at": "2026-04-21T15:21:51Z" }, { "additions": 1272, "author": "Ziy1-Tan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem - Raw secret values could still be written into log files. - Redaction already existed on some call-site paths (for example, tool output), but the **file transport itself** did not sanitize records before persistence. - That mea\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69651", "created_at": "2026-04-21T08:55:48Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69651/files", "html_url": "https://github.com/openclaw/openclaw/pull/69651", "labels": [ "size: XL" ], "merged": false, "number": 69651, "review_comments_count": 13, "state": "open", "title": " fix(logging): add sink-side redaction for file log", "updated_at": "2026-04-21T15:43:44Z" }, { "additions": 94, "author": "Bartok9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem `openclaw doctor --fix` silently strips **all** keys not recognized by the Zod schema. This includes custom integrations, plugin data, and user-defined JSON objects that users intentionally placed in their config. The deletion h\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69649", "created_at": "2026-04-21T08:50:37Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69649/files", "html_url": "https://github.com/openclaw/openclaw/pull/69649", "labels": [ "commands", "size: S", "r: too-many-prs" ], "merged": false, "number": 69649, "review_comments_count": 1, "state": "closed", "title": "fix(doctor): preserve unknown config keys during --fix to prevent silent data loss", "updated_at": "2026-04-21T08:53:49Z" }, { "additions": 59, "author": "leifengfeng", "author_association": "NONE", "body_excerpt": "## Summary - When multiple OpenClaw instances are served behind a single nginx domain with different path prefixes (e.g. `/a`, `/b`, `/c`), switching between instances keeps the WebSocket URL pinned to whichever instance was visited first.\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69647", "created_at": "2026-04-21T08:47:21Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69647/files", "html_url": "https://github.com/openclaw/openclaw/pull/69647", "labels": [ "app: web-ui", "size: S" ], "merged": false, "number": 69647, "review_comments_count": 6, "state": "open", "title": "fix(ui): resolve stale gateway URL under nginx reverse-proxy multi-instance setups", "updated_at": "2026-04-21T10:40:06Z" }, { "additions": 78, "author": "DanWebb1949", "author_association": "NONE", "body_excerpt": "## Summary `openclaw update` currently runs a full package-manager install, native-module recompilation, and doctor checks even when the installed version already matches the registry target. On resource-constrained systems (e.g., 4 GB RAM\u2026", "changed_files": 2, "cluster_id": "cluster-69412-3", "cluster_ids": [ "cluster-69412-3" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69645", "created_at": "2026-04-21T08:43:03Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69645/files", "html_url": "https://github.com/openclaw/openclaw/pull/69645", "labels": [ "cli", "size: S" ], "merged": false, "number": 69645, "review_comments_count": 3, "state": "open", "title": "fix: skip update when already on target version", "updated_at": "2026-04-21T08:48:46Z" }, { "additions": 294, "author": "Noor-ul-ain001", "author_association": "NONE", "body_excerpt": "I updated the README to make the setup process easier for beginners. Added: - Clearer instructions - Common issues and fixes This should help new users understand the project better.", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69644", "created_at": "2026-04-21T08:42:33Z", "deletions": 372, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69644/files", "html_url": "https://github.com/openclaw/openclaw/pull/69644", "labels": [ "size: L" ], "merged": false, "number": 69644, "review_comments_count": 4, "state": "open", "title": "Improve README with clearer instructions", "updated_at": "2026-04-21T13:56:59Z" }, { "additions": 17, "author": "yuaiccc", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Zalo Personal docs did not mention the profile environment variables declared and read by the bundled plugin. - Why it matters: users had to inspect source code to discover how to select saved Zalo login profiles. - W\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69643", "created_at": "2026-04-21T08:41:43Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69643/files", "html_url": "https://github.com/openclaw/openclaw/pull/69643", "labels": [ "docs", "channel: zalouser", "size: XS" ], "merged": false, "number": 69643, "review_comments_count": 0, "state": "open", "title": "docs: document Zalo profile env vars", "updated_at": "2026-04-21T08:58:55Z" }, { "additions": 57, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes Telegram outbound file delivery in two spots: - parse lowercase `media:` directives during block reply handling so media is sent once - preserve the original filename when staging outbound attachments so Telegram does not show the UU\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69641", "created_at": "2026-04-21T08:30:27Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69641/files", "html_url": "https://github.com/openclaw/openclaw/pull/69641", "labels": [ "maintainer", "size: S" ], "merged": true, "number": 69641, "review_comments_count": 0, "state": "closed", "title": "Fix Telegram media file delivery", "updated_at": "2026-04-21T08:50:01Z" }, { "additions": 371, "author": "moonjuhyun123", "author_association": "NONE", "body_excerpt": "Local bird's-eye reading-order guides produced by parallel sub-agents: - Use Case A: message lifecycle (inbound -> agent -> outbound) - Use Case B: boot flow (CLI -> gateway daemon) - Use Case C: Live Canvas / A2UI rendering https://claude\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69639", "created_at": "2026-04-21T08:28:18Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69639/files", "html_url": "https://github.com/openclaw/openclaw/pull/69639", "labels": [ "size: M" ], "merged": false, "number": 69639, "review_comments_count": 4, "state": "open", "title": "docs(agents): add architecture reading guides for three use cases", "updated_at": "2026-04-21T13:54:14Z" }, { "additions": 33, "author": "creativerezz", "author_association": "NONE", "body_excerpt": "## Summary - allow password-mode gateway auth to fall back to `connectAuth.token` when `connectAuth.password` is absent, which matches Rabbit R1 `clawdbot-gateway` QR handshakes over Funnel + `wss` - add a regression test that covers the R\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69638", "created_at": "2026-04-21T08:24:58Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69638/files", "html_url": "https://github.com/openclaw/openclaw/pull/69638", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 69638, "review_comments_count": 1, "state": "open", "title": "fix(gateway): accept Rabbit token payloads in password mode", "updated_at": "2026-04-21T11:16:52Z" }, { "additions": 99, "author": "iteemoo6", "author_association": "NONE", "body_excerpt": "Closes #69621\\n\\n- Add PENDING.md.example template with usage guide and examples\\n- Add PENDING.md documentation to agent workspace file map\\n- Add PENDING.md integration guide to heartbeat docs with example task\\n- Explain when to use PEN\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69637", "created_at": "2026-04-21T08:08:14Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69637/files", "html_url": "https://github.com/openclaw/openclaw/pull/69637", "labels": [ "docs", "gateway", "size: XS" ], "merged": false, "number": 69637, "review_comments_count": 4, "state": "open", "title": "docs: add PENDING.md workspace pattern for durable commitment tracking", "updated_at": "2026-04-21T08:22:24Z" }, { "additions": 15, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** The data-code attribute on code-block copy buttons was using escapeHtml(), which converted special characters like <, >, and & into HTML entities. When users clicked the copy button, they got escaped text instead\u2026", "changed_files": 2, "cluster_id": "cluster-69605-4", "cluster_ids": [ "cluster-69605-4" ], "cluster_role": "canonical", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69635", "created_at": "2026-04-21T07:56:34Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69635/files", "html_url": "https://github.com/openclaw/openclaw/pull/69635", "labels": [ "app: web-ui", "size: XS" ], "merged": false, "number": 69635, "review_comments_count": 5, "state": "open", "title": "fix(ui): preserve raw code text in code-block copy button", "updated_at": "2026-04-21T15:20:17Z" }, { "additions": 1, "author": "longle325", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69605 In the Control UI webchat, clicking the copy button on a code block copies the entire assistant message instead of just the code block content. ## Root Cause The `.chat-bubble-actions` (containing the \"Copy as markd\u2026", "changed_files": 1, "cluster_id": "cluster-69605-4", "cluster_ids": [ "cluster-69605-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69634", "created_at": "2026-04-21T07:51:52Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69634/files", "html_url": "https://github.com/openclaw/openclaw/pull/69634", "labels": [ "app: web-ui", "size: XS" ], "merged": false, "number": 69634, "review_comments_count": 0, "state": "open", "title": "fix(ui): code block copy button overlaps message-level copy action (#69605)", "updated_at": "2026-04-21T09:03:50Z" }, { "additions": 75, "author": "AlexAlves87", "author_association": "NONE", "body_excerpt": "## Summary Implements the SPA-side support for the WebView2 native bridge proposed in openclaw/openclaw-windows-node#191. The Windows host side is being introduced in openclaw/openclaw-windows-node#192. This PR adds the frontend bridge lay\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69633", "created_at": "2026-04-21T07:50:57Z", "deletions": 0, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69633/files", "html_url": "https://github.com/openclaw/openclaw/pull/69633", "labels": [ "app: web-ui", "size: S" ], "merged": false, "number": 69633, "review_comments_count": 0, "state": "open", "title": "feat(ui): add SPA-side support for WebView2 native bridge", "updated_at": "2026-04-21T07:58:12Z" }, { "additions": 3, "author": "yuaiccc", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Agent avatar docs did not mention the local avatar file size limit. - Why it matters: Users can spend time debugging valid-looking avatar paths when the file size is the reason the avatar is not served. - What changed\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69630", "created_at": "2026-04-21T07:44:21Z", "deletions": 0, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69630/files", "html_url": "https://github.com/openclaw/openclaw/pull/69630", "labels": [ "docs", "gateway", "size: XS" ], "merged": false, "number": 69630, "review_comments_count": 0, "state": "closed", "title": "docs: document avatar image size limit", "updated_at": "2026-04-21T08:05:19Z" }, { "additions": 1154, "author": "phenomenoner", "author_association": "NONE", "body_excerpt": "## Summary - land the B1/M14 lifecycle seam scaffold in the embedded runner - add M14-A receipt and parity hardening for the seam - add M14-B internal decision gate/schema freeze without enabling live steering ## What changed - adds `run/l\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69627", "created_at": "2026-04-21T07:37:42Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69627/files", "html_url": "https://github.com/openclaw/openclaw/pull/69627", "labels": [ "agents", "size: XL" ], "merged": false, "number": 69627, "review_comments_count": 11, "state": "open", "title": "feat: harden embedded runner lifecycle seam", "updated_at": "2026-04-21T12:54:44Z" }, { "additions": 1588, "author": "arminanton", "author_association": "NONE", "body_excerpt": "## Summary _AI-assisted PR. Prepared with AI assistance against a repo snapshot; targeted validation only. See Repro + Verification and Human Verification for exact coverage._ Describe the problem and fix in 2\u20135 bullets: - Problem: OpenCla\u2026", "changed_files": 32, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69618", "created_at": "2026-04-21T07:04:22Z", "deletions": 173, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69618/files", "html_url": "https://github.com/openclaw/openclaw/pull/69618", "labels": [ "docs", "app: web-ui", "gateway", "size: XL" ], "merged": false, "number": 69618, "review_comments_count": 13, "state": "open", "title": "feat(messages): add responseFooter templates and enrich /usage full", "updated_at": "2026-04-21T08:38:46Z" }, { "additions": 86, "author": "rubencu", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: gateway logs repeatedly print `[plugins] ... installed bundled runtime deps ...` during embedded runtime plugin warmups, so normal Telegram or subagent traffic can flood `gateway:watch` with install-style noise. - Why\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69617", "created_at": "2026-04-21T07:03:31Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69617/files", "html_url": "https://github.com/openclaw/openclaw/pull/69617", "labels": [ "agents", "size: S" ], "merged": false, "number": 69617, "review_comments_count": 0, "state": "closed", "title": "fix: suppress repeated bundled runtime deps gateway logs", "updated_at": "2026-04-21T07:21:45Z" }, { "additions": 4, "author": "91wan", "author_association": "NONE", "body_excerpt": "This is a docs-only claim-tightening PR, intentionally split from #68982 to keep that UI fix scoped. Clarify current observable behavior for Codex compaction: OpenClaw confirms compaction start/completion, but does not yet expose a human-r\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69612", "created_at": "2026-04-21T06:27:03Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69612/files", "html_url": "https://github.com/openclaw/openclaw/pull/69612", "labels": [ "docs", "size: XS" ], "merged": false, "number": 69612, "review_comments_count": 0, "state": "open", "title": "docs(codex): narrow compaction claims", "updated_at": "2026-04-21T15:13:53Z" }, { "additions": 401, "author": "thewilloftheshadow", "author_association": "MEMBER", "body_excerpt": null, "changed_files": 23, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69611", "created_at": "2026-04-21T06:23:41Z", "deletions": 34, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69611/files", "html_url": "https://github.com/openclaw/openclaw/pull/69611", "labels": [ "docs", "channel: discord", "channel: slack", "channel: telegram", "maintainer", "size: M" ], "merged": true, "number": 69611, "review_comments_count": 3, "state": "closed", "title": "feat(channels): stream tool progress into preview edits", "updated_at": "2026-04-21T16:52:03Z" }, { "additions": 11930, "author": "rubencu", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `gateway:watch` exposed stale assumptions around bootstrap injection and daily-memory/session-summary file selection, including missing canonical-path reads, dropped local-day continuity, and inconsistent handling of\u2026", "changed_files": 39, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69608", "created_at": "2026-04-21T05:48:16Z", "deletions": 1104, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69608/files", "html_url": "https://github.com/openclaw/openclaw/pull/69608", "labels": [ "docs", "gateway", "extensions: memory-core", "scripts", "agents", "size: XL" ], "merged": false, "number": 69608, "review_comments_count": 8, "state": "open", "title": "fix: align startup context and daily memory handling with session-summary variants", "updated_at": "2026-04-21T16:39:23Z" }, { "additions": 3608, "author": "swotvibe", "author_association": "NONE", "body_excerpt": "## Summary Migrate the Notion API client to use the official `@notionhq/client` SDK (v5.13.0) internally while preserving the existing external `NotionApiClient` interface. Updated for full compatibility with Notion API 2026-03-11 data sou\u2026", "changed_files": 43, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69604", "created_at": "2026-04-21T05:25:33Z", "deletions": 1463, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69604/files", "html_url": "https://github.com/openclaw/openclaw/pull/69604", "labels": [ "channel: whatsapp-web", "scripts", "docker", "agents", "size: XL" ], "merged": false, "number": 69604, "review_comments_count": 25, "state": "open", "title": "feat(notion): Expand Notion plugin with complete API coverage (20 tools)", "updated_at": "2026-04-21T15:29:29Z" }, { "additions": 1169, "author": "pgondhi987", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** `sendFileUrl` in the Synology Chat extension passed the `fileUrl` parameter directly to the NAS incoming webhook as `file_url` with no URL validation, protocol restriction, or private-IP check. The NAS then fetche\u2026", "changed_files": 21, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69603", "created_at": "2026-04-21T05:19:20Z", "deletions": 42, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69603/files", "html_url": "https://github.com/openclaw/openclaw/pull/69603", "labels": [ "docs", "maintainer", "size: XL" ], "merged": false, "number": 69603, "review_comments_count": 37, "state": "open", "title": "fix(synology-chat): add SSRF guard to sendFileUrl [AI-assisted]", "updated_at": "2026-04-21T14:56:22Z" }, { "additions": 141, "author": "nnish16", "author_association": "NONE", "body_excerpt": "## Summary - update `skills.update` to mutate the source config snapshot instead of rewriting the runtime-loaded config - keep the existing skill field normalization logic while avoiding runtime-only compatibility fields during writes - ad\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69602", "created_at": "2026-04-21T05:18:51Z", "deletions": 42, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69602/files", "html_url": "https://github.com/openclaw/openclaw/pull/69602", "labels": [ "gateway", "size: S" ], "merged": false, "number": 69602, "review_comments_count": 0, "state": "open", "title": "Fix skills.update writes from runtime-derived config", "updated_at": "2026-04-21T05:22:12Z" }, { "additions": 439, "author": "Takhoffman", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary This PR fixes a reset/startup memory mismatch in the runtime. The session-memory hook saves reset snapshots as date-prefixed slugged artifacts such as `memory/2026-04-11-friendly-summary.md`, but the startup preload path previou\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69600", "created_at": "2026-04-21T04:54:41Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69600/files", "html_url": "https://github.com/openclaw/openclaw/pull/69600", "labels": [ "maintainer", "size: M" ], "merged": true, "number": 69600, "review_comments_count": 24, "state": "closed", "title": "fix: preload slugged startup memory files", "updated_at": "2026-04-21T12:03:46Z" }, { "additions": 383, "author": "Bartok9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Adds `tools.web.fetch.urlRouting` config \u2014 an ordered list of domain routing rules that fire inside `runBeforeToolCallHook()` before any `web_fetch` call. Closes #69591 ## Problem Agents reflexively call `web_fetch` on any URL,\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69596", "created_at": "2026-04-21T04:43:05Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69596/files", "html_url": "https://github.com/openclaw/openclaw/pull/69596", "labels": [ "agents", "size: M", "r: too-many-prs" ], "merged": false, "number": 69596, "review_comments_count": 5, "state": "closed", "title": "feat: URL routing rules for web_fetch \u2014 redirect/warn/block by domain pattern", "updated_at": "2026-04-21T04:46:41Z" }, { "additions": 168, "author": "pgondhi987", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** Attacker-controlled URLs passed to `uploadC2CMedia` / `uploadGroupMedia` were forwarded to the QQ Bot API (`POST /v2/users/{openid}/files`, `POST /v2/groups/{groupOpenid}/files`) as `body.url` with no validation,\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69595", "created_at": "2026-04-21T04:35:43Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69595/files", "html_url": "https://github.com/openclaw/openclaw/pull/69595", "labels": [ "maintainer", "size: S", "channel: qqbot" ], "merged": true, "number": 69595, "review_comments_count": 6, "state": "closed", "title": "fix(qqbot): add SSRF guard to direct-upload URL paths in uploadC2CMedia and uploadGroupMedia [AI-assisted]", "updated_at": "2026-04-21T05:10:41Z" }, { "additions": 1087, "author": "pgondhi987", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** `sendPhoto` in the Zalo extension forwarded user-supplied media URLs directly to the Zalo Bot API with zero URL validation or SSRF protection. The Zalo server fetches the supplied URL from its infrastructure, maki\u2026", "changed_files": 17, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/69593", "created_at": "2026-04-21T04:30:10Z", "deletions": 33, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69593/files", "html_url": "https://github.com/openclaw/openclaw/pull/69593", "labels": [ "channel: zalo", "maintainer", "size: XL" ], "merged": true, "number": 69593, "review_comments_count": 34, "state": "closed", "title": "fix(zalo): add SSRF guard on outbound photo URLs [AI-assisted]", "updated_at": "2026-04-21T13:50:37Z" }, { "additions": 282, "author": "pgondhi987", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** The Synology Chat extension's `sendMedia` \u2192 `sendFileUrl` path passed attacker-controlled `mediaUrl` values directly to the Synology NAS incoming webhook as `file_url` with no URL or SSRF validation. The NAS then\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69592", "created_at": "2026-04-21T04:27:51Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69592/files", "html_url": "https://github.com/openclaw/openclaw/pull/69592", "labels": [ "docs", "maintainer", "size: M" ], "merged": false, "number": 69592, "review_comments_count": 12, "state": "closed", "title": "fix(synology-chat): block SSRF in sendFileUrl file_url parameter [AI-assisted]", "updated_at": "2026-04-21T17:00:32Z" }, { "additions": 14349, "author": "loongfay", "author_association": "NONE", "body_excerpt": "# feat(channel): add Yuanbao IM channel plugin ## Summary - **Problem:** OpenClaw had no integration with Tencent Yuanbao (\u5143\u5b9d), a major AI assistant platform in China. Users who wanted to connect their AI agents to Yuanbao's IM bot ecosyst\u2026", "changed_files": 124, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69590", "created_at": "2026-04-21T04:17:34Z", "deletions": 23, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69590/files", "html_url": "https://github.com/openclaw/openclaw/pull/69590", "labels": [ "docs", "scripts", "size: XL" ], "merged": false, "number": 69590, "review_comments_count": 7, "state": "open", "title": "feat: Yuanbo Channel", "updated_at": "2026-04-21T11:53:26Z" }, { "additions": 4, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "The tasks audit was reporting false-positive inconsistent_timestamps warnings when createdAt was 0 or invalid. This could happen for tasks with malformed or legacy timestamp data, causing noise in the audit output and making it harder to i\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69588", "created_at": "2026-04-21T04:15:35Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69588/files", "html_url": "https://github.com/openclaw/openclaw/pull/69588", "labels": [ "size: XS", "r: too-many-prs" ], "merged": false, "number": 69588, "review_comments_count": 4, "state": "closed", "title": "fix(tasks): skip timestamp inconsistency check for invalid createdAt", "updated_at": "2026-04-21T13:45:22Z" }, { "additions": 1120, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - keep `message` available for chat-capable isolated crons, including coding profiles - resolve chat context for `--no-deliver` / `channel: last` - treat direct `message` sends as delivery and skip fallback announce ## Tests - `\u2026", "changed_files": 40, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/69587", "created_at": "2026-04-21T04:11:33Z", "deletions": 136, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69587/files", "html_url": "https://github.com/openclaw/openclaw/pull/69587", "labels": [ "docs", "gateway", "cli", "agents", "maintainer", "size: XL" ], "merged": true, "number": 69587, "review_comments_count": 12, "state": "closed", "title": "Fix cron chat delivery policy", "updated_at": "2026-04-21T06:55:34Z" }, { "additions": 10, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "The formatSetupSelectionLabel function would throw 'Cannot read properties of undefined (reading trim)' when the label or fallback was undefined. This could happen when selecting 'Skip for now' in the onboard flow, as the quick start chann\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69586", "created_at": "2026-04-21T04:03:10Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69586/files", "html_url": "https://github.com/openclaw/openclaw/pull/69586", "labels": [ "size: XS", "r: too-many-prs" ], "merged": false, "number": 69586, "review_comments_count": 6, "state": "closed", "title": "fix(onboard): handle undefined labels in channel setup selection", "updated_at": "2026-04-21T13:45:21Z" }, { "additions": 4246, "author": "mmy4shadow", "author_association": "NONE", "body_excerpt": "## Summary - allow loopback Control UI sessions to auto-connect using bootstrap auth instead of URL token auth - unify chat run-state evidence and show a three-state toolbar indicator in the composer gap: `In progress`, `Interrupted`, `Com\u2026", "changed_files": 32, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69585", "created_at": "2026-04-21T03:53:15Z", "deletions": 259, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69585/files", "html_url": "https://github.com/openclaw/openclaw/pull/69585", "labels": [ "app: web-ui", "gateway", "cli", "commands", "size: XL" ], "merged": false, "number": 69585, "review_comments_count": 9, "state": "open", "title": "[codex] fix control UI bootstrap auth and run status", "updated_at": "2026-04-21T08:45:08Z" }, { "additions": 1908, "author": "mmy4shadow", "author_association": "NONE", "body_excerpt": "## Summary - fix runtime and setup follow-ups around the same Control UI / gateway flow - add safer OAuth browser-open fallback behavior and align provider `openUrl` contracts - restore fast-but-correct overview loading with summary-only c\u2026", "changed_files": 40, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69584", "created_at": "2026-04-21T03:53:14Z", "deletions": 500, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69584/files", "html_url": "https://github.com/openclaw/openclaw/pull/69584", "labels": [ "channel: msteams", "app: macos", "app: web-ui", "gateway", "commands", "size: XL", "extensions: minimax" ], "merged": false, "number": 69584, "review_comments_count": 12, "state": "open", "title": "[codex] fix gateway runtime flow follow-ups", "updated_at": "2026-04-21T09:38:00Z" }, { "additions": 110, "author": "zeroaltitude", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem `memory_search` consistently takes ~2000 ms on active workspaces with multiple qmd collections \u2014 far more than SQLite FTS should ever need. Root cause: `runQueryAcrossCollections` in `qmd-manager.ts` issues one qmd subprocess pe\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69583", "created_at": "2026-04-21T03:51:50Z", "deletions": 11, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69583/files", "html_url": "https://github.com/openclaw/openclaw/pull/69583", "labels": [ "extensions: memory-core", "size: S" ], "merged": false, "number": 69583, "review_comments_count": 1, "state": "open", "title": "perf(memory-core): parallelize multi-collection qmd search invocations", "updated_at": "2026-04-21T03:54:13Z" }, { "additions": 3, "author": "Sanjays2402", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** The secrets audit flags Codex's synthetic `apiKey: \"codex-app-server\"` (defined in `extensions/codex/provider.ts`) as `PLAINTEXT_FOUND`, even though it's not a real secret \u2014 Codex's real authentication lives insid\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69581", "created_at": "2026-04-21T03:46:04Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69581/files", "html_url": "https://github.com/openclaw/openclaw/pull/69581", "labels": [ "agents", "size: XS", "extensions: codex" ], "merged": true, "number": 69581, "review_comments_count": 0, "state": "closed", "title": "fix(codex): exclude codex-app-server synthetic apiKey from secrets audit", "updated_at": "2026-04-21T11:38:27Z" }, { "additions": 95, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898 #69527\uff1aopenrouter/auto \u88ab\u5ffd\u7565\uff0c\u5f3a\u5236\u964d\u7ea7\u5230 gpt-4.1-mini\u3002 ## \u4fee\u590d \u5728 \u7684 \u4e2d\uff0c \u662f\u7279\u6b8a\u7684\u54e8\u5175\u6a21\u578b\uff0c\u8868\u793a\u300c\u8ba9 OpenRouter \u81ea\u52a8\u9009\u62e9\u6700\u4f73\u6a21\u578b\u300d\u3002OpenRouter API \u671f\u671b\u7684\u6a21\u578b ID \u662f\u88f8\u7684 \uff0c\u800c\u4e0d\u662f\u5e26\u524d\u7f00\u7684 \u3002 \u4fee\u590d\u903b\u8f91\uff1a - \u5f53 \u65f6\uff0c\u5c06\u5176\u89c4\u8303\u5316\u4e3a - \u4f7f\u7528 \u4f5c\u4e3a\u8fd4\u56de\u6a21\u578b\u7684 uid=0(root) gid=0(root) groups=0(root) \u5b57\u6bb5\uff08\u8fd9\u662f\u53d1\u9001\u5230 OpenRouter API \u7684\u503c\uff09\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69580", "created_at": "2026-04-21T03:45:56Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69580/files", "html_url": "https://github.com/openclaw/openclaw/pull/69580", "labels": [ "agents", "size: S", "r: too-many-prs" ], "merged": false, "number": 69580, "review_comments_count": 1, "state": "closed", "title": "fix: respect openrouter/auto model selection (#69527)", "updated_at": "2026-04-21T03:47:31Z" }, { "additions": 1940, "author": "kenchung", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** `video_generate` providers all target cinematic / scene generation (Veo, Runway, Kling, Wan, MiniMax, Dashscope). The identity-first / avatar-presenter lane \u2014 a specific avatar speaking a specific script \u2014 is unse\u2026", "changed_files": 17, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69578", "created_at": "2026-04-21T03:35:38Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69578/files", "html_url": "https://github.com/openclaw/openclaw/pull/69578", "labels": [ "docs", "size: XL" ], "merged": false, "number": 69578, "review_comments_count": 18, "state": "open", "title": "feat(heygen): add Video Agent provider plugin", "updated_at": "2026-04-21T05:48:55Z" }, { "additions": 2, "author": "swotvibe", "author_association": "NONE", "body_excerpt": "## Problem When loading images from media store (media-uri refs), the `workspaceOnly` check was preventing access to `/home/node/.openclaw/media/inbound/` even when the image was legitimately saved by a channel (e.g., WhatsApp inbound imag\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69577", "created_at": "2026-04-21T03:35:28Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69577/files", "html_url": "https://github.com/openclaw/openclaw/pull/69577", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69577, "review_comments_count": 1, "state": "open", "title": "fix: allow media-uri refs to bypass workspaceOnly check for image loading", "updated_at": "2026-04-21T03:46:17Z" }, { "additions": 46, "author": "iamlukethedev", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69575", "created_at": "2026-04-21T03:30:42Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69575/files", "html_url": "https://github.com/openclaw/openclaw/pull/69575", "labels": [ "app: web-ui", "gateway", "size: XS" ], "merged": false, "number": 69575, "review_comments_count": 1, "state": "open", "title": "fix: accept allow-always approval source", "updated_at": "2026-04-21T03:32:05Z" }, { "additions": 65, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "The parseAbsoluteTimeMs function would throw 'Cannot read properties of undefined (reading trim)' when called with undefined or null input. This could happen when cron jobs had malformed or missing schedule data, particularly when displayi\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69574", "created_at": "2026-04-21T03:26:47Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69574/files", "html_url": "https://github.com/openclaw/openclaw/pull/69574", "labels": [ "cli", "size: S" ], "merged": false, "number": 69574, "review_comments_count": 8, "state": "open", "title": "fix(cron): handle undefined/null input in parseAbsoluteTimeMs", "updated_at": "2026-04-21T15:20:19Z" }, { "additions": 2331, "author": "mmy4shadow", "author_association": "NONE", "body_excerpt": "## Summary - improve local Control UI bootstrap auth so loopback dashboards can auto-connect without leaking the token in the URL - tighten chat run-state UX so the toolbar shows the basic three user-facing states in the bottom input bar g\u2026", "changed_files": 56, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69571", "created_at": "2026-04-21T03:24:01Z", "deletions": 84, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69571/files", "html_url": "https://github.com/openclaw/openclaw/pull/69571", "labels": [ "docs", "channel: msteams", "app: web-ui", "gateway", "commands", "size: XL", "extensions: minimax" ], "merged": false, "number": 69571, "review_comments_count": 0, "state": "closed", "title": "[codex] improve control UI bootstrap auth and run status", "updated_at": "2026-04-21T03:27:54Z" }, { "additions": 13, "author": "anurag-bg-neu", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69567", "created_at": "2026-04-21T03:17:47Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69567/files", "html_url": "https://github.com/openclaw/openclaw/pull/69567", "labels": [ "size: XS" ], "merged": false, "number": 69567, "review_comments_count": 0, "state": "open", "title": "security(ci): mask derived base64 auth header in custom checkout blocks", "updated_at": "2026-04-21T03:19:43Z" }, { "additions": 449, "author": "iamlukethedev", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69562", "created_at": "2026-04-21T03:10:43Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69562/files", "html_url": "https://github.com/openclaw/openclaw/pull/69562", "labels": [ "gateway", "size: M" ], "merged": false, "number": 69562, "review_comments_count": 5, "state": "open", "title": "fix: validate cron announce account ids", "updated_at": "2026-04-21T03:50:58Z" }, { "additions": 73, "author": "iamlukethedev", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 2, "cluster_id": "cluster-36488-17", "cluster_ids": [ "cluster-36488-17" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69560", "created_at": "2026-04-21T03:08:57Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69560/files", "html_url": "https://github.com/openclaw/openclaw/pull/69560", "labels": [ "size: S" ], "merged": false, "number": 69560, "review_comments_count": 0, "state": "open", "title": "fix: guard quickstart channel skip", "updated_at": "2026-04-21T03:09:50Z" }, { "additions": 149, "author": "kirkluokun", "author_association": "CONTRIBUTOR", "body_excerpt": "@clawdbot/lobster/core returns both resumeToken and approvalId when a workflow step needs approval, but the lobster plugin was dropping approvalId in three places: normalizeEnvelope, the tool schema, and the embedded-runner resume branch.\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69559", "created_at": "2026-04-21T03:07:29Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69559/files", "html_url": "https://github.com/openclaw/openclaw/pull/69559", "labels": [ "extensions: lobster", "size: S" ], "merged": true, "number": 69559, "review_comments_count": 1, "state": "closed", "title": "fix(lobster): forward approvalId alongside resumeToken in tool envelope", "updated_at": "2026-04-21T04:32:30Z" }, { "additions": 1008, "author": "vincentkoc", "author_association": "MEMBER", "body_excerpt": "## what changed - add a new `device-code` auth path for the bundled `openai-codex` provider - model the flow on the device-token auth used in `~/GIT/_Perso/codex`, including OpenAI device-code polling and token exchange - expose the new au\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69557", "created_at": "2026-04-21T03:03:12Z", "deletions": 63, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69557/files", "html_url": "https://github.com/openclaw/openclaw/pull/69557", "labels": [ "commands", "maintainer", "size: XL", "extensions: openai" ], "merged": false, "number": 69557, "review_comments_count": 3, "state": "open", "title": "feat(openai): add codex device-code auth and fix login options in menu", "updated_at": "2026-04-21T17:53:56Z" }, { "additions": 25, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "The Telegram extension was not passing the humanDelay configuration to the buffered block dispatcher, which meant typing delay settings were being ignored for Telegram messages. This fix adds the missing humanDelay resolution and passes it\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69556", "created_at": "2026-04-21T03:01:39Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69556/files", "html_url": "https://github.com/openclaw/openclaw/pull/69556", "labels": [ "channel: telegram", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69556, "review_comments_count": 10, "state": "closed", "title": "fix(telegram): pass humanDelay config to dispatcher", "updated_at": "2026-04-21T13:45:18Z" }, { "additions": 29, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem \\`openclaw secrets audit\\` flags \\`providers.codex.apiKey = \\\"codex-app-server\\\"\\` in every agent's \\`models.json\\` as \\`PLAINTEXT_FOUND\\`. The value is a synthetic auth marker the codex extension writes via \\`resolveSyntheticAu\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69555", "created_at": "2026-04-21T02:59:01Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69555/files", "html_url": "https://github.com/openclaw/openclaw/pull/69555", "labels": [ "size: XS", "extensions: codex" ], "merged": false, "number": 69555, "review_comments_count": 0, "state": "open", "title": "fix(codex): declare codex-app-server as nonSecretAuthMarker to silence audit FP", "updated_at": "2026-04-21T03:00:16Z" }, { "additions": 95, "author": "Patrick-Erichsen", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Onboarding UX polish for `openclaw onboard`. - **Searchable select** (`searchable?: boolean` on `WizardSelectParams`) for provider/auth and channel pickers - **Security disclaimer**: Undimmed text, pulled a few things out into s\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69553", "created_at": "2026-04-21T02:53:11Z", "deletions": 43, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69553/files", "html_url": "https://github.com/openclaw/openclaw/pull/69553", "labels": [ "commands", "maintainer", "size: S" ], "merged": true, "number": 69553, "review_comments_count": 1, "state": "closed", "title": "onboard: clearer security disclaimer, loading spinners, API key placeholder", "updated_at": "2026-04-21T05:09:00Z" }, { "additions": 11, "author": "CHE10X", "author_association": "NONE", "body_excerpt": "## Summary - hide subagent sessions from the human-facing chat session picker - keep subagent session records intact for internal/runtime use - update the UI test to assert subagent sessions are excluded from picker options ## Why Subagent\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69552", "created_at": "2026-04-21T02:49:51Z", "deletions": 45, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69552/files", "html_url": "https://github.com/openclaw/openclaw/pull/69552", "labels": [ "app: web-ui", "size: S" ], "merged": false, "number": 69552, "review_comments_count": 2, "state": "open", "title": "Hide subagent sessions from chat session picker", "updated_at": "2026-04-21T02:54:08Z" }, { "additions": 131, "author": "steipete", "author_association": "CONTRIBUTOR", "body_excerpt": "Replacement for #65061 because the contributor fork cannot be updated by maintainers and the original branch conflicts with current `main`. Keeps @zhulijin1991's two fixes, rebased on current `main`, with the run-attempt test hook conflict\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69551", "created_at": "2026-04-21T02:49:16Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69551/files", "html_url": "https://github.com/openclaw/openclaw/pull/69551", "labels": [ "agents", "maintainer", "size: S", "extensions: codex" ], "merged": true, "number": 69551, "review_comments_count": 0, "state": "closed", "title": "fix(codex): avoid vision image tool loops", "updated_at": "2026-04-21T03:20:41Z" }, { "additions": 18, "author": "SharkeyDev", "author_association": "NONE", "body_excerpt": "# Upstream OpenClaw PR Proposal: Remove Model-Visible `security` / `ask` Params from `exec` Tool Schema **Target repo:** `openclaw/openclaw` **Target branch:** `main` **Status:** Draft \u2014 ready to file after operator review. **Tracking audi\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69549", "created_at": "2026-04-21T02:42:33Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69549/files", "html_url": "https://github.com/openclaw/openclaw/pull/69549", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69549, "review_comments_count": 0, "state": "open", "title": "exec tool: strip model-visible `security` / `ask` params", "updated_at": "2026-04-21T02:45:07Z" }, { "additions": 37, "author": "jackson-jia-914", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: Multiple OpenClaw instances sharing the same dreaming cron expression fire dreaming sweeps simultaneously, causing redundant concurrent work, I/O spikes, and potential race conditions on shared storage. - **Why it\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69548", "created_at": "2026-04-21T02:40:24Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69548/files", "html_url": "https://github.com/openclaw/openclaw/pull/69548", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 69548, "review_comments_count": 10, "state": "open", "title": "feat(memory): add staggerMs option to dreaming cron schedule", "updated_at": "2026-04-21T08:20:13Z" }, { "additions": 27, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "FreeBSD uses its own package manager (pkg) rather than Homebrew. Previously, the onboard flow would recommend installing Homebrew on FreeBSD, which is not the standard practice for FreeBSD users. Fixes #68893", "changed_files": 2, "cluster_id": "cluster-68893-6", "cluster_ids": [ "cluster-68893-6" ], "cluster_role": "canonical", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69545", "created_at": "2026-04-21T02:36:51Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69545/files", "html_url": "https://github.com/openclaw/openclaw/pull/69545", "labels": [ "commands", "size: XS" ], "merged": false, "number": 69545, "review_comments_count": 7, "state": "open", "title": "fix(onboard): skip Homebrew recommendation on FreeBSD", "updated_at": "2026-04-21T15:21:44Z" }, { "additions": 145, "author": "kaseonedge", "author_association": "NONE", "body_excerpt": "When the primary ACP backend fails with ACP_TURN_FAILED due to rate limiting, quota exhaustion, or UNAVAILABLE errors, automatically retry the turn with the next configured backend in acp.fallbacks. ## Changes - Add acp.fallbacks config op\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69542", "created_at": "2026-04-21T02:18:44Z", "deletions": 22, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69542/files", "html_url": "https://github.com/openclaw/openclaw/pull/69542", "labels": [ "size: S" ], "merged": false, "number": 69542, "review_comments_count": 13, "state": "open", "title": "feat(acp): add backend provider failover for UNAVAILABLE errors", "updated_at": "2026-04-21T09:13:06Z" }, { "additions": 135, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69540", "created_at": "2026-04-21T02:17:31Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69540/files", "html_url": "https://github.com/openclaw/openclaw/pull/69540", "labels": [ "agents", "maintainer", "size: S" ], "merged": true, "number": 69540, "review_comments_count": 8, "state": "closed", "title": "fix(mcp): block dangerous stdio env overrides", "updated_at": "2026-04-21T07:12:13Z" }, { "additions": 0, "author": "sudhindrat", "author_association": "NONE", "body_excerpt": "## Summary Fixes `ERR_INVALID_ARG_TYPE: The data argument must be of type string or an instance of Buffer... Received undefined` when tool params are undefined. ## Root Cause In `src/agents/tool-loop-detection.ts`, the `hashToolCall` funct\u2026", "changed_files": 0, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69539", "created_at": "2026-04-21T02:12:36Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69539/files", "html_url": "https://github.com/openclaw/openclaw/pull/69539", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69539, "review_comments_count": 1, "state": "closed", "title": "fix(tool-loop-detection): handle undefined params in hashToolCall", "updated_at": "2026-04-21T10:51:55Z" }, { "additions": 265, "author": "amknight", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Adds two new probe sites inside `src/plugin-sdk/channel-entry-contract.ts` so we can attribute cold-start cost during bundled-channel-entry plugin registration. Gated on the existing `OPENCLAW_PLUGIN_LOAD_PROFILE=1` env flag and\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69537", "created_at": "2026-04-21T02:09:06Z", "deletions": 71, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69537/files", "html_url": "https://github.com/openclaw/openclaw/pull/69537", "labels": [ "maintainer", "size: M" ], "merged": true, "number": 69537, "review_comments_count": 1, "state": "closed", "title": "perf(plugin-sdk): per-phase + per-jiti-call probes for bundled channel entries", "updated_at": "2026-04-21T12:06:16Z" }, { "additions": 125, "author": "neeravmakwana", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Two small, related fixes around `openclaw infer model run` observability and `openclaw models status` display. ### Bug A - `infer model run` never reports fallback attempts **Symptom:** The `model.run` capability envelope always\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69535", "created_at": "2026-04-21T02:07:29Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69535/files", "html_url": "https://github.com/openclaw/openclaw/pull/69535", "labels": [ "cli", "commands", "agents", "size: S" ], "merged": false, "number": 69535, "review_comments_count": 2, "state": "open", "title": "fix(cli): surface model-fallback attempts and fix models status label", "updated_at": "2026-04-21T02:24:15Z" }, { "additions": 842, "author": "mbs-vhs", "author_association": "NONE", "body_excerpt": "## Summary Bridges the voice-call plugin's realtime session to the main agent's reasoning loop in both directions, so Twilio + OpenAI Realtime voice calls actually become an async-relay channel for the agent: - **Outbound intent injection\u2026", "changed_files": 18, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69530", "created_at": "2026-04-21T01:55:38Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69530/files", "html_url": "https://github.com/openclaw/openclaw/pull/69530", "labels": [ "docs", "channel: voice-call", "size: L", "extensions: openai" ], "merged": false, "number": 69530, "review_comments_count": 4, "state": "open", "title": "feat(voice-call): relay realtime calls to/from agent reasoning loop", "updated_at": "2026-04-21T04:00:16Z" }, { "additions": 84, "author": "hszhsz", "author_association": "NONE", "body_excerpt": "## Summary Two bug fixes bundled in this PR: --- ### Fix 1: #69525 \u2014 Cross-provider message send leaks source session accountId to target channel When sending messages across providers (e.g. Telegram \u2192 Feishu) with `allowAcrossProviders: t\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69529", "created_at": "2026-04-21T01:43:39Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69529/files", "html_url": "https://github.com/openclaw/openclaw/pull/69529", "labels": [ "app: web-ui", "gateway", "size: S" ], "merged": false, "number": 69529, "review_comments_count": 2, "state": "open", "title": "fix: prevent defaultAccountId leak in cross-provider message sends", "updated_at": "2026-04-21T01:59:33Z" }, { "additions": 99, "author": "neeravmakwana", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary WhatsApp TTS auto-replies from the Microsoft (Edge) speech provider were arriving as plain MP3 attachments instead of native voice notes. This PR makes the Microsoft provider honor the `target: \\\"voice-note\\\"` hint that the TTS\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69528", "created_at": "2026-04-21T01:41:10Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69528/files", "html_url": "https://github.com/openclaw/openclaw/pull/69528", "labels": [ "docs", "size: S" ], "merged": false, "number": 69528, "review_comments_count": 0, "state": "open", "title": "fix(microsoft-tts): emit ogg/opus for voice-note targets so WhatsApp auto-replies play as native voice notes", "updated_at": "2026-04-21T01:53:15Z" }, { "additions": 414, "author": "shakkernerd", "author_association": "MEMBER", "body_excerpt": "## Summary - launch setup hatch TUI in a fresh `openclaw tui` child process instead of reusing the onboarding process - restore terminal state before and after the handoff - keep the setup hatch safety behavior: no auto-delivery to last pr\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69524", "created_at": "2026-04-21T01:27:53Z", "deletions": 22, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69524/files", "html_url": "https://github.com/openclaw/openclaw/pull/69524", "labels": [ "gateway", "maintainer", "size: M" ], "merged": true, "number": 69524, "review_comments_count": 7, "state": "closed", "title": "Fix setup TUI hatch terminal handoff", "updated_at": "2026-04-21T02:46:21Z" }, { "additions": 155, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - keep OpenRouter assistant stream messages pinned to the configured model alias instead of the provider-returned redirected id - normalize done/error stream events and final stream results so downstream payload assembly does no\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69522", "created_at": "2026-04-21T01:23:24Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69522/files", "html_url": "https://github.com/openclaw/openclaw/pull/69522", "labels": [ "size: S", "r: too-many-prs" ], "merged": false, "number": 69522, "review_comments_count": 3, "state": "closed", "title": "fix: resolve openrouter model alias redirects in provider response", "updated_at": "2026-04-21T01:29:30Z" }, { "additions": 1083, "author": "eve-builds", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** OpenClaw's `video_generate` tool has six providers (Runway, Google Veo, Qwen Wan, fal, Minimax, Vydra), all focused on cinematic text-to-video. The identity-first / avatar-presenter lane is unserved. Agent users r\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69521", "created_at": "2026-04-21T01:22:13Z", "deletions": 0, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69521/files", "html_url": "https://github.com/openclaw/openclaw/pull/69521", "labels": [ "docs", "size: L" ], "merged": false, "number": 69521, "review_comments_count": 0, "state": "closed", "title": "feat(extensions): add HeyGen video generation provider", "updated_at": "2026-04-21T01:27:30Z" }, { "additions": 640, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2-5 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69520", "created_at": "2026-04-21T01:22:00Z", "deletions": 83, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69520/files", "html_url": "https://github.com/openclaw/openclaw/pull/69520", "labels": [ "app: web-ui", "size: L" ], "merged": false, "number": 69520, "review_comments_count": 0, "state": "open", "title": "UI: harden chat scroll interrupts", "updated_at": "2026-04-21T01:53:34Z" }, { "additions": 140, "author": "sunlight7777777", "author_association": "NONE", "body_excerpt": "Summary Fixes the Sessions page Limit field so it uses a numeric input instead of accepting arbitrary text. Problem The field was implemented as a plain text input and passed raw string values into filter state. This allowed invalid values\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69519", "created_at": "2026-04-21T01:21:33Z", "deletions": 129, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69519/files", "html_url": "https://github.com/openclaw/openclaw/pull/69519", "labels": [ "app: web-ui", "size: M" ], "merged": false, "number": 69519, "review_comments_count": 4, "state": "open", "title": "Sessions page: use numeric input for Limit field", "updated_at": "2026-04-21T11:07:34Z" }, { "additions": 238, "author": "neeravmakwana", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Closes #69513. `openclaw cron create --announce --account ` silently accepted any non-empty string as `delivery.accountId` and persisted it to `cron/jobs.json`, leading to silent failures or misrouted deliveries at run time\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69518", "created_at": "2026-04-21T01:20:19Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69518/files", "html_url": "https://github.com/openclaw/openclaw/pull/69518", "labels": [ "gateway", "size: M" ], "merged": false, "number": 69518, "review_comments_count": 3, "state": "closed", "title": "fix(cron): validate delivery accountId against configured channel accounts", "updated_at": "2026-04-21T01:56:47Z" }, { "additions": 646, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2-5 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69517", "created_at": "2026-04-21T01:08:23Z", "deletions": 83, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69517/files", "html_url": "https://github.com/openclaw/openclaw/pull/69517", "labels": [ "app: web-ui", "size: L" ], "merged": false, "number": 69517, "review_comments_count": 2, "state": "closed", "title": "UI: harden chat scroll interrupts", "updated_at": "2026-04-21T01:21:28Z" }, { "additions": 195, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: silent local shared-auth pairing used the client-requested scopes as the approval baseline, so a first-time local operator pairing could silently self-approve elevated scopes such as `operator.admin`. - Why it matters\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69516", "created_at": "2026-04-21T01:04:03Z", "deletions": 39, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69516/files", "html_url": "https://github.com/openclaw/openclaw/pull/69516", "labels": [ "gateway", "size: M" ], "merged": false, "number": 69516, "review_comments_count": 3, "state": "closed", "title": "fix(gateway): block silent pairing scope self-approval", "updated_at": "2026-04-21T01:26:19Z" }, { "additions": 565, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69515", "created_at": "2026-04-21T00:49:00Z", "deletions": 74, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69515/files", "html_url": "https://github.com/openclaw/openclaw/pull/69515", "labels": [ "app: web-ui", "size: L" ], "merged": false, "number": 69515, "review_comments_count": 1, "state": "closed", "title": "UI: harden chat scroll interrupts", "updated_at": "2026-04-21T00:53:41Z" }, { "additions": 26, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Problem `openclaw plugins install` runs `npm install` without `--omit=peer`. On npm 7+, this causes auto-installation of peer dependencies \u2014 including `openclaw` itself when a plugin declares `\"peerDependencies\": { \"openclaw\": \"*\" }`. T\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 8, "conversation_url": "https://github.com/openclaw/openclaw/pull/69514", "created_at": "2026-04-21T00:47:00Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69514/files", "html_url": "https://github.com/openclaw/openclaw/pull/69514", "labels": [ "size: XS" ], "merged": false, "number": 69514, "review_comments_count": 4, "state": "open", "title": "fix(cli): omit peer deps during plugin install to prevent nested openclaw bloat", "updated_at": "2026-04-21T02:16:53Z" }, { "additions": 25, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Summary Zsh completion for leaf commands (e.g. `openclaw wiki ingest`) was missing positional argument specs, so `` did not trigger file-path completion for commands that accept file arguments. Root cause: `generateZshSubcommands`\u2026", "changed_files": 1, "cluster_id": "cluster-69293-4", "cluster_ids": [ "cluster-69293-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69509", "created_at": "2026-04-21T00:40:30Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69509/files", "html_url": "https://github.com/openclaw/openclaw/pull/69509", "labels": [ "cli", "size: XS" ], "merged": false, "number": 69509, "review_comments_count": 4, "state": "open", "title": "fix(cli): add positional argument completion for zsh leaf commands", "updated_at": "2026-04-21T00:45:35Z" }, { "additions": 561, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2-5 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69508", "created_at": "2026-04-21T00:40:18Z", "deletions": 74, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69508/files", "html_url": "https://github.com/openclaw/openclaw/pull/69508", "labels": [ "app: web-ui", "size: L" ], "merged": false, "number": 69508, "review_comments_count": 2, "state": "closed", "title": "UI: harden chat scroll interrupts", "updated_at": "2026-04-21T00:48:26Z" }, { "additions": 561, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2-5 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69506", "created_at": "2026-04-21T00:31:53Z", "deletions": 74, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69506/files", "html_url": "https://github.com/openclaw/openclaw/pull/69506", "labels": [ "app: web-ui", "size: L" ], "merged": false, "number": 69506, "review_comments_count": 3, "state": "closed", "title": "UI: tighten chat scroll guards", "updated_at": "2026-04-21T00:45:17Z" }, { "additions": 532, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2-5 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69504", "created_at": "2026-04-21T00:21:23Z", "deletions": 73, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69504/files", "html_url": "https://github.com/openclaw/openclaw/pull/69504", "labels": [ "app: web-ui", "size: L" ], "merged": false, "number": 69504, "review_comments_count": 2, "state": "closed", "title": "UI: tighten chat scroll guards", "updated_at": "2026-04-21T00:29:20Z" }, { "additions": 6174, "author": "Ittiz", "author_association": "NONE", "body_excerpt": "## Summary - Problem: assistant replies with managed media, especially image-only replies and agent-run audio replies, could render live in webchat/control UI but fail to persist correctly into transcript/history. - Why it matters: users c\u2026", "changed_files": 25, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69500", "created_at": "2026-04-21T00:12:26Z", "deletions": 1094, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69500/files", "html_url": "https://github.com/openclaw/openclaw/pull/69500", "labels": [ "app: web-ui", "gateway", "size: XL" ], "merged": false, "number": 69500, "review_comments_count": 26, "state": "open", "title": "fix(gateway,ui): restore managed media transcript persistence in webchat", "updated_at": "2026-04-21T15:38:31Z" }, { "additions": 532, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2-5 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69499", "created_at": "2026-04-20T23:57:30Z", "deletions": 73, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69499/files", "html_url": "https://github.com/openclaw/openclaw/pull/69499", "labels": [ "app: web-ui", "size: L" ], "merged": false, "number": 69499, "review_comments_count": 4, "state": "closed", "title": "UI: fix scroll lock and task preview", "updated_at": "2026-04-21T00:21:28Z" }, { "additions": 526, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2-5 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69496", "created_at": "2026-04-20T23:42:00Z", "deletions": 68, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69496/files", "html_url": "https://github.com/openclaw/openclaw/pull/69496", "labels": [ "app: web-ui", "commands", "size: L" ], "merged": false, "number": 69496, "review_comments_count": 2, "state": "closed", "title": "UI: fix scroll lock and task preview", "updated_at": "2026-04-20T23:53:16Z" }, { "additions": 228, "author": "zote", "author_association": "NONE", "body_excerpt": "## Summary - Accept `agents.*.heartbeat.model` as `{ primary, fallbacks }` in addition to the existing string form, mirroring `agents.defaults.model`. Closes #69434. - Heartbeat ticks now fail over to the next fallback on retriable provide\u2026", "changed_files": 17, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69495", "created_at": "2026-04-20T23:33:40Z", "deletions": 23, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69495/files", "html_url": "https://github.com/openclaw/openclaw/pull/69495", "labels": [ "docs", "gateway", "size: M" ], "merged": false, "number": 69495, "review_comments_count": 2, "state": "open", "title": "feat(heartbeat): support model fallbacks via {primary,fallbacks} (#69434)", "updated_at": "2026-04-20T23:37:45Z" }, { "additions": 63, "author": "shad0wca7", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem When `gateway.auth.token` is configured as a SecretRef (e.g., `{source: \"exec\", provider: \"keychain\", id: \"gateway-auth-token\"}`), the macOS desktop app fails to resolve the actual token value. This causes: 1. Desktop app reads\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69494", "created_at": "2026-04-20T23:26:49Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69494/files", "html_url": "https://github.com/openclaw/openclaw/pull/69494", "labels": [ "app: macos", "size: S" ], "merged": false, "number": 69494, "review_comments_count": 4, "state": "open", "title": "fix: resolve SecretRef keychain tokens in desktop app browser proxy", "updated_at": "2026-04-20T23:33:34Z" }, { "additions": 508, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2-5 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69493", "created_at": "2026-04-20T23:23:21Z", "deletions": 67, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69493/files", "html_url": "https://github.com/openclaw/openclaw/pull/69493", "labels": [ "app: web-ui", "commands", "size: L" ], "merged": false, "number": 69493, "review_comments_count": 2, "state": "closed", "title": "UI: harden chat scroll state", "updated_at": "2026-04-20T23:33:42Z" }, { "additions": 40, "author": "adhajar", "author_association": "NONE", "body_excerpt": "## Summary This PR adds the anthropic default beta headers to the bedrock flow to allow openclaw deployed using claude models on bedrock the ability to get tool call streaming - Problem: - Why it matters: Using OC on Bedrock in time sensit\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69491", "created_at": "2026-04-20T23:13:27Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69491/files", "html_url": "https://github.com/openclaw/openclaw/pull/69491", "labels": [ "size: XS" ], "merged": false, "number": 69491, "review_comments_count": 3, "state": "open", "title": "feat(amazon-bedrock): forward default Anthropic betas through the bedrock-converse stream route", "updated_at": "2026-04-20T23:20:09Z" }, { "additions": 11, "author": "Magicray1217", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem\\n\\ngoogle/gemma-4-26b-a4b-it shows 1024k context window in openclaw models list instead of the correct 256k.\\n\\n## Root cause\\n\\nModelRegistry.find() fails to match gemma model IDs, falling through to Google provider's forward-c\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69490", "created_at": "2026-04-20T23:12:06Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69490/files", "html_url": "https://github.com/openclaw/openclaw/pull/69490", "labels": [ "size: XS", "r: too-many-prs" ], "merged": false, "number": 69490, "review_comments_count": 1, "state": "closed", "title": "fix(google): correct model registry lookup for gemma model IDs", "updated_at": "2026-04-20T23:14:14Z" }, { "additions": 4, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem Per the Anthropic skill spec (which the OpenClaw skill router follows), every \\`description\\` field must include both **what** the skill does **and when** to use it (trigger conditions). Without WHEN, routing silently under-sele\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69489", "created_at": "2026-04-20T23:10:33Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69489/files", "html_url": "https://github.com/openclaw/openclaw/pull/69489", "labels": [ "size: XS", "extensions: memory-wiki" ], "merged": false, "number": 69489, "review_comments_count": 2, "state": "open", "title": "fix(skills): add WHEN + trigger phrases to 4 skill descriptions", "updated_at": "2026-04-20T23:12:35Z" }, { "additions": 508, "author": "enis-uys", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2-5 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69488", "created_at": "2026-04-20T23:06:17Z", "deletions": 67, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69488/files", "html_url": "https://github.com/openclaw/openclaw/pull/69488", "labels": [ "app: web-ui", "commands", "size: L" ], "merged": false, "number": 69488, "review_comments_count": 2, "state": "closed", "title": "UI: harden chat scroll state", "updated_at": "2026-04-20T23:22:34Z" }, { "additions": 727, "author": "cholaolu-boop", "author_association": "NONE", "body_excerpt": "## Problem Each call to `rewriteTranscriptEntriesInSessionFile` leaves the pre-rewrite entries as abandoned sibling branches of the new leaf (append-only session semantics: `branch(parent)` + re-append of the entire suffix). openclaw's tra\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69486", "created_at": "2026-04-20T23:04:21Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69486/files", "html_url": "https://github.com/openclaw/openclaw/pull/69486", "labels": [ "agents", "size: L" ], "merged": false, "number": 69486, "review_comments_count": 3, "state": "open", "title": "fix(runner): ancestry-aware cleanup of rewrite-abandoned transcript entries", "updated_at": "2026-04-21T01:44:00Z" }, { "additions": 99, "author": "Magicray1217", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem\\n\\nAfter upgrading to 2026.4.14, existing conversations fail with 'Something went wrong'. Gateway logs show repeated active-memory timeouts on the pre-reply path.\\n\\n## Root cause\\n\\nThe before_prompt_build hook had no top-level\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69485", "created_at": "2026-04-20T23:02:06Z", "deletions": 70, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69485/files", "html_url": "https://github.com/openclaw/openclaw/pull/69485", "labels": [ "size: S" ], "merged": true, "number": 69485, "review_comments_count": 1, "state": "closed", "title": "fix(active-memory): gracefully degrade on timeout instead of failing entire reply", "updated_at": "2026-04-21T03:06:08Z" }, { "additions": 28622, "author": "jesse-merhi", "author_association": "MEMBER", "body_excerpt": "## Summary - add an end-to-end pipeline that turns every published openclaw GitHub Security Advisory into a reusable OpenGrep rule - compile the per-advisory rules into two super-configs (`precise.yml` + `broad.yml`) under `security/opengr\u2026", "changed_files": 18, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69483", "created_at": "2026-04-20T22:53:32Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69483/files", "html_url": "https://github.com/openclaw/openclaw/pull/69483", "labels": [ "scripts", "maintainer", "size: XL" ], "merged": false, "number": 69483, "review_comments_count": 14, "state": "open", "title": "feat(security): add GHSA detector-review pipeline and OpenGrep CI workflows", "updated_at": "2026-04-21T02:06:09Z" }, { "additions": 3, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem \\`openclaw channels status\\` advertised a \\`status --deep\\` tip in two places (\\`status.ts:142\\`, \\`status-config-format.ts:85\\`) and in its own --help description (\\`channels-cli.ts:108\\`), but the nested command only accepts \\\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69481", "created_at": "2026-04-20T22:45:47Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69481/files", "html_url": "https://github.com/openclaw/openclaw/pull/69481", "labels": [ "cli", "commands", "size: XS" ], "merged": false, "number": 69481, "review_comments_count": 0, "state": "open", "title": "fix(channels): disambiguate status --deep tip to top-level openclaw status", "updated_at": "2026-04-20T23:11:00Z" }, { "additions": 3176, "author": "gumadeiras", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: read-only CLI status paths regressed after bundled plugin runtime deps moved into extensions; channel/status/doctor paths could import full plugin runtimes just to inspect Telegram, Slack, or Discord config. - Why it\u2026", "changed_files": 85, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/69479", "created_at": "2026-04-20T22:16:29Z", "deletions": 366, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69479/files", "html_url": "https://github.com/openclaw/openclaw/pull/69479", "labels": [ "docs", "channel: discord", "channel: slack", "channel: telegram", "cli", "commands", "agents", "maintainer", "size: XL", "extensions: minimax" ], "merged": true, "number": 69479, "review_comments_count": 25, "state": "closed", "title": "fix(cli): keep channel status checks off plugin runtimes", "updated_at": "2026-04-21T17:56:50Z" }, { "additions": 51, "author": "scoootscooob", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: latest `origin/main` still defaults the bundled Moonshot provider and related selection surfaces to `kimi-k2.5`, even though Moonshot's current API docs list `kimi-k2.6` as the latest multimodal model. - Why it matter\u2026", "changed_files": 19, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69477", "created_at": "2026-04-20T22:05:35Z", "deletions": 39, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69477/files", "html_url": "https://github.com/openclaw/openclaw/pull/69477", "labels": [ "commands", "agents", "maintainer", "size: S", "extensions: kimi-coding", "extensions: moonshot" ], "merged": true, "number": 69477, "review_comments_count": 0, "state": "closed", "title": "providers: default Moonshot to Kimi 2.6", "updated_at": "2026-04-20T23:21:39Z" }, { "additions": 823, "author": "steipete", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - land the Telegram transport lifecycle/socket cleanup from #68128, with HTTP/1-only undici dispatchers from #69243 - land the getUpdates liveness bookkeeping from #64333 so recoverable errors do not false-trigger stall restarts\u2026", "changed_files": 18, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69476", "created_at": "2026-04-20T22:03:45Z", "deletions": 75, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69476/files", "html_url": "https://github.com/openclaw/openclaw/pull/69476", "labels": [ "docs", "channel: telegram", "gateway", "maintainer", "size: L" ], "merged": true, "number": 69476, "review_comments_count": 1, "state": "closed", "title": "fix(telegram): harden polling transport liveness", "updated_at": "2026-04-20T22:12:14Z" }, { "additions": 48, "author": "Jaswir", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #69358 Fixes #69415 Fixes #69427 `get-reply-run.ts` now checks `baseBodyForPrompt.trim()` (which includes the inbound-context prefix) instead of `baseBodyFinal.trim()` for the empty-turn gate, and falls back to the plain `\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69474", "created_at": "2026-04-20T21:43:30Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69474/files", "html_url": "https://github.com/openclaw/openclaw/pull/69474", "labels": [ "size: S" ], "merged": true, "number": 69474, "review_comments_count": 1, "state": "closed", "title": "fix(gateway): restore webchat pure-image turn handling (#69358)", "updated_at": "2026-04-21T05:05:01Z" }, { "additions": 118, "author": "MrMiaigi", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary This PR adds defensive validation to prevent the pricing cache corruption issue reported in #367, where costs were being reported as 100-1000x higher than expected (e.g., $3120 for 2.3M tokens on gpt-5.4-mini instead of ~$1.73).\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69473", "created_at": "2026-04-20T21:27:58Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69473/files", "html_url": "https://github.com/openclaw/openclaw/pull/69473", "labels": [ "gateway", "size: S" ], "merged": false, "number": 69473, "review_comments_count": 3, "state": "closed", "title": "fix: add pricing sanity checks to prevent cost inflation (#367)", "updated_at": "2026-04-21T10:44:09Z" }, { "additions": 173, "author": "pdd-cli", "author_association": "NONE", "body_excerpt": "## Summary - Suppress messages where the model's reply is a bare reasoning preamble (a word like `think`, `thinking`, `thought`, `reasoning`, or `analysis` on its own line) followed by the `NO_REPLY` sentinel, instead of delivering the cha\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69472", "created_at": "2026-04-20T21:26:00Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69472/files", "html_url": "https://github.com/openclaw/openclaw/pull/69472", "labels": [ "size: S" ], "merged": false, "number": 69472, "review_comments_count": 1, "state": "open", "title": "auto-reply: suppress reasoning-prefaced silent replies", "updated_at": "2026-04-20T21:28:33Z" }, { "additions": 465, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary **Root Cause:** aria refs (ax1, ax2, ...) captured via `browser snapshot refs=aria` were stored with their `backendDOMNodeId` in `RoleRef.roleRefs`, but `refLocator` had no handler for the `ax\\d+` pattern \u2014 it fell through to `p\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69468", "created_at": "2026-04-20T21:16:16Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69468/files", "html_url": "https://github.com/openclaw/openclaw/pull/69468", "labels": [ "gateway", "agents", "size: M", "r: too-many-prs" ], "merged": false, "number": 69468, "review_comments_count": 2, "state": "closed", "title": "fix: make aria ax refs persistent across browser multi-step actions", "updated_at": "2026-04-20T21:22:23Z" }, { "additions": 481, "author": "taitruong", "author_association": "NONE", "body_excerpt": "## Summary - `ModelDefinitionSchema` now accepts an optional `params: Record` field (previously rejected as unknown key under `.strict()`). - Added `params` to `ProviderRuntimeModel` type. - New `mergeConfiguredModelParams\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69464", "created_at": "2026-04-20T21:07:06Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69464/files", "html_url": "https://github.com/openclaw/openclaw/pull/69464", "labels": [ "docs", "agents", "size: M" ], "merged": false, "number": 69464, "review_comments_count": 8, "state": "open", "title": "fix(ollama): honor params.num_ctx on configured models (#44550)", "updated_at": "2026-04-20T22:09:56Z" }, { "additions": 322, "author": "hgezim", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: - Problem: Users need to correlate individual runs and group related requests/subagents in external dashboards (e.g., Helicone.ai, DodoRouter.com). - Why it matters: Easier tracing on\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69463", "created_at": "2026-04-20T21:05:45Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69463/files", "html_url": "https://github.com/openclaw/openclaw/pull/69463", "labels": [ "agents", "size: M" ], "merged": false, "number": 69463, "review_comments_count": 2, "state": "open", "title": "feat(observability): add configurable session tracing headers for LLM requests", "updated_at": "2026-04-20T22:08:22Z" }, { "additions": 142, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "Fix #69289: Browser aria refs fail in multi-step actions", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69461", "created_at": "2026-04-20T20:59:59Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69461/files", "html_url": "https://github.com/openclaw/openclaw/pull/69461", "labels": [ "gateway", "agents", "size: S", "r: too-many-prs" ], "merged": false, "number": 69461, "review_comments_count": 1, "state": "closed", "title": "fix #69289: Browser aria refs fail in multi-step actions", "updated_at": "2026-04-20T21:06:25Z" }, { "additions": 104, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "Fix #69294: ACP plugin probe fails on Windows 11 causing gateway crash", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69459", "created_at": "2026-04-20T20:56:55Z", "deletions": 20, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69459/files", "html_url": "https://github.com/openclaw/openclaw/pull/69459", "labels": [ "extensions: memory-core", "agents", "size: S", "extensions: acpx", "r: too-many-prs", "extensions: lmstudio" ], "merged": false, "number": 69459, "review_comments_count": 1, "state": "closed", "title": "fix #69294: ACP plugin probe fails on Windows 11 causing gateway crash", "updated_at": "2026-04-20T21:06:26Z" }, { "additions": 581, "author": "rzyns", "author_association": "NONE", "body_excerpt": "## Summary - Hoist `activeMemoryCapability` out of the scope-swapped `memoryPluginState` so a plugin scope that does not include the memory plugin no longer wipes the capability globally \u2014 fixes the memory-wiki bridge seeing `capabilityPlu\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69458", "created_at": "2026-04-20T20:56:51Z", "deletions": 47, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69458/files", "html_url": "https://github.com/openclaw/openclaw/pull/69458", "labels": [ "gateway", "agents", "size: L", "extensions: memory-wiki" ], "merged": false, "number": 69458, "review_comments_count": 5, "state": "open", "title": "fix(memory): keep active memory capability visible across plugin scopes", "updated_at": "2026-04-21T13:57:12Z" }, { "additions": 104, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary When the ACP plugin probe runs on Windows 11, the embedded ACP agent subprocess can crash (e.g. exit=3221225783 = STATUS_ACCESS_VIOLATION). This propagates as an unhandled promise rejection. Since calls on unhandled rejections,\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69457", "created_at": "2026-04-20T20:56:40Z", "deletions": 20, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69457/files", "html_url": "https://github.com/openclaw/openclaw/pull/69457", "labels": [ "extensions: memory-core", "agents", "size: S", "extensions: acpx", "r: too-many-prs", "extensions: lmstudio" ], "merged": false, "number": 69457, "review_comments_count": 1, "state": "closed", "title": "fix #69294: ACP plugin probe fails on Windows 11 causing gateway crash", "updated_at": "2026-04-20T21:03:55Z" }, { "additions": 316, "author": "samgibson-bot", "author_association": "NONE", "body_excerpt": "feat(cron): add bash-kind payload for zero-LLM cron execution Introduce a third CronPayload variant `{ kind: \"bash\", command, ... }` that runs the configured shell command directly via /bin/bash -c, captures stdout, and routes it through t\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69455", "created_at": "2026-04-20T20:41:53Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69455/files", "html_url": "https://github.com/openclaw/openclaw/pull/69455", "labels": [ "app: web-ui", "gateway", "size: M" ], "merged": false, "number": 69455, "review_comments_count": 6, "state": "closed", "title": "feat(cron): add bash-kind payload for zero-LLM cron execution", "updated_at": "2026-04-20T21:30:15Z" }, { "additions": 198, "author": "cmaldonado80", "author_association": "NONE", "body_excerpt": "## Summary This PR packages the local Control UI slowness fixes that materially reduced gateway churn during investigation, plus one small server-side hardening for stale bundle rollouts. ### Included fixes - bound chat/session refresh to\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69454", "created_at": "2026-04-20T20:41:32Z", "deletions": 23, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69454/files", "html_url": "https://github.com/openclaw/openclaw/pull/69454", "labels": [ "app: web-ui", "gateway", "size: M" ], "merged": false, "number": 69454, "review_comments_count": 1, "state": "open", "title": "Control UI: reduce unnecessary gateway churn and prevent stale index caching", "updated_at": "2026-04-20T20:46:23Z" }, { "additions": 43, "author": "patl4588", "author_association": "NONE", "body_excerpt": "\u2026example) OpenClaw's provider system already supports custom baseUrl overrides for any provider, but it isn't documented for the anthropic provider specifically. This PR adds a small recipe to docs/concepts/model-providers.md showing how t\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69452", "created_at": "2026-04-20T20:25:29Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69452/files", "html_url": "https://github.com/openclaw/openclaw/pull/69452", "labels": [ "docs", "size: XS" ], "merged": false, "number": 69452, "review_comments_count": 3, "state": "open", "title": "docs(providers): document Anthropic-compatible proxy config (aiusage example)", "updated_at": "2026-04-20T20:28:51Z" }, { "additions": 1111, "author": "100yenadmin", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary This PR carves the GPT-5 and prompt-layer foundation out of the original plan-mode umbrella PR. It exists to land the model-facing groundwork first: prompt overlay behavior, agent scope, context-file injection scanning, and syst\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69449", "created_at": "2026-04-20T20:03:33Z", "deletions": 15, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69449/files", "html_url": "https://github.com/openclaw/openclaw/pull/69449", "labels": [ "agents", "size: XL", "extensions: openai" ], "merged": false, "number": 69449, "review_comments_count": 0, "state": "open", "title": "[Plan Mode 1/9] GPT-5 prompt foundation", "updated_at": "2026-04-20T20:05:30Z" }, { "additions": 612, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - fix Discord reply-stage `requireMention` resolution for guild/channel overrides when the channel plugin runtime is unavailable - preserve `channels.discord.guilds..channels..requireMention: false` instead of fa\u2026", "changed_files": 14, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69446", "created_at": "2026-04-20T19:54:38Z", "deletions": 35, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69446/files", "html_url": "https://github.com/openclaw/openclaw/pull/69446", "labels": [ "app: web-ui", "gateway", "agents", "size: L", "r: too-many-prs" ], "merged": false, "number": 69446, "review_comments_count": 3, "state": "closed", "title": "fix: honor requireMention false in Discord guild channels", "updated_at": "2026-04-20T20:00:03Z" }, { "additions": 393, "author": "sallyom", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Reasoning-capable image models can return only signed reasoning blocks and no final text, causing the image tool to fail instead of retrying for a user-visible text description. This PR adds: - retry once with reasoning disabled\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69444", "created_at": "2026-04-20T19:48:57Z", "deletions": 14, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69444/files", "html_url": "https://github.com/openclaw/openclaw/pull/69444", "labels": [ "agents", "maintainer", "size: M" ], "merged": true, "number": 69444, "review_comments_count": 14, "state": "closed", "title": "fix: handle reasoning-only image responses", "updated_at": "2026-04-21T04:20:23Z" }, { "additions": 58, "author": "sk7n4k3d", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Partial fix for #69396. The config writer does an atomic temp-file + `rename` into `configPath`, which **replaces the symlink with a regular file** on every config touch \u2014 `openclaw update`, `meta.lastTouchedAt` bump on restart,\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69438", "created_at": "2026-04-20T19:00:41Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69438/files", "html_url": "https://github.com/openclaw/openclaw/pull/69438", "labels": [ "size: S", "r: too-many-prs" ], "merged": false, "number": 69438, "review_comments_count": 1, "state": "closed", "title": "fix(config/io): preserve symlinked config by writing through realpath", "updated_at": "2026-04-21T10:17:16Z" }, { "additions": 185, "author": "sk7n4k3d", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #69390. On 2026.4.15, slow local Ollama runs still failed at ~5 minutes with `Headers Timeout Error` even after increasing OpenClaw timeouts. The Ollama chat stream path routes through `fetchWithSsrFGuard`, which builds **\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69433", "created_at": "2026-04-20T18:43:42Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69433/files", "html_url": "https://github.com/openclaw/openclaw/pull/69433", "labels": [ "size: S", "r: too-many-prs" ], "merged": false, "number": 69433, "review_comments_count": 0, "state": "closed", "title": "fix(infra/net): propagate global stream timeout onto pinned http/1.1 dispatchers", "updated_at": "2026-04-21T13:32:37Z" }, { "additions": 508, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - guard Anthropic tool conversion when a plugin tool omits `parameters` - accept `inputSchema` as a fallback alias during Anthropic payload building - add regression tests covering both the alias path and a fully malformed tool\u2026", "changed_files": 12, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69432", "created_at": "2026-04-20T18:41:35Z", "deletions": 35, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69432/files", "html_url": "https://github.com/openclaw/openclaw/pull/69432", "labels": [ "app: web-ui", "gateway", "agents", "size: L", "r: too-many-prs" ], "merged": false, "number": 69432, "review_comments_count": 3, "state": "closed", "title": "fix: guard Anthropic tool schema conversion against malformed plugin schemas", "updated_at": "2026-04-20T18:46:24Z" }, { "additions": 164, "author": "SARAMALI15792", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** Internal tools (node-host cron scheduler, TUI, gateway-client backend) connecting from loopback with valid shared-secret auth are classified as `remote` by `resolvePairingLocality()`, causing `close(1008, \"pairing\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/69431", "created_at": "2026-04-20T18:41:05Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69431/files", "html_url": "https://github.com/openclaw/openclaw/pull/69431", "labels": [ "gateway", "size: S" ], "merged": true, "number": 69431, "review_comments_count": 1, "state": "closed", "title": "fix(gateway): classify loopback shared-secret clients as local for pairing", "updated_at": "2026-04-21T03:06:08Z" }, { "additions": 534, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #69414. ## What was broken `openclaw models auth login --provider openai-codex` had two bad side effects: 1. A fresh ChatGPT OAuth login was persisted under `openai-codex:` instead of updating the canonical `openai-\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69430", "created_at": "2026-04-20T18:37:54Z", "deletions": 51, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69430/files", "html_url": "https://github.com/openclaw/openclaw/pull/69430", "labels": [ "app: web-ui", "gateway", "commands", "agents", "size: L", "r: too-many-prs", "extensions: openai" ], "merged": false, "number": 69430, "review_comments_count": 0, "state": "closed", "title": "fix: preserve Codex default auth profile on OAuth login", "updated_at": "2026-04-21T09:30:22Z" }, { "additions": 174, "author": "MonkeyLeeT", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - validate Slack `replyToId` values before treating them as `thread_ts` - fall back to the known `threadId` anchor when `replyToId` is an internal OpenClaw message id - add regression coverage for the send path plus Slack thread\u2026", "changed_files": 5, "cluster_id": "cluster-69429-2", "cluster_ids": [ "cluster-69429-2" ], "cluster_role": "canonical", "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69429", "created_at": "2026-04-20T18:35:53Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69429/files", "html_url": "https://github.com/openclaw/openclaw/pull/69429", "labels": [ "channel: slack", "size: S" ], "merged": false, "number": 69429, "review_comments_count": 0, "state": "open", "title": "fix(slack): preserve thread anchors over internal reply ids", "updated_at": "2026-04-21T16:25:03Z" }, { "additions": 90, "author": "hkalkoti1", "author_association": "NONE", "body_excerpt": "Title: fix(msteams): paginate thread replies and keep recent context ## Summary - Problem: Teams thread context enrichment only used the first Graph replies page, so long threads could skew toward the oldest replies. - Why it matters: the\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69428", "created_at": "2026-04-20T18:35:24Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69428/files", "html_url": "https://github.com/openclaw/openclaw/pull/69428", "labels": [ "channel: msteams", "size: S" ], "merged": false, "number": 69428, "review_comments_count": 4, "state": "open", "title": "fix(msteams): paginate thread replies and keep recent context", "updated_at": "2026-04-20T20:11:24Z" }, { "additions": 63, "author": "sk7n4k3d", "author_association": "NONE", "body_excerpt": "Fixes #69353. ### Summary `isAnthropic1MModel` in `src/agents/context.ts` gates the 1M context window on `provider === \"anthropic\"`, so `context1m: true` was a silent no-op for any provider proxying Claude Opus 4 / Sonnet 4 \u2014 notably the b\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69426", "created_at": "2026-04-20T18:28:06Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69426/files", "html_url": "https://github.com/openclaw/openclaw/pull/69426", "labels": [ "agents", "size: S" ], "merged": false, "number": 69426, "review_comments_count": 0, "state": "open", "title": "agents/context: unlock context1m on proxied Anthropic 1M-capable models (#69353)", "updated_at": "2026-04-20T19:21:10Z" }, { "additions": 109, "author": "sk7n4k3d", "author_association": "NONE", "body_excerpt": "Fixes #69400. ### Summary Teach `resolveCliProgramArguments` (the helper that builds macOS LaunchAgent / systemd `ProgramArguments` for `openclaw gateway` and `openclaw node run` services) to honor an `OPENCLAW_WRAPPER` environment variabl\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69425", "created_at": "2026-04-20T18:22:32Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69425/files", "html_url": "https://github.com/openclaw/openclaw/pull/69425", "labels": [ "gateway", "size: S" ], "merged": false, "number": 69425, "review_comments_count": 2, "state": "open", "title": "daemon: honor OPENCLAW_WRAPPER in LaunchAgent ProgramArguments (#69400)", "updated_at": "2026-04-20T19:21:24Z" }, { "additions": 118, "author": "sk7n4k3d", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69412. When `openclaw update` runs on a package install and the running version already matches the resolved channel target, the command short-circuits before invoking the global package manager. Without this guard, `npm\u2026", "changed_files": 3, "cluster_id": "cluster-69412-3", "cluster_ids": [ "cluster-69412-3" ], "cluster_role": "member", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69421", "created_at": "2026-04-20T18:12:44Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69421/files", "html_url": "https://github.com/openclaw/openclaw/pull/69421", "labels": [ "cli", "size: S" ], "merged": false, "number": 69421, "review_comments_count": 2, "state": "open", "title": "update: skip package install when already on target version (#69412)", "updated_at": "2026-04-20T19:21:39Z" }, { "additions": 409, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - treat localhost shared-auth CLI-mode clients as `cli_container_local` even when their client id is not the public `cli` id - preserve the existing loopback/private-host/proxy/origin/shared-auth gates so only local internal too\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69420", "created_at": "2026-04-20T18:02:53Z", "deletions": 30, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69420/files", "html_url": "https://github.com/openclaw/openclaw/pull/69420", "labels": [ "app: web-ui", "gateway", "agents", "size: M", "r: too-many-prs" ], "merged": false, "number": 69420, "review_comments_count": 3, "state": "closed", "title": "fix: treat localhost internal CLI-mode tools as local", "updated_at": "2026-04-20T18:08:46Z" }, { "additions": 130, "author": "sk7n4k3d", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #69301. ## Summary `/new` and `/reset` in channel-bound auto-reply sessions (Telegram DM, group chats, etc.) currently carry over **every** persisted override \u2014 including auto-created ones from runtime fallbacks (rate-limit auth rota\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69419", "created_at": "2026-04-20T17:59:39Z", "deletions": 47, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69419/files", "html_url": "https://github.com/openclaw/openclaw/pull/69419", "labels": [ "gateway", "size: S" ], "merged": true, "number": 69419, "review_comments_count": 0, "state": "closed", "title": "session: clear auto-sourced model/auth overrides on /new and /reset", "updated_at": "2026-04-21T02:36:34Z" }, { "additions": 1597, "author": "fgabelmannjr", "author_association": "NONE", "body_excerpt": "## Summary This PR adds SecretRef support to core MCP server configuration so `mcp.servers.*.env.*` and `mcp.servers.*.headers.*` can use SecretInput values in addition to plaintext literals. Before this change, core `mcp.servers` only acc\u2026", "changed_files": 26, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69417", "created_at": "2026-04-20T17:56:11Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69417/files", "html_url": "https://github.com/openclaw/openclaw/pull/69417", "labels": [ "docs", "cli", "commands", "agents", "size: XL" ], "merged": false, "number": 69417, "review_comments_count": 10, "state": "open", "title": "fix(mcp): allow SecretRef values in mcp.servers env and headers [AI-assisted]", "updated_at": "2026-04-20T19:14:19Z" }, { "additions": 386, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #69396. `config.write` had two related problems around config persistence: 1. atomic temp-write + rename targeted the symlink path itself, so writing `~/.openclaw/openclaw.json` replaced a user-managed symlink with a regul\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69416", "created_at": "2026-04-20T17:53:41Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69416/files", "html_url": "https://github.com/openclaw/openclaw/pull/69416", "labels": [ "app: web-ui", "agents", "size: M", "r: too-many-prs" ], "merged": false, "number": 69416, "review_comments_count": 3, "state": "closed", "title": "fix: preserve symlinked config writes", "updated_at": "2026-04-20T18:00:11Z" }, { "additions": 204, "author": "danicuki", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** Signal renders native @mentions as `@` or `@` after hydrating `\\uFFFC` placeholders, but the mention-gating regex patterns are derived from the agent's display name (e.g. `\\b@?caio\\b`). These never ma\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69413", "created_at": "2026-04-20T17:42:06Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69413/files", "html_url": "https://github.com/openclaw/openclaw/pull/69413", "labels": [ "channel: signal", "size: M" ], "merged": false, "number": 69413, "review_comments_count": 2, "state": "open", "title": "signal: detect bot mentions from native envelope metadata", "updated_at": "2026-04-20T20:49:32Z" }, { "additions": 116, "author": "sk7n4k3d", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69272. `buildOpenAICompletionsParams` never emitted `prompt_cache_key` on the Completions path, so operators running OpenAI-compatible proxies (vLLM, SGLang, Chutes, etc.) could not opt into stable prompt caching per sess\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69411", "created_at": "2026-04-20T17:30:26Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69411/files", "html_url": "https://github.com/openclaw/openclaw/pull/69411", "labels": [ "agents", "size: S" ], "merged": false, "number": 69411, "review_comments_count": 0, "state": "open", "title": "agents: forward prompt_cache_key on openai-completions when compat.supportsPromptCacheKey is set", "updated_at": "2026-04-20T17:32:57Z" }, { "additions": 161, "author": "bobrenze-bot", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** `DEFAULT_SESSION_MAINTENANCE_MODE` was `\"warn\"`, so the built-in entry cap (500) and age prune (30 days) were silently skipped on every default install. Sessions accumulated without bound \u2014 production instances re\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69404", "created_at": "2026-04-20T17:22:44Z", "deletions": 58, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69404/files", "html_url": "https://github.com/openclaw/openclaw/pull/69404", "labels": [ "gateway", "commands", "size: M" ], "merged": true, "number": 69404, "review_comments_count": 1, "state": "closed", "title": "fix(sessions): enforce maintenance by default and prune on load to prevent gateway OOM", "updated_at": "2026-04-21T03:06:08Z" }, { "additions": 189, "author": "MrMiaigi", "author_association": "CONTRIBUTOR", "body_excerpt": "The bug: three persist sites accumulated cost instead of snapshotting it like tokens. This caused cost to be inflated 1x-72x on multi-persist sessions because the same cumulative usage was added repeatedly. Root cause: persistSessionUsageU\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69403", "created_at": "2026-04-20T17:22:25Z", "deletions": 33, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69403/files", "html_url": "https://github.com/openclaw/openclaw/pull/69403", "labels": [ "agents", "size: M" ], "merged": true, "number": 69403, "review_comments_count": 1, "state": "closed", "title": "fix(cost): snapshot estimatedCostUsd instead of accumulating (#69347)", "updated_at": "2026-04-21T02:44:38Z" }, { "additions": 7, "author": "Tsenghan", "author_association": "NONE", "body_excerpt": "## Problem In the webchat Control UI, locally generated images (e.g. from the image generation tool) fail to display with the error **\"Attachment unavailable\"**, even though the files exist in allowed directories. ## Root Cause The gateway\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69402", "created_at": "2026-04-20T17:15:31Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69402/files", "html_url": "https://github.com/openclaw/openclaw/pull/69402", "labels": [ "app: web-ui", "size: XS" ], "merged": false, "number": 69402, "review_comments_count": 1, "state": "open", "title": "fix: sync auth token to state after gateway hello for media preview URLs", "updated_at": "2026-04-20T17:20:20Z" }, { "additions": 207, "author": "PrinceOfEgypt", "author_association": "NONE", "body_excerpt": "Fixes #67197 ## Summary AI-assisted PR. This adds an opt-in config to surface the existing one-line model fallback notices even when verbose mode is off. New config: - `agents.defaults.notifyOnModelFallback: true` When enabled, the first a\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69399", "created_at": "2026-04-20T16:57:53Z", "deletions": 49, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69399/files", "html_url": "https://github.com/openclaw/openclaw/pull/69399", "labels": [ "docs", "size: M" ], "merged": false, "number": 69399, "review_comments_count": 0, "state": "open", "title": "feat: add opt-in fallback notices outside verbose mode", "updated_at": "2026-04-20T17:18:12Z" }, { "additions": 909, "author": "janetnoodle", "author_association": "NONE", "body_excerpt": "Fixes #65964 ## What changed - save generated TTS audio under managed OpenClaw media instead of ephemeral `/tmp/openclaw/...` paths - thread `mediaUrl` through TTS results so reply/delivery paths use the managed artifact location - add reg\u2026", "changed_files": 15, "cluster_id": "cluster-63896-7", "cluster_ids": [ "cluster-63896-7" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69395", "created_at": "2026-04-20T16:28:25Z", "deletions": 23, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69395/files", "html_url": "https://github.com/openclaw/openclaw/pull/69395", "labels": [ "gateway", "agents", "size: L" ], "merged": false, "number": 69395, "review_comments_count": 7, "state": "open", "title": "Fix TTS media paths by saving audio under managed media", "updated_at": "2026-04-21T06:40:29Z" }, { "additions": 18, "author": "silas-dandelion-cult", "author_association": "NONE", "body_excerpt": "Fixes #66701 ## Summary `normalizeReplyPayload` in `src/auto-reply/reply/normalize-reply.ts` leaks chain-of-thought / internal reasoning to channel when the assistant body ends with a trailing `NO_REPLY` token. ## Repro Assistant response\u2026", "changed_files": 2, "cluster_id": "cluster-66701-3", "cluster_ids": [ "cluster-66701-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69394", "created_at": "2026-04-20T16:27:17Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69394/files", "html_url": "https://github.com/openclaw/openclaw/pull/69394", "labels": [ "size: XS" ], "merged": false, "number": 69394, "review_comments_count": 2, "state": "open", "title": "fix(auto-reply): suppress entire payload when trailing NO_REPLY token present", "updated_at": "2026-04-20T17:56:11Z" }, { "additions": 573, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## What `usageTotals` in `pi-embedded-subscribe.ts` was never reset after compaction. While `clearStaleAssistantUsageOnSessionMessages` zeros out per-message usage, the `usageTotals` accumulator kept the pre-compaction `total` value. ## Wh\u2026", "changed_files": 22, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69393", "created_at": "2026-04-20T16:26:33Z", "deletions": 42, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69393/files", "html_url": "https://github.com/openclaw/openclaw/pull/69393", "labels": [ "app: web-ui", "gateway", "cli", "agents", "channel: feishu", "size: L", "r: too-many-prs" ], "merged": false, "number": 69393, "review_comments_count": 1, "state": "closed", "title": "fix: reset totalTokens after compaction", "updated_at": "2026-04-20T16:33:57Z" }, { "additions": 37, "author": "jinbowang1", "author_association": "NONE", "body_excerpt": "## What this does Adds a short \"Recovering from a destructive spawn\" section to `skills/coding-agent/SKILL.md`, right before the `Learnings (Jan 2026)` appendix. The skill today tells users to run agents with `bypassPermissions` (Claude Co\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69391", "created_at": "2026-04-20T16:18:24Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69391/files", "html_url": "https://github.com/openclaw/openclaw/pull/69391", "labels": [ "size: XS" ], "merged": false, "number": 69391, "review_comments_count": 2, "state": "open", "title": "docs(coding-agent): add \"recovering from a destructive spawn\" note", "updated_at": "2026-04-20T16:26:36Z" }, { "additions": 35, "author": "shahyashish", "author_association": "NONE", "body_excerpt": "The issue was that `coerceImageAssistantText` only extracted content from text blocks. For vision models with reasoning enabled, the actual response text often resides in 'thinking' blocks (mapped from `reasoning_content`) while the standa\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69389", "created_at": "2026-04-20T16:09:45Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69389/files", "html_url": "https://github.com/openclaw/openclaw/pull/69389", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69389, "review_comments_count": 4, "state": "closed", "title": "Fix: Image tool fails with reasoning-capable vision models that return empty content", "updated_at": "2026-04-20T20:38:38Z" }, { "additions": 16, "author": "shahyashish", "author_association": "NONE", "body_excerpt": "The issue was caused by the agent runtime proceeding with a final answer based on a stale message snapshot after long-latency tool turns (like 'exec' or 'process poll'). Even if a new user message arrived during the tool's execution, the o\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69388", "created_at": "2026-04-20T16:08:01Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69388/files", "html_url": "https://github.com/openclaw/openclaw/pull/69388", "labels": [ "size: XS" ], "merged": false, "number": 69388, "review_comments_count": 5, "state": "open", "title": "Fix: [Bug]: Assistant can answer a previous user question after a long multi-tool turn", "updated_at": "2026-04-20T16:10:49Z" }, { "additions": 90, "author": "shahyashish", "author_association": "NONE", "body_excerpt": "To resolve the issue of the agent ignoring stop commands and entering an infinite retry loop during execution denials, I implemented a 'consecutive denial protection' mechanism in `runTaskInFlow`. This fix addresses the critical loop by: 1\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69387", "created_at": "2026-04-20T16:06:38Z", "deletions": 83, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69387/files", "html_url": "https://github.com/openclaw/openclaw/pull/69387", "labels": [ "size: S" ], "merged": false, "number": 69387, "review_comments_count": 3, "state": "open", "title": "Fix: CRITICAL: Agent ignores stop commands during exec denial - infinite retry loop, delayed command flood, and queue overflow", "updated_at": "2026-04-20T18:06:54Z" }, { "additions": 1959, "author": "nathandrewes", "author_association": "NONE", "body_excerpt": "## Summary Adds a new bundled extension `@openclaw/aj-router` that routes each model request through a classifier + sensitivity gate + alias map to pick the cheapest provider/model that can handle the prompt. Disabled by default. - `before\u2026", "changed_files": 22, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69385", "created_at": "2026-04-20T16:00:29Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69385/files", "html_url": "https://github.com/openclaw/openclaw/pull/69385", "labels": [ "docs", "size: XL" ], "merged": false, "number": 69385, "review_comments_count": 8, "state": "open", "title": "Extensions: add aj-router plugin for classifier-driven model selection", "updated_at": "2026-04-20T16:06:33Z" }, { "additions": 996, "author": "pgondhi987", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** ACP child sessions (`agent:{id}:acp:{uuid}`) were not recognized as subagent-envelope sessions by `isSubagentSessionKey`, so subagent tool policy, spawn-depth caps, per-parent child caps, and the `subagents.allowA\u2026", "changed_files": 18, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 11, "conversation_url": "https://github.com/openclaw/openclaw/pull/69383", "created_at": "2026-04-20T15:58:50Z", "deletions": 29, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69383/files", "html_url": "https://github.com/openclaw/openclaw/pull/69383", "labels": [ "gateway", "cli", "agents", "maintainer", "size: XL" ], "merged": true, "number": 69383, "review_comments_count": 18, "state": "closed", "title": "fix(agents): enforce subagent envelope inheritance on ACP child sessions [AI-assisted]", "updated_at": "2026-04-21T16:52:19Z" }, { "additions": 33, "author": "shahyashish", "author_association": "NONE", "body_excerpt": "Added the missing `coerceImageAssistantText` function to `src/agents/minimax-vlm.ts` and updated it to include a fallback to `extractAssistantThinking()` when the assistant's text content is empty. This ensures that reasoning-capable visio\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69382", "created_at": "2026-04-20T15:58:48Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69382/files", "html_url": "https://github.com/openclaw/openclaw/pull/69382", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69382, "review_comments_count": 4, "state": "closed", "title": "Fix: Image tool fails with reasoning-capable vision models that return empty content", "updated_at": "2026-04-20T20:38:21Z" }, { "additions": 588, "author": "pgondhi987", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** Hook mappings that use `{{\u2026}}` template expressions in their `sessionKey` (e.g. the built-in `gmail` preset with `sessionKey: \\\"hook:gmail:{{messages[0].id}}\\\"`) render attacker-controlled webhook payload values i\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/69381", "created_at": "2026-04-20T15:54:59Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69381/files", "html_url": "https://github.com/openclaw/openclaw/pull/69381", "labels": [ "docs", "gateway", "maintainer", "size: L" ], "merged": true, "number": 69381, "review_comments_count": 14, "state": "closed", "title": "fix(gateway): enforce allowRequestSessionKey gate on template-rendered mapping sessionKeys", "updated_at": "2026-04-21T04:42:22Z" }, { "additions": 227, "author": "chrispatil", "author_association": "NONE", "body_excerpt": "## Summary The preflight-compaction and memory-flush gates computed their threshold from `reserveTokensFloor` alone, silently ignoring `agents.defaults.compaction.reserveTokens` when it was set above the floor. After this fix, the effectiv\u2026", "changed_files": 6, "cluster_id": "cluster-66830-3", "cluster_ids": [ "cluster-66830-3" ], "cluster_role": "canonical", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69379", "created_at": "2026-04-20T15:41:43Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69379/files", "html_url": "https://github.com/openclaw/openclaw/pull/69379", "labels": [ "agents", "size: M" ], "merged": false, "number": 69379, "review_comments_count": 2, "state": "open", "title": "fix(compaction): preflight/memoryFlush gates respect reserveTokens above floor", "updated_at": "2026-04-20T23:25:13Z" }, { "additions": 943, "author": "eleqtrizit", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Rejects HEIF-family tool image payloads before tool-result sanitization reaches native image decoding - Bounds the ISO BMFF brand scan to the declared `ftyp` box size ## Changes - Added a lightweight HEIF/AVIF brand check in `\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/69378", "created_at": "2026-04-20T15:38:47Z", "deletions": 24, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69378/files", "html_url": "https://github.com/openclaw/openclaw/pull/69378", "labels": [ "agents", "maintainer", "size: L" ], "merged": false, "number": 69378, "review_comments_count": 12, "state": "closed", "title": "Guard unsupported tool image formats before resize", "updated_at": "2026-04-20T19:45:03Z" }, { "additions": 751, "author": "eleqtrizit", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Tighten the `gateway` tool config-mutation preflight so agent-driven `config.patch` and `config.apply` calls cannot rewrite operator-trusted config subtrees. - Cover id-keyed `agents.list[]` entries so merge-patch updates cann\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/69377", "created_at": "2026-04-20T15:37:50Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69377/files", "html_url": "https://github.com/openclaw/openclaw/pull/69377", "labels": [ "agents", "maintainer", "size: L" ], "merged": true, "number": 69377, "review_comments_count": 9, "state": "closed", "title": "fix(gateway): tighten gateway config mutation guard", "updated_at": "2026-04-20T19:28:07Z" }, { "additions": 8, "author": "eleqtrizit", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - reserve the `OPENCLAW_*` namespace for trusted shell and global runtime env input - fail closed for new workspace `.env` runtime-control keys instead of relying on per-key denylist updates ## Changes - add an `OPENCLAW_` works\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69376", "created_at": "2026-04-20T15:37:39Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69376/files", "html_url": "https://github.com/openclaw/openclaw/pull/69376", "labels": [ "maintainer", "size: XS" ], "merged": true, "number": 69376, "review_comments_count": 0, "state": "closed", "title": "fix(dotenv): reserve workspace OPENCLAW env namespace", "updated_at": "2026-04-20T18:43:31Z" }, { "additions": 528, "author": "eleqtrizit", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - limit paired-device pairing visibility and approvals to the caller device for non-admin device sessions - preserve the existing global pairing behavior for admin and non-device operator sessions ## Changes - scope `device.pair\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/69375", "created_at": "2026-04-20T15:36:31Z", "deletions": 19, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69375/files", "html_url": "https://github.com/openclaw/openclaw/pull/69375", "labels": [ "gateway", "maintainer", "size: L" ], "merged": true, "number": 69375, "review_comments_count": 1, "state": "closed", "title": "Limit paired-device pairing actions to the caller device", "updated_at": "2026-04-20T18:50:40Z" }, { "additions": 381, "author": "eleqtrizit", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - require read-capable operator scopes for chat-class gateway websocket broadcasts - keep pairing-scoped and node-role connections from passively receiving session chat event frames ## Changes - classify `chat`, `agent`, and `ch\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/69373", "created_at": "2026-04-20T15:36:03Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69373/files", "html_url": "https://github.com/openclaw/openclaw/pull/69373", "labels": [ "gateway", "maintainer", "size: M" ], "merged": true, "number": 69373, "review_comments_count": 5, "state": "closed", "title": "fix(gateway): require read scope for chat websocket broadcasts", "updated_at": "2026-04-20T21:24:34Z" }, { "additions": 249, "author": "azaricstefan", "author_association": "NONE", "body_excerpt": "## Summary - fail closed for protected canvas/a2ui iframe URLs when a scoped canvas capability host is unavailable - refresh `hello.canvasHostUrl` before the 10-minute capability TTL expires by reconnecting the Control UI websocket shortly\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69372", "created_at": "2026-04-20T15:34:44Z", "deletions": 35, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69372/files", "html_url": "https://github.com/openclaw/openclaw/pull/69372", "labels": [ "app: web-ui", "size: M" ], "merged": false, "number": 69372, "review_comments_count": 2, "state": "open", "title": "fix: refresh control-ui canvas capabilities", "updated_at": "2026-04-20T15:40:33Z" }, { "additions": 102, "author": "PratikRai0101", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: Ollama provider fails to initialize in implicit discovery mode because required fields (`baseUrl`, `models`) are missing during config validation. - Why it matters: Validation fails before discovery runs, so local mod\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69370", "created_at": "2026-04-20T15:25:09Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69370/files", "html_url": "https://github.com/openclaw/openclaw/pull/69370", "labels": [ "size: S" ], "merged": true, "number": 69370, "review_comments_count": 4, "state": "closed", "title": "fix(ollama): inject default baseUrl and models during normalization to unblock implicit discovery #69085", "updated_at": "2026-04-21T03:06:08Z" }, { "additions": 235, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #69360. ## Problem Isolated cron `agentTurn` runs could finish successfully but still be marked as `Agent couldn't generate a response`. In the failing runs, the model stopped normally and `finalAssistantVisibleText` was p\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69367", "created_at": "2026-04-20T15:06:20Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69367/files", "html_url": "https://github.com/openclaw/openclaw/pull/69367", "labels": [ "app: web-ui", "agents", "size: M", "r: too-many-prs" ], "merged": false, "number": 69367, "review_comments_count": 3, "state": "closed", "title": "fix: keep isolated cron agentTurn runs from dropping visible answers", "updated_at": "2026-04-20T15:11:16Z" }, { "additions": 258, "author": "srinivaspavan9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** When an async exec command completes, the Control UI rendered two internal runtime messages as visible chat bubbles: (1) a fake \"You\" bubble containing `System (untrusted): [...] Exec completed...` and (2) a pure\u2026", "changed_files": 5, "cluster_id": "cluster-52463-7", "cluster_ids": [ "cluster-52463-7" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69366", "created_at": "2026-04-20T14:55:30Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69366/files", "html_url": "https://github.com/openclaw/openclaw/pull/69366", "labels": [ "app: web-ui", "size: M" ], "merged": false, "number": 69366, "review_comments_count": 3, "state": "open", "title": "fix(ui): hide async exec system events and heartbeat acks from chat transcript", "updated_at": "2026-04-20T15:02:16Z" }, { "additions": 236, "author": "Chevron7Locked", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** When `runWithModelFallback` falls back to a secondary provider it writes `providerOverride`/`modelOverride`/`modelOverrideSource:\"auto\"` to the session. On subsequent turns `createModelSelectionState` re-applies t\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69365", "created_at": "2026-04-20T14:46:53Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69365/files", "html_url": "https://github.com/openclaw/openclaw/pull/69365", "labels": [ "size: M" ], "merged": true, "number": 69365, "review_comments_count": 8, "state": "closed", "title": "fix(model-selection): clear auto-failover overrides so primary is retried on each turn", "updated_at": "2026-04-21T03:06:08Z" }, { "additions": 154, "author": "kylejfrost", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** `parseCliJsonl()` stores the transient `SessionStart:resume` hook `session_id` instead of the real conversation `session_id`. The stored id is not a resumable conversation, so the next turn's `--resume` fails with\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69363", "created_at": "2026-04-20T14:42:23Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69363/files", "html_url": "https://github.com/openclaw/openclaw/pull/69363", "labels": [ "agents", "size: S" ], "merged": false, "number": 69363, "review_comments_count": 0, "state": "open", "title": "fix(agents): ignore SessionStart hook session_ids when resuming claude-cli", "updated_at": "2026-04-21T16:48:44Z" }, { "additions": 244, "author": "Menci", "author_association": "NONE", "body_excerpt": "## Problem Some OpenAI-compatible providers (notably GitHub Copilot's `/responses` endpoint) encode connection/session state into `input[].id` values as long base64 tokens. Those IDs outlive the upstream connection they were issued against\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69362", "created_at": "2026-04-20T14:37:27Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69362/files", "html_url": "https://github.com/openclaw/openclaw/pull/69362", "labels": [ "agents", "size: M" ], "merged": false, "number": 69362, "review_comments_count": 3, "state": "open", "title": "fix(openai-responses): auto-recover from connection-bound item ID rejections", "updated_at": "2026-04-20T15:01:46Z" }, { "additions": 1245, "author": "adminsairolotech-bit", "author_association": "NONE", "body_excerpt": "## Summary - Add Puter AI provider plugin (`puter`) for OpenClaw - Access 13+ models: GPT-5.4, Claude Opus 4.7, Gemini 2.5, Grok, DeepSeek, etc. - OpenAI-compatible API: streaming, tool calling, vision - 6 free-tier models marked with \ud83c\udd93 ba\u2026", "changed_files": 17, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69357", "created_at": "2026-04-20T14:06:02Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69357/files", "html_url": "https://github.com/openclaw/openclaw/pull/69357", "labels": [ "docs", "r: third-party-extension", "size: XL" ], "merged": false, "number": 69357, "review_comments_count": 7, "state": "closed", "title": "feat: Add Puter AI Provider Plugin (V1 MVP)", "updated_at": "2026-04-20T19:17:12Z" }, { "additions": 72, "author": "KimHyeongRae0", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `openclaw tasks audit` reports `inconsistent_timestamps` / \"startedAt is earlier than createdAt\" on the majority of tasks (succeeded/failed/timed_out/running), making audit output noisy ([#69229](https://github.com/op\u2026", "changed_files": 2, "cluster_id": "cluster-69229-3", "cluster_ids": [ "cluster-69229-3" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69356", "created_at": "2026-04-20T14:04:47Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69356/files", "html_url": "https://github.com/openclaw/openclaw/pull/69356", "labels": [ "size: S" ], "merged": false, "number": 69356, "review_comments_count": 2, "state": "open", "title": "fix(tasks): clamp createdAt to startedAt on task creation (#69229)", "updated_at": "2026-04-21T10:11:47Z" }, { "additions": 704, "author": "mikaeldiakhate-cell", "author_association": "NONE", "body_excerpt": "## Problem A stock `openclaw update` silently overwrites locally patched installs. Regressions return quietly because operators have no signal that the running package has diverged from the pristine npm release. Concrete trigger: the 2026-\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69355", "created_at": "2026-04-20T14:04:20Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69355/files", "html_url": "https://github.com/openclaw/openclaw/pull/69355", "labels": [ "docs", "commands", "size: L" ], "merged": false, "number": 69355, "review_comments_count": 6, "state": "open", "title": "feat(doctor): detect local rebuild vs pristine npm release", "updated_at": "2026-04-20T14:09:08Z" }, { "additions": 87, "author": "nnish16", "author_association": "NONE", "body_excerpt": "## Summary Teach the zsh completion generator to emit positional argument specs for leaf commands, including `_files` completion for path-like arguments. This restores tab completion for `openclaw wiki ingest ` without changing unrel\u2026", "changed_files": 2, "cluster_id": "cluster-69293-4", "cluster_ids": [ "cluster-69293-4" ], "cluster_role": "canonical", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69352", "created_at": "2026-04-20T13:53:48Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69352/files", "html_url": "https://github.com/openclaw/openclaw/pull/69352", "labels": [ "cli", "size: S" ], "merged": false, "number": 69352, "review_comments_count": 8, "state": "open", "title": "fix: complete zsh positional wiki ingest paths", "updated_at": "2026-04-20T18:21:50Z" }, { "additions": 29, "author": "KimHyeongRae0", "author_association": "NONE", "body_excerpt": "## Summary - Problem: [#69290](https://github.com/openclaw/openclaw/issues/69290) reports that `/new` and `/reset` reply `\u2705 ACP session reset in place.` for non-ACP sessions. - Why it matters: the source on `main` (and `v2026.4.15`) alread\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69349", "created_at": "2026-04-20T13:46:25Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69349/files", "html_url": "https://github.com/openclaw/openclaw/pull/69349", "labels": [ "size: XS" ], "merged": false, "number": 69349, "review_comments_count": 0, "state": "open", "title": "test(auto-reply): guard non-ACP reset reply (#69290)", "updated_at": "2026-04-20T13:50:38Z" }, { "additions": 14, "author": "antongoryachev", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** `sessions.json.estimatedCostUsd` is inflated 1\u00d7\u201372\u00d7 over real OpenRouter cost because three persist sites snapshot tokens but accumulate cost. The same run-cumulative `usage` object is handled multiple times per r\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69348", "created_at": "2026-04-20T13:42:30Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69348/files", "html_url": "https://github.com/openclaw/openclaw/pull/69348", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69348, "review_comments_count": 1, "state": "closed", "title": "fix(sessions): snapshot estimatedCostUsd to mirror token snapshot semantics", "updated_at": "2026-04-21T02:13:04Z" }, { "additions": 368, "author": "abajirao", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** When a streaming response terminates with `stopReason=stop` but produces zero content, zero thinking, zero tool calls, and zero tokens in/out, OpenClaw surfaces the generic `\u26a0\ufe0f Agent couldn't generate a response.\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69346", "created_at": "2026-04-20T13:39:46Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69346/files", "html_url": "https://github.com/openclaw/openclaw/pull/69346", "labels": [ "agents", "size: M" ], "merged": false, "number": 69346, "review_comments_count": 4, "state": "open", "title": "fix(embedded-runner): actionable diagnostic for empty-stream config errors", "updated_at": "2026-04-20T13:52:13Z" }, { "additions": 142, "author": "bradfreels", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69281. Cron jobs configured with `delivery.mode: \"none\"` were incorrectly recording: - `deliveryStatus: \"not-delivered\"` (should be `\"not-requested\"`) - A spurious `deliveryError: \"\u26a0\ufe0f \u2709\ufe0f Message failed\"` This produced fal\u2026", "changed_files": 4, "cluster_id": "cluster-44533-4", "cluster_ids": [ "cluster-44533-4" ], "cluster_role": "member", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69345", "created_at": "2026-04-20T13:37:15Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69345/files", "html_url": "https://github.com/openclaw/openclaw/pull/69345", "labels": [ "size: S" ], "merged": false, "number": 69345, "review_comments_count": 1, "state": "open", "title": "fix: mark cron delivery as not-requested when mode is \"none\" (#69281)", "updated_at": "2026-04-20T13:50:38Z" }, { "additions": 20, "author": "abacha", "author_association": "NONE", "body_excerpt": "The TUI currently chunks any non-whitespace sequence longer than 32 characters by injecting a space. This is intended to protect narrow terminals from layout issues but causes corruption in many common code snippets (e.g. Ruby method chain\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69344", "created_at": "2026-04-20T13:36:36Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69344/files", "html_url": "https://github.com/openclaw/openclaw/pull/69344", "labels": [ "size: XS" ], "merged": false, "number": 69344, "review_comments_count": 2, "state": "open", "title": "fix(tui): increase token chunking limit and preserve code-like fragments", "updated_at": "2026-04-20T14:08:03Z" }, { "additions": 282, "author": "claytonlin1110", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `openclaw.json` rejected per-model provider-specific fields (for example `reasoning.max_tokens`), so users could not configure provider-native request options at model granularity. - Why it matters: Providers like Ope\u2026", "changed_files": 12, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69342", "created_at": "2026-04-20T13:34:23Z", "deletions": 20, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69342/files", "html_url": "https://github.com/openclaw/openclaw/pull/69342", "labels": [ "agents", "size: M" ], "merged": false, "number": 69342, "review_comments_count": 7, "state": "open", "title": "fix: support per-model provider extraParams", "updated_at": "2026-04-20T18:32:23Z" }, { "additions": 1, "author": "CCcassiusdjs", "author_association": "NONE", "body_excerpt": "## Summary - `normalizeLongTokenForDisplay` splits tokens \u226533 chars with spaces to prevent terminal overflow - `isCopySensitiveToken` only guarded underscore-separated names; hyphenated identifiers like `my-long-package-name-component` wer\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69340", "created_at": "2026-04-20T13:12:02Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69340/files", "html_url": "https://github.com/openclaw/openclaw/pull/69340", "labels": [ "size: XS" ], "merged": false, "number": 69340, "review_comments_count": 0, "state": "open", "title": "fix(tui): preserve hyphen-separated tokens from line-wrap splitting", "updated_at": "2026-04-20T13:12:56Z" }, { "additions": 25, "author": "steipete", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - remove Discord's declared optional `@discordjs/opus` runtime dependency - use the `opusscript` range that satisfies `prism-media`'s optional peer path - remove `@discordjs/opus` from pnpm build-script allowlists and package co\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69339", "created_at": "2026-04-20T13:11:38Z", "deletions": 24, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69339/files", "html_url": "https://github.com/openclaw/openclaw/pull/69339", "labels": [ "channel: discord", "maintainer", "size: XS" ], "merged": true, "number": 69339, "review_comments_count": 4, "state": "closed", "title": "fix(discord): avoid native opus install path", "updated_at": "2026-04-20T14:25:10Z" }, { "additions": 7, "author": "CCcassiusdjs", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - When `ingestDelta` returns `null` (no visible change yet \u2014 first commentary-only delta, tool-call delta, or unchanged content), the handler returned early, skipping `setActivityStatus(\"streaming\")` and `armStreamingWatchdog` -\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69338", "created_at": "2026-04-20T13:11:26Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69338/files", "html_url": "https://github.com/openclaw/openclaw/pull/69338", "labels": [ "size: XS" ], "merged": true, "number": 69338, "review_comments_count": 0, "state": "closed", "title": "fix(tui): arm streaming watchdog on every delta, not only visible ones", "updated_at": "2026-04-21T11:53:37Z" }, { "additions": 6, "author": "CCcassiusdjs", "author_association": "NONE", "body_excerpt": "## Summary - `extractAssistantVisibleText` returned `undefined` when a message had phased text blocks but no `final_answer` block yet, causing TUI to display nothing during streaming and for models that omit `` tags - Add a commenta\u2026", "changed_files": 1, "cluster_id": "cluster-32900-10", "cluster_ids": [ "cluster-32900-10" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69337", "created_at": "2026-04-20T13:10:37Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69337/files", "html_url": "https://github.com/openclaw/openclaw/pull/69337", "labels": [ "size: XS" ], "merged": false, "number": 69337, "review_comments_count": 2, "state": "open", "title": "fix(tui): show commentary-phase text when no final_answer blocks present", "updated_at": "2026-04-20T13:14:14Z" }, { "additions": 16, "author": "mzogithub", "author_association": "NONE", "body_excerpt": "## TL;DR OpenAI removed the `/backend-api/responses` alias on `chatgpt.com` server-side. The OpenAI SDK appends `/responses` to the configured `baseUrl`, so OpenClaw's current `baseUrl` (`https://chatgpt.com/backend-api`) now resolves to `\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69336", "created_at": "2026-04-20T13:04:11Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69336/files", "html_url": "https://github.com/openclaw/openclaw/pull/69336", "labels": [ "size: XS", "extensions: openai" ], "merged": true, "number": 69336, "review_comments_count": 0, "state": "closed", "title": "fix(openai-codex): use /backend-api/codex/ base URL", "updated_at": "2026-04-21T02:21:05Z" }, { "additions": 80, "author": "steipete", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - remove extension-owned runtime packages from the root npm dependency graph - keep only genuinely shared runtime packages mirrored at the root - add package-manifest contract coverage so bundled plugin deps stay plugin-local ##\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69335", "created_at": "2026-04-20T13:00:50Z", "deletions": 270, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69335/files", "html_url": "https://github.com/openclaw/openclaw/pull/69335", "labels": [ "scripts", "maintainer", "size: S" ], "merged": true, "number": 69335, "review_comments_count": 7, "state": "closed", "title": "fix(deps): remove extension-owned deps from root install", "updated_at": "2026-04-20T14:03:12Z" }, { "additions": 39, "author": "steipete", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - stop postinstall from installing every bundled extension runtime dependency by default - keep source-checkout pruning, dist pruning, legacy sidecars, and Baileys hotfix handling - retain an explicit `OPENCLAW_EAGER_BUNDLED_PLU\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69334", "created_at": "2026-04-20T12:57:57Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69334/files", "html_url": "https://github.com/openclaw/openclaw/pull/69334", "labels": [ "scripts", "maintainer", "size: XS" ], "merged": true, "number": 69334, "review_comments_count": 5, "state": "closed", "title": "fix(plugins): stop eager bundled plugin dep install", "updated_at": "2026-04-20T13:41:20Z" }, { "additions": 621, "author": "richardclawbot", "author_association": "NONE", "body_excerpt": "## Summary - skip the zero-diff ACP verification gate for persistent sessions and downgrade oneshot zero-diff runs with real progress output to blocked follow-up instead of hard failure - add the ACP worktree diff verifier and regression c\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69328", "created_at": "2026-04-20T12:29:20Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69328/files", "html_url": "https://github.com/openclaw/openclaw/pull/69328", "labels": [ "app: web-ui", "agents", "size: L" ], "merged": false, "number": 69328, "review_comments_count": 3, "state": "open", "title": "fix(acp): avoid false zero-diff failures and append session messages", "updated_at": "2026-04-20T12:35:20Z" }, { "additions": 6, "author": "amknight", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary The slack extension's `BundledChannelEntryContract` pointed its `runtime` specifier at `./runtime-api.js` \u2014 a barrel module that re-exports the full slack runtime surface (29 chunks, ~284KB). The framework calls `setChannelRunti\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69325", "created_at": "2026-04-20T12:18:51Z", "deletions": 2, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69325/files", "html_url": "https://github.com/openclaw/openclaw/pull/69325", "labels": [ "channel: slack", "maintainer", "size: XS" ], "merged": false, "number": 69325, "review_comments_count": 0, "state": "closed", "title": "perf(slack): narrow runtime-setter specifier to avoid loading 284KB barrel", "updated_at": "2026-04-20T12:33:57Z" }, { "additions": 38572, "author": "100yenadmin", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary **Draft follow-up to [#68939](https://github.com/openclaw/openclaw/pull/68939)** \u2014 stacks on top of the plan-mode umbrella PR. Ships 5 code commits + 1 docs commit that harden the plan-mode 1.0 release. This PR's diff intentiona\u2026", "changed_files": 201, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69324", "created_at": "2026-04-20T12:18:44Z", "deletions": 335, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69324/files", "html_url": "https://github.com/openclaw/openclaw/pull/69324", "labels": [ "docs", "channel: telegram", "app: macos", "app: web-ui", "gateway", "commands", "agents", "size: XL", "extensions: openai" ], "merged": false, "number": 69324, "review_comments_count": 0, "state": "open", "title": "feat(plan-mode): 1.0 release follow-up \u2014 hardening + Telegram attachment + config + security + DX (stacks on #68939)", "updated_at": "2026-04-20T12:19:29Z" }, { "additions": 96, "author": "tdack", "author_association": "NONE", "body_excerpt": "## Summary Adds per-agent TTS configuration override support, allowing individual agents to customize TTS settings independently: - **Problem:** All agents shared global TTS configuration, preventing per-agent customization. - **Why it mat\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69323", "created_at": "2026-04-20T12:15:40Z", "deletions": 26, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69323/files", "html_url": "https://github.com/openclaw/openclaw/pull/69323", "labels": [ "agents", "size: S" ], "merged": false, "number": 69323, "review_comments_count": 16, "state": "open", "title": "feat: add per-agent TTS configuration override support", "updated_at": "2026-04-21T13:25:19Z" }, { "additions": 199, "author": "sk7n4k3d", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69295. `doctor.memory.status` previously returned vector-memory readiness for the active default agent only. Dashboards that want to show memory state for every configured agent had to shell out to the CLI, which can hang\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69322", "created_at": "2026-04-20T12:15:36Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69322/files", "html_url": "https://github.com/openclaw/openclaw/pull/69322", "labels": [ "docs", "gateway", "size: S" ], "merged": false, "number": 69322, "review_comments_count": 2, "state": "open", "title": "gateway: expose per-agent memory status in doctor.memory.status", "updated_at": "2026-04-20T12:24:00Z" }, { "additions": 25, "author": "tdack", "author_association": "NONE", "body_excerpt": "## Summary Adds complete Google Gemini TTS speech provider implementation with audioProfile support: - **Problem:** OpenClaw Gemini TTS provider exists but lacks audioProfile support for voice personality customization. - **Why it matters:\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69321", "created_at": "2026-04-20T12:15:24Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69321/files", "html_url": "https://github.com/openclaw/openclaw/pull/69321", "labels": [ "size: XS" ], "merged": false, "number": 69321, "review_comments_count": 10, "state": "open", "title": "feat: add audioProfile support to Gemini TTS config", "updated_at": "2026-04-21T09:44:53Z" }, { "additions": 455, "author": "sk7n4k3d", "author_association": "NONE", "body_excerpt": "Fixes #69299. Adds a `skills.uninstall` Gateway RPC method, mirroring `skills.install`, so operators can remove an installed ClawHub skill from the default agent workspace over the Gateway control plane. ## Changes - Schema: `SkillsUninsta\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69319", "created_at": "2026-04-20T12:05:15Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69319/files", "html_url": "https://github.com/openclaw/openclaw/pull/69319", "labels": [ "docs", "app: macos", "app: web-ui", "gateway", "agents", "size: M" ], "merged": false, "number": 69319, "review_comments_count": 3, "state": "open", "title": "gateway: register skills.uninstall RPC (mirror of skills.install)", "updated_at": "2026-04-20T17:16:34Z" }, { "additions": 20, "author": "sk7n4k3d", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69241. The GitHub Copilot provider's default model list was missing several models that Copilot actually serves today. Adding: - `claude-opus-4.7` (latest Anthropic Opus, top of list for default preference) - `claude-opus\u2026", "changed_files": 2, "cluster_id": "cluster-69241-4", "cluster_ids": [ "cluster-69241-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69318", "created_at": "2026-04-20T11:53:56Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69318/files", "html_url": "https://github.com/openclaw/openclaw/pull/69318", "labels": [ "size: XS" ], "merged": false, "number": 69318, "review_comments_count": 0, "state": "open", "title": "github-copilot: expand default model list with Opus 4.7, 4.5, Haiku 4.5, Gemini 2.5 Pro", "updated_at": "2026-04-20T11:55:56Z" }, { "additions": 572, "author": "amknight", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Slack startup-perf changes that drop slack's cold `register()` from **14.1s \u2192 6.2s (-56%)** on top of #69316. Work is shifted off the cold path so it only happens when actually exercised. Validated end-to-end via dist-mode gatew\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69317", "created_at": "2026-04-20T11:49:47Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69317/files", "html_url": "https://github.com/openclaw/openclaw/pull/69317", "labels": [ "channel: slack", "maintainer", "size: L" ], "merged": false, "number": 69317, "review_comments_count": 4, "state": "open", "title": "perf(slack): narrow runtime-setter + lazy-load 4 modules + narrow 2 SDK surfaces", "updated_at": "2026-04-21T03:47:54Z" }, { "additions": 255, "author": "amknight", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - memoize plugin loader alias maps by effective resolution context - reuse the resolved Jiti loader config/cache key on hot loader-cache hits - bound the loader alias/config caches to avoid unbounded growth on unique module path\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69316", "created_at": "2026-04-20T11:46:16Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69316/files", "html_url": "https://github.com/openclaw/openclaw/pull/69316", "labels": [ "maintainer", "size: M" ], "merged": true, "number": 69316, "review_comments_count": 1, "state": "closed", "title": "perf: memoize plugin loader alias maps", "updated_at": "2026-04-20T14:17:02Z" }, { "additions": 266, "author": "garrytan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Context I'm building a plugin that wraps subagent execution in a durable job queue: crash recovery, retry with backoff, timeout enforcement. The `DetachedTaskLifecycleRuntime` seam (#68886) and plugin registration contract (#68915) give\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69313", "created_at": "2026-04-20T11:29:58Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69313/files", "html_url": "https://github.com/openclaw/openclaw/pull/69313", "labels": [ "docs", "commands", "size: M" ], "merged": true, "number": 69313, "review_comments_count": 9, "state": "closed", "title": "tasks: add detached task recovery hook before markLost", "updated_at": "2026-04-20T23:06:18Z" }, { "additions": 287, "author": "Jerry-Xin", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69311 `splitMediaFromOutput()` incorrectly extracts `MEDIA:` directives from 4-space/tab indented code blocks because `parseFenceSpans()` only recognizes fenced (`\\`\\`\\``/`~~~`) code blocks. This causes code lines to be s\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69312", "created_at": "2026-04-20T11:27:52Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69312/files", "html_url": "https://github.com/openclaw/openclaw/pull/69312", "labels": [ "size: M" ], "merged": false, "number": 69312, "review_comments_count": 2, "state": "open", "title": "fix: prevent MEDIA: false-positive extraction from indented code blocks", "updated_at": "2026-04-21T12:17:46Z" }, { "additions": 573, "author": "Jerry-Xin", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69309 When a `MEDIA:` directive fails (path not in allowlist, file not found, etc.), OpenClaw Core silently drops the media item. Users and agents receive no feedback. This PR surfaces those failures as user-visible warni\u2026", "changed_files": 16, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 11, "conversation_url": "https://github.com/openclaw/openclaw/pull/69310", "created_at": "2026-04-20T11:26:13Z", "deletions": 25, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69310/files", "html_url": "https://github.com/openclaw/openclaw/pull/69310", "labels": [ "size: L" ], "merged": false, "number": 69310, "review_comments_count": 34, "state": "open", "title": "fix: surface dropped media to users instead of silently swallowing", "updated_at": "2026-04-21T16:21:31Z" }, { "additions": 93, "author": "sk7n4k3d", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Fix `getShellConfig()` so `exec` no longer exits with code 1 when `process.env.SHELL` is a non-interactive placeholder such as `/usr/bin/false`, `/bin/false`, `/usr/sbin/nologin`, or `/sbin/nologin`. - Apply the same filter to\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69308", "created_at": "2026-04-20T11:19:01Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69308/files", "html_url": "https://github.com/openclaw/openclaw/pull/69308", "labels": [ "agents", "size: S" ], "merged": true, "number": 69308, "review_comments_count": 0, "state": "closed", "title": "shell: fall back to sh when SHELL is /usr/bin/false or nologin", "updated_at": "2026-04-21T07:18:12Z" }, { "additions": 112, "author": "sk7n4k3d", "author_association": "NONE", "body_excerpt": "## Summary - Problem: \\`openclaw wiki ingest \\`, \\`openclaw wiki scan \\`, and every other leaf command with a positional argument emits a zsh completion function that lists options only. Typing \\`openclaw wiki ingest T\\` tr\u2026", "changed_files": 2, "cluster_id": "cluster-69293-4", "cluster_ids": [ "cluster-69293-4" ], "cluster_role": "member", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69305", "created_at": "2026-04-20T11:10:08Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69305/files", "html_url": "https://github.com/openclaw/openclaw/pull/69305", "labels": [ "cli", "size: S" ], "merged": false, "number": 69305, "review_comments_count": 4, "state": "open", "title": "CLI: complete positional args in zsh completion", "updated_at": "2026-04-20T11:51:50Z" }, { "additions": 562, "author": "haishmg", "author_association": "NONE", "body_excerpt": "Closes #69233 ## What changed This adds an optional per-group WhatsApp admin override via `channels.whatsapp.groups..admin` and wildcard `channels.whatsapp.groups.\"*\".admin`. When an admin is configured for a group scope: - the config\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 7, "conversation_url": "https://github.com/openclaw/openclaw/pull/69297", "created_at": "2026-04-20T10:19:40Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69297/files", "html_url": "https://github.com/openclaw/openclaw/pull/69297", "labels": [ "docs", "channel: whatsapp-web", "size: L" ], "merged": false, "number": 69297, "review_comments_count": 17, "state": "open", "title": "fix(whatsapp): Add group admin privacy controls", "updated_at": "2026-04-20T17:59:16Z" }, { "additions": 81, "author": "chaosreload", "author_association": "NONE", "body_excerpt": "## Problem When a globally- or workspace-installed plugin declares channels in its manifest (e.g. a third-party plugin declares `channels: [\"acme-chat\"]`), OpenClaw's plugin loader already auto-discovers and loads it from `~/.openclaw/exte\u2026", "changed_files": 3, "cluster_id": "cluster-20478-13", "cluster_ids": [ "cluster-20478-13" ], "cluster_role": "member", "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69292", "created_at": "2026-04-20T10:11:33Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69292/files", "html_url": "https://github.com/openclaw/openclaw/pull/69292", "labels": [ "size: S" ], "merged": false, "number": 69292, "review_comments_count": 2, "state": "open", "title": "fix(doctor): skip plugins.entries for installed plugins already auto-loaded via manifest channels", "updated_at": "2026-04-21T07:18:24Z" }, { "additions": 23, "author": "xialonglee", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Fix reasoning-tag filtering in streaming paths to recognize namespaced tags like `...`. - Align streaming tag parsing with existing final-text sanitization behavior so reasoning text is consist\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69288", "created_at": "2026-04-20T09:57:21Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69288/files", "html_url": "https://github.com/openclaw/openclaw/pull/69288", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69288, "review_comments_count": 0, "state": "open", "title": "fix(agents): strip antml thinking tags in streaming", "updated_at": "2026-04-21T12:43:15Z" }, { "additions": 54, "author": "matsuri1987", "author_association": "NONE", "body_excerpt": "## Summary Fixes #69281 When `delivery.mode` is `\"none\"`, `dispatchCronDelivery` now returns `delivered: undefined` instead of `delivered: false`. This allows `resolveDeliveryStatus` to correctly return `\"not-requested\"` instead of `\"not-d\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69285", "created_at": "2026-04-20T09:44:56Z", "deletions": 15, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69285/files", "html_url": "https://github.com/openclaw/openclaw/pull/69285", "labels": [ "size: S" ], "merged": true, "number": 69285, "review_comments_count": 2, "state": "closed", "title": "fix(cron): return undefined for delivered when delivery not requested", "updated_at": "2026-04-20T13:16:11Z" }, { "additions": 3, "author": "MoerAI", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary The iMessage channel health monitor falsely detects idle iMessage channels as dead sockets, causing 59+ unnecessary provider restarts per 48 hours during normal idle periods. ## Root Cause The channel health monitor uses a fixed\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69283", "created_at": "2026-04-20T09:39:18Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69283/files", "html_url": "https://github.com/openclaw/openclaw/pull/69283", "labels": [ "channel: imessage", "size: XS" ], "merged": false, "number": 69283, "review_comments_count": 1, "state": "open", "title": "fix(imessage): skip stale-socket health check for iMessage channel (#35072)", "updated_at": "2026-04-21T09:07:08Z" }, { "additions": 3, "author": "sukhdeepjohar", "author_association": "NONE", "body_excerpt": "## Summary - Add missing `truncateAfterCompaction: z.boolean().optional()` to the compaction zod schema - Regenerate config baseline hash The field is declared in the TypeScript type (`types.agent-defaults.ts:451`), read at runtime (`compa\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69282", "created_at": "2026-04-20T09:25:35Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69282/files", "html_url": "https://github.com/openclaw/openclaw/pull/69282", "labels": [ "docs", "size: XS" ], "merged": false, "number": 69282, "review_comments_count": 0, "state": "open", "title": "fix(config): add truncateAfterCompaction to compaction zod schema", "updated_at": "2026-04-20T09:26:31Z" }, { "additions": 43, "author": "stainlu", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** On a fresh session, the main agent does not respond to user messages. Two reproducible failure modes: (1) the agent replies with the literal string `HEARTBEAT_OK`, which the delivery runtime treats as \"no reply\" a\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69278", "created_at": "2026-04-20T09:00:48Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69278/files", "html_url": "https://github.com/openclaw/openclaw/pull/69278", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69278, "review_comments_count": 0, "state": "open", "title": "fix(agents): stop injecting heartbeat system prompt on non-heartbeat runs (#69079)", "updated_at": "2026-04-21T16:07:45Z" }, { "additions": 265, "author": "broBinChen", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** Reasoning emitted by the agent runtime via `emitAgentEvent({ stream: \"thinking\", ... })` (see `src/agents/pi-embedded-subscribe.ts:emitReasoningStream`) never reached chat broadcasts. `createAgentEventHandler` onl\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69277", "created_at": "2026-04-20T08:58:29Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69277/files", "html_url": "https://github.com/openclaw/openclaw/pull/69277", "labels": [ "gateway", "size: M" ], "merged": false, "number": 69277, "review_comments_count": 3, "state": "closed", "title": "fix(gateway): surface stream:\"thinking\" events in chat broadcasts", "updated_at": "2026-04-20T12:04:51Z" }, { "additions": 105, "author": "stainlu", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** When `mcp.servers` is configured and a cron job spawns an isolated agent session that uses an MCP tool, the MCP child subprocess (e.g. Lightpanda) is spawned fresh every run and never terminated. Each cron fire le\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69276", "created_at": "2026-04-20T08:57:09Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69276/files", "html_url": "https://github.com/openclaw/openclaw/pull/69276", "labels": [ "size: S" ], "merged": false, "number": 69276, "review_comments_count": 0, "state": "open", "title": "fix(cron): dispose bundled-MCP subprocesses after isolated cron agent runs (#68623)", "updated_at": "2026-04-20T18:22:49Z" }, { "additions": 11, "author": "broBinChen", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** The `openclaw acp` bridge constructs its `GatewayClient` without a `caps` array. The gateway uses `caps` to decide which event firehoses to forward \u2014 specifically `wantsToolEvents` (see `src/gateway/server-methods\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69275", "created_at": "2026-04-20T08:56:22Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69275/files", "html_url": "https://github.com/openclaw/openclaw/pull/69275", "labels": [ "size: XS" ], "merged": false, "number": 69275, "review_comments_count": 0, "state": "closed", "title": "fix(acp): declare TOOL_EVENTS capability so live tool calls reach ACP clients", "updated_at": "2026-04-20T12:04:59Z" }, { "additions": 61, "author": "Bartok9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary `openclaw tasks audit` reports false-positive `inconsistent_timestamps` warnings on the majority of tasks (both succeeded and failed), making the audit output noisy and hiding real issues. ## Root Cause Tasks frequently start be\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69273", "created_at": "2026-04-20T08:43:38Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69273/files", "html_url": "https://github.com/openclaw/openclaw/pull/69273", "labels": [ "size: S", "r: too-many-prs" ], "merged": false, "number": 69273, "review_comments_count": 0, "state": "closed", "title": "fix(tasks): add tolerance for startedAt before createdAt in task audit", "updated_at": "2026-04-20T08:45:15Z" }, { "additions": 443, "author": "de1tydev", "author_association": "NONE", "body_excerpt": "## Summary Restore session invariants across compaction and reset instead of patching each symptom in isolation. This coordinated fix now covers four connected paths: - subscribe-time `before_compaction` / `after_compaction` hook context -\u2026", "changed_files": 19, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69270", "created_at": "2026-04-20T08:31:17Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69270/files", "html_url": "https://github.com/openclaw/openclaw/pull/69270", "labels": [ "gateway", "agents", "size: M" ], "merged": false, "number": 69270, "review_comments_count": 7, "state": "open", "title": "fix(compaction): restore session invariants across compaction and reset", "updated_at": "2026-04-21T06:37:46Z" }, { "additions": 595, "author": "mzogithub", "author_association": "NONE", "body_excerpt": "## Summary Two related bugs that made Anthropic sessions (specifically Claude Opus 4.7 with adaptive thinking) unusable when the pi-coding-agent wrapper was active. ### Bug 1 \u2014 `thinking.type.enabled` rejected by Opus 4.7 **Symptom:** API\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69268", "created_at": "2026-04-20T08:25:28Z", "deletions": 21, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69268/files", "html_url": "https://github.com/openclaw/openclaw/pull/69268", "labels": [ "agents", "size: L" ], "merged": false, "number": 69268, "review_comments_count": 4, "state": "open", "title": "fix(anthropic): Opus 4.7 thinking.type leak + assistant-prefill short-circuit", "updated_at": "2026-04-21T06:55:38Z" }, { "additions": 17, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Adds logging for all 4xx error responses in the hook gateway handler to improve debuggability. ## Root Cause When hook POSTs fail validation (HTTP 400), no trace is left in the gateway journal. This makes it difficult to diagnos\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69267", "created_at": "2026-04-20T08:14:25Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69267/files", "html_url": "https://github.com/openclaw/openclaw/pull/69267", "labels": [ "gateway", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69267, "review_comments_count": 3, "state": "closed", "title": "fix: add logging for 4xx hook gateway errors", "updated_at": "2026-04-20T08:38:51Z" }, { "additions": 147, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem Webchat \u4e2d\u7528\u6237\u6d88\u606f\u53d1\u9001\u540e\u4f1a\u77ed\u6682\u51fa\u73b0\uff0c\u7136\u540e\u5728\u5386\u53f2\u5237\u65b0\u3001\u9519\u8bef\u6216\u91cd\u8fde\u540e\u6d88\u5931\u3002 ## Root cause \u524d\u7aef up()/loadChatHistory() \u7528\u670d\u52a1\u7aef chat.history \u5168\u91cf\u8986\u76d6\u672c\u5730 chatMessages\uff1b\u4f46 gateway \u5bf9\u7528\u6237\u6d88\u606f transcript \u7684\u5199\u5165\u662f\u5f02\u6b65\u7684\uff08emitUserTranscriptUpdate\uff09\uff0c\u5bfc\u81f4\u5386\u53f2\u5237\u65b0\u53ef\u80fd\u5148\u4e8e transcript \u843d\u76d8\uff0c\u5f62\u6210 race\u3002 ## Fix \u53d1\u9001\u7528\u6237\u6d88\u606f\u65f6\u7ed9\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69266", "created_at": "2026-04-20T08:07:27Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69266/files", "html_url": "https://github.com/openclaw/openclaw/pull/69266", "labels": [ "app: web-ui", "size: S", "r: too-many-prs" ], "merged": false, "number": 69266, "review_comments_count": 2, "state": "closed", "title": "fix(webchat): preserve optimistic user messages during history reload", "updated_at": "2026-04-20T08:11:25Z" }, { "additions": 172, "author": "slepybear", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Add test coverage for two Chinese AI provider extensions (`qianfan` and `kimi-coding`) that currently have no tests. - **qianfan (\u767e\u5ea6\u5343\u5e06)**: 6 tests covering provider registration, auth resolution, model catalog, and model propert\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69263", "created_at": "2026-04-20T08:01:39Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69263/files", "html_url": "https://github.com/openclaw/openclaw/pull/69263", "labels": [ "size: S", "extensions: kimi-coding", "extensions: qianfan" ], "merged": false, "number": 69263, "review_comments_count": 4, "state": "open", "title": "test(qianfan,kimi-coding): add provider plugin and onboard config tests", "updated_at": "2026-04-20T08:03:46Z" }, { "additions": 221, "author": "slepybear", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68016 where QQ Bot cannot send locally-generated images (screenshots, AI-generated images) saved to `~/.openclaw/media/outbound/`. ## Root Cause The `resolveQQBotPayloadLocalFilePath()` function in `extensions/qqbot/src/u\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69262", "created_at": "2026-04-20T07:59:34Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69262/files", "html_url": "https://github.com/openclaw/openclaw/pull/69262", "labels": [ "size: M", "extensions: kimi-coding", "extensions: qianfan", "channel: qqbot" ], "merged": false, "number": 69262, "review_comments_count": 3, "state": "open", "title": "fix(qqbot): allow outbound and inbound media paths in resolveQQBotPayloadLocalFilePath", "updated_at": "2026-04-20T08:05:27Z" }, { "additions": 811, "author": "hyspacex", "author_association": "NONE", "body_excerpt": "## Summary The Ollama embedding provider attached `Authorization: Bearer ` to whatever `baseUrl` resolved to, without scoping by where the key came from. Three concrete leaks: - An env-sourced `OLLAMA_API_KEY` (the Ollama Cloud con\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69261", "created_at": "2026-04-20T07:54:22Z", "deletions": 21, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69261/files", "html_url": "https://github.com/openclaw/openclaw/pull/69261", "labels": [ "size: L" ], "merged": false, "number": 69261, "review_comments_count": 3, "state": "open", "title": "fix(ollama): scope embedding auth to declared host boundaries", "updated_at": "2026-04-20T07:58:53Z" }, { "additions": 45, "author": "717986230", "author_association": "NONE", "body_excerpt": "## Description Add Claude Opus 4.7, Claude Opus 4.6, Claude Opus 4.5, Claude Haiku 4.5, and Gemini 2.5 Pro to the GitHub Copilot provider's DEFAULT_MODEL_IDS. ## Changes - claude-opus-4.7 - claude-opus-4.6 - claude-opus-4.5 - claude-haiku-\u2026", "changed_files": 5, "cluster_id": "cluster-69241-4", "cluster_ids": [ "cluster-69241-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69259", "created_at": "2026-04-20T07:49:00Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69259/files", "html_url": "https://github.com/openclaw/openclaw/pull/69259", "labels": [ "docs", "gateway", "size: XS" ], "merged": false, "number": 69259, "review_comments_count": 0, "state": "open", "title": "feat(github-copilot): add Claude Opus 4.7 and other models to default list", "updated_at": "2026-04-20T07:50:31Z" }, { "additions": 921, "author": "omarshahine", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem Two distinct user sends to a DM \u2014 a command followed by a pasted URL that iMessage renders as a standalone URL-balloon message \u2014 have distinct `messageId`s and no `associatedMessageGuid` cross-reference. The debouncer's `buildKe\u2026", "changed_files": 16, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/69258", "created_at": "2026-04-20T07:43:18Z", "deletions": 22, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69258/files", "html_url": "https://github.com/openclaw/openclaw/pull/69258", "labels": [ "docs", "channel: bluebubbles", "scripts", "maintainer", "size: L" ], "merged": true, "number": 69258, "review_comments_count": 11, "state": "closed", "title": "fix(bluebubbles): add opt-in coalesceSameSenderDms for split-send DMs", "updated_at": "2026-04-21T08:44:41Z" }, { "additions": 40, "author": "717986230", "author_association": "NONE", "body_excerpt": "## Description Add Tasks section to gog SKILL.md with commands for managing tasks. ## Changes - Tasks list tasklists: \\gog tasks lists list --json\\ - Tasks list: \\gog tasks list --json\\ - Tasks add: \\gog tasks add \u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69257", "created_at": "2026-04-20T07:35:36Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69257/files", "html_url": "https://github.com/openclaw/openclaw/pull/69257", "labels": [ "docs", "gateway", "size: XS" ], "merged": false, "number": 69257, "review_comments_count": 3, "state": "open", "title": "docs: add gog tasks commands to SKILL.md", "updated_at": "2026-04-20T07:39:39Z" }, { "additions": 11, "author": "lllyin", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: Isolated cron sessions with `deleteAfterRun: true` are being deleted prematurely during a run if a \"Direct Delivery\" (structured content or threaded reply) is triggered, even if subagents (workers) are still activ\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69256", "created_at": "2026-04-20T07:33:47Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69256/files", "html_url": "https://github.com/openclaw/openclaw/pull/69256", "labels": [ "size: XS" ], "merged": false, "number": 69256, "review_comments_count": 3, "state": "open", "title": "fix(cron): prevent premature session cleanup when subagents are running", "updated_at": "2026-04-21T12:01:52Z" }, { "additions": 333, "author": "stiva1979-jpg", "author_association": "NONE", "body_excerpt": "## Summary Adds a new Gateway RPC method `agent.identity.full` that exposes the local OpenClaw agent's full identity (parsed frontmatter plus raw IDENTITY.md + SOUL.md content) to authenticated Gateway clients. **Why:** Downstream tools th\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69253", "created_at": "2026-04-20T07:27:39Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69253/files", "html_url": "https://github.com/openclaw/openclaw/pull/69253", "labels": [ "gateway", "size: M" ], "merged": false, "number": 69253, "review_comments_count": 5, "state": "open", "title": "feat(gateway): add agent.identity.full method", "updated_at": "2026-04-20T07:32:38Z" }, { "additions": 545, "author": "zhonghe0615", "author_association": "NONE", "body_excerpt": "## Summary This changes recurring cron jobs to retry transient failures on the configured retry backoff window before falling back to their next natural schedule. Previously, transient failures for recurring cron jobs effectively waited un\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69252", "created_at": "2026-04-20T07:27:38Z", "deletions": 50, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69252/files", "html_url": "https://github.com/openclaw/openclaw/pull/69252", "labels": [ "app: web-ui", "gateway", "cli", "agents", "size: L" ], "merged": false, "number": 69252, "review_comments_count": 9, "state": "open", "title": "fix(cron): retry transient recurring failures before next schedule", "updated_at": "2026-04-21T06:39:22Z" }, { "additions": 206, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes a release pipeline regression where `patches/` was copied in the build stage but stripped by `pnpm prune --prod` in the `runtime-assets` stage. The runtime stage never re-added it, yet `package.json` still carries `pnpm.pa\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69248", "created_at": "2026-04-20T07:22:48Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69248/files", "html_url": "https://github.com/openclaw/openclaw/pull/69248", "labels": [ "docker", "agents", "size: M", "r: too-many-prs" ], "merged": false, "number": 69248, "review_comments_count": 2, "state": "closed", "title": "fix(docker): include patches/ in published runtime image", "updated_at": "2026-04-20T07:27:53Z" }, { "additions": 82, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #69229 ## Problem `openclaw tasks audit` reports false-positive `inconsistent_timestamps` warnings when `startedAt` is slightly earlier than `createdAt` due to sub-millisecond clock jitter between separate `Date.now()` calls. ## Fix\u2026", "changed_files": 2, "cluster_id": "cluster-69229-3", "cluster_ids": [ "cluster-69229-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69247", "created_at": "2026-04-20T07:14:06Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69247/files", "html_url": "https://github.com/openclaw/openclaw/pull/69247", "labels": [ "size: S" ], "merged": false, "number": 69247, "review_comments_count": 1, "state": "open", "title": "fix(tasks): allow timestamp jitter tolerance in audit inconsistency check", "updated_at": "2026-04-20T07:16:12Z" }, { "additions": 12, "author": "g18166599417-svg", "author_association": "NONE", "body_excerpt": "## Summary Enable cache-ttl based context pruning for all providers using the \\openai-completions\\ API type. Currently, \\isCacheTtlEligibleProvider\\ only returns \\ rue\\ for Anthropic-family and Google-family providers (plus those registere\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69245", "created_at": "2026-04-20T07:10:25Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69245/files", "html_url": "https://github.com/openclaw/openclaw/pull/69245", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69245, "review_comments_count": 0, "state": "open", "title": "feat: enable cache-ttl context pruning for openai-completions providers", "updated_at": "2026-04-20T07:11:53Z" }, { "additions": 4, "author": "kiote", "author_association": "NONE", "body_excerpt": "## Summary Add commonly available Copilot models that were missing from `DEFAULT_MODEL_IDS`: - `claude-opus-4.7` - `claude-opus-4.5` - `claude-haiku-4.5` - `gemini-2.5-pro` These models are available on Copilot plans (confirmed via OpenCod\u2026", "changed_files": 1, "cluster_id": "cluster-69241-4", "cluster_ids": [ "cluster-69241-4" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69244", "created_at": "2026-04-20T07:08:12Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69244/files", "html_url": "https://github.com/openclaw/openclaw/pull/69244", "labels": [ "size: XS" ], "merged": false, "number": 69244, "review_comments_count": 0, "state": "open", "title": "feat(github-copilot): add missing Copilot models to defaults", "updated_at": "2026-04-20T07:09:25Z" }, { "additions": 15, "author": "Magicray1217", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Undici 8 enables HTTP/2 ALPN by default, causing Telegram long-polling connections to stall on Windows (IPv6 + H2 multiplexing issues). The core fetch-guard (\\src/infra/net/undici-runtime.ts\\) already applies \\\u0007llowH2: false\\ fo\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69243", "created_at": "2026-04-20T07:04:26Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69243/files", "html_url": "https://github.com/openclaw/openclaw/pull/69243", "labels": [ "channel: telegram", "size: XS" ], "merged": false, "number": 69243, "review_comments_count": 1, "state": "closed", "title": "fix(telegram): disable HTTP/2 for all Telegram polling dispatchers", "updated_at": "2026-04-20T22:04:38Z" }, { "additions": 19, "author": "Magicray1217", "author_association": "NONE", "body_excerpt": "## Summary \\ esolveGlobalLane\\ unconditionally remapped \\CommandLane.Cron\\ to \\CommandLane.Nested\\, which funnelled **all** cron work into a serial bottleneck (\\ ested\\ defaults to \\maxConcurrent: 1\\) and effectively ignored \\cron.maxConcu\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69240", "created_at": "2026-04-20T06:57:10Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69240/files", "html_url": "https://github.com/openclaw/openclaw/pull/69240", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69240, "review_comments_count": 0, "state": "open", "title": "fix(cron): preserve cron lane for top-level dispatch, only remap to nested for inner ops", "updated_at": "2026-04-20T06:58:24Z" }, { "additions": 1, "author": "palacici", "author_association": "NONE", "body_excerpt": "## Summary memory-core is a bundled plugin that provides core memory functionality (dreaming, memory recall, etc.), but its openclaw.plugin.json is missing the enabledByDefault: true field. This causes openclaw doctor and openclaw update t\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69237", "created_at": "2026-04-20T06:36:59Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69237/files", "html_url": "https://github.com/openclaw/openclaw/pull/69237", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 69237, "review_comments_count": 0, "state": "open", "title": "fix: add enabledByDefault to memory-core plugin manifest", "updated_at": "2026-04-20T06:37:53Z" }, { "additions": 95, "author": "stainlu", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** The built-in heartbeat mechanism triggers a full CLI session reset every 30 minutes because `extraSystemPromptHash` includes the volatile inbound-meta envelope. A user message via Feishu/Telegram produces one inbo\u2026", "changed_files": 6, "cluster_id": "cluster-64380-3", "cluster_ids": [ "cluster-64380-3" ], "cluster_role": "canonical", "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69236", "created_at": "2026-04-20T06:36:32Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69236/files", "html_url": "https://github.com/openclaw/openclaw/pull/69236", "labels": [ "agents", "size: S" ], "merged": false, "number": 69236, "review_comments_count": 4, "state": "open", "title": "fix(agents): exclude volatile inbound metadata from CLI session reuse hash (#68471)", "updated_at": "2026-04-20T18:12:59Z" }, { "additions": 59439, "author": "Deepnoa", "author_association": "NONE", "body_excerpt": "## Summary - add a `runs` alias that forwards to the existing sense-worker `run` plugin command - update the run help text to advertise both `/openclaw run ...` and `/openclaw runs ...` - extend the sense-worker registration and help tests\u2026", "changed_files": 191, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69232", "created_at": "2026-04-20T06:31:02Z", "deletions": 169, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69232/files", "html_url": "https://github.com/openclaw/openclaw/pull/69232", "labels": [ "docs", "channel: slack", "app: android", "app: ios", "app: web-ui", "gateway", "scripts", "agents", "size: XL" ], "merged": false, "number": 69232, "review_comments_count": 0, "state": "open", "title": "[codex] add runs alias for sense-worker command", "updated_at": "2026-04-20T06:31:20Z" }, { "additions": 31, "author": "717986230", "author_association": "NONE", "body_excerpt": "## Description Add heartbeat configuration section to \\docs/cli/config.md\\ with CLI examples for common heartbeat options. ## Changes - Add heartbeat configuration section with CLI examples - Document \\\u0007gents.defaults.heartbeat\\ path and c\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69231", "created_at": "2026-04-20T06:30:48Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69231/files", "html_url": "https://github.com/openclaw/openclaw/pull/69231", "labels": [ "docs", "gateway", "size: XS" ], "merged": false, "number": 69231, "review_comments_count": 1, "state": "open", "title": "docs: add heartbeat configuration examples to config CLI reference", "updated_at": "2026-04-20T06:33:09Z" }, { "additions": 51, "author": "zhuisDEV", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - use the full plugin manifest registry when checking plugins.allow for phantom entries - stop treating bundled non-channel plugins like openai, google, and acpx as phantom allowlist IDs - add regression coverage for bundled non\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69230", "created_at": "2026-04-20T06:28:08Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69230/files", "html_url": "https://github.com/openclaw/openclaw/pull/69230", "labels": [ "size: S" ], "merged": false, "number": 69230, "review_comments_count": 1, "state": "open", "title": "fix(security): trust manifest registry in phantom plugin audit", "updated_at": "2026-04-20T06:30:14Z" }, { "additions": 249, "author": "nakamotoliu", "author_association": "NONE", "body_excerpt": "## Summary - add `browser.profiles..headless` to the browser profile config schema - make `resolveProfile()` compute a per-profile headless value that falls back to global `browser.headless` - use the resolved profile headless flag i\u2026", "changed_files": 22, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/69228", "created_at": "2026-04-20T06:25:41Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69228/files", "html_url": "https://github.com/openclaw/openclaw/pull/69228", "labels": [ "size: M" ], "merged": false, "number": 69228, "review_comments_count": 7, "state": "open", "title": "browser: support per-profile headless override", "updated_at": "2026-04-20T11:59:32Z" }, { "additions": 433, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - enrich gateway pairing failures with reason-specific details, request ids, and remediation hints - surface the richer pairing recovery guidance in CLI status output and Control UI formatting - document the PAIRING_REQUIRED con\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69227", "created_at": "2026-04-20T06:25:40Z", "deletions": 51, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69227/files", "html_url": "https://github.com/openclaw/openclaw/pull/69227", "labels": [ "docs", "app: web-ui", "gateway", "commands", "maintainer", "size: M" ], "merged": true, "number": 69227, "review_comments_count": 2, "state": "closed", "title": "Fix pairing-required recovery details", "updated_at": "2026-04-20T07:04:04Z" }, { "additions": 707, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary When a paired read-only device reconnects asking for wider operator scopes, surface the real approval state instead of a generic pairing/auth failure. ## Changes - format pairing rejection details into actionable scope/role/meta\u2026", "changed_files": 48, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69226", "created_at": "2026-04-20T06:25:14Z", "deletions": 125, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69226/files", "html_url": "https://github.com/openclaw/openclaw/pull/69226", "labels": [ "app: web-ui", "gateway", "cli", "commands", "agents", "maintainer", "size: L" ], "merged": true, "number": 69226, "review_comments_count": 7, "state": "closed", "title": "Surface pending scope upgrades in gateway auth errors", "updated_at": "2026-04-20T08:17:45Z" }, { "additions": 369, "author": "trevorlarson", "author_association": "NONE", "body_excerpt": "## Summary - add Discord config `splitOnCodeBlocks` (default off) - split mixed prose + fenced code into distinct messages before normal chunking - propagate option through shared outbound send path and monitor fast-path/native command pat\u2026", "changed_files": 18, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69223", "created_at": "2026-04-20T06:21:54Z", "deletions": 15, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69223/files", "html_url": "https://github.com/openclaw/openclaw/pull/69223", "labels": [ "docs", "channel: discord", "gateway", "size: M" ], "merged": false, "number": 69223, "review_comments_count": 2, "state": "closed", "title": "discord: split mixed replies on fenced code blocks", "updated_at": "2026-04-20T21:02:00Z" }, { "additions": 871, "author": "hyspacex", "author_association": "NONE", "body_excerpt": "## Summary Closes #69132. Ollama 0.16.0 and later no longer expose `/api/experimental/web_search` on the local host, which is the only path the bundled provider was calling. Every `web_search` against `tools.web.search.provider = \"ollama\"`\u2026", "changed_files": 10, "cluster_id": "cluster-69132-4", "cluster_ids": [ "cluster-69132-4" ], "cluster_role": "member", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69222", "created_at": "2026-04-20T06:20:03Z", "deletions": 133, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69222/files", "html_url": "https://github.com/openclaw/openclaw/pull/69222", "labels": [ "docs", "size: L" ], "merged": false, "number": 69222, "review_comments_count": 1, "state": "open", "title": "fix(ollama): restore web search compatibility on Ollama 0.16+", "updated_at": "2026-04-20T16:25:48Z" }, { "additions": 1000, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "This keeps approval-required scope and role upgrades, but makes that model explicit instead of looking like a broken pairing. - include requested vs approved access on pairing-required upgrade errors - show the same upgrade state in `openc\u2026", "changed_files": 19, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69221", "created_at": "2026-04-20T06:19:54Z", "deletions": 83, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69221/files", "html_url": "https://github.com/openclaw/openclaw/pull/69221", "labels": [ "docs", "app: web-ui", "gateway", "cli", "maintainer", "size: XL" ], "merged": true, "number": 69221, "review_comments_count": 7, "state": "closed", "title": "Explain pairing scope upgrades during reconnects", "updated_at": "2026-04-20T07:44:31Z" }, { "additions": 85, "author": "zeroaltitude", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem The plugin loader's per-plugin snapshot/rollback dance captures several `previousMemory*` values to restore after a non-activating load \u2014 but **`previousMemoryCapability` was missing**. Both restore sites (the `if (!shouldActiva\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69219", "created_at": "2026-04-20T05:57:21Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69219/files", "html_url": "https://github.com/openclaw/openclaw/pull/69219", "labels": [ "size: S" ], "merged": true, "number": 69219, "review_comments_count": 0, "state": "closed", "title": "fix(plugins): preserve memory capability across snapshot plugin loads", "updated_at": "2026-04-20T20:26:27Z" }, { "additions": 18, "author": "epicseven-cup", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** The Discord bot permission list in `docs/channels/discord.md` was a flat list that didn't reflect how permissions are actually organized in the Discord bot invite flow UI. - **Why it matters:** Users following the\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69218", "created_at": "2026-04-20T05:56:23Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69218/files", "html_url": "https://github.com/openclaw/openclaw/pull/69218", "labels": [ "docs", "channel: discord", "size: XS" ], "merged": false, "number": 69218, "review_comments_count": 2, "state": "open", "title": "place permission under each branch of bot permissions for discord docs", "updated_at": "2026-04-20T06:35:01Z" }, { "additions": 2368, "author": "BradGroux", "author_association": "MEMBER", "body_excerpt": "## Summary This patch stops transcript-only OpenClaw assistant artifacts from leaking back out through user-facing history surfaces. The concrete issue here is the delivery-mirror and gateway-injected assistant messages that are intentiona\u2026", "changed_files": 44, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69217", "created_at": "2026-04-20T05:54:06Z", "deletions": 841, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69217/files", "html_url": "https://github.com/openclaw/openclaw/pull/69217", "labels": [ "docs", "channel: discord", "channel: mattermost", "channel: msteams", "channel: telegram", "app: web-ui", "gateway", "scripts", "agents", "maintainer", "size: XL", "extensions: openai", "extensions: qa-lab" ], "merged": false, "number": 69217, "review_comments_count": 7, "state": "open", "title": "Hide transcript-only OpenClaw history artifacts", "updated_at": "2026-04-20T06:42:35Z" }, { "additions": 756, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - split gateway probe output into separate reachability, capability, and read-probe signals - rename default gateway status probe wording so connect-only success no longer implies full RPC/write health - update troubleshooting/d\u2026", "changed_files": 23, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69215", "created_at": "2026-04-20T05:49:46Z", "deletions": 72, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69215/files", "html_url": "https://github.com/openclaw/openclaw/pull/69215", "labels": [ "docs", "gateway", "cli", "commands", "maintainer", "size: L" ], "merged": true, "number": 69215, "review_comments_count": 4, "state": "closed", "title": "Split gateway probe capability from reachability", "updated_at": "2026-04-20T06:32:17Z" }, { "additions": 15, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #69160 When onboarding multiple providers sequentially, the second provider's was replacing entirely instead of merging with models from the first provider. ## Root Cause In , the field was being set directly to , which ov\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69213", "created_at": "2026-04-20T05:47:35Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69213/files", "html_url": "https://github.com/openclaw/openclaw/pull/69213", "labels": [ "size: XS", "r: too-many-prs" ], "merged": false, "number": 69213, "review_comments_count": 3, "state": "closed", "title": "fix: merge models from multiple providers instead of replacing", "updated_at": "2026-04-20T05:52:22Z" }, { "additions": 1078, "author": "Maaannnn", "author_association": "NONE", "body_excerpt": "## Summary - Support `encrypted_content` replay for `openai-completions` assistant/tool continuations. - Send `previous_response_id` for HTTP `openai-responses` / `openai-codex-responses` tool-only continuations. - Add mock transport paylo\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69212", "created_at": "2026-04-20T05:38:32Z", "deletions": 20, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69212/files", "html_url": "https://github.com/openclaw/openclaw/pull/69212", "labels": [ "agents", "size: XL" ], "merged": false, "number": 69212, "review_comments_count": 9, "state": "open", "title": "agents: replay encrypted_content for volcengine seed thinking summary", "updated_at": "2026-04-20T09:15:06Z" }, { "additions": 206, "author": "skylee-01", "author_association": "NONE", "body_excerpt": "## Summary - Problem: On Windows, the claude-cli provider passes the system prompt (~10K-30K+ chars) via `--append-system-prompt` as a CLI argument. Windows `CreateProcessW` has a ~32,767-char command-line limit, causing `spawn ENAMETOOLON\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69211", "created_at": "2026-04-20T05:35:47Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69211/files", "html_url": "https://github.com/openclaw/openclaw/pull/69211", "labels": [ "agents", "size: M" ], "merged": false, "number": 69211, "review_comments_count": 4, "state": "open", "title": "fix(agents): guard Windows CLI argv against ENAMETOOLONG by moving system prompt to stdin", "updated_at": "2026-04-20T05:42:53Z" }, { "additions": 884, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Doctor now reports device-pairing trouble states that previously left users stuck: pending pairing requests, pending role/scope upgrades, public-key mismatch repairs, paired-token drift, and stale local cached device tokens. It prints conc\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69210", "created_at": "2026-04-20T05:34:46Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69210/files", "html_url": "https://github.com/openclaw/openclaw/pull/69210", "labels": [ "docs", "gateway", "commands", "maintainer", "size: L" ], "merged": true, "number": 69210, "review_comments_count": 4, "state": "closed", "title": "fix: surface device pairing auth drift in doctor", "updated_at": "2026-04-20T06:10:20Z" }, { "additions": 576, "author": "everySympathy", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `memory-core` exposed no `dreaming.model` config, so Dream Diary narrative runs always inherited the session default model even when users wanted a separate model for dreaming. - Why it matters: users on rate-limited\u2026", "changed_files": 10, "cluster_id": "cluster-66583-2", "cluster_ids": [ "cluster-66583-2" ], "cluster_role": "canonical", "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69209", "created_at": "2026-04-20T05:29:40Z", "deletions": 58, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69209/files", "html_url": "https://github.com/openclaw/openclaw/pull/69209", "labels": [ "extensions: memory-core", "size: L" ], "merged": false, "number": 69209, "review_comments_count": 6, "state": "open", "title": "feat(memory-core): add dreaming.model override", "updated_at": "2026-04-20T07:05:24Z" }, { "additions": 8, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Switch the GitHub Copilot onboarding default from `gpt-4o` to `claude-opus-4.6` and keep the bundled default model list aligned with that choice. Testing: - pnpm test extensions/github-copilot/models.test.ts - pnpm test src/plugins/contrac\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69207", "created_at": "2026-04-20T05:24:53Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69207/files", "html_url": "https://github.com/openclaw/openclaw/pull/69207", "labels": [ "maintainer", "size: XS" ], "merged": true, "number": 69207, "review_comments_count": 0, "state": "closed", "title": "Default GitHub Copilot onboarding to Claude Opus 4.6", "updated_at": "2026-04-20T05:34:16Z" }, { "additions": 14, "author": "Sanjays2402", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** `SessionsSpawnToolSchema.streamTo` was declared without a description, so models with `runtime=\"subagent\"` routinely emit `streamTo: \"parent\"` on the first `sessions_spawn` attempt, get rejected server-side with `\u2026", "changed_files": 2, "cluster_id": "cluster-69166-3", "cluster_ids": [ "cluster-69166-3" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69203", "created_at": "2026-04-20T05:19:42Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69203/files", "html_url": "https://github.com/openclaw/openclaw/pull/69203", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69203, "review_comments_count": 0, "state": "open", "title": "fix(sessions-spawn): document runtime=\"acp\" requirement on streamTo schema", "updated_at": "2026-04-21T03:54:13Z" }, { "additions": 643, "author": "jaredar1232", "author_association": "NONE", "body_excerpt": "## Summary Spawned children from `sessions_spawn` lose thread context. The child's `deliveryContext` is persisted as `{\"channel\":\"slack\"}` with no `to` / `threadId`, so when the child replies the outbound adapter has no `thread_ts` and the\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 9, "conversation_url": "https://github.com/openclaw/openclaw/pull/69201", "created_at": "2026-04-20T05:07:25Z", "deletions": 19, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69201/files", "html_url": "https://github.com/openclaw/openclaw/pull/69201", "labels": [ "agents", "size: L" ], "merged": false, "number": 69201, "review_comments_count": 17, "state": "open", "title": "fix(spawn): propagate parent deliveryContext to sessions_spawn children", "updated_at": "2026-04-21T17:31:53Z" }, { "additions": 36, "author": "rrrrrredy", "author_association": "NONE", "body_excerpt": "## Summary - detect `node:sqlite` runtime failures in `buildMemorySearchUnavailableResult` - return a targeted SQLite-unavailable warning/action instead of the generic embedding/provider message - add a unit test that locks in the sqlite-m\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69199", "created_at": "2026-04-20T04:56:03Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69199/files", "html_url": "https://github.com/openclaw/openclaw/pull/69199", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 69199, "review_comments_count": 1, "state": "open", "title": "fix(memory): improve error message when node:sqlite is unavailable", "updated_at": "2026-04-20T05:14:30Z" }, { "additions": 165, "author": "omarshahine", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Add optional `systemPrompt` to the BlueBubbles per-group config and forward it into inbound context as `GroupSystemPrompt`, so configured per-group behavioral directives are injected into the agent's system prompt on every turn.\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69198", "created_at": "2026-04-20T04:50:25Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69198/files", "html_url": "https://github.com/openclaw/openclaw/pull/69198", "labels": [ "docs", "channel: bluebubbles", "scripts", "maintainer", "size: S" ], "merged": true, "number": 69198, "review_comments_count": 2, "state": "closed", "title": "bluebubbles: forward per-group systemPrompt into GroupSystemPrompt", "updated_at": "2026-04-21T03:01:23Z" }, { "additions": 10, "author": "altierac", "author_association": "NONE", "body_excerpt": "## Summary When a backgrounded exec command completes while `process(poll)` is actively waiting for it, `maybeNotifyOnExit()` fires a phantom \"Exec completed\" system event. The agent \u2014 often after context compaction \u2014 cannot correlate the\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69197", "created_at": "2026-04-20T04:47:55Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69197/files", "html_url": "https://github.com/openclaw/openclaw/pull/69197", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69197, "review_comments_count": 2, "state": "open", "title": "fix(exec): suppress ghost notifications when poll is actively consuming output", "updated_at": "2026-04-20T13:30:44Z" }, { "additions": 376, "author": "jaredar1232tetris", "author_association": "NONE", "body_excerpt": "## Summary When a router agent calls `sessions_spawn` to delegate to a top-level worker agent (configured in `openclaw.json` `agents.list`), the spawned worker's session is created with `deliveryContext: {\"channel\":\"slack\"}` only \u2014 no `to`\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69195", "created_at": "2026-04-20T04:41:16Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69195/files", "html_url": "https://github.com/openclaw/openclaw/pull/69195", "labels": [ "agents", "size: M" ], "merged": false, "number": 69195, "review_comments_count": 5, "state": "closed", "title": "fix(spawn): propagate parent deliveryContext to sessions_spawn children", "updated_at": "2026-04-20T04:48:08Z" }, { "additions": 2, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Problem **#68945** \u2014 `agents.defaults.humanDelay` has no effect on Telegram. Messages are sent immediately regardless of the configured delay, while all other channels respect it. ## Root Cause `dispatchTelegramMessage()` passes `dispat\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69194", "created_at": "2026-04-20T04:38:15Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69194/files", "html_url": "https://github.com/openclaw/openclaw/pull/69194", "labels": [ "channel: telegram", "size: XS" ], "merged": false, "number": 69194, "review_comments_count": 0, "state": "closed", "title": "fix(telegram): wire humanDelay into block-streaming dispatcher", "updated_at": "2026-04-20T21:41:40Z" }, { "additions": 248, "author": "omarshahine", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem BlueBubbles uses a hardcoded 10s timeout (`DEFAULT_TIMEOUT_MS = 10_000` in `extensions/bluebubbles/src/types.ts`) for every HTTP request, including outbound message sends via `/api/v1/message/text`. On macOS 26 (Tahoe), BlueBubb\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69193", "created_at": "2026-04-20T04:35:53Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69193/files", "html_url": "https://github.com/openclaw/openclaw/pull/69193", "labels": [ "docs", "channel: bluebubbles", "maintainer", "size: M" ], "merged": true, "number": 69193, "review_comments_count": 4, "state": "closed", "title": "fix(bluebubbles): configurable sendTimeoutMs, bump send default to 30s", "updated_at": "2026-04-20T17:14:04Z" }, { "additions": 28, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Telegram setup no longer offers `@username` resolution for `allowFrom`, which relied on an unsupported Bot API lookup path for DM users. Setup now requires numeric sender IDs and the Telegram docs/tests are aligned with that behavior.", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69191", "created_at": "2026-04-20T04:27:10Z", "deletions": 91, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69191/files", "html_url": "https://github.com/openclaw/openclaw/pull/69191", "labels": [ "docs", "channel: telegram", "maintainer", "size: S" ], "merged": true, "number": 69191, "review_comments_count": 0, "state": "closed", "title": "fix(telegram): require numeric allowFrom ids in setup", "updated_at": "2026-04-20T04:37:04Z" }, { "additions": 89, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem On Windows, the claude-cli provider passes the user prompt as a shell argument with `shell: true`. Windows has an 8191-character command-line limit, causing `ENAMETOOLONG` errors for long prompts. Fixes #69158 ## Solution - `res\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69179", "created_at": "2026-04-20T03:42:15Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69179/files", "html_url": "https://github.com/openclaw/openclaw/pull/69179", "labels": [ "agents", "size: S" ], "merged": false, "number": 69179, "review_comments_count": 0, "state": "closed", "title": "fix: pass claude-cli prompt via stdin to avoid Windows ENAMETOOLONG (#69158)", "updated_at": "2026-04-20T03:44:16Z" }, { "additions": 173, "author": "OwenYWT", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - try Ollama's existing experimental web_search endpoint first, then the stable local `/api/web_search` endpoint - when both local endpoints return 404 and an Ollama API key is configured, retry via `https://ollama.com/api/web_s\u2026", "changed_files": 2, "cluster_id": "cluster-69132-4", "cluster_ids": [ "cluster-69132-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69178", "created_at": "2026-04-20T03:33:30Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69178/files", "html_url": "https://github.com/openclaw/openclaw/pull/69178", "labels": [ "size: S" ], "merged": false, "number": 69178, "review_comments_count": 2, "state": "open", "title": "fix(ollama): fall back web search endpoints", "updated_at": "2026-04-20T04:38:10Z" }, { "additions": 25, "author": "skylee-01", "author_association": "NONE", "body_excerpt": "## Summary - Problem: The `session_status` tool always reports `0/131k (0%)` context usage because the `buildStatusText()` call in `session-status-tool.ts` does not pass the `contextTokens` parameter from the session entry. - Why it matter\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69177", "created_at": "2026-04-20T03:29:06Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69177/files", "html_url": "https://github.com/openclaw/openclaw/pull/69177", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69177, "review_comments_count": 0, "state": "open", "title": "fix(agents): pass contextTokens to buildStatusText in session_status tool", "updated_at": "2026-04-20T06:03:12Z" }, { "additions": 19, "author": "visormatt", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69176", "created_at": "2026-04-20T03:27:12Z", "deletions": 4, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69176/files", "html_url": "https://github.com/openclaw/openclaw/pull/69176", "labels": [ "docker", "size: XS" ], "merged": false, "number": 69176, "review_comments_count": 0, "state": "closed", "title": "chore: poking around", "updated_at": "2026-04-20T15:52:19Z" }, { "additions": 36, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes the bug where onboarding multiple providers overwrites instead of merging them, ensuring users can onboard multiple providers without losing previously configured models. ## Root Cause was replacing the entire object with\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69175", "created_at": "2026-04-20T03:25:25Z", "deletions": 14, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69175/files", "html_url": "https://github.com/openclaw/openclaw/pull/69175", "labels": [ "size: S", "r: too-many-prs" ], "merged": false, "number": 69175, "review_comments_count": 1, "state": "closed", "title": "fix: merge provider models instead of replacing on OAuth onboarding", "updated_at": "2026-04-20T03:31:39Z" }, { "additions": 545, "author": "Lee-Si-Yoon", "author_association": "NONE", "body_excerpt": "## Summary - Problem: No bundled FriendliAI provider \u2014 users had to configure it manually. - What changed: Added extensions/friendliai/ as a new bundled provider plugin: manifest, 8-model catalog (Llama, DeepSeek, Qwen3, GLM, K-EXAONE), AP\u2026", "changed_files": 12, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69174", "created_at": "2026-04-20T03:19:12Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69174/files", "html_url": "https://github.com/openclaw/openclaw/pull/69174", "labels": [ "docs", "size: M" ], "merged": false, "number": 69174, "review_comments_count": 12, "state": "open", "title": "feat: add FriendliAI model provider", "updated_at": "2026-04-21T08:41:30Z" }, { "additions": 10, "author": "omarshahine", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Unblocks the two baseline failures currently red on main. ### 1. `checks-node-agentic-agents-plugins` \u2014 broken by #68726 File: `src/agents/subagent-registry.steer-restart.test.ts:566` #68726 added `startedAt`/`endedAt`/`elapsedM\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69173", "created_at": "2026-04-20T03:18:55Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69173/files", "html_url": "https://github.com/openclaw/openclaw/pull/69173", "labels": [ "gateway", "agents", "maintainer", "size: XS" ], "merged": true, "number": 69173, "review_comments_count": 0, "state": "closed", "title": "test(agents,gateway): fix two main-baseline test breakages from #68726 and #65986", "updated_at": "2026-04-20T03:45:22Z" }, { "additions": 686, "author": "wongcyrus", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Upstream merge and refactor broke the custom endpoint and API type override features for Gemini across Search, Embeddings, Image Generation, and Media Understanding. - Why it matters: Users utilizing LiteLLM, OneAPI,\u2026", "changed_files": 19, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69172", "created_at": "2026-04-20T03:18:22Z", "deletions": 108, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69172/files", "html_url": "https://github.com/openclaw/openclaw/pull/69172", "labels": [ "scripts", "size: L", "extensions: anthropic", "extensions: byteplus", "extensions: volcengine" ], "merged": false, "number": 69172, "review_comments_count": 8, "state": "open", "title": "Fix/google overrides", "updated_at": "2026-04-21T05:35:54Z" }, { "additions": 17, "author": "vvitovec", "author_association": "NONE", "body_excerpt": "## Summary - document that `sessions_spawn.streamTo` requires `runtime=\"acp\"` - stop subagent callers from guessing `streamTo: \"parent\"` and paying for a guaranteed retry - add a schema regression test for the runtime hint ## Testing - `co\u2026", "changed_files": 2, "cluster_id": "cluster-69166-3", "cluster_ids": [ "cluster-69166-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69170", "created_at": "2026-04-20T03:04:43Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69170/files", "html_url": "https://github.com/openclaw/openclaw/pull/69170", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69170, "review_comments_count": 0, "state": "open", "title": "fix(agent): document that sessions_spawn streamTo is ACP-only", "updated_at": "2026-04-20T03:06:25Z" }, { "additions": 75, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #69160 When onboarding a second provider, `applyProviderAuthConfigPatch` was replacing `agents.defaults.models` entirely with the new provider's models instead of merging them. **Change:** In `src/plugins/provider-auth-choice-helpers\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69169", "created_at": "2026-04-20T03:04:33Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69169/files", "html_url": "https://github.com/openclaw/openclaw/pull/69169", "labels": [ "commands", "size: S" ], "merged": false, "number": 69169, "review_comments_count": 1, "state": "closed", "title": "fix: merge models on provider onboarding instead of replacing", "updated_at": "2026-04-20T03:43:37Z" }, { "additions": 21, "author": "JavieSanchezB", "author_association": "NONE", "body_excerpt": "\u2026ing in session lock inspection ## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: ): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 14400, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69149", "created_at": "2026-04-20T01:50:52Z", "deletions": 2755286, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69149/files", "html_url": "https://github.com/openclaw/openclaw/pull/69149", "labels": [ "docs", "channel: bluebubbles", "channel: discord", "channel: googlechat", "channel: imessage", "channel: line", "channel: matrix", "channel: mattermost", "channel: msteams", "channel: nextcloud-talk", "channel: nostr", "channel: signal", "channel: slack", "channel: telegram", "channel: tlon", "channel: whatsapp-web", "channel: zalo", "channel: zalouser", "app: android", "app: ios", "app: macos", "gateway", "extensions: copilot-proxy", "extensions: diagnostics-otel", "security", "docker", "channel: feishu", "channel: twitch", "extensions: device-pair", "channel: irc", "size: XL", "extensions: acpx", "extensions: anthropic", "extensions: cloudflare-ai-gateway", "extensions: byteplus", "extensions: huggingface", "extensions: fal", "extensions: duckduckgo", "extensions: deepseek", "channel: qqbot", "channel: qa-channel", "extensions: qa-lab", "extensions: arcee", "extensions: codex" ], "merged": false, "number": 69149, "review_comments_count": 0, "state": "closed", "title": "Fix/tui streaming desync", "updated_at": "2026-04-20T01:56:55Z" }, { "additions": 35, "author": "neeravmakwana", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary `installUnhandledRejectionHandler` in `src/infra/unhandled-rejections.ts` has three fatal-condition classifiers (`isFatalError`, `isConfigError`, `isAbortError`) and one transient classifier (`isTransientUnhandledRejectionError`\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69148", "created_at": "2026-04-20T01:49:44Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69148/files", "html_url": "https://github.com/openclaw/openclaw/pull/69148", "labels": [ "size: XS" ], "merged": false, "number": 69148, "review_comments_count": 0, "state": "open", "title": "Gateway/runtime: classify reasonless promise rejections as transient", "updated_at": "2026-04-20T12:08:22Z" }, { "additions": 60, "author": "CCcassiusdjs", "author_association": "NONE", "body_excerpt": "## Problem Running `openclaw update` while the gateway service is running causes three cascading failures (issue #66401): 1. **Gateway crash** \u2014 `npm install -g` overwrites JS files that are memory-mapped by the running Node.js process 2.\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69144", "created_at": "2026-04-20T01:29:23Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69144/files", "html_url": "https://github.com/openclaw/openclaw/pull/69144", "labels": [ "cli", "size: S" ], "merged": false, "number": 69144, "review_comments_count": 4, "state": "closed", "title": "fix: stop gateway service before npm install to prevent file lock conflicts (fixes #66401)", "updated_at": "2026-04-20T02:10:15Z" }, { "additions": 61, "author": "safrano9999", "author_association": "NONE", "body_excerpt": "## Summary - Problem: The Docker setup script builds `openclaw:local` (and the sandbox image) only for the host's native platform. Cross-building a Linux image from macOS for an airgapped Linux host isn't possible without editing the scrip\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69143", "created_at": "2026-04-20T01:26:34Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69143/files", "html_url": "https://github.com/openclaw/openclaw/pull/69143", "labels": [ "docs", "scripts", "docker", "size: S" ], "merged": false, "number": 69143, "review_comments_count": 1, "state": "open", "title": "Docker: add OPENCLAW_DOCKER_PLATFORM for cross-platform image builds", "updated_at": "2026-04-20T01:29:02Z" }, { "additions": 162, "author": "CCcassiusdjs", "author_association": "NONE", "body_excerpt": "## Problem Running `openclaw update` while the gateway service is running causes three cascading failures (issue #66401): 1. **Gateway crash** \u2014 `npm install -g` overwrites JS files that are memory-mapped by the running Node.js process, ca\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69140", "created_at": "2026-04-20T01:19:11Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69140/files", "html_url": "https://github.com/openclaw/openclaw/pull/69140", "labels": [ "cli", "size: S" ], "merged": false, "number": 69140, "review_comments_count": 5, "state": "open", "title": "fix: stop gateway service before npm install to prevent file lock conflicts (fixes #66401)", "updated_at": "2026-04-20T01:28:54Z" }, { "additions": 32, "author": "ztexydt-cqh", "author_association": "NONE", "body_excerpt": "Closes #69137 The Paperclip sends a root-level object in every payload, but OpenClaw's rejected it because is . This broke the documented Paperclip integration end-to-end after onboarding/auth succeeded. - Add to - Add a test verifying the\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69139", "created_at": "2026-04-20T01:18:55Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69139/files", "html_url": "https://github.com/openclaw/openclaw/pull/69139", "labels": [ "app: web-ui", "gateway", "size: XS" ], "merged": false, "number": 69139, "review_comments_count": 0, "state": "open", "title": "fix(gateway): accept Paperclip adapter root-level paperclip metadata in agent params", "updated_at": "2026-04-20T01:59:44Z" }, { "additions": 13, "author": "MoerAI", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary `memoryFlush` only fires on every other auto-compaction cycle instead of every cycle. The dedup logic falsely skips the flush because `memoryFlushCompactionCount` is set to the post-increment compaction count. ## Root Cause In `\u2026", "changed_files": 2, "cluster_id": "cluster-12590-3", "cluster_ids": [ "cluster-12590-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69138", "created_at": "2026-04-20T01:18:49Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69138/files", "html_url": "https://github.com/openclaw/openclaw/pull/69138", "labels": [ "size: XS" ], "merged": false, "number": 69138, "review_comments_count": 0, "state": "open", "title": "fix(memory): preserve pre-increment compaction count in memoryFlushCompactionCount (#12590)", "updated_at": "2026-04-20T01:21:52Z" }, { "additions": 0, "author": "CCcassiusdjs", "author_association": "NONE", "body_excerpt": "## Problem Running `openclaw update` while the gateway service is running causes three cascading failures (issue #66401): 1. **Gateway crash** \u2014 `npm install -g` overwrites JS files that are memory-mapped by the running Node.js process, ca\u2026", "changed_files": 14400, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69136", "created_at": "2026-04-20T01:10:13Z", "deletions": 2755286, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69136/files", "html_url": "https://github.com/openclaw/openclaw/pull/69136", "labels": [ "docs", "channel: bluebubbles", "channel: discord", "channel: googlechat", "channel: imessage", "channel: line", "channel: matrix", "channel: mattermost", "channel: msteams", "channel: nextcloud-talk", "channel: nostr", "channel: signal", "channel: slack", "channel: telegram", "channel: tlon", "channel: whatsapp-web", "channel: zalo", "channel: zalouser", "app: android", "app: ios", "app: macos", "gateway", "extensions: copilot-proxy", "extensions: diagnostics-otel", "security", "docker", "channel: feishu", "channel: twitch", "extensions: device-pair", "channel: irc", "size: XL", "extensions: acpx", "extensions: anthropic", "extensions: cloudflare-ai-gateway", "extensions: byteplus", "extensions: huggingface", "extensions: fal", "extensions: duckduckgo", "extensions: deepseek", "channel: qqbot", "channel: qa-channel", "extensions: qa-lab", "extensions: arcee", "extensions: codex" ], "merged": false, "number": 69136, "review_comments_count": 0, "state": "closed", "title": "fix: stop gateway service before npm install to prevent file lock conflicts (fixes #66401)", "updated_at": "2026-04-20T01:18:14Z" }, { "additions": 1, "author": "ztexydt-cqh", "author_association": "NONE", "body_excerpt": "Closes #69101 The Slack WebClient defaults to maxRequestConcurrency: 100, which allows later chat.postMessage requests to complete before earlier ones when sent in rapid succession. This causes messages to arrive out of order on Slack clie\u2026", "changed_files": 1, "cluster_id": "cluster-69101-3", "cluster_ids": [ "cluster-69101-3" ], "cluster_role": "canonical", "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69134", "created_at": "2026-04-20T01:05:05Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69134/files", "html_url": "https://github.com/openclaw/openclaw/pull/69134", "labels": [ "channel: slack", "size: XS" ], "merged": false, "number": 69134, "review_comments_count": 3, "state": "open", "title": "fix(slack): enforce maxRequestConcurrency=1 to preserve message ordering", "updated_at": "2026-04-21T12:01:50Z" }, { "additions": 13, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "When multiple concurrent openclaw agent --session-id calls target the same session while a turn is in progress, callers could be silently dropped. This fix checks for an active turn before entering the actor queue and throws an AcpRuntimeE\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69133", "created_at": "2026-04-20T01:04:22Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69133/files", "html_url": "https://github.com/openclaw/openclaw/pull/69133", "labels": [ "size: XS" ], "merged": false, "number": 69133, "review_comments_count": 4, "state": "closed", "title": "fix(acp): return SESSION_BUSY error when concurrent calls hit active session", "updated_at": "2026-04-20T01:11:58Z" }, { "additions": 20, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes the OpenRouter setup wizard writing the wrong baseUrl. The setup now correctly writes `https://openrouter.ai/api/v1` instead of leaving the provider config incomplete. ## Root Cause The `applyOpenrouterConfig` function in\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69130", "created_at": "2026-04-20T00:52:06Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69130/files", "html_url": "https://github.com/openclaw/openclaw/pull/69130", "labels": [ "size: XS", "r: too-many-prs" ], "merged": false, "number": 69130, "review_comments_count": 0, "state": "closed", "title": "fix: OpenRouter setup writes correct baseUrl", "updated_at": "2026-04-20T00:54:36Z" }, { "additions": 12, "author": "mbs-vhs", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** `shouldShortCircuitToRealtimeTwiml` in `extensions/voice-call/src/webhook.ts` gates the realtime TwiML path to only inbound directions. Outbound calls fall through to `decideTwimlResponse`, which on a realtime-onl\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69129", "created_at": "2026-04-20T00:45:46Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69129/files", "html_url": "https://github.com/openclaw/openclaw/pull/69129", "labels": [ "channel: voice-call", "size: XS" ], "merged": false, "number": 69129, "review_comments_count": 2, "state": "open", "title": "fix(voice-call): allow realtime short-circuit for outbound directions", "updated_at": "2026-04-21T12:08:05Z" }, { "additions": 2, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Summary Telegram was the only channel not passing `humanDelay` config to the reply dispatcher, so `agents.defaults.humanDelay` (and per-agent overrides) had zero effect on Telegram block streaming. Messages would arrive back-to-back ins\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69127", "created_at": "2026-04-20T00:38:36Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69127/files", "html_url": "https://github.com/openclaw/openclaw/pull/69127", "labels": [ "channel: telegram", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69127, "review_comments_count": 0, "state": "closed", "title": "fix(telegram): wire humanDelay into block-streaming dispatcher", "updated_at": "2026-04-20T00:39:40Z" }, { "additions": 28, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #69081 Two related bugs in the TUI's streaming-status handling: **Bug 1 \u2014 False idle during tool calls:** The streaming watchdog only rearmed on chat `delta` events, not tool events. Long tool calls (>30s) without chat deltas trigger\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69125", "created_at": "2026-04-20T00:20:47Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69125/files", "html_url": "https://github.com/openclaw/openclaw/pull/69125", "labels": [ "size: XS" ], "merged": false, "number": 69125, "review_comments_count": 1, "state": "closed", "title": "fix(tui): rearm streaming watchdog on tool events and reset state on reconnect", "updated_at": "2026-04-20T02:05:49Z" }, { "additions": 59, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #69077 When OpenClaw runs as a macOS LaunchDaemon under a service user whose login shell is `/usr/bin/false`, `process.env.SHELL` inherits that value. Node's `child_process` then uses it as the shell for exec commands, which immediat\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69124", "created_at": "2026-04-20T00:17:16Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69124/files", "html_url": "https://github.com/openclaw/openclaw/pull/69124", "labels": [ "agents", "size: S" ], "merged": false, "number": 69124, "review_comments_count": 1, "state": "closed", "title": "fix(exec): fallback to /bin/sh when SHELL is non-functional (e.g. /usr/bin/false)", "updated_at": "2026-04-20T02:05:44Z" }, { "additions": 62, "author": "LightDriverCS", "author_association": "NONE", "body_excerpt": "## Summary - Make `agents.defaults.cliBackends..command` optional at both the zod schema level (`CliBackendSchema`) and the TS-type level (`CliBackendConfig`). - Introduce `ResolvedCliBackendConfig` with `command: string` so dow\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69123", "created_at": "2026-04-20T00:08:59Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69123/files", "html_url": "https://github.com/openclaw/openclaw/pull/69123", "labels": [ "agents", "size: S" ], "merged": false, "number": 69123, "review_comments_count": 2, "state": "open", "title": "fix(config): accept partial cliBackends overrides by making command optional", "updated_at": "2026-04-20T00:13:53Z" }, { "additions": 737, "author": "joshavant", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - make `openclaw qa suite` fail by default on scenario failures, with `--allow-failures` as an explicit artifact-only override - apply the same fail-by-default behavior to `openclaw qa telegram`, wired through the shared live-tr\u2026", "changed_files": 21, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69122", "created_at": "2026-04-20T00:03:12Z", "deletions": 37, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69122/files", "html_url": "https://github.com/openclaw/openclaw/pull/69122", "labels": [ "docs", "maintainer", "size: L", "extensions: qa-lab" ], "merged": true, "number": 69122, "review_comments_count": 0, "state": "closed", "title": "qa-lab: make live lanes CI-ready for v1 E2E automation", "updated_at": "2026-04-20T03:20:09Z" }, { "additions": 418, "author": "alexlomt", "author_association": "NONE", "body_excerpt": "## Summary Restart deferral already waits for queued work before the gateway begins shutting down, but there is still a second race during `server.close()`: pending reply dispatchers and active chat runs can still be in flight while the re\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69121", "created_at": "2026-04-19T23:52:01Z", "deletions": 116, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69121/files", "html_url": "https://github.com/openclaw/openclaw/pull/69121", "labels": [ "gateway", "cli", "agents", "size: L" ], "merged": false, "number": 69121, "review_comments_count": 2, "state": "open", "title": "fix(gateway): drain pending replies before restart shutdown", "updated_at": "2026-04-20T00:57:19Z" }, { "additions": 2399, "author": "ridermw", "author_association": "NONE", "body_excerpt": "## Summary Adds `extensions/copilot-sdk/`, a bundled **opt-in** provider plugin that lets OpenClaw use a user's GitHub Copilot CLI subscription as the model backend \u2014 no API keys, no separate provider credentials. It spawns `@github/copilo\u2026", "changed_files": 17, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69116", "created_at": "2026-04-19T23:27:46Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69116/files", "html_url": "https://github.com/openclaw/openclaw/pull/69116", "labels": [ "scripts", "size: XL" ], "merged": false, "number": 69116, "review_comments_count": 21, "state": "open", "title": "CopilotSdk: add @github/copilot-sdk-backed provider plugin", "updated_at": "2026-04-20T21:05:17Z" }, { "additions": 16, "author": "jckm14", "author_association": "NONE", "body_excerpt": "## Summary - fall back to `corepack pnpm` when plain `pnpm` is not on PATH in the pre-commit hook - keep the existing repo-wide `check` gate behavior unchanged when `pnpm` is available ## Why This makes local commits more resilient on host\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69115", "created_at": "2026-04-19T23:10:53Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69115/files", "html_url": "https://github.com/openclaw/openclaw/pull/69115", "labels": [ "size: XS" ], "merged": false, "number": 69115, "review_comments_count": 3, "state": "open", "title": "git-hooks: fall back to corepack pnpm in pre-commit", "updated_at": "2026-04-21T17:28:47Z" }, { "additions": 142, "author": "BKF-Gitty", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `BOOTSTRAP_HEAD_RATIO` (0.7) + `BOOTSTRAP_TAIL_RATIO` (0.2) = 0.9. Every truncated bootstrap file silently loses 10% of its character budget with no explanation. At the default 12,000 char limit, that's 1,200 chars lo\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69114", "created_at": "2026-04-19T23:09:43Z", "deletions": 23, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69114/files", "html_url": "https://github.com/openclaw/openclaw/pull/69114", "labels": [ "agents", "size: S" ], "merged": true, "number": 69114, "review_comments_count": 7, "state": "closed", "title": "fix(bootstrap): close silent 10% content gap in trim ratios", "updated_at": "2026-04-20T21:20:31Z" }, { "additions": 29166, "author": "horsenuggets", "author_association": "NONE", "body_excerpt": "## Summary - Fix Terraform repo settings to match the actual GitHub repo config (pages, visibility, merge settings) - Add `.tfstate`, `.terraform/`, and `.terraform.lock.hcl` to `.gitignore` ## Test plan - [x] `terraform plan` shows no une\u2026", "changed_files": 255, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69113", "created_at": "2026-04-19T22:59:55Z", "deletions": 637, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69113/files", "html_url": "https://github.com/openclaw/openclaw/pull/69113", "labels": [ "docs", "app: web-ui", "gateway", "cli", "scripts", "commands", "docker", "agents", "size: XL" ], "merged": false, "number": 69113, "review_comments_count": 0, "state": "closed", "title": "Terraform: fix repo settings to match existing, add tfstate to gitignore", "updated_at": "2026-04-19T23:11:27Z" }, { "additions": 61, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem \\`sessionFileHasContent\\` in \\`src/agents/command/attempt-execution.helpers.ts\\` returned \\`true\\` as soon as it saw ANY assistant message anywhere in the flushed session transcript. The fallback-retry path uses that boolean as\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69109", "created_at": "2026-04-19T22:33:34Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69109/files", "html_url": "https://github.com/openclaw/openclaw/pull/69109", "labels": [ "agents", "size: S" ], "merged": false, "number": 69109, "review_comments_count": 1, "state": "closed", "title": "fix(agents): scope attempt-execution session-history guard to latest-user-answered", "updated_at": "2026-04-20T19:15:29Z" }, { "additions": 143, "author": "pmcholding", "author_association": "NONE", "body_excerpt": "## Problem `openclaw agent --agent --session-id ` silently collapses every caller into the same `agent::main` session. Parallel workflows, batch scripts, and eval harnesses that pass distinct `--session-id` UUIDs per caller\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69108", "created_at": "2026-04-19T22:30:45Z", "deletions": 38, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69108/files", "html_url": "https://github.com/openclaw/openclaw/pull/69108", "labels": [ "cli", "commands", "agents", "size: S" ], "merged": false, "number": 69108, "review_comments_count": 0, "state": "open", "title": "fix(agent): honor --session-id when --agent is present + add --new-session flag", "updated_at": "2026-04-19T22:30:59Z" }, { "additions": 2204, "author": "ljluestc", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69106", "created_at": "2026-04-19T22:25:26Z", "deletions": 0, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69106/files", "html_url": "https://github.com/openclaw/openclaw/pull/69106", "labels": [ "scripts", "size: XL" ], "merged": false, "number": 69106, "review_comments_count": 0, "state": "open", "title": "test(observability): add ingestor QA integration suite", "updated_at": "2026-04-19T22:25:39Z" }, { "additions": 13, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes openclaw#69101 When OpenClaw sends multiple Slack messages in rapid succession, messages frequently arrive on the Slack client in an order different from the order they were sent. ## Root Cause The underlying @slack/web-ap\u2026", "changed_files": 2, "cluster_id": "cluster-69101-3", "cluster_ids": [ "cluster-69101-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69105", "created_at": "2026-04-19T22:24:42Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69105/files", "html_url": "https://github.com/openclaw/openclaw/pull/69105", "labels": [ "channel: slack", "size: XS" ], "merged": false, "number": 69105, "review_comments_count": 3, "state": "open", "title": "fix(slack): ensure message ordering by setting maxRequestConcurrency to 1", "updated_at": "2026-04-21T12:02:34Z" }, { "additions": 3492, "author": "LightDriverCS", "author_association": "NONE", "body_excerpt": "## Summary Daily canon entries (`canon/YYYY-MM-DD.md`) now emit `pageType`, `id`, `status`, `createdAt`, `updatedAt`, `sourceIds`, `tags` in addition to the existing `kind/date/title` fields. Backward-compatible (keeps `kind: canon` and `d\u2026", "changed_files": 33, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69100", "created_at": "2026-04-19T21:45:16Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69100/files", "html_url": "https://github.com/openclaw/openclaw/pull/69100", "labels": [ "extensions: memory-core", "size: XL", "extensions: memory-wiki" ], "merged": false, "number": 69100, "review_comments_count": 3, "state": "closed", "title": "fix(dreaming): fleet-canon emits openclaw-required frontmatter", "updated_at": "2026-04-20T01:44:35Z" }, { "additions": 260, "author": "MohandesD", "author_association": "NONE", "body_excerpt": "Implements xAI TTS via the OpenAI-compatible bridge at /v1, points local TTS config at that endpoint, and adds tests for the bridge path.", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69096", "created_at": "2026-04-19T21:33:06Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69096/files", "html_url": "https://github.com/openclaw/openclaw/pull/69096", "labels": [ "gateway", "size: M" ], "merged": false, "number": 69096, "review_comments_count": 2, "state": "closed", "title": "feat(tts): add xAI OpenAI-compatible bridge", "updated_at": "2026-04-19T21:36:07Z" }, { "additions": 77, "author": "Bortlesboat", "author_association": "NONE", "body_excerpt": "## Summary - re-check runtime-deps fingerprint entries with `lstatSync()` before calling `readlinkSync()` - add a regression for Windows directory entries that look symlink-like at the `Dirent` layer but are regular files underneath ## Rep\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69093", "created_at": "2026-04-19T21:24:32Z", "deletions": 6, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69093/files", "html_url": "https://github.com/openclaw/openclaw/pull/69093", "labels": [ "scripts", "size: S" ], "merged": false, "number": 69093, "review_comments_count": 0, "state": "open", "title": "build: avoid readlink crashes in Windows runtime deps fingerprinting", "updated_at": "2026-04-19T21:24:44Z" }, { "additions": 32, "author": "CoKeFish", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** When `finalizeTransportStream` / the OpenAI Responses transport detects `output.stopReason === \"error\"` with a concrete `output.errorMessage` (e.g. `Provider finish_reason: MALFORMED_FUNCTION_CALL`), the subsequen\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69091", "created_at": "2026-04-19T21:22:26Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69091/files", "html_url": "https://github.com/openclaw/openclaw/pull/69091", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69091, "review_comments_count": 0, "state": "open", "title": "fix(agents): propagate provider errorMessage in transport stream throws", "updated_at": "2026-04-19T21:24:17Z" }, { "additions": 324, "author": "DevInvestor", "author_association": "NONE", "body_excerpt": "## Summary - skip eager context-window warmup for `openclaw security ...` commands - use bundled channel setup plugins for security-audit channel checks when they expose the required readonly audit surface - add regression coverage for the\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69090", "created_at": "2026-04-19T21:12:55Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69090/files", "html_url": "https://github.com/openclaw/openclaw/pull/69090", "labels": [ "agents", "size: M" ], "merged": false, "number": 69090, "review_comments_count": 5, "state": "open", "title": "Fix security audit startup and configured-channel loading", "updated_at": "2026-04-19T22:51:09Z" }, { "additions": 36, "author": "bottenbenny", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #48992 The refreshGatewayServiceEnv flag was only set when the gateway service was already loaded, causing the LaunchAgent to not be refreshed during npm updates when the service wasn't running at the time of update. ## Changes - Mov\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69089", "created_at": "2026-04-19T21:03:28Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69089/files", "html_url": "https://github.com/openclaw/openclaw/pull/69089", "labels": [ "cli", "size: XS" ], "merged": false, "number": 69089, "review_comments_count": 1, "state": "open", "title": "fix(update): move refreshGatewayServiceEnv assignment outside isLoaded() check", "updated_at": "2026-04-19T21:07:47Z" }, { "additions": 347, "author": "DevInvestor", "author_association": "NONE", "body_excerpt": "## Summary - skip eager context-window warmup for `openclaw security ...` commands - use bundled channel setup plugins for security-audit channel checks when they expose the required readonly audit surface - add regression coverage for the\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69087", "created_at": "2026-04-19T20:55:56Z", "deletions": 44, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69087/files", "html_url": "https://github.com/openclaw/openclaw/pull/69087", "labels": [ "commands", "agents", "size: M" ], "merged": false, "number": 69087, "review_comments_count": 3, "state": "closed", "title": "Fix security audit startup and configured-channel loading", "updated_at": "2026-04-19T21:13:08Z" }, { "additions": 26, "author": "Jmarzab", "author_association": "NONE", "body_excerpt": "## Summary ## Problem Heartbeat-generated agent output could still appear in webchat even when `channels.defaults.heartbeat.showAlerts = false`. ## Why it matters It adds noisy system text to the visible chat transcript and makes it harder\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69084", "created_at": "2026-04-19T20:02:16Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69084/files", "html_url": "https://github.com/openclaw/openclaw/pull/69084", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 69084, "review_comments_count": 3, "state": "open", "title": "fix(webchat): hide heartbeat chat output using showAlerts", "updated_at": "2026-04-19T20:39:14Z" }, { "additions": 321, "author": "Komzpa", "author_association": "NONE", "body_excerpt": "## Summary - Problem: manually cancelled exec/process sessions were surfaced like failures, which could produce false failed-tool state and notify-on-exit wakeups. - Why it matters: user-requested cancellation is an expected control action\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69076", "created_at": "2026-04-19T19:29:53Z", "deletions": 40, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69076/files", "html_url": "https://github.com/openclaw/openclaw/pull/69076", "labels": [ "channel: telegram", "agents", "size: M" ], "merged": false, "number": 69076, "review_comments_count": 0, "state": "open", "title": "[codex] classify manual cancellations as killed", "updated_at": "2026-04-19T20:24:35Z" }, { "additions": 305, "author": "Anonymous-paper-page", "author_association": "NONE", "body_excerpt": "## Summary Adds `@openclaw/speech-hands-provider`, a new `MediaUnderstandingProvider` with `capabilities: [\"audio\"]`. It routes audio transcription through the **Speech-Hands** self-reflection pipeline: a user-hosted inference server runs\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/69073", "created_at": "2026-04-19T19:15:02Z", "deletions": 0, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69073/files", "html_url": "https://github.com/openclaw/openclaw/pull/69073", "labels": [ "size: M" ], "merged": false, "number": 69073, "review_comments_count": 0, "state": "open", "title": "Add @openclaw/speech-hands-provider: self-reflection ASR media-understanding provider", "updated_at": "2026-04-19T19:15:17Z" }, { "additions": 130, "author": "ayeshakhalid192007-dev", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** After the Codex plugin finishes a turn, follow-up messages on the same session queue forever. The gateway never releases the `session:agent:main:` lane lock. - **Why it matters:** Users can send exactly o\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69072", "created_at": "2026-04-19T19:04:24Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69072/files", "html_url": "https://github.com/openclaw/openclaw/pull/69072", "labels": [ "size: S", "extensions: codex" ], "merged": true, "number": 69072, "review_comments_count": 1, "state": "closed", "title": "fix(codex/app-server): release session lane when projector throws on turn/completed", "updated_at": "2026-04-20T23:51:22Z" }, { "additions": 140, "author": "omarshahine", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Two related BlueBubbles send-reliability fixes in one small change to `resolvePrivateApiDecision` and the outbound payload in `sendMessageBlueBubbles`. ### 1. Always set `method` explicitly on `/api/v1/message/text` payloads (#6\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/69070", "created_at": "2026-04-19T18:53:43Z", "deletions": 22, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69070/files", "html_url": "https://github.com/openclaw/openclaw/pull/69070", "labels": [ "channel: bluebubbles", "scripts", "maintainer", "size: S" ], "merged": true, "number": 69070, "review_comments_count": 1, "state": "closed", "title": "bluebubbles: always set method explicitly on text sends, force Private API on macOS 26", "updated_at": "2026-04-19T20:49:36Z" }, { "additions": 11, "author": "Jonahdu", "author_association": "NONE", "body_excerpt": "## What When `appendSlackStream` throws (e.g. `missing_recipient_user_id`), the `catch` block calls `deliverNormally` without checking `deliveryTracker.hasDelivered()`. This causes the same payload to be sent twice: once via the streaming\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69063", "created_at": "2026-04-19T18:26:27Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69063/files", "html_url": "https://github.com/openclaw/openclaw/pull/69063", "labels": [ "channel: slack", "size: XS" ], "merged": false, "number": 69063, "review_comments_count": 4, "state": "open", "title": "fix(slack): dedupe delivery in streaming fallback catch path", "updated_at": "2026-04-19T19:09:32Z" }, { "additions": 1524, "author": "chaiyaphum", "author_association": "NONE", "body_excerpt": "## Summary Introduces **B-FIA** (Biggo Financial Intelligence Agent), a stock-analysis plugin with two parts: - **`agents/b-fia/`** \u2014 Python FastAPI backend on port 8321. Orchestrates 3 independent services concurrently: market data (yfina\u2026", "changed_files": 28, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69061", "created_at": "2026-04-19T18:21:08Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69061/files", "html_url": "https://github.com/openclaw/openclaw/pull/69061", "labels": [ "size: XL" ], "merged": false, "number": 69061, "review_comments_count": 3, "state": "closed", "title": "b-fia: stock analysis plugin (Python backend + tools)", "updated_at": "2026-04-19T18:24:03Z" }, { "additions": 23, "author": "JustInCache", "author_association": "NONE", "body_excerpt": "## Summary Partially addresses #68920 (the QMD re-index overhead component). Every `/v1/chat/completions` call that omits the OpenAI `user` field receives a fresh random-UUID session key. This triggers a full QMD re-index on each request,\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69060", "created_at": "2026-04-19T18:19:07Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69060/files", "html_url": "https://github.com/openclaw/openclaw/pull/69060", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 69060, "review_comments_count": 1, "state": "open", "title": "fix: add x-openclaw-session header for stable agent-scoped HTTP sessions", "updated_at": "2026-04-20T07:19:11Z" }, { "additions": 62, "author": "JustInCache", "author_association": "NONE", "body_excerpt": "## Summary Fixes #68892. On Windows, `node:sqlite`'s `DatabaseSync.loadExtension()` may require the shared-library path **without** the platform suffix so SQLite can append it automatically \u2014 the same convention already used on Linux (`.so\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69059", "created_at": "2026-04-19T18:18:47Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69059/files", "html_url": "https://github.com/openclaw/openclaw/pull/69059", "labels": [ "size: S" ], "merged": false, "number": 69059, "review_comments_count": 3, "state": "open", "title": "fix: retry sqlite-vec load without .dll suffix on Windows", "updated_at": "2026-04-20T07:26:45Z" }, { "additions": 38, "author": "CuzG-lab", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** when an upstream streaming endpoint (observed: Grok-Vertex `streamGenerateContent`) drops the fetch body mid-response, Node/undici throws `TypeError: terminated`. The bare word `\"terminated\"` isn't in any classifi\u2026", "changed_files": 2, "cluster_id": "cluster-69058-3", "cluster_ids": [ "cluster-69058-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69058", "created_at": "2026-04-19T18:16:39Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69058/files", "html_url": "https://github.com/openclaw/openclaw/pull/69058", "labels": [ "agents", "size: XS" ], "merged": false, "number": 69058, "review_comments_count": 2, "state": "open", "title": "agents: classify undici stream-terminated errors as timeout", "updated_at": "2026-04-19T18:19:32Z" }, { "additions": 145, "author": "Thatgfsj", "author_association": "NONE", "body_excerpt": "## Summary - **Bug**: `openclaw gateway restart` fails on Windows with `TypeError [ERR_UNKNOWN_SIGNAL]: Unknown signal: SIGUSR1` - **Root cause**: `process.kill(pid, \"SIGUSR1\")` throws on Windows because SIGUSR1 is a Unix-only signal not s\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/69056", "created_at": "2026-04-19T18:15:30Z", "deletions": 107, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69056/files", "html_url": "https://github.com/openclaw/openclaw/pull/69056", "labels": [ "size: M" ], "merged": false, "number": 69056, "review_comments_count": 15, "state": "open", "title": "fix(gateway): handle SIGUSR1 gracefully on Windows", "updated_at": "2026-04-21T17:45:12Z" }, { "additions": 205, "author": "maor-eini", "author_association": "NONE", "body_excerpt": "## Summary - Avoid restoring creds.json.bak over a just-touched Baileys creds.json during active WhatsApp writes. - Process recent non-notify Baileys upsert messages while skipping stale history/sync upserts. - Keep WhatsApp gateway connec\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69052", "created_at": "2026-04-19T18:04:36Z", "deletions": 17, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/69052/files", "html_url": "https://github.com/openclaw/openclaw/pull/69052", "labels": [ "channel: whatsapp-web", "size: M" ], "merged": false, "number": 69052, "review_comments_count": 0, "state": "closed", "title": "fix(whatsapp): harden auth restore and clean inbound prompts", "updated_at": "2026-04-19T18:22:21Z" }, { "additions": 1626, "author": "100yenadmin", "author_association": "CONTRIBUTOR", "body_excerpt": "## What This PR Is This PR introduces **Personality Mode V2**: a session-scoped voice-translation layer for the main OpenClaw agent. When enabled, the agent is asked to do one additional thing before it delivers its final answer: **rewrite\u2026", "changed_files": 85, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69051", "created_at": "2026-04-19T18:02:55Z", "deletions": 94, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69051/files", "html_url": "https://github.com/openclaw/openclaw/pull/69051", "labels": [ "docs", "app: macos", "app: web-ui", "gateway", "commands", "agents", "size: XL" ], "merged": false, "number": 69051, "review_comments_count": 60, "state": "open", "title": "Personality Mode V2 Upgrade + V3 Eleven Labs Comptability", "updated_at": "2026-04-20T15:07:50Z" }, { "additions": 2, "author": "chrisabad", "author_association": "NONE", "body_excerpt": "## Summary - Add `ui:build` step to `BUILD_ALL_STEPS` in `scripts/build-all.mjs` - Add `ui:build` to the `ciArtifacts` profile Without this step, `pnpm build` rebuilds `dist/` but never produces `dist/control-ui/`, so the gateway serves a\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69050", "created_at": "2026-04-19T18:02:18Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69050/files", "html_url": "https://github.com/openclaw/openclaw/pull/69050", "labels": [ "scripts", "size: XS" ], "merged": false, "number": 69050, "review_comments_count": 0, "state": "open", "title": "scripts: include ui:build in build-all pipeline", "updated_at": "2026-04-19T18:02:58Z" }, { "additions": 107, "author": "frankhli843", "author_association": "NONE", "body_excerpt": "Closes #69044 ## Summary `getBundledChannelPluginForRoot` reads `plugin.id` immediately after calling `entry.loadChannelPlugin()`. The function is typed as `() => ChannelPlugin` but a malformed or legacy bundled plugin module can still ret\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69049", "created_at": "2026-04-19T18:00:32Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69049/files", "html_url": "https://github.com/openclaw/openclaw/pull/69049", "labels": [ "size: S" ], "merged": false, "number": 69049, "review_comments_count": 2, "state": "open", "title": "fix(channels): null-check loadChannelPlugin result in bundled loader", "updated_at": "2026-04-19T18:04:05Z" }, { "additions": 145, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Keeps cron delivery validation aligned with actual runtime behavior. Fixes the two follow-ups from #69015: disabled channels no longer create false ambiguity, and delivery patch validation now uses the live cron service default agent.", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69040", "created_at": "2026-04-19T17:37:54Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69040/files", "html_url": "https://github.com/openclaw/openclaw/pull/69040", "labels": [ "gateway", "maintainer", "size: S" ], "merged": true, "number": 69040, "review_comments_count": 0, "state": "closed", "title": "fix(gateway): preserve cron delivery validation semantics", "updated_at": "2026-04-19T17:48:46Z" }, { "additions": 2659, "author": "sallyom", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: OpenClaw calls MCP servers, but ignores MCP Apps UI metadata/resources - Why it matters: MCP Apps turns trusted MCP servers into richer tool providers with purpose-built UI. Without host support, OpenClaw misses that\u2026", "changed_files": 48, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69039", "created_at": "2026-04-19T17:37:43Z", "deletions": 197, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69039/files", "html_url": "https://github.com/openclaw/openclaw/pull/69039", "labels": [ "docs", "app: web-ui", "gateway", "agents", "maintainer", "size: XL" ], "merged": false, "number": 69039, "review_comments_count": 8, "state": "open", "title": "add option for MCP apps support", "updated_at": "2026-04-20T01:58:03Z" }, { "additions": 15, "author": "hieptuanle", "author_association": "NONE", "body_excerpt": "## Summary Fixes #68113 - Mattermost slash command callbacks always returned 503 (\"not yet initialized\") even after successful registration, because `accountStates` in `slash-state.ts` was a plain module-level `Map` that got instantiated t\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69038", "created_at": "2026-04-19T17:31:20Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69038/files", "html_url": "https://github.com/openclaw/openclaw/pull/69038", "labels": [ "channel: mattermost", "size: XS" ], "merged": false, "number": 69038, "review_comments_count": 0, "state": "open", "title": "fix(mattermost): anchor slash command state to globalThis to fix dual-instance 503s", "updated_at": "2026-04-19T17:34:52Z" }, { "additions": 136, "author": "alexlomt", "author_association": "NONE", "body_excerpt": "## Summary - stop counting `toolResult.details` toward preemptive context overflow estimation - cap oversized top-level detail payload fields during persistence using the same truncation notice path - add regression coverage for the false-\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69033", "created_at": "2026-04-19T17:24:30Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69033/files", "html_url": "https://github.com/openclaw/openclaw/pull/69033", "labels": [ "agents", "size: S" ], "merged": false, "number": 69033, "review_comments_count": 0, "state": "open", "title": "fix: cap tool-result details without false overflow", "updated_at": "2026-04-19T17:26:47Z" }, { "additions": 96, "author": "jaoa12or", "author_association": "NONE", "body_excerpt": "\u2026slation Implements heartbeat.trigger gateway method so Paperclip can fire agent heartbeats directly via the OpenClaw gateway instead of relying on the internal heartbeat scheduler. Also translates container-internal workspace paths to Doc\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69032", "created_at": "2026-04-19T17:17:50Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69032/files", "html_url": "https://github.com/openclaw/openclaw/pull/69032", "labels": [ "app: web-ui", "gateway", "docker", "agents", "size: S" ], "merged": false, "number": 69032, "review_comments_count": 7, "state": "closed", "title": "feat: add heartbeat.trigger handler and sandbox Docker host path tran\u2026", "updated_at": "2026-04-19T17:24:28Z" }, { "additions": 207, "author": "HowdyDooToYou", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: `resolveModelThroughAliases()` calls undefined `normalizeAliasKey()` causing ReferenceError, and `buildModelAliasIndex` uses hardcoded `DEFAULT_PROVIDER` instead of runtime-resolved default - **Why it matters**: C\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69029", "created_at": "2026-04-19T17:04:02Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69029/files", "html_url": "https://github.com/openclaw/openclaw/pull/69029", "labels": [ "agents", "size: M" ], "merged": false, "number": 69029, "review_comments_count": 1, "state": "open", "title": "fix: resolve model alias P1/P2 review feedback", "updated_at": "2026-04-20T13:41:52Z" }, { "additions": 10, "author": "jpruit20", "author_association": "NONE", "body_excerpt": "## Problem The TUI streaming watchdog is set to 30 seconds, which triggers false-positive warnings during healthy long-running agent turns: ``` streaming watchdog: no stream updates for 30s; resetting status. The backend may have dropped t\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69026", "created_at": "2026-04-19T16:53:07Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69026/files", "html_url": "https://github.com/openclaw/openclaw/pull/69026", "labels": [ "size: XS" ], "merged": false, "number": 69026, "review_comments_count": 1, "state": "open", "title": "fix(tui): raise streaming watchdog threshold to 120s and suppress false-positive warning", "updated_at": "2026-04-19T16:54:36Z" }, { "additions": 130, "author": "EronFan", "author_association": "CONTRIBUTOR", "body_excerpt": "## \u95ee\u9898 \u5f53 \u65f6\uff0cbundled plugins \u4ecd\u7136\u52a0\u8f7d\u5176 implicit providers\uff0c\u4f46\u5e94\u8be5\u88ab\u6392\u9664\u3002 ## \u4fee\u590d \u4fee\u6539 \u4e2d\u7684 \uff0c\u5728\u89e3\u6790 implicit providers \u4e4b\u524d\u68c0\u67e5 \u3002\u5f53 replace \u6a21\u5f0f\u8bbe\u7f6e\u65f6\uff0c\u53ea\u8fd4\u56de\u663e\u5f0f\u914d\u7f6e\u7684 providers\u3002 ## \u6d4b\u8bd5\u8986\u76d6 - \u9a8c\u8bc1 mode=\"replace\" \u65f6\u8df3\u8fc7 implicit providers - \u9a8c\u8bc1 mode=\"merge\" \u65f6\u52a0\u8f7d implicit providers - \u9a8c\u8bc1 mode=\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69023", "created_at": "2026-04-19T16:48:26Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69023/files", "html_url": "https://github.com/openclaw/openclaw/pull/69023", "labels": [ "agents", "size: S", "r: too-many-prs" ], "merged": false, "number": 69023, "review_comments_count": 1, "state": "closed", "title": "fix: exclude implicit providers when models.mode=replace", "updated_at": "2026-04-19T16:51:52Z" }, { "additions": 37, "author": "Mlightsnow", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68945. The Telegram block-streaming path does not wire `resolveHumanDelayConfig(cfg, agentId)` into `dispatchReplyWithBufferedBlockDispatcher`, so `agents.defaults.humanDelay` / per-agent `humanDelay` overrides have no effect on Tel\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69022", "created_at": "2026-04-19T16:44:32Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69022/files", "html_url": "https://github.com/openclaw/openclaw/pull/69022", "labels": [ "channel: telegram", "size: XS" ], "merged": false, "number": 69022, "review_comments_count": 0, "state": "open", "title": "Fix: apply humanDelay between Telegram streamed block replies (Resolves #68945)", "updated_at": "2026-04-21T11:02:04Z" }, { "additions": 191, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Keep the main-session cron heartbeat override when a wake is queued or retried instead of dropping back to the default heartbeat target. Adds regressions for deferred main-session cron wakes and the wake-queue retry path.", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69021", "created_at": "2026-04-19T16:43:48Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69021/files", "html_url": "https://github.com/openclaw/openclaw/pull/69021", "labels": [ "gateway", "maintainer", "size: M" ], "merged": true, "number": 69021, "review_comments_count": 3, "state": "closed", "title": "fix(cron): preserve deferred heartbeat target override", "updated_at": "2026-04-19T17:22:07Z" }, { "additions": 13, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Problem **#69005** \u2014 When the bot tries to add a reaction that already exists on a message, the Slack API returns `already_reacted`. This is treated as a failure and surfaced as a warning: ``` Error: An API error occurred: already_react\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69020", "created_at": "2026-04-19T16:35:03Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69020/files", "html_url": "https://github.com/openclaw/openclaw/pull/69020", "labels": [ "channel: slack", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69020, "review_comments_count": 0, "state": "closed", "title": "fix(slack): suppress already_reacted error in reactSlackMessage", "updated_at": "2026-04-19T16:36:30Z" }, { "additions": 310, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Reject invalid or ambiguous announce delivery config at the gateway boundary instead of persisting it and failing later at runtime. Adds regressions for ambiguous multi-channel announce config on add and update, plus Slack target ids mista\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69015", "created_at": "2026-04-19T16:10:18Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69015/files", "html_url": "https://github.com/openclaw/openclaw/pull/69015", "labels": [ "gateway", "maintainer", "size: M" ], "merged": true, "number": 69015, "review_comments_count": 5, "state": "closed", "title": "fix(gateway): reject invalid cron announce delivery config", "updated_at": "2026-04-19T16:37:53Z" }, { "additions": 488, "author": "cgdusek", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Fixes gateway agent delivery resolution so a concrete current request route (`channel`, `to`, `accountId`, `threadId`) wins over stale persisted session `deliveryContext` fields when the channels conflict. - Clears stale route\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69010", "created_at": "2026-04-19T15:49:50Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69010/files", "html_url": "https://github.com/openclaw/openclaw/pull/69010", "labels": [ "gateway", "size: M" ], "merged": false, "number": 69010, "review_comments_count": 6, "state": "open", "title": "fix(gateway): prefer current route delivery context", "updated_at": "2026-04-19T17:18:24Z" }, { "additions": 150, "author": "martingarramon", "author_association": "CONTRIBUTOR", "body_excerpt": "## Why `postSlackMessageBestEffort` in `extensions/slack/src/send.ts` has a silent retry path that drops the custom identity and re-posts when Slack rejects with `missing_scope` on `chat:write.customize`. This behavior was previously untes\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69009", "created_at": "2026-04-19T15:47:04Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69009/files", "html_url": "https://github.com/openclaw/openclaw/pull/69009", "labels": [ "channel: slack", "size: S" ], "merged": false, "number": 69009, "review_comments_count": 1, "state": "open", "title": "test(slack): cover send.ts customize-scope fallback retry path", "updated_at": "2026-04-19T15:59:00Z" }, { "additions": 68, "author": "lyfuci", "author_association": "NONE", "body_excerpt": "## Summary - Add a dedicated classifier for provider chat-template render errors (e.g. HuggingFace/TGI \"error rendering prompt with jinja template: No user query found\"), so they surface their own template-problem message instead of being\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69003", "created_at": "2026-04-19T15:38:16Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69003/files", "html_url": "https://github.com/openclaw/openclaw/pull/69003", "labels": [ "agents", "size: S", "r: too-many-prs" ], "merged": false, "number": 69003, "review_comments_count": 0, "state": "closed", "title": "fix(pi-embedded): classify provider chat-template render failures separately from context overflow", "updated_at": "2026-04-19T15:40:15Z" }, { "additions": 29, "author": "Mlightsnow", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68893. ## Problem Running `openclaw onboard` on FreeBSD shows a \"Homebrew recommended\" note and offers the Homebrew install shell command, even though Homebrew is not available on FreeBSD (it only officially supports macOS and Linux\u2026", "changed_files": 2, "cluster_id": "cluster-68893-6", "cluster_ids": [ "cluster-68893-6" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/69002", "created_at": "2026-04-19T15:37:17Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69002/files", "html_url": "https://github.com/openclaw/openclaw/pull/69002", "labels": [ "commands", "size: XS" ], "merged": false, "number": 69002, "review_comments_count": 0, "state": "open", "title": "Fix: skip Homebrew prompt on platforms brew doesn't support (Resolves #68893)", "updated_at": "2026-04-19T15:38:55Z" }, { "additions": 2, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68945 The Telegram channel was not applying `agents.defaults.humanDelay` (or per-agent overrides) to block streaming replies. Messages were sent back-to-back without human-like pacing. ## Root Cause `dispatchReplyWithBuff\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/69001", "created_at": "2026-04-19T15:33:40Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69001/files", "html_url": "https://github.com/openclaw/openclaw/pull/69001", "labels": [ "channel: telegram", "size: XS", "r: too-many-prs" ], "merged": false, "number": 69001, "review_comments_count": 0, "state": "closed", "title": "fix(telegram): wire humanDelay config into block streaming dispatcher", "updated_at": "2026-04-19T15:34:27Z" }, { "additions": 65, "author": "obviyus", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #64006. Cron direct delivery was deduping by a reusable session id instead of a per-run execution id, so recurring Telegram runs could report delivered without actually sending. This switches dedupe to the cron execution id, shares t\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/69000", "created_at": "2026-04-19T15:31:57Z", "deletions": 24, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/69000/files", "html_url": "https://github.com/openclaw/openclaw/pull/69000", "labels": [ "maintainer", "size: S" ], "merged": true, "number": 69000, "review_comments_count": 0, "state": "closed", "title": "fix(cron): key recurring delivery dedupe to execution", "updated_at": "2026-04-19T15:48:12Z" }, { "additions": 49, "author": "tanjinlimkelvin-dot", "author_association": "NONE", "body_excerpt": "## Problem Gemma models (gemma-4-31b-it, gemma-4-26b-it, etc.) fail silently when used through the Google provider. The OpenAI-compatible endpoint (`/v1beta/openai/chat/completions`) returns 400/401 errors for Gemma models \u2014 only the nativ\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68996", "created_at": "2026-04-19T15:23:32Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68996/files", "html_url": "https://github.com/openclaw/openclaw/pull/68996", "labels": [ "size: S" ], "merged": false, "number": 68996, "review_comments_count": 4, "state": "open", "title": "fix(google): route Gemma models through native Generative AI API", "updated_at": "2026-04-19T15:51:19Z" }, { "additions": 105, "author": "swotvibe", "author_association": "NONE", "body_excerpt": "## Summary Fixes EACCES permission denied errors caused by stale absolute paths from Docker session files when the systemd gateway runs with a different HOME directory (e.g., `/home/ubuntu` vs `/home/node`). ## Problem When OpenClaw runs i\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68994", "created_at": "2026-04-19T15:02:31Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68994/files", "html_url": "https://github.com/openclaw/openclaw/pull/68994", "labels": [ "scripts", "docker", "size: S" ], "merged": false, "number": 68994, "review_comments_count": 2, "state": "open", "title": "fix: resolve EACCES permission denied errors from stale Docker session paths", "updated_at": "2026-04-19T15:12:41Z" }, { "additions": 2, "author": "zhengsx", "author_association": "NONE", "body_excerpt": "## Problem All Discord slash commands (`/new`, `/compact`, `/status`, etc.) crash when used in DM channels: ``` Error: Cannot access rawData on partial Channel. Use fetch() to populate data. at DmChannel.get rawData [as rawData] (@buape/ca\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68993", "created_at": "2026-04-19T15:01:36Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68993/files", "html_url": "https://github.com/openclaw/openclaw/pull/68993", "labels": [ "channel: discord", "size: XS" ], "merged": false, "number": 68993, "review_comments_count": 1, "state": "open", "title": "fix: handle partial DmChannel in slash command dispatch", "updated_at": "2026-04-19T15:03:23Z" }, { "additions": 430, "author": "mikaeldiakhate-cell", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** When a reply agent turn fell back to a secondary provider/model (e.g. the Anthropic provider timed out and fallback promoted the next candidate), the post-run session persistence path wrote the *runtime* provider/\u2026", "changed_files": 10, "cluster_id": "cluster-64366-2", "cluster_ids": [ "cluster-64366-2" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68991", "created_at": "2026-04-19T14:59:59Z", "deletions": 25, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68991/files", "html_url": "https://github.com/openclaw/openclaw/pull/68991", "labels": [ "agents", "size: M" ], "merged": false, "number": 68991, "review_comments_count": 0, "state": "open", "title": "fix(auto-reply): don't persist automatic fallback runtime as next-turn selected model", "updated_at": "2026-04-19T15:37:28Z" }, { "additions": 454, "author": "CuzG-lab", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `src/entry.ts:22-30` flipped `OPENCLAW_AUTH_STORE_READONLY=1` by argv-sniffing the literal adjacent tokens `\"secrets\" \"audit\"`. A subcommand rename, alias, or any option inserted between the two tokens would silently\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68987", "created_at": "2026-04-19T14:46:19Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68987/files", "html_url": "https://github.com/openclaw/openclaw/pull/68987", "labels": [ "cli", "size: M" ], "merged": false, "number": 68987, "review_comments_count": 2, "state": "open", "title": "entry: replace argv-sniff with command-owned read-only manifest", "updated_at": "2026-04-19T14:49:11Z" }, { "additions": 1658, "author": "dutifulbob", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Gemma was sometimes leaking hidden internal text into Discord replies. This PR makes OpenClaw clean the final reply in one shared place before sending it. It adds regression tests for the real bad cases we saw, including leaked\u2026", "changed_files": 16, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68986", "created_at": "2026-04-19T14:44:02Z", "deletions": 33, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68986/files", "html_url": "https://github.com/openclaw/openclaw/pull/68986", "labels": [ "agents", "size: XL" ], "merged": false, "number": 68986, "review_comments_count": 32, "state": "open", "title": "fix: normalize visible assistant output before delivery", "updated_at": "2026-04-20T07:08:59Z" }, { "additions": 157, "author": "91wan", "author_association": "NONE", "body_excerpt": "## Summary - preserve assistant streaming message payloads so live chat can carry `thinking` and `text` together - wire reasoning stream events through gateway chat delta/final payloads - allow thinking-only streaming bubbles to render in\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68982", "created_at": "2026-04-19T14:22:15Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68982/files", "html_url": "https://github.com/openclaw/openclaw/pull/68982", "labels": [ "app: web-ui", "size: S" ], "merged": false, "number": 68982, "review_comments_count": 12, "state": "open", "title": "fix: stream reasoning in live chat", "updated_at": "2026-04-21T15:13:51Z" }, { "additions": 102, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem \\`resolveProvidersForModelsJsonWithDeps\\` in \\`src/agents/models-config.plan.ts\\` always invoked \\`resolveImplicitProviders\\` and merged the result with the explicit providers from config. That meant \\`models.mode: \\\"replace\\\"\\`\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68978", "created_at": "2026-04-19T14:09:57Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68978/files", "html_url": "https://github.com/openclaw/openclaw/pull/68978", "labels": [ "agents", "size: S" ], "merged": false, "number": 68978, "review_comments_count": 2, "state": "closed", "title": "fix(agents): honor models.mode='replace' by skipping implicit provider discovery", "updated_at": "2026-04-20T10:15:33Z" }, { "additions": 72308, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "When multiple concurrent openclaw agent --session-id calls target the same session while a turn is in progress, callers could be silently dropped. This fix checks for an active turn before entering the actor queue and throws an AcpRuntimeE\u2026", "changed_files": 535, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/68976", "created_at": "2026-04-19T13:57:40Z", "deletions": 5387, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68976/files", "html_url": "https://github.com/openclaw/openclaw/pull/68976", "labels": [ "docs", "channel: discord", "channel: googlechat", "channel: matrix", "channel: msteams", "channel: nextcloud-talk", "channel: nostr", "channel: slack", "channel: telegram", "channel: tlon", "channel: whatsapp-web", "app: ios", "app: macos", "app: web-ui", "gateway", "extensions: memory-core", "cli", "scripts", "commands", "agents", "size: XL", "extensions: anthropic", "extensions: openai", "extensions: kimi-coding", "extensions: tavily", "channel: qqbot", "channel: qa-channel", "extensions: qa-lab", "extensions: memory-wiki", "extensions: codex", "extensions: lmstudio" ], "merged": false, "number": 68976, "review_comments_count": 44, "state": "closed", "title": "fix(acp): return SESSION_BUSY error when concurrent calls hit active session", "updated_at": "2026-04-20T15:53:48Z" }, { "additions": 7, "author": "kami-saia", "author_association": "NONE", "body_excerpt": "## What Replaces the default local embedding model for memory search from `embeddinggemma-300M-qat` (768 dims) to BAAI/bge-m3 Q8\\_0 via `ggml-org/bge-m3-Q8_0-GGUF` (1024 dims). ## Why With the current `embeddinggemma-300M` model, memory se\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68975", "created_at": "2026-04-19T13:57:37Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68975/files", "html_url": "https://github.com/openclaw/openclaw/pull/68975", "labels": [ "size: XS" ], "merged": false, "number": 68975, "review_comments_count": 0, "state": "open", "title": "feat(memory): switch default local embedding model to bge-m3 Q8_0 \ud83e\udd16 AI-assisted", "updated_at": "2026-04-19T13:59:45Z" }, { "additions": 0, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "Delete stale entries on read. Closes #68841", "changed_files": 0, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68974", "created_at": "2026-04-19T13:55:36Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68974/files", "html_url": "https://github.com/openclaw/openclaw/pull/68974", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68974, "review_comments_count": 1, "state": "closed", "title": "fix(gateway): add lazy eviction to costUsageCache", "updated_at": "2026-04-19T13:58:49Z" }, { "additions": 0, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "Clean up stale nodeWakeById entries when loadApnsRegistration returns null. Closes #68847", "changed_files": 0, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68973", "created_at": "2026-04-19T13:52:41Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68973/files", "html_url": "https://github.com/openclaw/openclaw/pull/68973", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68973, "review_comments_count": 1, "state": "closed", "title": "fix(gateway): clean up nodeWakeById entry on no-registration return", "updated_at": "2026-04-19T13:55:42Z" }, { "additions": 0, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "Use params.payload instead of params.trackingPayload for the dedup key. Closes #68862", "changed_files": 0, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68971", "created_at": "2026-04-19T13:50:02Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68971/files", "html_url": "https://github.com/openclaw/openclaw/pull/68971", "labels": [ "size: XS" ], "merged": false, "number": 68971, "review_comments_count": 1, "state": "closed", "title": "fix(telegram): dedup MEDIA using normalized path", "updated_at": "2026-04-19T13:54:28Z" }, { "additions": 0, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary Use `params.payload` for the dedup key instead of `params.trackingPayload` to match what final payload delivery computes. Closes #68862", "changed_files": 0, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68968", "created_at": "2026-04-19T13:40:28Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68968/files", "html_url": "https://github.com/openclaw/openclaw/pull/68968", "labels": [ "size: XS" ], "merged": false, "number": 68968, "review_comments_count": 2, "state": "closed", "title": "fix(telegram): dedup MEDIA using normalized payload path", "updated_at": "2026-04-19T13:45:31Z" }, { "additions": 197, "author": "dyaskur", "author_association": "NONE", "body_excerpt": "AI-assisted: yes (Claude Opus 4.7). ## Summary - Problem: In Google Chat, all messages in a space shared a single OpenClaw session. Starting a new thread to change topic still inherited memory from prior threads, and replies did not reliab\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68967", "created_at": "2026-04-19T13:38:32Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68967/files", "html_url": "https://github.com/openclaw/openclaw/pull/68967", "labels": [ "docs", "channel: googlechat", "size: M" ], "merged": false, "number": 68967, "review_comments_count": 11, "state": "open", "title": "feat(googlechat): add sessionThread option to bind OpenClaw sessions to Google Chat threads", "updated_at": "2026-04-20T03:09:18Z" }, { "additions": 121, "author": "wirjo", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem When Bedrock auth resolves via the AWS SDK default credential chain (IMDS / EC2 instance role / ECS task role) with no explicit API key or env vars, the auth controller in `pi-embedded-runner` returned early without calling `set\u2026", "changed_files": 2, "cluster_id": "cluster-53592-5", "cluster_ids": [ "cluster-53592-5" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68964", "created_at": "2026-04-19T13:25:47Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68964/files", "html_url": "https://github.com/openclaw/openclaw/pull/68964", "labels": [ "agents", "size: S" ], "merged": false, "number": 68964, "review_comments_count": 3, "state": "open", "title": "fix: propagate AWS SDK auth sentinel for IMDS/instance role Bedrock auth", "updated_at": "2026-04-19T13:29:32Z" }, { "additions": 30, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68945 - Telegram block streaming was not respecting the humanDelay configuration, causing replies to be sent back-to-back without pacing. ## Root Cause The Telegram extension was missing the humanDelay wiring that other c\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68963", "created_at": "2026-04-19T13:18:41Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68963/files", "html_url": "https://github.com/openclaw/openclaw/pull/68963", "labels": [ "channel: telegram", "size: XS", "r: too-many-prs" ], "merged": false, "number": 68963, "review_comments_count": 0, "state": "closed", "title": "fix(telegram): wire humanDelay config into block streaming dispatcher", "updated_at": "2026-04-19T13:24:30Z" }, { "additions": 12070, "author": "OFABLE", "author_association": "NONE", "body_excerpt": "## Summary Adds an opt-in `claude-sdk` agent runtime driver backed by `@anthropic-ai/claude-agent-sdk`, alongside the existing `embedded` (pi-ai) and `acp` drivers, and flips the default to `claude-sdk` (Phase 3). This is a re-submission o\u2026", "changed_files": 114, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68961", "created_at": "2026-04-19T13:14:08Z", "deletions": 37, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68961/files", "html_url": "https://github.com/openclaw/openclaw/pull/68961", "labels": [ "docs", "scripts", "agents", "size: XL" ], "merged": false, "number": 68961, "review_comments_count": 11, "state": "open", "title": "Agents: add claude-sdk runtime with native-tool bridge + Phase 3 default flip", "updated_at": "2026-04-19T16:04:38Z" }, { "additions": 0, "author": "kejw05", "author_association": "NONE", "body_excerpt": "## Problem The `qa/convex-credential-broker/convex/tsconfig.json` file contains `/* */` style comments, which cause JSON parsing errors in strict JSON parsers: ``` Expected ',' or '}' after property value in JSON at position 70 ``` ## Solu\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68958", "created_at": "2026-04-19T12:49:21Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68958/files", "html_url": "https://github.com/openclaw/openclaw/pull/68958", "labels": [ "size: XS" ], "merged": false, "number": 68958, "review_comments_count": 0, "state": "open", "title": "fix: Remove comments from tsconfig.json to resolve JSON parsing error", "updated_at": "2026-04-19T12:56:11Z" }, { "additions": 42, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68945 Telegram was the only messaging channel that did not pass `resolveHumanDelayConfig` to its block reply dispatcher, so `humanDelay` config was silently ignored and all block replies were sent with no delay. **Changes:** - Wire\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68956", "created_at": "2026-04-19T12:38:48Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68956/files", "html_url": "https://github.com/openclaw/openclaw/pull/68956", "labels": [ "channel: telegram", "size: XS", "r: too-many-prs" ], "merged": false, "number": 68956, "review_comments_count": 0, "state": "closed", "title": "fix: wire humanDelay into Telegram block reply dispatcher", "updated_at": "2026-04-19T12:39:41Z" }, { "additions": 281, "author": "openperf", "author_association": "MEMBER", "body_excerpt": "### Summary - **Problem**: On runtimes where the cfg snapshot returned by `loadConfig()` retains an unresolved `SecretRef` object on `channels.slack.accounts..botToken`, every Slack outbound reply throws `channels.slack.accounts..b\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/68954", "created_at": "2026-04-19T12:24:37Z", "deletions": 20, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68954/files", "html_url": "https://github.com/openclaw/openclaw/pull/68954", "labels": [ "channel: slack", "maintainer", "size: M" ], "merged": true, "number": 68954, "review_comments_count": 3, "state": "closed", "title": "fix(slack): tolerate unresolved channel SecretRef on outbound send path", "updated_at": "2026-04-20T07:03:11Z" }, { "additions": 227, "author": "dutifulbob", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - safely read Discord channel names so slash commands do not crash on partial channel objects - reuse the same safe helper in the native command and model-picker route paths - add a regression test for a guild slash interaction\u2026", "changed_files": 12, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68953", "created_at": "2026-04-19T12:24:30Z", "deletions": 30, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68953/files", "html_url": "https://github.com/openclaw/openclaw/pull/68953", "labels": [ "channel: discord", "size: M" ], "merged": true, "number": 68953, "review_comments_count": 3, "state": "closed", "title": "fix: tolerate partial discord channel metadata", "updated_at": "2026-04-19T15:00:36Z" }, { "additions": 167, "author": "SARAMALI15792", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: MCP servers registered via `openclaw mcp set` did not expose tools in Pi runtime sessions when `tools.profile` was set to `coding` or `messaging`. The tools were silently filtered out of the agent's tool surface. - Wh\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68949", "created_at": "2026-04-19T12:14:05Z", "deletions": 23, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68949/files", "html_url": "https://github.com/openclaw/openclaw/pull/68949", "labels": [ "agents", "size: S" ], "merged": false, "number": 68949, "review_comments_count": 5, "state": "open", "title": "fix: enable MCP tools in Pi runtime for coding/messaging profiles (#68875)", "updated_at": "2026-04-19T13:31:42Z" }, { "additions": 150, "author": "SARAMALI15792", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68875 - MCP servers registered via `openclaw mcp set` now expose tools to Pi runtime sessions (isolated, cron, main). **Changes:** - Attach `pluginId: \"bundle-mcp\"` metadata to MCP tools during materialization - Add \"bund\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68948", "created_at": "2026-04-19T12:10:48Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68948/files", "html_url": "https://github.com/openclaw/openclaw/pull/68948", "labels": [ "agents", "size: S", "r: too-many-prs" ], "merged": false, "number": 68948, "review_comments_count": 2, "state": "closed", "title": "fix: enable MCP tools in Pi runtime for coding/messaging profiles (#68875)", "updated_at": "2026-04-19T12:20:54Z" }, { "additions": 65, "author": "armanddp", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary This fixes the `/export-session` HTML export regression where the generated file contained raw placeholder identifiers instead of inlined JS, which left the export blank/broken in the browser. Concretely, this PR: - restores the\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68947", "created_at": "2026-04-19T12:03:10Z", "deletions": 15, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68947/files", "html_url": "https://github.com/openclaw/openclaw/pull/68947", "labels": [ "size: S" ], "merged": false, "number": 68947, "review_comments_count": 1, "state": "open", "title": "fix(reply): restore export-session inline scripts", "updated_at": "2026-04-19T12:30:03Z" }, { "additions": 24, "author": "nnish16", "author_association": "NONE", "body_excerpt": "## Summary Avoid showing the Homebrew install prompt during `openclaw onboard` on FreeBSD. The onboarding flow was treating every non-Windows platform as Homebrew-capable, which led to a misleading brew recommendation on FreeBSD. ## Change\u2026", "changed_files": 2, "cluster_id": "cluster-68893-6", "cluster_ids": [ "cluster-68893-6" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68943", "created_at": "2026-04-19T11:47:37Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68943/files", "html_url": "https://github.com/openclaw/openclaw/pull/68943", "labels": [ "commands", "size: XS" ], "merged": false, "number": 68943, "review_comments_count": 0, "state": "open", "title": "fix: skip Homebrew prompt on FreeBSD", "updated_at": "2026-04-19T11:49:03Z" }, { "additions": 3, "author": "JustInCache", "author_association": "NONE", "body_excerpt": "## Summary Fixes #68904. `describeWaitingEntryOrigin` in `ui/src/ui/views/dreaming.ts` was returning the **\"From Daily Log\"** (`originDailyLog`) badge whenever an entry had `groundedCount > 0`. However: - `groundedCount` \u2014 tracks signals a\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68942", "created_at": "2026-04-19T11:45:11Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68942/files", "html_url": "https://github.com/openclaw/openclaw/pull/68942", "labels": [ "app: web-ui", "size: XS" ], "merged": false, "number": 68942, "review_comments_count": 2, "state": "open", "title": "fix: map 'From Daily Log' badge to dailyCount, not groundedCount", "updated_at": "2026-04-21T11:56:52Z" }, { "additions": 1, "author": "JustInCache", "author_association": "NONE", "body_excerpt": "## Summary Fixes #68893. The `needsBrewPrompt` guard in `src/commands/onboard-skills.ts` used: ```ts process.platform !== \"win32\" ``` This incorrectly shows the Homebrew install suggestion on FreeBSD (and any other non-Windows unix that is\u2026", "changed_files": 1, "cluster_id": "cluster-68893-6", "cluster_ids": [ "cluster-68893-6" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68941", "created_at": "2026-04-19T11:44:54Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68941/files", "html_url": "https://github.com/openclaw/openclaw/pull/68941", "labels": [ "commands", "size: XS" ], "merged": false, "number": 68941, "review_comments_count": 0, "state": "open", "title": "fix: skip Homebrew prompt on FreeBSD and other non-Linux/macOS platforms", "updated_at": "2026-04-20T08:31:12Z" }, { "additions": 39013, "author": "100yenadmin", "author_association": "CONTRIBUTOR", "body_excerpt": "# Plan mode \u2014 full rollout + iter-1/2/3 hardening (consolidated stack of 10 PR's & 300+ Code Reviews) ## Executive summary This PR ships **plan mode** across OpenClaw: an opt-in, per-session workflow where agents must propose a structured,\u2026", "changed_files": 202, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 20, "conversation_url": "https://github.com/openclaw/openclaw/pull/68939", "created_at": "2026-04-19T11:42:46Z", "deletions": 335, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68939/files", "html_url": "https://github.com/openclaw/openclaw/pull/68939", "labels": [ "docs", "channel: telegram", "app: macos", "app: web-ui", "gateway", "commands", "agents", "size: XL", "extensions: openai" ], "merged": false, "number": 68939, "review_comments_count": 256, "state": "open", "title": "feat(plan-mode): full rollout + iter-1/2/3 hardening (consolidates PRs A/B/C/D/E/F/7/8/10/11)", "updated_at": "2026-04-20T15:24:55Z" }, { "additions": 2274, "author": "OFABLE", "author_association": "NONE", "body_excerpt": "## Summary Adds a PR review autofix pipeline that uses the Claude Agent SDK subscription to address review comments automatically, plus a Windows background daemon that runs the loop + supervises the OpenClaw gateway. - `autofix.py` (~785\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 219, "conversation_url": "https://github.com/openclaw/openclaw/pull/68936", "created_at": "2026-04-19T11:28:01Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68936/files", "html_url": "https://github.com/openclaw/openclaw/pull/68936", "labels": [ "scripts", "size: XL" ], "merged": false, "number": 68936, "review_comments_count": 27, "state": "open", "title": "Autofix: add PR review autofix pipeline + Windows daemon", "updated_at": "2026-04-21T17:56:17Z" }, { "additions": 592, "author": "hss-oss", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 12, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68935", "created_at": "2026-04-19T11:13:37Z", "deletions": 208, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68935/files", "html_url": "https://github.com/openclaw/openclaw/pull/68935", "labels": [ "docs", "agents", "size: L" ], "merged": false, "number": 68935, "review_comments_count": 12, "state": "open", "title": "add SSE incremental transmission for OpenAI Responses API", "updated_at": "2026-04-19T15:48:07Z" }, { "additions": 3, "author": "januaryeffect", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: The a2ui bundle ships **two independent copies** of the `signal-polyfill` module \u2014 one renamed with a `\\$1` suffix (used by `signalstore`/`watcher`/`effect`) and a fresh unsuffixed copy (used by Lit `SignalWatcher\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68934", "created_at": "2026-04-19T11:13:28Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68934/files", "html_url": "https://github.com/openclaw/openclaw/pull/68934", "labels": [ "size: XS" ], "merged": false, "number": 68934, "review_comments_count": 0, "state": "open", "title": "fix(canvas-host): dedupe signal-polyfill in a2ui bundle", "updated_at": "2026-04-19T11:14:18Z" }, { "additions": 29, "author": "jckm14", "author_association": "NONE", "body_excerpt": "## Summary - soften the main accent color - use gentler amber and red tones for warnings and danger states - remove the yellow hover underline on overview attention links ## Why This is a visual polish pass to make the dashboard feel calme\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68928", "created_at": "2026-04-19T10:54:02Z", "deletions": 34, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68928/files", "html_url": "https://github.com/openclaw/openclaw/pull/68928", "labels": [ "app: web-ui", "size: S" ], "merged": false, "number": 68928, "review_comments_count": 0, "state": "open", "title": "ui(theme): soften dashboard status and accent palette", "updated_at": "2026-04-19T10:54:14Z" }, { "additions": 16, "author": "jckm14", "author_association": "NONE", "body_excerpt": "## Summary - show exact qualified provider/model refs in the model picker - stop collapsing them into friendlier but ambiguous labels - update tests to lock in the explicit behavior ## Why This is better for power users and debugging, but\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68927", "created_at": "2026-04-19T10:54:00Z", "deletions": 50, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68927/files", "html_url": "https://github.com/openclaw/openclaw/pull/68927", "labels": [ "app: web-ui", "size: S" ], "merged": false, "number": 68927, "review_comments_count": 0, "state": "open", "title": "ui(chat): show explicit qualified model refs", "updated_at": "2026-04-19T10:54:13Z" }, { "additions": 674, "author": "jckm14", "author_association": "NONE", "body_excerpt": "## Summary - add an agent selector alongside the session picker - render the model and thinking selectors in the same shared chat controls row - size the chat controls consistently across desktop and mobile layouts ## Why This exposes mult\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68926", "created_at": "2026-04-19T10:53:59Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68926/files", "html_url": "https://github.com/openclaw/openclaw/pull/68926", "labels": [ "app: web-ui", "size: L" ], "merged": false, "number": 68926, "review_comments_count": 3, "state": "open", "title": "ui(chat): add agent, model, and thinking selectors to chat controls", "updated_at": "2026-04-19T22:56:12Z" }, { "additions": 19, "author": "jckm14", "author_association": "NONE", "body_excerpt": "## Summary - rename approval actions to clearer labels - remove resolved approvals from the queue using the returned id - log `approval-resolved` events - refresh overview state after approval resolution ## Why This makes approval handling\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68925", "created_at": "2026-04-19T10:53:57Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68925/files", "html_url": "https://github.com/openclaw/openclaw/pull/68925", "labels": [ "app: web-ui", "size: XS" ], "merged": false, "number": 68925, "review_comments_count": 5, "state": "open", "title": "ui(approval): refresh overview and tighten approval actions", "updated_at": "2026-04-21T17:28:48Z" }, { "additions": 37, "author": "jckm14", "author_association": "NONE", "body_excerpt": "## Summary - rename ambiguous dashboard `Cost` labels to `Usage Cost` - thread usage cost summary data into overview cards - add 7 day and 30 day usage cost hints to the overview card ## Why This makes the dashboard wording less misleading\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68924", "created_at": "2026-04-19T10:53:55Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68924/files", "html_url": "https://github.com/openclaw/openclaw/pull/68924", "labels": [ "app: web-ui", "size: XS" ], "merged": false, "number": 68924, "review_comments_count": 8, "state": "open", "title": "ui(overview): clarify usage cost wording and summary cards", "updated_at": "2026-04-19T22:57:38Z" }, { "additions": 40, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: when `commands.allowFrom` was unset, Discord native slash commands treated the guild/channel policy authorizer as an alternative to sender-specific allowlists. - Why it matters: any member in an allowlisted guild/chan\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68922", "created_at": "2026-04-19T10:49:03Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68922/files", "html_url": "https://github.com/openclaw/openclaw/pull/68922", "labels": [ "channel: discord", "size: XS" ], "merged": false, "number": 68922, "review_comments_count": 0, "state": "open", "title": "fix(discord): honor native command allowlists", "updated_at": "2026-04-19T10:53:22Z" }, { "additions": 4, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Problem **#68895** \u2014 Image model lookup fails for Bailian (and likely other providers) with error: ``` Unknown model: bailian/qwen3.5-plus ``` ## Root Cause `resolveProviderVisionModelFromConfig()` in `image-tool.helpers.ts:78` returns\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68919", "created_at": "2026-04-19T10:35:54Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68919/files", "html_url": "https://github.com/openclaw/openclaw/pull/68919", "labels": [ "size: XS" ], "merged": false, "number": 68919, "review_comments_count": 2, "state": "open", "title": "fix(tools): remove provider prefix from vision model config lookup", "updated_at": "2026-04-19T12:26:03Z" }, { "additions": 41, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: Telegram exec approval forwarding targets were treated as authorized approval senders for inline callbacks and `/approve` resolution. - Why it matters: a target recipient in `approvals.exec.targets` could approve exec\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68918", "created_at": "2026-04-19T10:28:42Z", "deletions": 121, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68918/files", "html_url": "https://github.com/openclaw/openclaw/pull/68918", "labels": [ "channel: telegram", "size: S" ], "merged": false, "number": 68918, "review_comments_count": 0, "state": "open", "title": "fix(telegram): require explicit exec approvers", "updated_at": "2026-04-19T10:53:48Z" }, { "additions": 56, "author": "mbelinky", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: the maintainer wrappers fail with opaque missing-artifact errors when `prepare` or `merge` is run before the earlier wrapper stages created the expected `.local/*` files. - Why it matters: the current output makes it\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68917", "created_at": "2026-04-19T10:27:33Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68917/files", "html_url": "https://github.com/openclaw/openclaw/pull/68917", "labels": [ "scripts", "maintainer", "size: S" ], "merged": false, "number": 68917, "review_comments_count": 1, "state": "closed", "title": "pr-flow: clarify missing wrapper stages", "updated_at": "2026-04-19T10:32:12Z" }, { "additions": 759, "author": "mbelinky", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `PR1` added the detached-task lifecycle seam, but there was still no real core-owned way for an external executor to register itself against that seam. - Why it matters: without an explicit registration contract, deta\u2026", "changed_files": 19, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68915", "created_at": "2026-04-19T10:15:34Z", "deletions": 49, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68915/files", "html_url": "https://github.com/openclaw/openclaw/pull/68915", "labels": [ "commands", "maintainer", "size: L" ], "merged": true, "number": 68915, "review_comments_count": 4, "state": "closed", "title": "tasks: add detached runtime plugin registration contract", "updated_at": "2026-04-19T11:22:41Z" }, { "additions": 4, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "The drain finally block deletes `FOLLOWUP_QUEUES` entries by key only, without verifying the current map entry is the same queue reference. If `/stop` or session reset clears the original queue and a new one is registered under the same ke\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68914", "created_at": "2026-04-19T10:14:55Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68914/files", "html_url": "https://github.com/openclaw/openclaw/pull/68914", "labels": [ "size: XS" ], "merged": false, "number": 68914, "review_comments_count": 0, "state": "closed", "title": "fix(auto-reply): add identity guard in drain finally to prevent queue orphaning", "updated_at": "2026-04-19T13:17:06Z" }, { "additions": 4, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "`costUsageCache` uses a TTL to skip stale entries on read, but never deletes them. Since cache keys are derived from `(startMs, endMs)`, each new day produces new keys while old entries accumulate indefinitely. Add lazy eviction on read to\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68913", "created_at": "2026-04-19T10:14:47Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68913/files", "html_url": "https://github.com/openclaw/openclaw/pull/68913", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68913, "review_comments_count": 3, "state": "closed", "title": "fix(gateway): add lazy eviction to costUsageCache", "updated_at": "2026-04-19T13:16:54Z" }, { "additions": 1, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "`maybeWakeNodeWithApns` sets `nodeWakeById.set(nodeId, state)` on entry, but the `no-registration` early return path does not clean up the entry, causing stale entries to accumulate for unregistered nodeIds. Add `nodeWakeById.delete(nodeId\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68912", "created_at": "2026-04-19T10:14:38Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68912/files", "html_url": "https://github.com/openclaw/openclaw/pull/68912", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68912, "review_comments_count": 0, "state": "closed", "title": "fix(gateway): clean up nodeWakeById entry on no-registration early return", "updated_at": "2026-04-19T13:16:41Z" }, { "additions": 27, "author": "chat2way", "author_association": "NONE", "body_excerpt": "The \browser tool returns \"Tool not available\" when called via HTTP API /tools/invoke. ## Root Cause \browser is defined in CORE_TOOL_DEFINITIONS but its implementation comes only from the plugin. ## Fix Add pluginImplemented flag and use is\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68911", "created_at": "2026-04-19T10:14:05Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68911/files", "html_url": "https://github.com/openclaw/openclaw/pull/68911", "labels": [ "gateway", "agents", "size: XS" ], "merged": false, "number": 68911, "review_comments_count": 3, "state": "open", "title": "fix: allow browser tool via HTTP API /tools/invoke", "updated_at": "2026-04-19T10:20:19Z" }, { "additions": 1, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "FreeBSD uses pkg/ports, not Homebrew. The onboard skills wizard should not recommend Homebrew installation on FreeBSD systems. Closes #68893", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68910", "created_at": "2026-04-19T10:13:53Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68910/files", "html_url": "https://github.com/openclaw/openclaw/pull/68910", "labels": [ "commands", "size: XS" ], "merged": false, "number": 68910, "review_comments_count": 1, "state": "closed", "title": "fix(onboard): skip Homebrew prompt on FreeBSD", "updated_at": "2026-04-21T09:09:40Z" }, { "additions": 763, "author": "esqandil", "author_association": "NONE", "body_excerpt": "## Problem: false-positive \"double-supervisor\" report On headless Linux hosts where OpenClaw is installed as **system-level** systemd units (unit files under `/etc/systemd/system/`), `openclaw gateway status` cannot probe the runtime and f\u2026", "changed_files": 12, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68909", "created_at": "2026-04-19T10:03:03Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68909/files", "html_url": "https://github.com/openclaw/openclaw/pull/68909", "labels": [ "gateway", "cli", "size: L" ], "merged": false, "number": 68909, "review_comments_count": 6, "state": "open", "title": "fix(daemon): probe system bus and cgroup-aware dedup for gateway status", "updated_at": "2026-04-19T10:07:46Z" }, { "additions": 0, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary The drain finally block in `scheduleFollowupDrain` deletes `FOLLOWUP_QUEUES` entries by key only, without verifying the current map entry is the same queue reference. If `/stop` or session reset clears the original queue and a n\u2026", "changed_files": 0, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68908", "created_at": "2026-04-19T10:02:52Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68908/files", "html_url": "https://github.com/openclaw/openclaw/pull/68908", "labels": [ "size: XS" ], "merged": false, "number": 68908, "review_comments_count": 0, "state": "closed", "title": "fix(auto-reply): add identity guard in drain finally to prevent queue orphaning", "updated_at": "2026-04-19T13:40:33Z" }, { "additions": 206, "author": "frankekn", "author_association": "MEMBER", "body_excerpt": "## Summary - mark the bundled Kimi provider as binary thinking with an off-by-default policy - force Kimi Anthropic-compatible payloads to send `thinking: disabled` unless explicitly enabled - let explicit model `params.thinking` override\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68907", "created_at": "2026-04-19T09:59:00Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68907/files", "html_url": "https://github.com/openclaw/openclaw/pull/68907", "labels": [ "maintainer", "size: M", "extensions: kimi-coding" ], "merged": true, "number": 68907, "review_comments_count": 0, "state": "closed", "title": "fix: default Kimi thinking to off", "updated_at": "2026-04-19T10:50:55Z" }, { "additions": 73, "author": "chen-zhang-cs-code", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Tolerate image model IDs that arrive already qualified with the same provider, e.g. `provider=bailian` and `model=bailian/qwen3.5-plus`. - Keep the existing normalized lookup first, then retry the parsed provider/model ref onl\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68906", "created_at": "2026-04-19T09:58:43Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68906/files", "html_url": "https://github.com/openclaw/openclaw/pull/68906", "labels": [ "size: S" ], "merged": false, "number": 68906, "review_comments_count": 1, "state": "open", "title": "fix(media): avoid double-prefixing qualified image models", "updated_at": "2026-04-21T11:42:36Z" }, { "additions": 0, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary `costUsageCache` uses a TTL (`COST_USAGE_CACHE_TTL_MS = 30_000`) to skip stale entries on the read path, but never deletes them. Since cache keys are derived from `(startMs, endMs)`, each new day produces new keys while old entr\u2026", "changed_files": 0, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68905", "created_at": "2026-04-19T09:56:09Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68905/files", "html_url": "https://github.com/openclaw/openclaw/pull/68905", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68905, "review_comments_count": 2, "state": "closed", "title": "fix(gateway): add lazy eviction to costUsageCache", "updated_at": "2026-04-19T10:02:57Z" }, { "additions": 52, "author": "wirjo", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem The `amazon-bedrock-mantle` plugin generates a bearer token from IAM credentials at discovery time via `@aws/bedrock-token-generator`, then bakes it as a **static string** into the provider config (`auth: \"api-key\", apiKey: ): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 18859, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68890", "created_at": "2026-04-19T09:14:38Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68890/files", "html_url": "https://github.com/openclaw/openclaw/pull/68890", "labels": [ "size: XL" ], "merged": false, "number": 68890, "review_comments_count": 0, "state": "closed", "title": "Add multiple contribution files from 8428 to 8477", "updated_at": "2026-04-19T09:19:38Z" }, { "additions": 17248, "author": "richardclawbot", "author_association": "NONE", "body_excerpt": "# Discord Surface Overhaul \u2014 Merge Notes (2026-04-18, refreshed 2026-04-19) **Branch:** `fix/discord-thread-bind-prefix` **Commit tip:** `f0dca1c7b7` (Task 5 live-harness isolation) **Scope:** 27 commits constituting the Discord Surface Ov\u2026", "changed_files": 157, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68889", "created_at": "2026-04-19T09:02:54Z", "deletions": 303, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68889/files", "html_url": "https://github.com/openclaw/openclaw/pull/68889", "labels": [ "docs", "channel: discord", "app: web-ui", "gateway", "cli", "scripts", "agents", "size: XL", "extensions: codex" ], "merged": false, "number": 68889, "review_comments_count": 0, "state": "open", "title": "feat(discord-surface): multi-phase thread-bound ACP delivery overhaul", "updated_at": "2026-04-19T09:03:12Z" }, { "additions": 2103, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Chinese Documentation Translation Add Chinese translations for OpenClaw documentation files: {files_list} Contributors: Eruditi", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68888", "created_at": "2026-04-19T08:57:01Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68888/files", "html_url": "https://github.com/openclaw/openclaw/pull/68888", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68888, "review_comments_count": 4, "state": "closed", "title": "docs: add Chinese translation for documentation", "updated_at": "2026-04-19T09:12:13Z" }, { "additions": 1, "author": "tianhaocui", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary The `existingChannel` parameter in `buildFailureAlert` (`ui/src/ui/controllers/cron.ts:614`) was typed as `string | undefined` while already being optional (`?`). The explicit `| undefined` is redundant and triggers the oxlint `\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68887", "created_at": "2026-04-19T08:53:11Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68887/files", "html_url": "https://github.com/openclaw/openclaw/pull/68887", "labels": [ "app: web-ui", "size: XS" ], "merged": false, "number": 68887, "review_comments_count": 0, "state": "open", "title": "fix: remove unnecessary explicit undefined on optional parameter", "updated_at": "2026-04-19T08:54:14Z" }, { "additions": 273, "author": "mbelinky", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: detached task lifecycle calls were imported directly from `src/tasks/task-executor.ts` across ACP, cron, gateway, subagent, and background-task paths, leaving no clean seam for alternate detached-work execution. - Why\u2026", "changed_files": 22, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68886", "created_at": "2026-04-19T08:51:53Z", "deletions": 22, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68886/files", "html_url": "https://github.com/openclaw/openclaw/pull/68886", "labels": [ "gateway", "agents", "maintainer", "size: M" ], "merged": true, "number": 68886, "review_comments_count": 1, "state": "closed", "title": "tasks: extract detached task lifecycle runtime", "updated_at": "2026-04-19T08:58:19Z" }, { "additions": 269, "author": "FantoX", "author_association": "NONE", "body_excerpt": "Migrated the repository's media execution paths to utilize the Node-bundled `ffmpeg-static` and `@ffprobe-installer/ffprobe` packages instead of relying on the host OS native FFmpeg installation rules. Changes introduced: - Registered both\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68885", "created_at": "2026-04-19T08:46:47Z", "deletions": 118, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68885/files", "html_url": "https://github.com/openclaw/openclaw/pull/68885", "labels": [ "size: S" ], "merged": false, "number": 68885, "review_comments_count": 13, "state": "open", "title": "feat: implement video frame extraction skill using ffmpeg-static and ffprobe-installer", "updated_at": "2026-04-20T11:29:16Z" }, { "additions": 139, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem Web UI 'Show Checkpoints' shows empty list despite checkpoint `.jsonl` files existing on disk. The `compactionCheckpoints` array in the session store can be empty/missing even when checkpoint files exist. ## Fix Added `discoverC\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68883", "created_at": "2026-04-19T08:40:59Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68883/files", "html_url": "https://github.com/openclaw/openclaw/pull/68883", "labels": [ "gateway", "size: S" ], "merged": false, "number": 68883, "review_comments_count": 3, "state": "closed", "title": "fix: discover checkpoint files from disk when store array is empty (#68864)", "updated_at": "2026-04-19T21:59:58Z" }, { "additions": 25, "author": "Bartok9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary `costUsageCache` in `usage.ts` stores `CostUsageSummary` results keyed by `(startMs, endMs)`. The 30s TTL only causes stale reads to be ignored on the read path \u2014 it never deletes entries from the Map. Each day a new `todayStart\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68881", "created_at": "2026-04-19T08:35:06Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68881/files", "html_url": "https://github.com/openclaw/openclaw/pull/68881", "labels": [ "gateway", "size: XS", "r: too-many-prs" ], "merged": false, "number": 68881, "review_comments_count": 3, "state": "closed", "title": "fix(gateway): cap and prune costUsageCache to prevent unbounded growth", "updated_at": "2026-04-19T08:37:38Z" }, { "additions": 2, "author": "Bartok9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary On Windows PowerShell, an unquoted `--tools exec,read,write` is parsed by the shell as three separate arguments and reaches Node/Commander as a single space-joined string `\"exec read write\"`. Splitting only on commas produces on\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68880", "created_at": "2026-04-19T08:33:09Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68880/files", "html_url": "https://github.com/openclaw/openclaw/pull/68880", "labels": [ "cli", "size: XS", "r: too-many-prs" ], "merged": false, "number": 68880, "review_comments_count": 0, "state": "closed", "title": "fix(cron): split --tools on whitespace in addition to commas (Windows/PowerShell)", "updated_at": "2026-04-19T08:33:55Z" }, { "additions": 143, "author": "chat2way", "author_association": "NONE", "body_excerpt": "## Problem The `browser` tool returns \"Tool not available\" when called via HTTP API `/tools/invoke`. ## Root Cause `browser` is defined in `CORE_TOOL_DEFINITIONS` but its implementation comes only from the plugin. The HTTP API code incorre\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68879", "created_at": "2026-04-19T08:30:28Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68879/files", "html_url": "https://github.com/openclaw/openclaw/pull/68879", "labels": [ "gateway", "agents", "size: S" ], "merged": false, "number": 68879, "review_comments_count": 7, "state": "closed", "title": "fix: allow browser tool to work via HTTP API /tools/invoke", "updated_at": "2026-04-19T09:46:05Z" }, { "additions": 305, "author": "zaimaopeng", "author_association": "NONE", "body_excerpt": "## Summary This PR tightens the `sessions.list` hot path in `src/gateway/session-utils.ts`. It moves cheap filter / sort / limit work ahead of full row construction and replaces per-row child-session scans with a per-request child index. #\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68878", "created_at": "2026-04-19T08:29:58Z", "deletions": 48, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68878/files", "html_url": "https://github.com/openclaw/openclaw/pull/68878", "labels": [ "gateway", "size: M" ], "merged": false, "number": 68878, "review_comments_count": 0, "state": "open", "title": "[codex] Optimize gateway session listing before full row construction", "updated_at": "2026-04-19T08:30:14Z" }, { "additions": 139, "author": "zqchris", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary When the assistant reply is synthesized to speech \u2014 final-block auto-TTS, ACP dispatch, or the `/tts audio` command \u2014 the delivered payload is stripped down to `{mediaUrl, audioAsVoice}` only. The text is intentionally dropped s\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68877", "created_at": "2026-04-19T08:19:09Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68877/files", "html_url": "https://github.com/openclaw/openclaw/pull/68877", "labels": [ "size: S" ], "merged": false, "number": 68877, "review_comments_count": 2, "state": "open", "title": "feat(auto-reply): preserve TTS transcript on audio-as-voice payloads", "updated_at": "2026-04-20T10:41:50Z" }, { "additions": 161, "author": "Sanjays2402", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** The dreaming pipeline's concept-ranking output contained obvious English stopwords (`the`, `assistant`, etc.) because the source corpus is ~90% cron scaffolding and `NO_REPLY` sentinels. Even a perfect stopword li\u2026", "changed_files": 2, "cluster_id": "cluster-68449-4", "cluster_ids": [ "cluster-68449-4" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68876", "created_at": "2026-04-19T08:18:43Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68876/files", "html_url": "https://github.com/openclaw/openclaw/pull/68876", "labels": [ "extensions: memory-core", "size: S" ], "merged": false, "number": 68876, "review_comments_count": 5, "state": "open", "title": "fix(memory): filter cron-triggered sessions and NO_REPLY sentinels from dreaming corpus (addresses #68449)", "updated_at": "2026-04-21T03:55:12Z" }, { "additions": 106, "author": "Sanjays2402", "author_association": "NONE", "body_excerpt": "Fixes #68862. ## Problem When a reply includes a `MEDIA:` tag pointing to a file **outside** `~/.openclaw/media/outbound/` (e.g. `/tmp/foo.png` or a workspace path), Telegram (and likely every channel that honours the tag) sends the image\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68873", "created_at": "2026-04-19T08:04:49Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68873/files", "html_url": "https://github.com/openclaw/openclaw/pull/68873", "labels": [ "size: S" ], "merged": false, "number": 68873, "review_comments_count": 2, "state": "closed", "title": "fix(auto-reply): dedupe block replies on normalized media paths (fixes #68862)", "updated_at": "2026-04-19T08:30:44Z" }, { "additions": 40, "author": "richardclawbot", "author_association": "NONE", "body_excerpt": "## Summary - Documents how ACP Claude Code sessions inherit host `~/.claude/settings.json` (model, permission mode) via `HOME` environment variable and the adapter's `SettingsManager` - Clarifies that OpenClaw does **not** pin or override\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68872", "created_at": "2026-04-19T07:59:06Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68872/files", "html_url": "https://github.com/openclaw/openclaw/pull/68872", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68872, "review_comments_count": 1, "state": "open", "title": "docs(acp): clarify Claude/Codex settings inheritance", "updated_at": "2026-04-19T08:01:48Z" }, { "additions": 63, "author": "tianhaocui", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68449 ## Summary `LANGUAGE_STOP_WORDS.english` only contained 8 words (`and, are, for, into, its, our, then, were`), missing common articles, pronouns, prepositions, verbs, and conversation markers. This caused high-frequency noise\u2026", "changed_files": 1, "cluster_id": "cluster-68449-4", "cluster_ids": [ "cluster-68449-4" ], "cluster_role": "member", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68870", "created_at": "2026-04-19T07:50:04Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68870/files", "html_url": "https://github.com/openclaw/openclaw/pull/68870", "labels": [ "extensions: memory-core", "size: S" ], "merged": false, "number": 68870, "review_comments_count": 0, "state": "open", "title": "fix(memory): expand English stopword list for concept vocabulary", "updated_at": "2026-04-20T06:19:21Z" }, { "additions": 104, "author": "zqchris", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary The `tts` tool previously returned a fixed `\"Generated audio reply.\"` string as its tool-result `content`. Because the assistant also emits `SILENT_REPLY_TOKEN` after a TTS call, session transcripts lost what was actually spoken\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68869", "created_at": "2026-04-19T07:45:09Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68869/files", "html_url": "https://github.com/openclaw/openclaw/pull/68869", "labels": [ "agents", "size: S", "extensions: codex" ], "merged": false, "number": 68869, "review_comments_count": 4, "state": "open", "title": "fix(agents): preserve spoken text in tts tool result", "updated_at": "2026-04-20T11:24:37Z" }, { "additions": 9, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes false-positive security audit warnings for bundled stock plugins. ## Root Cause The security audit used `listChannelPlugins()` to get bundled plugin IDs, but this function only returns **runtime-loaded channel plugins** an\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68867", "created_at": "2026-04-19T07:38:07Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68867/files", "html_url": "https://github.com/openclaw/openclaw/pull/68867", "labels": [ "size: XS", "r: too-many-prs" ], "merged": false, "number": 68867, "review_comments_count": 1, "state": "closed", "title": "fix(security): use manifest registry for phantom plugin check", "updated_at": "2026-04-19T07:41:06Z" }, { "additions": 201, "author": "alithnar-bot", "author_association": "NONE", "body_excerpt": "## Summary - invalidate runtime auth profile snapshots when `auth-profiles.json` changes on disk - invalidate runtime auth profile snapshots when `auth-state.json` changes on disk - add regression coverage for both auth-store and auth-stat\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68866", "created_at": "2026-04-19T07:34:45Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68866/files", "html_url": "https://github.com/openclaw/openclaw/pull/68866", "labels": [ "app: web-ui", "agents", "size: M" ], "merged": false, "number": 68866, "review_comments_count": 2, "state": "open", "title": "fix(auth): invalidate stale runtime auth snapshots when auth files change", "updated_at": "2026-04-21T17:56:17Z" }, { "additions": 83, "author": "tianhaocui", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68766 ## Summary The Feishu WebSocket transport relied solely on the Lark SDK's built-in `autoReconnect`, which silently gives up after exhausting its internal retry budget. When this happens the bot goes permanently offline with no\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68865", "created_at": "2026-04-19T07:34:10Z", "deletions": 33, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68865/files", "html_url": "https://github.com/openclaw/openclaw/pull/68865", "labels": [ "channel: feishu", "size: S" ], "merged": false, "number": 68865, "review_comments_count": 4, "state": "open", "title": "fix(feishu): add application-level WebSocket reconnection with backoff", "updated_at": "2026-04-20T06:19:28Z" }, { "additions": 30, "author": "tianhaocui", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68470 ## Summary `lastRunPromptUsage` fell back to `attemptUsage` (the accumulated total across all API calls in the tool-use loop) when `lastAssistantUsage` was undefined. For providers like MiniMax that report full prompt size per\u2026", "changed_files": 2, "cluster_id": "cluster-68470-3", "cluster_ids": [ "cluster-68470-3" ], "cluster_role": "canonical", "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68863", "created_at": "2026-04-19T07:27:30Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68863/files", "html_url": "https://github.com/openclaw/openclaw/pull/68863", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68863, "review_comments_count": 5, "state": "open", "title": "fix: prevent prompt token double-counting in tool-use loops", "updated_at": "2026-04-21T14:57:05Z" }, { "additions": 1, "author": "jaredmarin", "author_association": "NONE", "body_excerpt": "## Summary - clean rebuild of the intended Mission Control change from `origin/main` - adds only `apps/mission-control` at `92cdf6b1ef00aa21b5f247524effab9eddc95281` - replaces #68756, which accidentally included private local files ## Ver\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68861", "created_at": "2026-04-19T07:23:54Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68861/files", "html_url": "https://github.com/openclaw/openclaw/pull/68861", "labels": [ "size: XS" ], "merged": false, "number": 68861, "review_comments_count": 2, "state": "closed", "title": "feat: integrate Mission Control v3.0 UI updates", "updated_at": "2026-04-19T10:28:59Z" }, { "additions": 106, "author": "404notfoundhh", "author_association": "NONE", "body_excerpt": "## Summary Emit embedded Pi `turn_start` / `turn_end` events through OpenClaw's agent event pipeline so external observers can detect stable loop boundaries. ## Changes - handle `turn_start` and `turn_end` in `src/agents/pi-embedded-subscr\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68860", "created_at": "2026-04-19T07:23:14Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68860/files", "html_url": "https://github.com/openclaw/openclaw/pull/68860", "labels": [ "agents", "size: S" ], "merged": false, "number": 68860, "review_comments_count": 1, "state": "open", "title": "Agents: emit turn events from embedded sessions", "updated_at": "2026-04-19T07:32:37Z" }, { "additions": 4, "author": "name5566", "author_association": "NONE", "body_excerpt": "## Summary Inject OPENCLAW_SESSION_KEY environment variable into child processes spawned by the exec tool, allowing scripts and skills to reliably identify the current session without relying on model parameter passing. ## Problem Currentl\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68859", "created_at": "2026-04-19T07:20:49Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68859/files", "html_url": "https://github.com/openclaw/openclaw/pull/68859", "labels": [ "docs", "app: web-ui", "agents", "size: XS" ], "merged": false, "number": 68859, "review_comments_count": 2, "state": "open", "title": "feat(exec): inject OPENCLAW_SESSION_KEY env var for child processes", "updated_at": "2026-04-19T08:28:45Z" }, { "additions": 84, "author": "chen-zhang-cs-code", "author_association": "CONTRIBUTOR", "body_excerpt": "\ufeffAI-assisted: yes (Codex). ## Summary `cron add --tools` and `cron edit --tools` now share a parser that accepts both comma-separated and whitespace-separated tool lists. This keeps the normal `exec,read,write` path working while also hand\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68858", "created_at": "2026-04-19T07:20:31Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68858/files", "html_url": "https://github.com/openclaw/openclaw/pull/68858", "labels": [ "cli", "size: S" ], "merged": true, "number": 68858, "review_comments_count": 0, "state": "closed", "title": "fix(cron): parse PowerShell tools allow list", "updated_at": "2026-04-19T09:41:34Z" }, { "additions": 8, "author": "tianhaocui", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68090 ## Summary The `node.invoke` timeout was hardcoded to 30 seconds with no way to configure it. Users running long operations through node commands had to accept the fixed timeout. ## Changes 1. **`src/config/types.gateway.ts`**\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68857", "created_at": "2026-04-19T07:19:47Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68857/files", "html_url": "https://github.com/openclaw/openclaw/pull/68857", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68857, "review_comments_count": 2, "state": "open", "title": "feat: add gateway.nodes.invokeTimeoutMs config option", "updated_at": "2026-04-20T06:19:35Z" }, { "additions": 323, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #14593 ## Problem When running `openclaw onboard` in a Docker container and selecting a brew-based skill, the wizard shows a confusing \"Homebrew recommended\" prompt even though: 1. The existing fallback in `skills-install.ts` already\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68856", "created_at": "2026-04-19T07:15:46Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68856/files", "html_url": "https://github.com/openclaw/openclaw/pull/68856", "labels": [ "commands", "agents", "size: M" ], "merged": false, "number": 68856, "review_comments_count": 2, "state": "closed", "title": "fix: skip brew prompt on Linux when native package manager is available", "updated_at": "2026-04-19T21:59:54Z" }, { "additions": 15, "author": "tianhaocui", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68309 ## Summary Mistral (and potentially other providers) may send thinking content as an object in `choice.delta.content` rather than a string. Without a type guard, the object is coerced to `\"[object Object]\"` when appended to th\u2026", "changed_files": 2, "cluster_id": "cluster-68309-3", "cluster_ids": [ "cluster-68309-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68855", "created_at": "2026-04-19T07:15:15Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68855/files", "html_url": "https://github.com/openclaw/openclaw/pull/68855", "labels": [ "app: web-ui", "agents", "size: XS" ], "merged": false, "number": 68855, "review_comments_count": 1, "state": "open", "title": "fix: guard against non-string content delta and thinking blocks", "updated_at": "2026-04-20T06:19:42Z" }, { "additions": 103, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Summary Fixes #68661 Commands with `<<` heredoc syntax trigger an approval prompt in allowlist mode even when the target binary is in the allowlist. This regressed from the original fix (#13811) after a security hardening (f23da067). ##\u2026", "changed_files": 3, "cluster_id": "cluster-68661-4", "cluster_ids": [ "cluster-68661-4" ], "cluster_role": "canonical", "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68854", "created_at": "2026-04-19T07:08:12Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68854/files", "html_url": "https://github.com/openclaw/openclaw/pull/68854", "labels": [ "agents", "size: S" ], "merged": false, "number": 68854, "review_comments_count": 5, "state": "open", "title": "fix(security): allow quoted heredocs in allowlist mode without extra approval", "updated_at": "2026-04-19T14:50:08Z" }, { "additions": 153, "author": "grimmjoww", "author_association": "NONE", "body_excerpt": "## Summary Addresses #40932 (gateway restart fails from exec tool) without reintroducing the Windows regression that caused closed PR #68507 to be reverted. ## Background PR #68507 tried to fix #40932 by adding a SIGUSR1 fast path to `trig\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68853", "created_at": "2026-04-19T07:03:15Z", "deletions": 21, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68853/files", "html_url": "https://github.com/openclaw/openclaw/pull/68853", "labels": [ "size: S" ], "merged": false, "number": 68853, "review_comments_count": 1, "state": "open", "title": "fix(gateway): SIGUSR1 restart fast path that doesn't break Windows schtasks", "updated_at": "2026-04-19T07:05:47Z" }, { "additions": 117, "author": "altierac", "author_association": "NONE", "body_excerpt": "## Problem `extractWikiLinks()` runs `MARKDOWN_LINK_PATTERN` against the full page body including fenced code blocks. Python code like: ```python stream = anyio.create_memory_object_stream[SessionMessage](0) ``` triggers false-positive `Br\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68852", "created_at": "2026-04-19T07:01:19Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68852/files", "html_url": "https://github.com/openclaw/openclaw/pull/68852", "labels": [ "size: S", "extensions: memory-wiki" ], "merged": false, "number": 68852, "review_comments_count": 3, "state": "open", "title": "fix(memory-wiki): skip fenced code blocks when extracting wiki links", "updated_at": "2026-04-20T05:25:07Z" }, { "additions": 87, "author": "javierdici", "author_association": "NONE", "body_excerpt": "## Summary - ignore synthetic transport names like `webchat:g-agent-...` when resolving visible session labels - preserve existing human labels and fall back cleanly to `main` / `subagent:` - keep this change visual-only, without chang\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68850", "created_at": "2026-04-19T06:57:08Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68850/files", "html_url": "https://github.com/openclaw/openclaw/pull/68850", "labels": [ "app: web-ui", "size: S" ], "merged": false, "number": 68850, "review_comments_count": 1, "state": "open", "title": "fix(ui): clean synthetic session selector labels", "updated_at": "2026-04-19T07:02:28Z" }, { "additions": 1, "author": "tianhaocui", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68788 ## Summary `resolveWindowsCommandShim` resolves `.cmd` shims for Node `spawn()` on Windows. The allowlist includes `npm`, `pnpm`, `yarn`, `npx` but is missing `claude`, causing `spawn claude ENOENT` when routing to the `claude\u2026", "changed_files": 1, "cluster_id": "cluster-68788-4", "cluster_ids": [ "cluster-68788-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68849", "created_at": "2026-04-19T06:56:24Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68849/files", "html_url": "https://github.com/openclaw/openclaw/pull/68849", "labels": [ "size: XS" ], "merged": false, "number": 68849, "review_comments_count": 0, "state": "open", "title": "fix: add \"claude\" to Windows cmdCommands shim allowlist", "updated_at": "2026-04-20T06:19:42Z" }, { "additions": 100, "author": "Feelw00", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem**: \\`maybeWakeNodeWithApns\\` (nodes.ts:308-416) sets \\`nodeWakeById\\` speculatively at L312-313 (for in-flight coalescing) before the L333 \\`loadApnsRegistration\\` check. On the no-registration early-return path the\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68848", "created_at": "2026-04-19T06:37:06Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68848/files", "html_url": "https://github.com/openclaw/openclaw/pull/68848", "labels": [ "gateway", "size: S" ], "merged": false, "number": 68848, "review_comments_count": 0, "state": "open", "title": "fix(gateway): clear nodeWakeById on no-registration early-return", "updated_at": "2026-04-21T03:09:22Z" }, { "additions": 119, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68827 ## Problem MCP server processes (npx-based) accumulate in memory after cron-triggered spawned agent sessions complete. Each process holds ~96-100MB RSS. After several cron cycles, this results in 100+ zombie MCP processes cons\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68846", "created_at": "2026-04-19T06:34:18Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68846/files", "html_url": "https://github.com/openclaw/openclaw/pull/68846", "labels": [ "agents", "size: S" ], "merged": false, "number": 68846, "review_comments_count": 0, "state": "closed", "title": "fix: reap MCP child processes when spawned session run ends", "updated_at": "2026-04-19T21:59:51Z" }, { "additions": 12, "author": "desty", "author_association": "NONE", "body_excerpt": "## Summary - unskip the two quarantined Telegram sticker e2e tests tracked in #50185 - mock `openclaw/plugin-sdk/agent-runtime` in the Telegram media e2e harness so sticker-only flows stay deterministic in CI - keep the existing assertions\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68845", "created_at": "2026-04-19T06:34:08Z", "deletions": 2, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68845/files", "html_url": "https://github.com/openclaw/openclaw/pull/68845", "labels": [ "channel: telegram", "size: XS" ], "merged": false, "number": 68845, "review_comments_count": 0, "state": "open", "title": "Telegram: unskip sticker e2e tests", "updated_at": "2026-04-19T06:34:21Z" }, { "additions": 91, "author": "kesslerio", "author_association": "NONE", "body_excerpt": "## Summary - Problem: newline chunk mode split every blank-line-separated paragraph into its own WhatsApp message, even when multiple paragraphs still fit under the limit. - Why it matters: short messages were over-split, and longer messag\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68844", "created_at": "2026-04-19T06:31:41Z", "deletions": 16, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68844/files", "html_url": "https://github.com/openclaw/openclaw/pull/68844", "labels": [ "size: S" ], "merged": false, "number": 68844, "review_comments_count": 0, "state": "open", "title": "fix(outbound): pack newline-mode paragraphs up to limit", "updated_at": "2026-04-19T06:34:29Z" }, { "additions": 174, "author": "kesslerio", "author_association": "NONE", "body_excerpt": "## Summary - Problem: bound ACP sessions stayed attached after the runtime `cwd` disappeared, so retries kept failing against a dead session. - Why it matters: affected threads remain wedged until someone manually clears the stale binding.\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68843", "created_at": "2026-04-19T06:31:41Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68843/files", "html_url": "https://github.com/openclaw/openclaw/pull/68843", "labels": [ "size: S" ], "merged": false, "number": 68843, "review_comments_count": 2, "state": "open", "title": "fix(acp): treat missing cwd as stale bound session", "updated_at": "2026-04-19T06:40:42Z" }, { "additions": 271, "author": "Feelw00", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem**: `costUsageCache` in `src/gateway/server-methods/usage.ts:65` has no delete/prune/evict path. The 30s TTL only gates stale reads; on a miss after expiry, `set()` overwrites the same key but never removes stale keys\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68842", "created_at": "2026-04-19T06:31:18Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68842/files", "html_url": "https://github.com/openclaw/openclaw/pull/68842", "labels": [ "gateway", "commands", "size: M" ], "merged": true, "number": 68842, "review_comments_count": 3, "state": "closed", "title": "fix(gateway): bound costUsageCache with MAX + FIFO eviction", "updated_at": "2026-04-21T07:04:03Z" }, { "additions": 248, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68766 ## Problem Feishu WebSocket connection doesn't recover after transient `tenant_access_token` refresh failure. The current reconnection logic retries only once \u2014 if that retry also fails, the plugin gives up entirely, causing h\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68840", "created_at": "2026-04-19T06:24:24Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68840/files", "html_url": "https://github.com/openclaw/openclaw/pull/68840", "labels": [ "channel: feishu", "size: M" ], "merged": false, "number": 68840, "review_comments_count": 3, "state": "closed", "title": "fix: add exponential backoff retry for Feishu WebSocket reconnection", "updated_at": "2026-04-19T21:59:48Z" }, { "additions": 121, "author": "Feelw00", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem**: drain IIFE finally (`drain.ts:263-271`) unconditionally calls `FOLLOWUP_QUEUES.delete(key)` + `clearFollowupDrainCallback(key)` based on the key alone, without checking whether the captured `queue` still matches t\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68839", "created_at": "2026-04-19T06:24:08Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68839/files", "html_url": "https://github.com/openclaw/openclaw/pull/68839", "labels": [ "size: S" ], "merged": false, "number": 68839, "review_comments_count": 0, "state": "open", "title": "fix(auto-reply): guard FOLLOWUP_QUEUES delete against late drain finally", "updated_at": "2026-04-21T03:08:36Z" }, { "additions": 25, "author": "SimbaKingjoe", "author_association": "NONE", "body_excerpt": "# fix(active-memory): skip non-string entries in pluginConfig.agents during normalization ## Summary - **Problem:** The `normalizePluginConfig` function previously called `.map((agentId) => agentId.trim())` directly on `raw.agents` without\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68837", "created_at": "2026-04-19T06:23:23Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68837/files", "html_url": "https://github.com/openclaw/openclaw/pull/68837", "labels": [ "size: XS" ], "merged": false, "number": 68837, "review_comments_count": 0, "state": "open", "title": "fix(active-memory): skip non-string entries in pluginConfig.agents du\u2026", "updated_at": "2026-04-19T06:24:54Z" }, { "additions": 6, "author": "neo1027144-creator", "author_association": "CONTRIBUTOR", "body_excerpt": "AI-assisted: yes (Antigravity). ## Summary Add missing success log lines for all six Telegram media send operations: sendAnimation, sendPhoto, sendVideo, sendVoice, sendAudio, and sendDocument. The text path (sendMessage) already emits ele\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68836", "created_at": "2026-04-19T06:17:08Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68836/files", "html_url": "https://github.com/openclaw/openclaw/pull/68836", "labels": [ "channel: telegram", "size: XS" ], "merged": false, "number": 68836, "review_comments_count": 0, "state": "open", "title": "fix(telegram): add success log lines for media send operations [AI-assisted]", "updated_at": "2026-04-19T06:18:06Z" }, { "additions": 402, "author": "hxy91819", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: macOS `ModelCatalogLoader` read `models.generated.ts/js` and evaluated the extracted payload as JavaScript, which triggered code scanning alert #187 (`swift/unsafe-js-eval`). - Why it matters: even though the main pat\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68835", "created_at": "2026-04-19T06:16:11Z", "deletions": 33, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68835/files", "html_url": "https://github.com/openclaw/openclaw/pull/68835", "labels": [ "app: macos", "maintainer", "size: M" ], "merged": false, "number": 68835, "review_comments_count": 5, "state": "open", "title": "fix(macos): stop evaluating model catalogs as JS", "updated_at": "2026-04-20T11:26:11Z" }, { "additions": 1813, "author": "SARAMALI15792", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68776 - Prevent Discord inbound messages from silently hanging forever when `type: \"acp\"` bindings are configured on fresh gateway boot. ## What & Why **Problem:** Discord channel preflights hang silently when ACP binding\u2026", "changed_files": 17, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68834", "created_at": "2026-04-19T06:01:45Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68834/files", "html_url": "https://github.com/openclaw/openclaw/pull/68834", "labels": [ "docs", "gateway", "agents", "size: M", "extensions: acpx" ], "merged": false, "number": 68834, "review_comments_count": 10, "state": "open", "title": "fix: prevent Discord ACP binding silent hang on fresh gateway boot", "updated_at": "2026-04-19T12:14:39Z" }, { "additions": 50, "author": "ayeshakhalid192007-dev", "author_association": "CONTRIBUTOR", "body_excerpt": "## What & Why Telegram `customCommands` defined by operators were silently dropped on startup whenever the combined native + plugin + custom command list exceeded Telegram's 100-command or 5700-char `setMyCommands` payload cap. `allCommand\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68833", "created_at": "2026-04-19T05:41:21Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68833/files", "html_url": "https://github.com/openclaw/openclaw/pull/68833", "labels": [ "channel: telegram", "size: S" ], "merged": false, "number": 68833, "review_comments_count": 0, "state": "open", "title": "fix(telegram): preserve customCommands priority in menu budget trimming", "updated_at": "2026-04-21T07:41:54Z" }, { "additions": 71, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes issue where --tools CSV argument stores space-separated string instead of array on Windows PowerShell. ## Root Cause On Windows PowerShell, commas in --tools argument are parsed as PowerShell array separators and re-joined\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68832", "created_at": "2026-04-19T05:25:45Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68832/files", "html_url": "https://github.com/openclaw/openclaw/pull/68832", "labels": [ "cli", "agents", "size: S", "r: too-many-prs" ], "merged": false, "number": 68832, "review_comments_count": 0, "state": "closed", "title": "fix(cron): support space-separated tools list for PowerShell compatibility", "updated_at": "2026-04-19T05:27:04Z" }, { "additions": 44, "author": "melderan", "author_association": "NONE", "body_excerpt": "## Problem `getCachedPluginJitiLoader` scopes its cache key with `jitiFilename ?? modulePath`, which creates a separate JITI instance for every plugin file \u2014 even when all plugins have identical `{tryNative, aliasMap}` configurations. Each\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68831", "created_at": "2026-04-19T05:16:56Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68831/files", "html_url": "https://github.com/openclaw/openclaw/pull/68831", "labels": [ "size: XS" ], "merged": false, "number": 68831, "review_comments_count": 1, "state": "open", "title": "perf: share JITI instances across plugins with identical alias configs", "updated_at": "2026-04-19T09:05:40Z" }, { "additions": 8, "author": "tianhaocui", "author_association": "NONE", "body_excerpt": "Fixes #68166 ## Summary `mergeHybridResults()` computes per-result `vectorScore` (cosine similarity) and `textScore` (BM25) internally but drops them when building the final output array. This prevents consumers from inspecting individual\u2026", "changed_files": 3, "cluster_id": "cluster-68166-3", "cluster_ids": [ "cluster-68166-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68830", "created_at": "2026-04-19T05:10:09Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68830/files", "html_url": "https://github.com/openclaw/openclaw/pull/68830", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 68830, "review_comments_count": 0, "state": "open", "title": "fix(memory): expose vectorScore and textScore in hybrid search results", "updated_at": "2026-04-19T05:11:11Z" }, { "additions": 259, "author": "tianhaocui", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68760 ## Summary The Control UI writes the runtime sentinel `\"last\"` as a literal value into `jobs.json` when saving a cron job with an empty delivery channel field. This causes user-configured channels (e.g. `\"telegram\"`) to be ove\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68829", "created_at": "2026-04-19T05:07:37Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68829/files", "html_url": "https://github.com/openclaw/openclaw/pull/68829", "labels": [ "app: web-ui", "size: M" ], "merged": true, "number": 68829, "review_comments_count": 1, "state": "closed", "title": "fix(cron): stop persisting \"last\" as literal delivery channel value", "updated_at": "2026-04-19T06:39:40Z" }, { "additions": 0, "author": "tianhaocui", "author_association": "NONE", "body_excerpt": "Fixes #68661 ## Summary Removes the overly broad `requiresHeredocApproval` gate in `bash-tools.exec-host-gateway.ts` that forces an approval prompt for **all** heredoc commands in allowlist mode, even when the target binary is already in t\u2026", "changed_files": 1, "cluster_id": "cluster-68661-4", "cluster_ids": [ "cluster-68661-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68824", "created_at": "2026-04-19T04:50:42Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68824/files", "html_url": "https://github.com/openclaw/openclaw/pull/68824", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68824, "review_comments_count": 0, "state": "open", "title": "fix: remove blanket heredoc approval gate in allowlist mode", "updated_at": "2026-04-19T05:04:56Z" }, { "additions": 166, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Summary Hardcoded embedding constants (, , etc.) are hard to tune when using rate-limited providers like Gemini. This makes them configurable via `openclaw.json`. ## Changes - Renamed module-level constants to `DEFAULT_*` and exported t\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68822", "created_at": "2026-04-19T04:46:24Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68822/files", "html_url": "https://github.com/openclaw/openclaw/pull/68822", "labels": [ "extensions: memory-core", "size: S" ], "merged": false, "number": 68822, "review_comments_count": 8, "state": "open", "title": "feat(memory): make embedding retry/concurrency parameters configurable", "updated_at": "2026-04-19T06:42:33Z" }, { "additions": 3199, "author": "Ittiz", "author_association": "NONE", "body_excerpt": "## Summary - Problem: assistant replies with managed media, especially image-only replies and agent-run audio replies, could render live in webchat/control UI but fail to persist correctly into transcript/history. - Why it matters: users c\u2026", "changed_files": 24, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68821", "created_at": "2026-04-19T04:39:37Z", "deletions": 158, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68821/files", "html_url": "https://github.com/openclaw/openclaw/pull/68821", "labels": [ "app: web-ui", "gateway", "size: XL" ], "merged": false, "number": 68821, "review_comments_count": 4, "state": "closed", "title": "fix(gateway,ui): restore managed media transcript persistence in webchat", "updated_at": "2026-04-19T05:16:01Z" }, { "additions": 3, "author": "name5566", "author_association": "NONE", "body_excerpt": "## Summary Inject OPENCLAW_SESSION_KEY environment variable into child processes spawned by the exec tool, allowing scripts and skills to reliably identify the current session without relying on model parameter passing. ## Problem Currentl\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68820", "created_at": "2026-04-19T04:38:23Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68820/files", "html_url": "https://github.com/openclaw/openclaw/pull/68820", "labels": [ "docs", "agents", "size: XS" ], "merged": false, "number": 68820, "review_comments_count": 0, "state": "closed", "title": "feat(exec): inject OPENCLAW_SESSION_KEY env var for child processes", "updated_at": "2026-04-19T05:27:33Z" }, { "additions": 317, "author": "HaseebDev", "author_association": "NONE", "body_excerpt": "## Summary - Problem: On Windows, every `provider=claude-cli` spawn fails at the supervisor with `spawn claude ENOENT`; the fallback chain cascades and the user sees `Embedded agent failed before reply`. - Why it matters: Claude CLI is unu\u2026", "changed_files": 3, "cluster_id": "cluster-68788-4", "cluster_ids": [ "cluster-68788-4" ], "cluster_role": "canonical", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68819", "created_at": "2026-04-19T04:31:34Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68819/files", "html_url": "https://github.com/openclaw/openclaw/pull/68819", "labels": [ "size: M" ], "merged": false, "number": 68819, "review_comments_count": 7, "state": "open", "title": "fix: resolve Windows .cmd shims to underlying .exe before spawn", "updated_at": "2026-04-19T07:38:23Z" }, { "additions": 13, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68788 On Windows, spawning `claude` (and similar CLI tools installed via npm) fails with `ENOENT` because `resolveWindowsCommandShim` only appends `.cmd` for a hardcoded allowlist of commands (`npm`, `pnpm`, `yarn`, `npx`). This PR\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68817", "created_at": "2026-04-19T04:26:02Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68817/files", "html_url": "https://github.com/openclaw/openclaw/pull/68817", "labels": [ "size: XS" ], "merged": false, "number": 68817, "review_comments_count": 0, "state": "closed", "title": "fix: add claude, codex, hermes to Windows .cmd shim allowlist", "updated_at": "2026-04-19T21:59:44Z" }, { "additions": 229, "author": "aniaan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** Moonshot just released Kimi K2.6 and the K2.6-only `thinking.keep` parameter for full multi-turn `reasoning_content` retention; the bundled plugin still defaulted to K2.5 and had no way to opt into keep. - **Why i\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68816", "created_at": "2026-04-19T04:23:08Z", "deletions": 25, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68816/files", "html_url": "https://github.com/openclaw/openclaw/pull/68816", "labels": [ "docs", "gateway", "agents", "size: S" ], "merged": true, "number": 68816, "review_comments_count": 3, "state": "closed", "title": "feat(moonshot): default to Kimi K2.6 with K2.6-only thinking.keep support", "updated_at": "2026-04-21T01:04:55Z" }, { "additions": 43, "author": "rubencu", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - split the source docs into an explicit `pnpm gateway:watch` dev loop and a separate built-dist / onboarding flow - restore `pnpm openclaw setup` as the first-run/reset step for source dev, instead of implying it belongs in eve\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68814", "created_at": "2026-04-19T04:03:26Z", "deletions": 14, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68814/files", "html_url": "https://github.com/openclaw/openclaw/pull/68814", "labels": [ "docs", "cli", "size: XS" ], "merged": true, "number": 68814, "review_comments_count": 0, "state": "closed", "title": "docs: clarify source Control UI dev/build flow", "updated_at": "2026-04-19T06:48:32Z" }, { "additions": 556, "author": "soloclz", "author_association": "NONE", "body_excerpt": "## Summary - Problem: configs for the bundled `comfy` provider were rejected when placed under `models.providers.comfy`, even when they matched the documented example, because `models.providers.` was only ever validated against the cor\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68813", "created_at": "2026-04-19T03:55:16Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68813/files", "html_url": "https://github.com/openclaw/openclaw/pull/68813", "labels": [ "docs", "size: L" ], "merged": false, "number": 68813, "review_comments_count": 12, "state": "open", "title": "fix(config): validate plugin-owned model providers", "updated_at": "2026-04-21T17:44:35Z" }, { "additions": 5116, "author": "jdc4429", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 38, "cluster_id": "cluster-36488-17", "cluster_ids": [ "cluster-36488-17" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68808", "created_at": "2026-04-19T03:46:12Z", "deletions": 1911, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68808/files", "html_url": "https://github.com/openclaw/openclaw/pull/68808", "labels": [ "app: web-ui", "gateway", "agents", "size: XL" ], "merged": false, "number": 68808, "review_comments_count": 44, "state": "open", "title": "Jdc4429 custom build", "updated_at": "2026-04-21T17:22:30Z" }, { "additions": 860, "author": "kesslerio", "author_association": "NONE", "body_excerpt": "## Summary - Problem: native Codex app-server sessions let MCP tool approval elicitations fall through to the fail-closed client fallback, which surfaced Codex Apps GitHub writes as immediate `user rejected MCP tool call` failures. - Why i\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68807", "created_at": "2026-04-19T03:40:39Z", "deletions": 97, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68807/files", "html_url": "https://github.com/openclaw/openclaw/pull/68807", "labels": [ "size: L", "extensions: codex" ], "merged": false, "number": 68807, "review_comments_count": 5, "state": "open", "title": "fix(codex): bridge MCP tool approval elicitations", "updated_at": "2026-04-19T05:24:58Z" }, { "additions": 116, "author": "lawrence3699", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `parseTtsDirectives` treated literal `[[tts:...]]` tokens inside inline code spans and fenced code blocks as real directives. - Why it matters: in `messages.tts.auto=\"tagged\"`, troubleshooting or documentation replies\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68806", "created_at": "2026-04-19T03:40:30Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68806/files", "html_url": "https://github.com/openclaw/openclaw/pull/68806", "labels": [ "size: S" ], "merged": false, "number": 68806, "review_comments_count": 2, "state": "closed", "title": "[AI-assisted] fix(tts): ignore literal directives inside markdown code", "updated_at": "2026-04-19T03:50:08Z" }, { "additions": 724, "author": "CuzG-lab", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Non-trivial work on this repo does not yet have a convention for where per-phase plans, research notes, and codebase-map artifacts live. Multiple agents working on the same phase end up duplicating research and re-der\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68803", "created_at": "2026-04-19T03:28:59Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68803/files", "html_url": "https://github.com/openclaw/openclaw/pull/68803", "labels": [ "size: L" ], "merged": false, "number": 68803, "review_comments_count": 0, "state": "open", "title": "Repo meta: add .planning/ GSD workflow scaffold", "updated_at": "2026-04-19T03:29:58Z" }, { "additions": 103671, "author": "Eruditi", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 18859, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 8, "conversation_url": "https://github.com/openclaw/openclaw/pull/68802", "created_at": "2026-04-19T03:26:15Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68802/files", "html_url": "https://github.com/openclaw/openclaw/pull/68802", "labels": [ "size: XL" ], "merged": false, "number": 68802, "review_comments_count": 15, "state": "closed", "title": "Translate documentation to Chinese", "updated_at": "2026-04-19T08:59:27Z" }, { "additions": 7, "author": "CuzG-lab", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `pruneAgentRunCache()` clears `agentRunCache` entries on TTL but never touches the sibling `agentRunStarts` map, so timestamps for runs that lose their terminal lifecycle event (crash, race, forced disconnect) accumul\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68801", "created_at": "2026-04-19T03:25:41Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68801/files", "html_url": "https://github.com/openclaw/openclaw/pull/68801", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68801, "review_comments_count": 2, "state": "open", "title": "Gateway: prune orphaned agentRunStarts entries", "updated_at": "2026-04-19T03:28:22Z" }, { "additions": 40, "author": "jasonmakr", "author_association": "NONE", "body_excerpt": "## Problem `openclaw mcp serve` writes config warnings and other log output to **stdout**, polluting the MCP JSON-RPC message stream. MCP stdio clients (e.g. Hermes Agent) that strictly parse stdout encounter non-JSON text before the first\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68800", "created_at": "2026-04-19T03:25:12Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68800/files", "html_url": "https://github.com/openclaw/openclaw/pull/68800", "labels": [ "size: XS" ], "merged": false, "number": 68800, "review_comments_count": 1, "state": "open", "title": "fix: route logs to stderr in `openclaw mcp serve` (fixes #68587)", "updated_at": "2026-04-19T03:27:10Z" }, { "additions": 293, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem When the primary model is unavailable (rate limit, overloaded, etc.) and a fallback model is selected automatically, the fallback model override (`modelOverrideSource: 'auto'`) is persisted to session state via `persistFallbackC\u2026", "changed_files": 4, "cluster_id": "cluster-36410-5", "cluster_ids": [ "cluster-36410-5" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68798", "created_at": "2026-04-19T03:22:35Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68798/files", "html_url": "https://github.com/openclaw/openclaw/pull/68798", "labels": [ "size: M" ], "merged": false, "number": 68798, "review_comments_count": 1, "state": "open", "title": "fix: prevent auto-fallback model from persisting into session state", "updated_at": "2026-04-19T03:25:15Z" }, { "additions": 15, "author": "vvitovec", "author_association": "NONE", "body_excerpt": "## Summary - add `claude` to the Windows `.cmd` shim allowlist used by the child supervisor adapter - cover the regression with a focused Windows child-spawn test ## Why Windows installs the Claude CLI as `claude.cmd`. The child adapter al\u2026", "changed_files": 2, "cluster_id": "cluster-68788-4", "cluster_ids": [ "cluster-68788-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68792", "created_at": "2026-04-19T03:07:29Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68792/files", "html_url": "https://github.com/openclaw/openclaw/pull/68792", "labels": [ "size: XS" ], "merged": false, "number": 68792, "review_comments_count": 0, "state": "open", "title": "fix(process): shim claude on Windows child spawns", "updated_at": "2026-04-19T03:08:21Z" }, { "additions": 132, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68713 When making outbound calls with `realtime.enabled = true`, the OpenAI Realtime voice bridge consistently failed with \"WebSocket was closed before the connection was established\". This was caused by a race condition\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68787", "created_at": "2026-04-19T02:58:02Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68787/files", "html_url": "https://github.com/openclaw/openclaw/pull/68787", "labels": [ "channel: voice-call", "size: S", "r: too-many-prs" ], "merged": false, "number": 68787, "review_comments_count": 0, "state": "closed", "title": "fix(voice-call): skip speakInitialMessage when realtime mode is active", "updated_at": "2026-04-19T02:59:25Z" }, { "additions": 278, "author": "chrisabad", "author_association": "NONE", "body_excerpt": "## Summary Add `CommandLaneCircuitBreakerError` and opt-in circuit breaker options (`circuitBreakerDepth`, `circuitBreakerWaitMs`) to `enqueueCommandInLane`. Enable by default for the main run lane: depth >= 9 or oldest queued entry wait >\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68785", "created_at": "2026-04-19T02:54:51Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68785/files", "html_url": "https://github.com/openclaw/openclaw/pull/68785", "labels": [ "size: M" ], "merged": false, "number": 68785, "review_comments_count": 2, "state": "open", "title": "feat: add circuit breaker for command lane saturation", "updated_at": "2026-04-19T02:58:18Z" }, { "additions": 164, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68760 \u2014 Cron job delivery channel reverts to `last` after execution, overwriting the user-configured value (e.g. `telegram`). ## Problem After a cron job executes, the `delivery.channel` field in `jobs.json` can be overwr\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68783", "created_at": "2026-04-19T02:36:57Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68783/files", "html_url": "https://github.com/openclaw/openclaw/pull/68783", "labels": [ "size: S" ], "merged": false, "number": 68783, "review_comments_count": 3, "state": "open", "title": "fix(cron): preserve delivery config across job executions (#68760)", "updated_at": "2026-04-20T00:22:46Z" }, { "additions": 8, "author": "ajfonthemove", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Docs show `contextTokens` override at `models.providers.openai-codex.models[]`, but for OAuth-configured providers the gateway validator requires `baseUrl` and model `name` \u2014 fields that don't apply to auto-configured\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68775", "created_at": "2026-04-19T02:24:05Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68775/files", "html_url": "https://github.com/openclaw/openclaw/pull/68775", "labels": [ "docs", "invalid", "gateway", "size: XS" ], "merged": false, "number": 68775, "review_comments_count": 1, "state": "closed", "title": "docs(providers): fix contextTokens placement for openai-codex", "updated_at": "2026-04-19T03:36:05Z" }, { "additions": 192, "author": "solomonneas", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Dreaming short-term promotion writes raw `Candidate: ... confidence: ... evidence: ... recalls: ... status: staged` rows into `MEMORY.md`, silently pushing the file past the 12KB bootstrap cap. Issue #67580 reports th\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68774", "created_at": "2026-04-19T02:22:15Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68774/files", "html_url": "https://github.com/openclaw/openclaw/pull/68774", "labels": [ "extensions: memory-core", "size: S" ], "merged": false, "number": 68774, "review_comments_count": 1, "state": "open", "title": "fix(memory-core): prevent staged dream candidates from leaking into MEMORY.md", "updated_at": "2026-04-19T10:34:48Z" }, { "additions": 49, "author": "SimbaKingjoe", "author_association": "NONE", "body_excerpt": "# fix(active-memory): skip payload-less memory_search toolResults in transcript debug lookup ## Summary - **Problem:** `readActiveMemorySearchDebug` used `asRecord(details?.debug) ?? {}`, which forced an empty object `{}` when the `debug`\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68773", "created_at": "2026-04-19T02:17:20Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68773/files", "html_url": "https://github.com/openclaw/openclaw/pull/68773", "labels": [ "size: S" ], "merged": false, "number": 68773, "review_comments_count": 0, "state": "open", "title": "fix(active-memory): skip payload-less memory_search toolResults in tr\u2026", "updated_at": "2026-04-19T02:18:05Z" }, { "additions": 525, "author": "cholaolu-boop", "author_association": "NONE", "body_excerpt": "## Problem When `readSessionMessages` is called for the configured main session (as returned by `resolveMainSessionKey` \u2014 `\"global\"`, `\"agent:main:main\"`, or any `agent::` your config resolves to) and that session's `sess\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68765", "created_at": "2026-04-19T01:49:31Z", "deletions": 38, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68765/files", "html_url": "https://github.com/openclaw/openclaw/pull/68765", "labels": [ "gateway", "size: L" ], "merged": false, "number": 68765, "review_comments_count": 17, "state": "open", "title": "fix(gateway): preserve chat history across compaction checkpoint chains", "updated_at": "2026-04-20T19:44:02Z" }, { "additions": 6, "author": "Kailigithub", "author_association": "NONE", "body_excerpt": "## Problem Closes #68706 When auto-fallback selects an alternative model (e.g. primary model is rate-limited), it writes `modelOverride`/`providerOverride`/`modelOverrideSource:\"auto\"` to the persisted session store. A rollback mechanism c\u2026", "changed_files": 1, "cluster_id": "cluster-36410-5", "cluster_ids": [ "cluster-36410-5" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68764", "created_at": "2026-04-19T01:47:57Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68764/files", "html_url": "https://github.com/openclaw/openclaw/pull/68764", "labels": [ "size: XS" ], "merged": false, "number": 68764, "review_comments_count": 0, "state": "open", "title": "fix: ignore stale auto-fallback model overrides on session reload", "updated_at": "2026-04-19T01:49:25Z" }, { "additions": 31, "author": "Kailigithub", "author_association": "NONE", "body_excerpt": "## Problem Closes #68704 When using Gemma 4 models via LM Studio, Ollama, or vLLM (OpenAI-compatible endpoints), `reasoning_content` from prior turns is re-sent in the conversation history. Google Gemma 4 documentation explicitly states th\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68763", "created_at": "2026-04-19T01:45:42Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68763/files", "html_url": "https://github.com/openclaw/openclaw/pull/68763", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68763, "review_comments_count": 2, "state": "open", "title": "fix: strip reasoning_content from conversation history for Gemma 4 models", "updated_at": "2026-04-19T01:50:56Z" }, { "additions": 4, "author": "Kailigithub", "author_association": "NONE", "body_excerpt": "## Problem Closes #68728 Gemma 4 models (e.g. `gemma4:12b`, `gemma4:27b`) support native thinking mode in Ollama, but `isReasoningModelHeuristic()` does not match `gemma4` model IDs. The existing pattern `/r1|reasoning|think|reason/i` only\u2026", "changed_files": 3, "cluster_id": "cluster-68193-4", "cluster_ids": [ "cluster-68193-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68762", "created_at": "2026-04-19T01:33:25Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68762/files", "html_url": "https://github.com/openclaw/openclaw/pull/68762", "labels": [ "size: XS", "extensions: huggingface" ], "merged": false, "number": 68762, "review_comments_count": 0, "state": "open", "title": "fix: detect Gemma 4 models as reasoning models", "updated_at": "2026-04-19T01:34:40Z" }, { "additions": 1, "author": "juggsnjava-git", "author_association": "NONE", "body_excerpt": "latest from fork + readme", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68759", "created_at": "2026-04-19T01:27:27Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68759/files", "html_url": "https://github.com/openclaw/openclaw/pull/68759", "labels": [ "size: XS" ], "merged": false, "number": 68759, "review_comments_count": 1, "state": "closed", "title": "Juggsnjava git patch 1", "updated_at": "2026-04-19T01:28:24Z" }, { "additions": 323577, "author": "mylukin", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **inject.ts**: MAX_LESSONS 3\u219210\uff0cDEFAULT_MAX_TOKENS 600\u21922000\u3002\u5404 agent session \u542f\u52a8\u65f6\u6ce8\u5165\u6700\u591a 10 \u6761\u6559\u8bad\uff08~500\u2013800 tokens\uff09\uff0c\u53ef\u89c1\u7387\u4ece 6% \u63d0\u5347\u5230 ~20% - **src/hit.ts** (\u65b0\u589e): `hitLesson()` \u2014 \u589e\u91cf hitCount + lastHitAt\uff0chitCount \u2265 2 \u81ea\u52a8\u5347\u7ea7\u5230 `high`\uff0c\u2265 4 \u5347\u7ea7\u5230 `cri\u2026", "changed_files": 351, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68758", "created_at": "2026-04-19T01:26:54Z", "deletions": 1287, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68758/files", "html_url": "https://github.com/openclaw/openclaw/pull/68758", "labels": [ "docs", "channel: discord", "channel: mattermost", "channel: msteams", "channel: telegram", "app: web-ui", "gateway", "extensions: memory-core", "scripts", "commands", "agents", "channel: feishu", "size: XL", "extensions: anthropic", "extensions: openai", "extensions: memory-wiki" ], "merged": false, "number": 68758, "review_comments_count": 2, "state": "closed", "title": "feat(lesson-engine): v2 \u2014 MAX_LESSONS=10, hit command, auto-upgrade", "updated_at": "2026-04-19T01:30:50Z" }, { "additions": 458, "author": "jaredmarin", "author_association": "NONE", "body_excerpt": null, "changed_files": 40, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68756", "created_at": "2026-04-19T01:22:18Z", "deletions": 1790, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68756/files", "html_url": "https://github.com/openclaw/openclaw/pull/68756", "labels": [ "docs", "size: XL" ], "merged": false, "number": 68756, "review_comments_count": 1, "state": "closed", "title": "feat: integrate Mission Control v3.0 UI updates", "updated_at": "2026-04-19T07:24:06Z" }, { "additions": 17, "author": "bluesky6868", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: The healthcheck skill told agents to probe `ufw status` / `firewall-cmd --state` from the caller's shell `PATH`. On Debian/Ubuntu, `ufw` lives in `/usr/sbin` and `/sbin`, which are absent from a non-root user's de\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68755", "created_at": "2026-04-19T01:12:44Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68755/files", "html_url": "https://github.com/openclaw/openclaw/pull/68755", "labels": [ "size: XS" ], "merged": false, "number": 68755, "review_comments_count": 1, "state": "open", "title": "security(healthcheck): probe ufw/firewall-cmd via safe PATH and config fallback", "updated_at": "2026-04-19T01:28:19Z" }, { "additions": 2, "author": "Kailigithub", "author_association": "NONE", "body_excerpt": "## Problem Closes #68661 In allowlist security mode, any command containing a heredoc (`<<`) unconditionally triggers an approval prompt, even when: 1. The target binary is in the allowlist (`allowlistSatisfied === true`) 2. Command analys\u2026", "changed_files": 1, "cluster_id": "cluster-68661-4", "cluster_ids": [ "cluster-68661-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68754", "created_at": "2026-04-19T01:10:56Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68754/files", "html_url": "https://github.com/openclaw/openclaw/pull/68754", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68754, "review_comments_count": 0, "state": "open", "title": "fix: remove unconditional heredoc approval in allowlist mode", "updated_at": "2026-04-19T01:16:40Z" }, { "additions": 21, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68743 ## Problem The Memory Dreaming Promotion cron job uses `payload.kind='systemEvent'`, which gets the default 10-minute timeout (`DEFAULT_JOB_TIMEOUT_MS`). However, dreaming triggers a full agent turn via the main session heartb\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68753", "created_at": "2026-04-19T01:08:46Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68753/files", "html_url": "https://github.com/openclaw/openclaw/pull/68753", "labels": [ "size: XS" ], "merged": false, "number": 68753, "review_comments_count": 1, "state": "open", "title": "fix: allow systemEvent cron jobs to specify custom timeoutSeconds", "updated_at": "2026-04-19T01:12:53Z" }, { "additions": 5, "author": "Kailigithub", "author_association": "NONE", "body_excerpt": "## Problem Closes #68470 MiniMax models (M2.5, M2.7) report cache hits via `prompt_cache_hit_tokens` in the usage response, but this field was not recognized by the token accounting pipeline. Since MiniMax includes cached tokens in `prompt\u2026", "changed_files": 1, "cluster_id": "cluster-68470-3", "cluster_ids": [ "cluster-68470-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68750", "created_at": "2026-04-19T01:04:20Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68750/files", "html_url": "https://github.com/openclaw/openclaw/pull/68750", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68750, "review_comments_count": 0, "state": "open", "title": "fix: handle MiniMax prompt_cache_hit_tokens to prevent token double-counting", "updated_at": "2026-04-19T01:05:05Z" }, { "additions": 1, "author": "Kailigithub", "author_association": "NONE", "body_excerpt": "## Problem Closes #68707 When using local OpenAI-compatible backends (llama.cpp, LM Studio, Ollama), `stream_options: { include_usage: true }` is never sent in streaming requests. This causes context token usage to always show 0% in `/stat\u2026", "changed_files": 1, "cluster_id": "cluster-68707-3", "cluster_ids": [ "cluster-68707-3" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68749", "created_at": "2026-04-19T01:03:09Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68749/files", "html_url": "https://github.com/openclaw/openclaw/pull/68749", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68749, "review_comments_count": 2, "state": "open", "title": "fix: enable stream_options.include_usage for local openai-completions endpoints", "updated_at": "2026-04-19T01:05:18Z" }, { "additions": 3, "author": "Kailigithub", "author_association": "NONE", "body_excerpt": "## Problem Closes #68709 On Linux, the atomic config write creates a temp file with `mode: 0o600`, then calls `rename()` to replace the target. However, `rename(2)` preserves the existing inode permissions, so the resulting file ends up wi\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68748", "created_at": "2026-04-19T01:02:35Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68748/files", "html_url": "https://github.com/openclaw/openclaw/pull/68748", "labels": [ "size: XS" ], "merged": false, "number": 68748, "review_comments_count": 1, "state": "closed", "title": "fix: enforce chmod 0o600 after atomic rename of config file", "updated_at": "2026-04-19T02:18:45Z" }, { "additions": 37, "author": "neeravmakwana", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: The `pdf` tool can hang indefinitely when fetching a large remote PDF whose body read stalls (reported with a 244\u2011page `www-cdn.anthropic.com` download). The entire agent session becomes a zombie \u2014 subsequent messages\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68747", "created_at": "2026-04-19T01:02:07Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68747/files", "html_url": "https://github.com/openclaw/openclaw/pull/68747", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68747, "review_comments_count": 0, "state": "open", "title": "PDF tool: abort stalled remote fetch after 30s idle timeout", "updated_at": "2026-04-19T01:04:00Z" }, { "additions": 31, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68707 ## Problem `buildOpenAICompletionsParams()` only included `stream_options: { include_usage: true }` when `compat.supportsUsageInStreaming` was true. For non-standard/custom endpoints (llama-cpp, LM Studio, etc.), this flag res\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68746", "created_at": "2026-04-19T01:00:27Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68746/files", "html_url": "https://github.com/openclaw/openclaw/pull/68746", "labels": [ "agents", "size: XS" ], "merged": true, "number": 68746, "review_comments_count": 0, "state": "closed", "title": "fix: always send stream_options.include_usage when streaming (openai-completions)", "updated_at": "2026-04-19T02:15:08Z" }, { "additions": 14, "author": "chrisabad", "author_association": "NONE", "body_excerpt": "## Summary When the Slack extension's `registry.ts` module is loaded twice \u2014 once through jiti (plugin registration) and once through native `import()` (runtime dispatch) \u2014 each load creates its own `Map` instance. Routes registered on the\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68745", "created_at": "2026-04-19T00:58:23Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68745/files", "html_url": "https://github.com/openclaw/openclaw/pull/68745", "labels": [ "channel: slack", "size: XS" ], "merged": false, "number": 68745, "review_comments_count": 1, "state": "open", "title": "fix(slack): share HTTP route registry via globalThis across module instances", "updated_at": "2026-04-19T21:38:01Z" }, { "additions": 701, "author": "masatohoshino", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary On the WhatsApp channel, audio replies flagged with `[[audio_as_voice]]` were being delivered as generic document attachments instead of native PTT (push-to-talk) voice notes. This matters because WhatsApp presents voice notes d\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/68744", "created_at": "2026-04-19T00:58:20Z", "deletions": 16, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68744/files", "html_url": "https://github.com/openclaw/openclaw/pull/68744", "labels": [ "channel: whatsapp-web", "size: L" ], "merged": false, "number": 68744, "review_comments_count": 3, "state": "open", "title": "fix(whatsapp): respect audioAsVoice flag in outbound delivery", "updated_at": "2026-04-19T22:48:29Z" }, { "additions": 12, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Summary Fixes #68707 When using custom openai-completions endpoints (llama-cpp, LM Studio, DashScope, etc.), stream_options.include_usage: true was never injected into the request payload, causing /status to always show 0% context usage\u2026", "changed_files": 4, "cluster_id": "cluster-68707-3", "cluster_ids": [ "cluster-68707-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68742", "created_at": "2026-04-19T00:48:20Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68742/files", "html_url": "https://github.com/openclaw/openclaw/pull/68742", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68742, "review_comments_count": 2, "state": "open", "title": "fix(agents): restore streaming usage tracking for non-native openai-completions providers", "updated_at": "2026-04-19T00:53:49Z" }, { "additions": 283, "author": "alexlomt", "author_association": "NONE", "body_excerpt": "## Summary - avoid forwarding per-session MCP servers when ACPX launches the built-in `openclaw` agent - keep existing per-session MCP behavior for other ACP agents - add runtime coverage for openclaw-only delegate routing ## Root cause `a\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68741", "created_at": "2026-04-19T00:47:38Z", "deletions": 25, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68741/files", "html_url": "https://github.com/openclaw/openclaw/pull/68741", "labels": [ "size: M", "extensions: acpx" ], "merged": false, "number": 68741, "review_comments_count": 2, "state": "open", "title": "fix(acpx): avoid per-session MCP on openclaw bridge", "updated_at": "2026-04-19T00:57:31Z" }, { "additions": 37, "author": "neeravmakwana", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `gemma4` tags in Ollama (e.g. `gemma4`, `gemma4:12b`, `gemma4:27b`, `gemma4:31b`) were not detected as reasoning models, so the Ollama thinking-mode plumbing and reasoning-aware provider defaults silently fell back to\u2026", "changed_files": 4, "cluster_id": "cluster-68193-4", "cluster_ids": [ "cluster-68193-4" ], "cluster_role": "canonical", "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68740", "created_at": "2026-04-19T00:47:25Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68740/files", "html_url": "https://github.com/openclaw/openclaw/pull/68740", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68740, "review_comments_count": 1, "state": "open", "title": "Ollama/models: detect Gemma 4 and `thinking` capability as reasoning", "updated_at": "2026-04-19T00:56:51Z" }, { "additions": 37, "author": "bohell", "author_association": "NONE", "body_excerpt": "## Problem When the Mattermost WebSocket connection enters a **zombie state** (TCP connected but no longer receiving events), the bot stays alive and can still send messages via REST API, but **stops receiving all incoming messages**. The\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68737", "created_at": "2026-04-19T00:35:02Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68737/files", "html_url": "https://github.com/openclaw/openclaw/pull/68737", "labels": [ "channel: mattermost", "size: XS" ], "merged": false, "number": 68737, "review_comments_count": 2, "state": "open", "title": "fix(mattermost): auto-reconnect WebSocket after consecutive health check failures", "updated_at": "2026-04-21T08:37:33Z" }, { "additions": 3476, "author": "LightDriverCS", "author_association": "NONE", "body_excerpt": "## Summary Harden the memory-wiki vault so it's deterministic and trustworthy for daily use. Kills three pipeline bugs responsible for most of the current 42 lint errors + 682 warnings, codifies the canonical page standard in code + docs,\u2026", "changed_files": 33, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68736", "created_at": "2026-04-19T00:23:07Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68736/files", "html_url": "https://github.com/openclaw/openclaw/pull/68736", "labels": [ "extensions: memory-core", "size: XL", "extensions: memory-wiki" ], "merged": false, "number": 68736, "review_comments_count": 4, "state": "closed", "title": "fix(memory-wiki): standardize page schema + repair pipeline", "updated_at": "2026-04-19T00:28:50Z" }, { "additions": 246, "author": "stroupaloop", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** `before_prompt_build` hook fires in `setup.ts` where `availableTools` is always empty, so plugins can never classify tools or return meaningful `toolsAllow`. Symmetrically, plugins had no way to narrow the skill c\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68734", "created_at": "2026-04-19T00:01:19Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68734/files", "html_url": "https://github.com/openclaw/openclaw/pull/68734", "labels": [ "agents", "size: M" ], "merged": false, "number": 68734, "review_comments_count": 10, "state": "open", "title": "feat(hooks): allow prompt hooks to dynamically narrow tool + skill surface", "updated_at": "2026-04-21T13:11:43Z" }, { "additions": 45, "author": "dyz2102", "author_association": "NONE", "body_excerpt": "## Summary Fixes #68727. This changes audio media-understanding fallback behavior so API-provider audio transcription wins before local CLI auto-detection, and avoids passing a pre-wrapped proxy fetch into audio providers. Audio providers\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68733", "created_at": "2026-04-18T23:56:28Z", "deletions": 6, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68733/files", "html_url": "https://github.com/openclaw/openclaw/pull/68733", "labels": [ "size: S" ], "merged": false, "number": 68733, "review_comments_count": 0, "state": "open", "title": "Prefer API audio providers before local fallback", "updated_at": "2026-04-18T23:56:41Z" }, { "additions": 38, "author": "wirjo", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem Claude Opus 4.7 (launched April 16, 2026) is available on Bedrock Mantle via the **Anthropic Messages API** at `/anthropic/v1/messages`. This is the first Claude model on Mantle \u2014 older Claude models are NOT available. The exist\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68730", "created_at": "2026-04-18T23:49:30Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68730/files", "html_url": "https://github.com/openclaw/openclaw/pull/68730", "labels": [ "size: XS" ], "merged": false, "number": 68730, "review_comments_count": 6, "state": "open", "title": "feat(amazon-bedrock-mantle): add Claude Opus 4.7 via per-model Anthropic Messages API override", "updated_at": "2026-04-19T03:06:20Z" }, { "additions": 138, "author": "ender-wiggin-ai", "author_association": "NONE", "body_excerpt": "## Summary Extends the `before_prompt_build` hook so plugins can dynamically narrow the tool surface per-turn. ## Changes - Exposes `availableTools: string[]` on `PluginHookBeforePromptBuildEvent` so plugins can see which tools survived th\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68729", "created_at": "2026-04-18T23:49:15Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68729/files", "html_url": "https://github.com/openclaw/openclaw/pull/68729", "labels": [ "agents", "size: S" ], "merged": false, "number": 68729, "review_comments_count": 3, "state": "closed", "title": "feat(hooks): allow prompt hooks to dynamically narrow tool surface", "updated_at": "2026-04-18T23:57:37Z" }, { "additions": 389, "author": "BKF-Gitty", "author_association": "CONTRIBUTOR", "body_excerpt": "Error payloads from sessions_spawn and subagent wait outcomes now carry the context a parent needs to retry or report clearly: - sessions-spawn-tool: add role (requested agentId) to early validation errors, to the ACP register-failure payl\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68726", "created_at": "2026-04-18T23:45:47Z", "deletions": 35, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68726/files", "html_url": "https://github.com/openclaw/openclaw/pull/68726", "labels": [ "agents", "size: M" ], "merged": true, "number": 68726, "review_comments_count": 3, "state": "closed", "title": "fix(subagent): include role, session key, and timing in error payloads", "updated_at": "2026-04-19T22:31:35Z" }, { "additions": 51, "author": "wirjo", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem Mantle's `/v1/models` endpoint returns only model IDs \u2014 no token limit metadata. Discovery hardcodes `contextWindow: 32000` for every model, which is wrong for most: - MiniMax M2/M2.1: **1,000,000** (gets 32K) - Qwen3 Coder: **2\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68725", "created_at": "2026-04-18T23:34:17Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68725/files", "html_url": "https://github.com/openclaw/openclaw/pull/68725", "labels": [ "size: S" ], "merged": false, "number": 68725, "review_comments_count": 3, "state": "open", "title": "feat(amazon-bedrock-mantle): add known context windows for open-weight Mantle models", "updated_at": "2026-04-19T02:00:18Z" }, { "additions": 102, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: BlueBubbles attachment downloads were stripping the SSRF guard's pinned dispatcher before issuing the fetch. - Why it matters: attachment downloads could lose DNS pinning and reopen a DNS-rebinding / TOCTOU SSRF path.\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68724", "created_at": "2026-04-18T23:34:06Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68724/files", "html_url": "https://github.com/openclaw/openclaw/pull/68724", "labels": [ "channel: bluebubbles", "size: S" ], "merged": false, "number": 68724, "review_comments_count": 0, "state": "open", "title": "fix(bluebubbles): preserve pinned dispatcher for media fetches", "updated_at": "2026-04-19T16:27:32Z" }, { "additions": 44, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68709 ## Problem The main config writer in `src/config/io.ts` writes a tmp file with `mode: 0o600`, then atomically renames it over the target. On the **rename success path** (Linux), no `chmod` was applied afterward. Under a permis\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68722", "created_at": "2026-04-18T23:21:22Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68722/files", "html_url": "https://github.com/openclaw/openclaw/pull/68722", "labels": [ "size: XS" ], "merged": false, "number": 68722, "review_comments_count": 1, "state": "closed", "title": "fix: chmod openclaw.json to 0o600 after atomic rename on config write", "updated_at": "2026-04-19T02:18:45Z" }, { "additions": 25, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: the Codex app-server harness defaulted native sessions to `approvalPolicy: \"never\"`. - Why it matters: command-execution and file-change actions could proceed without surfacing the native approval bridge unless operat\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68721", "created_at": "2026-04-18T23:09:07Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68721/files", "html_url": "https://github.com/openclaw/openclaw/pull/68721", "labels": [ "docs", "size: XS", "extensions: codex" ], "merged": true, "number": 68721, "review_comments_count": 0, "state": "closed", "title": "fix(codex): default app-server approvals to on-request", "updated_at": "2026-04-21T00:06:59Z" }, { "additions": 5840, "author": "garrytan", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: OpenClaw's subagent dispatch has no persistence layer. Gateway crashes lose all in-flight work. Sub-agents that timeout or crash leave orphaned processes and session state. There is no cascade cancel (grandchildre\u2026", "changed_files": 49, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 10, "conversation_url": "https://github.com/openclaw/openclaw/pull/68718", "created_at": "2026-04-18T23:01:38Z", "deletions": 187, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68718/files", "html_url": "https://github.com/openclaw/openclaw/pull/68718", "labels": [ "docs", "app: web-ui", "gateway", "cli", "scripts", "agents", "size: XL" ], "merged": false, "number": 68718, "review_comments_count": 30, "state": "open", "title": "minions: durable SQLite-backed job queue for subagents, ACP, CLI, and cron", "updated_at": "2026-04-19T11:15:16Z" }, { "additions": 44, "author": "BKF-Gitty", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: Recurring cron jobs could accumulate consecutive failures indefinitely without notifying the user unless `cron.failureAlert.enabled` was explicitly set to `true`. - Why it matters: A recurring cron could fail many tim\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68717", "created_at": "2026-04-18T22:54:59Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68717/files", "html_url": "https://github.com/openclaw/openclaw/pull/68717", "labels": [ "size: XS" ], "merged": false, "number": 68717, "review_comments_count": 2, "state": "open", "title": "fix(cron): enable failure alerts by default for recurring jobs", "updated_at": "2026-04-18T23:08:46Z" }, { "additions": 497, "author": "coygeek", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: Discord guild-admin message actions could run with bot privileges without verifying that the requesting guild member held the corresponding Discord permissions. - Why it matters: any guild member who could message the\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68716", "created_at": "2026-04-18T22:54:21Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68716/files", "html_url": "https://github.com/openclaw/openclaw/pull/68716", "labels": [ "channel: discord", "size: L" ], "merged": false, "number": 68716, "review_comments_count": 2, "state": "open", "title": "fix: Discord guild-admin actions execute without requester...", "updated_at": "2026-04-18T23:00:18Z" }, { "additions": 3147, "author": "visionik", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68027. A `browser.cdpUrl` set to a bare `ws://host:port` without a `/devtools/...` path made `openclaw browser start` (and any `ensureBrowserAvailable` caller) fail with: ``` Browser attachOnly is enabled and profile \"ope\u2026", "changed_files": 12, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68715", "created_at": "2026-04-18T22:49:07Z", "deletions": 35, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68715/files", "html_url": "https://github.com/openclaw/openclaw/pull/68715", "labels": [ "docs", "maintainer", "size: XL" ], "merged": true, "number": 68715, "review_comments_count": 4, "state": "closed", "title": "fix(browser): discover CDP websocket from bare ws:// URL before attach", "updated_at": "2026-04-19T09:49:39Z" }, { "additions": 6, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Problem On Linux systemd deployments, `openclaw.json` ends up with mode `0664` (group-writable, world-readable) after gateway runtime hot-saves (e.g. `openclaw config set` or internal config API mutations). Since `openclaw.json` contain\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68714", "created_at": "2026-04-18T22:36:24Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68714/files", "html_url": "https://github.com/openclaw/openclaw/pull/68714", "labels": [ "size: XS" ], "merged": false, "number": 68714, "review_comments_count": 2, "state": "open", "title": "fix(config): openclaw.json written with 0664 mode instead of 0600 after hot-save", "updated_at": "2026-04-18T22:42:16Z" }, { "additions": 93, "author": "gaineyllc", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** On `api: \"openai-completions\"`, providers served from local or custom endpoints \u2014 vLLM (reported), LocalAI, SGLang, llama.cpp `--server`, Jan, LM Studio, text-generation-webui, TabbyAPI \u2014 have `supportsUsageInStre\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68711", "created_at": "2026-04-18T22:29:01Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68711/files", "html_url": "https://github.com/openclaw/openclaw/pull/68711", "labels": [ "agents", "size: S" ], "merged": false, "number": 68711, "review_comments_count": 2, "state": "open", "title": "fix(openai-completions): enable streaming usage for vLLM + local OpenAI-compat servers", "updated_at": "2026-04-18T22:48:16Z" }, { "additions": 171, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: Discord `/new` and `/reset` could bypass guild channel disable/allowlist and command-authorization guards when a configured ACP binding or route was present. - Why it matters: admins can disable or disallow a channel\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68710", "created_at": "2026-04-18T22:26:20Z", "deletions": 41, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68710/files", "html_url": "https://github.com/openclaw/openclaw/pull/68710", "labels": [ "channel: discord", "size: M" ], "merged": false, "number": 68710, "review_comments_count": 1, "state": "open", "title": "fix(discord): enforce guild guards for /new and /reset", "updated_at": "2026-04-18T22:37:48Z" }, { "additions": 68, "author": "Steady-ai", "author_association": "NONE", "body_excerpt": "## Summary - guard route.continue() inside guarded browser navigation so the known Playwright handled-route race does not unwind browser tasks - route both guarded continue() call sites through the same helper instead of duplicating the er\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68708", "created_at": "2026-04-18T22:24:42Z", "deletions": 2, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68708/files", "html_url": "https://github.com/openclaw/openclaw/pull/68708", "labels": [ "size: S" ], "merged": false, "number": 68708, "review_comments_count": 0, "state": "open", "title": "[codex] Guard browser route continue race", "updated_at": "2026-04-18T22:26:02Z" }, { "additions": 3348, "author": "coygeek", "author_association": "CONTRIBUTOR", "body_excerpt": "## Fix Summary Discord guild-admin mutation actions (`emoji-upload`, `sticker-upload`, `role-add`, `role-remove`, `channel-create`, `channel-edit`, `channel-delete`, `channel-move`, `category-create`, `category-edit`, `category-delete`, `e\u2026", "changed_files": 254, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68705", "created_at": "2026-04-18T22:13:40Z", "deletions": 8120, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68705/files", "html_url": "https://github.com/openclaw/openclaw/pull/68705", "labels": [ "docs", "channel: discord", "channel: matrix", "channel: slack", "channel: telegram", "channel: whatsapp-web", "channel: zalo", "app: web-ui", "gateway", "scripts", "commands", "docker", "agents", "channel: feishu", "channel: twitch", "size: XL", "extensions: anthropic", "extensions: openai", "extensions: minimax", "extensions: moonshot", "extensions: fal", "extensions: qa-lab", "extensions: webhooks" ], "merged": false, "number": 68705, "review_comments_count": 6, "state": "closed", "title": "fix: Discord guild-admin actions execute without requester...", "updated_at": "2026-04-18T22:54:28Z" }, { "additions": 33, "author": "skolez", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** When OpenClaw runs in a container, the onboarding wizard prompts for a base URL (e.g. for LM Studio or Ollama) and users naturally enter `http://127.0.0.1:1234` / `http://127.0.0.1:11434`. Inside the container tha\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68702", "created_at": "2026-04-18T22:10:59Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68702/files", "html_url": "https://github.com/openclaw/openclaw/pull/68702", "labels": [ "docs", "docker", "size: XS" ], "merged": false, "number": 68702, "review_comments_count": 0, "state": "open", "title": "fix(docker): enable host.docker.internal for local providers", "updated_at": "2026-04-18T22:20:44Z" }, { "additions": 22, "author": "amzzzzzzz", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Strip `to` when normalizing `webchat` delivery contexts. This prevents stale or cross-channel recipient targets from being preserved inside a `webchat`-origin delivery context, where later fallback paths can accidentally treat t\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68701", "created_at": "2026-04-18T21:49:43Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68701/files", "html_url": "https://github.com/openclaw/openclaw/pull/68701", "labels": [ "size: XS" ], "merged": false, "number": 68701, "review_comments_count": 4, "state": "open", "title": "fix: strip invalid webchat delivery recipients", "updated_at": "2026-04-18T22:06:01Z" }, { "additions": 56, "author": "MonkeyLeeT", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - stop treating session lock wait errors as provider timeout failovers - keep wrapped `AbortError` session-lock cases out of timeout classification, including `request was aborted` - add regressions covering direct and wrapped s\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68700", "created_at": "2026-04-18T21:46:48Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68700/files", "html_url": "https://github.com/openclaw/openclaw/pull/68700", "labels": [ "agents", "size: S" ], "merged": false, "number": 68700, "review_comments_count": 3, "state": "open", "title": "fix(agents): stop treating session lock waits as timeout", "updated_at": "2026-04-21T16:26:35Z" }, { "additions": 126, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: LM Studio preload failures stored cooldown entries in a global map that only self-cleaned on same-key retry or success. - Why it matters: many unique failing model ids could accumulate stale cooldown state and grow pr\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68699", "created_at": "2026-04-18T21:43:42Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68699/files", "html_url": "https://github.com/openclaw/openclaw/pull/68699", "labels": [ "size: S", "extensions: lmstudio" ], "merged": false, "number": 68699, "review_comments_count": 0, "state": "open", "title": "fix(lmstudio): bound preload cooldown state", "updated_at": "2026-04-18T21:45:47Z" }, { "additions": 114, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: inbound dedupe claims were only committed at the end of the main dispatch path, so handled early returns left keys stuck in the global in-flight set. - Why it matters: handled inbound messages could accumulate permane\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68698", "created_at": "2026-04-18T21:15:35Z", "deletions": 34, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68698/files", "html_url": "https://github.com/openclaw/openclaw/pull/68698", "labels": [ "size: S" ], "merged": false, "number": 68698, "review_comments_count": 2, "state": "open", "title": "fix(auto-reply): commit inbound dedupe on handled exits", "updated_at": "2026-04-18T21:22:50Z" }, { "additions": 908, "author": "KateWilkins", "author_association": "NONE", "body_excerpt": "## Summary - xAI extension lacked image generation and tts support (only video/speech). - Enables unified `generateImage` (both `/v1/images/generations` + `/v1/images/edits` with exact user-provided payload `{image: {url, type:\"image_url\"}\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68694", "created_at": "2026-04-18T20:59:29Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68694/files", "html_url": "https://github.com/openclaw/openclaw/pull/68694", "labels": [ "size: L" ], "merged": false, "number": 68694, "review_comments_count": 27, "state": "open", "title": "FEAT: Add tts and image generation support to xai extension", "updated_at": "2026-04-21T17:39:19Z" }, { "additions": 13, "author": "lives4code", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 1, "cluster_id": "cluster-36488-17", "cluster_ids": [ "cluster-36488-17" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68693", "created_at": "2026-04-18T20:53:04Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68693/files", "html_url": "https://github.com/openclaw/openclaw/pull/68693", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68693, "review_comments_count": 2, "state": "open", "title": "Add memory to tools documentation ai assisted", "updated_at": "2026-04-20T11:33:41Z" }, { "additions": 570, "author": "ljbudgie", "author_association": "NONE", "body_excerpt": "This pull request introduces the Burgess Principle as the core governance and accountability framework for OpenClaw, ensuring that any automated decision affecting an individual must pass a binary test for individual consideration before e\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68692", "created_at": "2026-04-18T20:51:45Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68692/files", "html_url": "https://github.com/openclaw/openclaw/pull/68692", "labels": [ "docs", "size: M" ], "merged": false, "number": 68692, "review_comments_count": 9, "state": "open", "title": "Formalize Burgess Principle governance in OpenClaw", "updated_at": "2026-04-18T21:33:59Z" }, { "additions": 152584, "author": "markrachapoom", "author_association": "NONE", "body_excerpt": "## Problem Users in Dench Cloud see this error every time they switch models: > Switched to Claude Opus 4.6, but the gateway restart did not complete: Command failed: openclaw --profile dench gateway restart > node:internal/bootstrap/switc\u2026", "changed_files": 6759, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68688", "created_at": "2026-04-18T20:31:21Z", "deletions": 1110052, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68688/files", "html_url": "https://github.com/openclaw/openclaw/pull/68688", "labels": [ "docs", "channel: bluebubbles", "channel: discord", "channel: googlechat", "channel: imessage", "channel: line", "channel: matrix", "channel: mattermost", "channel: msteams", "channel: nextcloud-talk", "channel: nostr", "channel: signal", "channel: slack", "channel: telegram", "channel: tlon", "channel: voice-call", "channel: whatsapp-web", "channel: zalo", "channel: zalouser", "app: android", "app: ios", "app: macos", "gateway", "extensions: copilot-proxy", "extensions: diagnostics-otel", "extensions: llm-task", "extensions: lobster", "extensions: memory-core", "extensions: memory-lancedb", "extensions: open-prose", "security", "scripts", "docker", "agents", "channel: feishu", "channel: twitch", "extensions: device-pair", "extensions: minimax-portal-auth", "extensions: phone-control", "extensions: talk-voice", "channel: irc", "size: XL" ], "merged": false, "number": 68688, "review_comments_count": 0, "state": "closed", "title": "fix(cli): pass safe cwd to spawned openclaw children", "updated_at": "2026-04-18T20:34:00Z" }, { "additions": 34, "author": "evgyur", "author_association": "NONE", "body_excerpt": "## Summary - Add a core TaskFlow Runtime section to the agent system prompt for both full and minimal prompt modes. - Clarify that simple one-turn answers may stay inline, while non-trivial work should use OpenClaw Tasks / TaskFlow paths.\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68687", "created_at": "2026-04-18T20:15:21Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68687/files", "html_url": "https://github.com/openclaw/openclaw/pull/68687", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68687, "review_comments_count": 0, "state": "open", "title": "Route durable agent work through TaskFlow", "updated_at": "2026-04-18T20:17:12Z" }, { "additions": 57, "author": "EpaL", "author_association": "NONE", "body_excerpt": "## Summary - Auth credential changes (token refresh, profile ID rotation) no longer destroy the CLI session. `resolveCliSessionReuse` now returns the existing `sessionId` alongside `invalidatedReason` for `auth-profile` and `auth-epoch` in\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68686", "created_at": "2026-04-18T20:15:13Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68686/files", "html_url": "https://github.com/openclaw/openclaw/pull/68686", "labels": [ "agents", "size: S" ], "merged": false, "number": 68686, "review_comments_count": 2, "state": "open", "title": "fix(agents): preserve CLI session on auth-profile/epoch changes", "updated_at": "2026-04-18T21:48:44Z" }, { "additions": 177, "author": "Tmalone1250", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: Obsolete `memorySearch` keys (`chunkSize`, `chunkOverlap`, `maxResults`) in `agents.defaults` cause schema validation to fail because the current migration path moves the root key but fails to strip stale sub-keys\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68685", "created_at": "2026-04-18T20:13:45Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68685/files", "html_url": "https://github.com/openclaw/openclaw/pull/68685", "labels": [ "commands", "size: S" ], "merged": false, "number": 68685, "review_comments_count": 1, "state": "open", "title": "fix(config): strip obsolete memorySearch keys before schema validation (#68664)", "updated_at": "2026-04-18T20:49:39Z" }, { "additions": 27, "author": "plgonzalezrx8", "author_association": "CONTRIBUTOR", "body_excerpt": "## Issue The Anthropic CLI backend currently forces `--permission-mode bypassPermissions` into Claude CLI runs even when the caller did not request it. That weakens the default security posture by suppressing Claude's built-in permission p\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68682", "created_at": "2026-04-18T20:09:24Z", "deletions": 38, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68682/files", "html_url": "https://github.com/openclaw/openclaw/pull/68682", "labels": [ "size: S", "extensions: anthropic" ], "merged": false, "number": 68682, "review_comments_count": 1, "state": "open", "title": "anthropic: stop forcing Claude CLI permission bypass", "updated_at": "2026-04-18T20:18:00Z" }, { "additions": 59, "author": "christnorman", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: - Problem: dreaming narrative cleanup can log `missing scope: operator.admin` during synthetic plugin-runtime cleanup. - Why it matters: this is expected best-effort cleanup behavior,\u2026", "changed_files": 4, "cluster_id": "cluster-65653-13", "cluster_ids": [ "cluster-65653-13" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68681", "created_at": "2026-04-18T20:08:44Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68681/files", "html_url": "https://github.com/openclaw/openclaw/pull/68681", "labels": [ "gateway", "extensions: memory-core", "size: S" ], "merged": false, "number": 68681, "review_comments_count": 2, "state": "open", "title": "fix(memory-core): suppress expected dreaming cleanup scope warnings", "updated_at": "2026-04-18T20:17:07Z" }, { "additions": 83, "author": "Bartok9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem When a subprocess is killed by an OS signal (SIGKILL from OOM pressure, macOS `debug.swd_panic=1` watchpoints, etc.) Node.js delivers `exit(null, \"SIGKILL\")` to the exit handler. The previous code treated `code === null` as `exi\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68680", "created_at": "2026-04-18T20:02:31Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68680/files", "html_url": "https://github.com/openclaw/openclaw/pull/68680", "labels": [ "size: S" ], "merged": false, "number": 68680, "review_comments_count": 3, "state": "open", "title": "fix(exec): surface signal-killed subprocesses as structured errors instead of silent undefined", "updated_at": "2026-04-20T08:39:08Z" }, { "additions": 395, "author": "nitinwadhawan", "author_association": "NONE", "body_excerpt": "## Summary Session history is re-sanitized on every turn via `sanitizeSessionMessagesImages`, which means `resizeImageBase64IfNeeded` is invoked for the same historical image on every message. Both the `getImageMetadata` header read and an\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68677", "created_at": "2026-04-18T19:44:38Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68677/files", "html_url": "https://github.com/openclaw/openclaw/pull/68677", "labels": [ "agents", "size: M" ], "merged": false, "number": 68677, "review_comments_count": 2, "state": "open", "title": "Agents/tool-images: memoize resize to avoid per-turn sharp decode (#64418)", "updated_at": "2026-04-18T20:04:46Z" }, { "additions": 6, "author": "artificialdimension", "author_association": "NONE", "body_excerpt": "## Summary - Adds `legacy-peer-deps=true` to `.npmrc` so plain `npm install` works without the `--legacy-peer-deps` flag. - madge@8.0.0 (latest on registry) declares `peerOptional typescript@^5.4.4`, but this repo is on `typescript@^6.0.2`\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68676", "created_at": "2026-04-18T19:34:56Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68676/files", "html_url": "https://github.com/openclaw/openclaw/pull/68676", "labels": [ "size: XS" ], "merged": false, "number": 68676, "review_comments_count": 0, "state": "open", "title": "build: enable legacy-peer-deps for npm installs (madge@8 vs TS 6)", "updated_at": "2026-04-18T19:35:58Z" }, { "additions": 1, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - `normalizeTimeout` in `src/commands/channels/capabilities.ts` had a dead ternary: both the `then` and `else` branches evaluated `Number(raw)`, so the `typeof raw === \"string\"` guard had no effect - The intended behavior is to\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68675", "created_at": "2026-04-18T19:33:50Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68675/files", "html_url": "https://github.com/openclaw/openclaw/pull/68675", "labels": [ "commands", "size: XS", "r: too-many-prs" ], "merged": false, "number": 68675, "review_comments_count": 0, "state": "closed", "title": "fix(commands): correct dead ternary branch in normalizeTimeout", "updated_at": "2026-04-18T19:39:11Z" }, { "additions": 198, "author": "fraction12", "author_association": "NONE", "body_excerpt": "## Summary - normalize `update_plan` tool-call parameters before loop hashing - collapse tiny wording churn into the same loop signature - add regression coverage so repeated no-progress `update_plan` churn trips the circuit breaker ## Why\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68673", "created_at": "2026-04-18T19:30:48Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68673/files", "html_url": "https://github.com/openclaw/openclaw/pull/68673", "labels": [ "agents", "size: M" ], "merged": false, "number": 68673, "review_comments_count": 10, "state": "open", "title": "fix: collapse no-progress update_plan churn (AI-assisted)", "updated_at": "2026-04-18T20:03:12Z" }, { "additions": 451, "author": "RaphaAI", "author_association": "NONE", "body_excerpt": "## Problem MiniMax-M2.* served through any OpenAI-compatible endpoint (exo-explore, vLLM, Ollama, llama.cpp, etc.) streams `reasoning_content` deltas with empty `content`. openclaw's openai-transport parser (`src/agents/openai-transport-st\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68670", "created_at": "2026-04-18T19:13:57Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68670/files", "html_url": "https://github.com/openclaw/openclaw/pull/68670", "labels": [ "agents", "size: M" ], "merged": false, "number": 68670, "review_comments_count": 0, "state": "closed", "title": "fix(minimax): promote thinking-only finals to text on openai-completions", "updated_at": "2026-04-19T07:53:28Z" }, { "additions": 46, "author": "Feelw00", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: embedded subagent completion invokes `cleanupBrowserSessionsForLifecycleEnd` wrapper twice for the same `runId`. `registerSubagentRun` pairs an in-process `ensureListener()` and a gateway `waitForSubagentCompletion` R\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68669", "created_at": "2026-04-18T19:00:00Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68669/files", "html_url": "https://github.com/openclaw/openclaw/pull/68669", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68669, "review_comments_count": 1, "state": "open", "title": "fix(agents): dedupe subagent browser session cleanup wrapper with dispatch flag", "updated_at": "2026-04-21T03:13:03Z" }, { "additions": 74, "author": "bluesky6868", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `dispatchAgentHook` in `src/gateway/server/hooks.ts` computed the hook-completion system-event's `sessionKey` with `resolveMainSessionKeyFromConfig()`, which always returns the **default** agent's main session. When a\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68667", "created_at": "2026-04-18T18:54:50Z", "deletions": 14, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68667/files", "html_url": "https://github.com/openclaw/openclaw/pull/68667", "labels": [ "gateway", "size: S" ], "merged": false, "number": 68667, "review_comments_count": 1, "state": "open", "title": "security(gateway): route hook completion events to the target agent's session", "updated_at": "2026-04-18T19:06:36Z" }, { "additions": 14, "author": "bluesky6868", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Six `template-injection` findings from `zizmor` in `.github/workflows/docker-release.yml` (lines 367:36, 374:17, 375:17, 381:36, 388:17, 389:17). Each is a `${{ ... }}` GitHub Actions expression interpolated directly\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68658", "created_at": "2026-04-18T17:54:45Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68658/files", "html_url": "https://github.com/openclaw/openclaw/pull/68658", "labels": [ "size: XS" ], "merged": false, "number": 68658, "review_comments_count": 0, "state": "closed", "title": "security(ci): hoist docker-release manifest run: expressions into step env", "updated_at": "2026-04-18T18:06:22Z" }, { "additions": 189, "author": "avirweb", "author_association": "CONTRIBUTOR", "body_excerpt": "## Prompt to recreate this PR > Sync the startup-hang fix work into the real OpenClaw/OpenClaw repo at /home/contact/openclaw, not the temporary partial folder. > Then: > 1. apply the code changes to this real repo, > 2. create a branch, >\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68654", "created_at": "2026-04-18T17:37:58Z", "deletions": 20, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68654/files", "html_url": "https://github.com/openclaw/openclaw/pull/68654", "labels": [ "size: M" ], "merged": false, "number": 68654, "review_comments_count": 2, "state": "open", "title": "perf: reduce lazy CLI startup plugin loading", "updated_at": "2026-04-18T18:44:33Z" }, { "additions": 90, "author": "palewire", "author_association": "NONE", "body_excerpt": "## Summary - Problem: The model-pricing bootstrap fetches live per-token costs from OpenRouter on every gateway startup, causing a ~30 second timeout on networks that cannot reach the pricing endpoint. - Why it matters: Users with limited\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68651", "created_at": "2026-04-18T17:29:56Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68651/files", "html_url": "https://github.com/openclaw/openclaw/pull/68651", "labels": [ "docs", "gateway", "size: S" ], "merged": false, "number": 68651, "review_comments_count": 2, "state": "open", "title": "Gateway/config: add models.pricing.enabled to skip pricing bootstrap", "updated_at": "2026-04-19T13:26:40Z" }, { "additions": 5, "author": "saitama3292-onepunch", "author_association": "NONE", "body_excerpt": "## Summary Fix Gemini 3/3.1 Pro returning empty replies when thinking is disabled. The root cause is `getDisabledThinkingConfig()` sending `thinkingLevel: \"LOW\"` \u2014 which still thinks and burns tokens, leaving no budget for visible output.\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68650", "created_at": "2026-04-18T17:29:43Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68650/files", "html_url": "https://github.com/openclaw/openclaw/pull/68650", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68650, "review_comments_count": 0, "state": "closed", "title": "fix: omit thinkingConfig for Gemini 3 Pro disabled case (fixes #62470)", "updated_at": "2026-04-19T07:52:57Z" }, { "additions": 33, "author": "likewen-tech", "author_association": "NONE", "body_excerpt": "## Summary Fix async exec approval followups so they only wait for the session resume request to be accepted, not for the full resumed agent turn to finish. Previously this path used `expectFinal: true`, which could block behind a busy ses\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68648", "created_at": "2026-04-18T17:02:06Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68648/files", "html_url": "https://github.com/openclaw/openclaw/pull/68648", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68648, "review_comments_count": 1, "state": "open", "title": "fix(exec): avoid waiting for final session result in approval followups", "updated_at": "2026-04-18T17:05:41Z" }, { "additions": 1059, "author": "edokeh", "author_association": "NONE", "body_excerpt": "## Summary - Problem: The Gateway HTTP endpoints have no CORS support, so browsers cannot call the self-hosted OpenAI / OpenResponses routes directly (preflight fails, response headers are stripped). - Why it matters: Users who want to wir\u2026", "changed_files": 17, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68647", "created_at": "2026-04-18T16:57:39Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68647/files", "html_url": "https://github.com/openclaw/openclaw/pull/68647", "labels": [ "docs", "gateway", "size: XL" ], "merged": false, "number": 68647, "review_comments_count": 12, "state": "open", "title": "feat: support CORS for Gateway HTTP endpoint: add opt-in CORS config", "updated_at": "2026-04-20T16:26:32Z" }, { "additions": 584, "author": "likewen-tech", "author_association": "NONE", "body_excerpt": "## Summary Fix async exec approval followups so they only wait for the session resume request to be accepted, not for the full resumed agent turn to finish. Previously this path used `expectFinal: true`, which could block behind a busy ses\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68646", "created_at": "2026-04-18T16:56:46Z", "deletions": 33, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68646/files", "html_url": "https://github.com/openclaw/openclaw/pull/68646", "labels": [ "gateway", "commands", "agents", "size: L" ], "merged": false, "number": 68646, "review_comments_count": 3, "state": "closed", "title": "fix(exec): avoid waiting for final session result in approval followups", "updated_at": "2026-04-18T17:03:17Z" }, { "additions": 348, "author": "atlaspetco", "author_association": "NONE", "body_excerpt": "## Summary Two related fixes so cron `agentTurn` jobs can't leave stale task- or session-registry rows behind when they time out: 1. **Close the task ledger row from the onTimer error path** (belt-and-suspenders). Previously the ledger row\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68645", "created_at": "2026-04-18T16:50:49Z", "deletions": 6, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68645/files", "html_url": "https://github.com/openclaw/openclaw/pull/68645", "labels": [ "size: M" ], "merged": false, "number": 68645, "review_comments_count": 0, "state": "open", "title": "fix(cron): close task ledger on timeout + add runTimeoutSeconds wall-clock kill", "updated_at": "2026-04-19T03:30:26Z" }, { "additions": 1379, "author": "Takhoffman", "author_association": "CONTRIBUTOR", "body_excerpt": "This PR introduces core `NO_REPLY` tuning in OpenClaw. It does three connected things: 1. It introduces a real `NO_REPLY` policy surface. That means `NO_REPLY` is no longer treated as one global behavior. It is now resolved by conversation\u2026", "changed_files": 35, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/68644", "created_at": "2026-04-18T16:45:32Z", "deletions": 55, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68644/files", "html_url": "https://github.com/openclaw/openclaw/pull/68644", "labels": [ "docs", "channel: telegram", "scripts", "maintainer", "size: XL" ], "merged": true, "number": 68644, "review_comments_count": 12, "state": "closed", "title": "feat: no_reply tuning and customization per conversation type", "updated_at": "2026-04-21T04:20:33Z" }, { "additions": 300, "author": "pandego", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - decode transcript MediaPath and image payload variants into chat attachment content blocks - render image attachments in the shared chat UI so sent images stay visible after history refresh - add coverage for transcript media-\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68641", "created_at": "2026-04-18T16:31:37Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68641/files", "html_url": "https://github.com/openclaw/openclaw/pull/68641", "labels": [ "size: M" ], "merged": false, "number": 68641, "review_comments_count": 10, "state": "open", "title": "Fix Control UI image history rendering", "updated_at": "2026-04-19T08:16:43Z" }, { "additions": 115, "author": "Kzino", "author_association": "NONE", "body_excerpt": "## Summary Adds a new skill for [Vorim AI](https://vorim.ai) \u2014 the identity and trust layer for AI agents. - **17 MCP tools** via `@vorim/mcp-server` (npm) through mcporter - Agent registration with Ed25519 cryptographic keypairs - Permiss\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68640", "created_at": "2026-04-18T16:27:08Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68640/files", "html_url": "https://github.com/openclaw/openclaw/pull/68640", "labels": [ "size: S" ], "merged": false, "number": 68640, "review_comments_count": 4, "state": "open", "title": "Add Vorim AI skill \u2014 agent identity, permissions, trust & audit trails", "updated_at": "2026-04-18T16:30:22Z" }, { "additions": 1, "author": "altierac", "author_association": "NONE", "body_excerpt": "### What Forward `agentSessionKey` to the shared memory manager's `search()` call in `searchMemoryWiki()`. ### Why When `memory-wiki` uses the `shared` search backend with QMD, the search call at `query.ts:668` passes `{ maxResults }` but\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68639", "created_at": "2026-04-18T16:22:48Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68639/files", "html_url": "https://github.com/openclaw/openclaw/pull/68639", "labels": [ "size: XS", "extensions: memory-wiki" ], "merged": false, "number": 68639, "review_comments_count": 0, "state": "open", "title": "fix(memory-wiki): forward sessionKey to shared memory search", "updated_at": "2026-04-20T05:25:07Z" }, { "additions": 34, "author": "JoeshpCheung", "author_association": "NONE", "body_excerpt": "# PR 1 Submission Pack \u2014 Loader correctness fix Date: 2026-04-19 Target repo: `openclaw/openclaw` Related issue: `openclaw/openclaw#68615` ## Proposed PR title `fix(loader): skip plugin register for non-activating loads` Alternative title:\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/68638", "created_at": "2026-04-18T16:21:21Z", "deletions": 85, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68638/files", "html_url": "https://github.com/openclaw/openclaw/pull/68638", "labels": [ "size: S" ], "merged": false, "number": 68638, "review_comments_count": 4, "state": "open", "title": "fix(loader): avoid memory and compaction side effects during non-activating loads", "updated_at": "2026-04-19T08:06:59Z" }, { "additions": 80, "author": "frankhli843", "author_association": "NONE", "body_excerpt": "Closes #68636 ## Summary The `write` tool's parameter validator currently rejects `content: \"\"` and any whitespace-only value with the error `\"Missing required parameter: content (received: path, content=)\"`. This treats a le\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68637", "created_at": "2026-04-18T16:19:09Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68637/files", "html_url": "https://github.com/openclaw/openclaw/pull/68637", "labels": [ "agents", "size: S" ], "merged": false, "number": 68637, "review_comments_count": 0, "state": "open", "title": "fix(pi-tools): allow empty/whitespace-only content in write tool", "updated_at": "2026-04-18T16:20:41Z" }, { "additions": 732, "author": "Takhoffman", "author_association": "CONTRIBUTOR", "body_excerpt": "## What `/reset soft` does `/reset soft` is an in-place reset. It behaves like this: ```text before: session id = same transcript = existing conversation CLI backend binding = may be reused after `/reset soft`: session id = same transcript\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/68635", "created_at": "2026-04-18T16:18:30Z", "deletions": 22, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68635/files", "html_url": "https://github.com/openclaw/openclaw/pull/68635", "labels": [ "docs", "maintainer", "size: L" ], "merged": true, "number": 68635, "review_comments_count": 29, "state": "closed", "title": "feat: add soft reset command", "updated_at": "2026-04-21T15:17:54Z" }, { "additions": 448, "author": "Little-viva1", "author_association": "NONE", "body_excerpt": "## Summary - accept nested Feishu card action payloads that Mira clarification cards send in practice - handle direct Mira clarification writebacks inside the Feishu extension instead of relying on an external relay - document OpenClaw as\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68630", "created_at": "2026-04-18T16:06:34Z", "deletions": 23, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68630/files", "html_url": "https://github.com/openclaw/openclaw/pull/68630", "labels": [ "docs", "channel: feishu", "size: M" ], "merged": false, "number": 68630, "review_comments_count": 5, "state": "closed", "title": "fix(feishu): harden Mira clarification card action writebacks", "updated_at": "2026-04-18T16:12:56Z" }, { "additions": 3118, "author": "Takhoffman", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary This PR introduces `lab` as OpenClaw's experimental prompt-overlay surface. The first `lab` feature is `custom`, which lets a workspace layer model-specific and agent-specific `AGENTS.md` addenda on top of the normal prompt stac\u2026", "changed_files": 24, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/68627", "created_at": "2026-04-18T15:54:34Z", "deletions": 35, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68627/files", "html_url": "https://github.com/openclaw/openclaw/pull/68627", "labels": [ "docs", "commands", "agents", "maintainer", "size: XL" ], "merged": false, "number": 68627, "review_comments_count": 11, "state": "closed", "title": "Feat: introduce lab, custom model and agent overrides and gpt 5.4 overrides", "updated_at": "2026-04-21T15:07:43Z" }, { "additions": 988, "author": "jinon86", "author_association": "NONE", "body_excerpt": "## Summary - add a plugin-neutral session-run cancel seam keyed by `{ kind: \"session_run\", sessionKey, runId }` - wire gateway chat aborts into that seam in both directions so delegated-task runtimes can cancel owning runs and observe run\u2026", "changed_files": 18, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68624", "created_at": "2026-04-18T15:51:48Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68624/files", "html_url": "https://github.com/openclaw/openclaw/pull/68624", "labels": [ "docs", "gateway", "scripts", "agents", "size: XL" ], "merged": false, "number": 68624, "review_comments_count": 4, "state": "open", "title": "Gateway: add session-run cancel seam", "updated_at": "2026-04-18T22:42:25Z" }, { "additions": 490, "author": "jinon86", "author_association": "NONE", "body_excerpt": "## Summary - add a typed plugin `sessions_send` hook to the core hook runner and Plugin SDK exports - let `sessions_send` consult the hook before default handling, with delegated metadata support and direct fallback - cover declined-hook f\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68622", "created_at": "2026-04-18T15:47:46Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68622/files", "html_url": "https://github.com/openclaw/openclaw/pull/68622", "labels": [ "docs", "agents", "size: L" ], "merged": false, "number": 68622, "review_comments_count": 4, "state": "open", "title": "Plugins: add sessions_send delegation hook", "updated_at": "2026-04-18T22:42:24Z" }, { "additions": 238, "author": "dorukardahan", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - let `before_model_resolve` and legacy `before_agent_start` hooks return `authProfileOverride` - apply that preferred auth profile during model setup without overriding explicit user-pinned `/model ...@profile` selections - add\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/68621", "created_at": "2026-04-18T15:45:39Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68621/files", "html_url": "https://github.com/openclaw/openclaw/pull/68621", "labels": [ "docs", "gateway", "agents", "size: M" ], "merged": false, "number": 68621, "review_comments_count": 0, "state": "open", "title": "feat(hooks): allow model hooks to prefer auth profiles", "updated_at": "2026-04-18T16:42:01Z" }, { "additions": 47, "author": "joeia26", "author_association": "NONE", "body_excerpt": "## Summary ACP-bound sessions should keep `/acp ...` control commands on the local OpenClaw command path instead of forwarding them into the bound ACP runtime as prompt text. Before this change, commands such as `/acp cancel`, `/acp status\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68617", "created_at": "2026-04-18T15:32:23Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68617/files", "html_url": "https://github.com/openclaw/openclaw/pull/68617", "labels": [ "size: XS" ], "merged": false, "number": 68617, "review_comments_count": 0, "state": "open", "title": "fix(acp): keep /acp commands local in bound sessions", "updated_at": "2026-04-21T06:49:58Z" }, { "additions": 193, "author": "ScientificProgrammer", "author_association": "NONE", "body_excerpt": "This PR fixes a race condition where long-running agent turns would cause deferred messages in Google Chat to fail silently. It introduces a 25-second timer. If the agent response is not ready before the timer expires, it abandons the defe\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68614", "created_at": "2026-04-18T15:27:00Z", "deletions": 29, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68614/files", "html_url": "https://github.com/openclaw/openclaw/pull/68614", "labels": [ "channel: googlechat", "size: M" ], "merged": false, "number": 68614, "review_comments_count": 13, "state": "open", "title": "fix(googlechat): add timeout and fallback for deferred responses", "updated_at": "2026-04-20T05:40:30Z" }, { "additions": 1645, "author": "mcaxtr", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: WhatsApp could stay visibly silent for too long in two places: - after an inbound DM was accepted but before the reply run reached `onReplyStart` - while inbound DMs were intentionally buffered by `debounceMs` - Why i\u2026", "changed_files": 29, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68612", "created_at": "2026-04-18T15:23:36Z", "deletions": 125, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68612/files", "html_url": "https://github.com/openclaw/openclaw/pull/68612", "labels": [ "channel: whatsapp-web", "maintainer", "size: XL" ], "merged": false, "number": 68612, "review_comments_count": 26, "state": "closed", "title": "fix(whatsapp): keep typing active through inbound acceptance and debounce", "updated_at": "2026-04-21T15:14:23Z" }, { "additions": 44892, "author": "stroupaloop", "author_association": "NONE", "body_excerpt": "Extends the `before_prompt_build` hook so plugins can dynamically narrow the tool surface per-turn. ## Changes - Exposes `availableTools: string[]` on `PluginHookBeforePromptBuildEvent` so plugins can see which tools survived the static po\u2026", "changed_files": 1337, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68608", "created_at": "2026-04-18T14:50:16Z", "deletions": 25621, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68608/files", "html_url": "https://github.com/openclaw/openclaw/pull/68608", "labels": [ "docs", "channel: bluebubbles", "channel: discord", "channel: googlechat", "channel: imessage", "channel: line", "channel: matrix", "channel: mattermost", "channel: msteams", "channel: nextcloud-talk", "channel: nostr", "channel: signal", "channel: slack", "channel: telegram", "channel: tlon", "channel: voice-call", "channel: whatsapp-web", "channel: zalo", "channel: zalouser", "app: android", "app: ios", "app: macos", "app: web-ui", "gateway", "extensions: copilot-proxy", "extensions: diagnostics-otel", "extensions: llm-task", "extensions: lobster", "extensions: memory-core", "extensions: memory-lancedb", "extensions: open-prose", "cli", "scripts", "commands", "docker", "agents", "channel: feishu", "channel: twitch", "channel: irc", "size: XL", "extensions: acpx", "extensions: anthropic", "extensions: openai", "extensions: minimax", "extensions: cloudflare-ai-gateway", "extensions: byteplus", "extensions: huggingface", "extensions: kimi-coding", "extensions: moonshot", "extensions: synthetic", "extensions: together", "extensions: venice", "extensions: volcengine", "extensions: xiaomi", "extensions: kilocode", "extensions: nvidia", "extensions: qianfan", "extensions: vercel-ai-gateway", "extensions: fal", "extensions: tavily", "extensions: duckduckgo", "extensions: deepseek", "channel: qqbot", "extensions: stepfun", "channel: qa-channel", "extensions: qa-lab", "extensions: memory-wiki", "extensions: webhooks", "extensions: arcee", "extensions: codex", "extensions: lmstudio" ], "merged": false, "number": 68608, "review_comments_count": 6, "state": "closed", "title": "feat: allow prompt hooks to dynamically narrow tool surface", "updated_at": "2026-04-18T23:35:57Z" }, { "additions": 172, "author": "josmithiii", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Gemini 2.5 Pro only works in thinking mode and rejects `thinkingBudget=0` with `Budget 0 is invalid. This model only works in thinking mode.` - The existing `sanitizeGoogleThinkingPayload` in the embedded runner only stripped\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68607", "created_at": "2026-04-18T14:44:00Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68607/files", "html_url": "https://github.com/openclaw/openclaw/pull/68607", "labels": [ "agents", "size: S" ], "merged": true, "number": 68607, "review_comments_count": 0, "state": "closed", "title": "fix(google): strip thinkingBudget=0 for gemini-2.5-pro thinking-required model", "updated_at": "2026-04-19T01:21:50Z" }, { "additions": 7, "author": "alekseivarin-gif", "author_association": "NONE", "body_excerpt": "## Summary This follow-up PR extends the assistant-first docs pass to a few additional user-facing docs hubs. ## What changed Updated: - docs/concepts/features.md - docs/help/index.md - docs/start/docs-directory.md ## Notes Docs-only chang\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68601", "created_at": "2026-04-18T14:28:16Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68601/files", "html_url": "https://github.com/openclaw/openclaw/pull/68601", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68601, "review_comments_count": 0, "state": "open", "title": "docs: extend assistant-first framing to feature and help hubs", "updated_at": "2026-04-18T14:29:08Z" }, { "additions": 109, "author": "jasonmakr", "author_association": "NONE", "body_excerpt": "## Problem `retryAsync` in `src/infra/retry.ts` applies **symmetric** jitter even when the caller supplies a `retryAfterMs` hint (e.g. from an HTTP 429/503 `Retry-After` header). The symmetric window means roughly half of retries land at `\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68600", "created_at": "2026-04-18T14:28:11Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68600/files", "html_url": "https://github.com/openclaw/openclaw/pull/68600", "labels": [ "agents", "size: S" ], "merged": false, "number": 68600, "review_comments_count": 0, "state": "closed", "title": "fix(infra): prevent jitter from undercutting server-supplied Retry-After", "updated_at": "2026-04-18T16:01:01Z" }, { "additions": 78, "author": "MotherSphere", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** When a context overflow triggers auto-compaction and the retry still overflows within the same cycle, the existing `[context-overflow-diag]` log only reports state; it does not tell operators that the bottleneck i\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68599", "created_at": "2026-04-18T14:28:07Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68599/files", "html_url": "https://github.com/openclaw/openclaw/pull/68599", "labels": [ "docs", "agents", "size: S" ], "merged": false, "number": 68599, "review_comments_count": 1, "state": "open", "title": "agents/compaction: hint at toolResultMaxChars when overflow persists after compaction", "updated_at": "2026-04-20T10:09:19Z" }, { "additions": 206, "author": "GaosCode", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `memory_get` could accept a path that lexically stayed under the workspace or an allowed extra path, but escaped through an intermediate directory symlink. - Why it matters: an agent using `memory_get` could be tricke\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68597", "created_at": "2026-04-18T14:25:27Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68597/files", "html_url": "https://github.com/openclaw/openclaw/pull/68597", "labels": [ "extensions: memory-core", "size: M" ], "merged": false, "number": 68597, "review_comments_count": 4, "state": "open", "title": "fix(memory): block symlink escapes in memory_get", "updated_at": "2026-04-19T01:47:30Z" }, { "additions": 114, "author": "martingarramon", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #62571. ## Problem `resolveSlackThreadStarter` and `resolveSlackThreadHistory` in `extensions/slack/src/monitor/media.ts` swallow ALL errors via bare `catch {}` blocks at lines 450\u2013452 and 542\u2013544 respectively. Auth failures, rate-li\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68594", "created_at": "2026-04-18T14:16:53Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68594/files", "html_url": "https://github.com/openclaw/openclaw/pull/68594", "labels": [ "channel: slack", "scripts", "size: S" ], "merged": true, "number": 68594, "review_comments_count": 0, "state": "closed", "title": "fix(slack): surface silent errors in thread starter/history fetch", "updated_at": "2026-04-18T16:55:30Z" }, { "additions": 1, "author": "peking2", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68592", "created_at": "2026-04-18T14:09:14Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68592/files", "html_url": "https://github.com/openclaw/openclaw/pull/68592", "labels": [ "size: XS" ], "merged": false, "number": 68592, "review_comments_count": 3, "state": "closed", "title": "docs: update README title to SoloClaw", "updated_at": "2026-04-18T14:13:44Z" }, { "additions": 47, "author": "alekseivarin-gif", "author_association": "NONE", "body_excerpt": "## Summary This follow-up PR continues the assistant-first docs pass by extending the framing to a few additional user-facing docs hubs. ## What changed Updated: - docs/concepts/features.md - docs/help/index.md - docs/start/docs-directory.\u2026", "changed_files": 14, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68591", "created_at": "2026-04-18T14:08:30Z", "deletions": 32, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68591/files", "html_url": "https://github.com/openclaw/openclaw/pull/68591", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68591, "review_comments_count": 1, "state": "closed", "title": "docs: extend assistant-first framing to feature and help hubs", "updated_at": "2026-04-18T14:31:16Z" }, { "additions": 23, "author": "imadal1n", "author_association": "NONE", "body_excerpt": "## Summary - rewrite `index.yml` before ensuring managed QMD collections - reuse `ensureCollections()` during managed collection repair instead of hand-rolling remove/add loops - keep repair behavior aligned with the normal collection boot\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68590", "created_at": "2026-04-18T14:06:23Z", "deletions": 21, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68590/files", "html_url": "https://github.com/openclaw/openclaw/pull/68590", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 68590, "review_comments_count": 3, "state": "open", "title": "fix(memory-core): rewrite qmd index on managed collection repair", "updated_at": "2026-04-18T14:10:44Z" }, { "additions": 89, "author": "sqsge", "author_association": "NONE", "body_excerpt": "## Summary Fixes #62076. This avoids import-time eager context warmup for captured `sessions` command output: - skip eager warmup for the `sessions` command family when stdout is not a TTY - keep eager warmup for interactive/TTY `sessions`\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/68589", "created_at": "2026-04-18T13:59:09Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68589/files", "html_url": "https://github.com/openclaw/openclaw/pull/68589", "labels": [ "agents", "size: S" ], "merged": false, "number": 68589, "review_comments_count": 5, "state": "open", "title": "fix(cli): skip sessions warmup for non-TTY output", "updated_at": "2026-04-20T16:09:16Z" }, { "additions": 106, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: Telegram callback pagination treated every edit failure as retryable, including permanent Telegram edit errors. - Why it matters: a permanently failing callback update stayed in `failedUpdateIds`, so the persisted wat\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68588", "created_at": "2026-04-18T13:55:27Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68588/files", "html_url": "https://github.com/openclaw/openclaw/pull/68588", "labels": [ "channel: telegram", "size: S" ], "merged": true, "number": 68588, "review_comments_count": 2, "state": "closed", "title": "fix(telegram): avoid wedging callback updates on permanent edit errors", "updated_at": "2026-04-18T18:52:57Z" }, { "additions": 56, "author": "imadal1n", "author_association": "NONE", "body_excerpt": "## Summary - ensure active memory runtime artifacts are loaded before bridge-based wiki status/import paths query public artifacts - make the runtime bridge path self-heal from config instead of depending on prior runtime registry state ##\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 7, "conversation_url": "https://github.com/openclaw/openclaw/pull/68586", "created_at": "2026-04-18T13:54:05Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68586/files", "html_url": "https://github.com/openclaw/openclaw/pull/68586", "labels": [ "size: S" ], "merged": false, "number": 68586, "review_comments_count": 10, "state": "open", "title": "fix(memory-core): resolve runtime artifacts before wiki bridge status", "updated_at": "2026-04-19T01:42:32Z" }, { "additions": 474, "author": "seoseo-ai", "author_association": "NONE", "body_excerpt": "## Issue Closes openclaw/openclaw#68551 ## Summary Adds `createDelegatedTaskWatchdog` \u2014 a public seam that lets plugin-owned delegated-task code schedule heartbeat cadence and timeout cleanup without importing internal core timers directly\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68584", "created_at": "2026-04-18T13:48:50Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68584/files", "html_url": "https://github.com/openclaw/openclaw/pull/68584", "labels": [ "size: M" ], "merged": false, "number": 68584, "review_comments_count": 4, "state": "open", "title": "feat(plugins): add plugin-facing heartbeat and timeout timer seam for delegated tasks", "updated_at": "2026-04-18T13:54:24Z" }, { "additions": 1, "author": "ZackaryShen", "author_association": "NONE", "body_excerpt": "## Fix for #68398 ### Problem `cleanupProvisionalSession` was defined in `subagent-spawn.ts` but not exported, causing \"cleanupProvisionalSession is not defined\" errors when called from subagent-registry chunk. ### Solution Export the `cle\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68583", "created_at": "2026-04-18T13:48:28Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68583/files", "html_url": "https://github.com/openclaw/openclaw/pull/68583", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68583, "review_comments_count": 2, "state": "open", "title": "fix: export cleanupProvisionalSession function (#68398)", "updated_at": "2026-04-18T14:00:19Z" }, { "additions": 527, "author": "vincentkoc", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: `openrouter:free` and `openrouter:auto` fall through the providerless model path, so `openrouter:free` gets mis-resolved under the default provider and `openrouter:auto` is not treated as the canonical OpenRouter auto\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68579", "created_at": "2026-04-18T13:34:24Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68579/files", "html_url": "https://github.com/openclaw/openclaw/pull/68579", "labels": [ "agents", "maintainer", "size: L" ], "merged": true, "number": 68579, "review_comments_count": 5, "state": "closed", "title": "fix(models): resolve openrouter compat aliases", "updated_at": "2026-04-18T15:25:27Z" }, { "additions": 942, "author": "vincentkoc", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: some OpenRouter-compatible models return visible assistant output inside `reasoning_details` instead of `delta.content`, and OpenClaw only treated `reasoning_details` as hidden thinking. - Why it matters: upstream rep\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68577", "created_at": "2026-04-18T13:29:48Z", "deletions": 46, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68577/files", "html_url": "https://github.com/openclaw/openclaw/pull/68577", "labels": [ "docs", "agents", "maintainer", "size: L" ], "merged": true, "number": 68577, "review_comments_count": 8, "state": "closed", "title": "fix(openrouter): parse visible reasoning_details output", "updated_at": "2026-04-18T15:18:15Z" }, { "additions": 132, "author": "SARAMALI15792", "author_association": "CONTRIBUTOR", "body_excerpt": "## What does this PR do? Auto-resets the active session when a Telegram-linked conversation hits an unrecoverable context overflow, instead of leaving the bloated session alive and causing subsequent messages to fail repeatedly. Fixes #684\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68575", "created_at": "2026-04-18T13:25:33Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68575/files", "html_url": "https://github.com/openclaw/openclaw/pull/68575", "labels": [ "size: S" ], "merged": false, "number": 68575, "review_comments_count": 3, "state": "open", "title": "fix(telegram): reset sessions after unrecoverable context overflow", "updated_at": "2026-04-18T13:30:10Z" }, { "additions": 242, "author": "vincentkoc", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: OpenRouter and Arcee could persist or keep using the stale `https://openrouter.ai/v1` route in provider config or discovered model metadata. - Why it matters: that stale route breaks OpenRouter-routed requests and mak\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68574", "created_at": "2026-04-18T13:25:14Z", "deletions": 16, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68574/files", "html_url": "https://github.com/openclaw/openclaw/pull/68574", "labels": [ "agents", "maintainer", "size: M", "extensions: arcee" ], "merged": true, "number": 68574, "review_comments_count": 2, "state": "closed", "title": "fix(openrouter): heal stale provider base urls", "updated_at": "2026-04-18T17:08:10Z" }, { "additions": 25, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: the webhooks plugin cached the first resolved SecretRef-backed shared secret for each target and kept reusing it across requests. - Why it matters: rotating a leaked webhook secret in its backing provider did not revo\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68573", "created_at": "2026-04-18T13:20:17Z", "deletions": 20, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68573/files", "html_url": "https://github.com/openclaw/openclaw/pull/68573", "labels": [ "size: XS", "extensions: webhooks" ], "merged": false, "number": 68573, "review_comments_count": 0, "state": "open", "title": "fix(webhooks): re-resolve rotated webhook secrets", "updated_at": "2026-04-18T13:23:07Z" }, { "additions": 653, "author": "seoseo-ai", "author_association": "NONE", "body_excerpt": "Closes #68549 ## Summary Add a generic, A2A-agnostic wait-run handle registry to the plugin SDK. Plugins can use this surface to register, resolve, cancel, and clean up delegated wait-run handles without reaching into core-owned runtime st\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68572", "created_at": "2026-04-18T13:15:27Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68572/files", "html_url": "https://github.com/openclaw/openclaw/pull/68572", "labels": [ "size: L" ], "merged": false, "number": 68572, "review_comments_count": 5, "state": "open", "title": "feat(plugin-sdk): add delegated wait-run handle seam", "updated_at": "2026-04-18T13:19:30Z" }, { "additions": 256, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary When a user sends a message like `@bot:server /new` in a Matrix room, the slash command was not recognized because the mention prefix was not stripped before checking for slash commands. ## Root Cause The `hasControlCommand()` f\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68570", "created_at": "2026-04-18T13:12:18Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68570/files", "html_url": "https://github.com/openclaw/openclaw/pull/68570", "labels": [ "channel: matrix", "size: M" ], "merged": true, "number": 68570, "review_comments_count": 4, "state": "closed", "title": "fix(matrix): strip mention prefix before slash command matching", "updated_at": "2026-04-19T20:56:21Z" }, { "additions": 7, "author": "vivekchand", "author_association": "NONE", "body_excerpt": "## Problem When a device is paired with operator.write or operator.admin scope, the token was missing operator.read, causing 403 errors when calling read-only methods like session_status. This causes ClawMetry dashboard to flood gateway.lo\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68569", "created_at": "2026-04-18T13:11:41Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68569/files", "html_url": "https://github.com/openclaw/openclaw/pull/68569", "labels": [ "size: XS" ], "merged": false, "number": 68569, "review_comments_count": 1, "state": "open", "title": "fix(device-pairing): auto-expand operator scopes to include operator.read", "updated_at": "2026-04-18T14:10:42Z" }, { "additions": 15, "author": "Ante042", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: When an answer-lane final payload has the exact same text as an already-visible preview, the deliverer was still sending a replacement message before the archived-preview cleanup ran. If cleanup was disabled (\\`re\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68568", "created_at": "2026-04-18T13:11:28Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68568/files", "html_url": "https://github.com/openclaw/openclaw/pull/68568", "labels": [ "channel: telegram", "size: XS" ], "merged": false, "number": 68568, "review_comments_count": 6, "state": "open", "title": "fix(telegram): suppress duplicate finals when preview cleanup is disabled", "updated_at": "2026-04-18T13:28:43Z" }, { "additions": 22, "author": "imadal1n", "author_association": "NONE", "body_excerpt": "## Summary - pass `cache: false` when loading gateway plugins during startup - force a fresh plugin/runtime view instead of reusing stale cache state in the gateway bootstrap path ## Why On config/plugin/runtime transitions, stale plugin c\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68567", "created_at": "2026-04-18T13:10:58Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68567/files", "html_url": "https://github.com/openclaw/openclaw/pull/68567", "labels": [ "gateway", "agents", "size: XS", "extensions: memory-wiki" ], "merged": false, "number": 68567, "review_comments_count": 3, "state": "open", "title": "fix(gateway): disable stale plugin cache at startup", "updated_at": "2026-04-18T16:03:22Z" }, { "additions": 108, "author": "AstronautGumbo", "author_association": "NONE", "body_excerpt": "\u2026nd HTTP 400s A malformed payload is a client-side bug, not a profile problem. The prior behavior in `markAuthProfileFailure` penalized the auth profile with a cooldown window on every failure reason including format-class 400s, which then\u2026", "changed_files": 4, "cluster_id": "cluster-36488-17", "cluster_ids": [ "cluster-36488-17" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68566", "created_at": "2026-04-18T13:08:13Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68566/files", "html_url": "https://github.com/openclaw/openclaw/pull/68566", "labels": [ "agents", "size: S" ], "merged": false, "number": 68566, "review_comments_count": 3, "state": "open", "title": "fix(agents/auth-profile-cooldowns): skip cooldown for format errors a\u2026", "updated_at": "2026-04-18T13:17:27Z" }, { "additions": 201, "author": "AstronautGumbo", "author_association": "NONE", "body_excerpt": "\u2026s across cross-model replay The prior behavior in `transformTransportMessages` preserved signed and redacted thinking blocks only on same-model replay; any cross-model replay downgraded the block to a plain `text` block (signed case) or d\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68565", "created_at": "2026-04-18T13:07:48Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68565/files", "html_url": "https://github.com/openclaw/openclaw/pull/68565", "labels": [ "agents", "size: M" ], "merged": false, "number": 68565, "review_comments_count": 3, "state": "open", "title": "fix(agents/anthropic-replay): preserve signed/redacted thinking block\u2026", "updated_at": "2026-04-18T13:11:18Z" }, { "additions": 40, "author": "alekseivarin-gif", "author_association": "NONE", "body_excerpt": "## Summary This PR reframes key user-facing docs around OpenClaw as a personal AI assistant. The main change is positioning: - assistant first - gateway/control plane second It makes the top-of-funnel story clearer without changing the und\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68564", "created_at": "2026-04-18T13:06:54Z", "deletions": 25, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68564/files", "html_url": "https://github.com/openclaw/openclaw/pull/68564", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68564, "review_comments_count": 0, "state": "open", "title": "docs: shift user-facing copy toward assistant-first positioning", "updated_at": "2026-04-18T13:08:40Z" }, { "additions": 260, "author": "billriesner", "author_association": "NONE", "body_excerpt": "Browser tool screenshots embed full base64-encoded PNG images in tool results, which persist in conversation history and cause massive context bloat. A single 1920x1080 screenshot can be ~1.2MB (~300k tokens), pushing sessions into premium\u2026", "changed_files": 2, "cluster_id": "cluster-67804-2", "cluster_ids": [ "cluster-67804-2" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68560", "created_at": "2026-04-18T13:05:13Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68560/files", "html_url": "https://github.com/openclaw/openclaw/pull/68560", "labels": [ "agents", "size: M" ], "merged": false, "number": 68560, "review_comments_count": 2, "state": "open", "title": "fix: strip base64 image data from tool results before persistence", "updated_at": "2026-04-18T14:04:30Z" }, { "additions": 10, "author": "imadal1n", "author_association": "NONE", "body_excerpt": "## Summary - index only primary session transcript files in memory-host-sdk session file discovery - exclude reset/deleted/checkpoint transcript variants from the QMD session-file listing path ## Why For our deployment, recall quality degr\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68559", "created_at": "2026-04-18T13:04:18Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68559/files", "html_url": "https://github.com/openclaw/openclaw/pull/68559", "labels": [ "size: XS" ], "merged": false, "number": 68559, "review_comments_count": 3, "state": "open", "title": "fix(memory-host-sdk): index only primary session transcripts", "updated_at": "2026-04-18T13:08:21Z" }, { "additions": 59, "author": "Ante042", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: Running \\`/compact\\` on a session with little or no summarizable history can render labels like \\`Compacted (0 \u2192 36) \u2022 Context 36/1.0m (0%)\\` \u2014 the arrow direction is reversed, and the denominator context number i\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68558", "created_at": "2026-04-18T13:04:18Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68558/files", "html_url": "https://github.com/openclaw/openclaw/pull/68558", "labels": [ "size: S" ], "merged": false, "number": 68558, "review_comments_count": 3, "state": "open", "title": "fix(auto-reply): stop rendering misleading /compact labels on small sessions", "updated_at": "2026-04-18T13:15:27Z" }, { "additions": 30, "author": "Ante042", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: The Control UI's ctx% badge and cache-hit-rate metric both ignore prompt cache tokens, so any session using Anthropic prompt caching (where most of the prompt lives in \\`cacheRead\\`/\\`cacheWrite\\`) renders a ~0% c\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68557", "created_at": "2026-04-18T13:02:47Z", "deletions": 27, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68557/files", "html_url": "https://github.com/openclaw/openclaw/pull/68557", "labels": [ "app: web-ui", "size: S" ], "merged": false, "number": 68557, "review_comments_count": 3, "state": "open", "title": "fix(ui): include cache tokens in ctx% badge and cache-hit-rate", "updated_at": "2026-04-18T13:20:49Z" }, { "additions": 54, "author": "imadal1n", "author_association": "NONE", "body_excerpt": "## Summary - preserve explicit custom collection names instead of auto-scoping them when a name is already provided - keep unnamed custom collections on the current generated naming path ## Why Operators may depend on stable, human-chosen\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68556", "created_at": "2026-04-18T12:55:40Z", "deletions": 82, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68556/files", "html_url": "https://github.com/openclaw/openclaw/pull/68556", "labels": [ "extensions: memory-core", "size: S" ], "merged": false, "number": 68556, "review_comments_count": 2, "state": "open", "title": "feat(memory-host-sdk): preserve explicit custom collection names", "updated_at": "2026-04-18T14:20:08Z" }, { "additions": 7, "author": "armorbreak001", "author_association": "NONE", "body_excerpt": "## Problem When a cron job payload explicitly declares `\"model\": \"ollama/llama3.2:3b\"`, the gateway **silently** falls back to the default provider/model (`openai/gpt-4o-mini`) if the model is not in the allowlist. There is a `warning` fie\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68555", "created_at": "2026-04-18T12:55:13Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68555/files", "html_url": "https://github.com/openclaw/openclaw/pull/68555", "labels": [ "size: XS" ], "merged": false, "number": 68555, "review_comments_count": 3, "state": "open", "title": "fix(cron): loud error when payload.model silently falls back to wrong provider (#67756)", "updated_at": "2026-04-18T13:04:24Z" }, { "additions": 4, "author": "henkterharmsel", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** `updateSessionStore` and `updateSessionStoreEntry` call `loadSessionStore(storePath, { skipCache: true })` inside `withSessionStoreLock`. On large `sessions.json` files this forces a synchronous `readFileSync` + `\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68554", "created_at": "2026-04-18T12:54:22Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68554/files", "html_url": "https://github.com/openclaw/openclaw/pull/68554", "labels": [ "size: XS" ], "merged": false, "number": 68554, "review_comments_count": 0, "state": "open", "title": "fix(sessions): remove redundant skipCache disk re-read inside session store lock", "updated_at": "2026-04-18T12:57:11Z" }, { "additions": 73, "author": "johnlanni", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem In Matrix rooms, when a user addresses the bot with a mention before a slash command (e.g., `@bot:server /new` or Element's plaintext fallback `BotName: /new`), the slash command is not recognized because the mention prefix is n\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68552", "created_at": "2026-04-18T12:51:00Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68552/files", "html_url": "https://github.com/openclaw/openclaw/pull/68552", "labels": [ "channel: matrix", "size: S" ], "merged": false, "number": 68552, "review_comments_count": 3, "state": "closed", "title": "fix(matrix): strip mention prefix before slash command matching", "updated_at": "2026-04-19T19:55:02Z" }, { "additions": 428, "author": "johnlanni", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Re-read raw allowlist entries from live config on each inbound message, merging with the startup-time resolved values. This allows new entries in `dm.allowFrom` and `groupAllowFrom` to take effect immediately without restarting\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68546", "created_at": "2026-04-18T12:40:02Z", "deletions": 13, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68546/files", "html_url": "https://github.com/openclaw/openclaw/pull/68546", "labels": [ "channel: matrix", "size: M" ], "merged": true, "number": 68546, "review_comments_count": 3, "state": "closed", "title": "fix(matrix): hot-reload dm.allowFrom and groupAllowFrom on each inbound message", "updated_at": "2026-04-19T19:55:23Z" }, { "additions": 219, "author": "Feelw00", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - **Problem:** `retryAsync` applies symmetric jitter even when the caller supplies `retryAfterMs`. Symmetric jitter yields offsets in `[-jitter, +jitter]`, so on roughly half of retries the scheduled delay drops to `retryAfterMs\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 8, "conversation_url": "https://github.com/openclaw/openclaw/pull/68543", "created_at": "2026-04-18T12:26:45Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68543/files", "html_url": "https://github.com/openclaw/openclaw/pull/68543", "labels": [ "size: M" ], "merged": false, "number": 68543, "review_comments_count": 6, "state": "open", "title": "fix(infra): keep retryAsync delays above server-supplied Retry-After", "updated_at": "2026-04-21T03:08:18Z" }, { "additions": 39, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem Reply-media normalization persisted local attachments via `resolveOutboundAttachmentFromUrl` without forwarding the original basename. The path ended up under `~/.openclaw/media/outbound/.`, and downstream transports\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68542", "created_at": "2026-04-18T12:26:13Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68542/files", "html_url": "https://github.com/openclaw/openclaw/pull/68542", "labels": [ "size: XS" ], "merged": false, "number": 68542, "review_comments_count": 1, "state": "closed", "title": "fix(auto-reply): preserve friendly basename for reply-media staging", "updated_at": "2026-04-19T09:15:28Z" }, { "additions": 102, "author": "isopenclaw", "author_association": "NONE", "body_excerpt": "## Summary Fix Discord native command handling so a stalled interaction defer does not block the command acknowledgment path long enough for the interaction to fail. This change: - adds a short timeout around `interaction.defer()` - treats\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68538", "created_at": "2026-04-18T12:16:37Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68538/files", "html_url": "https://github.com/openclaw/openclaw/pull/68538", "labels": [ "channel: discord", "size: S" ], "merged": false, "number": 68538, "review_comments_count": 2, "state": "open", "title": "discord: timebox native-command defer before dispatch", "updated_at": "2026-04-18T12:23:04Z" }, { "additions": 106, "author": "TTTT-T", "author_association": "NONE", "body_excerpt": "## Summary This change allows top-level Telegram `bindings[]` entries with `type: \"acp\"` to target direct chats in addition to forum topics. ## Root Cause Telegram ACP binding normalization and matching only accepted topic-shaped conversat\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68537", "created_at": "2026-04-18T12:12:52Z", "deletions": 23, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68537/files", "html_url": "https://github.com/openclaw/openclaw/pull/68537", "labels": [ "docs", "channel: telegram", "gateway", "size: S" ], "merged": false, "number": 68537, "review_comments_count": 0, "state": "open", "title": "[codex] fix(telegram): allow ACP bindings for direct chats", "updated_at": "2026-04-18T12:13:15Z" }, { "additions": 74, "author": "likewen-tech", "author_association": "NONE", "body_excerpt": "$## Summary - use `sessionTarget` session context for cron failure announcements when the job targets a specific session - fall back to creator `sessionKey` only when no `session:` target exists - add a regression test covering a group-cre\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68535", "created_at": "2026-04-18T12:00:21Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68535/files", "html_url": "https://github.com/openclaw/openclaw/pull/68535", "labels": [ "gateway", "size: S" ], "merged": false, "number": 68535, "review_comments_count": 0, "state": "open", "title": "cron: prefer sessionTarget for failure alerts", "updated_at": "2026-04-18T12:03:39Z" }, { "additions": 375, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68530 ## Problem Light and REM dreaming phases were running on every heartbeat that triggered the deep dreaming cron event, spawning narrative subagent sessions each time (~47K tokens per session). Over a few days this accumulated 7\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 7, "conversation_url": "https://github.com/openclaw/openclaw/pull/68534", "created_at": "2026-04-18T11:39:13Z", "deletions": 27, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68534/files", "html_url": "https://github.com/openclaw/openclaw/pull/68534", "labels": [ "extensions: memory-core", "size: M" ], "merged": false, "number": 68534, "review_comments_count": 8, "state": "open", "title": "fix(memory-core): add cooldown guard to prevent dreaming-narrative from spawning on every heartbeat", "updated_at": "2026-04-21T13:38:16Z" }, { "additions": 341, "author": "Feelw00", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** When a plugin's `register()` function throws after already calling `api.registerHttpRoute()`, `api.registerService()`, `api.registerHook()`, etc., the catch block in `src/plugins/loader.ts` only restores process-g\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/68531", "created_at": "2026-04-18T11:24:07Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68531/files", "html_url": "https://github.com/openclaw/openclaw/pull/68531", "labels": [ "size: M" ], "merged": false, "number": 68531, "review_comments_count": 7, "state": "closed", "title": "fix(plugins): roll back partial registry array contributions when register() throws", "updated_at": "2026-04-18T14:19:34Z" }, { "additions": 81, "author": "YangManBOBO", "author_association": "NONE", "body_excerpt": "## Summary - `resolveChannelGroupRequireMention` now returns **false** when the channel\u2019s **`groupPolicy`** is **`open`** and there is no explicit **`requireMention`** on the resolved group or wildcard entry. - Default remains **true** for\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68528", "created_at": "2026-04-18T11:21:50Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68528/files", "html_url": "https://github.com/openclaw/openclaw/pull/68528", "labels": [ "size: S" ], "merged": false, "number": 68528, "review_comments_count": 2, "state": "open", "title": "fix(groups): default requireMention off when groupPolicy is open (#68476)", "updated_at": "2026-04-19T13:26:52Z" }, { "additions": 39, "author": "cesararevalo", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: - During startup slack http registry gets reset, it becomes empty... - Preventing slack http requests to be routed properly. If this PR fixes a plugin beta-release blocker, title it `\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68523", "created_at": "2026-04-18T11:01:34Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68523/files", "html_url": "https://github.com/openclaw/openclaw/pull/68523", "labels": [ "channel: slack", "size: XS" ], "merged": false, "number": 68523, "review_comments_count": 7, "state": "open", "title": "Fix to Slack HTTP Registry", "updated_at": "2026-04-21T16:56:27Z" }, { "additions": 1, "author": "hxy91819", "author_association": "MEMBER", "body_excerpt": "## Summary - Remove `@` maintainer attribution from the secret-scanning replacement comment template in SKILL.md - The person executing the skill is already a maintainer \u2014 GitHub's author association badge makes this clear, so a har\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68521", "created_at": "2026-04-18T10:59:59Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68521/files", "html_url": "https://github.com/openclaw/openclaw/pull/68521", "labels": [ "maintainer", "size: XS" ], "merged": true, "number": 68521, "review_comments_count": 0, "state": "closed", "title": "fix(secret-scanning): remove maintainer @ attribution from replacement comment template", "updated_at": "2026-04-18T11:02:46Z" }, { "additions": 1808, "author": "hxy91819", "author_association": "MEMBER", "body_excerpt": "## Summary - Remove `@` maintainer attribution from the secret-scanning replacement comment template in SKILL.md - The person executing the skill is already a maintainer \u2014 GitHub's author association badge makes this clear, so a har\u2026", "changed_files": 21, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68519", "created_at": "2026-04-18T10:57:16Z", "deletions": 162, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68519/files", "html_url": "https://github.com/openclaw/openclaw/pull/68519", "labels": [ "scripts", "maintainer", "size: XL" ], "merged": false, "number": 68519, "review_comments_count": 2, "state": "closed", "title": "fix(secret-scanning): remove maintainer @ attribution from replacement comment template", "updated_at": "2026-04-18T11:06:11Z" }, { "additions": 93, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68508 \u2014 System event messages (async exec completion notifications with `System:` and `System (untrusted):` prefixes) were leaking into the visible WebChat/Control UI chat transcript. These are internal agent-only signals\u2026", "changed_files": 2, "cluster_id": "cluster-52463-7", "cluster_ids": [ "cluster-52463-7" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68518", "created_at": "2026-04-18T10:54:59Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68518/files", "html_url": "https://github.com/openclaw/openclaw/pull/68518", "labels": [ "app: web-ui", "size: S" ], "merged": false, "number": 68518, "review_comments_count": 2, "state": "open", "title": "fix(ui): filter system event messages from chat transcript (#68508)", "updated_at": "2026-04-18T10:57:25Z" }, { "additions": 329, "author": "openperf", "author_association": "MEMBER", "body_excerpt": "### Summary - **Problem**: The `openclaw-weixin` sidecar invokes `cleanStaleGatewayProcessesSync()` during its init path. The Unix filter in `src/infra/restart-stale-pids.ts` excluded only `process.pid`, and the two Windows filters did the\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68517", "created_at": "2026-04-18T10:47:27Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68517/files", "html_url": "https://github.com/openclaw/openclaw/pull/68517", "labels": [ "maintainer", "size: M" ], "merged": true, "number": 68517, "review_comments_count": 2, "state": "closed", "title": "fix(infra/restart): exclude ancestor pids from stale-gateway cleanup", "updated_at": "2026-04-18T17:05:56Z" }, { "additions": 169, "author": "frankekn", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: `openclaw agent --deliver` drops outbound replies that contain relative `MEDIA:./out/photo.png` tokens. The raw relative path reaches the outbound media loader, which rejects it with `LocalMediaAccessError: Local medi\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68516", "created_at": "2026-04-18T10:39:01Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68516/files", "html_url": "https://github.com/openclaw/openclaw/pull/68516", "labels": [ "agents", "maintainer", "size: S" ], "merged": true, "number": 68516, "review_comments_count": 2, "state": "closed", "title": "fix(cli): normalize reply-media paths for agent --deliver", "updated_at": "2026-04-18T12:09:02Z" }, { "additions": 1, "author": "altaywtf", "author_association": "MEMBER", "body_excerpt": "## Summary - add the missing `## Unreleased` changelog entry for the already-merged `$schema` config fix from #47322 ## Changes - append one fix entry under `CHANGELOG.md` `## Unreleased` -> `### Fixes` ## Validation - verified `origin/mai\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68515", "created_at": "2026-04-18T10:34:21Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68515/files", "html_url": "https://github.com/openclaw/openclaw/pull/68515", "labels": [ "maintainer", "size: XS" ], "merged": true, "number": 68515, "review_comments_count": 1, "state": "closed", "title": "docs(changelog): add missing entry for #47322", "updated_at": "2026-04-18T10:35:44Z" }, { "additions": 291, "author": "evandance", "author_association": "CONTRIBUTOR", "body_excerpt": "Feishu's `md` tag treats `_` as an italic marker, so its autolink parser terminates at the first underscore. URLs with underscore-separated parameters lost their tail to unclickable static text. Pre-wrap bare http(s) URLs as `[url](url)` b\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68514", "created_at": "2026-04-18T10:34:06Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68514/files", "html_url": "https://github.com/openclaw/openclaw/pull/68514", "labels": [ "channel: feishu", "size: M" ], "merged": false, "number": 68514, "review_comments_count": 3, "state": "open", "title": "fix(feishu): preserve URL boundaries in post markdown messages", "updated_at": "2026-04-18T10:47:13Z" }, { "additions": 443, "author": "jasonmakr", "author_association": "NONE", "body_excerpt": "## Summary Fixes #68452 When a cron-triggered isolated run's last successful tool result is the `NO_REPLY` silent sentinel, the agent correctly produces no user-visible output (the tool already handled delivery). Before this fix, `resolveI\u2026", "changed_files": 6, "cluster_id": "cluster-68452-3", "cluster_ids": [ "cluster-68452-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68512", "created_at": "2026-04-18T10:33:11Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68512/files", "html_url": "https://github.com/openclaw/openclaw/pull/68512", "labels": [ "extensions: memory-core", "agents", "size: M" ], "merged": false, "number": 68512, "review_comments_count": 3, "state": "open", "title": "fix: treat cron runs with NO_REPLY tool results as silent success", "updated_at": "2026-04-18T10:39:36Z" }, { "additions": 68, "author": "Feelw00", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** `emitGatewayRestart()` increments `sigusr1AuthorizedCount` via `authorizeGatewaySigusr1Restart()` before emitting SIGUSR1. If the emit throws (e.g. `process.kill(pid, \"SIGUSR1\")` raises under a sandboxed runtime),\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68511", "created_at": "2026-04-18T10:26:11Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68511/files", "html_url": "https://github.com/openclaw/openclaw/pull/68511", "labels": [ "size: S" ], "merged": false, "number": 68511, "review_comments_count": 0, "state": "closed", "title": "fix(infra): revert sigusr1 authorization when emitGatewayRestart emission throws", "updated_at": "2026-04-18T13:02:50Z" }, { "additions": 2, "author": "hxy91819", "author_association": "MEMBER", "body_excerpt": "## Summary - Move the `#67807` changelog entry from `### Changes` to `### Fixes`, since it is a bug fix - Reword the entry to use the conventional `Cron/delivery:` prefix consistent with other entries in the Fixes section", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68509", "created_at": "2026-04-18T10:21:41Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68509/files", "html_url": "https://github.com/openclaw/openclaw/pull/68509", "labels": [ "maintainer", "size: XS" ], "merged": true, "number": 68509, "review_comments_count": 2, "state": "closed", "title": "changelog: move #67807 entry to Fixes section", "updated_at": "2026-04-18T10:29:49Z" }, { "additions": 8, "author": "grimmjoww", "author_association": "NONE", "body_excerpt": "See the diff", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68507", "created_at": "2026-04-18T10:03:57Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68507/files", "html_url": "https://github.com/openclaw/openclaw/pull/68507", "labels": [ "size: XS" ], "merged": false, "number": 68507, "review_comments_count": 2, "state": "closed", "title": "fix(gateway): try SIGUSR1 restart before spawning external processes", "updated_at": "2026-04-19T06:40:33Z" }, { "additions": 206, "author": "likewen-tech", "author_association": "NONE", "body_excerpt": "$## Summary\\n- add clearer cause and next-step guidance for degraded `status --all` diagnosis states\\n- classify gateway log and health failures into actionable recovery hints instead of raw errors alone\\n- cover invalid config, unreachabl\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68506", "created_at": "2026-04-18T10:01:54Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68506/files", "html_url": "https://github.com/openclaw/openclaw/pull/68506", "labels": [ "commands", "size: M" ], "merged": false, "number": 68506, "review_comments_count": 3, "state": "open", "title": "status: improve degraded-state recovery guidance", "updated_at": "2026-04-18T10:04:30Z" }, { "additions": 69, "author": "anyech", "author_association": "NONE", "body_excerpt": "# fix(memory-core): preserve inline REM nesting while normalizing separate-report heading levels ## Summary This fixes a real generated-markdown regression in memory-core REM previews without breaking the inline daily-note path. The origin\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68505", "created_at": "2026-04-18T10:00:37Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68505/files", "html_url": "https://github.com/openclaw/openclaw/pull/68505", "labels": [ "extensions: memory-core", "size: S" ], "merged": false, "number": 68505, "review_comments_count": 2, "state": "open", "title": "fix(memory-core): normalize REM preview heading levels", "updated_at": "2026-04-18T10:15:49Z" }, { "additions": 271, "author": "likewen-tech", "author_association": "NONE", "body_excerpt": "$## Summary\\n- filter routine gateway tail noise and wrapper residue from `status --all` diagnosis output\\n- group repeated lane-wait, subagent-end, detached-flow, and context-overflow diagnostics into concise summaries\\n- stop surfacing u\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68503", "created_at": "2026-04-18T09:49:29Z", "deletions": 22, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68503/files", "html_url": "https://github.com/openclaw/openclaw/pull/68503", "labels": [ "gateway", "commands", "size: M" ], "merged": false, "number": 68503, "review_comments_count": 2, "state": "open", "title": "status: reduce diagnosis noise in status --all", "updated_at": "2026-04-18T09:54:48Z" }, { "additions": 271, "author": "monasprox", "author_association": "NONE", "body_excerpt": "## Summary Adds documentation for using **Azure AI Foundry** models with OpenClaw, covering both Anthropic (Claude) and OpenAI (GPT) model families. ## What's included - `docs/providers/azure-ai-foundry.md` \u2014 full provider guide following\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68502", "created_at": "2026-04-18T09:49:19Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68502/files", "html_url": "https://github.com/openclaw/openclaw/pull/68502", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68502, "review_comments_count": 2, "state": "open", "title": "docs: add Azure AI Foundry provider guide", "updated_at": "2026-04-18T10:03:16Z" }, { "additions": 229, "author": "likewen-tech", "author_association": "NONE", "body_excerpt": "$## Summary - separate recent failures from historical residue in founder-visible task summaries - update `tasks`, `status`, and `flows` to use the split instead of one generic failure bucket - add targeted coverage for recent-vs-historica\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68499", "created_at": "2026-04-18T09:34:48Z", "deletions": 25, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68499/files", "html_url": "https://github.com/openclaw/openclaw/pull/68499", "labels": [ "commands", "size: M" ], "merged": false, "number": 68499, "review_comments_count": 4, "state": "open", "title": "tasks: separate recent and historical failures in founder-visible summaries", "updated_at": "2026-04-18T12:34:15Z" }, { "additions": 4, "author": "masatohoshino", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `event-helpers.ts` imports the `MatrixEvent` type from the bare `matrix-js-sdk` package root, while sibling files in the same extension reach the SDK via a deeper subpath. - Why it matters: Mixed import paths to the s\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68498", "created_at": "2026-04-18T09:33:53Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68498/files", "html_url": "https://github.com/openclaw/openclaw/pull/68498", "labels": [ "channel: matrix", "size: XS" ], "merged": true, "number": 68498, "review_comments_count": 0, "state": "closed", "title": "fix(matrix): pin event-helpers import to canonical matrix-js-sdk subpath (refs #50477)", "updated_at": "2026-04-19T19:37:49Z" }, { "additions": 127, "author": "infocentr", "author_association": "NONE", "body_excerpt": "## Summary - Add `command-dispatch: exec` (with `command-exec: `) to workspace skill frontmatter. - When a slash command bound to such a skill is invoked, OpenClaw runs the script in the skill's `baseDir` and delivers stdout\u2026", "changed_files": 7, "cluster_id": "cluster-37377-2", "cluster_ids": [ "cluster-37377-2" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68495", "created_at": "2026-04-18T09:28:18Z", "deletions": 14, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68495/files", "html_url": "https://github.com/openclaw/openclaw/pull/68495", "labels": [ "agents", "size: S" ], "merged": false, "number": 68495, "review_comments_count": 1, "state": "open", "title": "Skills: add exec dispatch for slash commands", "updated_at": "2026-04-18T09:31:18Z" }, { "additions": 214, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68486 \u2014 the macOS restart helper that \\`openclaw update\\` emits (darwin branch of \\`prepareRestartScript\\`) was writing every \\`launchctl\\` stderr to \\`/dev/null\\` and chaining the final fallback \\`kickstart\\` with \\`|| t\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68492", "created_at": "2026-04-18T09:20:47Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68492/files", "html_url": "https://github.com/openclaw/openclaw/pull/68492", "labels": [ "cli", "size: M", "extensions: qa-lab" ], "merged": true, "number": 68492, "review_comments_count": 6, "state": "closed", "title": "fix(update-cli): capture macOS launchctl stderr to a log file instead of /dev/null", "updated_at": "2026-04-18T17:42:52Z" }, { "additions": 6, "author": "MoerAI", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Feishu sends a duplicate text/card message after streaming completes because the `onIdle`-triggered `closeStreaming()` does not record the streamed content in `deliveredFinalTexts`. The subsequent `final` delivery bypasses the i\u2026", "changed_files": 1, "cluster_id": "cluster-33883-5", "cluster_ids": [ "cluster-33883-5" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68491", "created_at": "2026-04-18T09:17:51Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68491/files", "html_url": "https://github.com/openclaw/openclaw/pull/68491", "labels": [ "channel: feishu", "size: XS" ], "merged": false, "number": 68491, "review_comments_count": 1, "state": "open", "title": "fix(feishu): prevent duplicate message after streaming card close (#67791)", "updated_at": "2026-04-18T09:21:07Z" }, { "additions": 69, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68471 \u2014 Heartbeat triggers unnecessary `cli session reset: reason=system-prompt` every 30 minutes. ## Problem The built-in heartbeat mechanism causes a full CLI session reset each time it fires because the `extraSystemPro\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68490", "created_at": "2026-04-18T09:17:30Z", "deletions": 7, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68490/files", "html_url": "https://github.com/openclaw/openclaw/pull/68490", "labels": [ "agents", "size: S" ], "merged": false, "number": 68490, "review_comments_count": 2, "state": "closed", "title": "fix: exclude volatile inbound metadata from extraSystemPromptHash", "updated_at": "2026-04-18T12:49:26Z" }, { "additions": 76, "author": "Feelw00", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** The subagent sweeper self-stops the moment `subagentRuns` becomes empty, without checking `pendingLifecycleErrorByRunId`. That same sweeper cycle is the only thing that expires pending-error entries via `PENDING_E\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68489", "created_at": "2026-04-18T09:15:55Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68489/files", "html_url": "https://github.com/openclaw/openclaw/pull/68489", "labels": [ "agents", "size: S" ], "merged": false, "number": 68489, "review_comments_count": 0, "state": "closed", "title": "fix(agents): keep subagent sweeper alive while pendingLifecycleErrorByRunId has entries", "updated_at": "2026-04-18T10:06:55Z" }, { "additions": 5, "author": "MoerAI", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary MiniMax-M2.7 and M2.7-highspeed image attachments were silently dropped because `buildMinimaxCatalog()` hardcoded `input: [\"text\"]` via `buildMinimaxTextModel()`, bypassing the correct image-detection logic already present in `b\u2026", "changed_files": 1, "cluster_id": "cluster-65424-3", "cluster_ids": [ "cluster-65424-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68485", "created_at": "2026-04-18T09:03:47Z", "deletions": 45, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68485/files", "html_url": "https://github.com/openclaw/openclaw/pull/68485", "labels": [ "size: S", "extensions: minimax" ], "merged": false, "number": 68485, "review_comments_count": 0, "state": "open", "title": "fix(minimax): enable image input for M2.7 models in provider catalog (#65424)", "updated_at": "2026-04-18T09:05:06Z" }, { "additions": 199, "author": "lyfuci", "author_association": "NONE", "body_excerpt": "## Summary - Problem: OpenClaw redacts secret-looking values (\\`apiKey\\`, \\`token\\`, \\`secret\\`, bearer, etc.) in agent-visible tool output but the redaction is transparent at the text layer \u2014 the placeholder \\`\"***\"\\` / \\`\"\u2026` to `openclaw models auth login` - pass the requested profile through the login command into provider auth context - let the OpenAI Codex OAuth provider honor that explicit target profile name ## Why Toda\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68477", "created_at": "2026-04-18T08:34:12Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68477/files", "html_url": "https://github.com/openclaw/openclaw/pull/68477", "labels": [ "cli", "commands", "size: S", "extensions: openai" ], "merged": false, "number": 68477, "review_comments_count": 1, "state": "open", "title": "feat(auth): add --profile to models auth login", "updated_at": "2026-04-18T08:37:27Z" }, { "additions": 230, "author": "jetd1", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - When a provider returns 429 with a long `retry-after` (e.g. Anthropic's 239s for quota exhaustion), Stainless-based SDKs sleep for the full duration before retrying. The run blocks and the error never surfaces to OpenClaw's mo\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68474", "created_at": "2026-04-18T08:29:21Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68474/files", "html_url": "https://github.com/openclaw/openclaw/pull/68474", "labels": [ "agents", "size: M" ], "merged": false, "number": 68474, "review_comments_count": 3, "state": "open", "title": "fix: skip SDK retry on 429 with long retry-after across providers", "updated_at": "2026-04-18T09:14:49Z" }, { "additions": 110, "author": "jasonmakr", "author_association": "NONE", "body_excerpt": "## Summary The `LANGUAGE_STOP_WORDS.english` array contained only 8 entries (`and`, `are`, `for`, `into`, `its`, `our`, `then`, `were`), allowing common English stopwords and LLM transcript role markers to surface as top concept themes in\u2026", "changed_files": 2, "cluster_id": "cluster-68449-4", "cluster_ids": [ "cluster-68449-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68473", "created_at": "2026-04-18T08:28:22Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68473/files", "html_url": "https://github.com/openclaw/openclaw/pull/68473", "labels": [ "extensions: memory-core", "size: S" ], "merged": false, "number": 68473, "review_comments_count": 0, "state": "open", "title": "fix(memory-core): expand concept stopword list to filter transcript noise", "updated_at": "2026-04-18T08:31:27Z" }, { "additions": 6, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes openclaw#68027 - Browser attachOnly mode fails with \"profile openclaw is not running\" despite healthy CDP endpoint. ## Root Cause When `attachOnly` is enabled and `profileState.running` is false (which is expected since Op\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68469", "created_at": "2026-04-18T08:20:34Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68469/files", "html_url": "https://github.com/openclaw/openclaw/pull/68469", "labels": [ "size: XS" ], "merged": false, "number": 68469, "review_comments_count": 0, "state": "open", "title": "fix(browser): allow attachOnly profiles retry window for CDP connection", "updated_at": "2026-04-18T08:24:17Z" }, { "additions": 273, "author": "yfge", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - add `channels.whatsapp.silentErrorReplies` to the WhatsApp config schema/types and UI hints - suppress gateway-synthesized WhatsApp error payloads when that flag is enabled, matching Telegram behavior - add targeted inbound-di\u2026", "changed_files": 16, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68465", "created_at": "2026-04-18T08:01:21Z", "deletions": 16, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68465/files", "html_url": "https://github.com/openclaw/openclaw/pull/68465", "labels": [ "docs", "channel: whatsapp-web", "agents", "size: M" ], "merged": false, "number": 68465, "review_comments_count": 2, "state": "open", "title": "fix(whatsapp): support silentErrorReplies parity", "updated_at": "2026-04-21T07:09:37Z" }, { "additions": 720, "author": "nnlevy", "author_association": "NONE", "body_excerpt": "## Summary - persist a per-run delivery claim and user-safe delivery payload for subagent completions - route active-parent completion announces queue-first with fail-closed semantics instead of direct-first fallback behavior - harden iMes\u2026", "changed_files": 14, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68464", "created_at": "2026-04-18T08:00:14Z", "deletions": 91, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68464/files", "html_url": "https://github.com/openclaw/openclaw/pull/68464", "labels": [ "channel: imessage", "agents", "size: L" ], "merged": false, "number": 68464, "review_comments_count": 6, "state": "open", "title": "Harden subagent completion delivery", "updated_at": "2026-04-18T08:23:53Z" }, { "additions": 67, "author": "BruceMacD", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `openclaw onboard` in Ollama cloud-only mode populated the provider's model list from a hardcoded, stale array (`kimi-k2.5:cloud`, `minimax-m2.7:cloud`, `glm-5.1:cloud`). The local-only and cloud+local modes already d\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68463", "created_at": "2026-04-18T07:59:12Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68463/files", "html_url": "https://github.com/openclaw/openclaw/pull/68463", "labels": [ "maintainer", "size: S" ], "merged": true, "number": 68463, "review_comments_count": 1, "state": "closed", "title": "onboard (ollama): populate cloud-only model list from ollama.com/api/tags", "updated_at": "2026-04-21T16:00:19Z" }, { "additions": 218, "author": "smartchainark", "author_association": "NONE", "body_excerpt": "## Summary Closes #68423. `maybeRecoverSuspiciousConfigRead` would silently restore from `~/.openclaw/openclaw.json.bak` whenever the live config looked clobbered (update-channel-only root). It did not verify the backup itself was clean. I\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68462", "created_at": "2026-04-18T07:55:39Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68462/files", "html_url": "https://github.com/openclaw/openclaw/pull/68462", "labels": [ "size: M" ], "merged": false, "number": 68462, "review_comments_count": 5, "state": "open", "title": "fix(config): refuse to restore from a polluted backup containing redacted secrets (#68423)", "updated_at": "2026-04-18T08:19:52Z" }, { "additions": 494, "author": "JuniperSling", "author_association": "NONE", "body_excerpt": "# feat(tencent): add bundled Tencent Cloud provider plugin (TokenHub + Token Plan) ## Summary - **Problem:** OpenClaw has no first-class support for Tencent Cloud HY3 models. Users on Tencent Cloud have to hand-roll OpenAI-compatible provi\u2026", "changed_files": 13, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68460", "created_at": "2026-04-18T07:51:44Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68460/files", "html_url": "https://github.com/openclaw/openclaw/pull/68460", "labels": [ "docs", "size: M" ], "merged": false, "number": 68460, "review_comments_count": 6, "state": "open", "title": "feat(tencent): add bundled Tencent Cloud provider plugin (Tokenhub + Token Plan)", "updated_at": "2026-04-21T08:35:20Z" }, { "additions": 513548, "author": "juliopx", "author_association": "NONE", "body_excerpt": "## Summary - **`/loop` mode**: nuevo modo de operaci\u00f3n aut\u00f3noma continua para el agente - **AgentMode refactor**: renombrado `IntensiveMode` \u2192 `AgentMode` e `intensive` \u2192 `hyperfocus` en toda la base de c\u00f3digo - **Steer mid-turn**: inyecci\u2026", "changed_files": 5591, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68459", "created_at": "2026-04-18T07:45:52Z", "deletions": 163961, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68459/files", "html_url": "https://github.com/openclaw/openclaw/pull/68459", "labels": [ "docs", "channel: bluebubbles", "channel: discord", "channel: googlechat", "channel: imessage", "channel: line", "channel: matrix", "channel: mattermost", "channel: msteams", "channel: nextcloud-talk", "channel: nostr", "channel: signal", "channel: slack", "channel: telegram", "channel: tlon", "channel: voice-call", "channel: whatsapp-web", "channel: zalo", "channel: zalouser", "app: android", "app: ios", "app: macos", "gateway", "extensions: copilot-proxy", "extensions: diagnostics-otel", "extensions: llm-task", "extensions: lobster", "extensions: memory-core", "extensions: memory-lancedb", "extensions: open-prose", "scripts", "docker", "agents", "channel: feishu", "channel: twitch", "extensions: device-pair", "extensions: minimax-portal-auth", "extensions: phone-control", "extensions: talk-voice", "channel: irc", "size: XL", "extensions: acpx" ], "merged": false, "number": 68459, "review_comments_count": 0, "state": "closed", "title": "feat: loop mode, hyperfocus refactor, steer mid-turn, llama.cpp thinking", "updated_at": "2026-04-18T07:48:04Z" }, { "additions": 29, "author": "masatohoshino", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: `matrix-js-sdk` triggers `INEFFECTIVE_DYNAMIC_IMPORT` esbuild warnings and a \"multiple entrypoints\" runtime error because the package is reachable through both static and dynamic import paths. - Why it matters: Bundli\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68458", "created_at": "2026-04-18T07:44:59Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68458/files", "html_url": "https://github.com/openclaw/openclaw/pull/68458", "labels": [ "channel: matrix", "size: XS" ], "merged": false, "number": 68458, "review_comments_count": 2, "state": "closed", "title": "fix(matrix): isolate credentials runtime import boundary (refs #50477)", "updated_at": "2026-04-18T07:56:27Z" }, { "additions": 44, "author": "bluesky6868", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `sanitizeMimeType` in `src/media-understanding/apply.ts` matches MIME types with an **unanchored** regex, so malformed input silently truncates to a valid-looking prefix. Example: `\"image/png junk\"` \u2192 `\"image/png\"`; `\u2026", "changed_files": 2, "cluster_id": "cluster-68225-2", "cluster_ids": [ "cluster-68225-2" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68456", "created_at": "2026-04-18T07:35:10Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68456/files", "html_url": "https://github.com/openclaw/openclaw/pull/68456", "labels": [ "size: XS" ], "merged": false, "number": 68456, "review_comments_count": 0, "state": "open", "title": "security(media): anchor sanitizeMimeType regex to reject malformed input", "updated_at": "2026-04-18T07:38:01Z" }, { "additions": 90, "author": "ahbi1006-hue", "author_association": "NONE", "body_excerpt": "## Problem When adding a second Feishu IM channel in the same OpenClaw instance, the accountId is always forced to DEFAULT_ACCOUNT_ID (\"default\"), making it impossible to register multiple independent Feishu bots. ## Changes - `extensions/\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68455", "created_at": "2026-04-18T07:30:52Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68455/files", "html_url": "https://github.com/openclaw/openclaw/pull/68455", "labels": [ "channel: feishu", "size: S" ], "merged": false, "number": 68455, "review_comments_count": 3, "state": "open", "title": "feat(feishu): allow custom accountId during Feishu channel onboarding", "updated_at": "2026-04-18T07:36:14Z" }, { "additions": 109, "author": "leonidas1712", "author_association": "NONE", "body_excerpt": "## Summary - Problem: persisted per-agent/provider config could preserve OpenRouter's legacy base URL (`https://openrouter.ai/v1`) during model-config merge instead of adopting the canonical `https://openrouter.ai/api/v1`. - Why it matters\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68454", "created_at": "2026-04-18T07:30:02Z", "deletions": 39, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68454/files", "html_url": "https://github.com/openclaw/openclaw/pull/68454", "labels": [ "agents", "size: S", "extensions: qa-lab" ], "merged": false, "number": 68454, "review_comments_count": 3, "state": "closed", "title": "fix(openrouter): replace legacy base URL during model-config merge", "updated_at": "2026-04-18T16:02:27Z" }, { "additions": 156, "author": "anyech", "author_association": "NONE", "body_excerpt": "Fixes #68452. ## Summary This fixes a cron silent-success bug in embedded runner finalization. If an isolated cron `agentTurn` receives a successful tool result whose content is exact `NO_REPLY`, but the model then ends with an empty final\u2026", "changed_files": 3, "cluster_id": "cluster-68452-3", "cluster_ids": [ "cluster-68452-3" ], "cluster_role": "canonical", "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68453", "created_at": "2026-04-18T07:25:58Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68453/files", "html_url": "https://github.com/openclaw/openclaw/pull/68453", "labels": [ "agents", "size: S" ], "merged": false, "number": 68453, "review_comments_count": 2, "state": "open", "title": "fix(cron): preserve silent tool-result `NO_REPLY` on empty final turn", "updated_at": "2026-04-19T05:53:26Z" }, { "additions": 1700, "author": "seanniu93", "author_association": "NONE", "body_excerpt": "## Summary - Problem: isolated cron, isolated heartbeat, and one-shot follow-up runs can create bundle MCP runtimes and leave them alive after the one-shot run ends, which causes connection/process accumulation over time. - Why it matters:\u2026", "changed_files": 18, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68450", "created_at": "2026-04-18T07:23:52Z", "deletions": 908, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68450/files", "html_url": "https://github.com/openclaw/openclaw/pull/68450", "labels": [ "channel: matrix", "agents", "size: XL" ], "merged": false, "number": 68450, "review_comments_count": 3, "state": "open", "title": "fix(mcp): dispose bundled MCP runtimes after isolated one-shot runs", "updated_at": "2026-04-18T17:29:33Z" }, { "additions": 146, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem When a model ID contains a provider prefix like `google/gemma-4-26b-a4b`, OpenClaw splits on `/` and treats `google` as the provider identifier, routing to Google's remote API instead of the configured local LM Studio backend. #\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68448", "created_at": "2026-04-18T07:20:20Z", "deletions": 36, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68448/files", "html_url": "https://github.com/openclaw/openclaw/pull/68448", "labels": [ "agents", "size: S" ], "merged": false, "number": 68448, "review_comments_count": 1, "state": "closed", "title": "fix: prioritize explicit provider config over model ID prefix parsing", "updated_at": "2026-04-18T12:49:22Z" }, { "additions": 3, "author": "suboss87", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Stops DM `allowFrom` entries (from pairing) from leaking into group policy sender bypass. When `account.groupAllowFrom` is undefined, the code fell back to `configuredAllowFrom` (DM entries), making `hasGroupAllowFrom` true and\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68446", "created_at": "2026-04-18T07:03:38Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68446/files", "html_url": "https://github.com/openclaw/openclaw/pull/68446", "labels": [ "channel: whatsapp-web", "size: XS" ], "merged": false, "number": 68446, "review_comments_count": 1, "state": "open", "title": "fix(whatsapp): stop DM allowFrom fallback into group policy sender bypass", "updated_at": "2026-04-18T07:19:26Z" }, { "additions": 89, "author": "mushuiyu886", "author_association": "NONE", "body_excerpt": "## Summary - **#68376**: Fix gateway crash caused by unhandled promise rejection in exec tool's `onUpdate` callback. The `emitUpdate()` call could produce a rejected Promise from an async `onUpdate`, but the synchronous call site never cau\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68445", "created_at": "2026-04-18T06:57:13Z", "deletions": 15, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68445/files", "html_url": "https://github.com/openclaw/openclaw/pull/68445", "labels": [ "extensions: memory-core", "agents", "size: S" ], "merged": false, "number": 68445, "review_comments_count": 2, "state": "open", "title": "fix: exec tool gateway crash (#68376) and memory-core dreaming bloat (#68379)", "updated_at": "2026-04-18T07:10:24Z" }, { "additions": 268, "author": "GaosCode", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: Feishu group replies automatically @mention other inbound mention targets when a message mentions the bot plus additional entities. - Why it matters: In multi-bot group chats, this turns one user message into repeated\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68444", "created_at": "2026-04-18T06:56:04Z", "deletions": 46, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68444/files", "html_url": "https://github.com/openclaw/openclaw/pull/68444", "labels": [ "docs", "channel: feishu", "size: M" ], "merged": false, "number": 68444, "review_comments_count": 0, "state": "open", "title": "fix(feishu): stop auto-forwarding mentions when disabled", "updated_at": "2026-04-18T06:59:25Z" }, { "additions": 104, "author": "monasprox", "author_association": "NONE", "body_excerpt": "## Summary Adds a new `list` action to the Feishu channel plugin that enables reading chat history for a given chat/group by `container_id`. ## Motivation Currently the Feishu plugin only supports fetching a single message by `messageId`.\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68443", "created_at": "2026-04-18T06:55:05Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68443/files", "html_url": "https://github.com/openclaw/openclaw/pull/68443", "labels": [ "channel: feishu", "size: S" ], "merged": false, "number": 68443, "review_comments_count": 2, "state": "open", "title": "feat(feishu): add list action to read chat history by container_id", "updated_at": "2026-04-18T10:03:07Z" }, { "additions": 31261, "author": "100yenadmin", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary PR-11 of the plan-mode rollout series. Sits on top of PR-10 (#68440) which is a hard prerequisite. Net-new in this PR are 2 commits (\\`29bf11710e\\` + \\`fe274f395a\\`) \u2014 focused review surface is \\`git diff feat/plan-archetype-and\u2026", "changed_files": 145, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 11, "conversation_url": "https://github.com/openclaw/openclaw/pull/68441", "created_at": "2026-04-18T06:41:54Z", "deletions": 227, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68441/files", "html_url": "https://github.com/openclaw/openclaw/pull/68441", "labels": [ "docs", "channel: telegram", "app: web-ui", "gateway", "agents", "size: XL", "extensions: openai" ], "merged": false, "number": 68441, "review_comments_count": 109, "state": "closed", "title": "feat(plan-mode): universal /plan slash commands across all channels (PR-11)", "updated_at": "2026-04-19T11:51:04Z" }, { "additions": 23671, "author": "100yenadmin", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary PR-10 of the plan-mode rollout series. Sits on top of #67514 / #67538 / #67542 / #67721 / PR-8 / PR-9 (all currently in flight on the rollup branch). Net-new in this PR are 2 commits (\\`78c6eb488c\\` + \\`1bf9d7b4e7\\`) \u2014 focused r\u2026", "changed_files": 115, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 7, "conversation_url": "https://github.com/openclaw/openclaw/pull/68440", "created_at": "2026-04-18T06:41:08Z", "deletions": 221, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68440/files", "html_url": "https://github.com/openclaw/openclaw/pull/68440", "labels": [ "docs", "app: web-ui", "gateway", "agents", "size: XL", "extensions: openai" ], "merged": false, "number": 68440, "review_comments_count": 32, "state": "closed", "title": "feat(plan-mode): plan archetype + ask_user_question + auto mode (PR-10)", "updated_at": "2026-04-19T11:45:23Z" }, { "additions": 0, "author": "hxy91819", "author_association": "MEMBER", "body_excerpt": "## Summary - PR #67679 landed a duplicate line under `### Changes` in the Unreleased block in addition to the detailed entry that was already present under `### Fixes`. - The short `### Changes` line appears to have been auto-generated fro\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68439", "created_at": "2026-04-18T06:39:33Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68439/files", "html_url": "https://github.com/openclaw/openclaw/pull/68439", "labels": [ "maintainer", "size: XS" ], "merged": true, "number": 68439, "review_comments_count": 0, "state": "closed", "title": "docs(changelog): deduplicate #67679 entry", "updated_at": "2026-04-18T06:41:55Z" }, { "additions": 89, "author": "mushuiyu886", "author_association": "NONE", "body_excerpt": "## Summary - **#68376**: Catch rejected `onUpdate` promises in the exec tool's `emitUpdate()` to prevent unhandled rejections from crashing the gateway - **#68379**: Cap dreaming artifact growth \u2014 day-based narrative session keys, 2MB corp\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68437", "created_at": "2026-04-18T06:20:28Z", "deletions": 15, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68437/files", "html_url": "https://github.com/openclaw/openclaw/pull/68437", "labels": [ "extensions: memory-core", "agents", "size: S" ], "merged": false, "number": 68437, "review_comments_count": 1, "state": "closed", "title": "fix: exec tool gateway crash (#68376) and memory-core dreaming bloat (#68379)", "updated_at": "2026-04-18T06:56:54Z" }, { "additions": 1322, "author": "foxer0952", "author_association": "NONE", "body_excerpt": "## Summary The OpenAI-compatible `/v1/chat/completions` endpoint currently recognises only `text` / `input_text` / `image_url` content parts and silently drops `input_audio`, `file`, and `video_url`. This brings it closer to parity with th\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68435", "created_at": "2026-04-18T06:19:19Z", "deletions": 18, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68435/files", "html_url": "https://github.com/openclaw/openclaw/pull/68435", "labels": [ "gateway", "size: XL" ], "merged": false, "number": 68435, "review_comments_count": 12, "state": "open", "title": "feat(gateway): accept audio/file content blocks in /v1/chat/completions", "updated_at": "2026-04-18T10:37:24Z" }, { "additions": 101, "author": "richddr", "author_association": "NONE", "body_excerpt": "## Summary - prewarm mirrored outbound sessions after `message send` records session metadata - reuse the existing session skills snapshot logic so the first callback turn is not a cold-start session - add a regression test covering proact\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68433", "created_at": "2026-04-18T06:14:14Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68433/files", "html_url": "https://github.com/openclaw/openclaw/pull/68433", "labels": [ "size: S" ], "merged": false, "number": 68433, "review_comments_count": 2, "state": "open", "title": "Prewarm mirrored outbound sessions before first callback", "updated_at": "2026-04-18T06:20:43Z" }, { "additions": 52, "author": "mushuiyu886", "author_association": "NONE", "body_excerpt": "## Summary - **#68376**: Catch rejected `onUpdate` promises in the exec tool's `emitUpdate()` to prevent unhandled rejections from crashing the gateway - **#68379**: Cap dreaming artifact growth \u2014 day-based narrative session keys, 2MB corp\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68432", "created_at": "2026-04-18T06:09:09Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68432/files", "html_url": "https://github.com/openclaw/openclaw/pull/68432", "labels": [ "extensions: memory-core", "agents", "size: S" ], "merged": false, "number": 68432, "review_comments_count": 5, "state": "closed", "title": "fix: exec tool gateway crash (#68376) and memory-core dreaming bloat (#68379)", "updated_at": "2026-04-18T06:23:09Z" }, { "additions": 18, "author": "visionik", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Harden three CI workflow files against `template-injection` findings reported by zizmor (v1.24.1), using the canonical fix pattern: hoist every dynamic `${{ \u2026 }}` expression out of the `run:` block into a step-level `env:` dicti\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68431", "created_at": "2026-04-18T06:01:55Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68431/files", "html_url": "https://github.com/openclaw/openclaw/pull/68431", "labels": [ "maintainer", "size: XS" ], "merged": true, "number": 68431, "review_comments_count": 0, "state": "closed", "title": "ci(security): harden workflow steps against template-injection", "updated_at": "2026-04-18T06:04:58Z" }, { "additions": 84, "author": "lyfuci", "author_association": "NONE", "body_excerpt": "## Summary - Problem: The embedded ACP runtime health probe hardcodes \\`codex\\` as the default probe agent and has no way to override that through plugin config. On hosts that install, for example, OpenCode as their only ACP agent (no Code\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68430", "created_at": "2026-04-18T06:01:18Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68430/files", "html_url": "https://github.com/openclaw/openclaw/pull/68430", "labels": [ "size: S", "extensions: acpx" ], "merged": false, "number": 68430, "review_comments_count": 1, "state": "open", "title": "extensions/acpx: expose probeAgent config so non-codex ACP stacks stay available", "updated_at": "2026-04-19T18:17:02Z" }, { "additions": 69, "author": "afurm", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: - Problem: several bundled web-search plugins accepted `SecretRef` objects for `plugins.entries..config.webSearch.apiKey`, but runtime compatibility lookup only registered Brave a\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68424", "created_at": "2026-04-18T05:51:13Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68424/files", "html_url": "https://github.com/openclaw/openclaw/pull/68424", "labels": [ "size: S", "extensions: moonshot", "extensions: tavily" ], "merged": true, "number": 68424, "review_comments_count": 0, "state": "closed", "title": "fix(web-search): restore SecretRef runtime compatibility for bundled providers", "updated_at": "2026-04-21T01:34:44Z" }, { "additions": 10, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68369 The \"new chat\" welcome state and message thread in the web dashboard were stretching to the full width of the content area instead of being constrained to a readable column width. This is a regression fix. ## Root C\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68422", "created_at": "2026-04-18T05:45:43Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68422/files", "html_url": "https://github.com/openclaw/openclaw/pull/68422", "labels": [ "app: web-ui", "size: XS" ], "merged": false, "number": 68422, "review_comments_count": 0, "state": "open", "title": "fix(ui): constrain web chat width to 920px for better readability", "updated_at": "2026-04-18T05:47:09Z" }, { "additions": 56, "author": "mushuiyu886", "author_association": "NONE", "body_excerpt": "## Summary - **#68376**: Catch rejected `onUpdate` promises in the exec tool's `emitUpdate()` to prevent unhandled rejections from crashing the gateway - **#68379**: Cap dreaming artifact growth \u2014 day-based narrative session keys, 2MB corp\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68421", "created_at": "2026-04-18T05:41:44Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68421/files", "html_url": "https://github.com/openclaw/openclaw/pull/68421", "labels": [ "extensions: memory-core", "agents", "size: S" ], "merged": false, "number": 68421, "review_comments_count": 3, "state": "closed", "title": "fix: exec tool gateway crash (#68376) and memory-core dreaming bloat (#68379)", "updated_at": "2026-04-18T06:01:00Z" }, { "additions": 242, "author": "miyago9267", "author_association": "NONE", "body_excerpt": "## Summary Incomplete-turn exits (empty response, reasoning-only retries exhausted, or terminal error stopReason) currently surface `\"\u26a0\ufe0f Agent couldn't generate a response. Please try again.\"` directly to the user. This wastes a configured\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68420", "created_at": "2026-04-18T05:38:22Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68420/files", "html_url": "https://github.com/openclaw/openclaw/pull/68420", "labels": [ "agents", "size: M" ], "merged": false, "number": 68420, "review_comments_count": 5, "state": "open", "title": "Agents/fallback: rotate to fallback model on incomplete-turn exits", "updated_at": "2026-04-18T09:11:14Z" }, { "additions": 439, "author": "briandevans", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: On 2026.4.15, `mistral/mistral-small-latest` with reasoning enabled streams `delta.content` as an Anthropic-style typed-block array (`[{type:\"thinking\", thinking:[\u2026]}, {type:\"text\", text:\"\u2026\"}]`) instead of a string. T\u2026", "changed_files": 3, "cluster_id": "cluster-68309-3", "cluster_ids": [ "cluster-68309-3" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68418", "created_at": "2026-04-18T05:34:58Z", "deletions": 14, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68418/files", "html_url": "https://github.com/openclaw/openclaw/pull/68418", "labels": [ "agents", "size: M" ], "merged": false, "number": 68418, "review_comments_count": 6, "state": "open", "title": "fix(agents): unpack typed-block delta.content arrays in openai-completions stream", "updated_at": "2026-04-18T05:44:59Z" }, { "additions": 94, "author": "acinader", "author_association": "NONE", "body_excerpt": "## What Server deployments (e.g. the AWS CloudFormation template) place OpenClaw state at `OPENCLAW_STATE_DIR=/data/openclaw` and symlink `~/.openclaw \u2192 /data/openclaw` for convenience. The exec approvals path check was tripping on this sy\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68417", "created_at": "2026-04-18T05:34:31Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68417/files", "html_url": "https://github.com/openclaw/openclaw/pull/68417", "labels": [ "size: S" ], "merged": false, "number": 68417, "review_comments_count": 2, "state": "open", "title": "fix(exec-approvals): allow ~/.openclaw symlink when OPENCLAW_STATE_DIR is set", "updated_at": "2026-04-18T18:50:10Z" }, { "additions": 246, "author": "skylee-01", "author_association": "NONE", "body_excerpt": "## Summary - Problem: `supportsAdaptiveThinking()` in `anthropic-transport-stream.ts` and `shouldUseAnthropicAdaptiveThinkingDefault()` in `register.runtime.ts` use hardcoded model-ID checks that omit Opus 4.7, Sonnet 4.7, and all future 4\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68416", "created_at": "2026-04-18T05:28:34Z", "deletions": 29, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68416/files", "html_url": "https://github.com/openclaw/openclaw/pull/68416", "labels": [ "agents", "size: M", "extensions: anthropic" ], "merged": false, "number": 68416, "review_comments_count": 6, "state": "open", "title": "fix(agents): forward-compat adaptive thinking for Claude 4.7+ models", "updated_at": "2026-04-18T05:58:27Z" }, { "additions": 455, "author": "mraleko", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: Control UI dropped user image messages after history reload because transcript-backed media fields were not rendered. - Why it matters: image uploads appeared during the optimistic send path, then disappeared once the\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68415", "created_at": "2026-04-18T05:19:16Z", "deletions": 23, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68415/files", "html_url": "https://github.com/openclaw/openclaw/pull/68415", "labels": [ "app: web-ui", "size: M" ], "merged": true, "number": 68415, "review_comments_count": 4, "state": "closed", "title": "fix(ui): keep history-backed user image messages visible", "updated_at": "2026-04-18T19:45:16Z" }, { "additions": 56, "author": "anyech", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Active Memory silently clamps configured `timeoutMs` values above `60000` down to `60000`, so a requested `90000` budget never actually reaches runtime. - Why it matters: operators can believe they are testing a longe\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68411", "created_at": "2026-04-18T05:00:35Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68411/files", "html_url": "https://github.com/openclaw/openclaw/pull/68411", "labels": [ "size: S" ], "merged": false, "number": 68411, "review_comments_count": 0, "state": "closed", "title": "fix(active-memory): honor timeoutMs values up to 90s", "updated_at": "2026-04-18T16:01:02Z" }, { "additions": 252, "author": "jasonmakr", "author_association": "NONE", "body_excerpt": "## Problem Light sleep and REM dreaming phases write managed blocks into daily memory files (`memory/YYYY-MM-DD.md`) when using inline storage mode. These blocks contain session-agnostic candidate memories that leak cross-session context w\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68408", "created_at": "2026-04-18T04:40:57Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68408/files", "html_url": "https://github.com/openclaw/openclaw/pull/68408", "labels": [ "extensions: memory-core", "size: M" ], "merged": false, "number": 68408, "review_comments_count": 4, "state": "open", "title": "fix(memory-core): strip dreaming managed blocks from daily memory reads", "updated_at": "2026-04-18T06:44:02Z" }, { "additions": 29, "author": "jack-ra", "author_association": "NONE", "body_excerpt": "Ensure gateway management commands are handled locally by OpenClaw even when focused on an ACP session. This prevents these commands from being erroneously sent to the agent.", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68407", "created_at": "2026-04-18T04:40:05Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68407/files", "html_url": "https://github.com/openclaw/openclaw/pull/68407", "labels": [ "size: XS" ], "merged": false, "number": 68407, "review_comments_count": 2, "state": "open", "title": "fix(acp): bypass agent dispatch for /status, /acp, and /unfocus commands", "updated_at": "2026-04-18T04:43:21Z" }, { "additions": 229, "author": "coygeek", "author_association": "CONTRIBUTOR", "body_excerpt": "## Fix Summary The release ships VM deployment guides that tell operators to set `OPENCLAW_GATEWAY_TOKEN=change-me-now` while binding the gateway to LAN. The gateway startup weak-secret guard only rejects a different sentinel value, so a n\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68404", "created_at": "2026-04-18T04:30:23Z", "deletions": 96, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68404/files", "html_url": "https://github.com/openclaw/openclaw/pull/68404", "labels": [ "docs", "gateway", "size: M" ], "merged": true, "number": 68404, "review_comments_count": 1, "state": "closed", "title": "fix: Published deployment token placeholder bypasses gateway...", "updated_at": "2026-04-18T17:29:44Z" }, { "additions": 245, "author": "bek91", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: - Problem: fresh Slack thread bootstrap could replay OpenClaw's own prior Slack bot turns back into a new session as assistant context, and `runPreparedReply()` could duplicate `Threa\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 6, "conversation_url": "https://github.com/openclaw/openclaw/pull/68402", "created_at": "2026-04-18T04:29:52Z", "deletions": 27, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68402/files", "html_url": "https://github.com/openclaw/openclaw/pull/68402", "labels": [ "channel: slack", "size: M" ], "merged": false, "number": 68402, "review_comments_count": 5, "state": "open", "title": "[Context] Avoid replaying current Slack bot thread context", "updated_at": "2026-04-20T12:40:29Z" }, { "additions": 105, "author": "lyfuci", "author_association": "NONE", "body_excerpt": "## Summary - Problem: On WSL2 Ubuntu with `[boot] systemd=true`, `openclaw gateway start` fails with the misleading error `Gateway start failed: Error: systemctl not available; systemd user services are required on Linux.` even when system\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68400", "created_at": "2026-04-18T04:26:05Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68400/files", "html_url": "https://github.com/openclaw/openclaw/pull/68400", "labels": [ "gateway", "size: S" ], "merged": false, "number": 68400, "review_comments_count": 1, "state": "open", "title": "daemon/systemd: distinguish WSL user D-Bus socket missing from missing systemctl", "updated_at": "2026-04-19T18:16:19Z" }, { "additions": 60, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68391 \u2014 \\`openclaw models\\` declares \\`--agent \\` as a top-level option but only \\`status\\` and \\`list\\` actually consume it. The \\`set\\` and \\`set-image\\` write-paths inherited the flag without wiring it through, so\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68399", "created_at": "2026-04-18T04:24:04Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68399/files", "html_url": "https://github.com/openclaw/openclaw/pull/68399", "labels": [ "cli", "size: S" ], "merged": false, "number": 68399, "review_comments_count": 1, "state": "closed", "title": "fix(cli): reject --agent on models set/set-image instead of silently writing global default", "updated_at": "2026-04-19T01:15:29Z" }, { "additions": 24, "author": "skernelx", "author_association": "NONE", "body_excerpt": "## Summary `sessions_spawn` currently hard-errors when `runtime=\"subagent\"` receives `streamTo` or `resumeSessionId`, even though the subagent code path never consumes either field. Schema-strict providers (most notably `gpt-5.4` via the O\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68397", "created_at": "2026-04-18T04:11:36Z", "deletions": 29, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68397/files", "html_url": "https://github.com/openclaw/openclaw/pull/68397", "labels": [ "agents", "size: S" ], "merged": false, "number": 68397, "review_comments_count": 0, "state": "open", "title": "fix(sessions_spawn): silently strip ACP-only fields for runtime=subagent", "updated_at": "2026-04-20T10:34:44Z" }, { "additions": 1713, "author": "BunsDev", "author_association": "MEMBER", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: - Problem: OAuth authority drifted between OpenClaw auth profiles and `.codex/auth.json`, and local Codex callback/refresh paths could fail or hang in ways that looked like \"slow OAut\u2026", "changed_files": 28, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 8, "conversation_url": "https://github.com/openclaw/openclaw/pull/68396", "created_at": "2026-04-18T04:10:20Z", "deletions": 209, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68396/files", "html_url": "https://github.com/openclaw/openclaw/pull/68396", "labels": [ "docs", "agents", "maintainer", "size: XL", "extensions: openai" ], "merged": true, "number": 68396, "review_comments_count": 16, "state": "closed", "title": "[codex] fix(auth): harden OAuth refresh and Codex CLI bootstrap flows", "updated_at": "2026-04-18T06:09:33Z" }, { "additions": 30, "author": "MonkeyLeeT", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Accept `agents.defaults.compaction.truncateAfterCompaction` in the Zod config schema and add regression coverage at both the leaf schema and public config validation layers. ## Root cause The public config type, help metadata, a\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/68395", "created_at": "2026-04-18T04:09:17Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68395/files", "html_url": "https://github.com/openclaw/openclaw/pull/68395", "labels": [ "size: XS" ], "merged": false, "number": 68395, "review_comments_count": 0, "state": "open", "title": "fix(config): accept truncateAfterCompaction", "updated_at": "2026-04-21T17:12:10Z" }, { "additions": 123, "author": "lyfuci", "author_association": "NONE", "body_excerpt": "## Summary - Problem: When users set `plugins.allow` to a channel-style id (for example `[\"feishu\"]`) instead of the real plugin id (`openclaw-lark`), the loader still emits `plugins.allow is empty; discovered non-bundled plugins may auto-\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68389", "created_at": "2026-04-18T04:06:01Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68389/files", "html_url": "https://github.com/openclaw/openclaw/pull/68389", "labels": [ "size: S" ], "merged": false, "number": 68389, "review_comments_count": 2, "state": "open", "title": "plugins: clarify allowlist warning when entries don't match discovered ids", "updated_at": "2026-04-19T18:15:31Z" }, { "additions": 846, "author": "jacko2bot", "author_association": "NONE", "body_excerpt": "## Summary Fixes #68329 \u2014 CLI-backed sessions skipped both pre-turn native compaction checks and post-turn context-engine/plugin maintenance, so context grew unbounded. For `claude-cli` specifically, compacting only OpenClaw's local transc\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68388", "created_at": "2026-04-18T04:05:48Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68388/files", "html_url": "https://github.com/openclaw/openclaw/pull/68388", "labels": [ "commands", "agents", "size: L" ], "merged": false, "number": 68388, "review_comments_count": 4, "state": "open", "title": "fix(cli-backend): restore compaction lifecycle and rotate claude-cli sessions after compaction", "updated_at": "2026-04-18T14:55:53Z" }, { "additions": 30, "author": "bluesky6868", "author_association": "NONE", "body_excerpt": "## Summary - Problem: the exec secret resolver accepted any non-JSON single-value stdout verbatim when `jsonOnly: false`, including plugin/log noise followed by the intended scalar. - Why it matters: if an exec-backed resolver emits machin\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68384", "created_at": "2026-04-18T03:48:19Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68384/files", "html_url": "https://github.com/openclaw/openclaw/pull/68384", "labels": [ "size: XS" ], "merged": false, "number": 68384, "review_comments_count": 0, "state": "open", "title": "fix(secrets): reject noisy plain exec stdout", "updated_at": "2026-04-18T05:21:29Z" }, { "additions": 74, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68373 **Problem:** `restoreMemoryPluginState` from plugin cache overwrites memory capability with `undefined` because the cached snapshot was taken before capability registration. This causes wiki bridge import to return 0 artifacts\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68382", "created_at": "2026-04-18T03:39:40Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68382/files", "html_url": "https://github.com/openclaw/openclaw/pull/68382", "labels": [ "size: S" ], "merged": false, "number": 68382, "review_comments_count": 3, "state": "closed", "title": "fix(plugins): preserve existing capability during plugin cache state restore", "updated_at": "2026-04-18T12:49:20Z" }, { "additions": 141, "author": "chrisabad", "author_association": "NONE", "body_excerpt": "## Summary Adds a `maxExecutionMs` per-task timeout configuration to the command queue, preventing individual tasks from blocking the lane indefinitely. ## Changes - `src/process/command-queue.ts`: Add `maxExecutionMs` option, enforce time\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68381", "created_at": "2026-04-18T03:36:42Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68381/files", "html_url": "https://github.com/openclaw/openclaw/pull/68381", "labels": [ "size: S" ], "merged": false, "number": 68381, "review_comments_count": 4, "state": "open", "title": "feat: add maxExecutionMs per-task timeout to command lane", "updated_at": "2026-04-19T02:46:56Z" }, { "additions": 141, "author": "m0x14o", "author_association": "NONE", "body_excerpt": "## Summary - preserve existing launchd proxy environment variables when reinstalling the macOS LaunchAgent without proxy vars in the current shell - keep explicit proxy overrides while filling missing proxy keys from the existing plist - d\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68377", "created_at": "2026-04-18T03:05:16Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68377/files", "html_url": "https://github.com/openclaw/openclaw/pull/68377", "labels": [ "docs", "gateway", "size: S" ], "merged": false, "number": 68377, "review_comments_count": 2, "state": "open", "title": "fix(daemon): preserve launchd proxy env on reinstall", "updated_at": "2026-04-18T03:09:08Z" }, { "additions": 419, "author": "hxy91819", "author_association": "MEMBER", "body_excerpt": "## Summary - Add two custom lint rules to prevent credential leaks via the config API - Fix uncovered URL config fields (`browser.cdpUrl`, `gateway.remote.url`) ### Lint 1: `check-no-redact-import-in-runtime.mjs` Ensures runtime code (brow\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68375", "created_at": "2026-04-18T02:53:44Z", "deletions": 15, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68375/files", "html_url": "https://github.com/openclaw/openclaw/pull/68375", "labels": [ "scripts", "maintainer", "size: M" ], "merged": false, "number": 68375, "review_comments_count": 13, "state": "open", "title": "lint: add config redact coverage guards", "updated_at": "2026-04-18T09:59:24Z" }, { "additions": 52, "author": "chrisabad", "author_association": "NONE", "body_excerpt": "## Summary Tool results written to the session JSONL are now capped at `SESSION_MAX_TOOL_RESULT_CHARS` (50KB / 51,200 chars) to prevent oversized `exec`/`read`/`web_fetch` output from inflating session files and consuming the entire contex\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68372", "created_at": "2026-04-18T02:47:00Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68372/files", "html_url": "https://github.com/openclaw/openclaw/pull/68372", "labels": [ "agents", "size: S" ], "merged": false, "number": 68372, "review_comments_count": 5, "state": "open", "title": "feat: add session-persistence truncation cap for tool results", "updated_at": "2026-04-19T02:41:46Z" }, { "additions": 1838, "author": "OpenCodeEngineer", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68369 ## Problem The \"new chat\" welcome state and message thread stretch to the full width of the content area. This is a regression \u2014 the fix was implemented on branch `issue-57235-web-sessions` (commit `0df41d246c`) but never merg\u2026", "changed_files": 43, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68370", "created_at": "2026-04-18T02:33:31Z", "deletions": 49, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68370/files", "html_url": "https://github.com/openclaw/openclaw/pull/68370", "labels": [ "app: web-ui", "gateway", "agents", "size: XL" ], "merged": false, "number": 68370, "review_comments_count": 1, "state": "closed", "title": "Web UI: constrain chat thread and input to 920px max-width", "updated_at": "2026-04-18T02:41:25Z" }, { "additions": 770, "author": "visionik", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Relax the gateway's default Permissions-Policy so the control-ui's own origin can use the microphone. The prior value denied microphone access for every origin (including the page itself), which silently blocked the chat view's\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68368", "created_at": "2026-04-18T02:29:05Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68368/files", "html_url": "https://github.com/openclaw/openclaw/pull/68368", "labels": [ "gateway", "maintainer", "size: L" ], "merged": true, "number": 68368, "review_comments_count": 0, "state": "closed", "title": "fix(gateway): allow microphone access for same-origin in Permissions-Policy header", "updated_at": "2026-04-18T03:03:51Z" }, { "additions": 97, "author": "neeravmakwana", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: Under OpenClaw's `google-gemini-cli` model provider, the Gemini CLI is driven non-interactively via `--prompt`, and its default per-tool approval mode silently strips built-in tools that require confirmation (`write_f\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68366", "created_at": "2026-04-18T02:27:04Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68366/files", "html_url": "https://github.com/openclaw/openclaw/pull/68366", "labels": [ "docs", "gateway", "agents", "size: S" ], "merged": false, "number": 68366, "review_comments_count": 0, "state": "open", "title": "Google Gemini CLI: pass --yolo so non-interactive --prompt invocations expose write/edit tools (#68216)", "updated_at": "2026-04-18T02:56:18Z" }, { "additions": 6, "author": "jjmk6", "author_association": "NONE", "body_excerpt": "## Summary Fix broken internal links and display text consistency reported in issue #50828. ### Changes - `docs/plugins/manifest.md`: `/configuration` \u2192 `/configuration-reference` - `docs/gateway/troubleshooting.md`: - Link paths: `/gatewa\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68365", "created_at": "2026-04-18T02:14:46Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68365/files", "html_url": "https://github.com/openclaw/openclaw/pull/68365", "labels": [ "docs", "gateway", "size: XS" ], "merged": false, "number": 68365, "review_comments_count": 0, "state": "open", "title": "docs: fix broken links and display text consistency (fixes #50828)", "updated_at": "2026-04-18T02:16:10Z" }, { "additions": 20, "author": "jasonmakr", "author_association": "NONE", "body_excerpt": "## Problem `buildNarrativeSessionKey` includes a millisecond timestamp (`nowMs` from `Date.now()`) in the session key, making it unique per dream run: ```ts return `dreaming-narrative-${params.phase}-${workspaceHash}-${params.nowMs}`; ```\u2026", "changed_files": 2, "cluster_id": "cluster-65653-13", "cluster_ids": [ "cluster-65653-13" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68364", "created_at": "2026-04-18T02:14:36Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68364/files", "html_url": "https://github.com/openclaw/openclaw/pull/68364", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 68364, "review_comments_count": 1, "state": "open", "title": "fix: prevent unbounded narrative session growth by stabilizing session key (#68354)", "updated_at": "2026-04-18T02:19:06Z" }, { "additions": 558, "author": "mcaxtr", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: after wiring WhatsApp runtime to honor `accounts.default`, schema validation, runtime compat, and live monitor behavior still had several mismatches around debounce, self-chat, and inherited group/default-account beha\u2026", "changed_files": 20, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68362", "created_at": "2026-04-18T02:08:44Z", "deletions": 97, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68362/files", "html_url": "https://github.com/openclaw/openclaw/pull/68362", "labels": [ "docs", "channel: whatsapp-web", "commands", "maintainer", "size: L" ], "merged": false, "number": 68362, "review_comments_count": 3, "state": "closed", "title": "fix(whatsapp): align config schema and monitor behavior", "updated_at": "2026-04-18T03:18:25Z" }, { "additions": 572, "author": "mcaxtr", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: WhatsApp runtime, setup output, and security path guidance still disagreed on whether shared multi-account defaults live at channel root or under `channels.whatsapp.accounts.default`. - Why it matters: runtime compat\u2026", "changed_files": 14, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68361", "created_at": "2026-04-18T02:07:49Z", "deletions": 50, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68361/files", "html_url": "https://github.com/openclaw/openclaw/pull/68361", "labels": [ "channel: whatsapp-web", "maintainer", "size: L" ], "merged": false, "number": 68361, "review_comments_count": 2, "state": "closed", "title": "fix(whatsapp): wire shared defaults through accounts.default", "updated_at": "2026-04-18T03:18:21Z" }, { "additions": 281, "author": "mcaxtr", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: after introducing account-scoped WhatsApp group session keys, legacy activation state still lived on the old unsuffixed key and activation-only entries could be misread or reused incorrectly. - Why it matters: named-a\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68360", "created_at": "2026-04-18T02:07:11Z", "deletions": 44, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68360/files", "html_url": "https://github.com/openclaw/openclaw/pull/68360", "labels": [ "channel: whatsapp-web", "maintainer", "size: M" ], "merged": false, "number": 68360, "review_comments_count": 5, "state": "closed", "title": "fix(whatsapp): preserve scoped group activation backfill", "updated_at": "2026-04-18T03:18:10Z" }, { "additions": 640, "author": "mcaxtr", "author_association": "MEMBER", "body_excerpt": "## Summary - Problem: WhatsApp inbound policy and group-session routing for named accounts were spread across multiple monitor paths, making later multi-account fixes hard to apply consistently. - Why it matters: named accounts need an acc\u2026", "changed_files": 19, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68359", "created_at": "2026-04-18T02:06:37Z", "deletions": 177, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68359/files", "html_url": "https://github.com/openclaw/openclaw/pull/68359", "labels": [ "channel: whatsapp-web", "maintainer", "size: L" ], "merged": false, "number": 68359, "review_comments_count": 5, "state": "closed", "title": "fix(whatsapp): centralize inbound policy and scoped group routes", "updated_at": "2026-04-18T03:18:05Z" }, { "additions": 0, "author": "XxXKoZXxX", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 0, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68358", "created_at": "2026-04-18T02:05:23Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68358/files", "html_url": "https://github.com/openclaw/openclaw/pull/68358", "labels": [ "size: XS" ], "merged": false, "number": 68358, "review_comments_count": 0, "state": "closed", "title": "clawmerge", "updated_at": "2026-04-18T02:25:59Z" }, { "additions": 1, "author": "samimjafari", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68356", "created_at": "2026-04-18T01:57:49Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68356/files", "html_url": "https://github.com/openclaw/openclaw/pull/68356", "labels": [ "size: XS" ], "merged": false, "number": 68356, "review_comments_count": 1, "state": "closed", "title": " alpha", "updated_at": "2026-04-18T01:59:46Z" }, { "additions": 35, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68347 **Problem:** `WakeParamsSchema` used `additionalProperties: false` (AJV), rejecting unknown properties like `paperclip` injected by Paperclip 2026.416.0 in wake payloads. **Fix:** Changed to `additionalProperties: true` so unk\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68355", "created_at": "2026-04-18T01:48:10Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68355/files", "html_url": "https://github.com/openclaw/openclaw/pull/68355", "labels": [ "app: web-ui", "gateway", "size: XS" ], "merged": true, "number": 68355, "review_comments_count": 1, "state": "closed", "title": "fix: allow unknown properties in WakeParams schema (#68347)", "updated_at": "2026-04-18T03:40:27Z" }, { "additions": 202, "author": "neeravmakwana", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: OpenRouter model runs (e.g. `openrouter/google/gemini-2.5-flash`, Grok 4.x, minimax-m2.7) return blank responses with `stopReason=stop payloads=0` and surface `\u26a0\ufe0f Agent couldn't generate a response`. - Why it matters:\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68351", "created_at": "2026-04-18T01:35:24Z", "deletions": 14, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68351/files", "html_url": "https://github.com/openclaw/openclaw/pull/68351", "labels": [ "agents", "size: M" ], "merged": false, "number": 68351, "review_comments_count": 5, "state": "closed", "title": "fix(openrouter): surface reasoning_details visible-text as user output (#68261)", "updated_at": "2026-04-18T02:12:23Z" }, { "additions": 556, "author": "YoungMoneyInvestments", "author_association": "NONE", "body_excerpt": "## Summary - thread reply-routing idempotency keys through outbound delivery and Telegram send paths - dedupe Telegram sends by account/chat/idempotency key to prevent duplicate routed replies - normalize raw Discord send/poll targets to c\u2026", "changed_files": 14, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68350", "created_at": "2026-04-18T01:31:11Z", "deletions": 330, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68350/files", "html_url": "https://github.com/openclaw/openclaw/pull/68350", "labels": [ "channel: discord", "channel: telegram", "size: L" ], "merged": false, "number": 68350, "review_comments_count": 1, "state": "open", "title": "fix: harden channel reply routing", "updated_at": "2026-04-18T19:26:06Z" }, { "additions": 161, "author": "neeravmakwana", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - Problem: On a local Ollama setup, a Modelfile `PARAMETER num_ctx 32768` override was ignored during discovery (only the base model's `.context_length` was read), which tripped `context-window-guard` with \"Model context window\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68349", "created_at": "2026-04-18T01:23:51Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68349/files", "html_url": "https://github.com/openclaw/openclaw/pull/68349", "labels": [ "docs", "size: S" ], "merged": false, "number": 68349, "review_comments_count": 2, "state": "open", "title": "Ollama: honor Modelfile num_ctx and auto-detect tool support", "updated_at": "2026-04-19T06:41:39Z" }, { "additions": 2, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes openclaw#68282 The `openclaw status` and related status commands are slow on a fresh process because doctor contract loading uses the slow jiti path instead of native loading for built artifacts. ## Root Cause The `getJiti\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68348", "created_at": "2026-04-18T01:18:46Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68348/files", "html_url": "https://github.com/openclaw/openclaw/pull/68348", "labels": [ "size: XS" ], "merged": false, "number": 68348, "review_comments_count": 0, "state": "open", "title": "fix: use native loading for doctor contract API to speed up status command", "updated_at": "2026-04-18T01:22:02Z" }, { "additions": 69, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "## Problem Image attachments are dropped with 'model does not support images' even when the model has image capability configured. The issue is in `resolveGatewayModelSupportsImages()` which uses case-sensitive exact matching on model ID,\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68346", "created_at": "2026-04-18T01:05:24Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68346/files", "html_url": "https://github.com/openclaw/openclaw/pull/68346", "labels": [ "gateway", "size: S" ], "merged": false, "number": 68346, "review_comments_count": 1, "state": "closed", "title": "fix: use normalized model lookup in resolveGatewayModelSupportsImages (#68272)", "updated_at": "2026-04-18T12:49:15Z" }, { "additions": 669, "author": "fangguisheng520", "author_association": "NONE", "body_excerpt": "\u2026nguages ## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue la\u2026", "changed_files": 27, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68345", "created_at": "2026-04-18T01:00:50Z", "deletions": 649, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68345/files", "html_url": "https://github.com/openclaw/openclaw/pull/68345", "labels": [ "app: web-ui", "size: M" ], "merged": false, "number": 68345, "review_comments_count": 6, "state": "open", "title": "Modify several web pages by hard-coding the language into multiple la\u2026", "updated_at": "2026-04-18T01:52:23Z" }, { "additions": 18, "author": "yxjsxy", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - allow `extensions.ollama.config.baseUrl` in the Ollama plugin config schema - add a focused test to lock the schema entry in place - align plugin schema with existing runtime behavior and docs for remote Ollama hosts ## Proble\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68342", "created_at": "2026-04-18T00:21:13Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68342/files", "html_url": "https://github.com/openclaw/openclaw/pull/68342", "labels": [ "size: XS" ], "merged": false, "number": 68342, "review_comments_count": 1, "state": "closed", "title": "fix(ollama): allow baseUrl in plugin config schema", "updated_at": "2026-04-18T18:45:29Z" }, { "additions": 300, "author": "thesomewhatyou", "author_association": "CONTRIBUTOR", "body_excerpt": "- [x] Mark as AI-assisted in the PR title or description - [x] Note the degree of testing (lightly tested) - [x] Confirm you understand what the code does This PR fixes multiple critical bugs and vulnerabilities found during a repository a\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68341", "created_at": "2026-04-18T00:18:46Z", "deletions": 168, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68341/files", "html_url": "https://github.com/openclaw/openclaw/pull/68341", "labels": [ "gateway", "agents", "size: M" ], "merged": false, "number": 68341, "review_comments_count": 11, "state": "open", "title": "fix: remediate critical vulnerabilities and logic regressions", "updated_at": "2026-04-20T21:30:13Z" }, { "additions": 96, "author": "anniesurla", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68339", "created_at": "2026-04-18T00:06:08Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68339/files", "html_url": "https://github.com/openclaw/openclaw/pull/68339", "labels": [ "docs", "size: S", "extensions: nvidia" ], "merged": false, "number": 68339, "review_comments_count": 5, "state": "open", "title": "fix(nvidia): wire onboarding auth and document NIM endpoint", "updated_at": "2026-04-18T00:31:28Z" }, { "additions": 65, "author": "evgyur", "author_association": "NONE", "body_excerpt": "## Summary - Parse empty `MEDIA:` directives whose media path appears on the following line. - Preserve ordered text/media segments when consuming the continuation path. - Keep the change scoped to media output parsing only; no delivery, r\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68338", "created_at": "2026-04-18T00:06:06Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68338/files", "html_url": "https://github.com/openclaw/openclaw/pull/68338", "labels": [ "size: S" ], "merged": false, "number": 68338, "review_comments_count": 2, "state": "open", "title": "Parse multiline MEDIA directives", "updated_at": "2026-04-18T06:57:53Z" }, { "additions": 5, "author": "jlapenna", "author_association": "CONTRIBUTOR", "body_excerpt": "Add explicit warning on Docker deployment for ACP tools Clarifies that ACP harness CLI tools (such as `@google/gemini-cli`, `@mariozechner/pi-coding-agent`) must be installed on the `gateway` container rather than the `sandbox` container b\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68337", "created_at": "2026-04-18T00:05:20Z", "deletions": 0, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68337/files", "html_url": "https://github.com/openclaw/openclaw/pull/68337", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68337, "review_comments_count": 0, "state": "open", "title": "docs(acp): Add explicit warning on Docker deployment for ACP tools", "updated_at": "2026-04-18T20:31:45Z" }, { "additions": 22, "author": "LightDriverCS", "author_association": "NONE", "body_excerpt": "## Problem The CLI activation loader in `src/plugins/activation-planner.ts` filters plugins by `plugin.activation.onCommands` (or `commandAliases[].cliCommand`). memory-core's manifest only declared a `commandAliases` entry with `cliComman\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68335", "created_at": "2026-04-18T00:00:33Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68335/files", "html_url": "https://github.com/openclaw/openclaw/pull/68335", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 68335, "review_comments_count": 0, "state": "open", "title": "fix(memory-core): activate on wiki CLI subcommand", "updated_at": "2026-04-19T11:06:33Z" }, { "additions": 86, "author": "LightDriverCS", "author_association": "NONE", "body_excerpt": "## Problem `restoreMemoryPluginState` unconditionally overwrites `memoryPluginState.capability` with `undefined` when the restoring state has no capability (typical for a cached plugin-registry snapshot taken before the capability was regi\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68334", "created_at": "2026-04-18T00:00:29Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68334/files", "html_url": "https://github.com/openclaw/openclaw/pull/68334", "labels": [ "size: S" ], "merged": false, "number": 68334, "review_comments_count": 4, "state": "open", "title": "fix(memory): split restoreMemoryPluginState into restore/merge for cache-hit bug", "updated_at": "2026-04-18T18:50:29Z" }, { "additions": 62, "author": "kagura-agent", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #68299 **Problem:** `createMatrixClient` ignores the `network.dangerouslyAllowPrivateNetwork` configuration, so self-hosted Matrix homeservers on private IPs (192.168.x.x, localhost, etc.) are blocked with `resolves to private/intern\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68332", "created_at": "2026-04-17T23:48:00Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68332/files", "html_url": "https://github.com/openclaw/openclaw/pull/68332", "labels": [ "channel: matrix", "size: S" ], "merged": true, "number": 68332, "review_comments_count": 1, "state": "closed", "title": "Matrix: forward dangerouslyAllowPrivateNetwork config to client SSRF policy", "updated_at": "2026-04-18T04:50:54Z" }, { "additions": 585, "author": "acwilan", "author_association": "NONE", "body_excerpt": "## Summary - **Problem:** TTS voice/provider and STT language/prompt settings are global \u2014 all agents share the same speech config, making it impossible to give different agents different voices or transcription languages. - **Why it matte\u2026", "changed_files": 12, "cluster_id": "cluster-66252-3", "cluster_ids": [ "cluster-66252-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68331", "created_at": "2026-04-17T23:44:10Z", "deletions": 8, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68331/files", "html_url": "https://github.com/openclaw/openclaw/pull/68331", "labels": [ "agents", "size: L" ], "merged": false, "number": 68331, "review_comments_count": 3, "state": "open", "title": "feat: per-agent TTS and STT config overrides [AI-assisted]", "updated_at": "2026-04-17T23:51:11Z" }, { "additions": 0, "author": "MonkeyLeeT", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Accept `agents.defaults.compaction.truncateAfterCompaction` in the Zod config schema and add regression coverage at both the leaf schema and public config validation layers. ## Root cause The public config type, help metadata, a\u2026", "changed_files": 0, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68328", "created_at": "2026-04-17T23:39:44Z", "deletions": 0, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68328/files", "html_url": "https://github.com/openclaw/openclaw/pull/68328", "labels": [ "size: XS" ], "merged": false, "number": 68328, "review_comments_count": 0, "state": "closed", "title": "fix(config): accept truncateAfterCompaction", "updated_at": "2026-04-18T04:04:34Z" }, { "additions": 101, "author": "JIRBOY", "author_association": "NONE", "body_excerpt": "## Summary - **Root cause**: `loadAuthProfileStoreForSecretsRuntime` triggered plugin loading via `overlayExternalAuthProfiles` \u2192 `resolveProviderPluginsForHooks`, causing ~60s of jiti plugin compilation on first call during gateway startu\u2026", "changed_files": 8, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/68327", "created_at": "2026-04-17T23:16:26Z", "deletions": 16, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68327/files", "html_url": "https://github.com/openclaw/openclaw/pull/68327", "labels": [ "gateway", "scripts", "agents", "size: S" ], "merged": false, "number": 68327, "review_comments_count": 8, "state": "open", "title": "fix(gateway): reduce startup latency by ~36s", "updated_at": "2026-04-18T07:15:56Z" }, { "additions": 65, "author": "JeevaByte", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: **Telegram bots forwarding messages into configured channels were processed as normal user messages, creating noise, potential loops, and unintended AI responses to automated traffic.\u2026", "changed_files": 11, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68325", "created_at": "2026-04-17T23:10:37Z", "deletions": 17, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68325/files", "html_url": "https://github.com/openclaw/openclaw/pull/68325", "labels": [ "docs", "channel: telegram", "size: S" ], "merged": false, "number": 68325, "review_comments_count": 1, "state": "open", "title": "telegram: add allowBots parity for inbound filtering", "updated_at": "2026-04-17T23:56:30Z" }, { "additions": 43, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68282 \u2014 \\`openclaw status\\` (and \\`--json\\`, \\`--deep\\`, \\`--usage\\`) pays a ~15s first-call penalty on every fresh process, dominated by doctor-contract loading through the default jiti path. The reporter measured the co\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68324", "created_at": "2026-04-17T23:07:58Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68324/files", "html_url": "https://github.com/openclaw/openclaw/pull/68324", "labels": [ "size: XS" ], "merged": false, "number": 68324, "review_comments_count": 2, "state": "closed", "title": "fix(plugins): enable native jiti for doctor-contract loader to cut status cold-start ~13s", "updated_at": "2026-04-18T22:36:46Z" }, { "additions": 65, "author": "kvnkho", "author_association": "NONE", "body_excerpt": "## Summary - Send `KILOCODE_API_KEY` as a Bearer token in the **extension** kilocode model discovery fetch so the gateway can resolve the user and include their BYOK models in the response. ## Problem When OpenClaw discovers models via `fe\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68322", "created_at": "2026-04-17T23:04:21Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68322/files", "html_url": "https://github.com/openclaw/openclaw/pull/68322", "labels": [ "scripts", "size: S", "extensions: kilocode" ], "merged": false, "number": 68322, "review_comments_count": 1, "state": "open", "title": "fix(kilocode): send auth header in model discovery to include BYOK models", "updated_at": "2026-04-17T23:11:31Z" }, { "additions": 1, "author": "itsuzef", "author_association": "NONE", "body_excerpt": "## Summary - Adds `eleven_v3` to `ELEVENLABS_TTS_MODELS` in the bundled ElevenLabs speech provider - The model already worked end-to-end (the API call passes `model_id` straight through with no validation), but was absent from the allowlis\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68321", "created_at": "2026-04-17T22:59:50Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68321/files", "html_url": "https://github.com/openclaw/openclaw/pull/68321", "labels": [ "size: XS" ], "merged": false, "number": 68321, "review_comments_count": 1, "state": "open", "title": "feat(elevenlabs): register eleven_v3 in TTS model allowlist", "updated_at": "2026-04-17T23:01:14Z" }, { "additions": 33, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - The Ollama plugin's `configSchema` had `additionalProperties: false` with only `discovery.enabled` allowed, rejecting any `plugins.entries.ollama.config.baseUrl` at startup - Values set via `openclaw config set plugins.entries\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68320", "created_at": "2026-04-17T22:58:48Z", "deletions": 6, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68320/files", "html_url": "https://github.com/openclaw/openclaw/pull/68320", "labels": [ "size: XS", "close:superseded" ], "merged": false, "number": 68320, "review_comments_count": 2, "state": "closed", "title": "fix(ollama): add baseUrl to configSchema and wire it through discovery", "updated_at": "2026-04-21T03:26:23Z" }, { "additions": 218, "author": "Jcxu97", "author_association": "NONE", "body_excerpt": "Closes #68294. ## Problem On Node 24 the built-in undici (ships with Node core, currently 6.x) and OpenClaw's bundled `undici@8.0.2` define two **distinct** `FormData` classes. `transcribeOpenAiCompatibleAudio` builds its multipart body vi\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68318", "created_at": "2026-04-17T22:57:31Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68318/files", "html_url": "https://github.com/openclaw/openclaw/pull/68318", "labels": [ "size: M" ], "merged": false, "number": 68318, "review_comments_count": 0, "state": "open", "title": "fix(media): route FormData transcriptions through bundled undici realm (#68294)", "updated_at": "2026-04-17T23:03:07Z" }, { "additions": 2, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - The `/reasoning stream` directive was showing `Reasoning stream enabled (Telegram only).` in all channels - Reasoning stream works in Lark/Feishu and other channels, not just Telegram - The `(Telegram only)` qualifier was misl\u2026", "changed_files": 2, "cluster_id": "cluster-68311-2", "cluster_ids": [ "cluster-68311-2" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68317", "created_at": "2026-04-17T22:56:35Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68317/files", "html_url": "https://github.com/openclaw/openclaw/pull/68317", "labels": [ "docs", "size: XS" ], "merged": false, "number": 68317, "review_comments_count": 0, "state": "open", "title": "fix(directive): remove incorrect 'Telegram only' label from reasoning stream ack", "updated_at": "2026-04-18T01:39:56Z" }, { "additions": 46, "author": "evgyur", "author_association": "NONE", "body_excerpt": "## Summary - preserve unsent media final payloads after successful block streaming - keep duplicate suppression for already-sent block payloads via `blockReplyPipeline.hasSentPayload(payload)` - keep successful streamed text-only final pay\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68316", "created_at": "2026-04-17T22:56:05Z", "deletions": 15, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68316/files", "html_url": "https://github.com/openclaw/openclaw/pull/68316", "labels": [ "size: S" ], "merged": false, "number": 68316, "review_comments_count": 3, "state": "open", "title": "Preserve unsent media payloads after block streaming", "updated_at": "2026-04-17T23:34:22Z" }, { "additions": 36, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - `detectWorkflowFile` was silently swallowing all errors from `resolveWorkflowFile` - A path like `lobster/haiku-ppc64-hidden-alias-autofix-once.lobster` that doesn't exist on disk was returned as `null`, causing the caller to\u2026", "changed_files": 2, "cluster_id": "cluster-68101-4", "cluster_ids": [ "cluster-68101-4" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68313", "created_at": "2026-04-17T22:50:57Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68313/files", "html_url": "https://github.com/openclaw/openclaw/pull/68313", "labels": [ "extensions: lobster", "size: XS" ], "merged": false, "number": 68313, "review_comments_count": 4, "state": "open", "title": "fix(lobster): surface file-not-found error for workflow-like pipeline paths", "updated_at": "2026-04-18T01:39:27Z" }, { "additions": 35, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - `deleteSession` during dreaming narrative cleanup fails with `missing scope: operator.admin` when the cron session lacks admin permissions - This is expected best-effort behavior, but the `warn` log fires on every dreaming cyc\u2026", "changed_files": 2, "cluster_id": "cluster-65653-13", "cluster_ids": [ "cluster-65653-13" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68312", "created_at": "2026-04-17T22:48:00Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68312/files", "html_url": "https://github.com/openclaw/openclaw/pull/68312", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 68312, "review_comments_count": 0, "state": "open", "title": "fix(memory-core): downgrade narrative cleanup WARN to debug for missing-scope errors", "updated_at": "2026-04-17T22:49:20Z" }, { "additions": 1, "author": "nightq", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Updates the confirmation message shown when enabling reasoning stream mode to correctly indicate that the feature works in both Telegram and Feishu (Lark) channels. ## Root Cause The reasoning stream feature was implemented for\u2026", "changed_files": 1, "cluster_id": "cluster-68311-2", "cluster_ids": [ "cluster-68311-2" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68311", "created_at": "2026-04-17T22:47:46Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68311/files", "html_url": "https://github.com/openclaw/openclaw/pull/68311", "labels": [ "size: XS" ], "merged": false, "number": 68311, "review_comments_count": 1, "state": "open", "title": "fix: update reasoning stream message to include Feishu support", "updated_at": "2026-04-17T22:50:28Z" }, { "additions": 288, "author": "Chased1k", "author_association": "NONE", "body_excerpt": "## Summary - Adds a narrow, model-agnostic resubmission in the embedded runner attempt loop for turns that end with `stopReason=\"error\"` + `usage.output=0` + empty `content[]`. Bounded at 3 retries. Placed before the `incompleteTurnText` s\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68310", "created_at": "2026-04-17T22:47:43Z", "deletions": 32, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68310/files", "html_url": "https://github.com/openclaw/openclaw/pull/68310", "labels": [ "channel: msteams", "agents", "size: M", "channel: qqbot" ], "merged": true, "number": 68310, "review_comments_count": 1, "state": "closed", "title": "fix(pi-embedded-runner): retry silent stopReason=error turns (non-frontier models)", "updated_at": "2026-04-20T23:44:10Z" }, { "additions": 11, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - `resolveBrowserSsrFPolicy` was returning `{}` (empty object) when `browser.ssrfPolicy` was not configured - The CDP fetch helper uses `ssrfPolicy ?? { allowPrivateNetwork: true }` \u2014 so `{}` (truthy) bypassed the default, block\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68308", "created_at": "2026-04-17T22:44:17Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68308/files", "html_url": "https://github.com/openclaw/openclaw/pull/68308", "labels": [ "size: XS" ], "merged": false, "number": 68308, "review_comments_count": 1, "state": "open", "title": "fix(browser): return undefined ssrfPolicy when browser.ssrfPolicy is unset", "updated_at": "2026-04-18T19:01:59Z" }, { "additions": 9, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - `resolveCommandsSystemPromptBundle` was calling `resolveBootstrapContextForRun` without a `warn` callback - Bootstrap file truncation warnings were silently discarded in the commands / system-prompt path - Wires up `makeBootst\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68307", "created_at": "2026-04-17T22:38:04Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68307/files", "html_url": "https://github.com/openclaw/openclaw/pull/68307", "labels": [ "size: XS" ], "merged": false, "number": 68307, "review_comments_count": 0, "state": "open", "title": "fix(commands): emit WARN when bootstrap files are truncated", "updated_at": "2026-04-17T22:39:11Z" }, { "additions": 63, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - `normalizeTelegramReplyToMessageId` now rejects `0` and negative values in addition to non-numeric inputs - Telegram message IDs are always positive integers; passing `0` or a negative value would result in a `400 Bad Request`\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68306", "created_at": "2026-04-17T22:36:09Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68306/files", "html_url": "https://github.com/openclaw/openclaw/pull/68306", "labels": [ "channel: telegram", "size: S" ], "merged": false, "number": 68306, "review_comments_count": 0, "state": "open", "title": "fix(telegram): reject zero and negative replyToMessageId values", "updated_at": "2026-04-17T22:37:16Z" }, { "additions": 6, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - `sendMessageSlack` guards against `NO_REPLY` sentinel tokens before calling the Slack API - `sendMessageTelegram` was missing the same guard \u2014 a `NO_REPLY` token could reach the Telegram API - This caused a visible flash of te\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68304", "created_at": "2026-04-17T22:31:20Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68304/files", "html_url": "https://github.com/openclaw/openclaw/pull/68304", "labels": [ "channel: telegram", "size: XS" ], "merged": false, "number": 68304, "review_comments_count": 0, "state": "open", "title": "fix(telegram): suppress NO_REPLY sentinel before sendMessageTelegram API call", "updated_at": "2026-04-17T22:32:45Z" }, { "additions": 34, "author": "Nimraakram22", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68302", "created_at": "2026-04-17T22:28:08Z", "deletions": 12, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68302/files", "html_url": "https://github.com/openclaw/openclaw/pull/68302", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68302, "review_comments_count": 5, "state": "closed", "title": "Fix/systemd restart exit null", "updated_at": "2026-04-19T11:38:55Z" }, { "additions": 46, "author": "dlebee-agent", "author_association": "NONE", "body_excerpt": "Fixes #68297 Related: #68240 ## What Mirrors the `--daemon-env` flag added to `openclaw onboard --install-daemon` in #68240, now for `openclaw node install`. ```bash openclaw node install --host --port 18789 \\ --daemon-env OPENCLAW_AL\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68301", "created_at": "2026-04-17T22:27:14Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68301/files", "html_url": "https://github.com/openclaw/openclaw/pull/68301", "labels": [ "cli", "commands", "size: XS" ], "merged": false, "number": 68301, "review_comments_count": 6, "state": "open", "title": "feat(node): add --daemon-env flag to openclaw node install", "updated_at": "2026-04-17T22:38:50Z" }, { "additions": 5, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - Hook handler errors were logged with only the error message, no stack trace - Errors like `f.toLowerCase is not a function` in `agent:bootstrap` hooks could not be traced to their source without source maps - Now logs the full\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68300", "created_at": "2026-04-17T22:26:33Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68300/files", "html_url": "https://github.com/openclaw/openclaw/pull/68300", "labels": [ "size: XS" ], "merged": false, "number": 68300, "review_comments_count": 0, "state": "open", "title": "fix(hooks): include stack trace and event context in internal hook error logs", "updated_at": "2026-04-17T22:28:01Z" }, { "additions": 106, "author": "bluesky6868", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Discord startup swallows `fetchUser(\"@me\")` failures and leaves `botUserId` unset, which lets guild preflight skip the no-mention drop in degraded startup. - Why it matters: A failed bot identity fetch turns `requireM\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68298", "created_at": "2026-04-17T22:26:25Z", "deletions": 4, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68298/files", "html_url": "https://github.com/openclaw/openclaw/pull/68298", "labels": [ "channel: discord", "size: S" ], "merged": false, "number": 68298, "review_comments_count": 2, "state": "open", "title": "fix(discord): fail closed when bot identity is unavailable", "updated_at": "2026-04-18T04:31:00Z" }, { "additions": 38, "author": "1aifanatic", "author_association": "NONE", "body_excerpt": "## Summary - The `read` tool diagnostic guard in `handleToolExecutionStart` only checked `path` and `file_path` when deciding whether to emit a \"read tool called without path\" warning - Models like Claude commonly use `file` and `filePath`\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68296", "created_at": "2026-04-17T22:25:17Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68296/files", "html_url": "https://github.com/openclaw/openclaw/pull/68296", "labels": [ "agents", "size: XS" ], "merged": false, "number": 68296, "review_comments_count": 1, "state": "open", "title": "fix(agents): add file and filePath aliases to read tool diagnostic path check", "updated_at": "2026-04-18T01:40:28Z" }, { "additions": 167, "author": "dlebee-agent", "author_association": "NONE", "body_excerpt": "Fixes #68287 ## Problem `openclaw node install` fails on node-only VMs with: ``` Node install failed: Error: systemctl enable failed: Failed to enable unit: Unit file openclaw-gateway.service does not exist. ``` ## Root cause `activateSyst\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68293", "created_at": "2026-04-17T22:11:00Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68293/files", "html_url": "https://github.com/openclaw/openclaw/pull/68293", "labels": [ "gateway", "size: S" ], "merged": false, "number": 68293, "review_comments_count": 0, "state": "open", "title": "fix(systemd): use resolveSystemdServiceName in activate/uninstall", "updated_at": "2026-04-17T22:18:48Z" }, { "additions": 9, "author": "thesomewhatyou", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Security and reliability audit followup addressing 5 bugs across the gateway, cron, and failover subsystems. Two are security-critical, one is a trust boundary gap, and two are correctness/perf fixes for error classification and\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 3, "conversation_url": "https://github.com/openclaw/openclaw/pull/68292", "created_at": "2026-04-17T22:08:17Z", "deletions": 9, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68292/files", "html_url": "https://github.com/openclaw/openclaw/pull/68292", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68292, "review_comments_count": 15, "state": "closed", "title": "fix: security hardening \u2014 MCP ownership spoofing, poll double-delivery, cron trust escalation, failover classification gaps", "updated_at": "2026-04-18T00:09:47Z" }, { "additions": 8, "author": "YASSINENFAI", "author_association": "NONE", "body_excerpt": "Fixes #68249 ## Problem - Brave plugin enabled in config (\\plugins.entries.brave.enabled: true\\) - But didn't load when \\plugins.enabled\\ was false/undefined - \\web_search\\ tool was unavailable ## Root Cause \\ esolvePluginActivationState\\\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68290", "created_at": "2026-04-17T22:00:34Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68290/files", "html_url": "https://github.com/openclaw/openclaw/pull/68290", "labels": [ "size: XS" ], "merged": false, "number": 68290, "review_comments_count": 3, "state": "open", "title": "fix(plugins): allow explicitly enabled plugins to load when plugins.enabled is false", "updated_at": "2026-04-17T23:52:14Z" }, { "additions": 546, "author": "Takhoffman", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - add a dedicated `openclaw workspace reset` command for safely trashing and reseeding a workspace - register the command in the core CLI and wire it through the existing onboard reset helpers - add focused command, helper, and\u2026", "changed_files": 10, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68289", "created_at": "2026-04-17T21:59:25Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68289/files", "html_url": "https://github.com/openclaw/openclaw/pull/68289", "labels": [ "cli", "commands", "maintainer", "size: L" ], "merged": false, "number": 68289, "review_comments_count": 3, "state": "open", "title": "feat(workspace): add safe workspace reset command", "updated_at": "2026-04-17T22:03:58Z" }, { "additions": 49, "author": "dlebee-agent", "author_association": "NONE", "body_excerpt": "Fixes #68287 ## Problem `openclaw node install` fails on node-only VMs with: ``` Node install failed: Error: systemctl enable failed: Failed to enable unit: Unit file openclaw-gateway.service does not exist. ``` ## Root cause `activateSyst\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68288", "created_at": "2026-04-17T21:55:40Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68288/files", "html_url": "https://github.com/openclaw/openclaw/pull/68288", "labels": [ "gateway", "cli", "commands", "size: S" ], "merged": false, "number": 68288, "review_comments_count": 1, "state": "closed", "title": "fix(systemd): use resolveSystemdServiceName in activate/uninstall", "updated_at": "2026-04-17T22:13:21Z" }, { "additions": 14, "author": "ajfonthemove", "author_association": "NONE", "body_excerpt": "## Summary - Problem: mergeHybridResults computes vectorScore and textScore per result but drops them when building the return object. Only the weighted combined score survives. - Why it matters: operators running multi-agent setups need t\u2026", "changed_files": 4, "cluster_id": "cluster-68166-3", "cluster_ids": [ "cluster-68166-3" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68286", "created_at": "2026-04-17T21:44:50Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68286/files", "html_url": "https://github.com/openclaw/openclaw/pull/68286", "labels": [ "extensions: memory-core", "size: XS" ], "merged": false, "number": 68286, "review_comments_count": 0, "state": "open", "title": "feat(memory-core): expose vectorScore and textScore in hybrid search results", "updated_at": "2026-04-17T23:31:05Z" }, { "additions": 3023, "author": "vincentkoc", "author_association": "MEMBER", "body_excerpt": "## Summary - problem: Codex auth ownership was still split between OpenClaw canonical auth, runtime `.codex` bootstrap/overlay paths, and Codex ambient host auth in `codex exec` / app-server harness flows. - why it matters: OAuth state cou\u2026", "changed_files": 58, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68284", "created_at": "2026-04-17T21:39:54Z", "deletions": 993, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68284/files", "html_url": "https://github.com/openclaw/openclaw/pull/68284", "labels": [ "docs", "gateway", "agents", "maintainer", "size: XL", "extensions: openai", "extensions: codex" ], "merged": true, "number": 68284, "review_comments_count": 16, "state": "closed", "title": "refactor(auth): centralize codex oauth ownership in OpenClaw", "updated_at": "2026-04-18T20:34:13Z" }, { "additions": 185, "author": "TheDillonHall", "author_association": "NONE", "body_excerpt": "## Summary Fixes a native approval handler bootstrap retry storm observed in production when the handler could not connect to the gateway because the local device lacked `operator.approvals`. The previous behavior retried every 1000ms for\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68283", "created_at": "2026-04-17T21:36:47Z", "deletions": 15, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68283/files", "html_url": "https://github.com/openclaw/openclaw/pull/68283", "labels": [ "size: M" ], "merged": false, "number": 68283, "review_comments_count": 0, "state": "open", "title": "fix(approvals): back off native handler bootstrap retries", "updated_at": "2026-04-17T21:39:35Z" }, { "additions": 182, "author": "amittell", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary - fail fast for local loopback probe/status auth resolution when gateway auth is required but unresolved - return a local probe failure instead of attempting an anonymous loopback websocket connect - add focused regression cover\u2026", "changed_files": 9, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68280", "created_at": "2026-04-17T21:11:15Z", "deletions": 50, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68280/files", "html_url": "https://github.com/openclaw/openclaw/pull/68280", "labels": [ "gateway", "cli", "commands", "size: M" ], "merged": false, "number": 68280, "review_comments_count": 2, "state": "open", "title": "fix(gateway): fail fast on missing local probe auth", "updated_at": "2026-04-17T21:19:04Z" }, { "additions": 28, "author": "zoneblaze", "author_association": "NONE", "body_excerpt": "## Summary - prevents explicit non-default Discord `accountId` sends from silently inheriting the default/top-level token - returns `source: none` when the explicit account has no token instead of falling back to default identity - adds re\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68278", "created_at": "2026-04-17T21:00:22Z", "deletions": 5, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68278/files", "html_url": "https://github.com/openclaw/openclaw/pull/68278", "labels": [ "channel: discord", "size: XS" ], "merged": false, "number": 68278, "review_comments_count": 2, "state": "open", "title": "fix(discord): honor explicit accountId token resolution in cron deliveries", "updated_at": "2026-04-18T07:53:22Z" }, { "additions": 92, "author": "Dithilli", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Adds a troubleshooting section for users hitting the silent-fallback bug cluster (#59257, #58575, #49168) where an isolated cron job with `payload.model: \"ollama/...\"` completes with `lastStatus: \"ok\"` but the actual inference r\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68277", "created_at": "2026-04-17T20:56:21Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68277/files", "html_url": "https://github.com/openclaw/openclaw/pull/68277", "labels": [ "docs", "gateway", "size: XS" ], "merged": false, "number": 68277, "review_comments_count": 2, "state": "open", "title": "docs(troubleshooting): document isolated-cron payload.model silent-fallback workaround", "updated_at": "2026-04-17T20:59:16Z" }, { "additions": 9, "author": "zoneblaze", "author_association": "NONE", "body_excerpt": "## Summary - filters Android chat history entries that are cron delivery completion markers (\"A cron job ... just completed successfully\") so they do not render as user messages - strips top-level `...` wrapping from text me\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68276", "created_at": "2026-04-17T20:55:47Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68276/files", "html_url": "https://github.com/openclaw/openclaw/pull/68276", "labels": [ "app: android", "size: XS" ], "merged": false, "number": 68276, "review_comments_count": 4, "state": "open", "title": "feat(android/chat): filter cron-delivery noise and strip wrapper", "updated_at": "2026-04-18T17:57:29Z" }, { "additions": 14, "author": "drobison00", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 6, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68274", "created_at": "2026-04-17T20:42:36Z", "deletions": 11, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68274/files", "html_url": "https://github.com/openclaw/openclaw/pull/68274", "labels": [ "app: macos", "maintainer", "size: XS" ], "merged": false, "number": 68274, "review_comments_count": 1, "state": "closed", "title": "Fix macos ssh host checking", "updated_at": "2026-04-17T20:53:15Z" }, { "additions": 44, "author": "hclsys", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Fixes #68260 \u2014 the bundled Ollama plugin's \\`configSchema\\` was locked to \\`discovery.enabled\\` only (via \\`additionalProperties: false\\`), but the runtime code at \\`extensions/ollama/provider-discovery.ts:70,149\\` and \\`extensi\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68270", "created_at": "2026-04-17T20:22:19Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68270/files", "html_url": "https://github.com/openclaw/openclaw/pull/68270", "labels": [ "size: XS" ], "merged": false, "number": 68270, "review_comments_count": 2, "state": "closed", "title": "fix(ollama): allow baseUrl in plugin configSchema to match what the provider code already reads", "updated_at": "2026-04-18T18:45:27Z" }, { "additions": 51, "author": "Lucenx9", "author_association": "CONTRIBUTOR", "body_excerpt": "Fixes #56982 ## Summary - stop `openclaw doctor` from warning that gateway auth is off or missing a token when `gateway.auth.mode` is `\"trusted-proxy\"` - keep the warning only for `gateway.auth.mode=\"none\"` and `gateway.auth.mode=\"token\"`\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68269", "created_at": "2026-04-17T20:16:27Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68269/files", "html_url": "https://github.com/openclaw/openclaw/pull/68269", "labels": [ "commands", "size: S" ], "merged": false, "number": 68269, "review_comments_count": 0, "state": "closed", "title": "[codex] CLI/Doctor: skip gateway token warning in trusted-proxy mode", "updated_at": "2026-04-18T23:04:44Z" }, { "additions": 260, "author": "mkoslacz", "author_association": "NONE", "body_excerpt": "## Why External reconcilers that track async agent dispatches need a **read-only** way to fetch the messages belonging to a single run from a live session. The existing path is to send a probe message via `sessions.send` (e.g. `[RECONCILER\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68267", "created_at": "2026-04-17T20:05:07Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68267/files", "html_url": "https://github.com/openclaw/openclaw/pull/68267", "labels": [ "app: web-ui", "gateway", "size: M" ], "merged": false, "number": 68267, "review_comments_count": 7, "state": "open", "title": "feat(gateway): add optional runId filter to chat.history [AI-assisted]", "updated_at": "2026-04-20T21:03:29Z" }, { "additions": 64, "author": "lemonheaded", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Telegram re-encodes videos when `width`/`height` are missing from `sendVideo`, which causes portrait (9:16) videos to display squished on the receiving end - Why it matters: Any bot sending portrait video content (AI-\u2026", "changed_files": 4, "cluster_id": "cluster-18915-2", "cluster_ids": [ "cluster-18915-2" ], "cluster_role": "canonical", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68266", "created_at": "2026-04-17T20:02:09Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68266/files", "html_url": "https://github.com/openclaw/openclaw/pull/68266", "labels": [ "channel: telegram", "size: S" ], "merged": false, "number": 68266, "review_comments_count": 3, "state": "open", "title": "fix(telegram): pass video dimensions to prevent portrait video distortion", "updated_at": "2026-04-17T20:07:41Z" }, { "additions": 1402, "author": "kevinheneveld", "author_association": "NONE", "body_excerpt": "## Summary - strip runtime/system-event lines from user-role history entries before transcript sanitization - apply that stripping in both the chat history handler and the session-history snapshot/SSE path used by Control UI refreshes - hi\u2026", "changed_files": 7, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68262", "created_at": "2026-04-17T19:50:26Z", "deletions": 41, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68262/files", "html_url": "https://github.com/openclaw/openclaw/pull/68262", "labels": [ "channel: voice-call", "app: web-ui", "gateway", "size: XL" ], "merged": false, "number": 68262, "review_comments_count": 15, "state": "open", "title": "fix: hide internal prompts from chat history", "updated_at": "2026-04-19T21:28:32Z" }, { "additions": 43, "author": "mkoslacz", "author_association": "NONE", "body_excerpt": "## Bug `buildGatewayReloadPlan()` in [`src/gateway/config-reload-plan.ts`](src/gateway/config-reload-plan.ts) treats any unmatched config path as a gateway restart trigger (existing test at L250: *\"defaults unknown paths to restart\"*). The\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68257", "created_at": "2026-04-17T19:33:09Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68257/files", "html_url": "https://github.com/openclaw/openclaw/pull/68257", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68257, "review_comments_count": 0, "state": "open", "title": "fix(gateway): stop restarting gateway on OAuth token refresh (auth.profiles.*) [AI-assisted]", "updated_at": "2026-04-19T03:31:18Z" }, { "additions": 107, "author": "holeshotclaw", "author_association": "NONE", "body_excerpt": "## Summary - skip bundled memory-core recall/repair doctor paths when another memory plugin owns the active slot - probe the active runtime memory manager for embedding readiness so doctor output matches the selected backend - fix a strict\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68255", "created_at": "2026-04-17T19:31:12Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68255/files", "html_url": "https://github.com/openclaw/openclaw/pull/68255", "labels": [ "commands", "size: S" ], "merged": false, "number": 68255, "review_comments_count": 1, "state": "closed", "title": "fix: honor the active memory plugin in doctor checks", "updated_at": "2026-04-17T19:56:32Z" }, { "additions": 69, "author": "mjamiv", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Slack Socket Mode bots were being restarted by the gateway every ~35 minutes on idle \u2014 even when the WebSocket was fully healthy, Slack's server pings were flowing, and the bot was simply waiting for the next message. The fix op\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68253", "created_at": "2026-04-17T19:29:17Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68253/files", "html_url": "https://github.com/openclaw/openclaw/pull/68253", "labels": [ "channel: slack", "size: S" ], "merged": false, "number": 68253, "review_comments_count": 0, "state": "open", "title": "fix(slack): opt out of stale-socket health-monitor (Socket Mode owns liveness)", "updated_at": "2026-04-19T13:43:19Z" }, { "additions": 2, "author": "ShayMeshGit", "author_association": "NONE", "body_excerpt": "## Summary - Problem: Links on localized documentation pages (e.g., German `/de/docs/providers/index`) were 404ing because they pointed to the domain root (e.g., `/providers/ollama`) instead of the localized documentation path (e.g., `/de/\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68250", "created_at": "2026-04-17T19:10:02Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68250/files", "html_url": "https://github.com/openclaw/openclaw/pull/68250", "labels": [ "scripts", "size: XS" ], "merged": false, "number": 68250, "review_comments_count": 3, "state": "closed", "title": "docs: use relative links in provider index to fix localization #68139", "updated_at": "2026-04-18T10:24:58Z" }, { "additions": 27, "author": "Nimraakram22", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: - **Problem:** The Xcode Copilot extension cannot connect to OpenClaw because it specifically targets the legacy `/v1/engines/copilot-codex/completions` endpoint and sends a raw `prom\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 5, "conversation_url": "https://github.com/openclaw/openclaw/pull/68247", "created_at": "2026-04-17T19:03:24Z", "deletions": 10, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68247/files", "html_url": "https://github.com/openclaw/openclaw/pull/68247", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68247, "review_comments_count": 6, "state": "closed", "title": "feat(gateway): Add Xcode Copilot Extension Support", "updated_at": "2026-04-17T21:48:05Z" }, { "additions": 1, "author": "linuxhgw", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68244", "created_at": "2026-04-17T18:30:52Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68244/files", "html_url": "https://github.com/openclaw/openclaw/pull/68244", "labels": [ "size: XS" ], "merged": false, "number": 68244, "review_comments_count": 1, "state": "open", "title": "Add new file 'r' with initial content", "updated_at": "2026-04-17T18:31:43Z" }, { "additions": 63, "author": "Tuarisa", "author_association": "NONE", "body_excerpt": "## Problem The `image` tool (media-understanding) fails with: ``` No API provider registered for api: ollama ``` \u2026whenever the selected vision model is backed by a provider whose API is contributed through an OpenClaw plugin (e.g. `ollama/\u2026", "changed_files": 2, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68243", "created_at": "2026-04-17T18:27:59Z", "deletions": 0, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68243/files", "html_url": "https://github.com/openclaw/openclaw/pull/68243", "labels": [ "size: S" ], "merged": false, "number": 68243, "review_comments_count": 0, "state": "open", "title": "fix(media-understanding): register custom API stream handler before image completion", "updated_at": "2026-04-21T15:50:53Z" }, { "additions": 221, "author": "sahilsatralkar", "author_association": "CONTRIBUTOR", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 4, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68242", "created_at": "2026-04-17T18:27:24Z", "deletions": 2, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68242/files", "html_url": "https://github.com/openclaw/openclaw/pull/68242", "labels": [ "channel: whatsapp-web", "size: M" ], "merged": false, "number": 68242, "review_comments_count": 2, "state": "open", "title": "Fix: issue 67394 whatsapp autoreply delivery logging", "updated_at": "2026-04-17T18:38:46Z" }, { "additions": 47, "author": "dlebee-agent", "author_association": "NONE", "body_excerpt": "Fixes #67565 ## What Adds a repeatable `--daemon-env KEY=VALUE` option to `openclaw onboard --install-daemon` so that extra `Environment=` lines can be injected directly into the generated systemd unit at bootstrap time \u2014 no post-onboard r\u2026", "changed_files": 5, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68240", "created_at": "2026-04-17T18:21:49Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68240/files", "html_url": "https://github.com/openclaw/openclaw/pull/68240", "labels": [ "cli", "commands", "size: S" ], "merged": false, "number": 68240, "review_comments_count": 6, "state": "open", "title": "feat(onboard): add --daemon-env flag to openclaw onboard --install-daemon", "updated_at": "2026-04-17T19:05:25Z" }, { "additions": 80, "author": "altaywtf", "author_association": "MEMBER", "body_excerpt": "## Summary - classify `got status: INTERNAL` responses as timeout-style failover errors - match JSON payloads that include `status: INTERNAL` and `code: 500` - narrow the follow-up maintainer fix so plain `status: Internal Server Error` pr\u2026", "changed_files": 3, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 2, "conversation_url": "https://github.com/openclaw/openclaw/pull/68238", "created_at": "2026-04-17T18:16:08Z", "deletions": 1, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68238/files", "html_url": "https://github.com/openclaw/openclaw/pull/68238", "labels": [ "agents", "maintainer", "size: S" ], "merged": true, "number": 68238, "review_comments_count": 6, "state": "closed", "title": "fix(failover): classify INTERNAL 500 responses as retryable timeouts", "updated_at": "2026-04-17T20:24:58Z" }, { "additions": 541, "author": "ngutman", "author_association": "MEMBER", "body_excerpt": "## Summary - add an OAuth auth-regressions e2e suite covering CLI and gateway auth-status surfaces - add targeted regression tests for stale auth order, shared refresh coordination, unhealthy status persistence, and recovery - document the\u2026", "changed_files": 1, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 0, "conversation_url": "https://github.com/openclaw/openclaw/pull/68236", "created_at": "2026-04-17T18:04:05Z", "deletions": 0, "draft": true, "files_url": "https://github.com/openclaw/openclaw/pull/68236/files", "html_url": "https://github.com/openclaw/openclaw/pull/68236", "labels": [ "gateway", "maintainer", "size: L" ], "merged": false, "number": 68236, "review_comments_count": 0, "state": "open", "title": "test(auth): add oauth e2e regression coverage", "updated_at": "2026-04-17T18:06:09Z" }, { "additions": 44, "author": "rvajustin", "author_association": "NONE", "body_excerpt": "## Summary Describe the problem and fix in 2\u20135 bullets: If this PR fixes a plugin beta-release blocker, title it `fix(): beta blocker - ` and link the matching `Beta blocker: - ` issue labeled `be\u2026", "changed_files": 2, "cluster_id": "cluster-36488-17", "cluster_ids": [ "cluster-36488-17" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68235", "created_at": "2026-04-17T17:57:49Z", "deletions": 3, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68235/files", "html_url": "https://github.com/openclaw/openclaw/pull/68235", "labels": [ "gateway", "size: XS" ], "merged": false, "number": 68235, "review_comments_count": 2, "state": "open", "title": "fix: issue 53120", "updated_at": "2026-04-17T18:01:24Z" }, { "additions": 1376, "author": "omarshahine", "author_association": "CONTRIBUTOR", "body_excerpt": "Ready for review. Smoke-tested live on Lobster on `3ef012f20c`. ## Summary All outbound BlueBubbles HTTP calls now route through a single typed `BlueBubblesClient` that resolves SSRF policy and auth material once at construction. Previousl\u2026", "changed_files": 15, "cluster_id": null, "cluster_ids": [], "cluster_role": null, "comments_count": 4, "conversation_url": "https://github.com/openclaw/openclaw/pull/68234", "created_at": "2026-04-17T17:54:01Z", "deletions": 314, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68234/files", "html_url": "https://github.com/openclaw/openclaw/pull/68234", "labels": [ "channel: bluebubbles", "maintainer", "size: XL" ], "merged": true, "number": 68234, "review_comments_count": 13, "state": "closed", "title": "bluebubbles: consolidate HTTP traffic through typed BlueBubblesClient", "updated_at": "2026-04-19T15:51:26Z" }, { "additions": 93, "author": "taosiyuan163", "author_association": "NONE", "body_excerpt": "Fixes #68160 ## Summary - require `hello-ok.auth` in `HelloOkSchema` so the protocol schema matches the gateway handshake payload shipped in `#67810` - add a focused regression test and update protocol docs/examples so the required `auth`\u2026", "changed_files": 8, "cluster_id": "cluster-68160-3", "cluster_ids": [ "cluster-68160-3" ], "cluster_role": "member", "comments_count": 1, "conversation_url": "https://github.com/openclaw/openclaw/pull/68227", "created_at": "2026-04-17T17:44:59Z", "deletions": 32, "draft": false, "files_url": "https://github.com/openclaw/openclaw/pull/68227/files", "html_url": "https://github.com/openclaw/openclaw/pull/68227", "labels": [ "docs", "app: macos", "app: web-ui", "gateway", "size: S" ], "merged": false, "number": 68227, "review_comments_count": 0, "state": "open", "title": "fix(protocol): require hello-ok auth", "updated_at": "2026-04-18T01:31:32Z" }, { "additions": 46, "author": "ymaxgit", "author_association": "NONE", "body_excerpt": "## Summary - **Problem**: `sanitizeMimeType` in `src/media-understanding/apply.ts` used an unanchored regex (`/^(type/subtype)/`). A string like `text/plain