Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d24a6b5
ci: add optional praxis main testing and known-issue label
leseb Jul 9, 2026
fac81f1
Merge remote-tracking branch 'origin/main' into leseb/test-on-main
leseb Jul 9, 2026
acdd1ec
Merge branch 'main' into leseb/test-on-main
leseb Jul 15, 2026
3138cba
Merge remote-tracking branch 'origin/main' into leseb/test-on-main
leseb Jul 15, 2026
eeef6ab
Merge remote-tracking branch 'fork/leseb/test-on-main' into leseb/tes…
leseb Jul 15, 2026
9d8fea2
Merge remote-tracking branch 'origin/main' into leseb/test-on-main
leseb Jul 15, 2026
559d06e
ci: always test against praxis core main on every PR
leseb Jul 15, 2026
4a014b9
ci: add independent praxis-main compatibility test
leseb Jul 15, 2026
7eb7cdf
fix: add praxis-main feature for HttpFilterContext compat
leseb Jul 15, 2026
82e2d30
Merge remote-tracking branch 'origin/main' into leseb/test-on-main
leseb Jul 15, 2026
cca5039
Merge remote-tracking branch 'origin/main' into leseb/test-on-main
leseb Jul 15, 2026
38a04e2
Merge remote-tracking branch 'origin/main' into leseb/test-on-main
leseb Jul 16, 2026
6db7487
fix(ci): update lockfile after patching praxis deps
leseb Jul 16, 2026
e19b88e
fix(ci): use cargo update without --workspace flag
leseb Jul 16, 2026
6e891af
fix(ci): add max_batch_size to JsonRpcConfig constructors for praxis …
leseb Jul 16, 2026
24ed7c1
fix(ci): use cfg blocks for max_batch_size instead of field-level cfg
leseb Jul 16, 2026
148ca41
fix(ci): forward praxis-main feature through proxy crate
leseb Jul 16, 2026
08c7e6e
fix(ci): add SkipPipelineChecks arg for praxis main compat
leseb Jul 16, 2026
6bffd4d
fix(ci): forward praxis-main feature through test crates
leseb Jul 16, 2026
3f3fd43
fix(ci): handle changed SNI validation messages for praxis main
leseb Jul 16, 2026
c8f63bc
style: format cluster schema tests with nightly rustfmt
leseb Jul 16, 2026
d50641d
Merge remote-tracking branch 'origin/main' into leseb/test-on-main
leseb Jul 16, 2026
c524abf
Merge remote-tracking branch 'origin/main' into leseb/test-on-main
leseb Jul 16, 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
20 changes: 20 additions & 0 deletions .github/actions/clone-praxis/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Clone Praxis core
description: >-
Clone praxis core repo as a sibling directory so
path-based [patch.crates-io] overrides resolve.

inputs:
ref:
description: "Git ref to checkout (branch, tag, or SHA)"
required: false
default: "main"

runs:
using: composite
steps:
- name: Clone praxis core
run: >-
git clone --depth 1 --branch "${{ inputs.ref }}"
https://github.com/praxis-proxy/praxis.git
"$GITHUB_WORKSPACE/../praxis"
shell: bash
20 changes: 20 additions & 0 deletions .github/actions/patch-praxis/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Patch Praxis dependencies
description: >-
Override crates.io praxis dependencies with local
path dependencies from the cloned praxis repo.

runs:
using: composite
steps:
- name: Append [patch.crates-io] to Cargo.toml
run: |
cat >> Cargo.toml << 'PATCH'

[patch.crates-io]
praxis-proxy-core = { path = "../praxis/core" }
praxis-proxy-filter = { path = "../praxis/filter" }
praxis-proxy-protocol = { path = "../praxis/protocol" }
praxis-proxy-tls = { path = "../praxis/tls" }
praxis-proxy = { path = "../praxis/server" }
PATCH
shell: bash
1 change: 1 addition & 0 deletions .github/workflows/ci-status.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ jobs:

const excludedChecks = new Set([
'ci-status',
'test-praxis-main',
]);

const terminalStatuses = new Set(['completed']);
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/integration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ on:
branches: [main]
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
workflow_dispatch:
inputs:
debug:
description: "Enable verbose test output (V=1)"
required: false
type: boolean
default: false

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
Expand Down
79 changes: 79 additions & 0 deletions .github/workflows/praxis-compat.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Tests (praxis main)

# ------------------------------------------------------------------------------
# Workflow Settings
# ------------------------------------------------------------------------------

on:
push:
branches: [main]
pull_request:
branches: [main]
types: [opened, synchronize, reopened, labeled]
workflow_dispatch:
inputs:
praxis_ref:
description: "Praxis core git ref to test against"
required: false
type: string
default: "main"

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

