Commit Graph

65058 Commits

Author SHA1 Message Date
xingzhou
f14eb97ae7 fix(codex): honor Pro reasoning effort contracts (#101484)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-07 03:13:50 -07:00
Peter Steinberger
6e792f08f8 fix(ios): serialize screen recording finalization (#101550)
* fix(ios): serialize screen recording finalization

* chore: keep release changelog out of PR
2026-07-07 11:13:46 +01:00
pick-cat
61dce7cb6e fix: forward pending timeout snapshot in waitForAgentJob fallback timer (#89367)
* fix(agents): export isHardAgentRunTimeoutPhase for wait-layer reuse

* fix(gateway): forward pending hard-timeout snapshot in waitForAgentJob fallback timer (fixes #89095)

* test(gateway): add e2e proof for subagent hard-timeout parent notification (#89095)

* fix(gateway): match fallback hard-timeout gate to terminal-outcome contract

Also treat provider-started timeout snapshots as hard timeouts in the
waitForAgentJob fallback, mirroring buildAgentRunTerminalOutcome.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(gateway): use shared hard-timeout classifier in waitForAgentJob fallback

* chore: amend author email

* chore: rebase on main, resolve conflicts

* test(gateway): focus timeout fallback coverage

* docs(changelog): note agent wait timeout fix

* fix(gateway): isolate fresh wait terminal state

---------

Co-authored-by: Pick-cat <266665499+Pick-cat@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 11:11:13 +01:00
machine3at
a00e9fc228 fix(ssrf): block loopback addresses for trusted hostname origins (#100835)
* fix(ssrf): block loopback addresses for trusted hostname origins

* fix(ssrf): allow loopback resolution for explicitly trusted loopback/localhost hostnames

* refactor(cron): remove unrelated cron session option changes from ssrf branch

* test(ssrf): add explicit loopback-origin allow tests to close ClawSweeper proof gap

* test(ssrf): add real gateway runtime proof script for loopback rebinding

* fix(ssrf): harden trusted-host loopback checks

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 11:08:51 +01:00
Vincent Koc
b9a3db13f1 test(e2e): parse corrupt plugin timeouts as decimal 2026-07-07 12:03:11 +02:00
Vincent Koc
a9c0592831 test(e2e): align corrupt plugin update timeout 2026-07-07 12:03:10 +02:00
Alix-007
079a704dda fix(voice-call): keep realtime context truncation UTF-16 safe (#101304)
* Fix UTF-16-safe realtime context truncation

* test(voice-call): tighten UTF-16 context regression

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 11:01:48 +01:00
Peter Steinberger
395fbb8eb6 fix(ui): send approvals past busy chat queue (#101532)
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-07 10:59:16 +01:00
Peter Steinberger
6b76a306d4 fix(zalo): accept opaque string chat IDs (#101548)
Co-authored-by: Goutam Adwant <workwithgoutam@gmail.com>
2026-07-07 10:58:59 +01:00
Peter Steinberger
5a234d61fa feat(ui): redesign dashboard chrome with tiny top bar and sidebar search (#101497)
* feat(ui): redesign dashboard chrome with tiny top bar and sidebar search

Move the sidebar toggle to the top bar as a macOS-style panel button
(collapse on desktop, drawer on tablet/mobile), move search into a
sidebar field that opens the command palette, and move the color-mode
toggle into the sidebar footer. Shrink the top bar to 44px, make the
terminal toggle a quiet ghost button, and drop the shadow plate behind
the macOS titlebar brand mark so the transparent mascot renders bare.
Adds the missing common.colorModeOption i18n key (theme buttons were
announcing the raw key) and removes the dead theme-orb styles.

* fix(ui): translate common.colorModeOption across locale bundles

The i18n sync initially recorded English fallbacks for the new key,
which the ships-no-recorded-English-fallbacks gate rejects. Regenerated
with a real translation provider; all 20 locales now carry translated
values (fallbacks=0).

* refactor(ui): unify the topbar sidebar toggle into one button

One button drives both modes: rail collapse on desktop and the
slide-over drawer at the ≤1100px breakpoint, decided via matchMedia
(with the legacy addListener fallback used elsewhere in bootstrap).
Replaces the previous pair of CSS-swapped buttons.
2026-07-07 10:57:45 +01:00
Peter Steinberger
2394a0a559 perf(test): reuse session plugin registry 2026-07-07 05:56:30 -04:00
Alix-007
240487179b fix(web-fetch): keep spill content truncation UTF-16 safe (#101312)
* Fix UTF-16-safe web fetch spill truncation

* fix(web-fetch): report actual spill character count
2026-07-07 10:56:14 +01:00
brokemac79
037412ec7d ci(mantis): add web UI chat proof lane (#100472)
* ci(mantis): add web ui chat proof lane

* ci(mantis): tighten web ui proof candidate parsing

* ci: tighten Mantis Web UI proof lane

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 10:54:35 +01:00
Peter Steinberger
354a151544 feat(gateway): archive-gated session deletes give Android delete parity (#101522)
sessions.delete gains an explicit archivedOnly param (additive protocol
schema change, Swift models regenerated): with archivedOnly=true, the
dispatcher grants operator.write and the handler requires the target to
already be archived (archive-then-delete keeps destructive intent a
two-step action). Without the flag nothing changes: deletes require
operator.admin, so internal fallback/synthetic dispatch, subagent cleanup,
and CLI minting keep their admin contracts, and the session-kill HTTP
endpoint pins admin explicitly since it terminates live runs.

Android sends archivedOnly and offers Delete only on archived rows, where
its bounded (non-admin) operator session is now authorized; active rows
archive first. iOS/web connect with admin and keep unrestricted deletes.

Refs #100712
2026-07-07 10:52:53 +01:00
Pavan Kumar Gondhi
9133d552ac fix: block mixed-case cron shell jobs from agent tool [AI] (#101350)
* fix: normalize cron tool shell guard kinds

* fix(cron): narrow mixed-case shell guard

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 10:52:20 +01:00
Vincent Koc
7e995cbf2b refactor(ui): remove stale helper exports (#101549) 2026-07-07 02:49:42 -07:00
Alix-007
b84ae42063 fix(agents): keep prompt data truncation UTF-16 safe (#101303) 2026-07-07 10:46:23 +01:00
Alix-007
d01015b243 Fix UTF-16-safe audit context truncation (#101298) 2026-07-07 10:43:45 +01:00
Peter Steinberger
6125dd95e6 feat(android): og:image thumbnails on link preview cards (#101396) 2026-07-07 10:42:03 +01:00
Alix-007
0f775fa25e fix(msteams): bound Microsoft Graph API response reads in graph-upload to prevent OOM (#97784)
* fix(msteams): bound Microsoft Graph API response reads in graph-upload to prevent OOM

* test(msteams): prove graph upload oversized JSON rejection

* test(msteams): tighten Graph response bound proof

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 10:36:54 +01:00
Peter Steinberger
9cd29dcb9a test(android): stabilize saved gateway reconnect proof (#101519) 2026-07-07 10:30:14 +01:00
Vincent Koc
78399a194c refactor(agent-core): localize exec timeout helper (#101523) 2026-07-07 02:29:18 -07:00
Peter Steinberger
508296f1ed feat(ios): og:image thumbnails on link preview cards (#101387) 2026-07-07 10:27:08 +01:00
Peter Steinberger
bc5a82b26d fix(android): auto-detect the Android SDK when fresh worktrees lack local.properties (#101273) 2026-07-07 10:22:07 +01:00
Peter Steinberger
6e7ef631d2 feat(macos): unify About links with iOS/Android (Website, Docs, GitHub, Discord) 2026-07-07 02:20:02 -07:00
Peter Steinberger
da1b0fa2a8 perf(test): skip backup retry wall-clock waits 2026-07-07 05:19:26 -04:00
Vincent Koc
ccbd9eb28d fix(qqbot): keep bounded previews UTF-16 safe (#101516)
Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com>
2026-07-07 02:18:57 -07:00
Vincent Koc
202d90041d test(e2e): authorize doctor install switch repairs 2026-07-07 11:15:05 +02:00
clinton codes
ef985ecd91 fix(gateway): reset channel restart counter after a stable run (#101413)
* fix(gateway): reset channel restart counter after a stable run

* fix(gateway): measure stable channel runtime precisely

Co-authored-by: Ubuntu <azureuser@clinton-dev-vm.tail405bf7.ts.net>

* refactor(gateway): collapse stable-run timing state

Co-authored-by: Ubuntu <azureuser@clinton-dev-vm.tail405bf7.ts.net>

---------

Co-authored-by: Ubuntu <azureuser@clinton-dev-vm.tail405bf7.ts.net>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 10:11:44 +01:00
Peter Steinberger
a2a68d154b fix(agent): preserve explicit recipient sessions (#101507)
* fix(agent): honor recipient session routing

Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
Co-authored-by: pingfanfan <pingfan.work@gmail.com>

* fix(agent): preserve canonical recipient routes

* fix(agent): require exact recipient routes

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

Co-authored-by: pingfanfan <pingfan.work@gmail.com>

* fix(agent): harden recipient route resolution

* fix(imessage): require canonical recipient handles

* fix(agent): refine provider recipient exactness

* fix(agent): bound direct alias session routing

* fix(signal): preserve direct alias route type

* fix(agent): honor binding-scoped recipient sessions

* fix(routing): honor configured main session aliases

* fix(clickclack): align account-owned session routes

* fix(twitch): preserve canonical recipient sessions

* fix(routing): isolate stable outbound identities

* chore: defer recipient session changelog

* fix(sms): use dedicated channel SDK facade

---------

Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
Co-authored-by: pingfanfan <pingfan.work@gmail.com>
2026-07-07 10:07:13 +01:00
Peter Steinberger
13c1d3c408 fix(backup): close archive stream before retry cleanup (#101464)
* fix(backup): close archive stream before retry cleanup

Own the tar source and file writer with stream.pipeline so live-file EOF failures close the partial archive before Windows cleanup. Keep one native Windows handle-release regression and focused CI coverage.

Fixes #101382

Co-authored-by: 徐闻涵0668001344 <xu.wenhan1@xydigit.com>

* test(backup): track archive retry temp directory

* test(backup): model tar archive streams

* test(backup): model retry cleanup streams

---------

Co-authored-by: 徐闻涵0668001344 <xu.wenhan1@xydigit.com>
2026-07-07 09:53:31 +01:00
Vincent Koc
2e4e982ff0 refactor(memory): localize host SDK internals (#101508) 2026-07-07 01:50:53 -07:00
ml12580
c1f9087e8e fix(cli): accept parent options placed after lazy subcommands (#55563 regression 1) [AI-assisted] (#94431)
* fix(cli): restore lazy parent option ordering

Co-authored-by: ml12580 <long.xinyuan3@xydigit.com>

* chore: defer release-owned changelog entry

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 09:45:04 +01:00
Peter Steinberger
c9c4226a23 perf(test): isolate model defaults policy fixtures 2026-07-07 04:44:37 -04:00
Ayaan Zaidi
01f6593ea5 fix(telegram): reduce durable empty-rich guard to skip 2026-07-07 14:14:03 +05:30
snowzlmbot
2f98e1fdb5 fix(telegram): address rich fallback proof review 2026-07-07 14:14:03 +05:30
snowzlmbot
982328218b fix(telegram): harden rich send fallback and typing breaker
- Raise typing-breaker default from 2 to 5 consecutive failures via a
  named constant, keeping explicit overrides intact.
- Extend rich-plain-fallback trigger map to classify
  RICH_MESSAGE_CONTENT_REQUIRED alongside existing invalid-entity
  errors so both durable and streaming send funnels benefit.
- Add empty rendered-rich-HTML guards before sendRichMessage in both
  the durable chunk loop (send.ts) and the streaming delivery funnel
  (delivery.send.ts), preventing doomed Bot API calls and preserving
  later valid chunks.
- Add regression tests for the default typing breaker, delivery-side
  and durable-side RICH_MESSAGE_CONTENT_REQUIRED fallback behavior.
2026-07-07 14:14:03 +05:30
sunlit-deng
24330a82b4 fix(mattermost): reject oversized websocket events (#99366)
* fix(mattermost): bound monitor websocket payloads

* fix(mattermost): preserve websocket payload headroom

Co-authored-by: sunlit-deng <yang.jiajun1@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 09:35:00 +01:00
Peter Steinberger
cc2c6a87dc fix(ios): skip onboarding for configured gateways (#101481)
* fix(ios): skip onboarding for configured gateways

Fixes #98570

* fix(ios): prioritize saved gateway state
2026-07-07 09:31:18 +01:00
LiLan0125
686b778468 fix(backup): isolate retry temp archives (#101449)
* fix(backup): isolate retry temp archives

Closes #101382

* fix(backup): remove unused retry path initializer

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-07 01:29:45 -07:00
Vincent Koc
6799b5b3d4 refactor(android): remove obsolete global cache cleanup (#101470) 2026-07-07 01:19:17 -07:00
LZY3538
a6352f9356 fix(status): surface auto-fallback model in status and session_status (#96126) (#101337)
* @
fix(status): surface auto-fallback model in status and session_status (#96126)

When a session falls back to an alternate model via auto-fallback
(modelOverrideSource: "auto"), both `openclaw status` and `session_status`
silently showed the active fallback model without indicating it differs
from the configured primary. The mismatch gate used
hasUserPinnedModelSelection() which returns false for auto-fallback.

- status.summary.ts: widen mismatch gate from hasUserPinnedModelSelection
  to entry?.modelOverride != null; emit distinct "fallback selected"
  reason alongside existing "session override"
- status.command-sections.ts: add fallback-specific wording ("auto
  fallback" / "check provider availability") while keeping the
  modelSelectionReason filter intact (no false-positive null-reason rows)
- status-message.ts: add sessionHasAutoFallback detection for the
  session_status RPC path; show "auto fallback" / "check provider" label
  instead of "pinned session" / "clear /model default"

Co-Authored-By: Claude <noreply@anthropic.com>
@

* fix(status): narrow fallback detection to real fallback provenance

Replace entry?.modelOverride != null with
hasSessionAutoModelFallbackProvenance(entry) to avoid mislabeling
configured subagent automatic model selections as provider fallback.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(status): distinguish configured models from fallback

Co-authored-by: LZY3538 <liu.zhenye@xydigit.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 09:17:58 +01:00
cxbAsDev
e1b79346c5 fix(signal): bound outbound container attachment file reads (#101391)
* fix(signal): bound outbound container attachment file reads

* fix(signal): honor configured container attachment limits

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 09:17:14 +01:00
Petros Dhespollari
6894bb7508 fix(gateway): persist media metadata in agent.request transcripts (#86936)
* fix(gateway): persist agent request transcript media

Route inline and offloaded agent.request images through the canonical user-turn transcript recorder across embedded, CLI, and ACP runtimes. Share ordered media persistence with chat.send and cover media-only empty-reply turns.

Co-authored-by: Petros Dhespollari <info@peterdsp.dev>

* fix(gateway): avoid transcript media shadowing

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 09:16:15 +01:00
Peter Steinberger
82b0f7cdc8 perf(test): use lightweight thinking fallback fixture 2026-07-07 03:59:28 -04:00
Peter Steinberger
48e77b6abf feat(ios): render inline LaTeX math in completed chat prose (#101388) 2026-07-07 08:46:31 +01:00
pick-cat
e72dadbb3b fix(anthropic): resolve thinking as disabled when legacy budget is below 1024 (#101415)
* fix(anthropic): resolve thinking as disabled when legacy budget is below 1024

When adjustMaxTokensForThinking collapses the thinking budget below the
Anthropic minimum (1024), option resolution now sets thinkingEnabled to
false instead of always forcing it to true. This keeps every downstream
consumer (payload, replay, temperature, tool-choice) consistent — they
all see the same disabled state instead of an enabled flag with a
missing or API-rejected thinking block.

|| → ?? in both builders is defensive: the resolution layer already
prevents invalid budgets from reaching the builder through the normal
path, but ?? preserves an explicit zero when the builder is called
directly.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(anthropic): guard raw streamAnthropic builder path against sub-minimum budgets

Add budget guards in both Anthropic payload builders so direct
streamAnthropic and bundled-plugin callers (e.g. Mantle) that bypass
option resolution also get the disabled-state rule instead of producing
API-rejected { type: "enabled", budget_tokens: < 1024 } requests.

Add proof-anthropic-thinking-budget.mts driving real production
functions with terminal output and negative control.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(anthropic): normalize legacy thinking budgets

Co-authored-by: Pick-cat <huang.ting3@xydigit.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 08:42:40 +01:00
Vincent Koc
07a765522a test(mcp): bind channel non-owner gateway client 2026-07-07 09:39:26 +02:00
wings1029
5c4b63964c fix(memory-host-sdk): handle stdout/stderr stream errors in runCliCommand (#101402)
* fix(memory-host-sdk): handle stdout/stderr stream errors in runCliCommand

Register error handlers on stdout and stderr streams in
runCliCommand() to prevent uncaught exceptions when a pipe
breaks (e.g. EPIPE after child process exit).

Without these listeners, Node.js throws an uncaught exception
that crashes the process.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(memory-host-sdk): extract listenForChildOutputErrors helper

Refactor the inline stream error handling into a reusable
listenForChildOutputErrors helper, matching the pattern
established in the merged #101370 (agent-core).

The helper registers error listeners on stdout/stderr via a
shared loop, keeping the pattern consistent across the codebase.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(memory-host-sdk): harden qmd stream failures

* fix(memory-host-sdk): harden qmd stream failures

* docs(changelog): note qmd stream hardening

* chore: keep release changelog out of contributor PR

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 08:37:21 +01:00
Vincent Koc
1aeed5ec26 refactor(plugins): localize private config types (#101452) 2026-07-07 00:34:46 -07:00