Skip to content

v0.17.0

Latest

Choose a tag to compare

@github-actions github-actions released this 26 Jun 22:45
76d1d80

0.17.0 (2026-06-26)

Features

  • chat: card media_player with transport + volume controls, same room grid (defc9ec), closes #541
  • chat: card on/off control is a toggle switch, not an 'an'/'aus' button (88a0dba), closes #560
  • chat: card on/off toggle + media_player power/source + failed-voice-turn traces (2df9601)
  • chat: card-layout v2 — compact-all + full-width answers + uniform base-column grid (#552) (1b48c2b)
  • chat: chat-cards epic #534 — state-filtering, room grouping, compact card, grid, room query, media_player (f4c4ae5)
  • chat: compact light card — on/off badge + brightness slider one row (dcdd6eb), closes #538
  • chat: concrete read-only HttpDavClient for CalDAV/CardDAV ingest (aa66ae0)
  • chat: concrete read-only HttpDavClient for CalDAV/CardDAV ingest (d4e5bb8), closes #522
  • chat: continuous conversation — a follow-up turn's spoken text ends in a question mark (e227c7c), closes #566
  • chat: continuous conversation — follow-up turns end in '?' so HA re-opens the mic without re-wake (1e23cfe)
  • chat: default device-less play to the current room (u99) (44baab0)
  • chat: default music/radio to the current room's device (2f7a042)
  • chat: deterministic engine-side confirmation gate for sensitive ha_call_service (d4aebd8)
  • chat: deterministic engine-side confirmation gate for sensitive ha_call_service (b77858e), closes #570
  • chat: enrich bands with genre+bio facts + artist_info query op (57f59ca)
  • chat: enrich bands with genre+bio facts + artist_info query op (a457ffc), closes #592
  • chat: group cards by room when >4, else label each card (eb2531d), closes #537
  • chat: Jellyfin music ingest -> central knowledge OKF concepts (316143f)
  • chat: Jellyfin music ingest -> central knowledge OKF concepts (e134bb5), closes #564
  • chat: learned default playback device — ask once, store, reuse (c82f7c1), closes #622
  • chat: learned default playback device (ask once, store, reuse) (e890b3c)
  • chat: media_player card power on/off toggle + source select (492cf9e), closes #561
  • chat: music_query structured artist->songs tool (per-user scoped) (b9adab9)
  • chat: music_query tool over the structured store (46160b8), closes #588
  • chat: notes_search fuzzy + ranked retrieval (non-embedding slice of #591) (ba073c7)
  • chat: notes_search lightly-fuzzy + ranked, shared scorer (37ce410), closes #591
  • chat: on-demand song lyrics — resolve song, fetch live from Jellyfin (3dcca18), closes #593
  • chat: on-demand song lyrics — resolve song, fetch live from Jellyfin (#593) (fd9db46)
  • chat: path-based ownership — users/<uid>/ private paths + OKF resident: leak fix + per-library music (72875f9)
  • chat: path-based ownership — users/<uid>/ private paths + OKF resident: leak fix + per-library music (1dc3b32), closes #576
  • chat: per-user privacy slice 1 — uid-filtered retrieval, default-deny (02a5bfa)
  • chat: per-user privacy slice 1 — uid-filtered retrieval, default-deny (776bbb6), closes #576
  • chat: persist a failed voice turn's trace so the error is visible (d85f504), closes #562
  • chat: play_music — cast a Jellyfin library track on a media_player (cc15c4c)
  • chat: play_music — cast a Jellyfin library track on a media_player (9b6ccc5), closes #604
  • chat: play_radio — favorite station, ask+store, via radio-browser (df5e93a)
  • chat: play_radio — per-user favorite station via radio-browser (07eca33)
  • chat: podcast search by host/person via fyyd term fallback (40b713a)
  • chat: quick-reply answers on every question + composer pre-fill (66fc771)
  • chat: quick-reply chips — model offers 2-4 clickable answers above the input (6b3e9db), closes #555
  • chat: quick-reply suggestion chips — model offers 2-4 clickable answers (df02fc1)
  • chat: render cards only for entities matching the query state (3e294de), closes #536
  • chat: research(query) tool — fan out to notes+web, trust-rank, cited summary (5572132), closes #574
  • chat: research(query) tool — fan out to notes+web, trust-rank, cited summary (slice 1) (2e5f256)
  • chat: resolve podcasts by host/person via fyyd term search (631a9da), closes #568
  • chat: responsive side-by-side card grid — invisible auto-fill columns (123ba00), closes #539
  • chat: room query cards all the room's actuators under one header (18fa71e), closes #540
  • chat: rooms first-class — list rooms, resolve device→room, friendly names (04f67a0), closes #535
  • chat: rooms first-class — list rooms, resolve device→room, never leak entity_ids (08ab8a5)
  • chat: suggest quick-reply answers for every question + pre-fill favorite (4797e6b)
  • chat: trigger OKF ingest adapters on engine boot (dafdc67)
  • chat: trigger OKF ingest adapters on engine boot (49964f4), closes #517
  • skill: SOUL — add second-brain section + tighten/dedupe (8c2100f)
  • skill: SOUL — add second-brain section + tighten/dedupe (#615 #617) (ff5c87e)
  • solaris: add user-guide.md for the ServiceBay portal (#533) (317981e)
  • template: add streaming microWakeWord Solaris model (#542) (56a3862)
  • template: derive JELLYFIN_CAST_URL from the box LAN IP (e880c2b)
  • template: derive JELLYFIN_CAST_URL from the box LAN IP (960a03d), closes #607

Bug Fixes

  • chat: boot ingest waits for source health / bounded retry — no 0-ingest boot (5f10fa6)
  • chat: card grid — 1 full-width column on narrow/phone, no control overflow (bab1618)
  • chat: card grid 1-col full-width on narrow, no control overflow (3694845), closes #553
  • chat: cast music via a LAN-reachable Jellyfin URL not localhost (9684407), closes #604
  • chat: close fail-open holes in the confirmation gate (48b1f45)
  • chat: compact_history keeps tool_calls args (device-control regression) (#637) (93af311)
  • chat: confirm-worthy actions ask via offer_choices and wait (2b1aadb)
  • chat: confirm-worthy actions ask via offer_choices and wait (520fe3e), closes #558
  • chat: continue_conversation on a pending question, not only a trailing '?' (55685f7), closes #627
  • chat: degrade Jellyfin lyrics fetch errors to None, not a broken turn (b0d79ea), closes #593
  • chat: drop 'bitte' from confirm-gate affirmatives — residual fail-open (7d09928)
  • chat: escape LIKE wildcards in music_query artist/prefix arg (f4a9af8)
  • chat: eval edge-case fixes — card room labels, area-cache, room-match, VALARM nesting (26ebcfc)
  • chat: eval edge-case fixes — card room labels, area-cache, room-match, VALARM nesting (f476819), closes #545 #546 #547 #548
  • chat: immich ingest bounded page-retry, cursor checkpoint, O(1) embed enqueue (2665b7b), closes #597
  • chat: immich ingest robustness — page-retry, cursor checkpoint, O(1) embed enqueue (9f846be)
  • chat: ingest-adapter robustness — per-item isolation, persisted sync cursors, VALARM parse (a91ce2c)
  • chat: ingest-adapter robustness — per-item isolation, sync cursors, VALARM parse (a387d10), closes #528 #529 #527
  • chat: Jellyfin ingest re-auth on 401 + empty-slug id fallback (8c622b0)
  • chat: Jellyfin ingest re-auth on 401 + empty-slug id fallback (2944a7d), closes #583
  • chat: Jellyfin libraries() uses user-scoped /Users/{id}/Views (0a1823a)
  • chat: Jellyfin libraries() uses user-scoped /Users/{id}/Views (997bf29), closes #581
  • chat: Jellyfin re-auth fires on a raised 401 mid-pagination (614592d)
  • chat: Jellyfin re-auth fires on a raised 401 mid-pagination (5cd9201), closes #583
  • chat: keep chat responsive during OKF ingest — WAL + off-loop ingest (#587) (80d772d)
  • chat: keep the mic open when a question is pending (continuous conversation) (91bfbd2)
  • chat: music_query ranked fuzzy artist resolve — exact wins first (ce43e0f), closes #590
  • chat: music_query ranked fuzzy artist resolve — exact wins, else fuzzy (f5f7adc)
  • chat: Obsidian ingest robustness — per-note isolation + graceful unknown-type skip (166229d)
  • chat: per-note isolation and graceful unknown-type skip in Obsidian ingest (2a50328), closes #520
  • chat: play_music casts direct/static Jellyfin stream to fix Cast-GROUP HA 500 (fdad83f)
  • chat: play_music casts direct/static Jellyfin URL first, /universal fallback (107bc17), closes #604
  • chat: play_music casts from a LAN-reachable Jellyfin URL (f0e6c6e)
  • chat: play_music v2 — random play, 'Song von X' parse fix, surface+retry HA errors (56161f6)
  • chat: play_music v2 — random play, 'Song von X' parse fix, surface+retry HA errors (c2b8f55), closes #604
  • chat: podcast search — keep the verbatim name + fuzzy best-match against fyyd (0f39a32), closes #563
  • chat: podcast search — keep verbatim name + fuzzy best-match against fyyd (29fd892)
  • chat: radio — sanitize favorite name/url before frontmatter write (17dc249)
  • chat: remove context-window fill ring from send button (1fcac6a)
  • chat: scope private-note ingest + contain note_write to caller subtree (b3f08e5)
  • chat: solaris.db WAL + busy_timeout on all connect paths (78b3582)
  • chat: solaris.db WAL + busy_timeout on all connect paths (181e0f2), closes #600
  • chat: strip [[ ]] cross-links to plain text on the voice/facade path (c714242)
  • chat: strip [[ ]] cross-links to plain text on the voice/facade path (2b1639e), closes #616
  • chat: wait for source health before boot ingest, no 0-ingest boot (6c35777), closes #531
  • template: solaris post-deploy converges JELLYFIN_PASSWORD self-heal (a4ab91c), closes #626
  • template: solaris post-deploy self-heals the Jellyfin service credential (6b5703d)
  • voice: self-heal whisper STT — health probe + kill-on-failure (#611) (dea2d7e)
  • voice: THOROUGH_MODEL → gemma4:e4b for VRAM headroom (#612) (a8411d5)

Performance Improvements

  • chat: compact past-turn tool calls in the model context (721ba4f)
  • chat: compact prior turns' tool args+results in the model context (7db7c69), closes #623
  • chat: dispatch a turn's tool calls concurrently (bounded 5), gate-first (8623b6f)
  • chat: dispatch a turn's tool calls concurrently, gate-first (4bb0a4f), closes #624