Commit Graph
22 Commits
Author SHA1 Message Date
snowspeeder c76afbd11e docs: record verified device pairing, signing, install 2026-09-12 07:17:55 -04:00
snowspeeder ea9ec75631 Configure development team for device signing 2026-09-12 07:10:41 -04:00
snowspeeder c5db94658d Restore same-URL guard in replaceServer
Accidentally dropped during the Music tab removal edit; without it,
reapplying the current URL recreates the session and loses history.
2026-09-12 06:57:32 -04:00
snowspeeder ed329213de Remove embedded music player
The music feature is retired: delete the Media tab, MediaAPI,
MediaPlayerController, PinnedMediaResourceLoader, MediaPanelView, the
media_state control publish, media scope handling in VoiceSession, the
volume setting, and all media tests. App is now Talk + Activity tabs.

Backend media API in hope-voice-api is untouched (still serves the web UI).
2026-09-12 06:26:58 -04:00
snowspeeder 3620a2387b docs: update repo URL after rename to hope-voice-ios 2026-09-12 06:11:39 -04:00
snowspeeder 24f95639dc Redesign Hope iOS UI, harden playback, and document project handoff 2026-09-09 20:23:44 -04:00
snowspeeder 40aaf4fea7 status 2026-08-31 19:50:46 -04:00
snowspeeder c9c25f86eb docs: record Phase 9 commit hash in PLAN.md 2026-08-30 09:41:10 -04:00
snowspeeder e63e53ee74 docs: README + device testing checklist (Phase 9) 2026-08-30 09:41:04 -04:00
snowspeeder 12ded179eb feat: hardening, error states, interruption handling, a11y (Phase 8) 2026-08-30 09:37:05 -04:00
snowspeeder 9f1f26ba54 docs: record Phase 7 commit hash in PLAN.md 2026-08-30 08:48:38 -04:00
snowspeeder af296da6b8 feat: background tasks panel (Phase 7) 2026-08-30 08:48:33 -04:00
snowspeeder 5c35fa9c65 docs: record Phase 6 commit hash in PLAN.md 2026-08-30 08:40:03 -04:00
snowspeeder cbf18306ff feat: media search, choices, library management (Phase 6) 2026-08-30 08:39:57 -04:00
snowspeeder c10ea72cd6 docs: record Phase 5 commit hash in PLAN.md 2026-08-30 08:21:16 -04:00
snowspeeder 0af944e60d feat: media player with reconciliation and pinned media proxy (Phase 5)
- MediaAPI client for all 10 media endpoints + Codable models
- PinnedMediaResourceLoader: AVAssetResourceLoaderDelegate proxying
  https media through the pinned-TLS session (AVPlayer ignores registered
  URLProtocol subclasses and can't trust the self-signed cert)
- MediaPlayerController: AVPlayer + 1.5s poll reconciliation ported from
  web app.js (track swap, late audio_url, desired state, seek_hint,
  reporting, enter-media-scope carry-over, post-talk resume)
- MediaPanelView UI + music.note toolbar entry
- VoiceSession wiring (enterMediaScope/endConversation)

Playback of the library's webm tracks is blocked by an iOS platform
limitation (AVPlayer cannot decode webm); TLS/Range proxy, reconciliation,
polling, reporting and UI are all verified working in the simulator.
2026-08-30 08:21:08 -04:00
snowspeeder f2022f8a96 docs: mark Phase 4 done with commit hash 2026-08-30 07:50:50 -04:00
snowspeeder ca2d26f171 feat: voice and model pickers with sync-on-join (Phase 4)
- Voices.swift: 13 Azure voices, default en-US-Ava
- SettingsStore: persist voiceID/modelID, fallback to default voice
- VoiceSession: sync set_voice/set_model on agent_ready, selectVoice/selectModel, track models + model_changed
- SettingsView: voice and model picker sheets
- ControlChannel: publish via publish(data:) reliable data channel instead of sendText DataStream (agent listens on legacy data_received; DataStream text was dropped)
2026-08-30 07:50:45 -04:00
snowspeeder 5483e6ed48 feat: conversation state machine, mic meter, history, wake lock (Phase 3) 2026-08-30 07:36:13 -04:00
snowspeeder 4986b6d7dc feat: LiveKit voice session, control channel, transcripts (Phase 2)
- VoiceSession: token->connect with fresh-room retry on timeout, agent
  discovery, agent_ready wait, mic enable/mute, text send over lk.chat
- ControlChannel: outbound set_voice/set_model/get_models/set_mode/
  media_state; inbound agent_ready/models/model_changed/task_event
- TranscriptHandler: transcription segments + transcript topic finals,
  partial/final dedupe per role
- ConversationView/OrbView: status orb, mic/text-mode toggles, composer
- ServerConfig: plain ws:// signaling for private IPs (self-signed TLS
  not injectable into SDK WebSocket); Info.plist local networking
2026-08-30 07:26:58 -04:00
snowspeeder 378b8cb36f feat: server config, token client, TLS pinning, connection test (Phase 1)
ServerConfig parses https base URL and derives wss livekit URL;
TokenClient POSTs /token with clean 503/offline error states;
TLSPinning holds optional cert SHA-384 pins (empty = system trust);
Settings gains a Connection test screen proving the endpoint works.
2026-08-29 17:18:38 -04:00
snowspeeder 297fbaa19c chore: scaffold Voice iOS app (Phase 0)
XcodeGen project, SwiftUI iOS 17 target dev.shane.voice, SPM
livekit-client-swift 2.16.0, mic usage + ATS LAN exception in
Info.plist, placeholder conversation screen and Settings with
server URL field.
2026-08-29 17:15:27 -04:00