Commit Graph

4580 Commits

Author SHA1 Message Date
Vincent Koc
392b3a5695 test(ios): refresh native i18n source lines 2026-07-23 17:43:10 +08:00
Peter Steinberger
6b470b1fe8 fix(ui): thread-changes button leads to a dead end when the workspace is not a git checkout (#112914)
* fix(ui): disable the thread-changes button when the workspace is not a git checkout

* chore(protocol): regenerate Swift gateway models for sessions.files.list gitCheckout
2026-07-23 01:33:35 -04:00
joshavant
ebbbfa4c30 fix(ios): stabilize release screenshot launches 2026-07-23 00:28:00 -05:00
Peter Steinberger
26e4dec8c9 fix(ios): native Talk respects session thinking level (#112901)
* fix(ios): inherit thinking in native Talk

* test(ios): verify native Talk thinking inheritance

* test(ios): keep Talk regression i18n-neutral

* test(ios): import Talk request builder module

* test(secrets): secure plugin preset fixture

---------

Co-authored-by: RECOVERI <alfred@recoveri.io>
2026-07-23 01:02:12 -04:00
openclaw-mantis[bot]
c5ea0787a2 chore(i18n): refresh native locales (#112803)
* chore(i18n): refresh native locales

* fix(i18n): correct native secret translations

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-23 00:56:26 -04:00
joshavant
1af115d257 test(ios): retry stalled screenshot launches 2026-07-22 23:42:32 -05:00
joshavant
690ed56441 fix(ios): preserve localized app display names 2026-07-22 22:56:22 -05:00
Peter Steinberger
099d6351b3 refactor(sessions): canonical lineage model — creation provenance, fork ancestry, generation chain, typed row contract (#111861)
* fix(sessions): preserve spawn/fork lineage across implicit daily/idle rollover

* refactor(sessions): canonical creation model with forkSource ancestry and generation chain

* feat(sessions): stamp creation provenance across all creation paths and emit created events

* refactor(gateway): lock lineage patching, split control from navigation, add typed session-row contract

* docs(gateway): document creation provenance stamping and lineage patch tightening

* fix(sessions): keep provenance proof-only on wire fallbacks and strip node-local lineage from cron continuations

* fix(gateway): never journal a created event for session adoption

* fix(gateway): keep post-create work on adoption while gating the created event

* fix(sessions): restore trusted ensure-main provenance and stamp navigation parent at spawn

* fix(sessions): allow parentSessionKey through the direct child spawn patch

* fix(ci): break type cycles, satisfy export scan, regenerate Swift protocol models

* refactor(sessions): replace createdBy with createdActor

* fix(protocol): export session row type

* fix(sessions): preserve proven creation provenance

* fix(sessions): close lineage creation gaps

* test(sessions): align atomic spawn lineage coverage

* test(sessions): widen transcript search reconcile wait

* fix(sessions): stamp reset-created rows

* test(sessions): keep reset provenance coverage focused

* fix(sessions): journal chat-created rows

* test(ci): anchor release skill reads to repo

* test(ci): avoid cached module paths
2026-07-22 22:54:31 -04:00
metaforismo
c876d9917d fix(ios): show full multiline Markdown list items (#112723) 2026-07-22 22:18:18 -04:00
Jason (Json)
7eec1345f9 fix(gateway): preserve Control UI access across device-auth upgrades (#112558)
* fix(gateway): preserve device auth upgrade recovery

* fix(gateway): satisfy device auth upgrade gates

* fix(doctor): clean disabled device auth bypass

* fix(gateway): recheck migration operator boundary

* fix(gateway): keep migration guard internal

* fix(gateway): preserve insecure migration access

* fix(gateway): reject stale migration handshakes

* fix(gateway): revoke legacy migration sessions

* fix(gateway): bound device-less migration authority

* fix(gateway): require explicit migration pairing

* fix(gateway): revoke alternate migration sessions

* fix(gateway): close migration admission races

* style(gateway): format migration pairing import

* fix(security): audit pending device-auth migration

* fix(gateway): reconcile migration on startup

* fix(gateway): cap device auth migration scopes

* fix(gateway): retain migration socket restrictions

* perf(ui): trim migration startup bundle

* perf(ui): lazy-load device auth migration

* fix(gateway): bind migration completion to approved key

* fix(gateway): preserve migration authorization bounds

* fix(gateway): grant migrated device pairing capability

* fix(ui): preserve device migration bundle budget

* fix(ui): stabilize migration startup budget

* chore(ui): retain startup budget headroom

* fix(ui): split migration overlay helpers
2026-07-22 18:44:48 -06:00
Peter Steinberger
c26b0e0843 feat(android): add OpenClaw settings chat (#112788) 2026-07-22 19:29:51 -04:00
WhatsSkiLL
b3752e375d feat(android): add Wear instant talk tile (#112721)
* feat(android): add Wear instant talk tile

* fix(android): preserve Wear screenshot warm launches

* fix(android): preserve Wear state on warm launch

---------

Co-authored-by: Colin <colin@solvely.net>
2026-07-22 19:28:41 -04:00
openclaw-mantis[bot]
a3a08a6db0 chore(i18n): refresh native locales (#112662)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-22 09:38:17 -07:00
Peter Steinberger
692310de0b test(macos): stabilize parallel Swift tests (#112651)
* test(macos): stabilize parallel Swift tests

* test(macos): use async catalog start barrier

* test(macos): expose identity test seam
2026-07-22 09:04:25 -07:00
Pavan Kumar Gondhi
ab2ad22533 fix: block cpp host env overrides (#112560) 2026-07-22 19:54:24 +05:30
Peter Steinberger
685fb849bb fix(onboarding): recover expired wizard sessions (#112286)
* fix(onboarding): recover expired wizard sessions

* build(protocol): project expired wizard detail to Swift
2026-07-22 06:42:25 -07:00
WhatsSkiLL
80aaaeea3e fix(android): respect reduced motion in Wear avatar (#112245)
* fix(android): respect reduced motion in Wear avatar

* fix(android): observe effective Wear animation scale

* fix(android): refresh legacy Wear motion scale

* fix(android): initialize Wear motion scale before snapshot observation

---------

Co-authored-by: Colin <colin@solvely.net>
2026-07-22 09:22:29 -04:00
Peter Steinberger
cf2f591161 feat(sessions): permanent creator attribution, owner avatars, person filter, multi-user docs (#112658)
* feat(sessions): persist creator attribution

* feat(ui): add session creator filtering

* chore(sessions): refresh sqlite schema baseline

* docs(security): explain shared-agent trust

* fix(sessions): project catalog creator ownership

* fix(ui): restore startup JS budget headroom for creator attribution
2026-07-22 05:47:21 -07:00
Peter Steinberger
74de1a2f0c feat(ios): add OpenClaw settings chat (#112420)
* feat(ios): add OpenClaw settings chat

* chore(ios): sanitize screenshot fixture label

* fix(ios): gate OpenClaw settings chat

* fix(ios): stabilize OpenClaw settings support checks

* chore(i18n): refresh native source inventory

* fix(ios): bind OpenClaw chat to gateway route
2026-07-22 05:14:47 -07:00
Peter Steinberger
9f501c77a6 fix(macos): migrate legacy Gateway profiles (#112629) 2026-07-22 05:08:45 -07:00
Peter Steinberger
0c99a4e362 feat(ui): manage DM pairing requests in Channels (#112401)
* feat(ui): manage DM pairing requests

* fix(ui): clear pairing data across auth changes

* test(ui): tighten pairing page fixture type

* fix(gateway): complete pairing protocol contracts

* fix(ui): guard pairing mutations across epochs

* fix(ui): restore chat teardown gates

* fix(ui): isolate channel auth lifecycles

* fix(ui): remove stale chat view export
2026-07-22 04:54:20 -07:00
Peter Steinberger
62a6dfb082 fix(macos): direct Gateway TLS pins protect operator traffic (#112353)
* fix(macos): enforce direct Gateway TLS pins

* fix(macos): preserve existing TLS pin owner keys

* fix(macos): reuse localized TLS error labels

* test(macos): avoid nested Swift Testing require

* test(macos): isolate TLS Keychain tests

* test(macos): isolate TLS integration Keychain

* chore(i18n): update native source inventory
2026-07-22 03:38:10 -07:00
Peter Steinberger
45f9da8535 test: stabilize Swift and Android coordination suites (#112628) 2026-07-22 03:36:17 -07:00
Peter Steinberger
92540b8735 feat(ui): redesign session observer HUD with labeled status and visibility-gated digests (#112594)
* feat(ui): redesign session observer HUD with labeled status and visibility-gated digests

* chore(protocol): regenerate app protocol bindings for sessions.observer.visibility
2026-07-22 02:56:10 -07:00
Peter Steinberger
0b080b9c2e feat(apps): native session-list observer digests on iOS, Android, and macOS (#112597)
* feat(apps): native session-list observer digests on iOS, Android, and macOS

* fix(apps): satisfy swift, periphery, and lint gates for native digests
2026-07-22 01:53:29 -07:00
Peter Steinberger
e10d004257 feat(agents): mobile_ui agent tool (PR 3/3) (#112255)
* feat(agents): mobile_ui agent tool for Android UI control (PR 3/3)

Add a dedicated model-facing tool that drives another Android app through the
PR2 mobile.ui.observe/act node commands, completing the vertical slice
(agent -> tool -> node.invoke -> AccessibilityService).

- Mirrors the desktop computer tool's safety model: owner-only + HTTP-denied
  (dangerous-tools), raw node.invoke of mobile.ui.* redirected to this tool so
  the generic nodes tool cannot bypass it, run/tool-call idempotency, and the
  phone-arm workflow (mobile.ui.* must be explicitly armed).
- One call is observe or one act; every act automatically re-observes for
  postcondition verification and preserves the landed outcome if re-observe fails.
- Fail-closed confirmation: all state-changing acts (activate, set_text, tap,
  swipe) require confirmed=true after the model reviews the proposed effect;
  observe, scroll, wait, and navigation global_actions do not. The keyword list
  only enriches the confirmation message and is never the sole gate (a11y labels
  are localized/iconographic/coordinate-blind).
- Node selection resolves an explicit id against the full device set first
  (case-insensitively) and rejects an ineligible or ambiguous match, so an
  explicit selection can never be silently redirected to the wrong phone.
- All observed UI text is treated as untrusted; the tool description forbids
  following instructions found in app UI.

Additive; no protocol bump. mobile-ui-tool + registration + policy tests pass;
core tsgo and lint verified on Testbox. On-device drive is exercised via the
PR1/PR2 emulator proof; this PR is the agent-side tool + tests.

Follow-up: computer-tool.ts has the same latent node-resolution ordering bug
(explicit id searched only among eligible nodes); tracked separately.

* fix(agents,phone-control): migrate mobile_ui arming hints/tests to gateway.nodes.commands.allow

Match main's node-command arming rename (gateway.nodes.allowCommands ->
gateway.nodes.commands.allow / commands.deny): update the mobile_ui tool arm-hint
matchers to the gateway's current rejection strings and fix the phone-control /
tool tests to the current config shape. Production write path was already correct.

* fix(agents): register mobile_ui in owner-only denylist; trim phone-control under max-lines

- tool-resolution.exclude.test.ts: mobile_ui joins the owner-only core
  tools, so add it to the expected plugin/inherited denylists.
- phone-control: derive ArmGroup from a single ARM_GROUPS const and
  collapse parseGroup's ||-chain, dropping index.ts back under 700 lines.

* fix(agents): centralize mobile_ui global-action names; regenerate tool-display snapshot

- Extract GLOBAL_ACTION_NAMES const so the schema, action type, and
  validator share one source. This also removes the bare `name: "back"`
  type-annotation literal that scripts/tool-display.ts's name-regex was
  misreading as a phantom runtime tool.
- Regenerate apps/.../tool-display.json to add the mobile_ui display entry
  (was missing from the Swift snapshot).
2026-07-22 01:49:14 -07:00
Peter Steinberger
d4f19bfd79 feat(sessions): first-class archived-session handling (tri-state filter, pruning exemption, inline archived UI) (#112554)
* feat(sessions): first-class archived-session handling

Archived sessions are now exempt from every automatic maintenance path
(age prune, entry cap, model-run prune, disk budget, cleanup repairs);
only explicit sessions.delete removes them. sessions.list gains an
additive tri-state archived filter (true | false | "all"). The sidebar
gets a persisted Active/Archived/All status filter with inline dimmed
archived rows, replacing the nav-away View-archived button; the Sessions
page toggle becomes the same tri-state with dimmed+badged rows in All
mode; the chat composer's archived notice becomes a full-width banner
with an Unarchive action.

* chore(protocol): regenerate Swift gateway models for tri-state archived filter
2026-07-22 01:28:53 -07:00
Peter Steinberger
d899dd7682 feat(android,gateway): mobile.ui node commands (PR 2/3) (#112241)
* feat(android,gateway): expose mobile.ui.observe/act as node commands (PR 2/3)

Wire the PR1 AccessibilityService executor over the existing node.invoke
transport. Additive: no gateway protocol version bump.

- New commands mobile.ui.observe / mobile.ui.act (capability mobileUI),
  generated into the protocol constants.
- thirdParty MobileUiHandler owns one mutex-serialized AccessibilityActionExecutor
  and bridges JSON <-> the PR1 snapshot/action model; play flavor ships a
  permanently-unavailable no-op stub (Play APK stays accessibility-free).
- Commands advertised only when accessibilityControlEnabled and the service is
  connected; NodeRuntime refreshes the advertised surface on connect/disconnect.
- Classified dangerous in node-command-policy (declarable-but-armed, mirroring
  computer.act): the transport cannot invoke them until gateway.nodes.allowCommands
  explicitly arms them. Screen reads are treated as dangerous too, so observe is
  gated as well as act.

Both flavors assemble; thirdParty/play unit tests, ktlint, android lint, and the
gateway node-command-policy tests pass; protocol generator is idempotent; Play
APK verified to contain zero accessibility classes. Emulator: no regression to
PR1 dev-screen observe.

* fix(gateway): migrate mobile.ui arming test/comment to gateway.nodes.commands.allow

Main renamed the node-command arming config from gateway.nodes.allowCommands to
gateway.nodes.commands.allow; update the mobile.ui policy test config shape and
the comment to the current contract. Production resolution already reads the new
path.

* chore(android): update native i18n baseline for PR2 line-number shifts
2026-07-22 01:10:49 -07:00
Peter Steinberger
9c7b034005 feat(android): port the zen, drummer, and peekaboo claw stances (#112571)
* feat(android): add rare claw stances

* chore(i18n): refresh native source anchors
2026-07-22 01:09:08 -07:00
Peter Steinberger
5610f24fc8 feat(apple): port the zen, drummer, and peekaboo claw stances (#112570)
* feat(apple): add rare working claw stances

Add zen, drummer, and peekaboo animations to the shared iOS and macOS working indicator, with deterministic stance and pose coverage.

* chore(i18n): refresh native source anchors
2026-07-22 01:06:51 -07:00
Peter Steinberger
88bf2d3350 test(macos): isolate flaky gateway and worker tests (#112563) 2026-07-22 00:37:58 -07:00
Peter Steinberger
12df806e90 feat(android): AccessibilityService UI executor (thirdParty, PR 1/3) (#112232)
* feat(android): AccessibilityService UI executor (thirdParty, PR 1/3)

Add a thirdParty-flavor-only AccessibilityService that observes the active
app's UI as a bounded semantic snapshot and performs typed actions, exercised
via a local developer screen. No gateway/agent wiring yet (PR 2 adds
node.invoke commands, PR 3 the agent tool + policy gates).

- Play APK stays accessibility-free: service, config, executor, and UI live
  entirely under src/thirdParty; SensitiveFeatureConfig.accessibilityControlEnabled
  gates it. Verified: 0 accessibility refs in every merged Play manifest and
  0 accessibility classes in the Play dex.
- Semantic-first executor: observe() returns a bounded snapshot (node/depth/text
  caps, deterministic order, password + sensitive-field redaction, stable action
  vocabulary, generation-scoped refs); act() performs one typed action with a
  closed ActionOutcomeCode result set.
- Safety model: coordinate gestures gated by package-match (fail-closed) + a UI
  epoch advanced on window/content/scroll/text mutation events; node actions
  gated by package-match + per-node refresh(); global actions ungated. Capture
  runs off the main thread. Dev UI honestly disables cross-app node controls
  (only reachable while the target is foreground; validated via the remote path).

Built and emulator-tested on API 36: live connection status, immediate observe,
a 103-node cross-app Settings capture, and global Home. Both flavors assemble;
thirdParty unit tests, ktlint, and android lint pass.

* feat(android): gate accessibility control behind an off-by-default opt-in

Make landing the accessibility feature a no-op for existing thirdParty users:
the service is invisible and inert until the user explicitly opts in.

- The AccessibilityService and its dev activity are declared
  android:enabled="false", so a fresh install exposes NO new accessibility
  service in system settings and nothing can bind it (verified on device:
  absent from the installed-services list and unbindable; shell cannot enable
  it either — only the app can).
- New thirdParty-only "Control other apps" toggle (persisted in the existing
  openclaw.node prefs, default OFF). Turning it on enables both components via
  PackageManager.setComponentEnabledSetting and deep-links to Accessibility
  settings so the user can grant it; turning it off disables them again
  (DONT_KILL_APP). A disclosure describes what enabling does.
- Play flavor is a no-op (FlavorPhoneCapabilitiesSettings = Unit); no
  accessibility component/controller/toggle references reach the Play APK.
- No new permissions or dependencies. The compile-time flavor gate and the
  gateway dangerous-command arming remain as additional layers.

* chore(android): update native i18n baseline for accessibility control strings
2026-07-22 00:36:13 -07:00
Peter Steinberger
59f63ccc3b refactor: declare subagent spawn lineage explicitly so forks and dashboard chats stay spawn-capable (#112535)
* refactor(gateway): declare spawn lineage explicitly at sessions.create

Spawn depth is now a declared fact, never inferred from parentSessionKey.
sessions.create accepts an optional spawnDepth (requires parentSessionKey) that
spawn-owned creations pass; every other fresh session persists spawnDepth 0,
making operator chats and UI forks spawn-capable roots. The visible spawn tool
declares callerDepth + 1, and subagent depth recovery no longer walks
parentSessionKey, which is UI threading only.

Accepted tradeoff (documented inline): pre-upgrade visible children whose only
lineage was parentSessionKey resolve as roots; the transient population may
spawn one extra generation, still capped by maxChildrenPerAgent.

* chore(protocol): regenerate Swift gateway models for sessions.create spawnDepth
2026-07-21 23:58:19 -07:00
Peter Steinberger
9231bcb38f fix(macos): keep permissions reachable on short screens (#112507)
* fix(macos): keep permissions reachable on short screens

* fix(macos): preserve onboarding i18n inventory
2026-07-21 21:53:07 -07:00
Peter Steinberger
e81a2ce657 feat(ui): show chat run startup status (#112339)
* feat(ui): show chat run startup status

* refactor(agents): isolate run status emission

* chore(protocol): refresh startup status models

* refactor(swift): remove unused chat helpers

* test(swift): align retry and i18n fixtures

* fix(swift): restore outbox display helper
2026-07-21 21:25:23 -07:00
Peter Steinberger
1a8583ba45 feat(gateway,ui): ask-the-observer questions from the session HUD (#112448)
* feat(gateway,ui): ask-the-observer card input over sessions.observer.ask

* refactor(ui): single home for observer run-identity helper after restack

* test(ui): drop duplicated observer hud test after restack

* test(ui): give the observer ask flow its own colocated suite

* refactor(gateway): leaf observer contract and ask module split for ci gates

* refactor(gateway): drop observer contract re-export shims
2026-07-21 20:59:32 -07:00
Peter Steinberger
c23ca5fda2 fix(linux): hide Quick Chat before widget cleanup (#112308) 2026-07-21 20:07:56 -07:00
Peter Steinberger
6c3caa38ab fix(ui): allow direct sessions in non-Git folders (#112433)
* fix(ui): allow direct sessions in non-Git folders

* test: align New Session fixtures with place picker

* fix(ui): preserve worktree intent on Git probe failures

* fix(types): keep worktree status alias internal
2026-07-21 19:36:53 -07:00
github-actions[bot]
a8537805bd chore(i18n): refresh native locales 2026-07-22 10:22:42 +08:00
Peter Steinberger
0f066eec81 feat(dashboard): plugin widget kinds — native WorkBoard card and mini-board widgets (#112434)
* feat(board): add plugin widget kinds

* feat(ui): render native Workboard widgets

* fix(dashboard): compose plugin widgets with current main

* chore: internalize widget-kind contribution types

* fix(ui): retry plugin widget renderer loads

* fix(ui): harden Workboard widget refresh lifecycle

* fix(ci): clear plugin widget landing gates

* fix(boards): migrate plugin widget storage

* fix(db): migrate unreleased board widget constraint

* fix(ui): retry failed Workboard widget loads

* fix(ui): keep stale widget refresh cleanup inert

* fix(ci): align plugin widget landing guards
2026-07-21 17:59:20 -07:00
Peter Steinberger
1f0a3ecc68 feat(ui): session observer HUD, sidebar subtitles, and settings (#112260)
* feat(ui): session observer HUD, subtitle integration, and settings

* test(ui): observer demo fixtures for the mock control-ui harness

* fix(ui): satisfy lint and deadcode gates for observer surfaces

* test(ui): adopt renamed pull-request summary api after rebase

* fix(ui): clean rebase artifacts in observer test files
2026-07-21 17:05:14 -07:00
Vincent Koc
461583b5e3 chore(i18n): refresh Android branch count inventory 2026-07-22 06:33:27 +08:00
Vincent Koc
116a38c167 test(android): cover locale-neutral branch counts 2026-07-22 06:33:27 +08:00
Vincent Koc
b622fc74c8 fix(android): make branch counts locale-neutral 2026-07-22 06:33:27 +08:00
Peter Steinberger
c84921634d fix(macos): require explicit consent for privacy-sensitive access (#112321)
* fix(macos): avoid passive Automation prompts

* fix(macos): keep Voice Wake recognition on device

* fix(macos): require consent for activity presence

* chore(apps): refresh native i18n inventory

* fix(macos): preserve presence clears across gateway versions

* fix(macos): prioritize activity privacy opt-out

* chore(apps): refresh native i18n inventory

* fix(macos): scrub legacy presence activity

* fix(macos): migrate permission status caller

* fix(macos): preserve unknown permission state

* fix(macos): refresh privacy change artifacts

* refactor(macos): remove stale presence helper

* fix(deps): patch URI and Jaeger advisories

* test(gateway): adopt pairing-bound node sessions
2026-07-21 15:28:13 -07:00
Peter Steinberger
b36342ee6f feat(android): chat rewind/fork actions and branch switcher with branch-safe outbox (#112284) 2026-07-21 14:31:47 -07:00
Jason (Json)
35e058711d fix(macos): reuse gateway with path advisory (#112381) 2026-07-21 15:17:47 -06:00
Peter Steinberger
bd03b4d658 fix(i18n): regenerate native locale artifacts after Android inventory drift 2026-07-21 14:15:31 -07:00
Vincent Koc
5b2a084048 fix(i18n): refresh iOS location menu inventory 2026-07-22 05:11:45 +08:00
joshavant
a69ebf3067 fix(ios): keep snapshot results outside upload tree 2026-07-21 13:44:11 -05:00