permissions: {}

env:
CARGO_TERM_COLOR: always

jobs:
# ----------------------------------------------------------------------------
# Build + test against praxis core main
# ----------------------------------------------------------------------------

test-praxis-main:
runs-on: ubuntu-24.04
continue-on-error: ${{ contains(github.event.pull_request.labels.*.name, 'praxis-known-issue') }}
permissions:
contents: read
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

- name: Clone Praxis core (path dependency)
uses: ./.github/actions/clone-praxis
with:
ref: ${{ inputs.praxis_ref || 'main' }}

- name: Patch Praxis dependencies
uses: ./.github/actions/patch-praxis

- name: Update lockfile for patched dependencies
run: cargo update

- name: Install stable Rust
uses: dtolnay/rust-toolchain@6190aa5fb88a88ee71c12769924bbe63a9ab152e # 1.96.0

- name: Cache Cargo registry and build artifacts
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: |
~/.cargo/registry/index
~/.cargo/registry/cache
~/.cargo/git/db
target
key: ${{ runner.os }}-rust-1.96.0-praxis-main-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-rust-1.96.0-praxis-main-

- name: Unit tests
run: |
cargo test -p praxis-ai-apis --features praxis-main
cargo test -p praxis-ai-filters --features praxis-main
cargo test -p praxis-ai-proxy --features praxis-main

- name: Schema tests
run: cargo test -p praxis-tests-schema --features praxis-main

- name: Integration tests
run: cargo test -p praxis-tests-integration --features praxis-main
2 changes: 1 addition & 1 deletion .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
branches: [main]
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
merge_group:
branches: [main]
workflow_dispatch:
Expand All @@ -18,7 +19,6 @@ on:
required: false
type: boolean
default: false

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
Expand Down
36 changes: 35 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ endif
lint fmt doc audit coverage-check \
require-container-engine \
container container-run \
setup-hooks help
setup-hooks help \
patch-praxis unpatch-praxis

# -------------------------------------------------------------------
# All
Expand Down Expand Up @@ -105,6 +106,35 @@ coverage-check:
exit 1; \
fi

# -------------------------------------------------------------------
# Praxis path override (test against local ../praxis)
# -------------------------------------------------------------------

patch-praxis:
@if [ ! -d "../praxis" ]; then \
echo "ERROR: ../praxis not found — clone praxis core as a sibling directory first"; \
exit 1; \
fi
@if grep -q '\[patch\.crates-io\]' Cargo.toml; then \
echo "Already patched — run 'make unpatch-praxis' first"; \
exit 1; \
fi
@printf '\n[patch.crates-io]\n\
praxis-proxy-core = { path = "../praxis/core" }\n\
praxis-proxy-filter = { path = "../praxis/filter" }\n\
praxis-proxy-protocol = { path = "../praxis/protocol" }\n\
praxis-proxy-tls = { path = "../praxis/tls" }\n\
praxis-proxy = { path = "../praxis/server" }\n' >> Cargo.toml
@echo "Patched Cargo.toml to use ../praxis path dependencies"

unpatch-praxis:
@if ! grep -q '\[patch\.crates-io\]' Cargo.toml; then \
echo "Nothing to unpatch"; \
exit 0; \
fi
@sed -i.bak '/^\[patch\.crates-io\]/,$$d' Cargo.toml && rm -f Cargo.toml.bak
@echo "Removed [patch.crates-io] from Cargo.toml"

# -------------------------------------------------------------------
# Dev Setup
# -------------------------------------------------------------------
Expand Down Expand Up @@ -145,3 +175,7 @@ help:
@echo "Container:"
@echo " container build praxis-ai container image"
@echo " container-run run container in foreground (host network)"
@echo ""
@echo "Praxis override:"
@echo " patch-praxis use ../praxis path deps instead of crates.io"
@echo " unpatch-praxis revert to crates.io praxis deps"
1 change: 1 addition & 0 deletions apis/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ name = "praxis_ai_apis"
[features]
default = ["store"]
store = ["dep:sqlx", "dep:dashmap"]
praxis-main = []

[lints]
workspace = true
Expand Down
6 changes: 6 additions & 0 deletions apis/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,12 @@ pub(crate) mod test_utils {
selected_endpoint_index: None,
time_source: &praxis_core::time::SystemTimeSource,
upstream: None,
#[cfg(feature = "praxis-main")]
peer_identity: None,
#[cfg(feature = "praxis-main")]
pre_read_mutations: Vec::new(),
#[cfg(feature = "praxis-main")]
structured_metadata: std::collections::HashMap::new(),
}
}

