Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
51b7d8f
create a minimal PoC with iced
malzag Mar 16, 2026
c8ec145
extract paddler/src/cmd into a separate workspace member paddler_cli
malzag Mar 17, 2026
a78fb40
run the balancer from the desktop app
malzag Mar 17, 2026
d57c3b0
rename balancer to cluster, add stopping cluster
malzag Mar 17, 2026
b6ac3b6
add statum state machine
malzag Mar 17, 2026
bfa22b0
add model preset
malzag Mar 17, 2026
1728f41
detec and show IP address of the cluster manager
malzag Mar 18, 2026
3a839e8
add agent monitoring and count
malzag Mar 18, 2026
4dc25b2
add support for registering an agent
malzag Mar 18, 2026
e320abb
cleanup, fix jarmuz scripts after paddler cli extraction
malzag Mar 18, 2026
1721149
remove the intermediary starting... screens
malzag Mar 18, 2026
a3dc601
remove live IP check, remove add agent toggle, allow the clutser mana…
malzag Mar 18, 2026
cc1df36
start using fonts from the file in the repo / remove CDN, introduce s…
malzag Mar 18, 2026
bb8a339
replace balancer address and port inputs with combines + inference
malzag Mar 18, 2026
86408ca
style the join cluster view, allow to set agent name
malzag Mar 18, 2026
bb22711
style the running cluster view
malzag Mar 19, 2026
f4e5bb7
style the running agent view, add qwen 3 0.6B preset
malzag Mar 19, 2026
f6940ce
make agent box reusable, fix inline imports issues
malzag Mar 19, 2026
61a7ad8
styling updates, do not allow to start balancer and inference address…
malzag Mar 19, 2026
c2fd999
show erorrs on homescreen if balancer or agent fails
malzag Mar 19, 2026
0f9a5d2
snapshot → 'content' name update, move button disconnect color to var…
malzag Mar 19, 2026
6a0684e
separate backend and ui modules in the desktop app crate
malzag Mar 23, 2026
331c50b
extract shared service wiring from paddler_cli to paddler_bootstrap
malzag Mar 24, 2026
c014bb4
move bootstrap parameters to params structs
malzag Mar 24, 2026
eb0c3c6
rename bootstrap types and extract bootstrap into standalone functions
malzag Mar 24, 2026
7427713
replace manual thread spawning with tokio::task::spawn_blocking in de…
malzag Mar 24, 2026
2fba286
move files from backend/ to src/ and remove backend/ in the desktop app
malzag Mar 24, 2026
ff216b1
switch desktop app to use paddler_bootstrap for service wiring
malzag Mar 24, 2026
9d71982
replace GUI polling with direct Notify-based subscriptions
malzag Mar 24, 2026
05deef8
improve form validation UX (show erorrs after form submit attempt)
malzag Mar 25, 2026
ea04c0d
show nothing in the UI when agent name is empty instead of showing af…
malzag Mar 25, 2026
170ac6b
merge origin/main and align all workspace members with strict clippy …
malzag Mar 25, 2026
dd4d760
use Duration::from_secs instead of from_millis
malzag Mar 25, 2026
13c6628
Merge remote-tracking branch 'origin/main' into desktop-app-iced
malzag Mar 26, 2026
ece5922
apply rustfmt changes
malzag Mar 26, 2026
b6dfca3
Merge branch 'main' into desktop-app-iced
malzag Mar 26, 2026
9f8aeea
add cuda feature to paddler_cli
malzag Mar 26, 2026
1094ce9
switch port validation from TcpStream to TcpListener
malzag Mar 26, 2026
a80bb44
restructure the code to follow Iced scaling patterns; start the balan…
malzag Mar 27, 2026
ca0e6be
extract a shared form field component
malzag Mar 27, 2026
5347ff8
Merge branch 'main' into desktop-app-iced
malzag Mar 31, 2026
2cc6dee
Merge branch 'main' into desktop-app-iced
malzag Mar 31, 2026
c98f1c3
Merge branch 'main' into desktop-app-iced
malzag Apr 15, 2026
dc4fb25
update makefile an integration test to point to paddler_cli as the bi…
malzag Apr 15, 2026
351c4d5
add code styling fixes
malzag Apr 15, 2026
1c6d785
force the light theme
malzag Apr 15, 2026
0c69392
Allow for tab key navigation where possible
malzag Apr 15, 2026
a014c97
Merge remote-tracking branch 'origin/main' into desktop-app-iced
mcharytoniuk Apr 16, 2026
f2ba99c
add headless unit tests for desktop gui state machine
mcharytoniuk Apr 16, 2026
aebfd22
add headless wayland launch test for desktop gui
mcharytoniuk Apr 16, 2026
1f0356c
Revert "add headless unit tests for desktop gui state machine"
mcharytoniuk Apr 16, 2026
141efaf
Revert "add headless wayland launch test for desktop gui"
mcharytoniuk Apr 16, 2026
bcf37a6
Merge remote-tracking branch 'origin/main' into desktop-app-iced
mcharytoniuk Apr 16, 2026
cea6adc
rename second brain gui to paddler gui; update makefile to account fo…
malzag Apr 17, 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
3,518 changes: 3,305 additions & 213 deletions Cargo.lock

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[workspace]
members = ["paddler_integration_tests", "paddler", "paddler_client", "paddler_model_tests", "paddler_types"]
members = ["paddler", "paddler_bootstrap", "paddler_cli", "paddler_client", "paddler_gui", "paddler_integration_tests", "paddler_model_tests", "paddler_types"]
resolver = "2"

