Skip to content

Clean up mail drafts, folder picker, and compact assistant controls - #529

Merged
79 commits merged into
mainfrom
codex/mail-controls-cleanup-20261014
Oct 15, 2026
Merged

79 commits merged into
mainfrom
codex/mail-controls-cleanup-20261014

Conversation

@NubsCarson

@NubsCarson NubsCarson commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Unfinished local email appeared as recovery chips above the inbox, More used a cramped native select, and the compact assistant bar gained an ambiguous file-shaped dictation icon.

Show account-local drafts and recovery entries under More → Drafts, alongside provider drafts, without changing their storage, conflict, ownership, or reviewed-send rules. Drafts stays available when the provider cannot list Gmail drafts. Give the folder picker a published Lucide chevron and matching spacing. Keep the compact assistant bar to Alpha, Type, and Talk; dictation remains in the expanded composer with a published audio-lines icon.

Validation: 31 focused rendered browser cases pass in one final run, including account-scoped recovery, competing windows, damaged copies, attachments, edited reviews, unknown send outcomes, image preferences, and the controls. All 26 send-cleanup cases, 2 owning draft/attention checks, and TypeScript pass. Production build and the 389-file flag-off bundle audit pass. No real mail was sent or audio capture started.

Stacked on the published combined QA branch, which contains latest main plus reviewed app integration #524, Gmail #527, and the drawer fix #528. This PR contains only the controls cleanup and corresponding fixture/documentation updates; retarget to main once those inputs land. Preview: http://127.0.0.1:5209/.

lalalune and others added 30 commits October 13, 2026 20:44
…nto claude/cloud-signin-subscription

# Conflicts:
#	test/notice-owner-startup.test.mjs
- Cloud unreachable, 5xx, 429 or no entitlement route is now a closable Offline
  notice (local apps stay, agent waits), never "Choose a plan"; this also covers
  phones updated from the pre-gate build with no admission record.
- Remove the unsigned billing/limits fallback and its allowlist entries; only a
  verified signed entitlement admits the agent.
- Stop the on-device agent at every non-admitting gate even when this renderer
  did not start it.
- Revoke the key a re-approval replaced, once, with the old bearer.
- Reset revokes the Cloud key on the pending-reset launch path too, behind a
  blocking notice.
- Offline grace: only fresh verified entitlements refresh it; ended plan windows
  admit nothing; stale grace stops the agent.
- Redeem: refuse revoked replays, use effectiveUntil, keep the code on failure
  with aria-invalid/describedby, one-time-code autocomplete.
- Throttle return re-checks, recheck on network return and on billing refusals.
- BYO Cerebras key form only in test-mocks builds; denylisted in production.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds the native collector for issue #395: AudioRecord timestamps for the
last VAD speech window, the endpoint, local TTS stage marks, first PCM at
MediaPlayer.start and the audible start from the player's output timestamp,
all on CLOCK_MONOTONIC, with source commit and dirty state, engine and model
hashes, device, ABI, build, network and thermal state per trial. Adds an
opt-in emulator harness and campaign driver, v2 aggregation with cold/warm
p50/p95 and acceptance limited to clean release builds on arm64 devices, and
port/repeat support in the emulator audio injector.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ve capture

Transcribe (dictation) records until Stop and fills an editable, unsent draft;
the voice assistant listens continuously, sends each finished spoken turn and
speaks the reply. Both stream the app-process Silero VAD capture to the
resident agent's on-device Phonon-2 live route.

- voice-assistant.ts: VAD endpointing with a short-gap semantic port (no Clef
  in pin c7a9a0d7e7, so the documented long-gap fallback decides), generation
  ids, barge-in that cancels the in-flight request or playback, sentence-level
  heard accounting, mute, Stop speaking, read-reply pauses and binding checks.
- live-segment-stream.ts: one result per VAD segment and stop reconciliation
  (audio after the tap is never forwarded; the open segment ends at the tap).
- native-live-voice.ts: owner-bound live transport, continuous capture, the
  assistant listener (echo-cancelled) and live dictation.
- Android: echo-cancelled communication source for the assistant
  (LiveCaptureSource), and the last in-segment frames are flushed on stop.
- Conversation state keeps only the played part of an interrupted reply.

Refs #423

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Implements the pinned plugin-maps MapsDeviceNavigation contract (select,
start, reroute, stop) over the existing Maps screen state. The agent asks
and the phone decides: start plans from one fresh device fix and stops at
the reviewed route sheet (awaiting-confirmation), so guidance begins only
on the user's Start; reroute uses the screen's own "Reroute from here"
only from a fresh, precise fix. Stale, approximate or missing fixes are
awaiting-location or a typed refusal, never a route origin. A newer
request, Stop, leaving Maps or an account change cancels pending work.
GPS, the active route, guidance and local speech stay on the phone and no
position is returned to the agent. Sharing is unchanged.

