100 Commits
Author SHA1 Message Date
snowspeeder 7990354a91 docs: record verified voice web production deployment 2026-10-04 10:43:08 -04:00
snowspeeder 235dd65487 feat(ios): align chat library memory and tasks with web 2026-10-04 10:41:17 -04:00
snowspeeder 8905dc2c2a fix: give realtime voice a dedicated conversation view
Rebuild & Deploy / rebuild (push) Successful in 3m7s
2026-10-04 10:35:34 -04:00
snowspeeder 257ab48f0f docs: confirm web Docker release verified in production 2026-10-04 08:38:04 -04:00
snowspeeder ea4e191400 fix: serialize SQLite close with cancelled worker transactions
Rebuild & Deploy / rebuild (push) Successful in 4m1s
2026-10-04 08:32:33 -04:00
snowspeeder 5a02b8f0c1 fix: stream tracked source into CI qualification container
Rebuild & Deploy / rebuild (push) Failing after 1m53s
2026-10-04 08:23:52 -04:00
snowspeeder 41ca590744 feat: clarify web library memory and conversation management
Rebuild & Deploy / rebuild (push) Failing after 17s
2026-10-04 07:58:16 -04:00
snowspeeder 3183ebaea7 docs: confirm monorepo publication and iOS archive 2026-10-04 07:24:49 -04:00
snowspeeder d735ee72fa feat: consolidate iOS with API and web preserving history
Rebuild & Deploy / rebuild (push) Failing after 23s
2026-10-04 07:23:49 -04:00
snowspeeder 7bd893ae5c feat: refine native iOS chat experience 2026-10-03 18:55:28 -04:00
snowspeeder 91a0d8820f docs: qualify final approved web release live
Rebuild & Deploy / rebuild (push) Failing after 22s
2026-10-03 18:33:28 -04:00
snowspeeder 980be44743 docs: record final deployed overhaul image and rollback receipt 2026-10-03 18:33:05 -04:00
snowspeeder 19df338c5c fix: polish live administration table and record overhaul qualification 2026-10-03 13:30:32 -04:00
snowspeeder e59c7123cf fix: preserve initial focus and guard account appearance saves 2026-10-03 13:22:43 -04:00
snowspeeder cd7d7d6251 feat: implement approved Hope primary conversation shell 2026-10-03 13:20:12 -04:00
snowspeeder 2be5725fbd feat: integrate real administration retry and approved feature destinations 2026-10-03 13:19:04 -04:00
snowspeeder fef3cb35a8 feat: integrate production account settings navigation 2026-10-03 13:18:28 -04:00
snowspeeder 02ea1d0884 feat: expose truthful inline realtime voice lifecycle 2026-10-03 13:18:19 -04:00
snowspeeder d8fa6f0654 design: record approved Hope conversation and administration overhaul 2026-10-03 13:12:55 -04:00
snowspeeder c549b92b52 test: qualify deployed realtime voice STT Hermes and audio delivery 2026-10-03 12:20:04 -04:00
snowspeeder 856238f47a test: verify deployed browser chat stream and immediate pin 2026-10-03 12:19:43 -04:00
snowspeeder 9c5e9bce5b test: add opt-in native chat transport qualification 2026-10-03 12:17:35 -04:00
snowspeeder 7cb641b35a fix: restore prominent realtime Talk navigation 2026-10-03 12:14:38 -04:00
snowspeeder 3752741e19 test: qualify advanced chat features with disposable live data 2026-10-03 12:11:57 -04:00
snowspeeder 6bb2f53dce fix: refresh conversation revision before post-run actions 2026-10-03 12:10:14 -04:00
snowspeeder ec510b938b fix: share private chat files and harden native lifecycle 2026-10-03 09:16:56 -04:00
snowspeeder 0c57217ad9 fix: reconcile uncertain voice admission with bounded cancellation 2026-10-03 09:08:25 -04:00
snowspeeder 7dcd06c911 feat: add authenticated durable native Hope chat 2026-10-03 09:06:06 -04:00
snowspeeder 0cb00e6095 test: qualify keyed voice cancellation receipts 2026-10-03 09:04:11 -04:00
snowspeeder 2ad9f36f4f fix: persist room operation cancellation across lost admission acknowledgments 2026-10-03 09:03:12 -04:00
snowspeeder 523f6cbbf9 feat: integrate durable chat voice transport and deployment assets 2026-10-03 09:02:47 -04:00
snowspeeder e059660194 fix: preserve idempotent admission under capacity and preparation failures 2026-10-03 09:00:36 -04:00
snowspeeder 33929b8c09 test: stress voice admission identity and repeated cancellation 2026-10-03 08:59:13 -04:00
snowspeeder 1a04dab031 test: guard durable chat deployment packaging 2026-10-03 08:58:36 -04:00
snowspeeder 550f7c2e91 feat: implement durable authenticated chat run coordinator 2026-10-03 08:57:41 -04:00
snowspeeder 08b7e20be8 feat: add qualified research exports and accessible voice handoff 2026-10-03 08:57:35 -04:00
snowspeeder 135e0c0da2 ci: gate deployment on offline chat qualification 2026-10-03 08:57:16 -04:00
snowspeeder e048793b02 feat: qualify native Hermes research and private conversation exports 2026-10-03 08:56:18 -04:00
snowspeeder fb3178d34b test: qualify chat cancellation and cross-client ownership 2026-10-03 08:55:45 -04:00
snowspeeder fe4192c8bc fix: guard chat deletion and research idempotency 2026-10-03 08:54:08 -04:00
snowspeeder 2048b33799 test: qualify quiesced deployment snapshots and rollback 2026-10-03 08:53:34 -04:00
snowspeeder fdf905eb7e feat: complete chat archive sync and mobile actions 2026-10-03 08:51:17 -04:00
snowspeeder bfbaef8c68 feat: add durable owner-scoped chat store 2026-10-03 08:51:09 -04:00
snowspeeder 8dda23a1d8 feat: add retained upload management controls 2026-10-03 08:50:08 -04:00
snowspeeder be2b9f83d0 feat: add owned advanced chat storage and qualified Hermes surfaces 2026-10-03 08:49:22 -04:00
snowspeeder bba522bc26 feat: add advanced chat attachment and saved work controls 2026-10-03 08:47:59 -04:00
snowspeeder 2261208a1b feat: add durable Hope primary web chat shell 2026-10-03 08:44:44 -04:00
snowspeeder 985c812a75 feat: add shared versioned Hope palette tokens 2026-10-03 08:36:28 -04:00
snowspeeder 437745bcca fix: declare Hermes auto image support and migrate running accounts 2026-10-02 16:17:29 -04:00
snowspeeder 6b8d55fc92 feat: add Hermes WebUI provisioning and English Dragon HD Omni voices
Rebuild & Deploy / rebuild (push) Successful in 2m17s
2026-10-02 16:07:24 -04:00
snowspeeder 74d2b63614 feat: apply pink Opal design with reactive square persona 2026-10-02 13:28:10 -04:00
snowspeeder 5b41b3924a fix: remove conflicting ATS CA pin and verify physical LiveKit trust 2026-10-01 18:09:25 -04:00
snowspeeder 47cc9c88a0 fix: persist verified iPhone certificate onboarding download 2026-10-01 18:02:14 -04:00
snowspeeder 15c6389ffb feat: center square Hope presence and guide secure certificate setup 2026-10-01 18:02:14 -04:00
snowspeeder b6b7ad34bf docs: record live model settings qualification 2026-10-01 16:40:35 -04:00
snowspeeder 6cb4427210 feat: save account model and thinking settings for Hermes
Rebuild & Deploy / rebuild (push) Successful in 1m9s
2026-10-01 16:38:34 -04:00
snowspeeder a45569f8c1 fix: verify deployment health in Docker host network
Rebuild & Deploy / rebuild (push) Successful in 44s
2026-10-01 16:22:04 -04:00
snowspeeder 3122ca7605 fix: validate host certificates through Docker in CI
Rebuild & Deploy / rebuild (push) Failing after 1m9s
2026-10-01 16:19:58 -04:00
snowspeeder 129159ffd1 fix: support legacy Docker builder in deployment
Rebuild & Deploy / rebuild (push) Failing after 1m12s
2026-10-01 16:16:47 -04:00
snowspeeder c5f7bb39e7 fix: delay and vary spoken wait notices
Rebuild & Deploy / rebuild (push) Failing after 7s
2026-10-01 15:59:10 -04:00
snowspeeder 6f2659421c docs: record signed iPhone installation and successful launch 2026-10-01 15:22:00 -04:00
snowspeeder 9cc6147c6f test: verify rollback restores originals on partial deployment failure
Rebuild & Deploy / rebuild (push) Failing after 15s
2026-10-01 13:40:21 -04:00
snowspeeder df25c7336c docs: record live speech qualification and secure operator handoff 2026-10-01 13:38:01 -04:00
snowspeeder 27853f7c27 fix: restore original services on partial deployment failure 2026-10-01 13:34:20 -04:00
snowspeeder 2aedea84b5 feat: provision private Hermes assistants for authenticated Hope accounts 2026-10-01 13:30:18 -04:00
snowspeeder bebaf59466 feat: authorize iOS Hermes accounts and secure session isolation 2026-10-01 12:57:57 -04:00
snowspeeder 9bdaea2408 Document engineering learnings and refresh handoff guidance 2026-09-19 14:40:24 -04:00
snowspeeder 85169d651c project: regenerate to include asset catalog resource phase 2026-09-12 17:27:00 -04:00
snowspeeder 7ac8a1c2fa brand: add Hope app icon (Lightwell aperture)
- 1024px icon from web/brand/hope-icon.svg (forced-dark, grid-tuned)
- fix xcodegen: xcassets was never in the generated project (no
  resources phase) — move it into sources with buildPhase: resources
