Commit Graph

893 Commits

Author SHA1 Message Date
Peter Steinberger
b2cecd8ece feat(android): hide thinking control and gate sends for models without reasoning support (#101002) 2026-07-07 03:23:08 +01:00
Vincent Koc
7bbe75089a test(android): isolate gateway bootstrap prefs 2026-07-07 03:35:58 +02:00
Colin Johnson
82106a18b3 fix(android): stabilize recent sessions overview (#101161) 2026-07-06 21:20:06 -04:00
WhatsSkiLL
4b3941c7f2 fix(android): tune screenshot mode visual sizing (#100895)
* fix(android): tune screenshot mode visual sizing

* chore(android): refresh screenshot i18n inventory

* refactor(android): simplify screenshot mode sizing

---------

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 02:01:02 +01:00
WhatsSkiLL
bce414d8b8 improve(android): align command palette row affordances (#101072)
* android: tidy command palette row affordances

* docs(android): credit command palette polish

---------

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 01:14:46 +01:00
Peter Steinberger
4c97aa1311 feat(mobile): rename, delete, and create session groups on iOS and Android (#101234)
* feat(mobile): rename, delete, and create sidebar session groups on iOS and Android

Group section headers on the iOS Command Center sessions screen and the
Android sessions screen gain Rename/New/Delete group actions. Bulk ops
enumerate every member (active + archived, explicit high list limit since
the gateway caps an absent limit at 100 rows) and patch category per
session; delete keeps sessions and moves them to Ungrouped. Known custom
groups persist client-side (iOS UserDefaults, Android SharedPreferences)
so empty groups stay visible as move targets.

* chore(i18n): refresh native string inventory after rebase onto main
2026-07-07 01:09:57 +01:00
Peter Steinberger
054e3675e1 feat(android): publish signed APKs with stable releases (#101212)
* feat(android): publish signed release APKs

* fix(android): preserve fallback corrections

* test(android): isolate APK signer fixtures

* docs: refresh generated docs map
2026-07-07 00:39:59 +01:00
Peter Steinberger
93eaf5affb feat(android): server-backed session search with offline fallback (#101102)
The sessions screen gains a debounced search field under the filter pills,
wired to server-side sessions.list search in Recent and Archived scopes.
Results flow through the existing filter/sort/grouping pipeline so pinned
and grouped rendering stay intact while searching.

ChatController.fetchSessionList performs the one-shot search without touching
live list state, falls back to locally filtering the cached active list when
the gateway is unreachable (archived rows exist only server-side, so archived
search is empty offline), and rethrows CancellationException before the
fallback so a superseded search never repaints stale rows over a newer query.

Refs #100712
2026-07-07 00:03:28 +01:00
Peter Steinberger
ef1767baca feat(android): record and send voice notes from the chat composer (#101193)
* feat(android): record and send voice notes from the chat composer

Adds tap-to-record voice notes to both Android chat composers: MediaRecorder
AAC/m4a mono capture with a 3-minute cap, lazy RECORD_AUDIO permission,
cancel/finish controls, audio attachment chips with duration, and voice-note
transcript rows. Recording is mutually exclusive with MicCaptureManager voice
capture (no mic arbiter exists), and the MPEG-4 container brand is normalized
to M4A so gateway byte sniffing classifies the upload as audio, not video.
Attachments stay online-only per the outbox contract.

Related: #100709

* fix(android): coordinate voice note microphone ownership

* chore(android): refresh native localization inventory
2026-07-06 23:54:44 +01:00
Peter Steinberger
d931839e0c feat(android): multi-gateway registry, per-gateway credentials, and switching (#100947) 2026-07-06 23:31:49 +01:00
Peter Steinberger
b05001a68b fix(android): prevent native channel notification duplicates (#101170) 2026-07-06 21:12:08 +01:00
Peter Steinberger
2638113c68 feat(android): add Listen action speaking assistant messages via gateway TTS (#100772)
* docs(android): document the chat Listen action

* feat(android): add Listen action for assistant messages
2026-07-06 20:30:54 +01:00
Vincent Koc
70add7d31e fix(android): restore lint validation (#101081) 2026-07-06 11:57:28 -07:00
Peter Steinberger
c4c4caadfe fix(android): clarify SMS command authorization (#100993) 2026-07-06 18:36:05 +01:00
Colin Johnson
9c2bbd0750 fix(android): stabilize chat refresh loading (#100966) 2026-07-06 13:33:05 -04:00
Peter Steinberger
f8307bb44c style(android): apply ktlint to landed changes (#100304)
* style(android): apply current ktlint fixes

* style(android): format current app sources

* style(android): refresh native i18n inventory
2026-07-06 18:26:47 +01:00
Peter Steinberger
d0dd18dd7f feat(android): richer Settings About screen with mascot hero and project links (#100994) 2026-07-06 18:10:50 +01:00
Peter Steinberger
5b5a540e34 feat(android): per-gateway custom headers for gateways behind authenticating proxies (#100765)
* feat(android): support per-gateway custom headers for proxied gateway connections

Per-gateway custom request headers (Cloudflare Access-style service tokens)
for gateways behind authenticating reverse proxies. Headers are credentials:
EncryptedSharedPreferences-stored per endpoint stableId, masked in the manual
connection UI, injected on the OkHttp WebSocket upgrade at connect time via a
provider so edits apply on the next reconnect without re-pairing. Reserved
handshake headers and non-printable-ASCII are sanitized out (OkHttp throws on
them). TLS fingerprint pinning and pairing flows unchanged. Cross-gateway
isolation proven by MockWebServer upgrade-capture test.

Related: #100698

* chore(android): sync native i18n for custom header strings

* fix(android): harden gateway custom headers

* chore(android): resync native i18n inventory

* docs(changelog): defer Android release note

* fix(android): validate custom header names

* chore(android): refresh native i18n inventory
2026-07-06 17:48:57 +01:00
Peter Steinberger
61a29a7836 feat(android): read-only workspace Files browser with preview and share (#100776)
* feat(android): add read-only workspace Files browser with preview and share

* fix(android): degrade malformed base64 image payloads to no-preview instead of crashing

* fix(android): keep workspace paths verbatim from the gateway

* test(android): cover the overview Files card in shell logic tests

* fix(android): reset workspace browser across agents

* fix(android): isolate workspace share exports

* docs(android): note workspace file browser

* chore(i18n): refresh Android Files inventory

* docs(android): refresh workspace files map
2026-07-06 17:14:38 +01:00
Peter Steinberger
255b7631e6 fix(android): keep chat model selection synchronized (#100985)
* fix(android): harden chat model selection

* fix(android): bound model metadata retries

* fix(android): preserve newer model selections

* chore: leave changelog to release workflow

* chore: sync native i18n inventory
2026-07-06 17:06:02 +01:00
Peter Steinberger
063eeb69f3 feat(android): support opt-in background location (#100967)
* feat(android): support background location

Co-authored-by: Iori Kojima <iori@iori.dev>

* chore(android): refresh native i18n inventory

* docs(android): move release note to app changelog

---------

Co-authored-by: Iori Kojima <iori@iori.dev>
2026-07-06 16:36:58 +01:00
Peter Steinberger
8582895ca7 fix(android): finish onboarding after permission reapproval (#100959)
* fix(android): finish onboarding after permission reapproval

* chore(android): sync onboarding i18n inventory
2026-07-06 16:13:48 +01:00
Peter Steinberger
d375d349c8 feat(android): add in-chat model picker with favorites and recents (#100798) 2026-07-06 15:54:19 +01:00
Peter Steinberger
cd25de98b1 feat(android): tap-to-expand link previews in chat transcript (#100898) 2026-07-06 15:02:26 +01:00
Peter Steinberger
88f1ec38d4 feat(sessions): grouping, unread state, and full session controls on web, iOS, and Android (#100814)
Gateway (additive, no protocol version bump): SessionEntry gains
lastReadAt/markedUnreadAt/lastActivityAt; session rows expose a derived
unread flag (explicit mark, or last read before latest activity; never-read
sessions stay read so upgrades do not light up). lastActivityAt is stamped
in the canonical post-run store update - user, channel, and cron runs count
as activity; heartbeat, internal-event, and preserved-state runs do not.
sessions.patch gains unread; sessions.create gains fork (transcript fork
from parentSessionKey under the parent lifecycle lock, refusing active,
concurrently-changed, and oversized parents, cross-agent aware).

Web sidebar: Pinned/custom-group/Ungrouped sections, unread dots, kebab and
right-click context menu (pin, mark unread/read, rename, fork, move to group,
archive, delete guarded for agent main sessions and active runs), mark-read
on view with loop-safe re-acknowledgement and failure retry; sessions page
gets unread + fork actions and shared custom-group helpers.

iOS Command Center: grouped sections, unread/pin indicators, Show Archived
gated on per-entry state, full context menu with rename/new-group alerts and
delete confirmation, current-session preview guarantee, read-episode
re-acknowledgement; new patch/delete/fork transport calls; Swift protocol
models regenerated.

Android SessionsScreen: grouped headers, unread/pin indicators, Archived
filter gated on per-entry state, long-press menu with the full control set,
agent-scoped forks, explicit label/category clears from session events,
main-session fallback when archiving/deleting the open chat, read-episode
re-acknowledgement with failure retry.

Closes #100739
2026-07-06 14:30:55 +01:00
Peter Steinberger
bc49cb41e9 fix(android): open system notifications on tap (#100888)
* fix(android): open system notifications on tap

* chore(android): sync notification i18n inventory
2026-07-06 14:14:29 +01:00
Peter Steinberger
876ab9bb0b feat(android): add chat message actions (#100879)
* fix(android): add chat message actions

* chore(android): sync native i18n inventory

* fix(i18n): collect Android action labels

* fix(i18n): preserve Android placeholders
2026-07-06 13:50:16 +01:00
Peter Steinberger
90e1ef1768 fix(android): hide internal chat history rows (#100826)
* fix(android): hide internal chat history rows

* chore(android): sync native i18n inventory
2026-07-06 12:37:39 +01:00
Peter Steinberger
a467ceb523 fix(android): finish PTT relay handoff safely (#100786)
* fix(android): finish PTT relay handoff safely

* style(android): satisfy PTT ktlint

* test(android): make relay resume tests deterministic

* fix(android): recheck PTT finishing ownership

* chore(android): refresh native i18n inventory
2026-07-06 12:20:26 +01:00
Vincent Koc
17777b3a9f refactor: remove proven dead code across runtime surfaces (#100823)
* refactor: remove unused internal helpers

* refactor(ui): remove unused compatibility helpers

* refactor(android): remove unused talk cleanup shim

* refactor(android): remove orphaned legacy UI

* refactor: remove unused private exports

* refactor(docs-i18n): remove dead matcher and satisfy lint
2026-07-06 03:31:19 -07:00
Alex Knight
7f29380d21 fix(android): add missing new_chat_in_worktree locale strings (#100805)
Co-authored-by: Alex Knight <15041791+amknight@users.noreply.github.com>
2026-07-06 20:03:26 +10:00
Vincent Koc
c9abc75884 refactor: remove dead code and consolidate repeated paths (#100650)
* refactor(search): reuse provider setup finalizer

* refactor(android): remove unused helpers

* refactor(apps): remove unused Swift declarations

* refactor(diagnostics): reuse private reply delivery

* refactor(memory): reuse raw short-term store writer

* refactor(logbook): reuse batch row mapping

* refactor(scripts): centralize oxlint format policy

* refactor(memory): share qmd cache context hashing

* refactor(doctor): share auth issue classification

* chore(i18n): refresh native source inventory
2026-07-06 02:24:37 -07:00
Peter Steinberger
b4b1984fe7 feat(gateway): start a new chat session in a managed worktree (#100788)
Adds an additive worktree flag to sessions.create so any new chat can run in an
isolated managed worktree of the agent's git workspace, with the branch checked
out and .worktreeinclude provisioning applied. The session's spawnedCwd points at
the matching subdirectory inside the worktree so chat runs, CLI, and the file
browser execute there. agents.list gains workspaceGit (workspace or an ancestor
is a git checkout) to gate the affordance; web sidebar, iOS, and Android expose a
New-Chat-in-worktree action. Uses the method's operator.write scope, but the
.openclaw/worktree-setup.sh step runs only for operator.admin callers since it
executes repo code. Deleting the session, or leaving via a plain New Chat, clears
the cwd and lossless-removes the worktree; idle GC treats recent session activity
as worktree activity so an active session's checkout is never swept.

Live-verified end-to-end on a real gateway; follow-up to #100535 (issue #100534).
2026-07-06 10:23:41 +01:00
Ben.Li
489af13dbd fix(android): accept boolean flag aliases in node invoke params (#99873)
* fix(android): accept boolean flag aliases in node invoke params

Extend parseJsonBooleanFlag to recognize yes/no/1/0 like TalkDirectiveParser so node handlers honor common string boolean inputs.

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

* fix(android): route CameraHandler includeAudio through alias parser

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

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 01:36:53 -07:00
NianJiu
a0c0f43ab3 fix(android): serialize PTT microphone ownership (#99986)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
2026-07-06 09:33:00 +01:00
Peter Steinberger
988c4d45dc docs(android): credit landed app improvements (#100702)
* docs(android): credit landed app improvements

* docs: sync ClawHub map
2026-07-06 08:06:54 +01:00
Ben.Li
86d5389094 fix(android): block loopback canvas navigation (#99874)
* fix(android): block loopback canvas navigation

* fix(android): reject Unicode canvas hosts

* chore(android): sync app changelog

* style(android): format canvas navigation policy

* chore(docs): sync generated docs map

* chore(ci): sync hosted gate verifier

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 08:00:02 +01:00
NianJiu
e5a605424e fix android camera clip release logs (#99484)
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
2026-07-06 07:26:51 +01:00
Ben.Li
eda99cb8df feat(android): reconnect gateway when validated network returns (#100347)
* feat(android): reconnect gateway when validated network returns

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

* fix(android): dedupe validated network reconnects

* fix(android): wake gateway reconnect backoff safely

* fix(android): close network monitor startup race

* chore(android): refresh native i18n inventory

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 07:20:39 +01:00
Peter Steinberger
f9bf5f5897 fix(android): keep stale PTT from restarting capture (#100552)
* fix(android): serialize background PTT lifecycle

Follow-up hardening for #99840 after the initial fix landed in #100483.

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

* docs(changelog): note Android PTT lifecycle hardening

* fix(android): order PTT ownership transitions

* test(android): opt in to coroutine scheduler API

* fix(android): serialize voice capture ownership

* test(android): drive PTT ordering with test dispatcher

* test(android): isolate PTT ordering preferences

* test(android): control PTT invoke dispatchers

* test(android): isolate PTT coroutine dispatchers

* test(android): use current Robolectric resolver API

* test(android): register speech service without deprecated APIs

* test(android): control stale PTT cleanup dispatch

* test(android): isolate voice mode reassertion

* fix(android): clean voice capture on permission loss

* fix(android): invalidate PTT before cancel wait

* test(android): preserve starts queued after cancel

* fix(android): keep one-shot PTT retries idempotent

---------

Co-authored-by: xialonglee <li.xialong@xydigit.com>
2026-07-06 06:51:46 +01:00
WhatsSkiLL
b52c22f3da fix(android): tighten Voice tab box sizing (#100491)
Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
2026-07-06 06:42:31 +01:00
Voscko
d924ddc428 feat(android): show cron job details (#95107)
* feat(android): add cron job detail view

* fix(android): harden cron job detail loading

* chore(android): refresh native i18n inventory

* test(plugins): register workboard typed hook

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:25:37 +01:00
Peter Steinberger
2b48e98148 fix(android): preserve chat sends across reconnect recovery (#100551)
* fix(android): preserve chat recovery ownership

* fix(android): retry reconnect recovery on ticks

* chore(android): refresh native i18n inventory
2026-07-06 03:50:09 +01:00
WhatsSkiLL
58bbf5a117 fix(android): polish gateway settings layout (#100363) 2026-07-05 22:31:21 -04: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
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
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
aaf5ab910c fix: land ten small reliability fixes (#100483)
* fix(agents): harden LSP process failures

Source: #100450

Co-authored-by: morluto <williamlin1327@gmail.com>

* fix(sandbox): report effective workspace layout

Sources: #100435, #100439

Co-authored-by: Aniruddha Adak <aniruddhaadak80@users.noreply.github.com>

Co-authored-by: ZengWen-DT <ceng.wen@xydigit.com>

* fix(security): fail install checks on stream errors

Source: #100413

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(android): normalize all-day calendar events

Source: #100032

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

* fix(ios): serialize push-to-talk lifecycle

Source: #99942

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

* fix(talk): reject inherited provider names

Source: #99849

Co-authored-by: zenglingbiao <zeng.lingbiao@xydigit.com>

* fix(android): stop voice capture in background

Source: #99840

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

* fix(cron): preserve fallback result classification

Source: #99913

Co-authored-by: jincheng-xydt <xu.jincheng@xydigit.com>

* fix(google): bound Vertex response decompression

Source: #99812

Co-authored-by: 黄剑雄0668001315 <huang.jianxiong@xydigit.com>

* fix(plugins): report malformed discovery JSON

Source: #99892

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* test(sandbox): configure non-default workspace fixture

* test: fix small-fix batch validation

---------

Co-authored-by: morluto <williamlin1327@gmail.com>
Co-authored-by: ZengWen-DT <ceng.wen@xydigit.com>
Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
Co-authored-by: zenglingbiao <zeng.lingbiao@xydigit.com>
Co-authored-by: xialonglee <li.xialong@xydigit.com>
Co-authored-by: jincheng-xydt <xu.jincheng@xydigit.com>
Co-authored-by: 黄剑雄0668001315 <huang.jianxiong@xydigit.com>
2026-07-06 00:08:51 +01:00
WhatsSkiLL
978b425f98 fix(android): stabilize shell navigation layout (#100382)
* fix(android): stabilize shell navigation layout

* fix(android): target active shell navigation layout

* fix(android): initialize chat cache from preference owner

* chore(android): sync native i18n inventory

* chore(android): sync native i18n inventory

---------

Co-authored-by: IWhatsskill <IWhatsskill@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 23:03:30 +01:00
Peter Steinberger
a4b032e5d7 fix: harden subprocess, maintenance, and output paths (#100440)
* fix(agents): contain exec output stream failures

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(tui): contain local shell stream failures

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(process): contain command output stream failures

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(skills): isolate remote bin refresh failures

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(agents): contain background subagent sweep failures

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* fix(skills): report directory scan failures

Co-authored-by: wendy-chsy <wan.wenyan@xydigit.com>

* fix(agents): classify plugin approval gateway failures

Co-authored-by: 唐梓夷0668001293 <tang.ziyi@xydigit.com>

* fix(exec): preserve sanitized control-byte evidence

Co-authored-by: Lavya Tandel <lavya@loom.local>

* fix(shared): unwrap standalone parameter tags

Co-authored-by: nankingjing <1079826437@qq.com>

* fix(android): fail shared capture on audio read errors

Co-authored-by: NianJiuZst <3235467914@qq.com>

* docs(changelog): record small bugfix sweep

* fix(output): preserve sanitizer boundary semantics

* test: align sanitizer and sweeper regressions

* fix(terminal): preserve text after lone C1 controls

---------

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>
Co-authored-by: wendy-chsy <wan.wenyan@xydigit.com>
Co-authored-by: 唐梓夷0668001293 <tang.ziyi@xydigit.com>
Co-authored-by: Lavya Tandel <lavya@loom.local>
Co-authored-by: nankingjing <1079826437@qq.com>
Co-authored-by: NianJiuZst <3235467914@qq.com>
2026-07-05 22:21:54 +01:00