Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
8d339a6
Fix each cluster to one inference mode and serve kev decisions native…
mcharytoniuk Oct 7, 2026
88a1182
Remove Windows support
mcharytoniuk Oct 7, 2026
2a6eb0c
Run tests one at a time on GPU builds so suites never compete for the…
mcharytoniuk Oct 7, 2026
fde4629
Merge main with typed WebSocket close causes into inference modes
mcharytoniuk Oct 7, 2026
b5a4fc8
Use the published llama-cpp-bindings 0.17
mcharytoniuk Oct 8, 2026
3ab5bda
Keep the inference mode in the balancer desired state and switch it a…
mcharytoniuk Oct 8, 2026
9670032
Restore the readmes, docs, and rules from main
mcharytoniuk Oct 8, 2026
fbb5340
Dispatch by inference mode, drop the desktop GUI and Windows, and tes…
mcharytoniuk Oct 8, 2026
3091a05
Drive the agent management connection through typed steps and report …
mcharytoniuk Oct 9, 2026
d8ca3ce
Stop pipeline startup between stages on shutdown and answer a pending…
mcharytoniuk Oct 9, 2026
9fca595
Test only against spawned Paddler instances by replacing fake agents …
mcharytoniuk Oct 9, 2026
f937493
Convert Qwen3.5 and Qwen3.8 kev checkpoints through one path and test…
mcharytoniuk Oct 9, 2026
ee015d9
Acknowledge stopped decisions so the balancer releases their slots an…
mcharytoniuk Oct 9, 2026
7d4e19b
Hold the cluster inference mode as watched state and parse and format…
mcharytoniuk Oct 9, 2026
a32a85a
Carry models as URIs resolved only by agent reconciliation and drop t…
mcharytoniuk Oct 9, 2026
9870dc2
Keep agents serving their old model until the new one is ready, give …
mcharytoniuk Oct 12, 2026
bb3a964
Give each agent an explicit download cache so tests stay out of the u…
mcharytoniuk Oct 12, 2026
2c9856a
Cover connection-loss paths in the balancer, assert exact results ins…
mcharytoniuk Oct 12, 2026
657e08d
Learn once per pipeline whether the chat template renders its own BOS…
mcharytoniuk Oct 12, 2026
a0d3cb5
Consume tools instead of copying them, move decide params out of Syst…
mcharytoniuk Oct 12, 2026
3399123
Keep the old text.format acceptance rules while forwarding raw schema…
mcharytoniuk Oct 12, 2026
c0dcf31
Embed each distinct document content once per batch and let TypeSafe …
mcharytoniuk Oct 12, 2026
40cad0f
Evaluate multimodal chunks through the fitted chunks of llama-cpp-bin…
mcharytoniuk Oct 13, 2026
a6833cc
Test that a multimodal chunk failing to evaluate ends its generation,…
mcharytoniuk Oct 13, 2026
efa028c
Ingest multimodal chunks through llama-cpp-bindings 0.19 so each chun…
mcharytoniuk Oct 13, 2026
5d1e852
Test that tool calls cannot be parsed for a model without a chat temp…
mcharytoniuk Oct 13, 2026
825a172
Inject sampler chain and tools serialization failures through prepare…
mcharytoniuk Oct 13, 2026
ef05f4c
Assert exact outcomes instead of loose pattern matches, share the unr…
mcharytoniuk Oct 14, 2026
a4d0b0a
Move impossible fallible steps out of test helpers into the tests tha…
mcharytoniuk Oct 14, 2026
8547157
Test that clusters report agent binaries that cannot be spawned and b…
mcharytoniuk Oct 14, 2026
59f36c5
Surface relay connection failures instead of dropping them, stall rel…
mcharytoniuk Oct 14, 2026
3bddbca
Trickle the endless response head through the same tick loop as its c…
mcharytoniuk Oct 14, 2026
46ac9c1
Read machine parallelism through a runtime seam and test that every p…
mcharytoniuk Oct 14, 2026
bd3968e
Wait for idle slots through a notification so the wait cannot fail
mcharytoniuk Oct 14, 2026
06c2674
Test that an unserializable response never reaches the websocket writ…
mcharytoniuk Oct 15, 2026
dd78f72
Reject embedding parameters whose pooling produces no embeddings
mcharytoniuk Oct 15, 2026
7a5d1af
Test that the stallable relay relays a connection until both sides cl…
mcharytoniuk Oct 15, 2026
7c51211
Generate decision token positions from an i32 range instead of castin…
mcharytoniuk Oct 15, 2026
f4ea777
Refuse pointer heads whose head dimension exceeds sixteen bits instea…
mcharytoniuk Oct 15, 2026
05ac393
Carry validated TypeSafe criteria counts as NonZeroU8 so confidences …
mcharytoniuk Oct 15, 2026
46dfd7a
Wrap spawned subprocesses with their signals in one place and refuse …
mcharytoniuk Oct 15, 2026
da01dfa
Spawn and signal pausable agents in one step that only fails when the…
mcharytoniuk Oct 15, 2026
bf7cdcf
Test that the stallable relay reports a connection it cannot accept o…
mcharytoniuk Oct 15, 2026
d1492e9
Surface the local HTTP fixture's serving errors and end trickles when…
mcharytoniuk Oct 15, 2026
761b873
Move to llama-cpp-bindings 0.20, report documents longer than a seque…
mcharytoniuk Oct 15, 2026
7024aca
Obtain the media marker through a seam and fold the last subprocess e…
mcharytoniuk Oct 15, 2026
cd891e8
Cover the balancer's unobservable exit and unsignallable child with r…
mcharytoniuk Oct 15, 2026
7a9b807
Assert exact values instead of patterns, cover the embedding stop det…
mcharytoniuk Oct 15, 2026
4a555a8
Serve completions, embeddings and decisions from one loaded model wit…
mcharytoniuk Oct 19, 2026
0f0cf4d
Keep slots reserved for waiting requests in arrival order, reuse the …
mcharytoniuk Oct 19, 2026
afccbf3
Share one scheduler inbox and one startup path, restore the vocabular…
mcharytoniuk Oct 19, 2026
33e64a6
Keep one model in VRAM per agent, publish only the active reconciliat…
mcharytoniuk Oct 19, 2026
9b25d2b
Share one infallible outbox for agent and arbiter messages, cover the…
mcharytoniuk Oct 20, 2026
d7d3cc0
Split agent results into partial and final types, relay them to a typ…
mcharytoniuk Oct 20, 2026
034f255
Keep client streams open until the agent confirms the stop, and cover…
mcharytoniuk Oct 20, 2026
d037919
Remove ruff from the Python projects
mcharytoniuk Oct 20, 2026
fcb2389
Assert exact outcomes in tests and drop error paths no test helper ca…
mcharytoniuk Oct 20, 2026
504842a
Prove a cancelled restart keeps its model through VRAM residency
mcharytoniuk Oct 20, 2026
169fedf
Route agent responses per connection, end SSE streams at failed tool …
mcharytoniuk Oct 20, 2026
4bd611f
Send each agent only its newest desired state, decode the multimodal …
mcharytoniuk Oct 20, 2026
ab74d00
Crash fast in test helpers instead of forwarding errors no test can r…
mcharytoniuk Oct 20, 2026
41bbb90
Clear pipeline issues left by superseded startup work before starting…
mcharytoniuk Oct 20, 2026
baf8d35
Build the first message content preparer in a test struct that derive…
mcharytoniuk Oct 20, 2026
90f8036
Report receive failures and close frames to untrusted agents waiting …
mcharytoniuk Oct 20, 2026
6caec65
Assert untrusted agent socket errors through their typed variants and…
mcharytoniuk Oct 20, 2026
cf39190
Move the reconciliation result into its own test module so each modul…
mcharytoniuk Oct 20, 2026
10c36b0
Read the balancer's version announcement before killing it so the van…
mcharytoniuk Oct 20, 2026
6112f09
Share the single blocking thread runtime and its occupant through a f…
mcharytoniuk Oct 20, 2026
6a4404b
Release the blocking thread occupant when it is dropped so a failing …
mcharytoniuk Oct 20, 2026
79c4a71
Run both superseding arbiter tests through one scenario and derive th…
mcharytoniuk Oct 20, 2026
2da8a8f
Spawn model metadata requests through the cluster harness instead of …
mcharytoniuk Oct 20, 2026
d4a951f
Report a cluster without agents as a typed error and test the harness…
mcharytoniuk Oct 20, 2026
4f8e2e3
Test the subprocess cluster paths that report a cancelled connection,…
mcharytoniuk Oct 20, 2026
e542d49
Type the first agent waits, drop the forwarding metadata helper, shar…
mcharytoniuk Oct 21, 2026
d8ee761
Let callers await an inference socket disconnect instead of polling, …
mcharytoniuk Oct 21, 2026
501b5bb
Queue inference socket frames with their requests so the writer canno…
mcharytoniuk Oct 21, 2026
e7d4ea3
Exercise every test utility failure path with real triggers, typed si…
mcharytoniuk Oct 21, 2026
f8e00e2
Run the OpenCode end-to-end test on OpenCode 2 in an isolated home, f…
mcharytoniuk Oct 21, 2026
7e0f416
Accept assistant tool call turns without content in chat completions,…
mcharytoniuk Oct 21, 2026
10236f7
Assert the exact missing OpenCode binary path in its resolution test
mcharytoniuk Oct 21, 2026
8f9cc37
Send the stop frame of an inference request that fails on an undecoda…
mcharytoniuk Oct 21, 2026
ad3fe52
Abandon the agent's management socket writes once its connection ends…
mcharytoniuk Oct 21, 2026
58f8d63
Clear a missing model or pointer head issue once a retry finds the file
mcharytoniuk Oct 21, 2026
e28bee1
Report an embedding document that tokenizes to nothing instead of fai…
mcharytoniuk Oct 21, 2026
5c2a712
Replace the state file through an exclusively created replacement tha…
mcharytoniuk Oct 21, 2026
81f7187
Shut down and restart a served model's capabilities at once instead o…
mcharytoniuk Oct 21, 2026
555de93
Remove the state application status that nothing sets and the retry g…
mcharytoniuk Oct 21, 2026
7ee3880
Identify balancer instances by a nanoid and ignore cluster inference …
mcharytoniuk Oct 21, 2026
29ee5eb
Give every Responses output item a unique id instead of one derived f…
mcharytoniuk Oct 21, 2026
df675a2
Carry structured tool calls and tool call ids through conversation hi…
mcharytoniuk Oct 21, 2026
086c615
Describe canonical absolute agent model paths in the admin panel, and…
mcharytoniuk Oct 21, 2026
d3426b7
Update rustls, rustls-webpki, webpki roots and quick-xml past their s…
mcharytoniuk Oct 21, 2026
a95536e
Cover a chat completion message that cannot be translated, and propag…
mcharytoniuk Oct 21, 2026
02cb646
Build actix-web without the HTTP/2 support Paddler never serves
mcharytoniuk Oct 21, 2026
87235db
Render the dashboard asset tags once at startup with esbuild-metafile…
mcharytoniuk Oct 22, 2026
8188c4a
Update llama-cpp-bindings to 0.21, whose classifier ends a finished p…
mcharytoniuk Oct 22, 2026
f9d59b5
Update esbuild-metafile to 0.11 and read the dashboard preloads from …
mcharytoniuk Oct 22, 2026
8f38fe0
Assert exact outcomes, pin the fields bare pattern matches skipped, a…
mcharytoniuk Oct 22, 2026
dd4b182
Cover refusing a decision still pending admission when the agent shut…
mcharytoniuk Oct 22, 2026
3ea33c4
Cover a text generation pipeline refusing to start while its context …
mcharytoniuk Oct 22, 2026
3f7d6bc
Compare the refused connection budget and the late subscriber's repor…
mcharytoniuk Oct 22, 2026
721296c
Assert exact outcomes in place of bare pattern matches, and collect s…
mcharytoniuk Oct 22, 2026
47389c6
Serialize relayed messages through one helper so transforming them ca…
mcharytoniuk Oct 22, 2026
80c1678
Drop the batch-capacity break and the decode-abort arm, which no runn…
mcharytoniuk Oct 22, 2026
1209e51
Cover the HTTP listener reporting a socket it cannot open
mcharytoniuk Oct 22, 2026
a2ad56b
Refuse a sampling penalty window longer than the sequence context
mcharytoniuk Oct 22, 2026
75de943
Cover sampling that selects nothing, an unrenderable token, a client …
mcharytoniuk Oct 22, 2026
61aa59d
Format the penalty window check
mcharytoniuk Oct 22, 2026
030b54d
Restore the descriptor limit after the listener refusal so the test p…
mcharytoniuk Oct 22, 2026
2b11063
Cover two image generations whose next tokens overflow a one-token batch
mcharytoniuk Oct 22, 2026
0c7f51a
Update llama-cpp-bindings to 0.22, which refuses a sampler applicatio…
mcharytoniuk Oct 23, 2026
77e1e44
Report a grammar that excludes every candidate as rejected model outp…
mcharytoniuk Oct 23, 2026
8706572
Drop the test doubles that replaced the sampler chain factory, tools …
mcharytoniuk Oct 23, 2026
3dba36b
Drop the sampler chain, tools serializer, and media marker traits, wh…
mcharytoniuk Oct 23, 2026
d791105
Cover a tool call the chat parser cannot match being reported as an u…
mcharytoniuk Oct 23, 2026
4cddd57
Report a tool-call section holding text that parses to no tool calls …
mcharytoniuk Oct 23, 2026
6981871
Cover a grammar refusing the token that triggers it, and include Open…
mcharytoniuk Oct 23, 2026
ff66e16
Render the dashboard asset tags from the esbuild metafile at build time
mcharytoniuk Oct 24, 2026
10231d9
Resolve desired models through one shared downloader, honor HF_ENDPOI…
mcharytoniuk Oct 24, 2026
3d8dc1a
Serialize the state database schema straight into the replacement file
mcharytoniuk Oct 24, 2026
0e0eed8
Pass one media marker to llama.cpp and build the tools JSON once per …
mcharytoniuk Oct 24, 2026
1a6420e
Reach full Rust coverage with real fault triggers, measurable service…
mcharytoniuk Oct 24, 2026
89e21c7
Dispatch the state database through an enum instead of an async trait…
mcharytoniuk Oct 24, 2026
e189f77
Move state database construction into its crate, give its backends un…
mcharytoniuk Oct 26, 2026
c180930
Update every Python dependency to its latest compatible version and s…
mcharytoniuk Oct 26, 2026
c673788
Update every JavaScript dependency to its latest compatible version a…
mcharytoniuk Oct 26, 2026
2bca125
Update every Rust dependency to its latest version and adapt to hf-hu…
mcharytoniuk Oct 26, 2026
b7532fc
Build the Hugging Face repository handle once per resolve and name th…
mcharytoniuk Oct 26, 2026
da50091
Split the taken-address bootstrap tests into one file per address
mcharytoniuk Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[env]
RUST_TEST_THREADS = "1"
12 changes: 0 additions & 12 deletions .claude/rules/paddler-client-python.md

