{"type":"system","subtype":"init","cwd":"./bench/results/mcp-with-toolsearch/weekly_catchup/run4/workspace","session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","tools":["Task","TaskOutput","Bash","Glob","Grep","ExitPlanMode","Read","Edit","Write","NotebookEdit","WebFetch","TodoWrite","WebSearch","TaskStop","AskUserQuestion","Skill","EnterPlanMode","EnterWorktree","ExitWorktree","CronCreate","CronDelete","CronList","ToolSearch","mcp__chrome-devtools__click","mcp__chrome-devtools__close_page","mcp__chrome-devtools__drag","mcp__chrome-devtools__emulate","mcp__chrome-devtools__evaluate_script","mcp__chrome-devtools__fill","mcp__chrome-devtools__fill_form","mcp__chrome-devtools__get_console_message","mcp__chrome-devtools__get_network_request","mcp__chrome-devtools__handle_dialog","mcp__chrome-devtools__hover","mcp__chrome-devtools__lighthouse_audit","mcp__chrome-devtools__list_console_messages","mcp__chrome-devtools__list_network_requests","mcp__chrome-devtools__list_pages","mcp__chrome-devtools__navigate_page","mcp__chrome-devtools__new_page","mcp__chrome-devtools__performance_analyze_insight","mcp__chrome-devtools__performance_start_trace","mcp__chrome-devtools__performance_stop_trace","mcp__chrome-devtools__press_key","mcp__chrome-devtools__resize_page","mcp__chrome-devtools__select_page","mcp__chrome-devtools__take_memory_snapshot","mcp__chrome-devtools__take_screenshot","mcp__chrome-devtools__take_snapshot","mcp__chrome-devtools__type_text","mcp__chrome-devtools__upload_file","mcp__chrome-devtools__wait_for","mcp__github__add_comment_to_pending_review","mcp__github__add_issue_comment","mcp__github__add_reply_to_pull_request_comment","mcp__github__assign_copilot_to_issue","mcp__github__create_branch","mcp__github__create_or_update_file","mcp__github__create_pull_request","mcp__github__create_pull_request_with_copilot","mcp__github__create_repository","mcp__github__delete_file","mcp__github__fork_repository","mcp__github__get_commit","mcp__github__get_copilot_job_status","mcp__github__get_file_contents","mcp__github__get_label","mcp__github__get_latest_release","mcp__github__get_me","mcp__github__get_release_by_tag","mcp__github__get_tag","mcp__github__get_team_members","mcp__github__get_teams","mcp__github__issue_read","mcp__github__issue_write","mcp__github__list_branches","mcp__github__list_commits","mcp__github__list_issue_types","mcp__github__list_issues","mcp__github__list_pull_requests","mcp__github__list_releases","mcp__github__list_tags","mcp__github__merge_pull_request","mcp__github__pull_request_read","mcp__github__pull_request_review_write","mcp__github__push_files","mcp__github__request_copilot_review","mcp__github__run_secret_scanning","mcp__github__search_code","mcp__github__search_issues","mcp__github__search_pull_requests","mcp__github__search_repositories","mcp__github__search_users","mcp__github__sub_issue_write","mcp__github__update_pull_request","mcp__github__update_pull_request_branch","ListMcpResourcesTool","ReadMcpResourceTool","LSP"],"mcp_servers":[{"name":"chrome-devtools","status":"connected"},{"name":"github","status":"connected"},{"name":"claude.ai Google Calendar","status":"needs-auth"},{"name":"claude.ai Gmail","status":"needs-auth"}],"model":"claude-sonnet-4-6","permissionMode":"bypassPermissions","slash_commands":["update-config","debug","simplify","batch","loop","claude-api","test-driven-development","app-installer","release-notify-issues","cli-demo-recorder","readme-generator","compact","context","cost","heapdump","init","pr-comments","release-notes","review","security-review","extra-usage","insights","mcp__github__AssignCodingAgent","mcp__github__issue_to_fix_workflow"],"apiKeySource":"none","claude_code_version":"2.1.77","output_style":"default","agents":["general-purpose","statusline-setup","Explore","Plan","claude-code-guide"],"skills":["update-config","debug","simplify","batch","loop","claude-api","test-driven-development","app-installer","release-notify-issues","cli-demo-recorder","readme-generator"],"plugins":[{"name":"rust-analyzer-lsp","path":"~/.claude/plugins/rust-analyzer-lsp/1.0.0"}],"uuid":"2bab4e47-12d2-49e2-990a-a6e369deb0f3","fast_mode_state":"off"}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01LyEkia4WyFBCyUr4kfxGmK","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"The user wants to catch up on the openclaw/openclaw repository. I need to:\n1. Get the count of open issues\n2. Get the 5 most recently merged PRs (title and author)\n3. Get the latest release tag\n\nI'll use the GitHub MCP tools for this. Let me fetch all three in parallel.","signature":" "}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":7836,"cache_read_input_tokens":8598,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7836},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"410682db-fe03-4255-b934-ad2132ee45fa"}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01LyEkia4WyFBCyUr4kfxGmK","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_015GXs8JvuayQTM1zPP5nPTZ","name":"ToolSearch","input":{"query":"select:mcp__github__list_issues,mcp__github__list_pull_requests,mcp__github__get_latest_release","max_results":3},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":7836,"cache_read_input_tokens":8598,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":7836},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"085aa634-434b-48d5-8270-0b25c718bfdc"}
{"type":"user","message":{"role":"user","content":[{"type":"tool_result","tool_use_id":"toolu_015GXs8JvuayQTM1zPP5nPTZ","content":[{"type":"tool_reference","tool_name":"mcp__github__list_issues"},{"type":"tool_reference","tool_name":"mcp__github__list_pull_requests"},{"type":"tool_reference","tool_name":"mcp__github__get_latest_release"}]}]},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"f57ff64f-7028-40db-9922-02366f244a43","timestamp":"2026-03-21T19:26:21.556Z","tool_use_result":{"matches":["mcp__github__list_issues","mcp__github__list_pull_requests","mcp__github__get_latest_release"],"query":"select:mcp__github__list_issues,mcp__github__list_pull_requests,mcp__github__get_latest_release","total_deferred_tools":90}}
{"type":"rate_limit_event","rate_limit_info":{"status":"allowed","resetsAt":1774126800,"rateLimitType":"five_hour","overageStatus":"rejected","overageDisabledReason":"org_level_disabled","isUsingOverage":false},"uuid":"154c3727-94b2-4a3d-9077-dc894791273e","session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a"}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_0123qHTNt3Q6j9Jej7XCTCRG","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Now let me make all three calls in parallel.","signature":"EtQBCkYICxgCKkDxgPNbBa/0tReye9ylCri6VBgaOhk5yJyD2wtzPLN4Stqj+4SvbesSnXP0+reb5Fz/PPHVyf7qiJSwmSbIbB+8EgzULzPLKp18Ks048vkaDNeGZQdWzg7JYouEdiIw4tXfwM11lhQeMsVNkD2TBCwqkxVAr1/8QDsEgSyBlLQCkIY5AUSkg285+sJxmMJFKjxQa7b/qQQkPJg8CCfcNlUbwTykwlpSc8nPCnkR86zd2/C18JDyVTbRvDOpsCncJs7ivO3/yK5mUbpVHxYYAQ=="}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":1010,"cache_read_input_tokens":16434,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1010},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"f859f1fa-0a7e-4ad9-98ac-7e8ac3cfe78a"}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_0123qHTNt3Q6j9Jej7XCTCRG","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_0156Uq8QE6nfnTAiX2MF5vhT","name":"mcp__github__list_issues","input":{"owner":"openclaw","repo":"openclaw","state":"OPEN","perPage":1},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":1010,"cache_read_input_tokens":16434,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1010},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"196fb999-82bd-4a55-9193-2c13da1f68f8"}
{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_0156Uq8QE6nfnTAiX2MF5vhT","type":"tool_result","content":[{"type":"text","text":"{\"issues\":[{\"number\":51837,\"title\":\"Windows: exec spawns steal focus from active window\",\"body\":\"## Description\\n\\nOn native Windows (not WSL), commands spawned via the `exec` tool open visible command windows that steal focus from whatever the user is actively working on. This is disruptive during normal use — typing gets interrupted, windows flash, etc.\\n\\n## Current behavior\\n\\n- `exec` tool spawns processes that create visible console windows on Windows\\n- These windows steal focus from the active application\\n- Particularly disruptive during heartbeat checks when the user is working\\n\\n## Expected behavior\\n\\nAll exec spawns should use `windowsHide: true` (or equivalent) by default on Windows, so command windows never appear or steal focus.\\n\\n## Notes\\n\\n- ACP agent spawns and daemon processes already use `windowsHide: true` — this is just missing for regular `exec` calls\\n- Platform: Windows 11 (MINGW64_NT-10.0-26200), native install (not WSL)\\n- OpenClaw version: v2026.3.13\\n\\n## Environment\\n\\n- OS: Windows 11 (build 26200)\\n- Node: v24.14.0\\n- Shell: PowerShell\",\"state\":\"OPEN\",\"user\":{\"login\":\"junkyard-rules\"},\"created_at\":\"2026-03-21T19:22:35Z\",\"updated_at\":\"2026-03-21T19:22:35Z\"}],\"totalCount\":8780,\"pageInfo\":{\"hasNextPage\":true,\"hasPreviousPage\":false,\"startCursor\":\"Y3Vyc29yOnYyOpK5MjAyNi0wMy0yMVQxMjoyMjozNS0wNzowMM71L2nY\",\"endCursor\":\"Y3Vyc29yOnYyOpK5MjAyNi0wMy0yMVQxMjoyMjozNS0wNzowMM71L2nY\"}}"}]}]},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"c145d655-1fff-493d-9604-4456e0319aad","timestamp":"2026-03-21T19:26:24.680Z","tool_use_result":[{"type":"text","text":"{\"issues\":[{\"number\":51837,\"title\":\"Windows: exec spawns steal focus from active window\",\"body\":\"## Description\\n\\nOn native Windows (not WSL), commands spawned via the `exec` tool open visible command windows that steal focus from whatever the user is actively working on. This is disruptive during normal use — typing gets interrupted, windows flash, etc.\\n\\n## Current behavior\\n\\n- `exec` tool spawns processes that create visible console windows on Windows\\n- These windows steal focus from the active application\\n- Particularly disruptive during heartbeat checks when the user is working\\n\\n## Expected behavior\\n\\nAll exec spawns should use `windowsHide: true` (or equivalent) by default on Windows, so command windows never appear or steal focus.\\n\\n## Notes\\n\\n- ACP agent spawns and daemon processes already use `windowsHide: true` — this is just missing for regular `exec` calls\\n- Platform: Windows 11 (MINGW64_NT-10.0-26200), native install (not WSL)\\n- OpenClaw version: v2026.3.13\\n\\n## Environment\\n\\n- OS: Windows 11 (build 26200)\\n- Node: v24.14.0\\n- Shell: PowerShell\",\"state\":\"OPEN\",\"user\":{\"login\":\"junkyard-rules\"},\"created_at\":\"2026-03-21T19:22:35Z\",\"updated_at\":\"2026-03-21T19:22:35Z\"}],\"totalCount\":8780,\"pageInfo\":{\"hasNextPage\":true,\"hasPreviousPage\":false,\"startCursor\":\"Y3Vyc29yOnYyOpK5MjAyNi0wMy0yMVQxMjoyMjozNS0wNzowMM71L2nY\",\"endCursor\":\"Y3Vyc29yOnYyOpK5MjAyNi0wMy0yMVQxMjoyMjozNS0wNzowMM71L2nY\"}}"}]}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_0123qHTNt3Q6j9Jej7XCTCRG","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_016QqniHy941RZoA82c9csDL","name":"mcp__github__list_pull_requests","input":{"owner":"openclaw","repo":"openclaw","state":"closed","sort":"updated","direction":"desc","perPage":10},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":1010,"cache_read_input_tokens":16434,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1010},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"eb21e460-41b6-446c-8494-a7a3195e95ff"}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_0123qHTNt3Q6j9Jej7XCTCRG","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_016u4fBwrGh1rqApLgCSKBcK","name":"mcp__github__get_latest_release","input":{"owner":"openclaw","repo":"openclaw"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":1010,"cache_read_input_tokens":16434,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1010},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"0bdfd25d-658c-4b6b-aaee-557640584076"}
{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_016u4fBwrGh1rqApLgCSKBcK","type":"tool_result","content":[{"type":"text","text":"{\"tag_name\":\"v2026.3.13-1\",\"target_commitish\":\"61d171ab0b2fe4abc9afe89c518586274b4b76c2\",\"name\":\"openclaw 2026.3.13\",\"body\":\"This recovery release uses `v2026.3.13-1` because GitHub immutable releases do not allow reusing `v2026.3.13` after publication.\\r\\n\\r\\nImportant:\\r\\n- This release exists to recover the broken `v2026.3.13` tag/release path.\\r\\n- The corresponding npm version is still `2026.3.13`, not `2026.3.13-1`.\\r\\n- The `-1` suffix is for the Git tag and GitHub Release only.\\r\\n\\r\\n\\r\\n## What's Changed\\r\\n* fix(compaction): use full-session token count for post-compaction sanity check by @efe-arv in https://github.com/openclaw/openclaw/pull/28347\\r\\n* fix(telegram): thread media transport policy into SSRF by @obviyus in https://github.com/openclaw/openclaw/pull/44639\\r\\n* fix: handle Discord gateway metadata fetch failures by @jalehman in https://github.com/openclaw/openclaw/pull/44397\\r\\n* docs: move post-release changelog entries to Unreleased by @jalehman in https://github.com/openclaw/openclaw/pull/44691\\r\\n* fix(session): preserve `lastAccountId ` and `lastThreadId` on session reset by @Lanfei in https://github.com/openclaw/openclaw/pull/44773\\r\\n* Updated default model from openai-codex/gpt-5.3-codex to openai-codex/gpt-5.4 in tests. by @jrrcdev in https://github.com/openclaw/openclaw/pull/44367\\r\\n* fix: address delivery dedupe review follow-ups by @frankekn in https://github.com/openclaw/openclaw/pull/44666\\r\\n* CLI: align xhigh thinking help text by @frankekn in https://github.com/openclaw/openclaw/pull/44819\\r\\n* docs: fix changelog credit for xhigh help by @frankekn in https://github.com/openclaw/openclaw/pull/44874\\r\\n* fix(agents): drop Anthropic thinking blocks on replay by @frankekn in https://github.com/openclaw/openclaw/pull/44843\\r\\n* docs: fix session key :dm: → :direct: by @Lanfei in https://github.com/openclaw/openclaw/pull/26506\\r\\n* feat(android): redesign chat settings UI by @obviyus in https://github.com/openclaw/openclaw/pull/44894\\r\\n* fix(agents): avoid injecting memory file twice on case-insensitive mounts by @Lanfei in https://github.com/openclaw/openclaw/pull/26054\\r\\n* Docker: add OPENCLAW_TZ timezone support by @Lanfei in https://github.com/openclaw/openclaw/pull/34119\\r\\n* Android: fix HttpURLConnection leak in TalkModeVoiceResolver by @Kaneki-x in https://github.com/openclaw/openclaw/pull/43780\\r\\n* fix(agents): respect explicit user compat overrides for non-native openai-completions by @cheapestinference in https://github.com/openclaw/openclaw/pull/44432\\r\\n* test(config): cover requiresOpenAiAnthropicToolPayload in compat schema fixture by @xingsy97 in https://github.com/openclaw/openclaw/pull/43438\\r\\n* fix(agents): rephrase session reset prompt to avoid Azure content filter by @xingsy97 in https://github.com/openclaw/openclaw/pull/43403\\r\\n* fix(config): add missing params field to agents.list[] validation schema by @atian8179 in https://github.com/openclaw/openclaw/pull/41171\\r\\n* fix(android): use Google Code Scanner for onboarding QR by @obviyus in https://github.com/openclaw/openclaw/pull/45021\\r\\n* fix: restore web fetch firecrawl config in runtime zod schema by @stim64045-spec in https://github.com/openclaw/openclaw/pull/42583\\r\\n* fix(signal): add groups config to Signal channel schema by @unisone in https://github.com/openclaw/openclaw/pull/27199\\r\\n* feat(ios): add onboarding welcome pager by @ngutman in https://github.com/openclaw/openclaw/pull/45054\\r\\n* small addition to .gitignore  by @Sovtoshi-SC in https://github.com/openclaw/openclaw/pull/42879\\r\\n* fix(discovery): add missing domain to wideArea Zod config schema by @ingyukoh in https://github.com/openclaw/openclaw/pull/35615\\r\\n* fix(ui): keep shared auth on insecure control-ui connects by @velvet-shark in https://github.com/openclaw/openclaw/pull/45088\\r\\n* fix: preserve persona and language continuity in compaction summaries by @keepitmello in https://github.com/openclaw/openclaw/pull/10456\\r\\n* ui: mobile navigation drawer \\u0026 theme variant refinements by @BunsDev in https://github.com/openclaw/openclaw/pull/45107\\r\\n* fix: resolve target agent workspace for cross-agent subagent spawns by @moshehbenavraham in https://github.com/openclaw/openclaw/pull/40176\\r\\n* fix(ollama): hide native reasoning-only output by @frankekn in https://github.com/openclaw/openclaw/pull/45330\\r\\n* test: annotate chat abort helper exports by @frankekn in https://github.com/openclaw/openclaw/pull/45346\\r\\n* Fix incorrect rendering of brave costs in docs by @keelanfh in https://github.com/openclaw/openclaw/pull/44989\\r\\n* security(docker): prevent gateway token leak in Docker build context by @xingsy97 in https://github.com/openclaw/openclaw/pull/44956\\r\\n* refactor: remove redundant ?? undefined in Slack probe by @Cafexss in https://github.com/openclaw/openclaw/pull/44775\\r\\n* fix(ui): restore chat-new-messages class on scroll pill button by @Astro-Han in https://github.com/openclaw/openclaw/pull/44856\\r\\n* fix(windows): suppress visible console windows during restart and process cleanup by @MoerAI in https://github.com/openclaw/openclaw/pull/44842\\r\\n* Slack: add opt-in interactive reply directives by @vincentkoc in https://github.com/openclaw/openclaw/pull/44607\\r\\n* Docs: describe Slack interactive replies by @vincentkoc in https://github.com/openclaw/openclaw/pull/45463\\r\\n* fix(cron): prevent isolated cron nested lane deadlocks by @vincentkoc in https://github.com/openclaw/openclaw/pull/45459\\r\\n* Fix updater refresh cwd for service reinstall by @vincentkoc in https://github.com/openclaw/openclaw/pull/45452\\r\\n* [codex] Polish sidebar status, agent skills, and chat rendering by @BunsDev in https://github.com/openclaw/openclaw/pull/45451\\r\\n* perf(build): deduplicate plugin-sdk chunks to fix ~2x memory regression by @TarasShyn in https://github.com/openclaw/openclaw/pull/45426\\r\\n* Guard updater service refresh against missing invocation cwd by @vincentkoc in https://github.com/openclaw/openclaw/pull/45486\\r\\n* fix(browser): normalize batch act dispatch for selector and batch support by @vincentkoc in https://github.com/openclaw/openclaw/pull/45457\\r\\n* docs(android): note that app is not publicly released yet by @eengad in https://github.com/openclaw/openclaw/pull/23051\\r\\n* fix(browser): follow up batch failure and limit handling by @vincentkoc in https://github.com/openclaw/openclaw/pull/45506\\r\\n* docker: add apt-get upgrade to all Dockerfiles by @jacobtomlinson in https://github.com/openclaw/openclaw/pull/45384\\r\\n* fix(config): avoid Anthropic startup crash by @BunsDev in https://github.com/openclaw/openclaw/pull/45520\\r\\n* test: preserve wrapper behavior for targeted runs by @Takhoffman in https://github.com/openclaw/openclaw/pull/45518\\r\\n* UI: fix chat context notice icon sizing by @BunsDev in https://github.com/openclaw/openclaw/pull/45533\\r\\n* fix(ui): stop dashboard chat history reload storm by @BunsDev in https://github.com/openclaw/openclaw/pull/45541\\r\\n* fix: retry Telegram inbound media downloads over IPv4 fallback by @frankekn in https://github.com/openclaw/openclaw/pull/45327\\r\\n* fix(feishu): preserve non-ASCII filenames in file uploads (#33912) by @fabiaodemianyang in https://github.com/openclaw/openclaw/pull/34262\\r\\n* macOS: respect exec-approvals.json settings in gateway prompter by @sliekens in https://github.com/openclaw/openclaw/pull/13707\\r\\n* fix(ui): keep oversized chat replies readable by @BunsDev in https://github.com/openclaw/openclaw/pull/45559\\r\\n* fix(gateway/ui): restore control-ui auth bypass and classify connect failures by @sallyom in https://github.com/openclaw/openclaw/pull/45512\\r\\n* fix(macos): prevent PortGuard from killing Docker Desktop in remote mode by @teslamint in https://github.com/openclaw/openclaw/pull/13798\\r\\n* fix(sessions): create transcript file on chat.inject when missing by @2233admin in https://github.com/openclaw/openclaw/pull/36645\\r\\n* Plugins: fail fast on channel and binding collisions by @vincentkoc in https://github.com/openclaw/openclaw/pull/45628\\r\\n* fix(macos): align minimum Node.js version with runtime guard (22.16.0) by @ImLukeF in https://github.com/openclaw/openclaw/pull/45640\\r\\n* fix(agents): preserve blank local custom-provider API keys after onboarding by @frankekn in https://github.com/openclaw/openclaw/pull/45631\\r\\n* fix(browser): harden existing-session driver validation and session lifecycle by @odysseus0 in https://github.com/openclaw/openclaw/pull/45682\\r\\n* fix(feishu): add early event-level dedup to prevent duplicate replies by @yunweibang in https://github.com/openclaw/openclaw/pull/43762\\r\\n* fix(models): apply Gemini model-id normalization to google-vertex provider by @scoootscooob in https://github.com/openclaw/openclaw/pull/42435\\r\\n* Gateway: treat scope-limited probe RPC as degraded reachability by @joshavant in https://github.com/openclaw/openclaw/pull/45622\\r\\n* fix(gateway): bound unanswered client requests by @Takhoffman in https://github.com/openclaw/openclaw/pull/45689\\r\\n\\r\\n## New Contributors\\r\\n* @jrrcdev made their first contribution in https://github.com/openclaw/openclaw/pull/44367\\r\\n* @Kaneki-x made their first contribution in https://github.com/openclaw/openclaw/pull/43780\\r\\n* @cheapestinference made their first contribution in https://github.com/openclaw/openclaw/pull/44432\\r\\n* @xingsy97 made their first contribution in https://github.com/openclaw/openclaw/pull/43438\\r\\n* @atian8179 made their first contribution in https://github.com/openclaw/openclaw/pull/41171\\r\\n* @stim64045-spec made their first contribution in https://github.com/openclaw/openclaw/pull/42583\\r\\n* @Sovtoshi-SC made their first contribution in https://github.com/openclaw/openclaw/pull/42879\\r\\n* @keepitmello made their first contribution in https://github.com/openclaw/openclaw/pull/10456\\r\\n* @moshehbenavraham made their first contribution in https://github.com/openclaw/openclaw/pull/40176\\r\\n* @keelanfh made their first contribution in https://github.com/openclaw/openclaw/pull/44989\\r\\n* @Cafexss made their first contribution in https://github.com/openclaw/openclaw/pull/44775\\r\\n* @Astro-Han made their first contribution in https://github.com/openclaw/openclaw/pull/44856\\r\\n* @eengad made their first contribution in https://github.com/openclaw/openclaw/pull/23051\\r\\n* @jacobtomlinson made their first contribution in https://github.com/openclaw/openclaw/pull/45384\\r\\n* @fabiaodemianyang made their first contribution in https://github.com/openclaw/openclaw/pull/34262\\r\\n* @sliekens made their first contribution in https://github.com/openclaw/openclaw/pull/13707\\r\\n* @teslamint made their first contribution in https://github.com/openclaw/openclaw/pull/13798\\r\\n* @yunweibang made their first contribution in https://github.com/openclaw/openclaw/pull/43762\\r\\n\\r\\n**Full Changelog**: https://github.com/openclaw/openclaw/compare/v2026.3.12...v2026.3.13-1\",\"draft\":false,\"prerelease\":false,\"id\":297041210,\"created_at\":\"2026-03-14T18:03:51Z\",\"published_at\":\"2026-03-14T18:04:28Z\",\"url\":\"https://api.github.com/repos/openclaw/openclaw/releases/297041210\",\"html_url\":\"https://github.com/openclaw/openclaw/releases/tag/v2026.3.13-1\",\"assets_url\":\"https://api.github.com/repos/openclaw/openclaw/releases/297041210/assets\",\"upload_url\":\"https://uploads.github.com/repos/openclaw/openclaw/releases/297041210/assets{?name,label}\",\"zipball_url\":\"https://api.github.com/repos/openclaw/openclaw/zipball/v2026.3.13-1\",\"tarball_url\":\"https://api.github.com/repos/openclaw/openclaw/tarball/v2026.3.13-1\",\"author\":{\"login\":\"onutc\",\"id\":152018508,\"node_id\":\"U_kgDOCQ-eTA\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/152018508?v=4\",\"html_url\":\"https://github.com/onutc\",\"gravatar_id\":\"\",\"type\":\"User\",\"site_admin\":false,\"url\":\"https://api.github.com/users/onutc\",\"events_url\":\"https://api.github.com/users/onutc/events{/privacy}\",\"following_url\":\"https://api.github.com/users/onutc/following{/other_user}\",\"followers_url\":\"https://api.github.com/users/onutc/followers\",\"gists_url\":\"https://api.github.com/users/onutc/gists{/gist_id}\",\"organizations_url\":\"https://api.github.com/users/onutc/orgs\",\"received_events_url\":\"https://api.github.com/users/onutc/received_events\",\"repos_url\":\"https://api.github.com/users/onutc/repos\",\"starred_url\":\"https://api.github.com/users/onutc/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/onutc/subscriptions\"},\"node_id\":\"RE_kwDOQb6kR84RtH06\",\"immutable\":true}"}]}]},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"1f844672-a28b-4f68-a02b-e419dcdf4483","timestamp":"2026-03-21T19:26:25.645Z","tool_use_result":[{"type":"text","text":"{\"tag_name\":\"v2026.3.13-1\",\"target_commitish\":\"61d171ab0b2fe4abc9afe89c518586274b4b76c2\",\"name\":\"openclaw 2026.3.13\",\"body\":\"This recovery release uses `v2026.3.13-1` because GitHub immutable releases do not allow reusing `v2026.3.13` after publication.\\r\\n\\r\\nImportant:\\r\\n- This release exists to recover the broken `v2026.3.13` tag/release path.\\r\\n- The corresponding npm version is still `2026.3.13`, not `2026.3.13-1`.\\r\\n- The `-1` suffix is for the Git tag and GitHub Release only.\\r\\n\\r\\n\\r\\n## What's Changed\\r\\n* fix(compaction): use full-session token count for post-compaction sanity check by @efe-arv in https://github.com/openclaw/openclaw/pull/28347\\r\\n* fix(telegram): thread media transport policy into SSRF by @obviyus in https://github.com/openclaw/openclaw/pull/44639\\r\\n* fix: handle Discord gateway metadata fetch failures by @jalehman in https://github.com/openclaw/openclaw/pull/44397\\r\\n* docs: move post-release changelog entries to Unreleased by @jalehman in https://github.com/openclaw/openclaw/pull/44691\\r\\n* fix(session): preserve `lastAccountId ` and `lastThreadId` on session reset by @Lanfei in https://github.com/openclaw/openclaw/pull/44773\\r\\n* Updated default model from openai-codex/gpt-5.3-codex to openai-codex/gpt-5.4 in tests. by @jrrcdev in https://github.com/openclaw/openclaw/pull/44367\\r\\n* fix: address delivery dedupe review follow-ups by @frankekn in https://github.com/openclaw/openclaw/pull/44666\\r\\n* CLI: align xhigh thinking help text by @frankekn in https://github.com/openclaw/openclaw/pull/44819\\r\\n* docs: fix changelog credit for xhigh help by @frankekn in https://github.com/openclaw/openclaw/pull/44874\\r\\n* fix(agents): drop Anthropic thinking blocks on replay by @frankekn in https://github.com/openclaw/openclaw/pull/44843\\r\\n* docs: fix session key :dm: → :direct: by @Lanfei in https://github.com/openclaw/openclaw/pull/26506\\r\\n* feat(android): redesign chat settings UI by @obviyus in https://github.com/openclaw/openclaw/pull/44894\\r\\n* fix(agents): avoid injecting memory file twice on case-insensitive mounts by @Lanfei in https://github.com/openclaw/openclaw/pull/26054\\r\\n* Docker: add OPENCLAW_TZ timezone support by @Lanfei in https://github.com/openclaw/openclaw/pull/34119\\r\\n* Android: fix HttpURLConnection leak in TalkModeVoiceResolver by @Kaneki-x in https://github.com/openclaw/openclaw/pull/43780\\r\\n* fix(agents): respect explicit user compat overrides for non-native openai-completions by @cheapestinference in https://github.com/openclaw/openclaw/pull/44432\\r\\n* test(config): cover requiresOpenAiAnthropicToolPayload in compat schema fixture by @xingsy97 in https://github.com/openclaw/openclaw/pull/43438\\r\\n* fix(agents): rephrase session reset prompt to avoid Azure content filter by @xingsy97 in https://github.com/openclaw/openclaw/pull/43403\\r\\n* fix(config): add missing params field to agents.list[] validation schema by @atian8179 in https://github.com/openclaw/openclaw/pull/41171\\r\\n* fix(android): use Google Code Scanner for onboarding QR by @obviyus in https://github.com/openclaw/openclaw/pull/45021\\r\\n* fix: restore web fetch firecrawl config in runtime zod schema by @stim64045-spec in https://github.com/openclaw/openclaw/pull/42583\\r\\n* fix(signal): add groups config to Signal channel schema by @unisone in https://github.com/openclaw/openclaw/pull/27199\\r\\n* feat(ios): add onboarding welcome pager by @ngutman in https://github.com/openclaw/openclaw/pull/45054\\r\\n* small addition to .gitignore  by @Sovtoshi-SC in https://github.com/openclaw/openclaw/pull/42879\\r\\n* fix(discovery): add missing domain to wideArea Zod config schema by @ingyukoh in https://github.com/openclaw/openclaw/pull/35615\\r\\n* fix(ui): keep shared auth on insecure control-ui connects by @velvet-shark in https://github.com/openclaw/openclaw/pull/45088\\r\\n* fix: preserve persona and language continuity in compaction summaries by @keepitmello in https://github.com/openclaw/openclaw/pull/10456\\r\\n* ui: mobile navigation drawer \\u0026 theme variant refinements by @BunsDev in https://github.com/openclaw/openclaw/pull/45107\\r\\n* fix: resolve target agent workspace for cross-agent subagent spawns by @moshehbenavraham in https://github.com/openclaw/openclaw/pull/40176\\r\\n* fix(ollama): hide native reasoning-only output by @frankekn in https://github.com/openclaw/openclaw/pull/45330\\r\\n* test: annotate chat abort helper exports by @frankekn in https://github.com/openclaw/openclaw/pull/45346\\r\\n* Fix incorrect rendering of brave costs in docs by @keelanfh in https://github.com/openclaw/openclaw/pull/44989\\r\\n* security(docker): prevent gateway token leak in Docker build context by @xingsy97 in https://github.com/openclaw/openclaw/pull/44956\\r\\n* refactor: remove redundant ?? undefined in Slack probe by @Cafexss in https://github.com/openclaw/openclaw/pull/44775\\r\\n* fix(ui): restore chat-new-messages class on scroll pill button by @Astro-Han in https://github.com/openclaw/openclaw/pull/44856\\r\\n* fix(windows): suppress visible console windows during restart and process cleanup by @MoerAI in https://github.com/openclaw/openclaw/pull/44842\\r\\n* Slack: add opt-in interactive reply directives by @vincentkoc in https://github.com/openclaw/openclaw/pull/44607\\r\\n* Docs: describe Slack interactive replies by @vincentkoc in https://github.com/openclaw/openclaw/pull/45463\\r\\n* fix(cron): prevent isolated cron nested lane deadlocks by @vincentkoc in https://github.com/openclaw/openclaw/pull/45459\\r\\n* Fix updater refresh cwd for service reinstall by @vincentkoc in https://github.com/openclaw/openclaw/pull/45452\\r\\n* [codex] Polish sidebar status, agent skills, and chat rendering by @BunsDev in https://github.com/openclaw/openclaw/pull/45451\\r\\n* perf(build): deduplicate plugin-sdk chunks to fix ~2x memory regression by @TarasShyn in https://github.com/openclaw/openclaw/pull/45426\\r\\n* Guard updater service refresh against missing invocation cwd by @vincentkoc in https://github.com/openclaw/openclaw/pull/45486\\r\\n* fix(browser): normalize batch act dispatch for selector and batch support by @vincentkoc in https://github.com/openclaw/openclaw/pull/45457\\r\\n* docs(android): note that app is not publicly released yet by @eengad in https://github.com/openclaw/openclaw/pull/23051\\r\\n* fix(browser): follow up batch failure and limit handling by @vincentkoc in https://github.com/openclaw/openclaw/pull/45506\\r\\n* docker: add apt-get upgrade to all Dockerfiles by @jacobtomlinson in https://github.com/openclaw/openclaw/pull/45384\\r\\n* fix(config): avoid Anthropic startup crash by @BunsDev in https://github.com/openclaw/openclaw/pull/45520\\r\\n* test: preserve wrapper behavior for targeted runs by @Takhoffman in https://github.com/openclaw/openclaw/pull/45518\\r\\n* UI: fix chat context notice icon sizing by @BunsDev in https://github.com/openclaw/openclaw/pull/45533\\r\\n* fix(ui): stop dashboard chat history reload storm by @BunsDev in https://github.com/openclaw/openclaw/pull/45541\\r\\n* fix: retry Telegram inbound media downloads over IPv4 fallback by @frankekn in https://github.com/openclaw/openclaw/pull/45327\\r\\n* fix(feishu): preserve non-ASCII filenames in file uploads (#33912) by @fabiaodemianyang in https://github.com/openclaw/openclaw/pull/34262\\r\\n* macOS: respect exec-approvals.json settings in gateway prompter by @sliekens in https://github.com/openclaw/openclaw/pull/13707\\r\\n* fix(ui): keep oversized chat replies readable by @BunsDev in https://github.com/openclaw/openclaw/pull/45559\\r\\n* fix(gateway/ui): restore control-ui auth bypass and classify connect failures by @sallyom in https://github.com/openclaw/openclaw/pull/45512\\r\\n* fix(macos): prevent PortGuard from killing Docker Desktop in remote mode by @teslamint in https://github.com/openclaw/openclaw/pull/13798\\r\\n* fix(sessions): create transcript file on chat.inject when missing by @2233admin in https://github.com/openclaw/openclaw/pull/36645\\r\\n* Plugins: fail fast on channel and binding collisions by @vincentkoc in https://github.com/openclaw/openclaw/pull/45628\\r\\n* fix(macos): align minimum Node.js version with runtime guard (22.16.0) by @ImLukeF in https://github.com/openclaw/openclaw/pull/45640\\r\\n* fix(agents): preserve blank local custom-provider API keys after onboarding by @frankekn in https://github.com/openclaw/openclaw/pull/45631\\r\\n* fix(browser): harden existing-session driver validation and session lifecycle by @odysseus0 in https://github.com/openclaw/openclaw/pull/45682\\r\\n* fix(feishu): add early event-level dedup to prevent duplicate replies by @yunweibang in https://github.com/openclaw/openclaw/pull/43762\\r\\n* fix(models): apply Gemini model-id normalization to google-vertex provider by @scoootscooob in https://github.com/openclaw/openclaw/pull/42435\\r\\n* Gateway: treat scope-limited probe RPC as degraded reachability by @joshavant in https://github.com/openclaw/openclaw/pull/45622\\r\\n* fix(gateway): bound unanswered client requests by @Takhoffman in https://github.com/openclaw/openclaw/pull/45689\\r\\n\\r\\n## New Contributors\\r\\n* @jrrcdev made their first contribution in https://github.com/openclaw/openclaw/pull/44367\\r\\n* @Kaneki-x made their first contribution in https://github.com/openclaw/openclaw/pull/43780\\r\\n* @cheapestinference made their first contribution in https://github.com/openclaw/openclaw/pull/44432\\r\\n* @xingsy97 made their first contribution in https://github.com/openclaw/openclaw/pull/43438\\r\\n* @atian8179 made their first contribution in https://github.com/openclaw/openclaw/pull/41171\\r\\n* @stim64045-spec made their first contribution in https://github.com/openclaw/openclaw/pull/42583\\r\\n* @Sovtoshi-SC made their first contribution in https://github.com/openclaw/openclaw/pull/42879\\r\\n* @keepitmello made their first contribution in https://github.com/openclaw/openclaw/pull/10456\\r\\n* @moshehbenavraham made their first contribution in https://github.com/openclaw/openclaw/pull/40176\\r\\n* @keelanfh made their first contribution in https://github.com/openclaw/openclaw/pull/44989\\r\\n* @Cafexss made their first contribution in https://github.com/openclaw/openclaw/pull/44775\\r\\n* @Astro-Han made their first contribution in https://github.com/openclaw/openclaw/pull/44856\\r\\n* @eengad made their first contribution in https://github.com/openclaw/openclaw/pull/23051\\r\\n* @jacobtomlinson made their first contribution in https://github.com/openclaw/openclaw/pull/45384\\r\\n* @fabiaodemianyang made their first contribution in https://github.com/openclaw/openclaw/pull/34262\\r\\n* @sliekens made their first contribution in https://github.com/openclaw/openclaw/pull/13707\\r\\n* @teslamint made their first contribution in https://github.com/openclaw/openclaw/pull/13798\\r\\n* @yunweibang made their first contribution in https://github.com/openclaw/openclaw/pull/43762\\r\\n\\r\\n**Full Changelog**: https://github.com/openclaw/openclaw/compare/v2026.3.12...v2026.3.13-1\",\"draft\":false,\"prerelease\":false,\"id\":297041210,\"created_at\":\"2026-03-14T18:03:51Z\",\"published_at\":\"2026-03-14T18:04:28Z\",\"url\":\"https://api.github.com/repos/openclaw/openclaw/releases/297041210\",\"html_url\":\"https://github.com/openclaw/openclaw/releases/tag/v2026.3.13-1\",\"assets_url\":\"https://api.github.com/repos/openclaw/openclaw/releases/297041210/assets\",\"upload_url\":\"https://uploads.github.com/repos/openclaw/openclaw/releases/297041210/assets{?name,label}\",\"zipball_url\":\"https://api.github.com/repos/openclaw/openclaw/zipball/v2026.3.13-1\",\"tarball_url\":\"https://api.github.com/repos/openclaw/openclaw/tarball/v2026.3.13-1\",\"author\":{\"login\":\"onutc\",\"id\":152018508,\"node_id\":\"U_kgDOCQ-eTA\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/152018508?v=4\",\"html_url\":\"https://github.com/onutc\",\"gravatar_id\":\"\",\"type\":\"User\",\"site_admin\":false,\"url\":\"https://api.github.com/users/onutc\",\"events_url\":\"https://api.github.com/users/onutc/events{/privacy}\",\"following_url\":\"https://api.github.com/users/onutc/following{/other_user}\",\"followers_url\":\"https://api.github.com/users/onutc/followers\",\"gists_url\":\"https://api.github.com/users/onutc/gists{/gist_id}\",\"organizations_url\":\"https://api.github.com/users/onutc/orgs\",\"received_events_url\":\"https://api.github.com/users/onutc/received_events\",\"repos_url\":\"https://api.github.com/users/onutc/repos\",\"starred_url\":\"https://api.github.com/users/onutc/starred{/owner}{/repo}\",\"subscriptions_url\":\"https://api.github.com/users/onutc/subscriptions\"},\"node_id\":\"RE_kwDOQb6kR84RtH06\",\"immutable\":true}"}]}
{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_016QqniHy941RZoA82c9csDL","type":"tool_result","content":[{"type":"text","text":"[{\"number\":41513,\"title\":\"fix(context-engine): share registry Map across bundled chunks via globalThis\",\"body\":\"# Fix: Context Engine Registry Shared State Across Bundled Chunks\\n\\n## Title\\nFix context engine registry duplicate Map instances in bundled chunks\\n\\n## Problem Description\\nWhen OpenClaw bundles the application, the context engine registry creates **duplicate `Map` instances across chunks**. This causes context engines registered in one chunk to be invisible in another chunk, resulting in \\u0026#34;not registered\\u0026#34; errors at runtime.\\n\\n### Reproduction Steps\\n1. Install a context engine plugin (e.g., `graphiti-context-engine`)\\n2. Configure it in `openclaw.json`:\\n   ```json\\n   {\\n     \\u0026#34;plugins\\u0026#34;: {\\n       \\u0026#34;allow\\u0026#34;: [\\u0026#34;graphiti-context-engine\\u0026#34;],\\n       \\u0026#34;slots\\u0026#34;: {\\n         \\u0026#34;contextEngine\\u0026#34;: \\u0026#34;graphiti-context-engine\\u0026#34;\\n       }\\n     }\\n   }\\n   ```\\n3. Run OpenClaw gateway\\n4. Observe error: `Context engine \\u0026#34;graphiti-context-engine\\u0026#34; is not registered. Available engines: (none)`\\n\\n**Expected:** The plugin registers successfully and is available for use.  \\n**Actual:** The plugin registers in one chunk but is not visible when resolved in another chunk.\\n\\n## Root Cause Analysis\\n**File:** `src/context-engine/registry.ts` (line 15)\\n\\n**Original Code:**\\n```typescript\\nconst _engines = new Map();\\n```\\n\\nWhen bundlers (esbuild, webpack, etc.) split code into chunks, each chunk that imports `registry.ts` gets **its own instance** of the `_engines` Map. This violates the singleton pattern and breaks the registry.\\n\\n**Why This Happens:**\\n- Module-scoped variables are duplicated across chunks in some bundling scenarios\\n- The OpenClaw build process creates multiple chunks for different entry points\\n- Context engines may be registered in one chunk (e.g., plugin loader) but resolved in another (e.g., auto-reply handler)\\n\\n## Proposed Fix\\nUse `globalThis` to share the Map across all chunks:\\n\\n```typescript\\nconst _engines: Map =\\n  (globalThis as any).__openclawContextEngines ||\\n  ((globalThis as any).__openclawContextEngines = new Map());\\n```\\n\\n**Why This Works:**\\n- `globalThis` is shared across all JavaScript execution contexts in Node.js\\n- The Map is created once and reused by all chunks\\n- Maintains the singleton pattern even when code is split\\n\\n## Testing Done\\n- ✅ Syntax verified with `npx tsc --noEmit`\\n- ✅ Manual patch applied to `dist/registry-*.js` files\\n- ✅ graphiti-context-engine plugin now registers successfully\\n- ✅ Context engine resolution works across chunk boundaries\\n- ✅ No regressions in existing context engine functionality\\n\\n## Alternative Considered\\nCould use a shared module cache or singleton factory pattern, but `globalThis` is the simplest solution that works across all bundler configurations without requiring build-time changes.\\n\\n## Impact\\n- **Fixes:** Context engine plugin loading for all custom context engines\\n- **Breaking Changes:** None (backwards compatible)\\n- **Performance:** Negligible (one-time Map allocation)\\n\\n---\\n\\n**Patch Diff:**\\n```diff\\n-const _engines = new Map();\\n+const _engines: Map =\\n+  (globalThis as any).__openclawContextEngines ||\\n+  ((globalThis as any).__openclawContextEngines = new Map());\\n```\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/41513\",\"user\":{\"login\":\"thalesfsp\",\"id\":750360,\"profile_url\":\"https://github.com/thalesfsp\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/750360?v=4\"},\"labels\":[\"size: M\"],\"assignees\":[\"jalehman\"],\"head\":{\"ref\":\"fix/context-engine-registry-shared-state\",\"sha\":\"663306b293174c4d9af7433880e676f6aa586d15\",\"repo\":{\"full_name\":\"thalesfsp/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"4790e40ac67c98f439f2418cffee6dfea6c78c94\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-09T23:12:52Z\",\"updated_at\":\"2026-03-21T19:25:27Z\",\"closed_at\":\"2026-03-21T19:25:27Z\"},{\"number\":51833,\"title\":\"fix(server-maintenance): sweep orphaned chatRun buffers from stuck runs\",\"body\":\"## Problem\\n\\nWhen an LLM request times out without triggering a clean lifecycle end (e.g., embedded run timeout after 600s), `emitChatFinal` never fires and the streaming buffer in `chatRunState.buffers` persists indefinitely. The maintenance timer in `server-maintenance.ts` only cleans up runs that are in `chatRunState.abortedRuns` — stuck runs that were never explicitly aborted are missed.\\n\\nThis is the direct trigger for the `V8 StringAdd_CheckNone` OOM crash reported in #51821, since the stuck buffer holds a large concatenated string that can\\u0026#39;t be GC\\u0026#39;d.\\n\\nAdditionally, `chatRunState.deltaLastBroadcastLen` was only cleaned in `emitChatFinal` and was never passed to the maintenance timer at all, so it also accumulated entries from both aborted and stuck runs.\\n\\n## Fix\\n\\n1. **Orphaned buffer sweep**: After the existing aborted-run cleanup, iterate `chatDeltaSentAt` entries. Any entry older than `ABORTED_RUN_TTL_MS` (1 hour) that has no active `chatAbortController` is considered stuck — delete its buffer, deltaSentAt, and deltaLastBroadcastLen entries.\\n\\n2. **Thread `chatDeltaLastBroadcastLen`**: Expose the map through `server-runtime-state.ts` → `server.impl.ts` → `server-maintenance.ts` so it is cleaned in both the aborted-run sweep and the new orphaned-buffer sweep.\\n\\n## Files changed\\n\\n- `src/gateway/server-maintenance.ts` — add `chatDeltaLastBroadcastLen` param, orphaned buffer sweep\\n- `src/gateway/server-maintenance.test.ts` — add new param to test helper\\n- `src/gateway/server-runtime-state.ts` — expose `chatDeltaLastBroadcastLen`\\n- `src/gateway/server.impl.ts` — wire up new param\\n\\nCloses #51821\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51833\",\"user\":{\"login\":\"reed1898\",\"id\":129141816,\"profile_url\":\"https://github.com/reed1898\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/129141816?v=4\"},\"labels\":[\"gateway\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/memleak-stuck-chatrun-buffer-sweep\",\"sha\":\"d0d3f6235ed7586856f69bb7ecf6f90ac97feb53\",\"repo\":{\"full_name\":\"reed1898/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"ef7a5c354611d37267a8309c62d706b2e1a345a3\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T19:13:22Z\",\"updated_at\":\"2026-03-21T19:18:09Z\",\"closed_at\":\"2026-03-21T19:13:46Z\"},{\"number\":51831,\"title\":\"fix(session-manager-cache): evict expired entries from SESSION_MANAGER_CACHE\",\"body\":\"## Problem\\n\\nThe `SESSION_MANAGER_CACHE` Map in `src/agents/pi-embedded-runner/session-manager-cache.ts` stores one entry per unique session file path. When `isSessionManagerCached()` finds a stale entry (TTL exceeded), it returned `false` but **never deleted the expired entry** from the Map. Entries accumulated indefinitely since `trackSessionManagerAccess()` only adds/updates and no code path ever calls `.delete()`.\\n\\nOn long-running gateways, this contributes to gradual heap growth.\\n\\n## Fix\\n\\nDelete the expired entry in `isSessionManagerCached()` before returning `false`. This keeps the Map bounded to the number of active (non-expired) session files — essentially a lazy-eviction strategy.\\n\\n## Diff\\n\\n```diff\\n function isSessionManagerCached(sessionFile: string): boolean {\\n   ...\\n   const now = Date.now();\\n   const ttl = getSessionManagerTtl();\\n-  return now - entry.loadedAt \\u0026lt;= ttl;\\n+  if (now - entry.loadedAt \\u0026gt; ttl) {\\n+    SESSION_MANAGER_CACHE.delete(sessionFile);\\n+    return false;\\n+  }\\n+  return true;\\n }\\n```\\n\\nCloses #51820\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51831\",\"user\":{\"login\":\"reed1898\",\"id\":129141816,\"profile_url\":\"https://github.com/reed1898\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/129141816?v=4\"},\"labels\":[\"agents\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/memleak-session-manager-cache-eviction\",\"sha\":\"bffad5697b71f3f6a7a8305862d6f4e81e6eded1\",\"repo\":{\"full_name\":\"reed1898/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"ef7a5c354611d37267a8309c62d706b2e1a345a3\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T19:08:32Z\",\"updated_at\":\"2026-03-21T19:11:47Z\",\"closed_at\":\"2026-03-21T19:08:56Z\"},{\"number\":34222,\"title\":\"fix: use content hash for memory flush dedup instead of compactionCount (#30115)\",\"body\":\"## What\\nReplace event-based memory flush deduplication (`compactionCount`) with state-based deduplication (content hash) to prevent duplicate MEMORY.md writes when compaction aborts.\\n\\n## Why\\nFixes #30115 — Compaction abort triggers duplicate memory flushes in MEMORY.md.\\n\\nThe existing dedup uses `compactionCount` (an event counter) to decide whether to skip a flush. When compaction aborts and retries, the counter increments but the session context stays the same, causing the same content to be flushed repeatedly (4-7x duplicate entries reported).\\n\\nRoot cause: `compactionCount` conflates \\u0026#34;compaction cycle count\\u0026#34; with \\u0026#34;content has changed\\u0026#34; — these are independent concerns. Two different compaction cycles can see identical context (abort → retry scenario), so event-based dedup is fundamentally wrong for this use case.\\n\\n## How\\n- **State-based dedup**: compute a SHA-256 hash (truncated to 16 hex chars) of `messages.length + last 3 user/assistant message contents` before each flush. If the hash matches the stored `memoryFlushContextHash`, skip the flush.\\n- **Two-layer design**: `shouldRunMemoryFlush()` unchanged (token threshold gate), hash check added as second gate in `runMemoryFlushIfNeeded()`.\\n- **`willRetry` fix**: `onAgentEvent` now checks `!evt.data?.willRetry` before marking `memoryCompactionCompleted = true`, preventing retry-in-progress compaction from being incorrectly treated as completed.\\n- **Performance**: `readTranscriptTailMessages()` reads only the last 64KB of the transcript file (not the full file).\\n- **Hash timing**: stores the hash computed *before* the flush run (not after), since the flush turn itself writes to the transcript and would change the hash.\\n\\n### Scenario behavior\\n| Scenario | Behavior |\\n|----------|----------|\\n| Compaction abort | messages unchanged → hash unchanged → skip ✅ |\\n| Compaction success | messages compressed → hash changed → allow flush ✅ |\\n| New messages | tail content changed → hash changed → allow flush ✅ |\\n| Persistence failure | `contextHashBeforeFlush` used in-memory → no re-flush within session ✅ |\\n\\n## Files changed (3 + 1 test)\\n- `src/auto-reply/reply/memory-flush.ts` — new `computeContextHash()` function\\n- `src/auto-reply/reply/agent-runner-memory.ts` — hash check gate + willRetry fix + tail reader\\n- `src/config/sessions/types.ts` — add `memoryFlushContextHash` field to `SessionEntry`\\n- `src/auto-reply/reply/memory-flush.test.ts` — 8 unit tests for `computeContextHash`\\n\\n## Testing\\n- [x] `pnpm build` passes\\n- [x] `pnpm check` passes (lint + format)\\n- [x] `pnpm test` — 811/812 pass (1 pre-existing failure in `process-respawn.test.ts`)\\n- [x] 8 new unit tests for `computeContextHash` (empty input, object content, undefined content, system message filtering, length differentiation, tail behavior)\\n- [x] AI-assisted (OpenClaw agents 李飞飞/陈皮皮/毛豆豆, cross-reviewed, fully tested)\\n\\n## Backward compatibility\\n- `memoryFlushContextHash` undefined → falls back to existing `compactionCount` logic\\n- `memoryFlushCompactionCount` field preserved (not removed)\\n- First flush after upgrade runs normally (hash is empty = allow), subsequent flushes use hash dedup\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/34222\",\"user\":{\"login\":\"lml2468\",\"id\":39320777,\"profile_url\":\"https://github.com/lml2468\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/39320777?v=4\"},\"labels\":[\"cli\",\"size: M\"],\"assignees\":[\"jalehman\"],\"head\":{\"ref\":\"fix/memory-flush-dedup\",\"sha\":\"bce6f0bda03a203cd5c565d762334c8618197fc3\",\"repo\":{\"full_name\":\"lml2468/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"fb50c98d672dd622887e1a60c1583e2e677ed324\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-04T09:13:16Z\",\"updated_at\":\"2026-03-21T19:06:26Z\",\"closed_at\":\"2026-03-21T19:06:26Z\",\"merged_at\":\"2026-03-21T19:06:26Z\"},{\"number\":51784,\"title\":\"fix: Control UI model picker provider prefix + skip register on snapshot loads\",\"body\":\"## Summary\\n\\nTwo fixes bundled together:\\n\\n### Fix 1: Control UI Model Picker Provider Prefix (#51608)\\n\\nFixes issue #51608 where the Control UI model picker sends wrong provider prefix for all models.\\n\\nWhen using the Control UI model picker to switch models, requests were incorrectly routed to the primary provider instead of the correct provider for each model when:\\n\\n1. A model has an alias configured in `agents.defaults.models`\\n2. The catalog entry has the alias as its `id` field\\n3. User selects the model, causing the UI to send `provider/alias` (e.g., `custom-dashscope-aliyuncs-com/bailian`)\\n\\nThe server\\u0026#39;s `resolveModelRefFromString` function parsed `provider/alias` correctly but didn\\u0026#39;t resolve the `alias` part through the alias index, causing the allowlist check to fail.\\n\\n**Changes:**\\n- `src/agents/model-selection.ts`: In `resolveModelRefFromString`, after parsing a qualified `provider/model` ref, check if the `model` part is an alias in the alias index. If so, use the alias\\u0026#39;s resolved model name instead.\\n- `src/agents/model-selection.test.ts`: Added test case for the bug fix.\\n\\n### Fix 2: Skip register() on Non-Activating Snapshot Loads (#51781)\\n\\nFixes issue #51781 where `loadOpenClawPlugins` with `activate: false` still invokes each plugin\\u0026#39;s `register()` function, causing performance overhead from repeated plugin initialization side effects during snapshot loads.\\n\\n**Changes:**\\n- `src/plugins/loader.ts`: Skip calling `register()` when `shouldActivate` is false (i.e., when `activate: false` is passed).\\n- `src/plugins/loader.test.ts`: Updated test to reflect the new expected behavior.\\n\\n## Testing\\n\\n- All `resolveModelRefFromString` tests pass (9 tests)\\n- All `sessions-patch` tests pass (27 tests)\\n- All `loader.test.ts` tests pass (77 tests)\\n- TypeScript type check passes\\n- Lint and format checks pass\\n\\nNote: One pre-existing test failure in `resolveConfiguredModelRef \\u0026gt; sanitizes control characters in providerless-model warnings` is unrelated to this change (Windows symlink permissions issue).\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51784\",\"user\":{\"login\":\"Yaohua-Leo\",\"id\":243496201,\"profile_url\":\"https://github.com/Yaohua-Leo\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/243496201?v=4\"},\"labels\":[\"agents\",\"size: S\"],\"head\":{\"ref\":\"fix/51608-ui-model-picker-provider-prefix\",\"sha\":\"2bc2a71dd24f2f87f8a60c64596be86a4971b31c\",\"repo\":{\"full_name\":\"Yaohua-Leo/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"fb50c98d672dd622887e1a60c1583e2e677ed324\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T17:30:48Z\",\"updated_at\":\"2026-03-21T18:54:29Z\",\"closed_at\":\"2026-03-21T18:51:58Z\"},{\"number\":51200,\"title\":\"Pass runtime context into assemble\",\"body\":\"## Summary\\n\\n- Problem: `assemble()` only received a total `tokenBudget`, so context-engine plugins could not see host-owned prompt costs such as the base system prompt, tool schema, or the current user prompt.\\n- Why it matters: budget-aware memory engines had to guess how much context was already consumed by the host runtime, which made prompt budgeting less accurate and could lead to overly aggressive or overly loose memory injection.\\n- What changed:\\n  - added an optional `runtimeContext` field to `ContextEngine.assemble()`\\n  - passed runtime prompt budget signals from the embedded runner into `assemble()`\\n  - preserved legacy compatibility for engines that reject unknown fields like `runtimeContext`\\n  - added tests and docs for the new assemble input\\n- What did NOT change (scope boundary):\\n  - no change to memory plugin APIs\\n  - no change to retrieval behavior by itself\\n  - no forced behavior change for legacy engines beyond exposing optional metadata\\n\\n## Change Type\\n\\n- [x] Feature\\n- [x] Refactor required for the fix\\n- [x] Docs\\n\\n## Scope\\n\\n- [x] Gateway / orchestration\\n- [x] API / contracts\\n\\n## Linked Issue/PR\\n\\n- Related # N/A\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51200\",\"user\":{\"login\":\"xiuminsama99\",\"id\":198452741,\"profile_url\":\"https://github.com/xiuminsama99\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/198452741?v=4\"},\"labels\":[\"docs\",\"cli\",\"commands\",\"agents\",\"size: XS\"],\"head\":{\"ref\":\"codex/assemble-runtime-context-budget\",\"sha\":\"d6367c2c55a2ef40f189300862d022b0276cc017\",\"repo\":{\"full_name\":\"xiuminsama99/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"fb50c98d672dd622887e1a60c1583e2e677ed324\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-20T19:24:05Z\",\"updated_at\":\"2026-03-21T18:45:29Z\",\"closed_at\":\"2026-03-21T18:45:17Z\"},{\"number\":37080,\"title\":\"fix(tts): add matrix to VOICE_BUBBLE_CHANNELS\",\"body\":\"## Summary\\n\\n- Matrix TTS replies were sent as generic audio file attachments\\n- Missing from VOICE_BUBBLE_CHANNELS set in src/tts/tts.ts\\n- Enables native MSC3245 voice bubble support\\n\\n## Impact\\n\\nMatrix users configured with `messages.tts.auto: \\u0026#34;inbound\\u0026#34;` will now receive TTS replies as native voice message bubbles with:\\n- Waveform visualization\\n- Duration display\\n- Inline playback controls\\n\\nThis improves user experience for ~1500+ active Matrix users in the open-source community.\\n\\n## Root Cause\\n\\nMatrix channel was missing from VOICE_BUBBLE_CHANNELS, causing resolveOutputFormat() to skip voice-compatible settings. Although extensions/matrix/src/matrix/send.ts fully supports audioAsVoice and MSC3245 metadata, the TTS pipeline never set the flag.\\n\\n## Change\\n\\nAdded \\u0026#34;matrix\\u0026#34; to VOICE_BUBBLE_CHANNELS set:\\n- Before: [\\u0026#34;telegram\\u0026#34;, \\u0026#34;feishu\\u0026#34;, \\u0026#34;whatsapp\\u0026#34;]\\n- After: [\\u0026#34;telegram\\u0026#34;, \\u0026#34;feishu\\u0026#34;, \\u0026#34;whatsapp\\u0026#34;, \\u0026#34;matrix\\u0026#34;]\\n\\n## Test plan\\n\\n- [ ] Send voice message to bot on Matrix (Element)\\n- [ ] Verify TTS reply is sent as MSC3245 voice bubble, not generic file attachment\\n- [ ] Verify waveform, duration, and inline playback metadata present\\n\\nFixes #37061\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/37080\",\"user\":{\"login\":\"Matthew19990919\",\"id\":97017241,\"profile_url\":\"https://github.com/Matthew19990919\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/97017241?v=4\"},\"labels\":[\"channel: matrix\",\"size: S\"],\"assignees\":[\"gumadeiras\"],\"head\":{\"ref\":\"fix/matrix-voice-bubble-tts\",\"sha\":\"89ca0355d4c01e422b115cc83a64382b8c917284\",\"repo\":{\"full_name\":\"Matthew19990919/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"fd2b3ed6af9c3ec6ee9e5e0f16410cf286159002\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-06T03:06:45Z\",\"updated_at\":\"2026-03-21T18:36:56Z\",\"closed_at\":\"2026-03-21T18:29:53Z\",\"merged_at\":\"2026-03-21T18:29:53Z\"},{\"number\":50819,\"title\":\"Tests: isolate remaining March 19 unit-fast OOM hotspots\",\"body\":\"## Summary\\n\\nDescribe the problem and fix in 2–5 bullets:\\n\\n- Problem: the March 19, 2026 Linux Node 24 `unit-fast` OOM lane still had two top memory-growth files missing from the scheduler behavior manifest on current `main`: `src/channels/channels-misc.test.ts` and `src/channels/plugins/outbound/slack.sendpayload.test.ts`.\\n- Why it matters: both files were among the top retained-heap contributors in GitHub Actions run `23327237169` / job `67850928311`, so leaving them in the shared `unit-fast` worker risks another worker-lifetime heap climb and OOM.\\n- What changed: add both files to `unit.singletonIsolated` in `test/fixtures/test-parallel.behavior.json` so they run in dedicated forks instead of the shared `unit-fast` lane.\\n- What did NOT change (scope boundary): no production code, test logic, timings manifest, or wrapper logic changed; this PR only adjusts the scheduler manifest.\\n\\n## Change Type (select all)\\n\\n- [x] Bug fix\\n- [ ] Feature\\n- [ ] Refactor\\n- [ ] Docs\\n- [ ] Security hardening\\n- [x] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [ ] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [ ] Memory / storage\\n- [ ] Integrations\\n- [ ] API / contracts\\n- [ ] UI / DX\\n- [x] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\n- Closes: None\\n- Related: GitHub Actions run `23327237169`, job `67850928311`\\n\\n## User-visible / Behavior Changes\\n\\nNone.\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? (`Yes/No`) No\\n- Secrets/tokens handling changed? (`Yes/No`) No\\n- New/changed network calls? (`Yes/No`) No\\n- Command/tool execution surface changed? (`Yes/No`) No\\n- Data access scope changed? (`Yes/No`) No\\n- If any `Yes`, explain risk + mitigation:\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS 26.2\\n- Runtime/container: Node `v24.13.0`, local workspace\\n- Model/provider: N/A\\n- Integration/channel (if any): N/A\\n- Relevant config (redacted): `OPENCLAW_TEST_MEMORY_TRACE=1`, heap snapshots enabled for targeted diagnosis\\n\\n### Steps\\n\\n1. Inspect the failing CI log from run `23327237169` / job `67850928311` and note the top `unit-fast` memory deltas.\\n2. Reproduce the hotspot shape locally with repeated heap snapshots across the CI hotspot files.\\n3. Compare repeated snapshots from the same worker PID and classify the retained growth.\\n4. Add the still-missing hotspot files to `test/fixtures/test-parallel.behavior.json`.\\n5. Verify the wrapper now emits dedicated singleton lanes for those files.\\n\\n### Expected\\n\\n- `channels-misc` and `slack.sendpayload` no longer run inside the shared `unit-fast` lane.\\n\\n### Actual\\n\\n- Both files now appear as dedicated lanes: `channels-misc-isolated` and `slack.sendpayload-isolated`.\\n\\n## Evidence\\n\\nAttach at least one:\\n\\n- [x] Failing test/log before + passing after\\n- [x] Trace/log snippets\\n- [ ] Screenshot/recording\\n- [x] Perf numbers (if relevant)\\n\\nBefore:\\n\\n| Source | Lane | Result | Peak RSS | Total delta | Top relevant files |\\n| --- | --- | --- | --- | --- | --- |\\n| GitHub Actions run `23327237169` job `67850928311` | `unit-fast` | OOM | `13.36 GiB` | `+12.62 GiB` | `src/channels/channels-misc.test.ts:+412.5 MiB`, `src/channels/plugins/outbound/slack.sendpayload.test.ts:+319.0 MiB` |\\n\\nDiagnosis:\\n\\n- Reproduce command:\\n  ```bash\\n  OPENCLAW_TEST_MEMORY_TRACE=1 \\\\\\n  OPENCLAW_TEST_HEAPSNAPSHOT_INTERVAL_MS=5000 \\\\\\n  OPENCLAW_TEST_HEAPSNAPSHOT_DIR=.tmp/heapsnap-23327237169-r1 \\\\\\n  OPENCLAW_TEST_WORKERS=1 \\\\\\n  OPENCLAW_TEST_SERIAL_GATEWAY=1 \\\\\\n  pnpm test -- \\\\\\n    src/media-understanding/apply.test.ts \\\\\\n    src/node-host/invoke-system-run.test.ts \\\\\\n    src/channels/channels-misc.test.ts \\\\\\n    src/tui/tui.test.ts \\\\\\n    src/channels/plugins/outbound/slack.sendpayload.test.ts \\\\\\n    src/acp/translator.session-rate-limit.test.ts\\n  ```\\n- Compared lane/PID: `unit`, PID `31261`\\n- Snapshot delta finding: retained growth was dominated by Vite SSR transform strings such as `__vite_ssr_exportName__(...)`, which indicates shared-worker transformed-module retention rather than a runtime object leak.\\n\\nAfter:\\n\\n| Check | Result |\\n| --- | --- |\\n| `OPENCLAW_TEST_LIST_LANES=1 node scripts/test-parallel.mjs` | includes `channels-misc-isolated` |\\n| `OPENCLAW_TEST_LIST_LANES=1 node scripts/test-parallel.mjs` | includes `slack.sendpayload-isolated` |\\n| Local wrapper run after `pnpm canvas:a2ui:bundle` | `unit-fast` completed with `code=0`, `peak=3.28 GiB`, `totalDelta=+1.38 GiB` before the run moved on to singleton lanes |\\n\\n## Human Verification (required)\\n\\nWhat you personally verified (not just CI), and how:\\n\\n- Verified scenarios: inspected the failing CI log, reproduced the hotspot cluster with repeated heap snapshots, confirmed transformed-module retention, and verified the new singleton lanes appear in the wrapper.\\n- Edge cases checked: rebased onto current `upstream/main` and resolved overlap with newly added singleton entries so this PR only adds the still-missing files on top of current main.\\n- What you did **not** verify: I did not wait for a complete post-rebase `pnpm test` run to finish every remaining singleton lane after collecting the passing `unit-fast` summary.\\n\\n## Review Conversations\\n\\n- [x] I replied to or resolved every bot review conversation I addressed in this PR.\\n- [x] I left unresolved only the conversations that still need reviewer or maintainer judgment.\\n\\nIf a bot review conversation is addressed by this PR, resolve that conversation yourself. Do not leave bot review conversation cleanup for maintainers.\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? (`Yes/No`) Yes\\n- Config/env changes? (`Yes/No`) No\\n- Migration needed? (`Yes/No`) No\\n- If yes, exact upgrade steps:\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: revert this commit or remove the two entries from `test/fixtures/test-parallel.behavior.json`.\\n- Files/config to restore: `test/fixtures/test-parallel.behavior.json`\\n- Known bad symptoms reviewers should watch for: slightly longer overall test runtime from two additional singleton lanes.\\n\\n## Risks and Mitigations\\n\\nList only real risks for this PR. Add/remove entries as needed. If none, write `None`.\\n\\n- Risk: isolating two more files can modestly increase end-to-end suite time.\\n  - Mitigation: the change is narrowly scoped to the two CI-proven hotspot files that were still missing from the manifest.\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/50819\",\"user\":{\"login\":\"huntharo\",\"id\":5617868,\"profile_url\":\"https://github.com/huntharo\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5617868?v=4\"},\"labels\":[\"app: web-ui\",\"scripts\",\"maintainer\",\"size: L\"],\"head\":{\"ref\":\"codex/fix-unit-fast-oom-23327237169\",\"sha\":\"bf218ae75de2f5a1b7d7c6aad26e117532fa5deb\",\"repo\":{\"full_name\":\"huntharo/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"991eb2ef034fea1d6be52733d159a482aa0582af\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-20T03:55:35Z\",\"updated_at\":\"2026-03-21T18:30:50Z\",\"closed_at\":\"2026-03-21T18:30:50Z\"},{\"number\":51260,\"title\":\"Fix Discord `/codex_resume` picker expiration\",\"body\":\"## Summary\\n\\nDescribe the problem and fix in 2–5 bullets:\\n\\n- Problem: Discord `/codex_resume` picker buttons could immediately fail with `This component has expired.` even though the picker message had just been sent.\\n- Why it matters: resume-by-picker worked in Telegram but was broken in Discord, including the thread-in-channel-in-server flow used for real Codex resume.\\n- What changed: I kept the Discord fallback path from discarding explicit callback payloads, and I moved the Discord component registry onto process-global singleton maps so senders and listeners share the same component state across duplicate module instances.\\n- What did NOT change (scope boundary): I did not change the Codex app server picker generation logic; it was already emitting the expected `codexapp:` callbacks.\\n\\n## Change Type (select all)\\n\\n- [x] Bug fix\\n- [ ] Feature\\n- [ ] Refactor\\n- [ ] Docs\\n- [ ] Security hardening\\n- [ ] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [ ] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [ ] Memory / storage\\n- [x] Integrations\\n- [ ] API / contracts\\n- [x] UI / DX\\n- [ ] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\n- Closes #\\n- Related #\\n\\n## User-visible / Behavior Changes\\n\\nDiscord Codex resume pickers now stay clickable and can successfully resume a session instead of immediately showing `This component has expired.`\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? (`No`)\\n- Secrets/tokens handling changed? (`No`)\\n- New/changed network calls? (`No`)\\n- Command/tool execution surface changed? (`No`)\\n- Data access scope changed? (`No`)\\n- If any `Yes`, explain risk + mitigation:\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS\\n- Runtime/container: local dev checkout\\n- Model/provider: Codex app server integration\\n- Integration/channel (if any): Discord thread inside a channel inside a server\\n- Relevant config (redacted): Discord slash command flow with `/codex_resume`\\n\\n### Steps\\n\\n1. Run `/codex_resume` in a Discord thread.\\n2. Click `Browse Projects` or one of the recent-session buttons from the picker.\\n3. Repeat the interaction in the same Discord conversation.\\n\\n### Expected\\n\\n- The picker action is accepted and the selected Codex session view continues normally.\\n\\n### Actual\\n\\n- Before this fix, Discord responded with `This component has expired.` immediately after clicking the picker button.\\n\\n## Evidence\\n\\nAttach at least one:\\n\\n- [x] Failing test/log before + passing after\\n- [x] Trace/log snippets\\n- [x] Screenshot/recording\\n- [ ] Perf numbers (if relevant)\\n\\n## Human Verification (required)\\n\\nWhat you personally verified (not just CI), and how:\\n\\n- Verified scenarios: I verified the Discord end-to-end `/codex_resume` flow, including clicking the picker in a Discord thread and successfully resuming a session.\\n- Edge cases checked: I also verified the focused Discord component tests covering callback fallback behavior and duplicate-module registry sharing.\\n- What you did **not** verify: I did not run the full `pnpm test` suite.\\n\\n## Review Conversations\\n\\n- [ ] I replied to or resolved every bot review conversation I addressed in this PR.\\n- [x] I left unresolved only the conversations that still need reviewer or maintainer judgment.\\n\\nIf a bot review conversation is addressed by this PR, resolve that conversation yourself. Do not leave bot review conversation cleanup for maintainers.\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? (`Yes`)\\n- Config/env changes? (`No`)\\n- Migration needed? (`No`)\\n- If yes, exact upgrade steps:\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: revert the two Discord component commits on this branch\\n- Files/config to restore: `extensions/discord/src/components-registry.ts`, `extensions/discord/src/monitor/agent-components.ts`\\n- Known bad symptoms reviewers should watch for: Discord component clicks failing to resolve, or plugin-owned pickers regressing to immediate `expired` responses\\n\\n## Risks and Mitigations\\n\\nList only real risks for this PR. Add/remove entries as needed. If none, write `None`.\\n\\n- Risk: sharing the registry globally could make stale component state survive duplicate module loads longer than before.\\n- Mitigation: the existing TTL and explicit clear/consume paths are unchanged, and I added a regression test for cross-module sharing.\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51260\",\"user\":{\"login\":\"huntharo\",\"id\":5617868,\"profile_url\":\"https://github.com/huntharo\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5617868?v=4\"},\"labels\":[\"channel: discord\",\"scripts\",\"maintainer\",\"size: L\"],\"assignees\":[\"huntharo\"],\"head\":{\"ref\":\"codex/fix-browse-projects-crash-discord\",\"sha\":\"76eb184dbe60cb1c05db02aab426a67b95095cc3\",\"repo\":{\"full_name\":\"huntharo/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-20T20:30:04Z\",\"updated_at\":\"2026-03-21T18:30:22Z\",\"closed_at\":\"2026-03-21T16:59:22Z\",\"merged_at\":\"2026-03-21T16:59:21Z\"},{\"number\":40126,\"title\":\"feat(memory): pluggable system prompt section for memory plugins\",\"body\":\"## Summary\\n\\n- Problem: The system prompt \\u0026#34;Memory Recall\\u0026#34; section is hardcoded in `system-prompt.ts`, providing memory-core-specific instructions. When a third-party memory plugin is active (via the exclusive memory slot), these instructions are misleading.\\n- Why it matters: Third-party memory plugins need to provide their own system prompt guidance for their tools instead of the hardcoded memory-core instructions.\\n- What changed: Added `registerMemoryPromptSection(builder)` to the plugin API. The active memory plugin registers its own system prompt builder callback. Moved the existing \\u0026#34;Memory Recall\\u0026#34; logic into `memory-core` as its registration. `buildMemorySection()` delegates to the registered callback.\\n- What did NOT change (scope boundary): Default behavior is identical — memory-core registers the same prompt content. No changes to memory tools, compaction, or other plugin APIs.\\n\\n## Change Type (select all)\\n\\n- [ ] Bug fix\\n- [x] Feature\\n- [ ] Refactor\\n- [ ] Docs\\n- [ ] Security hardening\\n- [ ] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [ ] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [x] Memory / storage\\n- [ ] Integrations\\n- [x] API / contracts\\n- [ ] UI / DX\\n- [ ] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\nNone\\n\\n## User-visible / Behavior Changes\\n\\nNone for default memory-core users. Memory plugins with `kind: \\u0026#34;memory\\u0026#34;` can now register a custom system prompt section via `api.registerMemoryPromptSection(builder)`.\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? No\\n- Secrets/tokens handling changed? No\\n- New/changed network calls? No\\n- Command/tool execution surface changed? No\\n- Data access scope changed? No\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS\\n- Runtime/container: Bun\\n- Model/provider: N/A (system prompt wiring)\\n- Integration/channel (if any): Telegram (for human test)\\n\\n### Steps\\n\\n1. Install a memory plugin that calls `api.registerMemoryPromptSection(builder)`\\n2. Start a session\\n3. Observe that the system prompt contains the plugin\\u0026#39;s memory section instead of the hardcoded one\\n\\n### Expected\\n\\n- With memory-core (default): system prompt contains \\u0026#34;Memory Recall\\u0026#34; section as before\\n- With custom memory plugin: system prompt contains the plugin\\u0026#39;s custom section\\n- With no memory plugin: memory section is omitted\\n\\n### Actual (before fix)\\n\\n- Hardcoded \\u0026#34;Memory Recall\\u0026#34; section always present regardless of active memory plugin\\n\\n## Evidence\\n\\n- [x] Failing test/log before + passing after\\n- [ ] Trace/log snippets\\n- [ ] Screenshot/recording\\n- [ ] Perf numbers (if relevant)\\n\\nNew unit tests in `prompt-section.test.ts`: delegation, citationsMode passthrough, no-builder returns empty, last-registration-wins. All 43 existing `system-prompt.test.ts` tests pass.\\n\\n## Human Verification (required)\\n\\n- Verified scenarios: Tested on two separate OpenClaw bots (Telegram) with memory-core active — memory instructions present as expected, no regression observed\\n- Edge cases checked: None\\n- What you did **not** verify: No memory plugin active (section omitted), custom third-party memory plugin providing its own section\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? Yes\\n- Config/env changes? No\\n- Migration needed? No\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: Revert the commit; hardcoded prompt returns\\n- Files/config to restore: N/A\\n- Known bad symptoms reviewers should watch for: Missing \\u0026#34;Memory Recall\\u0026#34; section in system prompt when memory-core is active\\n\\n## Risks and Mitigations\\n\\nNone. Additive API change. Default behavior is identical — memory-core registers the same prompt content it previously hardcoded.\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/40126\",\"user\":{\"login\":\"jarimustonen\",\"id\":1272053,\"profile_url\":\"https://github.com/jarimustonen\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/1272053?v=4\"},\"labels\":[\"extensions: lobster\",\"extensions: memory-core\",\"cli\",\"scripts\",\"agents\",\"size: M\"],\"assignees\":[\"jalehman\"],\"head\":{\"ref\":\"feat/memory-prompt-section-plugin-api\",\"sha\":\"5228d1937f037172762fa64b0f8749403f9ae85f\",\"repo\":{\"full_name\":\"jarimustonen/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"ebfc5f82408f0d592e45db62c61c4834d2cb07e6\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-08T17:38:46Z\",\"updated_at\":\"2026-03-21T18:20:45Z\",\"closed_at\":\"2026-03-21T18:20:45Z\",\"merged_at\":\"2026-03-21T18:20:45Z\"}]"}]}]},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"fdb10742-285b-4db6-8abe-0d69eaccc122","timestamp":"2026-03-21T19:26:26.070Z","tool_use_result":[{"type":"text","text":"[{\"number\":41513,\"title\":\"fix(context-engine): share registry Map across bundled chunks via globalThis\",\"body\":\"# Fix: Context Engine Registry Shared State Across Bundled Chunks\\n\\n## Title\\nFix context engine registry duplicate Map instances in bundled chunks\\n\\n## Problem Description\\nWhen OpenClaw bundles the application, the context engine registry creates **duplicate `Map` instances across chunks**. This causes context engines registered in one chunk to be invisible in another chunk, resulting in \\u0026#34;not registered\\u0026#34; errors at runtime.\\n\\n### Reproduction Steps\\n1. Install a context engine plugin (e.g., `graphiti-context-engine`)\\n2. Configure it in `openclaw.json`:\\n   ```json\\n   {\\n     \\u0026#34;plugins\\u0026#34;: {\\n       \\u0026#34;allow\\u0026#34;: [\\u0026#34;graphiti-context-engine\\u0026#34;],\\n       \\u0026#34;slots\\u0026#34;: {\\n         \\u0026#34;contextEngine\\u0026#34;: \\u0026#34;graphiti-context-engine\\u0026#34;\\n       }\\n     }\\n   }\\n   ```\\n3. Run OpenClaw gateway\\n4. Observe error: `Context engine \\u0026#34;graphiti-context-engine\\u0026#34; is not registered. Available engines: (none)`\\n\\n**Expected:** The plugin registers successfully and is available for use.  \\n**Actual:** The plugin registers in one chunk but is not visible when resolved in another chunk.\\n\\n## Root Cause Analysis\\n**File:** `src/context-engine/registry.ts` (line 15)\\n\\n**Original Code:**\\n```typescript\\nconst _engines = new Map();\\n```\\n\\nWhen bundlers (esbuild, webpack, etc.) split code into chunks, each chunk that imports `registry.ts` gets **its own instance** of the `_engines` Map. This violates the singleton pattern and breaks the registry.\\n\\n**Why This Happens:**\\n- Module-scoped variables are duplicated across chunks in some bundling scenarios\\n- The OpenClaw build process creates multiple chunks for different entry points\\n- Context engines may be registered in one chunk (e.g., plugin loader) but resolved in another (e.g., auto-reply handler)\\n\\n## Proposed Fix\\nUse `globalThis` to share the Map across all chunks:\\n\\n```typescript\\nconst _engines: Map =\\n  (globalThis as any).__openclawContextEngines ||\\n  ((globalThis as any).__openclawContextEngines = new Map());\\n```\\n\\n**Why This Works:**\\n- `globalThis` is shared across all JavaScript execution contexts in Node.js\\n- The Map is created once and reused by all chunks\\n- Maintains the singleton pattern even when code is split\\n\\n## Testing Done\\n- ✅ Syntax verified with `npx tsc --noEmit`\\n- ✅ Manual patch applied to `dist/registry-*.js` files\\n- ✅ graphiti-context-engine plugin now registers successfully\\n- ✅ Context engine resolution works across chunk boundaries\\n- ✅ No regressions in existing context engine functionality\\n\\n## Alternative Considered\\nCould use a shared module cache or singleton factory pattern, but `globalThis` is the simplest solution that works across all bundler configurations without requiring build-time changes.\\n\\n## Impact\\n- **Fixes:** Context engine plugin loading for all custom context engines\\n- **Breaking Changes:** None (backwards compatible)\\n- **Performance:** Negligible (one-time Map allocation)\\n\\n---\\n\\n**Patch Diff:**\\n```diff\\n-const _engines = new Map();\\n+const _engines: Map =\\n+  (globalThis as any).__openclawContextEngines ||\\n+  ((globalThis as any).__openclawContextEngines = new Map());\\n```\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/41513\",\"user\":{\"login\":\"thalesfsp\",\"id\":750360,\"profile_url\":\"https://github.com/thalesfsp\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/750360?v=4\"},\"labels\":[\"size: M\"],\"assignees\":[\"jalehman\"],\"head\":{\"ref\":\"fix/context-engine-registry-shared-state\",\"sha\":\"663306b293174c4d9af7433880e676f6aa586d15\",\"repo\":{\"full_name\":\"thalesfsp/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"4790e40ac67c98f439f2418cffee6dfea6c78c94\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-09T23:12:52Z\",\"updated_at\":\"2026-03-21T19:25:27Z\",\"closed_at\":\"2026-03-21T19:25:27Z\"},{\"number\":51833,\"title\":\"fix(server-maintenance): sweep orphaned chatRun buffers from stuck runs\",\"body\":\"## Problem\\n\\nWhen an LLM request times out without triggering a clean lifecycle end (e.g., embedded run timeout after 600s), `emitChatFinal` never fires and the streaming buffer in `chatRunState.buffers` persists indefinitely. The maintenance timer in `server-maintenance.ts` only cleans up runs that are in `chatRunState.abortedRuns` — stuck runs that were never explicitly aborted are missed.\\n\\nThis is the direct trigger for the `V8 StringAdd_CheckNone` OOM crash reported in #51821, since the stuck buffer holds a large concatenated string that can\\u0026#39;t be GC\\u0026#39;d.\\n\\nAdditionally, `chatRunState.deltaLastBroadcastLen` was only cleaned in `emitChatFinal` and was never passed to the maintenance timer at all, so it also accumulated entries from both aborted and stuck runs.\\n\\n## Fix\\n\\n1. **Orphaned buffer sweep**: After the existing aborted-run cleanup, iterate `chatDeltaSentAt` entries. Any entry older than `ABORTED_RUN_TTL_MS` (1 hour) that has no active `chatAbortController` is considered stuck — delete its buffer, deltaSentAt, and deltaLastBroadcastLen entries.\\n\\n2. **Thread `chatDeltaLastBroadcastLen`**: Expose the map through `server-runtime-state.ts` → `server.impl.ts` → `server-maintenance.ts` so it is cleaned in both the aborted-run sweep and the new orphaned-buffer sweep.\\n\\n## Files changed\\n\\n- `src/gateway/server-maintenance.ts` — add `chatDeltaLastBroadcastLen` param, orphaned buffer sweep\\n- `src/gateway/server-maintenance.test.ts` — add new param to test helper\\n- `src/gateway/server-runtime-state.ts` — expose `chatDeltaLastBroadcastLen`\\n- `src/gateway/server.impl.ts` — wire up new param\\n\\nCloses #51821\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51833\",\"user\":{\"login\":\"reed1898\",\"id\":129141816,\"profile_url\":\"https://github.com/reed1898\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/129141816?v=4\"},\"labels\":[\"gateway\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/memleak-stuck-chatrun-buffer-sweep\",\"sha\":\"d0d3f6235ed7586856f69bb7ecf6f90ac97feb53\",\"repo\":{\"full_name\":\"reed1898/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"ef7a5c354611d37267a8309c62d706b2e1a345a3\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T19:13:22Z\",\"updated_at\":\"2026-03-21T19:18:09Z\",\"closed_at\":\"2026-03-21T19:13:46Z\"},{\"number\":51831,\"title\":\"fix(session-manager-cache): evict expired entries from SESSION_MANAGER_CACHE\",\"body\":\"## Problem\\n\\nThe `SESSION_MANAGER_CACHE` Map in `src/agents/pi-embedded-runner/session-manager-cache.ts` stores one entry per unique session file path. When `isSessionManagerCached()` finds a stale entry (TTL exceeded), it returned `false` but **never deleted the expired entry** from the Map. Entries accumulated indefinitely since `trackSessionManagerAccess()` only adds/updates and no code path ever calls `.delete()`.\\n\\nOn long-running gateways, this contributes to gradual heap growth.\\n\\n## Fix\\n\\nDelete the expired entry in `isSessionManagerCached()` before returning `false`. This keeps the Map bounded to the number of active (non-expired) session files — essentially a lazy-eviction strategy.\\n\\n## Diff\\n\\n```diff\\n function isSessionManagerCached(sessionFile: string): boolean {\\n   ...\\n   const now = Date.now();\\n   const ttl = getSessionManagerTtl();\\n-  return now - entry.loadedAt \\u0026lt;= ttl;\\n+  if (now - entry.loadedAt \\u0026gt; ttl) {\\n+    SESSION_MANAGER_CACHE.delete(sessionFile);\\n+    return false;\\n+  }\\n+  return true;\\n }\\n```\\n\\nCloses #51820\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51831\",\"user\":{\"login\":\"reed1898\",\"id\":129141816,\"profile_url\":\"https://github.com/reed1898\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/129141816?v=4\"},\"labels\":[\"agents\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/memleak-session-manager-cache-eviction\",\"sha\":\"bffad5697b71f3f6a7a8305862d6f4e81e6eded1\",\"repo\":{\"full_name\":\"reed1898/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"ef7a5c354611d37267a8309c62d706b2e1a345a3\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T19:08:32Z\",\"updated_at\":\"2026-03-21T19:11:47Z\",\"closed_at\":\"2026-03-21T19:08:56Z\"},{\"number\":34222,\"title\":\"fix: use content hash for memory flush dedup instead of compactionCount (#30115)\",\"body\":\"## What\\nReplace event-based memory flush deduplication (`compactionCount`) with state-based deduplication (content hash) to prevent duplicate MEMORY.md writes when compaction aborts.\\n\\n## Why\\nFixes #30115 — Compaction abort triggers duplicate memory flushes in MEMORY.md.\\n\\nThe existing dedup uses `compactionCount` (an event counter) to decide whether to skip a flush. When compaction aborts and retries, the counter increments but the session context stays the same, causing the same content to be flushed repeatedly (4-7x duplicate entries reported).\\n\\nRoot cause: `compactionCount` conflates \\u0026#34;compaction cycle count\\u0026#34; with \\u0026#34;content has changed\\u0026#34; — these are independent concerns. Two different compaction cycles can see identical context (abort → retry scenario), so event-based dedup is fundamentally wrong for this use case.\\n\\n## How\\n- **State-based dedup**: compute a SHA-256 hash (truncated to 16 hex chars) of `messages.length + last 3 user/assistant message contents` before each flush. If the hash matches the stored `memoryFlushContextHash`, skip the flush.\\n- **Two-layer design**: `shouldRunMemoryFlush()` unchanged (token threshold gate), hash check added as second gate in `runMemoryFlushIfNeeded()`.\\n- **`willRetry` fix**: `onAgentEvent` now checks `!evt.data?.willRetry` before marking `memoryCompactionCompleted = true`, preventing retry-in-progress compaction from being incorrectly treated as completed.\\n- **Performance**: `readTranscriptTailMessages()` reads only the last 64KB of the transcript file (not the full file).\\n- **Hash timing**: stores the hash computed *before* the flush run (not after), since the flush turn itself writes to the transcript and would change the hash.\\n\\n### Scenario behavior\\n| Scenario | Behavior |\\n|----------|----------|\\n| Compaction abort | messages unchanged → hash unchanged → skip ✅ |\\n| Compaction success | messages compressed → hash changed → allow flush ✅ |\\n| New messages | tail content changed → hash changed → allow flush ✅ |\\n| Persistence failure | `contextHashBeforeFlush` used in-memory → no re-flush within session ✅ |\\n\\n## Files changed (3 + 1 test)\\n- `src/auto-reply/reply/memory-flush.ts` — new `computeContextHash()` function\\n- `src/auto-reply/reply/agent-runner-memory.ts` — hash check gate + willRetry fix + tail reader\\n- `src/config/sessions/types.ts` — add `memoryFlushContextHash` field to `SessionEntry`\\n- `src/auto-reply/reply/memory-flush.test.ts` — 8 unit tests for `computeContextHash`\\n\\n## Testing\\n- [x] `pnpm build` passes\\n- [x] `pnpm check` passes (lint + format)\\n- [x] `pnpm test` — 811/812 pass (1 pre-existing failure in `process-respawn.test.ts`)\\n- [x] 8 new unit tests for `computeContextHash` (empty input, object content, undefined content, system message filtering, length differentiation, tail behavior)\\n- [x] AI-assisted (OpenClaw agents 李飞飞/陈皮皮/毛豆豆, cross-reviewed, fully tested)\\n\\n## Backward compatibility\\n- `memoryFlushContextHash` undefined → falls back to existing `compactionCount` logic\\n- `memoryFlushCompactionCount` field preserved (not removed)\\n- First flush after upgrade runs normally (hash is empty = allow), subsequent flushes use hash dedup\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/34222\",\"user\":{\"login\":\"lml2468\",\"id\":39320777,\"profile_url\":\"https://github.com/lml2468\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/39320777?v=4\"},\"labels\":[\"cli\",\"size: M\"],\"assignees\":[\"jalehman\"],\"head\":{\"ref\":\"fix/memory-flush-dedup\",\"sha\":\"bce6f0bda03a203cd5c565d762334c8618197fc3\",\"repo\":{\"full_name\":\"lml2468/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"fb50c98d672dd622887e1a60c1583e2e677ed324\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-04T09:13:16Z\",\"updated_at\":\"2026-03-21T19:06:26Z\",\"closed_at\":\"2026-03-21T19:06:26Z\",\"merged_at\":\"2026-03-21T19:06:26Z\"},{\"number\":51784,\"title\":\"fix: Control UI model picker provider prefix + skip register on snapshot loads\",\"body\":\"## Summary\\n\\nTwo fixes bundled together:\\n\\n### Fix 1: Control UI Model Picker Provider Prefix (#51608)\\n\\nFixes issue #51608 where the Control UI model picker sends wrong provider prefix for all models.\\n\\nWhen using the Control UI model picker to switch models, requests were incorrectly routed to the primary provider instead of the correct provider for each model when:\\n\\n1. A model has an alias configured in `agents.defaults.models`\\n2. The catalog entry has the alias as its `id` field\\n3. User selects the model, causing the UI to send `provider/alias` (e.g., `custom-dashscope-aliyuncs-com/bailian`)\\n\\nThe server\\u0026#39;s `resolveModelRefFromString` function parsed `provider/alias` correctly but didn\\u0026#39;t resolve the `alias` part through the alias index, causing the allowlist check to fail.\\n\\n**Changes:**\\n- `src/agents/model-selection.ts`: In `resolveModelRefFromString`, after parsing a qualified `provider/model` ref, check if the `model` part is an alias in the alias index. If so, use the alias\\u0026#39;s resolved model name instead.\\n- `src/agents/model-selection.test.ts`: Added test case for the bug fix.\\n\\n### Fix 2: Skip register() on Non-Activating Snapshot Loads (#51781)\\n\\nFixes issue #51781 where `loadOpenClawPlugins` with `activate: false` still invokes each plugin\\u0026#39;s `register()` function, causing performance overhead from repeated plugin initialization side effects during snapshot loads.\\n\\n**Changes:**\\n- `src/plugins/loader.ts`: Skip calling `register()` when `shouldActivate` is false (i.e., when `activate: false` is passed).\\n- `src/plugins/loader.test.ts`: Updated test to reflect the new expected behavior.\\n\\n## Testing\\n\\n- All `resolveModelRefFromString` tests pass (9 tests)\\n- All `sessions-patch` tests pass (27 tests)\\n- All `loader.test.ts` tests pass (77 tests)\\n- TypeScript type check passes\\n- Lint and format checks pass\\n\\nNote: One pre-existing test failure in `resolveConfiguredModelRef \\u0026gt; sanitizes control characters in providerless-model warnings` is unrelated to this change (Windows symlink permissions issue).\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51784\",\"user\":{\"login\":\"Yaohua-Leo\",\"id\":243496201,\"profile_url\":\"https://github.com/Yaohua-Leo\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/243496201?v=4\"},\"labels\":[\"agents\",\"size: S\"],\"head\":{\"ref\":\"fix/51608-ui-model-picker-provider-prefix\",\"sha\":\"2bc2a71dd24f2f87f8a60c64596be86a4971b31c\",\"repo\":{\"full_name\":\"Yaohua-Leo/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"fb50c98d672dd622887e1a60c1583e2e677ed324\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T17:30:48Z\",\"updated_at\":\"2026-03-21T18:54:29Z\",\"closed_at\":\"2026-03-21T18:51:58Z\"},{\"number\":51200,\"title\":\"Pass runtime context into assemble\",\"body\":\"## Summary\\n\\n- Problem: `assemble()` only received a total `tokenBudget`, so context-engine plugins could not see host-owned prompt costs such as the base system prompt, tool schema, or the current user prompt.\\n- Why it matters: budget-aware memory engines had to guess how much context was already consumed by the host runtime, which made prompt budgeting less accurate and could lead to overly aggressive or overly loose memory injection.\\n- What changed:\\n  - added an optional `runtimeContext` field to `ContextEngine.assemble()`\\n  - passed runtime prompt budget signals from the embedded runner into `assemble()`\\n  - preserved legacy compatibility for engines that reject unknown fields like `runtimeContext`\\n  - added tests and docs for the new assemble input\\n- What did NOT change (scope boundary):\\n  - no change to memory plugin APIs\\n  - no change to retrieval behavior by itself\\n  - no forced behavior change for legacy engines beyond exposing optional metadata\\n\\n## Change Type\\n\\n- [x] Feature\\n- [x] Refactor required for the fix\\n- [x] Docs\\n\\n## Scope\\n\\n- [x] Gateway / orchestration\\n- [x] API / contracts\\n\\n## Linked Issue/PR\\n\\n- Related # N/A\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51200\",\"user\":{\"login\":\"xiuminsama99\",\"id\":198452741,\"profile_url\":\"https://github.com/xiuminsama99\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/198452741?v=4\"},\"labels\":[\"docs\",\"cli\",\"commands\",\"agents\",\"size: XS\"],\"head\":{\"ref\":\"codex/assemble-runtime-context-budget\",\"sha\":\"d6367c2c55a2ef40f189300862d022b0276cc017\",\"repo\":{\"full_name\":\"xiuminsama99/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"fb50c98d672dd622887e1a60c1583e2e677ed324\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-20T19:24:05Z\",\"updated_at\":\"2026-03-21T18:45:29Z\",\"closed_at\":\"2026-03-21T18:45:17Z\"},{\"number\":37080,\"title\":\"fix(tts): add matrix to VOICE_BUBBLE_CHANNELS\",\"body\":\"## Summary\\n\\n- Matrix TTS replies were sent as generic audio file attachments\\n- Missing from VOICE_BUBBLE_CHANNELS set in src/tts/tts.ts\\n- Enables native MSC3245 voice bubble support\\n\\n## Impact\\n\\nMatrix users configured with `messages.tts.auto: \\u0026#34;inbound\\u0026#34;` will now receive TTS replies as native voice message bubbles with:\\n- Waveform visualization\\n- Duration display\\n- Inline playback controls\\n\\nThis improves user experience for ~1500+ active Matrix users in the open-source community.\\n\\n## Root Cause\\n\\nMatrix channel was missing from VOICE_BUBBLE_CHANNELS, causing resolveOutputFormat() to skip voice-compatible settings. Although extensions/matrix/src/matrix/send.ts fully supports audioAsVoice and MSC3245 metadata, the TTS pipeline never set the flag.\\n\\n## Change\\n\\nAdded \\u0026#34;matrix\\u0026#34; to VOICE_BUBBLE_CHANNELS set:\\n- Before: [\\u0026#34;telegram\\u0026#34;, \\u0026#34;feishu\\u0026#34;, \\u0026#34;whatsapp\\u0026#34;]\\n- After: [\\u0026#34;telegram\\u0026#34;, \\u0026#34;feishu\\u0026#34;, \\u0026#34;whatsapp\\u0026#34;, \\u0026#34;matrix\\u0026#34;]\\n\\n## Test plan\\n\\n- [ ] Send voice message to bot on Matrix (Element)\\n- [ ] Verify TTS reply is sent as MSC3245 voice bubble, not generic file attachment\\n- [ ] Verify waveform, duration, and inline playback metadata present\\n\\nFixes #37061\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/37080\",\"user\":{\"login\":\"Matthew19990919\",\"id\":97017241,\"profile_url\":\"https://github.com/Matthew19990919\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/97017241?v=4\"},\"labels\":[\"channel: matrix\",\"size: S\"],\"assignees\":[\"gumadeiras\"],\"head\":{\"ref\":\"fix/matrix-voice-bubble-tts\",\"sha\":\"89ca0355d4c01e422b115cc83a64382b8c917284\",\"repo\":{\"full_name\":\"Matthew19990919/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"fd2b3ed6af9c3ec6ee9e5e0f16410cf286159002\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-06T03:06:45Z\",\"updated_at\":\"2026-03-21T18:36:56Z\",\"closed_at\":\"2026-03-21T18:29:53Z\",\"merged_at\":\"2026-03-21T18:29:53Z\"},{\"number\":50819,\"title\":\"Tests: isolate remaining March 19 unit-fast OOM hotspots\",\"body\":\"## Summary\\n\\nDescribe the problem and fix in 2–5 bullets:\\n\\n- Problem: the March 19, 2026 Linux Node 24 `unit-fast` OOM lane still had two top memory-growth files missing from the scheduler behavior manifest on current `main`: `src/channels/channels-misc.test.ts` and `src/channels/plugins/outbound/slack.sendpayload.test.ts`.\\n- Why it matters: both files were among the top retained-heap contributors in GitHub Actions run `23327237169` / job `67850928311`, so leaving them in the shared `unit-fast` worker risks another worker-lifetime heap climb and OOM.\\n- What changed: add both files to `unit.singletonIsolated` in `test/fixtures/test-parallel.behavior.json` so they run in dedicated forks instead of the shared `unit-fast` lane.\\n- What did NOT change (scope boundary): no production code, test logic, timings manifest, or wrapper logic changed; this PR only adjusts the scheduler manifest.\\n\\n## Change Type (select all)\\n\\n- [x] Bug fix\\n- [ ] Feature\\n- [ ] Refactor\\n- [ ] Docs\\n- [ ] Security hardening\\n- [x] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [ ] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [ ] Memory / storage\\n- [ ] Integrations\\n- [ ] API / contracts\\n- [ ] UI / DX\\n- [x] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\n- Closes: None\\n- Related: GitHub Actions run `23327237169`, job `67850928311`\\n\\n## User-visible / Behavior Changes\\n\\nNone.\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? (`Yes/No`) No\\n- Secrets/tokens handling changed? (`Yes/No`) No\\n- New/changed network calls? (`Yes/No`) No\\n- Command/tool execution surface changed? (`Yes/No`) No\\n- Data access scope changed? (`Yes/No`) No\\n- If any `Yes`, explain risk + mitigation:\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS 26.2\\n- Runtime/container: Node `v24.13.0`, local workspace\\n- Model/provider: N/A\\n- Integration/channel (if any): N/A\\n- Relevant config (redacted): `OPENCLAW_TEST_MEMORY_TRACE=1`, heap snapshots enabled for targeted diagnosis\\n\\n### Steps\\n\\n1. Inspect the failing CI log from run `23327237169` / job `67850928311` and note the top `unit-fast` memory deltas.\\n2. Reproduce the hotspot shape locally with repeated heap snapshots across the CI hotspot files.\\n3. Compare repeated snapshots from the same worker PID and classify the retained growth.\\n4. Add the still-missing hotspot files to `test/fixtures/test-parallel.behavior.json`.\\n5. Verify the wrapper now emits dedicated singleton lanes for those files.\\n\\n### Expected\\n\\n- `channels-misc` and `slack.sendpayload` no longer run inside the shared `unit-fast` lane.\\n\\n### Actual\\n\\n- Both files now appear as dedicated lanes: `channels-misc-isolated` and `slack.sendpayload-isolated`.\\n\\n## Evidence\\n\\nAttach at least one:\\n\\n- [x] Failing test/log before + passing after\\n- [x] Trace/log snippets\\n- [ ] Screenshot/recording\\n- [x] Perf numbers (if relevant)\\n\\nBefore:\\n\\n| Source | Lane | Result | Peak RSS | Total delta | Top relevant files |\\n| --- | --- | --- | --- | --- | --- |\\n| GitHub Actions run `23327237169` job `67850928311` | `unit-fast` | OOM | `13.36 GiB` | `+12.62 GiB` | `src/channels/channels-misc.test.ts:+412.5 MiB`, `src/channels/plugins/outbound/slack.sendpayload.test.ts:+319.0 MiB` |\\n\\nDiagnosis:\\n\\n- Reproduce command:\\n  ```bash\\n  OPENCLAW_TEST_MEMORY_TRACE=1 \\\\\\n  OPENCLAW_TEST_HEAPSNAPSHOT_INTERVAL_MS=5000 \\\\\\n  OPENCLAW_TEST_HEAPSNAPSHOT_DIR=.tmp/heapsnap-23327237169-r1 \\\\\\n  OPENCLAW_TEST_WORKERS=1 \\\\\\n  OPENCLAW_TEST_SERIAL_GATEWAY=1 \\\\\\n  pnpm test -- \\\\\\n    src/media-understanding/apply.test.ts \\\\\\n    src/node-host/invoke-system-run.test.ts \\\\\\n    src/channels/channels-misc.test.ts \\\\\\n    src/tui/tui.test.ts \\\\\\n    src/channels/plugins/outbound/slack.sendpayload.test.ts \\\\\\n    src/acp/translator.session-rate-limit.test.ts\\n  ```\\n- Compared lane/PID: `unit`, PID `31261`\\n- Snapshot delta finding: retained growth was dominated by Vite SSR transform strings such as `__vite_ssr_exportName__(...)`, which indicates shared-worker transformed-module retention rather than a runtime object leak.\\n\\nAfter:\\n\\n| Check | Result |\\n| --- | --- |\\n| `OPENCLAW_TEST_LIST_LANES=1 node scripts/test-parallel.mjs` | includes `channels-misc-isolated` |\\n| `OPENCLAW_TEST_LIST_LANES=1 node scripts/test-parallel.mjs` | includes `slack.sendpayload-isolated` |\\n| Local wrapper run after `pnpm canvas:a2ui:bundle` | `unit-fast` completed with `code=0`, `peak=3.28 GiB`, `totalDelta=+1.38 GiB` before the run moved on to singleton lanes |\\n\\n## Human Verification (required)\\n\\nWhat you personally verified (not just CI), and how:\\n\\n- Verified scenarios: inspected the failing CI log, reproduced the hotspot cluster with repeated heap snapshots, confirmed transformed-module retention, and verified the new singleton lanes appear in the wrapper.\\n- Edge cases checked: rebased onto current `upstream/main` and resolved overlap with newly added singleton entries so this PR only adds the still-missing files on top of current main.\\n- What you did **not** verify: I did not wait for a complete post-rebase `pnpm test` run to finish every remaining singleton lane after collecting the passing `unit-fast` summary.\\n\\n## Review Conversations\\n\\n- [x] I replied to or resolved every bot review conversation I addressed in this PR.\\n- [x] I left unresolved only the conversations that still need reviewer or maintainer judgment.\\n\\nIf a bot review conversation is addressed by this PR, resolve that conversation yourself. Do not leave bot review conversation cleanup for maintainers.\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? (`Yes/No`) Yes\\n- Config/env changes? (`Yes/No`) No\\n- Migration needed? (`Yes/No`) No\\n- If yes, exact upgrade steps:\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: revert this commit or remove the two entries from `test/fixtures/test-parallel.behavior.json`.\\n- Files/config to restore: `test/fixtures/test-parallel.behavior.json`\\n- Known bad symptoms reviewers should watch for: slightly longer overall test runtime from two additional singleton lanes.\\n\\n## Risks and Mitigations\\n\\nList only real risks for this PR. Add/remove entries as needed. If none, write `None`.\\n\\n- Risk: isolating two more files can modestly increase end-to-end suite time.\\n  - Mitigation: the change is narrowly scoped to the two CI-proven hotspot files that were still missing from the manifest.\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/50819\",\"user\":{\"login\":\"huntharo\",\"id\":5617868,\"profile_url\":\"https://github.com/huntharo\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5617868?v=4\"},\"labels\":[\"app: web-ui\",\"scripts\",\"maintainer\",\"size: L\"],\"head\":{\"ref\":\"codex/fix-unit-fast-oom-23327237169\",\"sha\":\"bf218ae75de2f5a1b7d7c6aad26e117532fa5deb\",\"repo\":{\"full_name\":\"huntharo/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"991eb2ef034fea1d6be52733d159a482aa0582af\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-20T03:55:35Z\",\"updated_at\":\"2026-03-21T18:30:50Z\",\"closed_at\":\"2026-03-21T18:30:50Z\"},{\"number\":51260,\"title\":\"Fix Discord `/codex_resume` picker expiration\",\"body\":\"## Summary\\n\\nDescribe the problem and fix in 2–5 bullets:\\n\\n- Problem: Discord `/codex_resume` picker buttons could immediately fail with `This component has expired.` even though the picker message had just been sent.\\n- Why it matters: resume-by-picker worked in Telegram but was broken in Discord, including the thread-in-channel-in-server flow used for real Codex resume.\\n- What changed: I kept the Discord fallback path from discarding explicit callback payloads, and I moved the Discord component registry onto process-global singleton maps so senders and listeners share the same component state across duplicate module instances.\\n- What did NOT change (scope boundary): I did not change the Codex app server picker generation logic; it was already emitting the expected `codexapp:` callbacks.\\n\\n## Change Type (select all)\\n\\n- [x] Bug fix\\n- [ ] Feature\\n- [ ] Refactor\\n- [ ] Docs\\n- [ ] Security hardening\\n- [ ] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [ ] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [ ] Memory / storage\\n- [x] Integrations\\n- [ ] API / contracts\\n- [x] UI / DX\\n- [ ] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\n- Closes #\\n- Related #\\n\\n## User-visible / Behavior Changes\\n\\nDiscord Codex resume pickers now stay clickable and can successfully resume a session instead of immediately showing `This component has expired.`\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? (`No`)\\n- Secrets/tokens handling changed? (`No`)\\n- New/changed network calls? (`No`)\\n- Command/tool execution surface changed? (`No`)\\n- Data access scope changed? (`No`)\\n- If any `Yes`, explain risk + mitigation:\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS\\n- Runtime/container: local dev checkout\\n- Model/provider: Codex app server integration\\n- Integration/channel (if any): Discord thread inside a channel inside a server\\n- Relevant config (redacted): Discord slash command flow with `/codex_resume`\\n\\n### Steps\\n\\n1. Run `/codex_resume` in a Discord thread.\\n2. Click `Browse Projects` or one of the recent-session buttons from the picker.\\n3. Repeat the interaction in the same Discord conversation.\\n\\n### Expected\\n\\n- The picker action is accepted and the selected Codex session view continues normally.\\n\\n### Actual\\n\\n- Before this fix, Discord responded with `This component has expired.` immediately after clicking the picker button.\\n\\n## Evidence\\n\\nAttach at least one:\\n\\n- [x] Failing test/log before + passing after\\n- [x] Trace/log snippets\\n- [x] Screenshot/recording\\n- [ ] Perf numbers (if relevant)\\n\\n## Human Verification (required)\\n\\nWhat you personally verified (not just CI), and how:\\n\\n- Verified scenarios: I verified the Discord end-to-end `/codex_resume` flow, including clicking the picker in a Discord thread and successfully resuming a session.\\n- Edge cases checked: I also verified the focused Discord component tests covering callback fallback behavior and duplicate-module registry sharing.\\n- What you did **not** verify: I did not run the full `pnpm test` suite.\\n\\n## Review Conversations\\n\\n- [ ] I replied to or resolved every bot review conversation I addressed in this PR.\\n- [x] I left unresolved only the conversations that still need reviewer or maintainer judgment.\\n\\nIf a bot review conversation is addressed by this PR, resolve that conversation yourself. Do not leave bot review conversation cleanup for maintainers.\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? (`Yes`)\\n- Config/env changes? (`No`)\\n- Migration needed? (`No`)\\n- If yes, exact upgrade steps:\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: revert the two Discord component commits on this branch\\n- Files/config to restore: `extensions/discord/src/components-registry.ts`, `extensions/discord/src/monitor/agent-components.ts`\\n- Known bad symptoms reviewers should watch for: Discord component clicks failing to resolve, or plugin-owned pickers regressing to immediate `expired` responses\\n\\n## Risks and Mitigations\\n\\nList only real risks for this PR. Add/remove entries as needed. If none, write `None`.\\n\\n- Risk: sharing the registry globally could make stale component state survive duplicate module loads longer than before.\\n- Mitigation: the existing TTL and explicit clear/consume paths are unchanged, and I added a regression test for cross-module sharing.\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51260\",\"user\":{\"login\":\"huntharo\",\"id\":5617868,\"profile_url\":\"https://github.com/huntharo\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/5617868?v=4\"},\"labels\":[\"channel: discord\",\"scripts\",\"maintainer\",\"size: L\"],\"assignees\":[\"huntharo\"],\"head\":{\"ref\":\"codex/fix-browse-projects-crash-discord\",\"sha\":\"76eb184dbe60cb1c05db02aab426a67b95095cc3\",\"repo\":{\"full_name\":\"huntharo/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-20T20:30:04Z\",\"updated_at\":\"2026-03-21T18:30:22Z\",\"closed_at\":\"2026-03-21T16:59:22Z\",\"merged_at\":\"2026-03-21T16:59:21Z\"},{\"number\":40126,\"title\":\"feat(memory): pluggable system prompt section for memory plugins\",\"body\":\"## Summary\\n\\n- Problem: The system prompt \\u0026#34;Memory Recall\\u0026#34; section is hardcoded in `system-prompt.ts`, providing memory-core-specific instructions. When a third-party memory plugin is active (via the exclusive memory slot), these instructions are misleading.\\n- Why it matters: Third-party memory plugins need to provide their own system prompt guidance for their tools instead of the hardcoded memory-core instructions.\\n- What changed: Added `registerMemoryPromptSection(builder)` to the plugin API. The active memory plugin registers its own system prompt builder callback. Moved the existing \\u0026#34;Memory Recall\\u0026#34; logic into `memory-core` as its registration. `buildMemorySection()` delegates to the registered callback.\\n- What did NOT change (scope boundary): Default behavior is identical — memory-core registers the same prompt content. No changes to memory tools, compaction, or other plugin APIs.\\n\\n## Change Type (select all)\\n\\n- [ ] Bug fix\\n- [x] Feature\\n- [ ] Refactor\\n- [ ] Docs\\n- [ ] Security hardening\\n- [ ] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [ ] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [x] Memory / storage\\n- [ ] Integrations\\n- [x] API / contracts\\n- [ ] UI / DX\\n- [ ] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\nNone\\n\\n## User-visible / Behavior Changes\\n\\nNone for default memory-core users. Memory plugins with `kind: \\u0026#34;memory\\u0026#34;` can now register a custom system prompt section via `api.registerMemoryPromptSection(builder)`.\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? No\\n- Secrets/tokens handling changed? No\\n- New/changed network calls? No\\n- Command/tool execution surface changed? No\\n- Data access scope changed? No\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS\\n- Runtime/container: Bun\\n- Model/provider: N/A (system prompt wiring)\\n- Integration/channel (if any): Telegram (for human test)\\n\\n### Steps\\n\\n1. Install a memory plugin that calls `api.registerMemoryPromptSection(builder)`\\n2. Start a session\\n3. Observe that the system prompt contains the plugin\\u0026#39;s memory section instead of the hardcoded one\\n\\n### Expected\\n\\n- With memory-core (default): system prompt contains \\u0026#34;Memory Recall\\u0026#34; section as before\\n- With custom memory plugin: system prompt contains the plugin\\u0026#39;s custom section\\n- With no memory plugin: memory section is omitted\\n\\n### Actual (before fix)\\n\\n- Hardcoded \\u0026#34;Memory Recall\\u0026#34; section always present regardless of active memory plugin\\n\\n## Evidence\\n\\n- [x] Failing test/log before + passing after\\n- [ ] Trace/log snippets\\n- [ ] Screenshot/recording\\n- [ ] Perf numbers (if relevant)\\n\\nNew unit tests in `prompt-section.test.ts`: delegation, citationsMode passthrough, no-builder returns empty, last-registration-wins. All 43 existing `system-prompt.test.ts` tests pass.\\n\\n## Human Verification (required)\\n\\n- Verified scenarios: Tested on two separate OpenClaw bots (Telegram) with memory-core active — memory instructions present as expected, no regression observed\\n- Edge cases checked: None\\n- What you did **not** verify: No memory plugin active (section omitted), custom third-party memory plugin providing its own section\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? Yes\\n- Config/env changes? No\\n- Migration needed? No\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: Revert the commit; hardcoded prompt returns\\n- Files/config to restore: N/A\\n- Known bad symptoms reviewers should watch for: Missing \\u0026#34;Memory Recall\\u0026#34; section in system prompt when memory-core is active\\n\\n## Risks and Mitigations\\n\\nNone. Additive API change. Default behavior is identical — memory-core registers the same prompt content it previously hardcoded.\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/40126\",\"user\":{\"login\":\"jarimustonen\",\"id\":1272053,\"profile_url\":\"https://github.com/jarimustonen\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/1272053?v=4\"},\"labels\":[\"extensions: lobster\",\"extensions: memory-core\",\"cli\",\"scripts\",\"agents\",\"size: M\"],\"assignees\":[\"jalehman\"],\"head\":{\"ref\":\"feat/memory-prompt-section-plugin-api\",\"sha\":\"5228d1937f037172762fa64b0f8749403f9ae85f\",\"repo\":{\"full_name\":\"jarimustonen/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"ebfc5f82408f0d592e45db62c61c4834d2cb07e6\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-08T17:38:46Z\",\"updated_at\":\"2026-03-21T18:20:45Z\",\"closed_at\":\"2026-03-21T18:20:45Z\",\"merged_at\":\"2026-03-21T18:20:45Z\"}]"}]}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01Tyc1d1VHGKfdSkLn9wExUK","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"Now I have all the information needed. Let me filter the merged PRs from the closed PR list:\n\nFrom the PR list, let me identify which ones have `merged_at` set (actually merged, not just closed):\n1. #34222 - \"fix: use content hash for memory flush dedup instead of compactionCount\" - @lml2468 - merged_at: 2026-03-21T19:06:26Z\n2. #51784 - \"fix: Control UI model picker provider prefix + skip register on snapshot loads\" - @Yaohua-Leo - closed but no merged_at shown... wait let me check. It says `\"merged\":false` for most... \n\n\nLooking more carefully at the data, I need to distinguish between the `merged` flag and the actual `merged_at` timestamp. #34222 shows `merged: false` but does have a `merged_at` value, which means it was actually merged despite what the flag says. For #51784, I'm not seeing a `merged_at` field in the output, so it appears to be closed without being merged.\n\nScanning through the rest of the pull requests, I can see the pattern now: #37080, #51260, and #40126 all have `merged_at` timestamps, indicating they were successfully merged, while the others like #51200 and #50819 only have `closed_at` values with no merge information.\n\nLooking at the merged ones sorted by merge time, I've got four PRs that actually made it through: #34222 merged at 19:06 by @lml2468, #37080 at 18:29 by @Matthew19990919, #40126 at 18:20 by @jarimustonen, and #51260 at 16:59 by @huntharo. The API returned ten results but only four were genuinely merged—the rest were just closed without merging. Since the user specifically asked for the five most recently merged PRs, I'm working with a limitation here where the query returned updated PRs rather than strictly merged ones.\n\nI need to fetch another page to find that fifth merged PR.","signature":" "}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":4181,"cache_creation_input_tokens":12952,"cache_read_input_tokens":17444,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":12952},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"dbe2d67f-3c73-448a-ac57-af065365776b"}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01Tyc1d1VHGKfdSkLn9wExUK","type":"message","role":"assistant","content":[{"type":"text","text":"I have enough data for open issues and the latest release, but I only found 4 merged PRs in the first batch. Let me grab one more to complete the top 5."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":4181,"cache_creation_input_tokens":12952,"cache_read_input_tokens":17444,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":12952},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"9c9e84e3-5a94-4c76-9d6f-298d96d52914"}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01Tyc1d1VHGKfdSkLn9wExUK","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01WJpqsShUpHXsehssEeSWgW","name":"mcp__github__list_pull_requests","input":{"owner":"openclaw","repo":"openclaw","state":"closed","sort":"updated","direction":"desc","perPage":20,"page":2},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":4181,"cache_creation_input_tokens":12952,"cache_read_input_tokens":17444,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":12952},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"4e0b301b-ae1e-4b0c-9216-d061b971fc37"}
{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01WJpqsShUpHXsehssEeSWgW","type":"tool_result","content":[{"type":"text","text":"[{\"number\":51754,\"title\":\"fix: add missing error checks in k8s deploy script\",\"body\":\"## Summary\\n\\n- Validate that the `manifests/` directory exists before attempting `kubectl apply -k`, providing a clear early error instead of a confusing kubectl failure\\n- Replace silent `|| true` on `kubectl rollout restart` with an explicit warning so operators know when the restart was skipped\\n- Add explicit error message when `kubectl apply -k` fails\\n- Fix indentation of `echo \\u0026#34;\\u0026#34;` inside the `--show-token` block\\n\\n## Test plan\\n\\n- [ ] Read through `scripts/k8s/deploy.sh` to confirm the changes are correct\\n- [ ] Verify the script still passes `bash -n scripts/k8s/deploy.sh` (syntax check)\\n- [ ] Confirm no CODEOWNERS-protected files are touched\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51754\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"gateway\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/script-improvements\",\"sha\":\"4f931cc67c28d2253a25ad0e6828d6ea09062988\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:50:35Z\",\"updated_at\":\"2026-03-21T16:54:46Z\",\"closed_at\":\"2026-03-21T16:50:58Z\"},{\"number\":51756,\"title\":\"docs: alphabetize provider and service lists\",\"body\":\"## Summary\\n- Sorts provider, channel, and service lists alphabetically across 9 documentation pages, per the project guideline: \\u0026#34;order services/providers alphabetically unless the section is explicitly describing runtime behavior\\u0026#34;\\n- Lists describing explicit runtime detection/fallback order (e.g., media auto-detect in `nodes/media-understanding.md`, web search auto-detection in `tools/web.md`) are intentionally left unchanged\\n- No content or link changes; only list ordering\\n\\n### Files changed\\n| File | What was reordered |\\n|---|---|\\n| `docs/providers/index.md` | Provider docs list (Venice before Vercel) |\\n| `docs/channels/index.md` | Supported channels list (Slack before Synology Chat) |\\n| `docs/gateway/configuration.md` | Channel setup accordion list |\\n| `docs/start/wizard.md` | Search provider names in tip + channel names in onboarding step |\\n| `docs/concepts/features.md` | Built-in channels list + web search provider list |\\n| `docs/start/hubs.md` | Providers + ingress channel links |\\n| `docs/platforms/index.md` | VPS \\u0026amp; hosting provider list |\\n| `docs/reference/api-usage-costs.md` | Audio/image provider lists + memory embedding provider list |\\n| `docs/concepts/model-providers.md` | Other bundled provider plugins list |\\n\\n## Test plan\\n- [ ] Verify all links still resolve correctly on Mintlify preview\\n- [ ] Confirm no runtime-behavior-ordered lists were changed\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51756\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"gateway\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/alphabetize-provider-lists-v2\",\"sha\":\"4f931cc67c28d2253a25ad0e6828d6ea09062988\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:51:56Z\",\"updated_at\":\"2026-03-21T16:54:45Z\",\"closed_at\":\"2026-03-21T16:52:21Z\"},{\"number\":51592,\"title\":\"fix(media): add HTML, XML, CSS MIME entries to detection map\",\"body\":\"## Summary\\n\\nAdd missing MIME type entries (`text/html`, `text/xml`, `text/css`, `application/xml`) to `EXT_BY_MIME` and `.htm` alias to `MIME_BY_EXT` in `src/media/mime.ts`.\\n\\n## Problem\\n\\nHTML files sent via WhatsApp (and potentially other channels) are silently dropped because `detectMime()` returns `undefined` for `.html` files. The `file-type` package cannot detect HTML via magic bytes, so the fallback to `MIME_BY_EXT` is the only detection path — but `.html` was missing from the map.\\n\\nThis also affects `.xml`, `.css`, and `.htm` files.\\n\\n## Fix\\n\\n- Add `text/html`, `text/xml`, `text/css`, and `application/xml` to `EXT_BY_MIME`\\n- Add `.htm` as an alias in `MIME_BY_EXT`\\n\\nAll 44 existing MIME tests pass.\\n\\nFixes #51561\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51592\",\"user\":{\"login\":\"honwee\",\"id\":26202308,\"profile_url\":\"https://github.com/honwee\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/26202308?v=4\"},\"labels\":[\"size: XS\"],\"head\":{\"ref\":\"fix/51561-whatsapp-html-mime\",\"sha\":\"3b3c4d35404f5fb848a2a1236308bcac18f44d9f\",\"repo\":{\"full_name\":\"honwee/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"5137a51307469721e509df011f0fbcfee1a5d21a\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T12:16:17Z\",\"updated_at\":\"2026-03-21T16:53:36Z\",\"closed_at\":\"2026-03-21T16:53:36Z\"},{\"number\":51752,\"title\":\"perf(status): lazy-load status summary, channel config, and gateway modules to reduce startup RSS\",\"body\":\"## Summary\\n\\nDefer importing `status.summary.js`, `channels/config-presence.js`, `gateway/call.js`, and `gateway/probe.js` from the `status --json` startup path. These modules are bundled into the 12 MB `auth-profiles` chunk; making them lazy avoids evaluating that chunk at startup, shaving ~10 MB off peak RSS (measured locally on macOS arm64).\\n\\n## Changes\\n\\n| File | Change |\\n|------|--------|\\n| `src/commands/status.scan.fast-json.ts` | Lazy-load `getStatusSummary` from `status.summary.js`; lazy-load `hasPotentialConfiguredChannels` from `channels/config-presence.js` with inline lightweight check |\\n| `src/commands/status.scan.shared.ts` | Lazy-load `gateway/call.js` and `gateway/probe.js` |\\n| `src/commands/status.summary.ts` | Lazy-load `hasPotentialConfiguredChannels` from `channels/config-presence.js` |\\n\\n## Measurements (local, macOS arm64)\\n\\n| Metric | Baseline (main) | With fix | Savings |\\n|--------|-----------------|----------|---------|\\n| RSS avg (3 runs) | **344.2 MB** | **334.7 MB** | **~9.5 MB (2.7%)** |\\n| RSS range | 339–349 MB | 331–337 MB | |\\n\\n## Context\\n\\nThe `status --json` command\\u0026#39;s build-smoke memory check was tightened from 925 MB to 400 MB in `c38295c7`. CI on Linux x86_64 reports 414 MB, 14 MB over the new limit. This PR addresses the overage by deferring heavy module evaluation on the `status --json` startup path.\\n\\nThe `auth-profiles` chunk (12 MB, 344K lines) remains loaded via side-effect imports from core modules (`redact`, `exec`) — eliminating this would require bundler-level chunk splitting (`manualChunks`) which currently triggers `[INEFFECTIVE_DYNAMIC_IMPORT]` hard errors.\\n\\n## Test plan\\n\\n- `pnpm build` — passes, no `[INEFFECTIVE_DYNAMIC_IMPORT]` warnings\\n- `node scripts/check-cli-startup-memory.mjs` — all 3 cases pass locally\\n- Scoped tests (`status-json.test.ts`, `status.scan.fast-json.test.ts`) — 4/4 pass\\n- `status.summary.test.ts` — 3 failures pre-existing on `main` (WhatsApp auth-store `resolveOAuthDir` issue)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51752\",\"user\":{\"login\":\"honwee\",\"id\":26202308,\"profile_url\":\"https://github.com/honwee\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/26202308?v=4\"},\"labels\":[\"commands\",\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/startup-memory-status-json-chunk-split\",\"sha\":\"544c4582f7d120ec7792d8fa2ce20eefaf0c014a\",\"repo\":{\"full_name\":\"honwee/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:48:44Z\",\"updated_at\":\"2026-03-21T16:52:08Z\",\"closed_at\":\"2026-03-21T16:49:05Z\"},{\"number\":51750,\"title\":\"docs: expand vLLM and SGLang provider plugin READMEs\",\"body\":\"## Summary\\n\\n- Expand `extensions/vllm/README.md` and `extensions/sglang/README.md` from 3-line stubs to full plugin READMEs\\n- Each README now covers: description, enabling, configuration, environment variables, and documentation links\\n- Follows the existing style used by other extension READMEs (e.g. `extensions/voice-call/README.md`)\\n\\n## Test plan\\n\\n- [ ] Verify Markdown renders correctly on GitHub\\n- [ ] Confirm no CODEOWNERS-protected files are touched\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51750\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/improve-provider-readmes\",\"sha\":\"e81cd5ab598d56c34e8c8e831caa94623be5edd7\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:47:20Z\",\"updated_at\":\"2026-03-21T16:48:52Z\",\"closed_at\":\"2026-03-21T16:47:45Z\"},{\"number\":51748,\"title\":\"docs: fix broken link and relative image paths\",\"body\":\"## Summary\\n\\n- Fix broken internal link `/configuration` -\\u0026gt; `/gateway/configuration` in `docs/plugins/manifest.md` (no doc page exists at `/configuration`; the canonical path is `/gateway/configuration`)\\n- Convert 6 relative image paths (`../images/feishu-*.png`) to Mintlify-standard root-relative paths (`/images/feishu-*.png`) in `docs/channels/feishu.md`\\n\\n## Test plan\\n\\n- [ ] Verify the `/gateway/configuration` link resolves correctly on the docs site\\n- [ ] Verify Feishu setup images render correctly with root-relative paths\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51748\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"channel: feishu\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-http-links\",\"sha\":\"1c8bdf74ab27e523a5b81f93f05a5c65efcaadf1\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:45:09Z\",\"updated_at\":\"2026-03-21T16:45:46Z\",\"closed_at\":\"2026-03-21T16:45:33Z\"},{\"number\":51746,\"title\":\"fix(webchat): add clipboard fallback for Edge browser copy button\",\"body\":\"## Summary\\n- Add `execCommand(\\u0026#39;copy\\u0026#39;)` fallback when `navigator.clipboard.writeText` fails\\n- Edge browser blocks the Clipboard API when the page is not in a secure context or clipboard permission is denied\\n- The fallback creates a temporary textarea, selects the content, and uses the legacy `document.execCommand(\\u0026#39;copy\\u0026#39;)` method\\n\\n## Motivation\\nUsers on Edge browser (Windows 11) cannot copy code blocks via the copy button — nothing happens on click. The Clipboard API silently fails in Edge\\u0026#39;s stricter security context handling.\\n\\nCloses #51664\\n\\n## Test plan\\n- [ ] Verify copy button works in Edge browser (Windows)\\n- [ ] Verify copy button still works in Chrome/Firefox/Safari (no regression)\\n- [x] Fallback only triggers when `navigator.clipboard.writeText` throws\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51746\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"app: web-ui\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/webchat-copy-edge-fallback\",\"sha\":\"5fb3036e1595094b90ec190d5f905b0caf3f9be1\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:40:43Z\",\"updated_at\":\"2026-03-21T16:44:21Z\",\"closed_at\":\"2026-03-21T16:41:07Z\"},{\"number\":51744,\"title\":\"feat(brave): add custom baseUrl support for Brave Search API\",\"body\":\"## Summary\\n- Add `baseUrl` option to `BraveConfig` so users can configure a custom Brave Search API endpoint\\n- Replace hardcoded `BRAVE_SEARCH_ENDPOINT` / `BRAVE_LLM_CONTEXT_ENDPOINT` with a configurable base URL that defaults to `https://api.search.brave.com`\\n- Pass `baseUrl` through to both `runBraveLlmContextSearch` and `runBraveWebSearch`\\n\\n### Configuration\\n\\n```json5\\n{\\n  tools: {\\n    web: {\\n      search: {\\n        provider: \\u0026#34;brave\\u0026#34;,\\n        apiKey: \\u0026#34;your-api-key\\u0026#34;,\\n        brave: {\\n          baseUrl: \\u0026#34;https://your-proxy-domain.com\\u0026#34;\\n        }\\n      }\\n    }\\n  }\\n}\\n```\\n\\n## Motivation\\nUsers in regions where `api.search.brave.com` is not directly accessible (e.g. mainland China) need to route through reverse proxies like Cloudflare Workers. This change allows configuring the base URL without code modifications.\\n\\nCloses #51658\\n\\n## Test plan\\n- [x] Verified default behavior unchanged (uses `https://api.search.brave.com` when `baseUrl` is not set)\\n- [x] Both web search and LLM context endpoints use the configured base URL\\n- [ ] Manual test with a reverse proxy endpoint\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51744\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/brave-custom-base-url-v2\",\"sha\":\"c8211e610deca805807fd6e131771f72467bee29\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:38:14Z\",\"updated_at\":\"2026-03-21T16:43:04Z\",\"closed_at\":\"2026-03-21T16:38:48Z\"},{\"number\":51747,\"title\":\"fix: use American English in feishu docx-color-text comment\",\"body\":\"Replace \\u0026#39;recognised colour\\u0026#39; with \\u0026#39;recognized color\\u0026#39; in feishu extension per coding style guidelines.\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51747\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"channel: feishu\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/feishu-american-english-v2\",\"sha\":\"75277a26d593474b91992add7d6046a2cd1ccae5\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:41:21Z\",\"updated_at\":\"2026-03-21T16:41:54Z\",\"closed_at\":\"2026-03-21T16:41:42Z\"},{\"number\":51740,\"title\":\"feat(imessage): add bounded investigation intake\",\"body\":\"## Summary\\n- add a bounded iMessage investigation intake path under `agents.contentRouting.investigation`\\n- detect explicit investigation requests via fast path and honor LLM `agent:investigate` classifications\\n- run bounded investigations through a new orchestrator, reply in iMessage, and optionally promote strong findings to Zulip using existing forwarding infrastructure\\n- keep investigation sessions separate from the normal DM session with an `:investigation` suffix\\n- avoid investigation follow-up stickiness so promoted investigation threads do not hijack later unrelated messages\\n\\n## Validation\\n- `pnpm test src/config/config.schema-regressions.test.ts src/lionroot/routing/content-route.test.ts src/lionroot/routing/investigation-orchestrator.test.ts src/lionroot/content-intake.test.ts`\\n- `pnpm test src/lionroot/content-intake.test.ts src/lionroot/routing/content-intake-pipe.test.ts src/lionroot/routing/investigation-orchestrator.test.ts src/lionroot/routing/content-route.test.ts src/config/config.schema-regressions.test.ts`\\n- `pnpm test src/imessage/monitor/inbound-processing.test.ts src/lionroot/routing/content-intake-pipe.test.ts`\\n- `pnpm build`\\n- `pnpm exec oxlint --type-aware src/lionroot/content-intake.ts src/lionroot/routing/content-route.ts src/lionroot/routing/investigation-orchestrator.ts src/lionroot/content-intake.test.ts src/lionroot/routing/content-route.test.ts src/lionroot/routing/investigation-orchestrator.test.ts src/config/config.schema-regressions.test.ts src/lionroot/routing/content-intake-pipe.test.ts`\\n\\n## Notes\\n- a repo-wide `pnpm exec tsc --noEmit --pretty false` still reports existing unrelated failures under `extensions/*`, `ui/*`, and some `src/cron/*`; those were not introduced by this branch.\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51740\",\"user\":{\"login\":\"lionrooter\",\"id\":10135832,\"profile_url\":\"https://github.com/lionrooter\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/10135832?v=4\"},\"labels\":[\"docs\",\"channel: bluebubbles\",\"channel: googlechat\",\"channel: imessage\",\"channel: line\",\"channel: matrix\",\"channel: mattermost\",\"channel: msteams\",\"channel: nextcloud-talk\",\"channel: nostr\",\"channel: tlon\",\"channel: voice-call\",\"channel: zalo\",\"app: web-ui\",\"gateway\",\"cli\",\"security\",\"scripts\",\"commands\",\"agents\",\"channel: feishu\",\"channel: irc\",\"size: XL\"],\"head\":{\"ref\":\"imessage-proactive-workflow\",\"sha\":\"22eb069c296448e4dafe49c50afd7a8aaca2663c\",\"repo\":{\"full_name\":\"lionrooter/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:34:26Z\",\"updated_at\":\"2026-03-21T16:40:10Z\",\"closed_at\":\"2026-03-21T16:34:50Z\"},{\"number\":51745,\"title\":\"fix: use American English spelling in extension comments\",\"body\":\"## Summary\\n- Replace British English spellings with American English in code comments, per repo style guide (CLAUDE.md: \\u0026#34;use American spelling and grammar\\u0026#34;)\\n- `extensions/telegram/src/bot-native-command-menu.ts`: \\u0026#34;behaviour\\u0026#34; -\\u0026gt; \\u0026#34;behavior\\u0026#34;\\n- `extensions/feishu/src/docx-color-text.ts`: \\u0026#34;recognised colour\\u0026#34; -\\u0026gt; \\u0026#34;recognized color\\u0026#34;\\n\\n## Test plan\\n- [x] Comment-only changes, no logic affected\\n- [x] Pre-commit hooks (format, lint, type-check) pass\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51745\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"channel: telegram\",\"channel: feishu\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/more-american-english\",\"sha\":\"095a23dc9b488c3fe5651d02006226e90d0c5e20\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:39:13Z\",\"updated_at\":\"2026-03-21T16:39:53Z\",\"closed_at\":\"2026-03-21T16:39:39Z\"},{\"number\":51741,\"title\":\"docs: expand vLLM and SGLang extension READMEs\",\"body\":\"## Summary\\n- Expanded `extensions/vllm/README.md` from 3-line stub to full README with enable, authenticate, config, auto-discovery, and docs link sections\\n- Expanded `extensions/sglang/README.md` with the same structure\\n- Both are self-hosted OpenAI-compatible provider plugins with similar patterns\\n\\n## Test plan\\n- [ ] Verify READMEs render correctly on GitHub\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51741\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/improve-extension-readme\",\"sha\":\"fccc991799a5c10040684c2adceb62c2f55f9315\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:35:40Z\",\"updated_at\":\"2026-03-21T16:39:27Z\",\"closed_at\":\"2026-03-21T16:36:01Z\"},{\"number\":51738,\"title\":\"docs: fix broken and circular internal links\",\"body\":\"## Summary\\n- `docs/plugins/manifest.md`: fixed broken `/configuration` link to canonical `/gateway/configuration`\\n- `docs/plugins/architecture.md`: replaced two circular links to `/tools/capability-cookbook` (which redirects back to `/plugins/architecture`) with same-page anchor links to the relevant sections (`#adding-a-new-capability` and `#capability-checklist`)\\n- `docs/start/hubs.md`: updated link text to match actual page title (\\u0026#34;Adding capabilities\\u0026#34;)\\n\\n## Test plan\\n- [ ] Verify all three fixed links resolve correctly on docs.openclaw.ai\\n- [ ] Confirm the same-page anchors in architecture.md work\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51738\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-broken-doc-links\",\"sha\":\"6312729c8c412a3026929f3663cab3eb720948c8\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:32:45Z\",\"updated_at\":\"2026-03-21T16:33:52Z\",\"closed_at\":\"2026-03-21T16:33:12Z\"},{\"number\":51727,\"title\":\"docs: fix e.g. and etc. punctuation across documentation\",\"body\":\"## Summary\\n- Add missing commas after \\u0026#34;e.g.\\u0026#34; and missing periods after \\u0026#34;etc\\u0026#34; across documentation\\n- Follows standard American English punctuation conventions per repo coding style guidelines\\n\\n## Test plan\\n- [x] Content-only changes — no code affected\\n- [x] No changes to zh-CN translated docs\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51727\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-eg-etc-punctuation\",\"sha\":\"7bc7c4210ae604d7755f37f3109d89e9d50b7d70\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:24:02Z\",\"updated_at\":\"2026-03-21T16:30:15Z\",\"closed_at\":\"2026-03-21T16:24:26Z\"},{\"number\":51734,\"title\":\"fix: use American English \\u0026#34;behavior\\u0026#34; in telegram bot-native-command-menu\",\"body\":\"## Summary\\n- Replace British English `behaviour` with American English `behavior` in `extensions/telegram/src/bot-native-command-menu.ts`\\n- Per coding style guideline: \\u0026#34;use American English spelling and grammar in code, comments, docs, and UI strings\\u0026#34;\\n\\n## Test plan\\n- [x] Comment-only change, no logic affected\\n- [x] `pnpm check` passes\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51734\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"channel: telegram\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/telegram-bot-native-command-menu\",\"sha\":\"3b513920cdcd6ce66cf8ceba1ac66162cc34135d\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"2fe0efc9e14db1c519962059fb472e8f983313e7\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:27:55Z\",\"updated_at\":\"2026-03-21T16:28:27Z\",\"closed_at\":\"2026-03-21T16:28:17Z\"},{\"number\":27727,\"title\":\"fix: compaction safeguard summary budget\",\"body\":\"## Summary\\n\\nDescribe the problem and fix in 2–5 bullets:\\n\\n- Problem: `compaction-safeguard` can append large file operation lists (`read-files` / `modified-files`) and other metadata to the compaction summary, which can make the summary itself too large.\\n- Why it matters: Oversized compaction summaries reduce the effectiveness of compaction and can consume context budget that should be preserved for future turns.\\n- What changed: Added bounded formatting for file operation sections (with `...and N more`) and a final compaction summary length cap with a truncation marker; added tests for both behaviors.\\n- What did NOT change (scope boundary): No changes to compaction triggering, token estimation, summarization model selection, or pruning strategy logic.\\n\\n## Change Type (select all)\\n\\n- [x] Bug fix\\n- [ ] Feature\\n- [ ] Refactor\\n- [ ] Docs\\n- [ ] Security hardening\\n- [ ] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [x] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [ ] Memory / storage\\n- [ ] Integrations\\n- [ ] API / contracts\\n- [ ] UI / DX\\n- [ ] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\n- Closes #\\n- Related #\\n\\n## User-visible / Behavior Changes\\n\\n- Compaction summaries now truncate oversized file operation sections and may include `...and N more`.\\n- Compaction summaries now include a truncation marker when the final summary exceeds the configured internal size budget.\\n- No config/default changes exposed to users.\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? (`No`)\\n- Secrets/tokens handling changed? (`No`)\\n- New/changed network calls? (`No`)\\n- Command/tool execution surface changed? (`No`)\\n- Data access scope changed? (`No`)\\n- If any `Yes`, explain risk + mitigation:\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS (local dev machine)\\n- Runtime/container: local Node binary (`.tools/node-v22.22.0-darwin-arm64`)\\n- Model/provider: N/A (unit tests only)\\n- Integration/channel (if any): N/A\\n- Relevant config (redacted): N/A\\n\\n### Steps\\n\\n1. Modify `src/agents/pi-extensions/compaction-safeguard.ts` to cap file-op summary size and final compaction summary length.\\n2. Add tests in `src/agents/pi-extensions/compaction-safeguard.test.ts` covering file-op truncation and summary truncation marker.\\n3. Run `PATH=\\u0026#34;$PWD/.tools/node-v22.22.0-darwin-arm64/bin:$PATH\\u0026#34; npm exec vitest run src/agents/pi-extensions/compaction-safeguard.test.ts`.\\n\\n### Expected\\n\\n- File operation summary output is bounded and includes `...and N more` when truncated.\\n- Final compaction summary is capped and ends with a truncation marker when oversized.\\n- Test file passes.\\n\\n### Actual\\n\\n- Behavior matches expected.\\n- `compaction-safeguard` test file passes (24 tests).\\n\\n## Evidence\\n\\nAttach at least one:\\n\\n- [x] Failing test/log before + passing after\\n- [x] Trace/log snippets\\n- [ ] Screenshot/recording\\n- [ ] Perf numbers (if relevant)\\n\\n## Human Verification (required)\\n\\nWhat you personally verified (not just CI), and how:\\n\\n- Verified scenarios: Ran `src/agents/pi-extensions/compaction-safeguard.test.ts` locally after changes; confirmed new tests pass and existing tests remain green.\\n- Edge cases checked: Very large file-op lists trigger truncation; oversized summary gets capped and appends truncation marker.\\n- What you did **not** verify: End-to-end compaction flow against a live provider/model; impact on real long-running sessions.\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? (`Yes`)\\n- Config/env changes? (`No`)\\n- Migration needed? (`No`)\\n- If yes, exact upgrade steps:\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: Revert commit `afc741b` (or revert the PR commit) to restore previous compaction summary behavior.\\n- Files/config to restore: `src/agents/pi-extensions/compaction-safeguard.ts`, `src/agents/pi-extensions/compaction-safeguard.test.ts`\\n- Known bad symptoms reviewers should watch for: Missing file-op metadata in compaction summaries when lists are unexpectedly small; malformed truncation marker placement; over-aggressive truncation of summaries.\\n\\n## Risks and Mitigations\\n\\nList only real risks for this PR. Add/remove entries as needed. If none, write `None`.\\n\\n- Risk: Truncation budget may cut off useful compaction context in edge cases with unusually dense metadata.\\n  - Mitigation: File-op sections and final summary use separate caps; truncation is explicit via marker / `...and N more`, and core compaction logic is unchanged.\\n- Risk: New formatting helper could produce malformed section tags if the budget is too small.\\n  - Mitigation: Added unit tests for bounded file-op formatting and final summary capping behavior.\\n\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/27727\",\"user\":{\"login\":\"Pandadadadazxf\",\"id\":200469161,\"profile_url\":\"https://github.com/Pandadadadazxf\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/200469161?v=4\"},\"labels\":[\"channel: telegram\",\"agents\",\"size: M\",\"extensions: openai\"],\"assignees\":[\"jalehman\"],\"requested_reviewers\":[\"jalehman\"],\"head\":{\"ref\":\"fix/compaction-safeguard-summary-budget\",\"sha\":\"a7ab64e3940f89ceaa4d2ab7b8dbbdec8d05ff90\",\"repo\":{\"full_name\":\"Pandadadadazxf/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-02-26T16:15:37Z\",\"updated_at\":\"2026-03-21T16:28:18Z\",\"closed_at\":\"2026-03-21T16:27:51Z\",\"merged_at\":\"2026-03-21T16:27:51Z\"},{\"number\":51726,\"title\":\"docs: add README for synology-chat extension\",\"body\":\"## Summary\\n- Added comprehensive README for `extensions/synology-chat/`\\n- Covers install (local + npm), config (single and multi-account), config field reference, environment variable support, and step-by-step setup instructions\\n- Follows the style of other extension READMEs (e.g., `extensions/twitch/README.md`)\\n\\n## Test plan\\n- [ ] Verify README renders correctly on GitHub\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51726\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/synology-chat-readme\",\"sha\":\"ddd8309ca31540fbd47ef5384026964ca64dc48d\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:23:46Z\",\"updated_at\":\"2026-03-21T16:27:40Z\",\"closed_at\":\"2026-03-21T16:24:09Z\"},{\"number\":51725,\"title\":\"docs: fix e.g. and etc. punctuation across documentation\",\"body\":\"## Summary\\n- Add missing commas after `e.g.` (117 instances) and missing periods after `etc` (15 instances) across 68 documentation files\\n- Per American English punctuation conventions (Chicago Manual of Style)\\n\\n## Test plan\\n- [x] Content-only change — no code affected\\n- [x] `pnpm check` passes\\n- [x] No changes to zh-CN translated docs\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51725\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-eg-etc-punctuation-v2\",\"sha\":\"7bc7c4210ae604d7755f37f3109d89e9d50b7d70\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:23:40Z\",\"updated_at\":\"2026-03-21T16:27:28Z\",\"closed_at\":\"2026-03-21T16:24:03Z\"},{\"number\":51730,\"title\":\"docs: use American English \\u0026#34;summarizes\\u0026#34; in compaction.md\",\"body\":\"## Summary\\n- Replace British English `summarises` with American English `summarizes` in compaction docs\\n- Per coding style guideline: \\u0026#34;use American English spelling\\u0026#34;\\n\\n## Test plan\\n- [x] Single-word spelling fix, no logic change\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51730\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-compaction-spelling\",\"sha\":\"374bb92f68bd210440ba8b65c61100341244bc1f\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:26:29Z\",\"updated_at\":\"2026-03-21T16:27:01Z\",\"closed_at\":\"2026-03-21T16:26:55Z\"},{\"number\":51721,\"title\":\"web UI: fix context notice using accumulated inputTokens instead of p…\",\"body\":\"web UI: fix context notice using accumulated inputTokens instead of prompt snapshot\\n\\nThe context-usage banner in the web UI fell back to inputTokens when totalTokens was missing. inputTokens is accumulated across all API calls in a run (tool-use loops, compaction retries), so it overstates actual context window utilization -- e.g. showing \\u0026#34;100% context used 757.3k / 200k\\u0026#34; when the real prompt snapshot is only 46k/200k (23%).\\n\\nDrop the inputTokens fallback so the banner only fires when a genuine prompt snapshot (totalTokens) is available.\\n\\n## Summary\\n\\n- **Problem:** The web UI context-usage banner fell back to `inputTokens` (accumulated across all API calls in a run) when `totalTokens` (prompt snapshot) was missing, showing false alarms like \\u0026#34;100% context used 757.3k / 200k\\u0026#34;.\\n- **Why it matters:** Users see a scary red \\u0026#34;context full\\u0026#34; warning when the actual context window is only 23% used, creating confusion and unnecessary session resets.\\n- **What changed:** Removed the `inputTokens` fallback in `renderContextNotice` so the banner only fires when a genuine `totalTokens` prompt snapshot is available. Added a test covering the missing-`totalTokens` edge case.\\n- **What did NOT change (scope boundary):** The status card text (`Context: 46k/200k (23%)`) was already correct and is untouched. Token accumulation, session storage, and per-message context % in grouped-render are unchanged.\\n\\n## Change Type (select all)\\n\\n- [x] Bug fix\\n- [ ] Feature\\n- [ ] Refactor required for the fix\\n- [ ] Docs\\n- [ ] Security hardening\\n- [ ] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [ ] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [ ] Memory / storage\\n- [ ] Integrations\\n- [ ] API / contracts\\n- [x] UI / DX\\n- [ ] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\n- Related #(none identified)\\n\\n## User-visible / Behavior Changes\\n\\n- The amber/red \\u0026#34;X% context used\\u0026#34; banner in the web UI no longer appears when `totalTokens` is unavailable, instead of falsely reporting accumulated `inputTokens` as context utilization.\\n- When `totalTokens` is present and genuinely high (\\u0026gt;=85% of context window), the banner continues to display correctly.\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? `No`\\n- Secrets/tokens handling changed? `No`\\n- New/changed network calls? `No`\\n- Command/tool execution surface changed? `No`\\n- Data access scope changed? `No`\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS\\n- Runtime/container: Bun / Node 22+\\n- Model/provider: minimax-portal/MiniMax-M2.5 (any provider reproduces)\\n- Integration/channel: Web UI (control-ui)\\n- Relevant config: default context window 200k\\n\\n### Steps\\n\\n1. Start a session with a model that has a 200k context window.\\n2. Run several tool-use loops so `inputTokens` accumulates well past 200k (e.g. 757k).\\n3. Observe the context notice banner at the bottom of the chat view.\\n\\n### Expected\\n\\n- Banner hidden (or showing accurate context % based on prompt snapshot).\\n\\n### Actual (before fix)\\n\\n- Banner shows \\u0026#34;100% context used 757.3k / 200k\\u0026#34; even though real context utilization is 23%.\\n\\n## Evidence\\n\\n- [x] Failing test/log before + passing after\\n  - Existing test \\u0026#34;hides the context notice when only cumulative inputTokens exceed the limit\\u0026#34; already encoded the correct expectation and passes with the fix.\\n  - New test \\u0026#34;hides the context notice when totalTokens is missing even if inputTokens is high\\u0026#34; covers the undefined-totalTokens edge case.\\n- [x] Screenshot/recording\\n  - User-provided screenshot showing the mismatch between status card (23%) and banner (100%).\\n\\n## Human Verification (required)\\n\\n- **Verified scenarios:** All 29 chat view tests pass (28 existing + 1 new). Format and lint clean on touched files.\\n- **Edge cases checked:** `totalTokens` undefined with high `inputTokens`; `totalTokens` present and above 85% threshold; `totalTokens` present but below threshold.\\n- **What you did not verify:** Live web UI end-to-end with a real session (test-only verification). Pre-existing `src/tts/tts.ts` format failure on `main` unrelated to this change.\\n\\n## Review Conversations\\n\\n- [x] I replied to or resolved every bot review conversation I addressed in this PR.\\n- [x] I left unresolved only the conversations that still need reviewer or maintainer judgment.\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? `Yes`\\n- Config/env changes? `No`\\n- Migration needed? `No`\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: Revert the one-line change in `ui/src/ui/views/chat.ts` line 258 to restore `?? session?.inputTokens`.\\n- Files/config to restore: `ui/src/ui/views/chat.ts`\\n- Known bad symptoms reviewers should watch for: Context notice never appearing even when context is genuinely near capacity (would require `totalTokens` to be permanently missing for active sessions — unlikely given session-usage persistence).\\n\\n## Risks and Mitigations\\n\\n- **Risk:** If `totalTokens` is frequently `undefined` for active sessions, users lose the context-full warning entirely.\\n  - **Mitigation:** `totalTokens` is populated by `deriveSessionTotalTokens` on every reply with `lastCallUsage` or `promptTokens`. It is only missing on cold/stale sessions where context utilization is unknown anyway — showing nothing is more correct than showing a false alarm.\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51721\",\"user\":{\"login\":\"BunsDev\",\"id\":68980965,\"profile_url\":\"https://github.com/BunsDev\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/68980965?v=4\"},\"labels\":[\"app: web-ui\",\"maintainer\",\"size: XS\"],\"assignees\":[\"BunsDev\"],\"head\":{\"ref\":\"fix/context-notice-token-fallback\",\"sha\":\"037b4cb6fcc5fb613a235058751ca3868f97e518\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"15fd11032daf7de3a9e450b4d90f3825075f1957\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:15:26Z\",\"updated_at\":\"2026-03-21T16:17:25Z\",\"closed_at\":\"2026-03-21T16:16:33Z\",\"merged_at\":\"2026-03-21T16:16:33Z\"}]"}]}]},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"641ff0d3-c0e6-466a-94ed-cde326f7e162","timestamp":"2026-03-21T19:26:46.695Z","tool_use_result":[{"type":"text","text":"[{\"number\":51754,\"title\":\"fix: add missing error checks in k8s deploy script\",\"body\":\"## Summary\\n\\n- Validate that the `manifests/` directory exists before attempting `kubectl apply -k`, providing a clear early error instead of a confusing kubectl failure\\n- Replace silent `|| true` on `kubectl rollout restart` with an explicit warning so operators know when the restart was skipped\\n- Add explicit error message when `kubectl apply -k` fails\\n- Fix indentation of `echo \\u0026#34;\\u0026#34;` inside the `--show-token` block\\n\\n## Test plan\\n\\n- [ ] Read through `scripts/k8s/deploy.sh` to confirm the changes are correct\\n- [ ] Verify the script still passes `bash -n scripts/k8s/deploy.sh` (syntax check)\\n- [ ] Confirm no CODEOWNERS-protected files are touched\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51754\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"gateway\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/script-improvements\",\"sha\":\"4f931cc67c28d2253a25ad0e6828d6ea09062988\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:50:35Z\",\"updated_at\":\"2026-03-21T16:54:46Z\",\"closed_at\":\"2026-03-21T16:50:58Z\"},{\"number\":51756,\"title\":\"docs: alphabetize provider and service lists\",\"body\":\"## Summary\\n- Sorts provider, channel, and service lists alphabetically across 9 documentation pages, per the project guideline: \\u0026#34;order services/providers alphabetically unless the section is explicitly describing runtime behavior\\u0026#34;\\n- Lists describing explicit runtime detection/fallback order (e.g., media auto-detect in `nodes/media-understanding.md`, web search auto-detection in `tools/web.md`) are intentionally left unchanged\\n- No content or link changes; only list ordering\\n\\n### Files changed\\n| File | What was reordered |\\n|---|---|\\n| `docs/providers/index.md` | Provider docs list (Venice before Vercel) |\\n| `docs/channels/index.md` | Supported channels list (Slack before Synology Chat) |\\n| `docs/gateway/configuration.md` | Channel setup accordion list |\\n| `docs/start/wizard.md` | Search provider names in tip + channel names in onboarding step |\\n| `docs/concepts/features.md` | Built-in channels list + web search provider list |\\n| `docs/start/hubs.md` | Providers + ingress channel links |\\n| `docs/platforms/index.md` | VPS \\u0026amp; hosting provider list |\\n| `docs/reference/api-usage-costs.md` | Audio/image provider lists + memory embedding provider list |\\n| `docs/concepts/model-providers.md` | Other bundled provider plugins list |\\n\\n## Test plan\\n- [ ] Verify all links still resolve correctly on Mintlify preview\\n- [ ] Confirm no runtime-behavior-ordered lists were changed\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51756\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"gateway\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/alphabetize-provider-lists-v2\",\"sha\":\"4f931cc67c28d2253a25ad0e6828d6ea09062988\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:51:56Z\",\"updated_at\":\"2026-03-21T16:54:45Z\",\"closed_at\":\"2026-03-21T16:52:21Z\"},{\"number\":51592,\"title\":\"fix(media): add HTML, XML, CSS MIME entries to detection map\",\"body\":\"## Summary\\n\\nAdd missing MIME type entries (`text/html`, `text/xml`, `text/css`, `application/xml`) to `EXT_BY_MIME` and `.htm` alias to `MIME_BY_EXT` in `src/media/mime.ts`.\\n\\n## Problem\\n\\nHTML files sent via WhatsApp (and potentially other channels) are silently dropped because `detectMime()` returns `undefined` for `.html` files. The `file-type` package cannot detect HTML via magic bytes, so the fallback to `MIME_BY_EXT` is the only detection path — but `.html` was missing from the map.\\n\\nThis also affects `.xml`, `.css`, and `.htm` files.\\n\\n## Fix\\n\\n- Add `text/html`, `text/xml`, `text/css`, and `application/xml` to `EXT_BY_MIME`\\n- Add `.htm` as an alias in `MIME_BY_EXT`\\n\\nAll 44 existing MIME tests pass.\\n\\nFixes #51561\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51592\",\"user\":{\"login\":\"honwee\",\"id\":26202308,\"profile_url\":\"https://github.com/honwee\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/26202308?v=4\"},\"labels\":[\"size: XS\"],\"head\":{\"ref\":\"fix/51561-whatsapp-html-mime\",\"sha\":\"3b3c4d35404f5fb848a2a1236308bcac18f44d9f\",\"repo\":{\"full_name\":\"honwee/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"5137a51307469721e509df011f0fbcfee1a5d21a\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T12:16:17Z\",\"updated_at\":\"2026-03-21T16:53:36Z\",\"closed_at\":\"2026-03-21T16:53:36Z\"},{\"number\":51752,\"title\":\"perf(status): lazy-load status summary, channel config, and gateway modules to reduce startup RSS\",\"body\":\"## Summary\\n\\nDefer importing `status.summary.js`, `channels/config-presence.js`, `gateway/call.js`, and `gateway/probe.js` from the `status --json` startup path. These modules are bundled into the 12 MB `auth-profiles` chunk; making them lazy avoids evaluating that chunk at startup, shaving ~10 MB off peak RSS (measured locally on macOS arm64).\\n\\n## Changes\\n\\n| File | Change |\\n|------|--------|\\n| `src/commands/status.scan.fast-json.ts` | Lazy-load `getStatusSummary` from `status.summary.js`; lazy-load `hasPotentialConfiguredChannels` from `channels/config-presence.js` with inline lightweight check |\\n| `src/commands/status.scan.shared.ts` | Lazy-load `gateway/call.js` and `gateway/probe.js` |\\n| `src/commands/status.summary.ts` | Lazy-load `hasPotentialConfiguredChannels` from `channels/config-presence.js` |\\n\\n## Measurements (local, macOS arm64)\\n\\n| Metric | Baseline (main) | With fix | Savings |\\n|--------|-----------------|----------|---------|\\n| RSS avg (3 runs) | **344.2 MB** | **334.7 MB** | **~9.5 MB (2.7%)** |\\n| RSS range | 339–349 MB | 331–337 MB | |\\n\\n## Context\\n\\nThe `status --json` command\\u0026#39;s build-smoke memory check was tightened from 925 MB to 400 MB in `c38295c7`. CI on Linux x86_64 reports 414 MB, 14 MB over the new limit. This PR addresses the overage by deferring heavy module evaluation on the `status --json` startup path.\\n\\nThe `auth-profiles` chunk (12 MB, 344K lines) remains loaded via side-effect imports from core modules (`redact`, `exec`) — eliminating this would require bundler-level chunk splitting (`manualChunks`) which currently triggers `[INEFFECTIVE_DYNAMIC_IMPORT]` hard errors.\\n\\n## Test plan\\n\\n- `pnpm build` — passes, no `[INEFFECTIVE_DYNAMIC_IMPORT]` warnings\\n- `node scripts/check-cli-startup-memory.mjs` — all 3 cases pass locally\\n- Scoped tests (`status-json.test.ts`, `status.scan.fast-json.test.ts`) — 4/4 pass\\n- `status.summary.test.ts` — 3 failures pre-existing on `main` (WhatsApp auth-store `resolveOAuthDir` issue)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51752\",\"user\":{\"login\":\"honwee\",\"id\":26202308,\"profile_url\":\"https://github.com/honwee\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/26202308?v=4\"},\"labels\":[\"commands\",\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/startup-memory-status-json-chunk-split\",\"sha\":\"544c4582f7d120ec7792d8fa2ce20eefaf0c014a\",\"repo\":{\"full_name\":\"honwee/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:48:44Z\",\"updated_at\":\"2026-03-21T16:52:08Z\",\"closed_at\":\"2026-03-21T16:49:05Z\"},{\"number\":51750,\"title\":\"docs: expand vLLM and SGLang provider plugin READMEs\",\"body\":\"## Summary\\n\\n- Expand `extensions/vllm/README.md` and `extensions/sglang/README.md` from 3-line stubs to full plugin READMEs\\n- Each README now covers: description, enabling, configuration, environment variables, and documentation links\\n- Follows the existing style used by other extension READMEs (e.g. `extensions/voice-call/README.md`)\\n\\n## Test plan\\n\\n- [ ] Verify Markdown renders correctly on GitHub\\n- [ ] Confirm no CODEOWNERS-protected files are touched\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51750\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/improve-provider-readmes\",\"sha\":\"e81cd5ab598d56c34e8c8e831caa94623be5edd7\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:47:20Z\",\"updated_at\":\"2026-03-21T16:48:52Z\",\"closed_at\":\"2026-03-21T16:47:45Z\"},{\"number\":51748,\"title\":\"docs: fix broken link and relative image paths\",\"body\":\"## Summary\\n\\n- Fix broken internal link `/configuration` -\\u0026gt; `/gateway/configuration` in `docs/plugins/manifest.md` (no doc page exists at `/configuration`; the canonical path is `/gateway/configuration`)\\n- Convert 6 relative image paths (`../images/feishu-*.png`) to Mintlify-standard root-relative paths (`/images/feishu-*.png`) in `docs/channels/feishu.md`\\n\\n## Test plan\\n\\n- [ ] Verify the `/gateway/configuration` link resolves correctly on the docs site\\n- [ ] Verify Feishu setup images render correctly with root-relative paths\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51748\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"channel: feishu\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-http-links\",\"sha\":\"1c8bdf74ab27e523a5b81f93f05a5c65efcaadf1\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:45:09Z\",\"updated_at\":\"2026-03-21T16:45:46Z\",\"closed_at\":\"2026-03-21T16:45:33Z\"},{\"number\":51746,\"title\":\"fix(webchat): add clipboard fallback for Edge browser copy button\",\"body\":\"## Summary\\n- Add `execCommand(\\u0026#39;copy\\u0026#39;)` fallback when `navigator.clipboard.writeText` fails\\n- Edge browser blocks the Clipboard API when the page is not in a secure context or clipboard permission is denied\\n- The fallback creates a temporary textarea, selects the content, and uses the legacy `document.execCommand(\\u0026#39;copy\\u0026#39;)` method\\n\\n## Motivation\\nUsers on Edge browser (Windows 11) cannot copy code blocks via the copy button — nothing happens on click. The Clipboard API silently fails in Edge\\u0026#39;s stricter security context handling.\\n\\nCloses #51664\\n\\n## Test plan\\n- [ ] Verify copy button works in Edge browser (Windows)\\n- [ ] Verify copy button still works in Chrome/Firefox/Safari (no regression)\\n- [x] Fallback only triggers when `navigator.clipboard.writeText` throws\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51746\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"app: web-ui\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/webchat-copy-edge-fallback\",\"sha\":\"5fb3036e1595094b90ec190d5f905b0caf3f9be1\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:40:43Z\",\"updated_at\":\"2026-03-21T16:44:21Z\",\"closed_at\":\"2026-03-21T16:41:07Z\"},{\"number\":51744,\"title\":\"feat(brave): add custom baseUrl support for Brave Search API\",\"body\":\"## Summary\\n- Add `baseUrl` option to `BraveConfig` so users can configure a custom Brave Search API endpoint\\n- Replace hardcoded `BRAVE_SEARCH_ENDPOINT` / `BRAVE_LLM_CONTEXT_ENDPOINT` with a configurable base URL that defaults to `https://api.search.brave.com`\\n- Pass `baseUrl` through to both `runBraveLlmContextSearch` and `runBraveWebSearch`\\n\\n### Configuration\\n\\n```json5\\n{\\n  tools: {\\n    web: {\\n      search: {\\n        provider: \\u0026#34;brave\\u0026#34;,\\n        apiKey: \\u0026#34;your-api-key\\u0026#34;,\\n        brave: {\\n          baseUrl: \\u0026#34;https://your-proxy-domain.com\\u0026#34;\\n        }\\n      }\\n    }\\n  }\\n}\\n```\\n\\n## Motivation\\nUsers in regions where `api.search.brave.com` is not directly accessible (e.g. mainland China) need to route through reverse proxies like Cloudflare Workers. This change allows configuring the base URL without code modifications.\\n\\nCloses #51658\\n\\n## Test plan\\n- [x] Verified default behavior unchanged (uses `https://api.search.brave.com` when `baseUrl` is not set)\\n- [x] Both web search and LLM context endpoints use the configured base URL\\n- [ ] Manual test with a reverse proxy endpoint\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51744\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/brave-custom-base-url-v2\",\"sha\":\"c8211e610deca805807fd6e131771f72467bee29\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:38:14Z\",\"updated_at\":\"2026-03-21T16:43:04Z\",\"closed_at\":\"2026-03-21T16:38:48Z\"},{\"number\":51747,\"title\":\"fix: use American English in feishu docx-color-text comment\",\"body\":\"Replace \\u0026#39;recognised colour\\u0026#39; with \\u0026#39;recognized color\\u0026#39; in feishu extension per coding style guidelines.\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51747\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"channel: feishu\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/feishu-american-english-v2\",\"sha\":\"75277a26d593474b91992add7d6046a2cd1ccae5\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"f4227e2787f3b85385f17e7d23decadd8575d478\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:41:21Z\",\"updated_at\":\"2026-03-21T16:41:54Z\",\"closed_at\":\"2026-03-21T16:41:42Z\"},{\"number\":51740,\"title\":\"feat(imessage): add bounded investigation intake\",\"body\":\"## Summary\\n- add a bounded iMessage investigation intake path under `agents.contentRouting.investigation`\\n- detect explicit investigation requests via fast path and honor LLM `agent:investigate` classifications\\n- run bounded investigations through a new orchestrator, reply in iMessage, and optionally promote strong findings to Zulip using existing forwarding infrastructure\\n- keep investigation sessions separate from the normal DM session with an `:investigation` suffix\\n- avoid investigation follow-up stickiness so promoted investigation threads do not hijack later unrelated messages\\n\\n## Validation\\n- `pnpm test src/config/config.schema-regressions.test.ts src/lionroot/routing/content-route.test.ts src/lionroot/routing/investigation-orchestrator.test.ts src/lionroot/content-intake.test.ts`\\n- `pnpm test src/lionroot/content-intake.test.ts src/lionroot/routing/content-intake-pipe.test.ts src/lionroot/routing/investigation-orchestrator.test.ts src/lionroot/routing/content-route.test.ts src/config/config.schema-regressions.test.ts`\\n- `pnpm test src/imessage/monitor/inbound-processing.test.ts src/lionroot/routing/content-intake-pipe.test.ts`\\n- `pnpm build`\\n- `pnpm exec oxlint --type-aware src/lionroot/content-intake.ts src/lionroot/routing/content-route.ts src/lionroot/routing/investigation-orchestrator.ts src/lionroot/content-intake.test.ts src/lionroot/routing/content-route.test.ts src/lionroot/routing/investigation-orchestrator.test.ts src/config/config.schema-regressions.test.ts src/lionroot/routing/content-intake-pipe.test.ts`\\n\\n## Notes\\n- a repo-wide `pnpm exec tsc --noEmit --pretty false` still reports existing unrelated failures under `extensions/*`, `ui/*`, and some `src/cron/*`; those were not introduced by this branch.\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51740\",\"user\":{\"login\":\"lionrooter\",\"id\":10135832,\"profile_url\":\"https://github.com/lionrooter\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/10135832?v=4\"},\"labels\":[\"docs\",\"channel: bluebubbles\",\"channel: googlechat\",\"channel: imessage\",\"channel: line\",\"channel: matrix\",\"channel: mattermost\",\"channel: msteams\",\"channel: nextcloud-talk\",\"channel: nostr\",\"channel: tlon\",\"channel: voice-call\",\"channel: zalo\",\"app: web-ui\",\"gateway\",\"cli\",\"security\",\"scripts\",\"commands\",\"agents\",\"channel: feishu\",\"channel: irc\",\"size: XL\"],\"head\":{\"ref\":\"imessage-proactive-workflow\",\"sha\":\"22eb069c296448e4dafe49c50afd7a8aaca2663c\",\"repo\":{\"full_name\":\"lionrooter/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:34:26Z\",\"updated_at\":\"2026-03-21T16:40:10Z\",\"closed_at\":\"2026-03-21T16:34:50Z\"},{\"number\":51745,\"title\":\"fix: use American English spelling in extension comments\",\"body\":\"## Summary\\n- Replace British English spellings with American English in code comments, per repo style guide (CLAUDE.md: \\u0026#34;use American spelling and grammar\\u0026#34;)\\n- `extensions/telegram/src/bot-native-command-menu.ts`: \\u0026#34;behaviour\\u0026#34; -\\u0026gt; \\u0026#34;behavior\\u0026#34;\\n- `extensions/feishu/src/docx-color-text.ts`: \\u0026#34;recognised colour\\u0026#34; -\\u0026gt; \\u0026#34;recognized color\\u0026#34;\\n\\n## Test plan\\n- [x] Comment-only changes, no logic affected\\n- [x] Pre-commit hooks (format, lint, type-check) pass\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51745\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"channel: telegram\",\"channel: feishu\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/more-american-english\",\"sha\":\"095a23dc9b488c3fe5651d02006226e90d0c5e20\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:39:13Z\",\"updated_at\":\"2026-03-21T16:39:53Z\",\"closed_at\":\"2026-03-21T16:39:39Z\"},{\"number\":51741,\"title\":\"docs: expand vLLM and SGLang extension READMEs\",\"body\":\"## Summary\\n- Expanded `extensions/vllm/README.md` from 3-line stub to full README with enable, authenticate, config, auto-discovery, and docs link sections\\n- Expanded `extensions/sglang/README.md` with the same structure\\n- Both are self-hosted OpenAI-compatible provider plugins with similar patterns\\n\\n## Test plan\\n- [ ] Verify READMEs render correctly on GitHub\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51741\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/improve-extension-readme\",\"sha\":\"fccc991799a5c10040684c2adceb62c2f55f9315\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:35:40Z\",\"updated_at\":\"2026-03-21T16:39:27Z\",\"closed_at\":\"2026-03-21T16:36:01Z\"},{\"number\":51738,\"title\":\"docs: fix broken and circular internal links\",\"body\":\"## Summary\\n- `docs/plugins/manifest.md`: fixed broken `/configuration` link to canonical `/gateway/configuration`\\n- `docs/plugins/architecture.md`: replaced two circular links to `/tools/capability-cookbook` (which redirects back to `/plugins/architecture`) with same-page anchor links to the relevant sections (`#adding-a-new-capability` and `#capability-checklist`)\\n- `docs/start/hubs.md`: updated link text to match actual page title (\\u0026#34;Adding capabilities\\u0026#34;)\\n\\n## Test plan\\n- [ ] Verify all three fixed links resolve correctly on docs.openclaw.ai\\n- [ ] Confirm the same-page anchors in architecture.md work\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51738\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-broken-doc-links\",\"sha\":\"6312729c8c412a3026929f3663cab3eb720948c8\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"e61835ec5e72d83b8b3a583696016ca829c507db\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:32:45Z\",\"updated_at\":\"2026-03-21T16:33:52Z\",\"closed_at\":\"2026-03-21T16:33:12Z\"},{\"number\":51727,\"title\":\"docs: fix e.g. and etc. punctuation across documentation\",\"body\":\"## Summary\\n- Add missing commas after \\u0026#34;e.g.\\u0026#34; and missing periods after \\u0026#34;etc\\u0026#34; across documentation\\n- Follows standard American English punctuation conventions per repo coding style guidelines\\n\\n## Test plan\\n- [x] Content-only changes — no code affected\\n- [x] No changes to zh-CN translated docs\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51727\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-eg-etc-punctuation\",\"sha\":\"7bc7c4210ae604d7755f37f3109d89e9d50b7d70\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:24:02Z\",\"updated_at\":\"2026-03-21T16:30:15Z\",\"closed_at\":\"2026-03-21T16:24:26Z\"},{\"number\":51734,\"title\":\"fix: use American English \\u0026#34;behavior\\u0026#34; in telegram bot-native-command-menu\",\"body\":\"## Summary\\n- Replace British English `behaviour` with American English `behavior` in `extensions/telegram/src/bot-native-command-menu.ts`\\n- Per coding style guideline: \\u0026#34;use American English spelling and grammar in code, comments, docs, and UI strings\\u0026#34;\\n\\n## Test plan\\n- [x] Comment-only change, no logic affected\\n- [x] `pnpm check` passes\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51734\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"channel: telegram\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"fix/telegram-bot-native-command-menu\",\"sha\":\"3b513920cdcd6ce66cf8ceba1ac66162cc34135d\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"2fe0efc9e14db1c519962059fb472e8f983313e7\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:27:55Z\",\"updated_at\":\"2026-03-21T16:28:27Z\",\"closed_at\":\"2026-03-21T16:28:17Z\"},{\"number\":27727,\"title\":\"fix: compaction safeguard summary budget\",\"body\":\"## Summary\\n\\nDescribe the problem and fix in 2–5 bullets:\\n\\n- Problem: `compaction-safeguard` can append large file operation lists (`read-files` / `modified-files`) and other metadata to the compaction summary, which can make the summary itself too large.\\n- Why it matters: Oversized compaction summaries reduce the effectiveness of compaction and can consume context budget that should be preserved for future turns.\\n- What changed: Added bounded formatting for file operation sections (with `...and N more`) and a final compaction summary length cap with a truncation marker; added tests for both behaviors.\\n- What did NOT change (scope boundary): No changes to compaction triggering, token estimation, summarization model selection, or pruning strategy logic.\\n\\n## Change Type (select all)\\n\\n- [x] Bug fix\\n- [ ] Feature\\n- [ ] Refactor\\n- [ ] Docs\\n- [ ] Security hardening\\n- [ ] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [x] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [ ] Memory / storage\\n- [ ] Integrations\\n- [ ] API / contracts\\n- [ ] UI / DX\\n- [ ] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\n- Closes #\\n- Related #\\n\\n## User-visible / Behavior Changes\\n\\n- Compaction summaries now truncate oversized file operation sections and may include `...and N more`.\\n- Compaction summaries now include a truncation marker when the final summary exceeds the configured internal size budget.\\n- No config/default changes exposed to users.\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? (`No`)\\n- Secrets/tokens handling changed? (`No`)\\n- New/changed network calls? (`No`)\\n- Command/tool execution surface changed? (`No`)\\n- Data access scope changed? (`No`)\\n- If any `Yes`, explain risk + mitigation:\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS (local dev machine)\\n- Runtime/container: local Node binary (`.tools/node-v22.22.0-darwin-arm64`)\\n- Model/provider: N/A (unit tests only)\\n- Integration/channel (if any): N/A\\n- Relevant config (redacted): N/A\\n\\n### Steps\\n\\n1. Modify `src/agents/pi-extensions/compaction-safeguard.ts` to cap file-op summary size and final compaction summary length.\\n2. Add tests in `src/agents/pi-extensions/compaction-safeguard.test.ts` covering file-op truncation and summary truncation marker.\\n3. Run `PATH=\\u0026#34;$PWD/.tools/node-v22.22.0-darwin-arm64/bin:$PATH\\u0026#34; npm exec vitest run src/agents/pi-extensions/compaction-safeguard.test.ts`.\\n\\n### Expected\\n\\n- File operation summary output is bounded and includes `...and N more` when truncated.\\n- Final compaction summary is capped and ends with a truncation marker when oversized.\\n- Test file passes.\\n\\n### Actual\\n\\n- Behavior matches expected.\\n- `compaction-safeguard` test file passes (24 tests).\\n\\n## Evidence\\n\\nAttach at least one:\\n\\n- [x] Failing test/log before + passing after\\n- [x] Trace/log snippets\\n- [ ] Screenshot/recording\\n- [ ] Perf numbers (if relevant)\\n\\n## Human Verification (required)\\n\\nWhat you personally verified (not just CI), and how:\\n\\n- Verified scenarios: Ran `src/agents/pi-extensions/compaction-safeguard.test.ts` locally after changes; confirmed new tests pass and existing tests remain green.\\n- Edge cases checked: Very large file-op lists trigger truncation; oversized summary gets capped and appends truncation marker.\\n- What you did **not** verify: End-to-end compaction flow against a live provider/model; impact on real long-running sessions.\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? (`Yes`)\\n- Config/env changes? (`No`)\\n- Migration needed? (`No`)\\n- If yes, exact upgrade steps:\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: Revert commit `afc741b` (or revert the PR commit) to restore previous compaction summary behavior.\\n- Files/config to restore: `src/agents/pi-extensions/compaction-safeguard.ts`, `src/agents/pi-extensions/compaction-safeguard.test.ts`\\n- Known bad symptoms reviewers should watch for: Missing file-op metadata in compaction summaries when lists are unexpectedly small; malformed truncation marker placement; over-aggressive truncation of summaries.\\n\\n## Risks and Mitigations\\n\\nList only real risks for this PR. Add/remove entries as needed. If none, write `None`.\\n\\n- Risk: Truncation budget may cut off useful compaction context in edge cases with unusually dense metadata.\\n  - Mitigation: File-op sections and final summary use separate caps; truncation is explicit via marker / `...and N more`, and core compaction logic is unchanged.\\n- Risk: New formatting helper could produce malformed section tags if the budget is too small.\\n  - Mitigation: Added unit tests for bounded file-op formatting and final summary capping behavior.\\n\\n\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/27727\",\"user\":{\"login\":\"Pandadadadazxf\",\"id\":200469161,\"profile_url\":\"https://github.com/Pandadadadazxf\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/200469161?v=4\"},\"labels\":[\"channel: telegram\",\"agents\",\"size: M\",\"extensions: openai\"],\"assignees\":[\"jalehman\"],\"requested_reviewers\":[\"jalehman\"],\"head\":{\"ref\":\"fix/compaction-safeguard-summary-budget\",\"sha\":\"a7ab64e3940f89ceaa4d2ab7b8dbbdec8d05ff90\",\"repo\":{\"full_name\":\"Pandadadadazxf/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-02-26T16:15:37Z\",\"updated_at\":\"2026-03-21T16:28:18Z\",\"closed_at\":\"2026-03-21T16:27:51Z\",\"merged_at\":\"2026-03-21T16:27:51Z\"},{\"number\":51726,\"title\":\"docs: add README for synology-chat extension\",\"body\":\"## Summary\\n- Added comprehensive README for `extensions/synology-chat/`\\n- Covers install (local + npm), config (single and multi-account), config field reference, environment variable support, and step-by-step setup instructions\\n- Follows the style of other extension READMEs (e.g., `extensions/twitch/README.md`)\\n\\n## Test plan\\n- [ ] Verify README renders correctly on GitHub\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51726\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/synology-chat-readme\",\"sha\":\"ddd8309ca31540fbd47ef5384026964ca64dc48d\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:23:46Z\",\"updated_at\":\"2026-03-21T16:27:40Z\",\"closed_at\":\"2026-03-21T16:24:09Z\"},{\"number\":51725,\"title\":\"docs: fix e.g. and etc. punctuation across documentation\",\"body\":\"## Summary\\n- Add missing commas after `e.g.` (117 instances) and missing periods after `etc` (15 instances) across 68 documentation files\\n- Per American English punctuation conventions (Chicago Manual of Style)\\n\\n## Test plan\\n- [x] Content-only change — no code affected\\n- [x] `pnpm check` passes\\n- [x] No changes to zh-CN translated docs\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51725\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"size: S\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-eg-etc-punctuation-v2\",\"sha\":\"7bc7c4210ae604d7755f37f3109d89e9d50b7d70\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:23:40Z\",\"updated_at\":\"2026-03-21T16:27:28Z\",\"closed_at\":\"2026-03-21T16:24:03Z\"},{\"number\":51730,\"title\":\"docs: use American English \\u0026#34;summarizes\\u0026#34; in compaction.md\",\"body\":\"## Summary\\n- Replace British English `summarises` with American English `summarizes` in compaction docs\\n- Per coding style guideline: \\u0026#34;use American English spelling\\u0026#34;\\n\\n## Test plan\\n- [x] Single-word spelling fix, no logic change\\n\\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51730\",\"user\":{\"login\":\"zhengbingxian\",\"id\":33149547,\"profile_url\":\"https://github.com/zhengbingxian\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/33149547?v=4\"},\"labels\":[\"docs\",\"size: XS\",\"r: too-many-prs\"],\"head\":{\"ref\":\"docs/fix-compaction-spelling\",\"sha\":\"374bb92f68bd210440ba8b65c61100341244bc1f\",\"repo\":{\"full_name\":\"zhengbingxian/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"7c520cc0ead3cc338e392691635a1adb6760a244\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:26:29Z\",\"updated_at\":\"2026-03-21T16:27:01Z\",\"closed_at\":\"2026-03-21T16:26:55Z\"},{\"number\":51721,\"title\":\"web UI: fix context notice using accumulated inputTokens instead of p…\",\"body\":\"web UI: fix context notice using accumulated inputTokens instead of prompt snapshot\\n\\nThe context-usage banner in the web UI fell back to inputTokens when totalTokens was missing. inputTokens is accumulated across all API calls in a run (tool-use loops, compaction retries), so it overstates actual context window utilization -- e.g. showing \\u0026#34;100% context used 757.3k / 200k\\u0026#34; when the real prompt snapshot is only 46k/200k (23%).\\n\\nDrop the inputTokens fallback so the banner only fires when a genuine prompt snapshot (totalTokens) is available.\\n\\n## Summary\\n\\n- **Problem:** The web UI context-usage banner fell back to `inputTokens` (accumulated across all API calls in a run) when `totalTokens` (prompt snapshot) was missing, showing false alarms like \\u0026#34;100% context used 757.3k / 200k\\u0026#34;.\\n- **Why it matters:** Users see a scary red \\u0026#34;context full\\u0026#34; warning when the actual context window is only 23% used, creating confusion and unnecessary session resets.\\n- **What changed:** Removed the `inputTokens` fallback in `renderContextNotice` so the banner only fires when a genuine `totalTokens` prompt snapshot is available. Added a test covering the missing-`totalTokens` edge case.\\n- **What did NOT change (scope boundary):** The status card text (`Context: 46k/200k (23%)`) was already correct and is untouched. Token accumulation, session storage, and per-message context % in grouped-render are unchanged.\\n\\n## Change Type (select all)\\n\\n- [x] Bug fix\\n- [ ] Feature\\n- [ ] Refactor required for the fix\\n- [ ] Docs\\n- [ ] Security hardening\\n- [ ] Chore/infra\\n\\n## Scope (select all touched areas)\\n\\n- [ ] Gateway / orchestration\\n- [ ] Skills / tool execution\\n- [ ] Auth / tokens\\n- [ ] Memory / storage\\n- [ ] Integrations\\n- [ ] API / contracts\\n- [x] UI / DX\\n- [ ] CI/CD / infra\\n\\n## Linked Issue/PR\\n\\n- Related #(none identified)\\n\\n## User-visible / Behavior Changes\\n\\n- The amber/red \\u0026#34;X% context used\\u0026#34; banner in the web UI no longer appears when `totalTokens` is unavailable, instead of falsely reporting accumulated `inputTokens` as context utilization.\\n- When `totalTokens` is present and genuinely high (\\u0026gt;=85% of context window), the banner continues to display correctly.\\n\\n## Security Impact (required)\\n\\n- New permissions/capabilities? `No`\\n- Secrets/tokens handling changed? `No`\\n- New/changed network calls? `No`\\n- Command/tool execution surface changed? `No`\\n- Data access scope changed? `No`\\n\\n## Repro + Verification\\n\\n### Environment\\n\\n- OS: macOS\\n- Runtime/container: Bun / Node 22+\\n- Model/provider: minimax-portal/MiniMax-M2.5 (any provider reproduces)\\n- Integration/channel: Web UI (control-ui)\\n- Relevant config: default context window 200k\\n\\n### Steps\\n\\n1. Start a session with a model that has a 200k context window.\\n2. Run several tool-use loops so `inputTokens` accumulates well past 200k (e.g. 757k).\\n3. Observe the context notice banner at the bottom of the chat view.\\n\\n### Expected\\n\\n- Banner hidden (or showing accurate context % based on prompt snapshot).\\n\\n### Actual (before fix)\\n\\n- Banner shows \\u0026#34;100% context used 757.3k / 200k\\u0026#34; even though real context utilization is 23%.\\n\\n## Evidence\\n\\n- [x] Failing test/log before + passing after\\n  - Existing test \\u0026#34;hides the context notice when only cumulative inputTokens exceed the limit\\u0026#34; already encoded the correct expectation and passes with the fix.\\n  - New test \\u0026#34;hides the context notice when totalTokens is missing even if inputTokens is high\\u0026#34; covers the undefined-totalTokens edge case.\\n- [x] Screenshot/recording\\n  - User-provided screenshot showing the mismatch between status card (23%) and banner (100%).\\n\\n## Human Verification (required)\\n\\n- **Verified scenarios:** All 29 chat view tests pass (28 existing + 1 new). Format and lint clean on touched files.\\n- **Edge cases checked:** `totalTokens` undefined with high `inputTokens`; `totalTokens` present and above 85% threshold; `totalTokens` present but below threshold.\\n- **What you did not verify:** Live web UI end-to-end with a real session (test-only verification). Pre-existing `src/tts/tts.ts` format failure on `main` unrelated to this change.\\n\\n## Review Conversations\\n\\n- [x] I replied to or resolved every bot review conversation I addressed in this PR.\\n- [x] I left unresolved only the conversations that still need reviewer or maintainer judgment.\\n\\n## Compatibility / Migration\\n\\n- Backward compatible? `Yes`\\n- Config/env changes? `No`\\n- Migration needed? `No`\\n\\n## Failure Recovery (if this breaks)\\n\\n- How to disable/revert this change quickly: Revert the one-line change in `ui/src/ui/views/chat.ts` line 258 to restore `?? session?.inputTokens`.\\n- Files/config to restore: `ui/src/ui/views/chat.ts`\\n- Known bad symptoms reviewers should watch for: Context notice never appearing even when context is genuinely near capacity (would require `totalTokens` to be permanently missing for active sessions — unlikely given session-usage persistence).\\n\\n## Risks and Mitigations\\n\\n- **Risk:** If `totalTokens` is frequently `undefined` for active sessions, users lose the context-full warning entirely.\\n  - **Mitigation:** `totalTokens` is populated by `deriveSessionTotalTokens` on every reply with `lastCallUsage` or `promptTokens`. It is only missing on cold/stale sessions where context utilization is unknown anyway — showing nothing is more correct than showing a false alarm.\",\"state\":\"closed\",\"draft\":false,\"merged\":false,\"html_url\":\"https://github.com/openclaw/openclaw/pull/51721\",\"user\":{\"login\":\"BunsDev\",\"id\":68980965,\"profile_url\":\"https://github.com/BunsDev\",\"avatar_url\":\"https://avatars.githubusercontent.com/u/68980965?v=4\"},\"labels\":[\"app: web-ui\",\"maintainer\",\"size: XS\"],\"assignees\":[\"BunsDev\"],\"head\":{\"ref\":\"fix/context-notice-token-fallback\",\"sha\":\"037b4cb6fcc5fb613a235058751ca3868f97e518\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"base\":{\"ref\":\"main\",\"sha\":\"15fd11032daf7de3a9e450b4d90f3825075f1957\",\"repo\":{\"full_name\":\"openclaw/openclaw\",\"description\":\"Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞 \"}},\"created_at\":\"2026-03-21T16:15:26Z\",\"updated_at\":\"2026-03-21T16:17:25Z\",\"closed_at\":\"2026-03-21T16:16:33Z\",\"merged_at\":\"2026-03-21T16:16:33Z\"}]"}]}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01XB8GhpynxzCuyJ1nqa6JzC","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"From page 2, I can see another merged PR:\n- #27727 - \"fix: compaction safeguard summary budget\" - @Pandadadadazxf - merged_at: 2026-03-21T16:27:51Z\n- #51721 - \"web UI: fix context notice using accumulated inputTokens instead of p…\" - @BunsDev - merged_at: 2026-03-21T16:16:33Z\n\nSo now I have my 5 most recently merged PRs (sorted by merged_at desc):\n1. #34222 - \"fix: use content hash for memory flush dedup instead of compactionCount (#30115)\" - @lml2468 - merged at 2026-03-21T19:06:26Z\n\n\n2. #37080 - \"fix(tts): add matrix to VOICE_BUBBLE_CHANNELS\" - @Matthew19990919 - merged at 2026-03-21T18:29:53Z\n3. #40126 - \"feat(memory): pluggable system prompt section for memory plugins\" - @jarimustonen - merged at 2026-03-21T18:20:45Z\n4. #51260 - \"Fix Discord `/codex_resume` picker expiration\" - @huntharo - merged at 2026-03-21T16:59:21Z\n5. #27727 - \"fix: compaction safeguard summary budget\" - @Pandadadadazxf - merged at 2026-03-21T16:27:51Z\n\nSo there are 8,780 open issues right now, and looking at the five most recent merges, they span fixes for memory deduplication, TTS configuration, memory plugin architecture, Discord command handling, and compaction safeguards.\n\nThe latest release is v2026.3.13-1.","signature":" "}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":19730,"cache_read_input_tokens":30396,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":19730},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"6ee97386-e3e0-4e3c-b4a6-cb79abf285cf"}
{"type":"assistant","message":{"model":"claude-sonnet-4-6","id":"msg_01XB8GhpynxzCuyJ1nqa6JzC","type":"message","role":"assistant","content":[{"type":"text","text":"Here's your catch-up on **openclaw/openclaw** (as of 2026-03-21):\n\n---\n\n**Open Issues:** 8,780\n\n---\n\n**5 Most Recently Merged PRs:**\n\n| # | Title | Author |\n|---|-------|--------|\n| #34222 | fix: use content hash for memory flush dedup instead of compactionCount | @lml2468 |\n| #37080 | fix(tts): add matrix to VOICE_BUBBLE_CHANNELS | @Matthew19990919 |\n| #40126 | feat(memory): pluggable system prompt section for memory plugins | @jarimustonen |\n| #51260 | Fix Discord `/codex_resume` picker expiration | @huntharo |\n| #27727 | fix: compaction safeguard summary budget | @Pandadadadazxf |\n\n---\n\n**Latest Release:** `v2026.3.13-1` (\"openclaw 2026.3.13\", published 2026-03-14)\n- This is a recovery release — the `-1` suffix is GitHub/git only; the npm version remains `2026.3.13`."}],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":1,"cache_creation_input_tokens":19730,"cache_read_input_tokens":30396,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":19730},"output_tokens":8,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":null,"session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","uuid":"eab2dd80-1b63-45d6-b589-e3573f987f3e"}
{"type":"result","subtype":"success","is_error":false,"duration_ms":42289,"duration_api_ms":40573,"num_turns":6,"result":"Here's your catch-up on **openclaw/openclaw** (as of 2026-03-21):\n\n---\n\n**Open Issues:** 8,780\n\n---\n\n**5 Most Recently Merged PRs:**\n\n| # | Title | Author |\n|---|-------|--------|\n| #34222 | fix: use content hash for memory flush dedup instead of compactionCount | @lml2468 |\n| #37080 | fix(tts): add matrix to VOICE_BUBBLE_CHANNELS | @Matthew19990919 |\n| #40126 | feat(memory): pluggable system prompt section for memory plugins | @jarimustonen |\n| #51260 | Fix Discord `/codex_resume` picker expiration | @huntharo |\n| #27727 | fix: compaction safeguard summary budget | @Pandadadadazxf |\n\n---\n\n**Latest Release:** `v2026.3.13-1` (\"openclaw 2026.3.13\", published 2026-03-14)\n- This is a recovery release — the `-1` suffix is GitHub/git only; the npm version remains `2026.3.13`.","stop_reason":"end_turn","session_id":"5961e557-d7fc-4273-82e0-71a209c2d95a","total_cost_usd":0.22764060000000003,"usage":{"input_tokens":4188,"cache_creation_input_tokens":41528,"cache_read_input_tokens":72872,"output_tokens":2499,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":41528,"ephemeral_5m_input_tokens":0},"inference_geo":"","iterations":[],"speed":"standard"},"modelUsage":{"claude-sonnet-4-6":{"inputTokens":4188,"outputTokens":2499,"cacheReadInputTokens":72872,"cacheCreationInputTokens":41528,"webSearchRequests":0,"costUSD":0.22764060000000003,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"fast_mode_state":"off","uuid":"87d033c1-1c17-47ed-ad7b-ca8b3dbc0e3a"}
