Commit Graph

49785 Commits

Author SHA1 Message Date
Vincent Koc
1b62168a3a fix(media): reject malformed generated base64 2026-05-15 23:20:46 +08:00
Peter Steinberger
06ec35452f test: deduplicate OpenRouter reasoning replay regression 2026-05-15 16:17:50 +01:00
Peter Steinberger
c5a4d7af41 fix: avoid OpenRouter DeepSeek V4 empty reasoning replay 2026-05-15 16:17:50 +01:00
luyao618
25864ee540 fix(transport): strip empty-string reasoning_content from OpenRouter assistant replay
DeepSeek V4 via OpenRouter injects reasoning_content: "" on assistant
messages that contain tool_calls.  The sanitizer only deleted the field
when it was not a string, so empty strings slipped through and were
replayed on follow-up turns.  OpenRouter rejects the field with an
HTTP 500 Internal Server Error instead of a descriptive 4xx, breaking
every subsequent tool-call turn for the session.

Also strip empty-string reasoning for the same reason.

Closes #82150
2026-05-15 16:17:50 +01:00
Merlin
127156a88a fix(codex): fail fast after quiescent app-server turns
Fix Codex app-server turns that go quiet after the last non-assistant current-turn item completes without turn/completed.\n\nMaintainer proof: focused watchdog regression passed on rebased head, diff whitespace check passed, and local OpenClaw CLI + WebSocket app-server transport proof observed turn/interrupt after the short idle watchdog.\n\nCo-authored-by: funmerlin <funmerlin@users.noreply.github.com>
2026-05-15 16:16:33 +01:00
Peter Steinberger
bbf50a406e fix: keep Discord prompt metadata structured (#82168) 2026-05-15 16:12:11 +01:00
Peter Steinberger
2eee70e0a6 refactor: run prepared Discord and Slack turns
Route Discord and Slack prepared message turns through the core prepared-turn runner directly.

Local proof before landing:
- node scripts/run-vitest.mjs src/channels/turn/kernel.test.ts extensions/discord/src/monitor/message-handler.process.test.ts extensions/slack/src/monitor/message-handler/prepare.test.ts extensions/slack/src/monitor/message-handler/dispatch.preview-fallback.test.ts
- node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental false
- node scripts/run-tsgo.mjs -p tsconfig.extensions.json --incremental false
- OPENCLAW_TESTBOX_REMOTE_RUN=1 OPENCLAW_VITEST_MAX_WORKERS=1 pnpm check:changed
- codex-review clean after accepted Slack bot-loop history cleanup finding was fixed in core

GitHub checks had no failures; Blacksmith/GitHub runner jobs were still queued when maintainer approved landing based on local proof.
2026-05-15 16:06:22 +01:00
Peter Steinberger
369917ff79 fix: surface cron model override diagnostics 2026-05-15 16:04:49 +01:00
Peter Steinberger
9393be2e4b chore(release): refresh generated release baselines 2026-05-15 15:57:01 +01:00
Peter Steinberger
4780e69352 fix(line): acknowledge webhooks before agent processing 2026-05-15 15:49:36 +01:00
Peter Steinberger
99dfb8291f fix(providers): preserve Kimi MiMo reasoning replay (#82170)
* fix(providers): preserve Kimi MiMo reasoning replay

* chore: rerun provider replay ci
2026-05-15 15:44:34 +01:00
Peter Steinberger
abbfd276ee ci(release): stringify candidate workflow fields 2026-05-15 15:43:43 +01:00
Peter Steinberger
d24a847279 test(doctor): type legacy compaction fixtures (#80645) 2026-05-15 15:33:27 +01:00
Peter Steinberger
76ec830c7a docs: add onboarding i18n changelog (#80645) (thanks @GaosCode) 2026-05-15 15:33:27 +01:00
Peter Steinberger
80b5a0138f test(zalouser): align history expectation after rebase 2026-05-15 15:33:27 +01:00
Peter Steinberger
40789da1ef fix(wizard): narrow setup i18n SDK surface 2026-05-15 15:33:27 +01:00
MrBrain
6472b05fad feat(plugins): localize channel setup wizards 2026-05-15 15:33:27 +01:00
MrBrain
bfc674876d feat(wizard): localize onboarding flows 2026-05-15 15:33:27 +01:00
MrBrain
d8ae3ec4c8 feat(wizard): add cli i18n catalog 2026-05-15 15:33:27 +01:00
Peter Steinberger
492f59e586 ci(release): preserve candidate JSON parse cause 2026-05-15 15:32:17 +01:00
Peter Steinberger
41810a462e fix(discord): suppress link embeds by default
* fix(discord): suppress link embeds by default

* fix(discord): handle missing stream config
2026-05-15 15:22:54 +01:00
Peter Steinberger
1b87ba8ca5 docs(codex): document native compaction behavior 2026-05-15 15:17:12 +01:00
Peter Steinberger
031655b933 fix(doctor): migrate codex compaction config 2026-05-15 15:17:12 +01:00
Peter Steinberger
934fc6ceeb fix(codex): keep app-server compaction native 2026-05-15 15:17:12 +01:00
Peter Steinberger
d61051558b ci(release): harden candidate workflow dispatch lookup 2026-05-15 15:10:34 +01:00
Peter Steinberger
adac07f1d8 ci(release): publish validation manifest on main 2026-05-15 14:55:59 +01:00
Peter Steinberger
c91e20ac0c ci(release): add candidate evidence checklist 2026-05-15 14:54:46 +01:00
Otto Deng
2d91a3b200 fix(gateway/approvals): treat turnSourceTo as optional in chat approval bridge (#82132)
canBridgeNoDeviceChatApprovalFromBackend used matchesRequiredString for
turnSourceTo, which returns false when expected is null. Channels without
a recipient concept (webchat, control-ui) leave turnSourceTo null on both
the approval snapshot and the replay params, so every backend
gateway-client replay was rejected with APPROVAL_CLIENT_MISMATCH after
the approval prompt was answered. turnSourceAccountId and turnSourceThreadId
in the same function already use matchesOptionalString for the same reason;
turnSourceTo was missed when PR #78728 added the helper.

Switch to matchesOptionalString so null-on-both-sides matches. Cross-channel
replay protection is preserved by the existing required turnSourceChannel
and sessionKey checks. Added a regression test asserting webchat replay
with null turnSourceTo is accepted.
2026-05-15 14:51:31 +01:00
Peter Steinberger
1e31bd2ac2 fix(codex): time out silent app-server turns 2026-05-15 14:46:33 +01:00
Peter Steinberger
111a17b6e8 chore: publish 2026.5.12 mac appcast 2026-05-15 14:37:36 +01:00
Yash Saliya
d91f58ee25 fix(message-tool): rename type schema property to avoid JSON Schema keyword collision (#78920)
Merged via squash.

Prepared head SHA: 669084aad8
Co-authored-by: YashSaliya <79741768+YashSaliya@users.noreply.github.com>
Co-authored-by: altaywtf <9790196+altaywtf@users.noreply.github.com>
Reviewed-by: @altaywtf
2026-05-15 16:29:56 +03:00
Peter Steinberger
f74436dc81 refactor: assemble channel contexts in core 2026-05-15 14:14:02 +01:00
Jerome Xu
8cc1aee9d8 fix(xiaomi): surface MiMo reasoning-only finals (#60304)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-05-15 14:12:44 +01:00
Peter Steinberger
bc461965a3 fix: document cron runtime plugin preload (#82111) 2026-05-15 14:04:56 +01:00
Peter Steinberger
38e53a89b2 fix(cron): align runtime plugin preload mode 2026-05-15 14:04:56 +01:00
郑苏波 (Super Zheng)
5779d485fd fix(cron): lazily load runtime plugins to fix external channel resolution
Ensure runtime plugins are loaded before resolving cron delivery context,
preventing multi-channel ambiguity errors when using external channels.
Implemented via a lazy facade to preserve fast isolated agent startup.
2026-05-15 14:04:56 +01:00
Peter Steinberger
6de8563827 refactor: centralize channel history window 2026-05-15 13:56:17 +01:00
Peter Steinberger
56303b96d0 fix(slack): clarify finalized draft guard 2026-05-15 13:48:55 +01:00
Neerav Makwana
2b7c150de3 fix(slack): preserve finalized draft after tool warning 2026-05-15 13:48:55 +01:00
Eden
b67bcd93cc fix(twitch): keep account monitor alive until abort (#81853)
Summary:
- Keep Twitch startAccount alive until abort via runStoppablePassiveMonitor.
- Add lifecycle regression coverage and env-gated live Twitch IRC proof.
- Add changelog credit for #60071 / #81853.

Verification:
- pnpm test extensions/twitch/src/plugin.lifecycle.test.ts extensions/twitch/src/plugin.test.ts extensions/twitch/src/twitch-client.test.ts src/gateway/server-channels.test.ts
- pnpm exec oxfmt --check --threads=1 extensions/twitch/src/plugin.ts extensions/twitch/src/plugin.lifecycle.test.ts extensions/twitch/src/plugin.live.test.ts CHANGELOG.md
- pnpm test:live -- extensions/twitch/src/plugin.live.test.ts (skipped without Twitch live credentials)
- codex-review --mode branch --parallel-tests targeted Twitch/gateway tests
- GitHub checks on aea52056c6 green

Fixes #60071.

Co-authored-by: 許元豪 <146086744+edenfunf@users.noreply.github.com>
2026-05-15 13:47:10 +01:00
Peter Steinberger
e0f7dafcea docs: require codex review before landing 2026-05-15 13:41:34 +01:00
Peter Steinberger
2ea0c6c929 docs(slack): align unfurl default docs (#82123) 2026-05-15 13:25:52 +01:00
Kibi
cb695b0986 fix(slack): default unfurl_links to false for outbound messages
Slack link unfurls (inline message previews) are enabled by default
when unfurl_links is not explicitly set in chat.postMessage. This means
bot messages containing Slack message links or URLs automatically expand
into rich preview cards, which can be noisy in channels.

Default unfurl_links to false so outbound messages don't show inline
link previews unless the operator explicitly opts in via:

  channels.slack.unfurlLinks: true

unfurlMedia remains opt-in (only sent when explicitly configured).
2026-05-15 13:25:52 +01:00
Peter Steinberger
b4f6cb29b8 fix(slack): break modal routing import cycle 2026-05-15 13:18:55 +01:00
Peter Steinberger
d89732efca fix(slack): route plugin modal submissions
Co-authored-by: shannon0430 <258282406+shannon0430@users.noreply.github.com>

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>

Co-authored-by: Jin Kim <198280395+jink-ucla@users.noreply.github.com>
2026-05-15 13:18:55 +01:00
Peter Steinberger
cda4689d71 fix(auto-reply): document silent reply fallback fix (#82086) (thanks @taozengabc) 2026-05-15 13:18:16 +01:00
Peter Steinberger
391b4916dc fix(auto-reply): cover surface silent reply fallback 2026-05-15 13:18:16 +01:00
taozengabc
a541aa3b0b fix(auto-reply): honor silentReply policy on group failure-fallback path
Threads the runtime config through buildKnownAgentRunFailureReplyPayload
into resolveExternalRunFailureTextForConversation so the documented
agents.defaults.silentReply / surfaces.<id>.silentReply policy is
consulted before silencing failure copy in groups/channels. Default
policy (group: allow, direct: disallow, internal: allow) preserves the
existing 'groups stay quiet on generic runner failure' behavior; opting
into silentReply.group: disallow now lets the run-failure copy reach
the chat instead of disappearing.

Resolves an internal inconsistency: route-reply.ts already routes
NO_REPLY-style payloads through resolveSilentReplyPolicy(), but the
failure-fallback path in agent-runner-execution.ts hardcoded silence on
chat type alone, ignoring the operator-visible knob.

Refs #82060.
2026-05-15 13:18:16 +01:00
Peter Steinberger
2a02d83e2e refactor: record dropped channel history in turn kernel 2026-05-15 13:06:25 +01:00
Peter Steinberger
8859e89e07 feat: attach recent inbound history images to agent turns (#82068)
* feat: attach recent inbound history images

* fix: bound recent history media downloads

* fix: preserve sticker history media

* fix: enforce history media cap for stickers

* refactor: name agent turn attachments generically

* refactor: share pending history media recording

* fix: gate historical media attachment visibility

* fix: avoid media runtime on text-only turns

* fix: preserve fallback history media selection

* fix: avoid sparse media history index collisions

* fix: skip history images for current non-image media

* test: import history media type directly

* test: satisfy agent media runtime mock lint

* fix: respect mocked Slack media fetches

* fix: settle history media recording races
2026-05-15 12:41:52 +01:00