[workspace.package]
Expand Down Expand Up @@ -53,13 +53,17 @@ serial_test = { version = "3", features = ["file_locks"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
shellexpand = "3"
iced = { version = "0.14", features = ["image", "svg", "tokio"] }
if-addrs = "0.13"
statum = "0.6"
tempfile = "3.20.0"
tokio = { version = "1.48", features = ["full"] }
tokio-stream = { version = "0.1.17", features = ["sync"] }
tokio-tungstenite = "0.28"
thiserror = "2"
url = { version = "2.5", features = ["serde"] }
paddler = { version = "3.0.1", path = "paddler" }
paddler_bootstrap = { version = "3.0.1", path = "paddler_bootstrap" }
paddler_client = { version = "3.0.1", path = "paddler_client" }
paddler_types = { version = "3.0.1", path = "paddler_types" }

Expand Down
24 changes: 12 additions & 12 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ node_modules: package-lock.json
npm install --from-lockfile
touch node_modules

target/debug/paddler: $(shell find paddler/src paddler_types/src paddler_client/src -name '*.rs')
cargo build -p paddler
target/debug/paddler_cli: $(shell find paddler/src paddler_bootstrap/src paddler_cli/src paddler_client/src paddler_types/src -name '*.rs')
cargo build -p paddler_cli

# -----------------------------------------------------------------------------
# Phony targets
Expand All @@ -41,42 +41,42 @@ jarmuz-static: node_modules

.PHONY: build
build: jarmuz-static
cargo build -p paddler --features web_admin_panel
cargo build -p paddler_cli --features web_admin_panel

.PHONY: build.cuda
build.cuda: jarmuz-static
cargo build -p paddler --features cuda,web_admin_panel
cargo build -p paddler_cli --features cuda,web_admin_panel

.PHONY: release
release: jarmuz-static
cargo build --release -p paddler --features web_admin_panel
cargo build --release -p paddler_cli --features web_admin_panel

.PHONY: release.cuda
release.cuda: jarmuz-static
cargo build --release -p paddler --features web_admin_panel,cuda
cargo build --release -p paddler_cli --features web_admin_panel,cuda

.PHONY: release.vulkan
release.vulkan: jarmuz-static
cargo build --release -p paddler --features web_admin_panel,vulkan
cargo build --release -p paddler_cli --features web_admin_panel,vulkan

.PHONY: test
test: test.unit test.models test.integration

.PHONY: test.models
test.models:
timeout 300 cargo test -p paddler_model_tests --features tests_that_use_llms -- --nocapture --test-threads=1
cargo test -p paddler_model_tests --features tests_that_use_llms -- --nocapture --test-threads=1

.PHONY: test.cuda
test.cuda:
timeout 1800 cargo test -p paddler_model_tests --features tests_that_use_llms,cuda -- --nocapture --test-threads=1
cargo test -p paddler_model_tests --features tests_that_use_llms,cuda -- --nocapture --test-threads=1

.PHONY: test.unit
test.unit: jarmuz-static
timeout 300 cargo test --features web_admin_panel
cargo test --features web_admin_panel

.PHONY: test.integration
test.integration: target/debug/paddler
timeout 300 cargo test -p paddler_integration_tests --features tests_that_use_compiled_paddler,tests_that_use_llms -- --nocapture --test-threads=1
test.integration: target/debug/paddler_cli
cargo test -p paddler_integration_tests --features tests_that_use_compiled_paddler,tests_that_use_llms -- --nocapture --test-threads=1

.PHONY: watch
watch: node_modules
Expand Down
8 changes: 4 additions & 4 deletions jarmuz/worker-paddler.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ spawner(async function ({ buildId, command }) {

const results = await Promise.all([
command(`
target/debug/paddler balancer
target/debug/paddler_cli balancer
--compat-openai-addr 127.0.0.1:8063
--inference-addr 127.0.0.1:8061
--inference-item-timeout 30000
Expand All @@ -26,19 +26,19 @@ spawner(async function ({ buildId, command }) {
--web-admin-panel-addr 127.0.0.1:8062
`),
command(`
target/debug/paddler agent
target/debug/paddler_cli agent
--management-addr 127.0.0.1:8060
--name agent-1
--slots 4
`),
command(`
target/debug/paddler agent
target/debug/paddler_cli agent
--management-addr 127.0.0.1:8060
--name agent-2
--slots 4
`),
command(`
target/debug/paddler agent
target/debug/paddler_cli agent
--management-addr 127.0.0.1:8060
--name agent-3
--slots 2
Expand Down
13 changes: 13 additions & 0 deletions package-lock.json

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

1 change: 0 additions & 1 deletion paddler/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ minijinja-contrib = { workspace = true }
nanoid = { workspace = true }
paddler_types = { workspace = true }
thiserror = { workspace = true }
nix = { workspace = true }
rand = { workspace = true }
reqwest = { workspace = true }
resvg = { workspace = true }
Expand Down
103 changes: 0 additions & 103 deletions paddler/src/cmd/agent.rs

This file was deleted.

1 change: 0 additions & 1 deletion paddler/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ pub mod balancer_applicable_state;
pub mod balancer_applicable_state_holder;
pub mod balancer_desired_state;
pub mod chat_template_renderer;
pub mod cmd;
pub mod continuation_decision;
pub mod continuation_stop_parameters;
pub mod controls_session;
Expand Down
21 changes: 21 additions & 0 deletions paddler_bootstrap/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[package]
name = "paddler_bootstrap"
version.workspace = true
edition.workspace = true
authors.workspace = true
description = "Shared service wiring for Paddler CLI and desktop app"
license.workspace = true

[dependencies]
anyhow = { workspace = true }
nanoid = { workspace = true }
paddler = { workspace = true }
paddler_types = { workspace = true }
tokio = { workspace = true }

[lints]
workspace = true

[features]
default = []
web_admin_panel = ["paddler/web_admin_panel"]
5 changes: 5 additions & 0 deletions paddler_bootstrap/src/bootstrap_agent_params.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pub struct BootstrapAgentParams {
pub agent_name: Option<String>,
pub management_address: String,
pub slots: i32,
}
20 changes: 20 additions & 0 deletions paddler_bootstrap/src/bootstrap_balancer_params.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use std::time::Duration;

use paddler::balancer::compatibility::openai_service::configuration::Configuration as OpenAIServiceConfiguration;
use paddler::balancer::inference_service::configuration::Configuration as InferenceServiceConfiguration;
use paddler::balancer::management_service::configuration::Configuration as ManagementServiceConfiguration;
use paddler::balancer::state_database_type::StateDatabaseType;
#[cfg(feature = "web_admin_panel")]
use paddler::balancer::web_admin_panel_service::configuration::Configuration as WebAdminPanelServiceConfiguration;

pub struct BootstrapBalancerParams {
pub buffered_request_timeout: Duration,
pub inference_service_configuration: InferenceServiceConfiguration,
pub management_service_configuration: ManagementServiceConfiguration,
pub max_buffered_requests: i32,
pub openai_service_configuration: Option<OpenAIServiceConfiguration>,
pub state_database_type: StateDatabaseType,
pub statsd_prefix: String,
#[cfg(feature = "web_admin_panel")]
pub web_admin_panel_service_configuration: Option<WebAdminPanelServiceConfiguration>,
}
Loading
Loading