Commit Graph

4599 Commits

Author SHA1 Message Date
joshavant
ba09e05e97 refactor(ios): append unpadded App Store revisions 2026-07-23 18:42:16 -05:00
joshavant
0558831b92 fix(ios): normalize App Store build upload state 2026-07-23 18:26:29 -05:00
joshavant
b7d77b0f21 feat(ios): deterministically plan App Store releases 2026-07-23 18:18:32 -05:00
joshavant
30395ba31b feat(ios): support App Store release revisions 2026-07-23 16:24:15 -05:00
Peter Steinberger
cbf94c0d8b feat(sessions): drafts UX — create-as-draft, promote, admin ghost treatment (#113127)
* feat(protocol): support draft session creation

* feat(ui): add draft session workflows

* docs: explain multi-user drafts

* test(ui): tighten draft ownership fixture

* test(ui): satisfy draft E2E lint

* test(ui): keep draft fixtures strictly typed

* docs: add drafts implementation report

* docs: clarify implementation LOC summary

* test: strengthen draft compatibility coverage

* docs: correct drafts cleanup report

* fix: harden draft availability policy

* docs: update draft policy review notes

* test(ui): type draft policy mock control

* fix: preserve keyed draft creation retries

* fix: keep disabled draft retries idempotent

* docs: finalize drafts cleanup report

* fix(ui): keep draft ownership helper internal

* docs: refresh drafts docs map
2026-07-23 13:06:35 -07:00
Peter Steinberger
c519e01a24 feat(gateway): chat.send expectedLeafEntryId precondition keeps stale panes off switched branches (#113073) 2026-07-23 12:33:31 -07:00
Peter Steinberger
013b24dd6d feat(sessions): archive attribution (archivedBy) (#113116)
* feat(sessions): attribute archive transitions

* docs: add archive attribution report

* fix(sessions): restore alias layout after archive audit failure

* docs: update archive attribution report

* fix(sessions): isolate archive audit rollback

* docs: record final archive rollback design

* fix(sessions): make archive audit note best-effort

* docs: record best-effort archive audit policy

* chore: refresh native i18n baseline
2026-07-23 11:23:30 -07:00
Jason (Json)
2f5e7cfc5d fix(ui): prevent duplicate image prompt and flicker (#113113)
* fix(ui): stabilize initial image prompt handoff

* chore(protocol): refresh sessions create model

* chore(i18n): refresh native source inventory
2026-07-23 12:11:52 -06:00
Peter Steinberger
3e2b3ea4d5 feat(cron): database-backed heartbeat monitor scratch replaces HEARTBEAT.md (#112967)
* feat(cron): move heartbeat context into database-backed per-job cron scratch

- new additive cron_job_scratch SQLite table (revision tombstones keep
  compare-and-swap monotonic across unset/recreate; 256KiB cap)
- heartbeat runner reads monitor scratch instead of workspace HEARTBEAT.md;
  heartbeat_respond gains a private scratch replacement parameter
- openclaw doctor --fix migrates HEARTBEAT.md into scratch (hash-verified,
  archived under state backups, idempotent, symlink-contained)
- gateway cron.scratch.get/set admin RPCs + openclaw cron scratch CLI
- workspace bootstrap no longer seeds HEARTBEAT.md; Codex heartbeat file
  guidance removed; docs and prompt snapshots updated

* fix(cron): review round 2 — shared-workspace heartbeat migration and non-default agent monitors

- doctor migration groups agents by heartbeat source file and imports into
  every monitor before archiving/removing the shared file once
- exempt heartbeat payloads from the main-session default-agent restriction:
  monitors only poke the wake bus, so non-default agents converge again
- document why disabled monitors retain their last cadence (config default
  already resolves before the fallback)

* fix(cron): honor configured cron store, legacy heartbeat fallback, and safer doctor claim

* fix(cron): claim HEARTBEAT.md before committing scratch and restore without clobbering

* fix(cron): pin migration CAS to precondition revision, re-verify claim on release, archive first, report scratch as pending

* docs(heartbeat): remove retired config options

* fix(cron): crash-recoverable migration claims, partial-import rollback, latest-response scratch pairing

* test(heartbeat): keep latest scratch proposal paired

* fix(cron): roll back committed scratch on changed-claim release and restore no-row state

* fix(cron): revision-guarded rollback delete and recreated-file detection on claim release

* fix(cron): treat every failed claim re-verification as a migration conflict

* test(heartbeat): rename ack test after ackMaxChars retirement

* fix(heartbeat): keep monitor scratch out of bypass-scope runs

* fix(cron): resolve claimed symlinks on release and gate legacy fallback on proven scratch state

* fix(cron): strict claim-name recovery and per-entry migration grouping

* fix(ci): heartbeat scratch gate repairs — lint causes, dead exports, since-train, inventory path, prompt snapshot, regenerated docs map, SDK baseline, protocol bindings

* fix(cron): live-owner claim guard and canonical entry-key migration grouping

* fix(cron): archive claimed inode on release and flag orphan claims beside recreated files

* docs(cron): document process-global state-db invariant for scratch service ops

* chore(i18n): refresh native inventory line numbers after protocol binding regen
2026-07-23 11:10:49 -07:00
Peter Steinberger
78b987aa2e fix: keep model catalog coherent across config reloads (#112331)
* fix(gateway): keep model catalog reads generation-safe

* fix(gateway): type owner-aware catalog snapshots

* fix(sessions): break lifecycle accessor import cycle

* fix(gateway): preserve requested catalog owner

* fix(gateway): keep catalog owner identity explicit

* fix(gateway): isolate catalog snapshot types

* fix(gateway): respect published catalog owner

* fix(gateway): reject mismatched catalog owners

* test(apple): gate unread patch timing explicitly

* fix(gateway): keep startup metadata bounded

* fix(gateway): forbid startup catalog fallback

* test(apple): wait for terminal outbox flush

* fix(cron): follow published model catalog owner

* test(cron): align catalog runtime mocks

* test(system-agent): isolate TUI catalog metadata

* test(gateway): refresh deletion session snapshot

* fix(gateway): preserve authoritative catalog owners

* fix(gateway): retain equivalent catalog preload

* fix(gateway): reject ownerless catalog projections

* fix(gateway): scope catalog loads to resolved agent

* fix(gateway): restore canonical catalog owner identity

* fix(cron): preserve published catalog owner

* test(cron): align owner snapshot mocks

* fix(cron): preserve replacement owner workspace

* fix(runtime): reject explicit catalog owner mismatch

* fix(runtime): preserve implicit owner fallback

* test(cron): resolve implicit owner fixtures
2026-07-23 10:54:27 -07:00
joshavant
3d7e996fd3 docs(ios): default releases to gateway version 2026-07-23 12:07:09 -05:00
Peter Steinberger
acd92f6a3d chore(deps): refresh repository dependencies (#112453)
* build(deps): update QA broker dependency

* build(deps): refresh repository dependencies

* build(deps): reconcile rebased shrinkwraps

* test(plugins): remove stale loader test state

* test(deps): stabilize updated dependency coverage

* fix(swift): use caller-isolated TaskLocal overload

* build(deps): regenerate rebased shrinkwraps

* test(msteams): preserve DNS validation in fetch helper

* fix(deps): avoid vulnerable optional image stack

* test(deps): validate generated LRU override

* refactor(ui): extract chat resizable divider

* test(ui): update divider ownership path

* fix(matrix): retain restart-compatible SDK

* style(cron): format update test
2026-07-23 16:17:13 +00:00
joshavant
b85c0e2064 fix(ios): harden release screenshot capture 2026-07-23 11:09:06 -05:00
Peter Steinberger
09672312c4 feat(gateway): incognito sessions for the web Control UI (#113006)
* feat(gateway): add web-only incognito sessions held in process memory

* feat(ui): add incognito toggle and badges to the web new-session flow

* fix(sessions): classify incognito by key shape, fail closed on stale keys, and gate memory writes

* fix(codex): start harness threads ephemeral for incognito sessions

* fix(sessions): reshape internal-effects incognito keys and add doctor repair for reserved key collisions

* refactor(plugin-sdk): export canonical incognito key classifier and guard the sentinel path

* fix(state): classify incognito DB handles from the recorded open-time set

* fix(gateway): isolate incognito sessions from durable lineage and allocation on read-only misses

* docs(sessions): pin the reserved incognito namespace ownership decision

* feat(gateway): admin-scope incognito visibility and incognito-blind cross-session surfaces

* fix(ci): repair kysely guardrails, dead export, docs map, protocol bindings, and ACP reset rotation

* fix(gateway): remove non-admin observability side channels for incognito sessions

* fix(gateway): enforce admin-scope incognito access and cover all parent-reference creation paths
2026-07-23 09:04:36 -07:00
Peter Steinberger
9a624cd78f fix(ios): localize Agent Pro detail labels (#112980)
* fix(ios): preserve localized Agent Pro detail labels

* fix(ios): localize Dreaming metric labels

* test(ios): refresh native localization inventory

* test(setup): align isolated detection fallback

* test(system-agent): allow slow shared TUI setup

* test(chat): allow loaded outbox retry drain

---------

Co-authored-by: Alix-007 <li.long15@xydigit.com>
2026-07-23 09:01:07 -07:00
Colin Johnson
4f4d89574a fix(ios): show dark app icon in Dark appearance (#113039)
* fix(ios): use dark app icon appearance

* fix(ios): cover debug app icon appearances
2026-07-23 10:56:24 -04:00
Peter Steinberger
3023d69fd8 feat(gateway): carry reviewer-only detail on plugin approvals (#113027)
* feat(gateway): carry reviewer-only detail on plugin approvals

* chore(protocol): regenerate projections for plugin approval detail

* chore(plugin-sdk): budget reviewer-detail surface additions
2026-07-23 06:28:23 -07:00
Peter Steinberger
6251343384 feat(sessions): visibility states, membership, and server-enforced participation (#112787)
* feat(sessions): enforce visibility and membership

* feat(ui): add session sharing controls

* docs: add session sharing implementation report

* refactor(sessions): use canonical creator identity

* fix(sessions): adopt creator ownership contract

* docs: refresh session sharing rebase report

* docs: record final creator integration proof

* docs: record final main rebase

* chore: drop worktree report artifact

* fix(sessions): keep drafts owner-only

* fix(ui): preserve redacted session restrictions

* fix(sessions): preserve scoped sharing authorization

* fix(sessions): re-verify session instance inside sharing mutation queue

* test(sessions): cover stale sharing mutation

* fix(sessions): bind membership to session instance, gate absence blocking on sharing

* fix(sessions): preserve entry normalization on rebase

* fix(sessions): atomic visibility instance guard, reset visibility on recreate

* docs(ui): name the absence-heuristic tradeoff and link follow-up

* feat(protocol): expose session sharing row state

* docs: note generated creator identity type

* fix(sessions): bind member writes and visibility rollback to session instance

* fix(ui): discard stale-connection sharing loads; drop worktree scratch files

* fix(ui): block composer only on observed sharing state, never on list absence

* fix(gateway): authorize agent runs against the resolved session (close keyless bypass)

* chore(protocol): allowlist Control UI-only session.sharing event for mobile

* test(config): record session.sharing keys in common-tier snapshot

* refactor(sessions): unexport internal sharing helpers

* test(gateway): update sessions changed routing assertions

* fix(sessions): align sharing identity with created actor

* fix(sessions): align membership identities and storage keys

* fix(gateway): re-filter drafts against fresh sharing state in sessions.list

* fix(gateway): drafts stay owner+admin only in the sessions.list fresh filter

* fix(ui): re-export sharing protocol types for the Control UI

* fix(ui): keep SessionSharingRole internal to satisfy deadcode gate

* fix(gateway): read runtime config lazily in session-mutation authorization

authorizeSessionMutation ran on every gateway request but eagerly called
context.getRuntimeConfig() — a non-trivial config resolve — for methods that
are never session mutations. Read config only once a real session-mutation
target is resolved. Also register the four session sharing methods in the
2026.7 release-train inventory test.

* fix(gateway): share one config snapshot across session-mutation authorization

Group rename/delete discovery and the authorization loop were each resolving
runtime config separately after the lazy-read change. Memoize the resolve so
non-session requests still pay nothing, while any session mutation resolves
config at most once and both discovery and authorization use that single
snapshot (no double reload, no mid-request config-change split).

* fix(gateway): resolve session-sharing CI gates

- isGatewayAdmin: null-safe connect access so internal/plugin-runtime runs
  (which reach authorization with a connect-less client) do not crash.
- emitSessionsChanged: scope only to a concrete session key; a [undefined]
  sessionKeys scope filters nothing correctly and would strip draft gating.
- session stores: mark the sync TOCTOU re-read and the sqlite_master
  existence probe as narrowly-justified raw SQLite primitives.
- tests: provide getRuntimeConfig to the session-action contract context,
  drop a shadowed 'call' binding, use structuredClone, and assert the
  agent-scoped sessions.changed broadcast shape.

* docs(gateway): note best-effort participation gate + refresh native i18n baseline

Session ownership/visibility are usability features, not a security boundary
(docs/concepts/multi-user.md, SECURITY.md); document that the pre-dispatch
authorization is intentionally not commit-bound to the resolved instance.
Also refresh apps/.i18n/native-source.json after the session-sharing protocol
codegen shifted line numbers of existing native strings (position-only).

* test(gateway): reset session sharing snapshots

* style(gateway): format sharing reset import
2026-07-23 08:53:57 -04:00
metaforismo
33044992c1 fix(ios): avoid phantom iPad nodes on Apple Silicon Macs (#112744) 2026-07-23 08:25:59 -04:00
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