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
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
f85a458a45
refactor(mobile): consolidate native gateway and voice lifecycles ( #114671 )
...
* refactor(mobile): consolidate native lifecycle ownership
* fix(ci): cover Codex prewarm and chat lifecycle proof
2026-07-27 14:52:02 -04:00
Peter Steinberger
56d9802f6e
fix(mobile): prevent stale reconnect, approval and voice cancellation ( #114549 )
...
* fix(mobile): fence reconnect, approval and voice cancellation
* fix(mobile): refresh native localization source inventory
* test(android): advance cancelled voice finalizer scheduler
* test(android): retain one approval during cancellation proof
2026-07-27 08:49:01 -04:00
Colin Johnson
de9ed64c29
feat(talk): enable GPT Live with Codex OAuth ( #113354 )
2026-07-25 20:41:27 -04: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
Peter Steinberger
da534dc506
fix(ios): harden Talk voice-session lifecycle from review ( #111424 )
...
- Close+clear the adopted logical voice session when a config/provider change
invalidates a realtime prefetch (a live call is preserved); prevents the
gateway rejecting a stale voiceSessionId resume under a new provider.
- Retry talk.client.close (0/500/2000ms) before forgetting the session, matching
the web client, so a transient close does not orphan it until the 6h sweep.
- Surface exhausted transcript-persist failures through the session delegate so a
dropped affirmation transcript no longer silently blocks spoken confirmation.
- Localize the "Confirmation needed" status through the presentation switches;
add its native locale translations.
2026-07-19 07:01:28 -07:00
Peter Steinberger
4e008cd713
feat(ios): adopt Talk voice sessions ( #111369 )
...
* feat(ios): adopt Talk voice sessions
* docs(agents): fix unrelated red-main breakage in the landing PR
* chore(i18n): translate Talk voice-session strings across native locales
2026-07-19 06:28:18 -07:00
Peter Steinberger
59b2fbbb4b
feat(ios): Talk camera flip control and mic input selection ( #111044 )
...
* feat(ios): add Talk camera flip and mic selection
* chore(ios): sync native i18n inventory and locale artifacts for talk camera/mic strings
* chore(ios): commit regenerated Localizable.xcstrings for new talk strings
* fix(ios): extract Talk composer controls
* chore(ios): resync native i18n inventory and locale artifacts atop landed Android entries
* fix(ios): repair Talk composer CI checks
* chore(i18n): commit regenerated Android locale outputs from catalog reconciliation
* chore(i18n): sync Android locale outputs after rebase
2026-07-19 01:24:53 -07:00
Peter Steinberger
62c5a8b888
fix(gateway): make scope errors machine-readable across clients ( #111013 )
...
* fix(gateway): consume structured scope errors
* docs(gateway): clarify tools error boundary
* refactor(gateway): unify node admin policy
2026-07-18 17:53:45 -07:00
Colin Johnson
1ca6b6ff67
feat(ios): unify chat and voice experience ( #107879 )
...
* feat(ios): unify chat and voice experience
* refactor(ios): finish unified chat ownership
* fix(ios): unify chat and voice capture ownership
* fix(ios): serialize Talk permission hydration
* fix(ios): clear voice CI regressions
* fix(ios): clear remaining unified chat CI failures
* chore(i18n): sync native source inventory
* refactor(ios): defer provider-only realtime voice
* fix(ios): clean unified chat voice PR
* fix(ios): localize unified voice controls
* fix(ios): serialize composer audio controls
* fix(ios): isolate dictation preparation lifecycle
* fix(ios): key chat tab icons by appearance
* fix(ios): preserve talk upgrade handshakes
* fix(ios): refresh native i18n inventory
* fix(ios): reconcile shared locale artifacts
* fix(ios): satisfy chat view lint limit
* fix(ios): reconcile shared composer implementation
* test(apple): avoid XCTest actor deinit crash
* fix(ios): satisfy SwiftFormat scope spacing
* fix(ios): remove duplicate merged helper declarations
2026-07-18 14:30:10 -04:00
Vincent Koc
1185db56c0
refactor(ios): remove write-only talk provider state ( #106881 )
...
* refactor(ios): remove write-only talk provider state
* chore(ios): sync native i18n inventory
2026-07-14 08:46:46 +08:00
Peter Steinberger
e1a92c99cf
fix(ios): persist chat thinking selections ( #106287 )
...
* refactor(apple): share chat gateway requests
* fix(ci): sync native app inventory
* docs: keep Apple release note in PR body
2026-07-13 05:44:08 -07:00
Peter Steinberger
6c5084f1ad
feat(xai): add realtime voice provider ( #106267 )
...
* feat(xai): add realtime voice provider
Co-authored-by: Vitor Cepeda Lopes <vitor@vitorcepedalopes.com >
* fix(xai): satisfy realtime voice validation
* fix(xai): harden realtime relay boundaries
* chore: drop release-owned changelog edit
* chore(i18n): refresh native voice catalogs
* chore(i18n): refresh Control UI raw-copy baseline
* chore(plugin-sdk): refresh API baseline hashes
* chore(i18n): use canonical main catalogs
* chore(i18n): refresh realtime voice source inventory
* chore: refresh xai voice landing head [skip ci]
* chore: refresh integrated protocol artifacts [skip ci]
---------
Co-authored-by: Vitor Cepeda Lopes <vitor@vitorcepedalopes.com >
2026-07-13 05:17:24 -07:00
Vincent Koc
5e9bc0916f
fix(ios): harden gateway and watch state handling
2026-07-13 03:53:15 +02:00
Vincent Koc
543161e67e
fix(ios): localize remaining runtime labels
2026-07-12 18:33:47 +02:00
Vincent Koc
6ddc87de0a
fix(ios): satisfy watch localization build gates
2026-07-12 18:33:47 +02:00
Vincent Koc
34fe882301
fix(ios): carry semantic gateway progress
2026-07-12 18:33:47 +02:00
Vincent Koc
3854f43be7
fix(talk): preserve WebRTC progress semantics
2026-07-12 18:33:47 +02:00
Vincent Koc
1c3b94550e
fix(watch): preserve one-shot push-to-talk status
2026-07-12 18:33:47 +02:00
Vincent Koc
55a3634809
fix(watch): preserve realtime failure presentation
2026-07-12 18:33:47 +02:00
Vincent Koc
44f2488318
fix(watch): preserve terminal Talk failure state
2026-07-12 18:33:47 +02:00
Vincent Koc
cf8ae716ff
fix(ios): preserve localized runtime semantics
2026-07-12 18:33:47 +02:00
Vincent Koc
c09a555c9e
fix(ios): decouple Talk state from localized copy
2026-07-12 18:33:47 +02:00
Vincent Koc
61511342e4
test(ios): cover speech restart status ownership
2026-07-12 18:33:47 +02:00
Vincent Koc
459f11e902
fix(ios): guard localized speech status restart
2026-07-12 18:33:47 +02:00
Vincent Koc
826b4fac1f
fix(ios): keep localized voice status state-safe
2026-07-12 18:33:47 +02:00
Vincent Koc
6d4afffec3
fix(ios): localize setup and status surfaces
2026-07-12 18:33:47 +02:00
Peter Steinberger
da4a480089
chore(apps): remove more dead code
2026-07-12 00:58:32 -07:00
Peter Steinberger
bf13c3bb1b
chore(apps): remove dead native code
2026-07-11 23:51:21 -07:00
Peter Steinberger
091584b197
chore(swift): restore compact conditional bodies ( #103832 )
...
* style(swift): restore compact conditional bodies
* fix(ios): remove redundant startup timeout await
* chore(swift): sync native i18n inventory
2026-07-10 18:12:00 +01:00
NianJiu
067edbcb2d
fix(ios): make Talk audio lifecycle-safe ( #103072 )
...
* fix(ios): cancel queued push-to-talk invokes
* fix(ios): make push-to-talk cancellation lifecycle-safe
* style(ios): use switch expression for PTT result
* fix(ios): bind audio capture to lifecycle owners
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com >
* style(ios): format rebased lifecycle changes
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com >
* fix(ios): preserve routing hydration across reconnects
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com >
* fix(ios): cancel routing hydration on target switch
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com >
* chore(ios): refresh native i18n inventory
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com >
* fix(i18n): preserve native localization IDs
* chore: leave changelog to release automation
* refactor(apple): split lifecycle and gateway helpers
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com >
* fix(ios): make lifecycle parsing nonisolated
* fix(ios): consume canonical Talk events
---------
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-10 15:03:40 +01:00
Peter Steinberger
62bd760c0e
chore(swift): enforce current formatting and lint rules ( #103313 )
...
* style: apply SwiftFormat 0.62.1 rules
Refs #103202
* ci: enforce deterministic Swift lint
Refs #103202
* refactor: keep gateway connect lint-clean
Refs #103202
* style: keep iOS typography checks warning-free
* ci: route MLX Swift changes through pre-push
* fix: preserve native i18n extraction after Swift cleanup
* refactor: keep rebased Swift surfaces lint-clean
* style: format latest Swift additions
* chore: refresh native i18n inventory
* style: keep generated Swift formatter-clean
* fix: preserve node route invalidation callbacks
* fix: keep native translation IDs stable
* fix: retain native translation identifiers
* fix: preserve translations across Swift source moves
2026-07-10 11:54:08 +01:00
NianJiu
04c090fb50
fix(ios): return promptly from noncooperative timeouts ( #103066 )
...
* fix(ios): return promptly from noncooperative timeouts
* fix(apple): harden async timeout cancellation
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com >
* fix(apple): preserve legacy location requests
* style(apple): format location continuation code
---------
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-10 00:29:03 +01:00
Peter Steinberger
4aa8bf12e3
refactor(voice): dedupe talk audio primitives into OpenClawKit ( #103099 )
...
* refactor(voice): dedupe talk audio primitives into OpenClawKit
One buffered TTS clip player (watchdog + metering) shared by iOS and
macOS replaces the near-identical pair; macOS TalkPlaybackResult was a
field-for-field duplicate of StreamingPlaybackResult and is gone. One
AVAudioPCMBuffer RMS helper replaces five per-file copies; the metered
PCM passthrough moves into PCMPlaybackEnvelope; TalkModeManager's
duplicated ElevenLabs PCM-then-mp3-retry blocks collapse into one
helper. Net -378 lines, no behavior change.
* fix(ios): drop stray blank line and resync i18n inventory
* fix(ios): drop stray blank line after helper extraction
2026-07-09 22:21:00 +01:00
Peter Steinberger
20816f676f
feat(voice): universal talk waveform driven by real audio levels ( #102901 )
...
* feat(voice): universal talk waveform driven by real audio levels
One shared Siri-style talk animation across iOS, watchOS, macOS, and
Android (TalkWaveformView + exact Compose port), replacing per-platform
fakes: synthetic speaking pulses, constant speech-detected power, static
Android bar rows, flat realtime listening. Listening/recording follow
live mic levels on every route; agent speech follows the real playback
envelope (AVAudioPlayer metering + playback-aligned PCM envelope +
WebRTC stats); voice-note recording shows a live capture wave.
* fix(android): order waveform imports and sync native i18n inventory
* chore(i18n): resync native inventory after rebase
2026-07-09 16:33:25 +01:00
Peter Steinberger
b978dcc63b
feat(ios): record and send voice notes from the chat composer ( #100946 )
...
* feat(ios): record and send voice notes from the chat composer
Adds tap-to-record voice notes to the shared chat composer: m4a/AAC mono
capture with a 3-minute cap, lazy mic permission, cancel/finish controls,
audio attachment chips with duration, and a voice-note transcript row.
Voice-wake suppression becomes reason-scoped so recording and Talk cannot
clobber each other. Attachments stay online-only per the outbox contract.
Related: #100709
* fix(ios): harden voice note attachment staging
* chore(ios): keep voice note changelog release-owned
* fix(ios): gate voice notes with attachment availability
* chore(ios): refresh native localization inventory
2026-07-07 00:14:05 +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
PollyBot13
a320f775f0
fix(ios): defer QR pairing after scanner dismissal ( #99572 )
...
* fix(ios): defer QR pairing after scanner dismissal
* fix(ios): process QR pairing after scanner dismissal
* fix(ios): harden QR scanner handoff
* fix(ios): give QR scanner dismissal more time
* fix(ios): keep onboarding open for QR trust prompt
* fix(ios): keep QR trust prompt owned by onboarding
* fix(ios): recover operator pairing after QR bootstrap
* fix(ios): cancel stale QR scanner handoffs
Co-authored-by: PollyBot13 <pollybot13@gmail.com >
* fix(ios): defer QR setup until onboarding closes
* fix(ios): keep QR setup links with visible settings
* fix(ios): consume setup links during onboarding
* fix(ios): handle setup links during onboarding launch
* fix(ios): route setup links through active onboarding
* fix(ios): harden QR gateway handoff
* fix(ios): cancel superseded gateway attempts
* fix(ios): serialize scanner result delivery
* fix(ios): prevent stale gateway reconnects
* fix(ios): serialize gateway target handoff
* fix(ios): disable stale gateway relaunch route
* fix(ios): await staged bootstrap reset
* test(ios): bound gateway reset handoff
* fix(ios): preserve explicit gateway handoff
* fix(ios): harden gateway lifecycle ownership
* chore(ios): sync native i18n inventory
* test(ios): align gateway ownership assertions
* refactor(ios): remove superseded gateway helpers
* fix(ios): keep gateway auth route scoped
* fix(ios): restore gateway target review state
* fix(protocol): refresh Swift plugin approval model
* test(ios): isolate state directory overrides
* fix(ios): preserve watch alerts across gateway switches
* fix(ios): bind deferred work to gateway ownership
* docs(changelog): credit iOS gateway handoff fix
* chore(i18n): sync native app inventory
* test(ios): remove unused Watch approval hooks
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-05 12:31:53 -07:00
Peter Steinberger
444d54c538
fix(ios): avoid inactive Voice Wake audio startup ( #100370 )
...
* fix(ios): avoid inactive voice wake audio startup
* fix(ios): avoid inactive voice wake audio startup
* fix(ios): avoid inactive voice wake audio startup
2026-07-05 09:58:28 -07:00
joshavant
788472ed4a
Apply branded fonts across iOS sibling controls
2026-07-03 18:45:45 -05:00
joelnishanth
39b703dfcf
feat(ios): implement branded typography design system
...
Add OpenClaw design system foundations:
- Custom typography tokens (OpenClawType) using Plus Jakarta Sans,
DM Sans, and JetBrains Mono with Dynamic Type scaling
- Spacing and radius token enums (OpenClawSpacing, OpenClawRadius)
- Additive brand color tokens (accentPressed, teal, void, obsidian,
slate, textPrimary, textSecondary)
- Shared components: OpenClawToggleIndicator, OpenClawStatusBadge,
OpenClawPrimaryButtonStyle, OpenClawSecondaryButtonStyle
- Bundled font files with OFL license provenance
Migrate all iOS views to OpenClawType tokens. No behavioral, navigation,
or routing changes — this is purely visual/typographic.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-07-03 18:45:45 -05:00
PollyBot13
2f707f9811
fix: prevent Voice Wake crash after Talk audio capture ( #99137 )
...
* fix: prevent Voice Wake audio restart race
* fix: handle in-flight Voice Wake suspension
* test(ios): harden Voice Wake lifecycle proof
* fix(ios): remove Voice Wake tap after failed start
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-02 14:41:49 -07:00
PollyBot13
8b99c45bbb
fix: route iOS OpenAI realtime Talk through WebRTC ( #98563 )
...
* fix: route iOS OpenAI realtime talk through WebRTC
* fix(ios): harden native realtime routing
* fix(ios): preserve realtime route ownership
* fix(ios): balance realtime audio sessions
* chore(ios): sync native i18n inventory
* fix(ios): preserve Azure realtime relay
* fix(ios): harden realtime session recovery
* chore(ios): sync native i18n inventory
* fix(ios): preserve selected Azure realtime routing
* fix(ios): rotate terminal realtime sessions
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-02 12:49:23 -07:00
Peter Steinberger
d0f655811c
fix(ios): use Gateway speech providers in Talk ( #98376 )
...
* fix(ios): route gateway speech through talk.speak
* fix(ios): preserve realtime fallback state
* fix(ios): satisfy audio delegate concurrency
* fix(ios): ignore stale audio callbacks
* fix(ios): ignore stale audio callbacks
---------
Co-authored-by: Peter Steinberger <steipete@golden-gate.local >
2026-07-01 05:33:51 +01:00
Sash Zats
5d9daea2b0
fix(ios): centralize app accent colors ( #94627 )
...
Move iOS accent and status colors through design tokens so raw SwiftUI color literals are blocked outside token definitions.
Set the app-wide tint in SwiftUI and UIKit from code, without relying on Assets.xcassets AccentColor.
2026-06-22 20:20:37 +00:00
David
3ff0c29f9d
fix: handle terminal chat send acknowledgements ( #91049 )
...
* test: cover terminal chat send acknowledgements
* test: cover Swift terminal chat send acknowledgement
* fix: handle terminal chat send acknowledgements
* fix: align terminal ack web lifecycle options
* test: fix Android terminal ack style
* fix: tidy Android terminal ack helpers
* fix: clear mic pending run after terminal ack
* fix: handle terminal talk mode chat send acks
* fix: handle terminal tui chat send acks
* fix: handle terminal acp chat send acks
* test: add Swift chat message text helper
* test: cover steer terminal chat send acknowledgements
* fix: handle terminal steer chat send acks
* test: cover terminal realtime consult send acks
* fix: reject terminal realtime consult send acks
* test: cover Swift terminal ok chat send ack
* fix: clear Swift pending run on terminal ok ack
* test: cover terminal ack helper callers
* fix: preserve terminal ack helper semantics
* fix: narrow terminal ack type guard
* test: cover mic terminal ack statuses
* fix: preserve mic terminal ack status
* fix: keep mic ack contract internal
* test: fix mic ack import order
* test: cover acp terminal ok ack
* test: narrow acp ok ack assertion
* test: cover redirect terminal acknowledgements
* fix: handle redirect terminal acknowledgements
* fix: settle terminal ack reconnect prompts
* fix: surface Android terminal ack timeouts
* fix(tui): handle detached terminal chat acknowledgements
* fix(tui): report terminal timeout send failures
* fix: satisfy iOS talk-mode SwiftFormat
* fix: keep iOS talk logs compile-safe
2026-06-22 17:27:54 +00:00
joshavant
377f6181a9
feat: add ios screenshot fixture mode
2026-06-15 19:27:55 +02:00
joshavant
1ffda5d3ca
fix: migrate ios identifiers to openclawfoundation
2026-06-15 19:27:55 +02:00
Sash Zats
233b48daaa
refactor: prune unused iOS code ( #91996 )
...
Prune unused iOS surfaces and regenerate the Xcode project. Add a scoped Periphery PR gate with hardened artifact handling and stale-status cleanup.
Co-authored-by: Sash Zats <sash@zats.io >
2026-06-15 02:07:15 -07:00