The binding is offered only while Eliza Cloud Maps is installed for the
signed-in account, in the launcher renderer, never for the test-mocks
regional gateway; each account gets its own binding and a change
withdraws it first.

The pinned Android resident (c7a9a0d7e7) does not load plugin-maps and
upstream has no relay from MapsService.registerDeviceNavigation to a
phone, so the agent's MAPS_* tools do not reach the phone yet. The port
records the offer (relay: false) and the test fails when the pin starts
loading plugin-maps or registering phone navigation.

Refs #412

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The emulator's virtual microphone delivered only silence on a loaded host
(ranchu HAL pcm_readi failures), so the harness can read the speech WAVs as
a paced feed labelled synthetic-feed while VAD, ASR, TTS and playback stay
the production paths. Fixes from review: harness trials carry their own
pipeline, overlapping replies fail instead of passing, cold flags survive
noise turns, engine loads are counted, builds record a dirty flag, and
acceptance needs a clean release build on an arm64 device.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Speech during a pending or playing reply interrupts only after a 700 ms
  hold or once its transcript passes the disfluency/echo gate; echo, coughs
  and blips leave the reply running. Voice interrupts playback only over a
  capture whose platform echo canceller is attached and enabled (reported by
  startLiveCapture); otherwise Stop speaking remains.
- The echo gate compares against every sentence that has started playing.
- Mute closes a capture that is still opening; unmute waits for the muted
  capture to finish closing.
- A 502 ASR_FAILED segment yields no text and the capture continues; an error
  event and the 502 for one turn count once.
- Frames are stamped on the capture clock and the closing speech-end carries
  the stop time; the renderer waits for the native flush as long as Java.
- A lost Transcribe capture can be started again; Transcribe copy says the
  agent on this phone transcribes and no message is sent.
- Docs state that heard-content marking is this session's view only.

Refs #423

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…edupe

- During playback only an accepted transcript interrupts: residual echo can
  hold the VAD open longer than any fixed hold. The 700 ms hold applies only
  while the request is pending.
- ASR failure dedupe uses per-source counters and only when an event stream
  exists, so consecutive failed segments each yield exactly one result.
- No microphone reopen during an owner-review pause; Stop cancels a muted
  capture that is still finalizing.
- The capture clock never lags wall time by more than the record buffer, and
  the echo effect is released if enabling it throws.

Refs #423

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…its status in Settings

- The assistant surface reads the one-shot invocation when the shell is
  ready; only the listener's authenticated invocation, while the keyguard is
  unlocked (reported by takeInvocation) and the surface is visible and free,
  starts the voice assistant: local Silero VAD, streaming Phonon-2 through the
  resident agent on this phone and Paradee replies (#423). A plain assist
  entry opens the surface without opening the microphone.
- Settings › Character shows the listener's status with Pause listening, Turn
  off listening and Listening settings; nothing in Alpha turns listening on.
  Production speech is described as on this device.
- The ADR and fused-speech doc no longer claim Silero VAD inside the listener
  (its packaged JNI has no VAD entry points) and describe the hand-off.

Refs #424

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Work in progress, interrupted by a rate limit. Not yet compiled or re-run on an emulator.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Work in progress, interrupted by a rate limit. Not yet compiled or re-run on an emulator.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Work in progress, interrupted by a rate limit. Not yet compiled or re-run on an emulator.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Work in progress, interrupted by a rate limit. Not yet compiled or re-run on an emulator.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Work in progress, interrupted by a rate limit. Not yet compiled or re-run on an emulator.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion settles

- AlphaAssistActivity keeps a listener origin for 5 s and remembers whether
  the keyguard was showing when it arrived (AssistInvocation.take), and fires
  alpha:assist-invocation when a new invocation reaches the open surface.
- The renderer reads the origin only with a settled connection, re-checks on
  connection changes, and treats ARIA modal dialogs as blocking.
- Settings orders listener reads after Pause/Turn off and hides Turn off when
  listening is already off.

Refs #424

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Uncommitted edits left in the #467 fix-round worktree when it stopped.
Not verified; see the draft PR for what remains.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lalalune and others added 21 commits October 14, 2026 16:06
…0261014' into codex/native-main-pins-current-20261014
Copilot AI balanced review requested due to automatic review settings October 15, 2026 00:54

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@lalalune
lalalune changed the base branch from codex/alpha-combined-qa-20261014 to main October 15, 2026 01:14
@lalalune lalalune closed this pull request by merging all changes into main in cca0846 Oct 15, 2026
@lalalune
lalalune deleted the codex/mail-controls-cleanup-20261014 branch October 23, 2026 03:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants