Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
f3d761a
Remove the env-only config path, type the not-found error
vinniefalco Aug 24, 2026
93cd486
Generate a default workbench.toml on first run
vinniefalco Aug 24, 2026
59ab9b5
Default empty gateway config instead of failing
vinniefalco Aug 24, 2026
d792e9f
Document first-run config generation
vinniefalco Aug 24, 2026
5d3638a
Add reusable blob cache with staged, verified downloads
vinniefalco Aug 24, 2026
15f6720
List cached blobs at GET /v1/cache from sidecar metadata
vinniefalco Aug 24, 2026
54e139e
Stream cache downloads over SSE at POST /v1/cache
vinniefalco Aug 24, 2026
1cd75e2
Remove cache entries at DELETE /v1/cache/{sha256}
vinniefalco Aug 24, 2026
3cb9b2c
Build the workbench UI with esbuild and serve it via rust-embed
vinniefalco Aug 24, 2026
809435a
Vendor murm-ui 0.2.0 and drive the chat with a fetch provider
vinniefalco Aug 24, 2026
f94be71
Dock the chat in a single dockview panel with a status bar placeholder
vinniefalco Aug 24, 2026
89e1949
Stream chat over a GET /ws WebSocket route
vinniefalco Aug 24, 2026
db0dcf7
Drive the chat UI over /ws WebSocket frames
vinniefalco Aug 24, 2026
9b3c170
Reject streaming on POST /chat now that /ws carries it
vinniefalco Aug 24, 2026
5846e40
Broadcast observer status over a persistent id-multiplexed /ws
vinniefalco Aug 24, 2026
35d4229
Instrument subsystems with observer status and persist the UI socket
vinniefalco Aug 24, 2026
4e69b82
Add the status bar skeleton below the dock
vinniefalco Aug 24, 2026
fe5bc0b
Render observer status frames in the status bar
vinniefalco Aug 24, 2026
0b28f97
Show download progress in the status bar slot
vinniefalco Aug 24, 2026
9a9517f
Pulse an activity LED in the status bar slot
vinniefalco Aug 24, 2026
ada5ba7
Skin the whole UI from one custom-property block in style.css
vinniefalco Aug 24, 2026
0e7d255
Replace the native scrollbar with a thin translucent one
vinniefalco Aug 24, 2026
96b34e7
Document the skinning variables and override paths
vinniefalco Aug 24, 2026
2243c56
Add a gateway health heartbeat with transition status updates
vinniefalco Aug 24, 2026
5a24efd
Push the model catalog to sessions on gateway reconnect
vinniefalco Aug 24, 2026
ce3bffd
Short-circuit gateway-dependent routes while the gateway is unreachable
vinniefalco Aug 24, 2026
5a11a71
Provision voice models through the gateway cache on connect
vinniefalco Aug 24, 2026
8cf5515
Pipe voice model download progress to the status bar
vinniefalco Aug 24, 2026
b81927d
Load the voice engine from cached paths and degrade missing models
vinniefalco Aug 24, 2026
65802fe
Redesign the status bar and voice UX
vinniefalco Aug 24, 2026
9ffd792
Fix status bar sizing, interim transcript, REC badge, and LED behavior
vinniefalco Aug 24, 2026
272aa2c
Grow the composer as voice text arrives
vinniefalco Aug 24, 2026
b83d54a
Report final-pass segments on a per-take channel
vinniefalco Aug 24, 2026
1b68248
Suppress the CRT defaultlib warning from the CUDA whisper build
vinniefalco Aug 24, 2026
d364faf
Send an append-only committed prefix in voice interim frames
vinniefalco Aug 24, 2026
663278a
Finish the voice take tail-only and join committed plus tail at stop
vinniefalco Aug 24, 2026
2c2e6ef
Show committed plus tentative voice interims in the composer
vinniefalco Aug 24, 2026
4721d21
Bias voice transcription toward a configured vocabulary glossary
vinniefalco Aug 25, 2026
f2bd202
Handle voice recording as cursor-position typing with send-discard
vinniefalco Aug 25, 2026
424e822
Tune voice parameters for stable transcription
vinniefalco Aug 25, 2026
5067292
Latch the interim display while the final worker catches up
vinniefalco Aug 25, 2026
ec3e9d5
fix example prompts
jasonbrazeal Aug 24, 2026
46482fd
Split CI into portable and workbench jobs, gate CUDA behind a feature
vinniefalco Aug 25, 2026
6365b82
Clear two strict-Clippy maintenance failures
vinniefalco Aug 25, 2026
167ac66
Set connect and request timeouts on the gateway client
vinniefalco Aug 25, 2026
54c2b08
Mark whisper-dependent tests as ignored for CI without fixtures
vinniefalco Aug 25, 2026
02e3486
Widen the reconnect-catalog test deadline and ignore it on CI
vinniefalco Aug 25, 2026
ac62d6e
Add --workspace to the CI doc build so excludes take effect
vinniefalco Aug 25, 2026
3b5b15a
Remove a broken intra-doc link to a nonexistent restrict_to_owner
vinniefalco Aug 25, 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
5 changes: 5 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# whisper-rs-sys builds whisper.cpp with CUDA and the static CRT (/MT);
# Rust links with the dynamic CRT (/MD). The linker resolves this fine
# but warns about the conflicting default lib. Suppress it.
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "link-args=/NODEFAULTLIB:LIBCMT"]
45 changes: 32 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,35 +26,59 @@ jobs:
run: cargo fmt --all --check

