Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
5959221
chore(vendor): bump tinybus submodule
senamakel Oct 17, 2026
9a35a5f
chore(vendor): bump tinybus submodule
senamakel Oct 17, 2026
2bba805
feat(client): add typed tinyvoice-client crate
senamakel Oct 17, 2026
144b0e1
test(client): expand coverage of wire calls, session handles, and err…
senamakel Oct 17, 2026
84dd000
test(tinyvoice-client): update mocks for flattened capture handles
senamakel Oct 17, 2026
5e81b88
test(tinyvoice-client): cover incompatible contract errors and update…
senamakel Oct 17, 2026
08a8728
chore(tinyvoice-client): document draft TinyBus constraint and reform…
senamakel Oct 17, 2026
05504ef
test(tinyvoice-client): cover reserve_capture permission denial
senamakel Oct 17, 2026
bca7a4f
test(tinyvoice-client): access recorder id field directly in vad test
senamakel Oct 17, 2026
4ab3f2f
chore(vendor): bump tinybus submodule
senamakel Oct 17, 2026
94f45c3
chore(deps): bump tinybus to 0.2.2
senamakel Oct 17, 2026
4fe47f1
build(deps): add base64 dependency to tinyvoice-client
senamakel Oct 17, 2026
8534e15
feat(tinyvoice-client): add typed host calls for the TinyVoice module
senamakel Oct 17, 2026
db414c7
test(tinyvoice-client): align mock wire values with f32 encoding
senamakel Oct 17, 2026
aadd41a
test(tinyvoice-client): add context to session handle assertions
senamakel Oct 17, 2026
4268296
test(tinyvoice-client): update mock responses to match typed wire for…
senamakel Oct 17, 2026
a79da19
test(tinyvoice-client): assert capture stop and shutdown succeed
senamakel Oct 17, 2026
e542e5b
test(tinyvoice-client): use f32 literals in wire argument expectations
senamakel Oct 17, 2026
a72d573
chore(tinyvoice-client): drop unused tinybus macros dev-dependency
senamakel Oct 17, 2026
7d26d7d
refactor(tinyvoice-client): reorder re-exports and apply rustfmt
senamakel Oct 17, 2026
5e87669
docs(tinyvoice-client): wrap TinyVoice and TinyBus in doc backticks
senamakel Oct 17, 2026
8d7e379
test(tinyvoice-client): allow panicking assertions and long tests in …
senamakel Oct 17, 2026
aca3c4c
test(client): cover malformed route replies and proxy startup failures
senamakel Oct 17, 2026
3ea1bd8
docs(tinyvoice-client): simplify module client doc link
senamakel Oct 17, 2026
356a5a1
chore(deps): update tinybus to 0.2.2 and refresh lockfile
senamakel Oct 17, 2026
57590a1
chore(tinyvoice-client): tidy dependency features and doc comments
senamakel Oct 17, 2026
c8032b3
test(client): add ownership test module
senamakel Oct 18, 2026
069a097
test(tinyvoice-client): reformat ownership fixture tests
senamakel Oct 18, 2026
ff43cbb
test(tinyvoice-client): reorder expected method list in ownership test
senamakel Oct 18, 2026
8dedec1
chore(vendor): bump tinybus submodule
senamakel Oct 18, 2026
7d1e99d
feat(client): pin voice sessions to a bound module client
senamakel Oct 18, 2026
1427e09
feat(client): add peer-pinned owned capture and hotkey sessions
senamakel Oct 18, 2026
a7f46b6
test(tinyvoice-client): cover capture and hotkey ownership across ali…
senamakel Oct 18, 2026
40b3795
test(tinyvoice-client): add capture start gate to ownership tests
senamakel Oct 18, 2026
a737a56
test(tinyvoice-client): cover late capture publication after start ti…
senamakel Oct 18, 2026
cc8515f
docs(tinyvoice-client): document peer-pinned owned sessions
senamakel Oct 18, 2026
b3240c9
ci(release): add reviewed-epic release mode to module release workflow
senamakel Oct 18, 2026
3964f14
ci(release): pin reusable release workflow to full commit sha
senamakel Oct 18, 2026
65285b9
test(client): cover canceled owned capture start publishing late
senamakel Oct 18, 2026
5d8f429
test(client): assert timed-out and canceled starts leave no live stream
senamakel Oct 18, 2026
744c54b
chore(deps): bump tinybus from 0.2.2 to 0.3.2
senamakel Oct 18, 2026
00a5cad
chore(deps): bump tinybus to 0.3.2 and tinyvoice-module to 0.3.3
senamakel Oct 18, 2026
751775f
test(tinyvoice-client): split ownership assertions for clearer failures
senamakel Oct 18, 2026
2b48d5a
test(tinyvoice-client): handle nested results in ownership test
senamakel Oct 18, 2026
8e7f9ea
feat(tinyvoice-client): split owned capture start into reserve and start
senamakel Oct 18, 2026
51fe3c6
test(tinyvoice-client): cover capture start cancellation in ownership…
senamakel Oct 18, 2026
561784f
test(tinyvoice-client): reuse owned capture setup across ownership tests
senamakel Oct 18, 2026
df3efae
test(tinyvoice-client): cover explicit close after timed-out owned start
senamakel Oct 18, 2026
fe48b13
docs(tinyvoice-client): document owned reservation flow
senamakel Oct 18, 2026
184d735
test(tinyvoice-client): reformat ownership tests
senamakel Oct 18, 2026
7dda000
test(tinyvoice-client): rework capture start fixture to validate rese…
senamakel Oct 18, 2026
edd8a35
test(tinyvoice-client): reformat ownership fixture lock error handling
senamakel Oct 18, 2026
f6a5cdd
test(tinyvoice-client): cover capture stop in ownership fixture
senamakel Oct 18, 2026
a216b79
test(tinyvoice-client): drop capture stop handling from ownership tes…
senamakel Oct 18, 2026
70e1f0a
test(tinyvoice-client): model capture and hotkey fixture state as enums
senamakel Oct 18, 2026
b8931b0
chore: files changed crates/tinyvoice-client/src/lib_ownership_tests.rs
senamakel Oct 18, 2026
ec58f21
test(tinyvoice-client): reformat ownership test fixtures
senamakel Oct 18, 2026
f118a80
test(tinyvoice-client): scope hotkey active state to peer b
senamakel Oct 18, 2026
d070de1
refactor(tinyvoice-client): split ownership fixture dispatch into per…
senamakel Oct 18, 2026
efc9d98
test(tinyvoice-client): add hotkey status fixture helper and satisfy …
senamakel Oct 18, 2026
985ea68
test(tinyvoice-client): clone recorded call args in ownership fixture
senamakel Oct 18, 2026
01aa72b
test(tinyvoice-client): borrow method args in ownership fixture
senamakel Oct 18, 2026
62258a7
fix(tinyvoice-client): release unstarted capture reservations on close
senamakel Oct 18, 2026
63bedf3
docs(tinyvoice-client): update dependency status in readme
senamakel Oct 18, 2026
bf799a9
test(tinyvoice-client): merge duplicate capture reset branches in own…
senamakel Oct 18, 2026
16b438e
test(service): use from_secs in prepare test
senamakel Oct 18, 2026
ed9d31a
test(client): assert empty collections by value
senamakel Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 51 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,19 @@ on:
workflow_dispatch:
inputs:
tag:
description: Existing version tag (vX.Y.Z) committed through a reviewed PR
description: Existing version tag for the immutable module release
type: string
required: true
release_mode:
description: Use the ordinary main path or reviewed-epic release admission
type: choice
options: [main, reviewed-epic]
default: main
required: true
reviewed_pr:
description: Positive canonical PR number whose merge commit the tag names (reviewed-epic mode only)
type: number
required: false
push:
tags: ['v*']
permissions: {}
Expand All @@ -18,11 +28,15 @@ jobs:
outputs:
tag: ${{ steps.tag.outputs.tag }}
version: ${{ steps.tag.outputs.version }}
release_mode: ${{ steps.tag.outputs.release_mode }}
reviewed_pr: ${{ steps.tag.outputs.reviewed_pr }}
steps:
- id: tag
shell: bash
env:
TAG: ${{ github.event_name == 'push' && github.ref_name || inputs.tag }}
RELEASE_MODE: ${{ github.event_name == 'push' && 'main' || inputs.release_mode }}
REVIEWED_PR: ${{ inputs.reviewed_pr }}
run: |
set -euo pipefail
[[ "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+([+-][0-9A-Za-z.-]+)?$ ]] || {
Expand All @@ -31,14 +45,49 @@ jobs:
}
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
echo "version=${TAG#v}" >> "$GITHUB_OUTPUT"
[[ "$RELEASE_MODE" == main || "$RELEASE_MODE" == reviewed-epic ]] || {
echo "release_mode must be main or reviewed-epic" >&2
exit 2
}
if [[ "$RELEASE_MODE" == reviewed-epic ]]; then
[[ "$REVIEWED_PR" =~ ^[1-9][0-9]*$ ]] || {
echo "reviewed_pr must be a positive integer in reviewed-epic mode" >&2
exit 2
}
else
[[ -z "$REVIEWED_PR" || "$REVIEWED_PR" == 0 ]] || {
echo "reviewed_pr is only valid in reviewed-epic mode" >&2
exit 2
}
REVIEWED_PR=""
fi
{
echo "release_mode=$RELEASE_MODE"
# The reusable workflow input is numeric; zero is the ordinary-path sentinel.
echo "reviewed_pr=${REVIEWED_PR:-0}"
} >> "$GITHUB_OUTPUT"
module-release:
needs: resolve
if: needs.resolve.outputs.release_mode == 'main'
permissions:
contents: write
uses: tinyhumansai/.github/.github/workflows/module-release.yml@4adc1080fb495098e7af1aade82ed7e6e3c69bb7
uses: tinyhumansai/.github/.github/workflows/module-release.yml@1e28317c435a9c714002199e65d18a1067fa5777
with:
tag: ${{ needs.resolve.outputs.tag }}
version: ${{ needs.resolve.outputs.version }}
module-crate: tinyvoice-module
apt-packages: libasound2-dev libx11-dev libxtst-dev libxi-dev
module-manifest: crates/tinyvoice-module/Cargo.toml
module-reviewed-epic-release:
needs: resolve
if: needs.resolve.outputs.release_mode == 'reviewed-epic'
permissions:
contents: write
pull-requests: read
checks: read
actions: read
uses: tinyhumansai/.github/.github/workflows/module-reviewed-epic-release.yml@1e28317c435a9c714002199e65d18a1067fa5777
with:
tag: ${{ needs.resolve.outputs.tag }}
version: ${{ needs.resolve.outputs.version }}
reviewed-pr: ${{ fromJSON(needs.resolve.outputs.reviewed_pr || '0') }}
146 changes: 146 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ resolver = "3"
# Every package lives under `crates/`. The loadable module is a nested
# workspace because the vendored TinyBus manifests inherit their own workspace
# metadata; build it through its own manifest.
members = ["crates/tinyvoice", "crates/tinyvoice-bus"]
default-members = ["crates/tinyvoice", "crates/tinyvoice-bus"]
members = ["crates/tinyvoice", "crates/tinyvoice-bus", "crates/tinyvoice-client"]
default-members = ["crates/tinyvoice", "crates/tinyvoice-bus", "crates/tinyvoice-client"]
exclude = ["crates/tinyvoice-module", "vendor", "worktrees"]

# Lints apply to the whole crate and to every target. CI runs clippy with
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Ships two things from one repository:
| --- | --- | --- |
| `tinyvoice` (`crates/`) | `rlib` | A host that links the logic in-process |
| `tinyvoice-bus` (`crates/`) | `rlib` | A host that only needs TinyBus names and value types |
| `tinyvoice-client` (`crates/`) | `rlib` | A typed TinyBus client for the loadable TinyVoice module |
| `tinyvoice-module` (`crates/`) | `cdylib` | A host that loads it over the TinyBus module ABI |

## What belongs here, and what does not
Expand Down
29 changes: 29 additions & 0 deletions crates/tinyvoice-client/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
[package]
name = "tinyvoice-client"
version = "0.1.0"
edition = "2024"
rust-version = "1.88"
license = "GPL-3.0-only"
description = "Typed TinyBus host client for the TinyVoice module."
repository = "https://github.com/tinyhumansai/tinyvoice"

[dependencies]
# The contract carries audio samples as base64 text.
base64 = "0.22"
# TinyBus serializes contract values and deserializes their replies.
serde = "1"
# The module's transforms and stateful replies are inner JSON strings.
serde_json = "1"
# Shared TinyVoice member names, request types, and typed replies.
tinyvoice-bus = { version = "0.1.4", path = "../tinyvoice-bus" }
# TinyBus 0.3.2 adds ordinary peer-pinned clients for stateful voice leases.
tinybus = { version = ">=0.3.2, <0.4", path = "../../vendor/tinybus/crates/tinybus", default-features = false }

[dev-dependencies]
# Implements the async in-memory service used by the broker tests.
async-trait = "0.1"
# Provides the async test executor and `#[tokio::test]` macro.
tokio = { version = "1", features = ["macros", "rt-multi-thread", "time", "test-util"] }

[lints]
workspace = true
Loading
Loading