- fix iconset manifest: idiom universal (universal-platform rejected
  by actool), single 1024 universal/ios entry
2026-09-12 17:26:57 -04:00
snowspeeder da65da68b3 brand: adopt Lightwell aperture as the Hope brand mark
- web/brand/hope-mark.svg: canonical adaptive mark (light/dark)
- web/brand/hope-logo-horizontal.svg: lockup with rounded wordmark
- web/brand/hope-icon.svg: forced-dark icon-grid-tuned source
- favicon.svg: small-size tuned aperture
- manifest + index.html: PNG icons (192/512), apple-touch-icon, theme #1C191F
2026-09-12 17:26:54 -04:00
snowspeeder 59d8182b6c docs: record final device install 2026-09-12 17:13:27 -04:00
snowspeeder b7cec80a99 fix: close Nearlight release blockers 2026-09-12 10:13:14 -04:00
snowspeeder 5577162594 Reapply N2 fix: disable Send until transport ready (lost in prior commit) 2026-09-12 08:38:08 -04:00
snowspeeder f6722a223f Fix regressions N1-N3 from re-verification
- Transcript: selection suspension clears when press ends; Latest
  re-enables follow fully (clears stale selection state)
- Send disabled until transport ready in pending Type composer
- Server URL: programmatic success-trim no longer erases its own
  saved-confirmation; only user edits clear it
