Commit Graph

64379 Commits

Author SHA1 Message Date
Peter Steinberger
e596e2850d fix(control-ui): keep the dashboard mounted with a reconnect banner on gateway drops (#100479)
* fix(control-ui): keep the dashboard mounted with a reconnect banner on gateway drops

Once a session is established, a dropped gateway WebSocket no longer
unmounts the dashboard into the login gate. The client's close handler
now reports willRetry (the same fact that drives its reconnect
scheduling), the gateway store derives a `reconnecting` snapshot state
from it (everConnected && willRetry), and the app shell stays mounted
with an amber "Gateway connection lost - reconnecting" banner plus a
Retry now action while the client retries with backoff. The login gate
is reserved for first connects, credential rejections, and manual gate
submissions; event-gap recovery also no longer flashes the gate.

createApplicationGateway moved from bootstrap.ts to gateway-store.ts
with an injectable client factory for direct behavior tests. Adds the
previously unstyled `.callout.warn` variant and a "Connection loss and
reconnect" docs section.

Fixes #100475

* chore(i18n): regenerate control-ui locale bundles for connection banner strings

* chore(control-ui): unbreak CI - add reconnecting to overlays snapshot fixture, regenerate docs map

* chore(i18n): re-sync locale metadata after rebase onto refreshed main locales

* chore(i18n): refresh raw-copy baseline after rebase
2026-07-06 02:55:07 +01:00
Peter Steinberger
4a5bdc6ae3 fix(macos): orphaned SSH tunnels from crashed app instances keep running and squat the preferred local port (#100489)
* fix(macos): reap orphaned SSH tunnels that survive app crashes and squat the preferred local port

* chore(i18n): sync native app string inventory for PortGuardian changes
2026-07-06 02:53:33 +01:00
Peter Lee
2b773a65f6 fix(anthropic): keep OAuth callback on loopback (#96917)
* fix(anthropic): restrict OAuth callback host to loopback addresses and derive redirect URI

* fix(anthropic): restore localhost as default OAuth callback host to match shipped behavior

* fix(anthropic): defer OAuth callback host validation to login path

* refactor(anthropic): bind callback host independently

Co-authored-by: xialonglee <li.xialong@xydigit.com>

* docs(changelog): note Anthropic callback fix

Co-authored-by: xialonglee <li.xialong@xydigit.com>

* fix(oauth): satisfy Anthropic callback lint

Co-authored-by: xialonglee <li.xialong@xydigit.com>

* chore: defer Anthropic OAuth changelog

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 02:52:15 +01:00
Tyler Nishida
2db5bd3394 feat(ios): refresh onboarding setup flow (#98868) 2026-07-05 21:38:54 -04:00
Peter Steinberger
a1f4aa4a3b fix(agents): preserve media side merges during prompt release (#100490)
* fix(agents): preserve active leaf during side merges

Co-authored-by: scotthuang <scotthuang@tencent.com>

* fix(agents): validate explicit side-branch cursors

Co-authored-by: scotthuang <scotthuang@tencent.com>

* chore: defer prompt-release media changelog

---------

Co-authored-by: scotthuang <scotthuang@tencent.com>
2026-07-06 02:37:54 +01:00
Peter Steinberger
9099f421d4 docs(changelog): credit control UI fixes (#100533) 2026-07-06 02:36:56 +01:00
Moeed Ahmed
0e0f0b16cd fix(telegram): show typing for accepted topic messages (#99965)
Co-authored-by: Moeed Ahmed <5780040+moeedahmed@users.noreply.github.com>
2026-07-05 18:36:49 -07:00
Peter Lee
7cabd19268 fix(voice-call): deliver early TTS via onEarlyText before compaction wait (#94015)
* fix(voice-call): speak before post-turn compaction

Co-authored-by: xialonglee <li.xialong@xydigit.com>

* fix(voice-call): satisfy flush callback contracts

* test(agents): assert block reply message context

* fix(voice-call): preserve deferred answer boundaries

* fix(voice-call): type tool boundary message index

* test(voice-call): initialize tool boundary index

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 02:34:22 +01:00
Peter Steinberger
4f8eeeaca9 fix(ui): bind stale run state to run identity (#100527)
Co-authored-by: Tiffany Chum <tiffanychum@users.noreply.github.com>
2026-07-06 02:33:40 +01:00
Peter Steinberger
c0e57db8f4 docs(changelog): note browser attachment downloads (#100532) 2026-07-06 02:29:26 +01:00
xingzhou
7a49b160a4 fix(browser): downloads complete over CDP connections (#89416)
* fix(browser): surface navigate downloads in CDP mode

* Validate navigation downloads before saving

* fix(browser): observe navigation download capture timeouts

* refactor(browser): unify managed download capture

* test(browser): satisfy download fixture lint

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 02:26:20 +01:00
Peter Steinberger
797bca251e fix(ui): remove redundant file-preview Escape hint (#100528)
Co-authored-by: 咸士山 0668001391 <xian.shishan@xydigit.com>
2026-07-06 02:25:17 +01:00
mushuiyu886
08852d2bf7 fix #98107: Gateway regenerates service-env file on every restart, wiping Telegram bot tokens (#99124)
* Preserve LaunchAgent env-file SecretRefs

* fix gateway start repair env source preservation

* test(daemon): cover SecretRef ownership cleanup

Co-authored-by: mushuiyu886 <mushuiyu886@users.noreply.github.com>

* fix(daemon): preserve only active SecretRefs

Co-authored-by: 杨浩宇0668001029 <yang.haoyu@xydigit.com>

* chore: defer service SecretRefs changelog

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: mushuiyu886 <mushuiyu886@users.noreply.github.com>
2026-07-06 02:24:39 +01:00
Peter Steinberger
f12312d69b fix(ui): align Skills filters (#100526)
Co-authored-by: 杨爱文 <yang.aiwen@xydigit.com>
2026-07-06 02:24:11 +01:00
Peter Steinberger
286c020748 fix(ui): preserve autonomous tool failures (#100514)
* fix(ui): preserve autonomous tool failures

Co-authored-by: qingminlong <qing.minlong@xydigit.com>

* chore: defer release note to maintainer batch

---------

Co-authored-by: qingminlong <qing.minlong@xydigit.com>
2026-07-06 02:23:03 +01:00
Peter Steinberger
d6f0747f69 fix(android): harden offline cache lifecycle (#100454)
* fix(android): harden offline cache lifecycle

* docs(changelog): harden Android offline cache lifecycle

* fix(android): drain terminal gateway work safely

* test(android): cover queued command purge

* chore(android): refresh native i18n inventory

* docs(changelog): avoid duplicate offline cache entry
2026-07-06 02:21:15 +01:00
xingzhou
a77ea59ce7 fix(bedrock): bound Mantle model discovery fetches (#99961)
* fix(bedrock): bound Mantle model discovery fetches

* fix(bedrock): release rejected Mantle responses

* docs(changelog): position Bedrock Mantle fix

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 02:21:00 +01:00
morluto
f1a374a73a fix(channels): normalize phone identities with stray plus signs (#100467)
* fix(channels): canonicalize phone identity digits

* test(channels): cover phone identity normalization

* test(whatsapp): use shared phone normalizer

* fix(channels): reject invalid normalized phone identities

* fix(signal): preserve strict account input validation

* fix(signal): preserve prefixed allowlist input

* docs(changelog): stabilize phone identity entry

* chore(changelog): defer phone identity entry

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 02:19:11 +01:00
Totó Busnello
3c2316c43c fix(agents): preserve streamed assistant text when Claude CLI result event is empty (#90450)
* fix(agents): preserve streamed Claude CLI replies

Co-authored-by: Luiz Antonio Busnello <246086438+totobusnello@users.noreply.github.com>

* fix: preserve Claude live commentary boundaries

* docs(changelog): stabilize Claude CLI entry

* chore(changelog): defer Claude CLI entry

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Luiz Antonio Busnello <246086438+totobusnello@users.noreply.github.com>
2026-07-06 02:18:20 +01:00
Peter Steinberger
a6e19fe014 fix(slack): avoid repeated thread root media (#100516)
* fix(slack): avoid repeated thread root media

* test(slack): cover reset thread media seeding
2026-07-06 02:17:44 +01:00
Peter Steinberger
eda9b9fb18 perf(test): shorten TUI PTY cleanup 2026-07-05 21:14:38 -04:00
Peter Steinberger
76154d9275 test(macos): deflake browser proxy gate tests via injectable browser control (#100517)
MacNodeRuntime's browser proxy gate read OPENCLAW_CONFIG_PATH-resolved config
at invoke time, so parallel tests mutating process env (raw setenv outside
TestIsolationLock in LogLocatorTests/WideAreaGatewayDiscoveryTests) could make
the gate read the real host config. Inject the gate state in tests, cover the
config flag parsing in OpenClawConfigFileTests, and route remaining raw setenv
test users through TestIsolation.withEnvValues.
2026-07-06 02:13:05 +01:00
pick-cat
ca4e8a7dc8 fix(skills): apply command description limits per channel (#99593)
* fix(skills): keep command spec descriptions UTF-16 safe at the truncation cut

* chore: fix oxlint no-unnecessary-type-assertion in test

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

* chore: fix Skill type completeness in test fixture

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

* fix(skills): prove UTF-16-safe command truncation

* fix(skills): apply description limits per channel

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 18:12:51 -07:00
Peter Steinberger
60cf7eaa00 feat(ui): make the sidebar session-first and minimal (#100386)
* feat(ui): bolder sidebar minimalism — pinned/chats session groups, compact icon footer, no brand header

* test(ui): align fixtures with single default pinned route; document pinned-cap invariant

* fix(ui): preserve sidebar session groups

* fix(ui): polish minimal sidebar behavior

* fix(ui): avoid duplicate pinned chat fallback

* docs(changelog): note sidebar layout refresh

* chore(i18n): preserve sidebar locale metadata

* fix(ui): reuse localized sessions label

* test(ui): follow localized sessions label

* chore(ui): trim sidebar landing churn

* docs(ui): update minimal sidebar guidance
2026-07-06 02:08:02 +01:00
Ben.Li
b170c08e6d fix(ios): reject loopback-prefix hosts for auth retry (#99859)
* fix(ios): require parsed loopback hosts for auth retry

* fix(ios): narrow device token retry loopback trust

* test(ios): cover trusted auth retry hosts

* docs(changelog): position iOS auth retry fix

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 02:05:21 +01:00
Daniil Artemov
733b464e1e fix: apply thread routing to plugin actions (#80293)
* fix: apply thread routing to plugin message actions

* fix(outbound): preserve plugin action threads

---------

Co-authored-by: Cortex <cortex@cortex-mac.local>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 02:02:06 +01:00
cxbAsDev
5a31666a06 fix(gateway): catch lazy import rejections in runtime event subscriptions (#100401)
* fix(gateway): catch lazy import rejections in runtime event subscriptions

* fix(gateway): consolidate event dispatch failures

* docs(changelog): note gateway event dispatch fix

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 01:53:13 +01:00
Peter Steinberger
95f12178a7 perf(ci): shorten stalled gateway retry 2026-07-05 20:40:16 -04:00
Peter Steinberger
ce294dd96b docs(changelog): note browser cookie persistence (#100507) 2026-07-06 01:34:41 +01:00
NianJiu
e7c2198722 fix: avoid English audio prompt for non-English STT hints (#99023)
* fix media audio prompt language bias

* refactor(media): narrow multilingual STT prompt handling

---------

Co-authored-by: NianJiuZst <180004567+users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 01:34:20 +01:00
Andy Ye
d9289a19e1 fix(browser): persist managed Chrome cookies across restarts (#98284)
* fix(browser): preserve managed Chrome cookies

* fix(browser): guard graceful close process ownership

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 01:32:13 +01:00
scoootscooob
7e7fc0075e [codex] Honor all ack scope for room events (#87433)
* fix(discord): honor all ack scope for room events

* fix(channels): align all ack scope for room events

* fix(channels): centralize ambient ack scope

* test(telegram): restore room-event ack fixture

* test(discord): satisfy promise executor lint

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 01:28:41 +01:00
Peter Steinberger
2c31af1364 refactor(auto-reply): harden empty reply delivery (#100474)
* refactor: centralize visible delivery evidence

* fix: enforce queued delivery policy

* fix: normalize queued fallback delivery

* fix: confirm queued notice delivery

* fix: track direct compaction delivery

* test: align compaction retry fallback

* test: cover terminal compaction delivery

* fix: normalize followup payload visibility

* fix: prepare empty direct reply fallbacks

* fix: align block delivery visibility

* fix: distinguish progress from reply delivery

* test: assert recovery after compaction progress

* fix: retain queued reply ownership through recovery

* fix(auto-reply): require visible messaging evidence

* refactor(auto-reply): remove duplicate empty-reply paths

* docs(changelog): clarify empty-reply guarantees

* fix(auto-reply): preserve terminal reply semantics

* test(auto-reply): type silent followup cases

* fix(auto-reply): preserve group silence policy

* fix(agents): retain rich delivery evidence
2026-07-06 01:18:27 +01:00
Peter Steinberger
04a6a31859 perf(test): isolate gateway health startup imports 2026-07-05 20:14:49 -04:00
Peter Steinberger
c9349d1fb4 fix(build): make tsdown configs self-contained (#100499)
Co-authored-by: Peter Steinberger <steipete@openai.com>
2026-07-06 01:06:02 +01:00
Peter Steinberger
5d8293c1fe feat(ios): read-only offline cache for chat sessions and transcripts (#100219)
* feat(ios): read-only offline cache for chat sessions and transcripts

Cache-first cold open for the iOS chat tab: the last known transcript and
session list render immediately from a local SQLite cache, then live gateway
history replaces them wholesale through the existing reconciliation path.
When the gateway is unreachable, recent sessions and transcripts stay
browsable read-only; sending remains gated by the existing connection state.

- New OpenClawChatTranscriptCache protocol seam plus SQLite-backed store in
  OpenClawChatUI (raw SQLite3, no new dependencies), scoped per gateway
  stableID so transcripts never leak across paired gateways.
- Bounds: 50 sessions, 50 transcripts, 200 messages per session; text rows
  only (attachment/binary payloads and tool arguments are stripped).
- Disposable cache: schema versioned via user_version; any open/schema/decode
  mismatch drops and rebuilds silently. File protection
  completeUntilFirstUserAuthentication on iOS.
- View model pre-paints from cache only until a live response applies
  (hasAppliedLiveHistory/hasAppliedLiveSessions guards); write-through is
  chained and off the render path.
- iOS wiring keys the chat view model identity on transport mode plus cache
  gateway ID so switching paired gateways rebuilds the view model.

Part of #100194

* fix(ios): harden offline transcript cache

* fix(ios): expose offline cached sessions

* fix(ios): isolate transcript caches by gateway

* chore(i18n): sync native inventory

* fix(ios): allow cache extension to replace messages
2026-07-06 01:02:15 +01:00
Ben.Li
5199f55ebe fix(gateway-protocol): trim connect error detail codes in readConnectErrorDetailCode (#99555)
* fix(gateway-protocol): trim connect error detail codes in readConnectErrorDetailCode

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore: add connect error detail code trim proof script

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore(gateway-protocol): drop proof-only trim script

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 00:59:12 +01:00
Hemant Sudarshan
bacd1c512a fix(browser): time out remote tab enumeration (#80147)
* fix(browser): time out remote tab enumeration

* chore: remove stale changelog entry

* fix(browser): isolate timed-out read cleanup

* fix(browser): isolate timed-out read cleanup

* test(browser): satisfy connection regression lint

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 00:56:05 +01:00
qingminlong
6a62a04f59 fix(android): synchronize realtime tool completions (#100049)
* fix(android): synchronize realtime tool completions

* refactor(android): unify realtime tool completion state

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 00:49:21 +01:00
pick-cat
f13ce2db96 fix(agents): bound body-less MCP HTTP text responses (#98143)
* fix(agents): bound body-less MCP HTTP text responses

* fix(agents): fail closed on unbounded MCP text fallback

* test(agents): cover lying MCP bodyless content length

* fix(agents): reject malformed MCP content length

* chore: drop unused FinalizationRegistry after rebase

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

* test(mcp): consolidate bounded response cases

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

* fix(mcp): reject unbounded bodyless responses

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-06 00:47:40 +01:00
Peter Steinberger
5fde96059e test(macos): remove stale Crestodian onboarding test (#100497)
Co-authored-by: Peter Steinberger <steipete@openai.com>
2026-07-06 00:47:10 +01:00
Peter Steinberger
2ded26a5d6 fix(diffs): share SSR preloads and repair language-pack hydration (#100487)
* fix(diffs): share SSR preloads and repair language-pack hydration

Render viewer and file documents from a single @pierre/diffs SSR preload
per file (mode=both previously ran the full diff+highlight pipeline
twice; 651ms -> 303ms on an 8-file patch), apply the file-mode font bump
as a document-level override, and keep hydration payloads
variant-faithful.

Fix the language-pack runtime downgrading pack-only languages to plain
text at hydration by defining a per-target build flag and forwarding it
to payload normalization.

Also: case-insensitive language hints, identical before/after
short-circuit with details.changed, patch input failures classified as
tool input errors, canonical config values now win over deprecated
aliases, hash-pinned viewer runtime served immutable, truthful
browser-vs-render errors, timing-safe artifact token compare, unref
idle browser timer.

* docs(changelog): link diffs rendering entry to PR

* test(diffs): narrow manifest validation results before value access

* test(tooling): allowlist diffs viewer-client define suppression
2026-07-06 00:34:17 +01:00
Peter Steinberger
f20159e240 perf(ci): accelerate gateway startup tests 2026-07-05 19:31:28 -04:00
Peter Steinberger
88784679ab docs(changelog): stage remote browser reliability fix (#100495) 2026-07-06 00:28:44 +01:00
Peter Steinberger
5c3e938e70 feat(android): syntax-highlighted code blocks in chat (#100217)
* feat(android): syntax-highlight fenced code blocks in chat markdown

* fix(android): handle escaped triple quotes in highlighting

* docs(changelog): note Android code highlighting

* docs(changelog): keep Android highlighting unreleased

* chore(android): sync native i18n inventory
2026-07-06 00:27:40 +01:00
Peter Steinberger
65aec96440 fix(ios): simplify development app name (#100466) 2026-07-06 00:22:14 +01:00
Kevin Lin
9d2d517296 feat: publish plugins with extended-stable releases (#100448)
* feat(release): publish plugins on extended-stable

* feat(plugins): align extended-stable with core

* docs: explain extended-stable plugin alignment

* fix(release): make plugin convergence recoverable

* fix(plugins): preserve extended-stable fallback intent

* fix(release): keep plugin tag mutation credential-isolated
2026-07-05 16:16:26 -07:00
Peter Steinberger
a4e728feca perf(test): isolate gateway memory startup imports 2026-07-05 19:16:05 -04:00
Gorkem Erdogan
e7c0673fc5 fix(slack): react action rejects emoji glyphs; member-info userId affordance unclear (#100375)
* fix(slack): normalize react emoji glyphs and clarify member-info userId param

Slack's reactions.add/remove only accept shortcode names, never a raw
Unicode glyph, but the react action's emoji param had no description
steering models away from passing one, so calls like
emoji="" failed with invalid_name. Consolidates the glyph-to-shortcode
map that already existed privately in the ack-reaction dispatch path into
the shared normalizeSlackEmojiName export in actions.ts, the layer that
owns the actual Slack API calls, so the message-tool react action gets the
same normalization.

Also tightens the generic userId param description so models stop trying
target on member-info, which has no target mode and requires userId
directly.

* fix(slack): preserve emoji reaction semantics

* fix(slack): default reactions to inbound message

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 00:15:32 +01:00
sunlit-deng
2525ea41fd fix(openai): bound realtime voice websocket payload at 16 MiB (#99450)
* fix(openai): bound realtime voice websocket payload at 16 MiB

* test(openai): cover realtime voice payload cap

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 00:12:27 +01:00