This file was deleted.

9 changes: 9 additions & 0 deletions .claude/rules/paddler-frame-writer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
paths:
- "paddler_frame_writer/**"
---

# Paddler Frame Writer Context

- `paddler_frame_writer` is a root Paddler crate, it must not depend on any other Paddler crate
- `paddler_frame_writer` writes queued frames to a connection's sink until the queue ends, a send fails, or the connection closes, so `paddler_agent` and `paddler_balancer` share one way to abandon the writes their peer stopped reading
2 changes: 1 addition & 1 deletion .claude/rules/paddler-opencode-tests.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ paths:
- `paddler_opencode_tests` must reuse the cluster harness from `paddler_tests` / `paddler_test_cluster_harness` to start Paddler; it must not reimplement cluster startup.
- The OpenCode binary path is always provided by the user via the `PADDLER_OPENCODE_BINARY` environment variable and is never guessed.
- The end-to-end tests are gated behind both the `tests_that_use_opencode` and `tests_that_use_llms` features; when they run without `PADDLER_OPENCODE_BINARY`, they fail rather than skip.
- The model is always `qwen3_5_0_8b` via the shared harness; only the OpenCode binary path is configurable.
- The model is always `ministral_3_3b_reasoning` via the shared harness, since it is the smallest harness model that drives OpenCode 2's Code Mode `execute` tool reliably; only the OpenCode binary path is configurable.
9 changes: 9 additions & 0 deletions .claude/rules/paddler-spawn-resuming-panic.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
paths:
- "paddler_spawn_resuming_panic/**"
---

