Commit Graph

4745 Commits

Author SHA1 Message Date
Vincent Koc
fc3f114a93 fix(macos): recover dashboard after gateway auth reconnect (#116080) 2026-07-30 05:22:38 +08:00
Vincent Koc
861b35ed44 fix(macos): allow dev source installs to finish (#116072) 2026-07-30 04:38:38 +08:00
Peter Steinberger
11de91ad03 fix(qa): forward-port beta 6 validation fixes (#116065)
* test(macos): avoid busy-spin timeout fixtures

* fix(qa): forward-port beta 6 validation fixes

* test(qa): complete Telegram run options fixture
2026-07-29 16:21:04 -04:00
Vincent Koc
b0a091644f fix(macos): prevent app stalls from stuck subprocess probes (#115938)
* refactor(macos): pin subprocess groups through cleanup

* refactor(macos): keep bounded process probes async

* test(macos): cover async process probe limits

* fix(macos): preserve local gateway version fallback

* test(macos): cover gateway version probe fallback

* fix(macos): handle subprocesses that exit before monitoring

* test(macos): stress instant bounded process exits

* fix(macos): close bounded process exit registration race

* fix(macos): preserve bounded probe output ordering

* fix(macos): propagate bounded process cancellation

* fix(macos): recover missed subprocess exit events

* chore(macos): refresh native i18n inventory

* fix(macos): reject invalid process argument bytes
2026-07-29 20:12:35 +00:00
Peter Steinberger
0021e51f22 feat(apple): media renditions, Now Playing, video upload (#116051)
* feat(apple): complete media playback and uploads

* fix(apple): preserve movie picker metadata

* fix(apple): harden rendition and picker routing

* style(apple): fix macOS media formatting
2026-07-29 15:50:18 -04:00
Peter Steinberger
e1cc617f86 feat(android): media renditions, MediaSession, video upload (#116037)
* feat(android): add media rendition and video support

* chore(android): refresh native i18n inventory

* fix(android): opt in to Media3 command API

* chore(android): sync native i18n source locations
2026-07-29 15:44:04 -04:00
Peter Steinberger
e0ab154e5e fix(ui): explain unavailable MCP tool catalogs (#115994)
* fix(ui): explain undiscovered MCP tools

* fix(ui): scope MCP discovery notices to the viewed connector
2026-07-29 15:12:08 -04:00
Peter Steinberger
777cfed85a feat(mac): hand off gateway-owned settings panes to the dashboard (#115999)
* feat(mac): hand off gateway-owned settings panes to the dashboard

Gateway-config Settings tabs (Channels, Skills, Cron Jobs, Threads,
Instances) now default to a native handoff page with an Open in Dashboard
deep link; a Debug toggle re-enables the legacy native panes. Adds an
openclaw:native-navigate host->shell event with generation-guarded URL
fallback, and lifts the dashboard route map + same-app path validation
into OpenClawKit for future iOS reuse. Exec Approvals stays native: the
Dashboard's host-native policy editor is read-only by contract.

* fix(mac): satisfy native-i18n inventory and type budget

* fix(mac): refresh native i18n source locations
2026-07-29 14:12:42 -04:00
Peter Steinberger
ff72f287c3 fix(gateway): declare viewer presence explicitly instead of deriving it from subscriptions (#116001)
* fix(gateway): declare viewer presence explicitly instead of deriving it from subscriptions

* refactor(ui): isolate viewer presence lifecycle ownership

* chore(protocol): register viewer presence schema owner

* fix(ui): keep viewer presence cleared after detach

* chore: drop changelog edits from this PR

CHANGELOG.md is release-owned; release generation derives entries from merged
PRs. Release-note context stays in the PR body.
2026-07-29 13:56:54 -04:00
Peter Steinberger
a914fcd1f7 fix(mac): hide duplicate Gateway in dashboard picker over SSH (#115963)
* fix(mac): dedupe active SSH gateway profile

* fix(mac): dedupe gateway before tunnel readiness

* chore(mac): defer release note to release process
2026-07-29 12:27:32 -04:00
Vincent Koc
e94693aa52 fix(macos): enable keyboard navigation in web views 2026-07-29 22:59:39 +08:00
Peter Steinberger
afae681085 feat(apple): add inline media players (#115903) 2026-07-29 10:36:38 -04:00
Peter Steinberger
80176dab8d feat(android): inline audio/video players with Media3 (#115916)
* feat(android): add inline media players

* fix(android): release inactive media players

* fix(android): preserve paused media playback

* test(android): include Media3 license notice

* chore(android): refresh native i18n inventory
2026-07-29 10:26:45 -04:00
Peter Steinberger
68a3d28906 fix: keep content after HTML-backed disclosures visible (#115877)
* fix(chat): close disclosures in coalesced HTML

Keep model-authored details closers visible to the shared disclosure contract when CommonMark absorbs them into type-6 HTML blocks across the Control UI and native apps.

* refactor(apps): isolate disclosure unfolding

Keep the native disclosure segmenter below its lint complexity and type-size limits, and refresh the source-owned native i18n inventory after the move.

* fix(apps): align disclosure helper visibility

Keep the extracted same-file helper compatible with Swift access control while leaving its implementation types hidden outside the source file.

* fix(apps): align source replacement visibility

Keep the source replacement helper at the same file-private boundary as the extracted disclosure unfolding types.
2026-07-29 10:24:46 -04:00
Vincent Koc
0686676ebd perf(macos): reduce onboarding mascot redraw cadence (#115896) 2026-07-29 21:50:05 +08:00
Vincent Koc
592f81ca33 fix(macos): eliminate subprocess polling for SSH tunnel readiness (#115846)
* fix(macos): inspect tunnel listener sockets in process

* test(macos): cover exact process listener inspection

* fix(macos): scan listeners to the child fd limit

* refactor(macos): normalize libproc byte counts

* chore(macos): keep release notes in the PR
2026-07-29 21:48:52 +08:00
Vincent Koc
1c3e669f30 fix(macos): bound SSH tunnel teardown (#115861)
* fix(macos): bound SSH tunnel teardown

* test(macos): cover resistant tunnel process groups

* fix(macos): escalate surviving tunnel process groups

* chore(i18n): refresh macOS tunnel source offsets

* chore(macos): keep release notes in the PR

* refactor(macos): own SSH tunnel process lifecycle

* test(macos): stress tunnel teardown lifecycle

* fix(macos): unpublish tunnels before async teardown

* chore(i18n): refresh macOS tunnel source offsets

* test(macos): remove unused tunnel process accessor

* fix(macos): preserve tunnel launch diagnostics

* test(macos): cover tunnel launch failures

* chore(i18n): refresh tunnel diagnostic offsets
2026-07-29 21:47:25 +08:00
Vincent Koc
7d00787e20 fix(macos): skip unchanged config forensics (#115886)
* perf(macos): skip unchanged config forensics

* test(macos): cover config forensic read caching

* test(macos): make config metadata changes deterministic
2026-07-29 21:42:36 +08:00
Vincent Koc
cba59e4674 fix(macos): prevent remote discovery hangs during Tailscale checks (#115852)
* fix(macos): bound discovery subprocess execution

* refactor(macos): migrate tailscale discovery runner

* refactor(macos): make wide-area discovery asynchronous

* test(macos): prove discovery subprocess cleanup

* chore(macos): keep release notes in the PR
2026-07-29 21:38:57 +08:00
Colin Johnson
306c02af57 feat(ui): preview session workspace images (#95956)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 09:22:46 -04:00
Peter Steinberger
adf3178ae6 feat(gateway): expose MCP tool identity in effective tools (#115870)
* feat(gateway): expose MCP tool identity in effective-tools catalog

* docs(agents): comment utility-tool pass gate invariant
2026-07-29 08:41:04 -04:00
Vincent Koc
6e046daf82 fix(macos): reap timed-out shell process groups (#115859)
* fix(macos): reap timed-out shell process groups

* test(macos): cover shell timeout process cleanup

* fix(macos): finish timeout process-group escalation

* fix(macos): preserve inherited shell input

* chore(macos): keep release notes in the PR
2026-07-29 20:28:16 +08:00
Peter Steinberger
1ab4e08d62 fix: expanded disclosures render their content on Apple platforms (#115863)
* fix(apps): render disclosure body content on Apple platforms

* chore(apps): refresh native i18n inventory
2026-07-29 08:14:17 -04:00
Peter Steinberger
8915f9c337 fix(gateway): prevent overlapping setup after wizard cancellation (#115856)
* fix(wizard): retain cancelled sessions until runner settles

* fix(wizard): purge cancelled sessions after settlement

* test(gateway): cover settled wizard replacement

* test(gateway): split wizard cancellation e2e

* test(gateway): fix wizard e2e env key types

* fix(gateway): forward daemon choice through wizard RPC

Co-authored-by: TheAngryPit <16145902+TheAngryPit@users.noreply.github.com>

* test(gateway): harden wizard cancellation cleanup

Co-authored-by: TheAngryPit <16145902+TheAngryPit@users.noreply.github.com>

* chore: drop changelog edit (release generation owns it)

---------

Co-authored-by: TheAngryPit <16145902+TheAngryPit@users.noreply.github.com>
2026-07-29 07:49:25 -04:00
Peter Steinberger
4c4aa2ed12 feat(gateway): manage audio and video attachments end to end (#115842)
* feat(gateway): manage audio and video attachments

* feat(gateway): preserve generated media metadata

* fix(gateway): align seeded managed media

* fix(gateway): scope pending media trust by URL

* fix(gateway): split managed media by trust

* fix(gateway): require terminal media trust unanimity

* fix(gateway): align managed media metadata types

* fix(gateway): refresh managed media contracts

* chore(ci): model managed media test seams

* test(sessions): expect canonical media kinds
2026-07-29 07:27:36 -04:00
Peter Steinberger
662abec754 feat(gateway): push session PR indicators to subscribed clients (#115643)
* feat(gateway): push session PR indicators to subscribed clients

* test(gateway): fix PR indicator drift

* chore(protocol): allowlist PR-indicator event for native apps (Control UI surface)

* test: align PR indicator lifecycle coverage

* fix(ui): scope session PR store listeners to active watchers
2026-07-29 06:30:01 -04:00
Vincent Koc
951e7a39bd fix(protocol): make Swift model checks non-mutating (#115793)
* fix(protocol): make Swift drift checks non-mutating

* test(protocol): cover core Swift gateway frames

* docs(protocol): clarify Swift model update flow
2026-07-29 18:17:36 +08:00
Peter Steinberger
4232126bba chore: update dependencies across workspace (#115677)
* chore(deps): update dependencies

* fix(deps): restore CI compatibility
2026-07-29 05:16:42 -04:00
Peter Steinberger
e8524a5839 feat: add Fish Audio S2.1 and local MLX speech (#115790)
* feat: add Fish Audio speech support

* chore: remove unused speech exports

* chore: keep Fish API constant private

* test: remove stale code mode import

* style: use bracket access for Fish voice ids

* test: restore QA evidence validator import
2026-07-29 05:15:33 -04:00
Peter Steinberger
a37a5a6575 feat(agents): add per-session tool overrides (#115785)
* feat(agents): per-session tool overrides (mcp/skills/web-search)

* test(agents): use tracked MCP temp dirs
2026-07-29 05:13:56 -04:00
Peter Steinberger
85afb973e4 fix(ios): keep stop available for staged voice notes (#115744) 2026-07-29 04:31:07 -04:00
Vincent Koc
14940edf15 feat(skills): add Skill Workshop lifecycle hooks (#115606)
* feat(skills): add lifecycle hook contracts

* feat(plugins): expose skill hook contracts

* feat(plugins): identify skill evaluators

* feat(skills): persist proposal evaluation lifecycle

* feat(skills): add agent evaluation action

* feat(skills): emit committed skill lifecycle changes

* feat(gateway): expose skill proposal evaluation lifecycle

* feat(ui): add Skill Workshop evaluations

* fix(skills): bind lifecycle state to proposal revisions

* fix(skills): preserve lifecycle events without artifacts

* feat(cli): evaluate skill proposals

* fix(ui): bind evaluations to proposal revisions

* docs(skills): document lifecycle hook primitives

* chore(plugin-sdk): refresh skill hook surface

* fix(skills): harden proposal evaluator execution

* fix(plugins): isolate skill evaluator inputs

* fix(cli): align skill lifecycle deadlines

* fix(skills): preserve evaluation replay invariants

* test(ui): capture Skill Workshop evaluation proof

* fix(skills): bind apply to evaluated target tree

* fix(skills): preserve evaluation contract edges

* fix(skills): bound evaluation event storage

* chore(skills): keep lifecycle helpers internal

* refactor(skills): isolate evaluation persistence

* fix(skills): satisfy lifecycle validation gates

* chore(protocol): refresh Skill Workshop clients

* docs: refresh Skill Workshop map

* chore: keep release notes in PR metadata

* docs: refresh merged docs map

* fix(ci): type Code Mode catch errors

* fix(skills): freeze lifecycle observation payloads

* fix(protocol): keep proposal inspect backward-decodable

* fix(skills): enforce final evaluator bundle limits

* fix(skills): preserve lifecycle caller attribution

* chore: drop subsumed Code Mode formatting

* test(plugins): adapt lifecycle hook mocks
2026-07-29 15:49:44 +08:00
Peter Steinberger
844329284e fix(ios): prevent duplicate native chat replies after tool runs (#115678) 2026-07-29 02:59:25 -04:00
Peter Steinberger
138675aeeb feat(apps): render collapsible details natively (#115641)
* feat(apps): render collapsible details natively in chat

* fix(apps): preserve reference definitions when folding disclosures

* fix(apps): keep authored details summaries unlocalized

* fix(apps): keep raw-HTML disclosure examples literal

* refactor(apps): isolate summaries and raw HTML contexts

* fix(apps): honor all CommonMark raw HTML contexts in disclosures

* chore(apps): refresh native i18n inventory for disclosure strings
2026-07-29 02:52:54 -04:00
Peter Steinberger
b2701ac9cf fix(mac): prevent app auth from blocking node-host startup (#115533)
* fix(mac): move device auth tokens to shared SQLite state

* fix(mac): fail identity migration when source auth vanishes mid-read

Missing-file tolerance now applies only to the first observation; a disappearance after the auth file was observed fails the migration so the claimed identity survives for retry instead of committing without its credentials.

* fix(ios): validate auth scope UTF-8 encoding

* fix(ios): isolate SQLite auth profiles

* chore(ios): refresh native source inventory

* fix(mac): keep device auth in the shared token table

* test(mac): pin shared-key token cache semantics
2026-07-29 02:33:03 -04:00
Peter Steinberger
117e44cb80 fix(linux): package media codecs for deb and AppImage (#115616)
* fix(linux): package media codecs

* fix(linux): bundle AppImage media codecs

* docs: refresh Linux page map
2026-07-29 02:03:55 -04:00
Vincent Koc
5ecd5f45db chore(i18n): refresh native locales (#115608) 2026-07-29 13:59:04 +08:00
Peter Steinberger
26bfa88bb2 fix: restore native Talk transcripts, fallback, and microphone access (#115577)
* fix(ios): decode frameless Talk events

* fix(android): keep browser-only Talk models native

* fix(macos): gate dashboard media capture

* docs(talk): clarify native platform fallbacks

* chore(i18n): refresh native source inventory

* fix(android): gate relay entry on provider-level browser-only models too
2026-07-29 01:55:47 -04:00
Peter Steinberger
df9a940872 feat(chat): show live run telemetry across clients (#113084)
* feat(chat): show live run telemetry across clients

* fix(chat): satisfy native validation gates

* fix(chat): settle advertised terminal runs

* fix(android): clear stale run usage on gaps

* chore(i18n): align native source inventory

* fix(chat): reconcile telemetry with current projections

* refactor(chat): keep run state in owner extensions

* chore(i18n): refresh native source inventory

* test(ui): expect persistent working telemetry through streaming
2026-07-29 01:27:58 -04:00
Vincent Koc
c0a472f0b2 chore(i18n): refresh native locales (#115532) 2026-07-29 13:11:40 +08:00
Peter Steinberger
1d57a4989b fix(mac): stop repeated exec approvals migration retries (#115502)
* fix(mac): classify exec-approvals migration errors and stop retry storm

* fix(mac): refresh native i18n inventory
2026-07-29 01:09:22 -04:00
Peter Steinberger
65f99734b2 fix(mac): recover interrupted device identity import after source recreation (#115494)
* fix(mac): drop stale native identity claim when key material matches

* fix(mac): acquire stale identity claim before deletion

* fix(mac): park stale identity claim instead of deleting it

Rescue path now contains no destructive unlink: the acquired claim is parked as .stale-<uuid> and validated before any continue path, closing both replacement races review found.

* fix(mac): restore parked claim when the rescue source vanishes

Review round 4: accepted the vanished-source regression (restore before continue so claim-without-source stays importable); rejected serializing the source acquisition - rescue imports nothing and post-rescue source writes follow the standard atomic claim-then-import path (invariant documented inline).

* style(apple): satisfy device identity SwiftFormat
2026-07-29 00:59:54 -04:00
Peter Steinberger
7f58f693b9 fix(ios): request motion access on first use (#115523) 2026-07-28 23:56:04 -04:00
yuvraj thakur
efec26b2df fix(ios): Apple Watch chat inherits thinking defaults (#111301)
* fix(thinking): fall back instead of erroring on unsupported adaptive level (#109351)

The adaptive level is the auto sentinel (normalizeThinkLevel maps auto ->
adaptive) meaning 'pick an appropriate level', not 'force this exact level'.
Some clients (e.g. the Apple Watch client) send it as a transport default
while the iOS app sends none, so hard-erroring on an unsupported adaptive
override rejected otherwise-valid turns from those clients. Now the auto
sentinel always falls back to a supported level; explicit concrete levels
(e.g. an explicit /think xhigh) still hard-error as before.

Closes #109351

* docs(proof): add real-behavior-proof screenshot + run log for #111301

Captured run of the real get-reply-run.media-only test (101 passed)
showing the adaptive-thinking fallback fix verified.

Co-Authored-By: yuvrajlaptop2008-byte <284412773+yuvrajlaptop2008-byte@users.noreply.github.com>

* fix(ios): inherit Watch chat thinking defaults

Co-authored-by: yuvraj thakur <284412773+yuvrajlaptop2008-byte@users.noreply.github.com>

* chore(ios): sync native i18n inventory

---------

Co-authored-by: yuvrajlaptop2008-byte <284412773+yuvrajlaptop2008-byte@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 23:24:22 -04:00
Peter Steinberger
49f4942760 fix(chat): preserve literal Markdown image examples (#113904) 2026-07-28 16:12:08 -04:00
Peter Steinberger
773d60dfb9 fix(macos): bound websocket ping so a dropped pong cannot orphan its continuation (#115362)
* fix(macos): bound websocket ping so a dropped pong cannot orphan its continuation

URLSession drops the pong handler entirely when a web socket task is cancelled or
closed mid-flight. The existing gate guarded a double resume but nothing guarded
zero resumes, so the checked continuation leaked, Swift logged CONTINUATION
MISUSE, and keepaliveLoop's await never returned - wedging the keepalive for the
lifetime of the process.

Race the ping against a deadline and reuse the gate so exactly one resume wins.
Cancellation of the deadline returns without resuming, otherwise a delivered pong
would race the gate and surface as a spurious timeout.

* fix(macos): reuse URLError(.timedOut) instead of a new public ping error

Periphery flags a public enum referenced only inside its own module as dead
code in the shared OpenClawKit intersection scan. URLError keeps the timeout
indistinguishable from a transport timeout for callers, which already handle
URLSession errors from every other path, and adds no public surface.
2026-07-28 14:58:16 -04:00
Peter Steinberger
5e3a8e37a3 feat(gateway): add memory.search operator method (#115346)
* feat(gateway): add memory.search operator method

* fix(gateway): validate memory.search agentId against configured agents

* test(gateway): keep memory.search handler tests core-only

* chore(protocol): regenerate android method registry for memory.search

* test(gateway): type memory.search stub results
2026-07-28 14:40:25 -04:00
NianJiu
1a319f9a78 fix(android): keep welcome action reachable with large text (#111747)
* fix(android): keep welcome action reachable with large text

* test(android): isolate Compose host theme

* fix(android): keep gateway setup usable with large text

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>

---------

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 14:39:33 -04:00
metaforismo
430de2299c fix(ios): use configured speech language for system voice (#113372)
* fix(ios): honor speech locale for system voice

* chore(ios): refresh talk locale i18n inventory

* fix(ios): fall through unavailable system voices

* chore(ios): refresh talk locale i18n inventory

---------

Co-authored-by: Colin Johnson <colin@solvely.net>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 14:10:23 -04:00
Peter Steinberger
5d1311c19e test(macos): block real process fallthrough (#113337)
* test(macos): block real process fallthrough

* test(macos): cover SwiftPM helper executable paths

Co-authored-by: Peter Steinberger <steipete@gmail.com>

* test(macos): avoid process-age timing assumption

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 13:21:10 -04:00