2026-09-12 08:36:01 -04:00
snowspeeder afe37ad5f4 Fix reading-safety and accessibility majors from review
- Transcript: drag suspends auto-follow; long-press selection suspends
  following; Latest is a trailing outlined capsule that re-enables follow
- Lightwell: pulse via isolated TimelineView (2.4s triangle wave), pauses
  when offscreen; Reduce Motion uses static geometry (no level resizing)
- Increase Contrast: solid Rosewood lightwell fill, 2pt Rosewood selected
  outlines on mode buttons
- Haptics: success only on entering ready, error only on entering failure
2026-09-12 08:27:48 -04:00
snowspeeder f043d6b078 Fix major Nearlight deviations from design review
- Expose End conversation + readable draft during connecting/waiting
- Stop masking assistant speaking/thinking state in Type/muted modes
- Restrict failure diagnosis to real causes (no invented network text)
- Replace old blue tint with Rosewood everywhere
- Fix transcript short-content bottom-anchor (top-align short histories)
- Settings: visible Server URL label, focus on rejected save, edit clears
  saved confirmation, trim-aware unchanged detection
- Task detail: live store lookup with missing-task state
- Task rows: status text label restored
2026-09-12 08:20:43 -04:00
snowspeeder fa21c81787 wip: Nearlight redesign implementation 2026-09-12 08:14:06 -04:00
snowspeeder c76afbd11e docs: record verified device pairing, signing, install 2026-09-12 07:17:55 -04:00
snowspeeder b01ee6478d fix: background tasks follow the live model selection
TaskWorker resolved its model from LLM_MODEL env (frozen at MCP spawn),
so after a live set_model switch in the UI, dispatched background tasks
still asked for the old model. On local-vl-models (llama-swap
--models-max 1) that forces a swap against the loaded conversation
model; a force-kill mid-load surfaces as 400 'model failed to load'.

The agent now writes the selected model to <task_dir>/model.txt at
session start and on every switch; TaskWorker reads it with the env
value as fallback.
2026-09-12 07:16:08 -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 436b3fc8b1 refactor: split music streaming into Hope Music
Rebuild & Deploy / rebuild (push) Successful in 2m7s
Move the media server, downloader, library volume, and browser player to the
standalone hope-media-music product. Keep Hope's music tools as a thin HTTP
client of the LAN service on port 8094.

Use a stable voice-room player scope instead of ephemeral LiveKit room names.
The agent now owns the conversation handshake: fresh reported playback mutes
its input, joining pauses music, and the last participant leaving resumes only
music it paused. Peer failures remain non-fatal.

Also move the voice deploy workflow onto the active Unraid Gitea runner and
remove yt-dlp/ffmpeg/media health and volume dependencies from the image.
2026-09-12 06:35:15 -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 d4ea4fc984 fix: background tasks now fetch real page content; add task-status tools
Rebuild & Deploy / rebuild (push) Successful in 58s
Background research tasks were producing garbage or failing because the
self-hosted Firecrawl /v1/scrape defaults to a ~30s timeout that's too short
for heavy news/research sites, and the small LLM won't reliably chain a
second scrape call after a search that only returns snippets.

task_worker.py:
- web_search now auto-fetches the top results directly from the container
  (which has working outbound internet) and returns their real text, so the
  model gets actual page content in one call instead of snippet echoes.
- web_scrape requests timeout: 90000 (Firecrawl renders heavy sites but needs
  >30s), and falls back to a direct container fetch with tag-stripping if
  Firecrawl times out or returns nothing.

task_registry.py / dispatch_mcp.py:
- Add task_status(id) and list_tasks() tools so Hope can check the live state
  of any dispatched task (pending / running / completed / failed / STALLED).
- Track last_activity per task and surface a stall heuristic.
- Move the status summary into task_registry (no mcp dependency) so it's
  unit-testable.

agent.py: prompt tells Hope about task_status / list_tasks.
tests: add task-status summary and last-activity regression tests.
2026-08-30 06:54:57 -04:00