# Paddler Spawn Resuming Panic Context

- `paddler_spawn_resuming_panic` is a root Paddler crate, it must not depend on any other Paddler crate
- `paddler_spawn_resuming_panic` runs work on a spawned or blocking tokio task, and resumes the task's panic in the task that awaits it, so the work fails exactly as if it ran inline
2 changes: 1 addition & 1 deletion .claude/rules/paddler-state-database.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ paths:
# Paddler State Database Context

- `paddler_state_database` persists the balancer desired state, in a file or in memory
- `paddler_state_database` depends only on `paddler_messaging` among the Paddler crates
- `paddler_state_database` depends only on `paddler_messaging` and the root `paddler_spawn_resuming_panic` among the Paddler crates
- `paddler_state_database` requires absolute file paths and treats an unreadable or corrupt state file as an error instead of replacing it with defaults
9 changes: 9 additions & 0 deletions .claude/rules/paddler-tcp-buffer-limits.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
paths:
- "paddler_tcp_buffer_limits/**"
---

# Paddler TCP Buffer Limits Context

- `paddler_tcp_buffer_limits` is a test fixture crate, it must not depend on any other Paddler crate
- `paddler_tcp_buffer_limits` reads the kernel TCP buffer limits, so tests can size the data that outlasts both socket buffers of a loopback connection instead of guessing
32 changes: 16 additions & 16 deletions .claude/skills/running-all-tests/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,27 +32,27 @@ Copy this checklist and tick each item as the suite completes:
- [ ] JS client
- [ ] JS client LLM
- [ ] Python lint
- [ ] Python client
- [ ] Python client LLM
- [ ] OpenAI Python client LLM
- [ ] TypeSafe Python client LLM
- [ ] kev converter Python LLM
- [ ] Rust unit
- [ ] Rust integration
- [ ] OpenCode integration
```

| # | Suite | Command (from the repo root) |
|---|--------------------------|-------------------------------------------------------|
| 1 | JS client | `TEST_DEVICE=$DEVICE make test.client.js` |
| 2 | JS client LLM | `TEST_DEVICE=$DEVICE make test.client.js.llm` |
| 3 | Python lint | `make lint.client.python lint.openai.python` |
| 4 | Python client | `TEST_DEVICE=$DEVICE make test.client.python` |
| 5 | Python client LLM | `TEST_DEVICE=$DEVICE make test.client.python.llm` |
| 6 | OpenAI Python client LLM | `TEST_DEVICE=$DEVICE make test.openai.python.llm` |
| 7 | Rust unit | `TEST_DEVICE=$DEVICE make test.unit` |
| 8 | Rust integration | `TEST_DEVICE=$DEVICE make test.integration` |

Run them in this order. Cheap suites (1, 3, 4, 7) surface bugs quickly; the GPU-bound suites (2, 5, 6, 8) load models.

On NixOS the pinned `ruff` wheel is dynamically linked, so suite 3 needs `nix-ld`.
| # | Suite | Command (from the repo root) |
|---|----------------------------|--------------------------------------------------------------------------------------------------|
| 1 | JS client | `TEST_DEVICE=$DEVICE make test.client.js` |
| 2 | JS client LLM | `TEST_DEVICE=$DEVICE make test.client.js.llm` |
| 3 | Python lint | `make lint.openai.python lint.typesafe.python lint.kev_converter.python` |
| 4 | OpenAI Python client LLM | `TEST_DEVICE=$DEVICE make test.openai.python.llm` |
| 5 | TypeSafe Python client LLM | `TEST_DEVICE=$DEVICE make test.typesafe.python.llm` |
| 6 | kev converter Python LLM | `make test.kev_converter.python.llm` |
| 7 | Rust unit | `TEST_DEVICE=$DEVICE make test.unit` |
| 8 | Rust integration | `TEST_DEVICE=$DEVICE make test.integration` |
| 9 | OpenCode integration | `PADDLER_OPENCODE_BINARY=$(command -v opencode) TEST_DEVICE=$DEVICE make test.integration.opencode` |

Run them in this order. Cheap suites (1, 3, 7) surface bugs quickly; the GPU-bound suites (2, 4, 5, 6, 8, 9) load models.

## Step 3: rules during the run

Expand Down
12 changes: 6 additions & 6 deletions .claude/skills/running-coverage/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@ Copy this checklist and tick each item as the suite completes:

```
- [ ] Rust
- [ ] Python client
- [ ] kev converter Python
- [ ] JS client
```

| # | Suite | Command (from the repo root) |
|---|---------------|--------------------------------------------------------|
| 1 | Rust | `TEST_DEVICE=$DEVICE make test.coverage` |
| 2 | Python client | `TEST_DEVICE=$DEVICE make test.client.python.coverage` |
| 3 | JS client | `TEST_DEVICE=$DEVICE make test.client.js.coverage` |
| # | Suite | Command (from the repo root) |
|---|----------------------|-----------------------------------------------------------------------------------------|
| 1 | Rust | `PADDLER_OPENCODE_BINARY=$(command -v opencode) TEST_DEVICE=$DEVICE make test.coverage` |
| 2 | kev converter Python | `make test.kev_converter.python.llm` |
| 3 | JS client | `TEST_DEVICE=$DEVICE make test.client.js.coverage` |

## Step 3: rules during the run

Expand Down
4 changes: 4 additions & 0 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ serial = { max-threads = 1 }

[profile.default]
slow-timeout = { period = "10s", terminate-after = 3 }
test-threads = 1

[profile.cpu]
test-threads = "num-cpus"

[[profile.default.overrides]]
filter = '(package(=paddler_tests) | package(=paddler_cli_tests)) and kind(test)'
Expand Down
1 change: 0 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
**/.coverage
**/.mypy_cache
**/.pytest_cache
**/.ruff_cache
**/.venv
**/__pycache__
**/dist
Expand Down
7 changes: 1 addition & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-latest, windows-latest]
os: [macos-latest]

steps:
- name: checkout code
Expand All @@ -32,10 +32,5 @@ jobs:

- uses: Swatinem/rust-cache@v2

- name: Install GNU Make
if: runner.os == 'Windows'
run: choco install make --version=4.4.1 --no-progress

- name: Build the cli binary
run: make target/debug/paddler
shell: bash
56 changes: 1 addition & 55 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,11 @@ jobs:

- name: build the cli binary
run: make target/release/paddler
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: rename the cli binary
run: mv ./target/release/paddler ./${{ matrix.artifact_name }}
shell: bash

- name: assert cli version matches tag
uses: intentee/release-action/assert-version@8125f727e97f72bfef24299d7c6d3217af1453bc
Expand All @@ -66,61 +64,9 @@ jobs:
name: ${{ matrix.artifact_name }}
path: ./${{ matrix.artifact_name }}

build-gui:
name: build-gui
needs: resolve-version
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-22.04
artifact_name: paddler-gui-bin-linux-libc2.35-amd64

- os: ubuntu-latest
artifact_name: paddler-gui-bin-linux-libc2.39-amd64

- os: macos-latest
artifact_name: paddler-gui-bin-macos-arm

steps:
- name: checkout code
uses: actions/checkout@v4

- name: install paddler_gui system dependencies (linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y \
libvulkan-dev libxkbcommon-dev libwayland-dev libgl-dev \
libx11-dev libxcursor-dev libxrandr-dev libxi-dev \
libxcb1-dev libfontconfig-dev pkg-config
shell: bash

- name: build the gui binary
run: make target/release/paddler_gui
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: rename the gui binary
run: mv ./target/release/paddler_gui ./${{ matrix.artifact_name }}
shell: bash

- name: assert gui version matches tag
uses: intentee/release-action/assert-version@8125f727e97f72bfef24299d7c6d3217af1453bc
with:
filename: "./${{ matrix.artifact_name }}"
expected-version: "${{ needs.resolve-version.outputs.version }}"

- name: upload gui artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact_name }}
path: ./${{ matrix.artifact_name }}

release:
name: release
needs: [resolve-version, build-cli, build-gui]
needs: [resolve-version, build-cli]
runs-on: ubuntu-latest
permissions:
contents: write
Expand Down
31 changes: 8 additions & 23 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,19 +108,15 @@ jobs:
- name: Install Poetry
run: pip install poetry==2.4.3

- name: Lint the Python client
run: make lint.client.python

- name: Lint the OpenAI Python client suite
run: make lint.openai.python

python:
name: python (${{ matrix.python-version }})
needs: paddler-binary
- name: Lint the TypeSafe Python client suite
run: make lint.typesafe.python

kev-converter-lint:
name: kev converter lint
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.11", "3.13"]

steps:
- name: checkout code
Expand All @@ -129,21 +125,10 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
python-version: "3.13"

- name: Install Poetry
run: pip install poetry==2.4.3

- name: Download the Paddler binary
uses: actions/download-artifact@v4
with:
name: paddler-binary
path: target/debug

- name: Mark the downloaded Paddler binary as built and executable
run: |
chmod +x target/debug/paddler
touch target/debug/paddler

- name: Run Python client tests
run: make test.client.python
- name: Lint the kev converter
run: make lint.kev_converter.python
Loading
Loading