Organization accounts: choose who pays
- Organization members can choose whether a session uses the organization's balance or their own from the account panel. The title bar shows the selected payer and its balance; during a session, it stays with that session's payer. (#703)
- The account panel shows organization and personal balances, the amount available after running-session reservations, estimated remaining hours, and each side's spending over the last 30 days. (#703)
- Clear notices explain when an organization is out of money, paused, or no longer includes the member, with top-up guidance for organization owners. These notices are localized in all supported app languages. (#703)
- Accounts outside an organization keep the same session requests, balances, and notices as before. (#703)
Full Changelog: v0.49.0...v0.50.0
All commits since v0.49.0
- chore(release): v0.50.0
- Merge pull request #703 from kizuna-ai-lab/feat/org-payer
- docs(wallet): a docstring on every declaration in the usage helper
- docs(wallet): docstrings on the usage helper's public surface
- fix(account): keep the request refs current after commit, not during render
- fix(account): another identity's figures may not survive the switch
- fix(account): a superseded usage response may not paint or cache over a newer one
- fix(account): a stale-refresh, a per-render fetch and an invented zero
- fix(account): tell 'no usage' apart from 'not known yet'
- feat(account): choose the payer in the panel, and show both sides' usage
- Merge pull request #705 from kizuna-ai-lab/fix/soniox-reserve-rates
- fix(soniox): mirror the backend's new session budget rates and $1.00/h cap
- Merge pull request #704 from kizuna-ai-lab/chore/drop-form-factor-log
- chore(diagnostics): drop the output form-factor log line
- chore(diagnostics): drop the output form-factor log line
- refactor(account): compute what sessions hold in one helper
- fix(payer): keep a switch held in memory when another document clears or removes the key
- i18n(zh): say "reserved" (预留/預留) for what running sessions hold, as the web dashboard does
- style(account): style the held line under the organization's balance
- feat(account): show the organization's committed balance, not what is left after holds
- fix(payer): keep the switch working when the storage cannot hold it
- test: give the repository-wide import check a 30 s timeout
- fix(payer): hide the payer line for a running session started with no payer
- fix(payer): show the running session's payer, not the live switch
- fix(wallet): warn once on a malformed organization or personal wallet; share the payer field in voice library requests
- fix(session): keep every organization refusal as itself mid-session; move payerBalance out of the storage module
- fix(account): do not invent a $0 personal balance; tidy organization refusals
- fix(account): organization payer gate, notice params and payer display
- chore(i18n): keep the escaped invisible characters in screenContext
- feat(account): show organization and personal balances
- fix(session): organization refusals on voice preview and mid-session reissue
- feat(session): organization refusal notices
- fix(session): carry the payer to the voice preview and read it from the shape
- feat(session): choose who pays before Start
- fix(account): type personal expiringSoon as the backend sends it
- feat(account): read organization and personal balances
- Merge pull request #701 from kizuna-ai-lab/docs/readme-demo-video-v2
- docs(readme): use re-cut demo video (no clipped sentences)
- Add language options to README
- Update README.md
- Merge pull request #700 from kizuna-ai-lab/docs/readme-demo-video-url
- docs(readme): replace demo video with 0.49.0 recording
- Merge pull request #699 from kizuna-ai-lab/docs/readme-demo-video
- docs(readme): add looping demo GIF, remove old demo video
- Merge pull request #697 from kizuna-ai-lab/fix/linux-card-bus
- fix(output-form-factor): bound the cards read, refuse a stale card number
- fix(output-form-factor): read the bus from the card on PipeWire 0.3
- Merge pull request #695 from kizuna-ai-lab/feat/output-form-factor
- feat(audio): a USB output on macOS takes its form factor from its terminal type, as Bluetooth does (#691)
- test(audio): captured macOS Bluetooth device list as a fixture, its MAC-address uid scrubbed (#691)
- test(audio): captured macOS and Windows device lists as fixtures, ids scrubbed (#691)
- fix(audio): the unmatched-output line counts labels, and says so (#691)
- test(audio): the Chromium pin says what it protects, what it was checked against, and what to do on an upgrade (#691)
- test(audio): an Electron upgrade fails until the output label rules are checked against its Chromium (#691)
- feat(audio): the diagnostic log names an output no system device matches, once a session (#691)
- Merge pull request #696 from kizuna-ai-lab/release/v0.49.0
- test(audio): the AirPods rewrite keeps Chromium's order when the owner's name holds a rule word (#691)
- fix(audio): native labels take Chromium's AirPods rewrite, so AirPods match (#691)
- refactor(audio): one label rule for both helpers' rows (#691)
- fix(audio): a Windows output carries the label Chromium shows, USB and Bluetooth suffix included (#691)
- fix(audio): a blank browser label matches no output device (#691)
- fix(audio): plain PulseAudio null sinks read unknown over virtual (#691)
- fix(audio): a virtual Windows output reads unknown, whatever form factor it reports (#691)
- docs(audio): the form factor spec names no test machines or people (#691)
- docs(audio): the browser default's answer needs no label (#691)
- fix(audio): a stale answer reads unknown at the lookup at once, not when a re-list lands (#691)
- fix(audio): macOS raw no longer carries the device UID (#691)
- fix(audio): the sink watcher pushes on sinks coming and going, and once after a relaunch (#691)
- fix(audio): spawn the device readers hidden, with stdin and stderr ignored (#691)
- fix(audio): the form factor log writes through report.ts and never throws into the store (#691)
- feat(audio): log each outlet's form factor when diagnostics are on (#691)
- fix(audio): a malformed native answer reads unknown and never takes device listing down (#691)
- feat(audio): join each output's form factor into the device list, read on events only (#691)
- fix(audio): a timed-out Linux read starts nothing after its deadline; UTF-8 read whole (#691)
- feat(audio): read output devices in the main process and push their changes (#691)
- fix(audio): verify.ps1 reads the --devices array as rows under Windows PowerShell 5.1 (#691)
- feat(audio): the full macOS terminal type table for Bluetooth outputs (#691)
- feat(audio): the Windows helper lists render endpoints with their form factor (#691)
- feat(audio): the macOS helper reports the label the browser shows, and an empty list is not an error (#691)
- feat(audio): the macOS helper lists output devices with their transport and data source (#691)
- feat(audio): read the output form factor from pactl (#691)
- feat(audio): the output form factor's types and label matcher (#691)
- docs(audio): plan: the retry count is three retries after the first failure (#691)
- docs(audio): plan review: the browser default among same-named devices, a default sink change on Linux, unmeasured platforms (#691)
- docs(audio): the output form factor implementation plan (#691)
- docs(audio): the Bluetooth row reads the terminal type, as the text below it says (#691)
- docs(audio): the device read says whether it failed (#691)
- docs(audio): settle the form factor design's review points (#691)
- docs(audio): design the output device form factor (#691)