Expand Down
1 change: 1 addition & 0 deletions filters/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ name = "praxis_ai_filters"
[features]
default = ["apis"]
apis = ["praxis-ai-apis/default"]
praxis-main = []

[lints]
workspace = true
Expand Down
33 changes: 24 additions & 9 deletions filters/src/agentic/a2a/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -674,15 +674,30 @@ fn clear_sse_capture_metadata(ctx: &mut HttpFilterContext<'_>) {
fn build_json_rpc_config(max_body_bytes: usize) -> JsonRpcConfig {
use praxis_filter::builtins::http::payload_processing::json_rpc::config::{BatchPolicy, JsonRpcHeaders};

JsonRpcConfig {
batch_policy: BatchPolicy::Reject,
headers: JsonRpcHeaders {
id: None,
kind: None,
method: None,
},
max_body_bytes,
on_invalid: OnInvalidBehavior::Continue,
let headers = JsonRpcHeaders {
id: None,
kind: None,
method: None,
};

#[cfg(feature = "praxis-main")]
{
JsonRpcConfig {
batch_policy: BatchPolicy::Reject,
headers,
max_batch_size: 100,
max_body_bytes,
on_invalid: OnInvalidBehavior::Continue,
}
}
#[cfg(not(feature = "praxis-main"))]
{
JsonRpcConfig {
batch_policy: BatchPolicy::Reject,
headers,
max_body_bytes,
on_invalid: OnInvalidBehavior::Continue,
}
}
}

Expand Down
33 changes: 24 additions & 9 deletions filters/src/agentic/mcp/broker/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -919,14 +919,29 @@ fn build_json_rpc_config(max_body_bytes: usize) -> JsonRpcConfig {
json_rpc::config::{BatchPolicy, JsonRpcHeaders},
};

JsonRpcConfig {
batch_policy: BatchPolicy::Reject,
headers: JsonRpcHeaders {
id: None,
kind: None,
method: None,
},
max_body_bytes,
on_invalid: OnInvalidBehavior::Continue,
let headers = JsonRpcHeaders {
id: None,
kind: None,
method: None,
};

#[cfg(feature = "praxis-main")]
{
JsonRpcConfig {
batch_policy: BatchPolicy::Reject,
headers,
max_batch_size: 100,
max_body_bytes,
on_invalid: OnInvalidBehavior::Continue,
}
}
#[cfg(not(feature = "praxis-main"))]
{
JsonRpcConfig {
batch_policy: BatchPolicy::Reject,
headers,
max_body_bytes,
on_invalid: OnInvalidBehavior::Continue,
}
}
}
33 changes: 24 additions & 9 deletions filters/src/agentic/mcp/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -194,15 +194,30 @@ impl HttpFilter for McpFilter {
fn build_json_rpc_config(max_body_bytes: usize) -> JsonRpcConfig {
use praxis_filter::builtins::http::payload_processing::json_rpc::config::{BatchPolicy, JsonRpcHeaders};

JsonRpcConfig {
batch_policy: BatchPolicy::Reject,
headers: JsonRpcHeaders {
id: None,
kind: None,
method: None,
},
max_body_bytes,
on_invalid: OnInvalidBehavior::Continue,
let headers = JsonRpcHeaders {
id: None,
kind: None,
method: None,
};

#[cfg(feature = "praxis-main")]
{
JsonRpcConfig {
batch_policy: BatchPolicy::Reject,
headers,
max_batch_size: 100,
max_body_bytes,
on_invalid: OnInvalidBehavior::Continue,
}
}
#[cfg(not(feature = "praxis-main"))]
{
JsonRpcConfig {
batch_policy: BatchPolicy::Reject,
headers,
max_body_bytes,
on_invalid: OnInvalidBehavior::Continue,
}
}
}

Expand Down
6 changes: 6 additions & 0 deletions filters/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,12 @@ pub(crate) mod test_utils {
selected_endpoint_index: None,
time_source: &praxis_core::time::SystemTimeSource,
upstream: None,
#[cfg(feature = "praxis-main")]
peer_identity: None,
#[cfg(feature = "praxis-main")]
pre_read_mutations: Vec::new(),
#[cfg(feature = "praxis-main")]
structured_metadata: std::collections::HashMap::new(),
}
}

Expand Down
3 changes: 3 additions & 0 deletions server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ path = "src/lib.rs"
name = "praxis-ai"
path = "src/main.rs"

[features]
praxis-main = ["praxis-ai-filters/praxis-main", "praxis-ai-apis/praxis-main"]

[lints]
workspace = true

Expand Down
Loading
Loading