- name: Clippy
run: cargo clippy --workspace --all-targets --all-features -- -D warnings
run: cargo clippy --workspace --exclude promptforge-wb --exclude promptforge-wb-server --all-targets --all-features -- -D warnings

- name: Test
run: cargo test --locked --workspace --all-features
run: cargo test --locked --workspace --exclude promptforge-wb --exclude promptforge-wb-server --all-features

- name: Doctests
run: cargo test --workspace --doc
run: cargo test --workspace --exclude promptforge-wb --exclude promptforge-wb-server --doc

- name: Docs
env:
RUSTDOCFLAGS: -D warnings
run: cargo doc --no-deps --all-features
run: cargo doc --workspace --no-deps --all-features --exclude promptforge-wb --exclude promptforge-wb-server

check-workbench:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
with:
components: clippy

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- uses: actions/setup-node@v4
with:
node-version: 22

- name: Install UI dependencies
working-directory: crates/promptforge-wb-server/ui
run: npm ci

- name: Clippy (workbench)
run: cargo clippy -p promptforge-wb -p promptforge-wb-server --all-targets -- -D warnings

- name: Test (workbench)
run: cargo test --locked -p promptforge-wb -p promptforge-wb-server

msrv:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

# Verify the declared MSRV (workspace.package.rust-version) instead of
# trusting it: build and test on exactly that toolchain.
- uses: dtolnay/rust-toolchain@1.89.0

- name: Cache cargo
uses: Swatinem/rust-cache@v2

- name: Build and test on MSRV
run: |
cargo build --locked --workspace --all-features
cargo test --locked --workspace --all-features
cargo build --locked --workspace --exclude promptforge-wb --exclude promptforge-wb-server --all-features
cargo test --locked --workspace --exclude promptforge-wb --exclude promptforge-wb-server --all-features

supply-chain:
runs-on: ubuntu-latest
Expand All @@ -66,13 +90,8 @@ jobs:
- name: Install cargo-deny and cargo-audit
run: cargo install cargo-deny cargo-audit --locked

# Advisories, licenses, duplicate versions, and source policy (deny.toml).
- name: cargo deny
run: cargo deny check

# RUSTSEC vulnerability scan of the committed lockfile.
- name: cargo audit
run: cargo audit

# Unused-dependency hygiene: run `cargo machete` locally
# (`cargo install cargo-machete`) before adding or removing dependencies.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,8 @@
*.env
# Voice test fixtures, downloaded out of band (see design-promptforge-wb-1.md).
/crates/promptforge-wb-server/tests/fixtures/
# UI build pipeline: npm install target and esbuild output (rebuilt by build.rs).
/crates/promptforge-wb-server/ui/node_modules/
/crates/promptforge-wb-server/ui/dist/
# Workbench tape, written to the cwd when the server runs from the repo root.
/tape.jsonl
37 changes: 37 additions & 0 deletions Cargo.lock

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

7 changes: 6 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ rmcp = { version = "3.1.0", features = [
] }
tower = { version = "0.5", features = ["util"] }
arc-swap = "1"
# Serves the workbench UI: reads ui/dist from disk in debug builds, embeds it
# into the binary in release builds.
rust-embed = "8"
glob = "0.3"
humantime = "2"
humantime-serde = "1"
Expand All @@ -78,10 +81,12 @@ tar = { version = "0.4.46", default-features = false }
zip = { version = "8.6.0", default-features = false, features = ["deflate-flate2"] }
indicatif = "0.18"
# Safe bindings to whisper.cpp; the C++ core is built from source by
# whisper-rs-sys (cmake + MSVC required).
# whisper-rs-sys (cmake + MSVC required). Enable the wb-server's "cuda"
# feature to build with GPU acceleration (needs the CUDA Toolkit).
whisper-rs = "0.16"
# WAV parsing for the voice test fixtures; dev-dependency of the wb-server.
hound = "3.5"
socket2 = { version = "0.6", features = ["all"] }
# wry 0.56 pairs with tao 0.36 (wry's own dev-dependency constraint); tao 0.37
# is newer but untested against this wry.
wry = "0.56"
Expand Down
3 changes: 1 addition & 2 deletions crates/promptforge-dev/src/dump/fs_safe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,7 @@ fn create_dir_restricted(dir: &Path) -> io::Result<()> {
}

/// Creates (truncating) a file owner-only. On Unix the mode is set at creation;
/// on Windows the ACL is applied separately once the file is closed
/// ([`restrict_to_owner`]).
/// on Windows the ACL is applied separately once the file is closed.
fn create_restricted(path: &Path) -> io::Result<fs::File> {
let mut options = fs::OpenOptions::new();
options.write(true).create(true).truncate(true);
Expand Down
Loading
Loading